Changes On Branch 401402d02879c5f2
Not logged in

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Changes In Branch core-8-3-1-branch Through [401402d028] Excluding Merge-Ins

This is equivalent to a diff from 3429c5f93a to 401402d028

2002-06-05
12:01
* mac/tclMacResource.c (Tcl_MacConvertTextResource): added utf conversion of text resource content... check-in: cd2f03109a user: das tags: core-8-3-1-branch
2002-05-24
19:36
* tests/clock.test: added clock-9.1 * compat/strftime.c: * generic/tclClock.c: * generic/tclInt.... check-in: 401402d028 user: hobbs tags: core-8-3-1-branch
2002-05-20
10:24
* mac/tclMacChan.c: use MSL provided creator type if available instead of the default 'MPW '. check-in: 32d77cd416 user: das tags: core-8-3-1-branch
2000-05-31
01:28
2000-05-29 Sandeep Tamhankar <sandeep@scriptics.com> * tests/http.test * doc/http.n * library/h... check-in: 43202241e2 user: sandeep tags: core-8-3-1-branch
2000-05-02
22:02
2000-05-02 Andreas Kupries <a.kupries@westend.com> * Overall changes: (1) Implementation of jo... check-in: cdf262856d user: kupries tags: trunk
2000-04-28
00:47
* doc/library.n: Added entries for auto_qualify and auto_import [Bug: 1271]. * doc/Init.3: Manual e... check-in: 3429c5f93a user: ericm tags: trunk
2000-04-27
01:46
* doc/memory.n: Man page for Tcl "memory" command, which is created when TCL_MEM_DEBUG is defined at... check-in: 9aabc80546 user: ericm tags: trunk

Changes to ChangeLog.

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
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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
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
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808

1809
1810
1811
1812

1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+










+
-
+
+


-




+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+




+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







2002-05-24  Jeff Hobbs  <jeffh@ActiveState.com>
2000-04-27  Eric Melski  <ericm@scriptics.com>

	* doc/library.n: Added entries for auto_qualify and auto_import
	[Bug: 1271].

	* tests/clock.test: added clock-9.1
	* compat/strftime.c:
	* generic/tclClock.c:
	* generic/tclInt.decls:
	* generic/tclIntDecls.h:
	* unix/tclUnixTime.c: fix for Windows msvcrt mem leak caused by
	using an env(TZ) setting trick for in clock format -gmt 1.  This
	also makes %s seem to work correctly with -gmt 1 as well as
	making it a lot faster by avoid the env(TZ) hack.  TclpStrftime
	now takes useGMT as an arg.  [Bug #559376]

2002-05-20  Daniel Steffen  <das@users.sourceforge.net>

	* mac/tclMacChan.c: use MSL provided creator type if available
	instead of the default 'MPW '.

2002-04-26  Jeff Hobbs  <jeffh@ActiveState.com>

	* unix/configure:
	* unix/tcl.m4: change HP-11 SHLIB_LD_LIBS from "" to ${LIBS} so
	that the .sl knows its dependent libs.

2002-04-26  Donal K. Fellows  <fellowsd@cs.man.ac.uk>

	* tests/obj.test (obj-11.[56]): Test conversion to boolean more
	thoroughly.
	* generic/tclObj.c (SetBooleanFromAny): Could not interpret
	integers that did not look like doubles as booleans [Bug 548686]

2002-04-19  Donal K. Fellows  <fellowsd@cs.man.ac.uk>

	* generic/tclCmdIL.c (InfoBodyCmd): 
	* tests/info.test (info-2.6): Proc bodies without string reps
	would report as empty [Bug #545644]

2002-04-18  Miguel Sofer  <msofer@users.sourceforge.net>

	* generic/tclNamesp.c:
	* tests/info.test:  [Bug 545325 ] info level didn't report
	namespace eval, bug report by Richard Suchenwirth.

2002-04-18  Don Porter  <dgp@users.sourceforge.net>

	* doc/msgcat.n: Added "package require"s to msgcat documentation.

2002-04-18  Miguel Sofer  <msofer@users.sourceforge.net>

	* generic/tclExecute.c:
	* tests/expr-old.test: fix for [Bug #542588] (Phil Ehrens), where
	"too large integers" were reported as "floating-point value" in
	[expr] error messages.

2002-04-11  Jeff Hobbs  <jeffh@ActiveState.com>

	* tcl.m4: Enabled COFF as well as CV style debug info with
	--enable-symbols to allow Dr. Watson users to see function info.
	More info on debugging levels can be obtained at:
	http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp

2002-04-08  Daniel Steffen  <das@users.sourceforge.net>

	* mac/tclMacOSA.c:
	* mac/tclMacResource.c: added missing Tcl_UtfToExternalDString
	conversions of resource file names.
	* mac/tclMacSock.c (TcpGetOptionProc): fixed bug introduced
	by Andreas on 02-25; changed strcmp's to strncmp's so that
	option comparison behaves like on other platforms.
	* mac/tcltkMacBuildSupport.sea.hqx (CW Pro6 changes): added
	support to allow Tk to hookup C library stderr/stdout to TkConsole.
	* mac/tclMacTime.c (TclpGetTZName): fix for daylight savings TZName bug

2002-03-29  Jeff Hobbs  <jeffh@ActiveState.com>

	* tests/trace.test (trace-18.2):
	* generic/tclCmdMZ.c (Tcl_TraceObjCmd, TraceVarProc): corrected
	potential double-free of traces on variables by flagging in
	TraceVarProc that it will free the var in case the eval wants to
	delete the var trace as well. [Bug #536937]

2002-03-28  Miguel Sofer  <msofer@users.sourceforge.net>

	* generic/tclParse.c (Tcl_EvalEx): passing the correct commandSize
	to TclEvalObjvInternal. [Bug 219362], fix by David Knoll.

2002-03-25  Jeff Hobbs  <jeffh@ActiveState.com>

	* generic/tclMain.c: reduced oversized static buffer allocation.

	* unix/Makefile.in: added shell and gdb targets

	* unix/configure: 
	* unix/configure.in: backported improved AIX build support from 8.4.
	* unix/tcl.m4: backported 8.4 changes to HP-UX, IRIX64-6.*, SunOS,
	FreeBSD, AIX and Darwin targets.  Updated SC_LOADTCLCONFIG to
	detect when we build against a Tcl build dir.

2002-03-24  Don Porter  <dgp@users.sourceforge.net>

	* library/tcltest/tcltest.tcl: Be sure the tcltest variable is updated.
	[Bug 454050].

	* library/tcltest/pkgIndex.tcl:
        * library/tcltest/tcltest.tcl:  Allow non-proc commands to be used
        as the customization hooks.  Bump to 1.0.2.  Converted from lazy to
	direct loading.  [Bug 495662]

2002-03-18  Jeff Hobbs  <jeffh@ActiveState.com>

	* generic/tclScan.c (Tcl_ScanObjCmd): prevented ckfree being
	called on a pointer to NULL.

2002-03-15  Miguel Sofer  <msofer@users.sourceforge.net>

	Backport of Donal Fellows patch:
	* tests/compile.test (compile-12.3): Test to detect bug 530320.
	* generic/tclCompile.c (TclCompileTokens): Fixed buffer overrun
	reported in bug 530320.

2002-03-01  Jeff Hobbs  <jeffh@ActiveState.com>

	* tests/io.test:
	* tests/encoding.test: updated to reflect iso2022 escape change
	* library/encoding/iso2022-jp.enc: 
	* library/encoding/iso2022.enc: 
	* tools/encoding/iso2022-jp.esc:
	* tools/encoding/iso2022.esc: gave <ESC>$B precedence over <ESC>$@,
	based on comments (point 1) in [Bug #219283] (rfc 1468)

	* tests/encoding.test: added encoding-23.* tests
	* generic/tclIO.c (FilterInputBytes): reset the TCL_ENCODING_START
	flags in the ChannelState when using 'gets'. [Bug #523988]
	Also reduced the value of ENCODING_LINESIZE from 30 to 20 as this
	seems to improve the performance of 'gets' according to tclbench.

2002-02-27  Andreas Kupries  <andreas_kupries@users.sourceforge.net>

	* unix/tclUnixChan.c (TclpOpenFileChannel): Added code to regonize
	  "/dev/tty" (by name) and to not handle it as tty / serial
	  line. This is the controlling terminal and is special. Setting
	  it into raw mode as is done for other tty's is a bad idea. This
	  is a hackish fix for expect SGF Bug #520624.

2002-02-25  Andreas Kupries  <andreas_kupries@users.sourceforge.net>

	* mac/tclMacSock.c (TcpGetOptionProc): Changed to recognize the
	  option "-error". Essentially ignores the option, always
	  returning an empty string.

2002-02-25  Jeff Hobbs  <jeffh@ActiveState.com>

	* win/tclWinNotify.c (Tcl_FinalizeNotifier): backported fix for
	  [Bug #217982] which also affected Tkinter [Python Bug #216289]

2002-02-25  Daniel Steffen  <das@users.sourceforge.net>

	* unix/tclLoadDyld.c: updated to use Mac OS X 10.1 dyld APIs that     
	  have more libdl-like semantics. (bug #514392)

2002-02-19  Don Porter	<dgp@users.sourceforge.net>

	* changes: reversed the order of 8.3.3 changes.

2002-02-15  Don Porter	<dgp@users.sourceforge.net>

	* changes: First draft of Tcl changes for 8.3.5 release.

2002-02-06  Jeff Hobbs  <jeffh@ActiveState.com>

	* tests/scan.test:
	* generic/tclScan.c (Tcl_ScanObjCmd): corrected scan 0x... %x
	  handling that didn't accept the 0x as a prelude to a base 16
	  number.	 [Bug #495213]

2002-02-05  Andreas Kupries  <andreas_kupries@users.sourceforge.net>

	* unix/tclUnixChan.c (FileOutputProc): Fixed [bug 465765] reported
	  by Dale Talcott <daletalcott@users.sourceforge.net>. Avoid
	  writing nothing into a file as STREAM based implementations will
	  consider this a EOF (if the file is a pipe). Not done in the
	  generic layer as this type of writing is actually useful to
	  check the state of a socket.

2002-02-05  Don Porter <dgp@users.sourceforge.net>

	* library/http/http.tcl:
	* library/http/pkgIndex.tcl:  Corrected use of http::error when
	::error was intended.  Bump to http 2.4.2.

2002-02-01  Andreas Kupries  <andreas_kupries@users.sourceforge.net>

	* tests/io.test: io-39.22 split into two tests, one platform
	  dependent, the other not. -eofchar is not empty on the windows
	  platform.

2002-01-25  Mo DeJong  <mdejong@users.sourceforge.net>

	Make -eofchar and -translation options read only for
	server sockets. [Bug 496733]

	* generic/tclIO.c (Tcl_GetChannelOption, Tcl_SetChannelOption):
	Instead of returning nothing for the -translation option
	on a server socket, always return "auto". Return the empty
	string enclosed in quotes for the -eofchar option on
	a server socket. Fixup -eofchar usage message so that
	it matches the implementation.
	* tests/io.test: Add -eofchar tests and -translation tests
	to ensure options are read only on server sockets.
	* tests/socket.test: Update tests to account for -eofchar
	and -translation option changes.

2002-01-24  Jeff Hobbs	<jeffh@ActiveState.com>

	* library/http/pkgIndex.tcl:
	* library/http/http.tcl: don't add port in default case to handle
	broken servers.	 http bumped to 2.4.1  [Bug #504508]

2002-01-21  Andreas Kupries  <andreas_kupries@users.sourceforge.net>

	* generic/tclIO.c (WriteChars): Fix for SF #506297, reported by
	  Martin Forssen <ruric@users.sourceforge.net>. The encoding
	  chosen in the script exposing the bug writes out three intro
	  characters when TCL_ENCODING_START is set, but does not consume
	  any input as TCL_ENCODING_END is cleared. As some output was
	  generated the enclosing loop calls UtfToExternal again, again
	  with START set. Three more characters in the out and still no
	  use of input ... To break this infinite loop we remove
	  TCL_ENCODING_START from the set of flags after the first call
	  (no condition is required, the later calls remove an unset flag,
	  which is a no-op). This causes the subsequent calls to
	  UtfToExternal to consume and convert the actual input.

2002-01-17  Andreas Kupries  <andreas_kupries@users.sourceforge.net>

	* generic/tclIOCmd.c (Tcl_GetsObjCmd): Fixed bug #504642 as
	  reported by Brian Griffin <bgriffin@users.sourceforge.net>,
	  using his patch. Before the patch the generic I/O layer held an
	  unannounced reference to the interp result to store the read
	  line into. This unfortunately has disastrous results if the
	  channel driver executes a tcl script to perform its operation,
	  this freeing the interp result. In that case we are
	  dereferencing essentially a dangling reference. It is not truly
	  dangling because the object is in the free list, but this only
	  causes us to smash the free list and have the error occur later
	  somewhere else. The patch simply creates a new object for the
	  line and later sets it into the interp result when we are done
	  with reading.

2001-12-28  Jeff Hobbs	<jeffh@ActiveState.com>

	* library/init.tcl (auto_execok): make sure env(COMSPEC) on
	Windows is executed with the right case, as it may otherwise fail
	inexplicably.

2001-12-21  Daniel Steffen <das@users.sourceforge.net>

	* unix/tcl.m4: fixed incorrect SHLIB_LD_LIBS
	setting for MacOSX / Darwin.
	* unix/configure: Regen.
	* unix/mkLinks.tcl: improved case-insensitive
	filesystem support.
	* unix/mkLinks: Regen.

2001-12-10  Don Porter <dgp@users.sourceforge.net>
  
	* doc/Access.3:
	* doc/DString.3:
	* doc/ExprLong.3:
	* doc/TCL_MEM_DEBUG.3:
	* doc/Utf.3:
	* doc/file.n: Several typo and formatting corrections discovered
	during conversion to TMML.  Thanks to Joe English.  [Patch 490514]

2001-11-29  Miguel Sofer  <msofer@users.sourceforge.net>

	* generic/tclInt.h:
	* generic/tclNamesp.c:
	* tests/namespace.test: backporting patch for [Bug 231259]

2001-11-20  Kevin B. Kenny  <kennykb@users.sourceforge.net>

	* generic/tclCmdMZ.c (Tcl_TimeObjCmd) Added extra parentheses to a
	cast expression to remove ambiguity and conform with Tcl
	Engineering Manual. [Suggestion by Donal Fellows in commentary on
	patch #483500]
	
2001-11-19  Kevin B. Kenny  <kennykb@users.sourceforge.net>
	
	* generic/tclCmdMZ.c (Tcl_TimeObjCmd): Corrected bug in [time]
	when dealing with test sequences that run more than 2**31
	microseconds. [Bug 478847]
	
2001-11-09  Don Porter	<dgp@users.sourceforge.net>

	* tests/var.test:
	* generic/tclVar.c: Corrected bug in [global] when dealing
	with variable names matching :*.  [Bug 480176]

2001-11-06  Andreas Kupries  <andreas_kupries@users.sourceforge.net> 

	* generic/tclIO.c (ReadChars): Fixed bug #478856 reported by
	  Stuart Cassoff <stwo@users.sourceforge.net>. The bug caused loss
	  of fileevents when [read]ing less data from the channel than
	  buffered. Due to an empty input buffer the flag
	  CHANNEL_NEED_MORE_DATA was set but never reset, causing the I/O
	  system to wait for more data instead of using a timer to
	  synthesize fileevents and to flush the pending data out of the
	  buffers.

2001-10-19  Jeff Hobbs  <jeffh@ActiveState.com>

	************************
	****  8.3.4 TAGGED  ****
	************************

	* generic/tclInt.h: 
	* generic/tclObj.c: added -DPURIFY object allocation option.

	* unix/configure:
	* unix/tcl.m4: added -lc to LIBS on AIX

2001-10-19  Daniel Steffen <das@users.sourceforge.net>

	* mac/tclMacFile.c: fix to glob -join, wasn't traversing aliased
	folders
	
	* mac/tclMacLoad.c: : corrected utf8 handling, comparison of
	package names to code fragment names changed to only match on the
	length of package name, this allows for fragment names with version
	numbers appended (backport from 8.4)

2001-10-18  Jeff Hobbs  <jeffh@ActiveState.com>

	* unix/configure: regend
	* unix/tcl.m4 (SC_ENABLE_GCC): enabled better recognition of gcc.

	* tests/clock.test (clock-8.1): 
	* generic/tclDate.c (RelativeMonth): 
	* generic/tclGetDate.y (RelativeMonth): corrected off-by-one-day
	error in clock scan with relative months and years during swing
	hours. [Bug #413397, Patch #414024] (lavana)

2001-10-17  Jeff Hobbs  <jeffh@ActiveState.com>

	* unix/tclUnixPipe.c (PipeInputProc, PipeOutputProc): do immediate
	retry when error is returned with errno == EINTR.
	[Bug #415131] (leger)

2001-10-17 Daniel Steffen <das@users.sourceforge.net>

	* mac/tclMacProjects.sea.hqx: updated projects with new version
	numbers and resource reorganization; included XML versions of
	the projects for CW Pro5 or Pro7 users.
	
	* mac/tcltkMacBuildSupport.sea.hqx: updated build instructions 
	and readme's; MoreFiles 1.5.2 added; XML versions of projects.

2001-10-17 Daniel Steffen <das@users.sourceforge.net>

	Backport of mac specific changes added to 8.4 since 8.3.3:
	
	* generic/tcl.h: removed line continuation in #if clause as this
	breaks the mac resource compiler (note that *.r files include tcl.h)
	
	* compat/strftime.c: 
	* mac/tclMacTime.c:
	* mac/tclMacPort.h:
	* generic/tclInt.decls: 
	* generic/tclIntPlatDecls.h:
	* generic/tclStubInit.c: timezone support for mac via 
	TclpGetTZName() like on windows, using an inverse timezone table
	adapted from tclDate.c to map gmtoffset in seconds gotten from
	the MacOS APIs to a  timezone string, as there is no good way to get
	this info from MacOS. I had to make up some unusual timezones and
	arbitrarily decide on the most standard of the multiple choices

	* generic/tclCmdAH.c:
	* generic/tclDate.c:
	* generic/tclGetDate.y:
	* mac/tclMacInt.h:
	* mac/tclMacFile.c: default mac epoch changed to standard unix
	epoch and related mac time/date handling changes from TIP17.

	* mac/tclMacFile.c: glob -dir compatibility for unix style 
	relative paths, from TIP17

	* mac/tclMacAppInit.c: support for WASTE text library using
	temporary memory, setting has no effect if WASTE is not used.

	* tests/cmdAH.test: access time not available on the mac, skip the 
	atime touch test
	
	* mac/tclMacApplication.r:
	* mac/tclMacLibrary.r:
	* mac/tclMacOSA.r:
	* mac/tclMacResource.r: updated copyrights/dates in version
	strings; reorganized resources among these files to avoid 
	multiple copies in applications and shared libraries, the script
	libraries are now no longer duplicated in Tclsh but are only  
	included in the resources of Tcl.shlb.

	* tests/cmdMZ.test:
	* tests/exec.test:
	* tests/fileName.test: added missing cleanups/tests/catches that
	caused tests to fail on the mac.

	* doc/tclvars.n: documentation error, env(PWD) should be env(HOME)
	
2001-10-17  Jeff Hobbs  <jeffh@ActiveState.com>

	* unix/tclUnixFCmd.c: minor casts to prevent warnings

	* unix/configure: regened
	* unix/configure.in: added preset CFLAGS check from HEAD to
	prevent --enable-gcc from adding "-g -O2"

2001-10-17  Don Porter	<dgp@users.sourceforge.net>

	* changes: First draft of Tcl changes for 8.3.4 release.

2001-10-16  Don Porter	<dgp@users.sourceforge.net>

	* unix/Makefile.in: Restored install of tclConfig.sh file
	to $TCL_EXEC_PREFIX/lib.  It contains platform-dependent
	definitions, and must not be installed under $TCL_PREFIX.

2001-10-16  Jeff Hobbs  <jeffh@ActiveState.com>

	* unix/tclLoadAout.c (TclGuessPackageName): removed unused vars
	and fixed warnings. [Bug #446622] (lim)

2001-10-16 Daniel Steffen <das@users.sourceforge.net>

	* unix/Makefile.in:
	* unix/configure.in:
	* unix/tcl.m4: Added support for MacOSX / Darwin
	* unix/configure: Autoconf

	* unix/mkLinks:
	* unix/mkLinks.tcl: Added check for case-insensitive
	  filesystems and conditionalized links that only differ by
	  case (needed for MacOSX/Darwin on HFS+ FS)

	* unix/tclLoadDyld.c: change in binary extension format from 
	  MachO bundles to standard .dylib dynamic libraries like on
	  other unices. **POTENTIAL INCOMPATIBILITY*** extensions
	  will have to be recompiled as .dylib's. 
	  Improved error handling and use of DStrings and 
	  Tcl_UtfToExternalDString instead of sprintf to build up
	  symbol and library names. [Patch 435258]

2001-10-16  Don Porter	<dgp@users.sourceforge.net>

	* tests/trace.test (trace-18.1): Added test to demonstrate
	  memory corruption problems.  [Bug 219393].

	* unix/mkLinks: 'make mklinks' for Tcl_SetMainLoop.

	* unix/Makefile.in (dist: target):  Removed copy of files
	  matching mac/*.exp; no such files.

2001-10-15  Andreas Kupries  <andreas_kupries@users.sourceforge.net> 

	* generic/tclInt.decls (TclExpandCodeArray,TclGetInstructionTable):
	  Added to internal stubs table. Tclcompiler (Tclpro project)
	  needs them if used as loadable package under Windows. Changed
	  signatures. We don't want to describe compiler internal
	  structures in "tclInt.h".

	* generic/tclCompile.h: S.a. Removed function declarations.
	* generic/tclCompile.c: S.a. Adapted to changed signatures.

2001-10-15  Jeff Hobbs  <jeffh@ActiveState.com>

	* unix/configure: 
	* unix/configure.in: 
	* win/configure: 
	* win/configure.in: 
	* win/tcl.m4: reworked to be a little cleaner in comparison to
	each other, and to AC_SUBST even empty vars for win/tclConfig.sh

	* generic/tcl.h: 
	* win/tclWinPort.h: moved #define of WIN32 to tcl.h where __WIN32__
	is defined and added #ifndef check.

2001-10-12  Jeff Hobbs  <jeffh@ActiveState.com>

	* tests/winPipe.test: removed obsolete cat16 tests, fixed
	winpipe-1.22 to only run on Win9*.

	* tests/timer.test: slight skewing of after values to allow for
	correct results on burdened machines.

	* tests/winFCmd.test: differentiated test results for win2k 
	versus not.

	* win/tclWinInit.c: cleanup back-ported from 8.4 HEAD.

	* win/tclWinPort.h: move winsock2.h include, header cleanup
	back-ported from 8.4 HEAD.

	* library/encoding/ebcdic.enc:
	* tools/encoding/ebcdic.txt: EBCDIC charset mapping.
	[Patch #219323] (nijtmans)

	* library/encoding/tis-620.enc:
	* tools/encoding/tis-620.txt: TIS-620 charset mapping.
	[Patch #467423] (poonlap)

2001-10-11  Miguel Sofer  <msofer@users.sourceforge.net>
	
	* generic/tclLiteral.c: (TclReleaseLiteral) insured that
	self-referential bytecodes are properly cleaned up on interpreter
	deletion [Bug 467523] (Ronnie Brunner)

2001-10-10  Don Porter	<dgp@users.sourceforge.net>

	* tests/unixInit.test:  Corrected restore of ::env(LANG).

2001-10-10  Donal K. Fellows  <fellowsd@cs.man.ac.uk>

	* generic/tclCmdMZ.c: Removed pointless #include and SCAN_* flags.
	(Tcl_RegexpObjCmd): Fixed match area offset bug.
	(Tcl_StringObjCmd): Fixed STR_INDEX and STR_REPEAT, and tidied up
	STR_IS and STR_LENGTH.

2001-10-09  Miguel Sofer  <msofer@users.sourceforge.net>
	
	* generic/tclObj.c: removed duplicate definition of tclObjsAlloced
	and tclObjsFreed. These variables only exist when compiling with
	TCL_COMPILE_STATS, and are already defined in generic/tclExecute.c

2001-10-09  Jeff Hobbs  <jeffh@ActiveState.com>

	* generic/tclFileName.c (ExtractWinRoot): corrected ABR error

	* doc/bgerror.n: back-port from 8.4 that indicates new behavior of
	bgerror in Tk.

2001-10-09  Miguel Sofer  <msofer@users.sourceforge.net>
	
	* generic/tclLiteral.c: (TclReleaseLiteral) reverted previous
	patch for [Bug 467523] - cure is worse than the illness.

2001-10-09  Donal K. Fellows  <fellowsd@cs.man.ac.uk>

	* tests/io.test (io-32.8): Fixed typo.

2001-10-08  Donal K. Fellows  <fellowsd@cs.man.ac.uk>

	* tests/cmdIL.test: test improvement.
	* doc/lsort.n: Doc improvement.
	* generic/tclCmdIL.c (InfoBodyCmd): Strengthened bytecode
	isolation [fix orig. by Miguel Sofer]
	(Tcl_LsortObjCmd, SortCompare): Symbolic indexing values plus
	correct handling of indexing relative to end in [lsort].

2001-10-05  Miguel Sofer  <msofer@users.sourceforge.net>
	
	* generic/tclLiteral.c: (TclReleaseLiteral) insured that
	self-referential bytecodes are properly cleaned up on interpreter
	deletion [Bug 467523] (Ronnie Brunner)

2001-10-04  Jeff Hobbs  <jeffh@ActiveState.com>

	* library/encoding/cp1250.enc:
	* library/encoding/cp1251.enc:
	* library/encoding/cp1252.enc:
	* library/encoding/cp1253.enc:
	* library/encoding/cp1254.enc:
	* library/encoding/cp1255.enc:
	* library/encoding/cp1256.enc:
	* library/encoding/cp1257.enc:
	* library/encoding/cp1258.enc:
	* library/encoding/cp874.enc:
	* library/encoding/cp936.enc:
	* library/encoding/cp949.enc:
	* library/encoding/cp950.enc:
	* library/encoding/iso8859-10.enc:
	* library/encoding/iso8859-13.enc:
	* library/encoding/iso8859-14.enc:
	* library/encoding/iso8859-15.enc:
	* library/encoding/iso8859-16.enc:
	* library/encoding/iso8859-6.enc:
	* library/encoding/iso8859-7.enc:
	* library/encoding/iso8859-8.enc:
	* library/encoding/koi8-u.enc:
	* library/encoding/macCroatian.enc:
	* library/encoding/macCyrillic.enc:
	* library/encoding/macGreek.enc:
	* library/encoding/macIceland.enc:
	* library/encoding/macRoman.enc:
	* library/encoding/macTurkish.enc:
	* tools/encoding/cp1250.txt:
	* tools/encoding/cp1251.txt:
	* tools/encoding/cp1252.txt:
	* tools/encoding/cp1253.txt:
	* tools/encoding/cp1254.txt:
	* tools/encoding/cp1255.txt:
	* tools/encoding/cp1256.txt:
	* tools/encoding/cp1257.txt:
	* tools/encoding/cp1258.txt:
	* tools/encoding/cp874.txt:
	* tools/encoding/cp932.txt:
	* tools/encoding/cp936.txt:
	* tools/encoding/cp949.txt:
	* tools/encoding/cp950.txt:
	* tools/encoding/iso8859-1.txt:
	* tools/encoding/iso8859-10.txt:
	* tools/encoding/iso8859-13.txt:
	* tools/encoding/iso8859-14.txt:
	* tools/encoding/iso8859-15.txt:
	* tools/encoding/iso8859-16.txt:
	* tools/encoding/iso8859-2.txt:
	* tools/encoding/iso8859-3.txt:
	* tools/encoding/iso8859-4.txt:
	* tools/encoding/iso8859-5.txt:
	* tools/encoding/iso8859-6.txt:
	* tools/encoding/iso8859-7.txt:
	* tools/encoding/iso8859-8.txt:
	* tools/encoding/iso8859-9.txt:
	* tools/encoding/koi8-r.txt:
	* tools/encoding/macCentEuro.txt:
	* tools/encoding/macCroatian.txt:
	* tools/encoding/macCyrillic.txt:
	* tools/encoding/macGreek.txt:
	* tools/encoding/macIceland.txt:
	* tools/encoding/macRoman.txt:
	* tools/encoding/macTurkish.txt:
	Updated encodings with latest mappings from www.unicode.org.  This
	did not include some Mac encodings that have special multi-unichar
	translations now (like symbols, dingbats and japanese).  Also does
	not include big5, gb or euc* as those have different formats in
	the latest Unicode version that need new conversion tools.  Not
	all related .enc files changed as some had been updated separately.

2001-10-03  Jeff Hobbs  <jeffh@ActiveState.com>

	* README:
	* generic/tcl.h:
	* mac/README:
	* tools/tcl.hpj.in:
	* tools/tcl.wse.in:
	* unix/Makefile.in:
	* unix/README:
	* unix/configure:
	* unix/configure.in:
	* unix/tcl.m4:
	* unix/tcl.spec:
	* win/README: 
	* win/REAME.binary: updated patchlevel to 8.3.4.  Changed urls to
	point to www.tcl-tk.net where applicable.

	* win/configure: 
	* win/configure.in: 
	* win/tcl.m4: 
	* win/Makefile.in: added proper Win64 build support.
	updated patchlevel to 8.3.4.

	* generic/tclEvent.c (Tcl_FinalizeThread): moved freeing of
	tclLibraryPath to before the thread exit handlers are called.
	Slight modification to change on 2001-09-24.

2001-09-28  Miguel Sofer  <msofer@users.sourceforge.net>

	* doc/FindExec.3: added a comment not to change the working
	directory before calling Tcl_GetNameOfExecutable [Bug 219215] 

2001-09-28  Andreas Kupries  <andreas_kupries@users.sourceforge.net> 

	* generic/tclIO.c: added (on behalf of Kevin Kenny
	  <kennykb@users.sourceforge.net>) two more '(ClientData)' casts
	  on calls to Tcl_Preserve and Tcl_Release -- ones that Vince
	  apparently missed.
	
2001-09-27  Don Porter	<dgp@users.sourceforge.net>

	* generic/tclIO.c (ChannelTimerProc):  Added Tcl_Preserve()
	and Tcl_Release() to fix segfault introduced by the 2001-09-26
	changes.  [Bug 465494]

	* doc/TCL_MEM_DEBUG.3:	Updated out-of-date reference to
	#define GUARD_SIZE.

2001-09-26  Andreas Kupries  <andreas_kupries@users.sourceforge.net> 

	* The changes below fix [Bug #462317] where Expect tried to read
	  more than was in the buffers and then blocked in the OS call as
	  its pty channel driver provides no blockmodeproc through which
	  the OS could be notified of blocking-behaviour. Because of this
	  the general I/O core has to take more care than usual to
	  preserve the semantics of non-blocking channels.

	* generic/tclIO.c (Tcl_ReadRaw): Do not read from the driver if
	  the channel is non-blocking and the fileevent causing the read
	  was generated by a timer. We do not know if there is data
	  available from the OS. Instead of going to the OS for more and
	  potentially blocking we simply signal EWOULDBLOCK to the higher
	  levels to cause the system to wait for true fileevents.
	  (GetInput): Same as before.
	  (ChannelTimerProc): Added set and clear of CHANNEL_TIMER_FEV.

	* generic/tclIO.h (CHANNEL_TIMER_FEV): New flag for channels. Is
	  set if a fileevent was generated by a timer, the channel is not
	  blocking and the driver did not provide a blockmodeproc. In that
	  case the I/O core has to be especially careful about going to
	  the driver for more data.

2001-09-24  Andreas Kupries  <andreas_kupries@users.sourceforge.net>

	* The change below fixes [Bug #464380]. The bug was reported by
	  Ronnie Brunner <rbrunner@users.sourceforge.net>. He also
	  provided the patch.
	
	* generic/tclEvent.c (Tcl_Finalize): Moved release of
	  'tclLibraryPath' to Tcl_FinalizeThread.
	  (Tcl_FinalizeThread): See above, new place for release of
	  'tclLibraryPath'.

2001-09-20  Jeff Hobbs  <jeffh@ActiveState.com>

	* win/makefile.vc: updated IA64 compile settings

	* win/tclWinInit.c: added extra processor definitions. (mstacy)

	* win/tclWinSock.c (SocketThread): corrected pointer cast for _WIN64.

	* win/tclWinNotify.c: removed unnecessary winsock include (it is
	  already in from tclWinPort.h).

	* win/tclWinPort.h: changed winsock.h include to winsock2.h.
	  Reverses change from 2000-11-16, but is necessary for WIN64.
	  Extensions should comply with defined OS words, or use #ifndef.

2001-09-19  Jeff Hobbs  <jeffh@ActiveState.com>

	* generic/tclTest.c (TestcmdtokenCmd): corrected pointer
	  storage/retrieval for 64bit machines.

	* generic/tclCmdAH.c (Tcl_FormatObjCmd):
	* generic/tclScan.c (Tcl_ScanObjCmd): corrected handling of format
	  and scan on 64-bit machines. [Bug 219223, Patch #412696] (rmax)

	* unix/configure: regen'ed
	* unix/tcl.m4: added --enable-64bit support for HP-11 with the
	  64-bit kernel.

	* generic/tcl.h: removed forced #define USE_TCLALLOC 1 for
	  Windows.  This means the native system allocator will be used by
	  default.  This should be binary and source compatible with
	  extensions, as Tcl_Alloc is a properly stubbed function.

2001-09-18  Don Porter	<dgp@users.sourceforge.net>

	* unix/configure: Regen.
	* unix/tcl.m4 (SC_CONFIG_CFLAGS): On Linux, disable inlining when
	  one of the compat/*.c routines is to be linked in. [Patch 440891]

2001-09-13  Jeff Hobbs	<jeffh@ActiveState.com>

	* generic/tclUtf.c (Tcl_UtfPrev): corrected to return the proper
	location when the middle of a UTF-8 byte was passed in.
	[Tk Bug #450504]

2001-09-13  Andreas Kupries <andreas_kupries@users.sourceforge.net>

	* tests/ioCmd.test: Changed the computation of the result for
	  iocmd-8.1[123] so that the tests work for single- and
	  multi-process execution of the testsuite. Depending on the
	  choice of the user stdout is a tty or not and thus reports
	  different channel options. Fixes [460993] reported by Don
	  Porter.

2001-09-12  Don Porter <dgp@users.sourceforge.net>

	Backport several bug fixes from HEAD to core-8-3-1-branch:

	* tests/rename.test:
	* tests/split.test:  Corrected tests to better isolate tests in
	one file from influencing tests in other files.	 [Bug 460591]

	* unix/tclLoadShl.c:  Added #include of tclInt.h; access to Tcl
        internals, notably TclpUnloadFile(), is required.  Thanks to
        Bob Techentin for report and patch.  [Bug 459305]

	* generic/tclInitScript.h (initScript):
        * win/tclWinInit.c (TCL_REGISTRY_KEY, TclpSetVariables):  Removed
        vestiges of Tcl's old initialization from registry variables.
        [Bug 455645]

	* tests/unixInit.test (unixInit-3.2): Updated test to support
        newer HP-UX releases that properly report euc-jp as the system
        encoding for Japanese.  Bug report and patch verification by Bob
        Techentin.  [Bug 453883]

	* compat/strtod.c (strtod):  Fixed failure to handle expressions
        like 3eq2 and failure to set errno on overflow.  [Bug 440894]

2001-09-10  Jeff Hobbs  <jeffh@ActiveState.com>

	* generic/tclEvent.c (TclInExit): Corrected handling of tsd in
	late stages of finalization.  [Bug #419449] (darley)

	* tests/stack.test:
	* generic/tclInterp.c (AliasObjCmd): Check the numLevels to ensure
	that we aren't hitting some alias loop condition.  [Bug #443184]

2001-09-10  Andreas Kupries <andreas_kupries@users.sourceforge.net>

	* generic/tclInt.decls: Added 'TclWinFlushDirtyChannels' to
	  the internal platform specific stub table.

2001-09-06  Andreas Kupries <andreas_kupries@users.sourceforge.net>

	* All the changes below serve to fix bug [219148] which reports a
	  80x performance hit for file I/O on Win* systems. On my system
	  it was closer to a 120x hit. Problem report by Uwe Traum <no
	  email address available>.

	  The fix goes like this: The obstacle is 'FlushFileBuffers',
	  executed whenever Tcl writes data to the OS, as Tcl has to wait
	  for the disk to complete I/O, and disks are slow. We remove that
	  obstacle. This opens another problem, [file size] reports back
	  wrong numbers. So for [file size] we add the call back in. As
	  optimization we keep track of the channels which were written to
	  and flush only these.

	* win/tclWinFile.c (TclpObjStat): Added a call to
	  'TclWinFlushDirtyChannels'. This ensures that [file size] and
	  related commands report the correct size of a file even if Tcl
	  has recently written to it. Unixoid OS's always report the
	  correct size even for files with pending data, but Win*
	  syssystem don't. They only report what is actually on disk.

	* win/tclWinInt.h: Added declaration of
	  'TclWinFlushDirtyChannels', making it available to other parts
	  of the tcl core.

	* win/tclWinChan.c (TclWinFlushDirtyChannels): New, internal,
	  procedure. Goes through the list of open file channels and
	  forces the OS to flush its file buffers for all which were
	  written to since the last call of this function. This is an
	  expensive operation as Tcl has to wait for the OS to complete
	  actual writes to the disk.

	  (FileInfo): Added dirty flag required by the procedure above.

	  (FileOutputProc): Removed flushing of file buffers, setting the
	  dirty flag instead. This means that the previously incurred
	  delays do not happen anymore.

	  (TclWinOpenFileChannel): Added initialization of 'dirty' flag.

2001-09-06  Don Porter	<dgp@users.sourceforge.net>

	* doc/http.n:
	* library/http/*.tcl:
	* tools/tcl.wse.in:
	* tools/tclmin.wse:
	* unix/Makefile.in:
	* win/{Mm}akefile.*:  Updated http package to version 2.4,
	  reflecting the new features just added.

2001-09-06  Jeff Hobbs	<jeffh@ActiveState.com>

	* doc/http.n: noted -binary, charset and coding state keys.
	* tests/http.test:
	* library/http/pkgIndex.tcl:
	* library/http/http.tcl (geturl): correctly get charset parameter
	  and convert text according to specified encoding (if known).
	  RFC iso8859-1 is used by default.  Also recognize
	  Content-encoding to see if we should do binary translation.
	  Added a CYA -binary switch for the cases that were missed. [Bug
	  #219211 #219399]

	* tests/ioUtil.test: changed to make better use of constraints and
	  remove knownBug constraints that weren't valid.

2001-09-01  David Gravereaux <davygrvy@pobox.com>

	-=[ Tcl_Async* API merge from HEAD ]=-

	* generic/tclInt.decls:  Removed TclpAsyncMark permanently and left
	the hole not to upset the positions.

	* generic/tclDecls.h:
	* generic/tclIntDecls.h:
	* generic/tclIntPlatDecls.h:
	* generic/tclPlatDecls.h:
	* generic/tclStubInit.c:  regen'd tables.

	* generic/tclAsync.c: Brought source to match -r1.6 on the HEAD
	branch.

	* generic/tclEvent.c:
	* generic/tclInt.h: Added prototype to and use of new
	TclFinalizeAsync() found in tclAsync.c.

	* unix/tclUnixPort.h:
	* mac/tclMacPort.h: removed #defines for TclpAsyncMark.
	* doc/Init.3: Manual entry for Tcl_Init [Bug: 1820].

	* win/tclWinInit.c: Removed the TclpAsyncMark function and the
	thread ID saving that was going on in TclpInitPlatform(). [the old
	hack]

	* win/tclWinThread.c: TclpFinalizeCondition() and
	TclpFinalizeMutex() are now properly returning the old
	CriticalSection handle to the system.  Tcl_CreateThread() is now
	decrementing its handle reference, so the system will recover
	resources when the thread closes (doh!).  These changes are all
	already up on the HEAD.

	* doc/Async.3:  matches HEAD.

2001-08-30  Jeff Hobbs  <jeffh@ActiveState.com>

	* generic/tclIndexObj.c: fixed some casting problems that upset
	Crays. [Bug #419528] (andreasen)

	* tests/httpd (httpdRespond): added response to timeout value in
	query string.

2001-08-30  Don Porter  <dgp@users.sourceforge.net>

	* generic/tcl.h: Silence warning from Sun compiler. [Bug 454374]

2001-08-27  Jeff Hobbs  <jeffh@ActiveState.com>

	* doc/Encoding.3: added note that tclPlatDecls.h must be included
	for use of Tcl_WinTCharToUtf and Tcl_WinUtfToTChar.

	* doc/Tcl_Main.3: added docs for Tcl_SetMainLoop

	* generic/tclStubInit.c:
	* generic/tclDecls.h:
	* generic/tcl.decls: added Tcl_SetMainLoop proc that allows people
	to set a main loop that will run for tclsh.
	* generic/tcl.h: added Tcl_MainLoopProc typedef
	* generic/tclMain.c (Tcl_SetMainLoop, StdinProc, Prompt): new
	StdinProc and Prompt static procs and Tcl_SetMainLoop stubs proc.
	The first two handle a fileevent based prompt (taken from
	tkMain.c).  Tcl_SetMainLoop enables the interactive setting of a
	main loop procedure.  This enables Tk to be a loadable package.

2001-08-24  Don Porter <dgp@users.sourceforge.net>

	* tests/unixInit.test (unixInit-2.9): Corrected expected result
	to match Tcl's quirky construction of its init library path.

	* tests/ioUtil.test (ioUtil-3.*): Corrected errors in tests
	revealed by fix of overagressive compiler.  [Bug 451200]

	* doc/tclsh.1:	Added note that the tclsh program is frequently
	installed with the Tcl version numer as part of the name.
	[Patch 402725]

	* generic/tclPkg.c:
	* tests/pkg.test:  [package forget] now forgets all of the
	package arguments it receives, not stopping when a package is
	not found.  [Bug 415273]

	* doc/pkgMkindex.n:
	* library/package.tcl:	Corrected documentation and usage
	message of [pkg_mkIndex].

	* tests/unixInit.test (unixInit-2.8): Added extra constraint,
	notInstalledInTmp, to stop this test from damaging installations
	in /tmp; not much fun to have to reinstall the Tcl library every
	time you run the test suite!

	* tests/unixInit.test (unixInit-2.9):
	* unix/tclUnixInit.c (TclpInitLibraryPath):
	* win/tclWinInit.c (TclpInitLibraryPath):  Corrected buggy
	construction of search path entries relative to executable.
	Added test for bad construction.  [Bug 438014]

	* tests/cmdMZ.test (cmdMZ-1.4): added notLinux constraint to test
	to prevent failure message on Linux due to OS caching bug.

	* doc/library.n:  
	* library/init.tcl:
	* tests/autoMkindex.t*: Modified [auto_import] to apply
	pattern matching in the [namespace import] style.  [Bug 420186]
	***POTENTIAL INCOMPATIBILITY*** for any callers of [auto_import]
	from outside Tcl that expect the pattern matching to be like that
	of [string match].

	* tools/genStubs.tcl: Add a package require of Tcl 8
	at the beginning of the script so that the script
	will print a descriptive error message when run
	in an old Tcl 7 shell.

2001-08-23  Andreas Kupries <andreas_kupries@users.sourceforge.net>

	* win/tclWinPipe.c (BuildCommandLine): Fixed tcl Bug
	  [432499]. Part of the code used the non-absolute path to the
	  executable to determine quoting. This failed if the absolute
	  path contained spaces, but the application name itself not. This
	  bug caused no trouble on Win NT 5, but does for other variants
	  in the Win* family. Report and fix due to Ken Poole
	  <kenpoole@users.sourceforge.net>.

2001-08-23  Jeff Hobbs  <jeffh@ActiveState.com>

	* unix/configure:
	* unix/tcl.m4: added QNX-6 build support. [Bug #219410] (loverso)

2001-08-20  Jeff Hobbs  <jeffh@ActiveState.com>

	* library/http/http.tcl (geturl): added port number to Host:
	  header to comply with HTTP/1.1 spec (RFC 2068).  [Bug #452217]

2001-08-08  Don Porter  <dgp@users.sourceforge.net>

	* library/dde1.1/pkgIndex.tcl:
	* library/reg1.0/pkgIndex.tcl:  Package dependencies. [Patch 448931]

	* library/http/http.tcl:  
	* library/http/pkgIndex.tcl:  Upgrade to http 2.3.2.

	* library/msgcat/msgcat.tcl:  
	* library/msgcat/pkgIndex.tcl:  Upgrade to msgcat 1.1.1.

	* library/opt/optparse.tcl:  
	* library/opt/pkgIndex.tcl:  Upgrade to opt 0.4.3.

	* library/tcltest/tcltest.tcl:  
	* library/tcltest/pkgIndex.tcl:  Upgrade to tcltest 1.0.1.

2001-08-07  Miguel Sofer <msofer@users.sourceforge.net>

	* generic/tclExecute.c: Avoid panic when there are extra items in
	  the tcl stack [Bugs #406709 and 439843, Patch #414470]
	* tests/foreach.test: test to exercise the patch

2001-08-06  Jeff Hobbs  <jeffh@ActiveState.com>

	* generic/tclCmdMZ.c (Tcl_RegexpObjCmd, Tcl_RegsubObjCmd):
	reordered the retrieval of arguments to avoid shimmering bug when
	the pattern and string referenced the same object.

	* unix/configure: regenerated
	* unix/tcl.m4: added GNU (HURD) configuration target. (brinkmann)
	[Patch: #442974]

2001-08-03  Jeff Hobbs  <jeffh@ActiveState.com>

	* win/configure: regenerated
	* win/tcl.m4: fixed DLLSUFFIX definition to always be ${DBGX}.dll.
	This is necessary for TEA compliant builds that build shared
	against a static-built Tcl.
	* win/Makefile.in ($(TCLSH)): added $(TCL_STUB_LIB_FILE) to build
	target, otherwise it wouldn't get generated in a static build.

2001-08-06  Andreas Kupries <andreas_kupries@users.sourceforge.net>

	* generic/tclIOCmd.c (Tcl_GetsObjCmd): Applied patch from SF item
	  [442665] to fix the bug reported by it. The function can corrupt
	  a freed object if it is called with objc == 3. This is because
	  it retrieves resultPtr and does not increment its reference
	  count, but then calls Tcl_ObjSetVar2, which causes the retrieved
	  resultPtr object to be released.

2001-07-18  Andreas Kupries <andreas_kupries@users.sourceforge.net>

	* doc/bgerror.n: Fixed Tk! Bug #415757.

2001-07-18  Andreas Kupries <andreas_kupries@users.sourceforge.net>

	* generic/tclIO.c: Aftermath to [SF #427196]. Squash empty buffers
	  if they are smaller than the requested buffersize, to prevent
	  reusage of old buffers and to honor changes in the requested
	  buffersize made by the user.

2001-07-17  Andreas Kupries <andreas_kupries@users.sourceforge.net>

	* generic/tclIO.c (GetInput): Fixed [SF #427196]. Memory was
	  overwritten because a buffer was used after a change of the
	  requested buffersize together with that requested buffersize and
	  not its actual size, which was smaller. Note that the continous
	  reuse of the smaller buffer negatively impacts performance. The
	  system never allocates a buffer with the newly requested bigger
	  buffersize.

2001-07-16  Jeff Hobbs  <jeffh@ActiveState.com>

	* win/tclWinPipe.c (PipeClose2Proc): constrained the mutex lock to
	just the TerminateThread call and waiting for termination. (jsmith)

2001-07-02  Jeff Hobbs  <jeffh@ActiveState.com>

	* tests/util.test: added util-4.6
	* generic/tclUtil.c (Tcl_ConcatObj): Corrected walking backwards
	over utf-8 chars. [Bug #227512]

2001-06-27  Jeff Hobbs  <jeffh@ActiveState.com>

	* generic/tclUtf.c (Tcl_UtfBackslash): Corrected backslash
	handling of multibyte utf-8 chars. [Bug #217987]

	* generic/tclCmdIL.c (InfoProcsCmd): fixed potential mem leak in
	info procs that created objects without using them.

	* generic/tclCompCmds.c (TclCompileStringCmd): fixed mem leak when
	string command failed to parse the subcommand.

2001-05-22  Jeff Hobbs  <jeffh@ActiveState.com>

	* generic/tclObj.c (TclAllocateFreeObjects): simplified
	objSizePlusPadding to use sizeof(Tcl_Obj) (max)

2001-05-04  Daniel Steffen <das@users.sourceforge.net>

        ** Mac 8.3.3 binary release 

	**  detailed change log for changes to mac code for 8.3.3 
	**  (expands on log entries below marked 2001-04-04  Jeff Hobbs)

	* generic/tcl.h: MAC_TCL: addition of ConditionalMacros.h and use of
	DLLIMPORT and DLLEXPORT like on other platforms.  ( => no longer need
	the .exp files and can remove use of #pragma export that never worked
	well)

	* mac/tclMacShLib.exp:
	* mac/tclMacOSA.exp:
	* mac/tclMacMSLPrefix.h: removed files

	* mac/MW_TclBuildLibHeader.h:
	* mac/MW_TclBuildLibHeader.pch:
	* mac/MW_TclHeaderCommon.h:
	* mac/MW_TclStaticHeader.h:
	* mac/MW_TclStaticHeader.pch: new precompiled header files

	* mac/MW_TclAppleScriptHeader.pch:
	* mac/MW_TclHeader.pch:
	* mac/MW_TclTestHeader.pch:
	* mac/tclMacCommonPch.h: revised precompiled header handling: now
	include a common header file 'MW_TclHeaderCommon.h' from all .pch
	files, the .pch files themselves now only setup #defines (e.g.
	BUILD_tcl, STATIC_BUILD, TCL_DEBUG, TCL_THREADS) like in makefiles on
	other platforms.

	* mac/tclMac.h:
	* mac/tclMacPort.h:
	* mac/tclMacInt.h: use of BUILD_tcl and TCL_STORAGE_CLASS like on other
	platforms, standardize #include'd files to what's done on other
	platforms, removed use of #pragma export.

	* mac/tcltkMacBuildSupport.sea.hqx: new archive of mac build support
	files & suggested build environment directory hierarchy: 
	- 'Building MacTclTk' & 'CW Pro6 changes' readme's.
	- projects for MoreFiles 1.5.1 static & shared libraries.
	- project & sources for 'pseudoCarbonSupport', see below.

	* mac/tclMacProjects.sea.hqx: updated mac build project files:
	- build support for CodeWarrior Pro6, UnivIntf 3.4 & shared runtime
	libraries: the MSL libraries and MoreFiles are no longer compiled into
	Tcl.shlb, all non-static binaries now use the Pro6 shared runtime
	libraries and MoreFiles.shlb.  These shlbs are merged into the standard
	Wish and TclShell, but 3rd party applications linking with Tcl.shlb or
	Tk.shlb need to setup access to them.  (see the "(sh-ppc)" targets
	for how to do this.)
	- Merging the full MSL.shlb and the other shlbs into Wish & TclShell
	makes them a bit larger than before, use unmerged binaries to avoid
	copying the shared code with every application, e.g. when deploying
	numerous Wish based droplets.
	- Note that using CW Pro5 to compile extensions is in principle still
	possible, but need to link with Pro6 runtime libraries.
	- Tclapplescript now loads and runs on CFM68k.
	- Highly experimental "pseudoCarbon" support for Tcl only on OS 8/9:
	binaries in "Build:(Carbon):" link against CarbonLib instead of
	InterfaceLib, however the actual code has not been carbonized! i.e. it
	will not run on OSX and may not even run properly with CarbonLib. 
	This should in principle allow you to build & test OS9 CFM Carbon
	binaries that need to link with Tcl.shlb.  On OSX you can use the
	native Tcl.framework, but you have to build a MachO binary as there
	is no CFM glue lib for Tcl.framework.
	the library pseudoCarbonSupport.shlb manually loads the symbols
	from InterfaceLib that are not in CarbonLib but are needed by the
	uncarbonized code in Tcl.shlb and TclShell.

	* generic/tclMain.c: MAC_TCL: workaround for broken/non-standard isatty
	on MW Pro6, #include <unistd.h> instead of defining isatty

	* mac/tclMacPort.h: MW Pro6 changes for MSL fcntl.h, stat.h & isatty

	* mac/tclMacAppInit.c: add EXTERN to InstallConsole to enable DLL
	export via the TCL_STORAGE_CLASS mechanism.

	* mac/tclMacFCmd.c: fix for FSpDirectoryCopy API change

	* mac/tclMacLibrary.c: emit compile time error when
	TCL_REGISTER_LIBRARY and USE_TCL_STUBS are both defined at the same
	time in an extension, this use is not currently supported and will
	result in a crash when dynamically loading the extension.

	* mac/tclMacApplication.r:
	* mac/tclMacLibrary.r:
	* mac/tclMacOSA.r:
	* mac/tclMacResource.r: fixed obsolete copyrights/dates in version
	strings; updated version strings to standard usage; added support for
	'(Support Libraries)' subfolder for shared runtime libraries in
	unmerged binaries; commented out demo setting of "Tcl Environment
	Variables"

	* mac/tclMacChan.c:
	* mac/tclMacSock.c: cast for *BlockMode

	* mac/tclMacUtil.c:
	* mac/tclMacMath.h: removed obsolete hypot() definition

	* generic/tclIntPlatDecls.h:
	* generic/tclInt.decls:
	* generic/tclStubInit.c:
	* mac/tclMacNotify.c:
	* mac/tclMacOSA.c:
	* mac/tclMacUtil.c:
	* generic/tclThreadTest.c: renamed routines conflicting with standard
	Apple or MoreFiles headers (at compile or link time):
	    GetGlobalMouse         -> GetGlobalMouseTcl
    	FSpGetDirectoryID      -> FSpGetDirectoryIDTcl
    	FSpOpenResFileCompat   -> FSpOpenResFileCompatTcl
    	FSpCreateResFileCompat -> FSpCreateResFileCompatTcl
		NewThread              -> NewTestThread
	the renamed MoreFiles *Tcl routines are just wrappers calling into the
	MoreFiles DLL.

	* mac/tclMacCommonPch.h:
	* mac/tclMacThrd.c:
	* mac/tclMacPanic.c: removed OLDROUTINENAMES define, renamed obsolete
	apple API names to modern equivalents; UH3.4 support: added #include
	<ControlDefinitions.h>, updated New*Proc() calls to New*UPP().

	* mac/tclMacUnix.c: added missing (Tcl_Obj ***) cast to
	Tcl_ListObjGetElements call

	* mac/tclMacAlloc.c: modernized TclpSysAlloc() to use temporary
	memory instead of system heap memory when available (MacOS
	>= 7.5 and possibly earlier, use of system heap has been
	discouraged for a long time and has many disadvantages, e.g. memory
	isn't paged out, and errors can very easily bring the system down);
	fixed crashing bug in TclpSysRealloc() and CleanUpExitProc() where
	memory was being accessed after having been deallocated; fixed
	memory leak in (de)allocation code (for every block ever allocated
	with TclpSysAlloc, a Ptr was leaked), if temporary memory is
	available, don't track allocated memory, instead use
	RecoverHandle() to get Handle from Ptr, otherwise use doubly linked
	list to correctly track memory and free all allocated memory; added
	new option for ConfigureMemory: MEMORY_DONT_USE_TEMPMEM, disables
	use of temporary memory even when it would be available, only
	necessary when writing e.g. a driver (using tcl??); increased
	fraction of application heap reserved for OS routines to 512K

2001-04-06  Jeff Hobbs  <jeffh@ActiveState.com>

	* unix/install-sh: added -S option
	* unix/tcl.m4: added Rhapsody/Darwin target
	* unix/tclLoadDyld.c (TclpLoadFile): 
	* unix/tclMtherr.c (matherr): added support for Mac OS X

2001-04-05  Jeff Hobbs  <jeffh@ActiveState.com>

	* generic/tclObj.c (TclAllocateFreeObjects): simplified
	objSizePlusPadding to use sizeof(Tcl_Obj) (max)

	* win/README:
	* win/README.binary: removed note about use of registry (hasn't
	been used for loading since 8.0).

	* win/configure:
	* win/tcl.m4: added -link50compat

	* mac/tclMacProjects.sea.hqx: fixed accidental swap with Tk
	project files.

2001-04-04  Jeff Hobbs  <jeffh@ActiveState.com>

	** Start changes for improved mac build (steffen)  **

	* mac/tclMacShLib.exp:
	* mac/tclMacMSLPrefix.h: removed files

	* generic/tcl.h: addition of ConditionalMacros.h and use of
	DLLIMPORT and DLLEXPORT.

	* generic/tclIntPlatDecls.h:
	* generic/tclInt.decls:
	* generic/tclMain.c:
	* generic/tclStubInit.c:
	* generic/tclThreadTest.c: NewThread -> NewTestThread
	* mac/MW_TclAppleScriptHeader.pch:
	* mac/MW_TclHeader.pch:
	* mac/MW_TclTestHeader.pch:
	* mac/tclMac.h:
	* mac/tclMacAppInit.c:
	* mac/tclMacApplication.r:
	* mac/tclMacChan.c: cast for *BlockMode
	* mac/tclMacCommonPch.h:
	* mac/tclMacFCmd.c:
	* mac/tclMacInt.h:
	* mac/tclMacLibrary.c:
	* mac/tclMacLibrary.r:
	* mac/tclMacMath.h:
	* mac/tclMacNotify.c:
	* mac/tclMacOSA.c:
	* mac/tclMacOSA.r:
	* mac/tclMacPanic.c:
	* mac/tclMacPort.h:
	* mac/tclMacResource.r:
	* mac/tclMacSock.c: cast for *BlockMode
	* mac/tclMacThrd.c:
	* mac/tclMacUnix.c:
	* mac/tclMacUtil.c: changed mac declarations to use Tcl ending,
	fixed copyrights, updated headers, fixed comments, updated
	resource files.  Mac builds are now meant to be build with
	MetroWerks CW 6.

	* mac/MW_TclBuildLibHeader.h:
	* mac/MW_TclBuildLibHeader.pch:
	* mac/MW_TclHeaderCommon.h:
	* mac/MW_TclStaticHeader.h:
	* mac/MW_TclStaticHeader.pch:
	* mac/tcltkMacBuildSupport.sea.hqx: new files

	* mac/tclMacProjects.sea.hqx: new mac build project files.

	** End changes for improved mac build (steffen) **

	* unix/configure:
	* unix/tcl.m4: extended test of termios vs. termio vs. sgtty to
	better detect result on Linux and when certain configure
	redirections are being used. (max) [Patch #402923; Bug #227412,
	#219194]

2001-04-03  Jeff Hobbs  <jeffh@ActiveState.com>

	* generic/tclListObj.c (Tcl_SetListObj): set objPtr->length = 0 in
	empty object case to maintain sanctity of Tcl_Obj bytes/length
	pairing. (porter) [Patch #405998]

	* README:
	* mac/README:
	* win/README:
	* win/README.binary:
	* unix/README: updated patchlevel information to 8.3.3 and
	updated links and notes.

	* generic/tcl.h:
	* tools/tcl.wse.in:
	* win/configure.in (TCL_PATCH_LEVEL):
	* win/configure:
	* unix/configure:
	* unix/configure.in (TCL_PATCH_LEVEL):
	* unix/tcl.spec: updated patchlevel information to 8.3.3
	* doc/expr.n: Added documentation for each of the math library
	functions that expr supports [Bug: 1054].

	***************************************************************
	** START OF ASYNC BACKPORT LOG (8.4aCVS 2001-04-03 -> 8.3.3) **
	***************************************************************

	* doc/CrtChannel.3:
	* doc/CrtSlave.3:
	* doc/DetachPids.3:
	* doc/Eval.3:
	* doc/ObjectType.3:
	* doc/StrMatch.3:
	* doc/after.n:
	* doc/append.n:
	* doc/bgerror.n:
	* doc/binary.n:
	* doc/break.n:
	* doc/case.n:
	* doc/cd.n:
	* doc/close.n:
	* doc/concat.n:
	* doc/continue.n:
	* doc/dde.n:
	* doc/encoding.n:
	* doc/eof.n:
	* doc/error.n:
	* doc/eval.n:
	* doc/exec.n:
	* doc/exit.n:
	* doc/fblocked.n:
	* doc/fileevent.n:
	* doc/filename.n:
	* doc/flush.n:
	* doc/for.n:
	* doc/foreach.n:
	* doc/format.n:
	* doc/gets.n:
	* doc/glob.n:
	* doc/global.n:
	* doc/http.n:
	* doc/if.n:
	* doc/incr.n:
	* doc/join.n:
	* doc/lappend.n:
	* doc/library.n:
	* doc/lindex.n:
	* doc/linsert.n:
	* doc/list.n:
	* doc/llength.n:
	* doc/load.n:
	* doc/lrange.n:
	* doc/lreplace.n:
	* doc/lsort.n:
	* doc/man.macros:
	* doc/memory.n:
	* doc/open.n:
	* doc/package.n:
	* doc/packagens.n:
	* doc/pid.n:
	* doc/pkgMkIndex.n:
	* doc/proc.n:
	* doc/puts.n:
	* doc/pwd.n:
	* doc/read.n:
	* doc/regexp.n:
	* doc/regsub.n:
	* doc/rename.n:
	* doc/resource.n:
	* doc/return.n:
	* doc/scan.n:
	* doc/seek.n:
	* doc/set.n:
	* doc/split.n:
	* doc/string.n:
	* doc/subst.n:
	* doc/switch.n:
	* doc/tclvars.n:
	* doc/tell.n:
	* doc/time.n:
	* doc/unknown.n:
	* doc/update.n:
	* doc/uplevel.n:
	* doc/upvar.n:
	* doc/variable.n:
	* doc/vwait.n:
	* doc/while.n: doc clarifications and cleanup from 8.4aCVS docs

2001-04-02  Jeff Hobbs  <jeffh@ActiveState.com>

	* win/configure:
	* win/tcl.m4 (SHLIB_LD):  added -incremental:no. [Bug #219381]

2001-03-30  Jeff Hobbs  <jeffh@ActiveState.com>

	* generic/tclCkalloc.c (TclFinalizeMemorySubsystem): set curTagPtr
	to NULL to allow for reuse.
	* generic/tclEvent.c (Tcl_Finalize): moved the tsdPtr
	initialization inside the subsystemsInitialized check to prevent
	it potentially getting called twice during finalization.  (wu)
	[Patch #403532, Bug #219391]

	* win/tclWinSock.c (SocketEventProc): Fixed race condition in
	readability of socket on Windows.
	[Patch #410674, Bug #219205 #219333]

	* win/tcl.m4: added imm32.lib to LIBS_GUI for Tk IME support.

	* win/Makefile.in (install-doc): improved install-* targets to use
	their base build dependency.

2001-03-29  Mo DeJong  <mdejong@redhat.com>

	* tests/interp.test: Print out warning when
	testinterpdelete command is not defined.
	Add tests that checks to make sure a
	child interp inherits the parent's cwd.

2001-03-29  Jeff Hobbs  <jeffh@activestate.com>

	* unix/tclUnixPipe.c (TclpCreateTempFile): prevent potential race
	condition and security leak in tmp filename creation.
 	(max) [Patch #402924]

	* unix/configure:
	* unix/tcl.m4: corrected IRIX-5.x config to not use -n32.
 	(english) [Patch #403626]

	* unix/tclUnixThrd.c (Tcl_ConditionWait): fixed handling of
	timeout for threads (corrects excessive CPU usage issue for Tk on
	Unix in threaded Tcl environment). (ruppert) [Bug #411603]

2001-03-26  Donal K. Fellows  <fellowsd@cs.man.ac.uk>

	* win/tclWinInt.h (tclWinTCharEncoding): Removed as now a static
	variable in win/tclWin32Dll.c instead.

2001-03-23  Jeff Hobbs  <jeffh@activestate.com>

	* generic/tclVar.c (Tcl_ArrayObjCmd): Corrected retrieval of
	resultPtr to prevent possible corruption.

	* generic/tclNamesp.c (Tcl_Import): Correctly freed a DString.
 	(lavana) [Patch #403755]

2001-03-14  Don Porter  <dgp@users.sourceforge.net>
	* library/package.tcl (pkg_mkIndex):  Added patch from Vince
	Darley to make [pkg_mkIndex -verbose] even more verbose.
	[Bug 219349, Patch 403529]

2001-03-13  Donal K. Fellows  <fellowsd@cs.man.ac.uk>

	* generic/tclCmdMZ.c (Tcl_StringObjCmd): A missing
	{return TCL_OK;} was causing memory corruption.  [Bug #408002]

	* generic/tclExecute.c (TclDeleteExecEnv, GrowEvaluationStack,
	TclExecuteByteCode): Added some casts to ClientData that are
	apparently needed on some architectures.

2001-03-02  Donal K. Fellows  <fellowsd@cs.man.ac.uk>

	* generic/tclExecute.c (TclExecuteByteCode): Fixed bug that could
	pass pointers to freed memory to command implementations, which
	most obviously caused some weird behaviour with [info level], but
	could have caused problems with user code and command traces too.
	[Bug 404865, Patch 405436]

2001-02-15  Donal K. Fellows  <fellowsd@cs.man.ac.uk>

	* generic/tclCmdMZ.c (Tcl_SplitObjCmd): Improved efficiency of
	splitting strings into individual characters by adding hash so
	that only one Tcl_Obj per character is created.  Improves
	performance of splitting of short strings and makes a huge
	difference to splitting of long strings, such as is done in the
	mime package in tcllib.  [Bug #131523]

2001-01-30  Don Porter  <dgp@users.sourceforge.net>
	* generic/tclIO.c (CopyData): Moved code that updates the count
	of how many bytes are left to copy.  Corrects bug that when
	writing occurs in the background, the copy loop could be
	escaped without updating the count, causing CopyData() to try
	to copy more bytes than the toRead value originally passed to
	TclCopyChannel(), leading to hangs and misreporting of number
	of bytes copied. [Bug 118203, Patch 103432]

2001-01-04  Don Porter  <dgp@users.sourceforge.net>
	* tests/unixInit.test:
	* unix/tclUnixInit.c (TclpInitLibraryPath):
	* win/tclWinInit.c (TclpInitLibraryPath):  Several entries in
	the library path ($tcl_libPath) are determined relative to the
	absolute path of the executable.  When the executable is
	installed in or near the root directory of the file system,
	relative pathnames were being incorrectly generated, and in
	the worst case, memory access violations were crashing the program.
	[Bug 119416, Patch 102972]

2000-12-14  Don Porter  <dgp@users.sourceforge.net>

	* generic/tclExecute.c:
	* tests/expr-old.test:  Re-wrote Tcl's [expr rand()] and
	[expr srand($seed)] implementations, fixing a range error
	on some 64-bit platforms.  Added tests that detect the bug.
	The rewrite changes the seed -> sequence map on 64-bit
	platforms, only for seed >= 2^31, a slight incompatibility.
	[Bug 121072, Patch 102781]

2000-12-10  Don Porter  <dgp@users.sourceforge.net>

	* library/init.tcl:
	* library/msgcat/msgcat.tcl:
	* library/msgcat/pkgIndex.tcl:
	* library/opt/optparse.tcl:
	* library/opt/pkgIndex.tcl: Where [uplevel] is used in a proc
	to evaluate a Tcl built-in command in the caller's context,
	the built-in commands are now fully namespace-qualified.  This
	prevents problems when the caller context is in a namespace where
	the built-in command name has been used by a command in the
	namespace.  (For example, [::ns::set] might be called instead
	of the intended [::set]).  [Bug #119422, Patch #102545]

2000-12-09  jeff hobbs  <jhobbs@interwoven.com>
2000-04-26  Eric Melski  <ericm@scriptics.com>

	* docs/scan.n:
	* tests/scan.test:
	* generic/tclScan.c (Tcl_ScanObjCmd): changed %o and %x to use
	strtoul instead of strtol to correctly preserve scan<>format
	conversion of large integers.  [Patch #102663, Bug #124600]

	* generic/tclExecute.c (TclExecuteByteCode): Commited patch fixing
	handling of {!<boolean>} in expressions. [Patch #102702]

2000-12-08  jeff hobbs  <jhobbs@interwoven.com>

	* library/init.tcl: Added support for PATHEXT variable in
	auto_execok, recognizing the proper set of executable extensions
	on Windows.  [Patch #102719]

2000-12-08  Andreas Kupries  <a.kupries@westend.com>

	* generic/tclEncoding.c (LoadTableEncoding): Changed dangerous
	  code to something less critical. This fixes bug 119417, part A
	  without affecting the speed when loading encodings.

2000-11-24  Donal K. Fellows  <fellowsd@cs.man.ac.uk>

	* generic/tclExecute.c (TclExecuteByteCode): Logical negation "!"
	  can now handle string booleans, provided those values are placed
	  in variables.

	* tests/expr.test (expr-13.17): Check that [expr {!$var}] can
	  negate the string-versions of booleans "yes", "false", etc.

	* library/tcltest/tcltest.tcl (getMatchingFiles,
	  getMatchingDirectories):
	* tools/man2html.tcl (doDir): 
	* tools/man2help.tcl (doDir): 
	* library/package.tcl (tclPkgUnknown,tclMacPkgSearch): 
	* library/safe.tcl (AddSubDirs): [glob] uses -directory instead of
	  unsafe [file join] to fix Bug #123313

	* generic/tclIndexObj.c:
	* generic/tclTestObj.c (TestindexobjCmd): Changed internal
	  representation of index objects to fix Bug #119082; fix
	  shouldn't be visible to outside world...

	* generic/tclTest.c (TestGetIndexFromObjStructObjCmd): 
	* tests/indexObj.test: (indexObj-6.*) Added to test for presence
	  of Bug #119082.

2000-11-23  Donal K. Fellows  <fellowsd@cs.man.ac.uk>

	* generic/tclCmdIL.c (Tcl_LsortObjCmd): Fixed memory leak from Bug
	  #119398

	* library/init.tcl (unknown): Added specific level parameters to
	  all uplevel invokations to boost performance; didn't dare touch
	  the "namespace inscope" stuff though, since it looks sensitive
	  to me!  Should fix Bug #123217, though testing is tricky...

2000-11-16  Andreas Kupries  <a.kupries@westend.com>

	* win/tclWinPort.h (line 69): Changed reference to winsock2.h into
 	  winsock.h. This was a leftover from a foray into using winsock
 	  version 2 (History lesson from Scott Redman and Jeff
 	  Hobbs). This code was no problem when compiling Tcl itself, but
 	  could trip extensions. Fixes bug 122568.

2000-11-02  David Gravereaux  <davygrvy@ajubasolutions.com>

	* generic/tclEvent.c: tclLibraryPath Tcl_Obj didn't have a way
	to share its data among threads.  This caused Tcl_Init() to
	always fail in threads.  Added a way to pass the data around
	with a global char*.  [BUG: 5301]

2000-11-02  Jeff Hobbs  <hobbs@ajubasolutions.com>

	* unix/configure:
	* unix/dltest/configure:
	* win/configure:
	* tools/configure: checked in configure scripts so people doing
	CVS checkouts aren't required to have autoconf.  Changes to
	configure.in in the future will require the corresponding
	configure script to also be re-autoconf'ed and checked in.

	* win/makefile.vc:
	* win/tcl.m4: makefile fixes for Win64 support

	* generic/tclIndexObj.c (Tcl_GetIndexFromObjStruct): minor cast
	changes.

2000-11-01  Jeff Hobbs  <hobbs@ajubasolutions.com>

	* unix/tcl.m4: removed use of -lbsd and -ldl for AIX-5.

	* tests/subst.test: added tests for non-zero return code handling
	by subst.
	* generic/tclParse.c (Tcl_EvalEx): corrected handling of non-zero,
	non-error return code cases for subst. [BUG: 119829]

	* generic/tclVar.c (TclVarTraceExists): Corrected excessive mem
	use when info exists was called on a non-existent array element.
	[BUG: 119213, 119336]

2000-10-30  David Gravereaux  <davygrvy@ajubasolutions.com>

	* win/configure.in:
	* win/Makefile.in:
	* win/makefile.vc:
	* win/tcl.rc:
	* win/tclsh.rc: Added logic to derive filenames better in the resource
	scripts based on compile options.

2000-10-30  Jeff Hobbs  <hobbs@ajubasolutions.com>

	* unix/tclUnixInit.c: added default encoding map from
	"ja_JP.eucJP" to "euc-jp". (takahashi)

	* tests/clock.test: corrected clock-2.* test numbering

	* unix/configure.in (SC_TCL_LINK_LIBS): removed code that was
	commented out (it had been moved to tcl.m4's SC_TCL_LINK_LIBS
	already).

	* unix/tcl.m4: consolidated gettimeofday check for AIX.

2000-10-27  Jeff Hobbs  <hobbs@ajubasolutions.com>

	* unix/configure.in:
	* unix/tcl.m4: added support for AIX-5.

	* generic/tclIO.c (Tcl_NotifyChannel): removed #ifdef around code
	for old channel structures, placed preserve/release around statePtr
	* generic/tclIO.c (CloseChannel): the statePtr for a channel was
	not being freed when the last channel in a stack was freed,
	causing a mem leak.

	* unix/tclUnixChan.c: updated channel types to strict
	TCL_CHANNEL_VERSION_2 style to avoid compiler warnings.  They work
	either way, but this avoids compiler warnings (that worries people).

2000-10-26  David Gravereaux <davygrvy@ajubasolutions.com>

	* win/tclWinFile.c (TclpMatchFilesTypes): NULL was being set to
	"attr" which was a DWORD.  Changed NULL to zero because a 'void *'
	can't be set to a DWORD to avoid the compiler warning.

2000-10-20  Jeff Hobbs  <hobbs@ajubasolutions.com>

	* win/tclWinFile.c (TclpMatchFilesTypes): made the stat call only
	occur when necessary (for 'glob' command).  Significantly speeds
	up glob command from 8.3. [BUG: 6216]

2000-10-06  David Gravereaux  <davygrvy@ajubasolutions.com>

	* win/tclWinChan.c: moved Win2K bug case test with GetStdHandle()
	from TclpGetDefaultStdChannel into Tcl_MakeFileChannel to enable
	a more general method in detecting invalid OS handles rather than
	just a specific known case. [BUG: 5971]

2000-10-06  Jeff Hobbs  <hobbs@ajubasolutions.com>

	* tests/cmdAH.test: extra tests for 'file channels' that include
	multiple interpreter tests and channel sharing
	* generic/tclIO.c (Tcl_GetChannelNamesEx): corrected function (and
	consequently 'file channels') to return channels that are actually
	registered for this specific interp, rather than this thread.

2000-09-29  Jeff Hobbs  <hobbs@scriptics.com>

	* win/tclWinSerial.c (SerialGetOptionProc): corrected reporting of
	space parity on Windows (Eason) [Bug 6057].

	* win/Makefile.in: commented use of TESTFLAGS
	* unix/Makefile.in: added TESTFLAGS to test target to
	conform with Windows makefile and TEA style.

	* tests/stack.test: prevented possible crash on systems with low
	default stacksize (Tru64, AIX) in infinite recursion test.  A
	solution to check remaining stack space in the core is best, but
	hard to do in a cross-platform manner.

	* generic/tclIOGT.c (FLUSH_DELAY): renamed DELAY define to
	FLUSH_DELAY to avoid defn conflict using Tru64's cc.

2000-09-28  Jeff Hobbs  <hobbs@ajubasolutions.com>

	* tools/tcl.wse.in: added tclPlatDecls.h and tkPlatDecls.h to the
	Windows .exe install.

	* tests/fCmd.test (fCmd-6.20): corrected test to remove
	c:/tcl8975@ after creating it.

	* tests/fileName.test: cleaned up the testing of glob patterns for
	c:/globTest (Windows) to directly create/remove directory.
2000-09-27  Jeff Hobbs  <hobbs@ajubasolutions.com>

	* generic/tclIO.c (StopCopy): fixed a bug introduced by a partial
	fix in 8.3.2 that didn't set nonBlocking correctly when resetting
	the flags for the write side.  [Bug: 6261]

	***************************************************************
	**  END OF ASYNC BACKPORT LOG (8.4aCVS 2001-04-03 -> 8.3.3)  **
	***************************************************************

2000-08-08  Jeff Hobbs  <hobbs@ajubasolutions.com>

	8.3.2 RELEASE finalized

	* changes: updated for release notes version of ChangeLog

	* library/msgcat1.0/pkgIndex.tcl: 
	* library/msgcat1.0/msgcat.tcl: bumped msgcat version to 1.1.

2000-08-07  Jeff Hobbs  <hobbs@ajubasolutions.com>

	* doc/ChnlStack.3:
	* doc/CrtChannel.3: updated the docs to be aware of the
	TCL_CHANNEL_VERSION_2 style of Tcl channels.

	* generic/tclIO.c (Tcl_CreateChannel): added assertion to verify
	that the new channel versioning will be binary compatible with
	older channel drivers.

	* BACKPORTED FROM 8.4 (HEAD) BRANCH:

	* doc/memory.n: Man page for Tcl "memory" command, which is
	created when TCL_MEM_DEBUG is defined at compile time.

	* doc/TCL_MEM_DEBUG.3: Man page with overall information about
	TCL_MEM_DEBUG usage.

	* doc/DumpActiveMemory.3: Man page for Tcl_DumpActiveMemory,
	Tcl_InitMemory, and Tcl_ValidateAllMemory [Bug: 1816, 1835].

	* doc/Init.3: Man page for Tcl_Init [Bug: 1820].
	* generic/tclCkalloc.c: Fixed some function headers.

	* unix/Makefile.in: add tclsh.ico and tcl.spec to dist target

	* unix/mkLinks: Regen'd with new mkLinks.tcl.

	* unix/mkLinks.tcl: Fixed indentation, made link setup more
	intelligent (only do one existance test per man page, instead of
	one per function).

	* doc/AddErrInfo.3:
	* doc/ChnlStack.3:
	* doc/Exit.3:
	* doc/GetIndex.3:
	* doc/Notifier.3:
	* doc/Object.3:
	* doc/RegExp.3:
	* doc/SetResult.3:
	* doc/SplitList.3:
	* doc/Thread.3:  Added missing entries to NAME section.

	* doc/AddErrInfo.3:
	* doc/CrtObjCmd.3:
	* doc/RecEvalObj.3: Changed Tcl_EvalObj to Tcl_EvalObjEx

	* doc/library.n: Added entries for auto_qualify and auto_import
	[Bug: 1271].
	* doc/library.n: Fixed .SH NAME macro to include each function
	documented on the page, so that mkLinks will know about the
	functions listed there, and so that the Windows help file index
	will get set up correctly [Bug: 1898, 5273].

	* doc/expr.n: Added documentation for each of the math library
	functions that expr supports [Bug: 1054].

	* doc/regsub.n: correct regsub docs [Bug: 5346]

	* doc/scan.n: minor doc fixes [Bug: 5396]

	* doc/RegExp.3: Replaced instances of "Tcl_GetRegExpInfo" with
	"Tcl_RegExpGetInfo", the correct name of the function [Bug: 5901].

	* doc/package.n: Corrected information about [package forget]
	arguments [Bug: 5418].

	* generic/tclCkalloc.c: Fixed some function headers.

	* tests/clock.test: Added test for "2 days 2 hours ago" style
	specifications.

	* generic/tclDate.c: Regenerated from tclGetDate.y.

	* generic/tclGetDate.y: Tweaked grammar to properly handle the
	"ago" keyword when it follows multiple relative unit specifiers,
	as in "2 days 2 hours ago".  [Bug: 5497].

	* generic/tclClock.c (FormatClock): correct code to handle locale
	specific return values from strftime, if any. [Bug: 3345]

	* unix/tclUnixInit.c (TclpSetInitialEncodings): attempt to
	correct setlocale calls for XIM support and locale issues.
	[BUG: 5422 3345 4236 2522 2521]

	* library/init.tcl (auto_import): added check to see if a valid
	pattern was coming in, to avoid simple error cases [Bug: 3326]

	* library/history.tcl: Corrected an off-by-one error in HistIndex,
	which was causing [history redo] to start its search at the wrong
	event index. [Bug: 1269].

	* generic/tclPosixStr.c (Tcl_SignalMsg): clarified #defines for
	Linux on Sparc to compile correctly. [Bug: 5364]

	* generic/tclEnv.c: cast cleanup [Bug: 5624]
	* win/tclWinFCmd.c: cast cleanup [Bug: 5627]

	* generic/tclIndexObj.c (Tcl_GetIndexFromObjStruct): Corrected
	caching of the index ptr to account for offsets != sizeof(char *).
	[Bug: 5153]

	* tests/opt.test:
	* library/opt0.4/optparse.tcl: Applied patch from [Bug: 5922], which 
	corrected an incorrect use of [string match].

	* tests/stringObj.test: Tweaked tests to avoid hardcoded
	high-ASCII characters (which will fail in multibyte locales);
	instead used \uXXXX syntax. [Bug: 3842].

2000-08-05  Jeff Hobbs  <hobbs@scriptics.com>

	* generic/tclIOGT.c (TclChannelTransform): fixed segfault that
	would occur when transforming a channel with a proc that did not
	yet exist. (Kupries)

	* generic/tclTest.c (TestChannelCmd): added some lint init'ing of
	statePtr and chan vars.

2000-07-28  Mo DeJong  <mdejong@redhat.com>

	* win/Makefile.in:
	* win/configure.in:
	* win/tcl.m4:
	* win/tclConfig.sh.in: Back port of gcc for windows
	build system from 8.4.

2000-07-26  Jeff Hobbs  <hobbs@scriptics.com>

	* merged core-8-3-1-io-rewrite back into core-8-3-1-branch.
	The core-8-3-1-io-rewrite branch should now be considered defunct.

	* generic/tclStubInit.c:
	* generic/tclDecls.h:
	* generic/tcl.decls:
	* generic/tcl.h:
	* generic/tclIO.c: moved the Tcl_Channel* macros from tcl.h to
	tclIO.c and made them proper stubbed functions.  These are:
	Tcl_ChannelName, Tcl_ChannelVersion, Tcl_ChannelBlockModeProc,
	Tcl_ChannelCloseProc, Tcl_ChannelClose2Proc, Tcl_ChannelInputProc,
	Tcl_ChannelOutputProc, Tcl_ChannelSeekProc, Tcl_ChannelSetOptionProc,
	Tcl_ChannelGetOptionProc, Tcl_ChannelWatchProc,
	Tcl_ChannelGetHandleProc, Tcl_ChannelFlushProc,
	and Tcl_ChannelHandlerProc.  These should be used to access the
	Tcl_ChannelType structure instead of direct pointer dereferencing.

	* unix/Makefile.in: undid 07-25 Makefile.in changes because we
	don't really want to force all private makefiles on everyone.
	This needs to be addressed again in the future.  Best possible
	solution is to create a tcl/ subdir in the installing include dir
	(as is done already with the lib dir).

	* tests/iogt.test: added RCS string, marked tests 2.* to be
	unixOnly due to underlying system differences.

	* tests/all.tcl: corrected additional sets by Kupries for testing.

2000-07-25 Brent Welch	<welch@ajubasolutions.com>

	* unix/Makefile.in: Need to install all the Tcl headers because
	Itcl depends on internal headers.

2000-07-25 Andreas Kupries <a.kupries@westend.com>

	* tests/iogt.test: (line 866f) New tests iogt-6.[01], highlighting
 	  buffering trouble when stacking and unstacking transformations.
	  iogt-6.0 is solved, see the changes below. iogt-6.1 remains, for
 	  now, due to the perceived complexity of solutions.

	* generic/tclIO.h: (line 139f) struct Channel, added a buffer
	  queue, to hold data pushed back when stacking a transformation.

	* generic/tclIO.c:
	  (line 91f, line 7434f) New internal function 'CopyBuffer'.
	  Derived from 'CopyAndTranslateBuffer', with translation
	  removed.
	  (line 1025f, line 1212f): Initialization of new queue.
	  (line 1164f, Tcl_StackChannel): Pushback of input queue.
	  (line 1293f, Tcl_UnstackChannel): Discard input and pushback.
	  (line 3748f, Tcl_ReadRaw): Modified to use data in the push back
	  area before going to the driver. Uses 'CopyBuffer', s.a.
	  (line 4702f, GetInput): Modified to use data in the push back
	  area before going to the driver.
 	  (line 4867f, Tcl_Seek): Modified to take pushback of the topmost
	  channel in a stack into account.
	  (line 5620f, Tcl_InputBuffered): See above. Added
	  'Tcl_ChannelBuffered'. Analogue to 'Tcl_InputBuffered' but for
	  the buffer area in the channel.

	* generic/tcl.decls: New public API 'Tcl_ChannelBuffered'. S.a.

2000-07-19  Jeff Hobbs  <hobbs@scriptics.com>

	* tests/socket.test: removed doTestsWithRemoteServer constraint
	from socket-12.*.  It requires 'exec', not a remote server.
	Cleaned up some coding errors.

2000-07-18 Brent Welch	<welch@ajubasolutions.com>

	* win/Makefile.in: Added rules for static tcldde and tclreg libraries.

2000-07-17  Jeff Hobbs  <hobbs@scriptics.com>

	* README:
	* win/README:
	* win/README.binary:
	* win/configure.in:
	* unix/configure.in:
	* unix/tcl.spec:
	* tools/tcl.wse.in:
	* generic/tcl.h (TCL_RELEASE_SERIAL): updated to patchlevel 8.3.2

	* unix/Makefile.in:
	* win/Makefile.in:
	* win/makefile.vc: added tclIOGT.c to objects list to compile.

	* generic/tclStubInit.c:
	* generic/tclIntDecls.h:
	* generic/tclInt.decls: commented out internal decls for
	TclTestChannelCmd and TclTestChannelEventCmd as they were moved to
	tclTest.c.  Added new decls for TclChannelEventScriptInvoker and
	TclChannelTransform.

	* generic/tclIO.h: new file that contains the main internal
	structures of Tcl_Channel code to allow for multiple files to
	access them.
	* generic/tclTest.c:
	* generic/tclIO.c: broke into 3 files - tclIO.c core code, tclIO.h
	header code, and tclIOGT.c - the giot test code from Kupries.  The
	channel test code also moved to tclTest.c.
	* generic/tclIO.c (CloseChannel): stopped masking out of the
	TCL_READABLE|TCL_WRITABLE bits from the state flags in
	CloseChannel, instead adding extra intelligence to
	CheckChannelErrors with a new CHANNEL_RAW_MODE bit for special
	behavior when called from Raw channel APIs.

2000-07-13  Jeff Hobbs  <hobbs@scriptics.com>

	* generic/tclIO.c (StackSetBlockMode): moved set of chanPtr
	outside of blockModeProc check to avoid infinite loop when
	blockModeProc was NULL (Kupries).  updated TransformSeekProc to
	not call Tcl_Seek directly (Kupries).

	* win/tclWinChan.c: updated fileChannelType to v2 channel struct
	* win/tclWinConsole.c: updated consoleChannelType to v2 channel struct
	* win/tclWinPipe.c: updated pipeChannelType to v2 channel struct
	* win/tclWinSerial.c: updated serialChannelType to v2 channel struct
	* win/tclWinSock.c: updated tcpChannelType to v2 channel struct

2000-07-11  Brent Welch	<welch@ajubasolutions.com>

	* win/tclConfig.sh.in: Cleaned up unix-specific autoconf variables.

2000-07-11  Jeff Hobbs  <hobbs@scriptics.com>

	* tests/iogt.test: made tests [345].0 not run by default as they
	were failing in the new design, but I'm not convinced that the
	returned result isn't correct.

	* generic/tclDecls.h:
	* generic/tclStubInit.c:
	* generic/tcl.decls: added Tcl_GetTopChannel C API that returns
	the current top channel of a channel stack.  Tcl_GetChannel was
	changed earlier to return the bottommost channel of a stack
	because that is the one that is guaranteed to stay around the
	longest, and this was needed to compensate for certain
	operations that want to look at the state of the main channel.
	Most channel APIs already compensate for grabbing the top, so it
	shouldn't be needed often.

	* generic/tclIO.c (Tcl_StackChannel, Tcl_UnstackChannel): Added
	flushing of buffers (Kupries), removed use of DownChannel macro,
	added Tcl_GetTopChannel public API to get to the top channel of
	the channel stack (necessary for TLS).  Rewrote Tcl_NotifyChannel
	for new channel design (Kupries).  Did some code cleanup in the
	transform code.  tclIO.c must still be broken into bits (separate
	out test code and giot code, create tclIO.h).

2000-07-10  Andreas Kupries <a.kupries@westend.com>

	* tests/iogt.test: Reverted some earlier changes as a fix by Jeff
	  revived the original and correct behaviour. IOW, the tests showed
	  a genuine error and I didn't see it :(.

	* generic/tclIO.c (Tcl_Read|Write_Raw): Changed to directly use
 	  the drivers and not DoRead|DoWrite. The latter use the buffering
 	  system, encoding and eol-translation and this wreaks havoc with
 	  the data going through the transformations. Both procedures use
 	  CheckForchannelErrors and let it believe that there is no
 	  background copy in progress or else stacked channels could not
	  be used for that.

	* generic/tclIO.c (TclCopyChannel, CopyData): Moved access to the
 	  topmost channel from the first to the second procedure to make
 	  the decision about that at the last possible time (Callbacks can
 	  change the stacking).

	test suite: failures of iogt-[345].0
	
2000-07-06  Jeff Hobbs  <hobbs@scriptics.com>

	* tests/iogt.test: new tests for stacked channel stuff based off
	new 'testchannel transform|unstack' code (Kupries IOGT extension).
	* generic/tcl.decls:
	* generic/tcl.h:
	* generic/tclDecls.h:
	* generic/tclStubsInit.c:
	* generic/tclIO.c: complete rewrite of Tcl Channel code for
	stacked channels.  Channels are now designed to work in a more
	stacked fashion with a shared ChannelState data structure.

2000-06-02  Jeff Hobbs  <hobbs@scriptics.com>

	* generic/tclIO.c (CloseChannel): removed the &ing out of
	(TCL_READABLE|TCL_WRITABLE) from the flags, as CloseChannel does
	this on the next pass through for the top channel, and it appeared
	to be causing hangs by not allowing the final flush.

2000-06-01  Jeff Hobbs  <hobbs@scriptics.com>

	* generic/tclIO.c (CloseChannel): Rewrote CloseChannel code to
	unstack a channel during the close process.  Fixed a refcount bug
	in Tcl_UnstackChannel.  [Bug: 5623]
	(CloseChannel): further extended CloseChannel in the stacked case
	to effect certain operations on the next channel that would have
	been done in Tcl_Close.  Also added CHANNEL_CLOSED and removed
	(TCL_READABLE|TCL_WRITABLE) bits from chanPtr->flags.  Changed
	final reset of the WatchProc to check the chanDownPtr's (next)
	interestMask.

2000-05-29  Sandeep Tamhankar <sandeep@scriptics.com>

	* tests/http.test
	* doc/http.n
	* library/http2.3/http.tcl: Fixed bug 5741, where unsuccessful
	geturl calls sometimes leaked memory and resources (sockets).  
	Also, switched around some of the logic so that http::wait never 
	throws an exception.  This is because in an asynchronous geturl, 
	the command callback will probably end up doing all the error 
	handling anyway, and in an asynchronous situation, the user
	expects to check the state when the transaction completes, as
	opposed to being thrown an exception.	For the http package, this
	menas the user can check http::status for "error" and http::error
	for the error message after doing the http::wait.

2000-04-26  Jeff Hobbs  <hobbs@scriptics.com>

	8.3.1 RELEASE

	* README:
	* mac/README:
Changes to README.
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
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

-
+

-
+

-
+

-
+
















-
-
-
+
+
+
-
-
-
-
+
+
+

-
-
-
+
+
+
+
+
+

-
+







-
+



-
+


-
+


-
+


-
+















-
-
-
+
+
+






-
-
-
+
+
+
-






-
-
-
+
+
+
-

+


-
+

-
-
-
-
-
+
+
+
+
+
-

-
+




-
-
-
-
+
+
+
+















-
+









-
-
-
+
-
-
-
-
-
+
+
+
-
-
+
-
-
-
-

-
-
+
-




-
-
+
+
-
-
+
+

-
+



-
-
-
-


-
-
-
-
-
+
+
+
+
+

-
-
-
-
+
+
+
+
-
-
-
-
-
-
-
+
+

-
+







README:  Tcl
    This is the Tcl 8.3.1 source distribution.
    This is the Tcl 8.3.4 source distribution.
    You can get any release of Tcl from:
        http://dev.scriptics.com/registration/<version>.tml
        http://sourceforge.net/project/showfiles.php?group_id=10894
    Tcl/Tk is also available through NetCVS:
	http://dev.scriptics.com/software/tcltk/netcvs.html
	http://tcl.sourceforge.net/

RCS: @(#) $Id: README,v 1.31 2000/04/26 17:31:19 hobbs Exp $
RCS: @(#) $Id: README,v 1.31.2.3 2001/10/03 20:26:09 hobbs Exp $

Contents
--------
    1. Introduction
    2. Documentation
    3. Compiling and installing Tcl
    4. Development tools
    5. Tcl newsgroup
    6. Tcl contributed archive
    7. Tcl Resource Center
    8. Mailing lists
    9. Support and Training
    10. Thank You

1. Introduction
---------------
Tcl provides a powerful platform for creating integration
applications that tie together diverse applications, protocols,
devices, and frameworks.  When paired with the Tk toolkit, Tcl
Tcl provides a powerful platform for creating integration applications that
tie together diverse applications, protocols, devices, and frameworks.
When paired with the Tk toolkit, Tcl provides the fastest and most powerful
provides the fastest and most powerful way to create GUI applications
that run on PCs, Unix, and the Macintosh.  Tcl can also be used for a
variety of web-related tasks and for creating powerful command
languages for applications.
way to create GUI applications that run on PCs, Unix, and the Macintosh.
Tcl can also be used for a variety of web-related tasks and for creating
powerful command languages for applications.

Tcl is maintained, enhanced, and distributed freely as a
service to the Tcl community by Scriptics Corporation.
The official home for Tcl/Tk is on the Scriptics Web site:
Tcl is maintained, enhanced, and distributed freely by the Tcl community.
The home for Tcl/Tk sources and bug/patch database is on SourceForge:

	http://tcl.sourceforge.net/

with the Tcl Developer Xchange hosted at:

	http://dev.scriptics.com
	http://www.tcl-tk.net/

Tcl is a freely available open source package.  You can do virtually
anything you like with it, such as modifying it, redistributing it,
and selling it either in whole or in part.  See the file
"license.terms" for complete information.

2. Documentation
---------------
----------------

Extensive documentation is available at our website.
The home page for this release, including new features, is
	http://dev.scriptics.com/software/tcltk/8.3.html
	http://www.tcl-tk.net/software/tcltk/8.3.html

Detailed release notes can be found at
	http://dev.scriptics.com/software/tcltk/relnotes/tcl8.3.1.txt
	http://sourceforge.net/project/showfiles.php?group_id=10894

Information about Tcl itself can be found at
	http://dev.scriptics.com/scripting/
	http://www.tcl-tk.net/scripting/

There are many Tcl books on the market.  Most are listed at
	http://dev.scriptics.com/resource/doc/books/
	http://www.tcl-tk.net/resource/doc/books/

2a. Unix Documentation
----------------------

The "doc" subdirectory in this release contains a complete set of
reference manual entries for Tcl.  Files with extension ".1" are for
programs (for example, tclsh.1); files with extension ".3" are for C
library procedures; and files with extension ".n" describe Tcl
commands.  The file "doc/Tcl.n" gives a quick summary of the Tcl
language syntax.  To print any of the man pages on Unix, cd to the
"doc" directory and invoke your favorite variant of troff using the
normal -man macros, for example

		ditroff -man Tcl.n

to print Tcl.n.  If Tcl has been installed correctly and your "man"
program supports it, you should be able to access the Tcl manual entries
using the normal "man" mechanisms, such as
to print Tcl.n.  If Tcl has been installed correctly and your "man" program
supports it, you should be able to access the Tcl manual entries using the
normal "man" mechanisms, such as

		man Tcl

2b. Windows Documentation
-------------------------

The "doc" subdirectory in this release contains a complete set of
Windows help files for Tcl.  Once you install this Tcl release, a
shortcut to the Windows help Tcl documentation will appear in the
The "doc" subdirectory in this release contains a complete set of Windows
help files for Tcl.  Once you install this Tcl release, a shortcut to the
Windows help Tcl documentation will appear in the "Start" menu:
"Start" menu:

	Start | Programs | Tcl | Tcl Help

3. Compiling and installing Tcl
-------------------------------

There are brief notes in the unix/README, win/README, and mac/README
about compiling on these different platforms.  There is additional
information about building Tcl from sources at
There are brief notes in the unix/README, win/README, and mac/README about
compiling on these different platforms.  There is additional information
about building Tcl from sources at
    http://dev.scriptics.com/support/howto/compile.html

	http://www.tcl-tk.net/doc/howto/compile.html

4. TclPro Development tools
--------------------
---------------------------

A high quality set of commercial development tools is now available to
accelerate your Tcl application development.  Scriptics' TclPro
product provides a debugger, static code checker, packaging utility,
and bytecode compiler.  Visit the Scriptics Web site at:

A high quality set of commercial quality development tools is available to
accelerate your Tcl application development.  The TclPro product provides a
debugger, static code checker, packaging utility, and bytecode compiler.
TclPro was open-sourced when Scriptics/Ajuba was acquired by Interwoven.
Visit its home at SourceForge for more information and source/binaries:
	http://dev.scriptics.com/tclpro

for more information on TclPro and for a free evaluation download.
	http://tclpro.sourceforge.net/

5. Tcl newsgroup
----------------

There is a network news group "comp.lang.tcl" intended for the
exchange of information about Tcl, Tk, and related applications.  The
newsgroup is a great place to ask general information questions.  For
bug reports, please see the "Support and bug fixes" section below.
There is a network news group "comp.lang.tcl" intended for the exchange of
information about Tcl, Tk, and related applications.  The newsgroup is a
great place to ask general information questions.  For bug reports, please
see the "Support and bug fixes" section below.

6. Tcl contributed archive
--------------------------

Many people have created exciting packages and applications based on Tcl
and/or Tk and made them freely available to the Tcl community.  An archive
of these contributions is kept on the machine ftp.neosoft.com.  You
can access the archive using anonymous FTP; the Tcl contributed archive is
in the directory "/pub/tcl".  The archive also contains several FAQ
("frequently asked questions") documents that provide solutions to problems
that are commonly encountered by TCL newcomers.

7. Tcl Resource Center
----------------------

Visit http://dev.scriptics.com/resource/ to see an annotated index of
Visit http://www.tcl-tk.net/resource/ to see an annotated index of
many Tcl resources available on the World Wide Web.  This includes
papers, books, and FAQs, as well as development tools, extensions,
applications, binary releases, and patches.  You can also recommend
additional URLs for the resource center using the forms labeled "Add a
Resource".

8. Mailing lists
----------------

A couple of  Mailing List have been set up to discuss Macintosh or
Windows related Tcl issues.  To subscribe send a message to:
	
Several mailing lists are hosted at SourceForge to discuss development or
	wintcl-request@tclconsortium.org
	mactcl-request@tclconsortium.org
	
In the body of the message (the subject will be ignored) put:
	
use issues (like Macintosh and Windows topics).  For more information and
to subscribe, visit:

	subscribe mactcl Joe Smith
	
	http://sourceforge.net/projects/tcl/
Replace Joe Smith with your real name, of course.  (Use wintcl
instead of mactcl if you're interested in the Windows list.)  If you
would just like to receive more information about the list without
subscribing put the line:

	information mactcl
	
and go to the Mailing Lists page.
(or wintcl) in the body instead.

9. Support and Training
------------------------

Scriptics is very interested in receiving bug reports, patches, and
suggestions for improvements.  We prefer that you send this
We are very interested in receiving bug reports, patches, and suggestions
for improvements.  We prefer that you send this information to us via the
information to us via the bug form on the Scriptics Web site, rather
than emailing us directly.  The bug form is at:
bug form at SourceForge, rather than emailing us directly.  The bug
database is at:

	http://dev.scriptics.com/ticket/
	http://tcl.sourceforge.net/

The bug form was designed to give uniform structure to bug reports as
well as to solicit enough information to minimize followup questions.
The bug form also includes an option to automatically post your report
on comp.lang.tcl.  We strongly recommend that you select this option
because someone else who reads comp.lang.tcl may be able to offer a
solution.

We will log and follow-up on each bug, although we cannot promise a
specific turn-around time.  Enhancements may take longer and may not
happen at all unless there is widespread support for them (we're
trying to slow the rate at which Tcl/Tk turns into a kitchen sink).
It's very difficult to make incompatible changes to Tcl/Tk at this
point, due to the size of the installed base.
specific turn-around time.  Enhancements may take longer and may not happen
at all unless there is widespread support for them (we're trying to slow
the rate at which Tcl/Tk turns into a kitchen sink).  It's very difficult
to make incompatible changes to Tcl/Tk at this point, due to the size of
the installed base.

The Tcl community is too large for us to provide much individual
support for users.  If you need help we suggest that you post
questions to comp.lang.tcl.  We read the newsgroup and will attempt to
answer esoteric questions for which no-one else is likely to know the
The Tcl community is too large for us to provide much individual support
for users.  If you need help we suggest that you post questions to
comp.lang.tcl.  We read the newsgroup and will attempt to answer esoteric
questions for which no-one else is likely to know the answer.  In addition,
answer.  In addition, Tcl/Tk support and training are available
commercially from Scriptics at:

	http://dev.scriptics.com/training

Also see the following Web site for links to other organizations that
offer Tcl/Tk training:
see the following Web site for links to other organizations that offer
Tcl/Tk training:

	http://www.scriptics.com/resource/community/commercial/training
	http://www.tcl-tk.net/resource/community/commercial/training

10. Thank You
-------------

We'd like to express our thanks to the Tcl community for all the
helpful suggestions, bug reports, and patches we have received.
Tcl/Tk has improved vastly and will continue to do so with your help.
Changes to changes.
1
2
3

4
5
6
7
8
9
10
1
2

3
4
5
6
7
8
9
10


-
+







Recent user-visible changes to Tcl:

RCS: @(#) $Id: changes,v 1.56 2000/04/26 00:24:19 hobbs Exp $
RCS: @(#) $Id: changes,v 1.56.2.7 2002/02/19 08:29:05 dgp Exp $

1. No more [command1] [command2] construct for grouping multiple
commands on a single command line.

2. Semi-colon now available for grouping commands on a line.

3. For a command to span multiple lines, must now use backslash-return
4869
4870
4871
4872
4873
4874
4875









































































































































































































































4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

2000-04-23 (bug fix) several Mac socket fixes (ingham)

2000-04-24 (bug fix) fixed hang in threaded Unix case when backgrounded
exec process was running (dejong)

--- Released 8.3.1, April 26, 2000 --- See ChangeLog for details ---

2000-05-29 (bug fix) corrected resource cleanup in http error cases.
Improved handling of error cases in http. (tamhankar)

2000-07 (feature rewrite) complete rewrite of the Tcl IO channel subsystem
to correct problems (hangs, core dumps) with the initial stacked channel
implementation.  The new system has many more tests for robustness and
scalability.  There are new C APIs (see Tcl_CreateChannel), but only
stacked channel drivers are affected (ie: TLS, Trf, iogt).  The iogt
extension has been added to the core test code to test the system.
(hobbs, kupries)
	**** POTENTIAL INCOMPATABILITY ****

2000-07 (build improvements) cleanup of the makefiles and configure scripts
to correct support for building under gcc for Windows. (dejong)

2000-08-07 (bug fix) corrected sizeof error in Tcl_GetIndexFromObjStruct.
(perkins)

2000-08-07 (bug fix) correct off-by-one error in HistIndex, which was
causing [history redo] to start its search at the wrong event index. (melski)

2000-08-07 (bug fix) corrected setlocale calls for XIM support and locale
issues in startup. (takahashi)

2000-08-07 (bug fix) correct code to handle locale specific return values
from strftime, if any. (wagner)

2000-08-07 (bug fix) tweaked grammar to properly handle the "ago" keyword
when it follows multiple relative unit specifiers, as in
"2 days 2 hours ago". (melski)

2000-08-07 (doc fixes) numerous doc fixes to correct SEE ALSO and NAME
sections. (english)

2000-08-07 (bug fix) new man pages memory.n, TCL_MEM_DEBUG.3, Init.3 and
DumpActiveMemory.3. (melski)

--- Released 8.3.2, August 9, 2000 --- See ChangeLog for details ---

2000-09-27 (bug fix) fixed a bug introduced by a partial fix in 8.3.2 that
didn't set nonBlocking correctly when resetting the flags for the write
side (mem leak) Correct mem leak in channels when statePtr was released
(hobbs)

2000-09-29 (bug fix) corrected reporting of space parity on Windows (Eason)

2000-10-06 (bug fix) corrected [file channels] to only return channels in
the current interpreter (hobbs)

2000-10-20 (feature enhancement) call stat only when necessary in 'glob' to
speed up command significantly in base cases (hobbs)

2000-11-01 (mem leak) Corrected excessive mem use of info exists on a
non-existent array element (hobbs)

2000-11-02 (bug fix) Corrected sharing of tclLibraryPath in threaded
environment (gravereaux)

2000-11-23 (mem leak) fixed potential memory leak in error case of lsort
(fellows)

2000-12-09 (feature enhancement) changed %o and %x to use strtoul instead
of strtol to correctly preserve scan<>format conversion of large integers
(hobbs)
Fixed handling of {!<boolean>} in expressions (hobbs, fellows)

2000-12-14 (feature enhancement) improved (s)rand for 64-bit platforms
(porter)

2001-01-04 (bug fix) corrected parsing of $tcl_libPath at startup on
Windows (porter)

2001-01-30 (bug fix) Fixed possible hangs in fcopy. (porter)

2001-02-15 (feature enhancement) improved efficiency of [string split]
(fellows)

2001-03-13 (bug fix) Correctly possible memory corruption in string map {}
$str (fellows)

2001-03-29 (bug fix) prevent potential race condition and security leak in
tmp filename creation on Unix. (max)
Fixed handling of timeout for threads (corrects excessive CPU usage issue
for Tk on Unix in threaded Tcl environment). (ruppert)

2001-03-30 (bug fix) corrected Windows memory error on exit (wu)
Fixed race condition in	readability of socket on Windows.

2001-04-03 (doc fixes) numerous doc corrections and clarifications.
Update of READMEs.

2001-04-04 (build improvements) redid Mac build structure (steffen)
Corrected IRIX-5* configure (english).  Added support for AIX-5 (hobbs).
Added support for Win64 (hobbs).

--- Released 8.3.3, April 6, 2001 --- See ChangeLog for details ---

2001-06-27 (bug fix) corrected backslash substitution of non-ASCII characters.
(hobbs, riefenstahl)

2001-07-02 (bug fix) corrected [concat] treatment of UTF-8 strings (hobbs,
barras)

2001-07-16 (bug fix) corrected thread-enabled pipe closing on Windows
(hobbs, jsmith)

2001-07-18 (bug fix) corrected memory overwrite error when buffer size
of a channel is changed after channel use has already begun (kupries, porter)

2001-08-06 (bug fix) corrected object reference counting in [gets] (jikamens)

2001-08-06 (new feature) added GNU (HURD) configuration target. (brinkmann)

2001-08-07 (bug fix) corrected bytecode stack management during [break]
(see test foreach-5.5) (sofer, tallneil, jstrot)

2001-08-08 (new features) updated packages msgcat 1.1.1, opt 0.4.3,
tcltest 1.0.1, dependencies checked (porter)

2001-08-20 (new feature) http 2.3.2: include port number in Host: header
to comply with HTTP/1.1 spec (RFC 2068)  (hobbs, tils)

2001-08-23 (new feature) added QNX-6 build support (loverso)

2001-08-23 (bug fix) corrected handling of spaces in path name passed to
[exec] on Windows (kenpoole)

2001-08-24 (bug fix) corrected [package forget] stopping on non-existent
package (porter)

2001-08-24 (bug fix) corrected construction of script library search path
relative to executable (porter)

2001-08-24 (bug fix) [auto_import] now matches patterns like
[namespace import], not like [string match] (porter)
	**** POTENTIAL INCOMPATABILITY ****

2001-08-27 (new feature) added Tcl_SetMainLoop() to enable loading Tk as a
true package (hobbs)

2001-08-30 (bug fix) build support for Crays (andreasen)

2001-09-01 (bug fix) rewrite of Tcl_Async* APIs to better manage thread
cleanup  (gravereaux)

2001-09-06 (new feature) http 2.4: honor the Content-encoding and charset
parameters; add -binary switch for forcing the issue (hobbs, saoukhi, orwell)

2001-09-06 (speed improvement) rewrite of file I/O flush management on
Windows.  Approximately 100x speedup for some operations. (kupries, traum)

2001-09-10 (bug fix) corrected finalization error in TclInExit (darley)

2001-09-10 (bug fix) protect against alias loops (hobbs)

2001-09-12 (bug fix) added missing #include in tclLoadShl.c (techentin)

2001-09-12 (bug fix) script library path construction on Windows no longer
uses registry, nor adds the current working directory to the path (porter)

2001-09-12 (bug fix) correct bugs in compatibility strtod() (porter)

2001-09-13 (bug fix) Tcl_UtfPrev now returns the proper location when the
middle of a UTF-8 byte is passed in (hobbs)

2001-09-19 (bug fix) [format] and [scan] corrected for 64-bit machines (rmax)

2001-09-19 (new feature) --enable-64-bit support for HP-11. (hobbs)

2001-09-19 (new feature) native memory allocator now default on Windows
(hobbs)

2001-09-20 (new feature) WIN64 support and extra processor definitions
(hobbs, mstacy)

2001-09-26 (bug fix) corrected potential deadlock in channels that do not
provide a BlockModeProc (kupries, kogorman)

2001-10-03  (new feature) WIN64 build support (hobbs)

2001-10-03 (bug fix) correction in thread finalization (rbrunner)

2001-10-04 (new feature) updated encodings with latest mappings from
www.unicode.org (hobbs)

2001-10-11 (bug fix) corrected cleanup of self-referential bytecodes at
interpreter deletion (sofer, rbrunner)

2001-10-16 (new feature) config support for MacOSX / Darwin (steffen)

2001-10-16 (new feature, Mac) change in binary extension format from MachO
bundles to standard .dylib dynamic libraries like on other unices.
	**POTENTIAL INCOMPATIBILITY*** 

2001-10-18 (bug fix) corrected off-by-one-day error in clock scan with
relative months and years during swing hours. (lavana)

--- Released 8.3.4, October 19, 2001 --- See ChangeLog for details ---

2001-11-06 (bug fix)[478856] loss of fileevents due to short reads (kupries)

2001-11-09 (bug fix)[480176] [global] mishandled varnames matching :* (porter)

2001-11-19 (bug fix)[478847] overflows in [time] of >2**31 microseconds (kenny)

2001-11-29 (bug fix)[231259] failure to re-compile after cmd shadowing (sofer)

2001-12-10 (bug fix)[490514] doc fixes (porter,english)

2001-12-21 (new feature) MaxOSX / Darwin support (steffen)

2001-12-28 (bug fix) proper case in [auto_execok] use of $env(COMPSPEC) (hobbs)

2002-01-17 (bug fix)[504642] Tcl_Obj refCounts in [gets] (griffen,kupries)

2002-01-21 (bug fix)[506297] infinite loop writing in iso2022-jap encoding
(forssen,kupries)

2002-01-24 (HTTP server bug workaround)[504508] leave the default port out
of the Host: header value
=> http 2.4.1 (hobbs)

2002-01-25 (new feature)[496733] socket options -eofchar and -translation
return read-only values (dejong)

2002-02-05 (bug fix) [http::error] called when [::error] intended
=> http 2.4.2 (porter)

2002-02-05 (bug fix)[465765] avoid zero-byte writes to STREAMs (talcott,kupries)

2002-02-06 (bug fix)[495213] [scan] accept 0x as prefix of base 16 value (hobbs)

Changes to compat/strftime.c.
1
2
3
4
5
6
7
8
9
10


11

12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20










+
+
-
+







/* 
 * strftime.c --
 *
 *	This file contains a modified version of the BSD 4.4 strftime
 *	function.
 *
 * This file is a modified version of the strftime.c file from the BSD 4.4
 * source.  See the copyright notice below for details on redistribution
 * restrictions.  The "license.terms" file does not apply to this file.
 *
 * Changes 2002 Copyright (c) 2002 ActiveState Corporation.
 *
 * RCS: @(#) $Id: strftime.c,v 1.7 2000/01/15 01:50:43 hobbs Exp $
 * RCS: @(#) $Id: strftime.c,v 1.7.2.2 2002/05/24 19:36:28 hobbs Exp $
 */

/*
 * Copyright (c) 1989 The Regents of the University of California.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
41
42
43
44
45
46
47
48

49
50
51
52
53
54
55
43
44
45
46
47
48
49

50
51
52
53
54
55
56
57







-
+







 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

#if defined(LIBC_SCCS)
static char *rcsid = "$Id: strftime.c,v 1.7 2000/01/15 01:50:43 hobbs Exp $";
static char *rcsid = "$Id: strftime.c,v 1.7.2.2 2002/05/24 19:36:28 hobbs Exp $";
#endif /* LIBC_SCCS */

#include <time.h>
#include <string.h>
#include <locale.h>
#include "tclInt.h"
#include "tclPort.h"
65
66
67
68
69
70
71






72
73
74
75
76
77
78
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86







+
+
+
+
+
+







    const char *am_pm[2];
    const char *d_t_fmt;
    const char *d_fmt;
    const char *t_fmt;
    const char *t_fmt_ampm;
} _TimeLocale;
 
/*
 * This is the C locale default.  On Windows, if we wanted to make this
 * localized, we would use GetLocaleInfo to get the correct values.
 * It may be acceptable to do localization of month/day names, as the
 * numerical values would be considered the locale-independent versions.
 */
static const _TimeLocale _DefaultTimeLocale = 
{
    {
	"Sun","Mon","Tue","Wed","Thu","Fri","Sat",
    },
    {
	"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
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
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







+









-
+




+











+
+
+
+
+







    "%m/%d/%y",
    "%H:%M:%S",
    "%I:%M:%S %p"
};

static const _TimeLocale *_CurrentTimeLocale = &_DefaultTimeLocale;

static int isGMT;
static size_t gsize;
static char *pt;
static int		 _add _ANSI_ARGS_((const char* str));
static int		_conv _ANSI_ARGS_((int n, int digits, int pad));
static int		_secs _ANSI_ARGS_((const struct tm *t));
static size_t		_fmt _ANSI_ARGS_((const char *format,
			    const struct tm *t));

size_t
TclpStrftime(s, maxsize, format, t)
TclpStrftime(s, maxsize, format, t, useGMT)
    char *s;
    size_t maxsize;
    const char *format;
    const struct tm *t;
    int useGMT;
{
    if (format[0] == '%' && format[1] == 'Q') {
	/* Format as a stardate */
	sprintf(s, "Stardate %2d%03d.%01d",
		(((t->tm_year + TM_YEAR_BASE) + 377) - 2323),
		(((t->tm_yday + 1) * 1000) /
			(365 + IsLeapYear((t->tm_year + TM_YEAR_BASE)))),
		(((t->tm_hour * 60) + t->tm_min)/144));
	return(strlen(s));
    }

    isGMT = useGMT;
    /*
     * We may be able to skip this for useGMT, but it should be harmless.
     * -- hobbs
     */
    tzset();

    pt = s;
    if ((gsize = maxsize) < 1)
	return(0);
    if (_fmt(format, t)) {
	*pt = '\0';
140
141
142
143
144
145
146














147
148
149
150
151
152
153
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+







				((t)->tm_wday ? (t)->tm_wday - 1 : 6)) / 7)

static size_t
_fmt(format, t)
    const char *format;
    const struct tm *t;
{
#ifdef WIN32
#define BUF_SIZ 256
    TCHAR buf[BUF_SIZ];
    SYSTEMTIME syst = {
	t->tm_year + 1900,
	t->tm_mon + 1,
	t->tm_wday,
	t->tm_mday,
	t->tm_hour,
	t->tm_min,
	t->tm_sec,
	0,
    };
#endif
    for (; *format; ++format) {
	if (*format == '%') {
	    ++format;
	    if (*format == 'E') {
				/* Alternate Era */
		++format;
	    } else if (*format == 'O') {
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
212
213
214
215
216
217
218




219
220
221
222
223
224
225







-
-
-
-







		    if (!_add(_CurrentTimeLocale->abmon[t->tm_mon]))
			return(0);
		    continue;
		case 'C':
		    if (!_conv((t->tm_year + TM_YEAR_BASE) / 100,
			    2, '0'))
			return(0);
		    continue;
		case 'c':
		    if (!_fmt(_CurrentTimeLocale->d_t_fmt, t))
			return(0);
		    continue;
		case 'D':
		    if (!_fmt("%m/%d/%y", t))
			return(0);
		    continue;
		case 'd':
		    if (!_conv(t->tm_mday, 2, '0'))
303
304
305
306
307
308
309
































310
311
312
313
314
315
316
317

318
319
320
321
322
323
324
325
326
327
328
329

330
331
332
333
334
335
336
337
338
339
340
341
342
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384

385

386
387
388
389
390
391

392
393
394
395
396
397
398







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+








+









-

-
+





-







		    if (!_conv(MON_WEEK(t), 2, '0'))
			return(0);
		    continue;
		case 'w':
		    if (!_conv(t->tm_wday, 1, '0'))
			return(0);
		    continue;
#ifdef WIN32
		/*
		 * To properly handle the localized time routines on Windows,
		 * we must make use of the special localized calls.
		 */
		case 'c':
		    if (!GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE,
			    &syst, NULL, buf, BUF_SIZ) || !_add(buf)
			    || !_add(" ")) {
			return(0);
		    }
		    /*
		     * %c is created with LONGDATE + " " + TIME on Windows,
		     * so continue to %X case here.
		     */
		case 'X':
		    if (!GetTimeFormat(LOCALE_USER_DEFAULT, 0,
			    &syst, NULL, buf, BUF_SIZ) || !_add(buf)) {
			return(0);
		    }
		    continue;
		case 'x':
		    if (!GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE,
			    &syst, NULL, buf, BUF_SIZ) || !_add(buf)) {
			return(0);
		    }
		    continue;
#else
		case 'c':
		    if (!_fmt(_CurrentTimeLocale->d_t_fmt, t))
			return(0);
		    continue;
		case 'x':
		    if (!_fmt(_CurrentTimeLocale->d_fmt, t))
			return(0);
		    continue;
		case 'X':
		    if (!_fmt(_CurrentTimeLocale->t_fmt, t))
			return(0);
		    continue;
#endif
		case 'y':
		    if (!_conv((t->tm_year + TM_YEAR_BASE) % 100,
			    2, '0'))
			return(0);
		    continue;
		case 'Y':
		    if (!_conv((t->tm_year + TM_YEAR_BASE), 4, '0'))
			return(0);
		    continue;
#ifndef MAC_TCL
		case 'Z': {
		    char *name = TclpGetTZName(t->tm_isdst);
		    char *name = (isGMT ? "GMT" : TclpGetTZName(t->tm_isdst));
		    if (name && !_add(name)) {
			return 0;
		    }
		    continue;
		}
#endif
		case '%':
		    /*
		     * X311J/88-090 (4.12.3.5): if conversion char is
		     * undefined, behavior is undefined.  Print out the
		     * character itself as printf(3) does.
		     */
		default:
Changes to compat/string.h.
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16
17
18
19











-
+







/*
 * string.h --
 *
 *	Declarations of ANSI C library procedures for string handling.
 *
 * Copyright (c) 1991-1993 The Regents of the University of California.
 * Copyright (c) 1994-1996 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: string.h,v 1.3 1999/04/16 00:46:30 stanton Exp $
 * RCS: @(#) $Id: string.h,v 1.3.12.1 2001/04/03 22:54:36 hobbs Exp $
 */

#ifndef _STRING
#define _STRING

#include <tcl.h>

55
56
57
58
59
60
61
62


63
64
65
66
67
68

69
70
55
56
57
58
59
60
61

62
63
64
65
66
67
68

69
70
71







-
+
+





-
+


			    CONST char *s2, size_t n));
extern char *		strncat _ANSI_ARGS_((char *dst, CONST char *src,
			    size_t numChars));
extern int		strncmp _ANSI_ARGS_((CONST char *s1, CONST char *s2,
			    size_t nChars));
extern char *		strncpy _ANSI_ARGS_((char *dst, CONST char *src,
			    size_t numChars));
extern char *		strpbrk _ANSI_ARGS_((CONST char *string, char *chars));
extern char *		strpbrk _ANSI_ARGS_((CONST char *string,
			    CONST char *chars));
extern char *		strrchr _ANSI_ARGS_((CONST char *string, int c));
extern size_t		strspn _ANSI_ARGS_((CONST char *string,
			    CONST char *chars));
extern char *		strstr _ANSI_ARGS_((CONST char *string,
			    CONST char *substring));
extern char *		strtok _ANSI_ARGS_((CONST char *s, CONST char *delim));
extern char *		strtok _ANSI_ARGS_((char *s, CONST char *delim));

#endif /* _STRING */
Changes to compat/strtod.c.
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
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











-
+









+







/* 
 * strtod.c --
 *
 *	Source code for the "strtod" library procedure.
 *
 * Copyright (c) 1988-1993 The Regents of the University of California.
 * Copyright (c) 1994 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: strtod.c,v 1.2 1998/09/14 18:39:45 stanton Exp $
 * RCS: @(#) $Id: strtod.c,v 1.2.18.1 2001/09/12 21:26:36 dgp Exp $
 */

#include "tcl.h"
#ifdef NO_STDLIB_H
#   include "../compat/stdlib.h"
#else
#   include <stdlib.h>
#endif
#include <ctype.h>
#include "tclPort.h"

#ifndef TRUE
#define TRUE 1
#define FALSE 0
#endif
#ifndef NULL
#define NULL 0
201
202
203
204
205
206
207




208
209
210
211
212
213
214
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219







+
+
+
+







	    expSign = TRUE;
	    p += 1;
	} else {
	    if (*p == '+') {
		p += 1;
	    }
	    expSign = FALSE;
	}
	if (!isdigit(*p)) {
	    p = pExp;
	    goto done;
	}
	while (isdigit(*p)) {
	    exp = exp * 10 + (*p - '0');
	    p += 1;
	}
    }
    if (expSign) {
228
229
230
231
232
233
234

235
236
237
238
239
240
241
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247







+







	expSign = TRUE;
	exp = -exp;
    } else {
	expSign = FALSE;
    }
    if (exp > maxExponent) {
	exp = maxExponent;
	errno = ERANGE;
    }
    dblExp = 1.0;
    for (d = powersOf10; exp != 0; exp >>= 1, d += 1) {
	if (exp & 01) {
	    dblExp *= *d;
	}
    }
Changes to doc/Access.3.
1
2
3
4
5
6
7

8
9
10
11
12
13
14
1
2
3
4
5
6

7
8
9
10
11
12
13
14






-
+







'\"
'\" Copyright (c) 1998-1999 Scriptics Corportation
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: Access.3,v 1.3 1999/05/06 19:14:39 stanton Exp $
'\" RCS: @(#) $Id: Access.3,v 1.3.12.1 2001/12/10 16:01:42 dgp Exp $
'\" 
.so man.macros
.TH Tcl_Access 3 8.1 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_Access, Tcl_Stat \- check file permissions and other attributes
.SH SYNOPSIS
64
65
66
67
68
69
70
71

64
65
66
67
68
69
70

71







-
+
time.
.PP
If \fIpath\fR exists, \fBTcl_Stat\fR returns 0 and the stat structure
is filled with data.  Otherwise, -1 is returned, and no stat info is
given.

.SH KEYWORDS
stat access
stat, access
Changes to doc/AddErrInfo.3.
1
2
3
4
5
6
7
8

9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7

8
9
10
11
12
13

14
15
16
17
18
19
20
21







-
+





-
+







'\"
'\" Copyright (c) 1989-1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: AddErrInfo.3,v 1.4 2000/04/26 17:00:43 ericm Exp $
'\" RCS: @(#) $Id: AddErrInfo.3,v 1.4.2.1 2000/08/07 21:29:36 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_AddErrorInfo 3 8.0 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_AddObjErrorInfo, Tcl_AddErrorInfo, Tcl_SetErrorCode, Tcl_SetErrorCodeVA, Tcl_PosixError, Tcl_LogCommandInfo \- record information about errors
Tcl_AddObjErrorInfo, Tcl_AddErrorInfo, Tcl_SetObjErrorCode, Tcl_SetErrorCode, Tcl_SetErrorCodeVA, Tcl_PosixError, Tcl_LogCommandInfo \- record information about errors
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
\fBTcl_AddObjErrorInfo\fR(\fIinterp, message, length\fR)
.sp
\fBTcl_AddErrorInfo\fR(\fIinterp, message\fR)
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
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







-
-
+
+









-
+









-
+







and additional elements in \fBerrorCode\fR hold additional pieces
of information that depend on the class.
See the Tcl overview manual entry for details on the various
formats for \fBerrorCode\fR.
.PP
The \fBerrorInfo\fR variable is gradually built up as an
error unwinds through the nested operations.
Each time an error code is returned to \fBTcl_EvalObj\fR
(or \fBTcl_Eval\fR, which calls \fBTcl_EvalObj\fR)
Each time an error code is returned to \fBTcl_EvalObjEx\fR
(or \fBTcl_Eval\fR, which calls \fBTcl_EvalObjEx\fR)
it calls the procedure \fBTcl_AddObjErrorInfo\fR to add
additional text to \fBerrorInfo\fR describing the
command that was being executed when the error occurred.
By the time the error has been passed all the way back
to the application, it will contain a complete trace
of the activity in progress when the error occurred.
.PP
It is sometimes useful to add additional information to
\fBerrorInfo\fR beyond what can be supplied automatically
by \fBTcl_EvalObj\fR.
by \fBTcl_EvalObjEx\fR.
\fBTcl_AddObjErrorInfo\fR may be used for this purpose:
its \fImessage\fR and \fIlength\fR arguments describe an additional
string to be appended to \fBerrorInfo\fR.
For example, the \fBsource\fR command calls \fBTcl_AddObjErrorInfo\fR
to record the name of the file being processed and the
line number on which the error occurred;
for Tcl procedures, the procedure name and line number
within the procedure are recorded, and so on.
The best time to call \fBTcl_AddObjErrorInfo\fR is just after
\fBTcl_EvalObj\fR has returned \fBTCL_ERROR\fR.
\fBTcl_EvalObjEx\fR has returned \fBTCL_ERROR\fR.
In calling \fBTcl_AddObjErrorInfo\fR, you may find it useful to
use the \fBerrorLine\fR field of the interpreter (see the
\fBTcl_Interp\fR manual entry for details).
.PP
\fBTcl_AddErrorInfo\fR resembles \fBTcl_AddObjErrorInfo\fR
but differs in initializing \fBerrorInfo\fR from the string
value of the interpreter's result
Changes to doc/Async.3.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1989-1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: Async.3,v 1.4 2000/04/14 23:01:48 hobbs Exp $
'\" RCS: @(#) $Id: Async.3,v 1.4.2.1 2001/09/01 22:53:45 davygrvy Exp $
'\" 
.so man.macros
.TH Tcl_AsyncCreate 3 7.0 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_AsyncCreate, Tcl_AsyncMark, Tcl_AsyncInvoke, Tcl_AsyncDelete, Tcl_AsyncReady \- handle asynchronous events
.SH SYNOPSIS
56
57
58
59
60
61
62







63
64
65
66
67
68
69
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76







+
+
+
+
+
+
+







interpreter may already be in the middle of evaluating a script;
it may not even be safe to allocate memory, since a memory
allocation could have been in progress when the event occurred.
The only safe approach is to set a flag indicating that the event
occurred, then handle the event later when the world has returned
to a clean state, such as after the current Tcl command completes.
.PP
\fBTcl_AsyncCreate\fR, \fBTcl_AsyncDelete\fR, and \fBTcl_AsyncReady\fR
are thread sensitive.  They access and/or set a thread-specific data
structure in the event of an --enable-thread built core.  The token
created by Tcl_AsyncCreate contains the needed thread information it
was called from so that calling Tcl_AsyncMark(token) will only yield
the origin thread into the AsyncProc.
.PP 
\fBTcl_AsyncCreate\fR creates an asynchronous handler and returns
a token for it.
The asynchronous handler must be created before
any occurrences of the asynchronous event that it is intended
to handle (it is not safe to create a handler at the time of
an event).
When an asynchronous event occurs the code that detects the event
Changes to doc/ChnlStack.3.
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
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

-
+




-
+

-
+



-
+








-
+







'\"
'\" Copyright (c) 1999 Scriptics Corporation
'\" Copyright (c) 1999-2000 Ajuba Solutions.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\"
'\" RCS: @(#) $Id: ChnlStack.3,v 1.1 1999/07/02 19:51:14 welch Exp $
'\" RCS: @(#) $Id: ChnlStack.3,v 1.1.10.2 2000/08/08 00:57:52 hobbs Exp $
.so man.macros
.TH Tcl_StackChannel 3 8.2 Tcl "Tcl Library Procedures"
.TH Tcl_StackChannel 3 8.3 Tcl "Tcl Library Procedures"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
Tcl_StackChannel, Tcl_UnstackChannel \- stack an I/O channel on top of another, and undo it
Tcl_StackChannel, Tcl_UnstackChannel, Tcl_GetStackedChannel \- stack an I/O channel on top of another, and undo it
.SH SYNOPSIS
.nf
.nf
\fB#include <tcl.h>\fR
.sp
Tcl_Channel
\fBTcl_StackChannel\fR(\fIinterp, typePtr, clientData, mask, channel\fR)
.sp
void
int
\fBTcl_UnstackChannel\fR(\fIinterp, channel\fR)
.sp
Tcl_Channel
\fBTcl_GetStackedChannel\fR(\fIchannel\fR)
.sp
.SH ARGUMENTS
.AS Tcl_ChannelType
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
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







-
-
-
+
+
+
-
-
+

+
-
-
-
-
+
+
+
+

-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
-
-
+
+
+
+
+
-
-
-
-
+
+

-
+
-
-
-
-
+
+
+

-
-
-
+
+
+

-
+
-
-
-
+
+
-
-
+
+
+






This can be a subset of the operations currently allowed on \fIchannel\fP.
.AP Tcl_Channel channel in
An existing Tcl channel such as returned by \fBTcl_CreateChannel\fR.
.BE

.SH DESCRIPTION
.PP
These functions are for use by extensions that add processing
layers to Tcl I/O channels.  Examples include compression
and encryption modules.  These functions transparently stack and unstack
These functions are for use by extensions that add processing layers to Tcl
I/O channels.  Examples include compression and encryption modules.  These
functions transparently stack and unstack a new channel on top of an
a new channel on top of an existing one.
Any number of channels can be stacked together.
existing one.  Any number of channels can be stacked together.
.PP
The implementation of the Tcl channel code was rewritten in 8.3.2 to
\fBTcl_StackChannel\fR
replaces an existing \fIchannel\fP with a new channel by
the same name that was registered for \fIchannel\fP
with \fBTcl_RegisterChannel\fP.
correct some problems with the previous implementation with regard to
stacked channels.  Anyone using stacked channels or creating stacked
channel drivers should update to the new \fBTCL_CHANNEL_VERSION_2\fR
\fBTcl_ChannelType\fR structure.  See \fBTcl_CreateChannel\fR for details.
.PP
\fBTcl_StackChannel\fR
\fBTcl_StackChannel\fR stacks a new \fIchannel\fP on an existing channel
works by creating a new channel structure under the existing
\fIchannel\fP and pushing the existing channel functions
down to the newly created channel.
The hidden channel does no buffering, newline translations,
or character set encoding.
Instead, 
the buffering, newline translations, and
encoding functions all remain at the top of the channel stack.
The top-most channel gets changed to use the 
I/O channel functions
defined in \fItypePtr\fP, and the channel functions are passed
the new \fIclientData\fP.
The existing \fIchannel\fP structure is modified in place,
so C applications that continue to use \fIchannel\fP will
also see the effects of the new processing module.
A pointer to a new channel structure is returned,
with the same name that was registered for \fIchannel\fP by
\fBTcl_RegisterChannel\fP.
.PP
\fBTcl_StackChannel\fR works by creating a new channel structure and
although this new data structure is the one that has been
pushed down below the top of the channel module stack.
placing itself on top of the channel stack.  EOL translation, encoding and
buffering options are shared between all channels in the stack.  The hidden
channel does no buffering, newline translations, or character set encoding.
Instead, the buffering, newline translations, and encoding functions all
remain at the top of the channel stack.  A pointer to the new top channel
(This pointer can also be obtained with the
\fBTcl_GetStackedChannel\fP call.)
If an error occurs when stacking the channel,
NULL is returned instead. 
structure is returned.  If an error occurs when stacking the channel, NULL
is returned instead.
.PP
The \fImask\fP parameter specifies the operations that
The \fImask\fP parameter specifies the operations that are allowed on the
are allowed on the new channel.
These can be a subset of the operations allowed on the original channel.
For example, a read-write channel may become
read-only after the \fBTcl_StackChannel\fR call.
new channel.  These can be a subset of the operations allowed on the
original channel.  For example, a read-write channel may become read-only
after the \fBTcl_StackChannel\fR call.
.PP
Closing a channel closes the channels stacked below it.
The close of stacked channels is executed in a way that
allows buffered data to be properly flushed.
Closing a channel closes the channels stacked below it.  The close of
stacked channels is executed in a way that allows buffered data to be
properly flushed.
.PP
\fBTcl_UnstackChannel\fP reverses the process.
\fBTcl_UnstackChannel\fP reverses the process.  The old channel is
The old channel is associated with the channel name,
and the processing module added by
\fBTcl_StackChannel\fR is destroyed.
associated with the channel name, and the processing module added by
\fBTcl_StackChannel\fR is destroyed.  If there is no old channel, then
If there is no old channel, then \fBTcl_UnstackChannel\fP 
is equivalent to \fBTcl_Close\fP .
\fBTcl_UnstackChannel\fP is equivalent to \fBTcl_Close\fP.  If an error
occurs unstacking the channel, \fBTCL_ERROR\fR is returned, otherwise
\fBTCL_OK\fR is returned.

.SH "SEE ALSO"
Notifier(3), Tcl_CreateChannel(3), Tcl_OpenFileChannel(3), vwait(n).

.SH KEYWORDS
channel, compression
Changes to doc/CrtChannel.3.
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
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


+




-
+

-
+



-
+















-



-






-




+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+



















-






-





-












-







'\"
'\" Copyright (c) 1996-1997 Sun Microsystems, Inc.
'\" Copyright (c) 1997-2000 Ajuba Solutions.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\"
'\" RCS: @(#) $Id: CrtChannel.3,v 1.5 2000/04/14 23:01:49 hobbs Exp $
'\" RCS: @(#) $Id: CrtChannel.3,v 1.5.2.2 2001/04/03 22:06:43 hobbs Exp $
.so man.macros
.TH Tcl_CreateChannel 3 8.0 Tcl "Tcl Library Procedures"
.TH Tcl_CreateChannel 3 8.3 Tcl "Tcl Library Procedures"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
Tcl_CreateChannel, Tcl_GetChannelInstanceData, Tcl_GetChannelType, Tcl_GetChannelName, Tcl_GetChannelHandle, Tcl_GetChannelMode, Tcl_GetChannelBufferSize, Tcl_SetChannelBufferSize, Tcl_NotifyChannel, Tcl_BadChannelOption \- procedures for creating and manipulating channels
Tcl_CreateChannel, Tcl_GetChannelInstanceData, Tcl_GetChannelType, Tcl_GetChannelName, Tcl_GetChannelHandle, Tcl_GetChannelMode, Tcl_GetChannelBufferSize, Tcl_SetChannelBufferSize, Tcl_NotifyChannel, Tcl_BadChannelOption, Tcl_ChannelName, Tcl_ChannelVersion, Tcl_ChannelBlockModeProc, Tcl_ChannelCloseProc, Tcl_ChannelClose2Proc, Tcl_ChannelInputProc, Tcl_ChannelOutputProc, Tcl_ChannelSeekProc, Tcl_ChannelSetOptionProc, Tcl_ChannelGetOptionProc, Tcl_ChannelWatchProc, Tcl_ChannelGetHandleProc, Tcl_ChannelFlushProc, Tcl_ChannelHandlerProc, \- procedures for creating and manipulating channels
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
Tcl_Channel
\fBTcl_CreateChannel\fR(\fItypePtr, channelName, instanceData, mask\fR)
.sp
ClientData
\fBTcl_GetChannelInstanceData\fR(\fIchannel\fR)
.sp
Tcl_ChannelType *
\fBTcl_GetChannelType\fR(\fIchannel\fR)
.sp
char *
\fBTcl_GetChannelName\fR(\fIchannel\fR)
.VS
.sp
int
\fBTcl_GetChannelHandle\fR(\fIchannel, direction, handlePtr\fR)
.VE
.sp
int
\fBTcl_GetChannelBufferSize\fR(\fIchannel\fR)
.sp
\fBTcl_SetChannelBufferSize\fR(\fIchannel, size\fR)
.sp
.VS
\fBTcl_NotifyChannel\fR(\fIchannel, mask\fR)
.sp
int
\fBTcl_BadChannelOption\fR(\fIinterp, optionName, optionList\fR)
.VS 8.3.2
.sp
char *
\fBTcl_ChannelName\fR(\fItypePtr\fR)
.sp
Tcl_ChannelTypeVersion
\fBTcl_ChannelVersion\fR(\fItypePtr\fR)
.sp
Tcl_DriverBlockModeProc *
\fBTcl_ChannelBlockModeProc\fR(\fItypePtr\fR)
.sp
Tcl_DriverCloseProc *
\fBTcl_ChannelCloseProc\fR(\fItypePtr\fR)
.sp
Tcl_DriverClose2Proc *
\fBTcl_ChannelClose2Proc\fR(\fItypePtr\fR)
.sp
Tcl_DriverInputProc *
\fBTcl_ChannelInputProc\fR(\fItypePtr\fR)
.sp
Tcl_DriverOutputProc *
\fBTcl_ChannelOutputProc\fR(\fItypePtr\fR)
.sp
Tcl_DriverSeekProc *
\fBTcl_ChannelSeekProc\fR(\fItypePtr\fR)
.sp
Tcl_DriverSetOptionProc *
\fBTcl_ChannelSetOptionProc\fR(\fItypePtr\fR)
.sp
Tcl_DriverGetOptionProc *
\fBTcl_ChannelGetOptionProc\fR(\fItypePtr\fR)
.sp
Tcl_DriverWatchProc *
\fBTcl_ChannelWatchProc\fR(\fItypePtr\fR)
.sp
Tcl_DriverGetHandleProc *
\fBTcl_ChannelGetHandleProc\fR(\fItypePtr\fR)
.sp
Tcl_DriverFlushProc *
\fBTcl_ChannelFlushProc\fR(\fItypePtr\fR)
.sp
Tcl_DriverHandlerProc *
\fBTcl_ChannelHandlerProc\fR(\fItypePtr\fR)
.VE
.sp
.SH ARGUMENTS
.AS Tcl_EolTranslation *channelName in
.AP Tcl_ChannelType *typePtr in
Points to a structure containing the addresses of procedures that
can be called to perform I/O and other functions on the channel.
.AP char *channelName in
The name of this channel, such as \fBfile3\fR; must not be in use
by any other channel. Can be NULL, in which case the channel is
created without a name.
.AP ClientData instanceData in
Arbitrary one-word value to be associated with this channel.  This
value is passed to procedures in \fItypePtr\fR when they are invoked.
.AP int mask in
OR-ed combination of \fBTCL_READABLE\fR and \fBTCL_WRITABLE\fR to indicate
whether a channel is readable and writable.
.AP Tcl_Channel channel in
The channel to operate on.
.VS
.AP int direction in
\fBTCL_READABLE\fR means the input handle is wanted; \fBTCL_WRITABLE\fR
means the output handle is wanted.
.AP ClientData *handlePtr out
Points to the location where the desired OS-specific handle should be
stored.
.VE
.AP Tcl_EolTranslation transMode in
The translation mode; one of the constants \fBTCL_TRANSLATE_AUTO\fR,
\fBTCL_TRANSLATE_CR\fR, \fBTCL_TRANSLATE_LF\fR and \fBTCL_TRANSLATE_CRLF\fR.
.AP int size in
The size, in bytes, of buffers to allocate in this channel.
.VS
.AP int mask in
An OR-ed combination of \fBTCL_READABLE\fR, \fBTCL_WRITABLE\fR
and \fBTCL_EXCEPTION\fR that indicates events that have occurred on
this channel.
.AP Tcl_Interp *interp in
Current interpreter. (can be NULL)
.AP char *optionName in
Name of the invalid option.
.AP char *optionList in
Specific options list (space separated words, without "-") 
to append to the standard generic options list.
Can be NULL for generic options error message only.
.VE

.BE

.SH DESCRIPTION
.PP
Tcl uses a two-layered channel architecture. It provides a generic upper
layer to enable C and Tcl programs to perform input and output using the
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
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
244
245
246
247
248
249
250
251

252
253
254

255

256
257

258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309







-







-

















-





-

-


-





-
-
+
+
+
+

-
+



-
+









+
+
+


-



-

-


-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+






+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







the same as the \fItypePtr\fR argument in the call to
\fBTcl_CreateChannel\fR that created this channel.
.PP
\fBTcl_GetChannelName\fR returns a string containing the name associated
with the channel, or NULL if the \fIchannelName\fR argument to
\fBTcl_CreateChannel\fR was NULL.
.PP
.VS
\fBTcl_GetChannelHandle\fR places the OS-specific device handle
associated with \fIchannel\fR for the given \fIdirection\fR in the
location specified by \fIhandlePtr\fR and returns \fBTCL_OK\fR.  If
the channel does not have a device handle for the specified direction,
then \fBTCL_ERROR\fR is returned instead.  Different channel drivers
will return different types of handle.  Refer to the manual entries
for each driver to determine what type of handle is returned.
.VE
.PP
\fBTcl_GetChannelMode\fR returns an OR-ed combination of \fBTCL_READABLE\fR
and \fBTCL_WRITABLE\fR, indicating whether the channel is open for input
and output.
.PP
 \fBTcl_GetChannelBufferSize\fR returns the size, in bytes, of buffers
allocated to store input or output in \fIchan\fR. If the value was not set
by a previous call to \fBTcl_SetChannelBufferSize\fR, described below, then
the default value of 4096 is returned.
.PP
\fBTcl_SetChannelBufferSize\fR sets the size, in bytes, of buffers that
will be allocated in subsequent operations on the channel to store input or
output. The \fIsize\fR argument should be between ten and one million,
allowing buffers of ten bytes to one million bytes. If \fIsize\fR is
outside this range, \fBTcl_SetChannelBufferSize\fR sets the buffer size to
4096.
.PP
.VS
\fBTcl_NotifyChannel\fR is called by a channel driver to indicate to
the generic layer that the events specified by \fImask\fR have
occurred on the channel.  Channel drivers are responsible for invoking
this function whenever the channel handlers need to be called for the
channel.  See \fBWATCHPROC\fR below for more details.
.VE
.PP
.VS
\fBTcl_BadChannelOption\fR is called from driver specific set or get option
procs to generate a complete error message.
.VE

.SH TCL_CHANNELTYPE
.PP
A channel driver provides a \fBTcl_ChannelType\fR structure that contains
pointers to functions that implement the various operations on a channel;
these operations are invoked as needed by the generic layer. The
\fBTcl_ChannelType\fR structure contains the following fields:
these operations are invoked as needed by the generic layer.  The structure
was versioned starting in Tcl 8.3.2/8.4 to correct a problem with stacked
channel drivers.  See the \fBOLD_CHANNEL\fR section below for details about
the old structure.
.PP
.VS
The \fBTcl_ChannelType\fR structure contains the following fields:
.CS
typedef struct Tcl_ChannelType {
	char *\fItypeName\fR;
	Tcl_DriverBlockModeProc *\fIblockModeProc\fR;	
	Tcl_ChannelTypeVersion \fIversion\fR;
	Tcl_DriverCloseProc *\fIcloseProc\fR;
	Tcl_DriverInputProc *\fIinputProc\fR;
	Tcl_DriverOutputProc *\fIoutputProc\fR;
	Tcl_DriverSeekProc *\fIseekProc\fR;
	Tcl_DriverSetOptionProc *\fIsetOptionProc\fR;
	Tcl_DriverGetOptionProc *\fIgetOptionProc\fR;
	Tcl_DriverWatchProc *\fIwatchProc\fR;
	Tcl_DriverGetHandleProc *\fIgetHandleProc\fR;
	Tcl_DriverClose2Proc *\fIclose2Proc\fR;
	Tcl_DriverBlockModeProc *\fIblockModeProc\fR;	
	Tcl_DriverFlushProc *\fIflushProc\fR;	
	Tcl_DriverHandlerProc *\fIhandlerProc\fR;	
} Tcl_ChannelType;
.CE
.VE
.PP
The driver must provide implementations for all functions except
\fIblockModeProc\fR, \fIseekProc\fR, \fIsetOptionProc\fR,
.VS
\fIgetOptionProc\fR, and \fIclose2Proc\fR, which may be specified as
.VE
NULL.  Other functions that can not be implemented for this type of
device should return \fBEINVAL\fR when invoked to indicate that they
are not implemented.
are not implemented, except in the case of \fIflushProc\fR and
\fIhandlerProc\fR, which should specified as NULL if not otherwise defined.
.PP
.VS 8.3.2
The user should only use the above structure for \fBTcl_ChannelType\fR
instantiation.  When referencing fields in a \fBTcl_ChannelType\fR
structure, the following functions should be used to obtain the values:
\fBTcl_ChannelName\fR, \fBTcl_ChannelVersion\fR,
\fBTcl_ChannelBlockModeProc\fR, \fBTcl_ChannelCloseProc\fR,
\fBTcl_ChannelClose2Proc\fR, \fBTcl_ChannelInputProc\fR,
\fBTcl_ChannelOutputProc\fR, \fBTcl_ChannelSeekProc\fR,
\fBTcl_ChannelSetOptionProc\fR, \fBTcl_ChannelGetOptionProc\fR,
\fBTcl_ChannelWatchProc\fR, \fBTcl_ChannelGetHandleProc\fR,
\fBTcl_ChannelFlushProc\fR, or \fBTcl_ChannelHandlerProc\fR.
.PP
The change to the structures was made in such a way that standard channel
types are binary compatible.  However, channel types that use stacked
channels (ie: TLS, Trf) have new versions to correspond to the above change
since the previous code for stacked channels had problems.
.VE

.SH TYPENAME
.PP
The \fItypeName\fR field contains a null-terminated string that
identifies the type of the device implemented by this driver, e.g.
\fBfile\fR or \fBsocket\fR.
.PP
.VS 8.3.2
This value can be retrieved with \fBTcl_ChannelName\fR, which returns
a pointer to the string.
.VE

.VS 8.3.2
.SH VERSION
.PP
The \fIversion\fR field should be set to \fBTCL_CHANNEL_VERSION_2\fR.
If it is not set to this value \fBTCL_CHANNEL_VERSION_2\fR, then this
\fBTcl_ChannelType\fR is assumed to have the older structure.  See
\fBOLD_CHANNEL\fR for more details.  While Tcl will recognize and
function with either structure, stacked channels must be of the newer
style to function correctly.
.PP
This value can be retrieved with \fBTcl_ChannelVersion\fR, which returns
either \fBTCL_CHANNEL_VERSION_2\fR or \fBTCL_CHANNEL_VERSION_1\fR.
.VE

.SH BLOCKMODEPROC
.PP
The \fIblockModeProc\fR field contains the address of a function called by
the generic layer to set blocking and nonblocking mode on the device.
\fIBlockModeProc\fR should match the following prototype:
.PP
251
252
253
254
255
256
257





258
259
260
261
262
263
264
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340







+
+
+
+
+







.PP
If the operation is successful, the function can modify the supplied
\fIinstanceData\fR to record that the channel entered blocking or
nonblocking mode and to implement the blocking or nonblocking behavior.
For some device types, the blocking and nonblocking behavior can be
implemented by the underlying operating system; for other device types, the
behavior must be emulated in the channel driver.
.PP
.VS 8.3.2
This value can be retrieved with \fBTcl_ChannelBlockModeProc\fR, which returns
a pointer to the function.
.VE

.SH "CLOSEPROC AND CLOSE2PROC"
.PP
The \fIcloseProc\fR field contains the address of a function called by the
generic layer to clean up driver-related information when the channel is
closed. \fICloseProc\fR must match the following prototype:
.PP
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
351
352
353
354
355
356
357

358
359
360
361
362
363
364







-







output will have been flushed to the device before this function is called,
and no further driver operations will be invoked on this instance after
calling the \fIcloseProc\fR. If the close operation is successful, the
procedure should return zero; otherwise it should return a nonzero POSIX
error code. In addition, if an error occurs and \fIinterp\fR is not NULL,
the procedure should store an error message in the interpreter's result.
.PP
.VS
Alternatively, channels that support closing the read and write sides
independently may set \fIcloseProc\fR to \fBTCL_CLOSE2PROC\fR and set
\fIclose2Proc\fR to the address of a function that matches the
following prototype:
.PP
.CS
typedef int Tcl_DriverClose2Proc(
302
303
304
305
306
307
308





309
310
311
312
313
314
315
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395







+
+
+
+
+







described above for \fIcloseProc\fR.  No further operations will be
invoked on this instance after \fIclose2Proc\fR is called with all
flags cleared.  In all cases, the \fIclose2Proc\fR function should
return zero if the close operation was successful; otherwise it should
return a nonzero POSIX error code. In addition, if an error occurs and
\fIinterp\fR is not NULL, the procedure should store an error message
in the interpreter's result.
.PP
.VS 8.3.2
These value can be retrieved with \fBTcl_ChannelCloseProc\fR or
\fBTcl_ChannelClose2Proc\fR, which returns a pointer to the respective
function.
.VE

.SH INPUTPROC
.PP
The \fIinputProc\fR field contains the address of a function called by the
generic layer to read data from the file or device and store it in an
internal buffer. \fIInputProc\fR must match the following prototype:
345
346
347
348
349
350
351





352
353
354
355
356
357
358
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443







+
+
+
+
+







return without blocking. If the input device has no data available
whatsoever and the channel is in nonblocking mode, the function should
return an \fBEAGAIN\fR error. If the input device has no data available
whatsoever and the channel is in blocking mode, the function should block
for the shortest possible time until at least one byte of data can be read
from the device; then, it should return as much data as it can read without
blocking.
.PP
.VS 8.3.2
This value can be retrieved with \fBTcl_ChannelInputProc\fR, which returns
a pointer to the function.
.VE

.SH OUTPUTPROC
.PP
The \fIoutputProc\fR field contains the address of a function called by the
generic layer to transfer data from an internal buffer to the output device.
\fIOutputProc\fR must match the following prototype:
.PP
381
382
383
384
385
386
387





388
389
390
391
392
393
394
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484







+
+
+
+
+







less in some cases such as if the output operation is interrupted by a
signal. If an error occurs the function should return -1.  In case of
error, some data may have been written to the device.
.PP
If the channel is nonblocking and the output device is unable to absorb any
data whatsoever, the function should return -1 with an \fBEAGAIN\fR error
without writing any data.
.PP
.VS 8.3.2
This value can be retrieved with \fBTcl_ChannelOutputProc\fR, which returns
a pointer to the function.
.VE

.SH SEEKPROC
.PP
The \fIseekProc\fR field contains the address of a function called by the
generic layer to move the access point at which subsequent input or output
operations will be applied. \fISeekProc\fR must match the following
prototype:
410
411
412
413
414
415
416





417
418
419
420
421
422
423
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518







+
+
+
+
+







the generic layer for returning \fBerrno\fR values from the function.  The
function should set this variable to a POSIX error code if an error occurs.
The function should store an \fBEINVAL\fR error code if the channel type
does not implement seeking.
.PP
The return value is the new access point or -1 in case of error. If an
error occurred, the function should not move the access point.
.PP
.VS 8.3.2
This value can be retrieved with \fBTcl_ChannelSeekProc\fR, which returns
a pointer to the function.
.VE

.SH SETOPTIONPROC
.PP
The \fIsetOptionProc\fR field contains the address of a function called by
the generic layer to set a channel type specific option on a channel.
\fIsetOptionProc\fR must match the following prototype:
.PP
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457





458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496





497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529





530
531
532
533
534
535
536
537
538
539
540
541
542
543
544

545
546
547
548
549
550
551
552
553
554
555
556




557
558




































559


560
561
562
563
564
565
566
535
536
537
538
539
540
541

542
543
544

545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565

566

567
568
569
570
571
572
573
574
575
576

577
578
579
580
581
582
583

584
585
586
587
588
589
590
591
592
593
594
595
596
597

598
599
600
601
602
603
604
605
606
607
608

609
610
611
612
613
614
615

616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644

645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699

700
701
702
703
704
705
706
707
708







-



-






+
+
+
+
+










-

-










-







-







+
+
+
+
+


-











-







-










+
+
+
+
+














-
+












+
+
+
+


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+







each channel type and the \fIsetOptionProc\fR procedure of the channel
driver will get called to implement them. The \fIsetOptionProc\fR field can
be NULL, which indicates that this channel type supports no type specific
options. 
.PP
If the option value is successfully modified to the new value, the function
returns \fBTCL_OK\fR.
.VS
It should call \fBTcl_BadChannelOption\fR which itself returns
\fBTCL_ERROR\fR if the \fIoptionName\fR is
unrecognized. 
.VE
If \fIoptionValue\fR specifies a value for the option that
is not supported or if a system call error occurs,
the function should leave an error message in the
\fIresult\fR field of \fIinterp\fR if \fIinterp\fR is not NULL. The
function should also call \fBTcl_SetErrno\fR to store an appropriate POSIX
error code.
.PP
.VS 8.3.2
This value can be retrieved with \fBTcl_ChannelSetOptionProc\fR, which returns
a pointer to the function.
.VE

.SH GETOPTIONPROC
.PP
The \fIgetOptionProc\fR field contains the address of a function called by
the generic layer to get the value of a channel type specific option on a
channel. \fIgetOptionProc\fR must match the following prototype:
.PP
.CS
typedef int Tcl_DriverGetOptionProc(
	ClientData \fIinstanceData\fR,
.VS
	Tcl_Interp *\fIinterp\fR,
.VE
	char *\fIoptionName\fR,
	Tcl_DString *\fIdsPtr\fR);
.CE
.PP
\fIOptionName\fR is the name of an option supported by this type of
channel. If the option name is not NULL, the function stores its current
value, as a string, in the Tcl dynamic string \fIdsPtr\fR.
If \fIoptionName\fR is NULL, the function stores in \fIdsPtr\fR an
alternating list of all supported options and their current values.
On success, the function returns \fBTCL_OK\fR. 
.VS
It should call \fBTcl_BadChannelOption\fR which itself returns
\fBTCL_ERROR\fR if the \fIoptionName\fR is
unrecognized. If a system call error occurs,
the function should leave an error message in the
\fIresult\fR field of \fIinterp\fR if \fIinterp\fR is not NULL. The
function should also call \fBTcl_SetErrno\fR to store an appropriate POSIX
error code.
.VE
.PP
Some options are handled by the generic code and this function is never
called to retrieve their value, e.g. \fB-blockmode\fR. Other options are
specific to each channel type and the \fIgetOptionProc\fR procedure of the
channel driver will get called to implement them. The \fIgetOptionProc\fR
field can be NULL, which indicates that this channel type supports no type
specific options.
.PP
.VS 8.3.2
This value can be retrieved with \fBTcl_ChannelGetOptionProc\fR, which returns
a pointer to the function.
.VE

.SH WATCHPROC
.VS
.PP
The \fIwatchProc\fR field contains the address of a function called
by the generic layer to initialize the event notification mechanism to
notice events of interest on this channel.
\fIWatchProc\fR should match the following prototype:
.PP
.CS
typedef void Tcl_DriverWatchProc(
	ClientData \fIinstanceData\fR,
	int \fImask\fR);
.CE
.VE
.PP
The \fIinstanceData\fR is the same as the value passed to
\fBTcl_CreateChannel\fR when this channel was created. The \fImask\fR
argument is an OR-ed combination of \fBTCL_READABLE\fR, \fBTCL_WRITABLE\fR
and \fBTCL_EXCEPTION\fR; it indicates events the caller is interested in
noticing on this channel.
.PP
.VS
The function should initialize device type specific mechanisms to
notice when an event of interest is present on the channel.  When one
or more of the designated events occurs on the channel, the channel
driver is responsible for calling \fBTcl_NotifyChannel\fR to inform
the generic channel module.  The driver should take care not to starve
other channel drivers or sources of callbacks by invoking
Tcl_NotifyChannel too frequently.  Fairness can be insured by using
the Tcl event queue to allow the channel event to be scheduled in sequence
with other events.  See the description of \fBTcl_QueueEvent\fR for
details on how to queue an event.
.PP
.VS 8.3.2
This value can be retrieved with \fBTcl_ChannelWatchProc\fR, which returns
a pointer to the function.
.VE

.SH GETHANDLEPROC
.PP
The \fIgetHandleProc\fR field contains the address of a function called by
the generic layer to retrieve a device-specific handle from the channel.
\fIGetHandleProc\fR should match the following prototype:
.PP
.CS
typedef int Tcl_DriverGetHandleProc(
	ClientData \fIinstanceData\fR,
	int \fIdirection\fR,
	ClientData *\fIhandlePtr\fR);
.CE
.PP
\fIInstanceData is the same as the value passed to
\fIInstanceData\fR is the same as the value passed to
\fBTcl_CreateChannel\fR when this channel was created. The \fIdirection\fR
argument is either \fBTCL_READABLE\fR to retrieve the handle used
for input, or \fBTCL_WRITABLE\fR to retrieve the handle used for
output.
.PP
If the channel implementation has device-specific handles, the
function should retrieve the appropriate handle associated with the
channel, according the \fIdirection\fR argument.  The handle should be
stored in the location referred to by \fIhandlePtr\fR, and
\fBTCL_OK\fR should be returned.  If the channel is not open for the
specified direction, or if the channel implementation does not use
device handles, the function should return \fBTCL_ERROR\fR.
.PP
.VS 8.3.2
This value can be retrieved with \fBTcl_ChannelGetHandleProc\fR, which returns
a pointer to the function.
.VE

.VS 8.3.2
.SH FLUSHPROC
.PP
The \fIflushProc\fR field is currently reserved for future use.
It should be set to NULL.
\fIFlushProc\fR should match the following prototype:
.PP
.CS
typedef int Tcl_DriverFlushProc(
	ClientData \fIinstanceData\fR);
.CE
.PP
This value can be retrieved with \fBTcl_ChannelFlushProc\fR, which returns
a pointer to the function.

.SH HANDLERPROC
.PP
The \fIhandlerProc\fR field contains the address of a function called by
the generic layer to notify the channel that an event occured.  It should
be defined for stacked channel drivers that wish to be notified of events
that occur on the underlying (stacked) channel.
\fIHandlerProc\fR should match the following prototype:
.PP
.CS
typedef int Tcl_DriverHandlerProc(
	ClientData \fIinstanceData\fR,
	int \fIinterestMask\fR);
.CE
.PP
\fIInstanceData\fR is the same as the value passed to \fBTcl_CreateChannel\fR
when this channel was created.  The \fIinterestMask\fR is an OR-ed
combination of \fBTCL_READABLE\fR or \fBTCL_WRITABLE\fR; it indicates what
type of event occured on this channel.
.PP
This value can be retrieved with \fBTcl_ChannelHandlerProc\fR, which returns
a pointer to the function.
.VS
.VE

.SH TCL_BADCHANNELOPTION
.PP
This procedure generates a "bad option" error message in an
(optional) interpreter.  It is used by channel drivers when 
a invalid Set/Get option is requested. Its purpose is to concatenate
the generic options list to the specific ones and factorize
the generic options error message string.
575
576
577
578
579
580
581
582

583
584
585
586



587

























588
589

590
591
592
717
718
719
720
721
722
723

724
725
726


727
728
729
730
731
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







-
+


-
-
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

-
+



    <...generic options...>+<...specific options...>
so you get for instance:
    bad option "-blah": should be one of -blocking,
    -buffering, -buffersize, -eofchar, -translation,
    -peername, or -sockname
when called with optionList="peername sockname"
.CE
"blah" is the optionName argument and "<specific options>"
``blah'' is the optionName argument and ``<specific options>''
is a space separated list of specific option words.
The function takes good care of inserting minus signs before
each option, commas after, and an "or" before the last option.
.VE
each option, commas after, and an ``or'' before the last option.

.SH OLD_CHANNEL

The original (8.3.1 and below) \fBTcl_ChannelType\fR structure contains
the following fields:
.PP
.CS
typedef struct Tcl_ChannelType {
	char *\fItypeName\fR;
	Tcl_DriverBlockModeProc *\fIblockModeProc\fR;	
	Tcl_DriverCloseProc *\fIcloseProc\fR;
	Tcl_DriverInputProc *\fIinputProc\fR;
	Tcl_DriverOutputProc *\fIoutputProc\fR;
	Tcl_DriverSeekProc *\fIseekProc\fR;
	Tcl_DriverSetOptionProc *\fIsetOptionProc\fR;
	Tcl_DriverGetOptionProc *\fIgetOptionProc\fR;
	Tcl_DriverWatchProc *\fIwatchProc\fR;
	Tcl_DriverGetHandleProc *\fIgetHandleProc\fR;
	Tcl_DriverClose2Proc *\fIclose2Proc\fR;
} Tcl_ChannelType;
.CE
.PP
It is still possible to create channel with the above structure.  The
internal channel code will determine the version.  It is imperative to use
the new \fBTcl_ChannelType\fR structure if you are creating a stacked
channel driver, due to problems with the earlier stacked channel
implementation (in 8.2.0 to 8.3.1).

.SH "SEE ALSO"
Tcl_Close(3), Tcl_OpenFileChannel(3), Tcl_SetErrno(3), Tcl_QueueEvent(3)
Tcl_Close(3), Tcl_OpenFileChannel(3), Tcl_SetErrno(3), Tcl_QueueEvent(3), Tcl_StackChannel(3)

.SH KEYWORDS
blocking, channel driver, channel registration, channel type, nonblocking
Changes to doc/CrtObjCmd.3.
1
2
3
4
5
6
7

8
9
10
11
12
13
14
1
2
3
4
5
6

7
8
9
10
11
12
13
14






-
+







'\"
'\" Copyright (c) 1996-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: CrtObjCmd.3,v 1.3 1999/04/16 00:46:30 stanton Exp $
'\" RCS: @(#) $Id: CrtObjCmd.3,v 1.3.12.1 2000/08/07 21:29:37 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_CreateObjCommand 3 8.0 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_CreateObjCommand, Tcl_DeleteCommand, Tcl_DeleteCommandFromToken, Tcl_GetCommandInfo, Tcl_SetCommandInfo, Tcl_GetCommandName \- implement new commands in C
.SH SYNOPSIS
55
56
57
58
59
60
61
62

63
64
65
66
67
68
69
55
56
57
58
59
60
61

62
63
64
65
66
67
68
69







-
+







Tcl command.
.BE
.SH DESCRIPTION
.PP
\fBTcl_CreateObjCommand\fR defines a new command in \fIinterp\fR
and associates it with procedure \fIproc\fR
such that whenever \fIname\fR is
invoked as a Tcl command (e.g., via a call to \fBTcl_EvalObj\fR)
invoked as a Tcl command (e.g., via a call to \fBTcl_EvalObjEx\fR)
the Tcl interpreter will call \fIproc\fR to process the command.
.PP
\fBTcl_CreateObjCommand\fR deletes any existing command
\fIname\fR already associated with the interpreter
(however see below for an exception where the existing command
is not deleted).
It returns a token that may be used to refer
116
117
118
119
120
121
122
123

124
125
126
127
128
129
130
116
117
118
119
120
121
122

123
124
125
126
127
128
129
130







-
+







return \fBTCL_OK\fR or \fBTCL_ERROR\fR.
In addition, if \fIproc\fR needs to return a non-empty result,
it can call \fBTcl_SetObjResult\fR to set the interpreter's result.
In the case of a \fBTCL_OK\fR return code this gives the result
of the command,
and in the case of \fBTCL_ERROR\fR this gives an error message.
Before invoking a command procedure,
\fBTcl_EvalObj\fR sets interpreter's result to
\fBTcl_EvalObjEx\fR sets interpreter's result to
point to an object representing an empty string, so simple
commands can return an empty result by doing nothing at all.
.PP
The contents of the \fIobjv\fR array belong to Tcl and are not
guaranteed to persist once \fIproc\fR returns: \fIproc\fR should
not modify them.
Call \fBTcl_SetObjResult\fR if you want
248
249
250
251
252
253
254
255
256
257
258
259
260
261
248
249
250
251
252
253
254

255
256
257
258
259
260







-






was created, then \fBTcl_GetCommandName\fR returns the current name.
This name does not include any \fB::\fR namespace qualifiers.
The command corresponding to \fItoken\fR must not have been deleted.
The string returned by \fBTcl_GetCommandName\fR is in dynamic memory
owned by Tcl and is only guaranteed to retain its value as long as the
command isn't deleted or renamed;  callers should copy the string if
they need to keep it for a long time.
.PP

.SH "SEE ALSO"
Tcl_CreateCommand, Tcl_ResetResult, Tcl_SetObjResult

.SH KEYWORDS
bind, command, create, delete, namespace, object
Changes to doc/CrtSlave.3.
1
2
3
4
5
6
7

8
9
10
11
12
13
14
1
2
3
4
5
6

7
8
9
10
11
12
13
14






-
+







'\"
'\" Copyright (c) 1995-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: CrtSlave.3,v 1.3 1999/08/21 19:40:47 hobbs Exp $
'\" RCS: @(#) $Id: CrtSlave.3,v 1.3.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_CreateSlave 3 7.6 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_IsSafe, Tcl_MakeSafe, Tcl_CreateSlave, Tcl_GetSlave, Tcl_GetMaster, Tcl_GetInterpPath, Tcl_CreateAlias, Tcl_CreateAliasObj, Tcl_GetAlias, Tcl_GetAliasObj, Tcl_ExposeCommand, Tcl_HideCommand \- manage multiple Tcl interpreters, aliases and hidden commands.
.SH SYNOPSIS
216
217
218
219
220
221
222
223
224
225


226
227
228
229
230
216
217
218
219
220
221
222

223
224
225
226
227
228
229
230
231







-


+
+





If a hidden command whose name is \fIhiddenCmdName\fR already
exists, the operation also returns \fBTCL_ERROR\fR and the \fIresult\fR
field in \fIinterp\fR contains an error message.
If the operation succeeds, it returns \fBTCL_OK\fR.
After executing this command, attempts to use \fIcmdName\fR in a call to
\fBTcl_Eval\fR or with the Tcl \fBeval\fR command will fail.
.PP
.SH "SEE ALSO"
For a description of the Tcl interface to multiple interpreters, see
\fIinterp(n)\fR.
.SH "SEE ALSO"
interp

.SH KEYWORDS
alias, command, exposed commands, hidden commands, interpreter, invoke,
master, slave, 

Changes to doc/DString.3.
1
2
3
4
5
6
7
8

9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7

8
9
10
11
12
13

14
15
16
17
18
19
20
21







-
+





-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: DString.3,v 1.5 2000/04/14 23:01:50 hobbs Exp $
'\" RCS: @(#) $Id: DString.3,v 1.5.2.1 2001/12/10 16:01:43 dgp Exp $
'\" 
.so man.macros
.TH Tcl_DString 3 7.4 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_DStringInit, Tcl_DStringAppend, Tcl_DStringAppendElement, Tcl_DStringStartSublist, Tcl_DStringEndSublist, Tcl_DStringLength, Tcl_DStringValue, Tcl_DStringSetLength, Tcl_DStringFree, Tcl_DStringResult, Tcl_DStringGetResult \- manipulate dynamic strings
Tcl_DStringInit, Tcl_DStringAppend, Tcl_DStringAppendElement, Tcl_DStringStartSublist, Tcl_DStringEndSublist, Tcl_DStringLength, Tcl_DStringValue, Tcl_DStringSetLength, Tcl_DStringTrunc, Tcl_DStringFree, Tcl_DStringResult, Tcl_DStringGetResult \- manipulate dynamic strings
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
\fBTcl_DStringInit\fR(\fIdsPtr\fR)
.sp
char *
Changes to doc/DetachPids.3.
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
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







-
+





-
+







+
+
+






+
+
+
+
+
+
+

-







'\"
'\" Copyright (c) 1989-1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: DetachPids.3,v 1.2 1998/09/14 18:39:48 stanton Exp $
'\" RCS: @(#) $Id: DetachPids.3,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_DetachPids 3 "" Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_DetachPids, Tcl_ReapDetachedProcs \- manage child processes in background
Tcl_DetachPids, Tcl_ReapDetachedProcs, Tcl_WaitPid \- manage child processes in background
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
\fBTcl_DetachPids\fR(\fInumPids, pidPtr\fR)
.sp
\fBTcl_ReapDetachedProcs\fR()
.sp
Tcl_Pid
\fBTcl_WaitPid\fR(\fIpid, statPtr, options\fR)
.SH ARGUMENTS
.AS int *statusPtr
.AP int numPids in
Number of process ids contained in the array pointed to by \fIpidPtr\fR.
.AP int *pidPtr in
Address of array containing \fInumPids\fR process ids.
.AP Tcl_Pid pid in
The id of the process (pipe) to wait for.
.AP int* statPtr out
The result of waiting on a process (pipe). Either 0 or ECHILD.
.AP int options
The options controlling the wait. WNOHANG specifies not to wait when
checking the process.
.BE

.SH DESCRIPTION
.PP
\fBTcl_DetachPids\fR and \fBTcl_ReapDetachedProcs\fR provide a
mechanism for managing subprocesses that are running in background.
These procedures are needed because the parent of a process must
eventually invoke the \fBwaitpid\fR kernel call (or one of a few other
similar kernel calls) to wait for the child to exit.  Until the
53
54
55
56
57
58
59






60
61
62
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77







+
+
+
+
+
+



Tcl automatically calls \fBTcl_ReapDetachedProcs\fR each time the
\fBexec\fR command is executed, so in most cases it isn't necessary
for any code outside of Tcl to invoke \fBTcl_ReapDetachedProcs\fR.
However, if you call \fBTcl_DetachPids\fR in situations where the
\fBexec\fR command may never get executed, you may wish to call
\fBTcl_ReapDetachedProcs\fR from time to time so that background
processes can be cleaned up.
.PP
\fBTcl_WaitPid\fR is a thin wrapper around the facilities provided by
the operating system to wait on the end of a spawned process and to
check a whether spawned process is still running. It is used by
\fBTcl_ReapDetachedProcs\fR and the channel system to portably access
the operating system.

.SH KEYWORDS
background, child, detach, process, wait
Changes to doc/Encoding.3.
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15
16

17
18
19
20
21
22
23
1
2
3
4
5
6

7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24






-
+









+







'\"
'\" Copyright (c) 1997-1998 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: Encoding.3,v 1.7 1999/10/13 00:32:05 hobbs Exp $
'\" RCS: @(#) $Id: Encoding.3,v 1.7.2.1 2001/08/28 00:08:40 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_GetEncoding 3 "8.1" Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_GetEncoding, Tcl_FreeEncoding, Tcl_ExternalToUtfDString, Tcl_ExternalToUtf, Tcl_UtfToExternalDString, Tcl_UtfToExternal, Tcl_WinTCharToUtf, Tcl_WinUtfToTChar, Tcl_GetEncodingName, Tcl_SetSystemEncoding, Tcl_GetEncodingNames, Tcl_CreateEncoding, Tcl_GetDefaultEncodingDir, Tcl_SetDefaultEncodingDir \- procedures for creating and using encodings.
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
\fB#include <tclPlatDecls.h>\fR \fI/* Tcl_Win* functions only */\fR
.sp
Tcl_Encoding
\fBTcl_GetEncoding\fR(\fIinterp, name\fR)
.sp
void
\fBTcl_FreeEncoding\fR(\fIencoding\fR)
.sp
Changes to doc/Eval.3.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1989-1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: Eval.3,v 1.6 2000/04/14 23:01:50 hobbs Exp $
'\" RCS: @(#) $Id: Eval.3,v 1.6.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_Eval 3 8.1 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_EvalObjEx, Tcl_EvalFile, Tcl_EvalObjv, Tcl_Eval, Tcl_EvalEx, Tcl_GlobalEval, Tcl_GlobalEvalObj, Tcl_VarEval, Tcl_VarEvalVA \- execute Tcl scripts
.SH SYNOPSIS
62
63
64
65
66
67
68
69
70
71



72
73
74
75
76
77
78
62
63
64
65
66
67
68



69
70
71
72
73
74
75
76
77
78







-
-
-
+
+
+







Points to an array of pointers to objects; each object holds the
value of a single word in the command to execute.
.AP int numBytes in
The number of bytes in \fIscript\fR, not including any
null terminating character.  If \-1, then all characters up to the
first null byte are used.
.AP char *script in
Points to first byte of script to execute.  This script must be in
writable memory: temporary modifications are made to it during
parsing.
Points to first byte of script to execute (NULL terminated and UTF-8).
This script must be in writable memory: temporary modifications are made
to it during parsing.
.AP char *string in
String forming part of a Tcl script.
.AP va_list argList in
An argument list which must have been initialised using
\fBTCL_VARARGS_START\fR, and cleared using \fBva_end\fR.
.BE

106
107
108
109
110
111
112



113
114
115
116
117





118
119
120
121
122
123
124
106
107
108
109
110
111
112
113
114
115





116
117
118
119
120
121
122
123
124
125
126
127







+
+
+
-
-
-
-
-
+
+
+
+
+







script.  The \fIobjc\fR and \fIobjv\fR arguments contain the values
of the words for the Tcl command, one word in each object in
\fIobjv\fR.  \fBTcl_EvalObjv\fR evaluates the command and returns
a completion code and result just like \fBTcl_EvalObjEx\fR.
.PP
\fBTcl_Eval\fR is similar to \fBTcl_EvalObjEx\fR except that the script to
be executed is supplied as a string instead of an object and no compilation
occurs.  The string should be a proper UTF-8 string as converted by
\fBTcl_ExternalToUtfDString\fR or \fBTcl_ExternalToUtf\fR when it is known
to possibly contain upper ascii characters who's possible combinations
occurs.  The string is parsed and executed directly (using
\fBTcl_EvalObjv\fR) instead of compiling it and executing the bytecodes.
In situations where it is known that the script will never be executed
again, \fBTcl_Eval\fR may be faster than \fBTcl_EvalObjEx\fR.
\fBTcl_Eval\fR returns a completion code and result just like
might be a UTF-8 special code.  The string is parsed and executed directly
(using \fBTcl_EvalObjv\fR) instead of compiling it and executing the
bytecodes.  In situations where it is known that the script will never be
executed again, \fBTcl_Eval\fR may be faster than \fBTcl_EvalObjEx\fR.
\fBTcl_Eval\fR returns a completion code and result just like 
\fBTcl_EvalObjEx\fR.  Note: for backward compatibility with versions before
Tcl 8.0, \fBTcl_Eval\fR copies the object result in \fIinterp\fR to
\fIinterp->result\fR (use is deprecated) where it can be accessed directly.
This makes \fBTcl_Eval\fR somewhat slower than \fBTcl_EvalEx\fR, which
doesn't do the copy.
.PP
\fBTcl_EvalEx\fR is an extended version of \fBTcl_Eval\fR that takes
Changes to doc/Exit.3.
1
2
3
4
5
6
7

8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6

7
8
9
10
11
12

13
14
15
16
17
18
19
20






-
+





-
+







'\"
'\" Copyright (c) 1995-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: Exit.3,v 1.3 1999/04/16 00:46:31 stanton Exp $
'\" RCS: @(#) $Id: Exit.3,v 1.3.12.1 2000/08/07 21:29:37 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_Exit 3 8.1 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_Exit, Tcl_Finalize, Tcl_FinalizeThread, Tcl_CreateExitHandler, Tcl_DeleteExitHandler, Tcl_CreateThreadExitHandler, Tcl_DeleteThreadExitHandler \- end the application or thread (and invoke exit handlers)
Tcl_Exit, Tcl_Finalize, Tcl_CreateExitHandler, Tcl_DeleteExitHandler, Tcl_ExitThread, Tcl_FinalizeThread, Tcl_CreateThreadExitHandler, Tcl_DeleteThreadExitHandler \- end the application or thread (and invoke exit handlers)
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
\fBTcl_Exit\fR(\fIstatus\fR)
.sp
\fBTcl_Finalize\fR()
Changes to doc/ExprLong.3.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1989-1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: ExprLong.3,v 1.3 2000/04/14 23:01:50 hobbs Exp $
'\" RCS: @(#) $Id: ExprLong.3,v 1.3.2.1 2001/12/10 16:01:43 dgp Exp $
'\" 
.so man.macros
.TH Tcl_ExprLong 3 7.0 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_ExprLong, Tcl_ExprDouble, Tcl_ExprBoolean, Tcl_ExprString \- evaluate an expression
.SH SYNOPSIS
50
51
52
53
54
55
56
57

58
59
60
61
62
63
64
50
51
52
53
54
55
56

57
58
59
60
61
62
63
64







-
+







.PP
These four procedures all evaluate the expression
given by the \fIstring\fR argument
and return the result in one of four different forms.
The expression can have any of the forms accepted by the \fBexpr\fR command.
Note that these procedures have been largely replaced by the
object-based procedures \fBTcl_ExprLongObj\fR, \fBTcl_ExprDoubleObj\fR,
\fBTcl_ExprBooleanObj\fR, and \fBTcl_ExprStringObj\fR.
\fBTcl_ExprBooleanObj\fR, and \fBTcl_ExprObj\fR.
Those object-based procedures evaluate an expression held in a Tcl object
instead of a string.
The object argument can retain an internal representation
that is more efficient to execute.
.PP
The \fIinterp\fR argument refers to an interpreter used to
evaluate the expression (e.g. for variables and nested Tcl
Changes to doc/FindExec.3.
1
2
3
4
5
6
7

8
9
10
11
12
13
14
1
2
3
4
5
6

7
8
9
10
11
12
13
14






-
+







'\"
'\" Copyright (c) 1995-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: FindExec.3,v 1.4 2000/03/03 02:57:37 hobbs Exp $
'\" RCS: @(#) $Id: FindExec.3,v 1.4.2.1 2001/09/28 17:53:48 msofer Exp $
'\" 
.so man.macros
.TH Tcl_FindExecutable 3 8.1 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_FindExecutable, Tcl_GetNameOfExecutable \- identify or return the name of the binary file containing the application
.SH SYNOPSIS
35
36
37
38
39
40
41


42

43
44
45
46
47
48
49
35
36
37
38
39
40
41
42
43

44
45
46
47
48
49
50
51







+
+
-
+







The executable's path name is needed for several purposes in
Tcl.  For example, it is needed on some platforms in the
implementation of the \fBload\fR command.
It is also returned by the \fBinfo nameofexecutable\fR command.
.PP
On UNIX platforms this procedure is typically invoked as the very
first thing in the application's main program;  it must be passed
\fIargv[0]\fR as its argument.  It is important not to change the
working directory before the invocation.
\fIargv[0]\fR as its argument.  \fBTcl_FindExecutable\fR uses \fIargv0\fR
\fBTcl_FindExecutable\fR uses \fIargv0\fR
along with the \fBPATH\fR environment variable to find the
application's executable, if possible.  If it fails to find
the binary, then future calls to \fBinfo nameofexecutable\fR
will return an empty string.
.PP
\fBTcl_GetNameOfExecutable\fR simply returns a pointer to the
internal full path name of the executable file as computed by
Changes to doc/GetIndex.3.
1
2
3
4
5
6
7

8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6

7
8
9
10
11
12

13
14
15
16
17
18
19
20






-
+





-
+







'\"
'\" Copyright (c) 1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: GetIndex.3,v 1.5 1999/08/13 19:01:04 welch Exp $
'\" RCS: @(#) $Id: GetIndex.3,v 1.5.8.1 2000/08/07 21:29:37 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_GetIndexFromObj 3 8.1 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_GetIndexFromObj \- lookup string in table of keywords
Tcl_GetIndexFromObj, Tcl_GetIndexFromObjStruct \- lookup string in table of keywords
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
int
\fBTcl_GetIndexFromObj\fR(\fIinterp, objPtr, tablePtr, msg, flags,
indexPtr\fR)
Changes to doc/Notifier.3.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1998-1999 Scriptics Corporation
'\" Copyright (c) 1995-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: Notifier.3,v 1.7 1999/05/06 20:13:22 stanton Exp $
'\" RCS: @(#) $Id: Notifier.3,v 1.7.12.1 2000/08/07 21:29:37 hobbs Exp $
'\" 
.so man.macros
.TH Notifier 3 8.1 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_CreateEventSource, Tcl_DeleteEventSource, Tcl_SetMaxBlockTime, Tcl_QueueEvent, Tcl_ThreadQueueEvent, Tcl_ThreadAlert, Tcl_GetCurrentThread, Tcl_DeleteEvents, Tcl_InitNotifier, Tcl_FinalizeNotifier, Tcl_WaitForEvent, Tcl_AlertNotifier, Tcl_SetTimer, Tcl_ServiceAll, Tcl_ServiceEvent, Tcl_GetServiceMode, Tcl_SetServiceMode \- the event queue and notifier interfaces
.SH SYNOPSIS
333
334
335
336
337
338
339
340

341
342
343

344
345
346
347
348
349
350
333
334
335
336
337
338
339

340
341
342

343
344
345
346
347
348
349
350







-
+


-
+







more information on memory management issues).  Each event source can
define its own event structure with whatever information is relevant
to that event source.  However, the first element of the structure
must be a structure of type \fBTcl_Event\fR, and the address of this
structure is used when communicating between the event source and the
rest of the notifier.  A \fBTcl_Event\fR has the following definition:
.CS
typedef struct Tcl_Event {
typedef struct {
    Tcl_EventProc *\fIproc\fR;
    struct Tcl_Event *\fInextPtr\fR;
};
} Tcl_Event;
.CE
The event source must fill in the \fIproc\fR field of
the event before calling \fBTcl_QueueEvent\fR.
The \fInextPtr\fR is used to link together the events in the queue
and should not be modified by the event source.
.PP
An event may be added to the queue at any of three positions, depending
593
594
595
596
597
598
599
600

601
602
593
594
595
596
597
598
599

600
601
602







-
+


\fBTcl_SetServiceMode\fR returns the previous value of the service
mode, which should be restored when the recursive loop exits.
\fBTcl_GetServiceMode\fR returns the current value of the service
mode.
.VE
.SH "SEE ALSO"
\fBTcl_CreateFileHandler\fR, \fBTcl_DeleteFileHandler\fR, \fBTcl_Sleep\fR,
\fBTcl_DoOneEvent\fR, \fBThreads.3\fR
\fBTcl_DoOneEvent\fR, \fBThread(3)\fR
.SH KEYWORDS
event, notifier, event queue, event sources, file events, timer, idle, service mode, threads
Changes to doc/Object.3.
1
2
3
4
5
6
7

8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6

7
8
9
10
11
12

13
14
15
16
17
18
19
20






-
+





-
+







'\"
'\" Copyright (c) 1996-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: Object.3,v 1.4 1999/08/09 16:30:34 hobbs Exp $
'\" RCS: @(#) $Id: Object.3,v 1.4.10.1 2000/08/07 21:29:38 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_Obj 3 8.0 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_NewObj, Tcl_DuplicateObj, Tcl_IncrRefCount, Tcl_DecrRefCount, Tcl_IsShared \- manipulate Tcl objects
Tcl_NewObj, Tcl_DuplicateObj, Tcl_IncrRefCount, Tcl_DecrRefCount, Tcl_IsShared, Tcl_InvalidateStringRep \- manipulate Tcl objects
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
Tcl_Obj *
\fBTcl_NewObj\fR()
.sp
Changes to doc/ObjectType.3.
1
2
3
4
5
6
7

8
9
10
11
12
13
14
1
2
3
4
5
6

7
8
9
10
11
12
13
14






-
+







'\"
'\" Copyright (c) 1996-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: ObjectType.3,v 1.2 1998/09/14 18:39:49 stanton Exp $
'\" RCS: @(#) $Id: ObjectType.3,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_ObjType 3 8.0 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_RegisterObjType, Tcl_GetObjType, Tcl_AppendAllObjTypes, Tcl_ConvertToType  \- manipulate Tcl object types
.SH SYNOPSIS
51
52
53
54
55
56
57
58

59
60
61
62
63
64
65
51
52
53
54
55
56
57

58
59
60
61
62
63
64
65







-
+







.PP
\fBTcl_RegisterObjType\fR registers a new Tcl object type
in the table of all object types supported by Tcl.
The argument \fItypePtr\fR points to a Tcl_ObjType structure that
describes the new type by giving its name
and by supplying pointers to four procedures
that implement the type.
If the type table already containes a type
If the type table already contains a type
with the same name as in \fItypePtr\fR,
it is replaced with the new type.
The Tcl_ObjType structure is described
in the section \fBTHE TCL_OBJTYPE STRUCTURE\fR below.
.PP
\fBTcl_GetObjType\fR returns a pointer to the Tcl_ObjType
with name \fItypeName\fR.
Changes to doc/OpenFileChnl.3.
1
2
3
4
5
6
7

8
9
10
11
12
13
14
1
2
3
4
5
6

7
8
9
10
11
12
13
14






-
+







'\"
'\" Copyright (c) 1996-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\"
'\" RCS: @(#) $Id: OpenFileChnl.3,v 1.9 2000/04/25 00:54:53 ericm Exp $
'\" RCS: @(#) $Id: OpenFileChnl.3,v 1.9.2.1 2001/12/07 17:39:04 dgp Exp $
.so man.macros
.TH Tcl_OpenFileChannel 3 8.3 Tcl "Tcl Library Procedures"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
Tcl_OpenFileChannel, Tcl_OpenCommandChannel, Tcl_MakeFileChannel, Tcl_GetChannel, Tcl_GetChannelNames, Tcl_GetChannelNamesEx, Tcl_RegisterChannel, Tcl_UnregisterChannel, Tcl_Close, Tcl_ReadChars, Tcl_Read, Tcl_GetsObj, Tcl_Gets, Tcl_WriteObj, Tcl_WriteChars, Tcl_Write, Tcl_Flush, Tcl_Seek, Tcl_Tell, Tcl_GetChannelOption, Tcl_SetChannelOption, Tcl_Eof, Tcl_InputBlocked, Tcl_InputBuffered, Tcl_Ungets \- buffered I/O facilities using channels
.SH SYNOPSIS
441
442
443
444
445
446
447
448

449
450
451
452
453
454
455
441
442
443
444
445
446
447

448
449
450
451
452
453
454
455







-
+







If the channel is in nonblocking mode, the return value can also be \-1 if
no data was available or the data that was available did not contain an
end-of-line character.  When \-1 is returned, the \fBTcl_InputBlocked\fR
procedure may be invoked to determine if the channel is blocked because
of input unavailability.
.PP
\fBTcl_Gets\fR is the same as \fBTcl_GetsObj\fR except the resulting
characters are appended to the appended to the dynamic string given by
characters are appended to the dynamic string given by
\fIdsPtr\fR rather than a Tcl object.

.SH "TCL_UNGETS"
.PP
\fBTcl_Ungets\fR is used to add data to the input queue of a channel,
at either the head or tail of the queue.  \fIInput\fR is a pointer to
the data that is to be added.  \fIInputLen\fR gives the length of the
Changes to doc/RecEvalObj.3.
1
2
3
4
5
6
7

8
9
10
11
12
13
14
1
2
3
4
5
6

7
8
9
10
11
12
13
14






-
+







'\"
'\" Copyright (c) 1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: RecEvalObj.3,v 1.2 1998/09/14 18:39:49 stanton Exp $
'\" RCS: @(#) $Id: RecEvalObj.3,v 1.2.18.1 2000/08/07 21:29:38 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_RecordAndEvalObj 3 8.0 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_RecordAndEvalObj \- save command on history list before evaluating
.SH SYNOPSIS
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
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







-
+


-
+




-
+







-
+



command but don't evaluate it.  TCL_EVAL_GLOBAL means evaluate
the command at global level instead of the current stack level.
.BE

.SH DESCRIPTION
.PP
\fBTcl_RecordAndEvalObj\fR is invoked to record a command as an event
on the history list and then execute it using \fBTcl_EvalObj\fR
on the history list and then execute it using \fBTcl_EvalObjEx\fR
(or \fBTcl_GlobalEvalObj\fR if the TCL_EVAL_GLOBAL bit is set
in \fIflags\fR).
It returns a completion code such as TCL_OK just like \fBTcl_EvalObj\fR,
It returns a completion code such as TCL_OK just like \fBTcl_EvalObjEx\fR,
as well as a result object containing additional information
(a result value or error message)
that can be retrieved using \fBTcl_GetObjResult\fR.
If you don't want the command recorded on the history list then
you should invoke \fBTcl_EvalObj\fR instead of \fBTcl_RecordAndEvalObj\fR.
you should invoke \fBTcl_EvalObjEx\fR instead of \fBTcl_RecordAndEvalObj\fR.
Normally \fBTcl_RecordAndEvalObj\fR is only called with top-level
commands typed by the user, since the purpose of history is to
allow the user to re-issue recently-invoked commands.
If the \fIflags\fR argument contains the TCL_NO_EVAL bit then
the command is recorded without being evaluated.

.SH "SEE ALSO"
Tcl_EvalObj, Tcl_GetObjResult
Tcl_EvalObjEx, Tcl_GetObjResult

.SH KEYWORDS
command, event, execute, history, interpreter, object, record
Changes to doc/RegExp.3.
1
2
3
4
5
6
7
8
9

10
11
12
13
14
15

16
17
18
19
20
21
22
1
2
3
4
5
6
7
8

9
10
11
12
13
14

15
16
17
18
19
20
21
22








-
+





-
+







'\"
'\" Copyright (c) 1994 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\" Copyright (c) 1998-1999 Scriptics Corportation
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: RegExp.3,v 1.6 1999/12/21 23:57:33 hobbs Exp $
'\" RCS: @(#) $Id: RegExp.3,v 1.6.2.2 2001/10/14 16:25:29 dgp Exp $
'\" 
.so man.macros
.TH Tcl_RegExpMatch 3 8.1 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_RegExpMatch, Tcl_RegExpCompile, Tcl_RegExpExec, Tcl_RegExpRange, Tcl_GetRegExpFromObj, Tcl_RegExpMatchObj, Tcl_GetRegExpInfo \- Pattern matching with regular expressions
Tcl_RegExpMatch, Tcl_RegExpCompile, Tcl_RegExpExec, Tcl_RegExpRange, Tcl_GetRegExpFromObj, Tcl_RegExpMatchObj, Tcl_RegExpExecObj, Tcl_RegExpGetInfo \- Pattern matching with regular expressions
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
int
\fBTcl_RegExpMatchObj\fR(\fIinterp\fR, \fIstrObj\fR, \fIpatObj\fR)
.sp
34
35
36
37
38
39
40
41

42
43
44
45
46
47
48
34
35
36
37
38
39
40

41
42
43
44
45
46
47
48







-
+







.sp
Tcl_RegExp
\fBTcl_GetRegExpFromObj\fR(\fIinterp\fR, \fIpatObj\fR, \fIcflags\fR)
.sp
int
\fBTcl_RegExpExecObj\fR(\fIinterp\fR, \fIregexp\fR, \fIobjPtr\fR, \fIoffset\fR, \fInmatches\fR, \fIeflags\fR)
.sp
\fBTcl_GetRegExpInfo\fR(\fIregexp\fR, \fIinfoPtr\fR)
\fBTcl_RegExpGetInfo\fR(\fIregexp\fR, \fIinfoPtr\fR)
.VE 8.1

.SH ARGUMENTS
.AS Tcl_Interp *interp
.AP Tcl_Interp *interp in
Tcl interpreter to use for error reporting.  The interpreter may be
NULL if no error reporting is desired.
95
96
97
98
99
100
101
102

103
104
105
106
107
108
109
95
96
97
98
99
100
101

102
103
104
105
106
107
108
109







-
+







value will be taken as the maximum number of subexpressions to
remember.
.AP int eflags in
OR-ed combination of the values TCL_REG_NOTBOL and TCL_REG_NOTEOL.
See below for more information.
.AP Tcl_RegExpInfo *infoPtr out
The address of the location where information about a previous match
should be stored by \fBTcl_GetRegExpInfo\fR.
should be stored by \fBTcl_RegExpGetInfo\fR.
.VE 8.1
.BE

.SH DESCRIPTION
.PP
\fBTcl_RegExpMatch\fR determines whether its \fIpattern\fR argument
matches \fIregexp\fR, where \fIregexp\fR is interpreted
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
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







-
+



-
+














-
+







the source string for the most recent call to \fBTcl_RegExpExec\fR.
\fIIndex\fR indicates which of several ranges is desired:
if \fIindex\fR is 0, information is returned about the overall range
of characters that matched the entire pattern;  otherwise,
information is returned about the range of characters that matched the
\fIindex\fR'th parenthesized subexpression within the pattern.
If there is no range corresponding to \fIindex\fR then NULL
is stored in \fI*firstPtr\fR and \fI*lastPtr\fR.
is stored in \fI*startPtr\fR and \fI*endPtr\fR.
.PP
.VS 8.1
\fBTcl_GetRegExpFromObj\fR, \fBTcl_RegExpExecObj\fR, and
\fBTcl_GetRegExpInfo\fR are object interfaces that provide the most
\fBTcl_RegExpGetInfo\fR are object interfaces that provide the most
direct control of Henry Spencer's regular expression library.  For
users that need to modify compilation and execution options directly,
it is recommended that you use these interfaces instead of calling the
internal regexp functions.  These interfaces handle the details of UTF
to Unicode translations as well as providing improved performance
through caching in the pattern and string objects.
.PP
\fBTcl_GetRegExpFromObj\fR attepts to return a compiled regular
expression from the \fIpatObj\fR.  If the object does not already
contain a compiled regular expression it will attempt to create one
from the string in the object and assign it to the internal
representation of the \fIpatObj\fR.  The return value of this function
is of type \fBTcl_RegExp\fR.  The return value is a token for this
compiled form, which can be used in subsequent calls to
\fBTcl_RegExpExecObj\fR or \fBTcl_GetRegExpInfo\fR.  If an error
\fBTcl_RegExpExecObj\fR or \fBTcl_RegExpGetInfo\fR.  If an error
occurs while compiling the regular expression then
\fBTcl_GetRegExpFromObj\fR returns NULL and leaves an error message in
the interpreter result.  The regular expression token can be used as
long as the internal representation of \fIpatObj\fR refers to the
compiled form.  The \fIeflags\fR argument is a bitwise OR of
zero or more of the following flags that control the compilation of
\fIpatObj\fR:
247
248
249
250
251
252
253
254

255
256
257
258
259
260
261
247
248
249
250
251
252
253

254
255
256
257
258
259
260
261







-
+







`[^' bracket expressions and `.'.  In this mode `^' matches an empty string
after any newline in addition to its normal function, and `$' matches
an empty string before any newline in addition to its normal function.
.TP
\fBTCL_REG_NOSUB\fR
Compile for matching that reports only success or failure,
not what was matched.  This reduces compile overhead and may improve
performance.  Subsequent calls to \fBTcl_GetRegExpInfo\fR or
performance.  Subsequent calls to \fBTcl_RegExpGetInfo\fR or
\fBTcl_RegExpRange\fR will not report any match information.
.TP
\fBTCL_REG_CANMATCH\fR
Compile for matching that reports the potential to complete a partial
match given more text (see below).
.RE
.PP
290
291
292
293
294
295
296
297

298
299
300
301
302
303
304
290
291
292
293
294
295
296

297
298
299
300
301
302
303
304







-
+







.TP
\fBTCL_REG_NOTEOL\fR
The last character in the string will not be treated as the end of a
line or the end of the string, so '$' will not match there.
Note that this flag has no effect on how `\fB\eZ\fR' matches.
.RE
.PP
\fBTcl_GetRegExpInfo\fR retrieves information about the last match
\fBTcl_RegExpGetInfo\fR retrieves information about the last match
performed with a given regular expression \fIregexp\fR.  The
\fIinfoPtr\fR argument contains a pointer to a structure that is
defined as follows:
.PP
.CS
typedef struct Tcl_RegExpInfo {
	int \fInsubs\fR;
Changes to doc/SetResult.3.
1
2
3
4
5
6
7
8

9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7

8
9
10
11
12
13

14
15
16
17
18
19
20
21







-
+





-
+







'\"
'\" Copyright (c) 1989-1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: SetResult.3,v 1.5 2000/04/14 23:01:53 hobbs Exp $
'\" RCS: @(#) $Id: SetResult.3,v 1.5.2.1 2000/08/07 21:29:38 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_SetResult 3 8.0 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_SetObjResult, Tcl_GetObjResult, Tcl_SetResult, Tcl_GetStringResult, Tcl_AppendResult, Tcl_AppendResultVA, Tcl_AppendElement, Tcl_ResetResult \- manipulate Tcl result
Tcl_SetObjResult, Tcl_GetObjResult, Tcl_SetResult, Tcl_GetStringResult, Tcl_AppendResult, Tcl_AppendResultVA, Tcl_AppendElement, Tcl_ResetResult, Tcl_FreeResult \- manipulate Tcl result
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
\fBTcl_SetObjResult\fR(\fIinterp, objPtr\fR)
.sp
Tcl_Obj *
Changes to doc/SplitList.3.
1
2
3
4
5
6
7
8

9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7

8
9
10
11
12
13

14
15
16
17
18
19
20
21







-
+





-
+







'\"
'\" Copyright (c) 1989-1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: SplitList.3,v 1.3 2000/04/14 23:01:53 hobbs Exp $
'\" RCS: @(#) $Id: SplitList.3,v 1.3.2.1 2000/08/07 21:29:38 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_SplitList 3 8.0 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_SplitList, Tcl_Merge, Tcl_ScanElement, Tcl_ConvertElement \- manipulate Tcl lists
Tcl_SplitList, Tcl_Merge, Tcl_ScanElement, Tcl_ConvertElement, Tcl_ScanCountedElement, Tcl_ConvertCountedElement \- manipulate Tcl lists
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
int
\fBTcl_SplitList\fR(\fIinterp, list, argcPtr, argvPtr\fR)
.sp
Changes to doc/StrMatch.3.
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
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







-
+












-

+
-
+
-






-



-







'\"
'\" Copyright (c) 1989-1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: StrMatch.3,v 1.3 1999/05/22 01:20:11 stanton Exp $
'\" RCS: @(#) $Id: StrMatch.3,v 1.3.10.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_StringMatch 3 8.1 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_StringMatch, Tcl_StringCaseMatch \- test whether a string matches a pattern
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
int
\fBTcl_StringMatch\fR(\fIstring\fR, \fIpattern\fR)
.VS 8.1
.sp
int
\fBTcl_StringCaseMatch\fR(\fIstring, pattern, nocase\fR)
\fBTcl_StringCaseMatch\fR(\fIstring\fR, \fIpattern\fR, \fInocase\fR)
.VE 8.1
.SH ARGUMENTS
.AP char *string in
String to test.
.AP char *pattern in
Pattern to match against string.  May contain special
characters from the set *?\e[].
.VS 8.1
.AP int nocase in
Specifies whether the match should be done case-sensitive (0) or
case-insensitive (1).
.VE 8.1
.BE

.SH DESCRIPTION
.PP
This utility procedure determines whether a string matches
a given pattern.  If it does, then \fBTcl_StringMatch\fR returns
1.  Otherwise \fBTcl_StringMatch\fR returns 0.  The algorithm
Changes to doc/TCL_MEM_DEBUG.3.
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
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





-
+














-
+















-
+





-
-
+
+
+












-
+







'\" 
'\" Copyright (c) 1992-1999 Karl Lehenbauer and Mark Diekhans.
'\" Copyright (c) 2000 by Scriptics Corporation.
'\" All rights reserved.
'\" 
'\" RCS: @(#) $Id: TCL_MEM_DEBUG.3,v 1.2 2000/04/28 00:47:49 ericm Exp $
'\" RCS: @(#) $Id: TCL_MEM_DEBUG.3,v 1.2.14.2 2001/12/10 16:01:43 dgp Exp $
'\" 
.so man.macros
.TH TCL_MEM_DEBUG 3 8.1 Tcl "Tcl Library Procedures"
.BS
.SH NAME
TCL_MEM_DEBUG \- Compile-time flag to enable Tcl memory debugging.

.SH DESCRIPTION
When Tcl is compiled with \fBTCL_MEM_DEBUG\fR defined, a powerful set
of memory debugging aids are included in the compiled binary.  This
includes C and Tcl functions which can aid with debugging
memory leaks, memory allocation overruns, and other memory related
errors.

.SH ENABLING MEMORY DEBUGGING
.SH "ENABLING MEMORY DEBUGGING"
.PP
To enable memory debugging, Tcl should be recompiled from scratch with
\fBTCL_MEM_DEBUG\fR defined.  This will also compile in a non-stub
version of \fBTcl_InitMemory\fR to add the \fBmemory\fR command to Tcl.
.PP
\fBTCL_MEM_DEBUG\fR must be either left defined for all modules or undefined
for all modules that are going to be linked together.  If they are not, link
errors will occur, with either \fBTclDbCkfree\fR and \fBTcl_DbCkalloc\fR or
\fBTcl_Ckalloc\fR and \fBTcl_Ckfree\fR being undefined.
.PP
Once memory debugging support has been compiled into Tcl, the C
functions \fBTcl_ValidateAllMemory\fR, and \fBTcl_DumpActiveMemory\fR,
and the Tcl \fBmemory\fR command can be used to validate and examine
memory usage.

.SH GUARD ZONES
.SH "GUARD ZONES"
.PP
When memory debugging is enabled, whenever a call to \fBckalloc\fR is
made, slightly more memory than requested is allocated so the memory debugging
code can keep track of the allocated memory, and eight-byte ``guard
zones'' are placed in front of and behind the space that will be
returned to the caller.  (The size of the guard zone is defined by the
C #define \fBGUARD_SIZE\fR in \fIbaseline/src/ckalloc.c\fR -- it can
returned to the caller.  (The sizes of the guard zones are defined by the
C #define \fBLOW_GUARD_SIZE\fR and #define \fBHIGH_GUARD_SIZE\fR
in the file \fIgeneric/tclCkalloc.c\fR -- it can
be extended if you suspect large overwrite problems, at some cost in
performance.)  A known pattern is written into the guard zones and, on
a call to \fBckfree\fR, the guard zones of the space being freed are
checked to see if either zone has been modified in any way.  If one
has been, the guard bytes and their new contents are identified, and a
``low guard failed'' or ``high guard failed'' message is issued.  The
``guard failed'' message includes the address of the memory packet and
the file name and line number of the code that called \fBckfree\fR.
This allows you to detect the common sorts of one-off problems, where
not enough space was allocated to contain the data written, for
example.

.SH DEBUGGING DIFFICULT MEMORY CORRUPTION PROBLEMS
.SH "DEBUGGING DIFFICULT MEMORY CORRUPTION PROBLEMS"
.PP
Normally, Tcl compiled with memory debugging enabled will make it easy
to isolate a corruption problem.  Turning on memory validation with
the memory command can help isolate difficult problems.  If you
suspect (or know) that corruption is occurring before the Tcl
interpreter comes up far enough for you to issue commands, you can set
\fBMEM_VALIDATE\fR define, recompile tclCkalloc.c and rebuild Tcl.
Changes to doc/Tcl_Main.3.
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
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



+




-
+


-
+


-
+





+
+









+
+







'\"
'\" Copyright (c) 1994 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\" Copyright (c) 2000 Ajuba Solutions.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: Tcl_Main.3,v 1.2 1998/09/14 18:39:50 stanton Exp $
'\" RCS: @(#) $Id: Tcl_Main.3,v 1.2.18.1 2001/08/28 00:12:43 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_Main 3 7.4 Tcl "Tcl Library Procedures"
.TH Tcl_Main 3 8.3.4 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_Main \- main program for Tcl-based applications
Tcl_Main, Tcl_SetMainLoop \- main program and event loop definition for Tcl-based applications
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
\fBTcl_Main\fR(\fIargc, argv, appInitProc\fR)
.sp
\fBTcl_SetMainLoop\fR(\fImainLoopProc\fR)
.SH ARGUMENTS
.AS Tcl_AppInitProc *appInitProc
.AP int argc in
Number of elements in \fIargv\fR.
.AP char *argv[] in
Array of strings containing command-line arguments.
.AP Tcl_AppInitProc *appInitProc in
Address of an application-specific initialization procedure.
The value for this argument is usually \fBTcl_AppInit\fR.
.AP Tcl_MainLoopProc *mainLoopProc in
Address of an application-specific event loop procedure.
.BE

.SH DESCRIPTION
.PP
\fBTcl_Main\fR acts as the main program for most Tcl-based applications.
Starting with Tcl 7.4 it is not called \fBmain\fR anymore because it 
is part of the Tcl library and having a function \fBmain\fR
49
50
51
52
53
54
55

56
57
58

















59
60
61
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







+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+



the \fIappInitProc\fR argument.  This procedure provides a ``hook''
for the application to perform its own initialization, such as defining
application-specific commands.  The procedure must have an interface
that matches the type \fBTcl_AppInitProc\fR:
.CS
typedef int Tcl_AppInitProc(Tcl_Interp *\fIinterp\fR);
.CE

\fIAppInitProc\fR is almost always a pointer to \fBTcl_AppInit\fR;
for more details on this procedure, see the documentation
for \fBTcl_AppInit\fR.
\fIAppInitProc\fR is almost always a pointer to \fBTcl_AppInit\fR; for more
details on this procedure, see the documentation for \fBTcl_AppInit\fR.
When the \fIappInitProc\fR is finished, the startup script will be
evaluated.  If none exists, then an interactive prompt is provided.
.PP
.VS 8.3.4
\fBTcl_SetMainLoop\fR allows setting an event loop procedure to be run.
This allows, for example, Tk to be dynamically loaded and set its event
loop.  The event loop will run following the startup script.  If you
are in interactive mode, setting the main loop procedure will cause the
prompt to become fileevent based and then the loop procedure is called.
The main loop procedure must have an interface that matches the type
\fBTcl_MainLoopProc\fR:
.CS
typedef void Tcl_MainLoopProc(void);
.CE
.VE 8.3.4

.SH KEYWORDS
application-specific initialization, command-line arguments, main program
Changes to doc/Thread.3.
1
2
3
4
5
6
7
8

9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7

8
9
10
11
12
13

14
15
16
17
18
19
20
21







-
+





-
+







'\"
'\" Copyright (c) 1999 Scriptics Corporation
'\" Copyright (c) 1998 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: Thread.3,v 1.11 2000/04/25 23:03:53 hobbs Exp $
'\" RCS: @(#) $Id: Thread.3,v 1.11.2.1 2000/08/07 21:29:38 hobbs Exp $
'\" 
.so man.macros
.TH Threads 3 "8.1" Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_ConditionNotify, Tcl_ConditionWait, Tcl_ConditionFinalize, Tcl_GetThreadData, Tcl_MutexLock, Tcl_MutexUnlock, Tcl_MutexFinalize \- Tcl thread support.
Tcl_ConditionNotify, Tcl_ConditionWait, Tcl_ConditionFinalize, Tcl_GetThreadData, Tcl_MutexLock, Tcl_MutexUnlock, Tcl_MutexFinalize, Tcl_CreateThread \- Tcl thread support.
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
void
\fBTcl_ConditionNotify\fR(\fIcondPtr\fR)
.sp
55
56
57
58
59
60
61


62
63
64
65
66
67
68
69
70
71



72
73
74
75
76
77
78
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







+
+










+
+
+







.AP int *size in
The size of the thread local storage block.  This amount of data
is allocated and initialized to zero the first time each thread
calls \fBTcl_GetThreadData\fR.
.AP Tcl_ThreadId *idPtr out
The refered storage will contain the id of the newly created thread as
returned by the operating system.
.AP Tcl_ThreadId id in
Id of the thread waited upon.
.AP Tcl_ThreadCreateProc threadProc in
This procedure will act as the \fBmain()\fR of the newly created
thread. The specified \fIclientData\fR will be its sole argument.
.AP ClientData clientData in
Arbitrary information. Passed as sole argument to the \fIthreadProc\fR.
.AP int stackSize in
The size of the stack given to the new thread.
.AP int flags in
Bitmask containing flags allowing the caller to modify behaviour of
the new thread.
.AP int *result out
The refered storage is used to place the exit code of the thread
waited upon into it.
.BE
.SH INTRODUCTION
Beginning with the 8.1 release, the Tcl core is thread safe, which
allows you to incorporate Tcl into multithreaded applications without
customizing the Tcl core.  To enable Tcl multithreading support,
you must include the \fB--enable-threads\fR option to \fBconfigure\fR
when you configure and compile your Tcl core.
Changes to doc/Utf.3.
1
2
3
4
5
6
7

8
9
10
11
12
13
14
1
2
3
4
5
6

7
8
9
10
11
12
13
14






-
+







'\"
'\" Copyright (c) 1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: Utf.3,v 1.7 2000/04/25 17:55:29 hobbs Exp $
'\" RCS: @(#) $Id: Utf.3,v 1.7.2.1 2001/12/10 16:01:43 dgp Exp $
'\" 
.so man.macros
.TH Utf 3 "8.1" Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_UniChar, Tcl_UniCharToUtf, Tcl_UtfToUniChar, Tcl_UniCharToUtfDString, Tcl_UtfToUniCharDString, Tcl_UniCharLen, Tcl_UniCharNcmp, Tcl_UtfCharComplete, Tcl_NumUtfChars, Tcl_UtfFindFirst, Tcl_UtfFindLast, Tcl_UtfNext, Tcl_UtfPrev, Tcl_UniCharAtIndex, Tcl_UtfAtIndex, Tcl_UtfBackslash \- routines for manipulating UTF-8 strings.
.SH SYNOPSIS
131
132
133
134
135
136
137
138

139
140
141
142
143
144
145
131
132
133
134
135
136
137

138
139
140
141
142
143
144
145







-
+







to UTF-8, storing the result in a previously-initialized \fBTcl_DString\fR.
You must specify the length of the given Unicode string.
The return value is a pointer to the UTF-8 representation of the
Unicode string.  Storage for the return value is appended to the
end of the \fBTcl_DString\fR.
.PP
\fBTcl_UtfToUniCharDString\fR coverts the given UTF-8 string to Unicode,
storing the result in the previously-initialized \fBTcl_Dstring\fR.
storing the result in the previously-initialized \fBTcl_DString\fR.
you may either specify the length of the given UTF-8 string or "-1",
in which case \fBTcl_UtfToUniCharDString\fR uses \fBstrlen\fR to
calculate the length.  The return value is a pointer to the Unicode
representation of the UTF-8 string.  Storage for the return value
is appended to the end of the \fBTcl_DString\fR.  The Unicode string
is terminated with a Unicode NULL character.
.PP
Changes to doc/after.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1990-1994 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: after.n,v 1.2 1998/09/14 18:39:51 stanton Exp $
'\" RCS: @(#) $Id: after.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH after n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
after \- Execute a command after a time delay
99
100
101
102
103
104
105
106

107
108
109
99
100
101
102
103
104
105

106
107
108
109







-
+



assume that the application is event driven:  the delayed commands
will not be executed unless the application enters the event loop.
In applications that are not normally event-driven, such as
\fBtclsh\fR, the event loop can be entered with the \fBvwait\fR
and \fBupdate\fR commands.

.SH "SEE ALSO"
bgerror
bgerror(n), concat(n), update(n), vwait(n)

.SH KEYWORDS
cancel, delay, idle callback, sleep, time
Changes to doc/append.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: append.n,v 1.2 1998/09/14 18:39:51 stanton Exp $
'\" RCS: @(#) $Id: append.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH append n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
append \- Append to variable
24
25
26
27
28
29
30



31
32
24
25
26
27
28
29
30
31
32
33
34
35







+
+
+


it is given a value equal to the concatenation of all the
\fIvalue\fR arguments.
This command provides an efficient way to build up long
variables incrementally.
For example, ``\fBappend a $b\fR'' is much more efficient than
``\fBset a $a$b\fR'' if \fB$a\fR is long.

.SH "SEE ALSO"
concat(n), lappend(n)

.SH KEYWORDS
append, variable
Changes to doc/bgerror.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1990-1994 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: bgerror.n,v 1.2 1998/09/14 18:39:51 stanton Exp $
'\" RCS: @(#) $Id: bgerror.n,v 1.2.18.3 2001/10/09 19:04:01 hobbs Exp $
'\" 
.so man.macros
.TH bgerror n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
bgerror \- Command invoked to process background errors
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
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







-
+
-
-
-
+
+


-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+

-
-
-
+
+
+

-
-
-
-
-
+
+
+
+
+

-
-
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+


A background error is one that occurs in an event handler or some
other command that didn't originate with the application.
For example, if an error occurs while executing a command specified
with the \fBafter\fR command, then it is a background error.
For a non-background error, the error can simply be returned up
through nested Tcl command evaluations until it reaches the top-level
code in the application; then the application can report the error
in whatever way it wishes.
in whatever way it wishes.  When a background error occurs, the
When a background error occurs, the unwinding ends in
the Tcl library and there is no obvious way for Tcl to report
the error.
unwinding ends in the Tcl library and there is no obvious way for Tcl
to report the error.
.PP
When Tcl detects a background error, it saves information about the
error and invokes the \fBbgerror\fR command later as an idle event handler.
Before invoking \fBbgerror\fR, Tcl restores the \fBerrorInfo\fR
and \fBerrorCode\fR variables to their values at the time the
error occurred, then it invokes \fBbgerror\fR with
the error message as its only argument.
Tcl assumes that the application has implemented the \fBbgerror\fR
command, and that the command will report the error in a way that
makes sense for the application.  Tcl will ignore any result returned
by the \fBbgerror\fR command as long as no error is generated.
error and invokes the \fBbgerror\fR command later as an idle event
handler. Before invoking \fBbgerror\fR, Tcl restores the
\fBerrorInfo\fR and \fBerrorCode\fR variables to their values at the
time the error occurred, then it invokes \fBbgerror\fR with the error
message as its only argument.  Tcl assumes that the application has
implemented the \fBbgerror\fR command, and that the command will
report the error in a way that makes sense for the application.  Tcl
will ignore any result returned by the \fBbgerror\fR command as long
as no error is generated.
.PP
If another Tcl error occurs within the \fBbgerror\fR command
(for example, because no \fBbgerror\fR command has been defined)
then Tcl reports the error itself by writing a message to stderr.
If another Tcl error occurs within the \fBbgerror\fR command (for
example, because no \fBbgerror\fR command has been defined) then Tcl
reports the error itself by writing a message to stderr.
.PP
If several background errors accumulate before \fBbgerror\fR
is invoked to process them, \fBbgerror\fR will be invoked once
for each error, in the order they occurred.
However, if \fBbgerror\fR returns with a break exception, then
any remaining errors are skipped without calling \fBbgerror\fR.
If several background errors accumulate before \fBbgerror\fR is
invoked to process them, \fBbgerror\fR will be invoked once for each
error, in the order they occurred.  However, if \fBbgerror\fR returns
with a break exception, then any remaining errors are skipped without
calling \fBbgerror\fR.
.PP
Tcl has no default implementation for \fBbgerror\fR.
However, in applications using Tk there is a default
Tcl has no default implementation for \fBbgerror\fR. However, in
applications using Tk there is a default \fBbgerror\fR procedure which
\fBbgerror\fR procedure
which posts a dialog box containing
the error message and offers the user a chance to see a stack
trace showing where the error occurred.
posts a dialog box containing the error message and offers the user a
chance to see a stack trace showing where the error occurred.  In
addition to allowing the user to view the stack trace, the dialog
provides an additional application configurable button which may be
used, for example, to save the stack trace to a file.  By default,
this is the behavior associated with that button.  This behavior can
be redefined by setting the option database values
\fB*ErrorDialog.function.text\fR, to specify the caption for the
function button, and \fB*ErrorDialog.function.command\fR, to specify
the command to be run.  The text of the stack trace is appended to the
command when it is evaluated.  If either of these options is set to
the empty string, then the additional button will not be displayed in
the dialog.

.SH "SEE ALSO"
after(n), tclvars(n)

.SH KEYWORDS
background error, reporting
Changes to doc/binary.n.
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
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






-
+

















-
-
-
-
-
+
+
+
+
+







'\"
'\" Copyright (c) 1997 by Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: binary.n,v 1.4 2000/04/08 02:35:17 hobbs Exp $
'\" RCS: @(#) $Id: binary.n,v 1.4.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH binary n 8.0 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
binary \- Insert and extract fields from binary strings
.SH SYNOPSIS
\fBbinary format \fIformatString \fR?\fIarg arg ...\fR?
.br
\fBbinary scan \fIstring formatString \fR?\fIvarName varName ...\fR?
.BE

.SH DESCRIPTION
.PP
This command provides facilities for manipulating binary data.  The
first form, \fBbinary format\fR, creates a binary string from normal
Tcl values.  For example, given the values 16 and 22, it might produce
an 8-byte binary string consisting of two 4-byte integers, one for
each of the numbers.  The second form of the command, 
\fBbinary scan\fR, does the opposite: it extracts data from a binary
string and returns it as ordinary Tcl string values.
Tcl values.  For example, given the values 16 and 22, on a 32 bit
architecture, it might produce an 8-byte binary string consisting of
two 4-byte integers, one for each of the numbers.  The second form of
the command, \fBbinary scan\fR, does the opposite: it extracts data
from a binary string and returns it as ordinary Tcl string values.

.SH "BINARY FORMAT"
.PP
The \fBbinary format\fR command generates a binary string whose layout
is specified by the \fIformatString\fR and whose contents come from
the additional arguments.  The resulting binary value is returned.
.PP
538
539
540
541
542
543
544
545

546
547
548
538
539
540
541
542
543
544

545
546
547
548







-
+



.SH "PLATFORM ISSUES"
Sometimes it is desirable to format or scan integer values in the
native byte order for the machine.  Refer to the \fBbyteOrder\fR
element of the \fBtcl_platform\fR array to decide which type character
to use when formatting or scanning integers.

.SH "SEE ALSO"
format, scan, tclvars
format(n), scan(n), tclvars(n)

.SH KEYWORDS
binary, format, scan
Changes to doc/break.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993-1994 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: break.n,v 1.2 1998/09/14 18:39:51 stanton Exp $
'\" RCS: @(#) $Id: break.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH break n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
break \- Abort looping command
26
27
28
29
30
31
32



33
34
26
27
28
29
30
31
32
33
34
35
36
37







+
+
+


The exception causes the current script to be aborted
out to the innermost containing loop command, which then
aborts its execution and returns normally.
Break exceptions are also handled in a few other situations, such
as the \fBcatch\fR command, Tk event bindings, and the outermost
scripts of procedure bodies.

.SH "SEE ALSO"
catch(n), continue(n), for(n), foreach(n), while(n)

.SH KEYWORDS
abort, break, loop
Changes to doc/case.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: case.n,v 1.2 1998/09/14 18:39:51 stanton Exp $
'\" RCS: @(#) $Id: case.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH case n 7.0 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
case \- Evaluate one of several scripts, depending on a given value
50
51
52
53
54
55
56



57
58
59
50
51
52
53
54
55
56
57
58
59
60
61
62







+
+
+



The second form makes it easy to construct multi-line case commands,
since the braces around the whole list make it unnecessary to include a
backslash at the end of each line.
Since the \fIpatList\fR arguments are in braces in the second form,
no command or variable substitutions are performed on them;  this makes
the behavior of the second form different than the first form in some
cases.

.SH "SEE ALSO"
switch(n)

.SH KEYWORDS
case, match, regular expression
Changes to doc/cd.n.
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
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







-
+


















+
+
+


'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: cd.n,v 1.2 1998/09/14 18:39:51 stanton Exp $
'\" RCS: @(#) $Id: cd.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH cd n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
cd \- Change working directory
.SH SYNOPSIS
\fBcd \fR?\fIdirName\fR?
.BE

.SH DESCRIPTION
.PP
Change the current working directory to \fIdirName\fR, or to the
home directory (as specified in the HOME environment variable) if
\fIdirName\fR is not given.
Returns an empty string.

.SH "SEE ALSO"
filename(n), glob(n), pwd(n)

.SH KEYWORDS
working directory
Changes to doc/close.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: close.n,v 1.2 1998/09/14 18:39:51 stanton Exp $
'\" RCS: @(#) $Id: close.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH close n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
close \- Close an open channel.
51
52
53
54
55
56
57



58
59
51
52
53
54
55
56
57
58
59
60
61
62







+
+
+


when the process exits.  Channels are switched to blocking mode, to ensure
that all output is correctly flushed before the process exits.
.VE
.PP
The command returns an empty string, and may generate an error if
an error occurs while flushing output.

.SH "SEE ALSO"
file(n), open(n), socket(n), eof(n)

.SH KEYWORDS
blocking, channel, close, nonblocking
Changes to doc/concat.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: concat.n,v 1.2 1998/09/14 18:39:51 stanton Exp $
'\" RCS: @(#) $Id: concat.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH concat n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
concat \- Join lists together
32
33
34
35
36
37
38



39
40
32
33
34
35
36
37
38
39
40
41
42
43







+
+
+


.CS
\fBa b c d e f {g h}\fR
.CE
as its result.
.PP
If no \fIarg\fRs are supplied, the result is an empty string.

.SH "SEE ALSO"
append(n), eval(n)

.SH KEYWORDS
concatenate, join, lists
Changes to doc/continue.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993-1994 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: continue.n,v 1.2 1998/09/14 18:39:51 stanton Exp $
'\" RCS: @(#) $Id: continue.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH continue n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
continue \- Skip to the next iteration of a loop
26
27
28
29
30
31
32



33
34
26
27
28
29
30
31
32
33
34
35
36
37







+
+
+


The exception causes the current script to be aborted
out to the innermost containing loop command, which then
continues with the next iteration of the loop.
Catch exceptions are also handled in a few other situations, such
as the \fBcatch\fR command and the outermost scripts of procedure
bodies.

.SH "SEE ALSO"
break(n), for(n), foreach(n), while(n)

.SH KEYWORDS
continue, iteration, loop
Changes to doc/dde.n.
1
2
3
4
5
6
7

8
9
10
11
12
13
14
1
2
3
4
5
6

7
8
9
10
11
12
13
14






-
+







'\"
'\" Copyright (c) 1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: dde.n,v 1.5 2000/04/12 18:41:54 hobbs Exp $
'\" RCS: @(#) $Id: dde.n,v 1.5.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH dde n 8.1 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
dde \- Execute a Dynamic Data Exchange command
124
125
126
127
128
129
130

131
132


133
134
124
125
126
127
128
129
130
131
132

133
134
135
136







+

-
+
+


When using DDE, be careful to ensure that the event queue is flushed
using either \fBupdate\fR or \fBvwait\fR.  This happens by default
when using \fBwish\fR unless a blocking command is called (such as \fBexec\fR
without adding the \fB&\fR to place the process in the background).
If for any reason the event queue is not flushed, DDE commands may
hang until the event queue is flushed.  This can create a deadlock
situation.

.SH "SEE ALSO"
tk, winfo, send
tk(n), winfo(n), send(n)

.SH KEYWORDS
application, dde, name, remote execution
Changes to doc/encoding.n.
1
2
3
4
5
6
7

8
9
10
11
12
13
14
1
2
3
4
5
6

7
8
9
10
11
12
13
14






-
+







'\"
'\" Copyright (c) 1998 by Scriptics Corporation.
'\" 
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: encoding.n,v 1.2 1999/04/16 00:46:34 stanton Exp $
'\" RCS: @(#) $Id: encoding.n,v 1.2.12.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH encoding n "8.1" Tcl "Tcl Built-In Commands"
.BS
.SH NAME
encoding \- Manipulate encodings
.SH SYNOPSIS
69
70
71
72
73
74
75
76

77
78
79
69
70
71
72
73
74
75

76
77
78
79







-
+



.CS
	set s [encoding convertfrom euc-jp "\\xA4\\xCF"]
.CE
would return the Unicode string "\\u306F", which is the Hiragana
letter HA.

.SH "SEE ALSO"
Tcl_GetEncoding
Tcl_GetEncoding(3)

.SH KEYWORDS
encoding
Changes to doc/eof.n.
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
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







-
+

















+
+
+


'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: eof.n,v 1.2 1998/09/14 18:39:51 stanton Exp $
'\" RCS: @(#) $Id: eof.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH eof n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
eof \- Check for end of file condition on channel
.SH SYNOPSIS
\fBeof \fIchannelId\fR
.BE

.SH DESCRIPTION
.PP
Returns 1 if an end of file condition occurred during the most
recent input operation on \fIchannelId\fR (such as \fBgets\fR),
0 otherwise.

.SH "SEE ALSO"
file(n), open(n), close(n), fblocked(n)

.SH KEYWORDS
channel, end of file
Changes to doc/error.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: error.n,v 1.2 1998/09/14 18:39:52 stanton Exp $
'\" RCS: @(#) $Id: error.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH error n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
error \- Generate an error
50
51
52
53
54
55
56



57
58
50
51
52
53
54
55
56
57
58
59
60
61







+
+
+


such information is available; see the \fBtclvars\fR manual
page for information on the proper format for the variable.
If the \fIcode\fR argument is not
present, then \fBerrorCode\fR is automatically reset to
``NONE'' by the Tcl interpreter as part of processing the
error generated by the command.

.SH "SEE ALSO"
catch(n), tclvars(n)

.SH KEYWORDS
error, errorCode, errorInfo
Changes to doc/eval.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: eval.n,v 1.2 1998/09/14 18:39:52 stanton Exp $
'\" RCS: @(#) $Id: eval.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH eval n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
eval \- Evaluate a Tcl script
24
25
26
27
28
29
30



24
25
26
27
28
29
30
31
32
33







+
+
+
\fBEval\fR concatenates all its arguments in the same
fashion as the \fBconcat\fR command, passes the concatenated string to the
Tcl interpreter recursively, and returns the result of that
evaluation (or any error generated by it).

.SH KEYWORDS
concatenate, evaluate, script

.SH "SEE ALSO"
catch(n), concat(n), error(n), subs(n), tclvars(n)
Changes to doc/exec.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: exec.n,v 1.4 1999/12/09 14:43:47 hobbs Exp $
'\" RCS: @(#) $Id: exec.n,v 1.4.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH exec n 7.6 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
exec \- Invoke subprocess(es)
297
298
299
300
301
302
303
304

305
306
307
308
309
297
298
299
300
301
302
303

304

305
306
307








-
+
-



-
\fBMacintosh\fR
The \fBexec\fR command is not implemented and does not exist under Macintosh.
.TP
\fBUnix\fR\0\0\0\0\0\0\0
The \fBexec\fR command is fully functional and works as described.

.SH "SEE ALSO"
open(n)
error(n), open(n)
.VE

.SH KEYWORDS
execute, pipeline, redirection, subprocess

Changes to doc/exit.n.
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
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







-
+


















+
+
+


'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: exit.n,v 1.2 1998/09/14 18:39:52 stanton Exp $
'\" RCS: @(#) $Id: exit.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH exit n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
exit \- End the application
.SH SYNOPSIS
\fBexit \fR?\fIreturnCode\fR?
.BE

.SH DESCRIPTION
.PP
Terminate the process, returning \fIreturnCode\fR to the
system as the exit status.
If \fIreturnCode\fR isn't specified then it defaults
to 0.

.SH "SEE ALSO"
exec(n), tclvars(n)

.SH KEYWORDS
exit, process
Changes to doc/expr.n.
1
2
3

4
5
6
7
8

9
10
11

12
13
14
15
16
17
18
1
2

3
4
5
6
7

8
9
10

11
12
13
14
15
16
17
18


-
+




-
+


-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\" Copyright (c) 1994-2000 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: expr.n,v 1.3 2000/04/28 00:47:49 ericm Exp $
'\" RCS: @(#) $Id: expr.n,v 1.2.18.1 2000/08/07 21:29:39 hobbs Exp $
'\" 
.so man.macros
.TH expr n 8.0 Tcl "Tcl Built-In Commands"
.TH expr n 8.3 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
expr \- Evaluate an expression
.SH SYNOPSIS
\fBexpr \fIarg \fR?\fIarg arg ...\fR?
.BE
344
345
346
347
348
349
350
351
352


353
354
355
356
357
358
359
360
361
362
344
345
346
347
348
349
350


351
352
353
354

355
356
357
358
359
360
361







-
-
+
+


-







.CE
both return 1.  The first comparison is done using integer
comparison, and the second is done using string comparison after
the second operand is converted to the string \fB18\fR.
Because of Tcl's tendency to treat values as numbers whenever
possible, it isn't generally a good idea to use operators like \fB==\fR
when you really want string comparison and the values of the
operands could be arbitrary;  it's better in these cases to use the
\fBstring compare\fR command instead.
operands could be arbitrary;  it's better in these cases to use
the \fBstring\fR command instead.

.SH "PERFORMANCE CONSIDERATIONS"
.VS
.PP
Enclose expressions in braces for the best speed and the smallest
storage requirements.
This allows the Tcl bytecode compiler to generate the best code.
.PP
As mentioned above, expressions are substituted twice:
once by the Tcl parser and once by the \fBexpr\fR command.
379
380
381
382
383
384
385
386
387
388
389
378
379
380
381
382
383
384

385
386
387







-



need two rounds of substitutions,
the bytecode compiler must emit
additional instructions to handle this situation.
The most expensive code is required for
unbraced expressions that contain command substitutions.
These expressions must be implemented by generating new code
each time the expression is executed.
.VE

.SH KEYWORDS
arithmetic, boolean, compare, expression, fuzzy comparison
Changes to doc/fblocked.n.
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
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






-
+




















+

-
+



'\" 
'\" Copyright (c) 1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\"
'\" RCS: @(#) $Id: fblocked.n,v 1.2 1998/09/14 18:39:52 stanton Exp $
'\" RCS: @(#) $Id: fblocked.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
.so man.macros
.TH fblocked n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
fblocked \- Test whether the last input operation exhausted all available input
.SH SYNOPSIS
\fBfblocked \fIchannelId\fR
.BE

.SH DESCRIPTION
.PP
The \fBfblocked\fR command returns 1 if the most recent input operation
on \fIchannelId\fR returned less information than requested because all
available input was exhausted.
For example, if \fBgets\fR is invoked when there are only three
characters available for input and no end-of-line sequence, \fBgets\fR
returns an empty string and a subsequent call to \fBfblocked\fR will
return 1.
.PP

.SH "SEE ALSO"
gets(n), read(n)
gets(n), open(n), read(n)

.SH KEYWORDS
blocking, nonblocking
Changes to doc/file.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: file.n,v 1.5 2000/01/12 11:10:35 hobbs Exp $
'\" RCS: @(#) $Id: file.n,v 1.5.2.1 2001/12/10 16:01:43 dgp Exp $
'\" 
.so man.macros
.TH file n 8.3 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
file \- Manipulate file names and attributes
238
239
240
241
242
243
244
245

246
247

248
249
250
251
252
253
254
238
239
240
241
242
243
244

245
246

247
248
249
250
251
252
253
254







-
+

-
+







.TP
\fBfile readlink \fIname\fR
.
Returns the value of the symbolic link given by \fIname\fR (i.e. the name
of the file it points to).  If \fIname\fR isn't a symbolic link or its
value cannot be read, then an error is returned.  On systems that don't
support symbolic links this option is undefined.
.PP
.TP
\fBfile rename \fR?\fB\-force\fR? ?\fB\-\|\-\fR? \fIsource\fR \fItarget\fR
.br
.TP
\fBfile rename \fR?\fB\-force\fR? ?\fB\-\|\-\fR? \fIsource\fR ?\fIsource\fR ...? \fItargetDir\fR
.RS
The first form takes the file or directory specified by pathname
\fIsource\fR and renames it to \fItarget\fR, moving the file if the
pathname \fItarget\fR specifies a name in a different directory.  If
\fItarget\fR is an existing directory, then the second form is used.  The
second form moves each \fIsource\fR file or directory into the directory
Changes to doc/fileevent.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1994 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: fileevent.n,v 1.2 1998/09/14 18:39:52 stanton Exp $
'\" RCS: @(#) $Id: fileevent.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH fileevent n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
fileevent \- Execute a script when a channel becomes readable or writable
98
99
100
101
102
103
104
105

106
107
108
109
98
99
100
101
102
103
104

105
106
107
108
109







-
+





.SH CREDITS
.PP
\fBfileevent\fR is based on the \fBaddinput\fR command created
by Mark Diekhans.

.SH "SEE ALSO"
bgerror, fconfigure, gets, puts, read
bgerror(n), fconfigure(n), gets(n), puts(n), read(n)

.SH KEYWORDS
asynchronous I/O, blocking, channel, event handler, nonblocking, readable,
script, writable.
Changes to doc/filename.n.
1
2
3
4
5
6
7

8
9
10
11
12
13
14
1
2
3
4
5
6

7
8
9
10
11
12
13
14






-
+







'\"
'\" Copyright (c) 1995-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: filename.n,v 1.3 1999/08/21 19:40:48 hobbs Exp $
'\" RCS: @(#) $Id: filename.n,v 1.3.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH filename n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
filename \- File name conventions supported by Tcl commands
191
192
193
194
195
196
197



191
192
193
194
195
196
197
198
199
200







+
+
+
alphanumeric characters only.  Also Windows 3.1 only supports file
names with a root of no more than 8 characters and an extension of no
more than 3 characters.

.SH KEYWORDS
current directory, absolute file name, relative file name,
volume-relative file name, portability

.SH "SEE ALSO"
file(n), glob(n)
Changes to doc/flush.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: flush.n,v 1.2 1998/09/14 18:39:52 stanton Exp $
'\" RCS: @(#) $Id: flush.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH flush n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
flush \- Flush buffered output for a channel
25
26
27
28
29
30
31
32

33
34
35
25
26
27
28
29
30
31

32
33
34
35







-
+



If the channel is in blocking mode the command does not return until all the
buffered output has been flushed to the channel. If the channel is in
nonblocking mode, the command may return before all buffered output has been
flushed; the remainder will be flushed in the background as fast as the
underlying file or device is able to absorb it.

.SH "SEE ALSO"
open(n), socket(n)
file(n), open(n), socket(n)

.SH KEYWORDS
blocking, buffer, channel, flush, nonblocking, output
Changes to doc/for.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: for.n,v 1.2 1998/09/14 18:39:52 stanton Exp $
'\" RCS: @(#) $Id: for.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH for n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
for \- ``For'' loop
52
53
54
55
56
57
58



59
60
52
53
54
55
56
57
58
59
60
61
62
63







+
+
+


around \fB$x<10\fR:
.CS
for {set x 0} {$x<10} {incr x} {
	puts "x is $x"
}
.CE

.SH "SEE ALSO"
break, continue, foreach, while

.SH KEYWORDS
for, iteration, looping
Changes to doc/foreach.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: foreach.n,v 1.2 1998/09/14 18:39:52 stanton Exp $
'\" RCS: @(#) $Id: foreach.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH foreach n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
foreach \- Iterate over all elements in one or more lists
78
79
80
81
82
83
84




85
86
78
79
80
81
82
83
84
85
86
87
88
89
90







+
+
+
+


set x {}
foreach i {a b c} {j k} {d e f g} {
    lappend x $i $j $k
}
# The value of x is "a d e b f g c {} {}"
# There are 3 iterations of the loop.
.DE

.SH "SEE ALSO"
for(n), while(n), break(n), continue(n)

.SH KEYWORDS
foreach, iteration, list, looping
Changes to doc/format.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: format.n,v 1.4 1999/11/19 06:33:58 hobbs Exp $
'\" RCS: @(#) $Id: format.n,v 1.4.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH format n 8.1 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
format \- Format a string in the style of sprintf
206
207
208
209
210
211
212



213
214
206
207
208
209
210
211
212
213
214
215
216
217







+
+
+


The \fBl\fR modifier is ignored;  integer values are always converted
as if there were no modifier present and real values are always
converted as if the \fBl\fR modifier were present (i.e. type
\fBdouble\fR is used for the internal representation).
If the \fBh\fR modifier is specified then integer values are truncated
to \fBshort\fR before conversion.

.SH "SEE ALSO"
sprintf(3), string(n)

.SH KEYWORDS
conversion specifier, format, sprintf, string, substitution
Changes to doc/gets.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: gets.n,v 1.2 1998/09/14 18:39:52 stanton Exp $
'\" RCS: @(#) $Id: gets.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH gets n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
gets \- Read a line from a channel
40
41
42
43
44
45
46
47

48
49
50
40
41
42
43
44
45
46

47
48
49
50







-
+



and no-full-line-available cases can
produce the same results as if there were an input line consisting
only of the end-of-line character(s).
The \fBeof\fR and \fBfblocked\fR commands can be used to distinguish
these three cases.

.SH "SEE ALSO"
eof(n), fblocked(n)
file(n), eof(n), fblocked(n)

.SH KEYWORDS
blocking, channel, end of file, end of line, line, nonblocking, read
Changes to doc/glob.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: glob.n,v 1.7 2000/01/26 03:37:30 hobbs Exp $
'\" RCS: @(#) $Id: glob.n,v 1.7.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH glob n 8.3 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
glob \- Return names of files that match patterns
150
151
152
153
154
155
156


157
158
159
150
151
152
153
154
155
156
157
158
159
160
161







+
+



\fBMacintosh\fR 
. 
When using the options, \fB\-dir\fR, \fB\-join\fR or \fB\-path\fR, glob
assumes the directory separator for the entire pattern is the standard
``:''.  When not using these options, glob examines each pattern argument
and uses ``/'' unless the pattern contains a ``:''.

.SH "SEE ALSO"
file(n)

.SH KEYWORDS
exist, file, glob, pattern
Changes to doc/global.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: global.n,v 1.2 1998/09/14 18:39:53 stanton Exp $
'\" RCS: @(#) $Id: global.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH global n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
global \- Access global variables
23
24
25
26
27
28
29




30
31
32

33
34
35
23
24
25
26
27
28
29
30
31
32
33
34
35

36
37
38
39







+
+
+
+


-
+



If so then it declares the given \fIvarname\fR's to be global variables
rather than local ones.
Global variables are variables in the global namespace.
For the duration of the current procedure
(and only while executing in the current procedure),
any reference to any of the \fIvarname\fRs
will refer to the global variable by the same name.
.PP
Please note that this is done by creating local variables that are
linked to the global variables, and therefore that these variables
will be listed by \fBinfo locals\fR like all other local variables.

.SH "SEE ALSO"
namespace(n), variable(n)
namespace(n), upvar(n), variable(n)

.SH KEYWORDS
global, namespace, procedure, variable
Changes to doc/http.n.
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
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


-
+




-
+








-
+

















+
+

+
+







'\"
'\" Copyright (c) 1995-1997 Sun Microsystems, Inc.
'\" Copyright (c) 1999 by Scriptics Corporation.
'\" Copyright (c) 1998-2000 by Ajuba Solutions.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: http.n,v 1.10 2000/04/09 23:55:54 welch Exp $
'\" RCS: @(#) $Id: http.n,v 1.10.2.5 2002/04/18 16:46:09 dgp Exp $
'\" 
.so man.macros
.TH "Http" n 8.3 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
Http \- Client-side implementation of the HTTP/1.0 protocol.
.SH SYNOPSIS
\fBpackage require http ?2.2?\fP
\fBpackage require http ?2.4?\fR
.sp
\fB::http::config \fI?options?\fR
.sp
\fB::http::geturl \fIurl ?options?\fR
.sp
\fB::http::formatQuery \fIlist\fR
.sp
\fB::http::reset \fItoken\fR
.sp
\fB::http::wait \fItoken\fR
.sp
\fB::http::status \fItoken\fR
.sp
\fB::http::size \fItoken\fR
.sp
\fB::http::code \fItoken\fR
.sp
\fB::http::ncode \fItoken\fR
.sp
\fB::http::data \fItoken\fR
.sp
\fB::http::error \fItoken\fR
.sp
\fB::http::cleanup \fItoken\fR
.sp
\fB::http::register \fIproto port command\fR
.sp
\fB::http::unregister \fIproto\fR
.BE
53
54
55
56
57
58
59
60
61
62


63
64
65
66
67
68
69
57
58
59
60
61
62
63



64
65
66
67
68
69
70
71
72







-
-
-
+
+







a custom \fBsocket\fR command, via \fBhttp::register\fR.
.PP
The \fB::http::geturl\fR procedure does a HTTP transaction.
Its \fIoptions \fR determine whether a GET, POST, or HEAD transaction
is performed.  
The return value of \fB::http::geturl\fR is a token for the transaction.
The value is also the name of an array in the ::http namespace
 that contains state
information about the transaction.  The elements of this array are
described in the STATE ARRAY section.
that contains state information about the transaction.  The elements
of this array are described in the STATE ARRAY section.
.PP
If the \fB-command\fP option is specified, then
the HTTP operation is done in the background.
\fB::http::geturl\fR returns immediately after generating the
HTTP request and the callback is invoked
when the transaction completes.  For this to work, the Tcl event loop
must be active.  In Tk applications this is always true.  For pure-Tcl
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
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







-
+










+
+
+
+
+
+



-
-
-
+
-
-
+







.TP
\fB\-useragent\fP \fIstring\fP
The value of the User-Agent header in the HTTP request.  The default
is \fB"Tcl http client package 2.2."\fR
.RE
.TP
\fB::http::geturl\fP \fIurl\fP ?\fIoptions\fP? 
The \fB::http::geturl \fR command is the main procedure in the package.
The \fB::http::geturl\fR command is the main procedure in the package.
The \fB\-query\fR option causes a POST operation and
the \fB\-validate\fR option causes a HEAD operation;
otherwise, a GET operation is performed.  The \fB::http::geturl\fR command
returns a \fItoken\fR value that can be used to get
information about the transaction.  See the STATE ARRAY and ERRORS section for
details.  The \fB::http::geturl\fR command blocks until the operation
completes, unless the \fB\-command\fR option specifies a callback
that is invoked when the HTTP transaction completes.
\fB::http::geturl\fR takes several options:
.RS
.TP
\fB\-binary\fP \fIboolean\fP
Specifies whether to force interpreting the url data as binary.  Normally
this is auto-detected (anything not beginning with a \fBtext\fR content
type or whose content encoding is \fBgzip\fR or \fBcompress\fR is
considered binary data).
.TP
\fB\-blocksize\fP \fIsize\fP
The blocksize used when reading the URL.
At most 
\fIsize\fR
bytes are read at once.  After each block, a call to the
At most \fIsize\fR bytes are read at once.  After each block, a call to the
\fB\-progress\fR
callback is made (if that option is specified).
\fB\-progress\fR callback is made (if that option is specified).
.TP
\fB\-channel\fP \fIname\fP
Copy the URL contents to channel \fIname\fR instead of saving it in
\fBstate(body)\fR.
.TP
\fB\-command\fP \fIcallback\fP
Invoke \fIcallback\fP after the HTTP transaction completes.
258
259
260
261
262
263
264
265





266
267
268
269




270
271
272
273
274
275
276
277
278




279
280
281


282
283
284
285
286
287





288
289
290
291
292
293
294
264
265
266
267
268
269
270

271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298

299
300
301
302
303
304
305

306
307
308
309
310
311
312
313
314
315
316
317







-
+
+
+
+
+




+
+
+
+









+
+
+
+


-
+
+





-
+
+
+
+
+







\fB::http::reset\fP \fItoken\fP ?\fIwhy\fP?
This command resets the HTTP transaction identified by \fItoken\fR, if
any.  This sets the \fBstate(status)\fP value to \fIwhy\fP, which defaults to \fBreset\fR, and then calls the registered \fB\-command\fR callback.
.TP
\fB::http::wait\fP \fItoken\fP
This is a convenience procedure that blocks and waits for the
transaction to complete.  This only works in trusted code because it
uses \fBvwait\fR.
uses \fBvwait\fR.  Also, it's not useful for the case where
\fB::http::geturl\fP is called \fIwithout\fP the \fB-command\fP option
because in this case the \fB::http::geturl\fP call doesn't return
until the HTTP transaction is complete, and thus there's nothing to
wait for.
.TP
\fB::http::data\fP \fItoken\fP
This is a convenience procedure that returns the \fBbody\fP element
(i.e., the URL data) of the state array.
.TP
\fB::http::error\fP \fItoken\fP
This is a convenience procedure that returns the \fBerror\fP element
of the state array.
.TP
\fB::http::status\fP \fItoken\fP
This is a convenience procedure that returns the \fBstatus\fP element of
the state array.
.TP
\fB::http::code\fP \fItoken\fP
This is a convenience procedure that returns the \fBhttp\fP element of the
state array.
.TP
\fB::http::ncode\fP \fItoken\fP
This is a convenience procedure that returns just the numeric return
code (200, 404, etc.) from the \fBhttp\fP element of the state array.
.TP
\fB::http::size\fP \fItoken\fP
This is a convenience procedure that returns the \fBcurrentsize\fP
element of the state array.
element of the state array, which represents the number of bytes
received from the URL in the \fB::http::geturl\fP call.
.TP
\fB::http::cleanup\fP \fItoken\fP
This procedure cleans up the state associated with the connection
identified by \fItoken\fP.  After this call, the procedures
like \fB::http::data\fP cannot be used to get information
about the operation.
about the operation.  It is \fIstrongly\fP recommended that you call
this function after you're done with a given HTTP request.  Not doing
so will result in memory not being freed, and if your app calls
\fB::http::geturl\fP enough times, the memory leak could cause a
performance hit...or worse.
.TP
\fB::http::register\fP \fIproto port command\fP
This procedure allows one to provide custom HTTP transport types
such as HTTPS, by registering a prefix, the default port, and the
command to execute to create the Tcl \fBchannel\fR. E.g.:
.RS
.CS
305
306
307
308
309
310
311
312


313
314
315
316






317
318
319
320
321













322
323
324




325
326
327
328
329
330
331
332
333
334
335
336
337
338
339

340
341
342
343
344

345
346
347
348
349
350
351
328
329
330
331
332
333
334

335
336
337
338
339
340
341
342
343
344
345
346
347




348
349
350
351
352
353
354
355
356
357
358
359
360



361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378

379
380
381

382

383
384
385
386
387
388
389
390







-
+
+




+
+
+
+
+
+

-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+














-
+


-

-
+







This procedure unregisters a protocol handler that was previously
registered via \fBhttp::register\fR.

.SH "ERRORS"
The \fBhttp::geturl\fP procedure will raise errors in the following cases:
invalid command line options,
an invalid URL,
or a URL on a non-existent host,
a URL on a non-existent host,
or a URL at a bad port on an existing host.
These errors mean that it
cannot even start the network transaction.
It will also raise an error if it gets an I/O error while
writing out the HTTP request header.
For synchronous \fB::http::geturl\fP calls (where \fB-command\fP is
not specified), it will raise an error if it gets an I/O error while
reading the HTTP reply headers or data.  Because \fB::http::geturl\fP
doesn't return a token in these cases, it does all the required
cleanup and there's no issue of your app having to call
\fB::http::cleanup\fP.
.PP
The \fBhttp::wait\fP procedure will raise errors if an I/O error
occurs while reading the HTTP reply headers or data.  If the
\fB-command\fP flag is not passed to \fBhttp::geturl\fP,
then it will call \fBhttp::wait\fP and so these errors will
For asynchronous \fB::http::geturl\fP calls, all of the above error
situations apply, except that if there's any error while 
reading the
HTTP reply headers or data, no exception is thrown.  This is because
after writing the HTTP headers, \fB::http::geturl\fP returns, and the
rest of the HTTP transaction occurs in the background.  The command
callback can check if any error occurred during the read by calling
\fB::http::status\fP to check the status and if it's \fIerror\fP,
calling \fB::http::error\fP to get the error message.
.PP
Alternatively, if the main program flow reaches a point where it needs
to know the result of the asynchronous HTTP request, it can call
\fB::http::wait\fP and then check status and error, just as the
occur in \fBhttp::geturl\fP.
If you get an error from \fBhttp::wait\fP, you must still call
\fBhttp::cleanup\fP to delete the state array.
callback does.
.PP
In any case, you must still call
\fBhttp::cleanup\fP to delete the state array when you're done.
.PP
There are other possible results of the HTTP transaction
determined by examining the status from \fBhttp::status\fP.
These are described below.
.TP
ok
If the HTTP transaction completes entirely, then status will be \fBok\fP.
However, you should still check the \fBhttp::code\fP value to get
the HTTP status.  The \fBhttp::ncode\fP procedure provides just
the numeric error (e.g., 200, 404 or 500) while the \fBhttp::code\fP
procedure returns a value like "HTTP 404 File not found".
.TP
eof
If the server closes the socket without replying, then no error
is rasied, but the status of the transaction will be \fBeof\fP.
is raised, but the status of the transaction will be \fBeof\fP.
.TP
error
In this case \fBhttp::wait\fP should have raised an error.
The error message will also be stored in the \fBerror\fP status
array element.
array element, accessible via \fB::http::error\fP.
.PP
Another error possibility is that \fBhttp::geturl\fP is unable to
write all the post query data to the server before the server
responds and closes the socket.
The error message is saved in the \fBposterror\fP status array
element and then  \fBhttp::geturl\fP attempts to complete the
transaction.
367
368
369
370
371
372
373









374
375
376
377
378
379
380
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428







+
+
+
+
+
+
+
+
+







the array are supported:
.RS
.TP
\fBbody\fR
The contents of the URL.  This will be empty if the \fB\-channel\fR
option has been specified.  This value is returned by the \fB::http::data\fP command.
.TP
\fBcharset\fR
The value of the charset attribute from the \fBContent-Type\fR meta-data
value.  If none was specified, this defaults to the RFC standard
\fBiso8859-1\fR, or the value of \fB$::http::defaultCharset\fR.  Incoming
text data will be automatically converted from this charset to utf-8.
.TP
\fBcoding\fR
A copy of the \fBContent-Encoding\fR meta-data value.
.TP
\fBcurrentsize\fR
The current number of bytes fetched from the URL.
This value is returned by the \fB::http::size\fP command.
.TP
\fBerror\fR
If defined, this is the error string seen when the HTTP transaction
was aborted.
420
421
422
423
424
425
426

427

428
429
430
431
432
433
434
468
469
470
471
472
473
474
475

476
477
478
479
480
481
482
483







+
-
+







.TP
\fBposterror\fR
The error, if any, that occurred while writing
the post query data to the server.
.TP
\fBstatus\fR
Either \fBok\fR, for successful completion, \fBreset\fR for
user-reset, \fBtimeout\fP if a timeout occurred before the transaction
user-reset, or \fBerror\fR for an error condition.  During the
could complete, or \fBerror\fR for an error condition.  During the
transaction this value is the empty string.
.TP
\fBtotalsize\fR
A copy of the \fBContent-Length\fR meta-data value.
.TP
\fBtype\fR
A copy of the \fBContent-Type\fR meta-data value.
464
465
466
467
468
469
470
471
472

473
474

475
476
477
478
513
514
515
516
517
518
519

520
521
522
523
524
525
526









-

+


+


-
-
    }

    return $token
}
proc ::http::Progress {args} {
    puts -nonewline stderr . ; flush stderr
}

.DE

.SH "SEE ALSO"
safe(n), socket(n), safesock(n)

.SH KEYWORDS
security policy, socket


Changes to doc/if.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: if.n,v 1.2 1998/09/14 18:39:53 stanton Exp $
'\" RCS: @(#) $Id: if.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH if n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
if \- Execute scripts conditionally
35
36
37
38
39
40
41



42
43
35
36
37
38
39
40
41
42
43
44
45
46







+
+
+


``noise words'' to make the command easier to read.
There may be any number of \fBelseif\fR clauses, including zero.
\fIBodyN\fR may also be omitted as long as \fBelse\fR is omitted too.
The return value from the command is the result of the body script
that was executed, or an empty string
if none of the expressions was non-zero and there was no \fIbodyN\fR.

.SH "SEE ALSO"
expr(n), for(n), foreach(n)

.SH KEYWORDS
boolean, conditional, else, false, if, true
Changes to doc/incr.n.
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
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







-
+




















+
+
+



'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: incr.n,v 1.2 1998/09/14 18:39:53 stanton Exp $
'\" RCS: @(#) $Id: incr.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH incr n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
incr \- Increment the value of a variable
.SH SYNOPSIS
\fBincr \fIvarName \fR?\fIincrement\fR?
.BE

.SH DESCRIPTION
.PP
Increments the value stored in the variable whose name is \fIvarName\fR.
The value of the variable must be an integer.
If \fIincrement\fR is supplied then its value (which must be an
integer) is added to the value of variable \fIvarName\fR;  otherwise
1 is added to \fIvarName\fR.
The new value is stored as a decimal string in variable \fIvarName\fR
and also returned as result.

.SH "SEE ALSO"
expr(n)

.SH KEYWORDS
add, increment, variable, value
Changes to doc/join.n.
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
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







-
+



















+
+
+


'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: join.n,v 1.2 1998/09/14 18:39:53 stanton Exp $
'\" RCS: @(#) $Id: join.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH join n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
join \- Create a string by joining together list elements
.SH SYNOPSIS
\fBjoin \fIlist \fR?\fIjoinString\fR?
.BE

.SH DESCRIPTION
.PP
The \fIlist\fR argument must be a valid Tcl list.
This command returns the string
formed by joining all of the elements of \fIlist\fR together with
\fIjoinString\fR separating each adjacent pair of elements.
The \fIjoinString\fR argument defaults to a space character.

.SH "SEE ALSO"
list(n), lappend(n)

.SH KEYWORDS
element, join, list, separator
Changes to doc/lappend.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: lappend.n,v 1.2 1998/09/14 18:39:53 stanton Exp $
'\" RCS: @(#) $Id: lappend.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH lappend n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
lappend \- Append list elements onto a variable
27
28
29
30
31
32
33



34
35
27
28
29
30
31
32
33
34
35
36
37
38







+
+
+


\fBLappend\fR is similar to \fBappend\fR except that the \fIvalue\fRs
are appended as list elements rather than raw text.
This command provides a relatively efficient way to build up
large lists.  For example, ``\fBlappend a $b\fR'' is much
more efficient than ``\fBset a [concat $a [list $b]]\fR'' when
\fB$a\fR is long.

.SH "SEE ALSO"
list(n), lindex(n), linsert(n), llength(n), lsort(n), lrange(n)

.SH KEYWORDS
append, element, list, variable
Changes to doc/library.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1991-1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: library.n,v 1.13 2000/04/28 00:47:49 ericm Exp $
'\" RCS: @(#) $Id: library.n,v 1.11.2.3 2001/08/24 16:19:09 dgp Exp $
.so man.macros
.TH library n "8.0" Tcl "Tcl Built-In Commands"
.BS
.SH NAME
auto_execok, auto_import, auto_load, auto_mkindex, auto_mkindex_old, auto_qualify, auto_reset, tcl_findLibrary, parray, tcl_endOfWord, tcl_startOfNextWord, tcl_startOfPreviousWord, tcl_wordBreakAfter, tcl_wordBreakBefore \- standard library of Tcl procedures
.SH SYNOPSIS
.nf
77
78
79
80
81
82
83
84


85
86
87
88
89
90
91
77
78
79
80
81
82
83

84
85
86
87
88
89
90
91
92







-
+
+







.TP
\fBauto_import \fIpattern\fR
\fBAuto_import\fR is invoked during \fBnamespace import\fR to see if
the imported commands specified by \fIpattern\fR reside in an
autoloaded library.  If so, the commands are loaded so that they will
be available to the interpreter for creating the import links.  If the
commands do not reside in an autoloaded library, \fBauto_import\fR
does nothing.
does nothing.  The pattern matching is performed according to the
matching rules of \fBnamespace import\fR.
.TP
\fBauto_load \fIcmd\fR
This command attempts to load the definition for a Tcl command named
\fIcmd\fR.  To do this, it searches an \fIauto-load path\fR, which is
a list of one or more directories.  The auto-load path is given by the
global variable \fB$auto_path\fR if it exists.  If there is no
\fB$auto_path\fR variable, then the TCLLIBPATH environment variable is
300
301
302
303
304
305
306
307

308
309
310
301
302
303
304
305
306
307

308
309
310
311







-
+



Used by \fBunknown\fR to record the command(s) for which it is
searching.
It is used to detect errors where \fBunknown\fR recurses on itself
infinitely.
The variable is unset before \fBunknown\fR returns.

.SH "SEE ALSO"
re_syntax(n)
info(n), re_syntax(n)

.SH KEYWORDS
auto-exec, auto-load, library, unknown, word, whitespace 
Changes to doc/lindex.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: lindex.n,v 1.4 1999/09/21 04:20:36 hobbs Exp $
'\" RCS: @(#) $Id: lindex.n,v 1.4.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH lindex n 8.2 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
lindex \- Retrieve an element from a list
28
29
30
31
32
33
34



35
36
37
28
29
30
31
32
33
34
35
36
37
38
39
40







+
+
+



If \fIindex\fR is negative or greater than or equal to the number
of elements in \fIvalue\fR, then an empty
string is returned.
If \fIindex\fR has the value \fBend\fR, it refers to the last element
in the list, and \fBend\-\fIinteger\fR refers to the last element in
the list minus the specified integer offset.

.SH "SEE ALSO"
list(n), lappend(n), linsert(n), llength(n), lsearch(n), lsort(n),
lrange(n), lreplace(n)

.SH KEYWORDS
element, index, list
Changes to doc/linsert.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: linsert.n,v 1.3 1999/09/21 04:20:36 hobbs Exp $
'\" RCS: @(#) $Id: linsert.n,v 1.3.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH linsert n 8.2 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
linsert \- Insert elements into a list
25
26
27
28
29
30
31



32
33
25
26
27
28
29
30
31
32
33
34
35
36







+
+
+


the new list.  If \fIindex\fR is less than or equal to zero, then the new
elements are inserted at the beginning of the list.  If \fIindex\fR has the
value \fBend\fR, or if it is greater than or equal to the number of
elements in the list, then the new elements are appended to the list.
\fBend\-\fIinteger\fR refers to the last element in the list minus the
specified integer offset.

.SH "SEE ALSO"
list(n), lappend(n), llength(n)

.SH KEYWORDS
element, insert, list
Changes to doc/list.n.
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
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







-
+















-
+



















+
+
+
+


'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: list.n,v 1.2 1998/09/14 18:39:53 stanton Exp $
'\" RCS: @(#) $Id: list.n,v 1.2.18.2 2001/12/05 22:27:25 dgp Exp $
'\" 
.so man.macros
.TH list n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
list \- Create a list
.SH SYNOPSIS
\fBlist \fR?\fIarg arg ...\fR?
.BE

.SH DESCRIPTION
.PP
This command returns a list comprised of all the \fIarg\fRs,
or an empty string if no \fIarg\fRs are specified.
Braces and backslashes get added as necessary, so that the \fBindex\fR command
Braces and backslashes get added as necessary, so that the \fBlindex\fR command
may be used on the result to re-extract the original arguments, and also
so that \fBeval\fR may be used to execute the resulting list, with
\fIarg1\fR comprising the command's name and the other \fIarg\fRs comprising
its arguments.  \fBList\fR produces slightly different results than
\fBconcat\fR:  \fBconcat\fR removes one level of grouping before forming
the list, while \fBlist\fR works directly from the original arguments.
For example, the command
.CS
\fBlist a b {c d e} {f {g h}}\fR
.CE
will return
.CS
\fBa b {c d e} {f {g h}}\fR
.CE
while \fBconcat\fR with the same arguments will return
.CS
\fBa b c d e f {g h}\fR
.CE

.SH "SEE ALSO"
lappend(n), lindex(n), linsert(n), llength(n), lsearch(n), lsort(n),
lrange(n), lreplace(n)

.SH KEYWORDS
element, list
Changes to doc/llength.n.
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
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







-
+
















+
+
+


'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: llength.n,v 1.2 1998/09/14 18:39:53 stanton Exp $
'\" RCS: @(#) $Id: llength.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH llength n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
llength \- Count the number of elements in a list
.SH SYNOPSIS
\fBllength \fIlist\fR
.BE

.SH DESCRIPTION
.PP
Treats \fIlist\fR as a list and returns a decimal string giving
the number of elements in it.

.SH "SEE ALSO"
list(n), lindex(n), lrange(n)

.SH KEYWORDS
element, list, length
Changes to doc/load.n.
1
2
3
4
5
6
7

8
9
10
11
12
13
14
1
2
3
4
5
6

7
8
9
10
11
12
13
14






-
+







'\"
'\" Copyright (c) 1995-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: load.n,v 1.5 2000/04/14 23:01:55 hobbs Exp $
'\" RCS: @(#) $Id: load.n,v 1.5.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH load n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
load \- Load machine code and initialize new commands.
125
126
127
128
129
130
131
132

133
134
135
125
126
127
128
129
130
131

132
133
134
135







-
+



.PP
If the same file is \fBload\fRed by different \fIfileName\fRs, it will
be loaded into the process's address space multiple times.  The
behavior of this varies from system to system (some systems may
detect the redundant loads, others may not).

.SH "SEE ALSO"
\fBinfo sharedlibextension\fR, Tcl_StaticPackage, safe(n)
\fBinfo sharedlibextension\fR, Tcl_StaticPackage(3), safe(n)

.SH KEYWORDS
binary code, loading, safe interpreter, shared library
Changes to doc/lrange.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: lrange.n,v 1.2 1998/09/14 18:39:53 stanton Exp $
'\" RCS: @(#) $Id: lrange.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH lrange n 7.4 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
lrange \- Return one or more adjacent elements from a list
31
32
33
34
35
36
37



38
39
31
32
33
34
35
36
37
38
39
40
41
42







+
+
+


If \fIfirst\fR is greater than \fIlast\fR then an empty string
is returned.
Note: ``\fBlrange \fIlist first first\fR'' does not always produce the
same result as ``\fBlindex \fIlist first\fR'' (although it often does
for simple fields that aren't enclosed in braces); it does, however,
produce exactly the same results as ``\fBlist [lindex \fIlist first\fB]\fR''

.SH "SEE ALSO"
lappend(n), lindex(n), linsert(n), list(n), llength(n), lreplace(n)

.SH KEYWORDS
element, list, range, sublist
Changes to doc/lreplace.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: lreplace.n,v 1.4 2000/01/21 18:24:06 ericm Exp $
'\" RCS: @(#) $Id: lreplace.n,v 1.4.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH lreplace n 7.4 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
lreplace \- Replace elements in a list with new elements
39
40
41
42
43
44
45




46
47
39
40
41
42
43
44
45
46
47
48
49
50
51







+
+
+
+


The \fIelement\fR arguments specify zero or more new arguments to
be added to the list in place of those that were deleted.
Each \fIelement\fR argument will become a separate element of
the list.  If no \fIelement\fR arguments are specified, then the elements
between \fIfirst\fR and \fIlast\fR are simply deleted.  If \fIlist\fR
is empty, any \fIelement\fR arguments are added to the end of the list.

.SH "SEE ALSO"
lappend(n), lindex(n), linsert(n), list(n), llength(n), lrange(n),
lsearch(n), lsort(n)

.SH KEYWORDS
element, list, replace
Changes to doc/lsort.n.
1
2
3
4
5
6
7
8
9

10
11
12
13
14
15
16
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
16








-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\" Copyright (c) 1999 Scriptics Corporation
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: lsort.n,v 1.5 1999/12/21 23:57:33 hobbs Exp $
'\" RCS: @(#) $Id: lsort.n,v 1.5.2.2 2001/10/08 15:50:24 dkf Exp $
'\" 
.so man.macros
.TH lsort n 8.3 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
lsort \- Sort the elements of a list
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
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







-
-
-
-
+
+
+
+
+
+
+
+
+
+




-
+
+
+
+
+
+
+
+
+
+



-








-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+



This is the default.
.TP 20
\fB\-decreasing\fR
Sort the list in decreasing order (``largest'' items first).
.TP 20
\fB\-index\0\fIindex\fR
If this option is specified, each of the elements of \fIlist\fR must
itself be a proper Tcl sublist.  Instead of sorting based on whole sublists,
\fBlsort\fR will extract the \fIindex\fR'th element from each sublist
and sort based on the given element.  The keyword \fBend\fP is allowed
for the \fIindex\fP to sort on the last sublist element. For example,
itself be a proper Tcl sublist.  Instead of sorting based on whole
sublists, \fBlsort\fR will extract the \fIindex\fR'th element from
each sublist and sort based on the given element.  The keyword
\fBend\fP is allowed for the \fIindex\fP to sort on the last sublist
element,
.VS 8.3.4
and \fBend-\fIindex\fR sorts on a sublist element offset from
the end.
.VE
For example,
.RS
.CS
lsort -integer -index 1 {{First 24} {Second 18} {Third 30}}
.CE
returns \fB{Second 18} {First 24} {Third 30}\fR.
returns \fB{Second 18} {First 24} {Third 30}\fR, and
.VS 8.3.4
'\"
'\" This example is from the test suite!
'\"
.CS
lsort -index end-1 {{a 1 e i} {b 2 3 f g} {c 4 5 6 d h}}
.CE
returns \fB{c 4 5 6 d h} {a 1 e i} {b 2 3 f g}\fR.
.VE
This option is much more efficient than using \fB\-command\fR
to achieve the same effect.
.RE
.VS 8.3
.TP 20
\fB\-unique\fR
If this option is specified, then only the last set of duplicate
elements found in the list will be retained.  Note that duplicates are
determined relative to the comparison used in the sort.  Thus if 
\fI-index 0\fR is used, \fB{1 a}\fR and \fB{1 b}\fR would be
considered duplicates and only the second element, \fB{1 b}\fR, would
be retained.
.VE

.SH "NOTES"
.PP
The options to \fBlsort\fR only control what sort of comparison is
used, and do not necessarily constrain what the values themselves
actually are.  This distinction is only noticeable when the list to be
sorted has fewer than two elements.
.PP
The \fBlsort\fR command is reentrant, meaning it is safe to use as
part of the implementation of a command used in the \fB\-command\fR
option.

.SH "EXAMPLES"

.PP
Sorting a list using ASCII sorting:
.CS
% lsort {a10 B2 b1 a1 a2}
B2 a1 a10 a2 b1
.CE

.PP
Sorting a list using Dictionary sorting:
.CS
% lsort -dictionary {a10 B2 b1 a1 a2}
a1 a2 a10 b1 B2
.CE

.PP
Sorting lists of integers:
.CS
% lsort -integer {5 3 1 2 11 4}
1 2 3 4 5 11
% lsort -integer {1 2 0x5 7 0 4 -1}
-1 0 1 2 4 0x5 7
.CE

.PP
Sorting lists of floating-point numbers:
.CS
% lsort -real {5 3 1 2 11 4}
1 2 3 4 5 11
% lsort -real {.5 0.07e1 0.4 6e-1}
0.4 .5 6e-1 0.07e1
.CE

.PP
Sorting using indices:
.CS
% # Note the space character before the c
% lsort {{a 5} { c 3} {b 4} {e 1} {d 2}}
{ c 3} {a 5} {b 4} {d 2} {e 1}
% lsort -index 0 {{a 5} { c 3} {b 4} {e 1} {d 2}}
{a 5} {b 4} { c 3} {d 2} {e 1}
% lsort -index 1 {{a 5} { c 3} {b 4} {e 1} {d 2}}
{e 1} {d 2} { c 3} {b 4} {a 5}
.CE

.PP
Stripping duplicate values using sorting:
.CS
% lsort -unique {a b c a b c a b c}
a b c
.CE

.PP
More complex sorting using a comparison function:
.CS
% proc compare {a b} {
    set a0 [lindex $a 0]
    set b0 [lindex $b 0]
    if {$a0 < $b0} {
        return -1
    } elseif {$a0 > $b0} {
        return 1
    }
    return [string compare [lindex $a 1] [lindex $b 1]]
}
% lsort -command compare \\
        {{3 apple} {0x2 carrot} {1 dingo} {2 banana}}
{1 dingo} {2 banana} {0x2 carrot} {3 apple}
.CE

.SH "SEE ALSO"
lappend(n), lindex(n), linsert(n), list(n), llength(n), lrange(n),
lreplace(n), lsearch(n)

.SH KEYWORDS
element, list, order, sort
Changes to doc/man.macros.
55
56
57
58
59
60
61
62

63
64
65
66
67
68
69
55
56
57
58
59
60
61

62
63
64
65
66
67
68
69







-
+







'\"	option's name as specified in the class command, dbName gives
'\"	the option's name in the option database, and dbClass gives
'\"	the option's class in the option database.
'\"
'\" .UL arg1 arg2
'\"	Print arg1 underlined, then print arg2 normally.
'\"
'\" RCS: @(#) $Id: man.macros,v 1.3 1999/04/16 00:46:35 stanton Exp $
'\" RCS: @(#) $Id: man.macros,v 1.3.12.1 2001/04/03 22:06:43 hobbs Exp $
'\"
'\"	# Set up traps and other miscellaneous stuff for Tcl/Tk man pages.
.if t .wh -1.3i ^B
.nr ^l \n(.l
.ad b
'\"	# Start an argument description
.de AP
195
196
197
198
199
200
201
202

203
204
205
206
207
208
209
195
196
197
198
199
200
201

202
203
204
205
206
207
208
209







-
+







.sp
..
'\"	# SO - start of list of standard options
.de SO
.SH "STANDARD OPTIONS"
.LP
.nf
.ta 4c 8c 12c
.ta 5.5c 11c
.ft B
..
'\"	# SE - end of list of standard options
.de SE
.fi
.ft R
.LP
Changes to doc/memory.n.
1
2
3
4
5
6

7
8
9
10
11
12
13
1
2
3
4
5

6
7
8
9
10
11
12
13





-
+







'\"
'\" Copyright (c) 1992-1999 by Karl Lehenbauer and Mark Diekhans
'\" Copyright (c) 2000 by Scriptics Corporation.
'\" All rights reserved.
'\" 
'\" RCS: @(#) $Id: memory.n,v 1.2 2000/04/28 00:47:49 ericm Exp $
'\" RCS: @(#) $Id: memory.n,v 1.2.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH memory n 8.1 Tcl "Tcl Built-In Commands"
.BS
.SH NAME
memory \- Control Tcl memory debugging capabilities.
.SH SYNOPSIS
74
75
76
77
78
79
80
81
82
74
75
76
77
78
79
80









-
-
Write a list of all currently allocated memory to the specified file.

.SH "SEE ALSO"
ckalloc, ckfree, Tcl_ValidateAllMemory, Tcl_DumpActiveMemory, TCL_MEM_DEBUG

.SH KEYWORDS
memory, debug


Changes to doc/msgcat.n.
9
10
11
12
13
14
15




16
17
18
19
20
21
22
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26







+
+
+
+







.so man.macros
.TH "msgcat" n 8.1 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
msgcat \- Tcl message catalog
.SH SYNOPSIS
\fBpackage require Tcl 8.2\fR
.sp
\fBpackage require msgcat 1.1\fR
.sp
\fB::msgcat::mc \fIsrc-string\fR
.sp
\fB::msgcat::mclocale \fR?\fInewLocale\fR?
.sp
\fB::msgcat::mcpreferences\fR
.sp
\fB::msgcat::mcload \fIdirname\fR
Changes to doc/open.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: open.n,v 1.9 1999/12/21 23:57:33 hobbs Exp $
'\" RCS: @(#) $Id: open.n,v 1.9.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH open n 7.6 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
open \- Open a file-based or command pipeline channel
104
105
106
107
108
109
110












111
112
113
114
115
116
117
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







+
+
+
+
+
+
+
+
+
+
+
+







\fBTRUNC\fR
If the file exists it is truncated to zero length.
.PP
If a new file is created as part of opening it, \fIpermissions\fR
(an integer) is used to set the permissions for the new file in
conjunction with the process's file mode creation mask.
\fIPermissions\fR defaults to 0666.
.PP
'\" Not versioned as advice applies to all recent versions of Tcl.
'\" Prior to that, Tcl didn't really support binary files anyway...
.VS
Note that if you are going to be reading or writing binary data from
the channel created by this command, you should use the
\fBfconfigure\fR command to change the \fB-translation\fR option of
the channel to \fBbinary\fR before transferring any binary data.  This
is in contrast to the ``b'' character passed as part of the equivalent
of the \fIaccess\fR parameter to some versions of the C library
\fIfopen()\fR function.
.VE
.SH "COMMAND PIPELINES"
.PP
If the first character of \fIfileName\fR is ``|'' then the
remaining characters of \fIfileName\fR are treated as a list of arguments
that describe a command pipeline to invoke, in the same style as the
arguments for \fBexec\fR.
In this case, the channel identifier returned by \fBopen\fR may be used
247
248
249
250
251
252
253

254

255
256


257
258
259
259
260
261
262
263
264
265
266
267
268


269
270
271
272
273







+

+
-
-
+
+



same time.  If the command pipeline is started from a script, so that Tcl is
not accessing the console, or if the command pipeline does not use standard
input, but is redirected from a file, then the above problem does not occur.  
.LP
See the PORTABILITY ISSUES section of the \fBexec\fR command for additional
information not specific to command pipelines about executing
applications on the various platforms

.SH "SEE ALSO"
file(n), close(n), filename(n), fconfigure(n), gets(n), read(n),
close(n), filename(n), gets(n), read(n), puts(n), exec(n)
.VE
puts(n), exec(n), fopen(1)

.SH KEYWORDS
access mode, append, create, file, non-blocking, open, permissions,
pipeline, process, serial
Changes to doc/package.n.
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15
16
17

18
19
20
21
22
23
24
1
2
3
4
5
6

7
8
9
10
11
12
13
14
15
16

17
18
19
20
21
22
23
24






-
+









-
+







'\"
'\" Copyright (c) 1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: package.n,v 1.3 1999/03/10 05:52:45 stanton Exp $
'\" RCS: @(#) $Id: package.n,v 1.3.14.2 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH package n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
package \- Facilities for package loading and version control
.SH SYNOPSIS
.nf
\fBpackage forget \fIpackage\fR
\fBpackage forget ?\fIpackage package ...\fR?
\fBpackage ifneeded \fIpackage version\fR ?\fIscript\fR?
\fBpackage names\fR
\fBpackage present \fR?\fB\-exact\fR? \fIpackage \fR?\fIversion\fR?
\fBpackage provide \fIpackage \fR?\fIversion\fR?
\fBpackage require \fR?\fB\-exact\fR? \fIpackage \fR?\fIversion\fR?
\fBpackage unknown \fR?\fIcommand\fR?
\fBpackage vcompare \fIversion1 version2\fR
39
40
41
42
43
44
45
46
47


48
49
50
51
52
53
54
39
40
41
42
43
44
45


46
47
48
49
50
51
52
53
54







-
-
+
+







Typically, only the \fBpackage require\fR and \fBpackage provide\fR
commands are invoked in normal Tcl scripts;  the other commands are used
primarily by system scripts that maintain the package database.
.PP
The behavior of the \fBpackage\fR command is determined by its first argument.
The following forms are permitted:
.TP
\fBpackage forget \fIpackage\fR
Removes all information about \fIpackage\fR from this interpreter,
\fBpackage forget ?\fIpackage package ...\fR?
Removes all information about each specified package from this interpreter,
including information provided by both \fBpackage ifneeded\fR and
\fBpackage provide\fR.
.TP
\fBpackage ifneeded \fIpackage version\fR ?\fIscript\fR?
This command typically appears only in system configuration
scripts to set up the package database.
It indicates that a particular version of
185
186
187
188
189
190
191



192
193
185
186
187
188
189
190
191
192
193
194
195
196







+
+
+


The recommended way to use packages in Tcl is to invoke \fBpackage require\fR
and \fBpackage provide\fR commands in scripts, and use the procedure
\fBpkg_mkIndex\fR to create package index files.
Once you've done this, packages will be loaded automatically
in response to \fBpackage require\fR commands.
See the documentation for \fBpkg_mkIndex\fR for details.

.SH "SEE ALSO"
msgcat(n), packagens(n), pkgMkIndex(n)

.SH KEYWORDS
package, version
Changes to doc/packagens.n.
1
2
3
4
5

6
7
8
9
10
11
12
1
2
3
4

5
6
7
8
9
10
11
12




-
+







'\"
'\" Copyright (c) 1998-2000 by Scriptics Corporation.
'\" All rights reserved.
'\" 
'\" RCS: @(#) $Id: packagens.n,v 1.2 2000/02/10 10:09:18 hobbs Exp $
'\" RCS: @(#) $Id: packagens.n,v 1.2.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH pkg::create n 8.3 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
pkg::create \- Construct an appropriate \fBpackage ifneeded\fR
43
44
45
46
47
48
49



50
51
52
43
44
45
46
47
48
49
50
51
52
53
54
55







+
+
+



\fB\-source\fR\0\fIfilespec\fR
This parameter is similar to the \fB\-load\fR parameter, except that it
specifies a Tcl library that must be loaded with the
\fBsource\fR command.  Any number of \fB\-source\fR parameters may be
specified.
.PP
At least one \fB\-load\fR or \fB\-source\fR paramter must be given.

.SH "SEE ALSO"
package(n)

.SH KEYWORDS
auto-load, index, package, version
Changes to doc/pid.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: pid.n,v 1.2 1998/09/14 18:39:54 stanton Exp $
'\" RCS: @(#) $Id: pid.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH pid n 7.0 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
pid \- Retrieve process id(s)
26
27
28
29
30
31
32



33
34
26
27
28
29
30
31
32
33
34
35
36
37







+
+
+


in order.
The list will be empty if \fIfileId\fR refers to an open file
that isn't a process pipeline.
If no \fIfileId\fR argument is given then \fBpid\fR returns the process
identifier of the current process.
All process identifiers are returned as decimal strings.

.SH "SEE ALSO"
exec(n), open(n)

.SH KEYWORDS
file, pipeline, process identifier
Changes to doc/pkgMkIndex.n.
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
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






-
+










-
+







'\"
'\" Copyright (c) 1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: pkgMkIndex.n,v 1.9 2000/02/10 10:09:18 hobbs Exp $
'\" RCS: @(#) $Id: pkgMkIndex.n,v 1.9.2.2 2001/08/24 16:19:09 dgp Exp $
'\" 
.so man.macros
.TH pkg_mkIndex n 8.3 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
pkg_mkIndex \- Build an index for automatic loading of packages
.SH SYNOPSIS
.nf
.VS 8.3.0
\fBpkg_mkIndex ?\fI\-lazy\fR? ?\fI\-load pkgPat\fR? ?\fI\-verbose\fR? \fIdir\fR ?\fIpattern pattern ...\fR?
\fBpkg_mkIndex ?\fI\-direct\fR?  ?\fI\-lazy\fR?  ?\fI\-load pkgPat\fR? ?\fI\-verbose\fR? \fIdir\fR ?\fIpattern pattern ...\fR?
.VE
.fi
.BE

.SH DESCRIPTION
.PP
\fBPkg_mkIndex\fR is a utility procedure that is part of the standard
98
99
100
101
102
103
104




105
106
107
108
109
110
111
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115







+
+
+
+







interpreter, based on the first call to \fBpackage require\fR.
Different versions of a package may be loaded in different
interpreters.

.SH OPTIONS
The optional switches are:
.TP 15
\fB\-direct\fR
The generated index will implement direct loading of the package
upon \fBpackage require\fR.  This is the default.
.TP 15
\fB\-lazy\fR
The generated index will manage to delay loading the package until the
use of one of the commands provided by the package, instead of loading
it immediately upon \fBpackage require\fR.
.TP 15
\fB\-load \fIpkgPat\fR
The index process will pre-load any packages that exist in the
227
228
229
230
231
232
233



234
235
236
231
232
233
234
235
236
237
238
239
240
241
242
243







+
+
+



If you have a package that is split across scripts and a binary file,
then you should avoid the \fB\-load\fP flag. The problem is that
if you load a package before computing the index it masks any
other files that provide part of the same package.
If you must use \fB\-load\fP,
then you must specify the scripts first; otherwise the package loaded from
the binary file may mask the package defined by the scripts.

.SH "SEE ALSO"
package(n)

.SH KEYWORDS
auto-load, index, package, version
Changes to doc/proc.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: proc.n,v 1.2 1998/09/14 18:39:54 stanton Exp $
'\" RCS: @(#) $Id: proc.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH proc n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
proc \- Create a Tcl procedure
66
67
68
69
70
71
72



73
74
66
67
68
69
70
71
72
73
74
75
76
77







+
+
+


invoked, the procedure's return value is the value specified in a
\fBreturn\fR command.  If the procedure doesn't execute an explicit
\fBreturn\fR, then its return value is the value of the last command
executed in the procedure's body.
If an error occurs while executing the procedure
body, then the procedure-as-a-whole will return that same error.

.SH "SEE ALSO"
info(n), unknown(n)

.SH KEYWORDS
argument, procedure
Changes to doc/puts.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: puts.n,v 1.3 1999/04/16 00:46:35 stanton Exp $
'\" RCS: @(#) $Id: puts.n,v 1.3.12.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH puts n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
puts \- Write to a channel
59
60
61
62
63
64
65
66

67
68
69
59
60
61
62
63
64
65

66
67
68
69







-
+



large amount of memory.
To avoid wasting memory, nonblocking I/O should normally
be used in an event-driven fashion with the \fBfileevent\fR command
(don't invoke \fBputs\fR unless you have recently been notified
via a file event that the channel is ready for more output data).

.SH "SEE ALSO"
fileevent(n)
file(n), fileevent(n)

.SH KEYWORDS
channel, newline, output, write
Changes to doc/pwd.n.
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
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







-
+















+
+
+


'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: pwd.n,v 1.2 1998/09/14 18:39:54 stanton Exp $
'\" RCS: @(#) $Id: pwd.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH pwd n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
pwd \- Return the current working directory
.SH SYNOPSIS
\fBpwd\fR
.BE

.SH DESCRIPTION
.PP
Returns the path name of the current working directory.

.SH "SEE ALSO"
file(n), cd(n), glob(n), filename(n)

.SH KEYWORDS
working directory
Changes to doc/read.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: read.n,v 1.4 1999/05/05 01:19:42 stanton Exp $
'\" RCS: @(#) $Id: read.n,v 1.4.12.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH read n 8.1 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
read \- Read from a channel
48
49
50
51
52
53
54
55

56
57
58
48
49
50
51
52
53
54

55
56
57
58







-
+



\fBRead\fR translates end-of-line sequences in the input into
newline characters according to the \fB\-translation\fR option
for the channel.
See the \fBfconfigure\fR manual entry for a discussion on ways in
which \fBfconfigure\fR will alter input.

.SH "SEE ALSO"
eof(n), fblocked(n), fconfigure(n)
file(n), eof(n), fblocked(n), fconfigure(n)

.SH KEYWORDS
blocking, channel, end of line, end of file, nonblocking, read, translation, encoding
Changes to doc/regexp.n.
1
2
3
4
5
6
7

8
9
10
11
12
13
14
1
2
3
4
5
6

7
8
9
10
11
12
13
14






-
+







'\"
'\" Copyright (c) 1998 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: regexp.n,v 1.9 2000/04/14 06:42:32 hobbs Exp $
'\" RCS: @(#) $Id: regexp.n,v 1.9.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH regexp n 8.3 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
regexp \- Match a regular expression against a string
123
124
125
126
127
128
129
130

131
132
133
123
124
125
126
127
128
129

130
131
132
133







-
+



subexpressions within \fIexp\fR, or if a particular subexpression
in \fIexp\fR doesn't match the string (e.g. because it was in a
portion of the expression that wasn't matched), then the corresponding
\fIsubMatchVar\fR will be set to ``\fB\-1 \-1\fR'' if \fB\-indices\fR
has been specified or to an empty string otherwise.

.SH "SEE ALSO"
re_syntax(n)
re_syntax(n), regsub(n)

.SH KEYWORDS
match, regular expression, string
Changes to doc/regsub.n.
1
2
3

4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
16



+




-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\" Copyright (c) 2000 Scriptics Corporation.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: regsub.n,v 1.4 1999/09/21 04:20:36 hobbs Exp $
'\" RCS: @(#) $Id: regsub.n,v 1.4.2.2 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH regsub n 8.3 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
regsub \- Perform substitutions based on regular expression pattern matching
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
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+











-
+
-
-












+
+
+


All ranges in \fIstring\fR that match \fIexp\fR are found and
substitution is performed for each of these ranges.
Without this switch only the first
matching range is found and substituted.
If \fB\-all\fR is specified, then ``&'' and ``\e\fIn\fR''
sequences are handled for each substitution using the information
from the corresponding match.
.TP 15
\fB\-expanded\fR
Enables use of the expanded regular expression syntax where
whitespace and comments are ignored.  This is the same as specifying
the \fB(?x)\fR embedded option (see METASYNTAX, below).
.TP 15
\fB\-line\fR
Enables newline-sensitive matching.  By default, newline is a
completely ordinary character with no special meaning.  With this
flag, `[^' bracket expressions and `.' never match newline, `^'
matches an empty string after any newline in addition to its normal
function, and `$' matches an empty string before any newline in
addition to its normal function.  This flag is equivalent to
specifying both \fB\-linestop\fR and \fB\-lineanchor\fR, or the
\fB(?n)\fR embedded option (see METASYNTAX, below).
.TP 15
\fB\-linestop\fR
Changes the behavior of `[^' bracket expressions and `.' so that they
stop at newlines.  This is the same as specifying the \fB(?p)\fR
embedded option (see METASYNTAX, below).
.TP 15
\fB\-lineanchor\fR
Changes the behavior of `^' and `$' (the ``anchors'') so they match the
beginning and end of a line respectively.  This is the same as
specifying the \fB(?w)\fR embedded option (see METASYNTAX, below).
.TP 10
\fB\-nocase\fR
Upper-case characters in \fIstring\fR will be converted to lower-case
before matching against \fIexp\fR;  however, substitutions specified
by \fIsubSpec\fR use the original unconverted form of \fIstring\fR.
.VS 8.3
.TP 10
\fB\-start\fR \fIindex\fR
Specifies a character index offset into the string to start
matching the regular expression at.  When using this switch, `^'
will not match the beginning of the line, and \\A will still
match the start of the string at \fIindex\fR.  If \fB\-indices\fR
match the start of the string at \fIindex\fR.
is specified, the indices will be indexed starting from the
absolute beginning of the input string.
\fIindex\fR will be constrained to the bounds of the input string.
.VE 8.3
.TP 10
\fB\-\|\-\fR
Marks the end of switches.  The argument following this one will
be treated as \fIexp\fR even if it starts with a \fB\-\fR.
.PP
The command returns a count of the number of matching ranges that
were found and replaced.
See the manual entry for \fBregexp\fR for details on the interpretation
of regular expressions.

.SH "SEE ALSO"
regexp(n), re_syntax(n)

.SH KEYWORDS
match, pattern, regular expression, substitute
Changes to doc/rename.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: rename.n,v 1.2 1998/09/14 18:39:54 stanton Exp $
'\" RCS: @(#) $Id: rename.n,v 1.2.18.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH rename n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
rename \- Rename or delete a command
24
25
26
27
28
29
30



31
32
24
25
26
27
28
29
30
31
32
33
34
35







+
+
+


If \fInewName\fR is an empty string then \fIoldName\fR is deleted.
\fIoldName\fR and \fInewName\fR may include namespace qualifiers
(names of containing namespaces).
If a command is renamed into a different namespace,
future invocations of it will execute in the new namespace.
The \fBrename\fR command returns an empty string as result.

.SH "SEE ALSO"
namespace(n), proc(n)

.SH KEYWORDS
command, delete, namespace, rename
Changes to doc/resource.n.
1
2
3
4
5
6

7
8
9
10
11
12
13
1
2
3
4
5

6
7
8
9
10
11
12
13





-
+







'\"
'\" Copyright (c) 1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" RCS: @(#) $Id: resource.n,v 1.5 1999/08/21 19:40:48 hobbs Exp $
'\" RCS: @(#) $Id: resource.n,v 1.5.2.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH resource n 8.0 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
resource \- Manipulate Macintosh resources
145
146
147
148
149
150
151
152

153
154
155
145
146
147
148
149
150
151

152
153
154
155







-
+



the \fBresource list\fR command will return names if they exist or
numbers if the name is NULL.

.SH "PORTABILITY ISSUES"
The resource command is only available on Macintosh.

.SH "SEE ALSO"
open
open(n)

.SH KEYWORDS
open, resource
Changes to doc/return.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: return.n,v 1.2 1998/09/14 18:39:54 stanton Exp $
'\" RCS: @(#) $Id: return.n,v 1.2.18.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH return n 7.0 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
return \- Return from a procedure
81
82
83
84
85
86
87



88
89
81
82
83
84
85
86
87
88
89
90
91
92







+
+
+


the procedure.
.PP
If the \fB\-errorcode\fR option is specified then \fIcode\fR provides
a value for the \fBerrorCode\fR variable.
If the option is not specified then \fBerrorCode\fR will
default to \fBNONE\fR.

.SH "SEE ALSO"
break(n), continue(n), error(n), proc(n)

.SH KEYWORDS
break, continue, error, procedure, return
Changes to doc/scan.n.
1
2
3

4
5
6
7
8

9
10
11
12
13
14
15
16
17

18
19
20
21
22
23
24
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



+




-
+








-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\" Copyright (c) 2000 Scriptics Corporation.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: scan.n,v 1.4 1999/11/19 06:33:59 hobbs Exp $
'\" RCS: @(#) $Id: scan.n,v 1.4.2.3 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH scan n 8.3 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
scan \- Parse string using conversion specifiers in the style of sscanf
.SH SYNOPSIS
\fBscan \fIstring format varName \fR?\fIvarName ...\fR?
\fBscan \fIstring format \fR?\fIvarName varName ...\fR?
.BE

.SH INTRODUCTION
.PP
This command parses fields from an input string in the same fashion as the
ANSI C \fBsscanf\fR procedure and returns a count of the number of
conversions performed, or -1 if the end of the input string is reached
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
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







-

-










-










-










+
+
+
+
+




-
+
+
+
+
+









-







zero).
Otherwise, if it isn't a \fB%\fR character then it 
must match the next character of \fIstring\fR.
When a \fB%\fR is encountered in \fIformat\fR, it indicates
the start of a conversion specifier.
A conversion specifier contains up to four fields after the \fB%\fR:
a \fB*\fR, which indicates that the converted value is to be discarded 
.VS 8.1
instead of assigned to a variable; a XPG3 position specifier; a number
.VE 8.1
indicating a maximum field width; and a conversion character.
All of these fields are optional except for the conversion character.
The fields that are present must appear in the order given above.
.PP
When \fBscan\fR finds a conversion specifier in \fIformat\fR, it
first skips any white-space characters in \fIstring\fR (unless the
specifier is \fB[\fR or \fBc\fR).
Then it converts the next input characters according to the 
conversion specifier and stores the result in the variable given
by the next argument to \fBscan\fR.
.VS 8.1
.PP
If the \fB%\fR is followed by a decimal number and a \fB$\fR, as in
``\fB%2$d\fR'', then the variable to use is not taken from the next
sequential argument.  Instead, it is taken from the argument indicated
by the number, where 1 corresponds to the first \fIvarName\fR.  If
there are any positional specifiers in \fIformat\fR then all of the
specifiers must be positional.  Every \fIvarName\fR on the argument
list must correspond to exactly one conversion specifier or an error
is generated, or in the inline case, any position can be specified
at most once and the empty positions will be filled in with empty strings.
.VE 8.1
.PP
The following conversion characters are supported:
.TP 10
\fBd\fR
The input field must be a decimal integer.
It is read in and the value is stored in the variable as a decimal string.
.TP 10
\fBo\fR
The input field must be an octal integer. It is read in and the 
value is stored in the variable as a decimal string.
.VS 8.4
If the value exceeds MAX_INT (017777777777 on platforms using 32-bit
integers), it will be truncated to a signed integer.  Hence, 037777777777
will appear as -1 on a 32-bit machine.
.VE 8.4
.TP 10
\fBx\fR
The input field must be a hexadecimal integer. It is read in 
and the value is stored in the variable as a decimal string.
.VS 8.1
.VS 8.4
If the value exceeds MAX_INT (0x7FFFFFFF on platforms using 32-bit
integers), it will be truncated to a signed integer.  Hence, 0xFFFFFFFF
will appear as -1 on a 32-bit machine.
.VE 8.4
.TP 10
\fBu\fR
The input field must be a decimal integer.  The value is stored in the
variable as an unsigned decimal integer string.
.TP 10
\fBi\fR 
The input field must be an integer.  The base (i.e. decimal, octal, or
hexadecimal) is determined in the same fashion as described in
\fBexpr\fR.  The value is stored in the variable as a decimal string.
.VE 8.1
.TP 10
\fBc\fR
A single character is read in and its binary value is stored in 
the variable as a decimal string.
Initial white space is not skipped in this case, so the input
field may be a white-space character.
This conversion is different from the ANSI standard in that the
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
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







-





-








-










-















-


-











-

+




+
+
+


\fB[\fIchars\fB]\fR
The input field consists of any number of characters in 
\fIchars\fR.
The matching string is stored in the variable.
If the first character between the brackets is a \fB]\fR then
it is treated as part of \fIchars\fR rather than the closing
bracket for the set.
.VS 8.1
If \fIchars\fR
contains a sequence of the form \fIa\fB\-\fIb\fR then any
character between \fIa\fR and \fIb\fR (inclusive) will match.
If the first or last character between the brackets is a \fB\-\fR, then
it is treated as part of \fIchars\fR rather than indicating a range.
.VE 8.1
.TP 10
\fB[^\fIchars\fB]\fR
The input field consists of any number of characters not in 
\fIchars\fR.
The matching string is stored in the variable.
If the character immediately following the \fB^\fR is a \fB]\fR then it is 
treated as part of the set rather than the closing bracket for 
the set.
.VS 8.1
If \fIchars\fR
contains a sequence of the form \fIa\fB\-\fIb\fR then any
character between \fIa\fR and \fIb\fR (inclusive) will be excluded
from the set.
If the first or last character between the brackets is a \fB\-\fR, then
it is treated as part of \fIchars\fR rather than indicating a range.
.TP 10
\fBn\fR
No input is consumed from the input string.  Instead, the total number
of chacters scanned from the input string so far is stored in the variable.
.VE 8.1
.LP
The number of characters read from the input for a conversion is the
largest number that makes sense for that particular conversion (e.g.
as many decimal digits as possible for \fB%d\fR, as 
many octal digits as possible for \fB%o\fR, and so on).
The input field for a given conversion terminates either when a
white-space character is encountered or when the maximum field 
width has been reached, whichever comes first.
If a \fB*\fR is present in the conversion specifier 
then no variable is assigned and the next scan argument is not consumed.

.SH "DIFFERENCES FROM ANSI SSCANF"
.PP
The behavior of the \fBscan\fR command is the same as the behavior of
the ANSI C \fBsscanf\fR procedure except for the following differences:
.VS 8.1
.IP [1]
\fB%p\fR conversion specifier is not currently supported.
.VE 8.1
.IP [2]
For \fB%c\fR conversions a single character value is
converted to a decimal string, which is then assigned to the
corresponding \fIvarName\fR;
no field width may be specified for this conversion.
.IP [3]
The \fBl\fR, \fBh\fR, and \fBL\fR modifiers are ignored;  integer
values are always converted as if there were no modifier present
and real values are always converted as if the \fBl\fR modifier
were present (i.e. type \fBdouble\fR is used for the internal
representation).
.VS 8.3
.IP [4]
.VS 8.3
If the end of the input string is reached before any conversions have been
performed and no variables are given, and empty string is returned.
.VE 8.3

.SH "SEE ALSO"
format(n), sscanf(3)

.SH KEYWORDS
conversion specifier, parse, scan
Changes to doc/seek.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: seek.n,v 1.3 1999/05/05 01:19:43 stanton Exp $
'\" RCS: @(#) $Id: seek.n,v 1.3.12.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH seek n 8.1 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
seek \- Change the access position for an open channel
53
54
55
56
57
58
59



60
61
53
54
55
56
57
58
59
60
61
62
63
64







+
+
+


.PP
.VS 8.1
Note that \fIoffset\fR values are byte offsets, not character
offsets.  Both \fBseek\fR and \fBtell\fR operate in terms of bytes,
not characters, unlike \fBread\fR.
.VE 8.1

.SH "SEE ALSO"
file(n), open(n), close(n), gets(n), tell(n)
 
.SH KEYWORDS
access position, file, seek
Changes to doc/set.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: set.n,v 1.2 1998/09/14 18:39:55 stanton Exp $
'\" RCS: @(#) $Id: set.n,v 1.2.18.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH set n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
set \- Read and write variables
40
41
42
43
44
45
46



47
48
40
41
42
43
44
45
46
47
48
49
50
51







+
+
+


(global variable if the current namespace is the global namespace).
If a procedure is active, then \fIvarName\fR refers to a parameter
or local variable of the procedure unless the \fBglobal\fR command
was invoked to declare \fIvarName\fR to be global,
or unless a \fBvariable\fR command
was invoked to declare \fIvarName\fR to be a namespace variable.

.SH "SEE ALSO"
expr(n), proc(n), trace(n), unset(n)

.SH KEYWORDS
read, write, variable
Changes to doc/split.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: split.n,v 1.2 1998/09/14 18:39:55 stanton Exp $
'\" RCS: @(#) $Id: split.n,v 1.2.18.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH split n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
split \- Split a string into a proper Tcl list
36
37
38
39
40
41
42



43
44
36
37
38
39
40
41
42
43
44
45
46
47







+
+
+


.CE
returns \fB"comp unix misc"\fR and
.CS
\fBsplit "Hello world" {}\fR
.CE
returns \fB"H e l l o { } w o r l d"\fR.

.SH "SEE ALSO"
join(n), list(n), string(n)

.SH KEYWORDS
list, split, string
Changes to doc/string.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: string.n,v 1.13 1999/12/21 23:57:34 hobbs Exp $
'\" RCS: @(#) $Id: string.n,v 1.13.2.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH string n 8.1 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
string \- Manipulate strings
330
331
332
333
334
335
336



337
338
330
331
332
333
334
335
336
337
338
339
340
341







+
+
+


character \fIcharIndex\fR of \fIstring\fR.  \fIcharIndex\fR may be
specified as for the \fBindex\fR method.  A word is considered to be any
contiguous range of alphanumeric (Unicode letters or decimal digits)
or underscore (Unicode connector punctuation) characters, or any
single character other than these.
.VE 8.1

.SH "SEE ALSO"
expr(n), list(n)

.SH KEYWORDS
case conversion, compare, index, match, pattern, string, word, equal, ctype
Changes to doc/subst.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1994 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: subst.n,v 1.2 1998/09/14 18:39:55 stanton Exp $
'\" RCS: @(#) $Id: subst.n,v 1.2.18.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH subst n 7.4 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
subst \- Perform backslash, command, and variable substitutions
39
40
41
42
43
44
45



46
47
48
39
40
41
42
43
44
45
46
47
48
49
50
51







+
+
+



give any special treatment to double quotes or curly braces.  For
example, the script
.CS
\fBset a 44
subst {xyz {$a}}\fR
.CE
returns ``\fBxyz {44}\fR'', not ``\fBxyz {$a}\fR''.

.SH "SEE ALSO"
eval(n)

.SH KEYWORDS
backslash substitution, command substitution, variable substitution
Changes to doc/switch.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: switch.n,v 1.4 1999/09/21 04:20:36 hobbs Exp $
'\" RCS: @(#) $Id: switch.n,v 1.4.2.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH switch n 7.0 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
switch \- Evaluate one of several scripts, depending on a given value
106
107
108
109
110
111
112



113
114
106
107
108
109
110
111
112
113
114
115
116
117







+
+
+


		{format 2}
	default
		{format 3}
}\fR
.CE
will return \fB3\fR.

.SH "SEE ALSO"
for(n), if(n), regexp(n)

.SH KEYWORDS
switch, match, regular expression
Changes to doc/tclsh.1.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: tclsh.1,v 1.3 1999/05/13 01:50:13 stanton Exp $
'\" RCS: @(#) $Id: tclsh.1,v 1.3.10.1 2001/08/24 16:19:09 dgp Exp $
'\" 
.so man.macros
.TH tclsh 1 "" Tcl "Tcl Applications"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
tclsh \- Simple shell containing Tcl interpreter
76
77
78
79
80
81
82








83
84
85
86
87
88
89
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97







+
+
+
+
+
+
+
+







\fBsh\fR processes the script first;  it treats the second
line as a comment and executes the third line.
The \fBexec\fR statement cause the shell to stop processing and
instead to start up \fBtclsh\fR to reprocess the entire script.
When \fBtclsh\fR starts up, it treats all three lines as comments,
since the backslash at the end of the second line causes the third
line to be treated as part of the comment on the second line.
.PP
.VS
You should note that it is also common practise to install tclsh with
its version number as part of the name.  This has the advantage of
allowing multiple versions of Tcl to exist on the same system at once,
but also the disadvantage of making it harder to write scripts that
start up uniformly across different versions of Tcl.
.VE

.SH "VARIABLES"
.PP
\fBTclsh\fR sets the following Tcl variables:
.TP 15
\fBargc\fR
Contains a count of the number of \fIarg\fR arguments (0 if none),
Changes to doc/tcltest.n.
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
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








-
+














-
+







'\"
'\" Copyright (c) 1990-1994 The Regents of the University of California
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\" Copyright (c) 1998-1999 Scriptics Corporation
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: tcltest.n,v 1.9 1999/12/22 00:41:13 hobbs Exp $
'\" RCS: @(#) $Id: tcltest.n,v 1.9.2.2 2002/04/04 05:32:26 hobbs Exp $
'\" 
.so man.macros
.TH "Tcltest" n 8.2 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
Tcltest \- Test harness support code and utilities
.SH SYNOPSIS
\fBpackage require tcltest ?1.0?\fP
.sp
\fB::tcltest::test \fIname desc ?constraint? script expectedAnswer\fR
.sp
\fB::tcltest::cleanupTests \fI?runningMultipleTests?\fR
.sp
\fB::tcltest::getMatchingTestFiles\fR
\fB::tcltest::getMatchingFiles\fR
.sp
\fB::tcltest::loadTestedCommands\fR
.sp
\fB::tcltest::makeFile \fIcontents name\fR
.sp
\fB::tcltest::removeFile \fIname\fR
.sp
89
90
91
92
93
94
95
96

97
98
99
100
101
102
103
89
90
91
92
93
94
95

96
97
98
99
100
101
102
103







-
+







also restores the original shell environment, as described by the ::env
array. \fIcalledFromAll\fR should be specified when
\fB::tcltest::cleanupTests\fR is called from an "all.tcl" file.  Tcl files
files are generally used to run multiple tests.  For more details on how to
run multiple tests, please see the section \fI"Running test files"\fR.
This proc has no defined return value.
.TP
\fB::tcltest::getMatchingTestFiles\fP
\fB::tcltest::getMatchingFiles\fP
This command is used when you want to run multiple test files.  It returns
the list of tests that should be sourced in an 'all.tcl' file.  See the
section \fI"Running test files"\fR for more information.
.TP
\fB::tcltest::loadTestedCommands\fP
This command uses the script specified via the \fI-load\fR or
\fI-loadfile\fR to load the commands checked by the test suite.
731
732
733
734
735
736
737
738

739
740
741
742
743
744
745
731
732
733
734
735
736
737

738
739
740
741
742
743
744
745







-
+







    package require tcltest
    namespace import ::tcltest::*
}

set ::tcltest::testSingleFile false
set ::tcltest::testsDirectory [file dir [info script]]

foreach file [::tcltest::getMatchingTestFiles] {
foreach file [::tcltest::getMatchingFiles] {
    if {[catch {source $file} msg]} {
        puts stdout $msg
    }
}

::tclttest::cleanupTests 1
return
Changes to doc/tclvars.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: tclvars.n,v 1.7 2000/01/21 02:25:06 hobbs Exp $
'\" RCS: @(#) $Id: tclvars.n,v 1.7.2.2 2001/10/17 19:29:24 das Exp $
'\" 
.so man.macros
.TH tclvars n 8.0 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
tclvars \- Variables used by Tcl
83
84
85
86
87
88
89
90

91
92
93
94
95
96
97
83
84
85
86
87
88
89

90
91
92
93
94
95
96
97







-
+







.TP
\fBTRASH_FOLDER\fR
The path to the trash directory.
.TP
\fBSTART_UP_FOLDER\fR
The path to the start up directory.
.TP
\fBPWD\fR
\fBHOME\fR
The path to the application's default directory.
.PP
You can also create your own environment variables for the Macintosh.
A file named  \fITcl Environment Variables\fR may be placed in the
preferences folder in the Mac system folder.  Each line of this file
should be of the form \fIVAR_NAME=var_data\fR.
.PP
389
390
391
392
393
394
395



396
397
398
389
390
391
392
393
394
395
396
397
398
399
400
401







+
+
+



When an interpreter is created Tcl initializes this variable to
hold the version number for this version of Tcl in the form \fIx.y\fR.
Changes to \fIx\fR represent major changes with probable
incompatibilities and changes to \fIy\fR represent small enhancements and
bug fixes that retain backward compatibility.
The value of this variable is returned by the \fBinfo tclversion\fR
command.

.SH "SEE ALSO"
eval(n)

.SH KEYWORDS
arithmetic, bytecode, compiler, error, environment, POSIX, precision, subprocess, variables
Changes to doc/tell.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: tell.n,v 1.3 1999/05/05 01:19:43 stanton Exp $
'\" RCS: @(#) $Id: tell.n,v 1.3.12.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH tell n 8.1 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
tell \- Return current access position for an open channel
24
25
26
27
28
29
30



31
32
24
25
26
27
28
29
30
31
32
33
34
35







+
+
+


\fIchannelId\fR.  This value returned is a byte offset that can be passed to
\fBseek\fR in order to set the channel to a particular position.  Note
that this value is in terms of bytes, not characters like \fBread\fR.
.VE 8.1
The value returned is -1 for channels that do not support
seeking.

.SH "SEE ALSO"
file(n), open(n), close(n), gets(n), seek(n)

.SH KEYWORDS
access position, channel, seeking
Changes to doc/time.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: time.n,v 1.2 1998/09/14 18:39:56 stanton Exp $
'\" RCS: @(#) $Id: time.n,v 1.2.18.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH time n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
time \- Time the execution of a script
24
25
26
27
28
29
30



31
32
33
24
25
26
27
28
29
30
31
32
33
34
35
36







+
+
+



specified).  It will then return a string of the form
.CS
\fB503 microseconds per iteration\fR
.CE
which indicates the average amount of time required per iteration,
in microseconds.
Time is measured in elapsed time, not CPU time.

.SH "SEE ALSO"
clock(n)

.SH KEYWORDS
script, time
Changes to doc/unknown.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: unknown.n,v 1.2 1998/09/14 18:39:56 stanton Exp $
'\" RCS: @(#) $Id: unknown.n,v 1.2.18.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH unknown n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
unknown \- Handle attempts to use non-existent commands
67
68
69
70
71
72
73



74
75
67
68
69
70
71
72
73
74
75
76
77
78







+
+
+


step is skipped.
If the global variable \fBauto_noexec\fR is defined then the
auto-exec step is skipped.
Under normal circumstances the return value from \fBunknown\fR
is the return value from the command that was eventually
executed.

.SH "SEE ALSO"
info(n), proc(n)

.SH KEYWORDS
error, non-existent command
Changes to doc/update.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1990-1992 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: update.n,v 1.3 2000/04/14 06:42:32 hobbs Exp $
'\" RCS: @(#) $Id: update.n,v 1.3.2.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH update n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
update \- Process pending events and idle callbacks
40
41
42
43
44
45
46



47
48
40
41
42
43
44
45
46
47
48
49
50
51







+
+
+


.PP
The \fBupdate\fR command with no options is useful in scripts where
you are performing a long-running computation but you still want
the application to respond to events such as user interactions;  if
you occasionally call \fBupdate\fR then user input will be processed
during the next call to \fBupdate\fR.

.SH "SEE ALSO"
after(n), bgerror(n)

.SH KEYWORDS
event, flush, handler, idle, update
Changes to doc/uplevel.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: uplevel.n,v 1.2 1998/09/14 18:39:56 stanton Exp $
'\" RCS: @(#) $Id: uplevel.n,v 1.2.18.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH uplevel n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
uplevel \- Execute a script in a different stack frame
70
71
72
73
74
75
76
77

78
79
80
70
71
72
73
74
75
76

77
78
79
80







-
+



For example, \fBinfo level 1\fR will return a list
describing a command that is either
the outermost procedure call or the outermost \fBnamespace eval\fR command.
Also, \fBuplevel #0\fR evaluates a script
at top-level in the outermost namespace (the global namespace).

.SH "SEE ALSO"
namespace(n)
namespace(n), upvar(n)

.SH KEYWORDS
context, level, namespace, stack frame, variables
Changes to doc/upvar.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: upvar.n,v 1.3 2000/01/21 03:29:13 ericm Exp $
'\" RCS: @(#) $Id: upvar.n,v 1.3.2.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH upvar n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
upvar \- Create link to variable in a different stack frame
102
103
104
105
106
107
108
109

110
111
112
102
103
104
105
106
107
108

109
110
111
112







-
+



traces set for the entire array will not be invoked when \fImyVar\fR
is accessed (but traces on the particular element will still be
invoked).  In particular, if the array is \fBenv\fR, then changes
made to \fImyVar\fR will not be passed to subprocesses correctly.
.VE

.SH "SEE ALSO"
namespace(n)
global(n), namespace(n), uplevel(n), variable(n)

.SH KEYWORDS
context, frame, global, level, namespace, procedure, variable
Changes to doc/variable.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993-1997 Bell Labs Innovations for Lucent Technologies
'\" Copyright (c) 1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: variable.n,v 1.3 2000/01/26 21:36:35 ericm Exp $
'\" RCS: @(#) $Id: variable.n,v 1.3.2.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH variable n 8.0 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
variable \- create and initialize a namespace variable
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
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







-
+
+
















-
+



If \fIname\fR includes any namespace qualifiers,
the variable is created in the specified namespace.  If the variable
is not defined, it will be visible to the \fBnamespace which\fR
command, but not to the \fBinfo exists\fR command.
.PP
If the \fBvariable\fR command is executed inside a Tcl procedure,
it creates local variables
linked to the corresponding namespace variables.
linked to the corresponding namespace variables (and therefore these
variables are listed by \fBinfo locals\fR.)
In this way the \fBvariable\fR command resembles the \fBglobal\fR command,
although the \fBglobal\fR command
only links to variables in the global namespace.
If any \fIvalue\fRs are given,
they are used to modify the values of the associated namespace variables.
If a namespace variable does not exist,
it is created and optionally initialized.
.PP
A \fIname\fR argument cannot reference an element within an array.
Instead, \fIname\fR should reference the entire array,
and the initialization \fIvalue\fR should be left off.
After the variable has been declared,
elements within the array can be set using ordinary
\fBset\fR or \fBarray\fR commands.

.SH "SEE ALSO"
global(n), namespace(n)
global(n), namespace(n), upvar(n)

.SH KEYWORDS
global, namespace, procedure, variable
Changes to doc/vwait.n.
1
2
3
4
5
6
7

8
9
10
11
12
13
14
1
2
3
4
5
6

7
8
9
10
11
12
13
14






-
+







'\"
'\" Copyright (c) 1995-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: vwait.n,v 1.3 2000/01/21 02:25:06 hobbs Exp $
'\" RCS: @(#) $Id: vwait.n,v 1.3.2.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH vwait n 8.0 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
vwait \- Process events until a variable is written
31
32
33
34
35
36
37



38
39
40
31
32
33
34
35
36
37
38
39
40
41
42
43







+
+
+



after \fIvarName\fR is set.  This can happen if the event handler
that sets \fIvarName\fR does not complete immediately.  For example,
if an event handler sets \fIvarName\fR and then itself calls
\fBvwait\fR to wait for a different variable, then it may not return
for a long time.  During this time the top-level \fBvwait\fR is
blocked waiting for the event handler to complete, so it cannot
return either.

.SH "SEE ALSO"
global(n)

.SH KEYWORDS
event, variable, wait
Changes to doc/while.n.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: while.n,v 1.2 1998/09/14 18:39:56 stanton Exp $
'\" RCS: @(#) $Id: while.n,v 1.2.18.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH while n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
while \- Execute script repeatedly as long as a condition is met
47
48
49
50
51
52
53



54
55
47
48
49
50
51
52
53
54
55
56
57
58







+
+
+


set x 0
while {$x<10} {
	puts "x is $x"
	incr x
}
.CE

.SH "SEE ALSO"
break(n), continue(n), for(n), foreach(n)

.SH KEYWORDS
boolean value, loop, test, while
Changes to generic/tcl.decls.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







# tcl.decls --
#
#	This file contains the declarations for all supported public
#	functions that are exported by the Tcl library via the stubs table.
#	This file is used to generate the tclDecls.h, tclPlatDecls.h,
#	tclStub.c, and tclPlatStub.c files.
#	
#
# Copyright (c) 1998-1999 by Scriptics Corporation.
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
# 
# RCS: @(#) $Id: tcl.decls,v 1.33 2000/04/09 16:04:17 kupries Exp $
# RCS: @(#) $Id: tcl.decls,v 1.33.2.2 2001/08/28 00:12:43 hobbs Exp $

library tcl

# Define the tcl interface with several sub interfaces:
#     tclPlat	 - platform specific public
#     tclInt	 - generic private
#     tclPlatInt - platform specific private
983
984
985
986
987
988
989
990

991
992
993
994
995
996
997







998
999
1000
1001
1002
1003
1004
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







-
+




-
-
-
+
+
+
+
+
+
+








declare 281 generic {
    Tcl_Channel Tcl_StackChannel(Tcl_Interp *interp, \
	    Tcl_ChannelType *typePtr, ClientData instanceData, \
	    int mask, Tcl_Channel prevChan)
}
declare 282 generic {
    void Tcl_UnstackChannel(Tcl_Interp *interp, Tcl_Channel chan)
    int Tcl_UnstackChannel(Tcl_Interp *interp, Tcl_Channel chan)
}
declare 283 generic {
    Tcl_Channel Tcl_GetStackedChannel(Tcl_Channel chan)
}
# Reserved for future use (8.0.x vs. 8.1)
#  declare 284 generic {
#  }

# added in 8.3.4/8.4a2
declare 284 generic {
    void Tcl_SetMainLoop(Tcl_MainLoopProc *proc)
}

# Reserved for future use (8.0.x vs. 8.1)
#  declare 285 generic {
#  }


# Added in 8.1:

declare 286 generic {
1353
1354
1355
1356
1357
1358
1359


































































































































































































































































































1360
1361
1362
1363
1364
1365
1366
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







declare 392 generic {
    void Tcl_MutexFinalize (Tcl_Mutex *mutex)
}
declare 393 generic {
    int Tcl_CreateThread (Tcl_ThreadId *idPtr, Tcl_ThreadCreateProc proc, \
	    ClientData clientData, int stackSize, int flags)
}

declare 394 generic {
    int Tcl_ReadRaw (Tcl_Channel chan, char *dst, int bytesToRead)
}
declare 395 generic {
    int Tcl_WriteRaw (Tcl_Channel chan, char *src, int srcLen)
}
declare 396 generic {
    Tcl_Channel Tcl_GetTopChannel (Tcl_Channel chan)
}
declare 397 generic {
    int Tcl_ChannelBuffered (Tcl_Channel chan)
}
declare 398 generic {
    char * Tcl_ChannelName(Tcl_ChannelType *chanTypePtr)
}
declare 399 generic {
    Tcl_ChannelTypeVersion Tcl_ChannelVersion(Tcl_ChannelType *chanTypePtr)
}
declare 400 generic {
    Tcl_DriverBlockModeProc * Tcl_ChannelBlockModeProc(Tcl_ChannelType \
	    *chanTypePtr)
}
declare 401 generic {
    Tcl_DriverCloseProc * Tcl_ChannelCloseProc(Tcl_ChannelType *chanTypePtr)
}
declare 402 generic {
    Tcl_DriverClose2Proc * Tcl_ChannelClose2Proc(Tcl_ChannelType *chanTypePtr)
}
declare 403 generic {
    Tcl_DriverInputProc * Tcl_ChannelInputProc(Tcl_ChannelType *chanTypePtr)
}
declare 404 generic {
    Tcl_DriverOutputProc * Tcl_ChannelOutputProc(Tcl_ChannelType *chanTypePtr)
}
declare 405 generic {
    Tcl_DriverSeekProc * Tcl_ChannelSeekProc(Tcl_ChannelType *chanTypePtr)
}
declare 406 generic {
    Tcl_DriverSetOptionProc * Tcl_ChannelSetOptionProc(Tcl_ChannelType \
	    *chanTypePtr)
}
declare 407 generic {
    Tcl_DriverGetOptionProc * Tcl_ChannelGetOptionProc(Tcl_ChannelType \
	    *chanTypePtr)
}
declare 408 generic {
    Tcl_DriverWatchProc * Tcl_ChannelWatchProc(Tcl_ChannelType *chanTypePtr)
}
declare 409 generic {
    Tcl_DriverGetHandleProc * Tcl_ChannelGetHandleProc(Tcl_ChannelType \
	    *chanTypePtr)
}
declare 410 generic {
    Tcl_DriverFlushProc * Tcl_ChannelFlushProc(Tcl_ChannelType *chanTypePtr)
}
declare 411 generic {
    Tcl_DriverHandlerProc * Tcl_ChannelHandlerProc(Tcl_ChannelType \
	    *chanTypePtr)
}

## Introduced in 8.4a2
#declare 412 generic {
#    int Tcl_JoinThread (Tcl_ThreadId id, int* result)
#}
#declare 413 generic {
#    int Tcl_IsChannelShared (Tcl_Channel channel)
#}
#declare 414 generic {
#    int Tcl_IsChannelRegistered (Tcl_Interp* interp, Tcl_Channel channel)
#}
#declare 415 generic {
#    void Tcl_CutChannel (Tcl_Channel channel)
#}
#declare 416 generic {
#    void Tcl_SpliceChannel (Tcl_Channel channel)
#}
#declare 417 generic {
#    void Tcl_ClearChannelHandlers (Tcl_Channel channel)
#}
#declare 418 generic {
#    int Tcl_IsChannelExisting (CONST char* channelName)
#}
#
#declare 419 generic {
#    int Tcl_UniCharNcasecmp(CONST Tcl_UniChar *cs, CONST Tcl_UniChar *ct,\
#	   unsigned long n)
#}
#declare 420 generic {
#    int Tcl_UniCharCaseMatch(CONST Tcl_UniChar *ustr, \
#	   CONST Tcl_UniChar *pattern, int nocase)
#}
#
#declare 421 generic {
#    Tcl_HashEntry *Tcl_FindHashEntry(Tcl_HashTable *tablePtr, \
#	   CONST char *key)
#}
#
#declare 422 generic {
#    Tcl_HashEntry *Tcl_CreateHashEntry(Tcl_HashTable *tablePtr, \
#	   CONST char *key, int *newPtr)
#}
#
#declare 423 generic {
#    void Tcl_InitCustomHashTable(Tcl_HashTable *tablePtr, int keyType, \
#	   Tcl_HashKeyType *typePtr)
#}
#
#declare 424 generic {
#    void Tcl_InitObjHashTable(Tcl_HashTable *tablePtr)
#}
#declare 425 generic {
#    ClientData Tcl_CommandTraceInfo(Tcl_Interp *interp, char *varName, \
#	   int flags, Tcl_CommandTraceProc *procPtr, ClientData prevClientData)
#}
#declare 426 generic {
#    int Tcl_TraceCommand(Tcl_Interp *interp, char *varName, int flags, \
#	       Tcl_CommandTraceProc *proc, ClientData clientData)
#}
#declare 427 generic {
#    void Tcl_UntraceCommand(Tcl_Interp *interp, char *varName, int flags, \
#	       Tcl_CommandTraceProc *proc, ClientData clientData)
#}
#declare 428 generic {
#    char * Tcl_AttemptAlloc(unsigned int size)
#}
#declare 429 generic {
#    char * Tcl_AttemptDbCkalloc(unsigned int size, char *file, int line)
#}
#declare 430 generic {
#    char * Tcl_AttemptRealloc(char *ptr, unsigned int size)
#}
#declare 431 generic {
#    char * Tcl_AttemptDbCkrealloc(char *ptr, unsigned int size, char *file, 
#      int line)
#}
#declare 432 generic {
#    int Tcl_AttemptSetObjLength(Tcl_Obj *objPtr, int length)
#}
#declare 433 generic {
#    Tcl_ThreadId Tcl_GetChannelThread(Tcl_Channel channel)
#}

## introduced in 8.4a3
#declare 434 generic {
#    Tcl_UniChar * Tcl_GetUnicodeFromObj (Tcl_Obj *objPtr, int *lengthPtr)
#}
#declare 435 generic {
#    int Tcl_GetMathFuncInfo(Tcl_Interp *interp, CONST char *name,
#      int *numArgsPtr, Tcl_ValueType **argTypesPtr,
#      Tcl_MathProc **procPtr, ClientData *clientDataPtr)
#}
#declare 436 generic {
#    Tcl_Obj * Tcl_ListMathFuncs(Tcl_Interp *interp, CONST char *pattern)
#}
#declare 437 generic {
#    Tcl_Obj * Tcl_SubstObj(Tcl_Interp *interp, Tcl_Obj *objPtr, int flags)
#}
#declare 438 generic {
#    int Tcl_DetachChannel(Tcl_Interp* interp, Tcl_Channel channel)
#}
#declare 439 generic {
#    int Tcl_IsStandardChannel(Tcl_Channel channel)
#}
#declare 440 generic {
#    int       Tcl_FSCopyFile(Tcl_Obj *srcPathPtr, Tcl_Obj *destPathPtr)
#}
#declare 441 generic {
#    int       Tcl_FSCopyDirectory(Tcl_Obj *srcPathPtr, \
#			   Tcl_Obj *destPathPtr, Tcl_Obj **errorPtr)
#}
#declare 442 generic {
#    int       Tcl_FSCreateDirectory(Tcl_Obj *pathPtr)
#}
#declare 443 generic {
#    int       Tcl_FSDeleteFile(Tcl_Obj *pathPtr)
#}
#declare 444 generic {
#    int       Tcl_FSLoadFile(Tcl_Interp * interp, \
#		   Tcl_Obj *pathPtr, char * sym1, char * sym2, \
#		   Tcl_PackageInitProc ** proc1Ptr, \
#		   Tcl_PackageInitProc ** proc2Ptr, \
#		   ClientData * clientDataPtr, \
#		   Tcl_FSUnloadFileProc **unloadProcPtr)
#}
#declare 445 generic {
#    int       Tcl_FSMatchInDirectory(Tcl_Interp *interp, Tcl_Obj * result, \
#		   Tcl_Obj *pathPtr, \
#		   char * pattern, Tcl_GlobTypeData * types)
#}
#declare 446 generic {
#    Tcl_Obj*  Tcl_FSLink(Tcl_Obj *pathPtr, Tcl_Obj *toPtr)
#}
#declare 447 generic {
#    int       Tcl_FSRemoveDirectory(Tcl_Obj *pathPtr, \
#		   int recursive, Tcl_Obj **errorPtr)
#}
#declare 448 generic {
#    int       Tcl_FSRenameFile(Tcl_Obj *srcPathPtr, Tcl_Obj *destPathPtr)
#}
#declare 449 generic {
#    int       Tcl_FSLstat(Tcl_Obj *pathPtr, struct stat *buf)
#}
#declare 450 generic {
#    int Tcl_FSUtime(Tcl_Obj *pathPtr, struct utimbuf *tval)
#}
#declare 451 generic {
#    int Tcl_FSFileAttrsGet(Tcl_Interp *interp, \
#			   int index, Tcl_Obj *pathPtr, \
#			   Tcl_Obj **objPtrRef)
#}
#declare 452 generic {
#    int Tcl_FSFileAttrsSet(Tcl_Interp *interp, \
#			   int index, Tcl_Obj *pathPtr, \
#			   Tcl_Obj *objPtr)
#}
#declare 453 generic {
#    char** Tcl_FSFileAttrStrings(Tcl_Obj *pathPtr, Tcl_Obj **objPtrRef)
#}
#declare 454 generic {
#    int Tcl_FSStat(Tcl_Obj *pathPtr, struct stat *buf)
#}
#declare 455 generic {
#    int Tcl_FSAccess(Tcl_Obj *pathPtr, int mode)
#}
#declare 456 generic {
#    Tcl_Channel Tcl_FSOpenFileChannel(Tcl_Interp *interp, Tcl_Obj *pathPtr, \
#	   char *modeString, int permissions)
#}
#declare 457 generic {
#    Tcl_Obj*  Tcl_FSGetCwd(Tcl_Interp *interp)
#}
#declare 458 generic {
#    int Tcl_FSChdir(Tcl_Obj *pathPtr)
#}
#declare 459 generic {
#    int Tcl_FSConvertToPathType(Tcl_Interp *interp, Tcl_Obj *pathPtr)
#}
#declare 460 generic {
#    Tcl_Obj* Tcl_FSJoinPath(Tcl_Obj *listObj, int elements)
#}
#declare 461 generic {
#    Tcl_Obj* Tcl_FSSplitPath(Tcl_Obj* pathPtr, int *lenPtr)
#}
#declare 462 generic {
#    int Tcl_FSEqualPaths(Tcl_Obj* firstPtr, Tcl_Obj* secondPtr)
#}
#declare 463 generic {
#    Tcl_Obj* Tcl_FSGetNormalizedPath(Tcl_Interp *interp, Tcl_Obj* pathObjPtr)
#}
#declare 464 generic {
#    Tcl_Obj* Tcl_FSJoinToPath(Tcl_Obj *basePtr, int objc, Tcl_Obj *CONST objv[])
#}
#declare 465 generic {
#    ClientData Tcl_FSGetInternalRep(Tcl_Obj* pathObjPtr, Tcl_Filesystem *fsPtr
#
#}
#declare 466 generic {
#    Tcl_Obj* Tcl_FSGetTranslatedPath(Tcl_Interp *interp, Tcl_Obj* pathPtr)
#}
#declare 467 generic {
#    int Tcl_FSEvalFile(Tcl_Interp *interp, Tcl_Obj *fileName)
#}
#declare 468 generic {
#    Tcl_Obj* Tcl_FSNewNativePath(Tcl_Obj* fromFilesystem, ClientData clientData)
#}
#declare 469 generic {
#    char* Tcl_FSGetNativePath(Tcl_Obj* pathObjPtr)
#}
#declare 470 generic {
#    Tcl_Obj* Tcl_FSFileSystemInfo(Tcl_Obj* pathObjPtr)
#}
#declare 471 generic {
#    Tcl_Obj* Tcl_FSPathSeparator(Tcl_Obj* pathObjPtr)
#}
#declare 472 generic {
#    Tcl_Obj* Tcl_FSListVolumes(void)
#}
#declare 473 generic {
#    int Tcl_FSRegister(ClientData clientData, Tcl_Filesystem *fsPtr)
#}
#declare 474 generic {
#    int Tcl_FSUnregister(Tcl_Filesystem *fsPtr)
#}
#declare 475 generic {
#    ClientData Tcl_FSData(Tcl_Filesystem *fsPtr)
#}
#declare 476 generic {
#    char* Tcl_FSGetTranslatedStringPath(Tcl_Interp *interp, Tcl_Obj* pathPtr)
#}

##############################################################################

# Define the platform specific public Tcl interface.  These functions are
# only available on the designated platform.

interface tclPlat
Changes to generic/tcl.h.
8
9
10
11
12
13
14
15

16
17
18
19
20
21
22
8
9
10
11
12
13
14

15
16
17
18
19
20
21
22







-
+







 * Copyright (c) 1993-1996 Lucent Technologies.
 * Copyright (c) 1994-1998 Sun Microsystems, Inc.
 * Copyright (c) 1998-2000 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tcl.h,v 1.70 2000/04/19 08:32:44 hobbs Exp $
 * RCS: @(#) $Id: tcl.h,v 1.70.2.9 2001/10/17 19:29:24 das Exp $
 */

#ifndef _TCL
#define _TCL

/*
 * For C++ compilers, use extern "C"
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
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







-
+


-
+







-
+

+
+
+

















-
-
-
-
-
-
-
-








+







 * tools/tcl.wse.in	(for windows installer)
 * tools/tclSplash.bmp	(not patchlevel)
 */

#define TCL_MAJOR_VERSION   8
#define TCL_MINOR_VERSION   3
#define TCL_RELEASE_LEVEL   TCL_FINAL_RELEASE
#define TCL_RELEASE_SERIAL  1
#define TCL_RELEASE_SERIAL  4

#define TCL_VERSION	    "8.3"
#define TCL_PATCH_LEVEL	    "8.3.1"
#define TCL_PATCH_LEVEL	    "8.3.4"

/*
 * The following definitions set up the proper options for Windows
 * compilers.  We use this method because there is no autoconf equivalent.
 */

#ifndef __WIN32__
#   if defined(_WIN32) || defined(WIN32)
#   if defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__BORLANDC__)
#	define __WIN32__
#	ifndef WIN32
#	    define WIN32
#	endif
#   endif
#endif

#ifdef __WIN32__
#   ifndef STRICT
#	define STRICT
#   endif
#   ifndef USE_PROTOTYPE
#	define USE_PROTOTYPE 1
#   endif
#   ifndef HAS_STDARG
#	define HAS_STDARG 1
#   endif
#   ifndef USE_PROTOTYPE
#	define USE_PROTOTYPE 1
#   endif

/*
 * Under Windows we need to call Tcl_Alloc in all cases to avoid competing
 * C run-time library issues.
 */

#   ifndef USE_TCLALLOC
#	define USE_TCLALLOC 1
#   endif
#endif /* __WIN32__ */

/*
 * The following definitions set up the proper options for Macintosh
 * compilers.  We use this method because there is no autoconf equivalent.
 */

#ifdef MAC_TCL
#include <ConditionalMacros.h>
#   ifndef HAS_STDARG
#	define HAS_STDARG 1
#   endif
#   ifndef USE_TCLALLOC
#	define USE_TCLALLOC 1
#   endif
#   ifndef NO_STRERROR
221
222
223
224
225
226
227
228

229
230
231
232
233
234
235
217
218
219
220
221
222
223

224
225
226
227
228
229
230
231







-
+







 * macro STATIC_BUILD should be defined.
 */

#ifdef STATIC_BUILD
# define DLLIMPORT
# define DLLEXPORT
#else
# if defined(__WIN32__) && (defined(_MSC_VER) || (defined(__GNUC__) && defined(__declspec)))
# if (defined(__WIN32__) && (defined(_MSC_VER) || (defined(__GNUC__) && defined(__declspec)))) || (defined(MAC_TCL) && FUNCTION_DECLSPEC)
#   define DLLIMPORT __declspec(dllimport)
#   define DLLEXPORT __declspec(dllexport)
# else
#  define DLLIMPORT
#  define DLLEXPORT
# endif
#endif
243
244
245
246
247
248
249
250

251
252
253
254
255
256
257
239
240
241
242
243
244
245

246
247
248
249
250
251
252
253







-
+







 * class.  If the symbol is beind declared for a static build or for use from a
 * stub library, then the storage class should be empty.
 *
 * The convention is that a macro called BUILD_xxxx, where xxxx is the
 * name of a library we are building, is set on the compile line for sources
 * that are to be placed in the library.  When this macro is set, the
 * storage class will be set to DLLEXPORT.  At the end of the header file, the
 * storage class will be reset to DLLIMPORt.
 * storage class will be reset to DLLIMPORT.
 */

#undef TCL_STORAGE_CLASS
#ifdef BUILD_tcl
# define TCL_STORAGE_CLASS DLLEXPORT
#else
# ifdef USE_TCL_STUBS
382
383
384
385
386
387
388

389
390
391
392
393
394
395
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392







+







typedef struct Tcl_Pid_ *Tcl_Pid;
typedef struct Tcl_RegExp_ *Tcl_RegExp;
typedef struct Tcl_ThreadDataKey_ *Tcl_ThreadDataKey;
typedef struct Tcl_ThreadId_ *Tcl_ThreadId;
typedef struct Tcl_TimerToken_ *Tcl_TimerToken;
typedef struct Tcl_Trace_ *Tcl_Trace;
typedef struct Tcl_Var_ *Tcl_Var;
typedef struct Tcl_ChannelTypeVersion_ *Tcl_ChannelTypeVersion;

/*
 * Definition of the interface to procedures implementing threads.
 * A procedure following this definition is given to each call of
 * 'Tcl_CreateThread' and will be called as the main fuction of
 * the new thread created by that call.
 */
580
581
582
583
584
585
586
587

588
589
590
591
592
593
594
595
596
597
598
599
600

601
602
603
604
605
606
607
577
578
579
580
581
582
583

584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605







-
+













+







typedef void (Tcl_IdleProc) _ANSI_ARGS_((ClientData clientData));
typedef void (Tcl_InterpDeleteProc) _ANSI_ARGS_((ClientData clientData,
	Tcl_Interp *interp));
typedef int (Tcl_MathProc) _ANSI_ARGS_((ClientData clientData,
	Tcl_Interp *interp, Tcl_Value *args, Tcl_Value *resultPtr));
typedef void (Tcl_NamespaceDeleteProc) _ANSI_ARGS_((ClientData clientData));
typedef int (Tcl_ObjCmdProc) _ANSI_ARGS_((ClientData clientData,
	Tcl_Interp *interp, int objc, struct Tcl_Obj *CONST objv[]));
	Tcl_Interp *interp, int objc, struct Tcl_Obj * CONST * objv));
typedef int (Tcl_PackageInitProc) _ANSI_ARGS_((Tcl_Interp *interp));
typedef void (Tcl_PanicProc) _ANSI_ARGS_(TCL_VARARGS(char *, format));
typedef void (Tcl_TcpAcceptProc) _ANSI_ARGS_((ClientData callbackData,
        Tcl_Channel chan, char *address, int port));
typedef void (Tcl_TimerProc) _ANSI_ARGS_((ClientData clientData));
typedef int (Tcl_SetFromAnyProc) _ANSI_ARGS_((Tcl_Interp *interp,
	struct Tcl_Obj *objPtr));
typedef void (Tcl_UpdateStringProc) _ANSI_ARGS_((struct Tcl_Obj *objPtr));
typedef char *(Tcl_VarTraceProc) _ANSI_ARGS_((ClientData clientData,
	Tcl_Interp *interp, char *part1, char *part2, int flags));
typedef void (Tcl_CreateFileHandlerProc) _ANSI_ARGS_((int fd, int mask,
	Tcl_FileProc *proc, ClientData clientData));
typedef void (Tcl_DeleteFileHandlerProc) _ANSI_ARGS_((int fd));
typedef void (Tcl_MainLoopProc) _ANSI_ARGS_((void));

/*
 * The following structure represents a type of object, which is a
 * particular internal representation for an object plus a set of
 * procedures that provide standard operations on objects of that type.
 */

1136
1137
1138
1139
1140
1141
1142
1143

1144
1145
1146
1147
1148
1149
1150
1151







1152
1153
1154
1155
1156
1157
1158
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







-
+








+
+
+
+
+
+
+








/*
 * Bits passed to Tcl_DriverClose2Proc to indicate which side of a channel
 * should be closed.
 */

#define TCL_CLOSE_READ		(1<<1)
#define TCL_CLOSE_WRITE	(1<<2)
#define TCL_CLOSE_WRITE		(1<<2)

/*
 * Value to use as the closeProc for a channel that supports the
 * close2Proc interface.
 */

#define TCL_CLOSE2PROC	((Tcl_DriverCloseProc *)1)

/*
 * Channel version tag.  This was introduced in 8.3.2/8.4.
 */

#define TCL_CHANNEL_VERSION_1	((Tcl_ChannelTypeVersion) 0x1)
#define TCL_CHANNEL_VERSION_2	((Tcl_ChannelTypeVersion) 0x2)

/*
 * Typedefs for the various operations in a channel type:
 */

typedef int	(Tcl_DriverBlockModeProc) _ANSI_ARGS_((
		    ClientData instanceData, int mode));
typedef int	(Tcl_DriverCloseProc) _ANSI_ARGS_((ClientData instanceData,
1172
1173
1174
1175
1176
1177
1178




1179
1180
1181
1182
1183
1184
1185
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194







+
+
+
+







		    ClientData instanceData, Tcl_Interp *interp,
		    char *optionName, Tcl_DString *dsPtr));
typedef void	(Tcl_DriverWatchProc) _ANSI_ARGS_((
		    ClientData instanceData, int mask));
typedef int	(Tcl_DriverGetHandleProc) _ANSI_ARGS_((
		    ClientData instanceData, int direction,
		    ClientData *handlePtr));
typedef int	(Tcl_DriverFlushProc) _ANSI_ARGS_((
		    ClientData instanceData));
typedef int	(Tcl_DriverHandlerProc) _ANSI_ARGS_((
		    ClientData instanceData, int interestMask));

/*
 * The following declarations either map ckalloc and ckfree to
 * malloc and free, or they map them to procedures with all sorts
 * of debugging hooks defined in tclCkalloc.c.
 */

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
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







+
+
+




-
-
+
+
-
-
-
+

-
-
-
+
+
+

-
+

-
+

-
+

-
+

-
+

-
+


-
-
+
+



+
+
+
+
+
+
+
+
+
+
+








-
-
+
+








/*
 * struct Tcl_ChannelType:
 *
 * One such structure exists for each type (kind) of channel.
 * It collects together in one place all the functions that are
 * part of the specific channel type.
 *
 * It is recommend that the Tcl_Channel* functions are used to access
 * elements of this structure, instead of direct accessing.
 */

typedef struct Tcl_ChannelType {
    char *typeName;			/* The name of the channel type in Tcl
                                         * commands. This storage is owned by
                                         * channel type. */
					 * commands. This storage is owned by
					 * channel type. */
    Tcl_DriverBlockModeProc *blockModeProc;
    					/* Set blocking mode for the
                                         * raw channel. May be NULL. */
    Tcl_ChannelTypeVersion version;	/* Version of the channel type. */
    Tcl_DriverCloseProc *closeProc;	/* Procedure to call to close the
                                         * channel, or TCL_CLOSE2PROC if the
                                         * close2Proc should be used
                                         * instead. */
					 * channel, or TCL_CLOSE2PROC if the
					 * close2Proc should be used
					 * instead. */
    Tcl_DriverInputProc *inputProc;	/* Procedure to call for input
                                         * on channel. */
					 * on channel. */
    Tcl_DriverOutputProc *outputProc;	/* Procedure to call for output
                                         * on channel. */
					 * on channel. */
    Tcl_DriverSeekProc *seekProc;	/* Procedure to call to seek
                                         * on the channel. May be NULL. */
					 * on the channel. May be NULL. */
    Tcl_DriverSetOptionProc *setOptionProc;
    					/* Set an option on a channel. */
					/* Set an option on a channel. */
    Tcl_DriverGetOptionProc *getOptionProc;
    					/* Get an option from a channel. */
					/* Get an option from a channel. */
    Tcl_DriverWatchProc *watchProc;	/* Set up the notifier to watch
                                         * for events on this channel. */
					 * for events on this channel. */
    Tcl_DriverGetHandleProc *getHandleProc;
					/* Get an OS handle from the channel
                                         * or NULL if not supported. */
    Tcl_DriverClose2Proc *close2Proc;   /* Procedure to call to close the
					 * or NULL if not supported. */
    Tcl_DriverClose2Proc *close2Proc;	/* Procedure to call to close the
					 * channel if the device supports
					 * closing the read & write sides
					 * independently. */
    Tcl_DriverBlockModeProc *blockModeProc;
					/* Set blocking mode for the
					 * raw channel. May be NULL. */
    /*
     * Only valid in TCL_CHANNEL_VERSION_2 channels
     */
    Tcl_DriverFlushProc *flushProc;	/* Procedure to call to flush a
					 * channel. May be NULL. */
    Tcl_DriverHandlerProc *handlerProc;	/* Procedure to call to handle a
					 * channel event.  This will be passed
					 * up the stacked channel chain. */
} Tcl_ChannelType;

/*
 * The following flags determine whether the blockModeProc above should
 * set the channel into blocking or nonblocking mode. They are passed
 * as arguments to the blockModeProc procedure in the above structure.
 */

#define TCL_MODE_BLOCKING 0		/* Put channel into blocking mode. */
#define TCL_MODE_NONBLOCKING 1		/* Put channel into nonblocking
#define TCL_MODE_BLOCKING	0	/* Put channel into blocking mode. */
#define TCL_MODE_NONBLOCKING	1	/* Put channel into nonblocking
					 * mode. */

/*
 * Enum for different types of file paths.
 */

typedef enum Tcl_PathType {
Changes to generic/tclAsync.c.
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
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







-
+





+
+
+















+
+
+
+
+
+
+


+
+
-
-
-
+
+
+
+
-
-
-
-
+
+
+
-
-

-
-
-
-
-
-
+
+
+
+
+
+

-
+

-
-
-
-
-
+
+
+
+
+

-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







 *
 * Copyright (c) 1993 The Regents of the University of California.
 * Copyright (c) 1994 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclAsync.c,v 1.4 1999/04/16 00:46:42 stanton Exp $
 * RCS: @(#) $Id: tclAsync.c,v 1.4.12.1 2001/09/01 22:53:45 davygrvy Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

/* Forward declaration */
struct ThreadSpecificData;

/*
 * One of the following structures exists for each asynchronous
 * handler:
 */

typedef struct AsyncHandler {
    int ready;				/* Non-zero means this handler should
					 * be invoked in the next call to
					 * Tcl_AsyncInvoke. */
    struct AsyncHandler *nextPtr;	/* Next in list of all handlers for
					 * the process. */
    Tcl_AsyncProc *proc;		/* Procedure to call when handler
					 * is invoked. */
    ClientData clientData;		/* Value to pass to handler when it
					 * is invoked. */
    struct ThreadSpecificData *originTsd;
					/* Used in Tcl_AsyncMark to modify thread-
					 * specific data from outside the thread
					 * it is associated to. */
    Tcl_ThreadId originThrdId;		/* Origin thread where this token was
					 * created and where it will be
					 * yielded. */
} AsyncHandler;


typedef struct ThreadSpecificData {
/*
 * The variables below maintain a list of all existing handlers.
 */
    /*
     * The variables below maintain a list of all existing handlers
     * specific to the calling thread.
     */

static AsyncHandler *firstHandler;	/* First handler defined for process,
					 * or NULL if none. */
static AsyncHandler *lastHandler;	/* Last handler or NULL. */
    AsyncHandler *firstHandler;	    /* First handler defined for process,
				     * or NULL if none. */
    AsyncHandler *lastHandler;	    /* Last handler or NULL. */

TCL_DECLARE_MUTEX(asyncMutex)           /* Process-wide async handler lock */

/*
 * The variable below is set to 1 whenever a handler becomes ready and
 * it is cleared to zero whenever Tcl_AsyncInvoke is called.  It can be
 * checked elsewhere in the application by calling Tcl_AsyncReady to see
 * if Tcl_AsyncInvoke should be invoked.
 */
    /*
     * The variable below is set to 1 whenever a handler becomes ready and
     * it is cleared to zero whenever Tcl_AsyncInvoke is called.  It can be
     * checked elsewhere in the application by calling Tcl_AsyncReady to see
     * if Tcl_AsyncInvoke should be invoked.
     */

static int asyncReady = 0;
    int asyncReady;

/*
 * The variable below indicates whether Tcl_AsyncInvoke is currently
 * working.  If so then we won't set asyncReady again until
 * Tcl_AsyncInvoke returns.
 */
    /*
     * The variable below indicates whether Tcl_AsyncInvoke is currently
     * working.  If so then we won't set asyncReady again until
     * Tcl_AsyncInvoke returns.
     */

static int asyncActive = 0;
    int asyncActive;

    Tcl_Mutex asyncMutex;   /* Thread-specific AsyncHandler linked-list lock */

} ThreadSpecificData;
static Tcl_ThreadDataKey dataKey;


/*
 *----------------------------------------------------------------------
 *
 * TclFinalizeAsync --
 *
 *	Finalizes the mutex in the thread local data structure for the
 *	async subsystem.
 *
 * Results:
 *	None.	
 *
 * Side effects:
 *	Forgets knowledge of the mutex should it have been created.
 *
 *----------------------------------------------------------------------
 */

void
TclFinalizeAsync()
{
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);

    if (tsdPtr->asyncMutex != NULL) {
	Tcl_MutexFinalize(&tsdPtr->asyncMutex);
    }
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_AsyncCreate --
 *
 *	This procedure creates the data structures for an asynchronous
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
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







+






+
+
+
-
-
-
+
+
+

-
+

-
-
+
+







Tcl_AsyncHandler
Tcl_AsyncCreate(proc, clientData)
    Tcl_AsyncProc *proc;		/* Procedure to call when handler
					 * is invoked. */
    ClientData clientData;		/* Argument to pass to handler. */
{
    AsyncHandler *asyncPtr;
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);

    asyncPtr = (AsyncHandler *) ckalloc(sizeof(AsyncHandler));
    asyncPtr->ready = 0;
    asyncPtr->nextPtr = NULL;
    asyncPtr->proc = proc;
    asyncPtr->clientData = clientData;
    asyncPtr->originTsd = tsdPtr;
    asyncPtr->originThrdId = Tcl_GetCurrentThread();

    Tcl_MutexLock(&asyncMutex);
    if (firstHandler == NULL) {
	firstHandler = asyncPtr;
    Tcl_MutexLock(&tsdPtr->asyncMutex);
    if (tsdPtr->firstHandler == NULL) {
	tsdPtr->firstHandler = asyncPtr;
    } else {
	lastHandler->nextPtr = asyncPtr;
	tsdPtr->lastHandler->nextPtr = asyncPtr;
    }
    lastHandler = asyncPtr;
    Tcl_MutexUnlock(&asyncMutex);
    tsdPtr->lastHandler = asyncPtr;
    Tcl_MutexUnlock(&tsdPtr->asyncMutex);
    return (Tcl_AsyncHandler) asyncPtr;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_AsyncMark --
124
125
126
127
128
129
130


131
132
133
134
135





136
137

138
139
140
141
142
143
144
171
172
173
174
175
176
177
178
179





180
181
182
183
184
185

186
187
188
189
190
191
192
193







+
+
-
-
-
-
-
+
+
+
+
+

-
+







 *----------------------------------------------------------------------
 */

void
Tcl_AsyncMark(async)
    Tcl_AsyncHandler async;		/* Token for handler. */
{
    AsyncHandler *token = (AsyncHandler *) async;

    Tcl_MutexLock(&asyncMutex);
    ((AsyncHandler *) async)->ready = 1;
    if (!asyncActive) {
	asyncReady = 1;
	TclpAsyncMark(async);
    Tcl_MutexLock(&token->originTsd->asyncMutex);
    token->ready = 1;
    if (!token->originTsd->asyncActive) {
	token->originTsd->asyncReady = 1;
	Tcl_ThreadAlert(token->originThrdId);
    }
    Tcl_MutexUnlock(&asyncMutex);
    Tcl_MutexUnlock(&token->originTsd->asyncMutex);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_AsyncInvoke --
 *
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
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
244

245
246
247
248
249
250
251
252
253
254

255
256

257
258


259
260
261
262
263
264
265
266
267







+
+
-
+

-
-
+
+


-
-
+
+
















-
+









-
+

-
+

-
-
+
+







					 * interpreter.  Otherwise it is
					 * NULL. */
    int code; 				/* If interp is non-NULL, this gives
					 * completion code from command that
					 * just completed. */
{
    AsyncHandler *asyncPtr;
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);

    Tcl_MutexLock(&asyncMutex);
    Tcl_MutexLock(&tsdPtr->asyncMutex);

    if (asyncReady == 0) {
	Tcl_MutexUnlock(&asyncMutex);
    if (tsdPtr->asyncReady == 0) {
	Tcl_MutexUnlock(&tsdPtr->asyncMutex);
	return code;
    }
    asyncReady = 0;
    asyncActive = 1;
    tsdPtr->asyncReady = 0;
    tsdPtr->asyncActive = 1;
    if (interp == NULL) {
	code = 0;
    }

    /*
     * Make one or more passes over the list of handlers, invoking
     * at most one handler in each pass.  After invoking a handler,
     * go back to the start of the list again so that (a) if a new
     * higher-priority handler gets marked while executing a lower
     * priority handler, we execute the higher-priority handler
     * next, and (b) if a handler gets deleted during the execution
     * of a handler, then the list structure may change so it isn't
     * safe to continue down the list anyway.
     */

    while (1) {
	for (asyncPtr = firstHandler; asyncPtr != NULL;
	for (asyncPtr = tsdPtr->firstHandler; asyncPtr != NULL;
		asyncPtr = asyncPtr->nextPtr) {
	    if (asyncPtr->ready) {
		break;
	    }
	}
	if (asyncPtr == NULL) {
	    break;
	}
	asyncPtr->ready = 0;
	Tcl_MutexUnlock(&asyncMutex);
	Tcl_MutexUnlock(&tsdPtr->asyncMutex);
	code = (*asyncPtr->proc)(asyncPtr->clientData, interp, code);
	Tcl_MutexLock(&asyncMutex);
	Tcl_MutexLock(&tsdPtr->asyncMutex);
    }
    asyncActive = 0;
    Tcl_MutexUnlock(&asyncMutex);
    tsdPtr->asyncActive = 0;
    Tcl_MutexUnlock(&tsdPtr->asyncMutex);
    return code;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_AsyncDelete --
227
228
229
230
231
232
233

234
235
236
237
238
239
240
241





242
243
244

245
246
247
248
249
250


251
252
253

254
255
256
257
258
259
260
261
262
263
264

265
266
267
268
269
270
271
272
273
274
275
276
277
278

279

280
278
279
280
281
282
283
284
285
286
287
288





289
290
291
292
293
294
295

296
297
298
299
300


301
302
303
304

305
306
307
308
309
310
311
312
313
314
315

316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331

332
333







+



-
-
-
-
-
+
+
+
+
+


-
+




-
-
+
+


-
+










-
+














+
-
+

 *----------------------------------------------------------------------
 */

void
Tcl_AsyncDelete(async)
    Tcl_AsyncHandler async;		/* Token for handler to delete. */
{
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
    AsyncHandler *asyncPtr = (AsyncHandler *) async;
    AsyncHandler *prevPtr;

    Tcl_MutexLock(&asyncMutex);
    if (firstHandler == asyncPtr) {
	firstHandler = asyncPtr->nextPtr;
	if (firstHandler == NULL) {
	    lastHandler = NULL;
    Tcl_MutexLock(&tsdPtr->asyncMutex);
    if (tsdPtr->firstHandler == asyncPtr) {
	tsdPtr->firstHandler = asyncPtr->nextPtr;
	if (tsdPtr->firstHandler == NULL) {
	    tsdPtr->lastHandler = NULL;
	}
    } else {
	prevPtr = firstHandler;
	prevPtr = tsdPtr->firstHandler;
	while (prevPtr->nextPtr != asyncPtr) {
	    prevPtr = prevPtr->nextPtr;
	}
	prevPtr->nextPtr = asyncPtr->nextPtr;
	if (lastHandler == asyncPtr) {
	    lastHandler = prevPtr;
	if (tsdPtr->lastHandler == asyncPtr) {
	    tsdPtr->lastHandler = prevPtr;
	}
    }
    Tcl_MutexUnlock(&asyncMutex);
    Tcl_MutexUnlock(&tsdPtr->asyncMutex);
    ckfree((char *) asyncPtr);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_AsyncReady --
 *
 *	This procedure can be used to tell whether Tcl_AsyncInvoke
 *	needs to be called.  This procedure is the external interface
 *	for checking the internal asyncReady variable.
 *	for checking the thread-specific asyncReady variable.
 *
 * Results:
 * 	The return value is 1 whenever a handler is ready and is 0
 *	when no handlers are ready.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

int
Tcl_AsyncReady()
{
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
    return asyncReady;
    return tsdPtr->asyncReady;
}
Changes to generic/tclCkalloc.c.
9
10
11
12
13
14
15
16

17
18
19
20
21
22
23
9
10
11
12
13
14
15

16
17
18
19
20
21
22
23







-
+







 * Copyright (c) 1998-1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * This code contributed by Karl Lehenbauer and Mark Diekhans
 *
 * RCS: @(#) $Id: tclCkalloc.c,v 1.8 2000/04/27 01:47:01 ericm Exp $
 * RCS: @(#) $Id: tclCkalloc.c,v 1.7.2.2 2001/04/03 22:54:36 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

#define FALSE	0
#define TRUE	1
1012
1013
1014
1015
1016
1017
1018

1019
1020
1021
1022
1023
1024
1025
1026
1027
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028







+









#ifdef TCL_MEM_DEBUG
    Tcl_MutexLock(ckallocMutexPtr);
    if (tclMemDumpFileName != NULL) {
	Tcl_DumpActiveMemory(tclMemDumpFileName);
    }
    if (curTagPtr != NULL) {
	TclpFree((char *) curTagPtr);
	curTagPtr = NULL;
    }
    allocHead = NULL;
    Tcl_MutexUnlock(ckallocMutexPtr);
#endif

#if USE_TCLALLOC
    TclFinalizeAllocSubsystem(); 
#endif
}
Changes to generic/tclClock.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







/* 
 * tclClock.c --
 *
 *	Contains the time and date related commands.  This code
 *	is derived from the time and date facilities of TclX,
 *	by Mark Diekhans and Karl Lehenbauer.
 *
 * Copyright 1991-1995 Karl Lehenbauer and Mark Diekhans.
 * Copyright (c) 1995 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclClock.c,v 1.9 2000/03/30 04:36:11 hobbs Exp $
 * RCS: @(#) $Id: tclClock.c,v 1.9.2.2 2002/05/24 19:36:29 hobbs Exp $
 */

#include "tcl.h"
#include "tclInt.h"
#include "tclPort.h"

/*
254
255
256
257
258
259
260
261

262
263
264
265
266
267
268
254
255
256
257
258
259
260

261
262
263
264
265
266
267
268







-
+







FormatClock(interp, clockVal, useGMT, format)
    Tcl_Interp *interp;			/* Current interpreter. */
    unsigned long clockVal;	       	/* Time in seconds. */
    int useGMT;				/* Boolean */
    char *format;			/* Format string */
{
    struct tm *timeDataPtr;
    Tcl_DString buffer;
    Tcl_DString buffer, uniBuffer;
    int bufSize;
    char *p;
    int result;
    time_t tclockVal;
#ifndef HAVE_TM_ZONE
    int savedTimeZone = 0;	/* lint. */
    char *savedTZEnv = NULL;	/* lint. */
285
286
287
288
289
290
291
292

293
294
295
296


297
298
299
300
301
302
303
285
286
287
288
289
290
291

292
293
294
295

296
297
298
299
300
301
302
303
304







-
+



-
+
+







    /*
     * If the user gave us -format "", just return now
     */
    if (*format == '\0') {
	return TCL_OK;
    }

#ifndef HAVE_TM_ZONE
#if !defined(HAVE_TM_ZONE) && !defined(WIN32)
    /*
     * This is a kludge for systems not having the timezone string in
     * struct tm.  No matter what was specified, they use the local
     * timezone string.
     * timezone string.  We don't do this on Windows because setting
     * env vars there is a known mem leak in msvcrt.dll. [Bug #559376]
     */

    if (useGMT) {
        char *varValue;

        varValue = Tcl_GetVar2(interp, "env", "TZ", TCL_GLOBAL_ONLY);
        if (varValue != NULL) {
328
329
330
331
332
333
334
335

336
337
338

339
340
341
342
343
344
345
329
330
331
332
333
334
335

336
337
338

339
340
341
342
343
344
345
346







-
+


-
+







	}
    }
    Tcl_DStringInit(&buffer);
    Tcl_DStringSetLength(&buffer, bufSize);

    Tcl_MutexLock(&clockMutex);
    result = TclpStrftime(buffer.string, (unsigned int) bufSize, format,
	    timeDataPtr);
	    timeDataPtr, useGMT);
    Tcl_MutexUnlock(&clockMutex);

#ifndef HAVE_TM_ZONE
#if !defined(HAVE_TM_ZONE) && !defined(WIN32)
    if (useGMT) {
        if (savedTZEnv != NULL) {
            Tcl_SetVar2(interp, "env", "TZ", savedTZEnv, TCL_GLOBAL_ONLY);
            ckfree(savedTZEnv);
        } else {
            Tcl_UnsetVar2(interp, "env", "TZ", TCL_GLOBAL_ONLY);
        }
356
357
358
359
360
361
362







363



364
365
366
367
357
358
359
360
361
362
363
364
365
366
367
368
369
370

371
372
373
374
375
376
377







+
+
+
+
+
+
+
-
+
+
+




	 * format string is above.
	 */
	Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
		"bad format string \"", format, "\"", (char *) NULL);
	return TCL_ERROR;
    }

    /*
     * Convert the time to external encoding, in case we asked for
     * a localized return value.  [Bug: 3345]
     */
    Tcl_DStringInit(&uniBuffer);
    Tcl_ExternalToUtfDString(NULL, buffer.string, -1, &uniBuffer);

    Tcl_SetStringObj(Tcl_GetObjResult(interp), buffer.string, -1);
    Tcl_SetStringObj(Tcl_GetObjResult(interp), uniBuffer.string, -1);

    Tcl_DStringFree(&uniBuffer);
    Tcl_DStringFree(&buffer);
    return TCL_OK;
}

Changes to generic/tclCmdAH.c.
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
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













-
+




+
+
+







/* 
 * tclCmdAH.c --
 *
 *	This file contains the top-level command routines for most of
 *	the Tcl built-in commands whose names begin with the letters
 *	A to H.
 *
 * Copyright (c) 1987-1993 The Regents of the University of California.
 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclCmdAH.c,v 1.12 2000/01/21 02:25:26 hobbs Exp $
 * RCS: @(#) $Id: tclCmdAH.c,v 1.12.2.2 2001/10/17 19:29:24 das Exp $
 */

#include "tclInt.h"
#include "tclPort.h"
#ifdef MAC_TCL
#include "tclMacInt.h"
#endif
#include <locale.h>

typedef int (StatProc)_ANSI_ARGS_((CONST char *path, struct stat *buf));

/*
 * Prototypes for local procedures defined in this file:
 */
838
839
840
841
842
843
844




845
846
847
848
849
850
851
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858







+
+
+
+







	    if (objc == 4) {
		if (Tcl_GetLongFromObj(interp, objv[3],
			(long*)(&buf.st_atime)) != TCL_OK) {
		    return TCL_ERROR;
		}
		tval.actime = buf.st_atime;
		tval.modtime = buf.st_mtime;
#ifdef MAC_TCL
		tval.actime += TclpGetGMTOffset();
		tval.modtime += TclpGetGMTOffset();
#endif
		fileName = Tcl_GetString(objv[2]);
		if (utime(fileName, &tval) != 0) {
		    Tcl_AppendStringsToObj(resultPtr,
			    "could not set access time for file \"",
			    fileName, "\": ",
			    Tcl_PosixError(interp), (char *) NULL);
		    return TCL_ERROR;
1025
1026
1027
1028
1029
1030
1031




1032
1033
1034
1035
1036
1037
1038
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049







+
+
+
+







	    if (objc == 4) {
		if (Tcl_GetLongFromObj(interp, objv[3],
			(long*)(&buf.st_mtime)) != TCL_OK) {
		    return TCL_ERROR;
		}
		tval.actime = buf.st_atime;
		tval.modtime = buf.st_mtime;
#ifdef MAC_TCL
		tval.actime += TclpGetGMTOffset();
		tval.modtime += TclpGetGMTOffset();
#endif
		fileName = Tcl_GetString(objv[2]);
		if (utime(fileName, &tval) != 0) {
		    Tcl_AppendStringsToObj(resultPtr,
			    "could not set modification time for file \"",
			    fileName, "\": ",
			    Tcl_PosixError(interp), (char *) NULL);
		    return TCL_ERROR;
1926
1927
1928
1929
1930
1931
1932
1933

1934
1935
1936
1937
1938
1939
1940
1937
1938
1939
1940
1941
1942
1943

1944
1945
1946
1947
1948
1949
1950
1951







-
+







    int width;			/* Field width from field specifier, or 0 if
				 * no width given. */
    int precision;		/* Field precision from field specifier, or 0
				 * if no precision given. */
    int size;			/* Number of bytes needed for result of
				 * conversion, based on type of conversion
				 * ("e", "s", etc.), width, and precision. */
    int intValue;		/* Used to hold value to pass to sprintf, if
    long intValue;		/* Used to hold value to pass to sprintf, if
				 * it's a one-word integer or char value */
    char *ptrValue = NULL;	/* Used to hold value to pass to sprintf, if
				 * it's a one-word value. */
    double doubleValue;		/* Used to hold value to pass to sprintf if
				 * it's a double value. */
    int whichValue;		/* Indicates which of intValue, ptrValue,
				 * or doubleValue has the value to pass to
2162
2163
2164
2165
2166
2167
2168
2169

2170
2171









2172
2173
2174
2175
2176
2177
2178
2173
2174
2175
2176
2177
2178
2179

2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198







-
+


+
+
+
+
+
+
+
+
+







	    case 'i':
		newPtr[-1] = 'd';
	    case 'd':
	    case 'o':
	    case 'u':
	    case 'x':
	    case 'X':
		if (Tcl_GetIntFromObj(interp,	/* INTL: Tcl source. */
		if (Tcl_GetLongFromObj(interp,	/* INTL: Tcl source. */
			objv[objIndex], &intValue) != TCL_OK) {
		    goto fmtError;
		}
		if ((unsigned long) intValue > UINT_MAX) {
		    /*
		     * Add the 'l' for long format type.
		     */
		    newPtr++;
		    *newPtr = 0;
		    newPtr[-1] = newPtr[-2];
		    newPtr[-2] = 'l';
		}
		whichValue = INT_VALUE;
		size = 40 + precision;
		break;
	    case 's':
		/*
		 * Compute the length of the string in characters and add
2189
2190
2191
2192
2193
2194
2195
2196

2197
2198
2199
2200
2201
2202
2203
2209
2210
2211
2212
2213
2214
2215

2216
2217
2218
2219
2220
2221
2222
2223







-
+







		}
		size = Tcl_UtfAtIndex(ptrValue, stringLen) - ptrValue;
		if (width > stringLen) {
		    size += (width - stringLen);
		}
		break;
	    case 'c':
		if (Tcl_GetIntFromObj(interp,	/* INTL: Tcl source. */
		if (Tcl_GetLongFromObj(interp,	/* INTL: Tcl source. */
			objv[objIndex], &intValue) != TCL_OK) {
		    goto fmtError;
		}
		whichValue = CHAR_VALUE;
		size = width + TCL_UTF_MAX;
		break;
	    case 'e':
Changes to generic/tclCmdIL.c.
10
11
12
13
14
15
16
17

18
19
20
21
22
23
24
10
11
12
13
14
15
16

17
18
19
20
21
22
23
24







-
+







 * Copyright (c) 1993-1997 Lucent Technologies.
 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclCmdIL.c,v 1.24 2000/04/04 08:04:41 hobbs Exp $
 * RCS: @(#) $Id: tclCmdIL.c,v 1.24.2.4 2002/04/19 08:12:39 dkf Exp $
 */

#include "tclInt.h"
#include "tclPort.h"
#include "tclCompile.h"
#include "tclRegexp.h"

68
69
70
71
72
73
74







75
76
77
78
79
80
81
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88







+
+
+
+
+
+
+








#define SORTMODE_ASCII      0
#define SORTMODE_INTEGER    1
#define SORTMODE_REAL       2
#define SORTMODE_COMMAND    3
#define SORTMODE_DICTIONARY 4

/*
 * Magic values for the index field of the SortInfo structure.
 * Note that the index "end-1" will be translated to SORTIDX_END-1, etc.
 */
#define SORTIDX_NONE	-1		/* Not indexed; use whole value. */
#define SORTIDX_END	-2		/* Indexed from end. */

/*
 * Forward declarations for procedures defined in this file:
 */

static void		AppendLocals _ANSI_ARGS_((Tcl_Interp *interp,
			    Tcl_Obj *listPtr, char *pattern,
			    int includeLinks));
558
559
560
561
562
563
564
565

566
567
568
569
570





571
572

573
574
575
576
577
578
579






580
581

582
583
584
585
586
587
588
565
566
567
568
569
570
571

572





573
574
575
576
577


578


579
580
581


582
583
584
585
586
587

588
589
590
591
592
593
594
595
596







-
+
-
-
-
-
-
+
+
+
+
+
-
-
+
-
-



-
-
+
+
+
+
+
+
-

+







    procPtr = TclFindProc(iPtr, name);
    if (procPtr == NULL) {
        Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
		"\"", name, "\" isn't a procedure", (char *) NULL);
        return TCL_ERROR;
    }

    /*
    /* 
     * We should not return a bytecompiled body.  If it is precompiled,
     * then the bodyPtr's string representation is bogus, since sources
     * are not available.  If it was just a bytecompiled body, then it
     * is likely to not be of any use to the caller, as it was compiled
     * for a separate procedure context [Bug: 3412], and noone else can
     * Here we used to return procPtr->bodyPtr, except when the body was
     * bytecompiled - in that case, the return was a copy of the body's
     * string rep. In order to better isolate the implementation details
     * of the compiler/engine subsystem, we now always return a copy of 
     * the string rep. It is important to return a copy so that later 
     * reasonably use it.
     * In order to make sure that later manipulations of the object do not
     * manipulations of the object do not invalidate the internal rep.
     * invalidate the internal representation, we make a copy of the string
     * representation and return that one, instead.
     */

    bodyPtr = procPtr->bodyPtr;
    resultPtr = bodyPtr;
    if (bodyPtr->typePtr == &tclByteCodeType) {
    if (bodyPtr->bytes == NULL) {
	/*
	 * The string rep might not be valid if the procedure has
	 * never been run before.  [Bug #545644]
	 */
	(void) Tcl_GetString(bodyPtr);
	resultPtr = Tcl_NewStringObj(bodyPtr->bytes, bodyPtr->length);
    }
    resultPtr = Tcl_NewStringObj(bodyPtr->bytes, bodyPtr->length);
    
    Tcl_SetObjResult(interp, resultPtr);
    return TCL_OK;
}

/*
 *----------------------------------------------------------------------
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
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







-
-
-
-
-
-
-
-





+
+
+
+
+
+
+
+







	entryPtr = Tcl_FirstHashEntry(&nsPtr->cmdTable, &search);
	while (entryPtr != NULL) {
	    cmdName = Tcl_GetHashKey(&nsPtr->cmdTable, entryPtr);
	    if ((simplePattern == NULL)
	            || Tcl_StringMatch(cmdName, simplePattern)) {
		cmdPtr = (Command *) Tcl_GetHashValue(entryPtr);

		if (specificNsInPattern) {
		    elemObjPtr = Tcl_NewObj();
		    Tcl_GetCommandFullName(interp, (Tcl_Command) cmdPtr,
		            elemObjPtr);
		} else {
		    elemObjPtr = Tcl_NewStringObj(cmdName, -1);
		}

		realCmdPtr = (Command *)
		    TclGetOriginalCommand((Tcl_Command) cmdPtr);

		if (TclIsProc(cmdPtr)
		        || ((realCmdPtr != NULL) && TclIsProc(realCmdPtr))) {
		    if (specificNsInPattern) {
			elemObjPtr = Tcl_NewObj();
			Tcl_GetCommandFullName(interp, (Tcl_Command) cmdPtr,
				elemObjPtr);
		    } else {
			elemObjPtr = Tcl_NewStringObj(cmdName, -1);
		    }

		    Tcl_ListObjAppendElement(interp, listPtr, elemObjPtr);
		}
	    }
	    entryPtr = Tcl_NextHashEntry(&search);
	}

	/*
2015
2016
2017
2018
2019
2020
2021
2022

2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040






2041

2042
2043



2044
2045
2046
2047
2048

2049
2050
2051

2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078

2079
2080
2081
2082


2083
2084
2085
2086
2087
2088
2089
2090
2091
2092



2093
2094
2095

2096
2097
2098
2099
2100
2101

2102
2103
2104
2105
2106
2107
2108
2109
2023
2024
2025
2026
2027
2028
2029

2030

2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053

2054
2055
2056
2057
2058
2059
2060
2061
2062
2063

2064

2065

2066
2067
2068
2069
























2070
2071
2072


2073
2074
2075
2076
2077

2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088

2089
2090
2091
2092
2093


2094

2095
2096
2097
2098
2099
2100
2101







-
+
-

















+
+
+
+
+
+
-
+


+
+
+




-
+
-

-
+



-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+


-
-
+
+



-






+
+
+


-
+




-
-
+
-







int
Tcl_LinsertObjCmd(dummy, interp, objc, objv)
    ClientData dummy;		/* Not used. */
    Tcl_Interp *interp;		/* Current interpreter. */
    register int objc;		/* Number of arguments. */
    Tcl_Obj *CONST objv[];	/* Argument objects. */
{
    Tcl_Obj *listPtr, *resultPtr;
    Tcl_Obj *listPtr;
    Tcl_ObjType *typePtr;
    int index, isDuplicate, len, result;
   
    if (objc < 4) {
	Tcl_WrongNumArgs(interp, 1, objv, "list index element ?element ...?");
	return TCL_ERROR;
    }

    /*
     * Get the index first since, if a conversion to int is needed, it
     * will invalidate the list's internal representation.
     */

    result = Tcl_ListObjLength(interp, objv[1], &len);
    if (result != TCL_OK) {
	return result;
    }

    /*
     * Get the index.  "end" is interpreted to be the index after the last
     * element, such that using it will cause any inserted elements to be
     * appended to the list.
     */

    result = TclGetIntForIndex(interp, objv[2], /*endValue*/ len, &index);
    result = TclGetIntForIndex(interp, objv[2], /*end*/ len, &index);
    if (result != TCL_OK) {
	return result;
    }
    if (index > len) {
	index = len;
    }

    /*
     * If the list object is unshared we can modify it directly. Otherwise
     * we create a copy to modify: this is "copy on write". We create the
     * we create a copy to modify: this is "copy on write".
     * duplicate directly in the interpreter's object result.
     */
    

    listPtr = objv[1];
    isDuplicate = 0;
    if (Tcl_IsShared(listPtr)) {
	/*
	 * The following code must reflect the logic in Tcl_DuplicateObj()
	 * except that it must duplicate the list object directly into the
	 * interpreter's result.
	 */
	
	Tcl_ResetResult(interp);
	resultPtr = Tcl_GetObjResult(interp);
	typePtr = listPtr->typePtr;
	if (listPtr->bytes == NULL) {
	    resultPtr->bytes = NULL;
	} else if (listPtr->bytes != tclEmptyStringRep) {
	    len = listPtr->length;
	    TclInitStringRep(resultPtr, listPtr->bytes, len);
	}
	if (typePtr != NULL) {
	    if (typePtr->dupIntRepProc == NULL) {
		resultPtr->internalRep = listPtr->internalRep;
		resultPtr->typePtr = typePtr;
	    } else {
		(*typePtr->dupIntRepProc)(listPtr, resultPtr);
	    }
	}
	listPtr = resultPtr;
	listPtr = Tcl_DuplicateObj(listPtr);
	isDuplicate = 1;
    }
    
    if ((objc == 4) && (index == INT_MAX)) {

    if ((objc == 4) && (index == len)) {
	/*
	 * Special case: insert one element at the end of the list.
	 */

	result = Tcl_ListObjAppendElement(interp, listPtr, objv[3]);
    } else if (objc > 3) {
	result = Tcl_ListObjReplace(interp, listPtr, index, 0,
				    (objc-3), &(objv[3]));
    }
    if (result != TCL_OK) {
	if (isDuplicate) {
	    Tcl_DecrRefCount(listPtr); /* free unneeded obj */
	}
	return result;
    }
    

    /*
     * Set the interpreter's object result.
     */

    if (!isDuplicate) {
	Tcl_SetObjResult(interp, listPtr);
    Tcl_SetObjResult(interp, listPtr);
    }
    return TCL_OK;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ListObjCmd --
2302
2303
2304
2305
2306
2307
2308
2309

2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330

2331
2332
2333
2334
2335
2336
2337
2338
2339
2340



2341
2342
2343

2344
2345
2346

2347
2348
2349
2350

2351
2352
2353

2354
2355
2356
2357
2358








2359

2360
2361
2362
2363
2364

2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375











2376
2377
2378
2379
2380
2381
2382
2383



2384

2385
2386
2387
2388
2389
2390
2391
2294
2295
2296
2297
2298
2299
2300

2301


2302
2303
2304
2305
2306
2307
2308












2309
2310




2311
2312
2313
2314

2315
2316
2317
2318
2319

2320

2321

2322
2323

2324

2325

2326

2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340

2341

2342
2343
2344

2345

2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377

2378
2379
2380
2381
2382
2383
2384
2385







-
+
-
-







-
-
-
-
-
-
-
-
-
-
-
-
+

-
-
-
-




-
+
+
+


-
+
-

-
+

-

-
+
-

-
+





+
+
+
+
+
+
+
+
-
+
-



-
+
-










+
+
+
+
+
+
+
+
+
+
+








+
+
+
-
+







Tcl_LreplaceObjCmd(dummy, interp, objc, objv)
    ClientData dummy;		/* Not used. */
    Tcl_Interp *interp;		/* Current interpreter. */
    int objc;			/* Number of arguments. */
    Tcl_Obj *CONST objv[];	/* Argument objects. */
{
    register Tcl_Obj *listPtr;
    int createdNewObj, first, last, listLen, numToDelete;
    int isDuplicate, first, last, listLen, numToDelete, result;
    int firstArgLen, result;
    char *firstArg;

    if (objc < 4) {
	Tcl_WrongNumArgs(interp, 1, objv,
		"list first last ?element element ...?");
	return TCL_ERROR;
    }

    /*
     * If the list object is unshared we can modify it directly, otherwise
     * we create a copy to modify: this is "copy on write".
     */
    
    listPtr = objv[1];
    createdNewObj = 0;
    if (Tcl_IsShared(listPtr)) {
	listPtr = Tcl_DuplicateObj(listPtr);
	createdNewObj = 1;
    }
    result = Tcl_ListObjLength(interp, listPtr, &listLen);
    result = Tcl_ListObjLength(interp, objv[1], &listLen);
    if (result != TCL_OK) {
        errorReturn:
	if (createdNewObj) {
	    Tcl_DecrRefCount(listPtr); /* free unneeded obj */
	}
	return result;
    }

    /*
     * Get the first and last indexes.
     * Get the first and last indexes.  "end" is interpreted to be the index
     * for the last element, such that using it will cause that element to
     * be included for deletion.
     */

    result = TclGetIntForIndex(interp, objv[2], /*endValue*/ (listLen - 1),
    result = TclGetIntForIndex(interp, objv[2], /*end*/ (listLen - 1), &first);
	    &first);
    if (result != TCL_OK) {
	goto errorReturn;
	return result;
    }
    firstArg = Tcl_GetStringFromObj(objv[2], &firstArgLen);

    result = TclGetIntForIndex(interp, objv[3], /*endValue*/ (listLen - 1),
    result = TclGetIntForIndex(interp, objv[3], /*end*/ (listLen - 1), &last);
	    &last);
    if (result != TCL_OK) {
	goto errorReturn;
	return result;
    }

    if (first < 0)  {
    	first = 0;
    }

    /*
     * Complain if the user asked for a start element that is greater than the
     * list length.  This won't ever trigger for the "end*" case as that will
     * be properly constrained by TclGetIntForIndex because we use listLen-1
     * (to allow for replacing the last elem).
     */

    if ((first >= listLen) && (listLen > 0)
    if ((first >= listLen) && (listLen > 0)) {
	    && (strncmp(firstArg, "end", (unsigned) firstArgLen) != 0)) {
	Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
		"list doesn't contain element ",
		Tcl_GetString(objv[2]), (int *) NULL);
	result = TCL_ERROR;
	return TCL_ERROR;
	goto errorReturn;
    }
    if (last >= listLen) {
    	last = (listLen - 1);
    }
    if (first <= last) {
	numToDelete = (last - first + 1);
    } else {
	numToDelete = 0;
    }

    /*
     * If the list object is unshared we can modify it directly, otherwise
     * we create a copy to modify: this is "copy on write".
     */

    listPtr = objv[1];
    isDuplicate = 0;
    if (Tcl_IsShared(listPtr)) {
	listPtr = Tcl_DuplicateObj(listPtr);
	isDuplicate = 1;
    }
    if (objc > 4) {
	result = Tcl_ListObjReplace(interp, listPtr, first, numToDelete,
	        (objc-4), &(objv[4]));
    } else {
	result = Tcl_ListObjReplace(interp, listPtr, first, numToDelete,
		0, NULL);
    }
    if (result != TCL_OK) {
	if (isDuplicate) {
	    Tcl_DecrRefCount(listPtr); /* free unneeded obj */
	}
	goto errorReturn;
	return result;
    }

    /*
     * Set the interpreter's object result. 
     */

    Tcl_SetObjResult(interp, listPtr);
2529
2530
2531
2532
2533
2534
2535
2536

2537
2538
2539
2540
2541
2542
2543
2523
2524
2525
2526
2527
2528
2529

2530
2531
2532
2533
2534
2535
2536
2537







-
+








    /*
     * Parse arguments to set up the mode for the sort.
     */

    sortInfo.isIncreasing = 1;
    sortInfo.sortMode = SORTMODE_ASCII;
    sortInfo.index = -1;
    sortInfo.index = SORTIDX_NONE;
    sortInfo.interp = interp;
    sortInfo.resultCode = TCL_OK;
    cmdPtr = NULL;
    unique = 0;
    for (i = 1; i < objc-1; i++) {
	if (Tcl_GetIndexFromObj(interp, objv[i], switches, "option", 0, &index)
		!= TCL_OK) {
2570
2571
2572
2573
2574
2575
2576
2577
2578


2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2564
2565
2566
2567
2568
2569
2570


2571
2572
2573
2574

2575
2576
2577
2578
2579
2580
2581







-
-
+
+


-







	    case 5:			/* -index */
		if (i == (objc-2)) {
		    Tcl_AppendToObj(resultPtr,
			    "\"-index\" option must be followed by list index",
			    -1);
		    return TCL_ERROR;
		}
		if (TclGetIntForIndex(interp, objv[i+1], -2, &sortInfo.index)
			!= TCL_OK) {
		if (TclGetIntForIndex(interp, objv[i+1], SORTIDX_END,
			&sortInfo.index) != TCL_OK) {
		    return TCL_ERROR;
		}
		cmdPtr = objv[i+1];
		i++;
		break;
	    case 6:			/* -integer */
		sortInfo.sortMode = SORTMODE_INTEGER;
		break;
	    case 7:			/* -real */
		sortInfo.sortMode = SORTMODE_REAL;
2612
2613
2614
2615
2616
2617
2618
2619

2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2605
2606
2607
2608
2609
2610
2611

2612
2613
2614



2615
2616
2617
2618
2619
2620
2621







-
+


-
-
-







	}
	Tcl_ListObjAppendElement(interp, newCommandPtr, Tcl_NewObj());
	sortInfo.compareCmdPtr = newCommandPtr;
    }

    sortInfo.resultCode = Tcl_ListObjGetElements(interp, objv[objc-1],
	    &length, &listObjPtrs);
    if (sortInfo.resultCode != TCL_OK) {
    if (sortInfo.resultCode != TCL_OK || length <= 0) {
	goto done;
    }
    if (length <= 0) {
        return TCL_OK;
    }
    elementArray = (SortElement *) ckalloc(length * sizeof(SortElement));
    for (i=0; i < length; i++){
	elementArray[i].objPtr = listObjPtrs[i];
	elementArray[i].count = 0;
	elementArray[i].nextPtr = &elementArray[i+1];
    }
    elementArray[length-1].nextPtr = NULL;
2828
2829
2830
2831
2832
2833
2834
2835

2836
2837
2838
2839
2840


2841
2842
2843
2844
2845
2846
2847
2848


2849
2850
2851
2852
2853
2854
2855
2818
2819
2820
2821
2822
2823
2824

2825
2826
2827
2828


2829
2830
2831
2832
2833
2834
2835
2836


2837
2838
2839
2840
2841
2842
2843
2844
2845







-
+



-
-
+
+






-
-
+
+







	/*
	 * Once an error has occurred, skip any future comparisons
	 * so as to preserve the error message in sortInterp->result.
	 */

	return order;
    }
    if (infoPtr->index != -1) {
    if (infoPtr->index != SORTIDX_NONE) {
	/*
	 * The "-index" option was specified.  Treat each object as a
	 * list, extract the requested element from each list, and
	 * compare the elements, not the lists.  The special index "end"
	 * is signaled here with a large negative index.
	 * compare the elements, not the lists.  "end"-relative indices
	 * are signaled here with large negative values.
	 */

	if (Tcl_ListObjLength(infoPtr->interp, objPtr1, &listLen) != TCL_OK) {
	    infoPtr->resultCode = TCL_ERROR;
	    return order;
	}
	if (infoPtr->index < -1) {
	    index = listLen - 1;
	if (infoPtr->index < SORTIDX_NONE) {
	    index = listLen + infoPtr->index + 1;
	} else {
	    index = infoPtr->index;
	}

	if (Tcl_ListObjIndex(infoPtr->interp, objPtr1, index, &objPtr)
		!= TCL_OK) {
	    infoPtr->resultCode = TCL_ERROR;
2867
2868
2869
2870
2871
2872
2873
2874
2875


2876
2877
2878
2879
2880
2881
2882
2857
2858
2859
2860
2861
2862
2863


2864
2865
2866
2867
2868
2869
2870
2871
2872







-
-
+
+







	}
	objPtr1 = objPtr;

	if (Tcl_ListObjLength(infoPtr->interp, objPtr2, &listLen) != TCL_OK) {
	    infoPtr->resultCode = TCL_ERROR;
	    return order;
	}
	if (infoPtr->index < -1) {
	    index = listLen - 1;
	if (infoPtr->index < SORTIDX_NONE) {
	    index = listLen + infoPtr->index + 1;
	} else {
	    index = infoPtr->index;
	}

	if (Tcl_ListObjIndex(infoPtr->interp, objPtr2, index, &objPtr)
		!= TCL_OK) {
	    infoPtr->resultCode = TCL_ERROR;
Changes to generic/tclCmdMZ.c.
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
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










-
+




-
+




-


-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-







/* 
 * tclCmdMZ.c --
 *
 *	This file contains the top-level command routines for most of
 *	the Tcl built-in commands whose names begin with the letters
 *	M to Z.  It contains only commands in the generic core (i.e.
 *	those that don't depend much upon UNIX facilities).
 *
 * Copyright (c) 1987-1993 The Regents of the University of California.
 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 * Copyright (c) 1998-2000 Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclCmdMZ.c,v 1.26 2000/04/10 21:08:26 ericm Exp $
 * RCS: @(#) $Id: tclCmdMZ.c,v 1.26.2.6 2002/03/29 22:42:50 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"
#include "tclCompile.h"
#include "tclRegexp.h"

/*
 * Flag values used by Tcl_ScanObjCmd.
 */

#define SCAN_NOSKIP	0x1		  /* Don't skip blanks. */
#define SCAN_SUPPRESS	0x2		  /* Suppress assignment. */
#define SCAN_UNSIGNED	0x4		  /* Read an unsigned value. */
#define SCAN_WIDTH	0x8		  /* A width value was supplied. */

#define SCAN_SIGNOK	0x10		  /* A +/- character is allowed. */
#define SCAN_NODIGITS	0x20		  /* No digits have been scanned. */
#define SCAN_NOZERO	0x40		  /* No zero digits have been scanned. */
#define SCAN_XOK	0x80		  /* An 'x' is allowed. */
#define SCAN_PTOK	0x100		  /* Decimal point is allowed. */
#define SCAN_EXPOK	0x200		  /* An exponent is allowed. */

/*
 * Structure used to hold information about variable traces:
 */

typedef struct {
    int flags;			/* Operations for which Tcl command is
				 * to be invoked. */
145
146
147
148
149
150
151
152

153
154
155
156
157
158
159
128
129
130
131
132
133
134

135
136
137
138
139
140
141
142







-
+







    indices	= 0;
    about	= 0;
    cflags	= TCL_REG_ADVANCED;
    eflags	= 0;
    offset	= 0;
    all		= 0;
    doinline	= 0;
    

    for (i = 1; i < objc; i++) {
	char *name;
	int index;

	name = Tcl_GetString(objv[i]);
	if (name[0] != '-') {
	    break;
231
232
233
234
235
236
237








238
239
240
241
242
243
244
245
246
247
248
249
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







+
+
+
+
+
+
+
+




-







	 * User requested -inline, but specified match variables - a no-no.
	 */
	Tcl_AppendResult(interp, "regexp match variables not allowed",
		" when using -inline", (char *) NULL);
	return TCL_ERROR;
    }

    /*
     * Get the length of the string that we are matching against so
     * we can do the termination test for -all matches.  Do this before
     * getting the regexp to avoid shimmering problems.
     */
    objPtr = objv[1];
    stringLength = Tcl_GetCharLength(objPtr);

    regExpr = Tcl_GetRegExpFromObj(interp, objv[0], cflags);
    if (regExpr == NULL) {
	return TCL_ERROR;
    }
    objPtr = objv[1];

    if (about) {
	if (TclRegAbout(interp, regExpr) < 0) {
	    return TCL_ERROR;
	}
	return TCL_OK;
    }
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
260
261
262
263
264
265
266






267
268
269
270
271
272
273







-
-
-
-
-
-







	 * Save only enough subexpressions for matches we want to keep,
	 * expect in the case of -all, where we need to keep at least
	 * one to know where to move the offset.
	 */
	numMatchesSaved = (objc == 0) ? all : objc;
    }

    /*
     * Get the length of the string that we are matching against so
     * we can do the termination test for -all matches.
     */
    stringLength = Tcl_GetCharLength(objPtr);
    
    /*
     * The following loop is to handle multiple matches within the
     * same source string;  each iteration handles one match.  If "-all"
     * hasn't been specified then the loop body only gets executed once.
     * We terminate the loop when the starting offset is past the end of the
     * string.
     */
333
334
335
336
337
338
339




340

341
342
343
344
345
346
347
317
318
319
320
321
322
323
324
325
326
327

328
329
330
331
332
333
334
335







+
+
+
+
-
+







	for (i = 0; i < objc; i++) {
	    Tcl_Obj *newPtr;

	    if (indices) {
		int start, end;
		Tcl_Obj *objs[2];

		/*
		 * Only adjust the match area if there was a match for
		 * that area.  (Scriptics Bug 4391/SF Bug #219232)
		 */
		if (i <= info.nsubs) {
		if (i <= info.nsubs && info.matches[i].start >= 0) {
		    start = offset + info.matches[i].start;
		    end   = offset + info.matches[i].end;

		    /*
		     * Adjust index so it refers to the last character in the
		     * match instead of the first character after the match.
		     */
398
399
400
401
402
403
404

405
406
407
408
409
410
411
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400







+







	 * length of the match is 0, so offset never changes).
	 */
	if (info.matches[0].end == 0) {
	    offset++;
	}
	offset += info.matches[0].end;
	all++;
	eflags |= TCL_REG_NOTBOL;
	if (offset >= stringLength) {
	    break;
	}
    }

    /*
     * Set the interpreter's object result to an integer object
525
526
527
528
529
530
531











532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540






541
542
543
544
545
546
547







+
+
+
+
+
+
+
+
+
+
+









-
-
-
-
-
-







	Tcl_WrongNumArgs(interp, 1, objv,
		"?switches? exp string subSpec varName");
	return TCL_ERROR;
    }

    objv += i;

    /*
     * Get the length of the string that we are matching before
     * getting the regexp to avoid shimmering problems.
     */

    objPtr = objv[1];
    wlen = Tcl_GetCharLength(objPtr);
    wstring = Tcl_GetUnicode(objPtr);
    subspec = Tcl_GetString(objv[2]);
    varPtr = objv[3];

    regExpr = Tcl_GetRegExpFromObj(interp, objv[0], cflags);
    if (regExpr == NULL) {
	return TCL_ERROR;
    }

    result = TCL_OK;
    resultPtr = Tcl_NewObj();
    Tcl_IncrRefCount(resultPtr);

    objPtr = objv[1];
    wlen = Tcl_GetCharLength(objPtr);
    wstring = Tcl_GetUnicode(objPtr);
    subspec = Tcl_GetString(objv[2]);
    varPtr = objv[3];

    /*
     * The following loop is to handle multiple matches within the
     * same source string;  each iteration handles one match and its
     * corresponding substitution.  If "-all" hasn't been specified
     * then the loop body only gets executed once.
     */

904
905
906
907
908
909
910




911
912





913
914

915
916



917






918
919

920
921
922
923
924
925
926
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







+
+
+
+


+
+
+
+
+


+


+
+
+
-
+
+
+
+
+
+


+







    listPtr = Tcl_GetObjResult(interp);
    
    if (stringLen == 0) {
	/*
	 * Do nothing.
	 */
    } else if (splitCharLen == 0) {
	Tcl_HashTable charReuseTable;
	Tcl_HashEntry *hPtr;
	int isNew;

	/*
	 * Handle the special case of splitting on every character.
	 *
	 * Uses a hash table to ensure that each kind of character has
	 * only one Tcl_Obj instance (multiply-referenced) in the
	 * final list.  This is a *major* win when splitting on a long
	 * string (especially in the megabyte range!) - DKF
	 */

	Tcl_InitHashTable(&charReuseTable, TCL_ONE_WORD_KEYS);
	for ( ; string < end; string += len) {
	    len = Tcl_UtfToUniChar(string, &ch);
	    /* Assume Tcl_UniChar is an integral type... */
	    hPtr = Tcl_CreateHashEntry(&charReuseTable, (char*)0 + ch, &isNew);
	    if (isNew) {
	    objPtr = Tcl_NewStringObj(string, len);
		objPtr = Tcl_NewStringObj(string, len);
		/* Don't need to fiddle with refcount... */
		Tcl_SetHashValue(hPtr, (ClientData) objPtr);
	    } else {
		objPtr = (Tcl_Obj*) Tcl_GetHashValue(hPtr);
	    }
	    Tcl_ListObjAppendElement(NULL, listPtr, objPtr);
	}
	Tcl_DeleteHashTable(&charReuseTable);
    } else {
	char *element, *p, *splitEnd;
	int splitLen;
	Tcl_UniChar splitChar;
	
	/*
	 * Normal case: split on any of a given set of characters.
1017
1018
1019
1020
1021
1022
1023
1024

1025
1026
1027

1028
1029
1030
1031
1032
1033
1034
1030
1031
1032
1033
1034
1035
1036

1037
1038
1039

1040
1041
1042
1043
1044
1045
1046
1047







-
+


-
+







				 "?-nocase? ?-length int? string1 string2");
		return TCL_ERROR;
	    }

	    for (i = 2; i < objc-2; i++) {
		string2 = Tcl_GetStringFromObj(objv[i], &length2);
		if ((length2 > 1)
			&& strncmp(string2, "-nocase", (size_t) length2) == 0) {
			&& strncmp(string2, "-nocase", (size_t)length2) == 0) {
		    nocase = 1;
		} else if ((length2 > 1)
			&& strncmp(string2, "-length", (size_t) length2) == 0) {
			&& strncmp(string2, "-length", (size_t)length2) == 0) {
		    if (i+1 >= objc-2) {
			goto str_cmp_args;
		    }
		    if (Tcl_GetIntFromObj(interp, objv[++i],
			    &reqlength) != TCL_OK) {
			return TCL_ERROR;
		    }
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
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







-
-
-













-
-
+





+
-
-
+
+
-
-
-
+
+

-
+
-

-
-
-
-
+
+
+



-
-
-
-
+
+
+
+
+
+
+







		    match = start + Tcl_NumUtfChars(string2, match);
		}
	    }
	    Tcl_SetIntObj(resultPtr, match);
	    break;
	}
	case STR_INDEX: {
	    char buf[TCL_UTF_MAX];
	    Tcl_UniChar unichar;

	    if (objc != 4) {
	        Tcl_WrongNumArgs(interp, 2, objv, "string charIndex");
		return TCL_ERROR;
	    }

	    /*
	     * If we have a ByteArray object, avoid indexing in the
	     * Utf string since the byte array contains one byte per
	     * character.  Otherwise, use the Unicode string rep to
	     * get the index'th char.
	     */

	    if (objv[2]->typePtr == &tclByteArrayType) {

		string1 = (char *)Tcl_GetByteArrayFromObj(objv[2], &length1);
		string1 = (char *) Tcl_GetByteArrayFromObj(objv[2], &length1);

		if (TclGetIntForIndex(interp, objv[3], length1 - 1,
			&index) != TCL_OK) {
		    return TCL_ERROR;
		}
		if ((index >= 0) && (index < length1)) {
		Tcl_SetByteArrayObj(resultPtr,
			(unsigned char *)(&string1[index]), 1);
		    Tcl_SetByteArrayObj(resultPtr,
			    (unsigned char *)(&string1[index]), 1);
	    } else {
		string1 = Tcl_GetStringFromObj(objv[2], &length1);
		
		}
	    } else {
		/*
		 * convert to Unicode internal rep to calulate what
		 * Get Unicode char length to calulate what 'end' means.
		 * 'end' really means.
		 */

		length2 = Tcl_GetCharLength(objv[2]);
    
		if (TclGetIntForIndex(interp, objv[3], length2 - 1,
		length1 = Tcl_GetCharLength(objv[2]);

		if (TclGetIntForIndex(interp, objv[3], length1 - 1,
			&index) != TCL_OK) {
		    return TCL_ERROR;
		}
		if ((index >= 0) && (index < length2)) {
		    unichar = Tcl_GetUniChar(objv[2], index);
		    length2 = Tcl_UniCharToUtf((int)unichar, buf);
		    Tcl_SetStringObj(resultPtr, buf, length2);
		if ((index >= 0) && (index < length1)) {
		    char buf[TCL_UTF_MAX];
		    Tcl_UniChar ch;

		    ch      = Tcl_GetUniChar(objv[2], index);
		    length1 = Tcl_UniCharToUtf(ch, buf);
		    Tcl_SetStringObj(resultPtr, buf, length1);
		}
	    }
	    break;
	}
	case STR_IS: {
	    char *end;
	    Tcl_UniChar ch;
1271
1272
1273
1274
1275
1276
1277
1278


1279
1280
1281
1282
1283
1284
1285
1281
1282
1283
1284
1285
1286
1287

1288
1289
1290
1291
1292
1293
1294
1295
1296







-
+
+







	    if (objc != 4) {
		for (i = 3; i < objc-1; i++) {
		    string2 = Tcl_GetStringFromObj(objv[i], &length2);
		    if ((length2 > 1) &&
			strncmp(string2, "-strict", (size_t) length2) == 0) {
			strict = 1;
		    } else if ((length2 > 1) &&
			       strncmp(string2, "-failindex", (size_t) length2) == 0) {
			    strncmp(string2, "-failindex",
				    (size_t) length2) == 0) {
			if (i+1 >= objc-1) {
			    Tcl_WrongNumArgs(interp, 3, objv,
					     "?-strict? ?-failindex var? str");
			    return TCL_ERROR;
			}
			failVarObj = objv[++i];
		    } else {
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
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







-










-

-
-
+


+







	    if (objc != 3) {
	        Tcl_WrongNumArgs(interp, 2, objv, "string");
		return TCL_ERROR;
	    }

	    if ((enum options) index == STR_BYTELENGTH) {
		(void) Tcl_GetStringFromObj(objv[2], &length1);
		Tcl_SetIntObj(resultPtr, length1);
	    } else {
		/*
		 * If we have a ByteArray object, avoid recomputing the
		 * string since the byte array contains one byte per
		 * character.  Otherwise, use the Unicode string rep to
		 * calculate the length.
		 */

		if (objv[2]->typePtr == &tclByteArrayType) {
		    (void) Tcl_GetByteArrayFromObj(objv[2], &length1);
		    Tcl_SetIntObj(resultPtr, length1);
		} else {
		    Tcl_SetIntObj(resultPtr,
			    Tcl_GetCharLength(objv[2]));
		    length1 = Tcl_GetCharLength(objv[2]);
		}
	    }
	    Tcl_SetIntObj(resultPtr, length1);
	    break;
	}
	case STR_MAP: {
	    int uselen, mapElemc, len, nocase = 0;
	    Tcl_Obj **mapElemv;
	    char *end;
	    Tcl_UniChar ch;
1641
1642
1643
1644
1645
1646
1647

1648
1649
1650
1651
1652
1653
1654
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664







+







		return TCL_ERROR;
	    }
	    if (mapElemc == 0) {
		/*
		 * empty charMap, just return whatever string was given
		 */
		Tcl_SetObjResult(interp, objv[objc-1]);
		return TCL_OK;
	    } else if (mapElemc & 1) {
		/*
		 * The charMap must be an even number of key/value items
		 */
		Tcl_SetStringObj(resultPtr, "char map list unbalanced", -1);
		return TCL_ERROR;
	    }
1817
1818
1819
1820
1821
1822
1823



1824
1825










1826

1827

1828











1829
1830
1831
1832
1833
1834
1835
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850

1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870







+
+
+


+
+
+
+
+
+
+
+
+
+

+
-
+

+
+
+
+
+
+
+
+
+
+
+







		return TCL_ERROR;
	    }

	    if (Tcl_GetIntFromObj(interp, objv[3], &count) != TCL_OK) {
		return TCL_ERROR;
	    }

	    if (count == 1) {
		Tcl_SetObjResult(interp, objv[2]);
	    } else if (count > 1) {
	    string1 = Tcl_GetStringFromObj(objv[2], &length1);
	    if (length1 > 0) {
		    /*
		     * Only build up a string that has data.  Instead of
		     * building it up with repeated appends, we just allocate
		     * the necessary space once and copy the string value in.
		     */
		    length2		= length1 * count;
		    /*
		     * Include space for the NULL
		     */
		    string2		= (char *) ckalloc((size_t) length2+1);
		for (index = 0; index < count; index++) {
			memcpy(string2 + (length1 * index), string1,
		    Tcl_AppendToObj(resultPtr, string1, length1);
				(size_t) length1);
		}
		    string2[length2]	= '\0';
		    /*
		     * We have to directly assign this instead of using
		     * Tcl_SetStringObj (and indirectly TclInitStringRep)
		     * because that makes another copy of the data.
		     */
		    resultPtr		= Tcl_NewObj();
		    resultPtr->bytes	= string2;
		    resultPtr->length	= length2;
		    Tcl_SetObjResult(interp, resultPtr);
	    }
	    }
	    break;
	}
	case STR_REPLACE: {
	    int first, last;

	    if (objc < 5 || objc > 6) {
2478
2479
2480
2481
2482
2483
2484
2485
2486


2487
2488
2489
2490
2491
2492
2493
2513
2514
2515
2516
2517
2518
2519


2520
2521
2522
2523
2524
2525
2526
2527
2528







-
-
+
+







	result = Tcl_EvalObjEx(interp, objPtr, 0);
	if (result != TCL_OK) {
	    return result;
	}
    }
    TclpGetTime(&stop);
    
    totalMicroSec =
	(stop.sec - start.sec)*1000000 + (stop.usec - start.usec);
    totalMicroSec = ( ( (double) ( stop.sec - start.sec ) ) * 1.0e6
		      + ( stop.usec - start.usec ) );
    sprintf(buf, "%.0f microseconds per iteration",
	((count <= 0) ? 0 : totalMicroSec/count));
    Tcl_ResetResult(interp);
    Tcl_AppendToObj(Tcl_GetObjResult(interp), buf, -1);
    return TCL_OK;
}

2615
2616
2617
2618
2619
2620
2621
2622


2623
2624
2625
2626
2627
2628
2629
2650
2651
2652
2653
2654
2655
2656

2657
2658
2659
2660
2661
2662
2663
2664
2665







-
+
+







		command = Tcl_GetStringFromObj(objv[4], &commandLength);
		length = (size_t) commandLength;
		clientData = 0;
		name = Tcl_GetString(objv[2]);
		while ((clientData = Tcl_VarTraceInfo(interp, name, 0,
			TraceVarProc, clientData)) != 0) {
		    tvarPtr = (TraceVarInfo *) clientData;
		    if ((tvarPtr->length == length) && (tvarPtr->flags == flags)
		    if ((tvarPtr->length == length)
			    && (tvarPtr->flags == flags)
			    && (strncmp(command, tvarPtr->command,
				    (size_t) length) == 0)) {
			Tcl_UntraceVar(interp, name, flags | TCL_TRACE_UNSETS,
				TraceVarProc, clientData);
			if (tvarPtr->errMsg != NULL) {
			    ckfree(tvarPtr->errMsg);
			}
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752

2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763





2764
2765
2766



2767
2768
2769
2770
2771
2772
2773
2775
2776
2777
2778
2779
2780
2781



2782
2783
2784

2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814







-
-
-



-
+











+
+
+
+
+



+
+
+







	/*
	 * Generate a command to execute by appending list elements
	 * for the two variable names and the operation.  The five
	 * extra characters are for three space, the opcode character,
	 * and the terminating null.
	 */

	if (name2 == NULL) {
	    name2 = "";
	}
	Tcl_DStringInit(&cmd);
	Tcl_DStringAppend(&cmd, tvarPtr->command, (int) tvarPtr->length);
	Tcl_DStringAppendElement(&cmd, name1);
	Tcl_DStringAppendElement(&cmd, name2);
	Tcl_DStringAppendElement(&cmd, (name2 ? name2 : ""));
	if (flags & TCL_TRACE_READS) {
	    Tcl_DStringAppend(&cmd, " r", 2);
	} else if (flags & TCL_TRACE_WRITES) {
	    Tcl_DStringAppend(&cmd, " w", 2);
	} else if (flags & TCL_TRACE_UNSETS) {
	    Tcl_DStringAppend(&cmd, " u", 2);
	}

	/*
	 * Execute the command.  Save the interp's result used for
	 * the command. We discard any object result the command returns.
	 *
	 * Add the TCL_TRACE_DESTROYED flag to tvarPtr to indicate to
	 * other areas that this will be destroyed by us, otherwise a
	 * double-free might occur depending on what the eval does.
	 * [Bug #536937]
	 */

	Tcl_SaveResult(interp, &state);
	if (flags & TCL_TRACE_DESTROYED) {
	    tvarPtr->flags |= TCL_TRACE_DESTROYED;
	}

	code = Tcl_Eval(interp, Tcl_DStringValue(&cmd));
	if (code != TCL_OK) {	     /* copy error msg to result */
	    char *string;
	    int length;
	    
	    string = Tcl_GetStringFromObj(Tcl_GetObjResult(interp), &length);
Changes to generic/tclCompile.c.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







/* 
 * tclCompile.c --
 *
 *	This file contains procedures that compile Tcl commands or parts
 *	of commands (like quoted strings or nested sub-commands) into a
 *	sequence of instructions ("bytecodes"). 
 *
 * Copyright (c) 1996-1998 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclCompile.c,v 1.20 2000/03/30 04:36:11 hobbs Exp $
 * RCS: @(#) $Id: tclCompile.c,v 1.20.2.2 2002/03/15 20:10:01 msofer Exp $
 */

#include "tclInt.h"
#include "tclCompile.h"

/*
 * Table of all AuxData types.
1195
1196
1197
1198
1199
1200
1201

1202

1203
1204
1205

1206
1207
1208
1209
1210
1211
1212
1195
1196
1197
1198
1199
1200
1201
1202

1203
1204
1205

1206
1207
1208
1209
1210
1211
1212
1213







+
-
+


-
+







			TclEmitInstInt4(INST_LOAD_SCALAR4, localVar,
				envPtr);
		    }
		} else {
		    code = TclCompileTokens(interp, tokenPtr+2,
			    tokenPtr->numComponents-1, envPtr);
		    if (code != TCL_OK) {
			char errorBuffer[150];
			sprintf(buffer,
			sprintf(errorBuffer,
			        "\n    (parsing index for array \"%.*s\")",
				((nameBytes > 100)? 100 : nameBytes), name);
			Tcl_AddObjErrorInfo(interp, buffer, -1);
			Tcl_AddObjErrorInfo(interp, errorBuffer, -1);
			goto error;
		    }
		    depthForVar += envPtr->maxStackDepth;
		    if (localVar < 0) {
			TclEmitOpcode(INST_LOAD_ARRAY_STK, envPtr);
		    } else if (localVar <= 255) {
			TclEmitInstInt1(INST_LOAD_ARRAY1, localVar,
1891
1892
1893
1894
1895
1896
1897
1898
1899


1900
1901


1902
1903
1904
1905
1906
1907
1908
1892
1893
1894
1895
1896
1897
1898


1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911







-
-
+
+


+
+







 *	old array is freed. Byte codes are copied from the old array to the
 *	new one.
 *
 *----------------------------------------------------------------------
 */

void
TclExpandCodeArray(envPtr)
    CompileEnv *envPtr;		/* Points to the CompileEnv whose code array
TclExpandCodeArray(envArgPtr)
    void *envArgPtr;		/* Points to the CompileEnv whose code array
				 * must be enlarged. */
{
    CompileEnv *envPtr = (CompileEnv*) envArgPtr;	/* Points to the CompileEnv whose code array
							 * must be enlarged. */
    /*
     * envPtr->codeNext is equal to envPtr->codeEnd. The currently defined
     * code bytes are stored between envPtr->codeStart and
     * (envPtr->codeNext - 1) [inclusive].
     */
    
    size_t currBytes = (envPtr->codeNext - envPtr->codeStart);
2493
2494
2495
2496
2497
2498
2499
2500

2501
2502
2503
2504
2505
2506
2507
2496
2497
2498
2499
2500
2501
2502

2503
2504
2505
2506
2507
2508
2509
2510







-
+







 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

InstructionDesc *
void * /* == InstructionDesc* == */
TclGetInstructionTable()
{
    return &instructionTable[0];
}

/*
 *--------------------------------------------------------------
Changes to generic/tclCompile.h.
1
2
3
4
5
6
7
8
9

10
11
12
13
14
15
16
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
16








-
+







/*
 * tclCompile.h --
 *
 * Copyright (c) 1996-1998 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclCompile.h,v 1.11 1999/05/23 16:37:14 surles Exp $
 * RCS: @(#) $Id: tclCompile.h,v 1.11.10.1 2001/10/15 20:27:23 andreas_kupries Exp $
 */

#ifndef _TCLCOMPILATION
#define _TCLCOMPILATION 1

#ifndef _TCLINT
#include "tclInt.h"
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
739
740
741
742
743
744
745

746
747


748
749
750
751
752
753
754







-


-
-







EXTERN void		TclDeleteLiteralTable _ANSI_ARGS_((
			    Tcl_Interp *interp, LiteralTable *tablePtr));
EXTERN void		TclEmitForwardJump _ANSI_ARGS_((CompileEnv *envPtr,
			    TclJumpType jumpType, JumpFixup *jumpFixupPtr));
EXTERN ExceptionRange *	TclGetExceptionRangeForPc _ANSI_ARGS_((
			    unsigned char *pc, int catchOnly,
			    ByteCode* codePtr));
EXTERN InstructionDesc * TclGetInstructionTable _ANSI_ARGS_(());
EXTERN int		TclExecuteByteCode _ANSI_ARGS_((Tcl_Interp *interp,
			    ByteCode *codePtr));
EXTERN void		TclExpandCodeArray _ANSI_ARGS_((
			    CompileEnv *envPtr));
EXTERN void		TclExpandJumpFixupArray _ANSI_ARGS_((
                            JumpFixupArray *fixupArrayPtr));
EXTERN void		TclFinalizeAuxDataTypeTable _ANSI_ARGS_((void));
EXTERN int		TclFindCompiledLocal _ANSI_ARGS_((char *name, 
        		    int nameChars, int create, int flags,
			    Proc *procPtr));
EXTERN LiteralEntry *	TclLookupLiteralEntry _ANSI_ARGS_((
Changes to generic/tclDate.c.
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
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












-
+





-
+







/* 
 * tclDate.c --
 *
 *	This file is generated from a yacc grammar defined in
 *	the file tclGetDate.y.  It should not be edited directly.
 *
 * Copyright (c) 1992-1995 Karl Lehenbauer and Mark Diekhans.
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclDate.c,v 1.17 2000/02/28 18:49:42 ericm Exp $
 * RCS: @(#) $Id: tclDate.c,v 1.17.2.3 2001/10/18 20:17:17 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

#ifdef MAC_TCL
#if defined(MAC_TCL) && !defined(TCL_MAC_USE_MSL_EPOCH)
#   define EPOCH           1904
#   define START_OF_TIME   1904
#   define END_OF_TIME     2039
#else
#   define EPOCH           1970
#   define START_OF_TIME   1902
#   define END_OF_TIME     2037
575
576
577
578
579
580
581

















582
583
584
585
586
587
588
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







    tm = TclpGetDate((TclpTime_t)&Start, 0);
    Month = 12 * (tm->tm_year + TM_YEAR_BASE) + tm->tm_mon + RelMonth;
    Year = Month / 12;
    Month = Month % 12 + 1;
    result = Convert(Month, (time_t) tm->tm_mday, Year,
	    (time_t) tm->tm_hour, (time_t) tm->tm_min, (time_t) tm->tm_sec,
	    MER24, DSTmaybe, &Julian);

    /*
     * The Julian time returned above is behind by one day, if "month" 
     * or "year" is used to specify relative time and the GMT flag is true.
     * This problem occurs only when the current time is closer to
     * midnight, the difference being not more than its time difference
     * with GMT. For example, in US/Pacific time zone, the problem occurs
     * whenever the current time is between midnight to 8:00am or 7:00amDST.
     * See Bug# 413397 for more details and sample script.
     * To resolve this bug, we simply add the number of seconds corresponding
     * to timezone difference with GMT to Julian time, if GMT flag is true.
     */

    if (TclDateTimezone == 0) {
        Julian += TclpGetTimeZone((unsigned long) Start) * 60L;
    }

    /*
     * The following iteration takes into account the case were we jump
     * into a "short month".  Far example, "one month from Jan 31" will
     * fail because there is no Feb 31.  The code below will reduce the
     * day and try converting the date until we succed or the date equals
     * 28 (which always works unless the date is bad in another way).
     */
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
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







-
-
-
-
-
-
-
+
+
+
+
+
+
+

-
-
-
+
+
+











-
-
-
-
-
+
+
+
+
+



-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+


-
-
+
+


+
-
-
-
-
-
+
+
+
+
+
-






-
-
+
+


-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+




-
-
-
-
-
-
-
+
+
+
+
+
+
+







	0, -1,
	-2, 0,
	};
# define YYNPROD 56
# define YYLAST 261
static CONST TclDatetabelem TclDateact[]={

    24,    39,    23,    35,    55,    83,    40,    27,    54,    25,
    36,    41,    59,    37,    57,    27,    26,    25,    27,    32,
    25,    31,    62,    50,    26,    82,    78,    26,    51,    77,
    76,    75,    29,    74,    73,    72,    70,    52,    49,    48,
    47,    44,    38,    63,    80,    46,    45,    81,    69,    21,
    66,    61,    68,    67,    56,    43,    64,    11,    10,     9,
     8,     7,    34,     6,     5,     4,     3,     2,    42,     1,
    24,    40,    23,    36,    54,    81,    41,    28,    53,    26,
    37,    42,    58,    38,    56,    28,    27,    26,    28,    33,
    26,    32,    61,    50,    27,    80,    76,    27,    51,    75,
    74,    73,    30,    72,    71,    70,    69,    52,    49,    48,
    47,    45,    39,    62,    78,    46,    79,    68,    25,    65,
    60,    67,    66,    55,    44,    21,    63,    11,    10,     9,
     8,    35,     7,     6,     5,     4,     3,    43,     2,     1,
    20,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,    53,     0,     0,     0,     0,     0,     0,     0,     0,
     0,    58,     0,     0,    60,     0,     0,    79,     0,     0,
     0,     0,     0,     0,     0,     0,     0,    71,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,    57,     0,     0,    59,    77,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,    19,    14,     0,     0,     0,
    16,    27,    22,    25,     0,    12,    13,    17,     0,    15,
    26,    18,    30,     0,     0,    28,     0,    33,    27,     0,
    25,     0,     0,     0,     0,     0,     0,    26,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,    65,
    65 };
    16,    28,    22,    26,     0,    12,    13,    17,     0,    15,
    27,    18,    31,     0,     0,    29,     0,    34,    28,     0,
    26,     0,     0,     0,     0,     0,     0,    27,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,    64,
    64 };
static CONST TclDatetabelem TclDatepact[]={

-10000000,   -43,-10000000,-10000000,-10000000,-10000000,-10000000,-10000000,-10000000,-10000000,
-10000000,-10000000,   -26,  -268,-10000000,  -259,  -226,-10000000,  -257,    11,
  -227,  -212,  -228,-10000000,-10000000,-10000000,-10000000,-10000000,-10000000,  -229,
-10000000,  -230,  -240,  -231,  -212,-10000000,  -264,-10000000,    10,-10000000,
-10000000,  -249,-10000000,-10000000,  -246,-10000000,-10000000,     5,    -2,     3,
     8,     7,-10000000,-10000000,-10000000,   -10,  -232,-10000000,-10000000,-10000000,
  -212,  -233,-10000000,  -234,  -235,-10000000,  -237,  -238,  -239,  -242,
-10000000,-10000000,-10000000,-10000000,    -1,-10000000,-10000000,-10000000,   -11,-10000000,
  -243,  -263,-10000000,-10000000 };
-10000000,-10000000,   -26,  -268,-10000000,  -259,  -226,-10000000,  -257,    10,
  -227,  -212,  -228,-10000000,-10000000,-10000000,-10000000,-10000000,-10000000,-10000000,
  -229,-10000000,  -230,  -240,  -231,-10000000,-10000000,  -264,-10000000,     9,
-10000000,-10000000,  -249,-10000000,-10000000,  -246,-10000000,     4,    -2,     2,
     7,     6,-10000000,-10000000,   -11,  -232,-10000000,-10000000,-10000000,-10000000,
  -233,-10000000,  -234,  -235,-10000000,  -237,  -238,  -239,  -242,-10000000,
-10000000,-10000000,    -1,-10000000,-10000000,-10000000,   -12,-10000000,  -243,  -263,
-10000000,-10000000 };
static CONST TclDatetabelem TclDatepgo[]={

     0,    49,    46,    70,    22,    69,    67,    66,    65,    64,
    63,    61,    60,    59,    58,    57 };
     0,    48,    70,    22,    69,    68,    66,    65,    64,    63,
    62,    60,    59,    58,    57,    55 };
static CONST TclDatetabelem TclDater1[]={

     0,     4,     4,     5,     5,     5,     5,     5,     5,     5,
     0,     5,     5,     6,     6,     6,     6,     6,     6,     6,
     6,     6,     7,     7,     7,     7,     7,     8,     8,     8,
    11,    11,    11,    11,    11,     9,     9,     9,     9,     9,
     9,     9,     9,     9,     9,    10,    10,    13,    13,    13,
    14,    12,    12,    12,    12,    12,     3,     3,     1,     1,
     5,     5,     6,     6,     6,     6,     6,     7,     7,     7,
    10,    10,    10,    10,    10,     8,     8,     8,     8,     8,
     8,     8,     8,     8,     8,     9,     9,    12,    12,    12,
    13,    11,    11,    15,    15,    15,    15,    15,     2,     2,
     1,     1,     1,    14,     3,     3 };
     1,     2,     2,    15,     4,     4 };
static CONST TclDatetabelem TclDater2[]={

     0,     0,     4,     3,     3,     3,     3,     3,     3,     3,
     3,     2,     5,     9,    11,    13,    15,     5,     3,     3,
     3,     5,     5,     7,     5,     7,    11,     3,    11,    11,
     5,     9,     5,     3,     7,     5,     7,     7,    15,     5,
     9,     9,     7,     5,     7,     5,     3,     3,     3,     3,
     3,     3,     1,     3,     1,     3 };
     9,     5,     2,     7,     5,     5,     7,     3,     3,     3,
     3,     3,     3,     3,     1,     3 };
static CONST TclDatetabelem TclDatechk[]={

-10000000,    -5,    -6,    -7,    -8,    -9,   -10,   -11,   -12,   -13,
   -14,   -15,   268,   269,   259,   272,   263,   270,   274,   258,
    -3,    -1,   265,    45,    43,   266,   273,   264,   261,    58,
   258,    47,    45,   263,    -1,   271,   269,   272,   268,   258,
   263,   268,    -1,    44,   268,    -2,   257,   268,   268,   268,
   263,   268,   268,    -2,   272,   268,    44,   263,    -1,   258,
    -1,    46,    -4,    45,    58,   261,    47,    45,    45,    58,
   268,    -2,   268,   268,   268,   268,   268,   268,   268,    -4,
    45,    58,   268,   268 };
-10000000,    -4,    -5,    -6,    -7,    -8,    -9,   -10,   -11,   -12,
   -13,   -14,   268,   269,   259,   272,   263,   270,   274,   258,
    -2,   -15,   265,    45,    43,    -1,   266,   273,   264,   261,
    58,   258,    47,    45,   263,    -1,   271,   269,   272,   268,
   258,   263,   268,    -1,    44,   268,   257,   268,   268,   268,
   263,   268,   268,   272,   268,    44,   263,    -1,   258,    -1,
    46,    -3,    45,    58,   261,    47,    45,    45,    58,   268,
   268,   268,   268,   268,   268,   268,   268,    -3,    45,    58,
   268,   268 };
static CONST TclDatetabelem TclDatedef[]={

     1,    -2,     2,     3,     4,     5,     6,     7,     8,     9,
    10,    11,    53,    18,    19,    27,     0,    33,     0,    20,
     0,    52,     0,    46,    47,    48,    49,    50,    12,     0,
    22,     0,     0,    32,    52,    17,     0,    39,    30,    24,
    35,     0,    43,    21,     0,    45,    51,     0,    54,    25,
     0,     0,    34,    42,    37,     0,     0,    36,    44,    23,
    52,     0,    13,     0,     0,    55,     0,     0,     0,     0,
    31,    41,    40,    14,    54,    26,    28,    29,     0,    15,
     0,     0,    16,    38 };
     0,    42,     0,    48,    49,    47,    50,    51,    52,    12,
     0,    22,     0,     0,    32,    44,    17,     0,    39,    30,
    24,    35,     0,    45,    21,     0,    41,     0,    54,    25,
     0,     0,    34,    37,     0,     0,    36,    46,    23,    43,
     0,    13,     0,     0,    55,     0,     0,     0,     0,    31,
    40,    14,    54,    26,    28,    29,     0,    15,     0,     0,
    16,    38 };
typedef struct
#ifdef __cplusplus
	TclDatetoktype
#endif
{ char *t_name; int t_val; } TclDatetoktype;
#ifndef YYDEBUG
#	define YYDEBUG	0	/* don't allow debugging */
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
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







+
+
-
-
-
-
-
+
+
+
+
+





-
-







	"date : tUNUMBER tMONTH tUNUMBER",
	"ordMonth : tNEXT tMONTH",
	"ordMonth : tNEXT tUNUMBER tMONTH",
	"iso : tISOBASE tZONE tISOBASE",
	"iso : tISOBASE tZONE tUNUMBER ':' tUNUMBER ':' tUNUMBER",
	"iso : tISOBASE tISOBASE",
	"trek : tSTARDATE tUNUMBER '.' tUNUMBER",
	"relspec : relunits tAGO",
	"relspec : relunits",
	"relspec : sign tUNUMBER unit ago",
	"relspec : tUNUMBER unit ago",
	"relspec : tNEXT unit",
	"relspec : tNEXT tUNUMBER unit",
	"relspec : unit ago",
	"relunits : sign tUNUMBER unit",
	"relunits : tUNUMBER unit",
	"relunits : tNEXT unit",
	"relunits : tNEXT tUNUMBER unit",
	"relunits : unit",
	"sign : '-'",
	"sign : '+'",
	"unit : tSEC_UNIT",
	"unit : tDAY_UNIT",
	"unit : tMONTH_UNIT",
	"ago : tAGO",
	"ago : /* empty */",
	"number : tUNUMBER",
	"o_merid : /* empty */",
	"o_merid : tMERIDIAN",
};
#endif /* YYDEBUG */
/*
 * Copyright (c) 1993 by Sun Microsystems, Inc.
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824















1825
1826
1827
1828
1829
1830
1831
1832
1833
1825
1826
1827
1828
1829
1830
1831










1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846


1847
1848
1849
1850
1851
1852
1853







-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-







	     */
            TclDateYear = TclDatepvt[-2].Number/1000 + 2323 - 377;
            TclDateDay  = 1;
	    TclDateMonth = 1;
	    TclDateRelDay += ((TclDatepvt[-2].Number%1000)*(365 + IsLeapYear(TclDateYear)))/1000;
	    TclDateRelSeconds += TclDatepvt[-0].Number * 144 * 60;
        } break;
case 41:{ *TclDateRelPointer += TclDatepvt[-3].Number * TclDatepvt[-2].Number * TclDatepvt[-1].Number * TclDatepvt[-0].Number; } break;
case 42:{ *TclDateRelPointer += TclDatepvt[-2].Number * TclDatepvt[-1].Number * TclDatepvt[-0].Number; } break;
case 43:{ *TclDateRelPointer += TclDatepvt[-0].Number; } break;
case 44:{ *TclDateRelPointer += TclDatepvt[-1].Number * TclDatepvt[-0].Number; } break;
case 45:{ *TclDateRelPointer += TclDatepvt[-1].Number * TclDatepvt[-0].Number; } break;
case 46:{ TclDateval.Number = -1; } break;
case 47:{ TclDateval.Number =  1; } break;
case 48:{ TclDateval.Number = TclDatepvt[-0].Number; TclDateRelPointer = &TclDateRelSeconds; } break;
case 49:{ TclDateval.Number = TclDatepvt[-0].Number; TclDateRelPointer = &TclDateRelDay; } break;
case 50:{ TclDateval.Number = TclDatepvt[-0].Number; TclDateRelPointer = &TclDateRelMonth; } break;
case 41:{
	    TclDateRelSeconds *= -1;
	    TclDateRelMonth *= -1;
	    TclDateRelDay *= -1;
	} break;
case 43:{ *TclDateRelPointer += TclDatepvt[-2].Number * TclDatepvt[-1].Number * TclDatepvt[-0].Number; } break;
case 44:{ *TclDateRelPointer += TclDatepvt[-1].Number * TclDatepvt[-0].Number; } break;
case 45:{ *TclDateRelPointer += TclDatepvt[-0].Number; } break;
case 46:{ *TclDateRelPointer += TclDatepvt[-1].Number * TclDatepvt[-0].Number; } break;
case 47:{ *TclDateRelPointer += TclDatepvt[-0].Number; } break;
case 48:{ TclDateval.Number = -1; } break;
case 49:{ TclDateval.Number =  1; } break;
case 50:{ TclDateval.Number = TclDatepvt[-0].Number; TclDateRelPointer = &TclDateRelSeconds; } break;
case 51:{ TclDateval.Number = TclDatepvt[-0].Number; TclDateRelPointer = &TclDateRelDay; } break;
case 52:{ TclDateval.Number = TclDatepvt[-0].Number; TclDateRelPointer = &TclDateRelMonth; } break;
case 51:{ TclDateval.Number = -1; } break;
case 52:{ TclDateval.Number = 1; } break;
case 53:{
	if (TclDateHaveTime && TclDateHaveDate && !TclDateHaveRel) {
	    TclDateYear = TclDatepvt[-0].Number;
	} else {
	    TclDateHaveTime++;
	    if (TclDatepvt[-0].Number < 100) {
		TclDateHour = TclDatepvt[-0].Number;
Changes to generic/tclDecls.h.
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10

11
12
13
14
15
16
17
18










-
+







/*
 * tclDecls.h --
 *
 *	Declarations of functions in the platform independent public Tcl API.
 *
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclDecls.h,v 1.34 2000/04/09 16:04:17 kupries Exp $
 * RCS: @(#) $Id: tclDecls.h,v 1.34.2.2 2001/08/28 00:12:43 hobbs Exp $
 */

#ifndef _TCLDECLS
#define _TCLDECLS

/*
 * WARNING: This file is automatically generated by the tools/genStubs.tcl
905
906
907
908
909
910
911
912

913
914
915
916


917
918
919
920
921
922
923
905
906
907
908
909
910
911

912
913
914
915

916
917
918
919
920
921
922
923
924







-
+



-
+
+







EXTERN void		Tcl_InitMemory _ANSI_ARGS_((Tcl_Interp * interp));
/* 281 */
EXTERN Tcl_Channel	Tcl_StackChannel _ANSI_ARGS_((Tcl_Interp * interp, 
				Tcl_ChannelType * typePtr, 
				ClientData instanceData, int mask, 
				Tcl_Channel prevChan));
/* 282 */
EXTERN void		Tcl_UnstackChannel _ANSI_ARGS_((Tcl_Interp * interp, 
EXTERN int		Tcl_UnstackChannel _ANSI_ARGS_((Tcl_Interp * interp, 
				Tcl_Channel chan));
/* 283 */
EXTERN Tcl_Channel	Tcl_GetStackedChannel _ANSI_ARGS_((Tcl_Channel chan));
/* Slot 284 is reserved */
/* 284 */
EXTERN void		Tcl_SetMainLoop _ANSI_ARGS_((Tcl_MainLoopProc * proc));
/* Slot 285 is reserved */
/* 286 */
EXTERN void		Tcl_AppendObjToObj _ANSI_ARGS_((Tcl_Obj * objPtr, 
				Tcl_Obj * appendObjPtr));
/* 287 */
EXTERN Tcl_Encoding	Tcl_CreateEncoding _ANSI_ARGS_((
				Tcl_EncodingType * typePtr));
1224
1225
1226
1227
1228
1229
1230




















































1231
1232
1233
1234
1235
1236
1237
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







/* 392 */
EXTERN void		Tcl_MutexFinalize _ANSI_ARGS_((Tcl_Mutex * mutex));
/* 393 */
EXTERN int		Tcl_CreateThread _ANSI_ARGS_((Tcl_ThreadId * idPtr, 
				Tcl_ThreadCreateProc proc, 
				ClientData clientData, int stackSize, 
				int flags));
/* 394 */
EXTERN int		Tcl_ReadRaw _ANSI_ARGS_((Tcl_Channel chan, 
				char * dst, int bytesToRead));
/* 395 */
EXTERN int		Tcl_WriteRaw _ANSI_ARGS_((Tcl_Channel chan, 
				char * src, int srcLen));
/* 396 */
EXTERN Tcl_Channel	Tcl_GetTopChannel _ANSI_ARGS_((Tcl_Channel chan));
/* 397 */
EXTERN int		Tcl_ChannelBuffered _ANSI_ARGS_((Tcl_Channel chan));
/* 398 */
EXTERN char *		Tcl_ChannelName _ANSI_ARGS_((
				Tcl_ChannelType * chanTypePtr));
/* 399 */
EXTERN Tcl_ChannelTypeVersion Tcl_ChannelVersion _ANSI_ARGS_((
				Tcl_ChannelType * chanTypePtr));
/* 400 */
EXTERN Tcl_DriverBlockModeProc * Tcl_ChannelBlockModeProc _ANSI_ARGS_((
				Tcl_ChannelType * chanTypePtr));
/* 401 */
EXTERN Tcl_DriverCloseProc * Tcl_ChannelCloseProc _ANSI_ARGS_((
				Tcl_ChannelType * chanTypePtr));
/* 402 */
EXTERN Tcl_DriverClose2Proc * Tcl_ChannelClose2Proc _ANSI_ARGS_((
				Tcl_ChannelType * chanTypePtr));
/* 403 */
EXTERN Tcl_DriverInputProc * Tcl_ChannelInputProc _ANSI_ARGS_((
				Tcl_ChannelType * chanTypePtr));
/* 404 */
EXTERN Tcl_DriverOutputProc * Tcl_ChannelOutputProc _ANSI_ARGS_((
				Tcl_ChannelType * chanTypePtr));
/* 405 */
EXTERN Tcl_DriverSeekProc * Tcl_ChannelSeekProc _ANSI_ARGS_((
				Tcl_ChannelType * chanTypePtr));
/* 406 */
EXTERN Tcl_DriverSetOptionProc * Tcl_ChannelSetOptionProc _ANSI_ARGS_((
				Tcl_ChannelType * chanTypePtr));
/* 407 */
EXTERN Tcl_DriverGetOptionProc * Tcl_ChannelGetOptionProc _ANSI_ARGS_((
				Tcl_ChannelType * chanTypePtr));
/* 408 */
EXTERN Tcl_DriverWatchProc * Tcl_ChannelWatchProc _ANSI_ARGS_((
				Tcl_ChannelType * chanTypePtr));
/* 409 */
EXTERN Tcl_DriverGetHandleProc * Tcl_ChannelGetHandleProc _ANSI_ARGS_((
				Tcl_ChannelType * chanTypePtr));
/* 410 */
EXTERN Tcl_DriverFlushProc * Tcl_ChannelFlushProc _ANSI_ARGS_((
				Tcl_ChannelType * chanTypePtr));
/* 411 */
EXTERN Tcl_DriverHandlerProc * Tcl_ChannelHandlerProc _ANSI_ARGS_((
				Tcl_ChannelType * chanTypePtr));

typedef struct TclStubHooks {
    struct TclPlatStubs *tclPlatStubs;
    struct TclIntStubs *tclIntStubs;
    struct TclIntPlatStubs *tclIntPlatStubs;
} TclStubHooks;

1573
1574
1575
1576
1577
1578
1579
1580

1581
1582

1583
1584
1585
1586
1587
1588
1589
1626
1627
1628
1629
1630
1631
1632

1633
1634

1635
1636
1637
1638
1639
1640
1641
1642







-
+

-
+







#endif /* __WIN32__ */
#ifdef MAC_TCL
    void *reserved278;
#endif /* MAC_TCL */
    void (*tcl_GetVersion) _ANSI_ARGS_((int * major, int * minor, int * patchLevel, int * type)); /* 279 */
    void (*tcl_InitMemory) _ANSI_ARGS_((Tcl_Interp * interp)); /* 280 */
    Tcl_Channel (*tcl_StackChannel) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_ChannelType * typePtr, ClientData instanceData, int mask, Tcl_Channel prevChan)); /* 281 */
    void (*tcl_UnstackChannel) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Channel chan)); /* 282 */
    int (*tcl_UnstackChannel) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Channel chan)); /* 282 */
    Tcl_Channel (*tcl_GetStackedChannel) _ANSI_ARGS_((Tcl_Channel chan)); /* 283 */
    void *reserved284;
    void (*tcl_SetMainLoop) _ANSI_ARGS_((Tcl_MainLoopProc * proc)); /* 284 */
    void *reserved285;
    void (*tcl_AppendObjToObj) _ANSI_ARGS_((Tcl_Obj * objPtr, Tcl_Obj * appendObjPtr)); /* 286 */
    Tcl_Encoding (*tcl_CreateEncoding) _ANSI_ARGS_((Tcl_EncodingType * typePtr)); /* 287 */
    void (*tcl_CreateThreadExitHandler) _ANSI_ARGS_((Tcl_ExitProc * proc, ClientData clientData)); /* 288 */
    void (*tcl_DeleteThreadExitHandler) _ANSI_ARGS_((Tcl_ExitProc * proc, ClientData clientData)); /* 289 */
    void (*tcl_DiscardResult) _ANSI_ARGS_((Tcl_SavedResult * statePtr)); /* 290 */
    int (*tcl_EvalEx) _ANSI_ARGS_((Tcl_Interp * interp, char * script, int numBytes, int flags)); /* 291 */
1685
1686
1687
1688
1689
1690
1691


















1692
1693
1694
1695
1696
1697
1698
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







    Tcl_Mutex * (*tcl_GetAllocMutex) _ANSI_ARGS_((void)); /* 387 */
    int (*tcl_GetChannelNames) _ANSI_ARGS_((Tcl_Interp * interp)); /* 388 */
    int (*tcl_GetChannelNamesEx) _ANSI_ARGS_((Tcl_Interp * interp, char * pattern)); /* 389 */
    int (*tcl_ProcObjCmd) _ANSI_ARGS_((ClientData clientData, Tcl_Interp * interp, int objc, Tcl_Obj *CONST objv[])); /* 390 */
    void (*tcl_ConditionFinalize) _ANSI_ARGS_((Tcl_Condition * condPtr)); /* 391 */
    void (*tcl_MutexFinalize) _ANSI_ARGS_((Tcl_Mutex * mutex)); /* 392 */
    int (*tcl_CreateThread) _ANSI_ARGS_((Tcl_ThreadId * idPtr, Tcl_ThreadCreateProc proc, ClientData clientData, int stackSize, int flags)); /* 393 */
    int (*tcl_ReadRaw) _ANSI_ARGS_((Tcl_Channel chan, char * dst, int bytesToRead)); /* 394 */
    int (*tcl_WriteRaw) _ANSI_ARGS_((Tcl_Channel chan, char * src, int srcLen)); /* 395 */
    Tcl_Channel (*tcl_GetTopChannel) _ANSI_ARGS_((Tcl_Channel chan)); /* 396 */
    int (*tcl_ChannelBuffered) _ANSI_ARGS_((Tcl_Channel chan)); /* 397 */
    char * (*tcl_ChannelName) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 398 */
    Tcl_ChannelTypeVersion (*tcl_ChannelVersion) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 399 */
    Tcl_DriverBlockModeProc * (*tcl_ChannelBlockModeProc) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 400 */
    Tcl_DriverCloseProc * (*tcl_ChannelCloseProc) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 401 */
    Tcl_DriverClose2Proc * (*tcl_ChannelClose2Proc) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 402 */
    Tcl_DriverInputProc * (*tcl_ChannelInputProc) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 403 */
    Tcl_DriverOutputProc * (*tcl_ChannelOutputProc) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 404 */
    Tcl_DriverSeekProc * (*tcl_ChannelSeekProc) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 405 */
    Tcl_DriverSetOptionProc * (*tcl_ChannelSetOptionProc) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 406 */
    Tcl_DriverGetOptionProc * (*tcl_ChannelGetOptionProc) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 407 */
    Tcl_DriverWatchProc * (*tcl_ChannelWatchProc) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 408 */
    Tcl_DriverGetHandleProc * (*tcl_ChannelGetHandleProc) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 409 */
    Tcl_DriverFlushProc * (*tcl_ChannelFlushProc) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 410 */
    Tcl_DriverHandlerProc * (*tcl_ChannelHandlerProc) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 411 */
} TclStubs;

#ifdef __cplusplus
extern "C" {
#endif
extern TclStubs *tclStubsPtr;
#ifdef __cplusplus
2872
2873
2874
2875
2876
2877
2878


2879


2880
2881
2882
2883
2884
2885
2886
2943
2944
2945
2946
2947
2948
2949
2950
2951

2952
2953
2954
2955
2956
2957
2958
2959
2960







+
+
-
+
+







#define Tcl_UnstackChannel \
	(tclStubsPtr->tcl_UnstackChannel) /* 282 */
#endif
#ifndef Tcl_GetStackedChannel
#define Tcl_GetStackedChannel \
	(tclStubsPtr->tcl_GetStackedChannel) /* 283 */
#endif
#ifndef Tcl_SetMainLoop
#define Tcl_SetMainLoop \
/* Slot 284 is reserved */
	(tclStubsPtr->tcl_SetMainLoop) /* 284 */
#endif
/* Slot 285 is reserved */
#ifndef Tcl_AppendObjToObj
#define Tcl_AppendObjToObj \
	(tclStubsPtr->tcl_AppendObjToObj) /* 286 */
#endif
#ifndef Tcl_CreateEncoding
#define Tcl_CreateEncoding \
3306
3307
3308
3309
3310
3311
3312








































































3313
3314
3315
3316
3317
3318
3319
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







#define Tcl_MutexFinalize \
	(tclStubsPtr->tcl_MutexFinalize) /* 392 */
#endif
#ifndef Tcl_CreateThread
#define Tcl_CreateThread \
	(tclStubsPtr->tcl_CreateThread) /* 393 */
#endif
#ifndef Tcl_ReadRaw
#define Tcl_ReadRaw \
	(tclStubsPtr->tcl_ReadRaw) /* 394 */
#endif
#ifndef Tcl_WriteRaw
#define Tcl_WriteRaw \
	(tclStubsPtr->tcl_WriteRaw) /* 395 */
#endif
#ifndef Tcl_GetTopChannel
#define Tcl_GetTopChannel \
	(tclStubsPtr->tcl_GetTopChannel) /* 396 */
#endif
#ifndef Tcl_ChannelBuffered
#define Tcl_ChannelBuffered \
	(tclStubsPtr->tcl_ChannelBuffered) /* 397 */
#endif
#ifndef Tcl_ChannelName
#define Tcl_ChannelName \
	(tclStubsPtr->tcl_ChannelName) /* 398 */
#endif
#ifndef Tcl_ChannelVersion
#define Tcl_ChannelVersion \
	(tclStubsPtr->tcl_ChannelVersion) /* 399 */
#endif
#ifndef Tcl_ChannelBlockModeProc
#define Tcl_ChannelBlockModeProc \
	(tclStubsPtr->tcl_ChannelBlockModeProc) /* 400 */
#endif
#ifndef Tcl_ChannelCloseProc
#define Tcl_ChannelCloseProc \
	(tclStubsPtr->tcl_ChannelCloseProc) /* 401 */
#endif
#ifndef Tcl_ChannelClose2Proc
#define Tcl_ChannelClose2Proc \
	(tclStubsPtr->tcl_ChannelClose2Proc) /* 402 */
#endif
#ifndef Tcl_ChannelInputProc
#define Tcl_ChannelInputProc \
	(tclStubsPtr->tcl_ChannelInputProc) /* 403 */
#endif
#ifndef Tcl_ChannelOutputProc
#define Tcl_ChannelOutputProc \
	(tclStubsPtr->tcl_ChannelOutputProc) /* 404 */
#endif
#ifndef Tcl_ChannelSeekProc
#define Tcl_ChannelSeekProc \
	(tclStubsPtr->tcl_ChannelSeekProc) /* 405 */
#endif
#ifndef Tcl_ChannelSetOptionProc
#define Tcl_ChannelSetOptionProc \
	(tclStubsPtr->tcl_ChannelSetOptionProc) /* 406 */
#endif
#ifndef Tcl_ChannelGetOptionProc
#define Tcl_ChannelGetOptionProc \
	(tclStubsPtr->tcl_ChannelGetOptionProc) /* 407 */
#endif
#ifndef Tcl_ChannelWatchProc
#define Tcl_ChannelWatchProc \
	(tclStubsPtr->tcl_ChannelWatchProc) /* 408 */
#endif
#ifndef Tcl_ChannelGetHandleProc
#define Tcl_ChannelGetHandleProc \
	(tclStubsPtr->tcl_ChannelGetHandleProc) /* 409 */
#endif
#ifndef Tcl_ChannelFlushProc
#define Tcl_ChannelFlushProc \
	(tclStubsPtr->tcl_ChannelFlushProc) /* 410 */
#endif
#ifndef Tcl_ChannelHandlerProc
#define Tcl_ChannelHandlerProc \
	(tclStubsPtr->tcl_ChannelHandlerProc) /* 411 */
#endif

#endif /* defined(USE_TCL_STUBS) && !defined(USE_TCL_STUB_PROCS) */

/* !END!: Do not edit above this line. */

#endif /* _TCLDECLS */

Changes to generic/tclEncoding.c.
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10

11
12
13
14
15
16
17
18










-
+







/*
 * tclEncoding.c --
 *
 *	Contains the implementation of the encoding conversion package.
 *
 * Copyright (c) 1996-1998 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclEncoding.c,v 1.5 2000/01/21 02:25:26 hobbs Exp $
 * RCS: @(#) $Id: tclEncoding.c,v 1.5.2.1 2001/04/03 22:54:36 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

typedef size_t (LengthProc)_ANSI_ARGS_((CONST char *src));

1324
1325
1326
1327
1328
1329
1330
1331






1332



1333
1334













1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
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







-
+
+
+
+
+
+

+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+


-
-







    char *line;
    int i, hi, lo, numPages, symbol, fallback;
    unsigned char used[256];
    unsigned int size;
    TableEncodingData *dataPtr;
    unsigned short *pageMemPtr;
    Tcl_EncodingType encType;
    char *hex;

    /*
     * Speed over memory. Use a full 256 character table to decode hex
     * sequences in the encoding files.
     */

    static char staticHex[] = {
      0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*   0 ...  15 */
      0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*  16 ...  31 */
      0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*  32 ...  47 */
	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0,
	10, 11, 12, 13, 14, 15
      0,  1,  2,  3,  4,  5,  6, 7, 8, 9, 0, 0, 0, 0, 0, 0, /*  48 ...  63 */
      0, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*  64 ...  79 */
      0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*  80 ...  95 */
      0, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*  96 ... 111 */
      0,  1,  2,  3,  4,  5,  6, 7, 8, 9, 0, 0, 0, 0, 0, 0, /* 112 ... 127 */
      0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 128 ... 143 */
      0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 144 ... 159 */
      0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 160 ... 175 */
      0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 176 ... 191 */
      0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 192 ... 207 */
      0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 208 ... 223 */
      0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 224 ... 239 */
      0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 240 ... 255 */
    };

    hex = staticHex - '0';

    Tcl_DStringInit(&lineString);
    Tcl_Gets(chan, &lineString);
    line = Tcl_DStringValue(&lineString);

    fallback = (int) strtol(line, &line, 16);
    symbol = (int) strtol(line, &line, 10);
    numPages = (int) strtol(line, &line, 10);
1379
1380
1381
1382
1383
1384
1385
1386

1387
1388
1389
1390
1391
1392
1393
1394


1395
1396
1397
1398
1399
1400
1401
1396
1397
1398
1399
1400
1401
1402

1403
1404
1405
1406
1407
1408
1409


1410
1411
1412
1413
1414
1415
1416
1417
1418







-
+






-
-
+
+







    }
    for (i = 0; i < numPages; i++) {
	int ch;
	char *p;

	Tcl_ReadChars(chan, objPtr, 3 + 16 * (16 * 4 + 1), 0);
	p = Tcl_GetString(objPtr);
	hi = (hex[(int)p[0]] << 4) + hex[(int)p[1]];
	hi = (staticHex[(unsigned int)p[0]] << 4) + staticHex[(unsigned int)p[1]];
	dataPtr->toUnicode[hi] = pageMemPtr;
	p += 2;
	for (lo = 0; lo < 256; lo++) {
	    if ((lo & 0x0f) == 0) {
		p++;
	    }
	    ch = (hex[(int)p[0]] << 12) + (hex[(int)p[1]] << 8)
		+ (hex[(int)p[2]] << 4) + hex[(int)p[3]];
	    ch = (staticHex[(unsigned int)p[0]] << 12) + (staticHex[(unsigned int)p[1]] << 8)
		+ (staticHex[(unsigned int)p[2]] << 4) + staticHex[(unsigned int)p[3]];
	    if (ch != 0) {
		used[ch >> 8] = 1;
	    }
	    *pageMemPtr = (unsigned short) ch;
	    pageMemPtr++;
	    p += 4;
	}
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1523
1524
1525
1526
1527
1528
1529

1530
1531
1532
1533
1534
1535
1536







-







    encType.encodingName    = name;
    encType.toUtfProc	    = TableToUtfProc;
    encType.fromUtfProc	    = TableFromUtfProc;
    encType.freeProc	    = TableFreeProc;
    encType.nullSize	    = (type == ENCODING_DOUBLEBYTE) ? 2 : 1;
    encType.clientData	    = (ClientData) dataPtr;
    return Tcl_CreateEncoding(&encType);

}

/*
 *-------------------------------------------------------------------------
 *
 * LoadEscapeEncoding --
 *
Changes to generic/tclEnv.c.
8
9
10
11
12
13
14
15

16
17
18
19
20
21
22
8
9
10
11
12
13
14

15
16
17
18
19
20
21
22







-
+







 *
 * Copyright (c) 1991-1994 The Regents of the University of California.
 * Copyright (c) 1994-1998 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclEnv.c,v 1.7 2000/04/19 08:32:44 hobbs Exp $
 * RCS: @(#) $Id: tclEnv.c,v 1.7.2.2 2001/04/03 22:54:37 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

TCL_DECLARE_MUTEX(envMutex)	/* To serialize access to environ */

352
353
354
355
356
357
358
359


360
361
362
363
364
365
366
352
353
354
355
356
357
358

359
360
361
362
363
364
365
366
367







-
+
+







 */

void
TclUnsetEnv(name)
    CONST char *name;		/* Name of variable to remove (UTF-8). */
{
    char *oldValue;
    int length, index;
    int length;
    int index;
#ifdef USE_PUTENV
    Tcl_DString envString;
    char *string;
#else
    char **envPtr;
#endif

Changes to generic/tclEvent.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







/* 
 * tclEvent.c --
 *
 *	This file implements some general event related interfaces including
 *	background errors, exit handlers, and the "vwait" and "update"
 *	command procedures. 
 *
 * Copyright (c) 1990-1994 The Regents of the University of California.
 * Copyright (c) 1994-1998 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclEvent.c,v 1.8 2000/04/18 23:10:04 hobbs Exp $
 * RCS: @(#) $Id: tclEvent.c,v 1.8.2.5 2001/10/03 18:30:45 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

/*
 * The data structure below is used to report background errors.  One
94
95
96
97
98
99
100





101
102
103
104
105
106
107
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112







+
+
+
+
+







    int inExit;			/* True when this thread is exiting. This
				 * is used as a hack to decide to close
				 * the standard channels. */
    Tcl_Obj *tclLibraryPath;	/* Path(s) to the Tcl library */
} ThreadSpecificData;
static Tcl_ThreadDataKey dataKey;

/*
 * Common string for the library path for sharing across threads.
 */
char *tclLibraryPathStr;

/*
 * Prototypes for procedures referenced only in this file:
 */

static void		BgErrorDeleteProc _ANSI_ARGS_((ClientData clientData,
			    Tcl_Interp *interp));
static void		HandleBgErrors _ANSI_ARGS_((ClientData clientData));
592
593
594
595
596
597
598






599
600
601
602
603
604
605
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616







+
+
+
+
+
+







    if (pathPtr != NULL) {
	Tcl_IncrRefCount(pathPtr);
    }
    if (tsdPtr->tclLibraryPath != NULL) {
	Tcl_DecrRefCount(tsdPtr->tclLibraryPath);
    }
    tsdPtr->tclLibraryPath = pathPtr;

    /*
     *  No mutex locking is needed here as up the stack we're within
     *  TclpInitLock().
     */
    tclLibraryPathStr = Tcl_GetStringFromObj(pathPtr, NULL);
}

/*
 *-------------------------------------------------------------------------
 *
 * TclGetLibraryPath --
 *
615
616
617
618
619
620
621











622
623
624
625
626
627
628
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650







+
+
+
+
+
+
+
+
+
+
+







 *-------------------------------------------------------------------------
 */

Tcl_Obj *
TclGetLibraryPath()
{
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);

    if (tsdPtr->tclLibraryPath == NULL) {
	/*
	 * Grab the shared string and place it into a new thread specific
	 * Tcl_Obj.
	 */
	tsdPtr->tclLibraryPath = Tcl_NewStringObj(tclLibraryPathStr, -1);

	/* take ownership */
	Tcl_IncrRefCount(tsdPtr->tclLibraryPath);
    }
    return tsdPtr->tclLibraryPath;
}

/*
 *-------------------------------------------------------------------------
 *
 * TclInitSubsystems --
740
741
742
743
744
745
746
747
748
749


750
751
752
753
754
755
756
762
763
764
765
766
767
768

769
770
771
772
773
774
775
776
777
778
779







-


+
+







void
Tcl_Finalize()
{
    ExitHandler *exitPtr;
    ThreadSpecificData *tsdPtr;

    TclpInitLock();
    tsdPtr = TCL_TSD_INIT(&dataKey);
    if (subsystemsInitialized != 0) {
	subsystemsInitialized = 0;

	tsdPtr = TCL_TSD_INIT(&dataKey);

	/*
	 * Invoke exit handlers first.
	 */

	Tcl_MutexLock(&exitMutex);
	inFinalize = 1;
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







-
-
-
-
-
-
-
-
-







	    (*exitPtr->proc)(exitPtr->clientData);
	    ckfree((char *) exitPtr);
	    Tcl_MutexLock(&exitMutex);
	}    
	firstExitPtr = NULL;
	Tcl_MutexUnlock(&exitMutex);

	/*
	 * Clean up the library path now, before we invalidate thread-local
	 * storage.
	 */
	if (tsdPtr->tclLibraryPath != NULL) {
	    Tcl_DecrRefCount(tsdPtr->tclLibraryPath);
	    tsdPtr->tclLibraryPath = NULL;
	}

	/*
	 * Clean up after the current thread now, after exit handlers.
	 * In particular, the testexithandler command sets up something
	 * that writes to standard output, which gets closed.
	 * Note that there is no thread-local storage after this call.
	 */

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
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







+
+
+
+
+
+
+
+
+
+
+














+








    if (tsdPtr != NULL) {
	/*
	 * Invoke thread exit handlers first.
	 */

	tsdPtr->inExit = 1;

	/*
	 * Clean up the library path now, before we invalidate thread-local
	 * storage or calling thread exit handlers.
	 */

	if (tsdPtr->tclLibraryPath != NULL) {
	    Tcl_DecrRefCount(tsdPtr->tclLibraryPath);
	    tsdPtr->tclLibraryPath = NULL;
	}

	for (exitPtr = tsdPtr->firstExitPtr; exitPtr != NULL;
		exitPtr = tsdPtr->firstExitPtr) {
	    /*
	     * Be careful to remove the handler from the list before invoking
	     * its callback.  This protects us against double-freeing if the
	     * callback should call Tcl_DeleteThreadExitHandler on itself.
	     */

	    tsdPtr->firstExitPtr = exitPtr->nextPtr;
	    (*exitPtr->proc)(exitPtr->clientData);
	    ckfree((char *) exitPtr);
	}
	TclFinalizeIOSubsystem();
	TclFinalizeNotifier();
	TclFinalizeAsync();

	/*
	 * Blow away all thread local storage blocks.
	 */

	TclFinalizeThreadData();
    }
908
909
910
911
912
913
914
915
916






917
918
919
920
921
922
923
934
935
936
937
938
939
940


941
942
943
944
945
946
947
948
949
950
951
952
953







-
-
+
+
+
+
+
+







 *
 *----------------------------------------------------------------------
 */

int
TclInExit()
{
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
    return tsdPtr->inExit;
    ThreadSpecificData *tsdPtr = TclThreadDataKeyGet(&dataKey);
    if (tsdPtr == NULL) {
	return inFinalize;
    } else {
	return tsdPtr->inExit;
    }
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_VwaitObjCmd --
 *
Changes to generic/tclExecute.c.
1
2
3
4
5
6
7

8
9
10
11
12

13
14
15
16
17
18
19
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20







+




-
+







/* 
 * tclExecute.c --
 *
 *	This file contains procedures that execute byte-compiled Tcl
 *	commands.
 *
 * Copyright (c) 1996-1997 Sun Microsystems, Inc.
 * Copyright (c) 1998-2000 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclExecute.c,v 1.10 2000/03/27 22:18:55 hobbs Exp $
 * RCS: @(#) $Id: tclExecute.c,v 1.10.2.3 2002/04/18 13:10:26 msofer Exp $
 */

#include "tclInt.h"
#include "tclCompile.h"

#ifdef NO_FLOAT_H
#   include "../compat/float.h"
108
109
110
111
112
113
114











115
116
117
118
119
120
121
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







+
+
+
+
+
+
+
+
+
+
+








#ifdef TCL_COMPILE_DEBUG
static char *resultStrings[] = {
    "TCL_OK", "TCL_ERROR", "TCL_RETURN", "TCL_BREAK", "TCL_CONTINUE"
};
#endif

/*
 * These are used by evalstats to monitor object usage in Tcl.
 */

#ifdef TCL_COMPILE_STATS
long		tclObjsAlloced = 0;
long		tclObjsFreed   = 0;
#define TCL_MAX_SHARED_OBJ_STATS 5
long		tclObjsShared[TCL_MAX_SHARED_OBJ_STATS] = { 0, 0, 0, 0, 0 };
#endif /* TCL_COMPILE_STATS */

/*
 * Macros for testing floating-point values for certain special cases. Test
 * for not-a-number by comparing a value against itself; test for infinity
 * by comparing against the largest floating-point value.
 */

#define IS_NAN(v) ((v) != (v))
421
422
423
424
425
426
427
428

429
430
431
432
433
434
435
433
434
435
436
437
438
439

440
441
442
443
444
445
446
447







-
+







 *----------------------------------------------------------------------
 */

void
TclDeleteExecEnv(eePtr)
    ExecEnv *eePtr;		/* Execution environment to free. */
{
    ckfree((char *) eePtr->stackPtr);
    Tcl_EventuallyFree((ClientData)eePtr->stackPtr, TCL_DYNAMIC);
    ckfree((char *) eePtr);
}

/*
 *----------------------------------------------------------------------
 *
 * TclFinalizeExecution --
491
492
493
494
495
496
497
498

499
500
501
502
503
504
505
503
504
505
506
507
508
509

510
511
512
513
514
515
516
517







-
+







    /*
     * Copy the existing stack items to the new stack space, free the old
     * storage if appropriate, and mark new space as malloc'ed.
     */
 
    memcpy((VOID *) newStackPtr, (VOID *) eePtr->stackPtr,
	   (size_t) currBytes);
    ckfree((char *) eePtr->stackPtr);
    Tcl_EventuallyFree((ClientData)eePtr->stackPtr, TCL_DYNAMIC);
    eePtr->stackPtr = newStackPtr;
    eePtr->stackEnd = (newElems - 1); /* i.e. index of last usable item */
}

/*
 *----------------------------------------------------------------------
 *
618
619
620
621
622
623
624




625

626
627
628
629

630
631
632
633
634
635
636
630
631
632
633
634
635
636
637
638
639
640

641
642
643
644

645
646
647
648
649
650
651
652







+
+
+
+
-
+



-
+







	     * Pop the topmost object from the stack, set the interpreter's
	     * object result to point to it, and return.
	     */
	    valuePtr = POP_OBJECT();
	    Tcl_SetObjResult(interp, valuePtr);
	    TclDecrRefCount(valuePtr);
	    if (stackTop != initStackTop) {
		/*
		 * if extra items in the stack, clean up the stack before return
		 */
		if (stackTop > initStackTop) goto abnormalReturn;
		fprintf(stderr, "\nTclExecuteByteCode: done instruction at pc %u: stack top %d != entry stack top %d\n",
		fprintf(stderr, "\nTclExecuteByteCode: done instruction at pc %u: stack top %d < entry stack top %d\n",
			(unsigned int)(pc - codePtr->codeStart),
			(unsigned int) stackTop,
			(unsigned int) initStackTop);
		panic("TclExecuteByteCode execution failure: end stack top != start stack top");
		panic("TclExecuteByteCode execution failure: end stack top < start stack top");
	    }
	    TRACE_WITH_OBJ(("=> return code=%d, result=", result),
		    iPtr->objResultPtr);
#ifdef TCL_COMPILE_DEBUG	    
	    if (traceInstructions) {
		fprintf(stdout, "\n");
	    }
728
729
730
731
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
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







+
+
+
+




-
+



-
+










-
+







	    
	    doInvocation:
	    {
		int objc = opnd; /* The number of arguments. */
		Tcl_Obj **objv;	 /* The array of argument objects. */
		Command *cmdPtr; /* Points to command's Command struct. */
		int newPcOffset; /* New inst offset for break, continue. */
		Tcl_Obj **preservedStack;
				 /* Reference to memory block containing
				  * objv array (must be kept live throughout
				  * trace and command invokations.) */
#ifdef TCL_COMPILE_DEBUG
		int isUnknownCmd = 0;
		char cmdNameBuf[21];
#endif /* TCL_COMPILE_DEBUG */
		

		/*
		 * If the interpreter was deleted, return an error.
		 */
		

		if (iPtr->flags & DELETED) {
		    Tcl_ResetResult(interp);
		    Tcl_AppendToObj(Tcl_GetObjResult(interp),
		            "attempt to call eval in deleted interpreter", -1);
		    Tcl_SetErrorCode(interp, "CORE", "IDELETE",
			    "attempt to call eval in deleted interpreter",
			    (char *) NULL);
		    result = TCL_ERROR;
		    goto checkForCatch;
		}
    

		/*
		 * Find the procedure to execute this command. If the
		 * command is not found, handle it with the "unknown" proc.
		 */

		objv = &(stackPtr[stackTop - (objc-1)]);
		cmdPtr = (Command *) Tcl_GetCommandFromObj(interp, objv[0]);
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
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







-
+
+
+
+
+
+
+
+
+
+
+
+
+






-
+
















-
+






-
+







		    for (i = objc-1;  i >= 0;  i--) {
			objv[i+1] = objv[i];
		    }
		    objc++;
		    objv[0] = Tcl_NewStringObj("unknown", -1);
		    Tcl_IncrRefCount(objv[0]);
		}
		

		/*
		 * A reference to part of the stack vector itself
		 * escapes our control, so must use preserve/release
		 * to stop it from being deallocated by a recursive
		 * call to ourselves.  The extra variable is needed
		 * because all others are liable to change due to the
		 * trace procedures.
		 */

		Tcl_Preserve((ClientData)stackPtr);
		preservedStack = stackPtr;

		/*
		 * Call any trace procedures.
		 */

		if (iPtr->tracePtr != NULL) {
		    Trace *tracePtr, *nextTracePtr;

		    
		    for (tracePtr = iPtr->tracePtr;  tracePtr != NULL;
		            tracePtr = nextTracePtr) {
			nextTracePtr = tracePtr->nextPtr;
			if (iPtr->numLevels <= tracePtr->level) {
			    int numChars;
			    char *cmd = GetSrcInfoForPc(pc, codePtr,
				    &numChars);
			    if (cmd != NULL) {
				DECACHE_STACK_INFO();
				CallTraceProcedure(interp, tracePtr, cmdPtr,
				        cmd, numChars, objc, objv);
				CACHE_STACK_INFO();
			    }
			}
		    }
		}
		

		/*
		 * Finally, invoke the command's Tcl_ObjCmdProc. First reset
		 * the interpreter's string and object results to their
		 * default empty values since they could have gotten changed
		 * by earlier invocations.
		 */
		

		Tcl_ResetResult(interp);
		if (tclTraceExec >= 2) {
#ifdef TCL_COMPILE_DEBUG
		    if (traceInstructions) {
			strncpy(cmdNameBuf, Tcl_GetString(objv[0]), 20);
			TRACE(("%u => call ", (isUnknownCmd? objc-1:objc)));
		    } else {
845
846
847
848
849
850
851








852
853
854
855
856
857
858
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898







+
+
+
+
+
+
+
+







		result = (*cmdPtr->objProc)(cmdPtr->objClientData, interp,
					    objc, objv);
		if (Tcl_AsyncReady()) {
		    result = Tcl_AsyncInvoke(interp, result);
		}
		CACHE_STACK_INFO();

		/*
		 * If the old stack is going to be released, it is
		 * safe to do so now, since no references to objv are
		 * going to be used from now on.
		 */

		Tcl_Release((ClientData)preservedStack);

		/*
		 * If the interpreter has a non-empty string result, the
		 * result object is either empty or stale because some
		 * procedure set interp->result directly. If so, move the
		 * string result to the result object, then reset the
		 * string result.
		 */
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313






2314
2315

2316

2317
2318

2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334





2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345

2346
2347
2348
2349
2350

2351
2352
2353
2354
2355
2356
2357
2343
2344
2345
2346
2347
2348
2349




2350
2351
2352
2353
2354
2355
2356

2357
2358
2359
2360

2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392

2393
2394
2395
2396
2397

2398
2399
2400
2401
2402
2403
2404
2405







-
-
-
-
+
+
+
+
+
+

-
+

+

-
+
















+
+
+
+
+










-
+




-
+







	    }
	    ADJUST_PC(1);
	    
	case INST_UMINUS:
	case INST_LNOT:
	    {
		/*
		 * The operand must be numeric. If the operand object is
		 * unshared modify it directly, otherwise create a copy to
		 * modify: this is "copy on write". free any old string
		 * representation since it is now invalid.
		 * The operand must be numeric or a boolean string as
		 * accepted by Tcl_GetBooleanFromObj(). If the operand
		 * object is unshared modify it directly, otherwise
		 * create a copy to modify: this is "copy on write".
		 * Free any old string representation since it is now
		 * invalid.
		 */
		

		double d;
		int boolvar;
		Tcl_ObjType *tPtr;
		

		valuePtr = POP_OBJECT();
		tPtr = valuePtr->typePtr;
		if ((tPtr != &tclIntType) && ((tPtr != &tclDoubleType)
			|| (valuePtr->bytes != NULL))) {
		    if ((tPtr == &tclBooleanType) 
			    && (valuePtr->bytes == NULL)) {
			valuePtr->typePtr = &tclIntType;
		    } else {
			char *s = Tcl_GetStringFromObj(valuePtr, &length);
			if (TclLooksLikeInt(s, length)) {
			    result = Tcl_GetLongFromObj((Tcl_Interp *) NULL,
				    valuePtr, &i);
			} else {
			    result = Tcl_GetDoubleFromObj((Tcl_Interp *) NULL,
				    valuePtr, &d);
			}
			if (result == TCL_ERROR && *pc == INST_LNOT) {
			    result = Tcl_GetBooleanFromObj((Tcl_Interp *)NULL,
				    valuePtr, &boolvar);
			    i = (long)boolvar; /* i is long, not int! */
			}
			if (result != TCL_OK) {
			    TRACE(("\"%.20s\" => ILLEGAL TYPE %s\n",
				    s, (tPtr? tPtr->name : "null")));
			    IllegalExprOperandType(interp, pc, valuePtr);
			    Tcl_DecrRefCount(valuePtr);
			    goto checkForCatch;
			}
		    }
		    tPtr = valuePtr->typePtr;
		}
		

		if (Tcl_IsShared(valuePtr)) {
		    /*
		     * Create a new object.
		     */
		    if (tPtr == &tclIntType) {
		    if ((tPtr == &tclIntType) || (tPtr == &tclBooleanType)) {
			i = valuePtr->internalRep.longValue;
			objPtr = Tcl_NewLongObj(
			        (*pc == INST_UMINUS)? -i : !i);
			TRACE_WITH_OBJ(("%ld => ", i), objPtr);
		    } else {
			d = valuePtr->internalRep.doubleValue;
			if (*pc == INST_UMINUS) {
2367
2368
2369
2370
2371
2372
2373
2374

2375
2376
2377
2378
2379
2380
2381
2415
2416
2417
2418
2419
2420
2421

2422
2423
2424
2425
2426
2427
2428
2429







-
+







		    }
		    PUSH_OBJECT(objPtr);
		    TclDecrRefCount(valuePtr);
		} else {
		    /*
		     * valuePtr is unshared. Modify it directly.
		     */
		    if (tPtr == &tclIntType) {
		    if ((tPtr == &tclIntType) || (tPtr == &tclBooleanType)) {
			i = valuePtr->internalRep.longValue;
			Tcl_SetLongObj(valuePtr,
			        (*pc == INST_UMINUS)? -i : !i);
			TRACE_WITH_OBJ(("%ld => ", i), valuePtr);
		    } else {
			d = valuePtr->internalRep.doubleValue;
			if (*pc == INST_UMINUS) {
3086
3087
3088
3089
3090
3091
3092


3093
















3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110

3111
3112
3113
3114
3115
3116
3117
3118
3134
3135
3136
3137
3138
3139
3140
3141
3142

3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163

3164
3165
3166








3167

3168
3169
3170
3171
3172
3173
3174







+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+





-



-
-
-
-
-
-
-
-
+
-







    Tcl_ResetResult(interp);
    if ((opndPtr->bytes == NULL) || (opndPtr->length == 0)) {
	Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
		"can't use empty string as operand of \"",
		operatorStrings[opCode - INST_LOR], "\"", (char *) NULL);
    } else {
	char *msg = "non-numeric string";
	char *s;
	int length;
	if (opndPtr->typePtr != &tclDoubleType) {

	s = Tcl_GetStringFromObj(opndPtr, &length);
	if (TclLooksLikeInt(s, length)) {
	    /*
	     * If something that looks like an integer appears here, then 
	     * it *must* be a bad octal or too large to represent [Bug  542588].
	     */

	    if (TclCheckBadOctal(NULL, Tcl_GetString(opndPtr))) {
		msg = "invalid octal number";
	    } else {
		msg = "integer value too large to represent";
		Tcl_SetErrorCode(interp, "ARITH", "IOVERFLOW",
		    "integer value too large to represent", (char *) NULL);
	    }
	} else {
	    /*
	     * See if the operand can be interpreted as a double in order to
	     * improve the error message.
	     */

	    char *s = Tcl_GetString(opndPtr);
	    double d;

	    if (Tcl_GetDouble((Tcl_Interp *) NULL, s, &d) == TCL_OK) {
		/*
		 * Make sure that what appears to be a double
		 * (ie 08) isn't really a bad octal
		 */
		if (TclCheckBadOctal(NULL, Tcl_GetString(opndPtr))) {
		    msg = "invalid octal number";
		} else {
		    msg = "floating-point value";
		msg = "floating-point value";
		}
	    }
	}
	Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), "can't use ",
		msg, " as operand of \"", operatorStrings[opCode - INST_LOR],
		"\"", (char *) NULL);
    }
}
3840
3841
3842
3843
3844
3845
3846
3847


3848
3849
3850
3851









3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866








3867




3868

3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900


3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3896
3897
3898
3899
3900
3901
3902

3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929



3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942

3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958








3959
3960
3961
3962
3963
3964
3965


3966
3967



3968
3969

3970
3971
3972
3973
3974
3975
3976







-
+
+




+
+
+
+
+
+
+
+
+












-
-
-
+
+
+
+
+
+
+
+

+
+
+
+
-
+















-
-
-
-
-
-
-
-







-
-
+
+
-
-
-


-







				 * the function. */
    ClientData clientData;	/* Ignored. */
{
    Tcl_Obj **stackPtr;        /* Cached evaluation stack base pointer. */
    register int stackTop;	/* Cached top index of evaluation stack. */
    Interp *iPtr = (Interp *) interp;
    double dResult;
    int tmp;
    long tmp;			/* Algorithm assumes at least 32 bits.
				 * Only long guarantees that.  See below. */

    if (!(iPtr->flags & RAND_SEED_INITIALIZED)) {
	iPtr->flags |= RAND_SEED_INITIALIZED;
	iPtr->randSeed = TclpGetClicks();

	/*
	 * Make sure 1 <= randSeed <= (2^31) - 2.  See below.
	 */

        iPtr->randSeed &= (unsigned long) 0x7fffffff;
	if ((iPtr->randSeed == 0) || (iPtr->randSeed == 0x7fffffff)) {
	    iPtr->randSeed ^= 123459876;
	}
    }
    
    /*
     * Set stackPtr and stackTop from eePtr.
     */
    
    CACHE_STACK_INFO();

    /*
     * Generate the random number using the linear congruential
     * generator defined by the following recurrence:
     *		seed = ( IA * seed ) mod IM
     * where IA is 16807 and IM is (2^31) - 1.  In order to avoid
     * potential problems with integer overflow, the  code uses
     * additional constants IQ and IR such that
     * where IA is 16807 and IM is (2^31) - 1.  The recurrence maps
     * a seed in the range [1, IM - 1] to a new seed in that same range.
     * The recurrence maps IM to 0, and maps 0 back to 0, so those two
     * values must not be allowed as initial values of seed.
     *
     * In order to avoid potential problems with integer overflow, the
     * recurrence is implemented in terms of additional constants
     * IQ and IR such that
     *		IM = IA*IQ + IR
     * None of the operations in the implementation overflows a 32-bit
     * signed integer, and the C type long is guaranteed to be at least
     * 32 bits wide.
     *
     * For details on how this algorithm works, refer to the following
     * For more details on how this algorithm works, refer to the following
     * papers: 
     *
     *	S.K. Park & K.W. Miller, "Random number generators: good ones
     *	are hard to find," Comm ACM 31(10):1192-1201, Oct 1988
     *
     *	W.H. Press & S.A. Teukolsky, "Portable random number
     *	generators," Computers in Physics 6(5):522-524, Sep/Oct 1992.
     */

#define RAND_IA		16807
#define RAND_IM		2147483647
#define RAND_IQ		127773
#define RAND_IR		2836
#define RAND_MASK	123459876

    if (iPtr->randSeed == 0) {
	/*
	 * Don't allow a 0 seed, since it breaks the generator.  Shift
	 * it to some other value.
	 */

	iPtr->randSeed = 123459876;
    }
    tmp = iPtr->randSeed/RAND_IQ;
    iPtr->randSeed = RAND_IA*(iPtr->randSeed - tmp*RAND_IQ) - RAND_IR*tmp;
    if (iPtr->randSeed < 0) {
	iPtr->randSeed += RAND_IM;
    }

    /*
     * On 64-bit architectures we need to mask off the upper bits to
     * ensure we only have a 32-bit range.  The constant has the
     * Since the recurrence keeps seed values in the range [1, RAND_IM - 1],
     * dividing by RAND_IM yields a double in the range (0, 1).
     * bizarre form below in order to make sure that it doesn't
     * get sign-extended (the rules for sign extension are very
     * concat, particularly on 64-bit machines).
     */

    iPtr->randSeed &= ((((unsigned long) 0xfffffff) << 4) | 0xf);
    dResult = iPtr->randSeed * (1.0/RAND_IM);

    /*
     * Push a Tcl object with the result.
     */

    PUSH_OBJECT(Tcl_NewDoubleObj(dResult));
4046
4047
4048
4049
4050
4051
4052
4053


4054
4055
4056
4057




4058
4059
4060
4061
4062
4063
4064
4109
4110
4111
4112
4113
4114
4115

4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132







-
+
+




+
+
+
+







	badValue:
	Tcl_DecrRefCount(valuePtr);
	DECACHE_STACK_INFO();
	return TCL_ERROR;
    }
    
    /*
     * Reset the seed.
     * Reset the seed.  Make sure 1 <= randSeed <= 2^31 - 2.
     * See comments in ExprRandFunc() for more details.
     */

    iPtr->flags |= RAND_SEED_INITIALIZED;
    iPtr->randSeed = i;
    iPtr->randSeed &= (unsigned long) 0x7fffffff;
    if ((iPtr->randSeed == 0) || (iPtr->randSeed == 0x7fffffff)) {
	iPtr->randSeed ^= 123459876;
    }

    /*
     * To avoid duplicating the random number generation code we simply
     * clean up our state and call the real random number function. That
     * function will always succeed.
     */
    
4445
4446
4447
4448
4449
4450
4451
4452

4453
4454
4455
4456
4457
4458
4459
4513
4514
4515
4516
4517
4518
4519

4520
4521
4522
4523
4524
4525
4526
4527







-
+







	    statsPtr->numLiteralsCreated * sizeof(Tcl_Obj),
	    statsPtr->totalLitStringBytes);
    fprintf(stdout, "  Mean code/compile		%.1f\n",
	    totalCodeBytes / statsPtr->numCompilations);
    fprintf(stdout, "  Mean code/source		%.1f\n",
	    totalCodeBytes / statsPtr->totalSrcBytes);

    fprintf(stdout, "\nCurrent ByteCodes		%ld\n",
    fprintf(stdout, "\nCurrent (active) ByteCodes	%ld\n",
	    numCurrentByteCodes);
    fprintf(stdout, "  Source bytes			%.6g\n",
	    statsPtr->currentSrcBytes);
    fprintf(stdout, "  Code bytes			%.6g\n",
	    currentCodeBytes);
    fprintf(stdout, "    ByteCode bytes		%.6g\n",
	    statsPtr->currentByteCodeBytes);
4467
4468
4469
4470
4471
4472
4473























4474
4475
4476
4477
4478
4479
4480
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







	    statsPtr->currentLitStringBytes);
    fprintf(stdout, "  Mean code/source		%.1f\n",
	    currentCodeBytes / statsPtr->currentSrcBytes);
    fprintf(stdout, "  Code + source bytes		%.6g (%0.1f mean code/src)\n",
	    (currentCodeBytes + statsPtr->currentSrcBytes),
	    (currentCodeBytes / statsPtr->currentSrcBytes) + 1.0);

    /*
     * Tcl_IsShared statistics check
     *
     * This gives the refcount of each obj as Tcl_IsShared was called
     * for it.  Shared objects must be duplicated before they can be
     * modified.
     */

    numSharedMultX = 0;
    fprintf(stdout, "\nTcl_IsShared object check (all objects):\n");
    fprintf(stdout, "  Object had refcount <=1 (not shared)	%ld\n",
	    tclObjsShared[1]);
    for (i = 2;  i < TCL_MAX_SHARED_OBJ_STATS;  i++) {
	fprintf(stdout, "  refcount ==%d		%ld\n",
		i, tclObjsShared[i]);
	numSharedMultX += tclObjsShared[i];
    }
    fprintf(stdout, "  refcount >=%d		%ld\n",
	    i, tclObjsShared[0]);
    numSharedMultX += tclObjsShared[0];
    fprintf(stdout, "  Total shared objects			%d\n",
	    numSharedMultX);

    /*
     * Literal table statistics.
     */

    numByteCodeLits = 0;
    refCountSum = 0;
    numSharedMultX = 0;
4507
4508
4509
4510
4511
4512
4513
4514

4515
4516
4517
4518
4519
4520
4521
4598
4599
4600
4601
4602
4603
4604

4605
4606
4607
4608
4609
4610
4611
4612







-
+








    fprintf(stdout, "\nTotal objects (all interps)	%ld\n",
	    tclObjsAlloced);
    fprintf(stdout, "Current objects			%ld\n",
	    (tclObjsAlloced - tclObjsFreed));
    fprintf(stdout, "Total literal objects		%ld\n",
	    statsPtr->numLiteralsCreated);
    

    fprintf(stdout, "\nCurrent literal objects		%d (%0.1f%% of current objects)\n",
	    globalTablePtr->numEntries,
	    (globalTablePtr->numEntries * 100.0) / (tclObjsAlloced-tclObjsFreed));
    fprintf(stdout, "  ByteCode literals	 	%ld (%0.1f%% of current literals)\n",
	    numByteCodeLits,
	    (numByteCodeLits * 100.0) / globalTablePtr->numEntries);
    fprintf(stdout, "  Literals reused > 1x	 	%d\n",
4658
4659
4660
4661
4662
4663
4664
4665

4666
4667
4668
4669
4670
4671
4672
4749
4750
4751
4752
4753
4754
4755

4756
4757
4758
4759
4760
4761
4762
4763







-
+







    for (i = minSizeDecade;  i <= maxSizeDecade;  i++) {
	decadeHigh = (1 << (i+1)) - 1;
	sum += statsPtr->byteCodeCount[i];
        fprintf(stdout,	"	%10d		%8.0f%%\n",
		decadeHigh, (sum * 100.0) / statsPtr->numCompilations);
    }

    fprintf(stdout, "\nByteCode longevity (excludes current ByteCodes):\n");
    fprintf(stdout, "\nByteCode longevity (excludes Current ByteCodes):\n");
    fprintf(stdout, "	       Up to ms		Percentage\n");
    minSizeDecade = maxSizeDecade = 0;
    for (i = 0;  i < 31;  i++) {
        if (statsPtr->lifetimeCount[i] > 0) {
	    minSizeDecade = i;
	    break;
        }
Changes to generic/tclFileName.c.
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
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












-
+






-
-
-
-
-
-
-
-







/* 
 * tclFileName.c --
 *
 *	This file contains routines for converting file names betwen
 *	native and network form.
 *
 * Copyright (c) 1995-1998 Sun Microsystems, Inc.
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclFileName.c,v 1.13 2000/04/19 23:24:52 hobbs Exp $
 * RCS: @(#) $Id: tclFileName.c,v 1.13.2.2 2001/10/10 00:47:41 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"
#include "tclRegexp.h"

/*
 * The following regular expression matches the root portion of a Windows
 * absolute or volume relative path.  It will match both UNC and drive relative
 * paths.
 */

#define WIN_ROOT_PATTERN "^(([a-zA-Z]:)|[/\\\\][/\\\\]+([^/\\\\]+)[/\\\\]+([^/\\\\]+)|([/\\\\]))([/\\\\])*"

/*
 * The following regular expression matches the root portion of a Macintosh
 * absolute path.  It will match degenerate Unix-style paths, tilde paths,
 * Unix-style paths, and Mac paths.
 */

#define MAC_ROOT_PATTERN "^((/+([.][.]?/+)*([.][.]?)?)|(~[^:/]*)(/[^:]*)?|(~[^:]*)(:.*)?|/+([.][.]?/+)*([^:/]+)(/[^:]*)?|([^:]+):.*)$"
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
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







-
-
-









-
+


-
+







+
+
+
+
+
+
+
+
+
+
+
+







-
+













-
+




-
+







-
+


-
-
+
+



-
+

-
+







ExtractWinRoot(path, resultPtr, offset, typePtr)
    CONST char *path;		/* Path to parse. */
    Tcl_DString *resultPtr;	/* Buffer to hold result. */
    int offset;			/* Offset in buffer where result should be
				 * stored. */
    Tcl_PathType *typePtr;	/* Where to store pathType result */
{
    FileNameInit();


    if (path[0] == '/' || path[0] == '\\') {
	/* Might be a UNC or Vol-Relative path */
	char *host, *share, *tail;
	int hlen, slen;
	if (path[1] != '/' && path[1] != '\\') {
	    Tcl_DStringSetLength(resultPtr, offset);
	    *typePtr = TCL_PATH_VOLUME_RELATIVE;
	    Tcl_DStringAppend(resultPtr, "/", 1);
	    return &path[1];
    }
	}
	host = (char *)&path[2];

	/* Skip seperators */
	/* Skip separators */
	while (host[0] == '/' || host[0] == '\\') host++;

	for (hlen = 0; host[hlen];hlen++) {
	    if (host[hlen] == '/' || host[hlen] == '\\')
		break;
	}
	if (host[hlen] == 0 || host[hlen+1] == 0) {
	    /* 
	     * The path given is simply of the form 
	     * '/foo', '//foo', '/////foo' or the same
	     * with backslashes.  If there is exactly
	     * one leading '/' the path is volume relative
	     * (see filename man page).  If there are more
	     * than one, we are simply assuming they
	     * are superfluous and we trim them away.
	     * (An alternative interpretation would
	     * be that it is a host name, but we have
	     * been documented that that is not the case).
	     */
	    *typePtr = TCL_PATH_VOLUME_RELATIVE;
	    Tcl_DStringAppend(resultPtr, "/", 1);
	    return &path[2];
	}
	Tcl_DStringSetLength(resultPtr, offset);
	share = &host[hlen];

	/* Skip seperators */
	/* Skip separators */
	while (share[0] == '/' || share[0] == '\\') share++;

	for (slen = 0; share[slen];slen++) {
	    if (share[slen] == '/' || share[slen] == '\\')
		break;
	}
	Tcl_DStringAppend(resultPtr, "//", 2);
	Tcl_DStringAppend(resultPtr, host, hlen);
	Tcl_DStringAppend(resultPtr, "/", 1);
	Tcl_DStringAppend(resultPtr, share, slen);

	tail = &share[slen];

	/* Skip seperators */
	/* Skip separators */
	while (tail[0] == '/' || tail[0] == '\\') tail++;

	*typePtr = TCL_PATH_ABSOLUTE;
	return tail;
    } else if (path[1] == ':') {
    } else if (*path && path[1] == ':') {
	/* Might be a drive sep */
	Tcl_DStringSetLength(resultPtr, offset);

	if (path[2] != '/' && path[2] != '\\') {
	    *typePtr = TCL_PATH_VOLUME_RELATIVE;
	    Tcl_DStringAppend(resultPtr, path, 2);
	    return &path[2];
    } else {
	} else {
	    char *tail = (char*)&path[3];

	    /* Skip seperators */
	    while (tail[0] == '/' || tail[0] == '\\') tail++;
	    /* Skip separators */
	    while (*tail && (tail[0] == '/' || tail[0] == '\\')) tail++;

	    *typePtr = TCL_PATH_ABSOLUTE;
	    Tcl_DStringAppend(resultPtr, path, 2);
	Tcl_DStringAppend(resultPtr, "/", 1);
	    Tcl_DStringAppend(resultPtr, "/", 1);

    return tail;
	    return tail;
	}
    } else {
	*typePtr = TCL_PATH_RELATIVE;
	return path;
    }
}

Changes to generic/tclGetDate.y.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







/* 
 * tclGetDate.y --
 *
 *	Contains yacc grammar for parsing date and time strings.
 *	The output of this file should be the file tclDate.c which
 *	is used directly in the Tcl sources.
 *
 * Copyright (c) 1992-1995 Karl Lehenbauer and Mark Diekhans.
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclGetDate.y,v 1.15 2000/02/28 18:49:42 ericm Exp $
 * RCS: @(#) $Id: tclGetDate.y,v 1.15.2.3 2001/10/18 20:17:17 hobbs Exp $
 */

%{
/* 
 * tclDate.c --
 *
 *	This file is generated from a yacc grammar defined in
29
30
31
32
33
34
35
36

37
38
39
40
41
42
43
29
30
31
32
33
34
35

36
37
38
39
40
41
42
43







-
+







 *
 * SCCSID
 */

#include "tclInt.h"
#include "tclPort.h"

#ifdef MAC_TCL
#if defined(MAC_TCL) && !defined(TCL_MAC_USE_MSL_EPOCH)
#   define EPOCH           1904
#   define START_OF_TIME   1904
#   define END_OF_TIME     2039
#else
#   define EPOCH           1970
#   define START_OF_TIME   1902
#   define END_OF_TIME     2037
143
144
145
146
147
148
149
150

151
152
153
154
155
156
157
143
144
145
146
147
148
149

150
151
152
153
154
155
156
157







-
+








%token  tAGO tDAY tDAYZONE tID tMERIDIAN tMINUTE_UNIT tMONTH tMONTH_UNIT
%token  tSTARDATE tSEC_UNIT tSNUMBER tUNUMBER tZONE tEPOCH tDST tISOBASE
%token  tDAY_UNIT tNEXT

%type   <Number>        tDAY tDAYZONE tMINUTE_UNIT tMONTH tMONTH_UNIT tDST
%type   <Number>        tSEC_UNIT tSNUMBER tUNUMBER tZONE tISOBASE tDAY_UNIT
%type   <Number>        unit ago sign tNEXT tSTARDATE
%type   <Number>        unit sign tNEXT tSTARDATE
%type   <Meridian>      tMERIDIAN o_merid

%%

spec    : /* NULL */
        | spec item
        ;
353
354
355
356
357
358
359







360
361
362
363
364





365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
353
354
355
356
357
358
359
360
361
362
363
364
365
366





367
368
369
370
371
372
373
374
375
376
377
378
379



380
381
382
383
384
385
386







+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+








-
-
-







            yyDay  = 1;
	    yyMonth = 1;
	    yyRelDay += (($2%1000)*(365 + IsLeapYear(yyYear)))/1000;
	    yyRelSeconds += $4 * 144 * 60;
        }
        ;

relspec : relunits tAGO {
	    yyRelSeconds *= -1;
	    yyRelMonth *= -1;
	    yyRelDay *= -1;
	}
	| relunits
	;
relspec : sign tUNUMBER unit ago { *yyRelPointer += $1 * $2 * $3 * $4; }
        | tUNUMBER unit ago      { *yyRelPointer += $1 * $2 * $3; }
        | tNEXT unit             { *yyRelPointer += $2; }
        | tNEXT tUNUMBER unit    { *yyRelPointer += $2 * $3; }
        | unit ago               { *yyRelPointer += $1 * $2; }
relunits : sign tUNUMBER unit  { *yyRelPointer += $1 * $2 * $3; }
        | tUNUMBER unit        { *yyRelPointer += $1 * $2; }
        | tNEXT unit           { *yyRelPointer += $2; }
        | tNEXT tUNUMBER unit  { *yyRelPointer += $2 * $3; }
        | unit                 { *yyRelPointer += $1; }
        ;
sign    : '-'            { $$ = -1; }
        | '+'            { $$ =  1; }
        ;
unit    : tSEC_UNIT      { $$ = $1; yyRelPointer = &yyRelSeconds; }
        | tDAY_UNIT      { $$ = $1; yyRelPointer = &yyRelDay; }
        | tMONTH_UNIT    { $$ = $1; yyRelPointer = &yyRelMonth; }
        ;
ago     : tAGO           { $$ = -1; }
        |                { $$ = 1; }
        ;

number  : tUNUMBER
    {
	if (yyHaveTime && yyHaveDate && !yyHaveRel) {
	    yyYear = $1;
	} else {
	    yyHaveTime++;
790
791
792
793
794
795
796

















797
798
799
800
801
802
803
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







    tm = TclpGetDate((TclpTime_t)&Start, 0);
    Month = 12 * (tm->tm_year + TM_YEAR_BASE) + tm->tm_mon + RelMonth;
    Year = Month / 12;
    Month = Month % 12 + 1;
    result = Convert(Month, (time_t) tm->tm_mday, Year,
	    (time_t) tm->tm_hour, (time_t) tm->tm_min, (time_t) tm->tm_sec,
	    MER24, DSTmaybe, &Julian);

    /*
     * The Julian time returned above is behind by one day, if "month" 
     * or "year" is used to specify relative time and the GMT flag is true.
     * This problem occurs only when the current time is closer to
     * midnight, the difference being not more than its time difference
     * with GMT. For example, in US/Pacific time zone, the problem occurs
     * whenever the current time is between midnight to 8:00am or 7:00amDST.
     * See Bug# 413397 for more details and sample script.
     * To resolve this bug, we simply add the number of seconds corresponding
     * to timezone difference with GMT to Julian time, if GMT flag is true.
     */

    if (TclDateTimezone == 0) {
        Julian += TclpGetTimeZone((unsigned long) Start) * 60L;
    }

    /*
     * The following iteration takes into account the case were we jump
     * into a "short month".  Far example, "one month from Jan 31" will
     * fail because there is no Feb 31.  The code below will reduce the
     * day and try converting the date until we succed or the date equals
     * 28 (which always works unless the date is bad in another way).
     */
Changes to generic/tclIO.c.
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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370

371
372
373
374
375
376
377
378

379
380
381
382
383

384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410



411
412

413
414

415
416

417
418

419
420

421
422

423



424


425
426
427

428
429
430


431
432

433
434
435
436



437
438

439
440

441
442

443
444

445
446

447
448
449
450
451
452
453
454
455
456
457











458
459

460
461
462
463
464
465
466






467
468
469

470
471

472
473
474
475
476
477
478
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






-
+





-
+




-
+
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-


















-
+
-
-
-
-
-
-
-
-
+
-
-
-

-
+
-














-





-
-

-
-
-
+
+
+

-
+

-
+

-
+

-
+

-
+

-
+

+
+
+
-
+
+


-
+

-
-
+
+

-
+

-
-
-
+
+
+

-
+

-
+

-
+

-
+

-
+



-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+

-
+

-
-
-
-
-
-
+
+
+
+
+
+


-
+

-
+







/* 
 * tclIO.c --
 *
 *	This file provides the generic portions (those that are the same on
 *	all platforms and for all channel types) of Tcl's IO facilities.
 *
 * Copyright (c) 1998 Scriptics Corporation
 * Copyright (c) 1998-2000 Ajuba Solutions
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclIO.c,v 1.20 2000/04/05 19:00:41 kupries Exp $
 * RCS: @(#) $Id: tclIO.c,v 1.20.2.15 2002/03/02 05:00:59 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

#include "tclIO.h"
/*
 * Make sure that both EAGAIN and EWOULDBLOCK are defined. This does not
 * compile on systems where neither is defined. We want both defined so
 * that we can test safely for both. In the code we still have to test for
 * both because there may be systems on which both are defined and have
 * different values.
 */

#include <assert.h>
#if ((!defined(EWOULDBLOCK)) && (defined(EAGAIN)))
#   define EWOULDBLOCK EAGAIN
#endif
#if ((!defined(EAGAIN)) && (defined(EWOULDBLOCK)))
#   define EAGAIN EWOULDBLOCK
#endif
#if ((!defined(EAGAIN)) && (!defined(EWOULDBLOCK)))
    error one of EWOULDBLOCK or EAGAIN must be defined
#endif

/*
 * The following structure encapsulates the state for a background channel
 * copy.  Note that the data buffer for the copy will be appended to this
 * structure.
 */

typedef struct CopyState {
    struct Channel *readPtr;	/* Pointer to input channel. */
    struct Channel *writePtr;	/* Pointer to output channel. */
    int readFlags;		/* Original read channel flags. */
    int writeFlags;		/* Original write channel flags. */
    int toRead;			/* Number of bytes to copy, or -1. */
    int total;			/* Total bytes transferred (written). */
    Tcl_Interp *interp;		/* Interp that started the copy. */
    Tcl_Obj *cmdPtr;		/* Command to be invoked at completion. */
    int bufSize;		/* Size of appended buffer. */
    char buffer[1];		/* Copy buffer, this must be the last
				 * field. */
} CopyState;

/*
 * struct ChannelBuffer:
 *
 * Buffers data being sent to or from a channel.
 */

typedef struct ChannelBuffer {
    int nextAdded;		/* The next position into which a character
                                 * will be put in the buffer. */
    int nextRemoved;		/* Position of next byte to be removed
                                 * from the buffer. */
    int bufLength;		/* How big is the buffer? */
    struct ChannelBuffer *nextPtr;
    				/* Next buffer in chain. */
    char buf[4];		/* Placeholder for real buffer. The real
                                 * buffer occuppies this space + bufSize-4
                                 * bytes. This must be the last field in
                                 * the structure. */
} ChannelBuffer;

#define CHANNELBUFFER_HEADER_SIZE	(sizeof(ChannelBuffer) - 4)

/*
 * How much extra space to allocate in buffer to hold bytes from previous
 * buffer (when converting to UTF-8) or to hold bytes that will go to
 * next buffer (when converting from UTF-8).
 */
 
#define BUFFER_PADDING	    16
 
/*
 * The following defines the *default* buffer size for channels.
 */

#define CHANNELBUFFER_DEFAULT_SIZE	(1024 * 4)

/*
 * Structure to record a close callback. One such record exists for
 * each close callback registered for a channel.
 */

typedef struct CloseCallback {
    Tcl_CloseProc *proc;		/* The procedure to call. */
    ClientData clientData;		/* Arbitrary one-word data to pass
                                         * to the callback. */
    struct CloseCallback *nextPtr;	/* For chaining close callbacks. */
} CloseCallback;

/*
 * The following structure describes the information saved from a call to
 * "fileevent". This is used later when the event being waited for to
 * invoke the saved script in the interpreter designed in this record.
 */

typedef struct EventScriptRecord {
    struct Channel *chanPtr;	/* The channel for which this script is
                                 * registered. This is used only when an
                                 * error occurs during evaluation of the
                                 * script, to delete the handler. */
    Tcl_Obj *scriptPtr;		/* Script to invoke. */
    Tcl_Interp *interp;		/* In what interpreter to invoke script? */
    int mask;			/* Events must overlap current mask for the
                                 * stored script to be invoked. */
    struct EventScriptRecord *nextPtr;
    				/* Next in chain of records. */
} EventScriptRecord;

/*
 * struct Channel:
 *
 * One of these structures is allocated for each open channel. It contains data
 * specific to the channel but which belongs to the generic part of the Tcl
 * channel mechanism, and it points at an instance specific (and type
 * specific) * instance data, and at a channel type structure.
 */

typedef struct Channel {
    char *channelName;		/* The name of the channel instance in Tcl
                                 * commands. Storage is owned by the generic IO
                                 * code,  is dynamically allocated. */
    int	flags;			/* ORed combination of the flags defined
                                 * below. */
    Tcl_Encoding encoding;	/* Encoding to apply when reading or writing
				 * data on this channel.  NULL means no
				 * encoding is applied to data. */
    Tcl_EncodingState inputEncodingState;
				/* Current encoding state, used when converting
				 * input data bytes to UTF-8. */
    int inputEncodingFlags;	/* Encoding flags to pass to conversion
				 * routine when converting input data bytes to
				 * UTF-8.  May be TCL_ENCODING_START before
				 * converting first byte and TCL_ENCODING_END
				 * when EOF is seen. */
    Tcl_EncodingState outputEncodingState;
				/* Current encoding state, used when converting
				 * UTF-8 to output data bytes. */
    int outputEncodingFlags;	/* Encoding flags to pass to conversion
				 * routine when converting UTF-8 to output
				 * data bytes.  May be TCL_ENCODING_START
				 * before converting first byte and
				 * TCL_ENCODING_END when EOF is seen. */
    Tcl_EolTranslation inputTranslation;
				/* What translation to apply for end of line
                                 * sequences on input? */    
    Tcl_EolTranslation outputTranslation;
    				/* What translation to use for generating
                                 * end of line sequences in output? */
    int inEofChar;		/* If nonzero, use this as a signal of EOF
                                 * on input. */
    int outEofChar;             /* If nonzero, append this to the channel
                                 * when it is closed if it is open for
                                 * writing. */
    int unreportedError;	/* Non-zero if an error report was deferred
                                 * because it happened in the background. The
                                 * value is the POSIX error code. */
    ClientData instanceData;	/* Instance-specific data provided by
				 * creator of channel. */

    Tcl_ChannelType *typePtr;	/* Pointer to channel type structure. */
    int refCount;		/* How many interpreters hold references to
                                 * this IO channel? */
    CloseCallback *closeCbPtr;	/* Callbacks registered to be called when the
                                 * channel is closed. */
    char *outputStage;		/* Temporary staging buffer used when
				 * translating EOL before converting from
				 * UTF-8 to external form. */
    ChannelBuffer *curOutPtr;	/* Current output buffer being filled. */
    ChannelBuffer *outQueueHead;/* Points at first buffer in output queue. */
    ChannelBuffer *outQueueTail;/* Points at last buffer in output queue. */

    ChannelBuffer *saveInBufPtr;/* Buffer saved for input queue - eliminates
                                 * need to allocate a new buffer for "gets"
                                 * that crosses buffer boundaries. */
    ChannelBuffer *inQueueHead;	/* Points at first buffer in input queue. */
    ChannelBuffer *inQueueTail;	/* Points at last buffer in input queue. */


    struct ChannelHandler *chPtr;/* List of channel handlers registered
                                  * for this channel. */
    int interestMask;		/* Mask of all events this channel has
                                 * handlers for. */
    struct Channel *nextChanPtr;/* Next in list of channels currently open. */
    EventScriptRecord *scriptRecordPtr;
    				/* Chain of all scripts registered for
                                 * event handlers ("fileevent") on this
                                 * channel. */
    int bufSize;		/* What size buffers to allocate? */
    Tcl_TimerToken timer;	/* Handle to wakeup timer for this channel. */
    CopyState *csPtr;		/* State of background copy, or NULL. */
    struct Channel* supercedes; /* Refers to channel this one was stacked upon.
				   This reference is NULL for normal channels.
				   See Tcl_StackChannel. */

} Channel;
    
/*
 * Values for the flags field in Channel. Any ORed combination of the
 * following flags can be stored in the field. These flags record various
 * options and state bits about the channel. In addition to the flags below,
 * the channel can also have TCL_READABLE (1<<1) and TCL_WRITABLE (1<<2) set.
 */

#define CHANNEL_NONBLOCKING	(1<<3)	/* Channel is currently in
					 * nonblocking mode. */
#define CHANNEL_LINEBUFFERED	(1<<4)	/* Output to the channel must be
					 * flushed after every newline. */
#define CHANNEL_UNBUFFERED	(1<<5)	/* Output to the channel must always
					 * be flushed immediately. */
#define BUFFER_READY		(1<<6)	/* Current output buffer (the
					 * curOutPtr field in the
                                         * channel structure) should be
                                         * output as soon as possible even
                                         * though it may not be full. */
#define BG_FLUSH_SCHEDULED	(1<<7)	/* A background flush of the
					 * queued output buffers has been
                                         * scheduled. */
#define CHANNEL_CLOSED		(1<<8)	/* Channel has been closed. No
					 * further Tcl-level IO on the
                                         * channel is allowed. */
#define CHANNEL_EOF		(1<<9)	/* EOF occurred on this channel.
					 * This bit is cleared before every
                                         * input operation. */
#define CHANNEL_STICKY_EOF	(1<<10)	/* EOF occurred on this channel because
					 * we saw the input eofChar. This bit
                                         * prevents clearing of the EOF bit
                                         * before every input operation. */
#define CHANNEL_BLOCKED	(1<<11)	/* EWOULDBLOCK or EAGAIN occurred
					 * on this channel. This bit is
                                         * cleared before every input or
                                         * output operation. */
#define INPUT_SAW_CR		(1<<12)	/* Channel is in CRLF eol input
					 * translation mode and the last
                                         * byte seen was a "\r". */
#define INPUT_NEED_NL		(1<<15)	/* Saw a '\r' at end of last buffer,
					 * and there should be a '\n' at
					 * beginning of next buffer. */
#define CHANNEL_DEAD		(1<<13)	/* The channel has been closed by
					 * the exit handler (on exit) but
                                         * not deallocated. When any IO
                                         * operation sees this flag on a
                                         * channel, it does not call driver
                                         * level functions to avoid referring
                                         * to deallocated data. */
#define CHANNEL_NEED_MORE_DATA	(1<<14)	/* The last input operation failed
					 * because there was not enough data
					 * to complete the operation.  This
					 * flag is set when gets fails to
					 * get a complete line or when read
					 * fails to get a complete character.
					 * When set, file events will not be
					 * delivered for buffered data until
					 * the state of the channel changes. */

/*
 * For each channel handler registered in a call to Tcl_CreateChannelHandler,
 * there is one record of the following type. All of records for a specific
 * channel are chained together in a singly linked list which is stored in
 * the channel structure.
 */

typedef struct ChannelHandler {
    Channel *chanPtr;		/* The channel structure for this channel. */
    int mask;			/* Mask of desired events. */
    Tcl_ChannelProc *proc;	/* Procedure to call in the type of
                                 * Tcl_CreateChannelHandler. */
    ClientData clientData;	/* Argument to pass to procedure. */
    struct ChannelHandler *nextPtr;
    				/* Next one in list of registered handlers. */
} ChannelHandler;

/*
 * This structure keeps track of the current ChannelHandler being invoked in
 * the current invocation of ChannelHandlerEventProc. There is a potential
 * problem if a ChannelHandler is deleted while it is the current one, since
 * ChannelHandlerEventProc needs to look at the nextPtr field. To handle this
 * problem, structures of the type below indicate the next handler to be
 * processed for any (recursively nested) dispatches in progress. The
 * nextHandlerPtr field is updated if the handler being pointed to is deleted.
 * The nextPtr field is used to chain together all recursive invocations, so
 * that Tcl_DeleteChannelHandler can find all the recursively nested
 * invocations of ChannelHandlerEventProc and compare the handler being
 * deleted against the NEXT handler to be invoked in that invocation; when it
 * finds such a situation, Tcl_DeleteChannelHandler updates the nextHandlerPtr
 * field of the structure to the next handler.
 */

typedef struct NextChannelHandler {
    ChannelHandler *nextHandlerPtr;	/* The next handler to be invoked in
                                         * this invocation. */
    struct NextChannelHandler *nestedHandlerPtr;
					/* Next nested invocation of
                                         * ChannelHandlerEventProc. */
} NextChannelHandler;


/*
 * The following structure describes the event that is added to the Tcl
 * event queue by the channel handler check procedure.
 */

typedef struct ChannelHandlerEvent {
    Tcl_Event header;		/* Standard header for all events. */
    Channel *chanPtr;		/* The channel that is ready. */
    int readyMask;		/* Events that have occurred. */
} ChannelHandlerEvent;

/*
 * The following structure is used by Tcl_GetsObj() to encapsulates the
 * state for a "gets" operation.
 */
 
typedef struct GetsState {
    Tcl_Obj *objPtr;		/* The object to which UTF-8 characters
				 * will be appended. */
    char **dstPtr;		/* Pointer into objPtr's string rep where
				 * next character should be stored. */
    Tcl_Encoding encoding;	/* The encoding to use to convert raw bytes
				 * to UTF-8.  */
    ChannelBuffer *bufPtr;	/* The current buffer of raw bytes being
				 * emptied. */
    Tcl_EncodingState state;	/* The encoding state just before the last
				 * external to UTF-8 conversion in
				 * FilterInputBytes(). */
    int rawRead;		/* The number of bytes removed from bufPtr
				 * in the last call to FilterInputBytes(). */
    int bytesWrote;		/* The number of bytes of UTF-8 data
				 * appended to objPtr during the last call to
				 * FilterInputBytes(). */
    int charsWrote;		/* The corresponding number of UTF-8
				 * characters appended to objPtr during the
				 * last call to FilterInputBytes(). */
    int totalChars;		/* The total number of UTF-8 characters
				 * appended to objPtr so far, just before the
				 * last call to FilterInputBytes(). */
} GetsState;

/*
 * All static variables used in this file are collected into a single
 * instance of the following structure.  For multi-threaded implementations,
 * there is one instance of this structure for each thread.
 *
 * Notice that different structures with the same name appear in other
 * files.  The structure defined below is used in this file only.
 */

typedef struct ThreadSpecificData {

    /*
     * This variable holds the list of nested ChannelHandlerEventProc 
     * invocations.
     */
    NextChannelHandler *nestedHandlerPtr;

    /*
     * List of all channels currently open.
     * List of all channels currently open, indexed by ChannelState,
     */
    Channel *firstChanPtr;
#ifdef oldcode
    /*
     * Has a channel exit handler been created yet?
     */
    int channelExitHandlerCreated;

     * as only one ChannelState exists per set of stacked channels.
    /*
     * Has the channel event source been created and registered with the
     * notifier?
     */
    int channelEventSourceCreated;
    ChannelState *firstCSPtr;
#endif
    /*
     * Static variables to hold channels for stdin, stdout and stderr.
     */
    Tcl_Channel stdinChannel;
    int stdinInitialized;
    Tcl_Channel stdoutChannel;
    int stdoutInitialized;
    Tcl_Channel stderrChannel;
    int stderrInitialized;

} ThreadSpecificData;

static Tcl_ThreadDataKey dataKey;


/*
 * Static functions in this file:
 */

static ChannelBuffer *	AllocChannelBuffer _ANSI_ARGS_((int length));
static void		ChannelEventScriptInvoker _ANSI_ARGS_((
			    ClientData clientData, int flags));
static void		ChannelTimerProc _ANSI_ARGS_((
			    ClientData clientData));
static int		CheckChannelErrors _ANSI_ARGS_((Channel *chanPtr,
			    int direction));
				ClientData clientData));
static int		CheckChannelErrors _ANSI_ARGS_((ChannelState *statePtr,
				int direction));
static int		CheckFlush _ANSI_ARGS_((Channel *chanPtr,
			    ChannelBuffer *bufPtr, int newlineFlag));
				ChannelBuffer *bufPtr, int newlineFlag));
static int		CheckForDeadChannel _ANSI_ARGS_((Tcl_Interp *interp,
			    Channel *chan));
				ChannelState *statePtr));
static void		CheckForStdChannelsBeingClosed _ANSI_ARGS_((
			    Tcl_Channel chan));
				Tcl_Channel chan));
static void		CleanupChannelHandlers _ANSI_ARGS_((
			    Tcl_Interp *interp, Channel *chanPtr));
				Tcl_Interp *interp, Channel *chanPtr));
static int		CloseChannel _ANSI_ARGS_((Tcl_Interp *interp,
                            Channel *chanPtr, int errorCode));
				Channel *chanPtr, int errorCode));
static void		CommonGetsCleanup _ANSI_ARGS_((Channel *chanPtr,
			    Tcl_Encoding encoding));
				Tcl_Encoding encoding));
static int		CopyAndTranslateBuffer _ANSI_ARGS_((
				ChannelState *statePtr, char *result,
				int space));
static int		CopyBuffer _ANSI_ARGS_((
			    Channel *chanPtr, char *result, int space));
				Channel *chanPtr, char *result,
				int space));
static int		CopyData _ANSI_ARGS_((CopyState *csPtr, int mask));
static void		CopyEventProc _ANSI_ARGS_((ClientData clientData,
			    int mask));
				int mask));
static void		CreateScriptRecord _ANSI_ARGS_((
			    Tcl_Interp *interp, Channel *chanPtr,
                            int mask, Tcl_Obj *scriptPtr));
				Tcl_Interp *interp, Channel *chanPtr,
				int mask, Tcl_Obj *scriptPtr));
static void		DeleteChannelTable _ANSI_ARGS_((
			    ClientData clientData, Tcl_Interp *interp));
				ClientData clientData, Tcl_Interp *interp));
static void		DeleteScriptRecord _ANSI_ARGS_((Tcl_Interp *interp,
        		    Channel *chanPtr, int mask));
static void		DiscardInputQueued _ANSI_ARGS_((
			    Channel *chanPtr, int discardSavedBuffers));
				Channel *chanPtr, int mask));
static void		DiscardInputQueued _ANSI_ARGS_((ChannelState *statePtr,
				int discardSavedBuffers));
static void		DiscardOutputQueued _ANSI_ARGS_((
    			    Channel *chanPtr));
				ChannelState *chanPtr));
static int		DoRead _ANSI_ARGS_((Channel *chanPtr, char *srcPtr,
			    int slen));
				int slen));
static int		DoWrite _ANSI_ARGS_((Channel *chanPtr, char *src,
			    int srcLen));
				int srcLen));
static int		FilterInputBytes _ANSI_ARGS_((Channel *chanPtr,
			    GetsState *statePtr));
				GetsState *statePtr));
static int		FlushChannel _ANSI_ARGS_((Tcl_Interp *interp,
                            Channel *chanPtr, int calledFromAsyncFlush));
				Channel *chanPtr, int calledFromAsyncFlush));
static Tcl_HashTable *	GetChannelTable _ANSI_ARGS_((Tcl_Interp *interp));
static int		GetInput _ANSI_ARGS_((Channel *chanPtr));
static void		PeekAhead _ANSI_ARGS_((Channel *chanPtr,
			    char **dstEndPtr, GetsState *gsPtr));
static int		ReadBytes _ANSI_ARGS_((Channel *chanPtr,
			    Tcl_Obj *objPtr, int charsLeft, int *offsetPtr));
static int		ReadChars _ANSI_ARGS_((Channel *chanPtr,
			    Tcl_Obj *objPtr, int charsLeft, int *offsetPtr,
			    int *factorPtr));
static void		RecycleBuffer _ANSI_ARGS_((Channel *chanPtr,
		            ChannelBuffer *bufPtr, int mustDiscard));
				char **dstEndPtr, GetsState *gsPtr));
static int		ReadBytes _ANSI_ARGS_((ChannelState *statePtr,
				Tcl_Obj *objPtr, int charsLeft,
				int *offsetPtr));
static int		ReadChars _ANSI_ARGS_((ChannelState *statePtr,
				Tcl_Obj *objPtr, int charsLeft, int *offsetPtr,
				int *factorPtr));
static void		RecycleBuffer _ANSI_ARGS_((ChannelState *statePtr,
				ChannelBuffer *bufPtr, int mustDiscard));
static int		StackSetBlockMode _ANSI_ARGS_((Channel *chanPtr,
				int mode));
static int		SetBlockMode _ANSI_ARGS_((Tcl_Interp *interp,
		            Channel *chanPtr, int mode));
				Channel *chanPtr, int mode));
static void		StopCopy _ANSI_ARGS_((CopyState *csPtr));
static int		TranslateInputEOL _ANSI_ARGS_((Channel *chanPtr,
			    char *dst, CONST char *src, int *dstLenPtr,
			    int *srcLenPtr));
static int		TranslateOutputEOL _ANSI_ARGS_((Channel *chanPtr,
			    char *dst, CONST char *src, int *dstLenPtr,
			    int *srcLenPtr));
static int		TranslateInputEOL _ANSI_ARGS_((ChannelState *statePtr,
				char *dst, CONST char *src, int *dstLenPtr,
				int *srcLenPtr));
static int		TranslateOutputEOL _ANSI_ARGS_((ChannelState *statePtr,
				char *dst, CONST char *src, int *dstLenPtr,
				int *srcLenPtr));
static void		UpdateInterest _ANSI_ARGS_((Channel *chanPtr));
static int		WriteBytes _ANSI_ARGS_((Channel *chanPtr,
			    CONST char *src, int srcLen));
				CONST char *src, int srcLen));
static int		WriteChars _ANSI_ARGS_((Channel *chanPtr,
			    CONST char *src, int srcLen));
				CONST char *src, int srcLen));


/*
 *---------------------------------------------------------------------------
 *
 * TclInitIOSubsystem --
 *
518
519
520
521
522
523
524
525
526


527
528
529
530




531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549

550
551
552

553
554
555
556
557
558
559
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







-
-
+
+

-
-
-
+
+
+
+


















-
+


-
+








	/* ARGSUSED */
void
TclFinalizeIOSubsystem()
{
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
    Channel *chanPtr;			/* Iterates over open channels. */
    Channel *nextChanPtr;		/* Iterates over open channels. */

    ChannelState *nextCSPtr;		/* Iterates over open channels. */
    ChannelState *statePtr;		/* state of channel stack */

    for (chanPtr = tsdPtr->firstChanPtr; chanPtr != (Channel *) NULL;
             chanPtr = nextChanPtr) {
        nextChanPtr = chanPtr->nextChanPtr;
    for (statePtr = tsdPtr->firstCSPtr; statePtr != (ChannelState *) NULL;
	 statePtr = nextCSPtr) {
	chanPtr		= statePtr->topChanPtr;
        nextCSPtr	= statePtr->nextCSPtr;

        /*
         * Set the channel back into blocking mode to ensure that we wait
         * for all data to flush out.
         */
        
        (void) Tcl_SetChannelOption(NULL, (Tcl_Channel) chanPtr,
                "-blocking", "on");

        if ((chanPtr == (Channel *) tsdPtr->stdinChannel) ||
                (chanPtr == (Channel *) tsdPtr->stdoutChannel) ||
                (chanPtr == (Channel *) tsdPtr->stderrChannel)) {

            /*
             * Decrement the refcount which was earlier artificially bumped
             * up to keep the channel from being closed.
             */

            chanPtr->refCount--;
            statePtr->refCount--;
        }

        if (chanPtr->refCount <= 0) {
        if (statePtr->refCount <= 0) {

	    /*
             * Close it only if the refcount indicates that the channel is not
             * referenced from any interpreter. If it is, that interpreter will
             * close the channel when it gets destroyed.
             */

584
585
586
587
588
589
590
591

592
593
594
595
596
597
598
248
249
250
251
252
253
254

255
256
257
258
259
260
261
262







-
+







             * Finally, we clean up the fields in the channel data structure
             * since all of them have been deleted already. We mark the
             * channel with CHANNEL_DEAD to prevent any further IO operations
             * on it.
             */

            chanPtr->instanceData = (ClientData) NULL;
            chanPtr->flags |= CHANNEL_DEAD;
            statePtr->flags |= CHANNEL_DEAD;
        }
    }
}


/*
 *----------------------------------------------------------------------
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
397
398
399
400
401
402
403

404
405
406

407
408
409
410
411
412


413
414
415
416
417
418
419
420
421







-
+


-
+





-
-
+
+







    Tcl_Channel chan;		/* The channel for which to create the
                                 * close callback. */
    Tcl_CloseProc *proc;	/* The callback routine to call when the
                                 * channel will be closed. */
    ClientData clientData;	/* Arbitrary data to pass to the
                                 * close callback. */
{
    Channel *chanPtr;
    ChannelState *statePtr;
    CloseCallback *cbPtr;

    chanPtr = (Channel *) chan;
    statePtr = ((Channel *) chan)->state;

    cbPtr = (CloseCallback *) ckalloc((unsigned) sizeof(CloseCallback));
    cbPtr->proc = proc;
    cbPtr->clientData = clientData;

    cbPtr->nextPtr = chanPtr->closeCbPtr;
    chanPtr->closeCbPtr = cbPtr;
    cbPtr->nextPtr = statePtr->closeCbPtr;
    statePtr->closeCbPtr = cbPtr;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_DeleteCloseHandler --
 *
774
775
776
777
778
779
780
781

782
783
784
785
786
787




788
789
790

791
792
793
794
795
796
797
438
439
440
441
442
443
444

445
446
447




448
449
450
451
452
453

454
455
456
457
458
459
460
461







-
+


-
-
-
-
+
+
+
+


-
+







    Tcl_Channel chan;		/* The channel for which to cancel the
                                 * close callback. */
    Tcl_CloseProc *proc;	/* The procedure for the callback to
                                 * remove. */
    ClientData clientData;	/* The callback data for the callback
                                 * to remove. */
{
    Channel *chanPtr;
    ChannelState *statePtr;
    CloseCallback *cbPtr, *cbPrevPtr;

    chanPtr = (Channel *) chan;
    for (cbPtr = chanPtr->closeCbPtr, cbPrevPtr = (CloseCallback *) NULL;
             cbPtr != (CloseCallback *) NULL;
             cbPtr = cbPtr->nextPtr) {
    statePtr = ((Channel *) chan)->state;
    for (cbPtr = statePtr->closeCbPtr, cbPrevPtr = (CloseCallback *) NULL;
	 cbPtr != (CloseCallback *) NULL;
	 cbPtr = cbPtr->nextPtr) {
        if ((cbPtr->proc == proc) && (cbPtr->clientData == clientData)) {
            if (cbPrevPtr == (CloseCallback *) NULL) {
                chanPtr->closeCbPtr = cbPtr->nextPtr;
                statePtr->closeCbPtr = cbPtr->nextPtr;
            }
            ckfree((char *) cbPtr);
            break;
        } else {
            cbPrevPtr = cbPtr;
        }
    }
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
547
548
549
550
551
552
553

554
555
556
557
558
559

560
561
562
563
564
565
566
567


568
569
570
571
572
573
574
575
576
577

578
579


580
581
582
583
584

585
586
587
588
589
590

591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607



608
609
610
611
612
613
614
615
616
617







-
+
+




-
+







-
-
+
+


+





-
+

-
-
+
+



-
+





-
+
















-
-
-
+
+
+







DeleteChannelTable(clientData, interp)
    ClientData clientData;	/* The per-interpreter data structure. */
    Tcl_Interp *interp;		/* The interpreter being deleted. */
{
    Tcl_HashTable *hTblPtr;	/* The hash table. */
    Tcl_HashSearch hSearch;	/* Search variable. */
    Tcl_HashEntry *hPtr;	/* Search variable. */
    Channel *chanPtr;	/* Channel being deleted. */
    Channel *chanPtr;		/* Channel being deleted. */
    ChannelState *statePtr;	/* State of Channel being deleted. */
    EventScriptRecord *sPtr, *prevPtr, *nextPtr;
    				/* Variables to loop over all channel events
                                 * registered, to delete the ones that refer
                                 * to the interpreter being deleted. */
    

    /*
     * Delete all the registered channels - this will close channels whose
     * refcount reaches zero.
     */
    
    hTblPtr = (Tcl_HashTable *) clientData;
    for (hPtr = Tcl_FirstHashEntry(hTblPtr, &hSearch);
             hPtr != (Tcl_HashEntry *) NULL;
             hPtr = Tcl_FirstHashEntry(hTblPtr, &hSearch)) {
	 hPtr != (Tcl_HashEntry *) NULL;
	 hPtr = Tcl_FirstHashEntry(hTblPtr, &hSearch)) {

        chanPtr = (Channel *) Tcl_GetHashValue(hPtr);
	statePtr = chanPtr->state;

        /*
         * Remove any fileevents registered in this interpreter.
         */
        
        for (sPtr = chanPtr->scriptRecordPtr,
        for (sPtr = statePtr->scriptRecordPtr,
                 prevPtr = (EventScriptRecord *) NULL;
                 sPtr != (EventScriptRecord *) NULL;
                 sPtr = nextPtr) {
	     sPtr != (EventScriptRecord *) NULL;
	     sPtr = nextPtr) {
            nextPtr = sPtr->nextPtr;
            if (sPtr->interp == interp) {
                if (prevPtr == (EventScriptRecord *) NULL) {
                    chanPtr->scriptRecordPtr = nextPtr;
                    statePtr->scriptRecordPtr = nextPtr;
                } else {
                    prevPtr->nextPtr = nextPtr;
                }

                Tcl_DeleteChannelHandler((Tcl_Channel) chanPtr,
                        ChannelEventScriptInvoker, (ClientData) sPtr);
                        TclChannelEventScriptInvoker, (ClientData) sPtr);

		Tcl_DecrRefCount(sPtr->scriptPtr);
                ckfree((char *) sPtr);
            } else {
                prevPtr = sPtr;
            }
        }

        /*
         * Cannot call Tcl_UnregisterChannel because that procedure calls
         * Tcl_GetAssocData to get the channel table, which might already
         * be inaccessible from the interpreter structure. Instead, we
         * emulate the behavior of Tcl_UnregisterChannel directly here.
         */

        Tcl_DeleteHashEntry(hPtr);
        chanPtr->refCount--;
        if (chanPtr->refCount <= 0) {
            if (!(chanPtr->flags & BG_FLUSH_SCHEDULED)) {
        statePtr->refCount--;
        if (statePtr->refCount <= 0) {
            if (!(statePtr->flags & BG_FLUSH_SCHEDULED)) {
                (void) Tcl_Close(interp, (Tcl_Channel) chanPtr);
            }
        }
    }
    Tcl_DeleteHashTable(hTblPtr);
    ckfree((char *) hTblPtr);
}
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
638
639
640
641
642
643
644

645
646
647
648


649
650
651
652
653



654
655
656
657
658
659
660



661
662
663
664
665
666
667
668
669
670
671







-
+



-
-
+
+



-
-
-
+
+
+
+



-
-
-
+
+
+
+







 *----------------------------------------------------------------------
 */

static void
CheckForStdChannelsBeingClosed(chan)
    Tcl_Channel chan;
{
    Channel *chanPtr = (Channel *) chan;
    ChannelState *statePtr = ((Channel *) chan)->state;
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);

    if ((chan == tsdPtr->stdinChannel) && (tsdPtr->stdinInitialized)) {
        if (chanPtr->refCount < 2) {
            chanPtr->refCount = 0;
        if (statePtr->refCount < 2) {
            statePtr->refCount = 0;
            tsdPtr->stdinChannel = NULL;
            return;
        }
    } else if ((chan == tsdPtr->stdoutChannel) && (tsdPtr->stdoutInitialized)) {
        if (chanPtr->refCount < 2) {
            chanPtr->refCount = 0;
    } else if ((chan == tsdPtr->stdoutChannel)
	    && (tsdPtr->stdoutInitialized)) {
        if (statePtr->refCount < 2) {
            statePtr->refCount = 0;
            tsdPtr->stdoutChannel = NULL;
            return;
        }
    } else if ((chan == tsdPtr->stderrChannel) && (tsdPtr->stderrInitialized)) {
        if (chanPtr->refCount < 2) {
            chanPtr->refCount = 0;
    } else if ((chan == tsdPtr->stderrChannel)
	    && (tsdPtr->stderrInitialized)) {
        if (statePtr->refCount < 2) {
            statePtr->refCount = 0;
            tsdPtr->stderrChannel = NULL;
            return;
        }
    }
}

/*
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
692
693
694
695
696
697
698
699
700
701
702
703
704
705

706
707
708

709
710
711
712
713

714
715
716
717
718
719














720
721
722
723

724
725
726
727
728
729
730
731







+

+
+
+
+
+
-
+
+

-
+




-
+





-
-
-
-
-
-
-
-
-
-
-
-
-
-
+



-
+







    Tcl_Channel chan;		/* The channel to add to this interpreter
                                 * channel table. */
{
    Tcl_HashTable *hTblPtr;	/* Hash table of channels. */
    Tcl_HashEntry *hPtr;	/* Search variable. */
    int new;			/* Is the hash entry new or does it exist? */
    Channel *chanPtr;		/* The actual channel. */
    ChannelState *statePtr;	/* State of the actual channel. */

    /*
     * Always (un)register bottom-most channel in the stack.  This makes
     * management of the channel list easier because no manipulation is
     * necessary during (un)stack operation.
     */
    chanPtr = (Channel *) chan;
    chanPtr = ((Channel *) chan)->state->bottomChanPtr;
    statePtr = chanPtr->state;

    if (chanPtr->channelName == (char *) NULL) {
    if (statePtr->channelName == (char *) NULL) {
        panic("Tcl_RegisterChannel: channel without name");
    }
    if (interp != (Tcl_Interp *) NULL) {
        hTblPtr = GetChannelTable(interp);
        hPtr = Tcl_CreateHashEntry(hTblPtr, chanPtr->channelName, &new);
        hPtr = Tcl_CreateHashEntry(hTblPtr, statePtr->channelName, &new);
        if (new == 0) {
            if (chan == (Tcl_Channel) Tcl_GetHashValue(hPtr)) {
                return;
            }

	    /* Andreas Kupries <a.kupries@westend.com>, 12/13/1998
	     * "Trf-Patch for filtering channels"
	     *
	     * This is the change to 'Tcl_RegisterChannel'.
	     *
	     * Explanation:
	     *		The moment a channel is stacked upon another he
	     *		takes the identity of the channel he supercedes,
	     *		i.e. he gets the *same* name. Because of this we
	     *		cannot check for duplicate names anymore, they
	     *		have to be allowed now.
	     */

	    /* panic("Tcl_RegisterChannel: duplicate channel names"); */
	    panic("Tcl_RegisterChannel: duplicate channel names");
        }
        Tcl_SetHashValue(hPtr, (ClientData) chanPtr);
    }
    chanPtr->refCount++;
    statePtr->refCount++;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_UnregisterChannel --
 *
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
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







+

+
+
+
+
+
-
-
+
+
+





-
+



















-
+















-
+






-
-
-
-
+
+
+
+

-
-
+
+







Tcl_UnregisterChannel(interp, chan)
    Tcl_Interp *interp;		/* Interpreter in which channel is defined. */
    Tcl_Channel chan;		/* Channel to delete. */
{
    Tcl_HashTable *hTblPtr;	/* Hash table of channels. */
    Tcl_HashEntry *hPtr;	/* Search variable. */
    Channel *chanPtr;		/* The real IO channel. */
    ChannelState *statePtr;	/* State of the real channel. */

    /*
     * Always (un)register bottom-most channel in the stack.  This makes
     * management of the channel list easier because no manipulation is
     * necessary during (un)stack operation.
     */
    chanPtr = (Channel *) chan;
    
    chanPtr = ((Channel *) chan)->state->bottomChanPtr;
    statePtr = chanPtr->state;

    if (interp != (Tcl_Interp *) NULL) {
        hTblPtr = (Tcl_HashTable *) Tcl_GetAssocData(interp, "tclIO", NULL);
        if (hTblPtr == (Tcl_HashTable *) NULL) {
            return TCL_OK;
        }
        hPtr = Tcl_FindHashEntry(hTblPtr, chanPtr->channelName);
        hPtr = Tcl_FindHashEntry(hTblPtr, statePtr->channelName);
        if (hPtr == (Tcl_HashEntry *) NULL) {
            return TCL_OK;
        }
        if ((Channel *) Tcl_GetHashValue(hPtr) != chanPtr) {
            return TCL_OK;
        }
        Tcl_DeleteHashEntry(hPtr);

        /*
         * Remove channel handlers that refer to this interpreter, so that they
         * will not be present if the actual close is delayed and more events
         * happen on the channel. This may occur if the channel is shared
         * between several interpreters, or if the channel has async
         * flushing active.
         */
    
        CleanupChannelHandlers(interp, chanPtr);
    }

    chanPtr->refCount--;
    statePtr->refCount--;
    
    /*
     * Perform special handling for standard channels being closed. If the
     * refCount is now 1 it means that the last reference to the standard
     * channel is being explicitly closed, so bump the refCount down
     * artificially to 0. This will ensure that the channel is actually
     * closed, below. Also set the static pointer to NULL for the channel.
     */

    CheckForStdChannelsBeingClosed(chan);

    /*
     * If the refCount reached zero, close the actual channel.
     */

    if (chanPtr->refCount <= 0) {
    if (statePtr->refCount <= 0) {

        /*
         * Ensure that if there is another buffer, it gets flushed
         * whether or not we are doing a background flush.
         */

        if ((chanPtr->curOutPtr != NULL) &&
                (chanPtr->curOutPtr->nextAdded >
                        chanPtr->curOutPtr->nextRemoved)) {
            chanPtr->flags |= BUFFER_READY;
        if ((statePtr->curOutPtr != NULL) &&
                (statePtr->curOutPtr->nextAdded >
                        statePtr->curOutPtr->nextRemoved)) {
            statePtr->flags |= BUFFER_READY;
        }
        chanPtr->flags |= CHANNEL_CLOSED;
        if (!(chanPtr->flags & BG_FLUSH_SCHEDULED)) {
        statePtr->flags |= CHANNEL_CLOSED;
        if (!(statePtr->flags & BG_FLUSH_SCHEDULED)) {
            if (Tcl_Close(interp, chan) != TCL_OK) {
                return TCL_ERROR;
            }
        }
    }
    return TCL_OK;
}
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
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







-
+

-
+

-
+


-
+


-
+








+
+
+
+
+
+

+

-
+







     * have access to the standard channels.
     */

    name = chanName;
    if ((chanName[0] == 's') && (chanName[1] == 't')) {
	chanPtr = NULL;
	if (strcmp(chanName, "stdin") == 0) {
	    chanPtr = (Channel *)Tcl_GetStdChannel(TCL_STDIN);
	    chanPtr = (Channel *) Tcl_GetStdChannel(TCL_STDIN);
	} else if (strcmp(chanName, "stdout") == 0) {
	    chanPtr = (Channel *)Tcl_GetStdChannel(TCL_STDOUT);
	    chanPtr = (Channel *) Tcl_GetStdChannel(TCL_STDOUT);
	} else if (strcmp(chanName, "stderr") == 0) {
	    chanPtr = (Channel *)Tcl_GetStdChannel(TCL_STDERR);
	    chanPtr = (Channel *) Tcl_GetStdChannel(TCL_STDERR);
	}
	if (chanPtr != NULL) {
	    name = chanPtr->channelName;
	    name = chanPtr->state->channelName;
	}
    }
    

    hTblPtr = GetChannelTable(interp);
    hPtr = Tcl_FindHashEntry(hTblPtr, name);
    if (hPtr == (Tcl_HashEntry *) NULL) {
        Tcl_AppendResult(interp, "can not find channel named \"",
                chanName, "\"", (char *) NULL);
        return NULL;
    }

    /*
     * Always return bottom-most channel in the stack.  This one lives
     * the longest - other channels may go away unnoticed.
     * The other APIs compensate where necessary to retrieve the
     * topmost channel again.
     */
    chanPtr = (Channel *) Tcl_GetHashValue(hPtr);
    chanPtr = chanPtr->state->bottomChanPtr;
    if (modePtr != NULL) {
        *modePtr = (chanPtr->flags & (TCL_READABLE|TCL_WRITABLE));
        *modePtr = (chanPtr->state->flags & (TCL_READABLE|TCL_WRITABLE));
    }
    
    return (Tcl_Channel) chanPtr;
}

/*
 *----------------------------------------------------------------------
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
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







+
+



+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+

-
-
+
+




-
+





-
+


-
+

-
-
-
-
+
+
+
+









-
-
-
-
+
+
+
+

-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-

-
-
-
-
+
+
+
+

+
+
+
+
+
+
+
+
+
+







-
-
+
+






-
-
+
+
+

-
-
+
+
+

-
-
+
+
+







    Tcl_ChannelType *typePtr;	/* The channel type record. */
    char *chanName;		/* Name of channel to record. */
    ClientData instanceData;	/* Instance specific data. */
    int mask;			/* TCL_READABLE & TCL_WRITABLE to indicate
                                 * if the channel is readable, writable. */
{
    Channel *chanPtr;		/* The channel structure newly created. */
    ChannelState *statePtr;	/* The stack-level independent state info
				 * for the channel. */
    CONST char *name;
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);

    /*
     * With the change of the Tcl_ChannelType structure to use a version in
     * 8.3.2+, we have to make sure that our assumption that the structure
     * remains a binary compatible size is true.
     *
     * If this assertion fails on some system, then it can be removed
     * only if the user recompiles code with older channel drivers in
     * the new system as well.
     */

    assert(sizeof(Tcl_ChannelTypeVersion) == sizeof(Tcl_DriverBlockModeProc*));

    chanPtr = (Channel *) ckalloc((unsigned) sizeof(Channel));
    
    chanPtr  = (Channel *) ckalloc((unsigned) sizeof(Channel));
    statePtr = (ChannelState *) ckalloc((unsigned) sizeof(ChannelState));
    chanPtr->state = statePtr;

    chanPtr->instanceData	= instanceData;
    chanPtr->typePtr		= typePtr;

    /*
     * Set all the bits that are part of the stack-independent state
     * information for the channel.
     */

    if (chanName != (char *) NULL) {
        chanPtr->channelName = ckalloc((unsigned) (strlen(chanName) + 1));
        strcpy(chanPtr->channelName, chanName);
        statePtr->channelName = ckalloc((unsigned) (strlen(chanName) + 1));
        strcpy(statePtr->channelName, chanName);
    } else {
        panic("Tcl_CreateChannel: NULL channel name");
    }

    chanPtr->flags = mask;
    statePtr->flags		= mask;

    /*
     * Set the channel to system default encoding.
     */

    chanPtr->encoding = NULL;
    statePtr->encoding = NULL;
    name = Tcl_GetEncodingName(NULL);
    if (strcmp(name, "binary") != 0) {
    	chanPtr->encoding = Tcl_GetEncoding(NULL, name);
    	statePtr->encoding = Tcl_GetEncoding(NULL, name);
    }
    chanPtr->inputEncodingState = NULL;
    chanPtr->inputEncodingFlags = TCL_ENCODING_START;
    chanPtr->outputEncodingState = NULL;
    chanPtr->outputEncodingFlags = TCL_ENCODING_START;
    statePtr->inputEncodingState	= NULL;
    statePtr->inputEncodingFlags	= TCL_ENCODING_START;
    statePtr->outputEncodingState	= NULL;
    statePtr->outputEncodingFlags	= TCL_ENCODING_START;

    /*
     * Set the channel up initially in AUTO input translation mode to
     * accept "\n", "\r" and "\r\n". Output translation mode is set to
     * a platform specific default value. The eofChar is set to 0 for both
     * input and output, so that Tcl does not look for an in-file EOF
     * indicator (e.g. ^Z) and does not append an EOF indicator to files.
     */

    chanPtr->inputTranslation = TCL_TRANSLATE_AUTO;
    chanPtr->outputTranslation = TCL_PLATFORM_TRANSLATION;
    chanPtr->inEofChar = 0;
    chanPtr->outEofChar = 0;
    statePtr->inputTranslation	= TCL_TRANSLATE_AUTO;
    statePtr->outputTranslation	= TCL_PLATFORM_TRANSLATION;
    statePtr->inEofChar		= 0;
    statePtr->outEofChar	= 0;

    chanPtr->unreportedError = 0;
    statePtr->unreportedError	= 0;
    chanPtr->instanceData = instanceData;
    chanPtr->typePtr = typePtr;
    chanPtr->refCount = 0;
    chanPtr->closeCbPtr = (CloseCallback *) NULL;
    chanPtr->curOutPtr = (ChannelBuffer *) NULL;
    chanPtr->outQueueHead = (ChannelBuffer *) NULL;
    chanPtr->outQueueTail = (ChannelBuffer *) NULL;
    chanPtr->saveInBufPtr = (ChannelBuffer *) NULL;
    chanPtr->inQueueHead = (ChannelBuffer *) NULL;
    chanPtr->inQueueTail = (ChannelBuffer *) NULL;
    chanPtr->chPtr = (ChannelHandler *) NULL;
    chanPtr->interestMask = 0;
    chanPtr->scriptRecordPtr = (EventScriptRecord *) NULL;
    chanPtr->bufSize = CHANNELBUFFER_DEFAULT_SIZE;
    chanPtr->timer = NULL;
    chanPtr->csPtr = NULL;
    statePtr->refCount		= 0;
    statePtr->closeCbPtr	= (CloseCallback *) NULL;
    statePtr->curOutPtr		= (ChannelBuffer *) NULL;
    statePtr->outQueueHead	= (ChannelBuffer *) NULL;
    statePtr->outQueueTail	= (ChannelBuffer *) NULL;
    statePtr->saveInBufPtr	= (ChannelBuffer *) NULL;
    statePtr->inQueueHead	= (ChannelBuffer *) NULL;
    statePtr->inQueueTail	= (ChannelBuffer *) NULL;
    statePtr->chPtr		= (ChannelHandler *) NULL;
    statePtr->interestMask	= 0;
    statePtr->scriptRecordPtr	= (EventScriptRecord *) NULL;
    statePtr->bufSize		= CHANNELBUFFER_DEFAULT_SIZE;
    statePtr->timer		= NULL;
    statePtr->csPtr		= NULL;
    chanPtr->supercedes = (Channel*) NULL;

    chanPtr->outputStage = NULL;
    if ((chanPtr->encoding != NULL) && (chanPtr->flags & TCL_WRITABLE)) {
	chanPtr->outputStage = (char *)
		ckalloc((unsigned) (chanPtr->bufSize + 2));
    statePtr->outputStage	= NULL;
    if ((statePtr->encoding != NULL) && (statePtr->flags & TCL_WRITABLE)) {
	statePtr->outputStage = (char *)
	    ckalloc((unsigned) (statePtr->bufSize + 2));
    }

    /*
     * As we are creating the channel, it is obviously the top for now
     */
    statePtr->topChanPtr	= chanPtr;
    statePtr->bottomChanPtr	= chanPtr;
    chanPtr->downChanPtr	= (Channel *) NULL;
    chanPtr->upChanPtr		= (Channel *) NULL;
    chanPtr->inQueueHead        = (ChannelBuffer*) NULL;
    chanPtr->inQueueTail        = (ChannelBuffer*) NULL;

    /*
     * Link the channel into the list of all channels; create an on-exit
     * handler if there is not one already, to close off all the channels
     * in the list on exit.
     */

    chanPtr->nextChanPtr = tsdPtr->firstChanPtr;
    tsdPtr->firstChanPtr = chanPtr;
    statePtr->nextCSPtr  = tsdPtr->firstCSPtr;
    tsdPtr->firstCSPtr   = statePtr;

    /*
     * Install this channel in the first empty standard channel slot, if
     * the channel was previously closed explicitly.
     */

    if ((tsdPtr->stdinChannel == NULL) && (tsdPtr->stdinInitialized == 1)) {
	Tcl_SetStdChannel((Tcl_Channel)chanPtr, TCL_STDIN);
    if ((tsdPtr->stdinChannel == NULL) &&
	    (tsdPtr->stdinInitialized == 1)) {
	Tcl_SetStdChannel((Tcl_Channel) chanPtr, TCL_STDIN);
        Tcl_RegisterChannel((Tcl_Interp *) NULL, (Tcl_Channel) chanPtr);
    } else if ((tsdPtr->stdoutChannel == NULL) && (tsdPtr->stdoutInitialized == 1)) {
	Tcl_SetStdChannel((Tcl_Channel)chanPtr, TCL_STDOUT);
    } else if ((tsdPtr->stdoutChannel == NULL) &&
	    (tsdPtr->stdoutInitialized == 1)) {
	Tcl_SetStdChannel((Tcl_Channel) chanPtr, TCL_STDOUT);
        Tcl_RegisterChannel((Tcl_Interp *) NULL, (Tcl_Channel) chanPtr);
    } else if ((tsdPtr->stderrChannel == NULL) && (tsdPtr->stderrInitialized == 1)) {
	Tcl_SetStdChannel((Tcl_Channel)chanPtr, TCL_STDERR);
    } else if ((tsdPtr->stderrChannel == NULL) &&
	    (tsdPtr->stderrInitialized == 1)) {
	Tcl_SetStdChannel((Tcl_Channel) chanPtr, TCL_STDERR);
        Tcl_RegisterChannel((Tcl_Interp *) NULL, (Tcl_Channel) chanPtr);
    } 
    return (Tcl_Channel) chanPtr;
}

/*
 *----------------------------------------------------------------------
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

1799
1800
1801
1802
1803
1804

1805
1806
1807
1808
1809
1810
1811


1812
1813
1814



1815
1816

1817
1818
1819

1820
1821
1822
1823

1824
1825
1826

1827
1828
1829
1830

1831
1832
1833





1834

1835

1836
1837
1838
1839
1840
1841
1842








1843
1844
1845
1846
1847
1848
1849
1850

1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
















































































1869
1870
1871
1872
1873
1874
1875
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







-
+


-
+

-
+

-
+

-
-
-
+
+
+


-
-
-
-
-
-
-
+
+

-
-
-
-
-
-
-
-
-
-
+
-
-


-
+
+

-
-
+
+


-
-
+
-
-
+
-
+
















+
+
+
-
+



+
+
+
+
+
+
-
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+

+
-
-
+
+
+
+
+
+
+
+
+
+
+
+


+
+
+
+
+
+
-
+
+
+

+
-
-
-
-
+
+
+
+
+

+
+






-
-
-
-
-
-
-
-
-
-
-
-
-
-


-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
+
+
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-



-
+
-


-
-
+
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-











-
-


-
+


+
-
+




-
+

-
+


+
+
+
-
-
+
+
+
+
+
+

-
+






-
+
-
-
-
-
-
-
-
-
-
-
-


-
-
+
+
-
-
-
+
+
+


-
+
-
-
+
-
-
-
-
-
-
-
+
+
-
-
+

-
-
-
+
+
+
+
+
-
-
+
+
-
-
-
-
-
+
+
-
-
-
-
+
-
-
-
-
-
-
-

-
-
-
-
-
-
-
-
+
-
-
-
+
+
-
-
-
-
-
+
+
-
-
-
+
+
+


-
-
-
+
+
+
-
-

-
-
+
+
+
+
+
-

-
-
-
-
+
-
-
-
-
-
+
-
-
-
+
-
-
-
+
-
-
-
-
-
-
+
-
-
-
-
+
+
+
-
-
-
+
+
-
-

+
-
+


-
-
-
+
+

-
+

+
+
-
-
-
-
-
-
+
-
-
-
-
-
-
+
-
-
-
-
-
-
-
+
+
-
-
-
+
+
+
-
-
+
-
-

+

-
-
-
+
-

-
+
-
-
-
-
+
-
-
-
+
+
+
+
+

+
-
+



-
-
-
-
+
+
+
+
+
+
+
+







-
+
















-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







 *    replaced by the new typePtr.
 *
 *----------------------------------------------------------------------
 */

Tcl_Channel
Tcl_StackChannel(interp, typePtr, instanceData, mask, prevChan)
    Tcl_Interp*      interp;       /* The interpreter we are working in */
    Tcl_Interp	    *interp;	   /* The interpreter we are working in */
    Tcl_ChannelType *typePtr;	   /* The channel type record for the new
				    * channel. */
    ClientData       instanceData; /* Instance specific data for the new
    ClientData	     instanceData; /* Instance specific data for the new
				    * channel. */
    int              mask;	   /* TCL_READABLE & TCL_WRITABLE to indicate
    int		     mask;	   /* TCL_READABLE & TCL_WRITABLE to indicate
				    * if the channel is readable, writable. */
    Tcl_Channel      prevChan;	   /* The channel structure to replace */
    Tcl_Channel	     prevChan;	   /* The channel structure to replace */
{
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
    Channel            *chanPtr, *pt;
    int                 interest = 0;
    ThreadSpecificData	*tsdPtr = TCL_TSD_INIT(&dataKey);
    Channel		*chanPtr, *prevChanPtr;
    ChannelState	*statePtr;

    /*
     * AK, 06/30/1999
     *
     * Tcl_StackChannel differs from Tcl_ReplaceChannel of the
     * original "Trf" patch. Instead of seeing the
     * newly created structure as the *new* channel to cover the specified
     * one use it to *save* the current state of the specified channel and
     * then reinitialize the current structure for the given transformation.
     * Find the given channel in the list of all channels.
     * If we don't find it, then it was never registered correctly.
     *
     * Advantages:
     * - No splicing into the (thread-)global list of channels (or the per-
     *   interp hash-tables).
     * - Users of the C-API still have valid channel references even after
     *   the call to this procedure.
     *
     * Disadvantages:
     * - Untested code.
     */

     * This operation should occur at the top of a channel stack.
    /*
     * Find the given channel in the list of all channels.
     */

    pt     = (Channel*) tsdPtr->firstChanPtr;
    statePtr    = (ChannelState *) tsdPtr->firstCSPtr;
    prevChanPtr = ((Channel *) prevChan)->state->topChanPtr;

    while (pt != (Channel *) prevChan) {
	pt = pt->nextChanPtr;
    while (statePtr->topChanPtr != prevChanPtr) {
	statePtr = statePtr->nextCSPtr;
    }

    /*
     * 'pt == prevChan' now (or NULL, if not found).
    if (statePtr == NULL) {
     */

	Tcl_AppendResult(interp, "couldn't find state for channel \"",
    if (!pt) {
		Tcl_GetChannelName(prevChan), "\"", (char *) NULL);
        return (Tcl_Channel) NULL;
    }

    /*
     * Here we check if the given "mask" matches the "flags"
     * of the already existing channel.
     *
     *	  | - | R | W | RW |
     *	--+---+---+---+----+	<=>  0 != (chan->mask & prevChan->mask)
     *	- |   |   |   |    |
     *	R |   | + |   | +  |	The superceding channel is allowed to
     *	W |   |   | + | +  |	restrict the capabilities of the
     *	RW|   | + | + | +  |	superceded one !
     *	--+---+---+---+----+
     */

    if ((mask & (statePtr->flags & (TCL_READABLE | TCL_WRITABLE))) == 0) {
	Tcl_AppendResult(interp,
		"reading and writing both disallowed for channel \"",
    if ((mask & Tcl_GetChannelMode (prevChan)) == 0) {
		Tcl_GetChannelName(prevChan), "\"", (char *) NULL);
        return (Tcl_Channel) NULL;
    }

    /*
     * Flush the buffers. This ensures that any data still in them
     * at this time is not handled by the new transformation. Restrict
     * this to writable channels. Take care to hide a possible bg-copy
     * in progress from Tcl_Flush and the CheckForChannelErrors inside.
     */
    chanPtr = (Channel *) ckalloc((unsigned) sizeof(Channel));

    if ((mask & TCL_WRITABLE) != 0) {
        CopyState *csPtr;

        csPtr           = statePtr->csPtr;
	statePtr->csPtr = (CopyState*) NULL;

	if (Tcl_Flush((Tcl_Channel) prevChanPtr) != TCL_OK) {
	    statePtr->csPtr = csPtr;
	    Tcl_AppendResult(interp, "could not flush channel \"",
		    Tcl_GetChannelName(prevChan), "\"", (char *) NULL);
	    return (Tcl_Channel) NULL;
	}

	statePtr->csPtr = csPtr;
    }
    /*
     * Discard any input in the buffers. They are not yet read by the
     * If there is some interest in the channel, remove it, break
     * down the whole chain. It will be reconstructed later.
     * user of the channel, so they have to go through the new
     * transformation before reading. As the buffers contain the
     * untransformed form their contents are not only useless but actually
     * distorts our view of the system.
     *
     * To preserve the information without having to read them again and
     * to avoid problems with the location in the channel (seeking might
     * be impossible) we move the buffers from the common state structure
     * into the channel itself. We use the buffers in the channel below
     * the new transformation to hold the data. In the future this allows
     * us to write transformations which pre-read data and push the unused
     * part back when they are going away.
     */

    if (((mask & TCL_READABLE) != 0) &&
	(statePtr->inQueueHead != (ChannelBuffer*) NULL)) {
      /*
       * Remark: It is possible that the channel buffers contain data from
       * some earlier push-backs.
       */
    interest = pt->interestMask;

      statePtr->inQueueTail->nextPtr = prevChanPtr->inQueueHead;
      prevChanPtr->inQueueHead       = statePtr->inQueueHead;

      if (prevChanPtr->inQueueTail == (ChannelBuffer*) NULL) {
    pt->interestMask = 0;

    if (interest) {
        (pt->typePtr->watchProc) (pt->instanceData, 0);
	prevChanPtr->inQueueTail = statePtr->inQueueTail;
      }

      statePtr->inQueueHead          = (ChannelBuffer*) NULL;
      statePtr->inQueueTail          = (ChannelBuffer*) NULL;
    }

    chanPtr = (Channel *) ckalloc((unsigned) sizeof(Channel));

    /*
     * Save some of the current state into the new structure,
     * reinitialize the parts which will stay with the transformation.
     *
     * Remarks:
     * - We cannot discard the buffers, and they cannot be used from the
     *   transformation placed later into the 'pt' structure. Save them,
     *   and believe that Tcl_SetChannelOption (buffering, none) will do
     *   the right thing.
     * - encoding and EOL-translation control information is initialized
     *   to values for 'binary'. This is later reinforced via
     *   Tcl_SetChanneloption to get the handling of flags and the event
     *   system right.
     * - The 'interestMask' of the saved channel is cleared, but the
     *   transformations WatchProc is used to establish the connection
     *   between transformation and underlying channel. This should
     *   reestablish the correct mask.
     * - TTO = Transform Takes Over.   The hidden channel no longer
     *         needs to perform this function.
     */

    chanPtr->channelName = (char *) ckalloc (strlen(pt->channelName)+1);
    strcpy (chanPtr->channelName, pt->channelName);

    chanPtr->state		= statePtr;
    chanPtr->flags               = pt->flags;           /* Save */

    chanPtr->encoding            = (Tcl_Encoding) NULL; /* == 'binary' */
    chanPtr->inputEncodingState  = (Tcl_EncodingState) NULL;
    chanPtr->inputEncodingFlags  = TCL_ENCODING_START;
    chanPtr->outputEncodingState = (Tcl_EncodingState) NULL;
    chanPtr->outputEncodingFlags = TCL_ENCODING_START;

    chanPtr->inputTranslation    = TCL_TRANSLATE_LF; /* == 'binary' */
    chanPtr->outputTranslation   = TCL_TRANSLATE_LF; /* == 'binary' */
    chanPtr->inEofChar           = pt->inEofChar;         /* Save */
    chanPtr->outEofChar          = pt->outEofChar;        /* Save */

    chanPtr->unreportedError     = pt->unreportedError;   /* Save */
    chanPtr->instanceData        = pt->instanceData;      /* Save */
    chanPtr->typePtr             = pt->typePtr;           /* Save */
    chanPtr->instanceData	= instanceData;
    chanPtr->typePtr		= typePtr;
    chanPtr->refCount            = 0;   /* None, as the structure is covered */
    chanPtr->closeCbPtr          = (CloseCallback*) NULL; /* TTO */

    chanPtr->outputStage         = (char*) NULL;
    chanPtr->downChanPtr	= prevChanPtr;
    chanPtr->upChanPtr		= (Channel *) NULL;
    chanPtr->curOutPtr           = pt->curOutPtr;    /* Save */
    chanPtr->outQueueHead        = pt->outQueueHead; /* Save */
    chanPtr->outQueueTail        = pt->outQueueTail; /* Save */
    chanPtr->saveInBufPtr        = pt->saveInBufPtr; /* Save */
    chanPtr->inQueueHead         = pt->inQueueHead;  /* Save */
    chanPtr->inQueueTail         = pt->inQueueTail;  /* Save */
    chanPtr->inQueueHead        = (ChannelBuffer*) NULL;
    chanPtr->inQueueTail        = (ChannelBuffer*) NULL;

    chanPtr->chPtr               = (ChannelHandler *) NULL;  /* TTO */
    chanPtr->interestMask        = 0;
    chanPtr->nextChanPtr         = (Channel*) NULL;     /* Is not in list! */
    chanPtr->scriptRecordPtr     = (EventScriptRecord *) NULL; /* TTO */
    chanPtr->bufSize             = CHANNELBUFFER_DEFAULT_SIZE;
    chanPtr->timer               = (Tcl_TimerToken) NULL;      /* TTO */
    chanPtr->csPtr               = (CopyState*) NULL;          /* TTO */

    /*
     * Place new block at the head of a possibly existing list of previously
     * stacked channels, then do the missing initializations of translation
     * stacked channels.
     * and buffer system.
     */

    chanPtr->supercedes          = pt->supercedes;

    prevChanPtr->upChanPtr	= chanPtr;
    Tcl_SetChannelOption (interp, (Tcl_Channel) chanPtr,
	"-translation", "binary");
    Tcl_SetChannelOption (interp, (Tcl_Channel) chanPtr,
	"-buffering",   "none");

    statePtr->topChanPtr	= chanPtr;
    /*
     * Save accomplished, now reinitialize the (old) structure for the
     * transformation.
     *
     * - The information about encoding and eol-translation is taken
     *   without change.  There is no need to fiddle with
     *   refCount et. al.
     *
     * Don't forget to use the same blocking mode as the old channel.
     */

    pt->flags               = mask | (chanPtr->flags & CHANNEL_NONBLOCKING);

    /*
     * EDITORS NOTE:  all the lines with "take it as is" should get
     * deleted once this code has been debugged.
     */

    /* pt->encoding,            take it as is */
    /* pt->inputEncodingState,  take it as is */
    /* pt->inputEncodingFlags,  take it as is */
    /* pt->outputEncodingState, take it as is */
    /* pt->outputEncodingFlags, take it as is */

    /* pt->inputTranslation,    take it as is */
    /* pt->outputTranslation,   take it as is */

    /*
     * No special EOF character, that condition is determined by the
     * old channel
     */

    pt->inEofChar           = 0;
    pt->outEofChar          = 0;

    pt->unreportedError     = 0; /* No errors yet */
    pt->instanceData        = instanceData; /* Transformation state */
    pt->typePtr             = typePtr;      /* Transformation type */
    /* pt->refCount,            take it as it is */
    /* pt->closeCbPtr,          take it as it is */

    /* pt->outputStage,         take it as it is */
    pt->curOutPtr           = (ChannelBuffer *) NULL;
    pt->outQueueHead        = (ChannelBuffer *) NULL;
    pt->outQueueTail        = (ChannelBuffer *) NULL;
    pt->saveInBufPtr        = (ChannelBuffer *) NULL;
    pt->inQueueHead         = (ChannelBuffer *) NULL;
    pt->inQueueTail         = (ChannelBuffer *) NULL;

    /* pt->chPtr,               take it as it is */
    /* pt->interestMask,        take it as it is */
    /* pt->nextChanPtr,         take it as it is */
    /* pt->scriptRecordPtr,     take it as it is */
    pt->bufSize             = CHANNELBUFFER_DEFAULT_SIZE;
    /* pt->timer,               take it as it is */
    /* pt->csPtr,               take it as it is */

    /*
     * Have the transformation reference the new structure containing
     * the saved channel.
     */

    pt->supercedes          = chanPtr;

    /*
     * Don't forget to reinitialize the output buffer used for encodings.
     */

    if ((chanPtr->encoding != NULL) && (chanPtr->flags & TCL_WRITABLE)) {
        chanPtr->outputStage = (char *)
	    ckalloc((unsigned) (chanPtr->bufSize + 2));
    }

    /*
     * Event handling: If the information in the old channel shows
     * that there was interest in some events call the 'WatchProc'
     * of the transformation to establish the proper connection
     * between them.
     */

    if (interest) {
        (pt->typePtr->watchProc) (pt->instanceData, interest);
    }

    /*
     * The superceded channel is effectively unregistered
     * We cannot decrement its reference count because that
     * can cause it to get garbage collected out from under us.
     * Don't add the following code:
     *
     * chanPtr->supercedes->refCount --;
     */

    return (Tcl_Channel) chanPtr;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_UnstackChannel --
 *
 *	Unstacks an entry in the hash table for a Tcl_Channel
 *	record. This is the reverse to 'Tcl_StackChannel'.
 *	The old, superceded channel is uncovered and re-registered
 *	in the appropriate data structures.
 *
 * Results:
 *	Returns the old Tcl_Channel, i.e. the one which was stacked over.
 *	A standard Tcl result.
 *
 * Side effects:
 *	If TCL_ERROR is returned, the posix error code will be set
 *	See above.
 *	with Tcl_SetErrno.
 *
 *----------------------------------------------------------------------
 */

void
int
Tcl_UnstackChannel (interp, chan)
    Tcl_Interp* interp; /* The interpreter we are working in */
    Tcl_Interp *interp; /* The interpreter we are working in */
    Tcl_Channel chan;   /* The channel to unstack */
{
    Channel      *chanPtr  = (Channel *) chan;
    ChannelState *statePtr = chanPtr->state;
    int result = 0;
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
    Channel* chanPtr = (Channel*) chan;

    /*
     * This operation should occur at the top of a channel stack.
     */

    chanPtr = statePtr->topChanPtr;

    if (chanPtr->supercedes != (Channel*) NULL) {
    if (chanPtr->downChanPtr != (Channel *) NULL) {
        /*
	 * Instead of manipulating the per-thread / per-interp list/hashtable
	 * of registered channels we wind down the state of the transformation,
	 * and then restore the state of underlying channel into the old
	 * structure.
	 */

	Channel *downChanPtr = chanPtr->downChanPtr;
	Tcl_DString       dsTrans; /* storage to save option information */
	Tcl_DString       dsBuf;   /* storage to save option information */
	Channel           top;     /* Save area for current transformation */
	Channel*          chanDownPtr = chanPtr->supercedes;
	int               interest;	/* interest mask of transformation
					 * before destruct. */
	int               saveInputEncodingFlags;  /* Save area for encoding */
 	int               saveOutputEncodingFlags; /* related information */
	Tcl_EncodingState saveInputEncodingState;
	Tcl_EncodingState saveOutputEncodingState;
	Tcl_Encoding      saveEncoding;

	/*
	 * Event handling: Disallow the delivery of events from the
	 * old, now uncovered channel to the transformation.
	 * Flush the buffers. This ensures that any data still in them
	 * at this time _is_ handled by the transformation we are unstacking
	 *
	 * This is done before everything else to avoid problems
	 * after our heavy-duty shuffling of pointers around.
	 * right now. Restrict this to writable channels. Take care to hide
	 * a possible bg-copy in progress from Tcl_Flush and the
	 * CheckForChannelErrors inside.
	 */

	interest = chanPtr->interestMask;
	if (statePtr->flags & TCL_WRITABLE) {
        (chanPtr->typePtr->watchProc) (chanPtr->instanceData, 0);

	    CopyState*    csPtr;
	/* 1. Swap the information in the top channel (the transformation)
	 *    and the channel below, with some exceptions. This additionally
	 *    cuts the top channel out of the chain. Without the latter
	 *    a Tcl_Close on the transformation would be impossible, as that
	 *    procedure will free the structure, making 'top' unusable.
	 *
	 * chanPtr     -> top channel, transformation.

	    csPtr           = statePtr->csPtr;
	 * chanDownPtr -> channel immediately below the transformation.
	 */
	    statePtr->csPtr = (CopyState*) NULL;

	memcpy ((void*) &top,        (void*) chanPtr,     sizeof (Channel));
	memcpy ((void*) chanPtr,     (void*) chanDownPtr, sizeof (Channel));
	top.supercedes = (Channel*) NULL;
	    if (Tcl_Flush((Tcl_Channel) chanPtr) != TCL_OK) {
	        statePtr->csPtr = csPtr;
		Tcl_AppendResult(interp, "could not flush channel \"",
			Tcl_GetChannelName((Tcl_Channel) chanPtr), "\"",
			(char *) NULL);
	memcpy ((void*) chanDownPtr, (void*) &top,        sizeof (Channel));

		return TCL_ERROR;
	    }
	/* Now:
 	 * chanPtr     -> channel immediately below the transformation, now top
 	 * chanDownPtr -> transformation, cut loose.
 	 *
 	 * Handle the exceptions mentioned above, i.e. move the information

	    statePtr->csPtr = csPtr;
 	 * from the transformation into the new top, and reinitialize it to
 	 * safe values in the transformation.
 	 */

	}
	chanPtr->refCount        = chanDownPtr->refCount;
	chanPtr->closeCbPtr      = chanDownPtr->closeCbPtr;
	chanPtr->chPtr           = chanDownPtr->chPtr;
	chanPtr->nextChanPtr     = chanDownPtr->nextChanPtr;
	chanPtr->scriptRecordPtr = chanDownPtr->scriptRecordPtr;
	chanPtr->timer           = chanDownPtr->timer;
	chanPtr->csPtr           = chanDownPtr->csPtr;

	chanDownPtr->refCount        = 0;
	chanDownPtr->closeCbPtr      = (CloseCallback*) NULL;
	chanDownPtr->chPtr           = (ChannelHandler*) NULL;
	chanDownPtr->nextChanPtr     = (Channel*) NULL;
	chanDownPtr->scriptRecordPtr = (EventScriptRecord*) NULL;
	chanDownPtr->timer           = (Tcl_TimerToken) NULL;
	chanDownPtr->csPtr           = (CopyState*) NULL;

	/*
	/* The now uncovered channel still has encoding and eol-translation
	 * deactivated, i.e. switched to 'binary'. *Don't* touch this until
	 * after the transformation is closed for good, as it may write
	 * Anything in the input queue and the push-back buffers of
	 * the transformation going away is transformed data, but not
	 * information into it during that (-> flushing of data waiting in
	 * internal buffers!) and rely on these settings. Thanks to Matt
	 * Newman <matt@sensus.org> for finding this goof.
	 *
	 * But we also have to protect the state of the encoding from removal
	 * yet read. As unstacking means that the caller does not want
	 * to see transformed data any more we have to discard these
	 * during the close. So we save it in some local variables.
	 * Additionally the current value of the options is lost after we
	 * close, we have to save them now.
	 * bytes. To avoid writing an analogue to 'DiscardInputQueued'
	 * we move the information in the push back buffers to the
	 * input queue and then call 'DiscardInputQueued' on that.
	 */

 	saveEncoding            = chanDownPtr->encoding;
 	saveInputEncodingState  = chanDownPtr->inputEncodingState;
 	saveInputEncodingFlags  = chanDownPtr->inputEncodingFlags;
	if (((statePtr->flags & TCL_READABLE)  != 0) &&
	    ((statePtr->inQueueHead != (ChannelBuffer*) NULL) ||
	     (chanPtr->inQueueHead  != (ChannelBuffer*) NULL))) {
 	saveOutputEncodingState = chanDownPtr->outputEncodingState;
 	saveOutputEncodingFlags = chanDownPtr->outputEncodingFlags;

 	Tcl_DStringInit (&dsTrans);
 	Tcl_GetChannelOption (interp, (Tcl_Channel) chanDownPtr,
	    if ((statePtr->inQueueHead != (ChannelBuffer*) NULL) &&
		(chanPtr->inQueueHead  != (ChannelBuffer*) NULL)) {
	        statePtr->inQueueTail->nextPtr = chanPtr->inQueueHead;
		statePtr->inQueueTail = chanPtr->inQueueTail;
	        statePtr->inQueueHead = statePtr->inQueueTail;
		"-translation", &dsTrans);

 	Tcl_DStringInit (&dsBuf);
 	Tcl_GetChannelOption (interp, (Tcl_Channel) chanDownPtr,
		"-buffering", &dsBuf);

	    } else if (chanPtr->inQueueHead != (ChannelBuffer*) NULL) {
	/*
	 * Prevent the accidential removal of the encoding during
	 * the destruction of the transformation channel.
	 */

	        statePtr->inQueueHead = chanPtr->inQueueHead;
	chanDownPtr->encoding            = (Tcl_Encoding) NULL;
	chanDownPtr->inputEncodingState  = (Tcl_EncodingState) NULL;
	chanDownPtr->inputEncodingFlags  = TCL_ENCODING_START;
		statePtr->inQueueTail = chanPtr->inQueueTail;
	chanDownPtr->outputEncodingState = (Tcl_EncodingState) NULL;
	chanDownPtr->outputEncodingFlags = TCL_ENCODING_START;

	    }
	/*
	 * A little trick: Add the transformation structure to the
	 * per-thread list of existing channels (which it never were
	 * part of so far), or Tcl_Close/FlushChannel will panic
	 * ("damaged channel list").
	 *

	 * Afterward do a regular close upon the transformation.
	 * This may cause flushing of data into the old channel (if the
	 * transformation remembered its own channel in itself).
	 *
	    chanPtr->inQueueHead          = (ChannelBuffer*) NULL;
	    chanPtr->inQueueTail          = (ChannelBuffer*) NULL;

	 * We know that its refCount dropped to 0.
	 */

	    DiscardInputQueued (statePtr, 0);
	}
	chanDownPtr->nextChanPtr = tsdPtr->firstChanPtr;
	tsdPtr->firstChanPtr     = chanDownPtr;

	statePtr->topChanPtr	= downChanPtr;
	Tcl_Close (interp, (Tcl_Channel)chanDownPtr);
	downChanPtr->upChanPtr	= (Channel *) NULL;

	/*
	 * Now it is possible to wind down the transformation (in 'top'),
	 * especially to copy the current encoding and translation control
	 * information down.
	 * Leave this link intact for closeproc
	 *  chanPtr->downChanPtr	= (Channel *) NULL;
	 */
	

	/*
	 * Close and free the channel driver state.
	 */
	 * Move the currently active encoding from the save area
	 * to the now uncovered channel. We assume here that this
	 * channel uses 'encoding binary' (==> encoding == NULL, etc.
	 * This allows us to simply copy the pointers without having to
	 * think about refcounts and deallocation of the old encoding.
	 *

	 * And don't forget to reenable the EOL-translation used by the
	 * transformation. Using a DString to do this *is* a bit awkward,
	 * but still the best way to handle the complexities here, like
	 * flag manipulation and event system.
	 */

	if (chanPtr->typePtr->closeProc != TCL_CLOSE2PROC) {
	chanPtr->encoding            = saveEncoding;
	chanPtr->inputEncodingState  = saveInputEncodingState;
	chanPtr->inputEncodingFlags  = saveInputEncodingFlags;
	chanPtr->outputEncodingState = saveOutputEncodingState;
	chanPtr->outputEncodingFlags = saveOutputEncodingFlags;

	Tcl_SetChannelOption (interp, (Tcl_Channel) chanPtr,
	    result = (chanPtr->typePtr->closeProc)(chanPtr->instanceData,
		    interp);
		"-translation", dsTrans.string);

	Tcl_SetChannelOption (interp, (Tcl_Channel) chanPtr,
	} else {
	    result = (chanPtr->typePtr->close2Proc)(chanPtr->instanceData,
		    interp, 0);
		"-buffering", dsBuf.string);

	}
	Tcl_DStringFree (&dsTrans);
	Tcl_DStringFree (&dsBuf);

	chanPtr->typePtr	= NULL;
	/*
	 * Event handling: If the information from the now destroyed
	 * transformation shows that there was interest in some events
	 * call the 'WatchProc' of the now uncovered channel to renew
	 * AK: Tcl_NotifyChannel may hold a reference to this block of memory
	 * that interest with underlying channels or the driver.
	 */

	Tcl_EventuallyFree((ClientData) chanPtr, TCL_DYNAMIC);
	if (interest) {
	    chanPtr->interestMask = 0;
	    (chanPtr->typePtr->watchProc) (chanPtr->instanceData,
		interest);
	UpdateInterest(downChanPtr);
	    chanPtr->interestMask = interest;
	}


	if (result != 0) {
	    Tcl_SetErrno(result);
	    return TCL_ERROR;
	}
    } else {
        /*
        /* This channel does not cover another one.
	 * This channel does not cover another one.
	 * Simply do a close, if necessary.
	 */

        if (chanPtr->refCount == 0) {
	    Tcl_Close (interp, chan);
	}
    }
        if (statePtr->refCount <= 0) {
            if (Tcl_Close(interp, chan) != TCL_OK) {
                return TCL_ERROR;
            }
	}
    }

    return TCL_OK;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_GetStackedChannel --
 *
 *	Determines wether the specified channel is stacked upon another.
 *	Determines whether the specified channel is stacked upon another.
 *
 * Results:
 *	NULL if the channel is not stacked upon another one, or a reference
 *	to the channel it is stacked upon. This reference can be used in
 *	queries, but modification is not allowed.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_Channel
Tcl_GetStackedChannel(chan)
    Tcl_Channel chan;
{
  Channel* chanPtr = (Channel*) chan;
  return (Tcl_Channel) chanPtr->supercedes;
    Channel *chanPtr = (Channel *) chan;	/* The actual channel. */

    return (Tcl_Channel) chanPtr->downChanPtr;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_GetTopChannel --
 *
 *	Returns the top channel of a channel stack.
 *
 * Results:
 *	NULL if the channel is not stacked upon another one, or a reference
 *	to the channel it is stacked upon. This reference can be used in
 *	queries, but modification is not allowed.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_Channel
Tcl_GetTopChannel(chan)
    Tcl_Channel chan;
{
    Channel *chanPtr = (Channel *) chan;	/* The actual channel. */

    return (Tcl_Channel) chanPtr->state->topChanPtr;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_GetChannelInstanceData --
 *
 *	Returns the client data associated with a channel.
 *
 * Results:
 *	The client data.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

ClientData
Tcl_GetChannelInstanceData(chan)
    Tcl_Channel chan;		/* Channel for which to return client data. */
{
    Channel *chanPtr = (Channel *) chan;	/* The actual channel. */

    return chanPtr->instanceData;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_GetChannelType --
 *
 *	Given a channel structure, returns the channel type structure.
 *
 * Results:
 *	Returns a pointer to the channel type structure.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_ChannelType *
Tcl_GetChannelType(chan)
    Tcl_Channel chan;		/* The channel to return type for. */
{
    Channel *chanPtr = (Channel *) chan;	/* The actual channel. */

    return chanPtr->typePtr;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_GetChannelMode --
 *
1886
1887
1888
1889
1890
1891
1892

1893

1894
1895
1896

1897
1898
1899
1900
1901
1902
1903
1493
1494
1495
1496
1497
1498
1499
1500

1501
1502


1503
1504
1505
1506
1507
1508
1509
1510







+
-
+

-
-
+







 */

int
Tcl_GetChannelMode(chan)
    Tcl_Channel chan;		/* The channel for which the mode is
                                 * being computed. */
{
    ChannelState *statePtr = ((Channel *) chan)->state;
    Channel *chanPtr;		/* The actual channel. */
					/* State of actual channel. */

    chanPtr = (Channel *) chan;
    return (chanPtr->flags & (TCL_READABLE | TCL_WRITABLE));
    return (statePtr->flags & (TCL_READABLE | TCL_WRITABLE));
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_GetChannelName --
 *
1914
1915
1916
1917
1918
1919
1920
1921

1922
1923
1924


1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1521
1522
1523
1524
1525
1526
1527

1528
1529


1530
1531


























1532
1533
1534
1535
1536
1537
1538







-
+

-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-







 *----------------------------------------------------------------------
 */

char *
Tcl_GetChannelName(chan)
    Tcl_Channel chan;		/* The channel for which to return the name. */
{
    Channel *chanPtr;		/* The actual channel. */
    ChannelState *statePtr;	/* State of actual channel. */

    chanPtr = (Channel *) chan;
    return chanPtr->channelName;
    statePtr = ((Channel *) chan)->state;
    return statePtr->channelName;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_GetChannelType --
 *
 *	Given a channel structure, returns the channel type structure.
 *
 * Results:
 *	Returns a pointer to the channel type structure.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_ChannelType *
Tcl_GetChannelType(chan)
    Tcl_Channel chan;		/* The channel to return type for. */
{
    Channel *chanPtr;		/* The actual channel. */

    chanPtr = (Channel *) chan;
    return chanPtr->typePtr;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_GetChannelHandle --
 *
1973
1974
1975
1976
1977
1978
1979
1980

1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
1554
1555
1556
1557
1558
1559
1560

1561
1562
1563
1564
1565
1566
1567
1568


























1569
1570
1571
1572
1573
1574
1575







-
+







-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-







    int direction;		/* TCL_WRITABLE or TCL_READABLE. */
    ClientData *handlePtr;	/* Where to store handle */
{
    Channel *chanPtr;		/* The actual channel. */
    ClientData handle;
    int result;

    chanPtr = (Channel *) chan;
    chanPtr = ((Channel *) chan)->state->bottomChanPtr;
    result = (chanPtr->typePtr->getHandleProc)(chanPtr->instanceData,
	    direction, &handle);
    if (handlePtr) {
	*handlePtr = handle;
    }
    return result;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_GetChannelInstanceData --
 *
 *	Returns the client data associated with a channel.
 *
 * Results:
 *	The client data.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

ClientData
Tcl_GetChannelInstanceData(chan)
    Tcl_Channel chan;		/* Channel for which to return client data. */
{
    Channel *chanPtr;		/* The actual channel. */

    chanPtr = (Channel *) chan;
    return chanPtr->instanceData;
}

/*
 *---------------------------------------------------------------------------
 *
 * AllocChannelBuffer --
 *
 *	A channel buffer has BUFFER_PADDING bytes extra at beginning to
2070
2071
2072
2073
2074
2075
2076
2077
2078


2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091












2092
2093
2094
2095
2096
2097
2098
2099




2100
2101
2102
2103


2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114



2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126

2127
2128
2129
2130
2131
2132
2133
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







-
-
+
+












-
+
+
+
+
+
+
+
+
+
+
+
+




-
-
-
-
+
+
+
+


-
-
+
+








-
-
-
+
+
+











-
+







 * Side effects:
 *	May free a buffer to the OS.
 *
 *----------------------------------------------------------------------
 */

static void
RecycleBuffer(chanPtr, bufPtr, mustDiscard)
    Channel *chanPtr;		/* Channel for which to recycle buffers. */
RecycleBuffer(statePtr, bufPtr, mustDiscard)
    ChannelState *statePtr;	/* ChannelState in which to recycle buffers. */
    ChannelBuffer *bufPtr;	/* The buffer to recycle. */
    int mustDiscard;		/* If nonzero, free the buffer to the
                                 * OS, always. */
{
    /*
     * Do we have to free the buffer to the OS?
     */

    if (mustDiscard) {
        ckfree((char *) bufPtr);
        return;
    }
    

    /*
     * Only save buffers which are at least as big as the requested
     * buffersize for the channel. This is to honor dynamic changes
     * of the buffersize made by the user.
     */

    if ((bufPtr->bufLength - BUFFER_PADDING) < statePtr->bufSize) {
        ckfree((char *) bufPtr);
        return;
    }

    /*
     * Only save buffers for the input queue if the channel is readable.
     */
    
    if (chanPtr->flags & TCL_READABLE) {
        if (chanPtr->inQueueHead == (ChannelBuffer *) NULL) {
            chanPtr->inQueueHead = bufPtr;
            chanPtr->inQueueTail = bufPtr;
    if (statePtr->flags & TCL_READABLE) {
        if (statePtr->inQueueHead == (ChannelBuffer *) NULL) {
            statePtr->inQueueHead = bufPtr;
            statePtr->inQueueTail = bufPtr;
            goto keepit;
        }
        if (chanPtr->saveInBufPtr == (ChannelBuffer *) NULL) {
            chanPtr->saveInBufPtr = bufPtr;
        if (statePtr->saveInBufPtr == (ChannelBuffer *) NULL) {
            statePtr->saveInBufPtr = bufPtr;
            goto keepit;
        }
    }

    /*
     * Only save buffers for the output queue if the channel is writable.
     */

    if (chanPtr->flags & TCL_WRITABLE) {
        if (chanPtr->curOutPtr == (ChannelBuffer *) NULL) {
            chanPtr->curOutPtr = bufPtr;
    if (statePtr->flags & TCL_WRITABLE) {
        if (statePtr->curOutPtr == (ChannelBuffer *) NULL) {
            statePtr->curOutPtr = bufPtr;
            goto keepit;
        }
    }

    /*
     * If we reached this code we return the buffer to the OS.
     */

    ckfree((char *) bufPtr);
    return;

keepit:
    keepit:
    bufPtr->nextRemoved = BUFFER_PADDING;
    bufPtr->nextAdded = BUFFER_PADDING;
    bufPtr->nextPtr = (ChannelBuffer *) NULL;
}

/*
 *----------------------------------------------------------------------
2142
2143
2144
2145
2146
2147
2148
2149
2150


2151
2152
2153
2154
2155
2156
2157




2158
2159
2160


2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181

2182
2183

2184
2185

2186
2187
2188
2189
2190


2191
2192
2193
2194
2195
2196
2197
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







-
-
+
+



-
-
-
-
+
+
+
+

-
-
+
+




















-
+

-
+

-
+



-
-
+
+







 * Side effects:
 *	Recycles buffers.
 *
 *----------------------------------------------------------------------
 */

static void
DiscardOutputQueued(chanPtr)
    Channel *chanPtr;		/* The channel for which to discard output. */
DiscardOutputQueued(statePtr)
    ChannelState *statePtr;	/* ChannelState for which to discard output. */
{
    ChannelBuffer *bufPtr;
    
    while (chanPtr->outQueueHead != (ChannelBuffer *) NULL) {
        bufPtr = chanPtr->outQueueHead;
        chanPtr->outQueueHead = bufPtr->nextPtr;
        RecycleBuffer(chanPtr, bufPtr, 0);
    while (statePtr->outQueueHead != (ChannelBuffer *) NULL) {
        bufPtr = statePtr->outQueueHead;
        statePtr->outQueueHead = bufPtr->nextPtr;
        RecycleBuffer(statePtr, bufPtr, 0);
    }
    chanPtr->outQueueHead = (ChannelBuffer *) NULL;
    chanPtr->outQueueTail = (ChannelBuffer *) NULL;
    statePtr->outQueueHead = (ChannelBuffer *) NULL;
    statePtr->outQueueTail = (ChannelBuffer *) NULL;
}

/*
 *----------------------------------------------------------------------
 *
 * CheckForDeadChannel --
 *
 *	This function checks is a given channel is Dead.
 *      (A channel that has been closed but not yet deallocated.)
 *
 * Results:
 *	True (1) if channel is Dead, False (0) if channel is Ok
 *
 * Side effects:
 *      None
 *
 *----------------------------------------------------------------------
 */

static int
CheckForDeadChannel(interp, chanPtr)
CheckForDeadChannel(interp, statePtr)
    Tcl_Interp *interp;		/* For error reporting (can be NULL) */
    Channel    *chanPtr;	/* The channel to check. */
    ChannelState *statePtr;	/* The channel state to check. */
{
    if (chanPtr->flags & CHANNEL_DEAD) {
    if (statePtr->flags & CHANNEL_DEAD) {
        Tcl_SetErrno(EINVAL);
	if (interp) {
	    Tcl_AppendResult(interp,
			     "unable to access channel: invalid channel",
			     (char *) NULL);   
		    "unable to access channel: invalid channel",
		    (char *) NULL);   
	}
	return 1;
    }
    return 0;
}

/*
2219
2220
2221
2222
2223
2224
2225


2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244

2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266









2267
2268

2269
2270
2271


2272
2273

2274
2275
2276
2277
2278
2279
2280
2281

2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296

2297
2298
2299
2300
2301

2302
2303
2304
2305
2306
2307
2308
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811

1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825









1826
1827
1828
1829
1830
1831
1832
1833
1834
1835

1836
1837


1838
1839
1840

1841
1842
1843
1844
1845
1846
1847
1848

1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863

1864
1865
1866
1867
1868

1869
1870
1871
1872
1873
1874
1875
1876







+
+


















-
+













-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+

-
+

-
-
+
+

-
+







-
+














-
+




-
+







FlushChannel(interp, chanPtr, calledFromAsyncFlush)
    Tcl_Interp *interp;			/* For error reporting during close. */
    Channel *chanPtr;			/* The channel to flush on. */
    int calledFromAsyncFlush;		/* If nonzero then we are being
                                         * called from an asynchronous
                                         * flush callback. */
{
    ChannelState *statePtr = chanPtr->state;
					/* State of the channel stack. */
    ChannelBuffer *bufPtr;		/* Iterates over buffered output
                                         * queue. */
    int toWrite;			/* Amount of output data in current
                                         * buffer available to be written. */
    int written;			/* Amount of output data actually
                                         * written in current round. */
    int errorCode = 0;			/* Stores POSIX error codes from
                                         * channel driver operations. */
    int wroteSome = 0;			/* Set to one if any data was
					 * written to the driver. */

    /*
     * Prevent writing on a dead channel -- a channel that has been closed
     * but not yet deallocated. This can occur if the exit handler for the
     * channel deallocation runs before all channels are deregistered in
     * all interpreters.
     */
    
    if (CheckForDeadChannel(interp,chanPtr)) return -1;
    if (CheckForDeadChannel(interp, statePtr)) return -1;
    
    /*
     * Loop over the queued buffers and attempt to flush as
     * much as possible of the queued output to the channel.
     */

    while (1) {

        /*
         * If the queue is empty and there is a ready current buffer, OR if
         * the current buffer is full, then move the current buffer to the
         * queue.
         */
        
        if (((chanPtr->curOutPtr != (ChannelBuffer *) NULL) &&
                (chanPtr->curOutPtr->nextAdded == chanPtr->curOutPtr->bufLength))
                || ((chanPtr->flags & BUFFER_READY) &&
                        (chanPtr->outQueueHead == (ChannelBuffer *) NULL))) {
            chanPtr->flags &= (~(BUFFER_READY));
            chanPtr->curOutPtr->nextPtr = (ChannelBuffer *) NULL;
            if (chanPtr->outQueueHead == (ChannelBuffer *) NULL) {
                chanPtr->outQueueHead = chanPtr->curOutPtr;

        if (((statePtr->curOutPtr != (ChannelBuffer *) NULL) &&
                (statePtr->curOutPtr->nextAdded == statePtr->curOutPtr->bufLength))
                || ((statePtr->flags & BUFFER_READY) &&
                        (statePtr->outQueueHead == (ChannelBuffer *) NULL))) {
            statePtr->flags &= (~(BUFFER_READY));
            statePtr->curOutPtr->nextPtr = (ChannelBuffer *) NULL;
            if (statePtr->outQueueHead == (ChannelBuffer *) NULL) {
                statePtr->outQueueHead = statePtr->curOutPtr;
            } else {
                chanPtr->outQueueTail->nextPtr = chanPtr->curOutPtr;
                statePtr->outQueueTail->nextPtr = statePtr->curOutPtr;
            }
            chanPtr->outQueueTail = chanPtr->curOutPtr;
            chanPtr->curOutPtr = (ChannelBuffer *) NULL;
            statePtr->outQueueTail = statePtr->curOutPtr;
            statePtr->curOutPtr = (ChannelBuffer *) NULL;
        }
        bufPtr = chanPtr->outQueueHead;
        bufPtr = statePtr->outQueueHead;

        /*
         * If we are not being called from an async flush and an async
         * flush is active, we just return without producing any output.
         */

        if ((!calledFromAsyncFlush) &&
                (chanPtr->flags & BG_FLUSH_SCHEDULED)) {
                (statePtr->flags & BG_FLUSH_SCHEDULED)) {
            return 0;
        }

        /*
         * If the output queue is still empty, break out of the while loop.
         */

        if (bufPtr == (ChannelBuffer *) NULL) {
            break;	/* Out of the "while (1)". */
        }

        /*
         * Produce the output on the channel.
         */
        

        toWrite = bufPtr->nextAdded - bufPtr->nextRemoved;
        written = (chanPtr->typePtr->outputProc) (chanPtr->instanceData,
                (char *) bufPtr->buf + bufPtr->nextRemoved, toWrite,
		&errorCode);
            

	/*
         * If the write failed completely attempt to start the asynchronous
         * flush mechanism and break out of this loop - do not attempt to
         * write any more output at this time.
         */

        if (written < 0) {
2324
2325
2326
2327
2328
2329
2330
2331
2332


2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345


2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360

2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375



2376
2377

2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388

2389
2390
2391
2392


2393
2394

2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409






2410
2411
2412
2413
2414
2415
2416
2417
2418
2419

2420
2421







2422
2423

2424
2425
2426

2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440


2441

2442
2443
2444
2445
2446

2447

2448
2449
2450
2451
2452

2453
2454
2455
2456
2457
2458
2459
2460



2461
2462
2463
2464
2465
2466
2467
2468

2469
2470
2471
2472
2473
2474
2475
2476
2477

2478
2479
2480
2481

2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500


2501
2502

2503
2504
2505


2506
2507
2508

2509
2510
2511

2512
2513
2514
2515
2516
2517

2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532




















2533
2534
2535
2536
2537
2538
2539



2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573

2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588

2589
2590
2591
2592
2593


















2594
2595

2596
2597
2598
2599
2600
2601
2602
1892
1893
1894
1895
1896
1897
1898


1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911


1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927

1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940



1941
1942
1943
1944

1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955

1956
1957
1958


1959
1960
1961

1962
1963
1964
1965
1966
1967
1968
1969
1970
1971






1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986

1987

1988
1989
1990
1991
1992
1993
1994
1995
1996

1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013


2014
2015
2016
2017
2018
2019
2020
2021
2022
2023

2024
2025
2026
2027
2028

2029
2030
2031
2032
2033
2034



2035
2036
2037
2038
2039
2040
2041
2042
2043
2044

2045
2046
2047
2048
2049
2050
2051
2052
2053

2054
2055
2056
2057

2058
2059
2060
2061
2062










2063
2064
2065


2066
2067
2068

2069



2070
2071
2072
2073

2074
2075
2076

2077
2078
2079
2080
2081
2082

2083
2084
2085
2086
2087
2088
2089









2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113



2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124


























2125











2126
2127
2128

2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162







-
-
+
+











-
-
+
+














-
+












-
-
-
+
+
+

-
+










-
+


-
-
+
+

-
+









-
-
-
-
-
-
+
+
+
+
+
+









-
+
-

+
+
+
+
+
+
+

-
+



+












-
-
+
+

+





+
-
+




-
+





-
-
-
+
+
+







-
+








-
+



-
+




-
-
-
-
-
-
-
-
-
-



-
-
+
+

-
+
-
-
-
+
+


-
+


-
+





-
+






-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+




-
-
-
+
+
+








-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-



-
+





+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+


+







            if ((errorCode == EWOULDBLOCK) || (errorCode == EAGAIN)) {
		/*
		 * This used to check for CHANNEL_NONBLOCKING, and panic
		 * if the channel was blocking.  However, it appears
		 * that setting stdin to -blocking 0 has some effect on
		 * the stdout when it's a tty channel (dup'ed underneath)
		 */
		if (!(chanPtr->flags & BG_FLUSH_SCHEDULED)) {
		    chanPtr->flags |= BG_FLUSH_SCHEDULED;
		if (!(statePtr->flags & BG_FLUSH_SCHEDULED)) {
		    statePtr->flags |= BG_FLUSH_SCHEDULED;
		    UpdateInterest(chanPtr);
		}
		errorCode = 0;
		break;
            }

            /*
             * Decide whether to report the error upwards or defer it.
             */

            if (calledFromAsyncFlush) {
                if (chanPtr->unreportedError == 0) {
                    chanPtr->unreportedError = errorCode;
                if (statePtr->unreportedError == 0) {
                    statePtr->unreportedError = errorCode;
                }
            } else {
                Tcl_SetErrno(errorCode);
		if (interp != NULL) {
		    Tcl_SetResult(interp,
			    Tcl_PosixError(interp), TCL_VOLATILE);
		}
            }

            /*
             * When we get an error we throw away all the output
             * currently queued.
             */

            DiscardOutputQueued(chanPtr);
            DiscardOutputQueued(statePtr);
            continue;
        } else {
	    wroteSome = 1;
	}

        bufPtr->nextRemoved += written;

        /*
         * If this buffer is now empty, recycle it.
         */

        if (bufPtr->nextRemoved == bufPtr->nextAdded) {
            chanPtr->outQueueHead = bufPtr->nextPtr;
            if (chanPtr->outQueueHead == (ChannelBuffer *) NULL) {
                chanPtr->outQueueTail = (ChannelBuffer *) NULL;
            statePtr->outQueueHead = bufPtr->nextPtr;
            if (statePtr->outQueueHead == (ChannelBuffer *) NULL) {
                statePtr->outQueueTail = (ChannelBuffer *) NULL;
            }
            RecycleBuffer(chanPtr, bufPtr, 0);
            RecycleBuffer(statePtr, bufPtr, 0);
        }
    }	/* Closes "while (1)". */

    /*
     * If we wrote some data while flushing in the background, we are done.
     * We can't finish the background flush until we run out of data and
     * the channel becomes writable again.  This ensures that all of the
     * pending data has been flushed at the system level.
     */

    if (chanPtr->flags & BG_FLUSH_SCHEDULED) {
    if (statePtr->flags & BG_FLUSH_SCHEDULED) {
	if (wroteSome) {
	    return errorCode;
	} else if (chanPtr->outQueueHead == (ChannelBuffer *) NULL) {
	    chanPtr->flags &= (~(BG_FLUSH_SCHEDULED));
	} else if (statePtr->outQueueHead == (ChannelBuffer *) NULL) {
	    statePtr->flags &= (~(BG_FLUSH_SCHEDULED));
	    (chanPtr->typePtr->watchProc)(chanPtr->instanceData,
		    chanPtr->interestMask);
		    statePtr->interestMask);
	}
    }

    /*
     * If the channel is flagged as closed, delete it when the refCount
     * drops to zero, the output queue is empty and there is no output
     * in the current output buffer.
     */

    if ((chanPtr->flags & CHANNEL_CLOSED) && (chanPtr->refCount <= 0) &&
            (chanPtr->outQueueHead == (ChannelBuffer *) NULL) &&
            ((chanPtr->curOutPtr == (ChannelBuffer *) NULL) ||
                    (chanPtr->curOutPtr->nextAdded ==
                            chanPtr->curOutPtr->nextRemoved))) {
        return CloseChannel(interp, chanPtr, errorCode);
    if ((statePtr->flags & CHANNEL_CLOSED) && (statePtr->refCount <= 0) &&
            (statePtr->outQueueHead == (ChannelBuffer *) NULL) &&
            ((statePtr->curOutPtr == (ChannelBuffer *) NULL) ||
                    (statePtr->curOutPtr->nextAdded ==
                            statePtr->curOutPtr->nextRemoved))) {
	return CloseChannel(interp, chanPtr, errorCode);
    }
    return errorCode;
}

/*
 *----------------------------------------------------------------------
 *
 * CloseChannel --
 *
 *	Utility procedure to close a channel and free its associated
 *	Utility procedure to close a channel and free associated resources.
 *	resources.
 *
 *	If the channel was stacked, then the it will copy the necessary
 *	elements of the NEXT channel into the TOP channel, in essence
 *	unstacking the channel.  The NEXT channel will then be freed.
 *
 *	If the channel was not stacked, then we will free all the bits
 *	for the TOP channel, including the data structure itself.
 *
 * Results:
 *	0 on success or a POSIX error code if the operation failed.
 *	1 if the channel was stacked, 0 otherwise.
 *
 * Side effects:
 *	May close the actual channel; may free memory.
 *	May change the value of errno.
 *
 *----------------------------------------------------------------------
 */

static int
CloseChannel(interp, chanPtr, errorCode)
    Tcl_Interp *interp;			/* For error reporting. */
    Channel *chanPtr;			/* The channel to close. */
    int errorCode;			/* Status of operation so far. */
{
    int result = 0;			/* Of calling driver close
                                         * operation. */
    Channel *prevChanPtr;		/* Preceding channel in list of
                                         * all channels - used to splice a
    ChannelState *prevCSPtr;		/* Preceding channel state in list of
                                         * all states - used to splice a
                                         * channel out of the list on close. */
    ChannelState *statePtr;		/* state of the channel stack. */
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);

    if (chanPtr == NULL) {
        return result;
    }
    statePtr = chanPtr->state;
    

    /*
     * No more input can be consumed so discard any leftover input.
     */

    DiscardInputQueued(chanPtr, 1);
    DiscardInputQueued(statePtr, 1);

    /*
     * Discard a leftover buffer in the current output buffer field.
     */

    if (chanPtr->curOutPtr != (ChannelBuffer *) NULL) {
        ckfree((char *) chanPtr->curOutPtr);
        chanPtr->curOutPtr = (ChannelBuffer *) NULL;
    if (statePtr->curOutPtr != (ChannelBuffer *) NULL) {
        ckfree((char *) statePtr->curOutPtr);
        statePtr->curOutPtr = (ChannelBuffer *) NULL;
    }
    
    /*
     * The caller guarantees that there are no more buffers
     * queued for output.
     */

    if (chanPtr->outQueueHead != (ChannelBuffer *) NULL) {
    if (statePtr->outQueueHead != (ChannelBuffer *) NULL) {
        panic("TclFlush, closed channel: queued output left");
    }

    /*
     * If the EOF character is set in the channel, append that to the
     * output device.
     */

    if ((chanPtr->outEofChar != 0) && (chanPtr->flags & TCL_WRITABLE)) {
    if ((statePtr->outEofChar != 0) && (statePtr->flags & TCL_WRITABLE)) {
        int dummy;
        char c;

        c = (char) chanPtr->outEofChar;
        c = (char) statePtr->outEofChar;
        (chanPtr->typePtr->outputProc) (chanPtr->instanceData, &c, 1, &dummy);
    }

    /*
     * Remove TCL_READABLE and TCL_WRITABLE from chanPtr->flags, so
     * that close callbacks can not do input or output (assuming they
     * squirreled the channel away in their clientData). This also
     * prevents infinite loops if the callback calls any C API that
     * could call FlushChannel.
     */

    chanPtr->flags &= (~(TCL_READABLE|TCL_WRITABLE));
        
    /*
     * Splice this channel out of the list of all channels.
     */

    if (chanPtr == tsdPtr->firstChanPtr) {
        tsdPtr->firstChanPtr = chanPtr->nextChanPtr;
    if (tsdPtr->firstCSPtr && (statePtr == tsdPtr->firstCSPtr)) {
        tsdPtr->firstCSPtr = statePtr->nextCSPtr;
    } else {
        for (prevChanPtr = tsdPtr->firstChanPtr;
        for (prevCSPtr = tsdPtr->firstCSPtr;
                 (prevChanPtr != (Channel *) NULL) &&
                     (prevChanPtr->nextChanPtr != chanPtr);
                 prevChanPtr = prevChanPtr->nextChanPtr) {
	     prevCSPtr && (prevCSPtr->nextCSPtr != statePtr);
	     prevCSPtr = prevCSPtr->nextCSPtr) {
            /* Empty loop body. */
        }
        if (prevChanPtr == (Channel *) NULL) {
        if (prevCSPtr == (ChannelState *) NULL) {
            panic("FlushChannel: damaged channel list");
        }
        prevChanPtr->nextChanPtr = chanPtr->nextChanPtr;
        prevCSPtr->nextCSPtr = statePtr->nextCSPtr;
    }

    /*
     * Close and free the channel driver state.
     */
            

    if (chanPtr->typePtr->closeProc != TCL_CLOSE2PROC) {
	result = (chanPtr->typePtr->closeProc)(chanPtr->instanceData, interp);
    } else {
	result = (chanPtr->typePtr->close2Proc)(chanPtr->instanceData, interp,
		0);
    }
    
    if (chanPtr->channelName != (char *) NULL) {
        ckfree(chanPtr->channelName);
    }
    Tcl_FreeEncoding(chanPtr->encoding);
    if (chanPtr->outputStage != NULL) {
	ckfree((char *) chanPtr->outputStage);
    }
    

    /*
     * Some resources can be cleared only if the bottom channel
     * in a stack is closed. All the other channels in the stack
     * are not allowed to remove.
     */

    if (chanPtr == statePtr->bottomChanPtr) {
	if (statePtr->channelName != (char *) NULL) {
	    ckfree(statePtr->channelName);
	    statePtr->channelName = NULL;
	}

	Tcl_FreeEncoding(statePtr->encoding);
	if (statePtr->outputStage != NULL) {
	    ckfree((char *) statePtr->outputStage);
	    statePtr->outputStage = (char *) NULL;
	}
    }

    /*
     * If we are being called synchronously, report either
     * any latent error on the channel or the current error.
     */
        
    if (chanPtr->unreportedError != 0) {
        errorCode = chanPtr->unreportedError;

    if (statePtr->unreportedError != 0) {
        errorCode = statePtr->unreportedError;
    }
    if (errorCode == 0) {
        errorCode = result;
        if (errorCode != 0) {
            Tcl_SetErrno(errorCode);
        }
    }

    /* Andreas Kupries <a.kupries@westend.com>, 12/13/1998
     * "Trf-Patch for filtering channels"
     *
     * This is the change to 'CloseChannel'.
     *
     * Explanation
     *		Closing a filtering channel closes the one it
     *		superceded too. This basically ripples through
     *		the whole chain of filters until it reaches
     *		the underlying normal channel.
     *
     *		This is done by reintegrating the superceded
     *		channel into the (thread) global list of open
     *		channels and then invoking a regular close.
     *		There is no need to handle the complexities of
     *		this process by ourselves.
     *
     *		*Note*
     *		This has to be done after the call to the
     *		'closeProc' of the filtering channel to allow
     *		that one to flush internal buffers into
     *		the underlying channel.
     */

    if (chanPtr->supercedes != (Channel*) NULL) {
	/*
    /*
	 * Insert the channel we were stacked upon back into
	 * the list of open channels, then do a regular close.
	 */

	chanPtr->supercedes->nextChanPtr = tsdPtr->firstChanPtr;
	tsdPtr->firstChanPtr             = chanPtr->supercedes;
	chanPtr->supercedes->refCount --; /* is deregistered */
	Tcl_Close (interp, (Tcl_Channel) chanPtr->supercedes);
    }

    /*
     * Cancel any outstanding timer.
     */

    Tcl_DeleteTimerHandler(chanPtr->timer);
    Tcl_DeleteTimerHandler(statePtr->timer);

    /*
     * Mark the channel as deleted by clearing the type structure.
     */

    if (chanPtr->downChanPtr != (Channel *) NULL) {
	Channel *downChanPtr = chanPtr->downChanPtr;

	statePtr->nextCSPtr	= tsdPtr->firstCSPtr;
	tsdPtr->firstCSPtr	= statePtr;

	statePtr->topChanPtr	= downChanPtr;
	downChanPtr->upChanPtr	= (Channel *) NULL;
	chanPtr->typePtr	= NULL;

	Tcl_EventuallyFree((ClientData) chanPtr, TCL_DYNAMIC);
	return Tcl_Close(interp, (Tcl_Channel) downChanPtr);
    }

    /*
     * There is only the TOP Channel, so we free the remaining
     * pointers we have and then ourselves.
     */
    chanPtr->typePtr = NULL;

    Tcl_EventuallyFree((ClientData) statePtr, TCL_DYNAMIC);
    Tcl_EventuallyFree((ClientData) chanPtr, TCL_DYNAMIC);

    return errorCode;
}

/*
 *----------------------------------------------------------------------
2629
2630
2631
2632
2633
2634
2635

2636
2637
2638
2639
2640
2641
2642
2643

2644
2645
2646
2647
2648
2649
2650
2651
2652
2653




2654
2655





2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666


2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680




2681
2682
2683
2684
2685


2686
2687
2688
2689
2690
2691

2692
2693
2694
2695
2696
2697
2698
2699
2700

2701
2702
2703
2704
2705
2706
2707
2708



2709
2710
2711
2712
2713

2714
2715
2716
2717
2718
2719
2720
2721



2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732



2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753

2754
2755
2756
2757
2758
2759
2760
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203

2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218


2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232


2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244




2245
2246
2247
2248
2249
2250
2251


2252
2253

2254
2255
2256
2257

2258
2259
2260
2261
2262
2263
2264
2265
2266

2267
2268
2269
2270
2271
2272



2273
2274
2275
2276
2277
2278
2279

2280
2281
2282
2283
2284
2285



2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296



2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319

2320
2321
2322
2323
2324
2325
2326
2327







+







-
+










+
+
+
+
-
-
+
+
+
+
+









-
-
+
+










-
-
-
-
+
+
+
+



-
-
+
+
-




-
+








-
+





-
-
-
+
+
+




-
+





-
-
-
+
+
+








-
-
-
+
+
+




















-
+







                                         * interpreter. */
{
    ChannelHandler *chPtr, *chNext;	/* Iterate over channel handlers. */
    CloseCallback *cbPtr;		/* Iterate over close callbacks
                                         * for this channel. */
    EventScriptRecord *ePtr, *eNextPtr;	/* Iterate over eventscript records. */
    Channel *chanPtr;			/* The real IO channel. */
    ChannelState *statePtr;		/* State of real IO channel. */
    int result;				/* Of calling FlushChannel. */
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
    NextChannelHandler *nhPtr;

    if (chan == (Tcl_Channel) NULL) {
        return TCL_OK;
    }
    

    /*
     * Perform special handling for standard channels being closed. If the
     * refCount is now 1 it means that the last reference to the standard
     * channel is being explicitly closed, so bump the refCount down
     * artificially to 0. This will ensure that the channel is actually
     * closed, below. Also set the static pointer to NULL for the channel.
     */

    CheckForStdChannelsBeingClosed(chan);

    /*
     * This operation should occur at the top of a channel stack.
     */

    chanPtr = (Channel *) chan;
    if (chanPtr->refCount > 0) {
    chanPtr	= (Channel *) chan;
    statePtr	= chanPtr->state;
    chanPtr	= statePtr->topChanPtr;

    if (statePtr->refCount > 0) {
        panic("called Tcl_Close on channel with refCount > 0");
    }

    /*
     * Remove any references to channel handlers for this channel that
     * may be about to be invoked.
     */

    for (nhPtr = tsdPtr->nestedHandlerPtr;
             nhPtr != (NextChannelHandler *) NULL;
             nhPtr = nhPtr->nestedHandlerPtr) {
	 nhPtr != (NextChannelHandler *) NULL;
	 nhPtr = nhPtr->nestedHandlerPtr) {
        if (nhPtr->nextHandlerPtr &&
		(nhPtr->nextHandlerPtr->chanPtr == chanPtr)) {
	    nhPtr->nextHandlerPtr = NULL;
        }
    }

    /*
     * Remove all the channel handler records attached to the channel
     * itself.
     */
        
    for (chPtr = chanPtr->chPtr;
             chPtr != (ChannelHandler *) NULL;
             chPtr = chNext) {

    for (chPtr = statePtr->chPtr;
	 chPtr != (ChannelHandler *) NULL;
	 chPtr = chNext) {
        chNext = chPtr->nextPtr;
        ckfree((char *) chPtr);
    }
    chanPtr->chPtr = (ChannelHandler *) NULL;
    
    statePtr->chPtr = (ChannelHandler *) NULL;

    
    /*
     * Cancel any pending copy operation.
     */

    StopCopy(chanPtr->csPtr);
    StopCopy(statePtr->csPtr);

    /*
     * Must set the interest mask now to 0, otherwise infinite loops
     * will occur if Tcl_DoOneEvent is called before the channel is
     * finally deleted in FlushChannel. This can happen if the channel
     * has a background flush active.
     */
        
    chanPtr->interestMask = 0;
    statePtr->interestMask = 0;
    
    /*
     * Remove any EventScript records for this channel.
     */

    for (ePtr = chanPtr->scriptRecordPtr;
             ePtr != (EventScriptRecord *) NULL;
             ePtr = eNextPtr) {
    for (ePtr = statePtr->scriptRecordPtr;
	 ePtr != (EventScriptRecord *) NULL;
	 ePtr = eNextPtr) {
        eNextPtr = ePtr->nextPtr;
	Tcl_DecrRefCount(ePtr->scriptPtr);
        ckfree((char *) ePtr);
    }
    chanPtr->scriptRecordPtr = (EventScriptRecord *) NULL;
    statePtr->scriptRecordPtr = (EventScriptRecord *) NULL;
        
    /*
     * Invoke the registered close callbacks and delete their records.
     */

    while (chanPtr->closeCbPtr != (CloseCallback *) NULL) {
        cbPtr = chanPtr->closeCbPtr;
        chanPtr->closeCbPtr = cbPtr->nextPtr;
    while (statePtr->closeCbPtr != (CloseCallback *) NULL) {
        cbPtr = statePtr->closeCbPtr;
        statePtr->closeCbPtr = cbPtr->nextPtr;
        (cbPtr->proc) (cbPtr->clientData);
        ckfree((char *) cbPtr);
    }

    /*
     * Ensure that the last output buffer will be flushed.
     */
    
    if ((chanPtr->curOutPtr != (ChannelBuffer *) NULL) &&
           (chanPtr->curOutPtr->nextAdded > chanPtr->curOutPtr->nextRemoved)) {
        chanPtr->flags |= BUFFER_READY;
    if ((statePtr->curOutPtr != (ChannelBuffer *) NULL) &&
	    (statePtr->curOutPtr->nextAdded > statePtr->curOutPtr->nextRemoved)) {
        statePtr->flags |= BUFFER_READY;
    }

    /*
     * If this channel supports it, close the read side, since we don't need it
     * anymore and this will help avoid deadlocks on some channel types.
     */

    if (chanPtr->typePtr->closeProc == TCL_CLOSE2PROC) {
	result = (chanPtr->typePtr->close2Proc)(chanPtr->instanceData, interp,
		TCL_CLOSE_READ);
    } else {
	result = 0;
    }

    /*
     * The call to FlushChannel will flush any queued output and invoke
     * the close function of the channel driver, or it will set up the
     * channel to be flushed and closed asynchronously.
     */

    chanPtr->flags |= CHANNEL_CLOSED;
    statePtr->flags |= CHANNEL_CLOSED;
    if ((FlushChannel(interp, chanPtr, 0) != 0) || (result != 0)) {
        return TCL_ERROR;
    }
    return TCL_OK;
}

/*
2781
2782
2783
2784
2785
2786
2787



2788

2789
2790
2791




2792
2793

2794
2795
2796
2797
2798























































2799
2800
2801
2802
2803
2804
2805
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360


2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434







+
+
+

+

-
-
+
+
+
+


+





+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







int
Tcl_Write(chan, src, srcLen)
    Tcl_Channel chan;			/* The channel to buffer output for. */
    char *src;				/* Data to queue in output buffer. */
    int srcLen;				/* Length of data in bytes, or < 0 for
					 * strlen(). */
{
    /*
     * Always use the topmost channel of the stack
     */
    Channel *chanPtr;
    ChannelState *statePtr;	/* state info for channel */

    chanPtr = (Channel *) chan;
    if (CheckChannelErrors(chanPtr, TCL_WRITABLE) != 0) {
    statePtr = ((Channel *) chan)->state;
    chanPtr  = statePtr->topChanPtr;

    if (CheckChannelErrors(statePtr, TCL_WRITABLE) != 0) {
	return -1;
    }

    if (srcLen < 0) {
        srcLen = strlen(src);
    }
    return DoWrite(chanPtr, src, srcLen);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_WriteRaw --
 *
 *	Puts a sequence of bytes into an output buffer, may queue the
 *	buffer for output if it gets full, and also remembers whether the
 *	current buffer is ready e.g. if it contains a newline and we are in
 *	line buffering mode.
 *
 * Results:
 *	The number of bytes written or -1 in case of error. If -1,
 *	Tcl_GetErrno will return the error code.
 *
 * Side effects:
 *	May buffer up output and may cause output to be produced on the
 *	channel.
 *
 *----------------------------------------------------------------------
 */

int
Tcl_WriteRaw(chan, src, srcLen)
    Tcl_Channel chan;			/* The channel to buffer output for. */
    char *src;				/* Data to queue in output buffer. */
    int srcLen;				/* Length of data in bytes, or < 0 for
					 * strlen(). */
{
    Channel *chanPtr = ((Channel *) chan);
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    int errorCode, written;

    if (CheckChannelErrors(statePtr, TCL_WRITABLE | CHANNEL_RAW_MODE) != 0) {
	return -1;
    }

    if (srcLen < 0) {
        srcLen = strlen(src);
    }

    /*
     * Go immediately to the driver, do all the error handling by ourselves.
     * The code was stolen from 'FlushChannel'.
     */

    written = (chanPtr->typePtr->outputProc) (chanPtr->instanceData,
	    src, srcLen, &errorCode);

    if (written < 0) {
	Tcl_SetErrno(errorCode);
    }

    return written;
}

/*
 *---------------------------------------------------------------------------
 *
 * Tcl_WriteChars --
 *
 *	Takes a sequence of UTF-8 characters and converts them for output
2822
2823
2824
2825
2826
2827
2828



2829

2830
2831
2832




2833
2834
2835
2836
2837
2838

2839
2840
2841
2842
2843
2844
2845
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463


2464
2465
2466
2467
2468
2469
2470
2471
2472

2473
2474
2475
2476
2477
2478
2479
2480







+
+
+

+

-
-
+
+
+
+





-
+







int
Tcl_WriteChars(chan, src, len)
    Tcl_Channel chan;		/* The channel to buffer output for. */
    CONST char *src;		/* UTF-8 characters to queue in output buffer. */
    int len;			/* Length of string in bytes, or < 0 for 
				 * strlen(). */
{
    /*
     * Always use the topmost channel of the stack
     */
    Channel *chanPtr;
    ChannelState *statePtr;	/* state info for channel */

    chanPtr = (Channel *) chan;
    if (CheckChannelErrors(chanPtr, TCL_WRITABLE) != 0) {
    statePtr = ((Channel *) chan)->state;
    chanPtr  = statePtr->topChanPtr;

    if (CheckChannelErrors(statePtr, TCL_WRITABLE) != 0) {
	return -1;
    }
    if (len < 0) {
        len = strlen(src);
    }
    if (chanPtr->encoding == NULL) {
    if (statePtr->encoding == NULL) {
	/*
	 * Inefficient way to convert UTF-8 to byte-array, but the  
	 * code parallels the way it is done for objects.
	 */

	Tcl_Obj *objPtr;
	int result;
2879
2880
2881
2882
2883
2884
2885



2886

2887
2888
2889
2890
2891




2892
2893
2894

2895
2896
2897
2898
2899
2900
2901
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528


2529
2530
2531
2532
2533
2534

2535
2536
2537
2538
2539
2540
2541
2542







+
+
+

+



-
-
+
+
+
+


-
+







 */

int
Tcl_WriteObj(chan, objPtr)
    Tcl_Channel chan;		/* The channel to buffer output for. */
    Tcl_Obj *objPtr;		/* The object to write. */
{
    /*
     * Always use the topmost channel of the stack
     */
    Channel *chanPtr;
    ChannelState *statePtr;	/* state info for channel */
    char *src;
    int srcLen;

    chanPtr = (Channel *) chan;
    if (CheckChannelErrors(chanPtr, TCL_WRITABLE) != 0) {
    statePtr = ((Channel *) chan)->state;
    chanPtr  = statePtr->topChanPtr;

    if (CheckChannelErrors(statePtr, TCL_WRITABLE) != 0) {
	return -1;
    }
    if (chanPtr->encoding == NULL) {
    if (statePtr->encoding == NULL) {
	src = (char *) Tcl_GetByteArrayFromObj(objPtr, &srcLen);
	return WriteBytes(chanPtr, src, srcLen);
    } else {
	src = Tcl_GetStringFromObj(objPtr, &srcLen);
	return WriteChars(chanPtr, src, srcLen);
    }
}
2923
2924
2925
2926
2927
2928
2929

2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944

2945
2946
2947


2948
2949
2950
2951
2952
2953
2954
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585

2586
2587


2588
2589
2590
2591
2592
2593
2594
2595
2596







+














-
+

-
-
+
+








static int
WriteBytes(chanPtr, src, srcLen)
    Channel *chanPtr;		/* The channel to buffer output for. */
    CONST char *src;		/* Bytes to write. */
    int srcLen;			/* Number of bytes to write. */
{
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    ChannelBuffer *bufPtr;
    char *dst;
    int dstLen, dstMax, sawLF, savedLF, total, toWrite;
    
    total = 0;
    sawLF = 0;
    savedLF = 0;

    /*
     * Loop over all bytes in src, storing them in output buffer with
     * proper EOL translation.
     */

    while (srcLen + savedLF > 0) {
	bufPtr = chanPtr->curOutPtr;
	bufPtr = statePtr->curOutPtr;
	if (bufPtr == NULL) {
	    bufPtr = AllocChannelBuffer(chanPtr->bufSize);
	    chanPtr->curOutPtr	= bufPtr;
	    bufPtr = AllocChannelBuffer(statePtr->bufSize);
	    statePtr->curOutPtr	= bufPtr;
	}
	dst = bufPtr->buf + bufPtr->nextAdded;
	dstMax = bufPtr->bufLength - bufPtr->nextAdded;
	dstLen = dstMax;

	toWrite = dstLen;
	if (toWrite > srcLen) {
2962
2963
2964
2965
2966
2967
2968
2969

2970
2971
2972
2973
2974
2975
2976
2604
2605
2606
2607
2608
2609
2610

2611
2612
2613
2614
2615
2616
2617
2618







-
+







	     * line-based, we will need to flush it.
	     */

	    *dst++ = '\n';
	    dstLen--;
	    sawLF++;
	}
	sawLF += TranslateOutputEOL(chanPtr, dst, src, &dstLen, &toWrite);
	sawLF += TranslateOutputEOL(statePtr, dst, src, &dstLen, &toWrite);
	dstLen += savedLF;
	savedLF = 0;

	if (dstLen > dstMax) {
	    savedLF = 1;
	    dstLen = dstMax;
	}
3010
3011
3012
3013
3014
3015
3016

3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028

3029
3030
3031
3032
3033
3034
3035
3036
3037


3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057

3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070

3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081

3082
3083
3084


3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104

3105


















3106
3107
3108
3109
3110
3111
3112
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670

2671
2672
2673
2674
2675
2676
2677
2678


2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699

2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712

2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723

2724
2725


2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746

2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773







+











-
+







-
-
+
+



















-
+












-
+










-
+

-
-
+
+



















-
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+








static int
WriteChars(chanPtr, src, srcLen)
    Channel *chanPtr;		/* The channel to buffer output for. */
    CONST char *src;		/* UTF-8 string to write. */
    int srcLen;			/* Length of UTF-8 string in bytes. */
{
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    ChannelBuffer *bufPtr;
    char *dst, *stage;
    int saved, savedLF, sawLF, total, toWrite, flags;
    int dstWrote, dstLen, stageLen, stageMax, stageRead;
    Tcl_Encoding encoding;
    char safe[BUFFER_PADDING];
    
    total = 0;
    sawLF = 0;
    savedLF = 0;
    saved = 0;
    encoding = chanPtr->encoding;
    encoding = statePtr->encoding;

    /*
     * Loop over all UTF-8 characters in src, storing them in staging buffer
     * with proper EOL translation.
     */

    while (srcLen + savedLF > 0) {
	stage = chanPtr->outputStage;
	stageMax = chanPtr->bufSize;
	stage = statePtr->outputStage;
	stageMax = statePtr->bufSize;
	stageLen = stageMax;

	toWrite = stageLen;
	if (toWrite > srcLen) {
	    toWrite = srcLen;
	}

	if (savedLF) {
	    /*
	     * A '\n' was left over from last call to TranslateOutputEOL()
	     * and we need to store it in the staging buffer.  If the
	     * channel is line-based, we will need to flush the output
	     * buffer (after translating the staging buffer).
	     */
	    
	    *stage++ = '\n';
	    stageLen--;
	    sawLF++;
	}
	sawLF += TranslateOutputEOL(chanPtr, stage, src, &stageLen, &toWrite);
	sawLF += TranslateOutputEOL(statePtr, stage, src, &stageLen, &toWrite);

	stage -= savedLF;
	stageLen += savedLF;
	savedLF = 0;

	if (stageLen > stageMax) {
	    savedLF = 1;
	    stageLen = stageMax;
	}
	src += toWrite;
	srcLen -= toWrite;

	flags = chanPtr->outputEncodingFlags;
	flags = statePtr->outputEncodingFlags;
	if (srcLen == 0) {
	    flags |= TCL_ENCODING_END;
	}

	/*
	 * Loop over all UTF-8 characters in staging buffer, converting them
	 * to external encoding, storing them in output buffer.
	 */

	while (stageLen + saved > 0) {
	    bufPtr = chanPtr->curOutPtr;
	    bufPtr = statePtr->curOutPtr;
	    if (bufPtr == NULL) {
		bufPtr = AllocChannelBuffer(chanPtr->bufSize);
		chanPtr->curOutPtr = bufPtr;
		bufPtr = AllocChannelBuffer(statePtr->bufSize);
		statePtr->curOutPtr = bufPtr;
	    }
	    dst = bufPtr->buf + bufPtr->nextAdded;
	    dstLen = bufPtr->bufLength - bufPtr->nextAdded;

	    if (saved != 0) {
		/*
		 * Here's some translated bytes left over from the last
		 * buffer that we need to stick at the beginning of this
		 * buffer.
		 */
		 
		memcpy((VOID *) dst, (VOID *) safe, (size_t) saved);
		bufPtr->nextAdded += saved;
		dst += saved;
		dstLen -= saved;
		saved = 0;
	    }

	    Tcl_UtfToExternal(NULL, encoding, stage, stageLen, flags,
		    &chanPtr->outputEncodingState, dst,
		    &statePtr->outputEncodingState, dst,
		    dstLen + BUFFER_PADDING, &stageRead, &dstWrote, NULL);

	    /* Fix for SF #506297, reported by Martin Forssen <ruric@users.sourceforge.net>.
	     *
	     * The encoding chosen in the script exposing the bug
	     * writes out three intro characters when
	     * TCL_ENCODING_START is set, but does not consume any
	     * input as TCL_ENCODING_END is cleared. As some output
	     * was generated the enclosing loop calls UtfToExternal
	     * again, again with START set. Three more characters in
	     * the out and still no use of input ... To break this
	     * infinite loop we remove TCL_ENCODING_START from the set
	     * of flags after the first call (no condition is
	     * required, the later calls remove an unset flag, which
	     * is a no-op). This causes the subsequent calls to
	     * UtfToExternal to consume and convert the actual input.
	     */

	    flags &= ~TCL_ENCODING_START;
	    if (stageRead + dstWrote == 0) {
		/*
		 * We have an incomplete UTF-8 character at the end of the
		 * staging buffer.  It will get moved to the beginning of the
		 * staging buffer followed by more bytes from src.
		 */

3181
3182
3183
3184
3185
3186
3187
3188
3189


3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208

3209
3210
3211
3212
3213
3214
3215
2842
2843
2844
2845
2846
2847
2848


2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868

2869
2870
2871
2872
2873
2874
2875
2876







-
-
+
+


















-
+







 *	buffer), the number of bytes consumed from the source buffer
 *	will be less than the number of bytes stored in the output buffer.
 *
 *---------------------------------------------------------------------------
 */

static int
TranslateOutputEOL(chanPtr, dst, src, dstLenPtr, srcLenPtr)
    Channel *chanPtr;		/* Channel being read, for translation and
TranslateOutputEOL(statePtr, dst, src, dstLenPtr, srcLenPtr)
    ChannelState *statePtr;	/* Channel being read, for translation and
				 * buffering modes. */
    char *dst;			/* Output buffer filled with UTF-8 chars by
				 * applying appropriate EOL translation to
				 * source characters. */
    CONST char *src;		/* Source UTF-8 characters. */
    int *dstLenPtr;		/* On entry, the maximum length of output
				 * buffer in bytes.  On exit, the number of
				 * bytes actually used in output buffer. */
    int *srcLenPtr;		/* On entry, the length of source buffer.
				 * On exit, the number of bytes read from
				 * the source buffer. */
{
    char *dstEnd;
    int srcLen, newlineFound;
    
    newlineFound = 0;
    srcLen = *srcLenPtr;

    switch (chanPtr->outputTranslation) {
    switch (statePtr->outputTranslation) {
	case TCL_TRANSLATE_LF: {
	    for (dstEnd = dst + srcLen; dst < dstEnd; ) {
		if (*src == '\n') {
		    newlineFound = 1;
		}
		*dst++ = *src++;
	    }
3293
3294
3295
3296
3297
3298
3299

3300
3301
3302
3303
3304
3305
3306
3307

3308
3309
3310


3311
3312

3313
3314
3315


3316
3317
3318

3319
3320
3321
3322
3323
3324
3325
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968

2969
2970


2971
2972
2973

2974
2975


2976
2977
2978
2979

2980
2981
2982
2983
2984
2985
2986
2987







+







-
+

-
-
+
+

-
+

-
-
+
+


-
+







static int
CheckFlush(chanPtr, bufPtr, newlineFlag)
    Channel *chanPtr;		/* Channel being read, for buffering mode. */
    ChannelBuffer *bufPtr;	/* Channel buffer to possibly flush. */
    int newlineFlag;		/* Non-zero if a the channel buffer
				 * contains a newline. */
{
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    /*
     * The current buffer is ready for output:
     * 1. if it is full.
     * 2. if it contains a newline and this channel is line-buffered.
     * 3. if it contains any output and this channel is unbuffered.
     */

    if ((chanPtr->flags & BUFFER_READY) == 0) {
    if ((statePtr->flags & BUFFER_READY) == 0) {
	if (bufPtr->nextAdded == bufPtr->bufLength) {
	    chanPtr->flags |= BUFFER_READY;
	} else if (chanPtr->flags & CHANNEL_LINEBUFFERED) {
	    statePtr->flags |= BUFFER_READY;
	} else if (statePtr->flags & CHANNEL_LINEBUFFERED) {
	    if (newlineFlag != 0) {
		chanPtr->flags |= BUFFER_READY;
		statePtr->flags |= BUFFER_READY;
	    }
	} else if (chanPtr->flags & CHANNEL_UNBUFFERED) {
	    chanPtr->flags |= BUFFER_READY;
	} else if (statePtr->flags & CHANNEL_UNBUFFERED) {
	    statePtr->flags |= BUFFER_READY;
	}
    }
    if (chanPtr->flags & BUFFER_READY) {
    if (statePtr->flags & BUFFER_READY) {
	if (FlushChannel(NULL, chanPtr, 0) != 0) {
	    return -1;
	}
    }
    return 0;
}

3392
3393
3394
3395
3396
3397
3398
3399
3400


3401

3402
3403
3404
3405
3406




3407
3408



3409
3410
3411
3412
3413
3414


3415
3416
3417
3418
3419
3420
3421
3422
3423


3424
3425
3426
3427
3428
3429
3430
3054
3055
3056
3057
3058
3059
3060


3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073


3074
3075
3076
3077
3078
3079
3080


3081
3082
3083
3084
3085
3086
3087
3088
3089


3090
3091
3092
3093
3094
3095
3096
3097
3098







-
-
+
+

+





+
+
+
+
-
-
+
+
+




-
-
+
+







-
-
+
+







int
Tcl_GetsObj(chan, objPtr)
    Tcl_Channel chan;		/* Channel from which to read. */
    Tcl_Obj *objPtr;		/* The line read will be appended to this
				 * object as UTF-8 characters. */
{
    GetsState gs;
    Channel *chanPtr;
    int inEofChar, skip, copiedTotal;
    Channel *chanPtr = (Channel *) chan;
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    ChannelBuffer *bufPtr;
    int inEofChar, skip, copiedTotal;
    Tcl_Encoding encoding;
    char *dst, *dstEnd, *eol, *eof;
    Tcl_EncodingState oldState;
    int oldLength, oldFlags, oldRemoved;

    /*
     * This operation should occur at the top of a channel stack.
     */

    chanPtr = (Channel *) chan;
    if (CheckChannelErrors(chanPtr, TCL_READABLE) != 0) {
    chanPtr = statePtr->topChanPtr;

    if (CheckChannelErrors(statePtr, TCL_READABLE) != 0) {
	copiedTotal = -1;
	goto done;
    }

    bufPtr = chanPtr->inQueueHead;
    encoding = chanPtr->encoding;
    bufPtr = statePtr->inQueueHead;
    encoding = statePtr->encoding;

    /*
     * Preserved so we can restore the channel's state in case we don't
     * find a newline in the available input.
     */

    Tcl_GetStringFromObj(objPtr, &oldLength);
    oldFlags = chanPtr->inputEncodingFlags;
    oldState = chanPtr->inputEncodingState;
    oldFlags = statePtr->inputEncodingFlags;
    oldState = statePtr->inputEncodingState;
    oldRemoved = BUFFER_PADDING;
    if (bufPtr != NULL) {
	oldRemoved = bufPtr->nextRemoved;
    }

    /*
     * If there is no encoding, use "iso8859-1" -- Tcl_GetsObj() doesn't
3452
3453
3454
3455
3456
3457
3458
3459

3460
3461
3462
3463
3464
3465
3466
3120
3121
3122
3123
3124
3125
3126

3127
3128
3129
3130
3131
3132
3133
3134







-
+







    gs.totalChars	= 0;

    dst = objPtr->bytes + oldLength;
    dstEnd = dst;

    skip = 0;
    eof = NULL;
    inEofChar = chanPtr->inEofChar;
    inEofChar = statePtr->inEofChar;

    while (1) {
	if (dst >= dstEnd) {
	    if (FilterInputBytes(chanPtr, &gs) != 0) {
		goto restore;
	    }
	    dstEnd = dst + gs.bytesWrote;
3483
3484
3485
3486
3487
3488
3489
3490

3491
3492
3493
3494
3495
3496
3497
3151
3152
3153
3154
3155
3156
3157

3158
3159
3160
3161
3162
3163
3164
3165







-
+








	/*
	 * On EOL, leave current file position pointing after the EOL, but
	 * don't store the EOL in the output string.
	 */

	eol = dst;
	switch (chanPtr->inputTranslation) {
	switch (statePtr->inputTranslation) {
	    case TCL_TRANSLATE_LF: {
		for (eol = dst; eol < dstEnd; eol++) {
		    if (*eol == '\n') {
			skip = 1;
			goto goteol;
		    }
		}
3532
3533
3534
3535
3536
3537
3538
3539
3540


3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552

3553
3554
3555
3556
3557
3558
3559
3200
3201
3202
3203
3204
3205
3206


3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219

3220
3221
3222
3223
3224
3225
3226
3227







-
-
+
+











-
+







			}
		    }
		}
		break;
	    }
	    case TCL_TRANSLATE_AUTO: {
		skip = 1;
		if (chanPtr->flags & INPUT_SAW_CR) {
		    chanPtr->flags &= ~INPUT_SAW_CR;
		if (statePtr->flags & INPUT_SAW_CR) {
		    statePtr->flags &= ~INPUT_SAW_CR;
		    if (*eol == '\n') {
			/*
			 * Skip the raw bytes that make up the '\n'.
			 */

			char tmp[1 + TCL_UTF_MAX];
			int rawRead;

			bufPtr = gs.bufPtr;
			Tcl_ExternalToUtf(NULL, gs.encoding,
				bufPtr->buf + bufPtr->nextRemoved,
				gs.rawRead, chanPtr->inputEncodingFlags,
				gs.rawRead, statePtr->inputEncodingFlags,
				&gs.state, tmp, 1 + TCL_UTF_MAX, &rawRead,
				NULL, NULL);
			bufPtr->nextRemoved += rawRead;
			gs.rawRead -= rawRead;
			gs.bytesWrote--;
			gs.charsWrote--;
			memmove(dst, dst + 1, (size_t) (dstEnd - dst));
3573
3574
3575
3576
3577
3578
3579
3580

3581
3582
3583
3584
3585
3586
3587
3241
3242
3243
3244
3245
3246
3247

3248
3249
3250
3251
3252
3253
3254
3255







-
+







			    
			    offset = eol - objPtr->bytes;
			    dst = dstEnd;
			    PeekAhead(chanPtr, &dstEnd, &gs);
			    eol = objPtr->bytes + offset;
			    if (eol >= dstEnd) {
				eol--;
				chanPtr->flags |= INPUT_SAW_CR;
				statePtr->flags |= INPUT_SAW_CR;
				goto goteol;
			    }
			}
			if (*eol == '\n') {
			    skip++;
			}
			eol--;
3596
3597
3598
3599
3600
3601
3602
3603
3604


3605
3606

3607
3608
3609
3610
3611
3612
3613
3264
3265
3266
3267
3268
3269
3270


3271
3272
3273

3274
3275
3276
3277
3278
3279
3280
3281







-
-
+
+

-
+







	    /*
	     * EOF character was seen.  On EOF, leave current file position
	     * pointing at the EOF character, but don't store the EOF
	     * character in the output string.
	     */

	    dstEnd = eof;
	    chanPtr->flags |= (CHANNEL_EOF | CHANNEL_STICKY_EOF);
	    chanPtr->inputEncodingFlags |= TCL_ENCODING_END;
	    statePtr->flags |= (CHANNEL_EOF | CHANNEL_STICKY_EOF);
	    statePtr->inputEncodingFlags |= TCL_ENCODING_END;
	}
	if (chanPtr->flags & CHANNEL_EOF) {
	if (statePtr->flags & CHANNEL_EOF) {
	    skip = 0;
	    eol = dstEnd;
	    if (eol == objPtr->bytes) {
		/*
		 * If we didn't produce any bytes before encountering EOF,
		 * caller needs to see -1.
		 */
3628
3629
3630
3631
3632
3633
3634
3635

3636
3637
3638


3639
3640
3641
3642
3643
3644
3645
3646
3647
3648

3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659

3660
3661
3662
3663
3664
3665
3666
3667
3668


3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682

3683
3684
3685
3686
3687
3688
3689
3296
3297
3298
3299
3300
3301
3302

3303
3304


3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315

3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326

3327
3328
3329
3330
3331
3332
3333
3334


3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349

3350
3351
3352
3353
3354
3355
3356
3357







-
+

-
-
+
+









-
+










-
+







-
-
+
+













-
+







     * the number of UTF-8 characters we want, plus how many raw bytes
     * correspond to the character(s) making up EOL (if any), so we can
     * remove the correct number of bytes from the channel buffer.
     */
     
    goteol:
    bufPtr = gs.bufPtr;
    chanPtr->inputEncodingState = gs.state;
    statePtr->inputEncodingState = gs.state;
    Tcl_ExternalToUtf(NULL, gs.encoding, bufPtr->buf + bufPtr->nextRemoved,
	    gs.rawRead, chanPtr->inputEncodingFlags,
	    &chanPtr->inputEncodingState, dst, eol - dst + skip + TCL_UTF_MAX,
	    gs.rawRead, statePtr->inputEncodingFlags,
	    &statePtr->inputEncodingState, dst, eol - dst + skip + TCL_UTF_MAX,
	    &gs.rawRead, NULL, &gs.charsWrote);
    bufPtr->nextRemoved += gs.rawRead;

    /*
     * Recycle all the emptied buffers.
     */

    Tcl_SetObjLength(objPtr, eol - objPtr->bytes);
    CommonGetsCleanup(chanPtr, encoding);
    chanPtr->flags &= ~CHANNEL_BLOCKED;
    statePtr->flags &= ~CHANNEL_BLOCKED;
    copiedTotal = gs.totalChars + gs.charsWrote - skip;
    goto done;

    /*
     * Couldn't get a complete line.  This only happens if we get a error
     * reading from the channel or we are non-blocking and there wasn't
     * an EOL or EOF in the data available.
     */

    restore:
    bufPtr = chanPtr->inQueueHead;
    bufPtr = statePtr->inQueueHead;
    bufPtr->nextRemoved = oldRemoved;

    for (bufPtr = bufPtr->nextPtr; bufPtr != NULL; bufPtr = bufPtr->nextPtr) {
	bufPtr->nextRemoved = BUFFER_PADDING;
    }
    CommonGetsCleanup(chanPtr, encoding);

    chanPtr->inputEncodingState = oldState;
    chanPtr->inputEncodingFlags = oldFlags;
    statePtr->inputEncodingState = oldState;
    statePtr->inputEncodingFlags = oldFlags;
    Tcl_SetObjLength(objPtr, oldLength);

    /*
     * We didn't get a complete line so we need to indicate to UpdateInterest
     * that the gets blocked.  It will wait for more data instead of firing
     * a timer, avoiding a busy wait.  This is where we are assuming that the
     * next operation is a gets.  No more file events will be delivered on 
     * this channel until new data arrives or some operation is performed
     * on the channel (e.g. gets, read, fconfigure) that changes the blocking
     * state.  Note that this means a file event will not be delivered even
     * though a read would be able to consume the buffered data.
     */

    chanPtr->flags |= CHANNEL_NEED_MORE_DATA;
    statePtr->flags |= CHANNEL_NEED_MORE_DATA;
    copiedTotal = -1;

    done:
    /*
     * Update the notifier state so we don't block while there is still
     * data in the buffers.
     */
3717
3718
3719
3720
3721
3722
3723

3724
3725
3726
3727
3728
3729

3730
3731
3732
3733
3734
3735
3736
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397

3398
3399
3400
3401
3402
3403
3404
3405







+





-
+







 */
 
static int
FilterInputBytes(chanPtr, gsPtr)
    Channel *chanPtr;		/* Channel to read. */
    GetsState *gsPtr;		/* Current state of gets operation. */
{
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    ChannelBuffer *bufPtr;
    char *raw, *rawStart, *rawEnd;
    char *dst;
    int offset, toRead, dstNeeded, spaceLeft, result, rawLen, length;
    Tcl_Obj *objPtr;
#define ENCODING_LINESIZE   30	/* Lower bound on how many bytes to convert
#define ENCODING_LINESIZE   50	/* Lower bound on how many bytes to convert
				 * at a time.  Since we don't know a priori
				 * how many bytes of storage this many source
				 * bytes will use, we actually need at least
				 * ENCODING_LINESIZE * TCL_MAX_UTF bytes of
				 * room. */

    objPtr = gsPtr->objPtr;
3753
3754
3755
3756
3757
3758
3759
3760
3761


3762
3763
3764
3765
3766

3767
3768
3769
3770
3771
3772
3773

3774
3775
3776
3777
3778
3779
3780
3422
3423
3424
3425
3426
3427
3428


3429
3430
3431
3432
3433
3434

3435
3436
3437
3438
3439
3440
3441

3442
3443
3444
3445
3446
3447
3448
3449







-
-
+
+




-
+






-
+







	/*
	 * All channel buffers were exhausted and the caller still hasn't
	 * seen EOL.  Need to read more bytes from the channel device.
	 * Side effect is to allocate another channel buffer.
	 */
	 
	read:
        if (chanPtr->flags & CHANNEL_BLOCKED) {
            if (chanPtr->flags & CHANNEL_NONBLOCKING) {
        if (statePtr->flags & CHANNEL_BLOCKED) {
            if (statePtr->flags & CHANNEL_NONBLOCKING) {
		gsPtr->charsWrote = 0;
		gsPtr->rawRead = 0;
		return -1;
	    }
            chanPtr->flags &= ~CHANNEL_BLOCKED;
            statePtr->flags &= ~CHANNEL_BLOCKED;
        }
	if (GetInput(chanPtr) != 0) {
	    gsPtr->charsWrote = 0;
	    gsPtr->rawRead = 0;
	    return -1;
	}
	bufPtr = chanPtr->inQueueTail;
	bufPtr = statePtr->inQueueTail;
	gsPtr->bufPtr = bufPtr;
    }

    /*
     * Convert some of the bytes from the channel buffer to UTF-8.  Space in
     * objPtr's string rep is used to hold the UTF-8 characters.  Grow the
     * string rep if we need more space.
3800
3801
3802
3803
3804
3805
3806
3807

3808
3809

3810
3811







3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830

3831
3832
3833
3834
3835
3836

3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847

3848
3849

3850
3851
3852
3853
3854
3855
3856
3469
3470
3471
3472
3473
3474
3475

3476
3477

3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505

3506
3507
3508
3509
3510
3511

3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522

3523
3524

3525
3526
3527
3528
3529
3530
3531
3532







-
+

-
+


+
+
+
+
+
+
+


















-
+





-
+










-
+

-
+







	}
	length += TCL_UTF_MAX + 1;
	Tcl_SetObjLength(objPtr, length);
	spaceLeft = length - offset;
	dst = objPtr->bytes + offset;
	*gsPtr->dstPtr = dst;
    }
    gsPtr->state = chanPtr->inputEncodingState;
    gsPtr->state = statePtr->inputEncodingState;
    result = Tcl_ExternalToUtf(NULL, gsPtr->encoding, raw, rawLen,
	    chanPtr->inputEncodingFlags, &chanPtr->inputEncodingState,
	    statePtr->inputEncodingFlags, &statePtr->inputEncodingState,
	    dst, spaceLeft, &gsPtr->rawRead, &gsPtr->bytesWrote,
	    &gsPtr->charsWrote); 

    /*
     * Make sure that if we go through 'gets', that we reset the
     * TCL_ENCODING_START flag still.  [Bug #523988]
     */
    statePtr->inputEncodingFlags &= ~TCL_ENCODING_START;

    if (result == TCL_CONVERT_MULTIBYTE) {
	/*
	 * The last few bytes in this channel buffer were the start of a
	 * multibyte sequence.  If this buffer was full, then move them to
	 * the next buffer so the bytes will be contiguous.  
	 */

	ChannelBuffer *nextPtr;
	int extra;
	
	nextPtr = bufPtr->nextPtr;
	if (bufPtr->nextAdded < bufPtr->bufLength) {
	    if (gsPtr->rawRead > 0) {
		/*
		 * Some raw bytes were converted to UTF-8.  Fall through,
		 * returning those UTF-8 characters because a EOL might be
		 * present in them.
		 */
	    } else if (chanPtr->flags & CHANNEL_EOF) {
	    } else if (statePtr->flags & CHANNEL_EOF) {
		/*
		 * There was a partial character followed by EOF on the
		 * device.  Fall through, returning that nothing was found.
		 */

		 bufPtr->nextRemoved = bufPtr->nextAdded;
		bufPtr->nextRemoved = bufPtr->nextAdded;
	    } else {
		/*
		 * There are no more cached raw bytes left.  See if we can
		 * get some more.
		 */

		goto read;
	    }
	} else {
	    if (nextPtr == NULL) {
		nextPtr = AllocChannelBuffer(chanPtr->bufSize);
		nextPtr = AllocChannelBuffer(statePtr->bufSize);
		bufPtr->nextPtr = nextPtr;
		chanPtr->inQueueTail = nextPtr;
		statePtr->inQueueTail = nextPtr;
	    }
	    extra = rawLen - gsPtr->rawRead;
	    memcpy((VOID *) (nextPtr->buf + BUFFER_PADDING - extra),
		    (VOID *) (raw + gsPtr->rawRead), (size_t) extra);
	    nextPtr->nextRemoved -= extra;
	    bufPtr->nextAdded -= extra;
	}
3885
3886
3887
3888
3889
3890
3891

3892
3893
3894
3895
3896
3897
3898
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575







+







static void
PeekAhead(chanPtr, dstEndPtr, gsPtr)
    Channel *chanPtr;		/* The channel to read. */
    char **dstEndPtr;		/* Filled with pointer to end of new range
				 * of UTF-8 characters. */
    GetsState *gsPtr;		/* Current state of gets operation. */
{
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    ChannelBuffer *bufPtr;
    Tcl_DriverBlockModeProc *blockModeProc;
    int bytesLeft;

    bufPtr = gsPtr->bufPtr;

    /*
3910
3911
3912
3913
3914
3915
3916
3917
3918


3919
3920
3921
3922
3923
3924
3925
3926

3927
3928
3929
3930
3931
3932
3933
3934

3935
3936
3937
3938
3939
3940
3941
3587
3588
3589
3590
3591
3592
3593


3594
3595
3596
3597
3598
3599
3600
3601
3602

3603
3604
3605
3606
3607
3608
3609
3610

3611
3612
3613
3614
3615
3616
3617
3618







-
-
+
+







-
+







-
+







	    if (bufPtr->nextAdded < bufPtr->bufLength) {
		/*
		 * Don't peek ahead if last read was short read.
		 */
		 
		goto cleanup;
	    }
	    if ((chanPtr->flags & CHANNEL_NONBLOCKING) == 0) {
		blockModeProc = chanPtr->typePtr->blockModeProc;
	    if ((statePtr->flags & CHANNEL_NONBLOCKING) == 0) {
		blockModeProc = Tcl_ChannelBlockModeProc(chanPtr->typePtr);
		if (blockModeProc == NULL) {
		    /*
		     * Don't peek ahead if cannot set non-blocking mode.
		     */

		    goto cleanup;
		}
		(*blockModeProc)(chanPtr->instanceData, TCL_MODE_NONBLOCKING);
		StackSetBlockMode(chanPtr, TCL_MODE_NONBLOCKING);
	    }
	}
    }
    if (FilterInputBytes(chanPtr, gsPtr) == 0) {
	*dstEndPtr = *gsPtr->dstPtr + gsPtr->bytesWrote;
    }
    if (blockModeProc != NULL) {
	(*blockModeProc)(chanPtr->instanceData, TCL_MODE_BLOCKING);
	StackSetBlockMode(chanPtr, TCL_MODE_BLOCKING);
    }
    return;

    cleanup:
    bufPtr->nextRemoved += gsPtr->rawRead;
    gsPtr->rawRead = 0;
    gsPtr->totalChars += gsPtr->charsWrote;
3961
3962
3963
3964
3965
3966
3967

3968
3969
3970

3971
3972
3973
3974
3975
3976

3977
3978

3979
3980

3981
3982
3983
3984
3985
3986
3987
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647

3648
3649
3650
3651
3652
3653

3654
3655

3656
3657

3658
3659
3660
3661
3662
3663
3664
3665







+


-
+





-
+

-
+

-
+







 */
 
static void
CommonGetsCleanup(chanPtr, encoding)
    Channel *chanPtr;
    Tcl_Encoding encoding;
{
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    ChannelBuffer *bufPtr, *nextPtr;
    
    bufPtr = chanPtr->inQueueHead;
    bufPtr = statePtr->inQueueHead;
    for ( ; bufPtr != NULL; bufPtr = nextPtr) {
	nextPtr = bufPtr->nextPtr;
	if (bufPtr->nextRemoved < bufPtr->nextAdded) {
	    break;
	}
	RecycleBuffer(chanPtr, bufPtr, 0);
	RecycleBuffer(statePtr, bufPtr, 0);
    }
    chanPtr->inQueueHead = bufPtr;
    statePtr->inQueueHead = bufPtr;
    if (bufPtr == NULL) {
	chanPtr->inQueueTail = NULL;
	statePtr->inQueueTail = NULL;
    } else {
	/*
	 * If any multi-byte characters were split across channel buffer
	 * boundaries, the split-up bytes were moved to the next channel
	 * buffer by FilterInputBytes().  Move the bytes back to their
	 * original buffer because the caller could change the channel's
	 * encoding which could change the interpretation of whether those
3999
4000
4001
4002
4003
4004
4005
4006

4007
4008
4009
4010
4011
4012
4013
3677
3678
3679
3680
3681
3682
3683

3684
3685
3686
3687
3688
3689
3690
3691







-
+







			(size_t) extra);
		bufPtr->nextAdded += extra;
		nextPtr->nextRemoved = BUFFER_PADDING;
	    }
	    bufPtr = nextPtr;
	}
    }
    if (chanPtr->encoding == NULL) {
    if (statePtr->encoding == NULL) {
	Tcl_FreeEncoding(encoding);
    }
}

/*
 *----------------------------------------------------------------------
 *
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042










4043
4044
4045
4046
4047































































































































4048
4049
4050
4051
4052
4053
4054
3710
3711
3712
3713
3714
3715
3716




3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865







-
-
-
-
+
+
+
+
+
+
+
+
+
+





+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+








int
Tcl_Read(chan, dst, bytesToRead)
    Tcl_Channel chan;		/* The channel from which to read. */
    char *dst;			/* Where to store input read. */
    int bytesToRead;		/* Maximum number of bytes to read. */
{
    Channel *chanPtr;		
    
    chanPtr = (Channel *) chan;
    if (CheckChannelErrors(chanPtr, TCL_READABLE) != 0) {
    Channel *chanPtr = (Channel *) chan;		
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */

    /*
     * This operation should occur at the top of a channel stack.
     */

    chanPtr = statePtr->topChanPtr;

    if (CheckChannelErrors(statePtr, TCL_READABLE) != 0) {
	return -1;
    }

    return DoRead(chanPtr, dst, bytesToRead);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ReadRaw --
 *
 *	Reads a given number of bytes from a channel.  EOL and EOF
 *	translation is done on the bytes being read, so the the number
 *	of bytes consumed from the channel may not be equal to the
 *	number of bytes stored in the destination buffer.
 *
 *	No encoding conversions are applied to the bytes being read.
 *
 * Results:
 *	The number of bytes read, or -1 on error. Use Tcl_GetErrno()
 *	to retrieve the error code for the error that occurred.
 *
 * Side effects:
 *	May cause input to be buffered.
 *
 *----------------------------------------------------------------------
 */

int
Tcl_ReadRaw(chan, bufPtr, bytesToRead)
    Tcl_Channel chan;		/* The channel from which to read. */
    char *bufPtr;			/* Where to store input read. */
    int bytesToRead;		/* Maximum number of bytes to read. */
{
    Channel *chanPtr = (Channel *) chan;		
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    int nread, result;
    int copied, copiedNow;

    /*
     * The check below does too much because it will reject a call to this
     * function with a channel which is part of an 'fcopy'. But we have to
     * allow this here or else the chaining in the transformation drivers
     * will fail with 'file busy' error instead of retrieving and
     * transforming the data to copy.
     *
     * We let the check procedure now believe that there is no fcopy in
     * progress. A better solution than this might be an additional flag
     * argument to switch off specific checks.
     */

    if (CheckChannelErrors(statePtr, TCL_READABLE | CHANNEL_RAW_MODE) != 0) {
	return -1;
    }

    /*
     * Check for information in the push-back buffers. If there is
     * some, use it. Go to the driver only if there is none (anymore)
     * and the caller requests more bytes.
     */

    for (copied = 0; copied < bytesToRead; copied += copiedNow) {
        copiedNow = CopyBuffer(chanPtr, bufPtr + copied,
                bytesToRead - copied);
        if (copiedNow == 0) {
            if (statePtr->flags & CHANNEL_EOF) {
		goto done;
            }
            if (statePtr->flags & CHANNEL_BLOCKED) {
                if (statePtr->flags & CHANNEL_NONBLOCKING) {
		    goto done;
                }
                statePtr->flags &= (~(CHANNEL_BLOCKED));
            }

	    if ((statePtr->flags & CHANNEL_TIMER_FEV) &&
		(statePtr->flags & CHANNEL_NONBLOCKING)) {
	        nread  = -1;
	        result = EWOULDBLOCK;
	    } else {
	      /*
	       * Now go to the driver to get as much as is possible to
	       * fill the remaining request. Do all the error handling
	       * by ourselves.  The code was stolen from 'GetInput' and
	       * slightly adapted (different return value here).
	       *
	       * The case of 'bytesToRead == 0' at this point cannot happen.
	       */

	      nread = (chanPtr->typePtr->inputProc)(chanPtr->instanceData,
			  bufPtr + copied, bytesToRead - copied, &result);
	    }
	    if (nread > 0) {
	        /*
		 * If we get a short read, signal up that we may be
		 * BLOCKED. We should avoid calling the driver because
		 * on some platforms we will block in the low level
		 * reading code even though the channel is set into
		 * nonblocking mode.
		 */
            
	        if (nread < (bytesToRead - copied)) {
		    statePtr->flags |= CHANNEL_BLOCKED;
		}
	    } else if (nread == 0) {
	        statePtr->flags |= CHANNEL_EOF;
		statePtr->inputEncodingFlags |= TCL_ENCODING_END;
	    } else if (nread < 0) {
	        if ((result == EWOULDBLOCK) || (result == EAGAIN)) {
		    if (copied > 0) {
		      /*
		       * Information that was copied earlier has precedence
		       * over EAGAIN/WOULDBLOCK handling.
		       */
		      return copied;
		    }

		    statePtr->flags |= CHANNEL_BLOCKED;
		    result = EAGAIN;
		}

		Tcl_SetErrno(result);
		return -1;
	    } 

	    return copied + nread;
        }
    }

done:
    return copied;
}

/*
 *---------------------------------------------------------------------------
 *
 * Tcl_ReadChars --
 *
 *	Reads from the channel until the requested number of characters
4077
4078
4079
4080
4081
4082
4083
4084
4085


4086

4087
4088
4089




4090
4091



4092
4093
4094
4095
4096

4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116

4117
4118

4119
4120

4121
4122
4123
4124
4125
4126
4127
4128

4129
4130
4131
4132
4133
4134


4135
4136

4137
4138
4139
4140
4141

4142
4143
4144
4145


4146
4147
4148

4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163

4164
4165
4166
4167
4168
4169
4170
3888
3889
3890
3891
3892
3893
3894


3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905


3906
3907
3908
3909
3910
3911
3912

3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932

3933
3934

3935
3936

3937
3938
3939
3940
3941
3942
3943
3944

3945
3946
3947
3948
3949


3950
3951
3952

3953
3954
3955
3956
3957

3958
3959
3960


3961
3962
3963
3964

3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979

3980
3981
3982
3983
3984
3985
3986
3987







-
-
+
+

+



+
+
+
+
-
-
+
+
+




-
+



















-
+

-
+

-
+







-
+




-
-
+
+

-
+




-
+


-
-
+
+


-
+














-
+







				 * or when channel blocks). */
    int appendFlag;		/* If non-zero, data read from the channel
				 * will be appended to the object.  Otherwise,
				 * the data will replace the existing contents
				 * of the object. */

{
    Channel *chanPtr;
    int offset, factor, copied, copiedNow, result;
    Channel *chanPtr = (Channel *) chan;
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    ChannelBuffer *bufPtr;
    int offset, factor, copied, copiedNow, result;
    Tcl_Encoding encoding;
#define UTF_EXPANSION_FACTOR	1024
    
    /*
     * This operation should occur at the top of a channel stack.
     */

    chanPtr = (Channel *) chan;
    if (CheckChannelErrors(chanPtr, TCL_READABLE) != 0) {
    chanPtr = statePtr->topChanPtr;

    if (CheckChannelErrors(statePtr, TCL_READABLE) != 0) {
	copied = -1;
	goto done;
    }

    encoding = chanPtr->encoding;
    encoding = statePtr->encoding;
    factor = UTF_EXPANSION_FACTOR;

    if (appendFlag == 0) {
	if (encoding == NULL) {
	    Tcl_SetByteArrayLength(objPtr, 0);
	} else {
	    Tcl_SetObjLength(objPtr, 0);
	}
	offset = 0;
    } else {
	if (encoding == NULL) {
	    Tcl_GetByteArrayFromObj(objPtr, &offset);
	} else {
	    Tcl_GetStringFromObj(objPtr, &offset);
	}
    }

    for (copied = 0; (unsigned) toRead > 0; ) {
	copiedNow = -1;
	if (chanPtr->inQueueHead != NULL) {
	if (statePtr->inQueueHead != NULL) {
	    if (encoding == NULL) {
		copiedNow = ReadBytes(chanPtr, objPtr, toRead, &offset);
		copiedNow = ReadBytes(statePtr, objPtr, toRead, &offset);
	    } else {
		copiedNow = ReadChars(chanPtr, objPtr, toRead, &offset,
		copiedNow = ReadChars(statePtr, objPtr, toRead, &offset,
			&factor);
	    }

	    /*
	     * If the current buffer is empty recycle it.
	     */

	    bufPtr = chanPtr->inQueueHead;
	    bufPtr = statePtr->inQueueHead;
	    if (bufPtr->nextRemoved == bufPtr->nextAdded) {
		ChannelBuffer *nextPtr;

		nextPtr = bufPtr->nextPtr;
		RecycleBuffer(chanPtr, bufPtr, 0);
		chanPtr->inQueueHead = nextPtr;
		RecycleBuffer(statePtr, bufPtr, 0);
		statePtr->inQueueHead = nextPtr;
		if (nextPtr == NULL) {
		    chanPtr->inQueueTail = nextPtr;
		    statePtr->inQueueTail = nextPtr;
		}
	    }
	}
	if (copiedNow < 0) {
	    if (chanPtr->flags & CHANNEL_EOF) {
	    if (statePtr->flags & CHANNEL_EOF) {
		break;
	    }
	    if (chanPtr->flags & CHANNEL_BLOCKED) {
		if (chanPtr->flags & CHANNEL_NONBLOCKING) {
	    if (statePtr->flags & CHANNEL_BLOCKED) {
		if (statePtr->flags & CHANNEL_NONBLOCKING) {
		    break;
		}
		chanPtr->flags &= ~CHANNEL_BLOCKED;
		statePtr->flags &= ~CHANNEL_BLOCKED;
	    }
	    result = GetInput(chanPtr);
	    if (result != 0) {
		if (result == EAGAIN) {
		    break;
		}
		copied = -1;
		goto done;
	    }
	} else {
	    copied += copiedNow;
	    toRead -= copiedNow;
	}
    }
    chanPtr->flags &= ~CHANNEL_BLOCKED;
    statePtr->flags &= ~CHANNEL_BLOCKED;
    if (encoding == NULL) {
	Tcl_SetByteArrayLength(objPtr, offset);
    } else {
	Tcl_SetObjLength(objPtr, offset);
    }

    done:
4199
4200
4201
4202
4203
4204
4205
4206
4207


4208
4209
4210
4211
4212
4213
4214
4016
4017
4018
4019
4020
4021
4022


4023
4024
4025
4026
4027
4028
4029
4030
4031







-
-
+
+







 * Side effects:
 *	None.
 *
 *---------------------------------------------------------------------------
 */

static int
ReadBytes(chanPtr, objPtr, bytesToRead, offsetPtr)
    Channel *chanPtr;		/* The channel to read. */
ReadBytes(statePtr, objPtr, bytesToRead, offsetPtr)
    ChannelState *statePtr;	/* State of the channel to read. */
    int bytesToRead;		/* Maximum number of characters to store,
				 * or < 0 to get all available characters.
				 * Characters are obtained from the first
				 * buffer in the queue -- even if this number
				 * is larger than the number of characters
				 * available in the first buffer, only the
				 * characters from the first buffer are
4225
4226
4227
4228
4229
4230
4231
4232

4233
4234
4235
4236
4237
4238
4239
4042
4043
4044
4045
4046
4047
4048

4049
4050
4051
4052
4053
4054
4055
4056







-
+







{
    int toRead, srcLen, srcRead, dstWrote, offset, length;
    ChannelBuffer *bufPtr;
    char *src, *dst;

    offset = *offsetPtr;

    bufPtr = chanPtr->inQueueHead; 
    bufPtr = statePtr->inQueueHead; 
    src = bufPtr->buf + bufPtr->nextRemoved;
    srcLen = bufPtr->nextAdded - bufPtr->nextRemoved;

    toRead = bytesToRead;
    if ((unsigned) toRead > (unsigned) srcLen) {
	toRead = srcLen;
    }
4250
4251
4252
4253
4254
4255
4256
4257
4258


4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272

4273
4274
4275
4276
4277
4278
4279
4067
4068
4069
4070
4071
4072
4073


4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088

4089
4090
4091
4092
4093
4094
4095
4096







-
-
+
+













-
+







	if (offset < toRead) {
	    length = offset + toRead + 1;
	}
	dst = (char *) Tcl_SetByteArrayLength(objPtr, length);
    }
    dst += offset;

    if (chanPtr->flags & INPUT_NEED_NL) {
	chanPtr->flags &= ~INPUT_NEED_NL;
    if (statePtr->flags & INPUT_NEED_NL) {
	statePtr->flags &= ~INPUT_NEED_NL;
	if ((srcLen == 0) || (*src != '\n')) {
	    *dst = '\r';
	    *offsetPtr += 1;
	    return 1;
	}
	*dst++ = '\n';
	src++;
	srcLen--;
	toRead--;
    }

    srcRead = srcLen;
    dstWrote = toRead;
    if (TranslateInputEOL(chanPtr, dst, src, &dstWrote, &srcRead) != 0) {
    if (TranslateInputEOL(statePtr, dst, src, &dstWrote, &srcRead) != 0) {
	if (dstWrote == 0) {
	    return -1;
	}
    }
    bufPtr->nextRemoved += srcRead;
    *offsetPtr += dstWrote;
    return dstWrote;
4303
4304
4305
4306
4307
4308
4309
4310
4311


4312
4313
4314
4315
4316
4317
4318
4120
4121
4122
4123
4124
4125
4126


4127
4128
4129
4130
4131
4132
4133
4134
4135







-
-
+
+







 * Side effects:
 *	None.
 *
 *---------------------------------------------------------------------------
 */

static int
ReadChars(chanPtr, objPtr, charsToRead, offsetPtr, factorPtr)
    Channel *chanPtr;		/* The channel to read. */
ReadChars(statePtr, objPtr, charsToRead, offsetPtr, factorPtr)
    ChannelState *statePtr;	/* State of channel to read. */
    int charsToRead;		/* Maximum number of characters to store,
				 * or -1 to get all available characters.
				 * Characters are obtained from the first
				 * buffer in the queue -- even if this number
				 * is larger than the number of characters
				 * available in the first buffer, only the
				 * characters from the first buffer are
4336
4337
4338
4339
4340
4341
4342
4343

4344
4345
4346
4347
4348
4349
4350
4153
4154
4155
4156
4157
4158
4159

4160
4161
4162
4163
4164
4165
4166
4167







-
+







    ChannelBuffer *bufPtr;
    char *src, *dst;
    Tcl_EncodingState oldState;

    factor = *factorPtr;
    offset = *offsetPtr;

    bufPtr = chanPtr->inQueueHead; 
    bufPtr = statePtr->inQueueHead; 
    src = bufPtr->buf + bufPtr->nextRemoved;
    srcLen = bufPtr->nextAdded - bufPtr->nextRemoved;

    toRead = charsToRead;
    if ((unsigned) toRead > (unsigned) srcLen) {
	toRead = srcLen;
    }
4381
4382
4383
4384
4385
4386
4387
4388
4389


4390
4391
4392
4393
4394
4395
4396




4397
4398
4399
4400
4401
4402

4403
4404
4405
4406
4407
4408
4409
4410
4411

4412
4413
4414
4415
4416
4417


4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429

4430
4431
4432
4433
4434













4435
4436


4437
4438
4439
4440
4441
4442
4443
4444



4445
4446
4447
4448

4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459



4460
4461

4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482



4483
4484
4485

4486
4487
4488

4489
4490
4491
4492
4493
4494
4495
4198
4199
4200
4201
4202
4203
4204


4205
4206
4207
4208
4209




4210
4211
4212
4213
4214
4215
4216
4217
4218

4219
4220
4221
4222
4223
4224
4225
4226
4227

4228
4229
4230
4231
4232


4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247





4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261

4262
4263
4264
4265
4266
4267
4268



4269
4270
4271
4272
4273
4274

4275
4276
4277
4278
4279
4280
4281
4282
4283



4284
4285
4286
4287

4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306



4307
4308
4309
4310
4311

4312
4313
4314

4315
4316
4317
4318
4319
4320
4321
4322







-
-
+
+



-
-
-
-
+
+
+
+





-
+








-
+




-
-
+
+












+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+

-
+
+





-
-
-
+
+
+



-
+








-
-
-
+
+
+

-
+


















-
-
-
+
+
+


-
+


-
+







	 * rather than using the factor.
	 */

	dstNeeded = spaceLeft;
    }
    dst = objPtr->bytes + offset;

    oldState = chanPtr->inputEncodingState;
    if (chanPtr->flags & INPUT_NEED_NL) {
    oldState = statePtr->inputEncodingState;
    if (statePtr->flags & INPUT_NEED_NL) {
	/*
	 * We want a '\n' because the last character we saw was '\r'.
	 */
	 
	chanPtr->flags &= ~INPUT_NEED_NL;
	Tcl_ExternalToUtf(NULL, chanPtr->encoding, src, srcLen,
		chanPtr->inputEncodingFlags, &chanPtr->inputEncodingState,

	statePtr->flags &= ~INPUT_NEED_NL;
	Tcl_ExternalToUtf(NULL, statePtr->encoding, src, srcLen,
		statePtr->inputEncodingFlags, &statePtr->inputEncodingState,
		dst, TCL_UTF_MAX + 1, &srcRead, &dstWrote, &numChars);
	if ((dstWrote > 0) && (*dst == '\n')) {
	    /*
	     * The next char was a '\n'.  Consume it and produce a '\n'.
	     */
	     

	    bufPtr->nextRemoved += srcRead;
	} else {
	    /*
	     * The next char was not a '\n'.  Produce a '\r'.
	     */

	    *dst = '\r';
	}
	chanPtr->inputEncodingFlags &= ~TCL_ENCODING_START;
	statePtr->inputEncodingFlags &= ~TCL_ENCODING_START;
	*offsetPtr += 1;
        return 1;
    }

    Tcl_ExternalToUtf(NULL, chanPtr->encoding, src, srcLen,
	    chanPtr->inputEncodingFlags, &chanPtr->inputEncodingState, dst,
    Tcl_ExternalToUtf(NULL, statePtr->encoding, src, srcLen,
	    statePtr->inputEncodingFlags, &statePtr->inputEncodingState, dst,
	    dstNeeded + TCL_UTF_MAX, &srcRead, &dstWrote, &numChars);
    if (srcRead == 0) {
	/*
	 * Not enough bytes in src buffer to make a complete char.  Copy
	 * the bytes to the next buffer to make a new contiguous string,
	 * then tell the caller to fill the buffer with more bytes.
	 */

	ChannelBuffer *nextPtr;
	
	nextPtr = bufPtr->nextPtr;
	if (nextPtr == NULL) {
	    if (srcLen > 0) {
	    /*
	     * There isn't enough data in the buffers to complete the next
	     * character, so we need to wait for more data before the next
	     * file event can be delivered.
	     */
	        /*
		 * There isn't enough data in the buffers to complete the next
		 * character, so we need to wait for more data before the next
		 * file event can be delivered.
		 *
		 * SF #478856.
		 *
		 * The exception to this is if the input buffer was
		 * completely empty before we tried to convert its
		 * contents. Nothing in, nothing out, and no incomplete
		 * character data. The conversion before the current one
		 * was complete.
		 */

	    chanPtr->flags |= CHANNEL_NEED_MORE_DATA;
	        statePtr->flags |= CHANNEL_NEED_MORE_DATA;
	    }
	    return -1;
	}
	nextPtr->nextRemoved -= srcLen;
	memcpy((VOID *) (nextPtr->buf + nextPtr->nextRemoved), (VOID *) src,
		(size_t) srcLen);
	RecycleBuffer(chanPtr, bufPtr, 0);
	chanPtr->inQueueHead = nextPtr;
	return ReadChars(chanPtr, objPtr, charsToRead, offsetPtr, factorPtr);
	RecycleBuffer(statePtr, bufPtr, 0);
	statePtr->inQueueHead = nextPtr;
	return ReadChars(statePtr, objPtr, charsToRead, offsetPtr, factorPtr);
    }

    dstRead = dstWrote;
    if (TranslateInputEOL(chanPtr, dst, dst, &dstWrote, &dstRead) != 0) {
    if (TranslateInputEOL(statePtr, dst, dst, &dstWrote, &dstRead) != 0) {
	/*
	 * Hit EOF char.  How many bytes of src correspond to where the
	 * EOF was located in dst?
	 */
	 
	if (dstWrote == 0) {
	    return -1;
	}
	chanPtr->inputEncodingState = oldState;
	Tcl_ExternalToUtf(NULL, chanPtr->encoding, src, srcLen,
		chanPtr->inputEncodingFlags, &chanPtr->inputEncodingState,
	statePtr->inputEncodingState = oldState;
	Tcl_ExternalToUtf(NULL, statePtr->encoding, src, srcLen,
		statePtr->inputEncodingFlags, &statePtr->inputEncodingState,
		dst, dstRead + TCL_UTF_MAX, &srcRead, &dstWrote, &numChars);
	TranslateInputEOL(chanPtr, dst, dst, &dstWrote, &dstRead);
	TranslateInputEOL(statePtr, dst, dst, &dstWrote, &dstRead);
    } 

    /*
     * The number of characters that we got may be less than the number
     * that we started with because "\r\n" sequences may have been
     * turned into just '\n' in dst.
     */

    numChars -= (dstRead - dstWrote);

    if ((unsigned) numChars > (unsigned) toRead) {
	/*
	 * Got too many chars.
	 */

	char *eof;

	eof = Tcl_UtfAtIndex(dst, toRead);
	chanPtr->inputEncodingState = oldState;
	Tcl_ExternalToUtf(NULL, chanPtr->encoding, src, srcLen,
		chanPtr->inputEncodingFlags, &chanPtr->inputEncodingState,
	statePtr->inputEncodingState = oldState;
	Tcl_ExternalToUtf(NULL, statePtr->encoding, src, srcLen,
		statePtr->inputEncodingFlags, &statePtr->inputEncodingState,
		dst, eof - dst + TCL_UTF_MAX, &srcRead, &dstWrote, &numChars);
	dstRead = dstWrote;
	TranslateInputEOL(chanPtr, dst, dst, &dstWrote, &dstRead);
	TranslateInputEOL(statePtr, dst, dst, &dstWrote, &dstRead);
	numChars -= (dstRead - dstWrote);
    }
    chanPtr->inputEncodingFlags &= ~TCL_ENCODING_START;
    statePtr->inputEncodingFlags &= ~TCL_ENCODING_START;

    bufPtr->nextRemoved += srcRead;
    if (dstWrote > srcRead + 1) {
	*factorPtr = dstWrote * UTF_EXPANSION_FACTOR / srcRead;
    }
    *offsetPtr += dstWrote;
    return numChars;
4510
4511
4512
4513
4514
4515
4516
4517
4518


4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538

4539
4540
4541
4542
4543
4544
4545
4337
4338
4339
4340
4341
4342
4343


4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364

4365
4366
4367
4368
4369
4370
4371
4372







-
-
+
+



















-
+







 * Side effects:
 *	None.
 *
 *---------------------------------------------------------------------------
 */

static int
TranslateInputEOL(chanPtr, dstStart, srcStart, dstLenPtr, srcLenPtr)
    Channel *chanPtr;		/* Channel being read, for EOL translation
TranslateInputEOL(statePtr, dstStart, srcStart, dstLenPtr, srcLenPtr)
    ChannelState *statePtr;	/* Channel being read, for EOL translation
				 * and EOF character. */
    char *dstStart;		/* Output buffer filled with chars by
				 * applying appropriate EOL translation to
				 * source characters. */
    CONST char *srcStart;	/* Source characters. */
    int *dstLenPtr;		/* On entry, the maximum length of output
				 * buffer in bytes; must be <= *srcLenPtr.  On
				 * exit, the number of bytes actually used in
				 * output buffer. */
    int *srcLenPtr;		/* On entry, the length of source buffer.
				 * On exit, the number of bytes read from
				 * the source buffer. */
{
    int dstLen, srcLen, inEofChar;
    CONST char *eof;

    dstLen = *dstLenPtr;

    eof = NULL;
    inEofChar = chanPtr->inEofChar;
    inEofChar = statePtr->inEofChar;
    if (inEofChar != '\0') {
	/*
	 * Find EOF in translated buffer then compress out the EOL.  The
	 * source buffer may be much longer than the destination buffer --
	 * we only want to return EOF if the EOF has been copied to the
	 * destination buffer.
	 */
4555
4556
4557
4558
4559
4560
4561
4562

4563
4564
4565
4566
4567
4568
4569
4382
4383
4384
4385
4386
4387
4388

4389
4390
4391
4392
4393
4394
4395
4396







-
+







		    dstLen = srcLen;
		}
		*srcLenPtr = srcLen;
		break;
	    }
	}
    }
    switch (chanPtr->inputTranslation) {
    switch (statePtr->inputTranslation) {
	case TCL_TRANSLATE_LF: {
	    if (dstStart != srcStart) {
		memcpy((VOID *) dstStart, (VOID *) srcStart, (size_t) dstLen);
	    }
	    srcLen = dstLen;
	    break;
	}
4591
4592
4593
4594
4595
4596
4597
4598

4599
4600
4601
4602
4603
4604
4605
4418
4419
4420
4421
4422
4423
4424

4425
4426
4427
4428
4429
4430
4431
4432







-
+







	    srcEnd = srcStart + dstLen;
	    srcMax = srcStart + *srcLenPtr;

	    for ( ; src < srcEnd; ) {
		if (*src == '\r') {
		    src++;
		    if (src >= srcMax) {
			chanPtr->flags |= INPUT_NEED_NL;
			statePtr->flags |= INPUT_NEED_NL;
		    } else if (*src == '\n') {
			*dst++ = *src++;
		    } else {
			*dst++ = '\r';
		    }
		} else {
		    *dst++ = *src++;
4614
4615
4616
4617
4618
4619
4620
4621

4622
4623
4624
4625

4626
4627
4628
4629
4630
4631

4632
4633
4634
4635
4636
4637
4638
4441
4442
4443
4444
4445
4446
4447

4448
4449
4450
4451

4452
4453
4454
4455
4456
4457

4458
4459
4460
4461
4462
4463
4464
4465







-
+



-
+





-
+







	    CONST char *src, *srcEnd, *srcMax;

	    dst = dstStart;
	    src = srcStart;
	    srcEnd = srcStart + dstLen;
	    srcMax = srcStart + *srcLenPtr;

	    if ((chanPtr->flags & INPUT_SAW_CR) && (src < srcMax)) {
	    if ((statePtr->flags & INPUT_SAW_CR) && (src < srcMax)) {
		if (*src == '\n') {
		    src++;
		}
		chanPtr->flags &= ~INPUT_SAW_CR;
		statePtr->flags &= ~INPUT_SAW_CR;
	    }
	    for ( ; src < srcEnd; ) {
		if (*src == '\r') {
		    src++;
		    if (src >= srcMax) {
			chanPtr->flags |= INPUT_SAW_CR;
			statePtr->flags |= INPUT_SAW_CR;
		    } else if (*src == '\n') {
			if (srcEnd < srcMax) {
			    srcEnd++;
			}
			src++;
		    }
		    *dst++ = '\n';
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662



4663
4664
4665
4666
4667
4668
4669
4480
4481
4482
4483
4484
4485
4486



4487
4488
4489
4490
4491
4492
4493
4494
4495
4496







-
-
-
+
+
+







    if ((eof != NULL) && (srcStart + srcLen >= eof)) {
	/*
	 * EOF character was seen in EOL translated range.  Leave current
	 * file position pointing at the EOF character, but don't store the
	 * EOF character in the output string.
	 */

	chanPtr->flags |= (CHANNEL_EOF | CHANNEL_STICKY_EOF);
	chanPtr->inputEncodingFlags |= TCL_ENCODING_END;
	chanPtr->flags &= ~(INPUT_SAW_CR | INPUT_NEED_NL);
	statePtr->flags |= (CHANNEL_EOF | CHANNEL_STICKY_EOF);
	statePtr->inputEncodingFlags |= TCL_ENCODING_END;
	statePtr->flags &= ~(INPUT_SAW_CR | INPUT_NEED_NL);
	return 1;
    }

    *srcLenPtr = srcLen;
    return 0;
}

4689
4690
4691
4692
4693
4694
4695

4696
4697
4698
4699

4700







4701
4702
4703
4704
4705
4706


4707
4708
4709
4710

4711
4712
4713
4714
4715
4716
4717
4718
4719
4720

4721
4722
4723

4724
4725
4726
4727
4728
4729
4730
4731

4732
4733
4734


4735
4736
4737
4738


4739
4740
4741


4742
4743
4744
4745
4746
4747
4748
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528

4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539


4540
4541
4542
4543
4544

4545
4546
4547
4548
4549
4550
4551
4552
4553
4554

4555
4556
4557

4558
4559
4560
4561
4562
4563
4564
4565

4566
4567


4568
4569
4570
4571


4572
4573
4574


4575
4576
4577
4578
4579
4580
4581
4582
4583







+




+
-
+
+
+
+
+
+
+




-
-
+
+



-
+









-
+


-
+







-
+

-
-
+
+


-
-
+
+

-
-
+
+







    Tcl_Channel chan;		/* The channel for which to add the input. */
    char *str;			/* The input itself. */
    int len;			/* The length of the input. */
    int atEnd;			/* If non-zero, add at end of queue; otherwise
                                 * add at head of queue. */    
{
    Channel *chanPtr;		/* The real IO channel. */
    ChannelState *statePtr;	/* State of actual channel. */
    ChannelBuffer *bufPtr;	/* Buffer to contain the data. */
    int i, flags;

    chanPtr = (Channel *) chan;
    statePtr = chanPtr->state;
    

    /*
     * This operation should occur at the top of a channel stack.
     */

    chanPtr = statePtr->topChanPtr;

    /*
     * CheckChannelErrors clears too many flag bits in this one case.
     */
     
    flags = chanPtr->flags;
    if (CheckChannelErrors(chanPtr, TCL_READABLE) != 0) {
    flags = statePtr->flags;
    if (CheckChannelErrors(statePtr, TCL_READABLE) != 0) {
	len = -1;
	goto done;
    }
    chanPtr->flags = flags;
    statePtr->flags = flags;

    /*
     * If we have encountered a sticky EOF, just punt without storing.
     * (sticky EOF is set if we have seen the input eofChar, to prevent
     * reading beyond the eofChar). Otherwise, clear the EOF flags, and
     * clear the BLOCKED bit. We want to discover these conditions anew
     * in each operation.
     */

    if (chanPtr->flags & CHANNEL_STICKY_EOF) {
    if (statePtr->flags & CHANNEL_STICKY_EOF) {
	goto done;
    }
    chanPtr->flags &= (~(CHANNEL_BLOCKED | CHANNEL_EOF));
    statePtr->flags &= (~(CHANNEL_BLOCKED | CHANNEL_EOF));

    bufPtr = AllocChannelBuffer(len);
    for (i = 0; i < len; i++) {
        bufPtr->buf[i] = str[i];
    }
    bufPtr->nextAdded += len;

    if (chanPtr->inQueueHead == (ChannelBuffer *) NULL) {
    if (statePtr->inQueueHead == (ChannelBuffer *) NULL) {
        bufPtr->nextPtr = (ChannelBuffer *) NULL;
        chanPtr->inQueueHead = bufPtr;
        chanPtr->inQueueTail = bufPtr;
        statePtr->inQueueHead = bufPtr;
        statePtr->inQueueTail = bufPtr;
    } else if (atEnd) {
        bufPtr->nextPtr = (ChannelBuffer *) NULL;
        chanPtr->inQueueTail->nextPtr = bufPtr;
        chanPtr->inQueueTail = bufPtr;
        statePtr->inQueueTail->nextPtr = bufPtr;
        statePtr->inQueueTail = bufPtr;
    } else {
        bufPtr->nextPtr = chanPtr->inQueueHead;
        chanPtr->inQueueHead = bufPtr;
        bufPtr->nextPtr = statePtr->inQueueHead;
        statePtr->inQueueHead = bufPtr;
    }

    done:
    /*
     * Update the notifier state so we don't block while there is still
     * data in the buffers.
     */
4768
4769
4770
4771
4772
4773
4774
4775


4776




4777
4778



4779
4780
4781
4782
4783
4784
4785
4786
4787
4788




4789
4790
4791
4792
4793
4794
4795
4603
4604
4605
4606
4607
4608
4609

4610
4611
4612
4613
4614
4615
4616


4617
4618
4619
4620
4621
4622
4623
4624
4625




4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636







-
+
+

+
+
+
+
-
-
+
+
+






-
-
-
-
+
+
+
+







 */

int
Tcl_Flush(chan)
    Tcl_Channel chan;			/* The Channel to flush. */
{
    int result;				/* Of calling FlushChannel. */
    Channel *chanPtr;			/* The actual channel. */
    Channel *chanPtr  = (Channel *) chan;	/* The actual channel. */
    ChannelState *statePtr = chanPtr->state;	/* State of actual channel. */

    /*
     * This operation should occur at the top of a channel stack.
     */

    chanPtr = (Channel *) chan;
    if (CheckChannelErrors(chanPtr, TCL_WRITABLE) != 0) {
    chanPtr = statePtr->topChanPtr;

    if (CheckChannelErrors(statePtr, TCL_WRITABLE) != 0) {
	return -1;
    }

    /*
     * Force current output buffer to be output also.
     */
    
    if ((chanPtr->curOutPtr != NULL)
	    && (chanPtr->curOutPtr->nextAdded > 0)) {
        chanPtr->flags |= BUFFER_READY;

    if ((statePtr->curOutPtr != NULL)
	    && (statePtr->curOutPtr->nextAdded > 0)) {
        statePtr->flags |= BUFFER_READY;
    }
    
    result = FlushChannel(NULL, chanPtr, 0);
    if (result != 0) {
        return TCL_ERROR;
    }

4811
4812
4813
4814
4815
4816
4817
4818
4819


4820
4821
4822
4823
4824
4825
4826
4827
4828



4829
4830
4831

4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842



4843
4844
4845
4846
4847
4848
4849
4652
4653
4654
4655
4656
4657
4658


4659
4660
4661
4662
4663
4664
4665
4666



4667
4668
4669
4670
4671

4672
4673
4674
4675
4676
4677
4678
4679
4680



4681
4682
4683
4684
4685
4686
4687
4688
4689
4690







-
-
+
+






-
-
-
+
+
+


-
+








-
-
-
+
+
+







 *	May discard input from the channel. If discardLastBuffer is zero,
 *	leaves one buffer in place for back-filling.
 *
 *----------------------------------------------------------------------
 */

static void
DiscardInputQueued(chanPtr, discardSavedBuffers)
    Channel *chanPtr;		/* Channel on which to discard
DiscardInputQueued(statePtr, discardSavedBuffers)
    ChannelState *statePtr;	/* Channel on which to discard
                                 * the queued input. */
    int discardSavedBuffers;	/* If non-zero, discard all buffers including
                                 * last one. */
{
    ChannelBuffer *bufPtr, *nxtPtr;	/* Loop variables. */

    bufPtr = chanPtr->inQueueHead;
    chanPtr->inQueueHead = (ChannelBuffer *) NULL;
    chanPtr->inQueueTail = (ChannelBuffer *) NULL;
    bufPtr = statePtr->inQueueHead;
    statePtr->inQueueHead = (ChannelBuffer *) NULL;
    statePtr->inQueueTail = (ChannelBuffer *) NULL;
    for (; bufPtr != (ChannelBuffer *) NULL; bufPtr = nxtPtr) {
        nxtPtr = bufPtr->nextPtr;
        RecycleBuffer(chanPtr, bufPtr, discardSavedBuffers);
        RecycleBuffer(statePtr, bufPtr, discardSavedBuffers);
    }

    /*
     * If discardSavedBuffers is nonzero, must also discard any previously
     * saved buffer in the saveInBufPtr field.
     */
    
    if (discardSavedBuffers) {
        if (chanPtr->saveInBufPtr != (ChannelBuffer *) NULL) {
            ckfree((char *) chanPtr->saveInBufPtr);
            chanPtr->saveInBufPtr = (ChannelBuffer *) NULL;
        if (statePtr->saveInBufPtr != (ChannelBuffer *) NULL) {
            ckfree((char *) statePtr->saveInBufPtr);
            statePtr->saveInBufPtr = (ChannelBuffer *) NULL;
        }
    }
}

/*
 *---------------------------------------------------------------------------
 *
4865
4866
4867
4868
4869
4870
4871

4872
4873
4874
4875
4876
4877
4878
4879
4880

4881
4882
4883




























4884
4885
4886
4887
4888
4889
4890

4891
4892

4893
4894
4895















4896
4897

4898
4899

4900












4901
4902
4903
4904
4905
4906
4907








4908
4909

4910
4911
4912
4913
4914
4915

4916
4917
4918





4919
4920



4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933

4934
4935
4936
4937


4938
4939
4940

4941
4942
4943
4944
4945

4946
4947
4948
4949
4950
4951
4952
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721

4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759

4760
4761

4762
4763


4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779

4780
4781

4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795







4796
4797
4798
4799
4800
4801
4802
4803
4804

4805
4806
4807
4808
4809
4810

4811
4812
4813
4814
4815
4816
4817
4818
4819


4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834

4835
4836
4837


4838
4839
4840
4841

4842
4843
4844
4845
4846

4847
4848
4849
4850
4851
4852
4853
4854







+








-
+



+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+






-
+

-
+

-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

-
+

-
+

+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+

-
+





-
+



+
+
+
+
+
-
-
+
+
+












-
+


-
-
+
+


-
+




-
+







GetInput(chanPtr)
    Channel *chanPtr;		/* Channel to read input from. */
{
    int toRead;			/* How much to read? */
    int result;			/* Of calling driver. */
    int nread;			/* How much was read from channel? */
    ChannelBuffer *bufPtr;	/* New buffer to add to input queue. */
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */

    /*
     * Prevent reading from a dead channel -- a channel that has been closed
     * but not yet deallocated, which can happen if the exit handler for
     * channel cleanup has run but the channel is still registered in some
     * interpreter.
     */
    
    if (CheckForDeadChannel(NULL, chanPtr)) {
    if (CheckForDeadChannel(NULL, statePtr)) {
	return EINVAL;
    }

    /*
     * First check for more buffers in the pushback area of the
     * topmost channel in the stack and use them. They can be the
     * result of a transformation which went away without reading all
     * the information placed in the area when it was stacked.
     *
     * Two possibilities for the state: No buffers in it, or a single
     * empty buffer. In the latter case we can recycle it now.
     */

    if (chanPtr->inQueueHead != (ChannelBuffer*) NULL) {
        if (statePtr->inQueueHead != (ChannelBuffer*) NULL) {
	    RecycleBuffer(statePtr, statePtr->inQueueHead, 0);
	    statePtr->inQueueHead = (ChannelBuffer*) NULL;
	}

	statePtr->inQueueHead = chanPtr->inQueueHead;
	statePtr->inQueueTail = chanPtr->inQueueTail;
	chanPtr->inQueueHead  = (ChannelBuffer*) NULL;
	chanPtr->inQueueTail  = (ChannelBuffer*) NULL;
	return 0;
    }

    /*
     * Nothing in the pushback area, fall back to the usual handling
     * (driver, etc.)
     */

    /*
     * See if we can fill an existing buffer. If we can, read only
     * as much as will fit in it. Otherwise allocate a new buffer,
     * add it to the input queue and attempt to fill it to the max.
     */

    bufPtr = chanPtr->inQueueTail;
    bufPtr = statePtr->inQueueTail;
    if ((bufPtr != NULL) && (bufPtr->nextAdded < bufPtr->bufLength)) {
        toRead = bufPtr->bufLength - bufPtr->nextAdded;
	toRead = bufPtr->bufLength - bufPtr->nextAdded;
    } else {
	bufPtr = chanPtr->saveInBufPtr;
	chanPtr->saveInBufPtr = NULL;
	bufPtr = statePtr->saveInBufPtr;
	statePtr->saveInBufPtr = NULL;

	/*
	 * Check the actual buffersize against the requested
	 * buffersize. Buffers which are smaller than requested aare
	 * squashed. This is done to honor dynamic changes of the
	 * buffersize made by the user.
	 */

	if ((bufPtr != NULL) && ((bufPtr->bufLength - BUFFER_PADDING) < statePtr->bufSize)) {
	  ckfree((char *) bufPtr);
	  bufPtr = NULL;
	}

	if (bufPtr == NULL) {
	    bufPtr = AllocChannelBuffer(chanPtr->bufSize);
	    bufPtr = AllocChannelBuffer(statePtr->bufSize);
	}
        bufPtr->nextPtr = (ChannelBuffer *) NULL;
	bufPtr->nextPtr = (ChannelBuffer *) NULL;

	/* SF #427196: Use the actual size of the buffer to determine
	 * the number of bytes to read from the channel and not the
	 * size for new buffers. They can be different if the
	 * buffersize was changed between reads.
	 *
	 * Note: This affects performance negatively if the buffersize
	 * was extended but this small buffer is reused for all
	 * subsequent reads. The system never uses buffers with the
	 * requested bigger size in that case. An adjunct patch could
	 * try and delete all unused buffers it encounters and which
	 * are smaller than the formally requested buffersize.
	 */
        toRead = chanPtr->bufSize;
        if (chanPtr->inQueueTail == NULL) {
            chanPtr->inQueueHead = bufPtr;
        } else {
            chanPtr->inQueueTail->nextPtr = bufPtr;
        }
        chanPtr->inQueueTail = bufPtr;

	toRead = bufPtr->bufLength - bufPtr->nextAdded;
	if (statePtr->inQueueTail == NULL) {
	    statePtr->inQueueHead = bufPtr;
	} else {
	    statePtr->inQueueTail->nextPtr = bufPtr;
	}
	statePtr->inQueueTail = bufPtr;
    }
      

    /*
     * If EOF is set, we should avoid calling the driver because on some
     * platforms it is impossible to read from a device after EOF.
     */

    if (chanPtr->flags & CHANNEL_EOF) {
    if (statePtr->flags & CHANNEL_EOF) {
	return 0;
    }

    if ((statePtr->flags & CHANNEL_TIMER_FEV) &&
	(statePtr->flags & CHANNEL_NONBLOCKING)) {
        nread = -1;
        result = EWOULDBLOCK;
    } else {
    nread = (*chanPtr->typePtr->inputProc)(chanPtr->instanceData,
	    bufPtr->buf + bufPtr->nextAdded, toRead, &result);
        nread = (chanPtr->typePtr->inputProc)(chanPtr->instanceData,
		    bufPtr->buf + bufPtr->nextAdded, toRead, &result);
    }

    if (nread > 0) {
	bufPtr->nextAdded += nread;

	/*
	 * If we get a short read, signal up that we may be BLOCKED. We
	 * should avoid calling the driver because on some platforms we
	 * will block in the low level reading code even though the
	 * channel is set into nonblocking mode.
	 */
            
	if (nread < toRead) {
	    chanPtr->flags |= CHANNEL_BLOCKED;
	    statePtr->flags |= CHANNEL_BLOCKED;
	}
    } else if (nread == 0) {
	chanPtr->flags |= CHANNEL_EOF;
	chanPtr->inputEncodingFlags |= TCL_ENCODING_END;
	statePtr->flags |= CHANNEL_EOF;
	statePtr->inputEncodingFlags |= TCL_ENCODING_END;
    } else if (nread < 0) {
	if ((result == EWOULDBLOCK) || (result == EAGAIN)) {
	    chanPtr->flags |= CHANNEL_BLOCKED;
	    statePtr->flags |= CHANNEL_BLOCKED;
	    result = EAGAIN;
	}
	Tcl_SetErrno(result);
	return result;
    } 
    }
    return 0;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_Seek --
4966
4967
4968
4969
4970
4971
4972
4973


4974
4975
4976
4977
4978
4979
4980
4981
4982
4983

4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994







4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013



5014
5015











5016
5017
5018



5019
5020
5021
5022
5023



5024
5025

5026
5027
5028
5029
5030
5031
5032
4868
4869
4870
4871
4872
4873
4874

4875
4876
4877
4878
4879
4880
4881
4882
4883
4884


4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895

4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918



4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934



4935
4936
4937
4938
4939



4940
4941
4942
4943

4944
4945
4946
4947
4948
4949
4950
4951







-
+
+








-
-
+










-
+
+
+
+
+
+
+
















-
-
-
+
+
+


+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+


-
-
-
+
+
+

-
+








int
Tcl_Seek(chan, offset, mode)
    Tcl_Channel chan;		/* The channel on which to seek. */
    int offset;			/* Offset to seek to. */
    int mode;			/* Relative to which location to seek? */
{
    Channel *chanPtr;		/* The real IO channel. */
    Channel *chanPtr = (Channel *) chan;	/* The real IO channel. */
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    ChannelBuffer *bufPtr;
    int inputBuffered, outputBuffered;
    int result;			/* Of device driver operations. */
    int curPos;			/* Position on the device. */
    int wasAsync;		/* Was the channel nonblocking before the
                                 * seek operation? If so, must restore to
                                 * nonblocking mode after the seek. */

    chanPtr = (Channel *) chan;
    if (CheckChannelErrors(chanPtr, TCL_WRITABLE | TCL_READABLE) != 0) {
    if (CheckChannelErrors(statePtr, TCL_WRITABLE | TCL_READABLE) != 0) {
	return -1;
    }

    /*
     * Disallow seek on dead channels -- channels that have been closed but
     * not yet been deallocated. Such channels can be found if the exit
     * handler for channel cleanup has run but the channel is still
     * registered in an interpreter.
     */

    if (CheckForDeadChannel(NULL,chanPtr)) return -1;
    if (CheckForDeadChannel(NULL, statePtr)) return -1;

    /*
     * This operation should occur at the top of a channel stack.
     */

    chanPtr = statePtr->topChanPtr;

    /*
     * Disallow seek on channels whose type does not have a seek procedure
     * defined. This means that the channel does not support seeking.
     */

    if (chanPtr->typePtr->seekProc == (Tcl_DriverSeekProc *) NULL) {
        Tcl_SetErrno(EINVAL);
        return -1;
    }

    /*
     * Compute how much input and output is buffered. If both input and
     * output is buffered, cannot compute the current position.
     */

    for (bufPtr = chanPtr->inQueueHead, inputBuffered = 0;
             bufPtr != (ChannelBuffer *) NULL;
             bufPtr = bufPtr->nextPtr) {
    for (bufPtr = statePtr->inQueueHead, inputBuffered = 0;
	 bufPtr != (ChannelBuffer *) NULL;
	 bufPtr = bufPtr->nextPtr) {
        inputBuffered += (bufPtr->nextAdded - bufPtr->nextRemoved);
    }

    /*
     * Don't forget the bytes in the topmost pushback area.
     */

    for (bufPtr = statePtr->topChanPtr->inQueueHead;
	 bufPtr != (ChannelBuffer *) NULL;
	 bufPtr = bufPtr->nextPtr) {
        inputBuffered += (bufPtr->nextAdded - bufPtr->nextRemoved);
    }

    for (bufPtr = chanPtr->outQueueHead, outputBuffered = 0;
             bufPtr != (ChannelBuffer *) NULL;
             bufPtr = bufPtr->nextPtr) {
    for (bufPtr = statePtr->outQueueHead, outputBuffered = 0;
	 bufPtr != (ChannelBuffer *) NULL;
	 bufPtr = bufPtr->nextPtr) {
        outputBuffered += (bufPtr->nextAdded - bufPtr->nextRemoved);
    }
    if ((chanPtr->curOutPtr != (ChannelBuffer *) NULL) &&
           (chanPtr->curOutPtr->nextAdded > chanPtr->curOutPtr->nextRemoved)) {
        chanPtr->flags |= BUFFER_READY;
    if ((statePtr->curOutPtr != (ChannelBuffer *) NULL) &&
	    (statePtr->curOutPtr->nextAdded > statePtr->curOutPtr->nextRemoved)) {
        statePtr->flags |= BUFFER_READY;
        outputBuffered +=
            (chanPtr->curOutPtr->nextAdded - chanPtr->curOutPtr->nextRemoved);
            (statePtr->curOutPtr->nextAdded - statePtr->curOutPtr->nextRemoved);
    }

    if ((inputBuffered != 0) && (outputBuffered != 0)) {
        Tcl_SetErrno(EFAULT);
        return -1;
    }

5040
5041
5042
5043
5044
5045
5046
5047

5048
5049
5050
5051
5052
5053
5054

5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065

5066
5067
5068
5069
5070

5071
5072

5073
5074
5075
5076
5077
5078





5079
5080
5081
5082
5083
5084
5085
4959
4960
4961
4962
4963
4964
4965

4966
4967
4968
4969
4970
4971
4972

4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983

4984
4985




4986


4987






4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999







-
+






-
+










-
+

-
-
-
-
+
-
-
+
-
-
-
-
-
-
+
+
+
+
+







    }

    /*
     * Discard any queued input - this input should not be read after
     * the seek.
     */

    DiscardInputQueued(chanPtr, 0);
    DiscardInputQueued(statePtr, 0);

    /*
     * Reset EOF and BLOCKED flags. We invalidate them by moving the
     * access point. Also clear CR related flags.
     */

    chanPtr->flags &=
    statePtr->flags &=
        (~(CHANNEL_EOF | CHANNEL_STICKY_EOF | CHANNEL_BLOCKED | INPUT_SAW_CR));
    
    /*
     * If the channel is in asynchronous output mode, switch it back
     * to synchronous mode and cancel any async flush that may be
     * scheduled. After the flush, the channel will be put back into
     * asynchronous output mode.
     */

    wasAsync = 0;
    if (chanPtr->flags & CHANNEL_NONBLOCKING) {
    if (statePtr->flags & CHANNEL_NONBLOCKING) {
        wasAsync = 1;
        result = 0;
        if (chanPtr->typePtr->blockModeProc != NULL) {
            result = (chanPtr->typePtr->blockModeProc) (chanPtr->instanceData,
                    TCL_MODE_BLOCKING);
        result = StackSetBlockMode(chanPtr, TCL_MODE_BLOCKING);
        }
        if (result != 0) {
	if (result != 0) {
            Tcl_SetErrno(result);
            return -1;
        }
        chanPtr->flags &= (~(CHANNEL_NONBLOCKING));
        if (chanPtr->flags & BG_FLUSH_SCHEDULED) {
            chanPtr->flags &= (~(BG_FLUSH_SCHEDULED));
	    return -1;
	}
        statePtr->flags &= (~(CHANNEL_NONBLOCKING));
        if (statePtr->flags & BG_FLUSH_SCHEDULED) {
            statePtr->flags &= (~(BG_FLUSH_SCHEDULED));
        }
    }
    
    /*
     * If the flush fails we cannot recover the original position. In
     * that case the seek is not attempted because we do not know where
     * the access position is - instead we return the error. FlushChannel
5107
5108
5109
5110
5111
5112
5113
5114

5115
5116
5117
5118

5119
5120

5121
5122
5123


5124
5125
5126
5127
5128
5129
5130
5021
5022
5023
5024
5025
5026
5027

5028




5029


5030



5031
5032
5033
5034
5035
5036
5037
5038
5039







-
+
-
-
-
-
+
-
-
+
-
-
-
+
+







     * Restore to nonblocking mode if that was the previous behavior.
     *
     * NOTE: Even if there was an async flush active we do not restore
     * it now because we already flushed all the queued output, above.
     */
    
    if (wasAsync) {
        chanPtr->flags |= CHANNEL_NONBLOCKING;
        statePtr->flags |= CHANNEL_NONBLOCKING;
        result = 0;
        if (chanPtr->typePtr->blockModeProc != NULL) {
            result = (chanPtr->typePtr->blockModeProc) (chanPtr->instanceData,
                    TCL_MODE_NONBLOCKING);
        result = StackSetBlockMode(chanPtr, TCL_MODE_NONBLOCKING);
        }
        if (result != 0) {
	if (result != 0) {
            Tcl_SetErrno(result);
            return -1;
        }
	    return -1;
	}
    }

    return curPos;
}

/*
 *----------------------------------------------------------------------
5145
5146
5147
5148
5149
5150
5151
5152


5153
5154
5155
5156
5157
5158
5159

5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170

5171
5172
5173






5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191



5192
5193
5194
5195
5196



5197
5198
5199
5200
5201



5202
5203

5204
5205
5206
5207
5208
5209
5210
5054
5055
5056
5057
5058
5059
5060

5061
5062
5063
5064
5065
5066
5067


5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078

5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103



5104
5105
5106
5107
5108



5109
5110
5111
5112
5113



5114
5115
5116
5117

5118
5119
5120
5121
5122
5123
5124
5125







-
+
+





-
-
+










-
+



+
+
+
+
+
+















-
-
-
+
+
+


-
-
-
+
+
+


-
-
-
+
+
+

-
+







 *----------------------------------------------------------------------
 */

int
Tcl_Tell(chan)
    Tcl_Channel chan;			/* The channel to return pos for. */
{
    Channel *chanPtr;			/* The actual channel to tell on. */
    Channel *chanPtr = (Channel *) chan;	/* The real IO channel. */
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    ChannelBuffer *bufPtr;
    int inputBuffered, outputBuffered;
    int result;				/* Of calling device driver. */
    int curPos;				/* Position on device. */

    chanPtr = (Channel *) chan;
    if (CheckChannelErrors(chanPtr, TCL_WRITABLE | TCL_READABLE) != 0) {
    if (CheckChannelErrors(statePtr, TCL_WRITABLE | TCL_READABLE) != 0) {
	return -1;
    }

    /*
     * Disallow tell on dead channels -- channels that have been closed but
     * not yet been deallocated. Such channels can be found if the exit
     * handler for channel cleanup has run but the channel is still
     * registered in an interpreter.
     */

    if (CheckForDeadChannel(NULL,chanPtr)) {
    if (CheckForDeadChannel(NULL, statePtr)) {
	return -1;
    }

    /*
     * This operation should occur at the top of a channel stack.
     */

    chanPtr = statePtr->topChanPtr;

    /*
     * Disallow tell on channels whose type does not have a seek procedure
     * defined. This means that the channel does not support seeking.
     */

    if (chanPtr->typePtr->seekProc == (Tcl_DriverSeekProc *) NULL) {
        Tcl_SetErrno(EINVAL);
        return -1;
    }

    /*
     * Compute how much input and output is buffered. If both input and
     * output is buffered, cannot compute the current position.
     */

    for (bufPtr = chanPtr->inQueueHead, inputBuffered = 0;
             bufPtr != (ChannelBuffer *) NULL;
             bufPtr = bufPtr->nextPtr) {
    for (bufPtr = statePtr->inQueueHead, inputBuffered = 0;
	 bufPtr != (ChannelBuffer *) NULL;
	 bufPtr = bufPtr->nextPtr) {
        inputBuffered += (bufPtr->nextAdded - bufPtr->nextRemoved);
    }
    for (bufPtr = chanPtr->outQueueHead, outputBuffered = 0;
             bufPtr != (ChannelBuffer *) NULL;
             bufPtr = bufPtr->nextPtr) {
    for (bufPtr = statePtr->outQueueHead, outputBuffered = 0;
	 bufPtr != (ChannelBuffer *) NULL;
	 bufPtr = bufPtr->nextPtr) {
        outputBuffered += (bufPtr->nextAdded - bufPtr->nextRemoved);
    }
    if ((chanPtr->curOutPtr != (ChannelBuffer *) NULL) &&
           (chanPtr->curOutPtr->nextAdded > chanPtr->curOutPtr->nextRemoved)) {
        chanPtr->flags |= BUFFER_READY;
    if ((statePtr->curOutPtr != (ChannelBuffer *) NULL) &&
	    (statePtr->curOutPtr->nextAdded > statePtr->curOutPtr->nextRemoved)) {
        statePtr->flags |= BUFFER_READY;
        outputBuffered +=
            (chanPtr->curOutPtr->nextAdded - chanPtr->curOutPtr->nextRemoved);
            (statePtr->curOutPtr->nextAdded - statePtr->curOutPtr->nextRemoved);
    }

    if ((inputBuffered != 0) && (outputBuffered != 0)) {
        Tcl_SetErrno(EFAULT);
        return -1;
    }

5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250






5251


5252
5253
5254
5255
5256
5257
5258














5259
5260
5261
5262
5263
5264
5265
5266

5267
5268
5269
5270
5271
5272




5273
5274
5275

5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289


5290
5291

5292
5293
5294
5295
5296
5297
5298
5155
5156
5157
5158
5159
5160
5161




5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174



5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195

5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208

5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221


5222
5223
5224

5225
5226
5227
5228
5229
5230
5231
5232







-
-
-
-
+
+
+
+
+
+

+
+




-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+







-
+






+
+
+
+


-
+












-
-
+
+

-
+







 * Side effects:
 *	May clear the EOF and/or BLOCKED bits if reading from channel.
 *
 *---------------------------------------------------------------------------
 */
 
static int
CheckChannelErrors(chanPtr, direction)
    Channel *chanPtr;	    /* Channel to check. */
    int direction;	    /* Test if channel supports desired operation:
			     * TCL_READABLE, TCL_WRITABLE. */
CheckChannelErrors(statePtr, flags)
    ChannelState *statePtr;	/* Channel to check. */
    int flags;			/* Test if channel supports desired operation:
				 * TCL_READABLE, TCL_WRITABLE.  Also indicates
				 * Raw read or write for special close
				 * processing*/
{
    int direction = flags & (TCL_READABLE|TCL_WRITABLE);

    /*
     * Check for unreported error.
     */

    if (chanPtr->unreportedError != 0) {
        Tcl_SetErrno(chanPtr->unreportedError);
        chanPtr->unreportedError = 0;
    if (statePtr->unreportedError != 0) {
        Tcl_SetErrno(statePtr->unreportedError);
        statePtr->unreportedError = 0;
        return -1;
    }

    /*
     * Only the raw read and write operations are allowed during close
     * in order to drain data from stacked channels.
     */

    if ((statePtr->flags & CHANNEL_CLOSED) &&
	    ((flags & CHANNEL_RAW_MODE) == 0)) {
        Tcl_SetErrno(EACCES);
        return -1;
    }

    /*
     * Fail if the channel is not opened for desired operation.
     */

    if ((chanPtr->flags & direction) == 0) {
    if ((statePtr->flags & direction) == 0) {
        Tcl_SetErrno(EACCES);
        return -1;
    }

    /*
     * Fail if the channel is in the middle of a background copy.
     *
     * Don't do this tests for raw channels here or else the chaining in the
     * transformation drivers will fail with 'file busy' error instead of
     * retrieving and transforming the data to copy.
     */

    if (chanPtr->csPtr != NULL) {
    if ((statePtr->csPtr != NULL) && ((flags & CHANNEL_RAW_MODE) == 0)) {
	Tcl_SetErrno(EBUSY);
	return -1;
    }

    if (direction == TCL_READABLE) {
	/*
	 * If we have not encountered a sticky EOF, clear the EOF bit
	 * (sticky EOF is set if we have seen the input eofChar, to prevent
	 * reading beyond the eofChar). Also, always clear the BLOCKED bit.
	 * We want to discover these conditions anew in each operation.
	 */
	
	if ((chanPtr->flags & CHANNEL_STICKY_EOF) == 0) {
	    chanPtr->flags &= ~CHANNEL_EOF;
	if ((statePtr->flags & CHANNEL_STICKY_EOF) == 0) {
	    statePtr->flags &= ~CHANNEL_EOF;
	}
	chanPtr->flags &= ~(CHANNEL_BLOCKED | CHANNEL_NEED_MORE_DATA);
	statePtr->flags &= ~(CHANNEL_BLOCKED | CHANNEL_NEED_MORE_DATA);
    }

    return 0;
}

/*
 *----------------------------------------------------------------------
5310
5311
5312
5313
5314
5315
5316

5317

5318
5319
5320
5321
5322



5323
5324
5325
5326
5327
5328
5329
5244
5245
5246
5247
5248
5249
5250
5251

5252
5253




5254
5255
5256
5257
5258
5259
5260
5261
5262
5263







+
-
+

-
-
-
-
+
+
+







 *----------------------------------------------------------------------
 */

int
Tcl_Eof(chan)
    Tcl_Channel chan;			/* Does this channel have EOF? */
{
    ChannelState *statePtr = ((Channel *) chan)->state;
    Channel *chanPtr;		/* The real channel structure. */
					/* State of real channel structure. */

    chanPtr = (Channel *) chan;
    return ((chanPtr->flags & CHANNEL_STICKY_EOF) ||
            ((chanPtr->flags & CHANNEL_EOF) && (Tcl_InputBuffered(chan) == 0)))
        ? 1 : 0;
    return ((statePtr->flags & CHANNEL_STICKY_EOF) ||
            ((statePtr->flags & CHANNEL_EOF) &&
		    (Tcl_InputBuffered(chan) == 0))) ? 1 : 0;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_InputBlocked --
 *
5338
5339
5340
5341
5342
5343
5344

5345

5346
5347
5348

5349
5350
5351
5352
5353
5354
5355
5356
5357

5358
5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372


5373

5374























5375
5376
5377
























5378
5379
5380


5381
5382

5383
5384
5385
5386
5387
5388
5389
5272
5273
5274
5275
5276
5277
5278
5279

5280
5281


5282
5283
5284
5285
5286
5287
5288
5289
5290

5291
5292
5293
5294
5295
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308

5309
5310
5311
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
5325
5326
5327
5328
5329
5330
5331
5332
5333



5334
5335
5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358


5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370







+
-
+

-
-
+








-
+















+
+
-
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

-
-
+
+


+







 *----------------------------------------------------------------------
 */

int
Tcl_InputBlocked(chan)
    Tcl_Channel chan;			/* Is this channel blocked? */
{
    ChannelState *statePtr = ((Channel *) chan)->state;
    Channel *chanPtr;		/* The real channel structure. */
					/* State of real channel structure. */

    chanPtr = (Channel *) chan;
    return (chanPtr->flags & CHANNEL_BLOCKED) ? 1 : 0;
    return (statePtr->flags & CHANNEL_BLOCKED) ? 1 : 0;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_InputBuffered --
 *
 *	Returns the number of bytes of input currently buffered in the
 *	internal buffer of a channel.
 *	common internal buffer of a channel.
 *
 * Results:
 *	The number of input bytes buffered, or zero if the channel is not
 *	open for reading.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

int
Tcl_InputBuffered(chan)
    Tcl_Channel chan;			/* The channel to query. */
{
    ChannelState *statePtr = ((Channel *) chan)->state;
					/* State of real channel structure. */
    Channel *chanPtr;
    ChannelBuffer *bufPtr;
    int bytesBuffered;

    for (bytesBuffered = 0, bufPtr = statePtr->inQueueHead;
	 bufPtr != (ChannelBuffer *) NULL;
	 bufPtr = bufPtr->nextPtr) {
        bytesBuffered += (bufPtr->nextAdded - bufPtr->nextRemoved);
    }

    /*
     * Don't forget the bytes in the topmost pushback area.
     */

    for (bufPtr = statePtr->topChanPtr->inQueueHead;
	 bufPtr != (ChannelBuffer *) NULL;
	 bufPtr = bufPtr->nextPtr) {
        bytesBuffered += (bufPtr->nextAdded - bufPtr->nextRemoved);
    }

    return bytesBuffered;
}

/*
 *----------------------------------------------------------------------
 *
    ChannelBuffer *bufPtr;

    chanPtr = (Channel *) chan;
 * Tcl_ChannelBuffered --
 *
 *	Returns the number of bytes of input currently buffered in the
 *	internal buffer (push back area) of a channel.
 *
 * Results:
 *	The number of input bytes buffered, or zero if the channel is not
 *	open for reading.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

int
Tcl_ChannelBuffered(chan)
    Tcl_Channel chan;			/* The channel to query. */
{
    Channel *chanPtr = (Channel *) chan;
					/* real channel structure. */
    ChannelBuffer *bufPtr;
    int bytesBuffered;

    for (bytesBuffered = 0, bufPtr = chanPtr->inQueueHead;
             bufPtr != (ChannelBuffer *) NULL;
             bufPtr = bufPtr->nextPtr) {
	 bufPtr != (ChannelBuffer *) NULL;
	 bufPtr = bufPtr->nextPtr) {
        bytesBuffered += (bufPtr->nextAdded - bufPtr->nextRemoved);
    }

    return bytesBuffered;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_SetChannelBufferSize --
5402
5403
5404
5405
5406
5407
5408
5409

5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424


5425
5426
5427
5428



5429
5430
5431
5432



5433
5434
5435
5436
5437
5438
5439
5383
5384
5385
5386
5387
5388
5389

5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
5400
5401
5402
5403


5404
5405
5406



5407
5408
5409
5410



5411
5412
5413
5414
5415
5416
5417
5418
5419
5420







-
+













-
-
+
+

-
-
-
+
+
+

-
-
-
+
+
+








void
Tcl_SetChannelBufferSize(chan, sz)
    Tcl_Channel chan;			/* The channel whose buffer size
                                         * to set. */
    int sz;				/* The size to set. */
{
    Channel *chanPtr;
    ChannelState *statePtr;		/* State of real channel structure. */
    
    /*
     * If the buffer size is smaller than 10 bytes or larger than one MByte,
     * do not accept the requested size and leave the current buffer size.
     */
    
    if (sz < 10) {
        return;
    }
    if (sz > (1024 * 1024)) {
        return;
    }

    chanPtr = (Channel *) chan;
    chanPtr->bufSize = sz;
    statePtr = ((Channel *) chan)->state;
    statePtr->bufSize = sz;

    if (chanPtr->outputStage != NULL) {
	ckfree((char *) chanPtr->outputStage);
	chanPtr->outputStage = NULL;
    if (statePtr->outputStage != NULL) {
	ckfree((char *) statePtr->outputStage);
	statePtr->outputStage = NULL;
    }
    if ((chanPtr->encoding != NULL) && (chanPtr->flags & TCL_WRITABLE)) {
	chanPtr->outputStage = (char *)
		ckalloc((unsigned) (chanPtr->bufSize + 2));
    if ((statePtr->encoding != NULL) && (statePtr->flags & TCL_WRITABLE)) {
	statePtr->outputStage = (char *)
	    ckalloc((unsigned) (statePtr->bufSize + 2));
    }
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_GetChannelBufferSize --
5450
5451
5452
5453
5454
5455
5456
5457


5458
5459
5460

5461
5462
5463
5464
5465
5466
5467
5431
5432
5433
5434
5435
5436
5437

5438
5439
5440


5441
5442
5443
5444
5445
5446
5447
5448







-
+
+

-
-
+







 */

int
Tcl_GetChannelBufferSize(chan)
    Tcl_Channel chan;		/* The channel for which to find the
                                 * buffer size. */
{
    Channel *chanPtr;
    ChannelState *statePtr = ((Channel *) chan)->state;
					/* State of real channel structure. */

    chanPtr = (Channel *) chan;
    return chanPtr->bufSize;
    return statePtr->bufSize;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_BadChannelOption --
 *
5496
5497
5498
5499
5500
5501
5502
5503

5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515

5516
5517
5518
5519
5520

5521
5522
5523
5524
5525
5526
5527
5477
5478
5479
5480
5481
5482
5483

5484
5485
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495

5496
5497
5498
5499
5500

5501
5502
5503
5504
5505
5506
5507
5508







-
+











-
+




-
+







					 * to the standard generic options.
					 * can be NULL for generic options 
					 * only.
					 */
{
    if (interp) {
	CONST char *genericopt = 
	    	"blocking buffering buffersize encoding eofchar translation";
	    "blocking buffering buffersize encoding eofchar translation";
	char **argv;
	int  argc, i;
	Tcl_DString ds;

	Tcl_DStringInit(&ds);
	Tcl_DStringAppend(&ds, (char *) genericopt, -1);
	if (optionList && (*optionList)) {
	    Tcl_DStringAppend(&ds, " ", 1);
	    Tcl_DStringAppend(&ds, optionList, -1);
	}
	if (Tcl_SplitList(interp, Tcl_DStringValue(&ds), 
	      	  &argc, &argv) != TCL_OK) {
		&argc, &argv) != TCL_OK) {
	    panic("malformed option list in channel driver");
	}
	Tcl_ResetResult(interp);
	Tcl_AppendResult(interp, "bad option \"", optionName, 
		 "\": should be one of ", (char *) NULL);
		"\": should be one of ", (char *) NULL);
	argc--;
	for (i = 0; i < argc; i++) {
	    Tcl_AppendResult(interp, "-", argv[i], ", ", (char *) NULL);
	}
	Tcl_AppendResult(interp, "or -", argv[i], (char *) NULL);
	Tcl_DStringFree(&ds);
	ckfree((char *) argv);
5556
5557
5558
5559
5560
5561
5562

5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586























5587
5588
5589
5590
5591
5592
5593
5537
5538
5539
5540
5541
5542
5543
5544
5545
5546














5547
5548
5549
5550
5551
5552
5553

5554
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583







+


-
-
-
-
-
-
-
-
-
-
-
-
-
-







-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







    Tcl_Channel chan;		/* Channel on which to get option. */
    char *optionName;		/* Option to get. */
    Tcl_DString *dsPtr;		/* Where to store value(s). */
{
    size_t len;			/* Length of optionName string. */
    char optionVal[128];	/* Buffer for sprintf. */
    Channel *chanPtr = (Channel *) chan;
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    int flags;

    /*
     * If we are in the middle of a background copy, use the saved flags.
     */

    if (chanPtr->csPtr) {
	if (chanPtr == chanPtr->csPtr->readPtr) {
	    flags = chanPtr->csPtr->readFlags;
	} else {
	    flags = chanPtr->csPtr->writeFlags;
	}
    } else {
	flags = chanPtr->flags;
    }

    /*
     * Disallow options on dead channels -- channels that have been closed but
     * not yet been deallocated. Such channels can be found if the exit
     * handler for channel cleanup has run but the channel is still
     * registered in an interpreter.
     */

    if (CheckForDeadChannel(interp,chanPtr)) return TCL_ERROR;
    if (CheckForDeadChannel(interp, statePtr)) {
	return TCL_ERROR;
    }

    /*
     * This operation should occur at the top of a channel stack.
     */

    chanPtr = statePtr->topChanPtr;

    /*
     * If we are in the middle of a background copy, use the saved flags.
     */

    if (statePtr->csPtr) {
	if (chanPtr == statePtr->csPtr->readPtr) {
	    flags = statePtr->csPtr->readFlags;
	} else {
	    flags = statePtr->csPtr->writeFlags;
	}
    } else {
	flags = statePtr->flags;
    }

    /*
     * If the optionName is NULL it means that we want a list of all
     * options and values.
     */
    
    if (optionName == (char *) NULL) {
5624
5625
5626
5627
5628
5629
5630
5631

5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642
5643

5644
5645
5646
5647

5648
5649
5650
5651
5652
5653
5654
5655
5656
5657
5658
5659
5660
5661
5662
5663
5664

5665
5666
5667
5668
5669

5670
5671
5672
5673
5674

5675
5676
5677
5678
5679

5680
5681




5682
5683
5684
5685
5686
5687
5688
5689
5690
5691
5692
5693
5694
5695
5696
5697
5698
5699
5700
5701
5702

5703
5704

5705
5706

5707
5708
5709
5710
5711
5712
5713

5714
5715

5716
5717

5718
5719
5720
5721




5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
5735
5736
5737
5738

5739
5740
5741
5742
5743
5744
5745
5614
5615
5616
5617
5618
5619
5620

5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
5632

5633
5634
5635
5636

5637
5638
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653

5654
5655
5656
5657
5658

5659
5660
5661
5662
5663

5664
5665
5666
5667
5668

5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688
5689
5690
5691
5692
5693
5694
5695

5696
5697

5698
5699

5700
5701
5702
5703
5704
5705
5706

5707
5708

5709
5710

5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
5735

5736
5737
5738
5739
5740
5741
5742
5743







-
+











-
+



-
+
















-
+




-
+




-
+




-
+


+
+
+
+




















-
+

-
+

-
+






-
+

-
+

-
+




+
+
+
+
















-
+







        }
    }
    if ((len == 0) || ((len > 7) && (optionName[1] == 'b') &&
            (strncmp(optionName, "-buffersize", len) == 0))) {
        if (len == 0) {
            Tcl_DStringAppendElement(dsPtr, "-buffersize");
        }
        TclFormatInt(optionVal, chanPtr->bufSize);
        TclFormatInt(optionVal, statePtr->bufSize);
        Tcl_DStringAppendElement(dsPtr, optionVal);
        if (len > 0) {
            return TCL_OK;
        }
    }
    if ((len == 0) ||
	    ((len > 2) && (optionName[1] == 'e') &&
		    (strncmp(optionName, "-encoding", len) == 0))) {
	if (len == 0) {
	    Tcl_DStringAppendElement(dsPtr, "-encoding");
	}
	if (chanPtr->encoding == NULL) {
	if (statePtr->encoding == NULL) {
	    Tcl_DStringAppendElement(dsPtr, "binary");
	} else {
	    Tcl_DStringAppendElement(dsPtr,
		    Tcl_GetEncodingName(chanPtr->encoding));
		    Tcl_GetEncodingName(statePtr->encoding));
	}
	if (len > 0) {
	    return TCL_OK;
	}
    }
    if ((len == 0) ||
            ((len > 2) && (optionName[1] == 'e') &&
                    (strncmp(optionName, "-eofchar", len) == 0))) {
        if (len == 0) {
            Tcl_DStringAppendElement(dsPtr, "-eofchar");
        }
        if (((flags & (TCL_READABLE|TCL_WRITABLE)) ==
                (TCL_READABLE|TCL_WRITABLE)) && (len == 0)) {
            Tcl_DStringStartSublist(dsPtr);
        }
        if (flags & TCL_READABLE) {
            if (chanPtr->inEofChar == 0) {
            if (statePtr->inEofChar == 0) {
                Tcl_DStringAppendElement(dsPtr, "");
            } else {
                char buf[4];

                sprintf(buf, "%c", chanPtr->inEofChar);
                sprintf(buf, "%c", statePtr->inEofChar);
                Tcl_DStringAppendElement(dsPtr, buf);
            }
        }
        if (flags & TCL_WRITABLE) {
            if (chanPtr->outEofChar == 0) {
            if (statePtr->outEofChar == 0) {
                Tcl_DStringAppendElement(dsPtr, "");
            } else {
                char buf[4];

                sprintf(buf, "%c", chanPtr->outEofChar);
                sprintf(buf, "%c", statePtr->outEofChar);
                Tcl_DStringAppendElement(dsPtr, buf);
            }
        }
        if ( !(flags & (TCL_READABLE|TCL_WRITABLE))) {
            /* Not readable or writable (server socket) */
            Tcl_DStringAppendElement(dsPtr, "");
        }
        if (((flags & (TCL_READABLE|TCL_WRITABLE)) ==
                (TCL_READABLE|TCL_WRITABLE)) && (len == 0)) {
            Tcl_DStringEndSublist(dsPtr);
        }
        if (len > 0) {
            return TCL_OK;
        }
    }
    if ((len == 0) ||
            ((len > 1) && (optionName[1] == 't') &&
                    (strncmp(optionName, "-translation", len) == 0))) {
        if (len == 0) {
            Tcl_DStringAppendElement(dsPtr, "-translation");
        }
        if (((flags & (TCL_READABLE|TCL_WRITABLE)) ==
                (TCL_READABLE|TCL_WRITABLE)) && (len == 0)) {
            Tcl_DStringStartSublist(dsPtr);
        }
        if (flags & TCL_READABLE) {
            if (chanPtr->inputTranslation == TCL_TRANSLATE_AUTO) {
            if (statePtr->inputTranslation == TCL_TRANSLATE_AUTO) {
                Tcl_DStringAppendElement(dsPtr, "auto");
            } else if (chanPtr->inputTranslation == TCL_TRANSLATE_CR) {
            } else if (statePtr->inputTranslation == TCL_TRANSLATE_CR) {
                Tcl_DStringAppendElement(dsPtr, "cr");
            } else if (chanPtr->inputTranslation == TCL_TRANSLATE_CRLF) {
            } else if (statePtr->inputTranslation == TCL_TRANSLATE_CRLF) {
                Tcl_DStringAppendElement(dsPtr, "crlf");
            } else {
                Tcl_DStringAppendElement(dsPtr, "lf");
            }
        }
        if (flags & TCL_WRITABLE) {
            if (chanPtr->outputTranslation == TCL_TRANSLATE_AUTO) {
            if (statePtr->outputTranslation == TCL_TRANSLATE_AUTO) {
                Tcl_DStringAppendElement(dsPtr, "auto");
            } else if (chanPtr->outputTranslation == TCL_TRANSLATE_CR) {
            } else if (statePtr->outputTranslation == TCL_TRANSLATE_CR) {
                Tcl_DStringAppendElement(dsPtr, "cr");
            } else if (chanPtr->outputTranslation == TCL_TRANSLATE_CRLF) {
            } else if (statePtr->outputTranslation == TCL_TRANSLATE_CRLF) {
                Tcl_DStringAppendElement(dsPtr, "crlf");
            } else {
                Tcl_DStringAppendElement(dsPtr, "lf");
            }
        }
        if ( !(flags & (TCL_READABLE|TCL_WRITABLE))) {
            /* Not readable or writable (server socket) */
            Tcl_DStringAppendElement(dsPtr, "auto");
        }
        if (((flags & (TCL_READABLE|TCL_WRITABLE)) ==
                (TCL_READABLE|TCL_WRITABLE)) && (len == 0)) {
            Tcl_DStringEndSublist(dsPtr);
        }
        if (len > 0) {
            return TCL_OK;
        }
    }
    if (chanPtr->typePtr->getOptionProc != (Tcl_DriverGetOptionProc *) NULL) {
	/*
	 * let the driver specific handle additional options
	 * and result code and message.
	 */

        return (chanPtr->typePtr->getOptionProc) (chanPtr->instanceData,
		  interp, optionName, dsPtr);
		interp, optionName, dsPtr);
    } else {
	/*
	 * no driver specific options case.
	 */

        if (len == 0) {
            return TCL_OK;
5769
5770
5771
5772
5773
5774
5775
5776


5777
5778
5779
5780
5781
5782
5783
5784
5785
5786
5787

5788
5789
5790
5791


5792
5793
5794
5795
5796
5797
5798
5799
5800
5801
5802
5803
5804
5805










5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823

5824
5825
5826
5827
5828


5829
5830
5831
5832


5833
5834
5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846



5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866







5867
5868
5869
5870
5871
5872
5873
5874
5875


5876
5877
5878


5879
5880
5881


5882
5883
5884
5885
5886
5887


5888
5889
5890
5891
5892
5893


5894
5895
5896


5897
5898
5899
5900
5901
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911
5912
5913


5914
5915
5916


5917
5918
5919
5920
5921
5922
5923
5924
5925
5926
5927
5928
5929

5930
5931
5932
5933
5934
5935
5936



5937
5938
5939
5940
5941
5942
5943
5767
5768
5769
5770
5771
5772
5773

5774
5775
5776
5777
5778


5779
5780
5781
5782
5783

5784
5785
5786


5787
5788
5789
5790
5791

5792
5793
5794
5795
5796
5797
5798
5799


5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826

5827
5828
5829
5830


5831
5832
5833
5834


5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847



5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863







5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875
5876
5877


5878
5879
5880


5881
5882
5883


5884
5885
5886
5887
5888
5889


5890
5891
5892
5893
5894
5895


5896
5897
5898


5899
5900
5901
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911
5912
5913
5914
5915


5916
5917
5918


5919
5920
5921
5922
5923
5924
5925
5926
5927
5928
5929
5930
5931
5932

5933
5934
5935
5936
5937



5938
5939
5940
5941
5942
5943
5944
5945
5946
5947







-
+
+



-
-





-
+


-
-
+
+



-








-
-
+
+
+
+
+
+
+
+
+
+

















-
+



-
-
+
+


-
-
+
+











-
-
-
+
+
+













-
-
-
-
-
-
-
+
+
+
+
+
+
+







-
-
+
+

-
-
+
+

-
-
+
+




-
-
+
+




-
-
+
+

-
-
+
+















-
-
+
+

-
-
+
+












-
+




-
-
-
+
+
+







Tcl_SetChannelOption(interp, chan, optionName, newValue)
    Tcl_Interp *interp;		/* For error reporting - can be NULL. */
    Tcl_Channel chan;		/* Channel on which to set mode. */
    char *optionName;		/* Which option to set? */
    char *newValue;		/* New value for option. */
{
    int newMode;		/* New (numeric) mode to sert. */
    Channel *chanPtr;		/* The real IO channel. */
    Channel *chanPtr = (Channel *) chan;	/* The real IO channel. */
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    size_t len;			/* Length of optionName string. */
    int argc;
    char **argv;
    
    chanPtr = (Channel *) chan;

    /*
     * If the channel is in the middle of a background copy, fail.
     */

    if (chanPtr->csPtr) {
    if (statePtr->csPtr) {
	if (interp) {
	    Tcl_AppendResult(interp,
	         "unable to set channel options: background copy in progress",
		 (char *) NULL);
		    "unable to set channel options: background copy in progress",
		    (char *) NULL);
	}
        return TCL_ERROR;
    }


    /*
     * Disallow options on dead channels -- channels that have been closed but
     * not yet been deallocated. Such channels can be found if the exit
     * handler for channel cleanup has run but the channel is still
     * registered in an interpreter.
     */

    if (CheckForDeadChannel(NULL,chanPtr)) return TCL_ERROR;
    
    if (CheckForDeadChannel(NULL, statePtr)) {
	return TCL_ERROR;
    }

    /*
     * This operation should occur at the top of a channel stack.
     */

    chanPtr = statePtr->topChanPtr;

    len = strlen(optionName);

    if ((len > 2) && (optionName[1] == 'b') &&
            (strncmp(optionName, "-blocking", len) == 0)) {
        if (Tcl_GetBoolean(interp, newValue, &newMode) == TCL_ERROR) {
            return TCL_ERROR;
        }
        if (newMode) {
            newMode = TCL_MODE_BLOCKING;
        } else {
            newMode = TCL_MODE_NONBLOCKING;
        }
	return SetBlockMode(interp, chanPtr, newMode);
    } else if ((len > 7) && (optionName[1] == 'b') &&
            (strncmp(optionName, "-buffering", len) == 0)) {
        len = strlen(newValue);
        if ((newValue[0] == 'f') && (strncmp(newValue, "full", len) == 0)) {
            chanPtr->flags &=
            statePtr->flags &=
                (~(CHANNEL_UNBUFFERED|CHANNEL_LINEBUFFERED));
        } else if ((newValue[0] == 'l') &&
                (strncmp(newValue, "line", len) == 0)) {
            chanPtr->flags &= (~(CHANNEL_UNBUFFERED));
            chanPtr->flags |= CHANNEL_LINEBUFFERED;
            statePtr->flags &= (~(CHANNEL_UNBUFFERED));
            statePtr->flags |= CHANNEL_LINEBUFFERED;
        } else if ((newValue[0] == 'n') &&
                (strncmp(newValue, "none", len) == 0)) {
            chanPtr->flags &= (~(CHANNEL_LINEBUFFERED));
            chanPtr->flags |= CHANNEL_UNBUFFERED;
            statePtr->flags &= (~(CHANNEL_LINEBUFFERED));
            statePtr->flags |= CHANNEL_UNBUFFERED;
        } else {
            if (interp) {
                Tcl_AppendResult(interp, "bad value for -buffering: ",
                        "must be one of full, line, or none",
                        (char *) NULL);
                return TCL_ERROR;
            }
        }
	return TCL_OK;
    } else if ((len > 7) && (optionName[1] == 'b') &&
            (strncmp(optionName, "-buffersize", len) == 0)) {
        chanPtr->bufSize = atoi(newValue);	/* INTL: "C", UTF safe. */
        if ((chanPtr->bufSize < 10) || (chanPtr->bufSize > (1024 * 1024))) {
            chanPtr->bufSize = CHANNELBUFFER_DEFAULT_SIZE;
        statePtr->bufSize = atoi(newValue);	/* INTL: "C", UTF safe. */
        if ((statePtr->bufSize < 10) || (statePtr->bufSize > (1024 * 1024))) {
            statePtr->bufSize = CHANNELBUFFER_DEFAULT_SIZE;
        }
    } else if ((len > 2) && (optionName[1] == 'e') &&
	    (strncmp(optionName, "-encoding", len) == 0)) {
	Tcl_Encoding encoding;

	if ((newValue[0] == '\0') || (strcmp(newValue, "binary") == 0)) {
	    encoding = NULL;
	} else {
	    encoding = Tcl_GetEncoding(interp, newValue);
	    if (encoding == NULL) {
		return TCL_ERROR;
	    }
	}
	Tcl_FreeEncoding(chanPtr->encoding);
	chanPtr->encoding = encoding;
	chanPtr->inputEncodingState = NULL;
	chanPtr->inputEncodingFlags = TCL_ENCODING_START;
	chanPtr->outputEncodingState = NULL;
	chanPtr->outputEncodingFlags = TCL_ENCODING_START;
	chanPtr->flags &= ~CHANNEL_NEED_MORE_DATA;
	Tcl_FreeEncoding(statePtr->encoding);
	statePtr->encoding = encoding;
	statePtr->inputEncodingState = NULL;
	statePtr->inputEncodingFlags = TCL_ENCODING_START;
	statePtr->outputEncodingState = NULL;
	statePtr->outputEncodingFlags = TCL_ENCODING_START;
	statePtr->flags &= ~CHANNEL_NEED_MORE_DATA;
	UpdateInterest(chanPtr);
    } else if ((len > 2) && (optionName[1] == 'e') &&
            (strncmp(optionName, "-eofchar", len) == 0)) {
        if (Tcl_SplitList(interp, newValue, &argc, &argv) == TCL_ERROR) {
            return TCL_ERROR;
        }
        if (argc == 0) {
            chanPtr->inEofChar = 0;
            chanPtr->outEofChar = 0;
            statePtr->inEofChar = 0;
            statePtr->outEofChar = 0;
        } else if (argc == 1) {
            if (chanPtr->flags & TCL_WRITABLE) {
                chanPtr->outEofChar = (int) argv[0][0];
            if (statePtr->flags & TCL_WRITABLE) {
                statePtr->outEofChar = (int) argv[0][0];
            }
            if (chanPtr->flags & TCL_READABLE) {
                chanPtr->inEofChar = (int) argv[0][0];
            if (statePtr->flags & TCL_READABLE) {
                statePtr->inEofChar = (int) argv[0][0];
            }
        } else if (argc != 2) {
            if (interp) {
                Tcl_AppendResult(interp,
                        "bad value for -eofchar: should be a list of one or",
                        " two elements", (char *) NULL);
                        "bad value for -eofchar: should be a list of zero,",
                        " one, or two elements", (char *) NULL);
            }
            ckfree((char *) argv);
            return TCL_ERROR;
        } else {
            if (chanPtr->flags & TCL_READABLE) {
                chanPtr->inEofChar = (int) argv[0][0];
            if (statePtr->flags & TCL_READABLE) {
                statePtr->inEofChar = (int) argv[0][0];
            }
            if (chanPtr->flags & TCL_WRITABLE) {
                chanPtr->outEofChar = (int) argv[1][0];
            if (statePtr->flags & TCL_WRITABLE) {
                statePtr->outEofChar = (int) argv[1][0];
            }
        }
        if (argv != (char **) NULL) {
            ckfree((char *) argv);
        }
	return TCL_OK;
    } else if ((len > 1) && (optionName[1] == 't') &&
            (strncmp(optionName, "-translation", len) == 0)) {
	char *readMode, *writeMode;

        if (Tcl_SplitList(interp, newValue, &argc, &argv) == TCL_ERROR) {
            return TCL_ERROR;
        }

        if (argc == 1) {
	    readMode = (chanPtr->flags & TCL_READABLE) ? argv[0] : NULL;
	    writeMode = (chanPtr->flags & TCL_WRITABLE) ? argv[0] : NULL;
	    readMode = (statePtr->flags & TCL_READABLE) ? argv[0] : NULL;
	    writeMode = (statePtr->flags & TCL_WRITABLE) ? argv[0] : NULL;
	} else if (argc == 2) {
	    readMode = (chanPtr->flags & TCL_READABLE) ? argv[0] : NULL;
	    writeMode = (chanPtr->flags & TCL_WRITABLE) ? argv[1] : NULL;
	    readMode = (statePtr->flags & TCL_READABLE) ? argv[0] : NULL;
	    writeMode = (statePtr->flags & TCL_WRITABLE) ? argv[1] : NULL;
	} else {
            if (interp) {
                Tcl_AppendResult(interp,
                        "bad value for -translation: must be a one or two",
                        " element list", (char *) NULL);
            }
            ckfree((char *) argv);
            return TCL_ERROR;
	}

	if (readMode) {
	    if (*readMode == '\0') {
		newMode = chanPtr->inputTranslation;
		newMode = statePtr->inputTranslation;
	    } else if (strcmp(readMode, "auto") == 0) {
		newMode = TCL_TRANSLATE_AUTO;
	    } else if (strcmp(readMode, "binary") == 0) {
		newMode = TCL_TRANSLATE_LF;
		chanPtr->inEofChar = 0;
		Tcl_FreeEncoding(chanPtr->encoding);		    
		chanPtr->encoding = NULL;
		statePtr->inEofChar = 0;
		Tcl_FreeEncoding(statePtr->encoding);		    
		statePtr->encoding = NULL;
	    } else if (strcmp(readMode, "lf") == 0) {
		newMode = TCL_TRANSLATE_LF;
	    } else if (strcmp(readMode, "cr") == 0) {
		newMode = TCL_TRANSLATE_CR;
	    } else if (strcmp(readMode, "crlf") == 0) {
		newMode = TCL_TRANSLATE_CRLF;
	    } else if (strcmp(readMode, "platform") == 0) {
5955
5956
5957
5958
5959
5960
5961
5962
5963
5964
5965




5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979
5980
5981


5982
5983

5984
5985
5986
5987
5988
5989




5990
5991

5992
5993

5994
5995

5996
5997

5998
5999
6000
6001
6002
6003
6004
5959
5960
5961
5962
5963
5964
5965




5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983


5984
5985
5986

5987
5988
5989




5990
5991
5992
5993
5994

5995
5996

5997
5998

5999
6000

6001
6002
6003
6004
6005
6006
6007
6008







-
-
-
-
+
+
+
+














-
-
+
+

-
+


-
-
-
-
+
+
+
+

-
+

-
+

-
+

-
+








	    /*
	     * Reset the EOL flags since we need to look at any buffered
	     * data to see if the new translation mode allows us to
	     * complete the line.
	     */

	    if (newMode != chanPtr->inputTranslation) {
		chanPtr->inputTranslation = (Tcl_EolTranslation) newMode;
		chanPtr->flags &= ~(INPUT_SAW_CR);
		chanPtr->flags &= ~(CHANNEL_NEED_MORE_DATA);
	    if (newMode != statePtr->inputTranslation) {
		statePtr->inputTranslation = (Tcl_EolTranslation) newMode;
		statePtr->flags &= ~(INPUT_SAW_CR);
		statePtr->flags &= ~(CHANNEL_NEED_MORE_DATA);
		UpdateInterest(chanPtr);
	    }
	}
	if (writeMode) {
	    if (*writeMode == '\0') {
		/* Do nothing. */
	    } else if (strcmp(writeMode, "auto") == 0) {
		/*
		 * This is a hack to get TCP sockets to produce output
		 * in CRLF mode if they are being set into AUTO mode.
		 * A better solution for achieving this effect will be
		 * coded later.
		 */

		if (strcmp(chanPtr->typePtr->typeName, "tcp") == 0) {
		    chanPtr->outputTranslation = TCL_TRANSLATE_CRLF;
		if (strcmp(Tcl_ChannelName(chanPtr->typePtr), "tcp") == 0) {
		    statePtr->outputTranslation = TCL_TRANSLATE_CRLF;
		} else {
		    chanPtr->outputTranslation = TCL_PLATFORM_TRANSLATION;
		    statePtr->outputTranslation = TCL_PLATFORM_TRANSLATION;
		}
	    } else if (strcmp(writeMode, "binary") == 0) {
		chanPtr->outEofChar = 0;
		chanPtr->outputTranslation = TCL_TRANSLATE_LF;
		Tcl_FreeEncoding(chanPtr->encoding);		    
		chanPtr->encoding = NULL;
		statePtr->outEofChar = 0;
		statePtr->outputTranslation = TCL_TRANSLATE_LF;
		Tcl_FreeEncoding(statePtr->encoding);		    
		statePtr->encoding = NULL;
	    } else if (strcmp(writeMode, "lf") == 0) {
		chanPtr->outputTranslation = TCL_TRANSLATE_LF;
		statePtr->outputTranslation = TCL_TRANSLATE_LF;
	    } else if (strcmp(writeMode, "cr") == 0) {
		chanPtr->outputTranslation = TCL_TRANSLATE_CR;
		statePtr->outputTranslation = TCL_TRANSLATE_CR;
	    } else if (strcmp(writeMode, "crlf") == 0) {
		chanPtr->outputTranslation = TCL_TRANSLATE_CRLF;
		statePtr->outputTranslation = TCL_TRANSLATE_CRLF;
	    } else if (strcmp(writeMode, "platform") == 0) {
		chanPtr->outputTranslation = TCL_PLATFORM_TRANSLATION;
		statePtr->outputTranslation = TCL_PLATFORM_TRANSLATION;
	    } else {
		if (interp) {
		    Tcl_AppendResult(interp,
			    "bad value for -translation: ",
			    "must be one of auto, binary, cr, lf, crlf,",
			    " or platform", (char *) NULL);
		}
6015
6016
6017
6018
6019
6020
6021
6022
6023
6024



6025
6026
6027
6028
6029
6030
6031
6032







6033
6034
6035
6036
6037
6038
6039
6040
6041
6042



6043
6044
6045
6046



6047
6048
6049
6050
6051
6052
6053
6019
6020
6021
6022
6023
6024
6025



6026
6027
6028
6029







6030
6031
6032
6033
6034
6035
6036
6037
6038
6039
6040
6041
6042
6043



6044
6045
6046
6047



6048
6049
6050
6051
6052
6053
6054
6055
6056
6057







-
-
-
+
+
+

-
-
-
-
-
-
-
+
+
+
+
+
+
+







-
-
-
+
+
+

-
-
-
+
+
+







	return Tcl_BadChannelOption(interp, optionName, (char *) NULL);
    }

    /*
     * If bufsize changes, need to get rid of old utility buffer.
     */

    if (chanPtr->saveInBufPtr != NULL) {
	RecycleBuffer(chanPtr, chanPtr->saveInBufPtr, 1);
	chanPtr->saveInBufPtr = NULL;
    if (statePtr->saveInBufPtr != NULL) {
	RecycleBuffer(statePtr, statePtr->saveInBufPtr, 1);
	statePtr->saveInBufPtr = NULL;
    }
    if (chanPtr->inQueueHead != NULL) {
	if ((chanPtr->inQueueHead->nextPtr == NULL)
		&& (chanPtr->inQueueHead->nextAdded ==
			chanPtr->inQueueHead->nextRemoved)) {
	    RecycleBuffer(chanPtr, chanPtr->inQueueHead, 1);
	    chanPtr->inQueueHead = NULL;
	    chanPtr->inQueueTail = NULL;
    if (statePtr->inQueueHead != NULL) {
	if ((statePtr->inQueueHead->nextPtr == NULL)
		&& (statePtr->inQueueHead->nextAdded ==
			statePtr->inQueueHead->nextRemoved)) {
	    RecycleBuffer(statePtr, statePtr->inQueueHead, 1);
	    statePtr->inQueueHead = NULL;
	    statePtr->inQueueTail = NULL;
	}
    }

    /*
     * If encoding or bufsize changes, need to update output staging buffer.
     */

    if (chanPtr->outputStage != NULL) {
	ckfree((char *) chanPtr->outputStage);
	chanPtr->outputStage = NULL;
    if (statePtr->outputStage != NULL) {
	ckfree((char *) statePtr->outputStage);
	statePtr->outputStage = NULL;
    }
    if ((chanPtr->encoding != NULL) && (chanPtr->flags & TCL_WRITABLE)) {
	chanPtr->outputStage = (char *) 
		ckalloc((unsigned) (chanPtr->bufSize + 2));
    if ((statePtr->encoding != NULL) && (statePtr->flags & TCL_WRITABLE)) {
	statePtr->outputStage = (char *) 
	    ckalloc((unsigned) (statePtr->bufSize + 2));
    }
    return TCL_OK;
}

/*
 *----------------------------------------------------------------------
 *
6069
6070
6071
6072
6073
6074
6075

6076
6077
6078
6079
6080
6081
6082
6083

6084
6085
6086


6087
6088
6089
6090

6091
6092
6093
6094
6095
6096

6097
6098
6099
6100
6101
6102
6103
6073
6074
6075
6076
6077
6078
6079
6080
6081
6082
6083
6084
6085
6086
6087

6088
6089


6090
6091
6092
6093
6094

6095
6096
6097
6098
6099
6100

6101
6102
6103
6104
6105
6106
6107
6108







+







-
+

-
-
+
+



-
+





-
+







 */

static void
CleanupChannelHandlers(interp, chanPtr)
    Tcl_Interp *interp;
    Channel *chanPtr;
{
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    EventScriptRecord *sPtr, *prevPtr, *nextPtr;

    /*
     * Remove fileevent records on this channel that refer to the
     * given interpreter.
     */
    
    for (sPtr = chanPtr->scriptRecordPtr,
    for (sPtr = statePtr->scriptRecordPtr,
             prevPtr = (EventScriptRecord *) NULL;
             sPtr != (EventScriptRecord *) NULL;
             sPtr = nextPtr) {
	 sPtr != (EventScriptRecord *) NULL;
	 sPtr = nextPtr) {
        nextPtr = sPtr->nextPtr;
        if (sPtr->interp == interp) {
            if (prevPtr == (EventScriptRecord *) NULL) {
                chanPtr->scriptRecordPtr = nextPtr;
                statePtr->scriptRecordPtr = nextPtr;
            } else {
                prevPtr->nextPtr = nextPtr;
            }

            Tcl_DeleteChannelHandler((Tcl_Channel) chanPtr,
                    ChannelEventScriptInvoker, (ClientData) sPtr);
                    TclChannelEventScriptInvoker, (ClientData) sPtr);

	    Tcl_DecrRefCount(sPtr->scriptPtr);
            ckfree((char *) sPtr);
        } else {
            prevPtr = sPtr;
        }
    }
6126
6127
6128
6129
6130
6131
6132

6133
6134
6135


6136











6137
6138




















6139


6140
6141
6142
6143


















6144
6145


6146
6147
6148
6149
6150
6151
6152






6153
6154
6155
6156
6157




6158
6159
6160
6161
6162




6163
6164
6165
6166
6167
6168





6169
6170
6171
6172
6173




6174
6175
6176
6177
6178
6179
6180
6181
6182








6183
6184
6185
6186
6187
6188





6189
6190
6191
6192



6193
6194
6195
6196
6197
6198
6199
6200
6201
6202



6203
6204

6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6131
6132
6133
6134
6135
6136
6137
6138
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155


6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178




6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197

6198
6199
6200






6201
6202
6203
6204
6205
6206
6207




6208
6209
6210
6211
6212




6213
6214
6215
6216
6217





6218
6219
6220
6221
6222
6223




6224
6225
6226
6227
6228








6229
6230
6231
6232
6233
6234
6235
6236
6237





6238
6239
6240
6241
6242
6243



6244
6245
6246










6247
6248
6249
6250

6251



6252
6253
6254
6255
6256
6257
6258







+



+
+

+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

-
+
+

-
-
-
-
-
-
+
+
+
+
+
+

-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
-
-
-
-
+
+
+
+
+

-
-
-
-
+
+
+
+

-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+

-
-
-
-
-
+
+
+
+
+

-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+

-
+
-
-
-







Tcl_NotifyChannel(channel, mask)
    Tcl_Channel channel;	/* Channel that detected an event. */
    int mask;			/* OR'ed combination of TCL_READABLE,
				 * TCL_WRITABLE, or TCL_EXCEPTION: indicates
				 * which events were detected. */
{
    Channel *chanPtr = (Channel *) channel;
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    ChannelHandler *chPtr;
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
    NextChannelHandler nh;
    Channel* upChanPtr;
    Tcl_ChannelType* upTypePtr;

    /*
     * In contrast to the other API functions this procedure walks towards
     * the top of a stack and not down from it.
     *
     * The channel calling this procedure is the one who generated the event,
     * and thus does not take part in handling it. IOW, its HandlerProc is
     * not called, instead we begin with the channel above it.
     *
     * This behaviour also allows the transformation channels to
     * generate their own events and pass them upward.
     */
    /* Walk all channels in a stack ! and notify them in order.
     */

    while (mask && (chanPtr->upChanPtr != ((Channel*) NULL))) {
        upChanPtr = chanPtr->upChanPtr;
	upTypePtr = upChanPtr->typePtr;

	if ((Tcl_ChannelVersion(upTypePtr) == TCL_CHANNEL_VERSION_2) &&
		(Tcl_ChannelHandlerProc(upTypePtr) !=
			((Tcl_DriverHandlerProc *) NULL))) {

	    Tcl_DriverHandlerProc* handlerProc =
		Tcl_ChannelHandlerProc(upTypePtr);

	  mask = (*handlerProc) (upChanPtr->instanceData, mask);
	}

	/* ELSE:
	 * Ignore transformations which are unable to handle the event
	 * coming from below. Assume that they don't change the mask and
	 * pass it on.
	 */

	chanPtr = upChanPtr;
    }
    while (chanPtr !=  (Channel *) NULL) {
        /*
	 * Preserve the channel struct in case the script closes it.
	 */

    channel = (Tcl_Channel) chanPtr;

    /*
     * Here we have either reached the top of the stack or the mask is
     * empty.  We break out of the procedure if it is the latter.
     */

    if (!mask) {
        return;
    }

    /*
     * We are now above the topmost channel in a stack and have events
     * left. Now call the channel handlers as usual.
     *
     * Preserve the channel struct in case the script closes it.
     */
     
        Tcl_Preserve((ClientData) channel);
    Tcl_Preserve((ClientData) channel);
    Tcl_Preserve((ClientData) statePtr);

	/*
	 * If we are flushing in the background, be sure to call FlushChannel
	 * for writable events.  Note that we have to discard the writable
	 * event so we don't call any write handlers before the flush is
	 * complete.
	 */
    /*
     * If we are flushing in the background, be sure to call FlushChannel
     * for writable events.  Note that we have to discard the writable
     * event so we don't call any write handlers before the flush is
     * complete.
     */

	if ((chanPtr->flags & BG_FLUSH_SCHEDULED) && (mask & TCL_WRITABLE)) {
	    FlushChannel(NULL, chanPtr, 1);
	    mask &= ~TCL_WRITABLE;
	}
    if ((statePtr->flags & BG_FLUSH_SCHEDULED) && (mask & TCL_WRITABLE)) {
      FlushChannel(NULL, chanPtr, 1);
      mask &= ~TCL_WRITABLE;
    }

	/*
	 * Add this invocation to the list of recursive invocations of
	 * ChannelHandlerEventProc.
	 */
    /*
     * Add this invocation to the list of recursive invocations of
     * ChannelHandlerEventProc.
     */
    
	nh.nextHandlerPtr = (ChannelHandler *) NULL;
	nh.nestedHandlerPtr = tsdPtr->nestedHandlerPtr;
	tsdPtr->nestedHandlerPtr = &nh;
    
	for (chPtr = chanPtr->chPtr; chPtr != (ChannelHandler *) NULL; ) {
    nh.nextHandlerPtr = (ChannelHandler *) NULL;
    nh.nestedHandlerPtr = tsdPtr->nestedHandlerPtr;
    tsdPtr->nestedHandlerPtr = &nh;

    for (chPtr = statePtr->chPtr; chPtr != (ChannelHandler *) NULL; ) {

	    /*
	     * If this channel handler is interested in any of the events that
	     * have occurred on the channel, invoke its procedure.
	     */
      /*
       * If this channel handler is interested in any of the events that
       * have occurred on the channel, invoke its procedure.
       */
        
	  if ((chPtr->mask & mask) != 0) {
              nh.nextHandlerPtr = chPtr->nextPtr;
	      (*(chPtr->proc))(chPtr->clientData, mask);
	      chPtr = nh.nextHandlerPtr;
	  } else {
              chPtr = chPtr->nextPtr;
	  }
	}
      if ((chPtr->mask & mask) != 0) {
	nh.nextHandlerPtr = chPtr->nextPtr;
	(*(chPtr->proc))(chPtr->clientData, mask);
	chPtr = nh.nextHandlerPtr;
      } else {
	chPtr = chPtr->nextPtr;
      }
    }

	/*
	 * Update the notifier interest, since it may have changed after
	 * invoking event handlers. Skip that if the channel was deleted
	 * in the call to the channel handler.
	 */
    /*
     * Update the notifier interest, since it may have changed after
     * invoking event handlers. Skip that if the channel was deleted
     * in the call to the channel handler.
     */

	if (chanPtr->typePtr != NULL) {
	    UpdateInterest(chanPtr);

    if (chanPtr->typePtr != NULL) {
        UpdateInterest(chanPtr);
    }
	    /* Walk down the stack.
	     */
	  chanPtr = chanPtr-> supercedes;
	} else {
	    /* Stop walking the chain, the whole stack was destroyed!
	     */
	    chanPtr = (Channel*) NULL;
	}

	Tcl_Release((ClientData) channel);

    Tcl_Release((ClientData) statePtr);
    Tcl_Release((ClientData) channel);

	tsdPtr->nestedHandlerPtr = nh.nestedHandlerPtr;
    tsdPtr->nestedHandlerPtr = nh.nestedHandlerPtr;

	channel = (Tcl_Channel) chanPtr;
    }
}

/*
 *----------------------------------------------------------------------
 *
 * UpdateInterest --
 *
6224
6225
6226
6227
6228
6229
6230

6231

6232
6233
6234
6235
6236
6237
6238

6239
6240
6241
6242
6243
6244
6245
6246
6247
6248
6249
6250
6251
6252
6253




6254
6255
6256


6257
6258
6259
6260
6261
6262
6263
6268
6269
6270
6271
6272
6273
6274
6275

6276
6277
6278
6279
6280
6281
6282

6283
6284
6285
6286
6287
6288
6289
6290
6291
6292
6293
6294




6295
6296
6297
6298
6299


6300
6301
6302
6303
6304
6305
6306
6307
6308







+
-
+






-
+











-
-
-
-
+
+
+
+

-
-
+
+







 *----------------------------------------------------------------------
 */

static void
UpdateInterest(chanPtr)
    Channel *chanPtr;		/* Channel to update. */
{
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    int mask = chanPtr->interestMask;
    int mask = statePtr->interestMask;

    /*
     * If there are flushed buffers waiting to be written, then
     * we need to watch for the channel to become writable.
     */

    if (chanPtr->flags & BG_FLUSH_SCHEDULED) {
    if (statePtr->flags & BG_FLUSH_SCHEDULED) {
	mask |= TCL_WRITABLE;
    }

    /*
     * If there is data in the input queue, and we aren't waiting for more
     * data, then we need to schedule a timer so we don't block in the
     * notifier.  Also, cancel the read interest so we don't get duplicate
     * events.
     */

    if (mask & TCL_READABLE) {
	if (!(chanPtr->flags & CHANNEL_NEED_MORE_DATA)
		&& (chanPtr->inQueueHead != (ChannelBuffer *) NULL)
		&& (chanPtr->inQueueHead->nextRemoved <
			chanPtr->inQueueHead->nextAdded)) {
	if (!(statePtr->flags & CHANNEL_NEED_MORE_DATA)
		&& (statePtr->inQueueHead != (ChannelBuffer *) NULL)
		&& (statePtr->inQueueHead->nextRemoved <
			statePtr->inQueueHead->nextAdded)) {
	    mask &= ~TCL_READABLE;
	    if (!chanPtr->timer) {
		chanPtr->timer = Tcl_CreateTimerHandler(0, ChannelTimerProc,
	    if (!statePtr->timer) {
		statePtr->timer = Tcl_CreateTimerHandler(0, ChannelTimerProc,
			(ClientData) chanPtr);
	    }
	}
    }
    (chanPtr->typePtr->watchProc)(chanPtr->instanceData, mask);
}

6279
6280
6281
6282
6283
6284
6285

6286
6287
6288
6289
6290
6291





6292
6293
6294
6295
6296
6297
6298















6299
6300
6301
6302





6303
6304
6305
6306
6307
6308
6309
6324
6325
6326
6327
6328
6329
6330
6331
6332





6333
6334
6335
6336
6337
6338
6339
6340
6341
6342


6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358



6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
6370







+

-
-
-
-
-
+
+
+
+
+





-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

-
-
-
+
+
+
+
+







 */

static void
ChannelTimerProc(clientData)
    ClientData clientData;
{
    Channel *chanPtr = (Channel *) clientData;
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */

    if (!(chanPtr->flags & CHANNEL_NEED_MORE_DATA)
	    && (chanPtr->interestMask & TCL_READABLE)
	    && (chanPtr->inQueueHead != (ChannelBuffer *) NULL)
	    && (chanPtr->inQueueHead->nextRemoved <
		    chanPtr->inQueueHead->nextAdded)) {
    if (!(statePtr->flags & CHANNEL_NEED_MORE_DATA)
	    && (statePtr->interestMask & TCL_READABLE)
	    && (statePtr->inQueueHead != (ChannelBuffer *) NULL)
	    && (statePtr->inQueueHead->nextRemoved <
		    statePtr->inQueueHead->nextAdded)) {
	/*
	 * Restart the timer in case a channel handler reenters the
	 * event loop before UpdateInterest gets called by Tcl_NotifyChannel.
	 */

	chanPtr->timer = Tcl_CreateTimerHandler(0, ChannelTimerProc,
			(ClientData) chanPtr);
	statePtr->timer = Tcl_CreateTimerHandler(0, ChannelTimerProc,
		(ClientData) chanPtr);

	/* Set the TIMER flag to notify the higher levels that the
	 * driver might have no data for us. We do this only if we are
	 * in non-blocking mode and the driver has no BlockModeProc
	 * because only then we really don't know if the driver will
	 * block or not. A similar test is done in "PeekAhead".
	 */

	if ((statePtr->flags & CHANNEL_NONBLOCKING) &&
	    (Tcl_ChannelBlockModeProc(chanPtr->typePtr) == NULL)) {
	    statePtr->flags |= CHANNEL_TIMER_FEV;
	}
	Tcl_Preserve((ClientData) statePtr);
	Tcl_NotifyChannel((Tcl_Channel)chanPtr, TCL_READABLE);
 
   } else {
	chanPtr->timer = NULL;

	statePtr->flags &= ~CHANNEL_TIMER_FEV; 
	Tcl_Release((ClientData) statePtr);
    } else {
	statePtr->timer = NULL;
	UpdateInterest(chanPtr);
    }
}

/*
 *----------------------------------------------------------------------
 *
6335
6336
6337
6338
6339
6340
6341
6342
6343


6344
6345

6346
6347
6348
6349
6350
6351
6352
6353
6354



6355
6356
6357
6358
6359
6360
6361
6362
6363
6364
6365
6366
6367


6368
6369
6370
6371
6372
6373
6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
6384


6385
6386
6387

6388
6389
6390

6391
6392
6393
6394
6395
6396
6397
6396
6397
6398
6399
6400
6401
6402


6403
6404


6405
6406
6407
6408
6409
6410
6411



6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425


6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442


6443
6444
6445
6446

6447
6448
6449

6450
6451
6452
6453
6454
6455
6456
6457







-
-
+
+
-
-
+






-
-
-
+
+
+











-
-
+
+















-
-
+
+


-
+


-
+







				 * proc should be called. Use 0 to
                                 * disable a registered handler. */
    Tcl_ChannelProc *proc;	/* Procedure to call for each
				 * selected event. */
    ClientData clientData;	/* Arbitrary data to pass to proc. */
{
    ChannelHandler *chPtr;
    Channel *chanPtr;

    Channel *chanPtr = (Channel *) chan;
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    chanPtr = (Channel *) chan;
    

    /*
     * Check whether this channel handler is not already registered. If
     * it is not, create a new record, else reuse existing record (smash
     * current values).
     */

    for (chPtr = chanPtr->chPtr;
             chPtr != (ChannelHandler *) NULL;
             chPtr = chPtr->nextPtr) {
    for (chPtr = statePtr->chPtr;
	 chPtr != (ChannelHandler *) NULL;
	 chPtr = chPtr->nextPtr) {
        if ((chPtr->chanPtr == chanPtr) && (chPtr->proc == proc) &&
                (chPtr->clientData == clientData)) {
            break;
        }
    }
    if (chPtr == (ChannelHandler *) NULL) {
        chPtr = (ChannelHandler *) ckalloc((unsigned) sizeof(ChannelHandler));
        chPtr->mask = 0;
        chPtr->proc = proc;
        chPtr->clientData = clientData;
        chPtr->chanPtr = chanPtr;
        chPtr->nextPtr = chanPtr->chPtr;
        chanPtr->chPtr = chPtr;
        chPtr->nextPtr = statePtr->chPtr;
        statePtr->chPtr = chPtr;
    }

    /*
     * The remainder of the initialization below is done regardless of
     * whether or not this is a new record or a modification of an old
     * one.
     */

    chPtr->mask = mask;

    /*
     * Recompute the interest mask for the channel - this call may actually
     * be disabling an existing handler.
     */
    
    chanPtr->interestMask = 0;
    for (chPtr = chanPtr->chPtr;
    statePtr->interestMask = 0;
    for (chPtr = statePtr->chPtr;
	 chPtr != (ChannelHandler *) NULL;
	 chPtr = chPtr->nextPtr) {
	chanPtr->interestMask |= chPtr->mask;
	statePtr->interestMask |= chPtr->mask;
    }

    UpdateInterest(chanPtr);
    UpdateInterest(statePtr->topChanPtr);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_DeleteChannelHandler --
 *
6414
6415
6416
6417
6418
6419
6420

6421
6422
6423


6424
6425
6426
6427
6428
6429
6430
6431
6432
6433
6434



6435
6436
6437
6438
6439
6440
6441

6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455
6456
6457


6458
6459
6460
6461
6462
6463
6464
6465
6466
6467
6468

6469
6470
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484





6485
6486
6487

6488
6489
6490
6491
6492
6493
6494
6474
6475
6476
6477
6478
6479
6480
6481
6482


6483
6484
6485
6486


6487
6488
6489
6490



6491
6492
6493
6494
6495
6496
6497
6498
6499

6500
6501
6502
6503
6504
6505
6506
6507
6508
6509
6510
6511
6512
6513
6514


6515
6516
6517
6518
6519
6520
6521
6522
6523
6524
6525
6526

6527
6528
6529
6530
6531
6532
6533
6534
6535
6536
6537
6538





6539
6540
6541
6542
6543
6544
6545

6546
6547
6548
6549
6550
6551
6552
6553







+

-
-
+
+


-
-




-
-
-
+
+
+






-
+














-
-
+
+










-
+











-
-
-
-
-
+
+
+
+
+


-
+







    Tcl_Channel chan;		/* The channel for which to remove the
                                 * callback. */
    Tcl_ChannelProc *proc;	/* The procedure in the callback to delete. */
    ClientData clientData;	/* The client data in the callback
                                 * to delete. */
    
{
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
    ChannelHandler *chPtr, *prevChPtr;
    Channel *chanPtr;
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
    Channel *chanPtr = (Channel *) chan;
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    NextChannelHandler *nhPtr;

    chanPtr = (Channel *) chan;

    /*
     * Find the entry and the previous one in the list.
     */

    for (prevChPtr = (ChannelHandler *) NULL, chPtr = chanPtr->chPtr;
             chPtr != (ChannelHandler *) NULL;
             chPtr = chPtr->nextPtr) {
    for (prevChPtr = (ChannelHandler *) NULL, chPtr = statePtr->chPtr;
	 chPtr != (ChannelHandler *) NULL;
	 chPtr = chPtr->nextPtr) {
        if ((chPtr->chanPtr == chanPtr) && (chPtr->clientData == clientData)
                && (chPtr->proc == proc)) {
            break;
        }
        prevChPtr = chPtr;
    }
    

    /*
     * If not found, return without doing anything.
     */

    if (chPtr == (ChannelHandler *) NULL) {
        return;
    }

    /*
     * If ChannelHandlerEventProc is about to process this handler, tell it to
     * process the next one instead - we are going to delete *this* one.
     */

    for (nhPtr = tsdPtr->nestedHandlerPtr;
             nhPtr != (NextChannelHandler *) NULL;
             nhPtr = nhPtr->nestedHandlerPtr) {
	 nhPtr != (NextChannelHandler *) NULL;
	 nhPtr = nhPtr->nestedHandlerPtr) {
        if (nhPtr->nextHandlerPtr == chPtr) {
            nhPtr->nextHandlerPtr = chPtr->nextPtr;
        }
    }

    /*
     * Splice it out of the list of channel handlers.
     */
    
    if (prevChPtr == (ChannelHandler *) NULL) {
        chanPtr->chPtr = chPtr->nextPtr;
        statePtr->chPtr = chPtr->nextPtr;
    } else {
        prevChPtr->nextPtr = chPtr->nextPtr;
    }
    ckfree((char *) chPtr);

    /*
     * Recompute the interest list for the channel, so that infinite loops
     * will not result if Tcl_DeleteChannelHandler is called inside an
     * event.
     */

    chanPtr->interestMask = 0;
    for (chPtr = chanPtr->chPtr;
             chPtr != (ChannelHandler *) NULL;
             chPtr = chPtr->nextPtr) {
        chanPtr->interestMask |= chPtr->mask;
    statePtr->interestMask = 0;
    for (chPtr = statePtr->chPtr;
	 chPtr != (ChannelHandler *) NULL;
	 chPtr = chPtr->nextPtr) {
        statePtr->interestMask |= chPtr->mask;
    }

    UpdateInterest(chanPtr);
    UpdateInterest(statePtr->topChanPtr);
}

/*
 *----------------------------------------------------------------------
 *
 * DeleteScriptRecord --
 *
6509
6510
6511
6512
6513
6514
6515

6516
6517
6518

6519
6520
6521


6522
6523
6524


6525
6526
6527
6528
6529
6530

6531
6532
6533
6534
6535
6536
6537
6568
6569
6570
6571
6572
6573
6574
6575
6576
6577

6578
6579


6580
6581
6582


6583
6584
6585
6586
6587
6588
6589

6590
6591
6592
6593
6594
6595
6596
6597







+


-
+

-
-
+
+

-
-
+
+





-
+







    Tcl_Interp *interp;		/* Interpreter in which script was to be
                                 * executed. */
    Channel *chanPtr;		/* The channel for which to delete the
                                 * script record (if any). */
    int mask;			/* Events in mask must exactly match mask
                                 * of script to delete. */
{
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    EventScriptRecord *esPtr, *prevEsPtr;

    for (esPtr = chanPtr->scriptRecordPtr,
    for (esPtr = statePtr->scriptRecordPtr,
             prevEsPtr = (EventScriptRecord *) NULL;
             esPtr != (EventScriptRecord *) NULL;
             prevEsPtr = esPtr, esPtr = esPtr->nextPtr) {
	 esPtr != (EventScriptRecord *) NULL;
	 prevEsPtr = esPtr, esPtr = esPtr->nextPtr) {
        if ((esPtr->interp == interp) && (esPtr->mask == mask)) {
            if (esPtr == chanPtr->scriptRecordPtr) {
                chanPtr->scriptRecordPtr = esPtr->nextPtr;
            if (esPtr == statePtr->scriptRecordPtr) {
                statePtr->scriptRecordPtr = esPtr->nextPtr;
            } else {
                prevEsPtr->nextPtr = esPtr->nextPtr;
            }

            Tcl_DeleteChannelHandler((Tcl_Channel) chanPtr,
                    ChannelEventScriptInvoker, (ClientData) esPtr);
                    TclChannelEventScriptInvoker, (ClientData) esPtr);
            
	    Tcl_DecrRefCount(esPtr->scriptPtr);
            ckfree((char *) esPtr);

            break;
        }
    }
6560
6561
6562
6563
6564
6565
6566

6567
6568
6569
6570
6571



6572
6573
6574
6575
6576
6577
6578
6579
6580
6581
6582
6583
6584



6585
6586
6587
6588
6589
6590
6591
6592
6593
6594
6595
6596

6597
6598
6599
6600
6601
6602
6603
6604
6605
6606
6607
6608
6609
6610
6611
6612


6613
6614
6615
6616
6617
6618
6619
6620
6621
6622
6623

6624
6625
6626
6627
6628




6629
6630
6631
6632
6633
6634
6635
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629



6630
6631
6632
6633
6634
6635
6636
6637
6638
6639
6640
6641
6642



6643
6644
6645
6646
6647
6648
6649
6650
6651
6652
6653
6654
6655
6656

6657
6658
6659
6660
6661
6662
6663
6664
6665
6666
6667
6668
6669
6670
6671


6672
6673
6674
6675
6676
6677
6678
6679
6680
6681
6682
6683

6684





6685
6686
6687
6688
6689
6690
6691
6692
6693
6694
6695







+


-
-
-
+
+
+










-
-
-
+
+
+











-
+














-
-
+
+










-
+
-
-
-
-
-
+
+
+
+







                                         * the stored script. */
    Channel *chanPtr;			/* Channel for which script is to
                                         * be stored. */
    int mask;				/* Set of events for which script
                                         * will be invoked. */
    Tcl_Obj *scriptPtr;			/* Pointer to script object. */
{
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    EventScriptRecord *esPtr;

    for (esPtr = chanPtr->scriptRecordPtr;
             esPtr != (EventScriptRecord *) NULL;
             esPtr = esPtr->nextPtr) {
    for (esPtr = statePtr->scriptRecordPtr;
	 esPtr != (EventScriptRecord *) NULL;
	 esPtr = esPtr->nextPtr) {
        if ((esPtr->interp == interp) && (esPtr->mask == mask)) {
	    Tcl_DecrRefCount(esPtr->scriptPtr);
	    esPtr->scriptPtr = (Tcl_Obj *) NULL;
            break;
        }
    }
    if (esPtr == (EventScriptRecord *) NULL) {
        esPtr = (EventScriptRecord *) ckalloc((unsigned)
                sizeof(EventScriptRecord));
        Tcl_CreateChannelHandler((Tcl_Channel) chanPtr, mask,
                ChannelEventScriptInvoker, (ClientData) esPtr);
        esPtr->nextPtr = chanPtr->scriptRecordPtr;
        chanPtr->scriptRecordPtr = esPtr;
                TclChannelEventScriptInvoker, (ClientData) esPtr);
        esPtr->nextPtr = statePtr->scriptRecordPtr;
        statePtr->scriptRecordPtr = esPtr;
    }
    esPtr->chanPtr = chanPtr;
    esPtr->interp = interp;
    esPtr->mask = mask;
    Tcl_IncrRefCount(scriptPtr);
    esPtr->scriptPtr = scriptPtr;
}

/*
 *----------------------------------------------------------------------
 *
 * ChannelEventScriptInvoker --
 * TclChannelEventScriptInvoker --
 *
 *	Invokes a script scheduled by "fileevent" for when the channel
 *	becomes ready for IO. This function is invoked by the channel
 *	handler which was created by the Tcl "fileevent" command.
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	Whatever the script does.
 *
 *----------------------------------------------------------------------
 */

static void
ChannelEventScriptInvoker(clientData, mask)
void
TclChannelEventScriptInvoker(clientData, mask)
    ClientData clientData;	/* The script+interp record. */
    int mask;			/* Not used. */
{
    Tcl_Interp *interp;		/* Interpreter in which to eval the script. */
    Channel *chanPtr;		/* The channel for which this handler is
                                 * registered. */
    EventScriptRecord *esPtr;	/* The event script + interpreter to eval it
                                 * in. */
    int result;			/* Result of call to eval script. */

    esPtr = (EventScriptRecord *) clientData;
    esPtr	= (EventScriptRecord *) clientData;

    chanPtr = esPtr->chanPtr;
    mask = esPtr->mask;
    interp = esPtr->interp;
    
    chanPtr	= esPtr->chanPtr;
    mask	= esPtr->mask;
    interp	= esPtr->interp;

    /*
     * We must preserve the interpreter so we can report errors on it
     * later.  Note that we do not need to preserve the channel because
     * that is done by Tcl_NotifyChannel before calling channel handlers.
     */
    
    Tcl_Preserve((ClientData) interp);
6679
6680
6681
6682
6683
6684
6685

6686
6687
6688
6689
6690
6691
6692
6739
6740
6741
6742
6743
6744
6745
6746
6747
6748
6749
6750
6751
6752
6753







+







                                         * for which to create the handler
                                         * is found. */
    int objc;				/* Number of arguments. */
    Tcl_Obj *CONST objv[];		/* Argument objects. */
{
    Channel *chanPtr;			/* The channel to create
                                         * the handler for. */
    ChannelState *statePtr;		/* state info for channel */
    Tcl_Channel chan;			/* The opaque type for the channel. */
    char *chanName;
    int modeIndex;			/* Index of mode argument. */
    int mask;
    static char *modeOptions[] = {"readable", "writable", NULL};
    static int maskArray[] = {TCL_READABLE, TCL_WRITABLE};

6701
6702
6703
6704
6705
6706
6707
6708
6709



6710
6711
6712
6713
6714
6715
6716
6717
6718
6719
6720
6721
6722

6723
6724
6725
6726
6727
6728
6729
6762
6763
6764
6765
6766
6767
6768


6769
6770
6771
6772
6773
6774
6775
6776
6777
6778
6779
6780
6781
6782
6783

6784
6785
6786
6787
6788
6789
6790
6791







-
-
+
+
+












-
+







    mask = maskArray[modeIndex];

    chanName = Tcl_GetString(objv[1]);
    chan = Tcl_GetChannel(interp, chanName, NULL);
    if (chan == (Tcl_Channel) NULL) {
	return TCL_ERROR;
    }
    chanPtr = (Channel *) chan;
    if ((chanPtr->flags & mask) == 0) {
    chanPtr  = (Channel *) chan;
    statePtr = chanPtr->state;
    if ((statePtr->flags & mask) == 0) {
        Tcl_AppendResult(interp, "channel is not ",
                (mask == TCL_READABLE) ? "readable" : "writable",
                (char *) NULL);
        return TCL_ERROR;
    }
    
    /*
     * If we are supposed to return the script, do so.
     */

    if (objc == 3) {
	EventScriptRecord *esPtr;
	for (esPtr = chanPtr->scriptRecordPtr;
	for (esPtr = statePtr->scriptRecordPtr;
             esPtr != (EventScriptRecord *) NULL;
             esPtr = esPtr->nextPtr) {
	    if ((esPtr->interp == interp) && (esPtr->mask == mask)) {
		Tcl_SetObjResult(interp, esPtr->scriptPtr);
		break;
	    }
	}
6749
6750
6751
6752
6753
6754
6755
6756
6757
6758
6759
6760
6761
6762
6763
6764
6765
6766
6767
6768
6769
6770
6771
6772
6773
6774
6775
6776
6777
6778
6779
6780
6781
6782
6783
6784
6785
6786
6787
6788
6789
6790
6791
6792
6793
6794
6795
6796
6797
6798
6799
6800
6801
6802
6803
6804
6805
6806
6807
6808
6809
6810
6811
6812
6813
6814
6815
6816
6817
6818
6819
6820
6821
6822
6823
6824
6825
6826
6827
6828
6829
6830
6831
6832
6833
6834
6835
6836
6837
6838
6839
6840
6841
6842
6843
6844
6845
6846
6847
6848
6849
6850
6851
6852
6853
6854
6855
6856
6857
6858
6859
6860
6861
6862
6863
6864
6865
6866
6867
6868
6869
6870
6871
6872
6873
6874
6875
6876
6877
6878
6879
6880
6881
6882
6883
6884
6885
6886
6887
6888
6889
6890
6891
6892
6893
6894
6895
6896
6897
6898
6899
6900
6901
6902
6903
6904
6905
6906
6907
6908
6909
6910
6911
6912
6913
6914
6915
6916
6917
6918
6919
6920
6921
6922
6923
6924
6925
6926
6927
6928
6929
6930
6931
6932
6933
6934
6935
6936
6937
6938
6939
6940
6941
6942
6943
6944
6945
6946
6947
6948
6949
6950
6951
6952
6953
6954
6955
6956
6957
6958
6959
6960
6961
6962
6963
6964
6965
6966
6967
6968
6969
6970
6971
6972
6973
6974
6975
6976
6977
6978
6979
6980
6981
6982
6983
6984
6985
6986
6987
6988
6989
6990
6991
6992
6993
6994
6995
6996
6997
6998
6999
7000
7001
7002
7003
7004
7005
7006
7007
7008
7009
7010
7011
7012
7013
7014
7015
7016
7017
7018
7019
7020
7021
7022
7023
7024
7025
7026
7027
7028
7029
7030
7031
7032
7033
7034
7035
7036
7037
7038
7039
7040
7041
7042
7043
7044
7045
7046
7047
7048
7049
7050
7051
7052
7053
7054
7055
7056
7057
7058
7059
7060
7061
7062
7063
7064
7065
7066
7067
7068
7069
7070
7071
7072
7073
7074
7075
7076
7077
7078
7079
7080
7081
7082
7083
7084
7085
7086
7087
7088
7089
7090
7091
7092
7093
7094
7095
7096
7097
7098
7099
7100
7101
7102
7103
7104
7105
7106
7107
7108
7109
7110
7111
7112
7113
7114
7115
7116
7117
7118
7119
7120
7121
7122
7123
7124
7125
7126
7127
7128
7129
7130
7131
7132
7133
7134
7135
7136
7137
7138
7139
7140
7141
7142
7143
7144
7145
7146
7147
7148
7149
7150
7151
7152
7153
7154
7155
7156
7157
7158
7159
7160
7161
7162
7163
7164
7165
7166
7167
7168
7169
7170
7171
7172
7173
7174
7175
7176
7177
7178
7179
7180
7181
7182
7183
7184
7185
7186
7187
7188
7189
7190
7191
7192
7193
7194
7195
7196
7197
7198
7199
7200
7201
7202
7203
7204
7205
7206
7207
7208
7209
7210
7211
7212
7213
7214
7215
7216
7217
7218
7219
7220
7221
7222
7223
7224
7225
7226
7227
7228
7229
7230
7231
7232
7233
7234
7235
7236
7237
7238
7239
7240
7241
7242
7243
7244
7245
7246
7247
7248
7249
7250
7251
7252
7253
7254
7255
7256
7257
7258
7259
7260
7261
7262
7263
7264
7265
7266
7267
7268
7269
7270
7271
7272
7273
7274
7275
7276
7277
7278
7279
7280
7281
7282
7283
7284
7285
7286
7287
7288
7289
7290
7291
7292
7293
7294
7295
6811
6812
6813
6814
6815
6816
6817





















































































































































































































































































































































































































































































































































6818
6819
6820
6821
6822
6823
6824







-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-







    
    return TCL_OK;
}

/*
 *----------------------------------------------------------------------
 *
 * TclTestChannelCmd --
 *
 *	Implements the Tcl "testchannel" debugging command and its
 *	subcommands. This is part of the testing environment but must be
 *	in this file instead of tclTest.c because it needs access to the
 *	fields of struct Channel.
 *
 * Results:
 *	A standard Tcl result.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

	/* ARGSUSED */
int
TclTestChannelCmd(clientData, interp, argc, argv)
    ClientData clientData;	/* Not used. */
    Tcl_Interp *interp;		/* Interpreter for result. */
    int argc;			/* Count of additional args. */
    char **argv;		/* Additional arg strings. */
{
    char *cmdName;		/* Sub command. */
    Tcl_HashTable *hTblPtr;	/* Hash table of channels. */
    Tcl_HashSearch hSearch;	/* Search variable. */
    Tcl_HashEntry *hPtr;	/* Search variable. */
    Channel *chanPtr;		/* The actual channel. */
    Tcl_Channel chan;		/* The opaque type. */
    size_t len;			/* Length of subcommand string. */
    int IOQueued;		/* How much IO is queued inside channel? */
    ChannelBuffer *bufPtr;	/* For iterating over queued IO. */
    char buf[TCL_INTEGER_SPACE];/* For sprintf. */
    
    if (argc < 2) {
        Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                " subcommand ?additional args..?\"", (char *) NULL);
        return TCL_ERROR;
    }
    cmdName = argv[1];
    len = strlen(cmdName);

    chanPtr = (Channel *) NULL;

    if (argc > 2) {
        chan = Tcl_GetChannel(interp, argv[2], NULL);
        if (chan == (Tcl_Channel) NULL) {
            return TCL_ERROR;
        }
        chanPtr = (Channel *) chan;
    }


    if ((cmdName[0] == 'i') && (strncmp(cmdName, "info", len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    " info channelName\"", (char *) NULL);
            return TCL_ERROR;
        }
        Tcl_AppendElement(interp, argv[2]);
        Tcl_AppendElement(interp, chanPtr->typePtr->typeName);
        if (chanPtr->flags & TCL_READABLE) {
            Tcl_AppendElement(interp, "read");
        } else {
            Tcl_AppendElement(interp, "");
        }
        if (chanPtr->flags & TCL_WRITABLE) {
            Tcl_AppendElement(interp, "write");
        } else {
            Tcl_AppendElement(interp, "");
        }
        if (chanPtr->flags & CHANNEL_NONBLOCKING) {
            Tcl_AppendElement(interp, "nonblocking");
        } else {
            Tcl_AppendElement(interp, "blocking");
        }
        if (chanPtr->flags & CHANNEL_LINEBUFFERED) {
            Tcl_AppendElement(interp, "line");
        } else if (chanPtr->flags & CHANNEL_UNBUFFERED) {
            Tcl_AppendElement(interp, "none");
        } else {
            Tcl_AppendElement(interp, "full");
        }
        if (chanPtr->flags & BG_FLUSH_SCHEDULED) {
            Tcl_AppendElement(interp, "async_flush");
        } else {
            Tcl_AppendElement(interp, "");
        }
        if (chanPtr->flags & CHANNEL_EOF) {
            Tcl_AppendElement(interp, "eof");
        } else {
            Tcl_AppendElement(interp, "");
        }
        if (chanPtr->flags & CHANNEL_BLOCKED) {
            Tcl_AppendElement(interp, "blocked");
        } else {
            Tcl_AppendElement(interp, "unblocked");
        }
        if (chanPtr->inputTranslation == TCL_TRANSLATE_AUTO) {
            Tcl_AppendElement(interp, "auto");
            if (chanPtr->flags & INPUT_SAW_CR) {
                Tcl_AppendElement(interp, "saw_cr");
            } else {
                Tcl_AppendElement(interp, "");
            }
        } else if (chanPtr->inputTranslation == TCL_TRANSLATE_LF) {
            Tcl_AppendElement(interp, "lf");
            Tcl_AppendElement(interp, "");
        } else if (chanPtr->inputTranslation == TCL_TRANSLATE_CR) {
            Tcl_AppendElement(interp, "cr");
            Tcl_AppendElement(interp, "");
        } else if (chanPtr->inputTranslation == TCL_TRANSLATE_CRLF) {
            Tcl_AppendElement(interp, "crlf");
            if (chanPtr->flags & INPUT_SAW_CR) {
                Tcl_AppendElement(interp, "queued_cr");
            } else {
                Tcl_AppendElement(interp, "");
            }
        }
        if (chanPtr->outputTranslation == TCL_TRANSLATE_AUTO) {
            Tcl_AppendElement(interp, "auto");
        } else if (chanPtr->outputTranslation == TCL_TRANSLATE_LF) {
            Tcl_AppendElement(interp, "lf");
        } else if (chanPtr->outputTranslation == TCL_TRANSLATE_CR) {
            Tcl_AppendElement(interp, "cr");
        } else if (chanPtr->outputTranslation == TCL_TRANSLATE_CRLF) {
            Tcl_AppendElement(interp, "crlf");
        }
        for (IOQueued = 0, bufPtr = chanPtr->inQueueHead;
                 bufPtr != (ChannelBuffer *) NULL;
                 bufPtr = bufPtr->nextPtr) {
            IOQueued += bufPtr->nextAdded - bufPtr->nextRemoved;
        }
        TclFormatInt(buf, IOQueued);
        Tcl_AppendElement(interp, buf);
        
        IOQueued = 0;
        if (chanPtr->curOutPtr != (ChannelBuffer *) NULL) {
            IOQueued = chanPtr->curOutPtr->nextAdded -
                chanPtr->curOutPtr->nextRemoved;
        }
        for (bufPtr = chanPtr->outQueueHead;
                 bufPtr != (ChannelBuffer *) NULL;
                 bufPtr = bufPtr->nextPtr) {
            IOQueued += (bufPtr->nextAdded - bufPtr->nextRemoved);
        }
        TclFormatInt(buf, IOQueued);
        Tcl_AppendElement(interp, buf);
        
        TclFormatInt(buf, Tcl_Tell((Tcl_Channel) chanPtr));
        Tcl_AppendElement(interp, buf);

        TclFormatInt(buf, chanPtr->refCount);
        Tcl_AppendElement(interp, buf);

        return TCL_OK;
    }

    if ((cmdName[0] == 'i') &&
            (strncmp(cmdName, "inputbuffered", len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "channel name required",
                    (char *) NULL);
            return TCL_ERROR;
        }
        
        for (IOQueued = 0, bufPtr = chanPtr->inQueueHead;
                 bufPtr != (ChannelBuffer *) NULL;
                 bufPtr = bufPtr->nextPtr) {
            IOQueued += bufPtr->nextAdded - bufPtr->nextRemoved;
        }
        TclFormatInt(buf, IOQueued);
        Tcl_AppendResult(interp, buf, (char *) NULL);
        return TCL_OK;
    }
        
    if ((cmdName[0] == 'm') && (strncmp(cmdName, "mode", len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "channel name required",
                    (char *) NULL);
            return TCL_ERROR;
        }
        
        if (chanPtr->flags & TCL_READABLE) {
            Tcl_AppendElement(interp, "read");
        } else {
            Tcl_AppendElement(interp, "");
        }
        if (chanPtr->flags & TCL_WRITABLE) {
            Tcl_AppendElement(interp, "write");
        } else {
            Tcl_AppendElement(interp, "");
        }
        return TCL_OK;
    }
    
    if ((cmdName[0] == 'n') && (strncmp(cmdName, "name", len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "channel name required",
                    (char *) NULL);
            return TCL_ERROR;
        }
        Tcl_AppendResult(interp, chanPtr->channelName, (char *) NULL);
        return TCL_OK;
    }
    
    if ((cmdName[0] == 'o') && (strncmp(cmdName, "open", len) == 0)) {
        hTblPtr = (Tcl_HashTable *) Tcl_GetAssocData(interp, "tclIO", NULL);
        if (hTblPtr == (Tcl_HashTable *) NULL) {
            return TCL_OK;
        }
        for (hPtr = Tcl_FirstHashEntry(hTblPtr, &hSearch);
                 hPtr != (Tcl_HashEntry *) NULL;
                 hPtr = Tcl_NextHashEntry(&hSearch)) {
            Tcl_AppendElement(interp, Tcl_GetHashKey(hTblPtr, hPtr));
        }
        return TCL_OK;
    }

    if ((cmdName[0] == 'o') &&
            (strncmp(cmdName, "outputbuffered", len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "channel name required",
                    (char *) NULL);
            return TCL_ERROR;
        }
        
        IOQueued = 0;
        if (chanPtr->curOutPtr != (ChannelBuffer *) NULL) {
            IOQueued = chanPtr->curOutPtr->nextAdded -
                chanPtr->curOutPtr->nextRemoved;
        }
        for (bufPtr = chanPtr->outQueueHead;
                 bufPtr != (ChannelBuffer *) NULL;
                 bufPtr = bufPtr->nextPtr) {
            IOQueued += (bufPtr->nextAdded - bufPtr->nextRemoved);
        }
        TclFormatInt(buf, IOQueued);
        Tcl_AppendResult(interp, buf, (char *) NULL);
        return TCL_OK;
    }
        
    if ((cmdName[0] == 'q') &&
            (strncmp(cmdName, "queuedcr", len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "channel name required",
                    (char *) NULL);
            return TCL_ERROR;
        }
        
        Tcl_AppendResult(interp,
                (chanPtr->flags & INPUT_SAW_CR) ? "1" : "0",
                (char *) NULL);
        return TCL_OK;
    }
    
    if ((cmdName[0] == 'r') && (strncmp(cmdName, "readable", len) == 0)) {
        hTblPtr = (Tcl_HashTable *) Tcl_GetAssocData(interp, "tclIO", NULL);
        if (hTblPtr == (Tcl_HashTable *) NULL) {
            return TCL_OK;
        }
        for (hPtr = Tcl_FirstHashEntry(hTblPtr, &hSearch);
                 hPtr != (Tcl_HashEntry *) NULL;
                 hPtr = Tcl_NextHashEntry(&hSearch)) {
            chanPtr = (Channel *) Tcl_GetHashValue(hPtr);
            if (chanPtr->flags & TCL_READABLE) {
                Tcl_AppendElement(interp, Tcl_GetHashKey(hTblPtr, hPtr));
            }
        }
        return TCL_OK;
    }

    if ((cmdName[0] == 'r') && (strncmp(cmdName, "refcount", len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "channel name required",
                    (char *) NULL);
            return TCL_ERROR;
        }
        
        TclFormatInt(buf, chanPtr->refCount);
        Tcl_AppendResult(interp, buf, (char *) NULL);
        return TCL_OK;
    }
    
    if ((cmdName[0] == 't') && (strncmp(cmdName, "type", len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "channel name required",
                    (char *) NULL);
            return TCL_ERROR;
        }
        Tcl_AppendResult(interp, chanPtr->typePtr->typeName, (char *) NULL);
        return TCL_OK;
    }
    
    if ((cmdName[0] == 'w') && (strncmp(cmdName, "writable", len) == 0)) {
        hTblPtr = (Tcl_HashTable *) Tcl_GetAssocData(interp, "tclIO", NULL);
        if (hTblPtr == (Tcl_HashTable *) NULL) {
            return TCL_OK;
        }
        for (hPtr = Tcl_FirstHashEntry(hTblPtr, &hSearch);
                 hPtr != (Tcl_HashEntry *) NULL;
                 hPtr = Tcl_NextHashEntry(&hSearch)) {
            chanPtr = (Channel *) Tcl_GetHashValue(hPtr);
            if (chanPtr->flags & TCL_WRITABLE) {
                Tcl_AppendElement(interp, Tcl_GetHashKey(hTblPtr, hPtr));
            }
        }
        return TCL_OK;
    }

    Tcl_AppendResult(interp, "bad option \"", cmdName, "\": should be ",
            "info, open, readable, or writable",
            (char *) NULL);
    return TCL_ERROR;
}

/*
 *----------------------------------------------------------------------
 *
 * TclTestChannelEventCmd --
 *
 *	This procedure implements the "testchannelevent" command. It is
 *	used to test the Tcl channel event mechanism. It is present in
 *	this file instead of tclTest.c because it needs access to the
 *	internal structure of the channel.
 *
 * Results:
 *	A standard Tcl result.
 *
 * Side effects:
 *	Creates, deletes and returns channel event handlers.
 *
 *----------------------------------------------------------------------
 */

	/* ARGSUSED */
int
TclTestChannelEventCmd(dummy, interp, argc, argv)
    ClientData dummy;			/* Not used. */
    Tcl_Interp *interp;			/* Current interpreter. */
    int argc;				/* Number of arguments. */
    char **argv;			/* Argument strings. */
{
    Tcl_Obj *resultListPtr;
    Channel *chanPtr;
    EventScriptRecord *esPtr, *prevEsPtr, *nextEsPtr;
    char *cmd;
    int index, i, mask, len;

    if ((argc < 3) || (argc > 5)) {
        Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                " channelName cmd ?arg1? ?arg2?\"", (char *) NULL);
        return TCL_ERROR;
    }
    chanPtr = (Channel *) Tcl_GetChannel(interp, argv[1], NULL);
    if (chanPtr == (Channel *) NULL) {
        return TCL_ERROR;
    }
    cmd = argv[2];
    len = strlen(cmd);
    if ((cmd[0] == 'a') && (strncmp(cmd, "add", (unsigned) len) == 0)) {
        if (argc != 5) {
            Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    " channelName add eventSpec script\"", (char *) NULL);
            return TCL_ERROR;
        }
        if (strcmp(argv[3], "readable") == 0) {
            mask = TCL_READABLE;
        } else if (strcmp(argv[3], "writable") == 0) {
            mask = TCL_WRITABLE;
        } else if (strcmp(argv[3], "none") == 0) {
            mask = 0;
	} else {
            Tcl_AppendResult(interp, "bad event name \"", argv[3],
                    "\": must be readable, writable, or none", (char *) NULL);
            return TCL_ERROR;
        }

        esPtr = (EventScriptRecord *) ckalloc((unsigned)
                sizeof(EventScriptRecord));
        esPtr->nextPtr = chanPtr->scriptRecordPtr;
        chanPtr->scriptRecordPtr = esPtr;
        
        esPtr->chanPtr = chanPtr;
        esPtr->interp = interp;
        esPtr->mask = mask;
	esPtr->scriptPtr = Tcl_NewStringObj(argv[4], -1);
	Tcl_IncrRefCount(esPtr->scriptPtr);

        Tcl_CreateChannelHandler((Tcl_Channel) chanPtr, mask,
                ChannelEventScriptInvoker, (ClientData) esPtr);
        
        return TCL_OK;
    }

    if ((cmd[0] == 'd') && (strncmp(cmd, "delete", (unsigned) len) == 0)) {
        if (argc != 4) {
            Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    " channelName delete index\"", (char *) NULL);
            return TCL_ERROR;
        }
        if (Tcl_GetInt(interp, argv[3], &index) == TCL_ERROR) {
            return TCL_ERROR;
        }
        if (index < 0) {
            Tcl_AppendResult(interp, "bad event index: ", argv[3],
                    ": must be nonnegative", (char *) NULL);
            return TCL_ERROR;
        }
        for (i = 0, esPtr = chanPtr->scriptRecordPtr;
                 (i < index) && (esPtr != (EventScriptRecord *) NULL);
                 i++, esPtr = esPtr->nextPtr) {
	    /* Empty loop body. */
        }
        if (esPtr == (EventScriptRecord *) NULL) {
            Tcl_AppendResult(interp, "bad event index ", argv[3],
                    ": out of range", (char *) NULL);
            return TCL_ERROR;
        }
        if (esPtr == chanPtr->scriptRecordPtr) {
            chanPtr->scriptRecordPtr = esPtr->nextPtr;
        } else {
            for (prevEsPtr = chanPtr->scriptRecordPtr;
                     (prevEsPtr != (EventScriptRecord *) NULL) &&
                         (prevEsPtr->nextPtr != esPtr);
                     prevEsPtr = prevEsPtr->nextPtr) {
                /* Empty loop body. */
            }
            if (prevEsPtr == (EventScriptRecord *) NULL) {
                panic("TclTestChannelEventCmd: damaged event script list");
            }
            prevEsPtr->nextPtr = esPtr->nextPtr;
        }
        Tcl_DeleteChannelHandler((Tcl_Channel) chanPtr,
                ChannelEventScriptInvoker, (ClientData) esPtr);
	Tcl_DecrRefCount(esPtr->scriptPtr);
        ckfree((char *) esPtr);

        return TCL_OK;
    }

    if ((cmd[0] == 'l') && (strncmp(cmd, "list", (unsigned) len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    " channelName list\"", (char *) NULL);
            return TCL_ERROR;
        }
	resultListPtr = Tcl_GetObjResult(interp);
        for (esPtr = chanPtr->scriptRecordPtr;
                 esPtr != (EventScriptRecord *) NULL;
                 esPtr = esPtr->nextPtr) {
	    if (esPtr->mask) {
 	        Tcl_ListObjAppendElement(interp, resultListPtr, Tcl_NewStringObj(
		    (esPtr->mask == TCL_READABLE) ? "readable" : "writable", -1));
 	    } else {
 	        Tcl_ListObjAppendElement(interp, resultListPtr, 
                    Tcl_NewStringObj("none", -1));
	    }
  	    Tcl_ListObjAppendElement(interp, resultListPtr, esPtr->scriptPtr);
        }
	Tcl_SetObjResult(interp, resultListPtr);
        return TCL_OK;
    }

    if ((cmd[0] == 'r') && (strncmp(cmd, "removeall", (unsigned) len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    " channelName removeall\"", (char *) NULL);
            return TCL_ERROR;
        }
        for (esPtr = chanPtr->scriptRecordPtr;
                 esPtr != (EventScriptRecord *) NULL;
                 esPtr = nextEsPtr) {
            nextEsPtr = esPtr->nextPtr;
            Tcl_DeleteChannelHandler((Tcl_Channel) chanPtr,
                    ChannelEventScriptInvoker, (ClientData) esPtr);
	    Tcl_DecrRefCount(esPtr->scriptPtr);
            ckfree((char *) esPtr);
        }
        chanPtr->scriptRecordPtr = (EventScriptRecord *) NULL;
        return TCL_OK;
    }

    if  ((cmd[0] == 's') && (strncmp(cmd, "set", (unsigned) len) == 0)) {
        if (argc != 5) {
            Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    " channelName delete index event\"", (char *) NULL);
            return TCL_ERROR;
        }
        if (Tcl_GetInt(interp, argv[3], &index) == TCL_ERROR) {
            return TCL_ERROR;
        }
        if (index < 0) {
            Tcl_AppendResult(interp, "bad event index: ", argv[3],
                    ": must be nonnegative", (char *) NULL);
            return TCL_ERROR;
        }
        for (i = 0, esPtr = chanPtr->scriptRecordPtr;
                 (i < index) && (esPtr != (EventScriptRecord *) NULL);
                 i++, esPtr = esPtr->nextPtr) {
	    /* Empty loop body. */
        }
        if (esPtr == (EventScriptRecord *) NULL) {
            Tcl_AppendResult(interp, "bad event index ", argv[3],
                    ": out of range", (char *) NULL);
            return TCL_ERROR;
        }

        if (strcmp(argv[4], "readable") == 0) {
            mask = TCL_READABLE;
        } else if (strcmp(argv[4], "writable") == 0) {
            mask = TCL_WRITABLE;
        } else if (strcmp(argv[4], "none") == 0) {
            mask = 0;
	} else {
            Tcl_AppendResult(interp, "bad event name \"", argv[4],
                    "\": must be readable, writable, or none", (char *) NULL);
            return TCL_ERROR;
        }
	esPtr->mask = mask;
        Tcl_CreateChannelHandler((Tcl_Channel) chanPtr, mask,
                ChannelEventScriptInvoker, (ClientData) esPtr);
	return TCL_OK;
    }    
    Tcl_AppendResult(interp, "bad command ", cmd, ", must be one of ",
            "add, delete, list, set, or removeall", (char *) NULL);
    return TCL_ERROR;
}

/*
 *----------------------------------------------------------------------
 *
 * TclCopyChannel --
 *
 *	This routine copies data from one channel to another, either
 *	synchronously or asynchronously.  If a command script is
 *	supplied, the operation runs in the background.  The script
 *	is invoked when the copy completes.  Otherwise the function
 *	waits until the copy is completed before returning.
7310
7311
7312
7313
7314
7315
7316

7317
7318
7319
7320



7321

7322
7323
7324
7325
7326

7327
7328
7329
7330
7331
7332
7333


7334
7335
7336
7337
7338
7339
7340
6839
6840
6841
6842
6843
6844
6845
6846
6847
6848
6849
6850
6851
6852
6853

6854
6855
6856
6857
6858

6859
6860
6861
6862
6863
6864


6865
6866
6867
6868
6869
6870
6871
6872
6873







+




+
+
+
-
+




-
+





-
-
+
+







    Tcl_Channel inChan;		/* Channel to read from. */
    Tcl_Channel outChan;	/* Channel to write to. */
    int toRead;			/* Amount of data to copy, or -1 for all. */
    Tcl_Obj *cmdPtr;		/* Pointer to script to execute or NULL. */
{
    Channel *inPtr = (Channel *) inChan;
    Channel *outPtr = (Channel *) outChan;
    ChannelState *inStatePtr, *outStatePtr;
    int readFlags, writeFlags;
    CopyState *csPtr;
    int nonBlocking = (cmdPtr) ? CHANNEL_NONBLOCKING : 0;

    inStatePtr	= inPtr->state;
    outStatePtr	= outPtr->state;

    if (inPtr->csPtr) {
    if (inStatePtr->csPtr) {
	Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), "channel \"",
		Tcl_GetChannelName(inChan), "\" is busy", NULL);
	return TCL_ERROR;
    }
    if (outPtr->csPtr) {
    if (outStatePtr->csPtr) {
	Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), "channel \"",
		Tcl_GetChannelName(outChan), "\" is busy", NULL);
	return TCL_ERROR;
    }

    readFlags = inPtr->flags;
    writeFlags = outPtr->flags;
    readFlags	= inStatePtr->flags;
    writeFlags	= outStatePtr->flags;

    /*
     * Set up the blocking mode appropriately.  Background copies need
     * non-blocking channels.  Foreground copies need blocking channels.
     * If there is an error, restore the old blocking mode.
     */

7360
7361
7362
7363
7364
7365
7366
7367

7368
7369
7370
7371
7372
7373
7374
7375
7376
7377
7378
7379
7380





7381
7382
7383
7384



7385
7386
7387
7388
7389
7390


7391
7392
7393
7394
7395
7396
7397
6893
6894
6895
6896
6897
6898
6899

6900
6901
6902
6903
6904
6905
6906
6907
6908





6909
6910
6911
6912
6913
6914



6915
6916
6917
6918
6919
6920
6921


6922
6923
6924
6925
6926
6927
6928
6929
6930







-
+








-
-
-
-
-
+
+
+
+
+

-
-
-
+
+
+




-
-
+
+







	}
    }

    /*
     * Make sure the output side is unbuffered.
     */

    outPtr->flags = (outPtr->flags & ~(CHANNEL_LINEBUFFERED))
    outStatePtr->flags = (outStatePtr->flags & ~(CHANNEL_LINEBUFFERED))
	| CHANNEL_UNBUFFERED;

    /*
     * Allocate a new CopyState to maintain info about the current copy in
     * progress.  This structure will be deallocated when the copy is
     * completed.
     */

    csPtr = (CopyState*) ckalloc(sizeof(CopyState) + inPtr->bufSize);
    csPtr->bufSize = inPtr->bufSize;
    csPtr->readPtr = inPtr;
    csPtr->writePtr = outPtr;
    csPtr->readFlags = readFlags;
    csPtr = (CopyState*) ckalloc(sizeof(CopyState) + inStatePtr->bufSize);
    csPtr->bufSize    = inStatePtr->bufSize;
    csPtr->readPtr    = inPtr;
    csPtr->writePtr   = outPtr;
    csPtr->readFlags  = readFlags;
    csPtr->writeFlags = writeFlags;
    csPtr->toRead = toRead;
    csPtr->total = 0;
    csPtr->interp = interp;
    csPtr->toRead     = toRead;
    csPtr->total      = 0;
    csPtr->interp     = interp;
    if (cmdPtr) {
	Tcl_IncrRefCount(cmdPtr);
    }
    csPtr->cmdPtr = cmdPtr;
    inPtr->csPtr = csPtr;
    outPtr->csPtr = csPtr;
    inStatePtr->csPtr = csPtr;
    outStatePtr->csPtr = csPtr;

    /*
     * Start copying data between the channels.
     */

    return CopyData(csPtr, 0);
}
7417
7418
7419
7420
7421
7422
7423

7424
7425
7426
7427
7428
7429
7430
7431






7432
7433
7434




7435
7436
7437
7438
7439
7440
7441
7442
7443
7444
7445



7446
7447
7448
7449
7450



7451
7452
7453
7454
7455
7456
7457
7458

7459
7460
7461
7462
7463
7464

7465
7466
7467
7468
7469
7470
7471
6950
6951
6952
6953
6954
6955
6956
6957
6958
6959
6960
6961




6962
6963
6964
6965
6966
6967
6968
6969
6970
6971
6972
6973
6974
6975
6976
6977
6978
6979
6980
6981
6982



6983
6984
6985
6986
6987



6988
6989
6990
6991
6992
6993
6994
6995
6996
6997

6998

6999
7000
7001
7002

7003
7004
7005
7006
7007
7008
7009
7010







+




-
-
-
-
+
+
+
+
+
+



+
+
+
+








-
-
-
+
+
+


-
-
-
+
+
+







-
+
-




-
+







CopyData(csPtr, mask)
    CopyState *csPtr;		/* State of copy operation. */
    int mask;			/* Current channel event flags. */
{
    Tcl_Interp *interp;
    Tcl_Obj *cmdPtr, *errObj = NULL;
    Tcl_Channel inChan, outChan;
    ChannelState *inStatePtr, *outStatePtr;
    int result = TCL_OK;
    int size;
    int total;

    inChan = (Tcl_Channel)csPtr->readPtr;
    outChan = (Tcl_Channel)csPtr->writePtr;
    interp = csPtr->interp;
    cmdPtr = csPtr->cmdPtr;
    inChan	= (Tcl_Channel) csPtr->readPtr;
    outChan	= (Tcl_Channel) csPtr->writePtr;
    inStatePtr	= csPtr->readPtr->state;
    outStatePtr	= csPtr->writePtr->state;
    interp	= csPtr->interp;
    cmdPtr	= csPtr->cmdPtr;

    /*
     * Copy the data the slow way, using the translation mechanism.
     *
     * Note: We have make sure that we use the topmost channel in a stack
     * for the copying. The caller uses Tcl_GetChannel to access it, and
     * thus gets the bottom of the stack.
     */

    while (csPtr->toRead != 0) {

	/*
	 * Check for unreported background errors.
	 */

	if (csPtr->readPtr->unreportedError != 0) {
	    Tcl_SetErrno(csPtr->readPtr->unreportedError);
	    csPtr->readPtr->unreportedError = 0;
	if (inStatePtr->unreportedError != 0) {
	    Tcl_SetErrno(inStatePtr->unreportedError);
	    inStatePtr->unreportedError = 0;
	    goto readError;
	}
	if (csPtr->writePtr->unreportedError != 0) {
	    Tcl_SetErrno(csPtr->writePtr->unreportedError);
	    csPtr->writePtr->unreportedError = 0;
	if (outStatePtr->unreportedError != 0) {
	    Tcl_SetErrno(outStatePtr->unreportedError);
	    outStatePtr->unreportedError = 0;
	    goto writeError;
	}
	
	/*
	 * Read up to bufSize bytes.
	 */

	if ((csPtr->toRead == -1)
	if ((csPtr->toRead == -1) || (csPtr->toRead > csPtr->bufSize)) {
		|| (csPtr->toRead > csPtr->bufSize)) {
	    size = csPtr->bufSize;
	} else {
	    size = csPtr->toRead;
	}
	size = DoRead(csPtr->readPtr, csPtr->buffer, size);
	size = DoRead(inStatePtr->topChanPtr, csPtr->buffer, size);

	if (size < 0) {
	    readError:
	    errObj = Tcl_NewObj();
	    Tcl_AppendStringsToObj(errObj, "error reading \"",
		    Tcl_GetChannelName(inChan), "\": ",
		    Tcl_PosixError(interp), (char *) NULL);
7490
7491
7492
7493
7494
7495
7496
7497

7498
7499
7500
7501
7502
7503
7504
7505
7506












7507
7508
7509
7510
7511
7512

7513
7514
7515

7516
7517
7518
7519
7520
7521
7522
7523
7524
7525
7526
7527
7528
7529
7530
7531
7532
7533
7534
7535
7536
7537
7538
7539
7029
7030
7031
7032
7033
7034
7035

7036
7037
7038
7039
7040
7041
7042
7043
7044
7045
7046
7047
7048
7049
7050
7051
7052
7053
7054
7055
7056
7057
7058
7059
7060
7061
7062

7063
7064
7065

7066
7067
7068
7069
7070
7071
7072
7073
7074









7075
7076
7077
7078
7079
7080
7081







-
+









+
+
+
+
+
+
+
+
+
+
+
+





-
+


-
+








-
-
-
-
-
-
-
-
-







	    return TCL_OK;
	}

	/*
	 * Now write the buffer out.
	 */

	size = DoWrite(csPtr->writePtr, csPtr->buffer, size);
	size = DoWrite(outStatePtr->topChanPtr, csPtr->buffer, size);
	if (size < 0) {
	    writeError:
	    errObj = Tcl_NewObj();
	    Tcl_AppendStringsToObj(errObj, "error writing \"",
		    Tcl_GetChannelName(outChan), "\": ",
		    Tcl_PosixError(interp), (char *) NULL);
	    break;
	}

	/*
	 * Update the current byte count.  Do it now so the count is
	 * valid before a return or break takes us out of the loop.
	 * The invariant at the top of the loop should be that 
	 * csPtr->toRead holds the number of bytes left to copy.
	 */

	if (csPtr->toRead != -1) {
	    csPtr->toRead -= size;
	}
	csPtr->total += size;

	/*
	 * Check to see if the write is happening in the background.  If so,
	 * stop copying and wait for the channel to become writable again.
	 */

	if (csPtr->writePtr->flags & BG_FLUSH_SCHEDULED) {
	if (outStatePtr->flags & BG_FLUSH_SCHEDULED) {
	    if (!(mask & TCL_WRITABLE)) {
		if (mask & TCL_READABLE) {
		    Tcl_DeleteChannelHandler(outChan, CopyEventProc,
		    Tcl_DeleteChannelHandler(inChan, CopyEventProc,
			    (ClientData) csPtr);
		}
		Tcl_CreateChannelHandler(outChan, TCL_WRITABLE,
			CopyEventProc, (ClientData) csPtr);
	    }
	    return TCL_OK;
	}

	/*
	 * Update the current byte count if we care.
	 */

	if (csPtr->toRead != -1) {
	    csPtr->toRead -= size;
	}
	csPtr->total += size;

	/*
	 * For background copies, we only do one buffer per invocation so
	 * we don't starve the rest of the system.
	 */

	if (cmdPtr) {
	    /*
7609
7610
7611
7612
7613
7614
7615

7616
7617
7618
7619
7620
7621

7622
7623
7624
7625
7626
7627
7628
7629


7630
7631

7632
7633
7634

7635
7636
7637

7638
7639
7640
7641


7642
7643
7644

7645
7646
7647
7648
7649
7650
7651
7652
7653
7654
7655
7656

7657
7658
7659
7660
7661
7662
7663
7151
7152
7153
7154
7155
7156
7157
7158
7159
7160
7161
7162
7163

7164
7165
7166
7167
7168
7169
7170


7171
7172
7173

7174
7175
7176

7177
7178
7179

7180
7181
7182


7183
7184
7185
7186

7187
7188
7189
7190
7191
7192
7193
7194
7195
7196
7197
7198

7199
7200
7201
7202
7203
7204
7205
7206







+





-
+






-
-
+
+

-
+


-
+


-
+


-
-
+
+


-
+











-
+








static int
DoRead(chanPtr, bufPtr, toRead)
    Channel *chanPtr;		/* The channel from which to read. */
    char *bufPtr;		/* Where to store input read. */
    int toRead;			/* Maximum number of bytes to read. */
{
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    int copied;			/* How many characters were copied into
                                 * the result string? */
    int copiedNow;		/* How many characters were copied from
                                 * the current input buffer? */
    int result;			/* Of calling GetInput. */
    

    /*
     * If we have not encountered a sticky EOF, clear the EOF bit. Either
     * way clear the BLOCKED bit. We want to discover these anew during
     * each operation.
     */

    if (!(chanPtr->flags & CHANNEL_STICKY_EOF)) {
        chanPtr->flags &= ~CHANNEL_EOF;
    if (!(statePtr->flags & CHANNEL_STICKY_EOF)) {
        statePtr->flags &= ~CHANNEL_EOF;
    }
    chanPtr->flags &= ~(CHANNEL_BLOCKED | CHANNEL_NEED_MORE_DATA);
    statePtr->flags &= ~(CHANNEL_BLOCKED | CHANNEL_NEED_MORE_DATA);
    
    for (copied = 0; copied < toRead; copied += copiedNow) {
        copiedNow = CopyAndTranslateBuffer(chanPtr, bufPtr + copied,
        copiedNow = CopyAndTranslateBuffer(statePtr, bufPtr + copied,
                toRead - copied);
        if (copiedNow == 0) {
            if (chanPtr->flags & CHANNEL_EOF) {
            if (statePtr->flags & CHANNEL_EOF) {
		goto done;
            }
            if (chanPtr->flags & CHANNEL_BLOCKED) {
                if (chanPtr->flags & CHANNEL_NONBLOCKING) {
            if (statePtr->flags & CHANNEL_BLOCKED) {
                if (statePtr->flags & CHANNEL_NONBLOCKING) {
		    goto done;
                }
                chanPtr->flags &= (~(CHANNEL_BLOCKED));
                statePtr->flags &= (~(CHANNEL_BLOCKED));
            }
            result = GetInput(chanPtr);
            if (result != 0) {
                if (result != EAGAIN) {
                    copied = -1;
                }
		goto done;
            }
        }
    }

    chanPtr->flags &= (~(CHANNEL_BLOCKED));
    statePtr->flags &= (~(CHANNEL_BLOCKED));

    done:
    /*
     * Update the notifier state so we don't block while there is still
     * data in the buffers.
     */

7681
7682
7683
7684
7685
7686
7687
7688
7689


7690
7691
7692
7693

7694
7695
7696
7697
7698
7699
7700
7701
7702
7703
7704
7705
7706
7707
7708
7709

7710
7711
7712

7713
7714
7715
7716

7717
7718
7719
7720
7721
7722
7723
7224
7225
7226
7227
7228
7229
7230


7231
7232
7233
7234
7235
7236
7237
7238
7239
7240
7241

7242
7243
7244
7245
7246
7247
7248
7249
7250
7251

7252
7253
7254

7255
7256
7257
7258

7259
7260
7261
7262
7263
7264
7265
7266







-
-
+
+




+




-










-
+


-
+



-
+







 * Side effects:
 *	Consumes buffered input. May deallocate one buffer.
 *
 *----------------------------------------------------------------------
 */

static int
CopyAndTranslateBuffer(chanPtr, result, space)
    Channel *chanPtr;		/* The channel from which to read input. */
CopyAndTranslateBuffer(statePtr, result, space)
    ChannelState *statePtr;	/* Channel state from which to read input. */
    char *result;		/* Where to store the copied input. */
    int space;			/* How many bytes are available in result
                                 * to store the copied input? */
{
    ChannelBuffer *bufPtr;	/* The buffer from which to copy bytes. */
    int bytesInBuffer;		/* How many bytes are available to be
                                 * copied in the current input buffer? */
    int copied;			/* How many characters were already copied
                                 * into the destination space? */
    ChannelBuffer *bufPtr;	/* The buffer from which to copy bytes. */
    int i;			/* Iterates over the copied input looking
                                 * for the input eofChar. */
    
    /*
     * If there is no input at all, return zero. The invariant is that either
     * there is no buffer in the queue, or if the first buffer is empty, it
     * is also the last buffer (and thus there is no input in the queue).
     * Note also that if the buffer is empty, we leave it in the queue.
     */
    
    if (chanPtr->inQueueHead == (ChannelBuffer *) NULL) {
    if (statePtr->inQueueHead == (ChannelBuffer *) NULL) {
        return 0;
    }
    bufPtr = chanPtr->inQueueHead;
    bufPtr = statePtr->inQueueHead;
    bytesInBuffer = bufPtr->nextAdded - bufPtr->nextRemoved;

    copied = 0;
    switch (chanPtr->inputTranslation) {
    switch (statePtr->inputTranslation) {
        case TCL_TRANSLATE_LF: {
            if (bytesInBuffer == 0) {
                return 0;
            }

	    /*
             * Copy the current chunk into the result buffer.
7766
7767
7768
7769
7770
7771
7772
7773

7774
7775
7776

7777
7778
7779
7780
7781
7782
7783
7309
7310
7311
7312
7313
7314
7315

7316
7317
7318

7319
7320
7321
7322
7323
7324
7325
7326







-
+


-
+







	    int curByte;
	    
            /*
             * If there is a held-back "\r" at EOF, produce it now.
             */
            
	    if (bytesInBuffer == 0) {
                if ((chanPtr->flags & (INPUT_SAW_CR | CHANNEL_EOF)) ==
                if ((statePtr->flags & (INPUT_SAW_CR | CHANNEL_EOF)) ==
                        (INPUT_SAW_CR | CHANNEL_EOF)) {
                    result[0] = '\r';
                    chanPtr->flags &= ~INPUT_SAW_CR;
                    statePtr->flags &= ~INPUT_SAW_CR;
                    return 1;
                }
                return 0;
            }

            /*
             * Copy the current chunk and replace "\r\n" with "\n"
7794
7795
7796
7797
7798
7799
7800
7801
7802
7803



7804
7805
7806
7807
7808

7809
7810
7811
7812
7813
7814
7815
7337
7338
7339
7340
7341
7342
7343



7344
7345
7346
7347
7348
7349
7350

7351
7352
7353
7354
7355
7356
7357
7358







-
-
-
+
+
+




-
+







	    copied = space;

	    end = result + copied;
	    dst = result;
	    for (src = result; src < end; src++) {
		curByte = *src;
		if (curByte == '\n') {
                    chanPtr->flags &= ~INPUT_SAW_CR;
		} else if (chanPtr->flags & INPUT_SAW_CR) {
		    chanPtr->flags &= ~INPUT_SAW_CR;
                    statePtr->flags &= ~INPUT_SAW_CR;
		} else if (statePtr->flags & INPUT_SAW_CR) {
		    statePtr->flags &= ~INPUT_SAW_CR;
		    *dst = '\r';
		    dst++;
		}
		if (curByte == '\r') {
		    chanPtr->flags |= INPUT_SAW_CR;
		    statePtr->flags |= INPUT_SAW_CR;
		} else {
		    *dst = (char) curByte;
		    dst++;
		}
	    }
	    copied = dst - result;
	    break;
7837
7838
7839
7840
7841
7842
7843
7844

7845
7846
7847
7848
7849

7850
7851
7852
7853

7854
7855
7856
7857
7858
7859
7860
7861
7862
7863
7864
7865
7866
7867
7868
7869
7870

7871
7872

7873
7874
7875
7876
7877
7878
7879


7880
7881
7882
7883
7884
7885
7886
7887
7888
7889
7890
7891
7892
7893



7894
7895

7896
7897
7898
7899
7900
7901
7902




























































































7903
7904
7905
7906
7907
7908
7909
7380
7381
7382
7383
7384
7385
7386

7387
7388
7389
7390
7391

7392
7393
7394
7395

7396
7397
7398
7399
7400
7401
7402
7403
7404
7405
7406
7407
7408
7409
7410
7411
7412

7413
7414

7415
7416
7417
7418
7419
7420


7421
7422
7423
7424
7425
7426
7427
7428
7429
7430
7431
7432
7433



7434
7435
7436
7437

7438
7439
7440
7441
7442
7443
7444
7445
7446
7447
7448
7449
7450
7451
7452
7453
7454
7455
7456
7457
7458
7459
7460
7461
7462
7463
7464
7465
7466
7467
7468
7469
7470
7471
7472
7473
7474
7475
7476
7477
7478
7479
7480
7481
7482
7483
7484
7485
7486
7487
7488
7489
7490
7491
7492
7493
7494
7495
7496
7497
7498
7499
7500
7501
7502
7503
7504
7505
7506
7507
7508
7509
7510
7511
7512
7513
7514
7515
7516
7517
7518
7519
7520
7521
7522
7523
7524
7525
7526
7527
7528
7529
7530
7531
7532
7533
7534
7535
7536
7537
7538
7539
7540
7541
7542
7543
7544







-
+




-
+



-
+
















-
+

-
+





-
-
+
+











-
-
-
+
+
+

-
+







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







	    copied = space;

	    end = result + copied;
	    dst = result;
	    for (src = result; src < end; src++) {
		curByte = *src;
		if (curByte == '\r') {
		    chanPtr->flags |= INPUT_SAW_CR;
		    statePtr->flags |= INPUT_SAW_CR;
		    *dst = '\n';
		    dst++;
		} else {
		    if ((curByte != '\n') || 
			    !(chanPtr->flags & INPUT_SAW_CR)) {
			    !(statePtr->flags & INPUT_SAW_CR)) {
			*dst = (char) curByte;
			dst++;
		    }
		    chanPtr->flags &= ~INPUT_SAW_CR;
		    statePtr->flags &= ~INPUT_SAW_CR;
		}
	    }
	    copied = dst - result;
            break;
	}
        default: {
            panic("unknown eol translation mode");
	}
    }

    /*
     * If an in-stream EOF character is set for this channel, check that
     * the input we copied so far does not contain the EOF char.  If it does,
     * copy only up to and excluding that character.
     */
    
    if (chanPtr->inEofChar != 0) {
    if (statePtr->inEofChar != 0) {
        for (i = 0; i < copied; i++) {
            if (result[i] == (char) chanPtr->inEofChar) {
            if (result[i] == (char) statePtr->inEofChar) {
		/*
		 * Set sticky EOF so that no further input is presented
		 * to the caller.
		 */
		
		chanPtr->flags |= (CHANNEL_EOF | CHANNEL_STICKY_EOF);
		chanPtr->inputEncodingFlags |= TCL_ENCODING_END;
		statePtr->flags |= (CHANNEL_EOF | CHANNEL_STICKY_EOF);
		statePtr->inputEncodingFlags |= TCL_ENCODING_END;
		copied = i;
                break;
            }
        }
    }

    /*
     * If the current buffer is empty recycle it.
     */

    if (bufPtr->nextRemoved == bufPtr->nextAdded) {
        chanPtr->inQueueHead = bufPtr->nextPtr;
        if (chanPtr->inQueueHead == (ChannelBuffer *) NULL) {
            chanPtr->inQueueTail = (ChannelBuffer *) NULL;
        statePtr->inQueueHead = bufPtr->nextPtr;
        if (statePtr->inQueueHead == (ChannelBuffer *) NULL) {
            statePtr->inQueueTail = (ChannelBuffer *) NULL;
        }
        RecycleBuffer(chanPtr, bufPtr, 0);
        RecycleBuffer(statePtr, bufPtr, 0);
    }

    /*
     * Return the number of characters copied into the result buffer.
     * This may be different from the number of bytes consumed, because
     * of EOL translations.
     */

    return copied;
}

/*
 *----------------------------------------------------------------------
 *
 * CopyBuffer --
 *
 *	Copy at most one buffer of input to the result space.
 *
 * Results:
 *	Number of bytes stored in the result buffer.  May return
 *	zero if no input is available.
 *
 * Side effects:
 *	Consumes buffered input. May deallocate one buffer.
 *
 *----------------------------------------------------------------------
 */

static int
CopyBuffer(chanPtr, result, space)
    Channel *chanPtr;		/* Channel from which to read input. */
    char *result;		/* Where to store the copied input. */
    int space;			/* How many bytes are available in result
                                 * to store the copied input? */
{
    ChannelBuffer *bufPtr;	/* The buffer from which to copy bytes. */
    int bytesInBuffer;		/* How many bytes are available to be
                                 * copied in the current input buffer? */
    int copied;			/* How many characters were already copied
                                 * into the destination space? */
    
    /*
     * If there is no input at all, return zero. The invariant is that
     * either there is no buffer in the queue, or if the first buffer
     * is empty, it is also the last buffer (and thus there is no
     * input in the queue).  Note also that if the buffer is empty, we
     * don't leave it in the queue, but recycle it.
     */
    
    if (chanPtr->inQueueHead == (ChannelBuffer *) NULL) {
        return 0;
    }
    bufPtr = chanPtr->inQueueHead;
    bytesInBuffer = bufPtr->nextAdded - bufPtr->nextRemoved;

    copied = 0;

    if (bytesInBuffer == 0) {
        RecycleBuffer(chanPtr->state, bufPtr, 0);
	chanPtr->inQueueHead = (ChannelBuffer*) NULL;
	chanPtr->inQueueTail = (ChannelBuffer*) NULL;
        return 0;
    }

    /*
     * Copy the current chunk into the result buffer.
     */

    if (bytesInBuffer < space) {
        space = bytesInBuffer;
    }

    memcpy((VOID *) result,
	   (VOID *) (bufPtr->buf + bufPtr->nextRemoved),
	   (size_t) space);
    bufPtr->nextRemoved += space;
    copied = space;

    /*
     * We don't care about in-stream EOF characters here as the data
     * read here may still flow through one or more transformations,
     * i.e. is not in its final state yet.
     */

    /*
     * If the current buffer is empty recycle it.
     */

    if (bufPtr->nextRemoved == bufPtr->nextAdded) {
        chanPtr->inQueueHead = bufPtr->nextPtr;
        if (chanPtr->inQueueHead == (ChannelBuffer *) NULL) {
            chanPtr->inQueueTail = (ChannelBuffer *) NULL;
        }
        RecycleBuffer(chanPtr->state, bufPtr, 0);
    }

    /*
     * Return the number of characters copied into the result buffer.
     */

    return copied;
}

/*
 *----------------------------------------------------------------------
 *
7927
7928
7929
7930
7931
7932
7933

7934
7935
7936
7937
7938
7939
7940
7562
7563
7564
7565
7566
7567
7568
7569
7570
7571
7572
7573
7574
7575
7576







+








static int
DoWrite(chanPtr, src, srcLen)
    Channel *chanPtr;			/* The channel to buffer output for. */
    char *src;				/* Data to write. */
    int srcLen;				/* Number of bytes to write. */
{
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    ChannelBuffer *outBufPtr;		/* Current output buffer. */
    int foundNewline;			/* Did we find a newline in output? */
    char *dPtr;
    char *sPtr;				/* Search variables for newline. */
    int crsent;				/* In CRLF eol translation mode,
                                         * remember the fact that a CR was
                                         * output to the channel without
7966
7967
7968
7969
7970
7971
7972
7973
7974


7975
7976
7977

7978
7979
7980
7981
7982
7983
7984
7985

7986
7987
7988
7989
7990
7991
7992
7602
7603
7604
7605
7606
7607
7608


7609
7610
7611
7612

7613
7614
7615
7616
7617
7618
7619
7620

7621
7622
7623
7624
7625
7626
7627
7628







-
-
+
+


-
+







-
+








    while (srcLen > 0) {
        
        /*
         * Make sure there is a current output buffer to accept output.
         */

        if (chanPtr->curOutPtr == (ChannelBuffer *) NULL) {
            chanPtr->curOutPtr = AllocChannelBuffer(chanPtr->bufSize);
        if (statePtr->curOutPtr == (ChannelBuffer *) NULL) {
            statePtr->curOutPtr = AllocChannelBuffer(statePtr->bufSize);
        }

        outBufPtr = chanPtr->curOutPtr;
        outBufPtr = statePtr->curOutPtr;

        destCopied = outBufPtr->bufLength - outBufPtr->nextAdded;
        if (destCopied > srcLen) {
            destCopied = srcLen;
        }
        
        destPtr = outBufPtr->buf + outBufPtr->nextAdded;
        switch (chanPtr->outputTranslation) {
        switch (statePtr->outputTranslation) {
            case TCL_TRANSLATE_LF:
                srcCopied = destCopied;
                memcpy((VOID *) destPtr, (VOID *) src, (size_t) destCopied);
                break;
            case TCL_TRANSLATE_CR:
                srcCopied = destCopied;
                memcpy((VOID *) destPtr, (VOID *) src, (size_t) destCopied);
8023
8024
8025
8026
8027
8028
8029
8030

8031
8032
8033


8034
8035
8036


8037
8038
8039
8040
8041
8042
8043

8044
8045
8046


8047
8048
8049
8050
8051
8052
8053
8054

8055
8056
8057
8058
8059
8060
8061
7659
7660
7661
7662
7663
7664
7665

7666
7667


7668
7669
7670


7671
7672
7673
7674
7675
7676
7677
7678

7679
7680


7681
7682
7683
7684
7685
7686
7687
7688
7689

7690
7691
7692
7693
7694
7695
7696
7697







-
+

-
-
+
+

-
-
+
+






-
+

-
-
+
+







-
+







        /*
         * The current buffer is ready for output if it is full, or if it
         * contains a newline and this channel is line-buffered, or if it
         * contains any output and this channel is unbuffered.
         */

        outBufPtr->nextAdded += destCopied;
        if (!(chanPtr->flags & BUFFER_READY)) {
        if (!(statePtr->flags & BUFFER_READY)) {
            if (outBufPtr->nextAdded == outBufPtr->bufLength) {
                chanPtr->flags |= BUFFER_READY;
            } else if (chanPtr->flags & CHANNEL_LINEBUFFERED) {
                statePtr->flags |= BUFFER_READY;
            } else if (statePtr->flags & CHANNEL_LINEBUFFERED) {
                for (sPtr = src, i = 0, foundNewline = 0;
                         (i < srcCopied) && (!foundNewline);
                         i++, sPtr++) {
		     (i < srcCopied) && (!foundNewline);
		     i++, sPtr++) {
                    if (*sPtr == '\n') {
                        foundNewline = 1;
                        break;
                    }
                }
                if (foundNewline) {
                    chanPtr->flags |= BUFFER_READY;
                    statePtr->flags |= BUFFER_READY;
                }
            } else if (chanPtr->flags & CHANNEL_UNBUFFERED) {
                chanPtr->flags |= BUFFER_READY;
            } else if (statePtr->flags & CHANNEL_UNBUFFERED) {
                statePtr->flags |= BUFFER_READY;
            }
        }
        
        totalDestCopied += srcCopied;
        src += srcCopied;
        srcLen -= srcCopied;

        if (chanPtr->flags & BUFFER_READY) {
        if (statePtr->flags & BUFFER_READY) {
            if (FlushChannel(NULL, chanPtr, 0) != 0) {
                return -1;
            }
        }
    } /* Closes "while" */

    return totalDestCopied;
8104
8105
8106
8107
8108
8109
8110

8111
8112
8113
8114
8115
8116



8117
8118
8119
8120
8121
8122

8123
8124
8125
8126
8127



8128
8129
8130
8131
8132
8133


8134
8135
8136
8137
8138
8139

8140
8141
8142
8143
8144
8145
8146
8147


8148
8149














































8150
8151
8152
8153
8154
8155
8156
7740
7741
7742
7743
7744
7745
7746
7747
7748
7749
7750
7751
7752
7753
7754
7755
7756
7757
7758
7759
7760
7761

7762
7763
7764
7765


7766
7767
7768
7769
7770
7771
7772


7773
7774
7775

7776
7777
7778

7779
7780
7781
7782
7783
7784
7785


7786
7787
7788
7789
7790
7791
7792
7793
7794
7795
7796
7797
7798
7799
7800
7801
7802
7803
7804
7805
7806
7807
7808
7809
7810
7811
7812
7813
7814
7815
7816
7817
7818
7819
7820
7821
7822
7823
7824
7825
7826
7827
7828
7829
7830
7831
7832
7833
7834
7835
7836
7837
7838
7839
7840
7841
7842







+






+
+
+





-
+



-
-
+
+
+




-
-
+
+

-



-
+






-
-
+
+


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







 *----------------------------------------------------------------------
 */

static void
StopCopy(csPtr)
    CopyState *csPtr;		/* State for bg copy to stop . */
{
    ChannelState *inStatePtr, *outStatePtr;
    int nonBlocking;

    if (!csPtr) {
	return;
    }

    inStatePtr	= csPtr->readPtr->state;
    outStatePtr	= csPtr->writePtr->state;

    /*
     * Restore the old blocking mode and output buffering mode.
     */

    nonBlocking = (csPtr->readFlags & CHANNEL_NONBLOCKING);
    if (nonBlocking != (csPtr->readPtr->flags & CHANNEL_NONBLOCKING)) {
    if (nonBlocking != (inStatePtr->flags & CHANNEL_NONBLOCKING)) {
	SetBlockMode(NULL, csPtr->readPtr,
		nonBlocking ? TCL_MODE_NONBLOCKING : TCL_MODE_BLOCKING);
    }
    if (csPtr->writePtr != csPtr->writePtr) {
	if (nonBlocking != (csPtr->writePtr->flags & CHANNEL_NONBLOCKING)) {
    if (csPtr->readPtr != csPtr->writePtr) {
	nonBlocking = (csPtr->writeFlags & CHANNEL_NONBLOCKING);
	if (nonBlocking != (outStatePtr->flags & CHANNEL_NONBLOCKING)) {
	    SetBlockMode(NULL, csPtr->writePtr,
		    nonBlocking ? TCL_MODE_NONBLOCKING : TCL_MODE_BLOCKING);
	}
    }
    csPtr->writePtr->flags &= ~(CHANNEL_LINEBUFFERED | CHANNEL_UNBUFFERED);
    csPtr->writePtr->flags |=
    outStatePtr->flags &= ~(CHANNEL_LINEBUFFERED | CHANNEL_UNBUFFERED);
    outStatePtr->flags |=
	csPtr->writeFlags & (CHANNEL_LINEBUFFERED | CHANNEL_UNBUFFERED);
	    

    if (csPtr->cmdPtr) {
	Tcl_DeleteChannelHandler((Tcl_Channel)csPtr->readPtr, CopyEventProc,
	    (ClientData)csPtr);
		(ClientData)csPtr);
	if (csPtr->readPtr != csPtr->writePtr) {
	    Tcl_DeleteChannelHandler((Tcl_Channel)csPtr->writePtr,
		    CopyEventProc, (ClientData)csPtr);
	}
        Tcl_DecrRefCount(csPtr->cmdPtr);
    }
    csPtr->readPtr->csPtr = NULL;
    csPtr->writePtr->csPtr = NULL;
    inStatePtr->csPtr  = NULL;
    outStatePtr->csPtr = NULL;
    ckfree((char*) csPtr);
}

/*
 *----------------------------------------------------------------------
 *
 * StackSetBlockMode --
 *
 *	This function sets the blocking mode for a channel, iterating
 *	through each channel in a stack and updates the state flags.
 *
 * Results:
 *	0 if OK, result code from failed blockModeProc otherwise.
 *
 * Side effects:
 *	Modifies the blocking mode of the channel and possibly generates
 *	an error.
 *
 *----------------------------------------------------------------------
 */

static int
StackSetBlockMode(chanPtr, mode)
    Channel *chanPtr;		/* Channel to modify. */
    int mode;			/* One of TCL_MODE_BLOCKING or
				 * TCL_MODE_NONBLOCKING. */
{
    int result = 0;
    Tcl_DriverBlockModeProc *blockModeProc;

    /*
     * Start at the top of the channel stack
     */

    chanPtr = chanPtr->state->topChanPtr;
    while (chanPtr != (Channel *) NULL) {
	blockModeProc = Tcl_ChannelBlockModeProc(chanPtr->typePtr);
	if (blockModeProc != NULL) {
	    result = (*blockModeProc) (chanPtr->instanceData, mode);
	    if (result != 0) {
		Tcl_SetErrno(result);
		return result;
	    }
	}
	chanPtr = chanPtr->downChanPtr;
    }
    return 0;
}

/*
 *----------------------------------------------------------------------
 *
 * SetBlockMode --
 *
 *	This function sets the blocking mode for a channel and updates
8169
8170
8171
8172
8173
8174
8175

8176
8177
8178
8179
8180


8181
8182
8183
8184
8185
8186
8187
8188
8189
8190

8191
8192

8193
8194
8195
8196
8197
8198
8199
7855
7856
7857
7858
7859
7860
7861
7862
7863




7864
7865
7866

7867
7868
7869
7870
7871
7872
7873

7874
7875

7876
7877
7878
7879
7880
7881
7882
7883







+

-
-
-
-
+
+

-







-
+

-
+







static int
SetBlockMode(interp, chanPtr, mode)
    Tcl_Interp *interp;		/* Interp for error reporting. */
    Channel *chanPtr;		/* Channel to modify. */
    int mode;			/* One of TCL_MODE_BLOCKING or
				 * TCL_MODE_NONBLOCKING. */
{
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    int result = 0;
    if (chanPtr->typePtr->blockModeProc != NULL) {
	result = (chanPtr->typePtr->blockModeProc) (chanPtr->instanceData,
		mode);
    }

    result = StackSetBlockMode(chanPtr, mode);
    if (result != 0) {
	Tcl_SetErrno(result);
	if (interp != (Tcl_Interp *) NULL) {
	    Tcl_AppendResult(interp, "error setting blocking mode: ",
		    Tcl_PosixError(interp), (char *) NULL);
	}
	return TCL_ERROR;
    }
    if (mode == TCL_MODE_BLOCKING) {
	chanPtr->flags &= (~(CHANNEL_NONBLOCKING | BG_FLUSH_SCHEDULED));
	statePtr->flags &= (~(CHANNEL_NONBLOCKING | BG_FLUSH_SCHEDULED));
    } else {
	chanPtr->flags |= CHANNEL_NONBLOCKING;
	statePtr->flags |= CHANNEL_NONBLOCKING;
    }
    return TCL_OK;
}

/*
 *----------------------------------------------------------------------
 *
8236
8237
8238
8239
8240
8241
8242
8243
8244

8245
8246





8247









8248
8249
8250
8251
8252








8253
8254

8255
8256

8257
8258




8259

8260

8261
8262
8263
8264
8265
8266
8267
8268














































































































































































































































































































































7920
7921
7922
7923
7924
7925
7926

7927
7928


7929
7930
7931
7932
7933
7934
7935
7936
7937
7938
7939
7940
7941
7942
7943





7944
7945
7946
7947
7948
7949
7950
7951
7952

7953
7954

7955
7956
7957
7958
7959
7960
7961

7962
7963
7964
7965
7966
7967
7968
7969
7970
7971
7972
7973
7974
7975
7976
7977
7978
7979
7980
7981
7982
7983
7984
7985
7986
7987
7988
7989
7990
7991
7992
7993
7994
7995
7996
7997
7998
7999
8000
8001
8002
8003
8004
8005
8006
8007
8008
8009
8010
8011
8012
8013
8014
8015
8016
8017
8018
8019
8020
8021
8022
8023
8024
8025
8026
8027
8028
8029
8030
8031
8032
8033
8034
8035
8036
8037
8038
8039
8040
8041
8042
8043
8044
8045
8046
8047
8048
8049
8050
8051
8052
8053
8054
8055
8056
8057
8058
8059
8060
8061
8062
8063
8064
8065
8066
8067
8068
8069
8070
8071
8072
8073
8074
8075
8076
8077
8078
8079
8080
8081
8082
8083
8084
8085
8086
8087
8088
8089
8090
8091
8092
8093
8094
8095
8096
8097
8098
8099
8100
8101
8102
8103
8104
8105
8106
8107
8108
8109
8110
8111
8112
8113
8114
8115
8116
8117
8118
8119
8120
8121
8122
8123
8124
8125
8126
8127
8128
8129
8130
8131
8132
8133
8134
8135
8136
8137
8138
8139
8140
8141
8142
8143
8144
8145
8146
8147
8148
8149
8150
8151
8152
8153
8154
8155
8156
8157
8158
8159
8160
8161
8162
8163
8164
8165
8166
8167
8168
8169
8170
8171
8172
8173
8174
8175
8176
8177
8178
8179
8180
8181
8182
8183
8184
8185
8186
8187
8188
8189
8190
8191
8192
8193
8194
8195
8196
8197
8198
8199
8200
8201
8202
8203
8204
8205
8206
8207
8208
8209
8210
8211
8212
8213
8214
8215
8216
8217
8218
8219
8220
8221
8222
8223
8224
8225
8226
8227
8228
8229
8230
8231
8232
8233
8234
8235
8236
8237
8238
8239
8240
8241
8242
8243
8244
8245
8246
8247
8248
8249
8250
8251
8252
8253
8254
8255
8256
8257
8258
8259
8260
8261
8262
8263
8264
8265
8266
8267
8268
8269
8270
8271
8272
8273
8274
8275
8276
8277
8278
8279
8280
8281
8282
8283
8284
8285
8286
8287
8288
8289
8290
8291
8292
8293
8294
8295
8296
8297
8298
8299
8300
8301
8302
8303
8304
8305
8306







-

+
-
-
+
+
+
+
+

+
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+

-
+

-
+


+
+
+
+
-
+

+








+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 */

int
Tcl_GetChannelNamesEx(interp, pattern)
    Tcl_Interp *interp;		/* Interp for error reporting. */
    char *pattern;		/* pattern to filter on. */
{
    Channel *chanPtr;
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
    ChannelState *statePtr;
    char *name;
    Tcl_Obj *resultPtr;
    char *name;			/* name for channel */
    Tcl_Obj *resultPtr;		/* pointer to result object */
    Tcl_HashTable *hTblPtr;	/* Hash table of channels. */
    Tcl_HashEntry *hPtr;	/* Search variable. */
    Tcl_HashSearch hSearch;	/* Search variable. */

    if (interp == (Tcl_Interp *) NULL) {
	return TCL_OK;
    }

    /*
     * Get the channel table that stores the channels registered
     * for this interpreter.
     */
    hTblPtr	= GetChannelTable(interp);
    resultPtr = Tcl_GetObjResult(interp);
    for (chanPtr = tsdPtr->firstChanPtr;
	 chanPtr != NULL;
	 chanPtr = chanPtr->nextChanPtr) {
        if (chanPtr == (Channel *) tsdPtr->stdinChannel) {
    resultPtr	= Tcl_GetObjResult(interp);

    for (hPtr = Tcl_FirstHashEntry(hTblPtr, &hSearch);
	 hPtr != (Tcl_HashEntry *) NULL;
	 hPtr = Tcl_NextHashEntry(&hSearch)) {

	statePtr = ((Channel *) Tcl_GetHashValue(hPtr))->state;
        if (statePtr->topChanPtr == (Channel *) tsdPtr->stdinChannel) {
	    name = "stdin";
	} else if (chanPtr == (Channel *) tsdPtr->stdoutChannel) {
	} else if (statePtr->topChanPtr == (Channel *) tsdPtr->stdoutChannel) {
	    name = "stdout";
	} else if (chanPtr == (Channel *) tsdPtr->stderrChannel) {
	} else if (statePtr->topChanPtr == (Channel *) tsdPtr->stderrChannel) {
	    name = "stderr";
	} else {
	    /*
	     * This is also stored in Tcl_GetHashKey(hTblPtr, hPtr),
	     * but it's simpler to just grab the name from the statePtr.
	     */
	    name = chanPtr->channelName;
	    name = statePtr->channelName;
	}

	if (((pattern == NULL) || Tcl_StringMatch(name, pattern)) &&
		(Tcl_ListObjAppendElement(interp, resultPtr,
			Tcl_NewStringObj(name, -1)) != TCL_OK)) {
	    return TCL_ERROR;
	}
    }
    return TCL_OK;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ChannelName --
 *
 *	Return the name of the channel type.
 *
 * Results:
 *	A pointer the name of the channel type.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

char *
Tcl_ChannelName(chanTypePtr)
    Tcl_ChannelType *chanTypePtr;	/* Pointer to channel type. */
{
    return (chanTypePtr->typeName);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ChannelVersion --
 *
 *	Return the of version of the channel type.
 *
 * Results:
 *	TCL_CHANNEL_VERSION_2 or TCL_CHANNEL_VERSION_1.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_ChannelTypeVersion
Tcl_ChannelVersion(chanTypePtr)
    Tcl_ChannelType *chanTypePtr;	/* Pointer to channel type. */
{
    if (chanTypePtr->version == TCL_CHANNEL_VERSION_2) {
	return TCL_CHANNEL_VERSION_2;
    } else {
	/*
	 * In <v2 channel versions, the version field is occupied
	 * by the Tcl_DriverBlockModeProc
	 */
	return TCL_CHANNEL_VERSION_1;
    }
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ChannelBlockModeProc --
 *
 *	Return the Tcl_DriverBlockModeProc of the channel type.
 *
 * Results:
 *	A pointer to the proc.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_DriverBlockModeProc *
Tcl_ChannelBlockModeProc(chanTypePtr)
    Tcl_ChannelType *chanTypePtr;	/* Pointer to channel type. */
{
    if (chanTypePtr->version == TCL_CHANNEL_VERSION_2) {
	return (chanTypePtr->blockModeProc);
    } else {
	return (Tcl_DriverBlockModeProc *) (chanTypePtr->version);
    }
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ChannelCloseProc --
 *
 *	Return the Tcl_DriverCloseProc of the channel type.
 *
 * Results:
 *	A pointer to the proc.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_DriverCloseProc *
Tcl_ChannelCloseProc(chanTypePtr)
    Tcl_ChannelType *chanTypePtr;	/* Pointer to channel type. */
{
    return (chanTypePtr->closeProc);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ChannelClose2Proc --
 *
 *	Return the Tcl_DriverClose2Proc of the channel type.
 *
 * Results:
 *	A pointer to the proc.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_DriverClose2Proc *
Tcl_ChannelClose2Proc(chanTypePtr)
    Tcl_ChannelType *chanTypePtr;	/* Pointer to channel type. */
{
    return (chanTypePtr->close2Proc);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ChannelInputProc --
 *
 *	Return the Tcl_DriverInputProc of the channel type.
 *
 * Results:
 *	A pointer to the proc.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_DriverInputProc *
Tcl_ChannelInputProc(chanTypePtr)
    Tcl_ChannelType *chanTypePtr;	/* Pointer to channel type. */
{
    return (chanTypePtr->inputProc);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ChannelOutputProc --
 *
 *	Return the Tcl_DriverOutputProc of the channel type.
 *
 * Results:
 *	A pointer to the proc.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_DriverOutputProc *
Tcl_ChannelOutputProc(chanTypePtr)
    Tcl_ChannelType *chanTypePtr;	/* Pointer to channel type. */
{
    return (chanTypePtr->outputProc);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ChannelSeekProc --
 *
 *	Return the Tcl_DriverSeekProc of the channel type.
 *
 * Results:
 *	A pointer to the proc.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_DriverSeekProc *
Tcl_ChannelSeekProc(chanTypePtr)
    Tcl_ChannelType *chanTypePtr;	/* Pointer to channel type. */
{
    return (chanTypePtr->seekProc);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ChannelSetOptionProc --
 *
 *	Return the Tcl_DriverSetOptionProc of the channel type.
 *
 * Results:
 *	A pointer to the proc.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_DriverSetOptionProc *
Tcl_ChannelSetOptionProc(chanTypePtr)
    Tcl_ChannelType *chanTypePtr;	/* Pointer to channel type. */
{
    return (chanTypePtr->setOptionProc);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ChannelGetOptionProc --
 *
 *	Return the Tcl_DriverGetOptionProc of the channel type.
 *
 * Results:
 *	A pointer to the proc.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_DriverGetOptionProc *
Tcl_ChannelGetOptionProc(chanTypePtr)
    Tcl_ChannelType *chanTypePtr;	/* Pointer to channel type. */
{
    return (chanTypePtr->getOptionProc);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ChannelWatchProc --
 *
 *	Return the Tcl_DriverWatchProc of the channel type.
 *
 * Results:
 *	A pointer to the proc.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_DriverWatchProc *
Tcl_ChannelWatchProc(chanTypePtr)
    Tcl_ChannelType *chanTypePtr;	/* Pointer to channel type. */
{
    return (chanTypePtr->watchProc);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ChannelGetHandleProc --
 *
 *	Return the Tcl_DriverGetHandleProc of the channel type.
 *
 * Results:
 *	A pointer to the proc.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_DriverGetHandleProc *
Tcl_ChannelGetHandleProc(chanTypePtr)
    Tcl_ChannelType *chanTypePtr;	/* Pointer to channel type. */
{
    return (chanTypePtr->getHandleProc);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ChannelFlushProc --
 *
 *	Return the Tcl_DriverFlushProc of the channel type.
 *
 * Results:
 *	A pointer to the proc.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_DriverFlushProc *
Tcl_ChannelFlushProc(chanTypePtr)
    Tcl_ChannelType *chanTypePtr;	/* Pointer to channel type. */
{
    return (chanTypePtr->flushProc);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ChannelHandlerProc --
 *
 *	Return the Tcl_DriverHandlerProc of the channel type.
 *
 * Results:
 *	A pointer to the proc.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_DriverHandlerProc *
Tcl_ChannelHandlerProc(chanTypePtr)
    Tcl_ChannelType *chanTypePtr;	/* Pointer to channel type. */
{
    return (chanTypePtr->handlerProc);
}
Added generic/tclIO.h.






































































































































































































































































































































































































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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
/* 
 * tclIO.h --
 *
 *	This file provides the generic portions (those that are the same on
 *	all platforms and for all channel types) of Tcl's IO facilities.
 *
 * Copyright (c) 1998-2000 Ajuba Solutions
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclIO.h,v 1.1.4.2 2001/09/27 02:26:43 andreas_kupries Exp $
 */

/*
 * Make sure that both EAGAIN and EWOULDBLOCK are defined. This does not
 * compile on systems where neither is defined. We want both defined so
 * that we can test safely for both. In the code we still have to test for
 * both because there may be systems on which both are defined and have
 * different values.
 */

#if ((!defined(EWOULDBLOCK)) && (defined(EAGAIN)))
#   define EWOULDBLOCK EAGAIN
#endif
#if ((!defined(EAGAIN)) && (defined(EWOULDBLOCK)))
#   define EAGAIN EWOULDBLOCK
#endif
#if ((!defined(EAGAIN)) && (!defined(EWOULDBLOCK)))
error one of EWOULDBLOCK or EAGAIN must be defined
#endif

/*
 * The following structure encapsulates the state for a background channel
 * copy.  Note that the data buffer for the copy will be appended to this
 * structure.
 */

typedef struct CopyState {
    struct Channel *readPtr;	/* Pointer to input channel. */
    struct Channel *writePtr;	/* Pointer to output channel. */
    int readFlags;		/* Original read channel flags. */
    int writeFlags;		/* Original write channel flags. */
    int toRead;			/* Number of bytes to copy, or -1. */
    int total;			/* Total bytes transferred (written). */
    Tcl_Interp *interp;		/* Interp that started the copy. */
    Tcl_Obj *cmdPtr;		/* Command to be invoked at completion. */
    int bufSize;		/* Size of appended buffer. */
    char buffer[1];		/* Copy buffer, this must be the last
				 * field. */
} CopyState;

/*
 * struct ChannelBuffer:
 *
 * Buffers data being sent to or from a channel.
 */

typedef struct ChannelBuffer {
    int nextAdded;		/* The next position into which a character
                                 * will be put in the buffer. */
    int nextRemoved;		/* Position of next byte to be removed
                                 * from the buffer. */
    int bufLength;		/* How big is the buffer? */
    struct ChannelBuffer *nextPtr;
    				/* Next buffer in chain. */
    char buf[4];		/* Placeholder for real buffer. The real
                                 * buffer occuppies this space + bufSize-4
                                 * bytes. This must be the last field in
                                 * the structure. */
} ChannelBuffer;

#define CHANNELBUFFER_HEADER_SIZE	(sizeof(ChannelBuffer) - 4)

/*
 * How much extra space to allocate in buffer to hold bytes from previous
 * buffer (when converting to UTF-8) or to hold bytes that will go to
 * next buffer (when converting from UTF-8).
 */
 
#define BUFFER_PADDING	    16
 
/*
 * The following defines the *default* buffer size for channels.
 */

#define CHANNELBUFFER_DEFAULT_SIZE	(1024 * 4)

/*
 * Structure to record a close callback. One such record exists for
 * each close callback registered for a channel.
 */

typedef struct CloseCallback {
    Tcl_CloseProc *proc;		/* The procedure to call. */
    ClientData clientData;		/* Arbitrary one-word data to pass
					 * to the callback. */
    struct CloseCallback *nextPtr;	/* For chaining close callbacks. */
} CloseCallback;

/*
 * The following structure describes the information saved from a call to
 * "fileevent". This is used later when the event being waited for to
 * invoke the saved script in the interpreter designed in this record.
 */

typedef struct EventScriptRecord {
    struct Channel *chanPtr;	/* The channel for which this script is
				 * registered. This is used only when an
				 * error occurs during evaluation of the
				 * script, to delete the handler. */
    Tcl_Obj *scriptPtr;		/* Script to invoke. */
    Tcl_Interp *interp;		/* In what interpreter to invoke script? */
    int mask;			/* Events must overlap current mask for the
				 * stored script to be invoked. */
    struct EventScriptRecord *nextPtr;
				/* Next in chain of records. */
} EventScriptRecord;

/*
 * struct Channel:
 *
 * One of these structures is allocated for each open channel. It contains data
 * specific to the channel but which belongs to the generic part of the Tcl
 * channel mechanism, and it points at an instance specific (and type
 * specific) * instance data, and at a channel type structure.
 */

typedef struct Channel {
    struct ChannelState *state; /* Split out state information */

    ClientData instanceData;	/* Instance-specific data provided by
				 * creator of channel. */
    Tcl_ChannelType *typePtr;	/* Pointer to channel type structure. */

    struct Channel *downChanPtr;/* Refers to channel this one was stacked
				 * upon.  This reference is NULL for normal
				 * channels.  See Tcl_StackChannel. */
    struct Channel *upChanPtr;	/* Refers to the channel above stacked this
				 * one. NULL for the top most channel. */

    /*
     * Intermediate buffers to hold pre-read data for consumption by a
     * newly stacked transformation. See 'Tcl_StackChannel'.
     */
    ChannelBuffer *inQueueHead;	/* Points at first buffer in input queue. */
    ChannelBuffer *inQueueTail;	/* Points at last buffer in input queue. */
} Channel;

/*
 * struct ChannelState:
 *
 * One of these structures is allocated for each open channel. It contains data
 * specific to the channel but which belongs to the generic part of the Tcl
 * channel mechanism, and it points at an instance specific (and type
 * specific) * instance data, and at a channel type structure.
 */

typedef struct ChannelState {
    char *channelName;		/* The name of the channel instance in Tcl
				 * commands. Storage is owned by the generic IO
				 * code, is dynamically allocated. */
    int	flags;			/* ORed combination of the flags defined
				 * below. */
    Tcl_Encoding encoding;	/* Encoding to apply when reading or writing
				 * data on this channel.  NULL means no
				 * encoding is applied to data. */
    Tcl_EncodingState inputEncodingState;
				/* Current encoding state, used when converting
				 * input data bytes to UTF-8. */
    int inputEncodingFlags;	/* Encoding flags to pass to conversion
				 * routine when converting input data bytes to
				 * UTF-8.  May be TCL_ENCODING_START before
				 * converting first byte and TCL_ENCODING_END
				 * when EOF is seen. */
    Tcl_EncodingState outputEncodingState;
				/* Current encoding state, used when converting
				 * UTF-8 to output data bytes. */
    int outputEncodingFlags;	/* Encoding flags to pass to conversion
				 * routine when converting UTF-8 to output
				 * data bytes.  May be TCL_ENCODING_START
				 * before converting first byte and
				 * TCL_ENCODING_END when EOF is seen. */
    Tcl_EolTranslation inputTranslation;
				/* What translation to apply for end of line
				 * sequences on input? */    
    Tcl_EolTranslation outputTranslation;
				/* What translation to use for generating
				 * end of line sequences in output? */
    int inEofChar;		/* If nonzero, use this as a signal of EOF
				 * on input. */
    int outEofChar;             /* If nonzero, append this to the channel
				 * when it is closed if it is open for
				 * writing. */
    int unreportedError;	/* Non-zero if an error report was deferred
				 * because it happened in the background. The
				 * value is the POSIX error code. */
    int refCount;		/* How many interpreters hold references to
				 * this IO channel? */

    CloseCallback *closeCbPtr;	/* Callbacks registered to be called when the
				 * channel is closed. */
    char *outputStage;		/* Temporary staging buffer used when
				 * translating EOL before converting from
				 * UTF-8 to external form. */
    ChannelBuffer *curOutPtr;	/* Current output buffer being filled. */
    ChannelBuffer *outQueueHead;/* Points at first buffer in output queue. */
    ChannelBuffer *outQueueTail;/* Points at last buffer in output queue. */

    ChannelBuffer *saveInBufPtr;/* Buffer saved for input queue - eliminates
				 * need to allocate a new buffer for "gets"
				 * that crosses buffer boundaries. */
    ChannelBuffer *inQueueHead;	/* Points at first buffer in input queue. */
    ChannelBuffer *inQueueTail;	/* Points at last buffer in input queue. */

    struct ChannelHandler *chPtr;/* List of channel handlers registered
				  * for this channel. */
    int interestMask;		/* Mask of all events this channel has
				 * handlers for. */
    EventScriptRecord *scriptRecordPtr;
				/* Chain of all scripts registered for
				 * event handlers ("fileevent") on this
				 * channel. */

    int bufSize;		/* What size buffers to allocate? */
    Tcl_TimerToken timer;	/* Handle to wakeup timer for this channel. */
    CopyState *csPtr;		/* State of background copy, or NULL. */
    Channel *topChanPtr;	/* Refers to topmost channel in a stack.
				 * Never NULL. */
    Channel *bottomChanPtr;	/* Refers to bottommost channel in a stack.
				 * This channel can be relied on to live as
				 * long as the channel state. Never NULL. */
    struct ChannelState *nextCSPtr;
				/* Next in list of channels currently open. */
} ChannelState;
    
/*
 * Values for the flags field in Channel. Any ORed combination of the
 * following flags can be stored in the field. These flags record various
 * options and state bits about the channel. In addition to the flags below,
 * the channel can also have TCL_READABLE (1<<1) and TCL_WRITABLE (1<<2) set.
 */

#define CHANNEL_NONBLOCKING	(1<<3)	/* Channel is currently in
					 * nonblocking mode. */
#define CHANNEL_LINEBUFFERED	(1<<4)	/* Output to the channel must be
					 * flushed after every newline. */
#define CHANNEL_UNBUFFERED	(1<<5)	/* Output to the channel must always
					 * be flushed immediately. */
#define BUFFER_READY		(1<<6)	/* Current output buffer (the
					 * curOutPtr field in the
                                         * channel structure) should be
                                         * output as soon as possible even
                                         * though it may not be full. */
#define BG_FLUSH_SCHEDULED	(1<<7)	/* A background flush of the
					 * queued output buffers has been
                                         * scheduled. */
#define CHANNEL_CLOSED		(1<<8)	/* Channel has been closed. No
					 * further Tcl-level IO on the
                                         * channel is allowed. */
#define CHANNEL_EOF		(1<<9)	/* EOF occurred on this channel.
					 * This bit is cleared before every
                                         * input operation. */
#define CHANNEL_STICKY_EOF	(1<<10)	/* EOF occurred on this channel because
					 * we saw the input eofChar. This bit
                                         * prevents clearing of the EOF bit
                                         * before every input operation. */
#define CHANNEL_BLOCKED		(1<<11)	/* EWOULDBLOCK or EAGAIN occurred
					 * on this channel. This bit is
					 * cleared before every input or
					 * output operation. */
#define INPUT_SAW_CR		(1<<12)	/* Channel is in CRLF eol input
					 * translation mode and the last
                                         * byte seen was a "\r". */
#define INPUT_NEED_NL		(1<<15)	/* Saw a '\r' at end of last buffer,
					 * and there should be a '\n' at
					 * beginning of next buffer. */
#define CHANNEL_DEAD		(1<<13)	/* The channel has been closed by
					 * the exit handler (on exit) but
                                         * not deallocated. When any IO
                                         * operation sees this flag on a
                                         * channel, it does not call driver
                                         * level functions to avoid referring
                                         * to deallocated data. */
#define CHANNEL_NEED_MORE_DATA	(1<<14)	/* The last input operation failed
					 * because there was not enough data
					 * to complete the operation.  This
					 * flag is set when gets fails to
					 * get a complete line or when read
					 * fails to get a complete character.
					 * When set, file events will not be
					 * delivered for buffered data until
					 * the state of the channel changes. */
#define CHANNEL_RAW_MODE	(1<<16)	/* When set, notes that the Raw API is
					 * being used. */
#define CHANNEL_TIMER_FEV       (1<<17) /* When set the event we are
					 * notified by is a fileevent
					 * generated by a timer. We
					 * don't know if the driver
					 * has more data and should
					 * not try to read from it. If
					 * the system needs more than
					 * is in the buffers out read
					 * routines will simulate a
					 * short read (0 characters
					 * read) */

/*
 * For each channel handler registered in a call to Tcl_CreateChannelHandler,
 * there is one record of the following type. All of records for a specific
 * channel are chained together in a singly linked list which is stored in
 * the channel structure.
 */

typedef struct ChannelHandler {
    Channel *chanPtr;		/* The channel structure for this channel. */
    int mask;			/* Mask of desired events. */
    Tcl_ChannelProc *proc;	/* Procedure to call in the type of
                                 * Tcl_CreateChannelHandler. */
    ClientData clientData;	/* Argument to pass to procedure. */
    struct ChannelHandler *nextPtr;
    				/* Next one in list of registered handlers. */
} ChannelHandler;

/*
 * This structure keeps track of the current ChannelHandler being invoked in
 * the current invocation of ChannelHandlerEventProc. There is a potential
 * problem if a ChannelHandler is deleted while it is the current one, since
 * ChannelHandlerEventProc needs to look at the nextPtr field. To handle this
 * problem, structures of the type below indicate the next handler to be
 * processed for any (recursively nested) dispatches in progress. The
 * nextHandlerPtr field is updated if the handler being pointed to is deleted.
 * The nextPtr field is used to chain together all recursive invocations, so
 * that Tcl_DeleteChannelHandler can find all the recursively nested
 * invocations of ChannelHandlerEventProc and compare the handler being
 * deleted against the NEXT handler to be invoked in that invocation; when it
 * finds such a situation, Tcl_DeleteChannelHandler updates the nextHandlerPtr
 * field of the structure to the next handler.
 */

typedef struct NextChannelHandler {
    ChannelHandler *nextHandlerPtr;	/* The next handler to be invoked in
                                         * this invocation. */
    struct NextChannelHandler *nestedHandlerPtr;
    /* Next nested invocation of
     * ChannelHandlerEventProc. */
} NextChannelHandler;


/*
 * The following structure describes the event that is added to the Tcl
 * event queue by the channel handler check procedure.
 */

typedef struct ChannelHandlerEvent {
    Tcl_Event header;		/* Standard header for all events. */
    Channel *chanPtr;		/* The channel that is ready. */
    int readyMask;		/* Events that have occurred. */
} ChannelHandlerEvent;

/*
 * The following structure is used by Tcl_GetsObj() to encapsulates the
 * state for a "gets" operation.
 */
 
typedef struct GetsState {
    Tcl_Obj *objPtr;		/* The object to which UTF-8 characters
				 * will be appended. */
    char **dstPtr;		/* Pointer into objPtr's string rep where
				 * next character should be stored. */
    Tcl_Encoding encoding;	/* The encoding to use to convert raw bytes
				 * to UTF-8.  */
    ChannelBuffer *bufPtr;	/* The current buffer of raw bytes being
				 * emptied. */
    Tcl_EncodingState state;	/* The encoding state just before the last
				 * external to UTF-8 conversion in
				 * FilterInputBytes(). */
    int rawRead;		/* The number of bytes removed from bufPtr
				 * in the last call to FilterInputBytes(). */
    int bytesWrote;		/* The number of bytes of UTF-8 data
				 * appended to objPtr during the last call to
				 * FilterInputBytes(). */
    int charsWrote;		/* The corresponding number of UTF-8
				 * characters appended to objPtr during the
				 * last call to FilterInputBytes(). */
    int totalChars;		/* The total number of UTF-8 characters
				 * appended to objPtr so far, just before the
				 * last call to FilterInputBytes(). */
} GetsState;
Changes to generic/tclIOCmd.c.
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10

11
12
13
14
15
16
17
18










-
+







/* 
 * tclIOCmd.c --
 *
 *	Contains the definitions of most of the Tcl commands relating to IO.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclIOCmd.c,v 1.7 1999/09/21 04:20:40 hobbs Exp $
 * RCS: @(#) $Id: tclIOCmd.c,v 1.7.2.2 2002/01/17 20:35:39 andreas_kupries Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

/*
 * Callback structure for accept callback in a TCP server.
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238

239
240
241
242
243
244

245
246
247
248
249
250
251
252
253
254
255
256
257
258
259

260
261


262
263
264
265
266
267
268
224
225
226
227
228
229
230








231

232
233
234
235

236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263







-
-
-
-
-
-
-
-
+
-




-
+















+


+
+







    }
    if ((mode & TCL_READABLE) == 0) {
	Tcl_AppendResult(interp, "channel \"", name,
		"\" wasn't opened for reading", (char *) NULL);
        return TCL_ERROR;
    }

    resultPtr = Tcl_GetObjResult(interp);
    linePtr = resultPtr;
    if (objc == 3) {
	/*
	 * Variable gets line, interp get bytecount.
	 */

	linePtr = Tcl_NewObj();
    linePtr = Tcl_NewObj();
    }

    lineLen = Tcl_GetsObj(chan, linePtr);
    if (lineLen < 0) {
        if (!Tcl_Eof(chan) && !Tcl_InputBlocked(chan)) {
	    if (linePtr != resultPtr) {
	    if (objc == 3) {
		Tcl_DecrRefCount(linePtr);
	    }
	    Tcl_ResetResult(interp);
	    Tcl_AppendResult(interp, "error reading \"", name, "\": ",
		    Tcl_PosixError(interp), (char *) NULL);
            return TCL_ERROR;
        }
        lineLen = -1;
    }
    if (objc == 3) {
	if (Tcl_ObjSetVar2(interp, objv[2], NULL, linePtr,
		TCL_LEAVE_ERR_MSG) == NULL) {
	    Tcl_DecrRefCount(linePtr);
            return TCL_ERROR;
        }
	resultPtr = Tcl_GetObjResult(interp);
	Tcl_SetIntObj(resultPtr, lineLen);
        return TCL_OK;
    } else {
	Tcl_SetObjResult(interp, linePtr);
    }
    return TCL_OK;
}

/*
 *----------------------------------------------------------------------
 *
Added generic/tclIOGT.c.















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
/*
 * tclIOGT.c --
 *
 *	Implements a generic transformation exposing the underlying API
 *	at the script level.  Contributed by Andreas Kupries.
 *
 * Copyright (c) 2000 Ajuba Solutions
 * Copyright (c) 1999-2000 Andreas Kupries (a.kupries@westend.com)
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * CVS: $Id: tclIOGT.c,v 1.1.4.3 2001/04/03 22:54:37 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"
#include "tclIO.h"


/*
 * Forward declarations of internal procedures.
 * First the driver procedures of the transformation.
 */

static int		TransformBlockModeProc _ANSI_ARGS_ ((
				ClientData instanceData, int mode));
static int		TransformCloseProc _ANSI_ARGS_ ((
				ClientData instanceData, Tcl_Interp* interp));
static int		TransformInputProc _ANSI_ARGS_ ((
				ClientData instanceData,
				char* buf, int toRead, int* errorCodePtr));
static int		TransformOutputProc _ANSI_ARGS_ ((
				ClientData instanceData,
				char*  buf, int toWrite, int* errorCodePtr));
static int		TransformSeekProc _ANSI_ARGS_ ((
				ClientData instanceData, long offset,
				int mode, int* errorCodePtr));
static int		TransformSetOptionProc _ANSI_ARGS_((
				ClientData instanceData, Tcl_Interp *interp,
				char *optionName, char *value));
static int		TransformGetOptionProc _ANSI_ARGS_((
				ClientData instanceData, Tcl_Interp *interp,
				char *optionName, Tcl_DString *dsPtr));
static void		TransformWatchProc _ANSI_ARGS_ ((
				ClientData instanceData, int mask));
static int		TransformGetFileHandleProc _ANSI_ARGS_ ((
				ClientData instanceData, int direction,
				ClientData* handlePtr));
static int		TransformNotifyProc _ANSI_ARGS_ ((
				ClientData instanceData, int mask));

/*
 * Forward declarations of internal procedures.
 * Secondly the procedures for handling and generating fileeevents.
 */

static void		TransformChannelHandlerTimer _ANSI_ARGS_ ((
				ClientData clientData));

/*
 * Forward declarations of internal procedures.
 * Third, helper procedures encapsulating essential tasks.
 */

typedef struct TransformChannelData TransformChannelData;

static int		ExecuteCallback _ANSI_ARGS_ ((
				TransformChannelData* ctrl, Tcl_Interp* interp,
				unsigned char* op, unsigned char* buf,
				int bufLen, int transmit, int preserve));

/*
 * Action codes to give to 'ExecuteCallback' (argument 'transmit')
 * confering to the procedure what to do with the result of the script
 * it calls.
 */

#define TRANSMIT_DONT  (0) /* No transfer to do */
#define TRANSMIT_DOWN  (1) /* Transfer to the underlying channel */
#define TRANSMIT_SELF  (2) /* Transfer into our channel. */
#define TRANSMIT_IBUF  (3) /* Transfer to internal input buffer */
#define TRANSMIT_NUM   (4) /* Transfer number to 'maxRead' */

/*
 * Codes for 'preserve' of 'ExecuteCallback'
 */

#define P_PRESERVE    (1)
#define P_NO_PRESERVE (0)

/*
 * Strings for the action codes delivered to the script implementing
 * a transformation. Argument 'op' of 'ExecuteCallback'.
 */

#define A_CREATE_WRITE	(UCHARP ("create/write"))
#define A_DELETE_WRITE	(UCHARP ("delete/write"))
#define A_FLUSH_WRITE	(UCHARP ("flush/write"))
#define A_WRITE		(UCHARP ("write"))

#define A_CREATE_READ	(UCHARP ("create/read"))
#define A_DELETE_READ	(UCHARP ("delete/read"))
#define A_FLUSH_READ	(UCHARP ("flush/read"))
#define A_READ		(UCHARP ("read"))

#define A_QUERY_MAXREAD (UCHARP ("query/maxRead"))
#define A_CLEAR_READ	(UCHARP ("clear/read"))

/*
 * Management of a simple buffer.
 */

typedef struct ResultBuffer ResultBuffer;

static void		ResultClear  _ANSI_ARGS_ ((ResultBuffer* r));
static void		ResultInit   _ANSI_ARGS_ ((ResultBuffer* r));
static int		ResultLength _ANSI_ARGS_ ((ResultBuffer* r));
static int		ResultCopy   _ANSI_ARGS_ ((ResultBuffer* r,
				unsigned char* buf, int toRead));
static void		ResultAdd    _ANSI_ARGS_ ((ResultBuffer* r,
				unsigned char* buf, int toWrite));

/*
 * This structure describes the channel type structure for tcl based
 * transformations.
 */

static Tcl_ChannelType transformChannelType = {
    "transform",			/* Type name. */
    TCL_CHANNEL_VERSION_2,
    TransformCloseProc,			/* Close proc. */
    TransformInputProc,			/* Input proc. */
    TransformOutputProc,		/* Output proc. */
    TransformSeekProc,			/* Seek proc. */
    TransformSetOptionProc,		/* Set option proc. */
    TransformGetOptionProc,		/* Get option proc. */
    TransformWatchProc,			/* Initialize notifier. */
    TransformGetFileHandleProc,		/* Get OS handles out of channel. */
    NULL,				/* close2proc */
    TransformBlockModeProc,		/* Set blocking/nonblocking mode.*/
    NULL,				/* Flush proc. */
    TransformNotifyProc,                /* Handling of events bubbling up */
};

/*
 * Possible values for 'flags' field in control structure, see below.
 */

#define CHANNEL_ASYNC		(1<<0) /* non-blocking mode */

/*
 * Definition of the structure containing the information about the
 * internal input buffer.
 */

struct ResultBuffer {
    unsigned char* buf;       /* Reference to the buffer area */
    int            allocated; /* Allocated size of the buffer area */
    int            used;      /* Number of bytes in the buffer, <= allocated */
};

/*
 * Additional bytes to allocate during buffer expansion
 */

#define INCREMENT (512)

/*
 * Number of milliseconds to wait before firing an event to flush
 * out information waiting in buffers (fileevent support).
 */

#define FLUSH_DELAY (5)

/*
 * Convenience macro to make some casts easier to use.
 */

#define UCHARP(x) ((unsigned char*) (x))
#define NO_INTERP ((Tcl_Interp*) NULL)

/*
 * Definition of a structure used by all transformations generated here to
 * maintain their local state.
 */

struct TransformChannelData {

    /*
     * General section. Data to integrate the transformation into the channel
     * system.
     */

    Tcl_Channel self;     /* Our own Channel handle */
    int readIsFlushed;    /* Flag to note wether in.flushProc was called or not
			   */
    int flags;            /* Currently CHANNEL_ASYNC or zero */
    int watchMask;        /* Current watch/event/interest mask */
    int mode;             /* mode of parent channel, OR'ed combination of
			   * TCL_READABLE, TCL_WRITABLE */
    Tcl_TimerToken timer; /* Timer for automatic flushing of information
			   * sitting in an internal buffer. Required for full
			   * fileevent support */
    /*
     * Transformation specific data.
     */

    int maxRead;            /* Maximum allowed number of bytes to read, as
			     * given to us by the tcl script implementing the
			     * transformation. */
    Tcl_Interp*    interp;  /* Reference to the interpreter which created the
			     * transformation. Used to execute the code
			     * below. */
    Tcl_Obj*       command; /* Tcl code to execute for a buffer */
    ResultBuffer   result;  /* Internal buffer used to store the result of a
			     * transformation of incoming data. Additionally
			     * serves as buffer of all data not yet consumed by
			     * the reader. */
};


/*
 *----------------------------------------------------------------------
 *
 * TclChannelTransform --
 *
 *	Implements the Tcl "testchannel transform" debugging command.
 *	This is part of the testing environment.  This sets up a tcl
 *	script (cmdObjPtr) to be used as a transform on the channel.
 *
 * Results:
 *	A standard Tcl result.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

	/* ARGSUSED */
int
TclChannelTransform(interp, chan, cmdObjPtr)
    Tcl_Interp	*interp;	/* Interpreter for result. */
    Tcl_Channel chan;		/* Channel to transform. */
    Tcl_Obj	*cmdObjPtr;	/* Script to use for transform. */
{
    Channel			*chanPtr;	/* The actual channel. */
    ChannelState		*statePtr;	/* state info for channel */
    int				mode;		/* rw mode of the channel */
    TransformChannelData	*dataPtr;
    int				res;
    Tcl_DString			ds;

    if (chan == (Tcl_Channel) NULL) {
	return TCL_ERROR;
    }
    chanPtr	= (Channel *) chan;
    statePtr	= chanPtr->state;
    chanPtr	= statePtr->topChanPtr;
    chan	= (Tcl_Channel) chanPtr;
    mode	= (statePtr->flags & (TCL_READABLE|TCL_WRITABLE));

    /*
     * Now initialize the transformation state and stack it upon the
     * specified channel. One of the necessary things to do is to
     * retrieve the blocking regime of the underlying channel and to
     * use the same for us too.
     */

    dataPtr = (TransformChannelData*) ckalloc(sizeof(TransformChannelData));

    Tcl_DStringInit (&ds);
    Tcl_GetChannelOption(interp, chan, "-blocking", &ds);

    dataPtr->readIsFlushed = 0;
    dataPtr->flags	= 0;

    if (ds.string[0] == '0') {
	dataPtr->flags |= CHANNEL_ASYNC;
    }

    Tcl_DStringFree (&ds);

    dataPtr->self	= chan;
    dataPtr->watchMask	= 0;
    dataPtr->mode	= mode;
    dataPtr->timer	= (Tcl_TimerToken) NULL;
    dataPtr->maxRead	= 4096; /* Initial value not relevant */
    dataPtr->interp	= interp;
    dataPtr->command	= cmdObjPtr;

    Tcl_IncrRefCount(dataPtr->command);

    ResultInit(&dataPtr->result);

    dataPtr->self = Tcl_StackChannel(interp, &transformChannelType,
	    (ClientData) dataPtr, mode, chan);
    if (dataPtr->self == (Tcl_Channel) NULL) {
	Tcl_AppendResult(interp, "\nfailed to stack channel \"",
		Tcl_GetChannelName(chan), "\"", (char *) NULL);

	Tcl_DecrRefCount(dataPtr->command);
	ResultClear(&dataPtr->result);
	ckfree((VOID *) dataPtr);
	return TCL_ERROR;
    }

    /*
     * At last initialize the transformation at the script level.
     */

    if (dataPtr->mode & TCL_WRITABLE) {
	res = ExecuteCallback (dataPtr, NO_INTERP, A_CREATE_WRITE,
		NULL, 0, TRANSMIT_DONT, P_NO_PRESERVE);

	if (res != TCL_OK) {
	    Tcl_UnstackChannel(interp, chan);
	    return TCL_ERROR;
	}
    }

    if (dataPtr->mode & TCL_READABLE) {
	res = ExecuteCallback (dataPtr, NO_INTERP, A_CREATE_READ,
		NULL, 0, TRANSMIT_DONT, P_NO_PRESERVE);

	if (res != TCL_OK) {
	    ExecuteCallback (dataPtr, NO_INTERP, A_DELETE_WRITE,
		    NULL, 0, TRANSMIT_DONT, P_NO_PRESERVE);

	    Tcl_UnstackChannel(interp, chan);
	    return TCL_ERROR;
	}
    }

    return TCL_OK;
}

/*
 *------------------------------------------------------*
 *
 *	ExecuteCallback --
 *
 *	Executes the defined callback for buffer and
 *	operation.
 *
 *	Sideeffects:
 *		As of the executed tcl script.
 *
 *	Result:
 *		A standard TCL error code. In case of an
 *		error a message is left in the result area
 *		of the specified interpreter.
 *
 *------------------------------------------------------*
 */

static int
ExecuteCallback (dataPtr, interp, op, buf, bufLen, transmit, preserve)
    TransformChannelData* dataPtr;     /* Transformation with the callback */
    Tcl_Interp*           interp;   /* Current interpreter, possibly NULL */
    unsigned char*        op;       /* Operation invoking the callback */
    unsigned char*        buf;      /* Buffer to give to the script. */
    int                   bufLen;   /* Ands its length */
    int                   transmit; /* Flag, determines whether the result
				     * of the callback is sent to the
				     * underlying channel or not. */
    int                   preserve; /* Flag. If true the procedure will
				     * preserver the result state of all
				     * accessed interpreters. */
{
    /*
     * Step 1, create the complete command to execute. Do this by appending
     * operation and buffer to operate upon to a copy of the callback
     * definition. We *cannot* create a list containing 3 objects and then use
     * 'Tcl_EvalObjv', because the command may contain additional prefixed
     * arguments. Feather's curried commands would come in handy here.
     */

    Tcl_Obj*        resObj; /* See below, switch (transmit) */
    int             resLen;
    unsigned char*  resBuf;
    Tcl_SavedResult ciSave;

    int res = TCL_OK;
    Tcl_Obj* command = Tcl_DuplicateObj (dataPtr->command);
    Tcl_Obj* temp;


    if (preserve) {
	Tcl_SaveResult (dataPtr->interp, &ciSave);
    }

    if (command == (Tcl_Obj*) NULL) {
        /* Memory allocation problem */
        res = TCL_ERROR;
        goto cleanup;
    }

    Tcl_IncrRefCount(command);

    temp = Tcl_NewStringObj((char*) op, -1);

    if (temp == (Tcl_Obj*) NULL) {
        /* Memory allocation problem */
        res = TCL_ERROR;
        goto cleanup;
    }

    res = Tcl_ListObjAppendElement(dataPtr->interp, command, temp);

    if (res != TCL_OK)
	goto cleanup;

    /*
     * Use a byte-array to prevent the misinterpretation of binary data
     * coming through as UTF while at the tcl level.
     */

    temp = Tcl_NewByteArrayObj(buf, bufLen);

    if (temp == (Tcl_Obj*) NULL) {
        /* Memory allocation problem */
	res = TCL_ERROR;
        goto cleanup;
    }

    res = Tcl_ListObjAppendElement (dataPtr->interp, command, temp);

    if (res != TCL_OK)
        goto cleanup;

    /*
     * Step 2, execute the command at the global level of the interpreter
     * used to create the transformation. Destroy the command afterward.
     * If an error occured and the current interpreter is defined and not
     * equal to the interpreter for the callback, then copy the error
     * message into current interpreter. Don't copy if in preservation mode.
     */

    res = Tcl_GlobalEvalObj (dataPtr->interp, command);
    Tcl_DecrRefCount (command);
    command = (Tcl_Obj*) NULL;

    if ((res != TCL_OK) && (interp != NO_INTERP) &&
	    (dataPtr->interp != interp) && !preserve) {
        Tcl_SetObjResult(interp, Tcl_GetObjResult(dataPtr->interp));
	return res;
    }

    /*
     * Step 3, transmit a possible conversion result to the underlying
     * channel, or ourselves.
     */

    switch (transmit) {
	case TRANSMIT_DONT:
	    /* nothing to do */
	    break;

	case TRANSMIT_DOWN:
	    resObj = Tcl_GetObjResult(dataPtr->interp);
	    resBuf = (unsigned char*) Tcl_GetByteArrayFromObj(resObj, &resLen);
	    Tcl_WriteRaw(Tcl_GetStackedChannel(dataPtr->self),
		    (char*) resBuf, resLen);
	    break;

	case TRANSMIT_SELF:
	    resObj = Tcl_GetObjResult (dataPtr->interp);
	    resBuf = (unsigned char*) Tcl_GetByteArrayFromObj(resObj, &resLen);
	    Tcl_WriteRaw(dataPtr->self, (char*) resBuf, resLen);
	    break;

	case TRANSMIT_IBUF:
	    resObj = Tcl_GetObjResult (dataPtr->interp);
	    resBuf = (unsigned char*) Tcl_GetByteArrayFromObj(resObj, &resLen);
	    ResultAdd(&dataPtr->result, resBuf, resLen);
	    break;

	case TRANSMIT_NUM:
	    /* Interpret result as integer number */
	    resObj = Tcl_GetObjResult (dataPtr->interp);
	    Tcl_GetIntFromObj(dataPtr->interp, resObj, &dataPtr->maxRead);
	    break;
    }

    Tcl_ResetResult(dataPtr->interp);

    if (preserve) {
	Tcl_RestoreResult(dataPtr->interp, &ciSave);
    }

    return res;

    cleanup:
    if (preserve) {
	Tcl_RestoreResult(dataPtr->interp, &ciSave);
    }

    if (command != (Tcl_Obj*) NULL) {
        Tcl_DecrRefCount(command);
    }

    return res;
}

/*
 *------------------------------------------------------*
 *
 *	TransformBlockModeProc --
 *
 *	Trap handler. Called by the generic IO system
 *	during option processing to change the blocking
 *	mode of the channel.
 *
 *	Sideeffects:
 *		Forwards the request to the underlying
 *		channel.
 *
 *	Result:
 *		0 if successful, errno when failed.
 *
 *------------------------------------------------------*
 */

static int
TransformBlockModeProc (instanceData, mode)
    ClientData  instanceData; /* State of transformation */
    int         mode;         /* New blocking mode */
{
    TransformChannelData* dataPtr = (TransformChannelData*) instanceData;

    if (mode == TCL_MODE_NONBLOCKING) {
        dataPtr->flags |= CHANNEL_ASYNC;
    } else {
        dataPtr->flags &= ~(CHANNEL_ASYNC);
    }
    return 0;
}

/*
 *------------------------------------------------------*
 *
 *	TransformCloseProc --
 *
 *	Trap handler. Called by the generic IO system
 *	during destruction of the transformation channel.
 *
 *	Sideeffects:
 *		Releases the memory allocated in
 *		'Tcl_TransformObjCmd'.
 *
 *	Result:
 *		None.
 *
 *------------------------------------------------------*
 */

static int
TransformCloseProc (instanceData, interp)
    ClientData  instanceData;
    Tcl_Interp* interp;
{
    TransformChannelData* dataPtr = (TransformChannelData*) instanceData;

    /*
     * Important: In this procedure 'dataPtr->self' already points to
     * the underlying channel.
     */

    /*
     * There is no need to cancel an existing channel handler, this is already
     * done. Either by 'Tcl_UnstackChannel' or by the general cleanup in
     * 'Tcl_Close'.
     *
     * But we have to cancel an active timer to prevent it from firing on the
     * removed channel.
     */

    if (dataPtr->timer != (Tcl_TimerToken) NULL) {
        Tcl_DeleteTimerHandler (dataPtr->timer);
	dataPtr->timer = (Tcl_TimerToken) NULL;
    }

    /*
     * Now flush data waiting in internal buffers to output and input. The
     * input must be done despite the fact that there is no real receiver
     * for it anymore. But the scripts might have sideeffects other parts
     * of the system rely on (f.e. signaling the close to interested parties).
     */

    if (dataPtr->mode & TCL_WRITABLE) {
        ExecuteCallback (dataPtr, interp, A_FLUSH_WRITE,
		NULL, 0, TRANSMIT_DOWN, 1);
    }

    if ((dataPtr->mode & TCL_READABLE) && !dataPtr->readIsFlushed) {
	dataPtr->readIsFlushed = 1;
        ExecuteCallback (dataPtr, interp, A_FLUSH_READ,
		NULL, 0, TRANSMIT_IBUF, 1);
    }

    if (dataPtr->mode & TCL_WRITABLE) {
        ExecuteCallback (dataPtr, interp, A_DELETE_WRITE,
		NULL, 0, TRANSMIT_DONT, 1);
    }

    if (dataPtr->mode & TCL_READABLE) {
        ExecuteCallback (dataPtr, interp, A_DELETE_READ,
		NULL, 0, TRANSMIT_DONT, 1);
    }

    /*
     * General cleanup
     */

    ResultClear(&dataPtr->result);
    Tcl_DecrRefCount(dataPtr->command);
    ckfree((VOID*) dataPtr);

    return TCL_OK;
}

/*
 *------------------------------------------------------*
 *
 *	TransformInputProc --
 *
 *	Called by the generic IO system to convert read data.
 *
 *	Sideeffects:
 *		As defined by the conversion.
 *
 *	Result:
 *		A transformed buffer.
 *
 *------------------------------------------------------*
 */

static int
TransformInputProc (instanceData, buf, toRead, errorCodePtr)
    ClientData instanceData;
    char*      buf;
    int        toRead;
    int*       errorCodePtr;
{
    TransformChannelData* dataPtr = (TransformChannelData*) instanceData;
    int gotBytes, read, res, copied;
    Tcl_Channel downChan;

    /* should assert (dataPtr->mode & TCL_READABLE) */

    if (toRead == 0) {
	/* Catch a no-op.
	 */
	return 0;
    }

    gotBytes = 0;
    downChan = Tcl_GetStackedChannel(dataPtr->self);

    while (toRead > 0) {
        /*
	 * Loop until the request is satisfied (or no data is available from
	 * below, possibly EOF).
	 */

        copied    = ResultCopy (&dataPtr->result, UCHARP (buf), toRead);

	toRead   -= copied;
	buf      += copied;
	gotBytes += copied;

	if (toRead == 0) {
	    /* The request was completely satisfied from our buffers.
	     * We can break out of the loop and return to the caller.
	     */
	    return gotBytes;
	}

	/*
	 * Length (dataPtr->result) == 0, toRead > 0 here . Use the incoming
	 * 'buf'! as target to store the intermediary information read
	 * from the underlying channel.
	 *
	 * Ask the tcl level how much data it allows us to read from
	 * the underlying channel. This feature allows the transform to
	 * signal EOF upstream although there is none downstream. Useful
	 * to control an unbounded 'fcopy', either through counting bytes,
	 * or by pattern matching.
	 */

	ExecuteCallback (dataPtr, NO_INTERP, A_QUERY_MAXREAD,
		NULL, 0, TRANSMIT_NUM /* -> maxRead */, 1);

	if (dataPtr->maxRead >= 0) {
	    if (dataPtr->maxRead < toRead) {
	        toRead = dataPtr->maxRead;
	    }
	} /* else: 'maxRead < 0' == Accept the current value of toRead */

	if (toRead <= 0) {
	    return gotBytes;
	}

	read = Tcl_ReadRaw(downChan, buf, toRead);

	if (read < 0) {
	    /* Report errors to caller. EAGAIN is a special situation.
	     * If we had some data before we report that instead of the
	     * request to re-try.
	     */

	    if ((Tcl_GetErrno() == EAGAIN) && (gotBytes > 0)) {
	        return gotBytes;
	    }

	    *errorCodePtr = Tcl_GetErrno();
	    return -1;      
	}

	if (read == 0) {
	    /*
	     * Check wether we hit on EOF in the underlying channel or
	     * not. If not differentiate between blocking and
	     * non-blocking modes. In non-blocking mode we ran
	     * temporarily out of data. Signal this to the caller via
	     * EWOULDBLOCK and error return (-1). In the other cases
	     * we simply return what we got and let the caller wait
	     * for more. On the other hand, if we got an EOF we have
	     * to convert and flush all waiting partial data.
	     */

	    if (! Tcl_Eof (downChan)) {
	        if ((gotBytes == 0) && (dataPtr->flags & CHANNEL_ASYNC)) {
		    *errorCodePtr = EWOULDBLOCK;
		    return -1;
		} else {
		    return gotBytes;
		}
	    } else {
	        if (dataPtr->readIsFlushed) {
		    /* Already flushed, nothing to do anymore
		     */
		    return gotBytes;
		}

		dataPtr->readIsFlushed = 1;

		ExecuteCallback (dataPtr, NO_INTERP, A_FLUSH_READ,
			NULL, 0, TRANSMIT_IBUF, P_PRESERVE);

		if (ResultLength (&dataPtr->result) == 0) {
		    /* we had nothing to flush */
		    return gotBytes;
		}

		continue; /* at: while (toRead > 0) */
	    }
	} /* read == 0 */

	/* Transform the read chunk and add the result to our
	 * read buffer (dataPtr->result)
	 */

	res = ExecuteCallback (dataPtr, NO_INTERP, A_READ,
		UCHARP (buf), read, TRANSMIT_IBUF,
		P_PRESERVE);

	if (res != TCL_OK) {
	    *errorCodePtr = EINVAL;
	    return -1;
	}
    } /* while toRead > 0 */

    return gotBytes;
}

/*
 *------------------------------------------------------*
 *
 *	TransformOutputProc --
 *
 *	Called by the generic IO system to convert data
 *	waiting to be written.
 *
 *	Sideeffects:
 *		As defined by the transformation.
 *
 *	Result:
 *		A transformed buffer.
 *
 *------------------------------------------------------*
 */

static int
TransformOutputProc (instanceData, buf, toWrite, errorCodePtr)
    ClientData instanceData;
    char*      buf;
    int        toWrite;
    int*       errorCodePtr;
{
    TransformChannelData* dataPtr = (TransformChannelData*) instanceData;
    int res;

    /* should assert (dataPtr->mode & TCL_WRITABLE) */

    if (toWrite == 0) {
	/* Catch a no-op.
	 */
	return 0;
    }

    res = ExecuteCallback (dataPtr, NO_INTERP, A_WRITE,
	    UCHARP (buf), toWrite,
	    TRANSMIT_DOWN, P_NO_PRESERVE);

    if (res != TCL_OK) {
        *errorCodePtr = EINVAL;
	return -1;
    }

    return toWrite;
}

/*
 *------------------------------------------------------*
 *
 *	TransformSeekProc --
 *
 *	This procedure is called by the generic IO level
 *	to move the access point in a channel.
 *
 *	Sideeffects:
 *		Moves the location at which the channel
 *		will be accessed in future operations.
 *		Flushes all transformation buffers, then
 *		forwards it to the underlying channel.
 *
 *	Result:
 *		-1 if failed, the new position if
 *		successful. An output argument contains
 *		the POSIX error code if an error
 *		occurred, or zero.
 *
 *------------------------------------------------------*
 */

static int
TransformSeekProc (instanceData, offset, mode, errorCodePtr)
    ClientData instanceData;	/* The channel to manipulate */
    long       offset;		/* Size of movement. */
    int        mode;		/* How to move */
    int*       errorCodePtr;	/* Location of error flag. */
{
    int result;
    TransformChannelData* dataPtr	= (TransformChannelData*) instanceData;
    Tcl_Channel           parent        = Tcl_GetStackedChannel(dataPtr->self);
    Tcl_ChannelType*      parentType	= Tcl_GetChannelType(parent);
    Tcl_DriverSeekProc*   parentSeekProc = Tcl_ChannelSeekProc(parentType);

    if ((offset == 0) && (mode == SEEK_CUR)) {
        /* This is no seek but a request to tell the caller the current
	 * location. Simply pass the request down.
	 */

	result = (*parentSeekProc) (Tcl_GetChannelInstanceData(parent),
		offset, mode, errorCodePtr);
	return result;
    }

    /*
     * It is a real request to change the position. Flush all data waiting
     * for output and discard everything in the input buffers. Then pass
     * the request down, unchanged.
     */

    if (dataPtr->mode & TCL_WRITABLE) {
        ExecuteCallback (dataPtr, NO_INTERP, A_FLUSH_WRITE,
		NULL, 0, TRANSMIT_DOWN, P_NO_PRESERVE);
    }

    if (dataPtr->mode & TCL_READABLE) {
        ExecuteCallback (dataPtr, NO_INTERP, A_CLEAR_READ,
		NULL, 0, TRANSMIT_DONT, P_NO_PRESERVE);
	ResultClear(&dataPtr->result);
	dataPtr->readIsFlushed = 0;
    }

    result = (*parentSeekProc) (Tcl_GetChannelInstanceData(parent),
	    offset, mode, errorCodePtr);
    return result;
}

/*
 *------------------------------------------------------*
 *
 *	TransformSetOptionProc --
 *
 *	Called by generic layer to handle the reconfi-
 *	guration of channel specific options. As this
 *	channel type does not have such, it simply passes
 *	all requests downstream.
 *
 *	Sideeffects:
 *		As defined by the channel downstream.
 *
 *	Result:
 *		A standard TCL error code.
 *
 *------------------------------------------------------*
 */

static int
TransformSetOptionProc (instanceData, interp, optionName, value)
    ClientData instanceData;
    Tcl_Interp *interp;
    char *optionName;
    char *value;
{
    TransformChannelData* dataPtr = (TransformChannelData*) instanceData;
    Tcl_Channel downChan = Tcl_GetStackedChannel(dataPtr->self);
    Tcl_DriverSetOptionProc *setOptionProc;

    setOptionProc = Tcl_ChannelSetOptionProc(Tcl_GetChannelType(downChan));
    if (setOptionProc != NULL) {
	return (*setOptionProc)(Tcl_GetChannelInstanceData(downChan),
		interp, optionName, value);
    }
    return TCL_ERROR;
}

/*
 *------------------------------------------------------*
 *
 *	TransformGetOptionProc --
 *
 *	Called by generic layer to handle requests for
 *	the values of channel specific options. As this
 *	channel type does not have such, it simply passes
 *	all requests downstream.
 *
 *	Sideeffects:
 *		As defined by the channel downstream.
 *
 *	Result:
 *		A standard TCL error code.
 *
 *------------------------------------------------------*
 */

static int
TransformGetOptionProc (instanceData, interp, optionName, dsPtr)
    ClientData   instanceData;
    Tcl_Interp*  interp;
    char*        optionName;
    Tcl_DString* dsPtr;
{
    TransformChannelData* dataPtr = (TransformChannelData*) instanceData;
    Tcl_Channel downChan = Tcl_GetStackedChannel(dataPtr->self);
    Tcl_DriverGetOptionProc *getOptionProc;

    getOptionProc = Tcl_ChannelGetOptionProc(Tcl_GetChannelType(downChan));
    if (getOptionProc != NULL) {
	return (*getOptionProc)(Tcl_GetChannelInstanceData(downChan),
		interp, optionName, dsPtr);
    } else if (optionName == (char*) NULL) {
	/*
	 * Request is query for all options, this is ok.
	 */
	return TCL_OK;
    }
    /*
     * Request for a specific option has to fail, we don't have any.
     */
    return TCL_ERROR;
}

/*
 *------------------------------------------------------*
 *
 *	TransformWatchProc --
 *
 *	Initialize the notifier to watch for events from
 *	this channel.
 *
 *	Sideeffects:
 *		Sets up the notifier so that a future
 *		event on the channel will be seen by Tcl.
 *
 *	Result:
 *		None.
 *
 *------------------------------------------------------*
 */
	/* ARGSUSED */
static void
TransformWatchProc (instanceData, mask)
    ClientData instanceData;	/* Channel to watch */
    int        mask;		/* Events of interest */
{
    /* The caller expressed interest in events occuring for this
     * channel. We are forwarding the call to the underlying
     * channel now.
     */

    TransformChannelData* dataPtr = (TransformChannelData*) instanceData;
    Tcl_Channel     downChan;

    dataPtr->watchMask = mask;

    /* No channel handlers any more. We will be notified automatically
     * about events on the channel below via a call to our
     * 'TransformNotifyProc'. But we have to pass the interest down now.
     * We are allowed to add additional 'interest' to the mask if we want
     * to. But this transformation has no such interest. It just passes
     * the request down, unchanged.
     */

    downChan = Tcl_GetStackedChannel(dataPtr->self);

    (Tcl_GetChannelType(downChan))
	->watchProc(Tcl_GetChannelInstanceData(downChan), mask);

    /*
     * Management of the internal timer.
     */

    if ((dataPtr->timer != (Tcl_TimerToken) NULL) &&
	    (!(mask & TCL_READABLE) || (ResultLength(&dataPtr->result) == 0))) {

        /* A pending timer exists, but either is there no (more)
	 * interest in the events it generates or nothing is availablee
	 * for reading, so remove it.
	 */

        Tcl_DeleteTimerHandler (dataPtr->timer);
	dataPtr->timer = (Tcl_TimerToken) NULL;
    }

    if ((dataPtr->timer == (Tcl_TimerToken) NULL) &&
	    (mask & TCL_READABLE) && (ResultLength (&dataPtr->result) > 0)) {

        /* There is no pending timer, but there is interest in readable
	 * events and we actually have data waiting, so generate a timer
	 * to flush that.
	 */

	dataPtr->timer = Tcl_CreateTimerHandler (FLUSH_DELAY,
		TransformChannelHandlerTimer, (ClientData) dataPtr);
    }
}

/*
 *------------------------------------------------------*
 *
 *	TransformGetFileHandleProc --
 *
 *	Called from Tcl_GetChannelHandle to retrieve
 *	OS specific file handle from inside this channel.
 *
 *	Sideeffects:
 *		None.
 *
 *	Result:
 *		The appropriate Tcl_File or NULL if not
 *		present. 
 *
 *------------------------------------------------------*
 */
static int
TransformGetFileHandleProc (instanceData, direction, handlePtr)
    ClientData  instanceData;	/* Channel to query */
    int         direction;	/* Direction of interest */
    ClientData* handlePtr;	/* Place to store the handle into */
{
    /*
     * Return the handle belonging to parent channel.
     * IOW, pass the request down and the result up.
     */

    TransformChannelData* dataPtr = (TransformChannelData*) instanceData;

    return Tcl_GetChannelHandle(Tcl_GetStackedChannel(dataPtr->self),
	    direction, handlePtr);
}

/*
 *------------------------------------------------------*
 *
 *	TransformNotifyProc --
 *
 *	------------------------------------------------*
 *	Handler called by Tcl to inform us of activity
 *	on the underlying channel.
 *	------------------------------------------------*
 *
 *	Sideeffects:
 *		May process the incoming event by itself.
 *
 *	Result:
 *		None.
 *
 *------------------------------------------------------*
 */

static int
TransformNotifyProc (clientData, mask)
    ClientData	   clientData; /* The state of the notified transformation */
    int		   mask;       /* The mask of occuring events */
{
    TransformChannelData* dataPtr = (TransformChannelData*) clientData;

    /*
     * An event occured in the underlying channel.  This
     * transformation doesn't process such events thus returns the
     * incoming mask unchanged.
     */

    if (dataPtr->timer != (Tcl_TimerToken) NULL) {
	/*
	 * Delete an existing timer. It was not fired, yet we are
	 * here, so the channel below generated such an event and we
	 * don't have to. The renewal of the interest after the
	 * execution of channel handlers will eventually cause us to
	 * recreate the timer (in TransformWatchProc).
	 */

	Tcl_DeleteTimerHandler (dataPtr->timer);
	dataPtr->timer = (Tcl_TimerToken) NULL;
    }

    return mask;
}

/*
 *------------------------------------------------------*
 *
 *	TransformChannelHandlerTimer --
 *
 *	Called by the notifier (-> timer) to flush out
 *	information waiting in the input buffer.
 *
 *	Sideeffects:
 *		As of 'Tcl_NotifyChannel'.
 *
 *	Result:
 *		None.
 *
 *------------------------------------------------------*
 */

static void
TransformChannelHandlerTimer (clientData)
    ClientData clientData; /* Transformation to query */
{
    TransformChannelData* dataPtr = (TransformChannelData*) clientData;

    dataPtr->timer = (Tcl_TimerToken) NULL;

    if (!(dataPtr->watchMask & TCL_READABLE) ||
	    (ResultLength (&dataPtr->result) == 0)) {
	/* The timer fired, but either is there no (more)
	 * interest in the events it generates or nothing is available
	 * for reading, so ignore it and don't recreate it.
	 */

	return;
    }

    Tcl_NotifyChannel(dataPtr->self, TCL_READABLE);
}

/*
 *------------------------------------------------------*
 *
 *	ResultClear --
 *
 *	Deallocates any memory allocated by 'ResultAdd'.
 *
 *	Sideeffects:
 *		See above.
 *
 *	Result:
 *		None.
 *
 *------------------------------------------------------*
 */

static void
ResultClear (r)
    ResultBuffer* r; /* Reference to the buffer to clear out */
{
    r->used = 0;

    if (r->allocated) {
        ckfree((char*) r->buf);
	r->buf       = UCHARP (NULL);
	r->allocated = 0;
    }
}

/*
 *------------------------------------------------------*
 *
 *	ResultInit --
 *
 *	Initializes the specified buffer structure. The
 *	structure will contain valid information for an
 *	emtpy buffer.
 *
 *	Sideeffects:
 *		See above.
 *
 *	Result:
 *		None.
 *
 *------------------------------------------------------*
 */

static void
ResultInit (r)
    ResultBuffer* r; /* Reference to the structure to initialize */
{
    r->used      = 0;
    r->allocated = 0;
    r->buf       = UCHARP (NULL);
}

/*
 *------------------------------------------------------*
 *
 *	ResultLength --
 *
 *	Returns the number of bytes stored in the buffer.
 *
 *	Sideeffects:
 *		None.
 *
 *	Result:
 *		An integer, see above too.
 *
 *------------------------------------------------------*
 */

static int
ResultLength (r)
    ResultBuffer* r; /* The structure to query */
{
    return r->used;
}

/*
 *------------------------------------------------------*
 *
 *	ResultCopy --
 *
 *	Copies the requested number of bytes from the
 *	buffer into the specified array and removes them
 *	from the buffer afterward. Copies less if there
 *	is not enough data in the buffer.
 *
 *	Sideeffects:
 *		See above.
 *
 *	Result:
 *		The number of actually copied bytes,
 *		possibly less than 'toRead'.
 *
 *------------------------------------------------------*
 */

static int
ResultCopy (r, buf, toRead)
    ResultBuffer*  r;      /* The buffer to read from */
    unsigned char* buf;    /* The buffer to copy into */
    int            toRead; /* Number of requested bytes */
{
    if (r->used == 0) {
        /* Nothing to copy in the case of an empty buffer.
	 */

        return 0;
    }

    if (r->used == toRead) {
        /* We have just enough. Copy everything to the caller.
	 */

        memcpy ((VOID*) buf, (VOID*) r->buf, (size_t) toRead);
	r->used = 0;
	return toRead;
    }

    if (r->used > toRead) {
        /* The internal buffer contains more than requested.
	 * Copy the requested subset to the caller, and shift
	 * the remaining bytes down.
	 */

        memcpy  ((VOID*) buf,    (VOID*) r->buf,            (size_t) toRead);
	memmove ((VOID*) r->buf, (VOID*) (r->buf + toRead),
		(size_t) r->used - toRead);

	r->used -= toRead;
	return toRead;
    }

    /* There is not enough in the buffer to satisfy the caller, so
     * take everything.
     */

    memcpy((VOID*) buf, (VOID*) r->buf, (size_t) r->used);
    toRead  = r->used;
    r->used = 0;
    return toRead;
}

/*
 *------------------------------------------------------*
 *
 *	ResultAdd --
 *
 *	Adds the bytes in the specified array to the
 *	buffer, by appending it.
 *
 *	Sideeffects:
 *		See above.
 *
 *	Result:
 *		None.
 *
 *------------------------------------------------------*
 */

static void
ResultAdd (r, buf, toWrite)
    ResultBuffer*  r;       /* The buffer to extend */
    unsigned char* buf;     /* The buffer to read from */
    int            toWrite; /* The number of bytes in 'buf' */
{
    if ((r->used + toWrite) > r->allocated) {
        /* Extension of the internal buffer is required.
	 */

        if (r->allocated == 0) {
	    r->allocated = toWrite + INCREMENT;
	    r->buf       = UCHARP (ckalloc((unsigned) r->allocated));
	} else {
	    r->allocated += toWrite + INCREMENT;
	    r->buf        = UCHARP (ckrealloc((char*) r->buf,
		    (unsigned) r->allocated));
	}
    }

    /* now copy data */
    memcpy(r->buf + r->used, buf, (size_t) toWrite);
    r->used += toWrite;
}
Changes to generic/tclIndexObj.c.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







/* 
 * tclIndexObj.c --
 *
 *	This file implements objects of type "index".  This object type
 *	is used to lookup a keyword in a table of valid values and cache
 *	the index of the matching entry.
 *
 * Copyright (c) 1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclIndexObj.c,v 1.4 1999/06/28 23:49:31 redman Exp $
 * RCS: @(#) $Id: tclIndexObj.c,v 1.4.10.3 2001/08/30 19:02:21 hobbs Exp $
 */

#include "tclInt.h"

/*
 * Prototypes for procedures defined later in this file:
 */
31
32
33
34
35
36
37










38
39
40
41
42
43
44
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54







+
+
+
+
+
+
+
+
+
+







    "index",				/* name */
    (Tcl_FreeInternalRepProc *) NULL,	/* freeIntRepProc */
    (Tcl_DupInternalRepProc *) NULL,	/* dupIntRepProc */
    (Tcl_UpdateStringProc *) NULL,	/* updateStringProc */
    SetIndexFromAny			/* setFromAnyProc */
};

/*
 * DKF - Just noting that the data format used in objects with the
 * above type is that the ptr1 field will contain a pointer to the
 * table that the last lookup was performed in, and the ptr2 field
 * will contain the sizeof(char) offset of the string within that
 * table.  Note that we assume that each table is only ever called
 * with a single offset, but this is a pretty safe assumption in
 * practise...
 */

/*
 * Boolean flag indicating whether or not the tclIndexType object
 * type has been registered with the Tcl compiler.
 */

static int indexTypeInitialized = 0;

86
87
88
89
90
91
92
93


94
95
96
97
98
99
100
96
97
98
99
100
101
102

103
104
105
106
107
108
109
110
111







-
+
+







     * (doing the check here saves the overhead of calling
     * Tcl_GetIndexFromObjStruct in the common case where the result
     * is cached).
     */

    if ((objPtr->typePtr == &tclIndexType)
	    && (objPtr->internalRep.twoPtrValue.ptr1 == (VOID *) tablePtr)) {
	*indexPtr = (int) objPtr->internalRep.twoPtrValue.ptr2;
	*indexPtr = ((int) objPtr->internalRep.twoPtrValue.ptr2)
	                   / sizeof(char *);
	return TCL_OK;
    }
    return Tcl_GetIndexFromObjStruct(interp, objPtr, tablePtr, sizeof(char *),
	    msg, flags, indexPtr);
}

/*
147
148
149
150
151
152
153
154

155
156
157
158
159
160
161
158
159
160
161
162
163
164

165
166
167
168
169
170
171
172







-
+








    /*
     * See if there is a valid cached result from a previous lookup.
     */

    if ((objPtr->typePtr == &tclIndexType)
	    && (objPtr->internalRep.twoPtrValue.ptr1 == (VOID *) tablePtr)) {
	*indexPtr = (int) objPtr->internalRep.twoPtrValue.ptr2;
	*indexPtr = ((int) objPtr->internalRep.twoPtrValue.ptr2) / offset;
	return TCL_OK;
    }

    /*
     * Lookup the value of the object in the table.  Accept unique
     * abbreviations unless TCL_EXACT is set in flags.
     */
179
180
181
182
183
184
185
186

187
188
189
190
191
192
193
190
191
192
193
194
195
196

197
198
199
200
201
202
203
204







-
+







     */
    
    if (key[0] == '\0') {
	goto error;
    }
    
    for (entryPtr = tablePtr, i = 0; *entryPtr != NULL; 
	    entryPtr = (char **) ((long) entryPtr + offset), i++) {
	    entryPtr = (char **) ((char *) entryPtr + offset), i++) {
	for (p1 = key, p2 = *entryPtr; *p1 == *p2; p1++, p2++) {
	    if (*p1 == 0) {
		index = i;
		goto done;
	    }
	}
	if (*p1 == 0) {
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
220
221
222
223
224
225
226
227
228
229

230
231
232
233
234
235
236
237
238
239
240
241

242
243


244
245
246
247
248
249
250
251
252







+
+
+
-
+











-
+

-
-
+
+








    done:
    if ((objPtr->typePtr != NULL)
	    && (objPtr->typePtr->freeIntRepProc != NULL)) {
	objPtr->typePtr->freeIntRepProc(objPtr);
    }
    objPtr->internalRep.twoPtrValue.ptr1 = (VOID *) tablePtr;
    /*
     * Make sure to account for offsets != sizeof(char *).  [Bug 5153]
     */
    objPtr->internalRep.twoPtrValue.ptr2 = (VOID *) index;
    objPtr->internalRep.twoPtrValue.ptr2 = (VOID *) (index * offset);
    objPtr->typePtr = &tclIndexType;
    *indexPtr = index;
    return TCL_OK;

    error:
    if (interp != NULL) {
	int count;
	resultPtr = Tcl_GetObjResult(interp);
	Tcl_AppendStringsToObj(resultPtr,
		(numAbbrev > 1) ? "ambiguous " : "bad ", msg, " \"",
		key, "\": must be ", *tablePtr, (char *) NULL);
	for (entryPtr = (char **) ((long) tablePtr + offset), count = 0;
	for (entryPtr = (char **) ((char *) tablePtr + offset), count = 0;
		*entryPtr != NULL;
		entryPtr = (char **) ((long) entryPtr + offset), count++) {
	    if ((*((char **) ((long) entryPtr + offset))) == NULL) {
		entryPtr = (char **) ((char *) entryPtr + offset), count++) {
	    if ((*((char **) ((char *) entryPtr + offset))) == NULL) {
		Tcl_AppendStringsToObj(resultPtr,
			(count > 0) ? ", or " : " or ", *entryPtr,
			(char *) NULL);
	    } else {
		Tcl_AppendStringsToObj(resultPtr, ", ", *entryPtr,
			(char *) NULL);
	    }
306
307
308
309
310
311
312
313

314
315
316
317
318
319
320
321
322
323
324
325

326
327

328
329
330
331
332





333

334
335
336

337
338

339
340
341
320
321
322
323
324
325
326

327
328
329
330
331
332
333
334
335
336
337
338
339
340
341

342
343
344
345
346
347
348
349
350
351
352

353
354
355
356
357
358

359
360
361
362







-
+












+

-
+





+
+
+
+
+
-
+



+

-
+



					 * message. */
    char *message;			/* Error message to print after the
					 * leading objects in objv. The
					 * message may be NULL. */
{
    Tcl_Obj *objPtr;
    char **tablePtr;
    int i;
    int i, offset;

    objPtr = Tcl_GetObjResult(interp);
    Tcl_AppendToObj(objPtr, "wrong # args: should be \"", -1);
    for (i = 0; i < objc; i++) {
	/*
	 * If the object is an index type use the index table which allows
	 * for the correct error message even if the subcommand was
	 * abbreviated.  Otherwise, just use the string rep.
	 */
	
	if (objv[i]->typePtr == &tclIndexType) {
	    tablePtr = ((char **) objv[i]->internalRep.twoPtrValue.ptr1);
	    offset = ((int) objv[i]->internalRep.twoPtrValue.ptr2);
	    Tcl_AppendStringsToObj(objPtr,
		    tablePtr[(int) objv[i]->internalRep.twoPtrValue.ptr2],
		    *((char **)(((char *)tablePtr)+offset)),
		    (char *) NULL);
	} else {
	    Tcl_AppendStringsToObj(objPtr, Tcl_GetString(objv[i]),
		    (char *) NULL);
	}

	/*
	 * Append a space character (" ") if there is more text to follow
	 * (either another element from objv, or the message string).
	 */
	if (i < (objc - 1)) {
	if ((i < (objc - 1)) || message) {
	    Tcl_AppendStringsToObj(objPtr, " ", (char *) NULL);
	}
    }

    if (message) {
      Tcl_AppendStringsToObj(objPtr, " ", message, (char *) NULL);
	Tcl_AppendStringsToObj(objPtr, message, (char *) NULL);
    }
    Tcl_AppendStringsToObj(objPtr, "\"", (char *) NULL);
}
Changes to generic/tclInitScript.h.
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10

11
12
13
14
15
16
17
18










-
+







/* 
 * tclInitScript.h --
 *
 *	This file contains Unix & Windows common init script
 *      It is not used on the Mac. (the mac init script is in tclMacInit.c)
 *
 * Copyright (c) 1998 Sun Microsystems, Inc.
 * Copyright (c) 1999 by Scriptics Corporation.
 * All rights reserved.
 *
 * RCS: @(#) $Id: tclInitScript.h,v 1.12 1999/08/19 02:59:10 hobbs Exp $
 * RCS: @(#) $Id: tclInitScript.h,v 1.12.2.1 2001/09/12 21:26:36 dgp Exp $
 */

/*
 * In order to find init.tcl during initialization, the following script
 * is invoked by Tcl_Init().  It looks in several different directories:
 *
 *	$tcl_library		- can specify a primary location, if set
45
46
47
48
49
50
51

52
53



54
55
56
57
58
59
60
45
46
47
48
49
50
51
52


53
54
55
56
57
58
59
60
61
62







+
-
-
+
+
+







    set dirs {}\n\
    if {[info exists tcl_library]} {\n\
	lappend dirs $tcl_library\n\
    } else {\n\
	if {[info exists env(TCL_LIBRARY)]} {\n\
	    lappend dirs $env(TCL_LIBRARY)\n\
	}\n\
	catch {\n\
	lappend dirs $tclDefaultLibrary\n\
	unset tclDefaultLibrary\n\
	    lappend dirs $tclDefaultLibrary\n\
	    unset tclDefaultLibrary\n\
	}\n\
        set dirs [concat $dirs $tcl_libPath]\n\
    }\n\
    foreach i $dirs {\n\
	set tcl_library $i\n\
	set tclfile [file join $i init.tcl]\n\
	if {[file exists $tclfile]} {\n\
	    if {![catch {uplevel #0 [list source $tclfile]} msg]} {\n\
Changes to generic/tclInt.decls.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







# tclInt.decls --
#
#	This file contains the declarations for all unsupported
#	functions that are exported by the Tcl library.  This file
#	is used to generate the tclIntDecls.h, tclIntPlatDecls.h,
#	tclIntStub.c, tclPlatStub.c, tclCompileDecls.h and tclCompileStub.c
#	files
#
# Copyright (c) 1998-1999 by Scriptics Corporation.
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
# 
# RCS: @(#) $Id: tclInt.decls,v 1.20 2000/03/31 08:52:04 hobbs Exp $
# RCS: @(#) $Id: tclInt.decls,v 1.20.2.7 2002/05/24 19:36:29 hobbs Exp $

library tcl

# Define the unsupported generic interfaces.

interface tclInt

499
500
501
502
503
504
505
506

507
508
509
510
511
512
513
499
500
501
502
503
504
505

506
507
508
509
510
511
512
513







-
+







    int TclpHasSockets(Tcl_Interp *interp)
}
declare 133 generic {
    struct tm *	TclpGetDate(TclpTime_t time, int useGMT)
}
declare 134 generic {
    size_t TclpStrftime(char *s, size_t maxsize, CONST char *format, \
	    CONST struct tm *t)
	    CONST struct tm *t, int useGMT)
}
declare 135 generic {
    int TclpCheckStackSpace(void)
}

# Added in 8.1:

573
574
575
576
577
578
579

580
581
582



583
584
585
586
587






588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604




























605
606
607
608
609
610
611
573
574
575
576
577
578
579
580



581
582
583





584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641







+
-
-
-
+
+
+
-
-
-
-
-
+
+
+
+
+
+

















+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







declare 152 generic {
    void TclSetLibraryPath(Tcl_Obj *pathPtr)
}
declare 153 generic {
    Tcl_Obj *TclGetLibraryPath(void)
}

# moved to tclTest.c in 8.3.2/8.4a2
declare 154 generic {
    int TclTestChannelCmd(ClientData clientData,
    Tcl_Interp *interp, int argc, char **argv)
#declare 154 generic {
#    int TclTestChannelCmd(ClientData clientData,
#    Tcl_Interp *interp, int argc, char **argv)
}
declare 155 generic {
    int TclTestChannelEventCmd(ClientData clientData, \
	    Tcl_Interp *interp, int argc, char **argv)
}
#}
#declare 155 generic {
#    int TclTestChannelEventCmd(ClientData clientData, \
#	     Tcl_Interp *interp, int argc, char **argv)
#}

declare 156 generic {
    void TclRegError (Tcl_Interp *interp, char *msg, \
	    int status)
}
declare 157 generic {
    Var * TclVarTraceExists (Tcl_Interp *interp, char *varName)
}
declare 158 generic {
    void TclSetStartupScriptFileName(char *filename)
}
declare 159 generic {
    char *TclGetStartupScriptFileName(void)
}
declare 160 generic {
    int TclpMatchFilesTypes(Tcl_Interp *interp, char *separators, \
	    Tcl_DString *dirPtr, char *pattern, char *tail, GlobTypeData *types)
}

# new in 8.3.2/8.4a2
declare 161 generic {
    int TclChannelTransform(Tcl_Interp *interp, Tcl_Channel chan, \
	    Tcl_Obj *cmdObjPtr)
}
declare 162 generic {
    void TclChannelEventScriptInvoker(ClientData clientData, int flags)
}

# New in 8.3.4, support for shared library version of tclcompiler.

# ALERT: The result of 'TclGetInstructionTable' is actually an
# InstructionDesc*" but we do not want to describe this structure in
# "tclInt.h". It is described in "tclCompile.h". Use a cast to the
# correct type when calling this procedure.

declare 163 generic {
	void * TclGetInstructionTable (void)
}

# ALERT: The argument of 'TclExpandCodeArray' is actually a
# "CompileEnv*" but we do not want to describe this structure in
# "tclInt.h". It is described in "tclCompile.h".

declare 164 generic {
	void TclExpandCodeArray (void *envPtr)
}

##############################################################################

# Define the platform specific internal Tcl interface. These functions are
# only available on the designated platform.

interface tclIntPlat
635
636
637
638
639
640
641
642

643
644
645
646
647
648
649
650

651
652
653
654

655
656
657
658

659
660
661
662
663
664
665
665
666
667
668
669
670
671

672
673
674
675
676
677
678
679

680
681
682
683

684
685
686
687

688
689
690
691
692
693
694
695







-
+







-
+



-
+



-
+







    int FSpSetDefaultDir(FSSpecPtr theSpec)
}
declare 6 mac {
    OSErr FSpFindFolder(short vRefNum, OSType folderType, \
	    Boolean createFolder, FSSpec *spec)
}
declare 7 mac {
    void GetGlobalMouse(Point *mouse)
    void GetGlobalMouseTcl(Point *mouse)
}

# The following routines are utility functions in Tcl.  They are exported
# here because they are needed in Tk.  They are not officially supported,
# however.  The first set are from the MoreFiles package.

declare 8 mac {
    pascal OSErr FSpGetDirectoryID(CONST FSSpec *spec, long *theDirID, \
    pascal OSErr FSpGetDirectoryIDTcl(CONST FSSpec *spec, long *theDirID, \
	    Boolean *isDirectory)
}
declare 9 mac {
    pascal short FSpOpenResFileCompat(CONST FSSpec *spec, \
    pascal short FSpOpenResFileCompatTcl(CONST FSSpec *spec, \
	    SignedByte permission)
}
declare 10 mac {
    pascal void FSpCreateResFileCompat(CONST FSSpec *spec, OSType creator, \
    pascal void FSpCreateResFileCompatTcl(CONST FSSpec *spec, OSType creator, \
	    OSType fileType, ScriptCode scriptTag)
}

# Like the MoreFiles routines these fix problems in the standard
# Mac calls.  These routines are from tclMacUtils.h.

declare 11 mac {
706
707
708
709
710
711
712



713
714
715
716
717
718
719
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752







+
+
+







declare 23 mac {
    FILE * TclMacFOpenHack(CONST char *path, CONST char *mode)
}
# Replaced in 8.1 by TclpReadLink:
#  declare 24 mac {
#      int TclMacReadlink(char *path, char *buf, int size)
#  }
declare 24 mac {
    char * TclpGetTZName(int isdst)
}
declare 25 mac {
    int TclMacChmod(char *path, int mode)
}

############################
# Windows specific internals

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
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







+
+
-
-
+
+
-
+

















+
+
+
+
+
+







}
declare 19 win {
    TclFile TclpOpenFile(CONST char *fname, int mode)
}
declare 20 win {
    void TclWinAddProcess(HANDLE hProcess, DWORD id)
}
#  Removed permanently from 8.3.4 to match 8.4a2's removal
#
declare 21 win {
    void TclpAsyncMark(Tcl_AsyncHandler async)
#  declare 21 win {
#      void TclpAsyncMark(Tcl_AsyncHandler async)
}
#  }

# Added in 8.1:
declare 22 win {
    TclFile TclpCreateTempFile(CONST char *contents)
}
declare 23 win {
    char * TclpGetTZName(int isdst)
}
declare 24 win {
    char * TclWinNoBackslash(char *path)
}
declare 25 win {
    TclPlatformType *TclWinGetPlatform(void)
}
declare 26 win {
    void TclWinSetInterfaces(int wide)
}

# Added in Tcl 8.3.3 / 8.4

declare 27 win {
    void TclWinFlushDirtyChannels (void)
}

#########################
# Unix specific internals

# Pipe channel functions

declare 0 unix {
Changes to generic/tclInt.h.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







/*
 * tclInt.h --
 *
 *	Declarations of things used internally by the Tcl interpreter.
 *
 * Copyright (c) 1987-1993 The Regents of the University of California.
 * Copyright (c) 1993-1997 Lucent Technologies.
 * Copyright (c) 1994-1998 Sun Microsystems, Inc.
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclInt.h,v 1.42 2000/04/09 16:04:18 kupries Exp $
 * RCS: @(#) $Id: tclInt.h,v 1.42.2.4 2001/11/29 20:08:33 msofer Exp $
 */

#ifndef _TCLINT
#define _TCLINT

/*
 * Common include files needed by most of the Tcl source files are
180
181
182
183
184
185
186
187
188
189
190
191







192
193
194
195
196
197
198
180
181
182
183
184
185
186





187
188
189
190
191
192
193
194
195
196
197
198
199
200







-
-
-
-
-
+
+
+
+
+
+
+







    int maxExportPatterns;	 /* Mumber of export patterns for which
				  * space is currently allocated. */
    int cmdRefEpoch;		 /* Incremented if a newly added command
				  * shadows a command for which this
				  * namespace has already cached a Command *
				  * pointer; this causes all its cached
				  * Command* pointers to be invalidated. */
    int resolverEpoch;		 /* Incremented whenever the name resolution
				  * rules change for this namespace; this
				  * invalidates all byte codes compiled in
				  * the namespace, causing the code to be
				  * recompiled under the new rules. */
    int resolverEpoch;		 /* Incremented whenever (a) the name resolution
				  * rules change for this namespace or (b) a 
				  * newly added command shadows a command that
				  * is compiled to bytecodes.
				  * This invalidates all byte codes compiled
				  * in the namespace, causing the code to be
				  * recompiled under the new rules.*/
    Tcl_ResolveCmdProc *cmdResProc;
				 /* If non-null, this procedure overrides
				  * the usual command resolution mechanism
				  * in Tcl.  This procedure is invoked
				  * within Tcl_FindCommand to resolve all
				  * command references within the namespace. */
    Tcl_ResolveVarProc *varResProc;
1545
1546
1547
1548
1549
1550
1551


1552
1553
1554
1555
1556
1557
1558
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562







+
+







 */

extern Tcl_Obj *	tclFreeObjList;

#ifdef TCL_COMPILE_STATS
extern long		tclObjsAlloced;
extern long		tclObjsFreed;
#define TCL_MAX_SHARED_OBJ_STATS 5
extern long		tclObjsShared[TCL_MAX_SHARED_OBJ_STATS];
#endif /* TCL_COMPILE_STATS */

/*
 * Pointer to a heap-allocated string of length zero that the Tcl core uses
 * as the value of an empty string representation for an object. This value
 * is shared by all new objects allocated by Tcl_NewObj.
 */
1621
1622
1623
1624
1625
1626
1627

1628
1629
1630
1631
1632
1633
1634
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639







+







EXTERN void		TclFinalizeEncodingSubsystem _ANSI_ARGS_((void));
EXTERN void		TclFinalizeEnvironment _ANSI_ARGS_((void));
EXTERN void		TclFinalizeExecution _ANSI_ARGS_((void));
EXTERN void		TclFinalizeIOSubsystem _ANSI_ARGS_((void));
EXTERN void		TclFinalizeLoad _ANSI_ARGS_((void));
EXTERN void		TclFinalizeMemorySubsystem _ANSI_ARGS_((void));
EXTERN void		TclFinalizeNotifier _ANSI_ARGS_((void));
EXTERN void		TclFinalizeAsync _ANSI_ARGS_((void));
EXTERN void		TclFinalizeSynchronization _ANSI_ARGS_((void));
EXTERN void		TclFinalizeThreadData _ANSI_ARGS_((void));
EXTERN void		TclFindEncodings _ANSI_ARGS_((CONST char *argv0));
EXTERN Proc *		TclFindProc _ANSI_ARGS_((Interp *iPtr,
			    char *procName));
EXTERN int		TclFormatInt _ANSI_ARGS_((char *buffer, long n));
EXTERN void		TclFreePackageInfo _ANSI_ARGS_((Interp *iPtr));
2082
2083
2084
2085
2086
2087
2088































2089
2090
2091
2092
2093
2094
2095
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







    TclIncrObjsAllocated()
     
#  define TclDecrRefCount(objPtr) \
    if (--(objPtr)->refCount <= 0) { \
	if ((objPtr)->refCount < -1) \
	    panic("Reference count for %lx was negative: %s line %d", \
		  (objPtr), __FILE__, __LINE__); \
	if (((objPtr)->bytes != NULL) \
		&& ((objPtr)->bytes != tclEmptyStringRep)) { \
	    ckfree((char *) (objPtr)->bytes); \
	} \
	if (((objPtr)->typePtr != NULL) \
		&& ((objPtr)->typePtr->freeIntRepProc != NULL)) { \
	    (objPtr)->typePtr->freeIntRepProc(objPtr); \
	} \
	ckfree((char *) (objPtr)); \
	TclIncrObjsFreed(); \
    }

#elif defined(PURIFY)

/*
 * The PURIFY mode is like the regular mode, but instead of doing block
 * Tcl_Obj allocation and keeping a freed list for efficiency, it always
 * allocates and frees a single Tcl_Obj so that tools like Purify can
 * better track memory leaks
 */

#  define TclNewObj(objPtr) \
    (objPtr) = (Tcl_Obj *) Tcl_Ckalloc(sizeof(Tcl_Obj)); \
    (objPtr)->refCount = 0; \
    (objPtr)->bytes    = tclEmptyStringRep; \
    (objPtr)->length   = 0; \
    (objPtr)->typePtr  = NULL; \
    TclIncrObjsAllocated();

#  define TclDecrRefCount(objPtr) \
    if (--(objPtr)->refCount <= 0) { \
	if (((objPtr)->bytes != NULL) \
		&& ((objPtr)->bytes != tclEmptyStringRep)) { \
	    ckfree((char *) (objPtr)->bytes); \
	} \
	if (((objPtr)->typePtr != NULL) \
		&& ((objPtr)->typePtr->freeIntRepProc != NULL)) { \
	    (objPtr)->typePtr->freeIntRepProc(objPtr); \
Changes to generic/tclIntDecls.h.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







/*
 * tclIntDecls.h --
 *
 *	This file contains the declarations for all unsupported
 *	functions that are exported by the Tcl library.  These
 *	interfaces are not guaranteed to remain the same between
 *	versions.  Use at your own risk.
 *
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclIntDecls.h,v 1.19 1999/12/12 22:46:42 hobbs Exp $
 * RCS: @(#) $Id: tclIntDecls.h,v 1.19.2.3 2002/05/24 19:36:29 hobbs Exp $
 */

#ifndef _TCLINTDECLS
#define _TCLINTDECLS

/*
 * WARNING: This file is automatically generated by the tools/genStubs.tcl
449
450
451
452
453
454
455
456


457
458
459
460
461
462
463
449
450
451
452
453
454
455

456
457
458
459
460
461
462
463
464







-
+
+







				Tcl_ResolveCompiledVarProc * compiledVarProc));
/* 132 */
EXTERN int		TclpHasSockets _ANSI_ARGS_((Tcl_Interp * interp));
/* 133 */
EXTERN struct tm *	TclpGetDate _ANSI_ARGS_((TclpTime_t time, int useGMT));
/* 134 */
EXTERN size_t		TclpStrftime _ANSI_ARGS_((char * s, size_t maxsize, 
				CONST char * format, CONST struct tm * t));
				CONST char * format, CONST struct tm * t, 
				int useGMT));
/* 135 */
EXTERN int		TclpCheckStackSpace _ANSI_ARGS_((void));
/* Slot 136 is reserved */
/* 137 */
EXTERN int		TclpChdir _ANSI_ARGS_((CONST char * dirName));
/* 138 */
EXTERN char *		TclGetEnv _ANSI_ARGS_((CONST char * name, 
502
503
504
505
506
507
508
509

510
511
512

513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531










532
533
534
535
536
537
538
503
504
505
506
507
508
509

510



511



512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544







-
+
-
-
-
+
-
-
-
















+
+
+
+
+
+
+
+
+
+







/* 151 */
EXTERN void		TclRegExpRangeUniChar _ANSI_ARGS_((Tcl_RegExp re, 
				int index, int * startPtr, int * endPtr));
/* 152 */
EXTERN void		TclSetLibraryPath _ANSI_ARGS_((Tcl_Obj * pathPtr));
/* 153 */
EXTERN Tcl_Obj *	TclGetLibraryPath _ANSI_ARGS_((void));
/* 154 */
/* Slot 154 is reserved */
EXTERN int		TclTestChannelCmd _ANSI_ARGS_((ClientData clientData, 
				Tcl_Interp * interp, int argc, char ** argv));
/* 155 */
/* Slot 155 is reserved */
EXTERN int		TclTestChannelEventCmd _ANSI_ARGS_((
				ClientData clientData, Tcl_Interp * interp, 
				int argc, char ** argv));
/* 156 */
EXTERN void		TclRegError _ANSI_ARGS_((Tcl_Interp * interp, 
				char * msg, int status));
/* 157 */
EXTERN Var *		TclVarTraceExists _ANSI_ARGS_((Tcl_Interp * interp, 
				char * varName));
/* 158 */
EXTERN void		TclSetStartupScriptFileName _ANSI_ARGS_((
				char * filename));
/* 159 */
EXTERN char *		TclGetStartupScriptFileName _ANSI_ARGS_((void));
/* 160 */
EXTERN int		TclpMatchFilesTypes _ANSI_ARGS_((Tcl_Interp * interp, 
				char * separators, Tcl_DString * dirPtr, 
				char * pattern, char * tail, 
				GlobTypeData * types));
/* 161 */
EXTERN int		TclChannelTransform _ANSI_ARGS_((Tcl_Interp * interp, 
				Tcl_Channel chan, Tcl_Obj * cmdObjPtr));
/* 162 */
EXTERN void		TclChannelEventScriptInvoker _ANSI_ARGS_((
				ClientData clientData, int flags));
/* 163 */
EXTERN void *		TclGetInstructionTable _ANSI_ARGS_((void));
/* 164 */
EXTERN void		TclExpandCodeArray _ANSI_ARGS_((void * envPtr));

typedef struct TclIntStubs {
    int magic;
    struct TclIntStubHooks *hooks;

    int (*tclAccess) _ANSI_ARGS_((CONST char * path, int mode)); /* 0 */
    int (*tclAccessDeleteProc) _ANSI_ARGS_((TclAccessProc_ * proc)); /* 1 */
696
697
698
699
700
701
702
703

704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724


725
726
727
728
729




730
731
732
733
734
735
736
702
703
704
705
706
707
708

709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728


729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746







-
+



















-
-
+
+





+
+
+
+







    int (*tcl_Import) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Namespace * nsPtr, char * pattern, int allowOverwrite)); /* 127 */
    void (*tcl_PopCallFrame) _ANSI_ARGS_((Tcl_Interp* interp)); /* 128 */
    int (*tcl_PushCallFrame) _ANSI_ARGS_((Tcl_Interp* interp, Tcl_CallFrame * framePtr, Tcl_Namespace * nsPtr, int isProcCallFrame)); /* 129 */
    int (*tcl_RemoveInterpResolvers) _ANSI_ARGS_((Tcl_Interp * interp, char * name)); /* 130 */
    void (*tcl_SetNamespaceResolvers) _ANSI_ARGS_((Tcl_Namespace * namespacePtr, Tcl_ResolveCmdProc * cmdProc, Tcl_ResolveVarProc * varProc, Tcl_ResolveCompiledVarProc * compiledVarProc)); /* 131 */
    int (*tclpHasSockets) _ANSI_ARGS_((Tcl_Interp * interp)); /* 132 */
    struct tm * (*tclpGetDate) _ANSI_ARGS_((TclpTime_t time, int useGMT)); /* 133 */
    size_t (*tclpStrftime) _ANSI_ARGS_((char * s, size_t maxsize, CONST char * format, CONST struct tm * t)); /* 134 */
    size_t (*tclpStrftime) _ANSI_ARGS_((char * s, size_t maxsize, CONST char * format, CONST struct tm * t, int useGMT)); /* 134 */
    int (*tclpCheckStackSpace) _ANSI_ARGS_((void)); /* 135 */
    void *reserved136;
    int (*tclpChdir) _ANSI_ARGS_((CONST char * dirName)); /* 137 */
    char * (*tclGetEnv) _ANSI_ARGS_((CONST char * name, Tcl_DString * valuePtr)); /* 138 */
    int (*tclpLoadFile) _ANSI_ARGS_((Tcl_Interp * interp, char * fileName, char * sym1, char * sym2, Tcl_PackageInitProc ** proc1Ptr, Tcl_PackageInitProc ** proc2Ptr, ClientData * clientDataPtr)); /* 139 */
    int (*tclLooksLikeInt) _ANSI_ARGS_((char * bytes, int length)); /* 140 */
    char * (*tclpGetCwd) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_DString * cwdPtr)); /* 141 */
    int (*tclSetByteCodeFromAny) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * objPtr, CompileHookProc * hookProc, ClientData clientData)); /* 142 */
    int (*tclAddLiteralObj) _ANSI_ARGS_((struct CompileEnv * envPtr, Tcl_Obj * objPtr, LiteralEntry ** litPtrPtr)); /* 143 */
    void (*tclHideLiteral) _ANSI_ARGS_((Tcl_Interp * interp, struct CompileEnv * envPtr, int index)); /* 144 */
    struct AuxDataType * (*tclGetAuxDataType) _ANSI_ARGS_((char * typeName)); /* 145 */
    TclHandle (*tclHandleCreate) _ANSI_ARGS_((VOID * ptr)); /* 146 */
    void (*tclHandleFree) _ANSI_ARGS_((TclHandle handle)); /* 147 */
    TclHandle (*tclHandlePreserve) _ANSI_ARGS_((TclHandle handle)); /* 148 */
    void (*tclHandleRelease) _ANSI_ARGS_((TclHandle handle)); /* 149 */
    int (*tclRegAbout) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_RegExp re)); /* 150 */
    void (*tclRegExpRangeUniChar) _ANSI_ARGS_((Tcl_RegExp re, int index, int * startPtr, int * endPtr)); /* 151 */
    void (*tclSetLibraryPath) _ANSI_ARGS_((Tcl_Obj * pathPtr)); /* 152 */
    Tcl_Obj * (*tclGetLibraryPath) _ANSI_ARGS_((void)); /* 153 */
    int (*tclTestChannelCmd) _ANSI_ARGS_((ClientData clientData, Tcl_Interp * interp, int argc, char ** argv)); /* 154 */
    int (*tclTestChannelEventCmd) _ANSI_ARGS_((ClientData clientData, Tcl_Interp * interp, int argc, char ** argv)); /* 155 */
    void *reserved154;
    void *reserved155;
    void (*tclRegError) _ANSI_ARGS_((Tcl_Interp * interp, char * msg, int status)); /* 156 */
    Var * (*tclVarTraceExists) _ANSI_ARGS_((Tcl_Interp * interp, char * varName)); /* 157 */
    void (*tclSetStartupScriptFileName) _ANSI_ARGS_((char * filename)); /* 158 */
    char * (*tclGetStartupScriptFileName) _ANSI_ARGS_((void)); /* 159 */
    int (*tclpMatchFilesTypes) _ANSI_ARGS_((Tcl_Interp * interp, char * separators, Tcl_DString * dirPtr, char * pattern, char * tail, GlobTypeData * types)); /* 160 */
    int (*tclChannelTransform) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Channel chan, Tcl_Obj * cmdObjPtr)); /* 161 */
    void (*tclChannelEventScriptInvoker) _ANSI_ARGS_((ClientData clientData, int flags)); /* 162 */
    void * (*tclGetInstructionTable) _ANSI_ARGS_((void)); /* 163 */
    void (*tclExpandCodeArray) _ANSI_ARGS_((void * envPtr)); /* 164 */
} TclIntStubs;

#ifdef __cplusplus
extern "C" {
#endif
extern TclIntStubs *tclIntStubsPtr;
#ifdef __cplusplus
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
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







-
-
-
+
-
-
-
-
+
-




















+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+






#define TclSetLibraryPath \
	(tclIntStubsPtr->tclSetLibraryPath) /* 152 */
#endif
#ifndef TclGetLibraryPath
#define TclGetLibraryPath \
	(tclIntStubsPtr->tclGetLibraryPath) /* 153 */
#endif
#ifndef TclTestChannelCmd
#define TclTestChannelCmd \
	(tclIntStubsPtr->tclTestChannelCmd) /* 154 */
/* Slot 154 is reserved */
#endif
#ifndef TclTestChannelEventCmd
#define TclTestChannelEventCmd \
	(tclIntStubsPtr->tclTestChannelEventCmd) /* 155 */
/* Slot 155 is reserved */
#endif
#ifndef TclRegError
#define TclRegError \
	(tclIntStubsPtr->tclRegError) /* 156 */
#endif
#ifndef TclVarTraceExists
#define TclVarTraceExists \
	(tclIntStubsPtr->tclVarTraceExists) /* 157 */
#endif
#ifndef TclSetStartupScriptFileName
#define TclSetStartupScriptFileName \
	(tclIntStubsPtr->tclSetStartupScriptFileName) /* 158 */
#endif
#ifndef TclGetStartupScriptFileName
#define TclGetStartupScriptFileName \
	(tclIntStubsPtr->tclGetStartupScriptFileName) /* 159 */
#endif
#ifndef TclpMatchFilesTypes
#define TclpMatchFilesTypes \
	(tclIntStubsPtr->tclpMatchFilesTypes) /* 160 */
#endif
#ifndef TclChannelTransform
#define TclChannelTransform \
	(tclIntStubsPtr->tclChannelTransform) /* 161 */
#endif
#ifndef TclChannelEventScriptInvoker
#define TclChannelEventScriptInvoker \
	(tclIntStubsPtr->tclChannelEventScriptInvoker) /* 162 */
#endif
#ifndef TclGetInstructionTable
#define TclGetInstructionTable \
	(tclIntStubsPtr->tclGetInstructionTable) /* 163 */
#endif
#ifndef TclExpandCodeArray
#define TclExpandCodeArray \
	(tclIntStubsPtr->tclExpandCodeArray) /* 164 */
#endif

#endif /* defined(USE_TCL_STUBS) && !defined(USE_TCL_STUB_PROCS) */

/* !END!: Do not edit above this line. */

#endif /* _TCLINTDECLS */
Changes to generic/tclIntPlatDecls.h.
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16
17
18
19











-
+







/*
 * tclIntPlatDecls.h --
 *
 *	This file contains the declarations for all platform dependent
 *	unsupported functions that are exported by the Tcl library.  These
 *	interfaces are not guaranteed to remain the same between
 *	versions.  Use at your own risk.
 *
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 * All rights reserved.
 *
 * RCS: @(#) $Id: tclIntPlatDecls.h,v 1.8 2000/03/31 08:52:05 hobbs Exp $
 * RCS: @(#) $Id: tclIntPlatDecls.h,v 1.8.2.6 2001/10/18 01:01:53 hobbs Exp $
 */

#ifndef _TCLINTPLATDECLS
#define _TCLINTPLATDECLS

/*
 * WARNING: This file is automatically generated by the tools/genStubs.tcl
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
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







-
+
-











+
+




















-
+

-
-
+
+
+

-
+


-
+







				int direction));
/* 19 */
EXTERN TclFile		TclpOpenFile _ANSI_ARGS_((CONST char * fname, 
				int mode));
/* 20 */
EXTERN void		TclWinAddProcess _ANSI_ARGS_((HANDLE hProcess, 
				DWORD id));
/* 21 */
/* Slot 21 is reserved */
EXTERN void		TclpAsyncMark _ANSI_ARGS_((Tcl_AsyncHandler async));
/* 22 */
EXTERN TclFile		TclpCreateTempFile _ANSI_ARGS_((
				CONST char * contents));
/* 23 */
EXTERN char *		TclpGetTZName _ANSI_ARGS_((int isdst));
/* 24 */
EXTERN char *		TclWinNoBackslash _ANSI_ARGS_((char * path));
/* 25 */
EXTERN TclPlatformType * TclWinGetPlatform _ANSI_ARGS_((void));
/* 26 */
EXTERN void		TclWinSetInterfaces _ANSI_ARGS_((int wide));
/* 27 */
EXTERN void		TclWinFlushDirtyChannels _ANSI_ARGS_((void));
#endif /* __WIN32__ */
#ifdef MAC_TCL
/* 0 */
EXTERN VOID *		TclpSysAlloc _ANSI_ARGS_((long size, int isBin));
/* 1 */
EXTERN void		TclpSysFree _ANSI_ARGS_((VOID * ptr));
/* 2 */
EXTERN VOID *		TclpSysRealloc _ANSI_ARGS_((VOID * cp, 
				unsigned int size));
/* 3 */
EXTERN void		TclpExit _ANSI_ARGS_((int status));
/* 4 */
EXTERN int		FSpGetDefaultDir _ANSI_ARGS_((FSSpecPtr theSpec));
/* 5 */
EXTERN int		FSpSetDefaultDir _ANSI_ARGS_((FSSpecPtr theSpec));
/* 6 */
EXTERN OSErr		FSpFindFolder _ANSI_ARGS_((short vRefNum, 
				OSType folderType, Boolean createFolder, 
				FSSpec * spec));
/* 7 */
EXTERN void		GetGlobalMouse _ANSI_ARGS_((Point * mouse));
EXTERN void		GetGlobalMouseTcl _ANSI_ARGS_((Point * mouse));
/* 8 */
EXTERN pascal OSErr	FSpGetDirectoryID _ANSI_ARGS_((CONST FSSpec * spec, 
				long * theDirID, Boolean * isDirectory));
EXTERN pascal OSErr	FSpGetDirectoryIDTcl _ANSI_ARGS_((
				CONST FSSpec * spec, long * theDirID, 
				Boolean * isDirectory));
/* 9 */
EXTERN pascal short	FSpOpenResFileCompat _ANSI_ARGS_((
EXTERN pascal short	FSpOpenResFileCompatTcl _ANSI_ARGS_((
				CONST FSSpec * spec, SignedByte permission));
/* 10 */
EXTERN pascal void	FSpCreateResFileCompat _ANSI_ARGS_((
EXTERN pascal void	FSpCreateResFileCompatTcl _ANSI_ARGS_((
				CONST FSSpec * spec, OSType creator, 
				OSType fileType, ScriptCode scriptTag));
/* 11 */
EXTERN int		FSpLocationFromPath _ANSI_ARGS_((int length, 
				CONST char * path, FSSpecPtr theSpec));
/* 12 */
EXTERN OSErr		FSpPathFromLocation _ANSI_ARGS_((FSSpecPtr theSpec, 
188
189
190
191
192
193
194
195


196
197
198
199
200
201
202
190
191
192
193
194
195
196

197
198
199
200
201
202
203
204
205







-
+
+







EXTERN short		TclMacUnRegisterResourceFork _ANSI_ARGS_((
				char * tokenPtr, Tcl_Obj * resultPtr));
/* 22 */
EXTERN int		TclMacCreateEnv _ANSI_ARGS_((void));
/* 23 */
EXTERN FILE *		TclMacFOpenHack _ANSI_ARGS_((CONST char * path, 
				CONST char * mode));
/* Slot 24 is reserved */
/* 24 */
EXTERN char *		TclpGetTZName _ANSI_ARGS_((int isdst));
/* 25 */
EXTERN int		TclMacChmod _ANSI_ARGS_((char * path, int mode));
#endif /* MAC_TCL */

typedef struct TclIntPlatStubs {
    int magic;
    struct TclIntPlatStubHooks *hooks;
231
232
233
234
235
236
237
238

239
240
241
242
243

244
245
246
247
248
249
250
251
252
253
254
255
256




257
258
259
260
261
262
263
264
265
266
267
268
269
270

271
272
273
274
275
276
277
234
235
236
237
238
239
240

241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256




257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273

274
275
276
277
278
279
280
281







-
+





+









-
-
-
-
+
+
+
+













-
+







    int (*tclpCreatePipe) _ANSI_ARGS_((TclFile * readPipe, TclFile * writePipe)); /* 14 */
    int (*tclpCreateProcess) _ANSI_ARGS_((Tcl_Interp * interp, int argc, char ** argv, TclFile inputFile, TclFile outputFile, TclFile errorFile, Tcl_Pid * pidPtr)); /* 15 */
    void *reserved16;
    void *reserved17;
    TclFile (*tclpMakeFile) _ANSI_ARGS_((Tcl_Channel channel, int direction)); /* 18 */
    TclFile (*tclpOpenFile) _ANSI_ARGS_((CONST char * fname, int mode)); /* 19 */
    void (*tclWinAddProcess) _ANSI_ARGS_((HANDLE hProcess, DWORD id)); /* 20 */
    void (*tclpAsyncMark) _ANSI_ARGS_((Tcl_AsyncHandler async)); /* 21 */
    void *reserved21;
    TclFile (*tclpCreateTempFile) _ANSI_ARGS_((CONST char * contents)); /* 22 */
    char * (*tclpGetTZName) _ANSI_ARGS_((int isdst)); /* 23 */
    char * (*tclWinNoBackslash) _ANSI_ARGS_((char * path)); /* 24 */
    TclPlatformType * (*tclWinGetPlatform) _ANSI_ARGS_((void)); /* 25 */
    void (*tclWinSetInterfaces) _ANSI_ARGS_((int wide)); /* 26 */
    void (*tclWinFlushDirtyChannels) _ANSI_ARGS_((void)); /* 27 */
#endif /* __WIN32__ */
#ifdef MAC_TCL
    VOID * (*tclpSysAlloc) _ANSI_ARGS_((long size, int isBin)); /* 0 */
    void (*tclpSysFree) _ANSI_ARGS_((VOID * ptr)); /* 1 */
    VOID * (*tclpSysRealloc) _ANSI_ARGS_((VOID * cp, unsigned int size)); /* 2 */
    void (*tclpExit) _ANSI_ARGS_((int status)); /* 3 */
    int (*fSpGetDefaultDir) _ANSI_ARGS_((FSSpecPtr theSpec)); /* 4 */
    int (*fSpSetDefaultDir) _ANSI_ARGS_((FSSpecPtr theSpec)); /* 5 */
    OSErr (*fSpFindFolder) _ANSI_ARGS_((short vRefNum, OSType folderType, Boolean createFolder, FSSpec * spec)); /* 6 */
    void (*getGlobalMouse) _ANSI_ARGS_((Point * mouse)); /* 7 */
    pascal OSErr (*fSpGetDirectoryID) _ANSI_ARGS_((CONST FSSpec * spec, long * theDirID, Boolean * isDirectory)); /* 8 */
    pascal short (*fSpOpenResFileCompat) _ANSI_ARGS_((CONST FSSpec * spec, SignedByte permission)); /* 9 */
    pascal void (*fSpCreateResFileCompat) _ANSI_ARGS_((CONST FSSpec * spec, OSType creator, OSType fileType, ScriptCode scriptTag)); /* 10 */
    void (*getGlobalMouseTcl) _ANSI_ARGS_((Point * mouse)); /* 7 */
    pascal OSErr (*fSpGetDirectoryIDTcl) _ANSI_ARGS_((CONST FSSpec * spec, long * theDirID, Boolean * isDirectory)); /* 8 */
    pascal short (*fSpOpenResFileCompatTcl) _ANSI_ARGS_((CONST FSSpec * spec, SignedByte permission)); /* 9 */
    pascal void (*fSpCreateResFileCompatTcl) _ANSI_ARGS_((CONST FSSpec * spec, OSType creator, OSType fileType, ScriptCode scriptTag)); /* 10 */
    int (*fSpLocationFromPath) _ANSI_ARGS_((int length, CONST char * path, FSSpecPtr theSpec)); /* 11 */
    OSErr (*fSpPathFromLocation) _ANSI_ARGS_((FSSpecPtr theSpec, int * length, Handle * fullPath)); /* 12 */
    void (*tclMacExitHandler) _ANSI_ARGS_((void)); /* 13 */
    void (*tclMacInitExitToShell) _ANSI_ARGS_((int usePatch)); /* 14 */
    OSErr (*tclMacInstallExitToShellPatch) _ANSI_ARGS_((ExitToShellProcPtr newProc)); /* 15 */
    int (*tclMacOSErrorToPosixError) _ANSI_ARGS_((int error)); /* 16 */
    void (*tclMacRemoveTimer) _ANSI_ARGS_((void * timerToken)); /* 17 */
    void * (*tclMacStartTimer) _ANSI_ARGS_((long ms)); /* 18 */
    int (*tclMacTimerExpired) _ANSI_ARGS_((void * timerToken)); /* 19 */
    int (*tclMacRegisterResourceFork) _ANSI_ARGS_((short fileRef, Tcl_Obj * tokenPtr, int insert)); /* 20 */
    short (*tclMacUnRegisterResourceFork) _ANSI_ARGS_((char * tokenPtr, Tcl_Obj * resultPtr)); /* 21 */
    int (*tclMacCreateEnv) _ANSI_ARGS_((void)); /* 22 */
    FILE * (*tclMacFOpenHack) _ANSI_ARGS_((CONST char * path, CONST char * mode)); /* 23 */
    void *reserved24;
    char * (*tclpGetTZName) _ANSI_ARGS_((int isdst)); /* 24 */
    int (*tclMacChmod) _ANSI_ARGS_((char * path, int mode)); /* 25 */
#endif /* MAC_TCL */
} TclIntPlatStubs;

#ifdef __cplusplus
extern "C" {
#endif
394
395
396
397
398
399
400
401

402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424




425
426
427
428
429
430
431
398
399
400
401
402
403
404

405



406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436







-
+
-
-
-




















+
+
+
+







#define TclpOpenFile \
	(tclIntPlatStubsPtr->tclpOpenFile) /* 19 */
#endif
#ifndef TclWinAddProcess
#define TclWinAddProcess \
	(tclIntPlatStubsPtr->tclWinAddProcess) /* 20 */
#endif
#ifndef TclpAsyncMark
/* Slot 21 is reserved */
#define TclpAsyncMark \
	(tclIntPlatStubsPtr->tclpAsyncMark) /* 21 */
#endif
#ifndef TclpCreateTempFile
#define TclpCreateTempFile \
	(tclIntPlatStubsPtr->tclpCreateTempFile) /* 22 */
#endif
#ifndef TclpGetTZName
#define TclpGetTZName \
	(tclIntPlatStubsPtr->tclpGetTZName) /* 23 */
#endif
#ifndef TclWinNoBackslash
#define TclWinNoBackslash \
	(tclIntPlatStubsPtr->tclWinNoBackslash) /* 24 */
#endif
#ifndef TclWinGetPlatform
#define TclWinGetPlatform \
	(tclIntPlatStubsPtr->tclWinGetPlatform) /* 25 */
#endif
#ifndef TclWinSetInterfaces
#define TclWinSetInterfaces \
	(tclIntPlatStubsPtr->tclWinSetInterfaces) /* 26 */
#endif
#ifndef TclWinFlushDirtyChannels
#define TclWinFlushDirtyChannels \
	(tclIntPlatStubsPtr->tclWinFlushDirtyChannels) /* 27 */
#endif
#endif /* __WIN32__ */
#ifdef MAC_TCL
#ifndef TclpSysAlloc
#define TclpSysAlloc \
	(tclIntPlatStubsPtr->tclpSysAlloc) /* 0 */
#endif
#ifndef TclpSysFree
448
449
450
451
452
453
454
455
456
457



458
459
460
461



462
463
464
465



466
467
468
469



470
471
472
473
474
475
476
453
454
455
456
457
458
459



460
461
462
463



464
465
466
467



468
469
470
471



472
473
474
475
476
477
478
479
480
481







-
-
-
+
+
+

-
-
-
+
+
+

-
-
-
+
+
+

-
-
-
+
+
+







#define FSpSetDefaultDir \
	(tclIntPlatStubsPtr->fSpSetDefaultDir) /* 5 */
#endif
#ifndef FSpFindFolder
#define FSpFindFolder \
	(tclIntPlatStubsPtr->fSpFindFolder) /* 6 */
#endif
#ifndef GetGlobalMouse
#define GetGlobalMouse \
	(tclIntPlatStubsPtr->getGlobalMouse) /* 7 */
#ifndef GetGlobalMouseTcl
#define GetGlobalMouseTcl \
	(tclIntPlatStubsPtr->getGlobalMouseTcl) /* 7 */
#endif
#ifndef FSpGetDirectoryID
#define FSpGetDirectoryID \
	(tclIntPlatStubsPtr->fSpGetDirectoryID) /* 8 */
#ifndef FSpGetDirectoryIDTcl
#define FSpGetDirectoryIDTcl \
	(tclIntPlatStubsPtr->fSpGetDirectoryIDTcl) /* 8 */
#endif
#ifndef FSpOpenResFileCompat
#define FSpOpenResFileCompat \
	(tclIntPlatStubsPtr->fSpOpenResFileCompat) /* 9 */
#ifndef FSpOpenResFileCompatTcl
#define FSpOpenResFileCompatTcl \
	(tclIntPlatStubsPtr->fSpOpenResFileCompatTcl) /* 9 */
#endif
#ifndef FSpCreateResFileCompat
#define FSpCreateResFileCompat \
	(tclIntPlatStubsPtr->fSpCreateResFileCompat) /* 10 */
#ifndef FSpCreateResFileCompatTcl
#define FSpCreateResFileCompatTcl \
	(tclIntPlatStubsPtr->fSpCreateResFileCompatTcl) /* 10 */
#endif
#ifndef FSpLocationFromPath
#define FSpLocationFromPath \
	(tclIntPlatStubsPtr->fSpLocationFromPath) /* 11 */
#endif
#ifndef FSpPathFromLocation
#define FSpPathFromLocation \
516
517
518
519
520
521
522
523




524
525
526
527
528
529
530
531
532
533
534
521
522
523
524
525
526
527

528
529
530
531
532
533
534
535
536
537
538
539
540
541
542







-
+
+
+
+











#define TclMacCreateEnv \
	(tclIntPlatStubsPtr->tclMacCreateEnv) /* 22 */
#endif
#ifndef TclMacFOpenHack
#define TclMacFOpenHack \
	(tclIntPlatStubsPtr->tclMacFOpenHack) /* 23 */
#endif
/* Slot 24 is reserved */
#ifndef TclpGetTZName
#define TclpGetTZName \
	(tclIntPlatStubsPtr->tclpGetTZName) /* 24 */
#endif
#ifndef TclMacChmod
#define TclMacChmod \
	(tclIntPlatStubsPtr->tclMacChmod) /* 25 */
#endif
#endif /* MAC_TCL */

#endif /* defined(USE_TCL_STUBS) && !defined(USE_TCL_STUB_PROCS) */

/* !END!: Do not edit above this line. */

#endif /* _TCLINTPLATDECLS */
Changes to generic/tclInterp.c.
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16
17
18
19











-
+







/* 
 * tclInterp.c --
 *
 *	This file implements the "interp" command which allows creation
 *	and manipulation of Tcl interpreters from within Tcl scripts.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclInterp.c,v 1.5 1999/04/16 00:46:49 stanton Exp $
 * RCS: @(#) $Id: tclInterp.c,v 1.5.12.2 2001/09/11 00:53:27 hobbs Exp $
 */

#include <stdio.h>
#include "tclInt.h"
#include "tclPort.h"

/*
945
946
947
948
949
950
951
952

953
954
955
956
957
958
959
945
946
947
948
949
950
951

952
953
954
955
956
957
958
959







-
+







    }
    return TCL_OK;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ObjGetAlias --
 * Tcl_GetAliasObj --
 *
 *	Object version: Gets information about an alias.
 *
 * Results:
 *	A standard Tcl result.
 *
 * Side effects:
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
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







+
+
+
+
+
+
+
+
+
+
+
+
+














-
-








    Tcl_Preserve((ClientData) targetInterp);

    ((Interp *) targetInterp)->numLevels++;

    Tcl_ResetResult(targetInterp);
    Tcl_AllowExceptions(targetInterp);

    /*
     * Check depth of nested calls with AliasObjCmd: if this gets too large,
     * it's probably because of an infinite loop somewhere.
     */

    if (((Interp *) targetInterp)->numLevels >
	    ((Interp *) targetInterp)->maxNestingDepth) {
	Tcl_AppendToObj(Tcl_GetObjResult(targetInterp),
		"too many nested calls to AliasObjCmd (infinite loop using alias?)", -1);
	result = TCL_ERROR;
	goto done;
    }

    /*
     * Append the arguments to the command prefix and invoke the command
     * in the target interp's global namespace.
     */
     
    Tcl_ListObjGetElements(NULL, aliasPtr->prefixPtr, &prefc, &prefv);
    cmdPtr = Tcl_NewListObj(prefc, prefv);
    Tcl_ListObjReplace(NULL, cmdPtr, prefc, 0, objc - 1, objv + 1);
    Tcl_ListObjGetElements(NULL, cmdPtr, &cmdc, &cmdv);
    result = TclObjInvoke(targetInterp, cmdc, cmdv,
	    TCL_INVOKE_NO_TRACEBACK);
    Tcl_DecrRefCount(cmdPtr);

    ((Interp *) targetInterp)->numLevels--;
    
    /*
     * Check if we are at the bottom of the stack for the target interpreter.
     * If so, check for special return codes.
     */
    
    if (((Interp *) targetInterp)->numLevels == 0) {
	if (result == TCL_RETURN) {
1437
1438
1439
1440
1441
1442
1443


1444

1445
1446
1447
1448
1449
1450
1451
1448
1449
1450
1451
1452
1453
1454
1455
1456

1457
1458
1459
1460
1461
1462
1463
1464







+
+
-
+








                sprintf(buf, "command returned bad code: %d", result);
                Tcl_SetObjResult(targetInterp, Tcl_NewStringObj(buf, -1));
	    }
	    result = TCL_ERROR;
	}
    }
    done:
    ((Interp *) targetInterp)->numLevels--;

    
    TclTransferResult(targetInterp, result, interp);

    Tcl_Release((ClientData) targetInterp);
    return result;        
}

/*
Changes to generic/tclListObj.c.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







/* 
 * tclListObj.c --
 *
 *	This file contains procedures that implement the Tcl list object
 *	type.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 * Copyright (c) 1998 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclListObj.c,v 1.7 1999/08/10 22:45:11 redman Exp $
 * RCS: @(#) $Id: tclListObj.c,v 1.7.8.1 2001/04/04 07:38:47 hobbs Exp $
 */

#include "tclInt.h"

/*
 * Prototypes for procedures defined later in this file:
 */
261
262
263
264
265
266
267

268
269
270
271
272
273
274
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275







+







	listRepPtr->elemCount    = objc;
	listRepPtr->elements     = elemPtrs;
	
	objPtr->internalRep.otherValuePtr = (VOID *) listRepPtr;
	objPtr->typePtr = &tclListType;
    } else {
	objPtr->bytes = tclEmptyStringRep;
	objPtr->length = 0;
    }
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ListObjGetElements --
Changes to generic/tclLiteral.c.
8
9
10
11
12
13
14
15

16
17
18
19
20
21
22
8
9
10
11
12
13
14

15
16
17
18
19
20
21
22







-
+







 *	that appears in tclHash.c.
 *
 * Copyright (c) 1997-1998 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclLiteral.c,v 1.8 1999/08/19 02:59:10 hobbs Exp $
 * RCS: @(#) $Id: tclLiteral.c,v 1.8.2.3 2001/10/11 22:34:11 msofer Exp $
 */

#include "tclInt.h"
#include "tclCompile.h"
#include "tclPort.h"
/*
 * When there are this many entries per bucket, on average, rebuild
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723



724
725
726
727
728
729
730
731
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
691
692
693
694
695
696
697
698























699

700
701
702
703
704
705
706
707
708
709
710



711
712
713
714
715
716
717


718
719
720
721
722


723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738

739
740
741
742
743
744
745
746
747
748
749
750
751








-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

-
+
+
+








-
-
-



+
+

+
-
-
+
+
+
+

-
-
+
+
+
+
+
+
+
+
+
+
+
+




-
+




+








    for (prevPtr = NULL, entryPtr = globalTablePtr->buckets[index];
	    entryPtr != NULL;
	    prevPtr = entryPtr, entryPtr = entryPtr->nextPtr) {
	if (entryPtr->objPtr == objPtr) {
	    entryPtr->refCount--;

	    /*
	     * We found the matching LiteralEntry. Check if it's only being
	     * kept alive only by a circular reference from a ByteCode
	     * stored as its internal rep.
	     */
	    
	    if ((entryPtr->refCount == 1)
		    && (objPtr->typePtr == &tclByteCodeType)) {
		codePtr = (ByteCode *) objPtr->internalRep.otherValuePtr;
		if ((codePtr->numLitObjects == 1)
		        && (codePtr->objArrayPtr[0] == objPtr)) {
		    entryPtr->refCount = 0;

		    /*
		     * Set the ByteCode object array entry NULL to signal
		     * to TclCleanupByteCode to not try to release this
		     * about to be freed literal again.
		     */

		    codePtr->objArrayPtr[0] = NULL;
		}
	    }

	    /*
	     * If the literal is no longer being used by any ByteCode,
	     * delete the entry then decrement the ref count of its object.
	     * delete the entry then remove the reference corresponding 
	     * to the global literal table entry (decrement the ref count 
	     * of the object).
	     */
		
	    if (entryPtr->refCount == 0) {
		if (prevPtr == NULL) {
		    globalTablePtr->buckets[index] = entryPtr->nextPtr;
		} else {
		    prevPtr->nextPtr = entryPtr->nextPtr;
		}
#ifdef TCL_COMPILE_STATS
		iPtr->stats.currentLitStringBytes -= (double) (length + 1);
#endif /*TCL_COMPILE_STATS*/
		ckfree((char *) entryPtr);
		globalTablePtr->numEntries--;

		TclDecrRefCount(objPtr);

		/*
		 * Check if the LiteralEntry is only being kept alive by 
		 * Remove the reference corresponding to the global 
		 * literal table entry.
		 * a circular reference from a ByteCode stored as its 
		 * internal rep. In that case, set the ByteCode object array 
		 * entry NULL to signal to TclCleanupByteCode to not try to 
		 * release this about to be freed literal again.
		 */

		TclDecrRefCount(objPtr);
	    
		if (objPtr->typePtr == &tclByteCodeType) {
		    codePtr = (ByteCode *) objPtr->internalRep.otherValuePtr;
		    if ((codePtr->numLitObjects == 1)
		            && (codePtr->objArrayPtr[0] == objPtr)) {			
			codePtr->objArrayPtr[0] = NULL;
		    }
		}

#ifdef TCL_COMPILE_STATS
		iPtr->stats.currentLitStringBytes -= (double) (length + 1);
#endif /*TCL_COMPILE_STATS*/
	    }
	    break;
	}
    }

    
    /*
     * Remove the reference corresponding to the local literal table
     * entry.
     */

    Tcl_DecrRefCount(objPtr);
}

/*
 *----------------------------------------------------------------------
 *
 * HashString --
Changes to generic/tclMain.c.
1
2
3
4
5
6
7

8
9
10
11
12

13
14
15
16
17
18
19
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20







+




-
+







/* 
 * tclMain.c --
 *
 *	Main program for Tcl shells and other Tcl-based applications.
 *
 * Copyright (c) 1988-1994 The Regents of the University of California.
 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
 * Copyright (c) 2000 Ajuba Solutions.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMain.c,v 1.7 1999/12/12 02:26:42 hobbs Exp $
 * RCS: @(#) $Id: tclMain.c,v 1.7.2.3 2002/03/26 02:26:58 hobbs Exp $
 */

#include "tcl.h"
#include "tclInt.h"

# undef TCL_STORAGE_CLASS
# define TCL_STORAGE_CLASS DLLEXPORT
33
34
35
36
37
38
39

40



41
42
43
44

45



















46
47
48
49
50
51
52
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







+

+
+
+




+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







 * to include tclPort.h here, because people might copy this file out of
 * the Tcl source directory to make their own modified versions).
 * Note:  "exit" should really be declared here, but there's no way to
 * declare it without causing conflicts with other definitions elsewher
 * on some systems, so it's better just to leave it out.
 */

#if !defined(MAC_TCL)
extern int		isatty _ANSI_ARGS_((int fd));
#else
#include <unistd.h>
#endif
extern char *		strcpy _ANSI_ARGS_((char *dst, CONST char *src));

static char *tclStartupScriptFileName = NULL;

static Tcl_MainLoopProc *mainLoopProc = NULL;

typedef struct ThreadSpecificData {
    Tcl_Interp *interp;         /* Interpreter for this thread. */
    Tcl_DString command;        /* Used to assemble lines of terminal input
				 * into Tcl commands. */
    Tcl_DString line;           /* Used to read the next line from the
				 * terminal input. */
    int tty;                    /* Non-zero means standard input is a 
				 * terminal-like device.  Zero means it's
				 * a file. */
} ThreadSpecificData;
Tcl_ThreadDataKey dataKey;

/*
 * Forward declarations for procedures defined later in this file.
 */

static void		Prompt _ANSI_ARGS_((Tcl_Interp *interp, int partial));
static void		StdinProc _ANSI_ARGS_((ClientData clientData,
			    int mask));


/*
 *----------------------------------------------------------------------
 *
 * TclSetStartupScriptFileName --
 *
97
98
99
100
101
102
103
104

105
106
107
108
109
110
111
122
123
124
125
126
127
128

129
130
131
132
133
134
135
136







-
+







 *
 * Tcl_Main --
 *
 *	Main program for tclsh and most other Tcl-based applications.
 *
 * Results:
 *	None. This procedure never returns (it exits the process when
 *	it's done.
 *	it's done).
 *
 * Side effects:
 *	This procedure initializes the Tcl world and then starts
 *	interpreting commands;  almost anything could happen, depending
 *	on the script being interpreted.
 *
 *----------------------------------------------------------------------
119
120
121
122
123
124
125
126
127


128
129
130
131

132
133



134

135
136
137
138
139
140
141
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







-
-
+
+




+


+
+
+
-
+







				/* Application-specific initialization
				 * procedure to call after most
				 * initialization but before starting to
				 * execute commands. */
{
    Tcl_Obj *resultPtr;
    Tcl_Obj *commandPtr = NULL;
    char buffer[1000], *args;
    int code, gotPartial, tty, length;
    char buffer[TCL_INTEGER_SPACE + 8], *args;
    int code, gotPartial, length;
    int exitCode = 0;
    Tcl_Channel inChannel, outChannel, errChannel;
    Tcl_Interp *interp;
    Tcl_DString argString;
    ThreadSpecificData *tsdPtr;

    Tcl_FindExecutable(argv[0]);

    tsdPtr = (ThreadSpecificData *) 
	Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData));
    interp = Tcl_CreateInterp();
    tsdPtr->interp = interp = Tcl_CreateInterp();
#ifdef TCL_MEM_DEBUG
    Tcl_InitMemory(interp);
#endif

    /*
     * Make command-line arguments available in the Tcl variables "argc"
     * and "argv".  If the first argument doesn't start with a "-" then
166
167
168
169
170
171
172
173

174
175

176
177
178
179
180
181
182
195
196
197
198
199
200
201

202
203

204
205
206
207
208
209
210
211







-
+

-
+







    Tcl_SetVar(interp, "argc", buffer, TCL_GLOBAL_ONLY);
    Tcl_SetVar(interp, "argv0", Tcl_DStringValue(&argString), TCL_GLOBAL_ONLY);

    /*
     * Set the "tcl_interactive" variable.
     */

    tty = isatty(0);
    tsdPtr->tty = isatty(0);
    Tcl_SetVar(interp, "tcl_interactive",
	    ((tclStartupScriptFileName == NULL) && tty) ? "1" : "0",
	    ((tclStartupScriptFileName == NULL) && tsdPtr->tty) ? "1" : "0",
	    TCL_GLOBAL_ONLY);
    
    /*
     * Invoke application-specific initialization.
     */

    if ((*appInitProc)(interp) != TCL_OK) {
231
232
233
234
235
236
237
238

239
240
241
242
243
244
245
260
261
262
263
264
265
266

267
268
269
270
271
272
273
274







-
+







    commandPtr = Tcl_NewObj();
    Tcl_IncrRefCount(commandPtr);

    inChannel = Tcl_GetStdChannel(TCL_STDIN);
    outChannel = Tcl_GetStdChannel(TCL_STDOUT);
    gotPartial = 0;
    while (1) {
	if (tty) {
	if (tsdPtr->tty) {
	    Tcl_Obj *promptCmdPtr;

	    promptCmdPtr = Tcl_GetVar2Ex(interp,
		    (gotPartial ? "tcl_prompt2" : "tcl_prompt1"),
		    NULL, TCL_GLOBAL_ONLY);
	    if (promptCmdPtr == NULL) {
                defaultPrompt:
295
296
297
298
299
300
301
302

303
304
305
306
307
308





















309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325










326
327
328
329
330
331






























































































































































































324
325
326
327
328
329
330

331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581







-
+






+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

















+
+
+
+
+
+
+
+
+
+






+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
	commandPtr = Tcl_NewObj();
	Tcl_IncrRefCount(commandPtr);
	if (code != TCL_OK) {
	    if (errChannel) {
		Tcl_WriteObj(errChannel, Tcl_GetObjResult(interp));
		Tcl_WriteChars(errChannel, "\n", 1);
	    }
	} else if (tty) {
	} else if (tsdPtr->tty) {
	    resultPtr = Tcl_GetObjResult(interp);
	    Tcl_GetStringFromObj(resultPtr, &length);
	    if ((length > 0) && outChannel) {
		Tcl_WriteObj(outChannel, resultPtr);
		Tcl_WriteChars(outChannel, "\n", 1);
	    }
	}
	if (mainLoopProc != NULL) {
	    /*
	     * If a main loop has been defined while running interactively,
	     * we want to start a fileevent based prompt by establishing a
	     * channel handler for stdin.
	     */

	    if (inChannel) {
		Tcl_CreateChannelHandler(inChannel, TCL_READABLE, StdinProc,
			(ClientData) inChannel);
	    }
	    if (tsdPtr->tty) {
		Prompt(interp, 0);
	    }
	    Tcl_DStringInit(&tsdPtr->command);
	    Tcl_DStringInit(&tsdPtr->line);

	    (*mainLoopProc)();
	    mainLoopProc = NULL;
	    break;
	}
#ifdef TCL_MEM_DEBUG
	if (tclMemDumpFileName != NULL) {
	    Tcl_DecrRefCount(commandPtr);
	    Tcl_DeleteInterp(interp);
	    Tcl_Exit(0);
	}
#endif
    }

    /*
     * Rather than calling exit, invoke the "exit" command so that
     * users can replace "exit" with some other command to do additional
     * cleanup on exit.  The Tcl_Eval call should never return.
     */

    done:
    if ((exitCode == 0) && (mainLoopProc != NULL)) {
	/*
	 * If everything has gone OK so far, call the main loop proc,
	 * if it exists.  Packages (like Tk) can set it to start processing
	 * events at this point.
	 */

	(*mainLoopProc)();
	mainLoopProc = NULL;
    }
    if (commandPtr != NULL) {
	Tcl_DecrRefCount(commandPtr);
    }
    sprintf(buffer, "exit %d", exitCode);
    Tcl_Eval(interp, buffer);
}

/*
 *---------------------------------------------------------------
 *
 * Tcl_SetMainLoop --
 *
 *	Sets an alternative main loop procedure.
 *
 * Results:
 *	Returns the previously defined main loop procedure.
 *
 * Side effects:
 *	This procedure will be called before Tcl exits, allowing for
 *	the creation of an event loop.
 *
 *---------------------------------------------------------------
 */

void
Tcl_SetMainLoop(proc)
    Tcl_MainLoopProc *proc;
{
    mainLoopProc = proc;
}

/*
 *----------------------------------------------------------------------
 *
 * StdinProc --
 *
 *	This procedure is invoked by the event dispatcher whenever
 *	standard input becomes readable.  It grabs the next line of
 *	input characters, adds them to a command being assembled, and
 *	executes the command if it's complete.
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	Could be almost arbitrary, depending on the command that's
 *	typed.
 *
 *----------------------------------------------------------------------
 */

    /* ARGSUSED */
static void
StdinProc(clientData, mask)
    ClientData clientData;		/* Not used. */
    int mask;				/* Not used. */
{
    static int gotPartial = 0;
    char *cmd;
    int code, count;
    Tcl_Channel chan = (Tcl_Channel) clientData;
    ThreadSpecificData *tsdPtr = (ThreadSpecificData *) 
            Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData));
    Tcl_Interp *interp = tsdPtr->interp;

    count = Tcl_Gets(chan, &tsdPtr->line);

    if (count < 0) {
	if (!gotPartial) {
	    if (tsdPtr->tty) {
		Tcl_Exit(0);
	    } else {
		Tcl_DeleteChannelHandler(chan, StdinProc, (ClientData) chan);
	    }
	    return;
	} 
    }

    (void) Tcl_DStringAppend(&tsdPtr->command, Tcl_DStringValue(
            &tsdPtr->line), -1);
    cmd = Tcl_DStringAppend(&tsdPtr->command, "\n", -1);
    Tcl_DStringFree(&tsdPtr->line);
    if (!Tcl_CommandComplete(cmd)) {
        gotPartial = 1;
        goto prompt;
    }
    gotPartial = 0;

    /*
     * Disable the stdin channel handler while evaluating the command;
     * otherwise if the command re-enters the event loop we might
     * process commands from stdin before the current command is
     * finished.  Among other things, this will trash the text of the
     * command being evaluated.
     */

    Tcl_CreateChannelHandler(chan, 0, StdinProc, (ClientData) chan);
    code = Tcl_RecordAndEval(interp, cmd, TCL_EVAL_GLOBAL);
    
    chan = Tcl_GetStdChannel(TCL_STDIN);
    if (chan) {
	Tcl_CreateChannelHandler(chan, TCL_READABLE, StdinProc,
		(ClientData) chan);
    }
    Tcl_DStringFree(&tsdPtr->command);
    if (Tcl_GetStringResult(interp)[0] != '\0') {
	if ((code != TCL_OK) || (tsdPtr->tty)) {
	    chan = Tcl_GetStdChannel(TCL_STDOUT);
	    if (chan) {
		Tcl_WriteObj(chan, Tcl_GetObjResult(interp));
		Tcl_WriteChars(chan, "\n", 1);
	    }
	}
    }

    /*
     * Output a prompt.
     */

    prompt:
    if (tsdPtr->tty) {
	Prompt(interp, gotPartial);
    }
    Tcl_ResetResult(interp);
}

/*
 *----------------------------------------------------------------------
 *
 * Prompt --
 *
 *	Issue a prompt on standard output, or invoke a script
 *	to issue the prompt.
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	A prompt gets output, and a Tcl script may be evaluated
 *	in interp.
 *
 *----------------------------------------------------------------------
 */

static void
Prompt(interp, partial)
    Tcl_Interp *interp;			/* Interpreter to use for prompting. */
    int partial;			/* Non-zero means there already
					 * exists a partial command, so use
					 * the secondary prompt. */
{
    char *promptCmd;
    int code;
    Tcl_Channel outChannel, errChannel;

    promptCmd = Tcl_GetVar(interp,
	partial ? "tcl_prompt2" : "tcl_prompt1", TCL_GLOBAL_ONLY);
    if (promptCmd == NULL) {
defaultPrompt:
	if (!partial) {

            /*
             * We must check that outChannel is a real channel - it
             * is possible that someone has transferred stdout out of
             * this interpreter with "interp transfer".
             */

	    outChannel = Tcl_GetChannel(interp, "stdout", NULL);
            if (outChannel != (Tcl_Channel) NULL) {
                Tcl_WriteChars(outChannel, "% ", 2);
            }
	}
    } else {
	code = Tcl_Eval(interp, promptCmd);
	if (code != TCL_OK) {
	    Tcl_AddErrorInfo(interp,
		    "\n    (script that generates prompt)");
            /*
             * We must check that errChannel is a real channel - it
             * is possible that someone has transferred stderr out of
             * this interpreter with "interp transfer".
             */
            
	    errChannel = Tcl_GetChannel(interp, "stderr", NULL);
            if (errChannel != (Tcl_Channel) NULL) {
                Tcl_WriteObj(errChannel, Tcl_GetObjResult(interp));
                Tcl_WriteChars(errChannel, "\n", 1);
            }
	    goto defaultPrompt;
	}
    }
    outChannel = Tcl_GetChannel(interp, "stdout", NULL);
    if (outChannel != (Tcl_Channel) NULL) {
	Tcl_Flush(outChannel);
    }
}
Changes to generic/tclNamesp.c.
15
16
17
18
19
20
21
22

23
24
25
26
27
28
29
15
16
17
18
19
20
21

22
23
24
25
26
27
28
29







-
+







 *   Michael J. McLennan
 *   Bell Labs Innovations for Lucent Technologies
 *   mmclennan@lucent.com
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclNamesp.c,v 1.17 2000/03/27 22:18:56 hobbs Exp $
 * RCS: @(#) $Id: tclNamesp.c,v 1.17.2.3 2002/04/18 18:15:27 msofer Exp $
 */

#include "tclInt.h"

/*
 * Flag passed to TclGetNamespaceForQualName to indicate that it should
 * search for a namespace rather than a command or variable inside a
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
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







+












+







			    && (realCmdPtr->nsPtr == currNsPtr)
			    && (Tcl_FindHashEntry(&currNsPtr->cmdTable,
			            cmdName) != NULL)) {
			Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
			        "import pattern \"", pattern,
				"\" would create a loop containing command \"",
				Tcl_DStringValue(&ds), "\"", (char *) NULL);
			Tcl_DStringFree(&ds);
			return TCL_ERROR;
		    }
		}

		dataPtr = (ImportedCmdData *)
		        ckalloc(sizeof(ImportedCmdData));
                importedCmd = Tcl_CreateObjCommand(interp, 
                        Tcl_DStringValue(&ds), InvokeImportedCmd,
                        (ClientData) dataPtr, DeleteImportedCmd);
		dataPtr->realCmdPtr = cmdPtr;
		dataPtr->selfPtr = (Command *) importedCmd;
		dataPtr->selfPtr->compileProc = cmdPtr->compileProc;
		Tcl_DStringFree(&ds);

		/*
		 * Create an ImportRef structure describing this new import
		 * command and add it to the import ref list in the "real"
		 * command.
		 */

2271
2272
2273
2274
2275
2276
2277











2278
2279
2280
2281
2282
2283
2284
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297







+
+
+
+
+
+
+
+
+
+
+







	 * shadowNsPtr is initially :: and we check for case 1. above.
	 */

        if (found) {
            hPtr = Tcl_FindHashEntry(&shadowNsPtr->cmdTable, cmdName);
            if (hPtr != NULL) {
                nsPtr->cmdRefEpoch++;

		/* 
		 * If the shadowed command was compiled to bytecodes, we
		 * invalidate all the bytecodes in nsPtr, to force a new
		 * compilation. We use the resolverEpoch to signal the need
		 * for a fresh compilation of every bytecode.
		 */

		if ((((Command *) Tcl_GetHashValue(hPtr))->compileProc) != NULL) {
		    nsPtr->resolverEpoch++;
		}
            }
        }

        /*
	 * Insert nsPtr at the front of the trail list: i.e., at the end
	 * of the trailPtr array.
	 */
2873
2874
2875
2876
2877
2878
2879
2880

2881
2882
2883
2884
2885
2886
2887
2886
2887
2888
2889
2890
2891
2892

2893
2894
2895
2896
2897
2898
2899
2900







-
+







NamespaceEvalCmd(dummy, interp, objc, objv)
    ClientData dummy;		/* Not used. */
    Tcl_Interp *interp;		/* Current interpreter. */
    int objc;			/* Number of arguments. */
    Tcl_Obj *CONST objv[];	/* Argument objects. */
{
    Tcl_Namespace *namespacePtr;
    Tcl_CallFrame frame;
    CallFrame frame;
    Tcl_Obj *objPtr;
    char *name;
    int length, result;

    if (objc < 4) {
        Tcl_WrongNumArgs(interp, 2, objv, "name arg ?arg...?");
        return TCL_ERROR;
2911
2912
2913
2914
2915
2916
2917
2918
2919


2920
2921
2922


2923
2924
2925
2926
2927
2928
2929
2924
2925
2926
2927
2928
2929
2930


2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944







-
-
+
+



+
+







    }

    /*
     * Make the specified namespace the current namespace and evaluate
     * the command(s).
     */

    result = Tcl_PushCallFrame(interp, &frame, namespacePtr,
	    /*isProcCallFrame*/ 0);
    result = Tcl_PushCallFrame(interp, (Tcl_CallFrame *) &frame, 
            namespacePtr, /*isProcCallFrame*/ 0);
    if (result != TCL_OK) {
        return TCL_ERROR;
    }
    frame.objc = objc;
    frame.objv = objv;  /* ref counts do not need to be incremented here */

    if (objc == 4) {
        result = Tcl_EvalObjEx(interp, objv[3], 0);
    } else {
	/*
	 * More than one argument: concatenate them together with spaces
	 * between, then evaluate the result.  Tcl_EvalObjEx will delete
Changes to generic/tclObj.c.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







/* 
 * tclObj.c --
 *
 *	This file contains Tcl object-related procedures that are used by
 * 	many Tcl commands.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 * Copyright (c) 1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclObj.c,v 1.12 1999/12/04 06:15:41 hobbs Exp $
 * RCS: @(#) $Id: tclObj.c,v 1.12.2.7 2002/04/26 12:15:05 dgp Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

/*
 * Table of all object types.
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
44
45
46
47
48
49
50









51
52
53
54
55
56
57







-
-
-
-
-
-
-
-
-







 * as the value of an empty string representation for an object. This value
 * is shared by all new objects allocated by Tcl_NewObj.
 */

static char emptyString;
char *tclEmptyStringRep = &emptyString;

/*
 * The number of Tcl objects ever allocated (by Tcl_NewObj) and freed
 * (by TclFreeObj).
 */

#ifdef TCL_COMPILE_STATS
long tclObjsAlloced = 0;
long tclObjsFreed = 0;
#endif /* TCL_COMPILE_STATS */

/*
 * Prototypes for procedures defined later in this file:
 */

static int		SetBooleanFromAny _ANSI_ARGS_((Tcl_Interp *interp,
			    Tcl_Obj *objPtr));
405
406
407
408
409
410
411



412
413
414
415
416
417

418
419
420
421
422
423
424
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410

411
412
413
414
415
416
417
418







+
+
+





-
+








    /*
     * Allocate the object using the list of free Tcl_Obj structs
     * we maintain.
     */

    Tcl_MutexLock(&tclObjMutex);
#ifdef PURIFY
    objPtr = (Tcl_Obj *) Tcl_Ckalloc(sizeof(Tcl_Obj));
#else
    if (tclFreeObjList == NULL) {
	TclAllocateFreeObjects();
    }
    objPtr = tclFreeObjList;
    tclFreeObjList = (Tcl_Obj *) tclFreeObjList->internalRep.otherValuePtr;
    
#endif    
    objPtr->refCount = 0;
    objPtr->bytes    = tclEmptyStringRep;
    objPtr->length   = 0;
    objPtr->typePtr  = NULL;
#ifdef TCL_COMPILE_STATS
    tclObjsAlloced++;
#endif /* TCL_COMPILE_STATS */
519
520
521
522
523
524
525
526
527
528
529

530
531
532
533
534
535
536
537
538
539

540
541
542

543
544
545
546
547
548
549
513
514
515
516
517
518
519




520
521
522
523
524
525
526
527
528
529

530
531
532

533
534
535
536
537
538
539
540







-
-
-
-
+









-
+


-
+







 */

#define OBJS_TO_ALLOC_EACH_TIME 100

void
TclAllocateFreeObjects()
{
    Tcl_Obj tmp[2];
    size_t objSizePlusPadding =	/* NB: this assumes byte addressing. */
	((int)(&(tmp[1])) - (int)(&(tmp[0])));
    size_t bytesToAlloc = (OBJS_TO_ALLOC_EACH_TIME * objSizePlusPadding);
    size_t bytesToAlloc = (OBJS_TO_ALLOC_EACH_TIME * sizeof(Tcl_Obj));
    char *basePtr;
    register Tcl_Obj *prevPtr, *objPtr;
    register int i;

    basePtr = (char *) ckalloc(bytesToAlloc);
    memset(basePtr, 0, bytesToAlloc);

    prevPtr = NULL;
    objPtr = (Tcl_Obj *) basePtr;
    for (i = 0;  i < OBJS_TO_ALLOC_EACH_TIME;  i++) {
    for (i = 0; i < OBJS_TO_ALLOC_EACH_TIME; i++) {
	objPtr->internalRep.otherValuePtr = (VOID *) prevPtr;
	prevPtr = objPtr;
	objPtr = (Tcl_Obj *) (((char *)objPtr) + objSizePlusPadding);
	objPtr++;
    }
    tclFreeObjList = prevPtr;
}
#undef OBJS_TO_ALLOC_EACH_TIME

/*
 *----------------------------------------------------------------------
590
591
592
593
594
595
596
597

598
599
600
601
602
603
604
581
582
583
584
585
586
587

588
589
590
591
592
593
594
595







-
+







    /*
     * If debugging Tcl's memory usage, deallocate the object using ckfree.
     * Otherwise, deallocate it by adding it onto the list of free
     * Tcl_Obj structs we maintain.
     */

    Tcl_MutexLock(&tclObjMutex);
#ifdef TCL_MEM_DEBUG
#if defined(TCL_MEM_DEBUG) || defined(PURIFY)
    ckfree((char *) objPtr);
#else
    objPtr->internalRep.otherValuePtr = (VOID *) tclFreeObjList;
    tclFreeObjList = objPtr;
#endif /* TCL_MEM_DEBUG */

#ifdef TCL_COMPILE_STATS
644
645
646
647
648
649
650
651

652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
635
636
637
638
639
640
641

642








643
644
645
646
647
648
649







-
+
-
-
-
-
-
-
-
-







    register Tcl_Obj *dupPtr;

    TclNewObj(dupPtr);

    if (objPtr->bytes == NULL) {
	dupPtr->bytes = NULL;
    } else if (objPtr->bytes != tclEmptyStringRep) {
	int len = objPtr->length;
	TclInitStringRep(dupPtr, objPtr->bytes, objPtr->length);
	
	dupPtr->bytes = (char *) ckalloc((unsigned) len+1);
	if (len > 0) {
	    memcpy((VOID *) dupPtr->bytes, (VOID *) objPtr->bytes,
		   (unsigned) len);
	}
	dupPtr->bytes[len] = '\0';
	dupPtr->length = len;
    }
    
    if (typePtr != NULL) {
	if (typePtr->dupIntRepProc == NULL) {
	    dupPtr->internalRep = objPtr->internalRep;
	    dupPtr->typePtr = typePtr;
	} else {
999
1000
1001
1002
1003
1004
1005
1006


1007
1008
1009
1010
1011
1012
1013
982
983
984
985
986
987
988

989
990
991
992
993
994
995
996
997







-
+
+







{
    Tcl_ObjType *oldTypePtr = objPtr->typePtr;
    char *string, *end;
    register char c;
    char lowerCase[10];
    int newBool, length;
    register int i;
    double dbl;
    double dblValue;
    long intValue;

    /*
     * Get the string representation. Make it up-to-date if necessary.
     */

    string = Tcl_GetStringFromObj(objPtr, &length);

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
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







-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+















-
+


+







	} else if (strncmp(lowerCase, "off", (size_t) length) == 0) {
	    newBool = 0;
	} else {
	    goto badBoolean;
	}
    } else {
        /*
         * Still might be a string containing the characters representing an
         * int or double that wasn't handled above. This would be a string
         * like "27" or "1.0" that is non-zero and not "1". Such a string
         * whould result in the boolean value true. We try converting to
         * double. If that succeeds and the resulting double is non-zero, we
         * have a "true". Note that numbers can't have embedded NULLs.
         * Still might be a string containing the characters
         * representing an int or double that wasn't handled above.
         * This would be a string like "27", "1.0" or "0xac" that is
         * non-zero and not "1".  Such a string whould result in the
         * boolean value true.  We try converting to long and then to
         * double.  If either succeeds and the resulting value is
         * non-zero, we have a "true".  Note that numbers can't have
         * embedded NULLs.
	 *
	 * (Int handling added because of Bug 548686)
	 */

	intValue = strtol(string, &end, 0);
	if (end != string) {
	    /*
	     * Make sure the string has no garbage after the end of
	     * the int.
	     */
	
	    while ((end < (string+length))
		   && isspace(UCHAR(*end))) { /* INTL: ISO only */
		end++;
	    }
	    if (end == (string+length)) {
		newBool = (intValue != 0);
		goto goodBoolean;
	    }
	}

	dbl = strtod(string, &end);
	dblValue = strtod(string, &end);
	if (end == string) {
	    goto badBoolean;
	}

	/*
	 * Make sure the string has no garbage after the end of the double.
	 */
	
	while ((end < (string+length))
		&& isspace(UCHAR(*end))) { /* INTL: ISO only */
	    end++;
	}
	if (end != (string+length)) {
	    goto badBoolean;
	}
	newBool = (dbl != 0.0);
	newBool = (dblValue != 0.0);
    }

    goodBoolean:
    /*
     * Free the old internalRep before setting the new one. We do this as
     * late as possible to allow the conversion code, in particular
     * Tcl_GetStringFromObj, to use that old internalRep.
     */

    if ((oldTypePtr != NULL) &&	(oldTypePtr->freeIntRepProc != NULL)) {
Changes to generic/tclParse.c.
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17

18
19
20
21
22
23
24
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16

17
18
19
20
21
22
23
24











-
+




-
+







/* 
 * tclParse.c --
 *
 *	This file contains procedures that parse Tcl scripts.  They
 *	do so in a general-purpose fashion that can be used for many
 *	different purposes, including compilation, direct execution,
 *	code analysis, etc.  This file also includes a few additional
 *	procedures such as Tcl_EvalObjv, Tcl_Eval, and Tcl_EvalEx, which
 *	allow scripts to be evaluated directly, without compiling.
 *
 * Copyright (c) 1997 Sun Microsystems, Inc.
 * Copyright (c) 1998 by Scriptics Corporation.
 * Copyright (c) 1998-2000 Ajuba Solutions.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclParse.c,v 1.13 1999/11/10 02:51:57 hobbs Exp $
 * RCS: @(#) $Id: tclParse.c,v 1.13.2.2 2002/03/27 19:50:53 msofer Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

/*
 * The following table provides parsing information about each possible
1386
1387
1388
1389
1390
1391
1392
1393


1394
1395
1396
1397
1398
1399
1400
1386
1387
1388
1389
1390
1391
1392

1393
1394
1395
1396
1397
1398
1399
1400
1401







-
+
+







		}
	    }
    
	    /*
	     * Execute the command and free the objects for its words.
	     */
    
	    code = EvalObjv(interp, objectsUsed, objv, p, bytesLeft, 0);
	    code = EvalObjv(interp, objectsUsed, objv, p,
	            parse.commandStart + parse.commandSize - p, 0);
	    if (code != TCL_OK) {
		goto error;
	    }
	    for (i = 0; i < objectsUsed; i++) {
		Tcl_DecrRefCount(objv[i]);
	    }
	    objectsUsed = 0;
1452
1453
1454
1455
1456
1457
1458
1459



1460

1461



1462
1463
1464
1465
1466

















1467

















1468
1469
1470
1471
1472
1473
1474
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







-
+
+
+

+
-
+
+
+


-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







	Tcl_LogCommandInfo(interp, script, parse.commandStart, commandLength);
    }
    
    for (i = 0; i < objectsUsed; i++) {
	Tcl_DecrRefCount(objv[i]);
    }
    if (gotParse) {
	p = parse.commandStart + parse.commandSize;
	next = parse.commandStart + parse.commandSize;
	bytesLeft -= next - p;
	p = next;
	Tcl_FreeParse(&parse);

	if ((nested != 0) && (p > script) && (p[-1] == ']')) {
	if ((nested != 0) && (p > script)) {
	    char *nextCmd = NULL;	/* pointer to start of next command */

	    /*
	     * We get here in the special case where the TCL_BRACKET_TERM
	     * flag was set in the interpreter and we reached a close
	     * bracket in the script.  Return immediately.
	     */
	     * flag was set in the interpreter.
	     *
	     * At this point, we want to find the end of the script
	     * (either end of script or the closing ']').
	     */

	    while ((p[-1] != ']') && bytesLeft) {
		if (Tcl_ParseCommand(NULL, p, bytesLeft, nested, &parse)
			!= TCL_OK) {
		    /*
		     * We were looking for the ']' to close the script.
		     * But if we find a syntax error, it is ok to quit
		     * early since in that case we no longer need to know
		     * where the ']' is (if there was one).  We reset the
		     * pointer to the start of the command that after the
		     * one causing the return.  -- hobbs
		     */

		    p = (nextCmd == NULL) ? parse.commandStart : nextCmd;
		    break;
		}

		if (nextCmd == NULL) {
		    nextCmd = parse.commandStart;
		}

		/*
		 * Advance to the next command in the script.
		 */

		next = parse.commandStart + parse.commandSize;
		bytesLeft -= next - p;
		p = next;
		Tcl_FreeParse(&parse);
	    }
	    iPtr->termOffset = (p - 1) - script;
	} else {
	    iPtr->termOffset = p - script;
	}    
    }
    if (objv != staticObjArray) {
	ckfree((char *) objv);
Changes to generic/tclPkg.c.
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16
17
18
19











-
+







/* 
 * tclPkg.c --
 *
 *	This file implements package and version control for Tcl via
 *	the "package" command and a few C APIs.
 *
 * Copyright (c) 1996 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclPkg.c,v 1.5 1999/09/21 04:20:40 hobbs Exp $
 * RCS: @(#) $Id: tclPkg.c,v 1.5.2.1 2001/08/24 16:19:09 dgp Exp $
 */

#include "tclInt.h"

/*
 * Each invocation of the "package ifneeded" command creates a structure
 * of the following type, which is used to load the package into the
499
500
501
502
503
504
505
506

507
508
509
510
511
512
513
499
500
501
502
503
504
505

506
507
508
509
510
511
512
513







-
+







    switch ((enum pkgOptions) optionIndex) {
	case PKG_FORGET: {
	    char *keyString;
	    for (i = 2; i < objc; i++) {
		keyString = Tcl_GetString(objv[i]);
		hPtr = Tcl_FindHashEntry(&iPtr->packageTable, keyString);
		if (hPtr == NULL) {
		    return TCL_OK;
		    continue;	
		}
		pkgPtr = (Package *) Tcl_GetHashValue(hPtr);
		Tcl_DeleteHashEntry(hPtr);
		if (pkgPtr->version != NULL) {
		    ckfree(pkgPtr->version);
		}
		while (pkgPtr->availPtr != NULL) {
Changes to generic/tclPlatDecls.h.
1
2
3
4
5
6
7
8
9

10
11
12
13
14









15
16
17
18
19
20
21
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








-
+





+
+
+
+
+
+
+
+
+







/*
 * tclPlatDecls.h --
 *
 *	Declarations of platform specific Tcl APIs.
 *
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 * All rights reserved.
 *
 * RCS: @(#) $Id: tclPlatDecls.h,v 1.5 1999/04/30 22:45:02 stanton Exp $
 * RCS: @(#) $Id: tclPlatDecls.h,v 1.5.12.1 2001/04/03 22:54:38 hobbs Exp $
 */

#ifndef _TCLPLATDECLS
#define _TCLPLATDECLS

/*
 *  Pull in the definition of TCHAR.  Hopefully the compile flags
 *  of the core are matching against your project build for these
 *  public functions.  BE AWARE.
 */
#if defined(__WIN32__) && !defined(_INC_TCHAR)
#include <tchar.h>
#endif

/* !BEGIN!: Do not edit below this line. */

/*
 * Exported function declarations:
 */

#ifdef __WIN32__
Changes to generic/tclPosixStr.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







/* 
 * tclPosixStr.c --
 *
 *	This file contains procedures that generate strings
 *	corresponding to various POSIX-related codes, such
 *	as errno and signals.
 *
 * Copyright (c) 1991-1994 The Regents of the University of California.
 * Copyright (c) 1994-1996 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclPosixStr.c,v 1.5 1999/08/21 19:41:04 hobbs Exp $
 * RCS: @(#) $Id: tclPosixStr.c,v 1.5.2.1 2000/08/07 21:32:40 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

/*
 *----------------------------------------------------------------------
982
983
984
985
986
987
988
989

990
991
992
993
994
995
996
982
983
984
985
986
987
988

989
990
991
992
993
994
995
996







-
+







#endif
#if defined(SIGPOLL) && (!defined(SIGIO) || (SIGPOLL != SIGIO))
	case SIGPOLL: return "SIGPOLL";
#endif
#ifdef SIGPROF
	case SIGPROF: return "SIGPROF";
#endif
#if defined(SIGPWR) && (!defined(SIGXFSZ) || (SIGPWR != SIGXFSZ))
#if defined(SIGPWR) && (!defined(SIGXFSZ) || (SIGPWR != SIGXFSZ)) && (!defined(SIGLOST) || (SIGPWR != SIGLOST))
	case SIGPWR: return "SIGPWR";
#endif
#ifdef SIGQUIT
	case SIGQUIT: return "SIGQUIT";
#endif
#ifdef SIGSEGV
	case SIGSEGV: return "SIGSEGV";
1114
1115
1116
1117
1118
1119
1120
1121

1122
1123
1124
1125
1126
1127
1128
1114
1115
1116
1117
1118
1119
1120

1121
1122
1123
1124
1125
1126
1127
1128







-
+







#endif
#if defined(SIGPOLL) && (!defined(SIGIO) || (SIGPOLL != SIGIO))
	case SIGPOLL: return "input/output possible on file";
#endif
#ifdef SIGPROF
	case SIGPROF: return "profiling alarm";
#endif
#if defined(SIGPWR) && (!defined(SIGXFSZ) || (SIGPWR != SIGXFSZ))
#if defined(SIGPWR) && (!defined(SIGXFSZ) || (SIGPWR != SIGXFSZ)) && (!defined(SIGLOST) || (SIGPWR != SIGLOST))
	case SIGPWR: return "power-fail restart";
#endif
#ifdef SIGQUIT
	case SIGQUIT: return "quit signal";
#endif
#ifdef SIGSEGV
	case SIGSEGV: return "segmentation violation";
Changes to generic/tclScan.c.
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10

11
12
13
14
15
16
17
18










-
+







/* 
 * tclScan.c --
 *
 *	This file contains the implementation of the "scan" command.
 *
 * Copyright (c) 1998 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclScan.c,v 1.6 1999/11/30 01:42:59 hobbs Exp $
 * RCS: @(#) $Id: tclScan.c,v 1.6.2.4 2002/03/18 20:56:17 hobbs Exp $
 */

#include "tclInt.h"

/*
 * Flag values used by Tcl_ScanObjCmd.
 */
535
536
537
538
539
540
541
542


543
544
545
546
547
548
549
535
536
537
538
539
540
541

542
543
544
545
546
547
548
549
550







-
+
+







    ClientData dummy;    	/* Not used. */
    Tcl_Interp *interp;		/* Current interpreter. */
    int objc;			/* Number of arguments. */
    Tcl_Obj *CONST objv[];	/* Argument objects. */
{
    char *format;
    int numVars, nconversions, totalVars = -1;
    int objIndex, offset, i, value, result, code;
    int objIndex, offset, i, result, code;
    long value;
    char *string, *end, *baseString;
    char op = 0;
    int base = 0;
    int underflow = 0;
    size_t width;
    long (*fn)() = NULL;
    Tcl_UniChar ch, sch;
640
641
642
643
644
645
646
647

648
649
650
651
652
653
654
641
642
643
644
645
646
647

648
649
650
651
652
653
654
655







-
+







	    flags |= SCAN_SUPPRESS;
	    format += Tcl_UtfToUniChar(format, &ch);
	} else if ((ch < 0x80) && isdigit(UCHAR(ch))) { /* INTL: "C" locale. */
	    value = strtoul(format-1, &end, 10); /* INTL: "C" locale. */
	    if (*end == '$') {
		format = end+1;
		format += Tcl_UtfToUniChar(format, &ch);
		objIndex = value - 1;
		objIndex = (int) value - 1;
	    }
	}

	/*
	 * Parse any width specifier.
	 */

690
691
692
693
694
695
696
697

698
699
700
701
702

703
704
705
706
707
708
709
691
692
693
694
695
696
697

698
699
700
701
702

703
704
705
706
707
708
709
710







-
+




-
+







		op = 'i';
		base = 0;
		fn = (long (*)())strtol;
		break;
	    case 'o':
		op = 'i';
		base = 8;
		fn = (long (*)())strtol;
		fn = (long (*)())strtoul;
		break;
	    case 'x':
		op = 'i';
		base = 16;
		fn = (long (*)())strtol;
		fn = (long (*)())strtoul;
		break;
	    case 'u':
		op = 'i';
		base = 10;
		flags |= SCAN_UNSIGNED;
		fn = (long (*)())strtoul;
		break;
850
851
852
853
854
855
856




857
858
859
860
861



862
863
864
865
866
867
868
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







+
+
+
+





+
+
+







		for (end = buf; width > 0; width--) {
		    switch (*string) {
			/*
			 * The 0 digit has special meaning at the beginning of
			 * a number.  If we are unsure of the base, it
			 * indicates that we are in base 8 or base 16 (if it is
			 * followed by an 'x').
			 *
			 * 8.1 - 8.3.4 incorrectly handled 0x... base-16
			 * cases for %x by not reading the 0x as the
			 * auto-prelude for base-16. [Bug #495213]
			 */
			case '0':
			    if (base == 0) {
				base = 8;
				flags |= SCAN_XOK;
			    }
			    if (base == 16) {
				flags |= SCAN_XOK;
			    }
			    if (flags & SCAN_NOZERO) {
				flags &= ~(SCAN_SIGNOK | SCAN_NODIGITS
					| SCAN_NOZERO);
			    } else {
				flags &= ~(SCAN_SIGNOK | SCAN_XOK
					| SCAN_NODIGITS);
950
951
952
953
954
955
956
957

958
959

960
961



962


963
964
965
966
967
968
969
958
959
960
961
962
963
964

965
966

967
968
969
970
971
972

973
974
975
976
977
978
979
980
981







-
+

-
+


+
+
+
-
+
+







		 * Scan the value from the temporary buffer.  If we are
		 * returning a large unsigned value, we have to convert it back
		 * to a string since Tcl only supports signed values.
		 */

		if (!(flags & SCAN_SUPPRESS)) {
		    *end = '\0';
		    value = (int) (*fn)(buf, NULL, base);
		    value = (long) (*fn)(buf, NULL, base);
		    if ((flags & SCAN_UNSIGNED) && (value < 0)) {
			sprintf(buf, "%u", value); /* INTL: ISO digit */
			sprintf(buf, "%lu", value); /* INTL: ISO digit */
			objPtr = Tcl_NewStringObj(buf, -1);
		    } else {
			if ((unsigned long) value > UINT_MAX) {
			    objPtr = Tcl_NewLongObj(value);
			} else {
			objPtr = Tcl_NewIntObj(value);
			    objPtr = Tcl_NewIntObj(value);
			}
		    }
		    Tcl_IncrRefCount(objPtr);
		    objs[objIndex++] = objPtr;
		}

		break;

1108
1109
1110
1111
1112
1113
1114

1115


1116
1117
1118
1119
1120
1121
1122
1120
1121
1122
1123
1124
1125
1126
1127

1128
1129
1130
1131
1132
1133
1134
1135
1136







+
-
+
+







		 * More %-specifiers than matching chars, so we
		 * just spit out empty strings for these
		 */
		Tcl_ListObjAppendElement(NULL, objPtr, Tcl_NewObj());
	    }
	}
    }
    if (objs != NULL) {
    ckfree((char*) objs);
	ckfree((char*) objs);
    }
    if (code == TCL_OK) {
	if (underflow && (nconversions == 0)) {
	    if (numVars) {
		objPtr = Tcl_NewIntObj(-1);
	    } else {
		if (objPtr) {
		    Tcl_SetListObj(objPtr, 0, NULL);
Changes to generic/tclStubInit.c.
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10

11
12
13
14
15
16
17
18










-
+







/* 
 * tclStubInit.c --
 *
 *	This file contains the initializers for the Tcl stub vectors.
 *
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclStubInit.c,v 1.35 2000/04/09 16:04:18 kupries Exp $
 * RCS: @(#) $Id: tclStubInit.c,v 1.35.2.7 2001/10/17 19:29:25 das Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

/*
 * Remove macros that will interfere with the definitions below.
225
226
227
228
229
230
231
232
233


234
235
236
237
238




239
240
241
242
243
244
245
225
226
227
228
229
230
231


232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249







-
-
+
+





+
+
+
+







    TclHandleFree, /* 147 */
    TclHandlePreserve, /* 148 */
    TclHandleRelease, /* 149 */
    TclRegAbout, /* 150 */
    TclRegExpRangeUniChar, /* 151 */
    TclSetLibraryPath, /* 152 */
    TclGetLibraryPath, /* 153 */
    TclTestChannelCmd, /* 154 */
    TclTestChannelEventCmd, /* 155 */
    NULL, /* 154 */
    NULL, /* 155 */
    TclRegError, /* 156 */
    TclVarTraceExists, /* 157 */
    TclSetStartupScriptFileName, /* 158 */
    TclGetStartupScriptFileName, /* 159 */
    TclpMatchFilesTypes, /* 160 */
    TclChannelTransform, /* 161 */
    TclChannelEventScriptInvoker, /* 162 */
    TclGetInstructionTable, /* 163 */
    TclExpandCodeArray, /* 164 */
};

TclIntPlatStubs tclIntPlatStubs = {
    TCL_STUB_MAGIC,
    NULL,
#if !defined(__WIN32__) && !defined(MAC_TCL) /* UNIX */
    TclGetAndDetachPids, /* 0 */
271
272
273
274
275
276
277
278

279
280
281
282
283

284
285
286
287
288
289
290
291
292
293
294
295
296




297
298
299
300
301
302
303
304
305
306
307
308
309
310

311
312
313
314
315
316
317
275
276
277
278
279
280
281

282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297




298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314

315
316
317
318
319
320
321
322







-
+





+









-
-
-
-
+
+
+
+













-
+







    TclpCreatePipe, /* 14 */
    TclpCreateProcess, /* 15 */
    NULL, /* 16 */
    NULL, /* 17 */
    TclpMakeFile, /* 18 */
    TclpOpenFile, /* 19 */
    TclWinAddProcess, /* 20 */
    TclpAsyncMark, /* 21 */
    NULL, /* 21 */
    TclpCreateTempFile, /* 22 */
    TclpGetTZName, /* 23 */
    TclWinNoBackslash, /* 24 */
    TclWinGetPlatform, /* 25 */
    TclWinSetInterfaces, /* 26 */
    TclWinFlushDirtyChannels, /* 27 */
#endif /* __WIN32__ */
#ifdef MAC_TCL
    TclpSysAlloc, /* 0 */
    TclpSysFree, /* 1 */
    TclpSysRealloc, /* 2 */
    TclpExit, /* 3 */
    FSpGetDefaultDir, /* 4 */
    FSpSetDefaultDir, /* 5 */
    FSpFindFolder, /* 6 */
    GetGlobalMouse, /* 7 */
    FSpGetDirectoryID, /* 8 */
    FSpOpenResFileCompat, /* 9 */
    FSpCreateResFileCompat, /* 10 */
    GetGlobalMouseTcl, /* 7 */
    FSpGetDirectoryIDTcl, /* 8 */
    FSpOpenResFileCompatTcl, /* 9 */
    FSpCreateResFileCompatTcl, /* 10 */
    FSpLocationFromPath, /* 11 */
    FSpPathFromLocation, /* 12 */
    TclMacExitHandler, /* 13 */
    TclMacInitExitToShell, /* 14 */
    TclMacInstallExitToShellPatch, /* 15 */
    TclMacOSErrorToPosixError, /* 16 */
    TclMacRemoveTimer, /* 17 */
    TclMacStartTimer, /* 18 */
    TclMacTimerExpired, /* 19 */
    TclMacRegisterResourceFork, /* 20 */
    TclMacUnRegisterResourceFork, /* 21 */
    TclMacCreateEnv, /* 22 */
    TclMacFOpenHack, /* 23 */
    NULL, /* 24 */
    TclpGetTZName, /* 24 */
    TclMacChmod, /* 25 */
#endif /* MAC_TCL */
};

TclPlatStubs tclPlatStubs = {
    TCL_STUB_MAGIC,
    NULL,
677
678
679
680
681
682
683
684

685
686
687
688
689
690
691
682
683
684
685
686
687
688

689
690
691
692
693
694
695
696







-
+







    NULL, /* 278 */
#endif /* MAC_TCL */
    Tcl_GetVersion, /* 279 */
    Tcl_InitMemory, /* 280 */
    Tcl_StackChannel, /* 281 */
    Tcl_UnstackChannel, /* 282 */
    Tcl_GetStackedChannel, /* 283 */
    NULL, /* 284 */
    Tcl_SetMainLoop, /* 284 */
    NULL, /* 285 */
    Tcl_AppendObjToObj, /* 286 */
    Tcl_CreateEncoding, /* 287 */
    Tcl_CreateThreadExitHandler, /* 288 */
    Tcl_DeleteThreadExitHandler, /* 289 */
    Tcl_DiscardResult, /* 290 */
    Tcl_EvalEx, /* 291 */
787
788
789
790
791
792
793


















794
795
796
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+



    Tcl_GetAllocMutex, /* 387 */
    Tcl_GetChannelNames, /* 388 */
    Tcl_GetChannelNamesEx, /* 389 */
    Tcl_ProcObjCmd, /* 390 */
    Tcl_ConditionFinalize, /* 391 */
    Tcl_MutexFinalize, /* 392 */
    Tcl_CreateThread, /* 393 */
    Tcl_ReadRaw, /* 394 */
    Tcl_WriteRaw, /* 395 */
    Tcl_GetTopChannel, /* 396 */
    Tcl_ChannelBuffered, /* 397 */
    Tcl_ChannelName, /* 398 */
    Tcl_ChannelVersion, /* 399 */
    Tcl_ChannelBlockModeProc, /* 400 */
    Tcl_ChannelCloseProc, /* 401 */
    Tcl_ChannelClose2Proc, /* 402 */
    Tcl_ChannelInputProc, /* 403 */
    Tcl_ChannelOutputProc, /* 404 */
    Tcl_ChannelSeekProc, /* 405 */
    Tcl_ChannelSetOptionProc, /* 406 */
    Tcl_ChannelGetOptionProc, /* 407 */
    Tcl_ChannelWatchProc, /* 408 */
    Tcl_ChannelGetHandleProc, /* 409 */
    Tcl_ChannelFlushProc, /* 410 */
    Tcl_ChannelHandlerProc, /* 411 */
};

/* !END!: Do not edit above this line. */
Changes to generic/tclTest.c.
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
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










-
+




-
+







+







/* 
 * tclTest.c --
 *
 *	This file contains C command procedures for a bunch of additional
 *	Tcl commands that are used for testing out Tcl's C interfaces.
 *	These commands are not normally included in Tcl applications;
 *	they're only used for testing.
 *
 * Copyright (c) 1993-1994 The Regents of the University of California.
 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 * Copyright (c) 1998-2000 Ajuba Solutions.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclTest.c,v 1.17 1999/10/13 02:22:18 hobbs Exp $
 * RCS: @(#) $Id: tclTest.c,v 1.17.2.3 2001/09/20 01:13:03 hobbs Exp $
 */

#define TCL_TEST

#include "tclInt.h"
#include "tclPort.h"
#include "tclRegexp.h"
#include "tclIO.h"
#include <locale.h>

/*
 * Declare external functions used in Windows tests.
 */

/*
272
273
274
275
276
277
278




279
280
281
282
283
284
285
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290







+
+
+
+







			    struct stat *buf));
static int		TeststatprocCmd _ANSI_ARGS_((ClientData dummy,
			    Tcl_Interp *interp, int argc, char **argv));
static int		TesttranslatefilenameCmd _ANSI_ARGS_((ClientData dummy,
			    Tcl_Interp *interp, int argc, char **argv));
static int		TestupvarCmd _ANSI_ARGS_((ClientData dummy,
			    Tcl_Interp *interp, int argc, char **argv));
static int		TestChannelCmd _ANSI_ARGS_((ClientData dummy,
			    Tcl_Interp *interp, int argc, char **argv));
static int		TestChannelEventCmd _ANSI_ARGS_((ClientData dummy,
			    Tcl_Interp *interp, int argc, char **argv));

/*
 * External (platform specific) initialization routine, these declarations
 * explicitly don't use EXTERN since this code does not get compiled
 * into the library:
 */

325
326
327
328
329
330
331
332

333
334

335
336
337
338
339
340
341
330
331
332
333
334
335
336

337
338

339
340
341
342
343
344
345
346







-
+

-
+







	    (Tcl_CmdDeleteProc *) NULL);
    Tcl_CreateObjCommand(interp, "noop", NoopObjCmd, (ClientData) 0,
	    (Tcl_CmdDeleteProc *) NULL);
    Tcl_CreateCommand(interp, "testaccessproc", TestaccessprocCmd, (ClientData) 0,
	    (Tcl_CmdDeleteProc *) NULL);
    Tcl_CreateCommand(interp, "testasync", TestasyncCmd, (ClientData) 0,
	    (Tcl_CmdDeleteProc *) NULL);
    Tcl_CreateCommand(interp, "testchannel", TclTestChannelCmd,
    Tcl_CreateCommand(interp, "testchannel", TestChannelCmd,
            (ClientData) 0, (Tcl_CmdDeleteProc *) NULL);
    Tcl_CreateCommand(interp, "testchannelevent", TclTestChannelEventCmd,
    Tcl_CreateCommand(interp, "testchannelevent", TestChannelEventCmd,
            (ClientData) 0, (Tcl_CmdDeleteProc *) NULL);
    Tcl_CreateCommand(interp, "testchmod", TestchmodCmd,
            (ClientData) 0, (Tcl_CmdDeleteProc *) NULL);
    Tcl_CreateCommand(interp, "testcmdtoken", TestcmdtokenCmd, (ClientData) 0,
	    (Tcl_CmdDeleteProc *) NULL);
    Tcl_CreateCommand(interp, "testcmdinfo", TestcmdinfoCmd, (ClientData) 0,
	    (Tcl_CmdDeleteProc *) NULL);
731
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
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







-
+










-
+



-
-
+
+







-
+







TestcmdtokenCmd(dummy, interp, argc, argv)
    ClientData dummy;			/* Not used. */
    Tcl_Interp *interp;			/* Current interpreter. */
    int argc;				/* Number of arguments. */
    char **argv;			/* Argument strings. */
{
    Tcl_Command token;
    long int l;
    int *l;
    char buf[30];

    if (argc != 3) {
	Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
		" option arg\"", (char *) NULL);
	return TCL_ERROR;
    }
    if (strcmp(argv[1], "create") == 0) {
	token = Tcl_CreateCommand(interp, argv[2], CmdProc1,
		(ClientData) "original", (Tcl_CmdDeleteProc *) NULL);
	sprintf(buf, "%lx", (long int) token);
	sprintf(buf, "%p", (VOID *)token);
	Tcl_SetResult(interp, buf, TCL_VOLATILE);
    } else if (strcmp(argv[1], "name") == 0) {
	Tcl_Obj *objPtr;
	
	if (sscanf(argv[2], "%lx", &l) != 1) {

	if (sscanf(argv[2], "%p", &l) != 1) {
	    Tcl_AppendResult(interp, "bad command token \"", argv[2],
		    "\"", (char *) NULL);
	    return TCL_ERROR;
	}

	objPtr = Tcl_NewObj();
	Tcl_GetCommandFullName(interp, (Tcl_Command) l, objPtr);
	

	Tcl_AppendElement(interp,
	        Tcl_GetCommandName(interp, (Tcl_Command) l));
	Tcl_AppendElement(interp, Tcl_GetString(objPtr));
	Tcl_DecrRefCount(objPtr);
    } else {
	Tcl_AppendResult(interp, "bad option \"", argv[1],
		"\": must be create or name", (char *) NULL);
4238
4239
4240
4241
4242
4243
4244
































































































































































































































































































































































































































































































































































































4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
    if (!strcmp("testOpenFileChannel3%.fil", fileName)) {
	return (TclpOpenFileChannel(interp, "__testOpenFileChannel3%__.fil",
		modeString, permissions));
    } else {
	return (NULL);
    }
}

/*
 *----------------------------------------------------------------------
 *
 * TestChannelCmd --
 *
 *	Implements the Tcl "testchannel" debugging command and its
 *	subcommands. This is part of the testing environment.
 *
 * Results:
 *	A standard Tcl result.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

	/* ARGSUSED */
int
TestChannelCmd(clientData, interp, argc, argv)
    ClientData clientData;	/* Not used. */
    Tcl_Interp *interp;		/* Interpreter for result. */
    int argc;			/* Count of additional args. */
    char **argv;		/* Additional arg strings. */
{
    char *cmdName;		/* Sub command. */
    Tcl_HashTable *hTblPtr;	/* Hash table of channels. */
    Tcl_HashSearch hSearch;	/* Search variable. */
    Tcl_HashEntry *hPtr;	/* Search variable. */
    Channel *chanPtr;		/* The actual channel. */
    ChannelState *statePtr;	/* state info for channel */
    Tcl_Channel chan;		/* The opaque type. */
    size_t len;			/* Length of subcommand string. */
    int IOQueued;		/* How much IO is queued inside channel? */
    ChannelBuffer *bufPtr;	/* For iterating over queued IO. */
    char buf[TCL_INTEGER_SPACE];/* For sprintf. */
    int mode;			/* rw mode of the channel */
    
    if (argc < 2) {
        Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                " subcommand ?additional args..?\"", (char *) NULL);
        return TCL_ERROR;
    }
    cmdName = argv[1];
    len = strlen(cmdName);

    chanPtr = (Channel *) NULL;

    if (argc > 2) {
        chan = Tcl_GetChannel(interp, argv[2], &mode);
        if (chan == (Tcl_Channel) NULL) {
            return TCL_ERROR;
        }
        chanPtr		= (Channel *) chan;
	statePtr	= chanPtr->state;
        chanPtr		= statePtr->topChanPtr;
	chan		= (Tcl_Channel) chanPtr;
    } else {
	/* lint */
	statePtr	= NULL;
	chan		= NULL;
    }

    if ((cmdName[0] == 'i') && (strncmp(cmdName, "info", len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    " info channelName\"", (char *) NULL);
            return TCL_ERROR;
        }
        Tcl_AppendElement(interp, argv[2]);
        Tcl_AppendElement(interp, chanPtr->typePtr->typeName);
        if (statePtr->flags & TCL_READABLE) {
            Tcl_AppendElement(interp, "read");
        } else {
            Tcl_AppendElement(interp, "");
        }
        if (statePtr->flags & TCL_WRITABLE) {
            Tcl_AppendElement(interp, "write");
        } else {
            Tcl_AppendElement(interp, "");
        }
        if (statePtr->flags & CHANNEL_NONBLOCKING) {
            Tcl_AppendElement(interp, "nonblocking");
        } else {
            Tcl_AppendElement(interp, "blocking");
        }
        if (statePtr->flags & CHANNEL_LINEBUFFERED) {
            Tcl_AppendElement(interp, "line");
        } else if (statePtr->flags & CHANNEL_UNBUFFERED) {
            Tcl_AppendElement(interp, "none");
        } else {
            Tcl_AppendElement(interp, "full");
        }
        if (statePtr->flags & BG_FLUSH_SCHEDULED) {
            Tcl_AppendElement(interp, "async_flush");
        } else {
            Tcl_AppendElement(interp, "");
        }
        if (statePtr->flags & CHANNEL_EOF) {
            Tcl_AppendElement(interp, "eof");
        } else {
            Tcl_AppendElement(interp, "");
        }
        if (statePtr->flags & CHANNEL_BLOCKED) {
            Tcl_AppendElement(interp, "blocked");
        } else {
            Tcl_AppendElement(interp, "unblocked");
        }
        if (statePtr->inputTranslation == TCL_TRANSLATE_AUTO) {
            Tcl_AppendElement(interp, "auto");
            if (statePtr->flags & INPUT_SAW_CR) {
                Tcl_AppendElement(interp, "saw_cr");
            } else {
                Tcl_AppendElement(interp, "");
            }
        } else if (statePtr->inputTranslation == TCL_TRANSLATE_LF) {
            Tcl_AppendElement(interp, "lf");
            Tcl_AppendElement(interp, "");
        } else if (statePtr->inputTranslation == TCL_TRANSLATE_CR) {
            Tcl_AppendElement(interp, "cr");
            Tcl_AppendElement(interp, "");
        } else if (statePtr->inputTranslation == TCL_TRANSLATE_CRLF) {
            Tcl_AppendElement(interp, "crlf");
            if (statePtr->flags & INPUT_SAW_CR) {
                Tcl_AppendElement(interp, "queued_cr");
            } else {
                Tcl_AppendElement(interp, "");
            }
        }
        if (statePtr->outputTranslation == TCL_TRANSLATE_AUTO) {
            Tcl_AppendElement(interp, "auto");
        } else if (statePtr->outputTranslation == TCL_TRANSLATE_LF) {
            Tcl_AppendElement(interp, "lf");
        } else if (statePtr->outputTranslation == TCL_TRANSLATE_CR) {
            Tcl_AppendElement(interp, "cr");
        } else if (statePtr->outputTranslation == TCL_TRANSLATE_CRLF) {
            Tcl_AppendElement(interp, "crlf");
        }
        for (IOQueued = 0, bufPtr = statePtr->inQueueHead;
	     bufPtr != (ChannelBuffer *) NULL;
	     bufPtr = bufPtr->nextPtr) {
            IOQueued += bufPtr->nextAdded - bufPtr->nextRemoved;
        }
        TclFormatInt(buf, IOQueued);
        Tcl_AppendElement(interp, buf);
        
        IOQueued = 0;
        if (statePtr->curOutPtr != (ChannelBuffer *) NULL) {
            IOQueued = statePtr->curOutPtr->nextAdded -
                statePtr->curOutPtr->nextRemoved;
        }
        for (bufPtr = statePtr->outQueueHead;
	     bufPtr != (ChannelBuffer *) NULL;
	     bufPtr = bufPtr->nextPtr) {
            IOQueued += (bufPtr->nextAdded - bufPtr->nextRemoved);
        }
        TclFormatInt(buf, IOQueued);
        Tcl_AppendElement(interp, buf);
        
        TclFormatInt(buf, Tcl_Tell((Tcl_Channel) chanPtr));
        Tcl_AppendElement(interp, buf);

        TclFormatInt(buf, statePtr->refCount);
        Tcl_AppendElement(interp, buf);

        return TCL_OK;
    }

    if ((cmdName[0] == 'i') &&
            (strncmp(cmdName, "inputbuffered", len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "channel name required",
                    (char *) NULL);
            return TCL_ERROR;
        }
        
        for (IOQueued = 0, bufPtr = statePtr->inQueueHead;
	     bufPtr != (ChannelBuffer *) NULL;
	     bufPtr = bufPtr->nextPtr) {
            IOQueued += bufPtr->nextAdded - bufPtr->nextRemoved;
        }
        TclFormatInt(buf, IOQueued);
        Tcl_AppendResult(interp, buf, (char *) NULL);
        return TCL_OK;
    }

    if ((cmdName[0] == 'm') && (strncmp(cmdName, "mode", len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "channel name required",
                    (char *) NULL);
            return TCL_ERROR;
        }
        
        if (statePtr->flags & TCL_READABLE) {
            Tcl_AppendElement(interp, "read");
        } else {
            Tcl_AppendElement(interp, "");
        }
        if (statePtr->flags & TCL_WRITABLE) {
            Tcl_AppendElement(interp, "write");
        } else {
            Tcl_AppendElement(interp, "");
        }
        return TCL_OK;
    }
    
    if ((cmdName[0] == 'n') && (strncmp(cmdName, "name", len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "channel name required",
                    (char *) NULL);
            return TCL_ERROR;
        }
        Tcl_AppendResult(interp, statePtr->channelName, (char *) NULL);
        return TCL_OK;
    }

    if ((cmdName[0] == 'o') && (strncmp(cmdName, "open", len) == 0)) {
        hTblPtr = (Tcl_HashTable *) Tcl_GetAssocData(interp, "tclIO", NULL);
        if (hTblPtr == (Tcl_HashTable *) NULL) {
            return TCL_OK;
        }
        for (hPtr = Tcl_FirstHashEntry(hTblPtr, &hSearch);
	     hPtr != (Tcl_HashEntry *) NULL;
	     hPtr = Tcl_NextHashEntry(&hSearch)) {
            Tcl_AppendElement(interp, Tcl_GetHashKey(hTblPtr, hPtr));
        }
        return TCL_OK;
    }

    if ((cmdName[0] == 'o') &&
            (strncmp(cmdName, "outputbuffered", len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "channel name required",
                    (char *) NULL);
            return TCL_ERROR;
        }

        IOQueued = 0;
        if (statePtr->curOutPtr != (ChannelBuffer *) NULL) {
            IOQueued = statePtr->curOutPtr->nextAdded -
                statePtr->curOutPtr->nextRemoved;
        }
        for (bufPtr = statePtr->outQueueHead;
	     bufPtr != (ChannelBuffer *) NULL;
	     bufPtr = bufPtr->nextPtr) {
            IOQueued += (bufPtr->nextAdded - bufPtr->nextRemoved);
        }
        TclFormatInt(buf, IOQueued);
        Tcl_AppendResult(interp, buf, (char *) NULL);
        return TCL_OK;
    }

    if ((cmdName[0] == 'q') &&
            (strncmp(cmdName, "queuedcr", len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "channel name required",
                    (char *) NULL);
            return TCL_ERROR;
        }

        Tcl_AppendResult(interp,
                (statePtr->flags & INPUT_SAW_CR) ? "1" : "0",
                (char *) NULL);
        return TCL_OK;
    }

    if ((cmdName[0] == 'r') && (strncmp(cmdName, "readable", len) == 0)) {
        hTblPtr = (Tcl_HashTable *) Tcl_GetAssocData(interp, "tclIO", NULL);
        if (hTblPtr == (Tcl_HashTable *) NULL) {
            return TCL_OK;
        }
        for (hPtr = Tcl_FirstHashEntry(hTblPtr, &hSearch);
	     hPtr != (Tcl_HashEntry *) NULL;
	     hPtr = Tcl_NextHashEntry(&hSearch)) {
            chanPtr  = (Channel *) Tcl_GetHashValue(hPtr);
	    statePtr = chanPtr->state;
            if (statePtr->flags & TCL_READABLE) {
                Tcl_AppendElement(interp, Tcl_GetHashKey(hTblPtr, hPtr));
            }
        }
        return TCL_OK;
    }

    if ((cmdName[0] == 'r') && (strncmp(cmdName, "refcount", len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "channel name required",
                    (char *) NULL);
            return TCL_ERROR;
        }
        
        TclFormatInt(buf, statePtr->refCount);
        Tcl_AppendResult(interp, buf, (char *) NULL);
        return TCL_OK;
    }

    if ((cmdName[0] == 't') && (strncmp(cmdName, "type", len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "channel name required",
                    (char *) NULL);
            return TCL_ERROR;
        }
        Tcl_AppendResult(interp, chanPtr->typePtr->typeName,
		(char *) NULL);
        return TCL_OK;
    }

    if ((cmdName[0] == 'w') && (strncmp(cmdName, "writable", len) == 0)) {
        hTblPtr = (Tcl_HashTable *) Tcl_GetAssocData(interp, "tclIO", NULL);
        if (hTblPtr == (Tcl_HashTable *) NULL) {
            return TCL_OK;
        }
        for (hPtr = Tcl_FirstHashEntry(hTblPtr, &hSearch);
	     hPtr != (Tcl_HashEntry *) NULL;
	     hPtr = Tcl_NextHashEntry(&hSearch)) {
            chanPtr = (Channel *) Tcl_GetHashValue(hPtr);
	    statePtr = chanPtr->state;
            if (statePtr->flags & TCL_WRITABLE) {
                Tcl_AppendElement(interp, Tcl_GetHashKey(hTblPtr, hPtr));
            }
        }
        return TCL_OK;
    }

    if ((cmdName[0] == 't') && (strncmp(cmdName, "transform", len) == 0)) {
	/*
	 * Syntax: transform channel -command command
	 */

        if (argc != 5) {
	    Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
		    " transform channelId -command cmd\"", (char *) NULL);
            return TCL_ERROR;
        }
	if (strcmp(argv[3], "-command") != 0) {
	    Tcl_AppendResult(interp, "bad argument \"", argv[3],
		    "\": should be \"-command\"", (char *) NULL);
	    return TCL_ERROR;
	}

	return TclChannelTransform(interp, chan,
		Tcl_NewStringObj(argv[4], -1));
    }

    if ((cmdName[0] == 'u') && (strncmp(cmdName, "unstack", len) == 0)) {
	/*
	 * Syntax: unstack channel
	 */

        if (argc != 3) {
	    Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
		    " unstack channel\"", (char *) NULL);
            return TCL_ERROR;
        }
	return Tcl_UnstackChannel(interp, chan);
    }

    Tcl_AppendResult(interp, "bad option \"", cmdName, "\": should be ",
            "info, open, readable, writable, transform, unstack",
            (char *) NULL);
    return TCL_ERROR;
}

/*
 *----------------------------------------------------------------------
 *
 * TestChannelEventCmd --
 *
 *	This procedure implements the "testchannelevent" command. It is
 *	used to test the Tcl channel event mechanism.
 *
 * Results:
 *	A standard Tcl result.
 *
 * Side effects:
 *	Creates, deletes and returns channel event handlers.
 *
 *----------------------------------------------------------------------
 */

	/* ARGSUSED */
int
TestChannelEventCmd(dummy, interp, argc, argv)
    ClientData dummy;			/* Not used. */
    Tcl_Interp *interp;			/* Current interpreter. */
    int argc;				/* Number of arguments. */
    char **argv;			/* Argument strings. */
{
    Tcl_Obj *resultListPtr;
    Channel *chanPtr;
    ChannelState *statePtr;	/* state info for channel */
    EventScriptRecord *esPtr, *prevEsPtr, *nextEsPtr;
    char *cmd;
    int index, i, mask, len;

    if ((argc < 3) || (argc > 5)) {
        Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                " channelName cmd ?arg1? ?arg2?\"", (char *) NULL);
        return TCL_ERROR;
    }
    chanPtr = (Channel *) Tcl_GetChannel(interp, argv[1], NULL);
    if (chanPtr == (Channel *) NULL) {
        return TCL_ERROR;
    }
    statePtr = chanPtr->state;

    cmd = argv[2];
    len = strlen(cmd);
    if ((cmd[0] == 'a') && (strncmp(cmd, "add", (unsigned) len) == 0)) {
        if (argc != 5) {
            Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    " channelName add eventSpec script\"", (char *) NULL);
            return TCL_ERROR;
        }
        if (strcmp(argv[3], "readable") == 0) {
            mask = TCL_READABLE;
        } else if (strcmp(argv[3], "writable") == 0) {
            mask = TCL_WRITABLE;
        } else if (strcmp(argv[3], "none") == 0) {
            mask = 0;
	} else {
            Tcl_AppendResult(interp, "bad event name \"", argv[3],
                    "\": must be readable, writable, or none", (char *) NULL);
            return TCL_ERROR;
        }

        esPtr = (EventScriptRecord *) ckalloc((unsigned)
                sizeof(EventScriptRecord));
        esPtr->nextPtr = statePtr->scriptRecordPtr;
        statePtr->scriptRecordPtr = esPtr;
        
        esPtr->chanPtr = chanPtr;
        esPtr->interp = interp;
        esPtr->mask = mask;
	esPtr->scriptPtr = Tcl_NewStringObj(argv[4], -1);
	Tcl_IncrRefCount(esPtr->scriptPtr);

        Tcl_CreateChannelHandler((Tcl_Channel) chanPtr, mask,
                TclChannelEventScriptInvoker, (ClientData) esPtr);
        
        return TCL_OK;
    }

    if ((cmd[0] == 'd') && (strncmp(cmd, "delete", (unsigned) len) == 0)) {
        if (argc != 4) {
            Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    " channelName delete index\"", (char *) NULL);
            return TCL_ERROR;
        }
        if (Tcl_GetInt(interp, argv[3], &index) == TCL_ERROR) {
            return TCL_ERROR;
        }
        if (index < 0) {
            Tcl_AppendResult(interp, "bad event index: ", argv[3],
                    ": must be nonnegative", (char *) NULL);
            return TCL_ERROR;
        }
        for (i = 0, esPtr = statePtr->scriptRecordPtr;
	     (i < index) && (esPtr != (EventScriptRecord *) NULL);
	     i++, esPtr = esPtr->nextPtr) {
	    /* Empty loop body. */
        }
        if (esPtr == (EventScriptRecord *) NULL) {
            Tcl_AppendResult(interp, "bad event index ", argv[3],
                    ": out of range", (char *) NULL);
            return TCL_ERROR;
        }
        if (esPtr == statePtr->scriptRecordPtr) {
            statePtr->scriptRecordPtr = esPtr->nextPtr;
        } else {
            for (prevEsPtr = statePtr->scriptRecordPtr;
		 (prevEsPtr != (EventScriptRecord *) NULL) &&
		     (prevEsPtr->nextPtr != esPtr);
		 prevEsPtr = prevEsPtr->nextPtr) {
                /* Empty loop body. */
            }
            if (prevEsPtr == (EventScriptRecord *) NULL) {
                panic("TestChannelEventCmd: damaged event script list");
            }
            prevEsPtr->nextPtr = esPtr->nextPtr;
        }
        Tcl_DeleteChannelHandler((Tcl_Channel) chanPtr,
                TclChannelEventScriptInvoker, (ClientData) esPtr);
	Tcl_DecrRefCount(esPtr->scriptPtr);
        ckfree((char *) esPtr);

        return TCL_OK;
    }

    if ((cmd[0] == 'l') && (strncmp(cmd, "list", (unsigned) len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    " channelName list\"", (char *) NULL);
            return TCL_ERROR;
        }
	resultListPtr = Tcl_GetObjResult(interp);
        for (esPtr = statePtr->scriptRecordPtr;
	     esPtr != (EventScriptRecord *) NULL;
	     esPtr = esPtr->nextPtr) {
	    if (esPtr->mask) {
 	        Tcl_ListObjAppendElement(interp, resultListPtr, Tcl_NewStringObj(
		    (esPtr->mask == TCL_READABLE) ? "readable" : "writable", -1));
 	    } else {
 	        Tcl_ListObjAppendElement(interp, resultListPtr, 
			Tcl_NewStringObj("none", -1));
	    }
  	    Tcl_ListObjAppendElement(interp, resultListPtr, esPtr->scriptPtr);
        }
	Tcl_SetObjResult(interp, resultListPtr);
        return TCL_OK;
    }

    if ((cmd[0] == 'r') && (strncmp(cmd, "removeall", (unsigned) len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    " channelName removeall\"", (char *) NULL);
            return TCL_ERROR;
        }
        for (esPtr = statePtr->scriptRecordPtr;
	     esPtr != (EventScriptRecord *) NULL;
	     esPtr = nextEsPtr) {
            nextEsPtr = esPtr->nextPtr;
            Tcl_DeleteChannelHandler((Tcl_Channel) chanPtr,
                    TclChannelEventScriptInvoker, (ClientData) esPtr);
	    Tcl_DecrRefCount(esPtr->scriptPtr);
            ckfree((char *) esPtr);
        }
        statePtr->scriptRecordPtr = (EventScriptRecord *) NULL;
        return TCL_OK;
    }

    if  ((cmd[0] == 's') && (strncmp(cmd, "set", (unsigned) len) == 0)) {
        if (argc != 5) {
            Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    " channelName delete index event\"", (char *) NULL);
            return TCL_ERROR;
        }
        if (Tcl_GetInt(interp, argv[3], &index) == TCL_ERROR) {
            return TCL_ERROR;
        }
        if (index < 0) {
            Tcl_AppendResult(interp, "bad event index: ", argv[3],
                    ": must be nonnegative", (char *) NULL);
            return TCL_ERROR;
        }
        for (i = 0, esPtr = statePtr->scriptRecordPtr;
	     (i < index) && (esPtr != (EventScriptRecord *) NULL);
	     i++, esPtr = esPtr->nextPtr) {
	    /* Empty loop body. */
        }
        if (esPtr == (EventScriptRecord *) NULL) {
            Tcl_AppendResult(interp, "bad event index ", argv[3],
                    ": out of range", (char *) NULL);
            return TCL_ERROR;
        }

        if (strcmp(argv[4], "readable") == 0) {
            mask = TCL_READABLE;
        } else if (strcmp(argv[4], "writable") == 0) {
            mask = TCL_WRITABLE;
        } else if (strcmp(argv[4], "none") == 0) {
            mask = 0;
	} else {
            Tcl_AppendResult(interp, "bad event name \"", argv[4],
                    "\": must be readable, writable, or none", (char *) NULL);
            return TCL_ERROR;
        }
	esPtr->mask = mask;
        Tcl_CreateChannelHandler((Tcl_Channel) chanPtr, mask,
                TclChannelEventScriptInvoker, (ClientData) esPtr);
	return TCL_OK;
    }    
    Tcl_AppendResult(interp, "bad command ", cmd, ", must be one of ",
            "add, delete, list, set, or removeall", (char *) NULL);
    return TCL_ERROR;
}
Changes to generic/tclTestObj.c.
8
9
10
11
12
13
14
15

16
17
18
19
20
21
22
8
9
10
11
12
13
14

15
16
17
18
19
20
21
22







-
+







 *
 * Copyright (c) 1995-1998 Sun Microsystems, Inc.
 * Copyright (c) 1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclTestObj.c,v 1.6 1999/06/15 22:06:17 hershey Exp $
 * RCS: @(#) $Id: tclTestObj.c,v 1.6.10.1 2001/04/03 22:54:38 hobbs Exp $
 */

#include "tclInt.h"

/*
 * An array of Tcl_Obj pointers used in the commands that operate on or get
 * the values of Tcl object-valued variables. varPtr[i] is the i-th
416
417
418
419
420
421
422
423


424
425
426
427
428
429
430
416
417
418
419
420
421
422

423
424
425
426
427
428
429
430
431







-
+
+







	 */

	Tcl_GetIndexFromObj((Tcl_Interp *) NULL, objv[1], tablePtr,
		"token", 0, &index);
	if (Tcl_GetIntFromObj(interp, objv[2], &index2) != TCL_OK) {
	    return TCL_ERROR;
	}
	objv[1]->internalRep.twoPtrValue.ptr2 = (VOID *) index2;
	objv[1]->internalRep.twoPtrValue.ptr2 =
		(VOID *) (index2 * sizeof(char *));
	result = Tcl_GetIndexFromObj((Tcl_Interp *) NULL, objv[1],
		tablePtr, "token", 0, &index);
	if (result == TCL_OK) {
	    Tcl_SetIntObj(Tcl_GetObjResult(interp), index);
	}
	return result;
    }
Changes to generic/tclThreadTest.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







/* 
 * tclThreadTest.c --
 *
 *	This file implements the testthread command.  Eventually this
 *	should be tclThreadCmd.c
 *	Some of this code is based on work done by Richard Hipp on behalf of
 *	Conservation Through Innovation, Limited, with their permission.
 *
 * Copyright (c) 1998 by Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclThreadTest.c,v 1.9 2000/04/17 20:32:22 welch Exp $
 * RCS: @(#) $Id: tclThreadTest.c,v 1.9.2.1 2001/04/04 21:22:18 hobbs Exp $
 */

#include "tclInt.h"

#ifdef TCL_THREADS
/*
 * Each thread has an single instance of the following structure.  There
122
123
124
125
126
127
128
129

130
131
132
133
134
135
136
122
123
124
125
126
127
128

129
130
131
132
133
134
135
136







-
+







EXTERN int	TclThreadList _ANSI_ARGS_((Tcl_Interp *interp));
EXTERN int	TclThreadSend _ANSI_ARGS_((Tcl_Interp *interp, Tcl_ThreadId id,
	char *script, int wait));

#undef TCL_STORAGE_CLASS
#define TCL_STORAGE_CLASS DLLIMPORT

Tcl_ThreadCreateType	NewThread _ANSI_ARGS_((ClientData clientData));
Tcl_ThreadCreateType	NewTestThread _ANSI_ARGS_((ClientData clientData));
static void	ListRemove _ANSI_ARGS_((ThreadSpecificData *tsdPtr));
static void	ListUpdateInner _ANSI_ARGS_((ThreadSpecificData *tsdPtr));
static int	ThreadEventProc _ANSI_ARGS_((Tcl_Event *evPtr, int mask));
static void	ThreadErrorProc _ANSI_ARGS_((Tcl_Interp *interp));
static void	ThreadFreeProc _ANSI_ARGS_((ClientData clientData));
static int	ThreadDeleteEvent _ANSI_ARGS_((Tcl_Event *eventPtr,
	ClientData clientData));
351
352
353
354
355
356
357
358

359
360
361
362
363
364
365
351
352
353
354
355
356
357

358
359
360
361
362
363
364
365







-
+







    Tcl_ThreadId id;

    ctrl.script = (char *) script;
    ctrl.condWait = NULL;
    ctrl.flags = 0;

    Tcl_MutexLock(&threadMutex);
    if (Tcl_CreateThread(&id, NewThread, (ClientData) &ctrl,
    if (Tcl_CreateThread(&id, NewTestThread, (ClientData) &ctrl,
		 TCL_THREAD_STACK_DEFAULT, TCL_THREAD_NOFLAGS) != TCL_OK) {
	Tcl_MutexUnlock(&threadMutex);
        Tcl_AppendResult(interp,"can't create a new thread",0);
	ckfree((void*)ctrl.script);
	return TCL_ERROR;
    }

373
374
375
376
377
378
379
380

381
382
383
384
385
386
387
373
374
375
376
377
378
379

380
381
382
383
384
385
386
387







-
+







    Tcl_SetObjResult(interp, Tcl_NewLongObj((long)id));
    return TCL_OK;
}

/*
 *------------------------------------------------------------------------
 *
 * NewThread --
 * NewTestThread --
 *
 *    This routine is the "main()" for a new thread whose task is to
 *    execute a single TCL script.  The argument to this function is
 *    a pointer to a structure that contains the text of the TCL script
 *    to be executed.
 *
 *    Space to hold the script field of the ThreadControl structure passed 
399
400
401
402
403
404
405
406

407
408
409
410
411
412
413
399
400
401
402
403
404
405

406
407
408
409
410
411
412
413







-
+







 *
 * Side effects:
 *    A TCL script is executed in a new thread.
 *
 *------------------------------------------------------------------------
 */
Tcl_ThreadCreateType
NewThread(clientData)
NewTestThread(clientData)
    ClientData clientData;
{
    ThreadCtrl *ctrlPtr = (ThreadCtrl*)clientData;
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
    int result;
    char *threadEvalScript;

Changes to generic/tclUtf.c.
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10

11
12
13
14
15
16
17
18










-
+







/*
 * tclUtf.c --
 *
 *	Routines for manipulating UTF-8 strings.
 *
 * Copyright (c) 1997-1998 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclUtf.c,v 1.11 2000/01/11 22:09:00 hobbs Exp $
 * RCS: @(#) $Id: tclUtf.c,v 1.11.2.2 2001/09/13 19:33:19 hobbs Exp $
 */

#include "tclInt.h"

/*
 * Include the static character classification tables and macros.
 */
107
108
109
110
111
112
113
114

115
116
117
118
119
120
121
107
108
109
110
111
112
113

114
115
116
117
118
119
120
121







-
+







 *
 * Side effects:
 *	None.
 *
 *---------------------------------------------------------------------------
 */
 
static int
INLINE static int
UtfCount(ch)
    int ch;			/* The Tcl_UniChar whose size is returned. */
{
    if ((ch > 0) && (ch < UNICODE_SELF)) {
	return 1;
    }
    if (ch <= 0x7FF) {
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
668
669
670
671
672
673
674



675
676
677
678
679
680
681







-
-
-







	    break;
	}
	byte = *((unsigned char *) look);
	if (byte < 0x80) {
	    break;
	} 
	if (byte >= 0xC0) {
	    if (totalBytes[byte] != i + 1) {
		break;
	    }
	    return (char *) look;
	}
	look--;
    }
    return (char *) str;
}
	
777
778
779
780
781
782
783

784

785
786
787
788
789
790
791
774
775
776
777
778
779
780
781

782
783
784
785
786
787
788
789







+
-
+







				 * a backslash sequence. */
    int *readPtr;		/* Fill in with number of characters read
				 * from src, unless NULL. */
    char *dst;			/* Filled with the bytes represented by the
				 * backslash sequence. */
{
    register CONST char *p = src+1;
    Tcl_UniChar result;
    int result, count, n;
    int count, n;
    char buf[TCL_UTF_MAX];

    if (dst == NULL) {
	dst = buf;
    }

    count = 2;
879
880
881
882
883
884
885

886
887









888
889
890
891
892
893
894

895
896
897
898
899
900
901
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







+


+
+
+
+
+
+
+
+
+






-
+







		if (!isdigit(UCHAR(*p)) || (UCHAR(*p) >= '8')) { /* INTL: digit */
		    break;
		}
		count = 4;
		result = (unsigned char)((result << 3) + (*p - '0'));
		break;
	    }
	    if (UCHAR(*p) < UNICODE_SELF) {
	    result = *p;
	    count = 2;
	    } else {
		/*
		 * We have to convert here because the user has put a
		 * backslash in front of a multi-byte utf-8 character.
		 * While this means nothing special, we shouldn't break up
		 * a correct utf-8 character. [Bug #217987] test subst-3.2
		 */
		count = Tcl_UtfToUniChar(p, &result) + 1; /* +1 for '\' */
	    }
	    break;
    }

    if (readPtr != NULL) {
	*readPtr = count;
    }
    return Tcl_UniCharToUtf(result, dst);
    return Tcl_UniCharToUtf((int) result, dst);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_UtfToUpper --
 *
Changes to generic/tclUtil.c.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







/* 
 * tclUtil.c --
 *
 *	This file contains utility procedures that are used by many Tcl
 *	commands.
 *
 * Copyright (c) 1987-1993 The Regents of the University of California.
 * Copyright (c) 1994-1998 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 *  RCS: @(#) $Id: tclUtil.c,v 1.17 1999/12/12 02:26:43 hobbs Exp $
 *  RCS: @(#) $Id: tclUtil.c,v 1.17.2.1 2001/07/16 23:14:13 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

/*
 * The following variable holds the full path name of the binary
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
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







-
+











-
+







    if (objc == 0) {
	*concatStr = '\0';
    } else {
	p = concatStr;
        for (i = 0;  i < objc;  i++) {
	    objPtr = objv[i];
	    element = Tcl_GetStringFromObj(objPtr, &elemLength);
	    while ((elemLength > 0)
	    while ((elemLength > 0) && (UCHAR(*element) < 127)
		    && (isspace(UCHAR(*element)))) { /* INTL: ISO space. */
	         element++;
		 elemLength--;
	    }

	    /*
	     * Trim trailing white space.  But, be careful not to trim
	     * a space character if it is preceded by a backslash: in
	     * this case it could be significant.
	     */

	    while ((elemLength > 0)
	    while ((elemLength > 0) && (UCHAR(element[elemLength-1]) < 127)
		    && isspace(UCHAR(element[elemLength-1])) /* INTL: ISO space. */
		    && ((elemLength < 2) || (element[elemLength-2] != '\\'))) {
		elemLength--;
	    }
	    if (elemLength == 0) {
	         continue;	/* nothing left of this element */
	    }
Changes to generic/tclVar.c.
10
11
12
13
14
15
16
17

18
19
20
21
22
23
24
10
11
12
13
14
15
16

17
18
19
20
21
22
23
24







-
+







 * Copyright (c) 1987-1994 The Regents of the University of California.
 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclVar.c,v 1.16 2000/01/21 03:29:14 ericm Exp $
 * RCS: @(#) $Id: tclVar.c,v 1.16.2.2 2001/11/09 23:09:09 dgp Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

/*
 * The strings below are used to indicate what went wrong when a
2866
2867
2868
2869
2870
2871
2872
2873

2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2866
2867
2868
2869
2870
2871
2872

2873
2874
2875
2876

2877
2878
2879
2880
2881
2882
2883







-
+



-







	"anymore", "donesearch", "exists", "get", "names", "nextelement",
	"set", "size", "startsearch", "unset", (char *) NULL
    };

    Interp *iPtr = (Interp *) interp;
    Var *varPtr, *arrayPtr;
    Tcl_HashEntry *hPtr;
    Tcl_Obj *resultPtr = Tcl_GetObjResult(interp);
    Tcl_Obj *resultPtr;
    int notArray;
    char *varName, *msg;
    int index, result;


    if (objc < 3) {
	Tcl_WrongNumArgs(interp, 1, objv, "option arrayName ?arg ...?");
	return TCL_ERROR;
    }

    if (Tcl_GetIndexFromObj(interp, objv[1], arrayOptions, "option",
2911
2912
2913
2914
2915
2916
2917







2918
2919
2920
2921
2922
2923
2924
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930







+
+
+
+
+
+
+







		TCL_TRACE_ARRAY));
	if (msg != NULL) {
	    VarErrMsg(interp, varName, NULL, "trace array", msg);
	    return TCL_ERROR;
	}
    }

    /*
     * We have to wait to get the resultPtr until here because
     * CallTraces can affect the result.
     */

    resultPtr = Tcl_GetObjResult(interp);

    switch (index) {
        case ARRAY_ANYMORE: {
	    ArraySearch *searchPtr;
	    char *searchId;
	    
	    if (objc != 4) {
	        Tcl_WrongNumArgs(interp, 2, objv, 
3775
3776
3777
3778
3779
3780
3781
3782

3783
3784
3785
3786
3787
3788
3789
3781
3782
3783
3784
3785
3786
3787

3788
3789
3790
3791
3792
3793
3794
3795







-
+








	for (tail = varName;  *tail != '\0';  tail++) {
	    /* empty body */
	}
        while ((tail > varName) && ((*tail != ':') || (*(tail-1) != ':'))) {
            tail--;
	}
        if (*tail == ':') {
        if ((*tail == ':') && (tail > varName)) {
            tail++;
	}

	/*
	 * Link to the variable "varName" in the global :: namespace.
	 */
	
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786


4787
4788
4789
4790
4791
4792
4793




4794

4795
4796
4797
4798
4799





4800
4801
4802


4803
4804
4805
4806



4807
4808
4771
4772
4773
4774
4775
4776
4777

4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789


4790
4791
4792
4793
4794




4795
4796
4797
4798
4799
4800





4801
4802
4803
4804
4805
4806


4807
4808




4809
4810
4811
4812
4813







-












-
-
+
+



-
-
-
-
+
+
+
+

+
-
-
-
-
-
+
+
+
+
+

-
-
+
+
-
-
-
-
+
+
+


Var *
TclVarTraceExists(interp, varName)
    Tcl_Interp *interp;		/* The interpreter */
    char *varName;		/* The variable name */
{
    Var *varPtr;
    Var *arrayPtr;
    char *msg;

    /*
     * The choice of "create" flag values is delicate here, and
     * matches the semantics of GetVar.  Things are still not perfect,
     * however, because if you do "info exists x" you get a varPtr
     * and therefore trigger traces.  However, if you do 
     * "info exists x(i)", then you only get a varPtr if x is already
     * known to be an array.  Otherwise you get NULL, and no trace
     * is triggered.  This matches Tcl 7.6 semantics.
     */

    varPtr = TclLookupVar(interp, varName, (char *) NULL,
            0, "access",
            /*createPart1*/ 0, /*createPart2*/ 1, &arrayPtr);
            0, "access", /*createPart1*/ 0, /*createPart2*/ 1, &arrayPtr);

    if (varPtr == NULL) {
	return NULL;
    }
    if ((varPtr != NULL) &&
	    ((varPtr->tracePtr != NULL)
	    || ((arrayPtr != NULL) && (arrayPtr->tracePtr != NULL)))) {
	msg = CallTraces((Interp *)interp, arrayPtr, varPtr, varName,

    if ((varPtr->tracePtr != NULL)
	    || ((arrayPtr != NULL) && (arrayPtr->tracePtr != NULL))) {
	CallTraces((Interp *)interp, arrayPtr, varPtr, varName,
		(char *) NULL, TCL_TRACE_READS);
    }
	if (msg != NULL) {
	    /*
	     * If the variable doesn't exist anymore and no-one's using
	     * it, then free up the relevant structures and hash table entries.
	     */

    /*
     * If the variable doesn't exist anymore and no-one's using
     * it, then free up the relevant structures and hash table entries.
     */

	    if (TclIsVarUndefined(varPtr)) {
		CleanupVar(varPtr, arrayPtr);
    if (TclIsVarUndefined(varPtr)) {
	CleanupVar(varPtr, arrayPtr);
	    }
	    return NULL;
	}
    }
	return NULL;
    }

    return varPtr;
}
Deleted library/dde/pkgIndex.tcl.
1
2
3
4
5





-
-
-
-
-
if {[info exists tcl_platform(debug)]} {
    package ifneeded dde 1.1 [list load [file join $dir tcldde83d.dll] dde]
} else {
    package ifneeded dde 1.1 [list load [file join $dir tcldde83.dll] dde]
}
Changes to library/dde1.1/pkgIndex.tcl.

1
2
3
4
5
1
2
3
4
5
6
+





if {![package vsatisfies [package provide Tcl] 8]} {return}
if {[info exists tcl_platform(debug)]} {
    package ifneeded dde 1.1 [list load [file join $dir tcldde83d.dll] dde]
} else {
    package ifneeded dde 1.1 [list load [file join $dir tcldde83.dll] dde]
}
Changes to library/encoding/cp1250.enc.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15

16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14

15
16
17
18
19
20












-
+

-
+





# Encoding file: cp1250, single-byte
S
003F 0 1
00
0000000100020003000400050006000700080009000A000B000C000D000E000F
0010001100120013001400150016001700180019001A001B001C001D001E001F
0020002100220023002400250026002700280029002A002B002C002D002E002F
0030003100320033003400350036003700380039003A003B003C003D003E003F
0040004100420043004400450046004700480049004A004B004C004D004E004F
0050005100520053005400550056005700580059005A005B005C005D005E005F
0060006100620063006400650066006700680069006A006B006C006D006E006F
0070007100720073007400750076007700780079007A007B007C007D007E007F
00800081201A0083201E2026202020210088203001602039015A0164017D0179
20AC0081201A0083201E2026202020210088203001602039015A0164017D0179
009020182019201C201D202220132014009821220161203A015B0165017E017A
00A002C702D8014100A4010400A600A700A800A9015E00AB000000AD00AE017B
00A002C702D8014100A4010400A600A700A800A9015E00AB00AC00AD00AE017B
00B000B102DB014200B400B500B600B700B80105015F00BB013D02DD013E017C
015400C100C2010200C40139010600C7010C00C9011800CB011A00CD00CE010E
01100143014700D300D4015000D600D70158016E00DA017000DC00DD016200DF
015500E100E2010300E4013A010700E7010D00E9011900EB011B00ED00EE010F
01110144014800F300F4015100F600F70159016F00FA017100FC00FD016302D9
Changes to library/encoding/cp1251.enc.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







# Encoding file: cp1251, single-byte
S
003F 0 1
00
0000000100020003000400050006000700080009000A000B000C000D000E000F
0010001100120013001400150016001700180019001A001B001C001D001E001F
0020002100220023002400250026002700280029002A002B002C002D002E002F
0030003100320033003400350036003700380039003A003B003C003D003E003F
0040004100420043004400450046004700480049004A004B004C004D004E004F
0050005100520053005400550056005700580059005A005B005C005D005E005F
0060006100620063006400650066006700680069006A006B006C006D006E006F
0070007100720073007400750076007700780079007A007B007C007D007E007F
04020403201A0453201E2026202020210088203004092039040A040C040B040F
04020403201A0453201E20262020202120AC203004092039040A040C040B040F
045220182019201C201D202220132014009821220459203A045A045C045B045F
00A0040E045E040800A4049000A600A7040100A9040400AB00AC00AD00AE0407
00B000B104060456049100B500B600B704512116045400BB0458040504550457
0410041104120413041404150416041704180419041A041B041C041D041E041F
0420042104220423042404250426042704280429042A042B042C042D042E042F
0430043104320433043404350436043704380439043A043B043C043D043E043F
0440044104420443044404450446044704480449044A044B044C044D044E044F
Changes to library/encoding/cp1252.enc.
1
2
3
4
5
6
7
8
9
10
11
12
13
14


15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12


13
14
15
16
17
18
19
20












-
-
+
+






# Encoding file: cp1252, single-byte
S
003F 0 1
00
0000000100020003000400050006000700080009000A000B000C000D000E000F
0010001100120013001400150016001700180019001A001B001C001D001E001F
0020002100220023002400250026002700280029002A002B002C002D002E002F
0030003100320033003400350036003700380039003A003B003C003D003E003F
0040004100420043004400450046004700480049004A004B004C004D004E004F
0050005100520053005400550056005700580059005A005B005C005D005E005F
0060006100620063006400650066006700680069006A006B006C006D006E006F
0070007100720073007400750076007700780079007A007B007C007D007E007F
00800081201A0192201E20262020202102C62030016020390152008D008E008F
009020182019201C201D20222013201402DC21220161203A0153009D009E0178
20AC0081201A0192201E20262020202102C62030016020390152008D017D008F
009020182019201C201D20222013201402DC21220161203A0153009D017E0178
00A000A100A200A300A400A500A600A700A800A900AA00AB00AC00AD00AE00AF
00B000B100B200B300B400B500B600B700B800B900BA00BB00BC00BD00BE00BF
00C000C100C200C300C400C500C600C700C800C900CA00CB00CC00CD00CE00CF
00D000D100D200D300D400D500D600D700D800D900DA00DB00DC00DD00DE00DF
00E000E100E200E300E400E500E600E700E800E900EA00EB00EC00ED00EE00EF
00F000F100F200F300F400F500F600F700F800F900FA00FB00FC00FD00FE00FF
Changes to library/encoding/cp1253.enc.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







# Encoding file: cp1253, single-byte
S
003F 0 1
00
0000000100020003000400050006000700080009000A000B000C000D000E000F
0010001100120013001400150016001700180019001A001B001C001D001E001F
0020002100220023002400250026002700280029002A002B002C002D002E002F
0030003100320033003400350036003700380039003A003B003C003D003E003F
0040004100420043004400450046004700480049004A004B004C004D004E004F
0050005100520053005400550056005700580059005A005B005C005D005E005F
0060006100620063006400650066006700680069006A006B006C006D006E006F
0070007100720073007400750076007700780079007A007B007C007D007E007F
00800081201A0192201E20262020202100882030008A2039008C008D008E008F
20AC0081201A0192201E20262020202100882030008A2039008C008D008E008F
009020182019201C201D20222013201400982122009A203A009C009D009E009F
00A00385038600A300A400A500A600A700A800A9000000AB00AC00AD00AE2015
00B000B100B200B3038400B500B600B703880389038A00BB038C00BD038E038F
0390039103920393039403950396039703980399039A039B039C039D039E039F
03A003A1000003A303A403A503A603A703A803A903AA03AB03AC03AD03AE03AF
03B003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF
03C003C103C203C303C403C503C603C703C803C903CA03CB03CC03CD03CE0000
Changes to library/encoding/cp1254.enc.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







# Encoding file: cp1254, single-byte
S
003F 0 1
00
0000000100020003000400050006000700080009000A000B000C000D000E000F
0010001100120013001400150016001700180019001A001B001C001D001E001F
0020002100220023002400250026002700280029002A002B002C002D002E002F
0030003100320033003400350036003700380039003A003B003C003D003E003F
0040004100420043004400450046004700480049004A004B004C004D004E004F
0050005100520053005400550056005700580059005A005B005C005D005E005F
0060006100620063006400650066006700680069006A006B006C006D006E006F
0070007100720073007400750076007700780079007A007B007C007D007E007F
00800081201A0192201E20262020202102C62030016020390152008D008E008F
20AC0081201A0192201E20262020202102C62030016020390152008D008E008F
009020182019201C201D20222013201402DC21220161203A0153009D009E0178
00A000A100A200A300A400A500A600A700A800A900AA00AB00AC00AD00AE00AF
00B000B100B200B300B400B500B600B700B800B900BA00BB00BC00BD00BE00BF
00C000C100C200C300C400C500C600C700C800C900CA00CB00CC00CD00CE00CF
011E00D100D200D300D400D500D600D700D800D900DA00DB00DC0130015E00DF
00E000E100E200E300E400E500E600E700E800E900EA00EB00EC00ED00EE00EF
011F00F100F200F300F400F500F600F700F800F900FA00FB00FC0131015F00FF
Changes to library/encoding/cp1255.enc.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18




19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14




15
16
17
18
19
20












-
+

-
-
-
-
+
+
+
+


# Encoding file: cp1255, single-byte
S
003F 0 1
00
0000000100020003000400050006000700080009000A000B000C000D000E000F
0010001100120013001400150016001700180019001A001B001C001D001E001F
0020002100220023002400250026002700280029002A002B002C002D002E002F
0030003100320033003400350036003700380039003A003B003C003D003E003F
0040004100420043004400450046004700480049004A004B004C004D004E004F
0050005100520053005400550056005700580059005A005B005C005D005E005F
0060006100620063006400650066006700680069006A006B006C006D006E006F
0070007100720073007400750076007700780079007A007B007C007D007E007F
00800081201A0192201E20262020202102C62030008A2039008C008D008E008F
20AC0081201A0192201E20262020202102C62030008A2039008C008D008E008F
009020182019201C201D20222013201402DC2122009A203A009C009D009E009F
00A0000000A200A320AA00A500A600A700A800A9000000AB00AC00AD00AE00AF
00B000B100B200B300B400B500B600B7000000B9000000BB00BC00BD00BE0000
05B005B105B205B305B405B505B605B705B805B905BA05BB05BC05BD05BE05BF
05C005C105C205C305F005F105F2000000000000000000000000000000000000
00A000A100A200A320AA00A500A600A700A800A900D700AB00AC00AD00AE00AF
00B000B100B200B300B400B500B600B700B800B900F700BB00BC00BD00BE00BF
05B005B105B205B305B405B505B605B705B805B9000005BB05BC05BD05BE05BF
05C005C105C205C305F005F105F205F305F40000000000000000000000000000
05D005D105D205D305D405D505D605D705D805D905DA05DB05DC05DD05DE05DF
05E005E105E205E305E405E505E605E705E805E905EA00000000200E200F0000
Changes to library/encoding/cp1256.enc.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15



16
17

18
19
20

1
2
3
4
5
6
7
8
9
10
11
12



13
14
15
16

17
18
19

20












-
-
-
+
+
+

-
+


-
+
# Encoding file: cp1256, single-byte
S
003F 0 1
00
0000000100020003000400050006000700080009000A000B000C000D000E000F
0010001100120013001400150016001700180019001A001B001C001D001E001F
0020002100220023002400250026002700280029002A002B002C002D002E002F
0030003100320033003400350036003700380039003A003B003C003D003E003F
0040004100420043004400450046004700480049004A004B004C004D004E004F
0050005100520053005400550056005700580059005A005B005C005D005E005F
0060006100620063006400650066006700680069006A006B006C006D006E006F
0070007100720073007400750076007700780079007A007B007C007D007E007F
0080067E201A0192201E20262020202102C62030008A2039015206860698008F
06AF20182019201C201D20222013201400982122009A203A0153200C200D009F
00A0060C00A200A300A400A500A600A700A800A9000000AB00AC00AD00AE00AF
20AC067E201A0192201E20262020202102C62030067920390152068606980688
06AF20182019201C201D20222013201406A921220691203A0153200C200D06BA
00A0060C00A200A300A400A500A600A700A800A906BE00AB00AC00AD00AE00AF
00B000B100B200B300B400B500B600B700B800B9061B00BB00BC00BD00BE061F
0000062106220623062406250626062706280629062A062B062C062D062E062F
06C1062106220623062406250626062706280629062A062B062C062D062E062F
063006310632063306340635063600D7063706380639063A0640064106420643
00E0064400E2064506460647064800E700E800E900EA00EB0649064A00EE00EF
064B064C064D064E00F4064F065000F7065100F9065200FB00FC200E200F0000
064B064C064D064E00F4064F065000F7065100F9065200FB00FC200E200F06D2
Changes to library/encoding/cp1257.enc.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







# Encoding file: cp1257, single-byte
S
003F 0 1
00
0000000100020003000400050006000700080009000A000B000C000D000E000F
0010001100120013001400150016001700180019001A001B001C001D001E001F
0020002100220023002400250026002700280029002A002B002C002D002E002F
0030003100320033003400350036003700380039003A003B003C003D003E003F
0040004100420043004400450046004700480049004A004B004C004D004E004F
0050005100520053005400550056005700580059005A005B005C005D005E005F
0060006100620063006400650066006700680069006A006B006C006D006E006F
0070007100720073007400750076007700780079007A007B007C007D007E007F
00800081201A0083201E20262020202100882030008A2039008C00A802C700B8
20AC0081201A0083201E20262020202100882030008A2039008C00A802C700B8
009020182019201C201D20222013201400982122009A203A009C00AF02DB009F
00A0000000A200A300A4000000A600A700D800A9015600AB00AC00AD00AE00C6
00B000B100B200B300B400B500B600B700F800B9015700BB00BC00BD00BE00E6
0104012E0100010600C400C501180112010C00C90179011601220136012A013B
01600143014500D3014C00D500D600D701720141015A016A00DC017B017D00DF
0105012F0101010700E400E501190113010D00E9017A011701230137012B013C
01610144014600F3014D00F500F600F701730142015B016B00FC017C017E02D9
Changes to library/encoding/cp1258.enc.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17

18
19

20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16

17
18

19
20












-
+



-
+

-
+

# Encoding file: cp1258, single-byte
S
003F 0 1
00
0000000100020003000400050006000700080009000A000B000C000D000E000F
0010001100120013001400150016001700180019001A001B001C001D001E001F
0020002100220023002400250026002700280029002A002B002C002D002E002F
0030003100320033003400350036003700380039003A003B003C003D003E003F
0040004100420043004400450046004700480049004A004B004C004D004E004F
0050005100520053005400550056005700580059005A005B005C005D005E005F
0060006100620063006400650066006700680069006A006B006C006D006E006F
0070007100720073007400750076007700780079007A007B007C007D007E007F
00800081201A0192201E20262020202102C62030008A20390152008D008E008F
20AC0081201A0192201E20262020202102C62030008A20390152008D008E008F
009020182019201C201D20222013201402DC2122009A203A0153009D009E0178
00A000A100A200A300A400A500A600A700A800A900AA00AB00AC00AD00AE00AF
00B000B100B200B300B400B500B600B700B800B900BA00BB00BC00BD00BE00BF
00C000C100C2010200C400C500C600C700C800C900CA00CB034000CD00CE00CF
00C000C100C2010200C400C500C600C700C800C900CA00CB030000CD00CE00CF
011000D1030900D300D401A000D600D700D800D900DA00DB00DC01AF030300DF
00E000E100E2010300E400E500E600E700E800E900EA00EB034100ED00EE00EF
00E000E100E2010300E400E500E600E700E800E900EA00EB030100ED00EE00EF
011100F1032300F300F401A100F600F700F800F900FA00FB00FC01B020AB00FF
Changes to library/encoding/cp874.enc.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







# Encoding file: cp874, single-byte
S
003F 0 1
00
0000000100020003000400050006000700080009000A000B000C000D000E000F
0010001100120013001400150016001700180019001A001B001C001D001E001F
0020002100220023002400250026002700280029002A002B002C002D002E002F
0030003100320033003400350036003700380039003A003B003C003D003E003F
0040004100420043004400450046004700480049004A004B004C004D004E004F
0050005100520053005400550056005700580059005A005B005C005D005E005F
0060006100620063006400650066006700680069006A006B006C006D006E006F
0070007100720073007400750076007700780079007A007B007C007D007E007F
0080008100820083008420260086008700880089008A008B008C008D008E008F
20AC008100820083008420260086008700880089008A008B008C008D008E008F
009020182019201C201D20222013201400980099009A009B009C009D009E009F
00A00E010E020E030E040E050E060E070E080E090E0A0E0B0E0C0E0D0E0E0E0F
0E100E110E120E130E140E150E160E170E180E190E1A0E1B0E1C0E1D0E1E0E1F
0E200E210E220E230E240E250E260E270E280E290E2A0E2B0E2C0E2D0E2E0E2F
0E300E310E320E330E340E350E360E370E380E390E3A00000000000000000E3F
0E400E410E420E430E440E450E460E470E480E490E4A0E4B0E4C0E4D0E4E0E4F
0E500E510E520E530E540E550E560E570E580E590E5A0E5B0000000000000000
Changes to library/encoding/cp936.enc.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







# Encoding file: cp936, multi-byte
M
003F 0 127
00
0000000100020003000400050006000700080009000A000B000C000D000E000F
0010001100120013001400150016001700180019001A001B001C001D001E001F
0020002100220023002400250026002700280029002A002B002C002D002E002F
0030003100320033003400350036003700380039003A003B003C003D003E003F
0040004100420043004400450046004700480049004A004B004C004D004E004F
0050005100520053005400550056005700580059005A005B005C005D005E005F
0060006100620063006400650066006700680069006A006B006C006D006E006F
0070007100720073007400750076007700780079007A007B007C007D007E007F
0080000000000000000000000000000000000000000000000000000000000000
20AC000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
Changes to library/encoding/cp949.enc.
590
591
592
593
594
595
596
597

598
599
600
601
602
603
604
590
591
592
593
594
595
596

597
598
599
600
601
602
603
604







-
+







C93DC93EC93FC940C941C942C943C944C945C946C94700000000000000000000
0000C948C949C94AC94BC94CC94DC94EC94FC952C953C955C956C957C959C95A
C95BC95CC95DC95EC95FC962C964C965C966C967C968C969C96AC96BC96DC96E
C96F21D221D42200220300B4FF5E02C702D802DD02DA02D900B802DB00A100BF
02D0222E2211220F00A42109203025C125C025B725B626642660266126652667
2663229925C825A325D025D1259225A425A525A825A725A625A92668260F260E
261C261E00B62020202121952197219921962198266D2669266A266C327F321C
211633C7212233C233D821210000000000000000000000000000000000000000
211633C7212233C233D8212120AC00AE00000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
A3
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000C971C972C973C975C976C977C978C979C97AC97BC97DC97EC97FC980C981
Changes to library/encoding/cp950.enc.
63
64
65
66
67
68
69
70

71
72
73
74
75
76
77
63
64
65
66
67
68
69

70
71
72
73
74
75
76
77







-
+







03C603C703C803C931053106310731083109310A310B310C310D310E310F0000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00003110311131123113311431153116311731183119311A311B311C311D311E
311F312031213122312331243125312631273128312902D902C902CA02C702CB
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000020AC00000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
A4
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
4E004E594E014E034E434E5D4E864E8C4EBA513F5165516B51E052005201529B
Added library/encoding/ebcdic.enc.



















1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
S
006F 0 1
00
0000000100020003008500090086007F0087008D008E000B000C000D000E000F
0010001100120013008F000A0008009700180019009C009D001C001D001E001F
0080008100820083008400920017001B00880089008A008B008C000500060007
0090009100160093009400950096000400980099009A009B00140015009E001A
002000A000E200E400E000E100E300E500E700F10060002E003C0028002B007C
002600E900EA00EB00E800ED00EE00EF00EC00DF00210024002A0029003B009F
002D002F00C200C400C000C100C300C500C700D1005E002C0025005F003E003F
00F800C900CA00CB00C800CD00CE00CF00CC00A8003A002300400027003D0022
00D800610062006300640065006600670068006900AB00BB00F000FD00FE00B1
00B0006A006B006C006D006E006F00700071007200AA00BA00E600B800C600A4
00B500AF0073007400750076007700780079007A00A100BF00D000DD00DE00AE
00A200A300A500B700A900A700B600BC00BD00BE00AC005B005C005D00B400D7
00F900410042004300440045004600470048004900AD00F400F600F200F300F5
00A6004A004B004C004D004E004F00500051005200B900FB00FC00DB00FA00FF
00D900F70053005400550056005700580059005A00B200D400D600D200D300D5
003000310032003300340035003600370038003900B3007B00DC007D00DA007E
Changes to library/encoding/iso2022-jp.enc.
1
2
3
4
5
6
7
8
9


10
11
12
1
2
3
4
5
6
7


8
9
10
11
12







-
-
+
+



# Encoding file: iso2022-jp, escape-driven
E
name		iso2022-jp
init		{}
final		{}
iso8859-1	\x1b(B
jis0201		\x1b(J
jis0208		\x1b$@
jis0208		\x1b$B
jis0208		\x1b$B
jis0208		\x1b$@
jis0212		\x1b$(D
gb2312		\x1b$A
ksc5601		\x1b$(C
Changes to library/encoding/iso2022.enc.
1
2
3
4
5
6
7
8
9
10


11
12
13
14
15
16
1
2
3
4
5
6
7
8


9
10
11
12
13
14










-
-
+
+




-
-
# Encoding file: iso2022, escape-driven
E
name		iso2022
init		{}
final		{}
iso8859-1	\x1b(B
jis0201		\x1b(J
gb1988		\x1b(T
jis0208		\x1b$@
jis0208		\x1b$B
jis0208		\x1b$B
jis0208		\x1b$@
jis0212		\x1b$(D
gb2312		\x1b$A
ksc5601		\x1b$(C
jis0208		\x1b&@\x1b$B


Added library/encoding/iso8859-10.enc.




















1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# Encoding file: iso8859-10, single-byte
S
003F 0 1
00
0000000100020003000400050006000700080009000A000B000C000D000E000F
0010001100120013001400150016001700180019001A001B001C001D001E001F
0020002100220023002400250026002700280029002A002B002C002D002E002F
0030003100320033003400350036003700380039003A003B003C003D003E003F
0040004100420043004400450046004700480049004A004B004C004D004E004F
0050005100520053005400550056005700580059005A005B005C005D005E005F
0060006100620063006400650066006700680069006A006B006C006D006E006F
0070007100720073007400750076007700780079007A007B007C007D007E007F
0080008100820083008400850086008700880089008A008B008C008D008E008F
0090009100920093009400950096009700980099009A009B009C009D009E009F
00A0010401120122012A0128013600A7013B011001600166017D00AD016A014A
00B0010501130123012B0129013700B7013C011101610167017E2015016B014B
010000C100C200C300C400C500C6012E010C00C9011800CB011600CD00CE00CF
00D00145014C00D300D400D500D6016800D8017200DA00DB00DC00DD00DE00DF
010100E100E200E300E400E500E6012F010D00E9011900EB011700ED00EE00EF
00F00146014D00F300F400F500F6016900F8017300FA00FB00FC00FD00FE0138
Added library/encoding/iso8859-13.enc.




















1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# Encoding file: iso8859-13, single-byte
S
003F 0 1
00
0000000100020003000400050006000700080009000A000B000C000D000E000F
0010001100120013001400150016001700180019001A001B001C001D001E001F
0020002100220023002400250026002700280029002A002B002C002D002E002F
0030003100320033003400350036003700380039003A003B003C003D003E003F
0040004100420043004400450046004700480049004A004B004C004D004E004F
0050005100520053005400550056005700580059005A005B005C005D005E005F
0060006100620063006400650066006700680069006A006B006C006D006E006F
0070007100720073007400750076007700780079007A007B007C007D007E007F
0080008100820083008400850086008700880089008A008B008C008D008E008F
0090009100920093009400950096009700980099009A009B009C009D009E009F
00A0201D00A200A300A4201E00A600A700D800A9015600AB00AC00AD00AE00C6
00B000B100B200B3201C00B500B600B700F800B9015700BB00BC00BD00BE00E6
0104012E0100010600C400C501180112010C00C90179011601220136012A013B
01600143014500D3014C00D500D600D701720141015A016A00DC017B017D00DF
0105012F0101010700E400E501190113010D00E9017A011701230137012B013C
01610144014600F3014D00F500F600F701730142015B016B00FC017C017E2019
Added library/encoding/iso8859-14.enc.




















1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# Encoding file: iso8859-14, single-byte
S
003F 0 1
00
0000000100020003000400050006000700080009000A000B000C000D000E000F
0010001100120013001400150016001700180019001A001B001C001D001E001F
0020002100220023002400250026002700280029002A002B002C002D002E002F
0030003100320033003400350036003700380039003A003B003C003D003E003F
0040004100420043004400450046004700480049004A004B004C004D004E004F
0050005100520053005400550056005700580059005A005B005C005D005E005F
0060006100620063006400650066006700680069006A006B006C006D006E006F
0070007100720073007400750076007700780079007A007B007C007D007E007F
0080008100820083008400850086008700880089008A008B008C008D008E008F
0090009100920093009400950096009700980099009A009B009C009D009E009F
00A01E021E0300A3010A010B1E0A00A71E8000A91E821E0B1EF200AD00AE0178
1E1E1E1F012001211E401E4100B61E561E811E571E831E601EF31E841E851E61
00C000C100C200C300C400C500C600C700C800C900CA00CB00CC00CD00CE00CF
017400D100D200D300D400D500D61E6A00D800D900DA00DB00DC00DD017600DF
00E000E100E200E300E400E500E600E700E800E900EA00EB00EC00ED00EE00EF
017500F100F200F300F400F500F61E6B00F800F900FA00FB00FC00FD017700FF
Added library/encoding/iso8859-15.enc.




















1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# Encoding file: iso8859-15, single-byte
S
003F 0 1
00
0000000100020003000400050006000700080009000A000B000C000D000E000F
0010001100120013001400150016001700180019001A001B001C001D001E001F
0020002100220023002400250026002700280029002A002B002C002D002E002F
0030003100320033003400350036003700380039003A003B003C003D003E003F
0040004100420043004400450046004700480049004A004B004C004D004E004F
0050005100520053005400550056005700580059005A005B005C005D005E005F
0060006100620063006400650066006700680069006A006B006C006D006E006F
0070007100720073007400750076007700780079007A007B007C007D007E007F
0080008100820083008400850086008700880089008A008B008C008D008E008F
0090009100920093009400950096009700980099009A009B009C009D009E009F
00A000A100A200A320AC00A5016000A7016100A900AA00AB00AC00AD00AE00AF
00B000B100B200B3017D00B500B600B7017E00B900BA00BB01520153017800BF
00C000C100C200C300C400C500C600C700C800C900CA00CB00CC00CD00CE00CF
00D000D100D200D300D400D500D600D700D800D900DA00DB00DC00DD00DE00DF
00E000E100E200E300E400E500E600E700E800E900EA00EB00EC00ED00EE00EF
00F000F100F200F300F400F500F600F700F800F900FA00FB00FC00FD00FE00FF
Added library/encoding/iso8859-16.enc.




















1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# Encoding file: iso8859-16, single-byte
S
003F 0 1
00
0000000100020003000400050006000700080009000A000B000C000D000E000F
0010001100120013001400150016001700180019001A001B001C001D001E001F
0020002100220023002400250026002700280029002A002B002C002D002E002F
0030003100320033003400350036003700380039003A003B003C003D003E003F
0040004100420043004400450046004700480049004A004B004C004D004E004F
0050005100520053005400550056005700580059005A005B005C005D005E005F
0060006100620063006400650066006700680069006A006B006C006D006E006F
0070007100720073007400750076007700780079007A007B007C007D007E007F
0080008100820083008400850086008700880089008A008B008C008D008E008F
0090009100920093009400950096009700980099009A009B009C009D009E009F
00A001040105014120AC201E016000A7016100A9021800AB017900AD017A017B
00B000B1010C0142017D201D00B600B7017E010D021900BB015201530178017C
00C000C100C2010200C4010600C600C700C800C900CA00CB00CC00CD00CE00CF
0110014300D200D300D4015000D6015A017000D900DA00DB00DC0118021A00DF
00E000E100E2010300E4010700E600E700E800E900EA00EB00EC00ED00EE00EF
0111014400F200F300F4015100F6015B017100F900FA00FB00FC0119021B00FF
Changes to library/encoding/iso8859-6.enc.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







# Encoding file: iso8859-6, single-byte
S
003F 0 1
00
0000000100020003000400050006000700080009000A000B000C000D000E000F
0010001100120013001400150016001700180019001A001B001C001D001E001F
0020002100220023002400250026002700280029002A002B002C002D002E002F
0660066106620663066406650666066706680669003A003B003C003D003E003F
0030003100320033003400350036003700380039003A003B003C003D003E003F
0040004100420043004400450046004700480049004A004B004C004D004E004F
0050005100520053005400550056005700580059005A005B005C005D005E005F
0060006100620063006400650066006700680069006A006B006C006D006E006F
0070007100720073007400750076007700780079007A007B007C007D007E007F
0080008100820083008400850086008700880089008A008B008C008D008E008F
0090009100920093009400950096009700980099009A009B009C009D009E009F
00A000000000000000A40000000000000000000000000000060C00AD00000000
Changes to library/encoding/iso8859-7.enc.
8
9
10
11
12
13
14
15

16
17
18
19
20
8
9
10
11
12
13
14

15
16
17
18
19
20







-
+





0030003100320033003400350036003700380039003A003B003C003D003E003F
0040004100420043004400450046004700480049004A004B004C004D004E004F
0050005100520053005400550056005700580059005A005B005C005D005E005F
0060006100620063006400650066006700680069006A006B006C006D006E006F
0070007100720073007400750076007700780079007A007B007C007D007E007F
0080008100820083008400850086008700880089008A008B008C008D008E008F
0090009100920093009400950096009700980099009A009B009C009D009E009F
00A002BD02BC00A30000000000A600A700A800A9000000AB00AC00AD00002015
00A02018201900A30000000000A600A700A800A9000000AB00AC00AD00002015
00B000B100B200B303840385038600B703880389038A00BB038C00BD038E038F
0390039103920393039403950396039703980399039A039B039C039D039E039F
03A003A1000003A303A403A503A603A703A803A903AA03AB03AC03AD03AE03AF
03B003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF
03C003C103C203C303C403C503C603C703C803C903CA03CB03CC03CD03CE0000
Changes to library/encoding/iso8859-8.enc.
8
9
10
11
12
13
14
15

16
17
18
19
20

8
9
10
11
12
13
14

15
16
17
18
19

20







-
+




-
+
0030003100320033003400350036003700380039003A003B003C003D003E003F
0040004100420043004400450046004700480049004A004B004C004D004E004F
0050005100520053005400550056005700580059005A005B005C005D005E005F
0060006100620063006400650066006700680069006A006B006C006D006E006F
0070007100720073007400750076007700780079007A007B007C007D007E007F
0080008100820083008400850086008700880089008A008B008C008D008E008F
0090009100920093009400950096009700980099009A009B009C009D009E009F
00A0000000A200A300A400A500A600A700A800A900D700AB00AC00AD00AE203E
00A0000000A200A300A400A500A600A700A800A900D700AB00AC00AD00AE00AF
00B000B100B200B300B400B500B600B700B800B900F700BB00BC00BD00BE0000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000002017
05D005D105D205D305D405D505D605D705D805D905DA05DB05DC05DD05DE05DF
05E005E105E205E305E405E505E605E705E805E905EA00000000000000000000
05E005E105E205E305E405E505E605E705E805E905EA00000000200E200F0000
Added library/encoding/koi8-u.enc.




















1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# Encoding file: koi8-u, single-byte                            
S                                                               
003F 0 1                                                        
00                                                              
0000000100020003000400050006000700080009000A000B000C000D000E000F
0010001100120013001400150016001700180019001A001B001C001D001E001F
0020002100220023002400250026002700280029002A002B002C002D002E002F
0030003100320033003400350036003700380039003A003B003C003D003E003F
0040004100420043004400450046004700480049004A004B004C004D004E004F
0050005100520053005400550056005700580059005A005B005C005D005E005F
0060006100620063006400650066006700680069006A006B006C006D006E006F
0070007100720073007400750076007700780079007A007B007C007D007E007F
25002502250C251025142518251C2524252C2534253C258025842588258C2590
259125922593232025A02219221A22482264226500A0232100B000B200B700F7
25502551255204510454255404560457255725582559255A255B0491255D255E
255F25602561040104032563040604072566256725682569256A0490256C00A9
044E0430043104460434043504440433044504380439043A043B043C043D043E
043F044F044004410442044304360432044C044B04370448044D04490447044A
042E0410041104260414041504240413042504180419041A041B041C041D041E
041F042F042004210422042304160412042C042B04170428042D04290427042A
Changes to library/encoding/macCroatian.enc.
9
10
11
12
13
14
15
16

17
18

19
20
9
10
11
12
13
14
15

16
17

18
19
20







-
+

-
+


0040004100420043004400450046004700480049004A004B004C004D004E004F
0050005100520053005400550056005700580059005A005B005C005D005E005F
0060006100620063006400650066006700680069006A006B006C006D006E006F
0070007100720073007400750076007700780079007A007B007C007D007E007F
00C400C500C700C900D100D600DC00E100E000E200E400E300E500E700E900E8
00EA00EB00ED00EC00EE00EF00F100F300F200F400F600F500FA00F900FB00FC
202000B000A200A300A7202200B600DF00AE0160212200B400A82260017D00D8
221E00B122642265220600B522022211220F0161222B00AA00BA2126017E00F8
221E00B122642265220600B522022211220F0161222B00AA00BA03A9017E00F8
00BF00A100AC221A01922248010600AB010C202600A000C000C300D501520153
01102014201C201D2018201900F725CAF8FF00A9204400A42039203A00C600BB
01102014201C201D2018201900F725CAF8FF00A9204420AC2039203A00C600BB
201300B7201A201E203000C2010700C1010D00C800CD00CE00CF00CC00D300D4
011100D200DA00DB00D9013102C602DC00AF03C000CB02DA00B800CA00E602C7
Changes to library/encoding/macCyrillic.enc.
8
9
10
11
12
13
14
15
16


17
18
19
20

8
9
10
11
12
13
14


15
16
17
18
19

20







-
-
+
+



-
+
0030003100320033003400350036003700380039003A003B003C003D003E003F
0040004100420043004400450046004700480049004A004B004C004D004E004F
0050005100520053005400550056005700580059005A005B005C005D005E005F
0060006100620063006400650066006700680069006A006B006C006D006E006F
0070007100720073007400750076007700780079007A007B007C007D007E007F
0410041104120413041404150416041704180419041A041B041C041D041E041F
0420042104220423042404250426042704280429042A042B042C042D042E042F
202000B000A200A300A7202200B6040600AE00A9212204020452226004030453
221E00B122642265045600B522020408040404540407045704090459040A045A
202000B0049000A300A7202200B6040600AE00A9212204020452226004030453
221E00B122642265045600B504910408040404540407045704090459040A045A
0458040500AC221A01922248220600AB00BB202600A0040B045B040C045C0455
20132014201C201D2018201900F7201E040E045E040F045F211604010451044F
0430043104320433043404350436043704380439043A043B043C043D043E043F
0440044104420443044404450446044704480449044A044B044C044D044E00A4
0440044104420443044404450446044704480449044A044B044C044D044E20AC
Changes to library/encoding/macGreek.enc.
8
9
10
11
12
13
14
15

16
17
18
19
20
8
9
10
11
12
13
14

15
16
17
18
19
20







-
+





0030003100320033003400350036003700380039003A003B003C003D003E003F
0040004100420043004400450046004700480049004A004B004C004D004E004F
0050005100520053005400550056005700580059005A005B005C005D005E005F
0060006100620063006400650066006700680069006A006B006C006D006E006F
0070007100720073007400750076007700780079007A007B007C007D007E007F
00C400B900B200C900B300D600DC038500E000E200E4038400A800E700E900E8
00EA00EB00A3212200EE00EF202200BD203000F400F600A600AD00F900FB00FC
2020039303940398039B039E03A000DF00AE00A903A303AA00A7226000B00387
2020039303940398039B039E03A000DF00AE00A903A303AA00A7226000B000B7
039100B12264226500A503920395039603970399039A039C03A603AB03A803A9
03AC039D00AC039F03A1224803A400AB00BB202600A003A503A7038603880153
20132015201C201D2018201900F70389038A038C038E03AD03AE03AF03CC038F
03CD03B103B203C803B403B503C603B303B703B903BE03BA03BB03BC03BD03BF
03C003CE03C103C303C403B803C903C203C703C503B603CA03CB039003B0F8A0
Changes to library/encoding/macIceland.enc.
9
10
11
12
13
14
15
16

17
18

19
20
9
10
11
12
13
14
15

16
17

18
19
20







-
+

-
+


0040004100420043004400450046004700480049004A004B004C004D004E004F
0050005100520053005400550056005700580059005A005B005C005D005E005F
0060006100620063006400650066006700680069006A006B006C006D006E006F
0070007100720073007400750076007700780079007A007B007C007D007E007F
00C400C500C700C900D100D600DC00E100E000E200E400E300E500E700E900E8
00EA00EB00ED00EC00EE00EF00F100F300F200F400F600F500FA00F900FB00FC
00DD00B000A200A300A7202200B600DF00AE00A9212200B400A8226000C600D8
221E00B12264226500A500B522022211220F03C0222B00AA00BA212600E600F8
221E00B12264226500A500B522022211220F03C0222B00AA00BA03A900E600F8
00BF00A100AC221A01922248220600AB00BB202600A000C000C300D501520153
20132014201C201D2018201900F725CA00FF0178204400A400D000F000DE00FE
20132014201C201D2018201900F725CA00FF0178204420AC00D000F000DE00FE
00FD00B7201A201E203000C200CA00C100CB00C800CD00CE00CF00CC00D300D4
F8FF00D200DA00DB00D9013102C602DC00AF02D802D902DA00B802DD02DB02C7
Changes to library/encoding/macRoman.enc.
9
10
11
12
13
14
15
16

17
18

19
20
9
10
11
12
13
14
15

16
17

18
19
20







-
+

-
+


0040004100420043004400450046004700480049004A004B004C004D004E004F
0050005100520053005400550056005700580059005A005B005C005D005E005F
0060006100620063006400650066006700680069006A006B006C006D006E006F
0070007100720073007400750076007700780079007A007B007C007D007E007F
00C400C500C700C900D100D600DC00E100E000E200E400E300E500E700E900E8
00EA00EB00ED00EC00EE00EF00F100F300F200F400F600F500FA00F900FB00FC
202000B000A200A300A7202200B600DF00AE00A9212200B400A8226000C600D8
221E00B12264226500A500B522022211220F03C0222B00AA00BA212600E600F8
221E00B12264226500A500B522022211220F03C0222B00AA00BA03A900E600F8
00BF00A100AC221A01922248220600AB00BB202600A000C000C300D501520153
20132014201C201D2018201900F725CA00FF0178204400A42039203AFB01FB02
20132014201C201D2018201900F725CA00FF0178204420AC2039203AFB01FB02
202100B7201A201E203000C200CA00C100CB00C800CD00CE00CF00CC00D300D4
F8FF00D200DA00DB00D9013102C602DC00AF02D802D902DA00B802DD02DB02C7
Changes to library/encoding/macTurkish.enc.
9
10
11
12
13
14
15
16

17
18
19
20
9
10
11
12
13
14
15

16
17
18
19
20







-
+




0040004100420043004400450046004700480049004A004B004C004D004E004F
0050005100520053005400550056005700580059005A005B005C005D005E005F
0060006100620063006400650066006700680069006A006B006C006D006E006F
0070007100720073007400750076007700780079007A007B007C007D007E007F
00C400C500C700C900D100D600DC00E100E000E200E400E300E500E700E900E8
00EA00EB00ED00EC00EE00EF00F100F300F200F400F600F500FA00F900FB00FC
202000B000A200A300A7202200B600DF00AE00A9212200B400A8226000C600D8
221E00B12264226500A500B522022211220F03C0222B00AA00BA212600E600F8
221E00B12264226500A500B522022211220F03C0222B00AA00BA03A900E600F8
00BF00A100AC221A01922248220600AB00BB202600A000C000C300D501520153
20132014201C201D2018201900F725CA00FF0178011E011F01300131015E015F
202100B7201A201E203000C200CA00C100CB00C800CD00CE00CF00CC00D300D4
F8FF00D200DA00DB00D9F8A002C602DC00AF02D802D902DA00B802DD02DB02C7
Added library/encoding/tis-620.enc.




















1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# Encoding file: tis-620, single-byte
S
003F 0 1
00
0000000100020003000400050006000700080009000A000B000C000D000E000F
0010001100120013001400150016001700180019001A001B001C001D001E001F
0020002100220023002400250026002700280029002A002B002C002D002E002F
0030003100320033003400350036003700380039003A003B003C003D003E003F
0040004100420043004400450046004700480049004A004B004C004D004E004F
0050005100520053005400550056005700580059005A005B005C005D005E005F
0060006100620063006400650066006700680069006A006B006C006D006E006F
0070007100720073007400750076007700780079007A007B007C007D007E0000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000E010E020E030E040E050E060E070E080E090E0A0E0B0E0C0E0D0E0E0E0F
0E100E110E120E130E140E150E160E170E180E190E1A0E1B0E1C0E1D0E1E0E1F
0E200E210E220E230E240E250E260E270E280E290E2A0E2B0E2C0E2D0E2E0E2F
0E300E310E320E330E340E350E360E370E380E390E3A00000000000000000E3F
0E400E410E420E430E440E450E460E470E480E490E4A0E4B0E4C0E4D0E4E0E4F
0E500E510E520E530E540E550E560E570E580E590E5A0E5B0000000000000000
Changes to library/history.tcl.
1
2
3
4
5

6
7
8
9
10
11
12
1
2
3
4

5
6
7
8
9
10
11
12




-
+







# history.tcl --
#
# Implementation of the history command.
#
# RCS: @(#) $Id: history.tcl,v 1.3 1998/09/14 18:40:03 stanton Exp $
# RCS: @(#) $Id: history.tcl,v 1.3.18.1 2000/08/07 21:31:47 hobbs Exp $
#
# Copyright (c) 1997 Sun Microsystems, Inc.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#

301
302
303
304
305
306
307

308

309
310
311
312
313
314
315
301
302
303
304
305
306
307
308

309
310
311
312
313
314
315
316







+
-
+







#
# Results:
#	The index into history, or an error if the index didn't match.

 proc tcl::HistIndex {event} {
    variable history
    if {[catch {expr {~$event}}]} {
	for {set i [expr {$history(nextid)-1}]} {[info exists history($i)]} \
	for {set i $history(nextid)} {[info exists history($i)]} {incr i -1} {
		{incr i -1} {
	    if {[string match $event* $history($i)]} {
		return $i;
	    }
	    if {[string match $event $history($i)]} {
		return $i;
	    }
	}
Changes to library/http/http.tcl.
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
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











-
+









+
+

+
+
-
+







-


+

+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-

+





+
+
+
+







# http.tcl --
#
#	Client-side HTTP for GET, POST, and HEAD commands.
#	These routines can be used in untrusted code that uses 
#	the Safesock security policy.  These procedures use a 
#	callback interface to avoid using vwait, which is not 
#	defined in the safe base.
#
# See the file "license.terms" for information on usage and
# redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: http.tcl,v 1.32 2000/04/22 07:07:59 sandeep Exp $
# RCS: @(#) $Id: http.tcl,v 1.32.2.7 2002/02/05 17:09:50 dgp Exp $

# Rough version history:
# 1.0	Old http_get interface
# 2.0	http:: namespace and http::geturl
# 2.1	Added callbacks to handle arriving data, and timeouts
# 2.2	Added ability to fetch into a channel
# 2.3	Added SSL support, and ability to post from a channel
#	This version also cleans up error cases and eliminates the
#	"ioerror" status in favor of raising an error
# 2.4	Added -binary option to http::geturl and charset element
#	to the state array.

package require Tcl 8.2
# keep this in sync with pkgIndex.tcl
package provide http 2.3
package provide http 2.4.2

namespace eval http {
    variable http
    array set http {
	-accept */*
	-proxyhost {}
	-proxyport {}
	-useragent {Tcl http client package 2.3}
	-proxyfilter http::ProxyRequired
    }
    set http(-useragent) "Tcl http client package [package provide http]"

    proc init {} {
    variable formMap
    variable alphanumeric a-zA-Z0-9
	variable formMap
	variable alphanumeric a-zA-Z0-9
    variable c
    variable i 0
    for {} {$i <= 256} {incr i} {
	set c [format %c $i]
	if {![string match \[$alphanumeric\] $c]} {
	    set formMap($c) %[format %.2x $i]
	}
    }
    # These are handled specially
    array set formMap {
	for {set i 0} {$i <= 256} {incr i} {
	    set c [format %c $i]
	    if {![string match \[$alphanumeric\] $c]} {
		set formMap($c) %[format %.2x $i]
	    }
	}
	# These are handled specially
	array set formMap { " " + \n %0d%0a }
	" " +   \n %0d%0a
    }
    init

    variable urlTypes
    array set urlTypes {
	http	{80 ::socket}
    }

    variable encodings [string tolower [encoding names]]
    # This can be changed, but iso8859-1 is the RFC standard.
    variable defaultCharset "iso8859-1"

    namespace export geturl config reset wait formatQuery register unregister
    # Useful, but not exported: data size status code
}

# http::register --
#
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
244
245
246

247

248
249
250
251
252
253
254
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
244
245
246
247
248
249
250
251
252
253
254
255
256
257

258
259
260
261
262
263
264
265







-
+



















+















+









+









+
-
+







    set state(status) $why
    catch {fileevent $state(sock) readable {}}
    catch {fileevent $state(sock) writable {}}
    Finish $token
    if {[info exists state(error)]} {
	set errorlist $state(error)
	unset state
	eval error $errorlist
	eval ::error $errorlist
    }
}

# http::geturl --
#
#	Establishes a connection to a remote url via http.
#
# Arguments:
#       url		The http URL to goget.
#       args		Option value pairs. Valid options include:
#				-blocksize, -validate, -headers, -timeout
# Results:
#	Returns a token for this connection.
#	This token is the name of an array that the caller should
#	unset to garbage collect the state.

proc http::geturl { url args } {
    variable http
    variable urlTypes
    variable defaultCharset

    # Initialize the state variable, an array.  We'll return the
    # name of this array as the token for the transaction.

    if {![info exists http(uid)]} {
	set http(uid) 0
    }
    set token [namespace current]::[incr http(uid)]
    variable $token
    upvar 0 $token state
    reset $token

    # Process command options.

    array set state {
	-binary		false
	-blocksize 	8192
	-queryblocksize 8192
	-validate 	0
	-headers 	{}
	-timeout 	0
	-type           application/x-www-form-urlencoded
	-queryprogress	{}
	state		header
	meta		{}
	coding		{}
	currentsize	0
	totalsize	0
	querylength	0
	queryoffset	0
        type            text/html
        body            {}
	status		""
	http            ""
    }
    set state(charset)	$defaultCharset
    set options {-blocksize -channel -command -handler -headers \
    set options {-binary -blocksize -channel -command -handler -headers \
	    -progress -query -queryblocksize -querychannel -queryprogress\
	    -validate -timeout -type}
    set usage [join $options ", "]
    regsub -all -- - $options {} options
    set pat ^-([join $options |])$
    foreach {flag value} $args {
	if {[regexp $pat $flag]} {
276
277
278
279
280
281
282
283

284
285
286
287
288
289
290
291

292
293
294
295
296
297
298
287
288
289
290
291
292
293

294
295
296
297
298
299
300
301

302
303
304
305
306
307
308
309







-
+







-
+







    }

    # Validate URL, determine the server host and port, and check proxy case

    if {![regexp -nocase {^(([^:]*)://)?([^/:]+)(:([0-9]+))?(/.*)?$} $url \
	    x prefix proto host y port srvurl]} {
	unset $token
	error "Unsupported URL: $url"
	return -code error "Unsupported URL: $url"
    }
    if {[string length $proto] == 0} {
	set proto http
	set url ${proto}://$url
    }
    if {![info exists urlTypes($proto)]} {
	unset $token
	return -code error "unsupported url type \"$proto\""
	return -code error "Unsupported URL type \"$proto\""
    }
    set defport [lindex $urlTypes($proto) 0]
    set defcmd [lindex $urlTypes($proto) 1]

    if {[string length $port] == 0} {
	set port $defport
    }
341
342
343
344
345
346
347
348
349
350











351
352
353
354
355
356
357
358
359
360
352
353
354
355
356
357
358



359
360
361
362
363
364
365
366
367
368
369



370
371
372
373
374
375
376







-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-







    set state(sock) $s

    # Wait for the connection to complete

    if {$state(-timeout) > 0} {
	fileevent $s writable [list http::Connect $token]
	http::wait $token
	if {$state(status) != "connect"} {
	    
	    # Likely to be connection timeout.  If there was a connection

	if {[string equal $state(status) "error"]} {
	    # something went wrong while trying to establish the connection
	    # Clean up after events and such, but DON'T call the command
	    # callback (if available) because we're going to throw an 
	    # exception from here instead.
	    set err [lindex $state(error) 0]
	    cleanup $token
	    return -code error $err
	} elseif {![string equal $state(status) "connect"]} {
	    # Likely to be connection timeout
	    # error, (e.g., bad port), then http::wait will have 
	    # raised an error already

	    return $token
	}
	set state(status) ""
    }

    # Send data in cr-lf format, but accept any line terminators

384
385
386
387
388
389
390



391




392
393
394
395
396
397
398
400
401
402
403
404
405
406
407
408
409

410
411
412
413
414
415
416
417
418
419
420







+
+
+
-
+
+
+
+







	fconfigure $state(-querychannel) -blocking 1 -translation binary
	set contDone 0
    }

    if {[catch {
	puts $s "$how $srvurl HTTP/1.0"
	puts $s "Accept: $http(-accept)"
	if {$port == $defport} {
	    # Don't add port in this case, to handle broken servers.
	    # [Bug #504508]
	puts $s "Host: $host"
	    puts $s "Host: $host"
	} else {
	    puts $s "Host: $host:$port"
	}
	puts $s "User-Agent: $http(-useragent)"
	foreach {key value} $state(-headers) {
	    regsub -all \[\n\r\]  $value {} value
	    set key [string trim $key]
	    if {[string equal $key "Content-Length"]} {
		set contDone 1
		set state(querylength) $value
445
446
447
448
449
450
451





452
453
454
455
456
457
458
459
460
461






462
463
464
465
466
467
468
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486


487
488
489
490
491
492
493
494
495
496
497
498
499







+
+
+
+
+








-
-
+
+
+
+
+
+








	if {! [info exists state(-command)]} {

	    # geturl does EVERYTHING asynchronously, so if the user
	    # calls it synchronously, we just do a wait here.

	    wait $token
	    if {[string equal $state(status) "error"]} {
		# Something went wrong, so throw the exception, and the
		# enclosing catch will do cleanup.
		return -code error [lindex $state(error) 0]
	    }		
	}
    } err]} {
	# The socket probably was never connected,
	# or the connection dropped later.

	# Clean up after events and such, but DON'T call the command callback
	# (if available) because we're going to throw an exception from here
	# instead.

	Finish $token $err 1
	
	# if state(status) is error, it means someone's already called Finish
	# to do the above-described clean up.
	if {[string equal $state(status) "error"]} {
	    Finish $token $err 1
	}
	cleanup $token
	return -code error $err
    }

    return $token
}

497
498
499
500
501
502
503









504
505
506
507
508
509
510
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550







+
+
+
+
+
+
+
+
+







    }
}
proc http::size {token} {
    variable $token
    upvar 0 $token state
    return $state(currentsize)
}

proc http::error {token} {
    variable $token
    upvar 0 $token state
    if {[info exists state(error)]} {
	return $state(error)
    }
    return ""
}

# http::cleanup
#
#	Garbage collect the state associated with a transaction
#
# Arguments
#	token	The token returned from http::geturl
527
528
529
530
531
532
533
534

535
536
537
538
539

540
541
542

543
544
545
546
547
548




549
550
551
552
553
554
555
567
568
569
570
571
572
573

574
575
576
577
578

579



580

581
582



583
584
585
586
587
588
589
590
591
592
593







-
+




-
+
-
-
-
+
-


-
-
-
+
+
+
+







# Arguments
#	token	The token returned from http::geturl
#
# Side Effects
#	Sets the status of the connection, which unblocks
# 	the waiting geturl call

 proc http::Connect {token} {
proc http::Connect {token} {
    variable $token
    upvar 0 $token state
    global errorInfo errorCode
    if {[eof $state(sock)] ||
	    [string length [fconfigure $state(sock) -error]]} {
	[string length [fconfigure $state(sock) -error]]} {
	set state(status) error
	set state(error) [list \
		"connect failed [fconfigure $state(sock) -error]" \
	    Finish $token "connect failed [fconfigure $state(sock) -error]" 1
		$errorInfo $errorCode]
    } else {
	set state(status) connect
    }
    fileevent $state(sock) writable {}
 }
	fileevent $state(sock) writable {}
    }
    return
}

# http::Write
#
#	Write POST query data to the socket
#
# Arguments
#	token	The token for the connection
620
621
622
623
624
625
626
627

628
629
630
631
632
633
634
635
636
637
638
639

640
641


642
643
644
645
646









647
648



649
650
651
652
653
654
655
656


657
658
659



660
661
662
663
664
665
666
658
659
660
661
662
663
664

665
666
667
668
669
670
671
672
673
674
675
676
677
678
679

680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695


696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721







-
+












+

-
+
+





+
+
+
+
+
+
+
+
+
-
-
+
+
+








+
+



+
+
+







#
# Arguments
#	token	The token returned from http::geturl
#
# Side Effects
#	Read the socket and handle callbacks.

 proc http::Event {token} {
proc http::Event {token} {
    variable $token
    upvar 0 $token state
    set s $state(sock)

     if {[eof $s]} {
	Eof $token
	return
    }
    if {[string equal $state(state) "header"]} {
	if {[catch {gets $s line} n]} {
	    Finish $token $n
	} elseif {$n == 0} {
	    variable encodings
	    set state(state) body
	    if {![regexp -nocase ^text $state(type)]} {
	    if {$state(-binary) || ![regexp -nocase ^text $state(type)] || \
		    [regexp gzip|compress $state(coding)]} {
		# Turn off conversions for non-text data
		fconfigure $s -translation binary
		if {[info exists state(-channel)]} {
		    fconfigure $state(-channel) -translation binary
		}
	    } else {
		# If we are getting text, set the incoming channel's
		# encoding correctly.  iso8859-1 is the RFC default, but
		# this could be any IANA charset.  However, we only know
		# how to convert what we have encodings for.
		set idx [lsearch -exact $encodings \
			[string tolower $state(charset)]]
		if {$idx >= 0} {
		    fconfigure $s -encoding [lindex $encodings $idx]
	    }
	    if {[info exists state(-channel)] &&
		}
	    }
	    if {[info exists state(-channel)] && \
		    ![info exists state(-handler)]} {
		# Initiate a sequence of background fcopies
		fileevent $s readable {}
		CopyStart $s $token
	    }
	} elseif {$n > 0} {
	    if {[regexp -nocase {^content-type:(.+)$} $line x type]} {
		set state(type) [string trim $type]
		# grab the optional charset information
		regexp -nocase {charset\s*=\s*(\S+)} $type x state(charset)
	    }
	    if {[regexp -nocase {^content-length:(.+)$} $line x length]} {
		set state(totalsize) [string trim $length]
	    }
	    if {[regexp -nocase {^content-encoding:(.+)$} $line x coding]} {
		set state(coding) [string trim $coding]
	    }
	    if {[regexp -nocase {^([^:]+):(.+)$} $line x key value]} {
		lappend state(meta) $key [string trim $value]
	    } elseif {[regexp ^HTTP $line]} {
		set state(http) $line
	    }
	}
678
679
680
681
682
683
684

685

686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702

703
704
705
706
707
708
709
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







+
-
+
















-
+







	    if {$n >= 0} {
		incr state(currentsize) $n
	    }
	} err]} {
	    Finish $token $err
	} else {
	    if {[info exists state(-progress)]} {
		eval $state(-progress) \
		eval $state(-progress) {$token $state(totalsize) $state(currentsize)}
			{$token $state(totalsize) $state(currentsize)}
	    }
	}
    }
}

# http::CopyStart
#
#	Error handling wrapper around fcopy
#
# Arguments
#	s	The socket to copy from
#	token	The token returned from http::geturl
#
# Side Effects
#	This closes the connection upon error

 proc http::CopyStart {s token} {
proc http::CopyStart {s token} {
    variable $token
    upvar 0 $token state
    if {[catch {
	fcopy $s $state(-channel) -size $state(-blocksize) -command \
	    [list http::CopyDone $token]
    } err]} {
	Finish $token $err
717
718
719
720
721
722
723
724

725
726
727
728
729
730
731
773
774
775
776
777
778
779

780
781
782
783
784
785
786
787







-
+







# Arguments
#	token	The token returned from http::geturl
#	count	The amount transfered
#
# Side Effects
#	Invokes callbacks

 proc http::CopyDone {token count {error {}}} {
proc http::CopyDone {token count {error {}}} {
    variable $token
    upvar 0 $token state
    set s $state(sock)
    incr state(currentsize) $count
    if {[info exists state(-progress)]} {
	eval $state(-progress) {$token $state(totalsize) $state(currentsize)}
    }
745
746
747
748
749
750
751
752

753
754
755
756
757
758
759
801
802
803
804
805
806
807

808
809
810
811
812
813
814
815







-
+







#
# Arguments
#	token	The token returned from http::geturl
#
# Side Effects
#	Clean up the socket

 proc http::Eof {token} {
proc http::Eof {token} {
    variable $token
    upvar 0 $token state
    if {[string equal $state(state) "header"]} {
	# Premature eof
	set state(status) eof
    } else {
	set state(status) ok
776
777
778
779
780
781
782
783
784
785
786
787

788
789
790
791
792
793
794
832
833
834
835
836
837
838





839
840
841
842
843
844
845
846







-
-
-
-
-
+







    variable $token
    upvar 0 $token state

    if {![info exists state(status)] || [string length $state(status)] == 0} {
	# We must wait on the original variable name, not the upvar alias
	vwait $token\(status)
    }
    if {[info exists state(error)]} {
	set errorlist $state(error)
	unset state
	eval error $errorlist
    }

    return $state(status)
}

# http::formatQuery --
#
#	See documentaion for details.
#	Call http::formatQuery with an even number of arguments, where 
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
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







-
-
+
+

-
+















-
+

+







-

-
-

-
+











-
+


-
+
+



-
-


#        TODO

proc http::formatQuery {args} {
    set result ""
    set sep ""
    foreach i $args {
	append result $sep [mapReply $i]
	if {[string compare $sep "="]} {
	    set sep =
	if {[string equal $sep "="]} {
	    set sep &
	} else {
	    set sep &
	    set sep =
	}
    }
    return $result
}

# http::mapReply --
#
#	Do x-www-urlencoded character mapping
#
# Arguments:
#	string	The string the needs to be encoded
#
# Results:
#       The encoded string

 proc http::mapReply {string} {
proc http::mapReply {string} {
    variable formMap
    variable alphanumeric

    # The spec says: "non-alphanumeric characters are replaced by '%HH'"
    # 1 leave alphanumerics characters alone
    # 2 Convert every other character to an array lookup
    # 3 Escape constructs that are "special" to the tcl parser
    # 4 "subst" the result, doing all the array substitutions

    set alphanumeric	a-zA-Z0-9
    regsub -all \[^$alphanumeric\] $string {$formMap(&)} string
    regsub -all \n $string {\\n} string
    regsub -all \t $string {\\t} string
    regsub -all {[][{})\\]\)} $string {\\&} string
    return [subst $string]
    return [subst -nocommand $string]
}

# http::ProxyRequired --
#	Default proxy filter. 
#
# Arguments:
#	host	The destination host
#
# Results:
#       The current proxy settings

 proc http::ProxyRequired {host} {
proc http::ProxyRequired {host} {
    variable http
    if {[info exists http(-proxyhost)] && [string length $http(-proxyhost)]} {
	if {![info exists http(-proxyport)] || ![string length $http(-proxyport)]} {
	if {![info exists http(-proxyport)] || \
		![string length $http(-proxyport)]} {
	    set http(-proxyport) 8080
	}
	return [list $http(-proxyhost) $http(-proxyport)]
    } else {
	return {}
    }
}
Changes to library/http/pkgIndex.tcl.
1
2
3
4
5
6
7
8
9
10

11

1
2
3
4
5
6
7
8
9
10
11

12










+
-
+
# Tcl package index file, version 1.1
# This file is generated by the "pkg_mkIndex" command
# and sourced either when an application starts up or
# by a "package unknown" script.  It invokes the
# "package ifneeded" command to set up package-related
# information so that packages will be loaded automatically
# in response to "package require" commands.  When this
# script is sourced, the variable $dir must contain the
# full path name of this file's directory.

if {![package vsatisfies [package provide Tcl] 8.2]} {return}
package ifneeded http 2.3 [list tclPkgSetup $dir http 2.3 {{http.tcl source {::http::config ::http::formatQuery ::http::geturl ::http::reset ::http::wait ::http::register ::http::unregister}}}]
package ifneeded http 2.4.2 [list tclPkgSetup $dir http 2.4.2 {{http.tcl source {::http::config ::http::formatQuery ::http::geturl ::http::reset ::http::wait ::http::register ::http::unregister}}}]
Deleted library/http2.3/http.tcl.
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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
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
































































































































































































































































































































































































































































































































































































































































































































































































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# http.tcl --
#
#	Client-side HTTP for GET, POST, and HEAD commands.
#	These routines can be used in untrusted code that uses 
#	the Safesock security policy.  These procedures use a 
#	callback interface to avoid using vwait, which is not 
#	defined in the safe base.
#
# See the file "license.terms" for information on usage and
# redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: http.tcl,v 1.32 2000/04/22 07:07:59 sandeep Exp $

# Rough version history:
# 1.0	Old http_get interface
# 2.0	http:: namespace and http::geturl
# 2.1	Added callbacks to handle arriving data, and timeouts
# 2.2	Added ability to fetch into a channel
# 2.3	Added SSL support, and ability to post from a channel
#	This version also cleans up error cases and eliminates the
#	"ioerror" status in favor of raising an error

package provide http 2.3

namespace eval http {
    variable http
    array set http {
	-accept */*
	-proxyhost {}
	-proxyport {}
	-useragent {Tcl http client package 2.3}
	-proxyfilter http::ProxyRequired
    }

    variable formMap
    variable alphanumeric a-zA-Z0-9
    variable c
    variable i 0
    for {} {$i <= 256} {incr i} {
	set c [format %c $i]
	if {![string match \[$alphanumeric\] $c]} {
	    set formMap($c) %[format %.2x $i]
	}
    }
    # These are handled specially
    array set formMap {
	" " +   \n %0d%0a
    }

    variable urlTypes
    array set urlTypes {
	http	{80 ::socket}
    }

    namespace export geturl config reset wait formatQuery register unregister
    # Useful, but not exported: data size status code
}

# http::register --
#
#     See documentaion for details.
#
# Arguments:
#     proto           URL protocol prefix, e.g. https
#     port            Default port for protocol
#     command         Command to use to create socket
# Results:
#     list of port and command that was registered.

proc http::register {proto port command} {
    variable urlTypes
    set urlTypes($proto) [list $port $command]
}

# http::unregister --
#
#     Unregisters URL protocol handler
#
# Arguments:
#     proto           URL protocol prefix, e.g. https
# Results:
#     list of port and command that was unregistered.

proc http::unregister {proto} {
    variable urlTypes
    if {![info exists urlTypes($proto)]} {
	return -code error "unsupported url type \"$proto\""
    }
    set old $urlTypes($proto)
    unset urlTypes($proto)
    return $old
}

# http::config --
#
#	See documentaion for details.
#
# Arguments:
#	args		Options parsed by the procedure.
# Results:
#        TODO

proc http::config {args} {
    variable http
    set options [lsort [array names http -*]]
    set usage [join $options ", "]
    if {[llength $args] == 0} {
	set result {}
	foreach name $options {
	    lappend result $name $http($name)
	}
	return $result
    }
    regsub -all -- - $options {} options
    set pat ^-([join $options |])$
    if {[llength $args] == 1} {
	set flag [lindex $args 0]
	if {[regexp -- $pat $flag]} {
	    return $http($flag)
	} else {
	    return -code error "Unknown option $flag, must be: $usage"
	}
    } else {
	foreach {flag value} $args {
	    if {[regexp -- $pat $flag]} {
		set http($flag) $value
	    } else {
		return -code error "Unknown option $flag, must be: $usage"
	    }
	}
    }
}

# http::Finish --
#
#	Clean up the socket and eval close time callbacks
#
# Arguments:
#	token	    Connection token.
#	errormsg    (optional) If set, forces status to error.
#       skipCB      (optional) If set, don't call the -command callback.  This
#                   is useful when geturl wants to throw an exception instead
#                   of calling the callback.  That way, the same error isn't
#                   reported to two places.
#
# Side Effects:
#        Closes the socket

proc http::Finish { token {errormsg ""} {skipCB 0}} {
    variable $token
    upvar 0 $token state
    global errorInfo errorCode
    if {[string length $errormsg] != 0} {
	set state(error) [list $errormsg $errorInfo $errorCode]
	set state(status) error
    }
    catch {close $state(sock)}
    catch {after cancel $state(after)}
    if {[info exists state(-command)] && !$skipCB} {
	if {[catch {eval $state(-command) {$token}} err]} {
	    if {[string length $errormsg] == 0} {
		set state(error) [list $err $errorInfo $errorCode]
		set state(status) error
	    }
	}
	if {[info exist state(-command)]} {
	    # Command callback may already have unset our state
	    unset state(-command)
	}
    }
}

# http::reset --
#
#	See documentaion for details.
#
# Arguments:
#	token	Connection token.
#	why	Status info.
#
# Side Effects:
#       See Finish

proc http::reset { token {why reset} } {
    variable $token
    upvar 0 $token state
    set state(status) $why
    catch {fileevent $state(sock) readable {}}
    catch {fileevent $state(sock) writable {}}
    Finish $token
    if {[info exists state(error)]} {
	set errorlist $state(error)
	unset state
	eval error $errorlist
    }
}

# http::geturl --
#
#	Establishes a connection to a remote url via http.
#
# Arguments:
#       url		The http URL to goget.
#       args		Option value pairs. Valid options include:
#				-blocksize, -validate, -headers, -timeout
# Results:
#	Returns a token for this connection.
#	This token is the name of an array that the caller should
#	unset to garbage collect the state.

proc http::geturl { url args } {
    variable http
    variable urlTypes

    # Initialize the state variable, an array.  We'll return the
    # name of this array as the token for the transaction.

    if {![info exists http(uid)]} {
	set http(uid) 0
    }
    set token [namespace current]::[incr http(uid)]
    variable $token
    upvar 0 $token state
    reset $token

    # Process command options.

    array set state {
	-blocksize 	8192
	-queryblocksize 8192
	-validate 	0
	-headers 	{}
	-timeout 	0
	-type           application/x-www-form-urlencoded
	-queryprogress	{}
	state		header
	meta		{}
	currentsize	0
	totalsize	0
	querylength	0
	queryoffset	0
        type            text/html
        body            {}
	status		""
	http            ""
    }
    set options {-blocksize -channel -command -handler -headers \
	    -progress -query -queryblocksize -querychannel -queryprogress\
	    -validate -timeout -type}
    set usage [join $options ", "]
    regsub -all -- - $options {} options
    set pat ^-([join $options |])$
    foreach {flag value} $args {
	if {[regexp $pat $flag]} {
	    # Validate numbers
	    if {[info exists state($flag)] && \
		    [string is integer -strict $state($flag)] && \
		    ![string is integer -strict $value]} {
		unset $token
		return -code error "Bad value for $flag ($value), must be integer"
	    }
	    set state($flag) $value
	} else {
	    unset $token
	    return -code error "Unknown option $flag, can be: $usage"
	}
    }

    # Make sure -query and -querychannel aren't both specified

    set isQueryChannel [info exists state(-querychannel)]
    set isQuery [info exists state(-query)]
    if {$isQuery && $isQueryChannel} {
	unset $token
	return -code error "Can't combine -query and -querychannel options!"
    }

    # Validate URL, determine the server host and port, and check proxy case

    if {![regexp -nocase {^(([^:]*)://)?([^/:]+)(:([0-9]+))?(/.*)?$} $url \
	    x prefix proto host y port srvurl]} {
	unset $token
	error "Unsupported URL: $url"
    }
    if {[string length $proto] == 0} {
	set proto http
	set url ${proto}://$url
    }
    if {![info exists urlTypes($proto)]} {
	unset $token
	return -code error "unsupported url type \"$proto\""
    }
    set defport [lindex $urlTypes($proto) 0]
    set defcmd [lindex $urlTypes($proto) 1]

    if {[string length $port] == 0} {
	set port $defport
    }
    if {[string length $srvurl] == 0} {
	set srvurl /
    }
    if {[string length $proto] == 0} {
	set url http://$url
    }
    set state(url) $url
    if {![catch {$http(-proxyfilter) $host} proxy]} {
	set phost [lindex $proxy 0]
	set pport [lindex $proxy 1]
    }

    # If a timeout is specified we set up the after event
    # and arrange for an asynchronous socket connection.

    if {$state(-timeout) > 0} {
	set state(after) [after $state(-timeout) \
		[list http::reset $token timeout]]
	set async -async
    } else {
	set async ""
    }

    # If we are using the proxy, we must pass in the full URL that
    # includes the server name.

    if {[info exists phost] && [string length $phost]} {
	set srvurl $url
	set conStat [catch {eval $defcmd $async {$phost $pport}} s]
    } else {
	set conStat [catch {eval $defcmd $async {$host $port}} s]
    }
    if {$conStat} {

	# something went wrong while trying to establish the connection
	# Clean up after events and such, but DON'T call the command callback
	# (if available) because we're going to throw an exception from here
	# instead.
	Finish $token "" 1
	cleanup $token
	return -code error $s
    }
    set state(sock) $s

    # Wait for the connection to complete

    if {$state(-timeout) > 0} {
	fileevent $s writable [list http::Connect $token]
	http::wait $token
	if {$state(status) != "connect"} {
	    
	    # Likely to be connection timeout.  If there was a connection
	    # error, (e.g., bad port), then http::wait will have 
	    # raised an error already

	    return $token
	}
	set state(status) ""
    }

    # Send data in cr-lf format, but accept any line terminators

    fconfigure $s -translation {auto crlf} -buffersize $state(-blocksize)

    # The following is disallowed in safe interpreters, but the socket
    # is already in non-blocking mode in that case.

    catch {fconfigure $s -blocking off}
    set how GET
    if {$isQuery} {
	set state(querylength) [string length $state(-query)]
	if {$state(querylength) > 0} {
	    set how POST
	    set contDone 0
	} else {
	    # there's no query data
	    unset state(-query)
	    set isQuery 0
	}
    } elseif {$state(-validate)} {
	set how HEAD
    } elseif {$isQueryChannel} {
	set how POST
	# The query channel must be blocking for the async Write to
	# work properly.
	fconfigure $state(-querychannel) -blocking 1 -translation binary
	set contDone 0
    }

    if {[catch {
	puts $s "$how $srvurl HTTP/1.0"
	puts $s "Accept: $http(-accept)"
	puts $s "Host: $host"
	puts $s "User-Agent: $http(-useragent)"
	foreach {key value} $state(-headers) {
	    regsub -all \[\n\r\]  $value {} value
	    set key [string trim $key]
	    if {[string equal $key "Content-Length"]} {
		set contDone 1
		set state(querylength) $value
	    }
	    if {[string length $key]} {
		puts $s "$key: $value"
	    }
	}
	if {$isQueryChannel && $state(querylength) == 0} {
	    # Try to determine size of data in channel
	    # If we cannot seek, the surrounding catch will trap us

	    set start [tell $state(-querychannel)]
	    seek $state(-querychannel) 0 end
	    set state(querylength) \
		    [expr {[tell $state(-querychannel)] - $start}]
	    seek $state(-querychannel) $start
	}

	# Flush the request header and set up the fileevent that will
	# either push the POST data or read the response.
	#
	# fileevent note:
	#
	# It is possible to have both the read and write fileevents active
	# at this point.  The only scenario it seems to affect is a server
	# that closes the connection without reading the POST data.
	# (e.g., early versions TclHttpd in various error cases).
	# Depending on the platform, the client may or may not be able to
	# get the response from the server because of the error it will
	# get trying to write the post data.  Having both fileevents active
	# changes the timing and the behavior, but no two platforms
	# (among Solaris, Linux, and NT)  behave the same, and none 
	# behave all that well in any case.  Servers should always read thier
	# POST data if they expect the client to read their response.
		
	if {$isQuery || $isQueryChannel} {
	    puts $s "Content-Type: $state(-type)"
	    if {!$contDone} {
		puts $s "Content-Length: $state(querylength)"
	    }
	    puts $s ""
	    fconfigure $s -translation {auto binary}
	    fileevent $s writable [list http::Write $token]
	} else {
	    puts $s ""
	    flush $s
	    fileevent $s readable [list http::Event $token]
	}

	if {! [info exists state(-command)]} {

	    # geturl does EVERYTHING asynchronously, so if the user
	    # calls it synchronously, we just do a wait here.

	    wait $token
	}
    } err]} {
	# The socket probably was never connected,
	# or the connection dropped later.

	# Clean up after events and such, but DON'T call the command callback
	# (if available) because we're going to throw an exception from here
	# instead.

	Finish $token $err 1
	cleanup $token
	return -code error $err
    }

    return $token
}

# Data access functions:
# Data - the URL data
# Status - the transaction status: ok, reset, eof, timeout
# Code - the HTTP transaction code, e.g., 200
# Size - the size of the URL data

proc http::data {token} {
    variable $token
    upvar 0 $token state
    return $state(body)
}
proc http::status {token} {
    variable $token
    upvar 0 $token state
    return $state(status)
}
proc http::code {token} {
    variable $token
    upvar 0 $token state
    return $state(http)
}
proc http::ncode {token} {
    variable $token
    upvar 0 $token state
    if {[regexp {[0-9]{3}} $state(http) numeric_code]} {
	return $numeric_code
    } else {
	return $state(http)
    }
}
proc http::size {token} {
    variable $token
    upvar 0 $token state
    return $state(currentsize)
}

# http::cleanup
#
#	Garbage collect the state associated with a transaction
#
# Arguments
#	token	The token returned from http::geturl
#
# Side Effects
#	unsets the state array

proc http::cleanup {token} {
    variable $token
    upvar 0 $token state
    if {[info exist state]} {
	unset state
    }
}

# http::Connect
#
#	This callback is made when an asyncronous connection completes.
#
# Arguments
#	token	The token returned from http::geturl
#
# Side Effects
#	Sets the status of the connection, which unblocks
# 	the waiting geturl call

 proc http::Connect {token} {
    variable $token
    upvar 0 $token state
    global errorInfo errorCode
    if {[eof $state(sock)] ||
	    [string length [fconfigure $state(sock) -error]]} {
	set state(status) error
	set state(error) [list \
		"connect failed [fconfigure $state(sock) -error]" \
		$errorInfo $errorCode]
    } else {
	set state(status) connect
    }
    fileevent $state(sock) writable {}
 }

# http::Write
#
#	Write POST query data to the socket
#
# Arguments
#	token	The token for the connection
#
# Side Effects
#	Write the socket and handle callbacks.

proc http::Write {token} {
    variable $token
    upvar 0 $token state
    set s $state(sock)
    
    # Output a block.  Tcl will buffer this if the socket blocks
    
    set done 0
    if {[catch {
	
	# Catch I/O errors on dead sockets

	if {[info exists state(-query)]} {
	    
	    # Chop up large query strings so queryprogress callback
	    # can give smooth feedback

	    puts -nonewline $s \
		    [string range $state(-query) $state(queryoffset) \
		    [expr {$state(queryoffset) + $state(-queryblocksize) - 1}]]
	    incr state(queryoffset) $state(-queryblocksize)
	    if {$state(queryoffset) >= $state(querylength)} {
		set state(queryoffset) $state(querylength)
		set done 1
	    }
	} else {
	    
	    # Copy blocks from the query channel

	    set outStr [read $state(-querychannel) $state(-queryblocksize)]
	    puts -nonewline $s $outStr
	    incr state(queryoffset) [string length $outStr]
	    if {[eof $state(-querychannel)]} {
		set done 1
	    }
	}
    } err]} {
	# Do not call Finish here, but instead let the read half of
	# the socket process whatever server reply there is to get.

	set state(posterror) $err
	set done 1
    }
    if {$done} {
	catch {flush $s}
	fileevent $s writable {}
	fileevent $s readable [list http::Event $token]
    }

    # Callback to the client after we've completely handled everything

    if {[string length $state(-queryprogress)]} {
	eval $state(-queryprogress) [list $token $state(querylength)\
		$state(queryoffset)]
    }
}

# http::Event
#
#	Handle input on the socket
#
# Arguments
#	token	The token returned from http::geturl
#
# Side Effects
#	Read the socket and handle callbacks.

 proc http::Event {token} {
    variable $token
    upvar 0 $token state
    set s $state(sock)

     if {[eof $s]} {
	Eof $token
	return
    }
    if {[string equal $state(state) "header"]} {
	if {[catch {gets $s line} n]} {
	    Finish $token $n
	} elseif {$n == 0} {
	    set state(state) body
	    if {![regexp -nocase ^text $state(type)]} {
		# Turn off conversions for non-text data
		fconfigure $s -translation binary
		if {[info exists state(-channel)]} {
		    fconfigure $state(-channel) -translation binary
		}
	    }
	    if {[info exists state(-channel)] &&
		    ![info exists state(-handler)]} {
		# Initiate a sequence of background fcopies
		fileevent $s readable {}
		CopyStart $s $token
	    }
	} elseif {$n > 0} {
	    if {[regexp -nocase {^content-type:(.+)$} $line x type]} {
		set state(type) [string trim $type]
	    }
	    if {[regexp -nocase {^content-length:(.+)$} $line x length]} {
		set state(totalsize) [string trim $length]
	    }
	    if {[regexp -nocase {^([^:]+):(.+)$} $line x key value]} {
		lappend state(meta) $key [string trim $value]
	    } elseif {[regexp ^HTTP $line]} {
		set state(http) $line
	    }
	}
    } else {
	if {[catch {
	    if {[info exists state(-handler)]} {
		set n [eval $state(-handler) {$s $token}]
	    } else {
		set block [read $s $state(-blocksize)]
		set n [string length $block]
		if {$n >= 0} {
		    append state(body) $block
		}
	    }
	    if {$n >= 0} {
		incr state(currentsize) $n
	    }
	} err]} {
	    Finish $token $err
	} else {
	    if {[info exists state(-progress)]} {
		eval $state(-progress) {$token $state(totalsize) $state(currentsize)}
	    }
	}
    }
}

# http::CopyStart
#
#	Error handling wrapper around fcopy
#
# Arguments
#	s	The socket to copy from
#	token	The token returned from http::geturl
#
# Side Effects
#	This closes the connection upon error

 proc http::CopyStart {s token} {
    variable $token
    upvar 0 $token state
    if {[catch {
	fcopy $s $state(-channel) -size $state(-blocksize) -command \
	    [list http::CopyDone $token]
    } err]} {
	Finish $token $err
    }
}

# http::CopyDone
#
#	fcopy completion callback
#
# Arguments
#	token	The token returned from http::geturl
#	count	The amount transfered
#
# Side Effects
#	Invokes callbacks

 proc http::CopyDone {token count {error {}}} {
    variable $token
    upvar 0 $token state
    set s $state(sock)
    incr state(currentsize) $count
    if {[info exists state(-progress)]} {
	eval $state(-progress) {$token $state(totalsize) $state(currentsize)}
    }
    # At this point the token may have been reset
    if {[string length $error]} {
	Finish $token $error
    } elseif {[catch {eof $s} iseof] || $iseof} {
	Eof $token
    } else {
	CopyStart $s $token
    }
}

# http::Eof
#
#	Handle eof on the socket
#
# Arguments
#	token	The token returned from http::geturl
#
# Side Effects
#	Clean up the socket

 proc http::Eof {token} {
    variable $token
    upvar 0 $token state
    if {[string equal $state(state) "header"]} {
	# Premature eof
	set state(status) eof
    } else {
	set state(status) ok
    }
    set state(state) eof
    Finish $token
}

# http::wait --
#
#	See documentaion for details.
#
# Arguments:
#	token	Connection token.
#
# Results:
#        The status after the wait.

proc http::wait {token} {
    variable $token
    upvar 0 $token state

    if {![info exists state(status)] || [string length $state(status)] == 0} {
	# We must wait on the original variable name, not the upvar alias
	vwait $token\(status)
    }
    if {[info exists state(error)]} {
	set errorlist $state(error)
	unset state
	eval error $errorlist
    }
    return $state(status)
}

# http::formatQuery --
#
#	See documentaion for details.
#	Call http::formatQuery with an even number of arguments, where 
#	the first is a name, the second is a value, the third is another 
#	name, and so on.
#
# Arguments:
#	args	A list of name-value pairs.
#
# Results:
#        TODO

proc http::formatQuery {args} {
    set result ""
    set sep ""
    foreach i $args {
	append result $sep [mapReply $i]
	if {[string compare $sep "="]} {
	    set sep =
	} else {
	    set sep &
	}
    }
    return $result
}

# http::mapReply --
#
#	Do x-www-urlencoded character mapping
#
# Arguments:
#	string	The string the needs to be encoded
#
# Results:
#       The encoded string

 proc http::mapReply {string} {
    variable formMap

    # The spec says: "non-alphanumeric characters are replaced by '%HH'"
    # 1 leave alphanumerics characters alone
    # 2 Convert every other character to an array lookup
    # 3 Escape constructs that are "special" to the tcl parser
    # 4 "subst" the result, doing all the array substitutions

    set alphanumeric	a-zA-Z0-9
    regsub -all \[^$alphanumeric\] $string {$formMap(&)} string
    regsub -all \n $string {\\n} string
    regsub -all \t $string {\\t} string
    regsub -all {[][{})\\]\)} $string {\\&} string
    return [subst $string]
}

# http::ProxyRequired --
#	Default proxy filter. 
#
# Arguments:
#	host	The destination host
#
# Results:
#       The current proxy settings

 proc http::ProxyRequired {host} {
    variable http
    if {[info exists http(-proxyhost)] && [string length $http(-proxyhost)]} {
	if {![info exists http(-proxyport)] || ![string length $http(-proxyport)]} {
	    set http(-proxyport) 8080
	}
	return [list $http(-proxyhost) $http(-proxyport)]
    } else {
	return {}
    }
}
Deleted library/http2.3/pkgIndex.tcl.
1
2
3
4
5
6
7
8
9
10
11











-
-
-
-
-
-
-
-
-
-
-
# Tcl package index file, version 1.1
# This file is generated by the "pkg_mkIndex" command
# and sourced either when an application starts up or
# by a "package unknown" script.  It invokes the
# "package ifneeded" command to set up package-related
# information so that packages will be loaded automatically
# in response to "package require" commands.  When this
# script is sourced, the variable $dir must contain the
# full path name of this file's directory.

package ifneeded http 2.3 [list tclPkgSetup $dir http 2.3 {{http.tcl source {::http::config ::http::formatQuery ::http::geturl ::http::reset ::http::wait ::http::register ::http::unregister}}}]
Changes to library/init.tcl.
1
2
3
4
5
6

7
8
9
10
11
12
13
1
2
3
4
5

6
7
8
9
10
11
12
13





-
+







# init.tcl --
#
# Default system startup file for Tcl-based applications.  Defines
# "unknown" procedure and auto-load facilities.
#
# RCS: @(#) $Id: init.tcl,v 1.39 2000/02/01 19:26:08 ericm Exp $
# RCS: @(#) $Id: init.tcl,v 1.39.2.4 2001/12/29 00:54:26 hobbs Exp $
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1994-1996 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
161
162
163
164
165
166
167
168

169
170
171
172
173
174
175
161
162
163
164
165
166
167

168
169
170
171
172
173
174
175







-
+








    # If the command word has the form "namespace inscope ns cmd"
    # then concatenate its arguments onto the end and evaluate it.

    set cmd [lindex $args 0]
    if {[regexp "^namespace\[ \t\n\]+inscope" $cmd] && [llength $cmd] == 4} {
        set arglist [lrange $args 1 end]
	set ret [catch {uplevel $cmd $arglist} result]
	set ret [catch {uplevel 1 ::$cmd $arglist} result]
        if {$ret == 0} {
            return $result
        } else {
	    return -code $ret -errorcode $errorCode $result
        }
    }

184
185
186
187
188
189
190
191

192
193
194
195
196
197
198
184
185
186
187
188
189
190

191
192
193
194
195
196
197
198







-
+







	#
	# Make sure we're not trying to load the same proc twice.
	#
	if {[info exists unknown_pending($name)]} {
	    return -code error "self-referential recursion in \"unknown\" for command \"$name\"";
	}
	set unknown_pending($name) pending;
	set ret [catch {auto_load $name [uplevel 1 {namespace current}]} msg]
	set ret [catch {auto_load $name [uplevel 1 {::namespace current}]} msg]
	unset unknown_pending($name);
	if {$ret != 0} {
	    append errorInfo "\n    (autoloading \"$name\")"
	    return -code $ret -errorcode $errorCode -errorinfo $errorInfo $msg
	}
	if {![array size unknown_pending]} {
	    unset unknown_pending
224
225
226
227
228
229
230
231

232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247

248
249
250
251
252
253
254
255
256
257
258
259

260
261
262
263
264
265
266
224
225
226
227
228
229
230

231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246

247
248
249
250
251
252
253
254
255
256
257
258

259
260
261
262
263
264
265
266







-
+















-
+











-
+







	    if {[string compare {} $new]} {
		set errorCode $savedErrorCode
		set errorInfo $savedErrorInfo
		set redir ""
		if {[string equal [info commands console] ""]} {
		    set redir ">&@stdout <@stdin"
		}
		return [uplevel exec $redir $new [lrange $args 1 end]]
		return [uplevel 1 exec $redir $new [lrange $args 1 end]]
	    }
	}
	set errorCode $savedErrorCode
	set errorInfo $savedErrorInfo
	if {[string equal $name "!!"]} {
	    set newcmd [history event]
	} elseif {[regexp {^!(.+)$} $name dummy event]} {
	    set newcmd [history event $event]
	} elseif {[regexp {^\^([^^]*)\^([^^]*)\^?$} $name dummy old new]} {
	    set newcmd [history event -1]
	    catch {regsub -all -- $old $newcmd $new newcmd}
	}
	if {[info exists newcmd]} {
	    tclLog $newcmd
	    history change $newcmd 0
	    return [uplevel $newcmd]
	    return [uplevel 1 $newcmd]
	}

	set ret [catch {set cmds [info commands $name*]} msg]
	if {[string equal $name "::"]} {
	    set name ""
	}
	if {$ret != 0} {
	    return -code $ret -errorcode $errorCode \
		"error in unknown while checking if \"$name\" is a unique command abbreviation: $msg"
	}
	if {[llength $cmds] == 1} {
	    return [uplevel [lreplace $args 0 0 $cmds]]
	    return [uplevel 1 [lreplace $args 0 0 $cmds]]
	}
	if {[llength $cmds]} {
	    if {[string equal $name ""]} {
		return -code error "empty command name \"\""
	    } else {
		return -code error \
			"ambiguous command name \"$name\": [lsort $cmds]"
282
283
284
285
286
287
288
289

290
291
292
293
294
295
296
282
283
284
285
286
287
288

289
290
291
292
293
294
295
296







-
+







#                       a canonical namespace as returned [namespace current]
#                       for instance. If not given, namespace current is used.

proc auto_load {cmd {namespace {}}} {
    global auto_index auto_oldpath auto_path

    if {[string length $namespace] == 0} {
	set namespace [uplevel {namespace current}]
	set namespace [uplevel 1 [list ::namespace current]]
    }
    set nameList [auto_qualify $cmd $namespace]
    # workaround non canonical auto_index entries that might be around
    # from older auto_mkindex versions
    lappend nameList $cmd
    foreach name $nameList {
	if {[info exists auto_index($name)]} {
451
452
453
454
455
456
457






458

459
460
461
462
463
464

465
466



467
468
469
470
471
472
473
451
452
453
454
455
456
457
458
459
460
461
462
463

464
465
466
467
468
469

470


471
472
473
474
475
476
477
478
479
480







+
+
+
+
+
+
-
+





-
+
-
-
+
+
+







# Arguments -
# pattern	The pattern of commands being imported (like "foo::*")
#               a canonical namespace as returned by [namespace current]

proc auto_import {pattern} {
    global auto_index

    # If no namespace is specified, this will be an error case

    if {![string match *::* $pattern]} {
	return
    }

    set ns [uplevel namespace current]
    set ns [uplevel 1 [list ::namespace current]]
    set patternList [auto_qualify $pattern $ns]

    auto_load_index

    foreach pattern $patternList {
        foreach name [array names auto_index] {
        foreach name [array names auto_index $pattern] {
            if {[string match $pattern $name] && \
		    [string equal "" [info commands $name]]} {
            if {[string equal "" [info commands $name]]
		    && [string equal [namespace qualifiers $pattern] \
				     [namespace qualifiers $name]]} {
                uplevel #0 $auto_index($name)
            }
        }
    }
}

# auto_execok --
499
500
501
502
503
504
505





506


507







508

509
510
511
512

513
514
515
516
517
518
519
506
507
508
509
510
511
512
513
514
515
516
517

518
519
520
521
522
523
524
525
526
527

528
529
530
531

532
533
534
535
536
537
538
539







+
+
+
+
+
-
+
+

+
+
+
+
+
+
+
-
+



-
+








    set shellBuiltins [list cls copy date del erase dir echo mkdir \
	    md rename ren rmdir rd time type ver vol]
    if {[string equal $tcl_platform(os) "Windows NT"]} {
	# NT includes the 'start' built-in
	lappend shellBuiltins "start"
    }
    if {[info exists env(PATHEXT)]} {
	# Add an initial ; to have the {} extension check first.
	set execExtensions [split ";$env(PATHEXT)" ";"]
    } else {
	set execExtensions [list {} .com .exe .bat]

    }

    if {[lsearch -exact $shellBuiltins $name] != -1} {
	# When this is command.com for some reason on Win2K, Tcl won't
	# exec it unless the case is right, which this corrects.  COMSPEC
	# may not point to a real file, so do the check.
	set cmd $env(COMSPEC)
	if {[file exists $cmd]} {
	    set cmd [file attributes $cmd -shortname]
	}
	return [set auto_execs($name) [list $env(COMSPEC) /c $name]]
	return [set auto_execs($name) [list $cmd /c $name]]
    }

    if {[llength [file split $name]] != 1} {
	foreach ext {{} .com .exe .bat} {
	foreach ext $execExtensions {
	    set file ${name}${ext}
	    if {[file exists $file] && ![file isdirectory $file]} {
		return [set auto_execs($name) [list $file]]
	    }
	}
	return ""
    }
535
536
537
538
539
540
541
542

543
544
545
546
547
548
549
555
556
557
558
559
560
561

562
563
564
565
566
567
568
569







-
+







	}
    }

    foreach dir [split $path {;}] {
	# Skip already checked directories
	if {[info exists checked($dir)] || [string equal {} $dir]} { continue }
	set checked($dir) {}
	foreach ext {{} .com .exe .bat} {
	foreach ext $execExtensions {
	    set file [file join $dir ${name}${ext}]
	    if {[file exists $file] && ![file isdirectory $file]} {
		return [set auto_execs($name) [list $file]]
	    }
	}
    }
    return ""
Changes to library/msgcat/msgcat.tcl.
1
2
3
4
5
6
7
8
9
10
11
12
13

14

15

16
17
18
19
20
21
22
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15

16
17
18
19
20
21
22
23












-
+

+
-
+







# msgcat.tcl --
#
#	This file defines various procedures which implement a
#	message catalog facility for Tcl programs.  It should be
#	loaded with the command "package require msgcat".
#
# Copyright (c) 1998 by Scriptics Corporation.
# Copyright (c) 1998 by Mark Harrison.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
# 
# RCS: @(#) $Id: msgcat.tcl,v 1.4 2000/04/11 21:16:18 ericm Exp $
# RCS: @(#) $Id: msgcat.tcl,v 1.4.2.4 2001/08/09 01:00:56 dgp Exp $

package require Tcl 8.2
package provide msgcat 1.0
package provide msgcat 1.1.1

namespace eval msgcat {
    namespace export mc mcset mclocale mcpreferences mcunknown

    # Records the current locale as passed to mclocale
    variable locale ""

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
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







-
+
















-
-
+
+







#	Returns the translatd string.  Propagates errors thrown by the 
#	format command.

proc msgcat::mc {src args} {
    # Check for the src in each namespace starting from the local and
    # ending in the global.

    set ns [uplevel {namespace current}]
    set ns [uplevel 1 [list ::namespace current]]
    
    while {$ns != ""} {
	foreach loc $::msgcat::loclist {
	    if {[info exists ::msgcat::msgs($loc,$ns,$src)]} {
		if {[llength $args] == 0} {
		    return $::msgcat::msgs($loc,$ns,$src)
		} else {
		    return [eval \
			    [list format $::msgcat::msgs($loc,$ns,$src)] \
			    $args]
		}
	    }
	}
	set ns [namespace parent $ns]
    }
    # we have not found the translation
    return [uplevel 1 [list [namespace origin mcunknown] \
	    $::msgcat::locale $src]]
    return [uplevel 1 [list [::namespace origin mcunknown] \
	    $::msgcat::locale $src] $args]
}

# msgcat::mclocale --
#
#	Query or set the current locale.
#
# Arguments:
130
131
132
133
134
135
136
137




138
139
140
141
142
143
144
131
132
133
134
135
136
137

138
139
140
141
142
143
144
145
146
147
148







-
+
+
+
+








proc msgcat::mcload {langdir} {
    set x 0
    foreach p [::msgcat::mcpreferences] {
	set langfile [file join $langdir $p.msg]
	if {[file exists $langfile]} {
	    incr x
	    uplevel [list source $langfile]
            set fid [open $langfile "r"]
            fconfigure $fid -encoding utf-8
            uplevel 1 [read $fid]
            close $fid
	}
    }
    return $x
}

# msgcat::mcset --
#
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
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







-
+











+
+




+




-
-
+
+
+
+
+
+












#	Returns the new locale.

proc msgcat::mcset {locale src {dest ""}} {
    if {[string equal $dest ""]} {
	set dest $src
    }

    set ns [uplevel {namespace current}]
    set ns [uplevel 1 [list ::namespace current]]

    set ::msgcat::msgs([string tolower $locale],$ns,$src) $dest
    return $dest
}

# msgcat::mcunknown --
#
#	This routine is called by msgcat::mc if a translation cannot
#	be found for a string.  This routine is intended to be replaced
#	by an application specific routine for error reporting
#	purposes.  The default behavior is to return the source string.  
#	If additional args are specified, the format command will be used
#	to work them into the traslated string.
#
# Arguments:
#	locale		The current locale.
#	src		The string to be translated.
#	args		Args to pass to the format command
#
# Results:
#	Returns the translated value.

proc msgcat::mcunknown {locale src} {
    return $src
proc msgcat::mcunknown {locale src args} {
    if {[llength $args]} {
	return [eval [list format $src] $args]
    } else {
	return $src
    }
}

# Initialize the default locale

namespace eval msgcat {
    # set default locale, try to get from environment
    if {[info exists ::env(LANG)]} {
        mclocale $::env(LANG)
    } else {
        mclocale "C"
    }
}
Changes to library/msgcat/pkgIndex.tcl.

1

1

2
+
-
+
if {![package vsatisfies [package provide Tcl] 8.2]} {return}
package ifneeded msgcat 1.0 [list source [file join $dir msgcat.tcl]]
package ifneeded msgcat 1.1.1 [list source [file join $dir msgcat.tcl]]
Deleted library/msgcat1.0/msgcat.tcl.
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


































































































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# msgcat.tcl --
#
#	This file defines various procedures which implement a
#	message catalog facility for Tcl programs.  It should be
#	loaded with the command "package require msgcat".
#
# Copyright (c) 1998 by Scriptics Corporation.
# Copyright (c) 1998 by Mark Harrison.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
# 
# RCS: @(#) $Id: msgcat.tcl,v 1.4 2000/04/11 21:16:18 ericm Exp $

package provide msgcat 1.0

namespace eval msgcat {
    namespace export mc mcset mclocale mcpreferences mcunknown

    # Records the current locale as passed to mclocale
    variable locale ""

    # Records the list of locales to search
    variable loclist {}

    # Records the mapping between source strings and translated strings.  The
    # array key is of the form "<locale>,<namespace>,<src>" and the value is
    # the translated string.
    array set msgs {}
}

# msgcat::mc --
#
#	Find the translation for the given string based on the current
#	locale setting. Check the local namespace first, then look in each
#	parent namespace until the source is found.  If additional args are
#	specified, use the format command to work them into the traslated
#	string.
#
# Arguments:
#	src	The string to translate.
#	args	Args to pass to the format command
#
# Results:
#	Returns the translatd string.  Propagates errors thrown by the 
#	format command.

proc msgcat::mc {src args} {
    # Check for the src in each namespace starting from the local and
    # ending in the global.

    set ns [uplevel {namespace current}]
    
    while {$ns != ""} {
	foreach loc $::msgcat::loclist {
	    if {[info exists ::msgcat::msgs($loc,$ns,$src)]} {
		if {[llength $args] == 0} {
		    return $::msgcat::msgs($loc,$ns,$src)
		} else {
		    return [eval \
			    [list format $::msgcat::msgs($loc,$ns,$src)] \
			    $args]
		}
	    }
	}
	set ns [namespace parent $ns]
    }
    # we have not found the translation
    return [uplevel 1 [list [namespace origin mcunknown] \
	    $::msgcat::locale $src]]
}

# msgcat::mclocale --
#
#	Query or set the current locale.
#
# Arguments:
#	newLocale	(Optional) The new locale string. Locale strings
#			should be composed of one or more sublocale parts
#			separated by underscores (e.g. en_US).
#
# Results:
#	Returns the current locale.

proc msgcat::mclocale {args} {
    set len [llength $args]

    if {$len > 1} {
	error {wrong # args: should be "mclocale ?newLocale?"}
    }

    set args [string tolower $args]
    if {$len == 1} {
	set ::msgcat::locale $args
	set ::msgcat::loclist {}
	set word ""
	foreach part [split $args _] {
	    set word [string trimleft "${word}_${part}" _]
	    set ::msgcat::loclist [linsert $::msgcat::loclist 0 $word]
	}
    }
    return $::msgcat::locale
}

# msgcat::mcpreferences --
#
#	Fetch the list of locales used to look up strings, ordered from
#	most preferred to least preferred.
#
# Arguments:
#	None.
#
# Results:
#	Returns an ordered list of the locales preferred by the user.

proc msgcat::mcpreferences {} {
    return $::msgcat::loclist
}

# msgcat::mcload --
#
#	Attempt to load message catalogs for each locale in the
#	preference list from the specified directory.
#
# Arguments:
#	langdir		The directory to search.
#
# Results:
#	Returns the number of message catalogs that were loaded.

proc msgcat::mcload {langdir} {
    set x 0
    foreach p [::msgcat::mcpreferences] {
	set langfile [file join $langdir $p.msg]
	if {[file exists $langfile]} {
	    incr x
	    uplevel [list source $langfile]
	}
    }
    return $x
}

# msgcat::mcset --
#
#	Set the translation for a given string in a specified locale.
#
# Arguments:
#	locale		The locale to use.
#	src		The source string.
#	dest		(Optional) The translated string.  If omitted,
#			the source string is used.
#
# Results:
#	Returns the new locale.

proc msgcat::mcset {locale src {dest ""}} {
    if {[string equal $dest ""]} {
	set dest $src
    }

    set ns [uplevel {namespace current}]

    set ::msgcat::msgs([string tolower $locale],$ns,$src) $dest
    return $dest
}

# msgcat::mcunknown --
#
#	This routine is called by msgcat::mc if a translation cannot
#	be found for a string.  This routine is intended to be replaced
#	by an application specific routine for error reporting
#	purposes.  The default behavior is to return the source string.  
#
# Arguments:
#	locale		The current locale.
#	src		The string to be translated.
#
# Results:
#	Returns the translated value.

proc msgcat::mcunknown {locale src} {
    return $src
}

# Initialize the default locale

namespace eval msgcat {
    # set default locale, try to get from environment
    if {[info exists ::env(LANG)]} {
        mclocale $::env(LANG)
    } else {
        mclocale "C"
    }
}
Deleted library/msgcat1.0/pkgIndex.tcl.
1

-
package ifneeded msgcat 1.0 [list source [file join $dir msgcat.tcl]]
Changes to library/opt/optparse.tcl.
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
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










-
+

+
-
+







-
+







# optparse.tcl --
#
#       (private) Option parsing package
#       Primarily used internally by the safe:: code.
#
#	WARNING: This code will go away in a future release
#	of Tcl.  It is NOT supported and you should not rely
#	on it.  If your code does rely on this package you
#	may directly incorporate this code into your application.
#
# RCS: @(#) $Id: optparse.tcl,v 1.2 1999/04/16 00:47:18 stanton Exp $
# RCS: @(#) $Id: optparse.tcl,v 1.2.12.3 2001/08/09 01:00:56 dgp Exp $

package require Tcl 8
package provide opt 0.4.1
package provide opt 0.4.3

namespace eval ::tcl {

    # Exported APIs
    namespace export OptKeyRegister OptKeyDelete OptKeyError OptKeyParse \
             OptProc OptProcArgGiven OptParse \
	     Lempty Lget \
             Lassign Lvarpop Lvarpop1 Lvarset Lvarincr Lfirst Lrest \
             Lassign Lvarpop Lvarpop1 Lvarset Lvarincr \
             SetMax SetMin


#################  Example of use / 'user documentation'  ###################

    proc OptCreateTestProc {} {

105
106
107
108
109
110
111
112

113
114

115
116
117
118
119
120
121
106
107
108
109
110
111
112

113
114

115
116
117
118
119
120
121
122







-
+

-
+







#    programCounter :== {"P" integer+ }
#
#    singleStep     :== { instruction parameters* }
#
#    instruction    :== single element list
#
# (the difference between singleStep and program is that \
#   llength [Lfirst $program] >= 2
#   llength [lindex $program 0] >= 2
# while
#   llength [Lfirst $singleStep] == 1
#   llength [lindex $singleStep 0] == 1
# )
#
# And for this application:
#
#    singleStep     :== { instruction varname {hasBeenSet currentValue} type 
#                         typeArgs help }
#    instruction    :== "flags" | "value"
170
171
172
173
174
175
176
177

178
179
180
181
182
183
184
171
172
173
174
175
176
177

178
179
180
181
182
183
184
185







-
+








    foreach item $desc {
	if {$state == "args"} {
	    # more items after 'args'...
	    return -code error "'args' special argument must be the last one";
	}
        set res [OptNormalizeOne $item];
        set state [Lfirst $res];
        set state [lindex $res 0];
        if {$inflags} {
            if {$state == "flags"} {
		# add to 'subprogram'
                lappend flagsprg $res;
            } else {
                # put in the flags
                # structure for flag programs items is a list of
235
236
237
238
239
240
241
242

243
244
245
246
247
248
249
250
251
252
253
254
255
256


257
258
259
260
261
262
263
264
265

266
267
268
269
270
271
272
273
274
275
276
277
278
279
280

281
282
283
284
285
286
287
288

289
290
291
292
293
294
295
296
297
298
299
300
301
302

303
304
305
306
307
308
309
310

311
312
313
314
315
316
317
236
237
238
239
240
241
242

243
244
245
246
247
248
249
250
251
252
253
254
255


256
257
258
259
260
261
262
263
264
265

266
267
268
269
270
271
272
273
274
275
276
277
278
279
280

281
282
283
284
285
286
287
288

289
290
291
292
293
294
295
296
297
298
299
300
301
302

303
304
305
306
307
308
309
310

311
312
313
314
315
316
317
318







-
+












-
-
+
+








-
+














-
+







-
+













-
+







-
+







# Parse entry point for ppl who don't want to register with a key,
# for instance because the description changes dynamically.
#  (otherwise one should really use OptKeyRegister once + OptKeyParse
#   as it is way faster or simply OptProc which does it all)
# Assign a temporary key, call OptKeyParse and then free the storage
proc ::tcl::OptParse {desc arglist} {
    set tempkey [OptKeyRegister $desc];
    set ret [catch {uplevel [list ::tcl::OptKeyParse $tempkey $arglist]} res];
    set ret [catch {uplevel 1 [list ::tcl::OptKeyParse $tempkey $arglist]} res];
    OptKeyDelete $tempkey;
    return -code $ret $res;
}

# Helper function, replacement for proc that both
# register the description under a key which is the name of the proc
# (and thus unique to that code)
# and add a first line to the code to call the OptKeyParse proc
# Stores the list of variables that have been actually given by the user
# (the other will be sets to their default value)
# into local variable named "Args".
proc ::tcl::OptProc {name desc body} {
    set namespace [uplevel namespace current];
    if {   ([string match $name "::*"]) 
    set namespace [uplevel 1 [list ::namespace current]];
    if {   ([string match "::*" $name]) 
        || ([string compare $namespace "::"]==0)} {
        # absolute name or global namespace, name is the key
        set key $name;
    } else {
        # we are relative to some non top level namespace:
        set key "${namespace}::${name}";
    }
    OptKeyRegister $desc $key;
    uplevel [list proc $name args "set Args \[::tcl::OptKeyParse $key \$args\]\n$body"];
    uplevel 1 [list ::proc $name args "set Args \[::tcl::OptKeyParse $key \$args\]\n$body"];
    return $key;
}
# Check that a argument has been given
# assumes that "OptProc" has been used as it will check in "Args" list
proc ::tcl::OptProcArgGiven {argname} {
    upvar Args alist;
    expr {[lsearch $alist $argname] >=0}
}

    #######
    # Programs/Descriptions manipulation

    # Return the instruction word/list of a given step/(sub)program
    proc OptInstr {lst} {
	Lfirst $lst;
	lindex $lst 0;
    }
    # Is a (sub) program or a plain instruction ?
    proc OptIsPrg {lst} {
	expr {[llength [OptInstr $lst]]>=2}
    }
    # Is this instruction a program counter or a real instr
    proc OptIsCounter {item} {
	expr {[Lfirst $item]=="P"}
	expr {[lindex $item 0]=="P"}
    }
    # Current program counter (2nd word of first word)
    proc OptGetPrgCounter {lst} {
	Lget $lst {0 1}
    }
    # Current program counter (2nd word of first word)
    proc OptSetPrgCounter {lstName newValue} {
	upvar $lstName lst;
	set lst [lreplace $lst 0 0 [concat "P" $newValue]];
    }
    # returns a list of currently selected items.
    proc OptSelection {lst} {
	set res {};
	foreach idx [lrange [Lfirst $lst] 1 end] {
	foreach idx [lrange [lindex $lst 0] 1 end] {
	    lappend res [Lget $lst $idx];
	}
	return $res;
    }

    # Advance to next description
    proc OptNextDesc {descName} {
        uplevel [list Lvarincr $descName {0 1}];
        uplevel 1 [list Lvarincr $descName {0 1}];
    }

    # Get the current description, eventually descend
    proc OptCurDesc {descriptions} {
        lindex $descriptions [OptGetPrgCounter $descriptions];
    }
    # get the current description, eventually descend
344
345
346
347
348
349
350
351

352
353
354
355
356
357
358
359
360
361
362
363
364

365
366
367
368

369
370
371
372
373
374
375
345
346
347
348
349
350
351

352
353
354
355
356
357
358
359
360
361
362
363
364

365
366
367
368

369
370
371
372
373
374
375
376







-
+












-
+



-
+







	lappend adress 2
	Lvarset descriptions $adress [list 1 $value];
	#                                  ^hasBeenSet flag
    }

    # empty state means done/paste the end of the program
    proc OptState {item} {
        Lfirst $item
        lindex $item 0
    }
    
    # current state
    proc OptCurState {descriptions} {
        OptState [OptCurDesc $descriptions];
    }

    #######
    # Arguments manipulation

    # Returns the argument that has to be processed now
    proc OptCurrentArg {lst} {
        Lfirst $lst;
        lindex $lst 0;
    }
    # Advance to next argument
    proc OptNextArg {argsName} {
        uplevel [list Lvarpop1 $argsName];
        uplevel 1 [list Lvarpop1 $argsName];
    }
    #######





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
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







-
+














-
+





-
+







}

# Gets the value of one leaf of a lists tree
proc ::tcl::Lget {list indexLst} {
    if {[llength $indexLst] <= 1} {
        return [lindex $list $indexLst];
    }
    Lget [lindex $list [Lfirst $indexLst]] [Lrest $indexLst];
    Lget [lindex $list [lindex $indexLst 0]] [lrange $indexLst 1 end];
}
# Sets the value of one leaf of a lists tree
# (we use the version that does not create the elements because
#  it would be even slower... needs to be written in C !)
# (nb: there is a non trivial recursive problem with indexes 0,
#  which appear because there is no difference between a list
#  of 1 element and 1 element alone : [list "a"] == "a" while 
#  it should be {a} and [listp a] should be 0 while [listp {a b}] would be 1
#  and [listp "a b"] maybe 0. listp does not exist either...)
proc ::tcl::Lvarset {listName indexLst newValue} {
    upvar $listName list;
    if {[llength $indexLst] <= 1} {
        Lvarset1nc list $indexLst $newValue;
    } else {
        set idx [Lfirst $indexLst];
        set idx [lindex $indexLst 0];
        set targetList [lindex $list $idx];
        # reduce refcount on targetList (not really usefull now,
	# could be with optimizing compiler)
#        Lvarset1 list $idx {};
        # recursively replace in targetList
        Lvarset targetList [Lrest $indexLst] $newValue;
        Lvarset targetList [lrange $indexLst 1 end] $newValue;
        # put updated sub list back in the tree
        Lvarset1nc list $idx $targetList;
    }
}
# Set one cell to a value, eventually create all the needed elements
# (on level-1 of lists)
variable emptyList {}
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
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







-
+




-
+











-
-
-
-
-
-
-
-










-
+










-
+







# Increments the value of one leaf of a lists tree
# (which must exists)
proc ::tcl::Lvarincr {listName indexLst {howMuch 1}} {
    upvar $listName list;
    if {[llength $indexLst] <= 1} {
        Lvarincr1 list $indexLst $howMuch;
    } else {
        set idx [Lfirst $indexLst];
        set idx [lindex $indexLst 0];
        set targetList [lindex $list $idx];
        # reduce refcount on targetList
        Lvarset1nc list $idx {};
        # recursively replace in targetList
        Lvarincr targetList [Lrest $indexLst] $howMuch;
        Lvarincr targetList [lrange $indexLst 1 end] $howMuch;
        # put updated sub list back in the tree
        Lvarset1nc list $idx $targetList;
    }
}
# Increments the value of one cell of a list
proc ::tcl::Lvarincr1 {listName index {howMuch 1}} {
    upvar $listName list;
    set newValue [expr {[lindex $list $index]+$howMuch}];
    set list [lreplace $list $index $index $newValue];
    return $newValue;
}
# Returns the first element of a list
proc ::tcl::Lfirst {list} {
    lindex $list 0
}
# Returns the rest of the list minus first element
proc ::tcl::Lrest {list} {
    lrange $list 1 end
}
# Removes the first element of a list
# and returns the new list value
proc ::tcl::Lvarpop1 {listName} {
    upvar $listName list;
    set list [lrange $list 1 end];
}
# Same but returns the removed element
# (Like the tclX version)
proc ::tcl::Lvarpop {listName} {
    upvar $listName list;
    set el [Lfirst $list];
    set el [lindex $list 0];
    set list [lrange $list 1 end];
    return $el;
}
# Assign list elements to variables and return the length of the list
proc ::tcl::Lassign {list args} {
    # faster than direct blown foreach (which does not byte compile)
    set i 0;
    set lg [llength $list];
    foreach vname $args {
        if {$i>=$lg} break
        uplevel [list set $vname [lindex $list $i]];
        uplevel 1 [list ::set $vname [lindex $list $i]];
        incr i;
    }
    return $lg;
}

# Misc utilities

Changes to library/opt/pkgIndex.tcl.
1
2
3
4
5
6
7
8
9
10

11

1
2
3
4
5
6
7
8
9
10
11

12










+
-
+
# Tcl package index file, version 1.1
# This file is generated by the "pkg_mkIndex -direct" command
# and sourced either when an application starts up or
# by a "package unknown" script.  It invokes the
# "package ifneeded" command to set up package-related
# information so that packages will be loaded automatically
# in response to "package require" commands.  When this
# script is sourced, the variable $dir must contain the
# full path name of this file's directory.

if {![package vsatisfies [package provide Tcl] 8]} {return}
package ifneeded opt 0.4.1 [list source [file join $dir optparse.tcl]]
package ifneeded opt 0.4.3 [list source [file join $dir optparse.tcl]]
Deleted library/opt0.4/optparse.tcl.
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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
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









































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# optparse.tcl --
#
#       (private) Option parsing package
#       Primarily used internally by the safe:: code.
#
#	WARNING: This code will go away in a future release
#	of Tcl.  It is NOT supported and you should not rely
#	on it.  If your code does rely on this package you
#	may directly incorporate this code into your application.
#
# RCS: @(#) $Id: optparse.tcl,v 1.2 1999/04/16 00:47:18 stanton Exp $

package provide opt 0.4.1

namespace eval ::tcl {

    # Exported APIs
    namespace export OptKeyRegister OptKeyDelete OptKeyError OptKeyParse \
             OptProc OptProcArgGiven OptParse \
	     Lempty Lget \
             Lassign Lvarpop Lvarpop1 Lvarset Lvarincr Lfirst Lrest \
             SetMax SetMin


#################  Example of use / 'user documentation'  ###################

    proc OptCreateTestProc {} {

	# Defines ::tcl::OptParseTest as a test proc with parsed arguments
	# (can't be defined before the code below is loaded (before "OptProc"))

	# Every OptProc give usage information on "procname -help".
	# Try "tcl::OptParseTest -help" and "tcl::OptParseTest -a" and
	# then other arguments.
	# 
	# example of 'valid' call:
	# ::tcl::OptParseTest save -4 -pr 23 -libsok SybTcl\
	#		-nostatics false ch1
	OptProc OptParseTest {
            {subcommand -choice {save print} "sub command"}
            {arg1 3 "some number"}
            {-aflag}
            {-intflag      7}
            {-weirdflag                    "help string"}
            {-noStatics                    "Not ok to load static packages"}
            {-nestedloading1 true           "OK to load into nested slaves"}
            {-nestedloading2 -boolean true "OK to load into nested slaves"}
            {-libsOK        -choice {Tk SybTcl}
		                      "List of packages that can be loaded"}
            {-precision     -int 12        "Number of digits of precision"}
            {-intval        7               "An integer"}
            {-scale         -float 1.0     "Scale factor"}
            {-zoom          1.0             "Zoom factor"}
            {-arbitrary     foobar          "Arbitrary string"}
            {-random        -string 12   "Random string"}
            {-listval       -list {}       "List value"}
            {-blahflag       -blah abc       "Funny type"}
	    {arg2 -boolean "a boolean"}
	    {arg3 -choice "ch1 ch2"}
	    {?optarg? -list {} "optional argument"}
        } {
	    foreach v [info locals] {
		puts stderr [format "%14s : %s" $v [set $v]]
	    }
	}
    }

###################  No User serviceable part below ! ###############
# You should really not look any further :
# The following is private unexported undocumented unblessed... code 
# time to hit "q" ;-) !

# Hmmm... ok, you really want to know ?

# You've been warned... Here it is...

    # Array storing the parsed descriptions
    variable OptDesc;
    array set OptDesc {};
    # Next potentially free key id (numeric)
    variable OptDescN 0;

# Inside algorithm/mechanism description:
# (not for the faint hearted ;-)
#
# The argument description is parsed into a "program tree"
# It is called a "program" because it is the program used by
# the state machine interpreter that use that program to
# actually parse the arguments at run time.
#
# The general structure of a "program" is
# notation (pseudo bnf like)
#    name :== definition        defines "name" as being "definition" 
#    { x y z }                  means list of x, y, and z  
#    x*                         means x repeated 0 or more time
#    x+                         means "x x*"
#    x?                         means optionally x
#    x | y                      means x or y
#    "cccc"                     means the literal string
#
#    program        :== { programCounter programStep* }
#
#    programStep    :== program | singleStep
#
#    programCounter :== {"P" integer+ }
#
#    singleStep     :== { instruction parameters* }
#
#    instruction    :== single element list
#
# (the difference between singleStep and program is that \
#   llength [Lfirst $program] >= 2
# while
#   llength [Lfirst $singleStep] == 1
# )
#
# And for this application:
#
#    singleStep     :== { instruction varname {hasBeenSet currentValue} type 
#                         typeArgs help }
#    instruction    :== "flags" | "value"
#    type           :== knowType | anyword
#    knowType       :== "string" | "int" | "boolean" | "boolflag" | "float"
#                       | "choice"
#
# for type "choice" typeArgs is a list of possible choices, the first one
# is the default value. for all other types the typeArgs is the default value
#
# a "boolflag" is the type for a flag whose presence or absence, without
# additional arguments means respectively true or false (default flag type).
#
# programCounter is the index in the list of the currently processed
# programStep (thus starting at 1 (0 is {"P" prgCounterValue}).
# If it is a list it points toward each currently selected programStep.
# (like for "flags", as they are optional, form a set and programStep).

# Performance/Implementation issues
# ---------------------------------
# We use tcl lists instead of arrays because with tcl8.0
# they should start to be much faster.
# But this code use a lot of helper procs (like Lvarset)
# which are quite slow and would be helpfully optimized
# for instance by being written in C. Also our struture
# is complex and there is maybe some places where the
# string rep might be calculated at great exense. to be checked.

#
# Parse a given description and saves it here under the given key
# generate a unused keyid if not given
#
proc ::tcl::OptKeyRegister {desc {key ""}} {
    variable OptDesc;
    variable OptDescN;
    if {[string compare $key ""] == 0} {
        # in case a key given to us as a parameter was a number
        while {[info exists OptDesc($OptDescN)]} {incr OptDescN}
        set key $OptDescN;
        incr OptDescN;
    }
    # program counter
    set program [list [list "P" 1]];

    # are we processing flags (which makes a single program step)
    set inflags 0;

    set state {};

    # flag used to detect that we just have a single (flags set) subprogram.
    set empty 1;

    foreach item $desc {
	if {$state == "args"} {
	    # more items after 'args'...
	    return -code error "'args' special argument must be the last one";
	}
        set res [OptNormalizeOne $item];
        set state [Lfirst $res];
        if {$inflags} {
            if {$state == "flags"} {
		# add to 'subprogram'
                lappend flagsprg $res;
            } else {
                # put in the flags
                # structure for flag programs items is a list of
                # {subprgcounter {prg flag 1} {prg flag 2} {...}}
                lappend program $flagsprg;
                # put the other regular stuff
                lappend program $res;
		set inflags 0;
		set empty 0;
            }
        } else {
           if {$state == "flags"} {
               set inflags 1;
               # sub program counter + first sub program
               set flagsprg [list [list "P" 1] $res];
           } else {
               lappend program $res;
               set empty 0;
           }
       }
   }
   if {$inflags} {
       if {$empty} {
	   # We just have the subprogram, optimize and remove
	   # unneeded level:
	   set program $flagsprg;
       } else {
	   lappend program $flagsprg;
       }
   }

   set OptDesc($key) $program;

   return $key;
}

#
# Free the storage for that given key
#
proc ::tcl::OptKeyDelete {key} {
    variable OptDesc;
    unset OptDesc($key);
}

    # Get the parsed description stored under the given key.
    proc OptKeyGetDesc {descKey} {
        variable OptDesc;
        if {![info exists OptDesc($descKey)]} {
            return -code error "Unknown option description key \"$descKey\"";
        }
        set OptDesc($descKey);
    }

# Parse entry point for ppl who don't want to register with a key,
# for instance because the description changes dynamically.
#  (otherwise one should really use OptKeyRegister once + OptKeyParse
#   as it is way faster or simply OptProc which does it all)
# Assign a temporary key, call OptKeyParse and then free the storage
proc ::tcl::OptParse {desc arglist} {
    set tempkey [OptKeyRegister $desc];
    set ret [catch {uplevel [list ::tcl::OptKeyParse $tempkey $arglist]} res];
    OptKeyDelete $tempkey;
    return -code $ret $res;
}

# Helper function, replacement for proc that both
# register the description under a key which is the name of the proc
# (and thus unique to that code)
# and add a first line to the code to call the OptKeyParse proc
# Stores the list of variables that have been actually given by the user
# (the other will be sets to their default value)
# into local variable named "Args".
proc ::tcl::OptProc {name desc body} {
    set namespace [uplevel namespace current];
    if {   ([string match $name "::*"]) 
        || ([string compare $namespace "::"]==0)} {
        # absolute name or global namespace, name is the key
        set key $name;
    } else {
        # we are relative to some non top level namespace:
        set key "${namespace}::${name}";
    }
    OptKeyRegister $desc $key;
    uplevel [list proc $name args "set Args \[::tcl::OptKeyParse $key \$args\]\n$body"];
    return $key;
}
# Check that a argument has been given
# assumes that "OptProc" has been used as it will check in "Args" list
proc ::tcl::OptProcArgGiven {argname} {
    upvar Args alist;
    expr {[lsearch $alist $argname] >=0}
}

    #######
    # Programs/Descriptions manipulation

    # Return the instruction word/list of a given step/(sub)program
    proc OptInstr {lst} {
	Lfirst $lst;
    }
    # Is a (sub) program or a plain instruction ?
    proc OptIsPrg {lst} {
	expr {[llength [OptInstr $lst]]>=2}
    }
    # Is this instruction a program counter or a real instr
    proc OptIsCounter {item} {
	expr {[Lfirst $item]=="P"}
    }
    # Current program counter (2nd word of first word)
    proc OptGetPrgCounter {lst} {
	Lget $lst {0 1}
    }
    # Current program counter (2nd word of first word)
    proc OptSetPrgCounter {lstName newValue} {
	upvar $lstName lst;
	set lst [lreplace $lst 0 0 [concat "P" $newValue]];
    }
    # returns a list of currently selected items.
    proc OptSelection {lst} {
	set res {};
	foreach idx [lrange [Lfirst $lst] 1 end] {
	    lappend res [Lget $lst $idx];
	}
	return $res;
    }

    # Advance to next description
    proc OptNextDesc {descName} {
        uplevel [list Lvarincr $descName {0 1}];
    }

    # Get the current description, eventually descend
    proc OptCurDesc {descriptions} {
        lindex $descriptions [OptGetPrgCounter $descriptions];
    }
    # get the current description, eventually descend
    # through sub programs as needed.
    proc OptCurDescFinal {descriptions} {
        set item [OptCurDesc $descriptions];
	# Descend untill we get the actual item and not a sub program
        while {[OptIsPrg $item]} {
            set item [OptCurDesc $item];
        }
	return $item;
    }
    # Current final instruction adress
    proc OptCurAddr {descriptions {start {}}} {
	set adress [OptGetPrgCounter $descriptions];
	lappend start $adress;
	set item [lindex $descriptions $adress];
	if {[OptIsPrg $item]} {
	    return [OptCurAddr $item $start];
	} else {
	    return $start;
	}
    }
    # Set the value field of the current instruction
    proc OptCurSetValue {descriptionsName value} {
	upvar $descriptionsName descriptions
	# get the current item full adress
        set adress [OptCurAddr $descriptions];
	# use the 3th field of the item  (see OptValue / OptNewInst)
	lappend adress 2
	Lvarset descriptions $adress [list 1 $value];
	#                                  ^hasBeenSet flag
    }

    # empty state means done/paste the end of the program
    proc OptState {item} {
        Lfirst $item
    }
    
    # current state
    proc OptCurState {descriptions} {
        OptState [OptCurDesc $descriptions];
    }

    #######
    # Arguments manipulation

    # Returns the argument that has to be processed now
    proc OptCurrentArg {lst} {
        Lfirst $lst;
    }
    # Advance to next argument
    proc OptNextArg {argsName} {
        uplevel [list Lvarpop1 $argsName];
    }
    #######





    # Loop over all descriptions, calling OptDoOne which will
    # eventually eat all the arguments.
    proc OptDoAll {descriptionsName argumentsName} {
	upvar $descriptionsName descriptions
	upvar $argumentsName arguments;
#	puts "entered DoAll";
	# Nb: the places where "state" can be set are tricky to figure
	#     because DoOne sets the state to flagsValue and return -continue
	#     when needed...
	set state [OptCurState $descriptions];
	# We'll exit the loop in "OptDoOne" or when state is empty.
        while 1 {
	    set curitem [OptCurDesc $descriptions];
	    # Do subprograms if needed, call ourselves on the sub branch
	    while {[OptIsPrg $curitem]} {
		OptDoAll curitem arguments
#		puts "done DoAll sub";
		# Insert back the results in current tree;
		Lvarset1nc descriptions [OptGetPrgCounter $descriptions]\
			$curitem;
		OptNextDesc descriptions;
		set curitem [OptCurDesc $descriptions];
                set state [OptCurState $descriptions];
	    }
#           puts "state = \"$state\" - arguments=($arguments)";
	    if {[Lempty $state]} {
		# Nothing left to do, we are done in this branch:
		break;
	    }
	    # The following statement can make us terminate/continue
	    # as it use return -code {break, continue, return and error}
	    # codes
            OptDoOne descriptions state arguments;
	    # If we are here, no special return code where issued,
	    # we'll step to next instruction :
#           puts "new state  = \"$state\"";
	    OptNextDesc descriptions;
	    set state [OptCurState $descriptions];
        }
    }

    # Process one step for the state machine,
    # eventually consuming the current argument.
    proc OptDoOne {descriptionsName stateName argumentsName} {
        upvar $argumentsName arguments;
        upvar $descriptionsName descriptions;
	upvar $stateName state;

	# the special state/instruction "args" eats all
	# the remaining args (if any)
	if {($state == "args")} {
	    if {![Lempty $arguments]} {
		# If there is no additional arguments, leave the default value
		# in.
		OptCurSetValue descriptions $arguments;
		set arguments {};
	    }
#            puts "breaking out ('args' state: consuming every reminding args)"
	    return -code break;
	}

	if {[Lempty $arguments]} {
	    if {$state == "flags"} {
		# no argument and no flags : we're done
#                puts "returning to previous (sub)prg (no more args)";
		return -code return;
	    } elseif {$state == "optValue"} {
		set state next; # not used, for debug only
		# go to next state
		return ;
	    } else {
		return -code error [OptMissingValue $descriptions];
	    }
	} else {
	    set arg [OptCurrentArg $arguments];
	}

        switch $state {
            flags {
                # A non-dash argument terminates the options, as does --

                # Still a flag ?
                if {![OptIsFlag $arg]} {
                    # don't consume the argument, return to previous prg
                    return -code return;
                }
                # consume the flag
                OptNextArg arguments;
                if {[string compare "--" $arg] == 0} {
                    # return from 'flags' state
                    return -code return;
                }

                set hits [OptHits descriptions $arg];
                if {$hits > 1} {
                    return -code error [OptAmbigous $descriptions $arg]
                } elseif {$hits == 0} {
                    return -code error [OptFlagUsage $descriptions $arg]
                }
		set item [OptCurDesc $descriptions];
                if {[OptNeedValue $item]} {
		    # we need a value, next state is
		    set state flagValue;
                } else {
                    OptCurSetValue descriptions 1;
                }
		# continue
		return -code continue;
            }
	    flagValue -
	    value {
		set item [OptCurDesc $descriptions];
                # Test the values against their required type
		if {[catch {OptCheckType $arg\
			[OptType $item] [OptTypeArgs $item]} val]} {
		    return -code error [OptBadValue $item $arg $val]
		}
                # consume the value
                OptNextArg arguments;
		# set the value
		OptCurSetValue descriptions $val;
		# go to next state
		if {$state == "flagValue"} {
		    set state flags
		    return -code continue;
		} else {
		    set state next; # not used, for debug only
		    return ; # will go on next step
		}
	    }
	    optValue {
		set item [OptCurDesc $descriptions];
                # Test the values against their required type
		if {![catch {OptCheckType $arg\
			[OptType $item] [OptTypeArgs $item]} val]} {
		    # right type, so :
		    # consume the value
		    OptNextArg arguments;
		    # set the value
		    OptCurSetValue descriptions $val;
		}
		# go to next state
		set state next; # not used, for debug only
		return ; # will go on next step
	    }
        }
	# If we reach this point: an unknown
	# state as been entered !
	return -code error "Bug! unknown state in DoOne \"$state\"\
		(prg counter [OptGetPrgCounter $descriptions]:\
			[OptCurDesc $descriptions])";
    }

# Parse the options given the key to previously registered description
# and arguments list
proc ::tcl::OptKeyParse {descKey arglist} {

    set desc [OptKeyGetDesc $descKey];

    # make sure -help always give usage
    if {[string compare "-help" [string tolower $arglist]] == 0} {
	return -code error [OptError "Usage information:" $desc 1];
    }

    OptDoAll desc arglist;

    if {![Lempty $arglist]} {
	return -code error [OptTooManyArgs $desc $arglist];
    }
    
    # Analyse the result
    # Walk through the tree:
    OptTreeVars $desc "#[expr {[info level]-1}]" ;
}

    # determine string length for nice tabulated output
    proc OptTreeVars {desc level {vnamesLst {}}} {
	foreach item $desc {
	    if {[OptIsCounter $item]} continue;
	    if {[OptIsPrg $item]} {
		set vnamesLst [OptTreeVars $item $level $vnamesLst];
	    } else {
		set vname [OptVarName $item];
		upvar $level $vname var
		if {[OptHasBeenSet $item]} {
#		    puts "adding $vname"
		    # lets use the input name for the returned list
		    # it is more usefull, for instance you can check that
		    # no flags at all was given with expr
		    # {![string match "*-*" $Args]}
		    lappend vnamesLst [OptName $item];
		    set var [OptValue $item];
		} else {
		    set var [OptDefaultValue $item];
		}
	    }
	}
	return $vnamesLst
    }


# Check the type of a value
# and emit an error if arg is not of the correct type
# otherwise returns the canonical value of that arg (ie 0/1 for booleans)
proc ::tcl::OptCheckType {arg type {typeArgs ""}} {
#    puts "checking '$arg' against '$type' ($typeArgs)";

    # only types "any", "choice", and numbers can have leading "-"

    switch -exact -- $type {
        int {
            if {![regexp {^(-+)?[0-9]+$} $arg]} {
                error "not an integer"
            }
	    return $arg;
        }
        float {
            return [expr {double($arg)}]
        }
	script -
        list {
	    # if llength fail : malformed list
            if {[llength $arg]==0} {
		if {[OptIsFlag $arg]} {
		    error "no values with leading -"
		}
	    }
	    return $arg;
        }
        boolean {
	    if {![regexp -nocase {^(true|false|0|1)$} $arg]} {
		error "non canonic boolean"
            }
	    # convert true/false because expr/if is broken with "!,...
	    if {$arg} {
		return 1
	    } else {
		return 0
	    }
        }
        choice {
            if {[lsearch -exact $typeArgs $arg] < 0} {
                error "invalid choice"
            }
	    return $arg;
        }
	any {
	    return $arg;
	}
	string -
	default {
            if {[OptIsFlag $arg]} {
                error "no values with leading -"
            }
	    return $arg
        }
    }
    return neverReached;
}

    # internal utilities

    # returns the number of flags matching the given arg
    # sets the (local) prg counter to the list of matches
    proc OptHits {descName arg} {
        upvar $descName desc;
        set hits 0
        set hitems {}
	set i 1;

	set larg [string tolower $arg];
	set len  [string length $larg];
	set last [expr {$len-1}];

        foreach item [lrange $desc 1 end] {
            set flag [OptName $item]
	    # lets try to match case insensitively
	    # (string length ought to be cheap)
	    set lflag [string tolower $flag];
	    if {$len == [string length $lflag]} {
		if {[string compare $larg $lflag]==0} {
		    # Exact match case
		    OptSetPrgCounter desc $i;
		    return 1;
		}
	    } else {
		if {[string compare $larg [string range $lflag 0 $last]]==0} {
		    lappend hitems $i;
		    incr hits;
		}
            }
	    incr i;
        }
	if {$hits} {
	    OptSetPrgCounter desc $hitems;
	}
        return $hits
    }

    # Extract fields from the list structure:

    proc OptName {item} {
        lindex $item 1;
    }
    # 
    proc OptHasBeenSet {item} {
	Lget $item {2 0};
    }
    # 
    proc OptValue {item} {
	Lget $item {2 1};
    }

    proc OptIsFlag {name} {
        string match "-*" $name;
    }
    proc OptIsOpt {name} {
        string match {\?*} $name;
    }
    proc OptVarName {item} {
        set name [OptName $item];
        if {[OptIsFlag $name]} {
            return [string range $name 1 end];
        } elseif {[OptIsOpt $name]} {
	    return [string trim $name "?"];
	} else {
            return $name;
        }
    }
    proc OptType {item} {
        lindex $item 3
    }
    proc OptTypeArgs {item} {
        lindex $item 4
    }
    proc OptHelp {item} {
        lindex $item 5
    }
    proc OptNeedValue {item} {
        string compare [OptType $item] boolflag
    }
    proc OptDefaultValue {item} {
        set val [OptTypeArgs $item]
        switch -exact -- [OptType $item] {
            choice {return [lindex $val 0]}
	    boolean -
	    boolflag {
		# convert back false/true to 0/1 because expr !$bool
		# is broken..
		if {$val} {
		    return 1
		} else {
		    return 0
		}
	    }
        }
        return $val
    }

    # Description format error helper
    proc OptOptUsage {item {what ""}} {
        return -code error "invalid description format$what: $item\n\
                should be a list of {varname|-flagname ?-type? ?defaultvalue?\
                ?helpstring?}";
    }


    # Generate a canonical form single instruction
    proc OptNewInst {state varname type typeArgs help} {
	list $state $varname [list 0 {}] $type $typeArgs $help;
	#                          ^  ^
	#                          |  |
	#               hasBeenSet=+  +=currentValue
    }

    # Translate one item to canonical form
    proc OptNormalizeOne {item} {
        set lg [Lassign $item varname arg1 arg2 arg3];
#       puts "called optnormalizeone '$item' v=($varname), lg=$lg";
        set isflag [OptIsFlag $varname];
	set isopt  [OptIsOpt  $varname];
        if {$isflag} {
            set state "flags";
        } elseif {$isopt} {
	    set state "optValue";
	} elseif {[string compare $varname "args"]} {
	    set state "value";
	} else {
	    set state "args";
	}

	# apply 'smart' 'fuzzy' logic to try to make
	# description writer's life easy, and our's difficult :
	# let's guess the missing arguments :-)

        switch $lg {
            1 {
                if {$isflag} {
                    return [OptNewInst $state $varname boolflag false ""];
                } else {
                    return [OptNewInst $state $varname any "" ""];
                }
            }
            2 {
                # varname default
                # varname help
                set type [OptGuessType $arg1]
                if {[string compare $type "string"] == 0} {
                    if {$isflag} {
			set type boolflag
			set def false
		    } else {
			set type any
			set def ""
		    }
		    set help $arg1
                } else {
                    set help ""
                    set def $arg1
                }
                return [OptNewInst $state $varname $type $def $help];
            }
            3 {
                # varname type value
                # varname value comment
		
                if {[regexp {^-(.+)$} $arg1 x type]} {
		    # flags/optValue as they are optional, need a "value",
		    # on the contrary, for a variable (non optional),
	            # default value is pointless, 'cept for choices :
		    if {$isflag || $isopt || ($type == "choice")} {
			return [OptNewInst $state $varname $type $arg2 ""];
		    } else {
			return [OptNewInst $state $varname $type "" $arg2];
		    }
                } else {
                    return [OptNewInst $state $varname\
			    [OptGuessType $arg1] $arg1 $arg2]
                }
            }
            4 {
                if {[regexp {^-(.+)$} $arg1 x type]} {
		    return [OptNewInst $state $varname $type $arg2 $arg3];
                } else {
                    return -code error [OptOptUsage $item];
                }
            }
            default {
                return -code error [OptOptUsage $item];
            }
        }
    }

    # Auto magic lasy type determination
    proc OptGuessType {arg} {
        if {[regexp -nocase {^(true|false)$} $arg]} {
            return boolean
        }
        if {[regexp {^(-+)?[0-9]+$} $arg]} {
            return int
        }
        if {![catch {expr {double($arg)}}]} {
            return float
        }
        return string
    }

    # Error messages front ends

    proc OptAmbigous {desc arg} {
        OptError "ambigous option \"$arg\", choose from:" [OptSelection $desc]
    }
    proc OptFlagUsage {desc arg} {
        OptError "bad flag \"$arg\", must be one of" $desc;
    }
    proc OptTooManyArgs {desc arguments} {
        OptError "too many arguments (unexpected argument(s): $arguments),\
		usage:"\
		$desc 1
    }
    proc OptParamType {item} {
	if {[OptIsFlag $item]} {
	    return "flag";
	} else {
	    return "parameter";
	}
    }
    proc OptBadValue {item arg {err {}}} {
#       puts "bad val err = \"$err\"";
        OptError "bad value \"$arg\" for [OptParamType $item]"\
		[list $item]
    }
    proc OptMissingValue {descriptions} {
#        set item [OptCurDescFinal $descriptions];
        set item [OptCurDesc $descriptions];
        OptError "no value given for [OptParamType $item] \"[OptName $item]\"\
		(use -help for full usage) :"\
		[list $item]
    }

proc ::tcl::OptKeyError {prefix descKey {header 0}} {
    OptError $prefix [OptKeyGetDesc $descKey] $header;
}

    # determine string length for nice tabulated output
    proc OptLengths {desc nlName tlName dlName} {
	upvar $nlName nl;
	upvar $tlName tl;
	upvar $dlName dl;
	foreach item $desc {
	    if {[OptIsCounter $item]} continue;
	    if {[OptIsPrg $item]} {
		OptLengths $item nl tl dl
	    } else {
		SetMax nl [string length [OptName $item]]
		SetMax tl [string length [OptType $item]]
		set dv [OptTypeArgs $item];
		if {[OptState $item] != "header"} {
		    set dv "($dv)";
		}
		set l [string length $dv];
		# limit the space allocated to potentially big "choices"
		if {([OptType $item] != "choice") || ($l<=12)} {
		    SetMax dl $l
		} else {
		    if {![info exists dl]} {
			set dl 0
		    }
		}
	    }
	}
    }
    # output the tree
    proc OptTree {desc nl tl dl} {
	set res "";
	foreach item $desc {
	    if {[OptIsCounter $item]} continue;
	    if {[OptIsPrg $item]} {
		append res [OptTree $item $nl $tl $dl];
	    } else {
		set dv [OptTypeArgs $item];
		if {[OptState $item] != "header"} {
		    set dv "($dv)";
		}
		append res [format "\n    %-*s %-*s %-*s %s" \
			$nl [OptName $item] $tl [OptType $item] \
			$dl $dv [OptHelp $item]]
	    }
	}
	return $res;
    }

# Give nice usage string
proc ::tcl::OptError {prefix desc {header 0}} {
    # determine length
    if {$header} {
	# add faked instruction
	set h [list [OptNewInst header Var/FlagName Type Value Help]];
	lappend h   [OptNewInst header ------------ ---- ----- ----];
	lappend h   [OptNewInst header {( -help} "" "" {gives this help )}]
	set desc [concat $h $desc]
    }
    OptLengths $desc nl tl dl
    # actually output 
    return "$prefix[OptTree $desc $nl $tl $dl]"
}


################     General Utility functions   #######################

#
# List utility functions
# Naming convention:
#     "Lvarxxx" take the list VARiable name as argument
#     "Lxxxx"   take the list value as argument
#               (which is not costly with Tcl8 objects system
#                as it's still a reference and not a copy of the values)
#

# Is that list empty ?
proc ::tcl::Lempty {list} {
    expr {[llength $list]==0}
}

# Gets the value of one leaf of a lists tree
proc ::tcl::Lget {list indexLst} {
    if {[llength $indexLst] <= 1} {
        return [lindex $list $indexLst];
    }
    Lget [lindex $list [Lfirst $indexLst]] [Lrest $indexLst];
}
# Sets the value of one leaf of a lists tree
# (we use the version that does not create the elements because
#  it would be even slower... needs to be written in C !)
# (nb: there is a non trivial recursive problem with indexes 0,
#  which appear because there is no difference between a list
#  of 1 element and 1 element alone : [list "a"] == "a" while 
#  it should be {a} and [listp a] should be 0 while [listp {a b}] would be 1
#  and [listp "a b"] maybe 0. listp does not exist either...)
proc ::tcl::Lvarset {listName indexLst newValue} {
    upvar $listName list;
    if {[llength $indexLst] <= 1} {
        Lvarset1nc list $indexLst $newValue;
    } else {
        set idx [Lfirst $indexLst];
        set targetList [lindex $list $idx];
        # reduce refcount on targetList (not really usefull now,
	# could be with optimizing compiler)
#        Lvarset1 list $idx {};
        # recursively replace in targetList
        Lvarset targetList [Lrest $indexLst] $newValue;
        # put updated sub list back in the tree
        Lvarset1nc list $idx $targetList;
    }
}
# Set one cell to a value, eventually create all the needed elements
# (on level-1 of lists)
variable emptyList {}
proc ::tcl::Lvarset1 {listName index newValue} {
    upvar $listName list;
    if {$index < 0} {return -code error "invalid negative index"}
    set lg [llength $list];
    if {$index >= $lg} {
        variable emptyList;
        for {set i $lg} {$i<$index} {incr i} {
            lappend list $emptyList;
        }
        lappend list $newValue;
    } else {
        set list [lreplace $list $index $index $newValue];
    }
}
# same as Lvarset1 but no bound checking / creation
proc ::tcl::Lvarset1nc {listName index newValue} {
    upvar $listName list;
    set list [lreplace $list $index $index $newValue];
}
# Increments the value of one leaf of a lists tree
# (which must exists)
proc ::tcl::Lvarincr {listName indexLst {howMuch 1}} {
    upvar $listName list;
    if {[llength $indexLst] <= 1} {
        Lvarincr1 list $indexLst $howMuch;
    } else {
        set idx [Lfirst $indexLst];
        set targetList [lindex $list $idx];
        # reduce refcount on targetList
        Lvarset1nc list $idx {};
        # recursively replace in targetList
        Lvarincr targetList [Lrest $indexLst] $howMuch;
        # put updated sub list back in the tree
        Lvarset1nc list $idx $targetList;
    }
}
# Increments the value of one cell of a list
proc ::tcl::Lvarincr1 {listName index {howMuch 1}} {
    upvar $listName list;
    set newValue [expr {[lindex $list $index]+$howMuch}];
    set list [lreplace $list $index $index $newValue];
    return $newValue;
}
# Returns the first element of a list
proc ::tcl::Lfirst {list} {
    lindex $list 0
}
# Returns the rest of the list minus first element
proc ::tcl::Lrest {list} {
    lrange $list 1 end
}
# Removes the first element of a list
# and returns the new list value
proc ::tcl::Lvarpop1 {listName} {
    upvar $listName list;
    set list [lrange $list 1 end];
}
# Same but returns the removed element
# (Like the tclX version)
proc ::tcl::Lvarpop {listName} {
    upvar $listName list;
    set el [Lfirst $list];
    set list [lrange $list 1 end];
    return $el;
}
# Assign list elements to variables and return the length of the list
proc ::tcl::Lassign {list args} {
    # faster than direct blown foreach (which does not byte compile)
    set i 0;
    set lg [llength $list];
    foreach vname $args {
        if {$i>=$lg} break
        uplevel [list set $vname [lindex $list $i]];
        incr i;
    }
    return $lg;
}

# Misc utilities

# Set the varname to value if value is greater than varname's current value
# or if varname is undefined
proc ::tcl::SetMax {varname value} {
    upvar 1 $varname var
    if {![info exists var] || $value > $var} {
        set var $value
    }
}

# Set the varname to value if value is smaller than varname's current value
# or if varname is undefined
proc ::tcl::SetMin {varname value} {
    upvar 1 $varname var
    if {![info exists var] || $value < $var} {
        set var $value
    }
}


    # everything loaded fine, lets create the test proc:
 #    OptCreateTestProc
    # Don't need the create temp proc anymore:
 #    rename OptCreateTestProc {}
}
Deleted library/opt0.4/pkgIndex.tcl.
1
2
3
4
5
6
7
8
9
10
11











-
-
-
-
-
-
-
-
-
-
-
# Tcl package index file, version 1.1
# This file is generated by the "pkg_mkIndex -direct" command
# and sourced either when an application starts up or
# by a "package unknown" script.  It invokes the
# "package ifneeded" command to set up package-related
# information so that packages will be loaded automatically
# in response to "package require" commands.  When this
# script is sourced, the variable $dir must contain the
# full path name of this file's directory.

package ifneeded opt 0.4.1 [list source [file join $dir optparse.tcl]]
Changes to library/package.tcl.
1
2
3
4
5
6

7
8
9
10
11
12
13
1
2
3
4
5

6
7
8
9
10
11
12
13





-
+







# package.tcl --
#
# utility procs formerly in init.tcl which can be loaded on demand
# for package management.
#
# RCS: @(#) $Id: package.tcl,v 1.14 2000/04/23 03:36:51 jingham Exp $
# RCS: @(#) $Id: package.tcl,v 1.14.2.2 2001/08/24 16:19:10 dgp Exp $
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1994-1998 Sun Microsystems, Inc.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
29
30
31
32
33
34
35
36
37

38
39
40

41




42
















43
44
45
46
47
48
49
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







-
-
+
-

-
+

+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







#		Defaults to [info sharedlibextension]
#
# Results:
#  Returns 1 if the extension matches, 0 otherwise

proc pkg_compareExtension { fileName {ext {}} } {
    global tcl_platform
    if {[string length $ext] == 0} {
	set ext [info sharedlibextension]
    if {![string length $ext]} {set ext [info sharedlibextension]}
    }
    if {[string equal $tcl_platform(platform) "windows"]} {
	return [string equal -nocase [file extension $fileName] $ext]
        return [string equal -nocase [file extension $fileName] $ext]
    } else {
        # Some unices add trailing numbers after the .so, so
        # we could have something like '.so.1.2'.
        set root $fileName
        while {1} {
	return [string equal [file extension $fileName] $ext]
            set currExt [file extension $root]
            if {[string equal $currExt $ext]} {
                return 1
            } 

	    # The current extension does not match; if it is not a numeric
	    # value, quit, as we are only looking to ignore version number
	    # extensions.  Otherwise we might return 1 in this case:
	    #		pkg_compareExtension foo.so.bar .so
	    # which should not match.

	    if { ![string is integer -strict [string range $currExt 1 end]] } {
		return 0
	    }
            set root [file rootname $root]
	}
    }
}

# pkg_mkIndex --
# This procedure creates a package index in a given directory.  The
# package index consists of a "pkgIndex.tcl" file whose contents are
# a Tcl script that sets up package information with "package require"
66
67
68
69
70
71
72
73

74
75
76
77
78
79
80
83
84
85
86
87
88
89

90
91
92
93
94
95
96
97







-
+







# args -		Any number of additional arguments, each giving
#			a glob pattern that matches the names of one or
#			more shared libraries or Tcl script files in
#			dir.

proc pkg_mkIndex {args} {
    global errorCode errorInfo
    set usage {"pkg_mkIndex ?-direct? ?-verbose? ?-load pattern? ?--? dir ?pattern ...?"};
    set usage {"pkg_mkIndex ?-direct? ?-lazy? ?-load pattern? ?-verbose? ?--? dir ?pattern ...?"};

    set argCount [llength $args]
    if {$argCount < 1} {
	return -code error "wrong # args: should be\n$usage"
    }

    set more ""
144
145
146
147
148
149
150










151
152
153
154



155
156
157
158
159
160
161
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







+
+
+
+
+
+
+
+
+
+




+
+
+








	cd $oldDir
	set c [interp create]

	# Load into the child any packages currently loaded in the parent
	# interpreter that match the -load pattern.

	if {[string length $loadPat]} {
	    if {$doVerbose} {
		tclLog "currently loaded packages: '[info loaded]'"
		tclLog "trying to load all packages matching $loadPat"
	    }
	    if {![llength [info loaded]]} {
		tclLog "warning: no packages are currently loaded, nothing"
		tclLog "can possibly match '$loadPat'"
	    }
	}
	foreach pkg [info loaded] {
	    if {! [string match $loadPat [lindex $pkg 1]]} {
		continue
	    }
	    if {$doVerbose} {
		tclLog "package [lindex $pkg 1] matches '$loadPat'"
	    }
	    if {[catch {
		load [lindex $pkg 0] [lindex $pkg 1] $c
	    } err]} {
		if {$doVerbose} {
		    tclLog "warning: load [lindex $pkg 0] [lindex $pkg 1]\nfailed with: $err"
		}
	    } elseif {$doVerbose} {
324
325
326
327
328
329
330




331
332
333




334
335
336
337
338
339
340
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378







+
+
+
+



+
+
+
+







	    }
	} msg] == 1} {
	    set what [$c eval set ::tcl::debug]
	    if {$doVerbose} {
		tclLog "warning: error while $what $file: $msg"
	    }
	} else {
	    set what [$c eval set ::tcl::debug]
	    if {$doVerbose} {
		tclLog "successful $what of $file"
	    }
	    set type [$c eval set ::tcl::type]
	    set cmds [lsort [$c eval array names ::tcl::newCmds]]
	    set pkgs [$c eval set ::tcl::newPkgs]
	    if {$doVerbose} {
		tclLog "commands provided were $cmds"
		tclLog "packages provided were $pkgs"
	    }
	    if {[llength $pkgs] > 1} {
		tclLog "warning: \"$file\" provides more than one package ($pkgs)"
	    }
	    foreach pkg $pkgs {
		# cmds is empty/not used in the direct case
		lappend files($pkg) [list $file $type $cmds]
	    }
416
417
418
419
420
421
422
423

424
425
426
427
428
429
430
454
455
456
457
458
459
460

461
462
463
464
465
466
467
468







-
+








# tclMacPkgSearch --
# The procedure is used on the Macintosh to search a given directory for files
# with a TEXT resource named "pkgIndex".  If it exists it is sourced in to the
# interpreter to setup the package database.

proc tclMacPkgSearch {dir} {
    foreach x [glob -nocomplain [file join $dir *.shlb]] {
    foreach x [glob -directory $dir -nocomplain *.shlb] {
	if {[file isfile $x]} {
	    set res [resource open $x]
	    foreach y [resource list TEXT $res] {
		if {[string equal $y "pkgIndex"]} {source -rsrc pkgIndex}
	    }
	    catch {resource close $res}
	}
456
457
458
459
460
461
462

463

464
465
466
467
468
469
470
494
495
496
497
498
499
500
501

502
503
504
505
506
507
508
509







+
-
+







    set old_path [set use_path $auto_path]
    while {[llength $use_path]} {
	set dir [lindex $use_path end]
	# we can't use glob in safe interps, so enclose the following
	# in a catch statement, where we get the pkgIndex files out
	# of the subdirectories
	catch {
	    foreach file [glob -directory $dir -join -nocomplain \
	    foreach file [glob -nocomplain [file join $dir * pkgIndex.tcl]] {
		    * pkgIndex.tcl] {
		set dir [file dirname $file]
		if {[file readable $file] && ![info exists procdDirs($dir)]} {
		    if {[catch {source $file} msg]} {
			tclLog "error reading package index file $file: $msg"
		    } else {
			set procdDirs($dir) 1
		    }
488
489
490
491
492
493
494
495

496
497
498
499
500
501
502
527
528
529
530
531
532
533

534
535
536
537
538
539
540
541







-
+







	if {(![interp issafe]) && \
		[string equal $tcl_platform(platform) "macintosh"]} {
	    set dir [lindex $use_path end]
	    if {![info exists procdDirs($dir)]} {
		tclMacPkgSearch $dir
		set procdDirs($dir) 1
	    }
	    foreach x [glob -nocomplain [file join $dir *]] {
	    foreach x [glob -directory $dir -nocomplain *] {
		if {[file isdirectory $x] && ![info exists procdDirs($x)]} {
		    set dir $x
		    tclMacPkgSearch $dir
		    set procdDirs($dir) 1
		}
	    }
	}
Deleted library/reg/pkgIndex.tcl.
1
2
3
4
5
6
7







-
-
-
-
-
-
-
if {[info exists tcl_platform(debug)]} {
    package ifneeded registry 1.0 \
            [list load [file join $dir tclreg83d.dll] registry]
} else {
    package ifneeded registry 1.0 \
            [list load [file join $dir tclreg83.dll] registry]
}
Changes to library/reg1.0/pkgIndex.tcl.

1
2
3
4
5
6
7
1
2
3
4
5
6
7
8
+







if {![package vsatisfies [package provide Tcl] 8]} {return}
if {[info exists tcl_platform(debug)]} {
    package ifneeded registry 1.0 \
            [list load [file join $dir tclreg83d.dll] registry]
} else {
    package ifneeded registry 1.0 \
            [list load [file join $dir tclreg83.dll] registry]
}
Changes to library/safe.tcl.
8
9
10
11
12
13
14
15

16
17
18
19
20
21
22
8
9
10
11
12
13
14

15
16
17
18
19
20
21
22







-
+







# See the safe.n man page for details.
#
# Copyright (c) 1996-1997 Sun Microsystems, Inc.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: safe.tcl,v 1.6 1999/08/19 02:59:40 hobbs Exp $
# RCS: @(#) $Id: safe.tcl,v 1.6.2.1 2001/04/03 22:54:38 hobbs Exp $

#
# The implementation is based on namespaces. These naming conventions
# are followed:
# Private procs starts with uppercase.
# Public  procs are exported and starts with lowercase
#
492
493
494
495
496
497
498
499

500
501
502
503
504
505
506
492
493
494
495
496
497
498

499
500
501
502
503
504
505
506







-
+







	foreach dir $pathList {
	    if {[file isdirectory $dir]} {
		# check that we don't have it yet as a children
		# of a previous dir
		if {[lsearch -exact $res $dir]<0} {
		    lappend res $dir
		}
		foreach sub [glob -nocomplain -- [file join $dir *]] {
		foreach sub [glob -directory $dir -nocomplain *] {
		    if {([file isdirectory $sub]) \
			    && ([lsearch -exact $res $sub]<0) } {
			# new sub dir, add it !
	                lappend res $sub
	            }
		}
	    }
Deleted library/tcltest/pkgIndex.tcl.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18


















-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# Tcl package index file, version 1.1
# This file is generated by the "pkg_mkIndex" command
# and sourced either when an application starts up or
# by a "package unknown" script.  It invokes the
# "package ifneeded" command to set up package-related
# information so that packages will be loaded automatically
# in response to "package require" commands.  When this
# script is sourced, the variable $dir must contain the
# full path name of this file's directory.

package ifneeded tcltest 1.0 [list tclPkgSetup $dir tcltest 1.0 \
	{{tcltest.tcl source {::tcltest::bytestring ::tcltest::cleanupTests \
        ::tcltest::makeDirectory ::tcltest::makeFile ::tcltest::normalizeMsg \
        ::tcltest::removeDirectory ::tcltest::removeFile \
        ::tcltest::restoreState ::tcltest::saveState ::tcltest::test \
        ::tcltest::threadReap ::tcltest::viewFile ::tcltest::grep \
        ::tcltest::getMatchingFiles ::tcltest::loadTestedCommands \
        ::tcltest::normalizePath }}}]
Deleted library/tcltest/tcltest.tcl.
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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
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
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905

















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# tcltest.tcl --
#
#	This file contains support code for the Tcl test suite.  It 
#       defines the ::tcltest namespace and finds and defines the output
#       directory, constraints available, output and error channels, etc. used
#       by Tcl tests.  See the tcltest man page for more details.
#       
#       This design was based on the Tcl testing approach designed and
#       initially implemented by Mary Ann May-Pumphrey of Sun Microsystems. 
#
# Copyright (c) 1994-1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
# All rights reserved.
# 
# RCS: @(#) $Id: tcltest.tcl,v 1.24 2000/04/11 01:04:19 welch Exp $

package provide tcltest 1.0

# create the "tcltest" namespace for all testing variables and procedures

namespace eval tcltest { 

    # Export the public tcltest procs
    set procList [list test cleanupTests saveState restoreState \
	    normalizeMsg makeFile removeFile makeDirectory removeDirectory \
	    viewFile bytestring safeFetch threadReap getMatchingFiles \
	    loadTestedCommands normalizePath]
    foreach proc $procList {
	namespace export $proc
    }

    # ::tcltest::verbose defaults to "b"
    if {![info exists verbose]} {
	variable verbose "b"
    }

    # Match and skip patterns default to the empty list, except for
    # matchFiles, which defaults to all .test files in the testsDirectory

    if {![info exists match]} {
	variable match {}
    }
    if {![info exists skip]} {
	variable skip {}
    }
    if {![info exists matchFiles]} {
	variable matchFiles {*.test}
    }
    if {![info exists skipFiles]} {
	variable skipFiles {}
    }

    # By default, don't save core files
    if {![info exists preserveCore]} {
	variable preserveCore 0
    }

    # output goes to stdout by default
    if {![info exists outputChannel]} {
	variable outputChannel stdout
    }

    # errors go to stderr by default
    if {![info exists errorChannel]} {
	variable errorChannel stderr
    }

    # debug output doesn't get printed by default; debug level 1 spits
    # up only the tests that were skipped because they didn't match or were 
    # specifically skipped.  A debug level of 2 would spit up the tcltest
    # variables and flags provided; a debug level of 3 causes some additional
    # output regarding operations of the test harness.  The tcltest package
    # currently implements only up to debug level 3.
    if {![info exists debug]} {
	variable debug 0
    }

    # Save any arguments that we might want to pass through to other programs. 
    # This is used by the -args flag.
    if {![info exists parameters]} {
	variable parameters {}
    }

    # Count the number of files tested (0 if all.tcl wasn't called).
    # The all.tcl file will set testSingleFile to false, so stats will
    # not be printed until all.tcl calls the cleanupTests proc.
    # The currentFailure var stores the boolean value of whether the
    # current test file has had any failures.  The failFiles list
    # stores the names of test files that had failures.

    if {![info exists numTestFiles]} {
	variable numTestFiles 0
    }
    if {![info exists testSingleFile]} {
	variable testSingleFile true
    }
    if {![info exists currentFailure]} {
	variable currentFailure false
    }
    if {![info exists failFiles]} {
	variable failFiles {}
    }

    # Tests should remove all files they create.  The test suite will
    # check the current working dir for files created by the tests.
    # ::tcltest::filesMade keeps track of such files created using the
    # ::tcltest::makeFile and ::tcltest::makeDirectory procedures.
    # ::tcltest::filesExisted stores the names of pre-existing files.

    if {![info exists filesMade]} {
	variable filesMade {}
    }
    if {![info exists filesExisted]} {
	variable filesExisted {}
    }

    # ::tcltest::numTests will store test files as indices and the list
    # of files (that should not have been) left behind by the test files.

    if {![info exists createdNewFiles]} {
	variable createdNewFiles
	array set ::tcltest::createdNewFiles {}
    }

    # initialize ::tcltest::numTests array to keep track fo the number of
    # tests that pass, fail, and are skipped.

    if {![info exists numTests]} {
	variable numTests
	array set ::tcltest::numTests \
		[list Total 0 Passed 0 Skipped 0 Failed	0] 
    }

    # initialize ::tcltest::skippedBecause array to keep track of
    # constraints that kept tests from running; a constraint name of
    # "userSpecifiedSkip" means that the test appeared on the list of tests
    # that matched the -skip value given to the flag; "userSpecifiedNonMatch"
    # means that the test didn't match the argument given to the -match flag;
    # both of these constraints are counted only if ::tcltest::debug is set to
    # true. 

    if {![info exists skippedBecause]} {
	variable skippedBecause
	array set ::tcltest::skippedBecause {}
    }

    # initialize the ::tcltest::testConstraints array to keep track of valid
    # predefined constraints (see the explanation for the
    # ::tcltest::initConstraints proc for more details).

    if {![info exists testConstraints]} {
	variable testConstraints
	array set ::tcltest::testConstraints {}
    }

    # Don't run only the constrained tests by default

    if {![info exists limitConstraints]} {
	variable limitConstraints false
    }

    # A test application has to know how to load the tested commands into
    # the interpreter.

    if {![info exists loadScript]} {
	variable loadScript {}
    }

    # tests that use threads need to know which is the main thread

    if {![info exists mainThread]} {
	variable mainThread 1
	if {[info commands thread::id] != {}} {
	    set mainThread [thread::id]
	} elseif {[info commands testthread] != {}} {
	    set mainThread [testthread id]
	}
    }

    # save the original environment so that it can be restored later
    
    if {![info exists originalEnv]} {
	variable originalEnv
	array set ::tcltest::originalEnv [array get ::env]
    }

    # Set ::tcltest::workingDirectory to [pwd]. The default output directory
    # for Tcl tests is the working directory.

    if {![info exists workingDirectory]} {
	variable workingDirectory [pwd]
    }
    if {![info exists temporaryDirectory]} {
	variable temporaryDirectory $workingDirectory
    }

    # Tests should not rely on the current working directory.
    # Files that are part of the test suite should be accessed relative to 
    # ::tcltest::testsDirectory.

    if {![info exists testsDirectory]} {
	set oldpwd [pwd]
	catch {cd [file join [file dirname [info script]] .. .. tests]}
	variable testsDirectory [pwd]
	cd $oldpwd
	unset oldpwd
    }

    # the variables and procs that existed when ::tcltest::saveState was
    # called are stored in a variable of the same name
    if {![info exists saveState]} {
	variable saveState {}
    }

    # Internationalization support
    if {![info exists isoLocale]} {
	variable isoLocale fr
        switch $tcl_platform(platform) {
	    "unix" {

		# Try some 'known' values for some platforms:

		switch -exact -- $tcl_platform(os) {
		    "FreeBSD" {
			set ::tcltest::isoLocale fr_FR.ISO_8859-1
		    }
		    HP-UX {
			set ::tcltest::isoLocale fr_FR.iso88591
		    }
		    Linux -
		    IRIX {
			set ::tcltest::isoLocale fr
		    }
		    default {

			# Works on SunOS 4 and Solaris, and maybe others...
			# define it to something else on your system
			#if you want to test those.

			set ::tcltest::isoLocale iso_8859_1
		    }
		}
	    }
	    "windows" {
		set ::tcltest::isoLocale French
	    }
	}
    }

    # Set the location of the execuatble
    if {![info exists tcltest]} {
	variable tcltest [info nameofexecutable]
    }

    # save the platform information so it can be restored later
    if {![info exists originalTclPlatform]} {
	variable originalTclPlatform [array get tcl_platform]
    }

    # If a core file exists, save its modification time.
    if {![info exists coreModificationTime]} {
	if {[file exists [file join $::tcltest::workingDirectory core]]} {
	    variable coreModificationTime [file mtime [file join \
		    $::tcltest::workingDirectory core]]
	}
    }

    # Tcl version numbers
    if {![info exists version]} {
	variable version 8.3
    }
    if {![info exists patchLevel]} {
	variable patchLevel 8.3.0
    }
}   

# ::tcltest::Debug* --
#
#     Internal helper procedures to write out debug information
#     dependent on the chosen level. A test shell may overide
#     them, f.e. to redirect the output into a different
#     channel, or even into a GUI.

# ::tcltest::DebugPuts --
#
#     Prints the specified string if the current debug level is
#     higher than the provided level argument.
#
# Arguments:
#     level   The lowest debug level triggering the output
#     string  The string to print out.
#
# Results:
#     Prints the string. Nothing else is allowed.
#

proc ::tcltest::DebugPuts {level string} {
    variable debug
    if {$debug >= $level} {
	puts $string
    }
}

# ::tcltest::DebugPArray --
#
#     Prints the contents of the specified array if the current
#       debug level is higher than the provided level argument
#
# Arguments:
#     level           The lowest debug level triggering the output
#     arrayvar        The name of the array to print out.
#
# Results:
#     Prints the contents of the array. Nothing else is allowed.
#

proc ::tcltest::DebugPArray {level arrayvar} {
    variable debug

    if {$debug >= $level} {
	catch {upvar  $arrayvar $arrayvar}
	parray $arrayvar
    }
}

# ::tcltest::DebugDo --
#
#     Executes the script if the current debug level is greater than
#       the provided level argument
#
# Arguments:
#     level   The lowest debug level triggering the execution.
#     script  The tcl script executed upon a debug level high enough.
#
# Results:
#     Arbitrary side effects, dependent on the executed script.
#

proc ::tcltest::DebugDo {level script} {
    variable debug

    if {$debug >= $level} {
	uplevel $script
    }
}

# ::tcltest::AddToSkippedBecause --
#
#	Increments the variable used to track how many tests were skipped
#       because of a particular constraint.
#
# Arguments:
#	constraint     The name of the constraint to be modified
#
# Results:
#	Modifies ::tcltest::skippedBecause; sets the variable to 1 if didn't
#       previously exist - otherwise, it just increments it.

proc ::tcltest::AddToSkippedBecause { constraint } {
    # add the constraint to the list of constraints that kept tests
    # from running

    if {[info exists ::tcltest::skippedBecause($constraint)]} {
	incr ::tcltest::skippedBecause($constraint)
    } else {
	set ::tcltest::skippedBecause($constraint) 1
    }
    return
}

# ::tcltest::PrintError --
#
#	Prints errors to ::tcltest::errorChannel and then flushes that
#       channel, making sure that all messages are < 80 characters per line.
#
# Arguments:
#	errorMsg     String containing the error to be printed
#

proc ::tcltest::PrintError {errorMsg} {
    set InitialMessage "Error:  "
    set InitialMsgLen  [string length $InitialMessage]
    puts -nonewline $::tcltest::errorChannel $InitialMessage

    # Keep track of where the end of the string is.
    set endingIndex [string length $errorMsg]

    if {$endingIndex < 80} {
	puts $::tcltest::errorChannel $errorMsg
    } else {
	# Print up to 80 characters on the first line, including the
	# InitialMessage. 
	set beginningIndex [string last " " [string range $errorMsg 0 \
		[expr {80 - $InitialMsgLen}]]]
	puts $::tcltest::errorChannel [string range $errorMsg 0 $beginningIndex]

	while {$beginningIndex != "end"} {
	    puts -nonewline $::tcltest::errorChannel \
		    [string repeat " " $InitialMsgLen]  
	    if {[expr {$endingIndex - $beginningIndex}] < 72} {
		puts $::tcltest::errorChannel [string trim \
			[string range $errorMsg $beginningIndex end]]
		set beginningIndex end
	    } else {
		set newEndingIndex [expr [string last " " [string range \
			$errorMsg $beginningIndex \
			[expr {$beginningIndex + 72}]]] + $beginningIndex]
		if {($newEndingIndex <= 0) \
			|| ($newEndingIndex <= $beginningIndex)} {
		    set newEndingIndex end
		}
		puts $::tcltest::errorChannel [string trim \
			[string range $errorMsg \
			$beginningIndex $newEndingIndex]]
		set beginningIndex $newEndingIndex
	    }
	}
    }
    flush $::tcltest::errorChannel
    return
}

if {[namespace inscope ::tcltest info procs initConstraintsHook] == {}} {
    proc ::tcltest::initConstraintsHook {} {}
}

# ::tcltest::initConstraints --
#
# Check Constraintsuration information that will determine which tests
# to run.  To do this, create an array ::tcltest::testConstraints.  Each
# element has a 0 or 1 value.  If the element is "true" then tests
# with that constraint will be run, otherwise tests with that constraint
# will be skipped.  See the tcltest man page for the list of built-in
# constraints defined in this procedure.
#
# Arguments:
#	none
#
# Results:
#	The ::tcltest::testConstraints array is reset to have an index for
#	each built-in test constraint.

proc ::tcltest::initConstraints {} {
    global tcl_platform tcl_interactive tk_version

    # The following trace procedure makes it so that we can safely refer to
    # non-existent members of the ::tcltest::testConstraints array without
    # causing an error.  Instead, reading a non-existent member will return 0.
    # This is necessary because tests are allowed to use constraint "X" without
    # ensuring that ::tcltest::testConstraints("X") is defined.

    trace variable ::tcltest::testConstraints r ::tcltest::safeFetch

    proc ::tcltest::safeFetch {n1 n2 op} {
	if {($n2 != {}) && ([info exists ::tcltest::testConstraints($n2)] == 0)} {
	    set ::tcltest::testConstraints($n2) 0
	}
    }

    ::tcltest::initConstraintsHook

    set ::tcltest::testConstraints(unixOnly) \
	    [string equal $tcl_platform(platform) "unix"]
    set ::tcltest::testConstraints(macOnly) \
	    [string equal $tcl_platform(platform) "macintosh"]
    set ::tcltest::testConstraints(pcOnly) \
	    [string equal $tcl_platform(platform) "windows"]

    set ::tcltest::testConstraints(unix) $::tcltest::testConstraints(unixOnly)
    set ::tcltest::testConstraints(mac) $::tcltest::testConstraints(macOnly)
    set ::tcltest::testConstraints(pc) $::tcltest::testConstraints(pcOnly)

    set ::tcltest::testConstraints(unixOrPc) \
	    [expr {$::tcltest::testConstraints(unix) \
	    || $::tcltest::testConstraints(pc)}]
    set ::tcltest::testConstraints(macOrPc) \
	    [expr {$::tcltest::testConstraints(mac) \
	    || $::tcltest::testConstraints(pc)}]
    set ::tcltest::testConstraints(macOrUnix) \
	    [expr {$::tcltest::testConstraints(mac) \
	    || $::tcltest::testConstraints(unix)}]

    set ::tcltest::testConstraints(nt) [string equal $tcl_platform(os) \
	    "Windows NT"]
    set ::tcltest::testConstraints(95) [string equal $tcl_platform(os) \
	    "Windows 95"]
    set ::tcltest::testConstraints(98) [string equal $tcl_platform(os) \
	    "Windows 98"]

    # The following Constraints switches are used to mark tests that should
    # work, but have been temporarily disabled on certain platforms because
    # they don't and we haven't gotten around to fixing the underlying
    # problem. 

    set ::tcltest::testConstraints(tempNotPc) \
	    [expr {!$::tcltest::testConstraints(pc)}]
    set ::tcltest::testConstraints(tempNotMac) \
	    [expr {!$::tcltest::testConstraints(mac)}]
    set ::tcltest::testConstraints(tempNotUnix) \
	    [expr {!$::tcltest::testConstraints(unix)}]

    # The following Constraints switches are used to mark tests that crash on
    # certain platforms, so that they can be reactivated again when the
    # underlying problem is fixed.

    set ::tcltest::testConstraints(pcCrash) \
	    [expr {!$::tcltest::testConstraints(pc)}]
    set ::tcltest::testConstraints(macCrash) \
	    [expr {!$::tcltest::testConstraints(mac)}]
    set ::tcltest::testConstraints(unixCrash) \
	    [expr {!$::tcltest::testConstraints(unix)}]

    # Skip empty tests

    set ::tcltest::testConstraints(emptyTest) 0

    # By default, tests that expose known bugs are skipped.

    set ::tcltest::testConstraints(knownBug) 0

    # By default, non-portable tests are skipped.

    set ::tcltest::testConstraints(nonPortable) 0

    # Some tests require user interaction.

    set ::tcltest::testConstraints(userInteraction) 0

    # Some tests must be skipped if the interpreter is not in interactive mode
    
    if {[info exists tcl_interactive]} {
	set ::tcltest::testConstraints(interactive) $::tcl_interactive
    } else {
	set ::tcltest::testConstraints(interactive) 0
    }

    # Some tests can only be run if the installation came from a CD image
    # instead of a web image
    # Some tests must be skipped if you are running as root on Unix.
    # Other tests can only be run if you are running as root on Unix.

    set ::tcltest::testConstraints(root) 0
    set ::tcltest::testConstraints(notRoot) 1
    set user {}
    if {[string equal $tcl_platform(platform) "unix"]} {
	catch {set user [exec whoami]}
	if {[string equal $user ""]} {
	    catch {regexp {^[^(]*\(([^)]*)\)} [exec id] dummy user}
	}
	if {([string equal $user "root"]) || ([string equal $user ""])} {
	    set ::tcltest::testConstraints(root) 1
	    set ::tcltest::testConstraints(notRoot) 0
	}
    }

    # Set nonBlockFiles constraint: 1 means this platform supports
    # setting files into nonblocking mode.

    if {[catch {set f [open defs r]}]} {
	set ::tcltest::testConstraints(nonBlockFiles) 1
    } else {
	if {[catch {fconfigure $f -blocking off}] == 0} {
	    set ::tcltest::testConstraints(nonBlockFiles) 1
	} else {
	    set ::tcltest::testConstraints(nonBlockFiles) 0
	}
	close $f
    }

    # Set asyncPipeClose constraint: 1 means this platform supports
    # async flush and async close on a pipe.
    #
    # Test for SCO Unix - cannot run async flushing tests because a
    # potential problem with select is apparently interfering.
    # (Mark Diekhans).

    if {[string equal $tcl_platform(platform) "unix"]} {
	if {[catch {exec uname -X | fgrep {Release = 3.2v}}] == 0} {
	    set ::tcltest::testConstraints(asyncPipeClose) 0
	} else {
	    set ::tcltest::testConstraints(asyncPipeClose) 1
	}
    } else {
	set ::tcltest::testConstraints(asyncPipeClose) 1
    }

    # Test to see if we have a broken version of sprintf with respect
    # to the "e" format of floating-point numbers.

    set ::tcltest::testConstraints(eformat) 1
    if {![string equal "[format %g 5e-5]" "5e-05"]} {
	set ::tcltest::testConstraints(eformat) 0
    }

    # Test to see if execed commands such as cat, echo, rm and so forth are
    # present on this machine.

    set ::tcltest::testConstraints(unixExecs) 1
    if {[string equal $tcl_platform(platform) "macintosh"]} {
	set ::tcltest::testConstraints(unixExecs) 0
    }
    if {($::tcltest::testConstraints(unixExecs) == 1) && \
	    ([string equal $tcl_platform(platform) "windows"])} {
	if {[catch {exec cat defs}] == 1} {
	    set ::tcltest::testConstraints(unixExecs) 0
	}
	if {($::tcltest::testConstraints(unixExecs) == 1) && \
		([catch {exec echo hello}] == 1)} {
	    set ::tcltest::testConstraints(unixExecs) 0
	}
	if {($::tcltest::testConstraints(unixExecs) == 1) && \
		([catch {exec sh -c echo hello}] == 1)} {
	    set ::tcltest::testConstraints(unixExecs) 0
	}
	if {($::tcltest::testConstraints(unixExecs) == 1) && \
		([catch {exec wc defs}] == 1)} {
	    set ::tcltest::testConstraints(unixExecs) 0
	}
	if {$::tcltest::testConstraints(unixExecs) == 1} {
	    exec echo hello > removeMe
	    if {[catch {exec rm removeMe}] == 1} {
		set ::tcltest::testConstraints(unixExecs) 0
	    }
	}
	if {($::tcltest::testConstraints(unixExecs) == 1) && \
		([catch {exec sleep 1}] == 1)} {
	    set ::tcltest::testConstraints(unixExecs) 0
	}
	if {($::tcltest::testConstraints(unixExecs) == 1) && \
		([catch {exec fgrep unixExecs defs}] == 1)} {
	    set ::tcltest::testConstraints(unixExecs) 0
	}
	if {($::tcltest::testConstraints(unixExecs) == 1) && \
		([catch {exec ps}] == 1)} {
	    set ::tcltest::testConstraints(unixExecs) 0
	}
	if {($::tcltest::testConstraints(unixExecs) == 1) && \
		([catch {exec echo abc > removeMe}] == 0) && \
		([catch {exec chmod 644 removeMe}] == 1) && \
		([catch {exec rm removeMe}] == 0)} {
	    set ::tcltest::testConstraints(unixExecs) 0
	} else {
	    catch {exec rm -f removeMe}
	}
	if {($::tcltest::testConstraints(unixExecs) == 1) && \
		([catch {exec mkdir removeMe}] == 1)} {
	    set ::tcltest::testConstraints(unixExecs) 0
	} else {
	    catch {exec rm -r removeMe}
	}
    }

    # Locate tcltest executable

    if {![info exists tk_version]} {
	set tcltest [info nameofexecutable]

	if {$tcltest == "{}"} {
	    set tcltest {}
	}
    }

    set ::tcltest::testConstraints(stdio) 0
    catch {
	catch {file delete -force tmp}
	set f [open tmp w]
	puts $f {
	    exit
	}
	close $f

	set f [open "|[list $tcltest tmp]" r]
	close $f
	
	set ::tcltest::testConstraints(stdio) 1
    }
    catch {file delete -force tmp}

    # Deliberately call socket with the wrong number of arguments.  The error
    # message you get will indicate whether sockets are available on this
    # system. 

    catch {socket} msg
    set ::tcltest::testConstraints(socket) \
	    [expr {$msg != "sockets are not available on this system"}]
    
    # Check for internationalization

    if {[info commands testlocale] == ""} {
	# No testlocale command, no tests...
	set ::tcltest::testConstraints(hasIsoLocale) 0
    } else {
	set ::tcltest::testConstraints(hasIsoLocale) \
		[string length [::tcltest::set_iso8859_1_locale]]
	::tcltest::restore_locale
    }
}   

# ::tcltest::PrintUsageInfoHook
#
#       Hook used for customization of display of usage information.
#

if {[namespace inscope ::tcltest info procs PrintUsageInfoHook] == {}} {
    proc ::tcltest::PrintUsageInfoHook {} {}
}

# ::tcltest::PrintUsageInfo
#
#	Prints out the usage information for package tcltest.  This can be
#       customized with the redefinition of ::tcltest::PrintUsageInfoHook.
#
# Arguments:
#	none
#

proc ::tcltest::PrintUsageInfo {} {
    puts [format "Usage: [file tail [info nameofexecutable]] \
	    script ?-help? ?flag value? ... \n\
	    Available flags (and valid input values) are: \n\
	    -help          \t Display this usage information. \n\
	    -verbose level \t Takes any combination of the values \n\
	    \t                 'p', 's' and 'b'.  Test suite will \n\
	    \t                 display all passed tests if 'p' is \n\
	    \t                 specified, all skipped tests if 's' \n\
	    \t                 is specified, and the bodies of \n\
	    \t                 failed tests if 'b' is specified. \n\
	    \t                 The default value is 'b'. \n\
	    -constraints list\t Do not skip the listed constraints\n\
	    -limitconstraints bool\t Only run tests with the constraints\n\
	    \t                 listed in -constraints.\n\
	    -match pattern \t Run all tests within the specified \n\
	    \t                 files that match the glob pattern \n\
	    \t                 given. \n\
	    -skip pattern  \t Skip all tests within the set of \n\
	    \t                 specified tests (via -match) and \n\
	    \t                 files that match the glob pattern \n\
	    \t                 given. \n\
	    -file pattern  \t Run tests in all test files that \n\
	    \t                 match the glob pattern given. \n\
	    -notfile pattern\t Skip all test files that match the \n\
	    \t                 glob pattern given. \n\
	    -preservecore level \t If 2, save any core files produced \n\
	    \t                 during testing in the directory \n\
	    \t                 specified by -tmpdir. If 1, notify the\n\
	    \t                 user if core files are created. The default \n\
	    \t                 is $::tcltest::preserveCore. \n\
	    -tmpdir directory\t Save temporary files in the specified\n\
	    \t                 directory.  The default value is \n\
	    \t                 $::tcltest::temporaryDirectory. \n\
	    -testdir directories\t Search tests in the specified\n\
	    \t                 directories.  The default value is \n\
	    \t                 $::tcltest::testsDirectory. \n\
	    -outfile file    \t Send output from test runs to the \n\
	    \t                 specified file.  The default is \n\
	    \t                 stdout. \n\
	    -errfile file    \t Send errors from test runs to the \n\
	    \t                 specified file.  The default is \n\
	    \t                 stderr. \n\
	    -loadfile file   \t Read the script to load the tested \n\
	    \t                 commands from the specified file. \n\
	    -load script     \t Specifies the script to load the tested \n\
	    \t                 commands. \n\
	    -debug level     \t Internal debug flag."]
    ::tcltest::PrintUsageInfoHook
    return
}

# ::tcltest::CheckDirectory --
#
#     This procedure checks whether the specified path is a readable
#     and/or writable directory. If one of the conditions is not
#     satisfied an error is printed and the application aborted. The
#     procedure assumes that the caller already checked the existence
#     of the path.
#
# Arguments
#     rw      Information what attributes to check. Allowed values:
#             r, w, rw, wr. If 'r' is part of the value the directory
#             must be readable. 'w' associates to 'writable'.
#     dir     The directory to check.
#     errMsg  The string to prepend to the actual error message before
#             printing it.
#
# Results
#     none
#

proc ::tcltest::CheckDirectory {rw dir errMsg} {
    # Allowed values for 'rw': r, w, rw, wr

    if {![file isdir $dir]} { 
	::tcltest::PrintError "$errMsg \"$dir\" is not a directory"
	exit 1
    } elseif {([string first w $rw] >= 0) && ![file writable $dir]} {
	::tcltest::PrintError "$errMsg \"$dir\" is not writeable"
	exit 1
    } elseif {([string first r $rw] >= 0) && ![file readable $dir]} {
	::tcltest::PrintError "$errMsg \"$dir\" is not readable"
	exit 1
    }
}

# ::tcltest::normalizePath --
#
#     This procedure resolves any symlinks in the path thus creating a
#     path without internal redirection. It assumes that the incoming
#     path is absolute.
#
# Arguments
#     pathVar contains the name of the variable containing the path to modify.
#
# Results
#     The path is modified in place.
#

proc ::tcltest::normalizePath {pathVar} {
    upvar $pathVar path

    set oldpwd [pwd]
    catch {cd $path}
    set path [pwd]
    cd $oldpwd
}

# ::tcltest::MakeAbsolutePath --
#
#     This procedure checks whether the incoming path is absolute or not.
#     Makes it absolute if it was not.
#
# Arguments
#     pathVar contains the name of the variable containing the path to modify.
#     prefix  is optional, contains the path to use to make the other an
#             absolute one. The current working directory is used if it was
#             not specified.
#
# Results
#     The path is modified in place.
#

proc ::tcltest::MakeAbsolutePath {pathVar {prefix {}}} {
    upvar $pathVar path

    if {![string equal [file pathtype $path] "absolute"]} { 
	if {$prefix == {}} {
	    set prefix [pwd]
	}

	set path [file join $prefix $path] 
    }
}

# ::tcltest::processCmdLineArgsFlagsHook --
#
#	This hook is used to add to the list of command line arguments that are
#       processed by ::tcltest::processCmdLineArgs. 
#

if {[namespace inscope ::tcltest info procs processCmdLineArgsAddFlagsHook] == {}} {
    proc ::tcltest::processCmdLineArgsAddFlagsHook {} {}
}

# ::tcltest::processCmdLineArgsHook --
#
#	This hook is used to actually process the flags added by
#       ::tcltest::processCmdLineArgsAddFlagsHook.
#
# Arguments:
#	flags      The flags that have been pulled out of argv
#

if {[namespace inscope ::tcltest info procs processCmdLineArgsHook] == {}} {
    proc ::tcltest::processCmdLineArgsHook {flag} {}
}

# ::tcltest::processCmdLineArgs --
#
#	Use command line args to set the verbose, skip, and
#	match, outputChannel, errorChannel, debug, and temporaryDirectory
#       variables.   
#
#       This procedure must be run after constraints are initialized, because
#       some constraints can be overridden.
#
# Arguments:
#	none
#
# Results:
#	Sets the above-named variables in the tcltest namespace.

proc ::tcltest::processCmdLineArgs {} {
    global argv

    # The "argv" var doesn't exist in some cases, so use {}.

    if {(![info exists argv]) || ([llength $argv] < 1)} {
	set flagArray {}
    } else {
	set flagArray $argv
    }
    
    # Allow for 1-char abbreviations, where applicable (e.g., -match == -m).
    # Note that -verbose cannot be abbreviated to -v in wish because it
    # conflicts with the wish option -visual.

    # Process -help first
    if {([lsearch -exact $flagArray {-help}] != -1) || \
	    ([lsearch -exact $flagArray {-h}] != -1)} {
	::tcltest::PrintUsageInfo
	exit 1
    }

    if {[catch {array set flag $flagArray}]} {
	::tcltest::PrintError "odd number of arguments specified on command line: \ 
	$argv"
	::tcltest::PrintUsageInfo
	exit 1
    }

    # -help is not listed since it has already been processed
    lappend defaultFlags -verbose -match -skip -constraints \
	    -outfile -errfile -debug -tmpdir -file -notfile \
	    -preservecore -limitconstraints -args -testdir \
	    -load -loadfile
    set defaultFlags [concat $defaultFlags \
	    [ ::tcltest::processCmdLineArgsAddFlagsHook ]]

    foreach arg $defaultFlags {
	set abbrev [string range $arg 0 1]
	if {([info exists flag($abbrev)]) && \
		([lsearch -exact $flagArray $arg] < [lsearch -exact \
		$flagArray $abbrev])} { 
	    set flag($arg) $flag($abbrev)
	}
    }

    # Set ::tcltest::parameters to the arg of the -args flag, if given
    if {[info exists flag(-args)]} {
	set ::tcltest::parameters $flag(-args)
    }

    # Set ::tcltest::verbose to the arg of the -verbose flag, if given

    if {[info exists flag(-verbose)]} {
	set ::tcltest::verbose $flag(-verbose)
    }

    # Set ::tcltest::match to the arg of the -match flag, if given.  

    if {[info exists flag(-match)]} {
	set ::tcltest::match $flag(-match)
    } 

    # Set ::tcltest::skip to the arg of the -skip flag, if given

    if {[info exists flag(-skip)]} {
	set ::tcltest::skip $flag(-skip)
    }

    # Handle the -file and -notfile flags
    if {[info exists flag(-file)]} {
	set ::tcltest::matchFiles $flag(-file)
    }
    if {[info exists flag(-notfile)]} {
	set ::tcltest::skipFiles $flag(-notfile)
    }

    # Use the -constraints flag, if given, to turn on constraints that are
    # turned off by default: userInteractive knownBug nonPortable.  This
    # code fragment must be run after constraints are initialized.

    if {[info exists flag(-constraints)]} {
	foreach elt $flag(-constraints) {
	    set ::tcltest::testConstraints($elt) 1
	}
    }

    # Use the -limitconstraints flag, if given, to tell the harness to limit
    # tests run to those that were specified using the -constraints flag.  If
    # the -constraints flag was not specified, print out an error and exit.
    if {[info exists flag(-limitconstraints)]} {
	if {![info exists flag(-constraints)]} {
	    puts "You can only use the -limitconstraints flag with \
		    -constraints"
	    exit 1
	}
	set ::tcltest::limitConstraints $flag(-limitconstraints)
	foreach elt [array names ::tcltest::testConstraints] {
	    if {[lsearch -exact $flag(-constraints) $elt] == -1} {
		set ::tcltest::testConstraints($elt) 0
	    }
	}
    }

    # Set the ::tcltest::temporaryDirectory to the arg of -tmpdir, if
    # given.
    # 
    # If the path is relative, make it absolute.  If the file exists but
    # is not a dir, then return an error.
    #
    # If ::tcltest::temporaryDirectory does not already exist, create it.
    # If you cannot create it, then return an error.

    set tmpDirError ""
    if {[info exists flag(-tmpdir)]} {
	set ::tcltest::temporaryDirectory $flag(-tmpdir)
	
	MakeAbsolutePath ::tcltest::temporaryDirectory
	set tmpDirError "bad argument \"$flag(-tmpdir)\" to -tmpdir: "
    }
    if {[file exists $::tcltest::temporaryDirectory]} {
	::tcltest::CheckDirectory rw $::tcltest::temporaryDirectory $tmpDirError
    } else {
	file mkdir $::tcltest::temporaryDirectory
    }

    normalizePath ::tcltest::temporaryDirectory

    # Set the ::tcltest::testsDirectory to the arg of -testdir, if
    # given.
    # 
    # If the path is relative, make it absolute.  If the file exists but
    # is not a dir, then return an error.
    #
    # If ::tcltest::temporaryDirectory does not already exist return an error.
    
    set testDirError ""
    if {[info exists flag(-testdir)]} {
	set ::tcltest::testsDirectory $flag(-testdir)
	
	MakeAbsolutePath ::tcltest::testsDirectory
	set testDirError "bad argument \"$flag(-testdir)\" to -testdir: "
    }
    if {[file exists $::tcltest::testsDirectory]} {
	::tcltest::CheckDirectory r $::tcltest::testsDirectory $testDirError
    } else {
	::tcltest::PrintError "$testDirError \"$::tcltest::testsDirectory\" \
		does not exist"
	exit 1
    }
    
    normalizePath ::tcltest::testsDirectory
    
    # Save the names of files that already exist in
    # the output directory.
    foreach file [glob -nocomplain \
	    [file join $::tcltest::temporaryDirectory *]] {
	lappend ::tcltest::filesExisted [file tail $file]
    }

    # If an alternate error or output files are specified, change the
    # default channels.

    if {[info exists flag(-outfile)]} {
	set tmp $flag(-outfile)
	MakeAbsolutePath tmp $::tcltest::temporaryDirectory
	set ::tcltest::outputChannel [open $tmp w]
    } 

    if {[info exists flag(-errfile)]} {
	set tmp $flag(-errfile)
	MakeAbsolutePath tmp $::tcltest::temporaryDirectory
	set ::tcltest::errorChannel [open $tmp w]
    }

    # If a load script was specified, either directly or through
    # a file, remember it for later usage.
    
    if {[info exists flag(-load)] &&  \
	    ([lsearch -exact $flagArray -load] > \
	    [lsearch -exact $flagArray -loadfile])} {
	    set ::tcltest::loadScript $flag(-load)
    }
    
    if {[info exists flag(-loadfile)] && \
	    ([lsearch -exact $flagArray -loadfile] > \
	    [lsearch -exact $flagArray -load]) } {
	set tmp $flag(-loadfile)
	MakeAbsolutePath tmp $::tcltest::temporaryDirectory
	set tmp [open $tmp r]
	set ::tcltest::loadScript [read $tmp]
	close $tmp
    }

    # If the user specifies debug testing, print out extra information during
    # the run.
    if {[info exists flag(-debug)]} {
	set ::tcltest::debug $flag(-debug)
    }

    # Handle -preservecore
    if {[info exists flag(-preservecore)]} {
	set ::tcltest::preserveCore $flag(-preservecore)
    }

    # Call the hook
    ::tcltest::processCmdLineArgsHook [array get flag]

    # Spit out everything you know if we're at a debug level 2 or greater

    DebugPuts    2 "Flags passed into tcltest:"
    DebugPArray  2 flag
    DebugPuts    2 "::tcltest::debug              = $::tcltest::debug"
    DebugPuts    2 "::tcltest::testsDirectory     = $::tcltest::testsDirectory"
    DebugPuts    2 "::tcltest::workingDirectory   = $::tcltest::workingDirectory"
    DebugPuts    2 "::tcltest::temporaryDirectory = $::tcltest::temporaryDirectory"
    DebugPuts    2 "::tcltest::outputChannel      = $::tcltest::outputChannel"
    DebugPuts    2 "::tcltest::errorChannel       = $::tcltest::errorChannel"
    DebugPuts    2 "Original environment (::tcltest::originalEnv):"
    DebugPArray  2 ::tcltest::originalEnv
    DebugPuts    2 "Constraints:"
    DebugPArray  2 ::tcltest::testConstraints
}

# ::tcltest::loadTestedCommands --
#
#     Uses the specified script to load the commands to test. Allowed to
#     be empty, as the tested commands could have been compiled into the
#     interpreter.
#
# Arguments
#     none
#
# Results
#     none

proc ::tcltest::loadTestedCommands {} {
    if {$::tcltest::loadScript == {}} {
	return
    }
    
    uplevel #0 $::tcltest::loadScript
}

# ::tcltest::cleanupTests --
#
# Remove files and dirs created using the makeFile and makeDirectory
# commands since the last time this proc was invoked.
#
# Print the names of the files created without the makeFile command
# since the tests were invoked.
#
# Print the number tests (total, passed, failed, and skipped) since the
# tests were invoked.
# 
# Restore original environment (as reported by special variable env).

proc ::tcltest::cleanupTests {{calledFromAllFile 0}} {

    set testFileName [file tail [info script]]

    # Call the cleanup hook
    ::tcltest::cleanupTestsHook 

    # Remove files and directories created by the :tcltest::makeFile and
    # ::tcltest::makeDirectory procedures.
    # Record the names of files in ::tcltest::workingDirectory that were not
    # pre-existing, and associate them with the test file that created them.

    if {!$calledFromAllFile} {
	foreach file $::tcltest::filesMade {
	    if {[file exists $file]} {
		catch {file delete -force $file}
	    }
	}
	set currentFiles {}
	foreach file [glob -nocomplain \
		[file join $::tcltest::temporaryDirectory *]] {
	    lappend currentFiles [file tail $file]
	}
	set newFiles {}
	foreach file $currentFiles {
	    if {[lsearch -exact $::tcltest::filesExisted $file] == -1} {
		lappend newFiles $file
	    }
	}
	set ::tcltest::filesExisted $currentFiles
	if {[llength $newFiles] > 0} {
	    set ::tcltest::createdNewFiles($testFileName) $newFiles
	}
    }

    if {$calledFromAllFile || $::tcltest::testSingleFile} {

	# print stats

	puts -nonewline $::tcltest::outputChannel "$testFileName:"
	foreach index [list "Total" "Passed" "Skipped" "Failed"] {
	    puts -nonewline $::tcltest::outputChannel \
		    "\t$index\t$::tcltest::numTests($index)"
	}
	puts $::tcltest::outputChannel ""

	# print number test files sourced
	# print names of files that ran tests which failed

	if {$calledFromAllFile} {
	    puts $::tcltest::outputChannel \
		    "Sourced $::tcltest::numTestFiles Test Files."
	    set ::tcltest::numTestFiles 0
	    if {[llength $::tcltest::failFiles] > 0} {
		puts $::tcltest::outputChannel \
			"Files with failing tests: $::tcltest::failFiles"
		set ::tcltest::failFiles {}
	    }
	}

	# if any tests were skipped, print the constraints that kept them
	# from running.

	set constraintList [array names ::tcltest::skippedBecause]
	if {[llength $constraintList] > 0} {
	    puts $::tcltest::outputChannel \
		    "Number of tests skipped for each constraint:"
	    foreach constraint [lsort $constraintList] {
		puts $::tcltest::outputChannel \
			"\t$::tcltest::skippedBecause($constraint)\t$constraint"
		unset ::tcltest::skippedBecause($constraint)
	    }
	}

	# report the names of test files in ::tcltest::createdNewFiles, and
	# reset the array to be empty.

	set testFilesThatTurded [lsort [array names ::tcltest::createdNewFiles]]
	if {[llength $testFilesThatTurded] > 0} {
	    puts $::tcltest::outputChannel "Warning: files left behind:"
	    foreach testFile $testFilesThatTurded {
		puts $::tcltest::outputChannel \
			"\t$testFile:\t$::tcltest::createdNewFiles($testFile)"
		unset ::tcltest::createdNewFiles($testFile)
	    }
	}

	# reset filesMade, filesExisted, and numTests

	set ::tcltest::filesMade {}
	foreach index [list "Total" "Passed" "Skipped" "Failed"] {
	    set ::tcltest::numTests($index) 0
	}

	# exit only if running Tk in non-interactive mode

	global tk_version tcl_interactive
	if {[info exists tk_version] && ![info exists tcl_interactive]} {
	    exit
	}
    } else {

	# if we're deferring stat-reporting until all files are sourced,
	# then add current file to failFile list if any tests in this file
	# failed

	incr ::tcltest::numTestFiles
	if {($::tcltest::currentFailure) && \
		([lsearch -exact $::tcltest::failFiles $testFileName] == -1)} {
	    lappend ::tcltest::failFiles $testFileName
	}
	set ::tcltest::currentFailure false

	# restore the environment to the state it was in before this package
	# was loaded

	set newEnv {}
	set changedEnv {}
	set removedEnv {}
	foreach index [array names ::env] {
	    if {![info exists ::tcltest::originalEnv($index)]} {
		lappend newEnv $index
		unset ::env($index)
	    } else {
		if {$::env($index) != $::tcltest::originalEnv($index)} {
		    lappend changedEnv $index
		    set ::env($index) $::tcltest::originalEnv($index)
		}
	    }
	}
	foreach index [array names ::tcltest::originalEnv] {
	    if {![info exists ::env($index)]} {
		lappend removedEnv $index
		set ::env($index) $::tcltest::originalEnv($index)
	    }
	}
	if {[llength $newEnv] > 0} {
	    puts $::tcltest::outputChannel \
		    "env array elements created:\t$newEnv"
	}
	if {[llength $changedEnv] > 0} {
	    puts $::tcltest::outputChannel \
		    "env array elements changed:\t$changedEnv"
	}
	if {[llength $removedEnv] > 0} {
	    puts $::tcltest::outputChannel \
		    "env array elements removed:\t$removedEnv"
	}

	set changedTclPlatform {}
	foreach index [array names ::tcltest::originalTclPlatform] {
	    if {$::tcl_platform($index) != \
		    $::tcltest::originalTclPlatform($index)} { 
		lappend changedTclPlatform $index
		set ::tcl_platform($index) \
			$::tcltest::originalTclPlatform($index) 
	    }
	}
	if {[llength $changedTclPlatform] > 0} {
	    puts $::tcltest::outputChannel \
		    "tcl_platform array elements changed:\t$changedTclPlatform"
	} 

	if {[file exists [file join $::tcltest::workingDirectory core]]} {
	    if {$::tcltest::preserveCore > 1} {
		puts $::tcltest::outputChannel "produced core file! \
			Moving file to: \
			[file join $::tcltest::temporaryDirectory core-$name]"
		flush $::tcltest::outputChannel
		catch {file rename -force \
			[file join $::tcltest::workingDirectory core] \
			[file join $::tcltest::temporaryDirectory \
			core-$name]} msg
		if {[string length $msg] > 0} {
		    ::tcltest::PrintError "Problem renaming file: $msg"
		}
	    } else {
		# Print a message if there is a core file and (1) there
		# previously wasn't one or (2) the new one is different from
		# the old one. 

		if {[info exists ::tcltest::coreModificationTime]} {
		    if {$::tcltest::coreModificationTime != [file mtime \
			    [file join $::tcltest::workingDirectory core]]} {
			puts $::tcltest::outputChannel "A core file was created!"
		    }
		} else {
		    puts $::tcltest::outputChannel "A core file was created!"
		} 
	    }
	}
    }
}

# ::tcltest::cleanupTestsHook --
#
#	This hook allows a harness that builds upon tcltest to specify
#       additional things that should be done at cleanup.
#

if {[namespace inscope ::tcltest info procs cleanupTestsHook] == {}} {
    proc ::tcltest::cleanupTestsHook {} {}
}

# test --
#
# This procedure runs a test and prints an error message if the test fails.
# If ::tcltest::verbose has been set, it also prints a message even if the
# test succeeds.  The test will be skipped if it doesn't match the
# ::tcltest::match variable, if it matches an element in
# ::tcltest::skip, or if one of the elements of "constraints" turns
# out not to be true.
#
# Arguments:
# name -		Name of test, in the form foo-1.2.
# description -		Short textual description of the test, to
#			help humans understand what it does.
# constraints -		A list of one or more keywords, each of
#			which must be the name of an element in
#			the array "::tcltest::testConstraints".  If any of these
#			elements is zero, the test is skipped.
#			This argument may be omitted.
# script -		Script to run to carry out the test.  It must
#			return a result that can be checked for
#			correctness.
# expectedAnswer -	Expected result from script.

proc ::tcltest::test {name description script expectedAnswer args} {

    DebugPuts 3 "Running $name ($description)"

    incr ::tcltest::numTests(Total)

    # skip the test if it's name matches an element of skip

    foreach pattern $::tcltest::skip {
	if {[string match $pattern $name]} {
	    incr ::tcltest::numTests(Skipped)
	    DebugDo 1 {::tcltest::AddToSkippedBecause userSpecifiedSkip}
	    return
	}
    }

    # skip the test if it's name doesn't match any element of match

    if {[llength $::tcltest::match] > 0} {
	set ok 0
	foreach pattern $::tcltest::match {
	    if {[string match $pattern $name]} {
		set ok 1
		break
	    }
        }
	if {!$ok} {
	    incr ::tcltest::numTests(Skipped)
	    DebugDo 1 {::tcltest::AddToSkippedBecause userSpecifiedNonMatch}
	    return
	}
    }

    set i [llength $args]
    if {$i == 0} {
	set constraints {}
	# If we're limited to the listed constraints and there aren't any
	# listed, then we shouldn't run the test.
	if {$::tcltest::limitConstraints} {
	    ::tcltest::AddToSkippedBecause userSpecifiedLimitConstraint
	    incr ::tcltest::numTests(Skipped)
	    return
	}
    } elseif {$i == 1} {

	# "constraints" argument exists;  shuffle arguments down, then
	# make sure that the constraints are satisfied.

	set constraints $script
	set script $expectedAnswer
	set expectedAnswer [lindex $args 0]
	set doTest 0
	if {[string match {*[$\[]*} $constraints] != 0} {
	    # full expression, e.g. {$foo > [info tclversion]}
	    catch {set doTest [uplevel #0 expr $constraints]}
	} elseif {[regexp {[^.a-zA-Z0-9 ]+} $constraints] != 0} {
	    # something like {a || b} should be turned into 
	    # $::tcltest::testConstraints(a) || $::tcltest::testConstraints(b).
 	    regsub -all {[.\w]+} $constraints \
		    {$::tcltest::testConstraints(&)} c
	    catch {set doTest [eval expr $c]}
	} else {
	    # just simple constraints such as {unixOnly fonts}.
	    set doTest 1
	    foreach constraint $constraints {
		if {(![info exists ::tcltest::testConstraints($constraint)]) \
			|| (!$::tcltest::testConstraints($constraint))} {
		    set doTest 0

		    # store the constraint that kept the test from running
		    set constraints $constraint
		    break
		}
	    }
	}
	if {$doTest == 0} {
	    if {[string first s $::tcltest::verbose] != -1} {
		puts $::tcltest::outputChannel "++++ $name SKIPPED: $constraints"
	    }

	    incr ::tcltest::numTests(Skipped)
	    ::tcltest::AddToSkippedBecause $constraints
	    return	
	}
    } else {
	error "wrong # args: must be \"test name description ?constraints? script expectedAnswer\""
    }   

    # Save information about the core file.  You need to restore the original
    # tcl_platform environment because some of the tests mess with tcl_platform.

    if {$::tcltest::preserveCore} {
	set currentTclPlatform [array get tcl_platform]
	array set tcl_platform $::tcltest::originalTclPlatform
	if {[file exists [file join $::tcltest::workingDirectory core]]} {
	    set coreModTime [file mtime [file join \
		    $::tcltest::workingDirectory core]]
	}
	array set tcl_platform $currentTclPlatform
    }

    # If there is no "memory" command (because memory debugging isn't
    # enabled), then don't attempt to use the command.
    
    if {[info commands memory] != {}} {
	memory tag $name
    }

    set code [catch {uplevel $script} actualAnswer]
    if {([string equal $actualAnswer $expectedAnswer]) && ($code == 0)} {
	incr ::tcltest::numTests(Passed)
	if {[string first p $::tcltest::verbose] != -1} {
	    puts $::tcltest::outputChannel "++++ $name PASSED"
	}
    } else {
	incr ::tcltest::numTests(Failed)
	set ::tcltest::currentFailure true
	if {[string first b $::tcltest::verbose] == -1} {
	    set script ""
	}
	puts $::tcltest::outputChannel "\n==== $name $description FAILED"
	if {$script != ""} {
	    puts $::tcltest::outputChannel "==== Contents of test case:"
	    puts $::tcltest::outputChannel $script
	}
	if {$code != 0} {
	    if {$code == 1} {
		puts $::tcltest::outputChannel "==== Test generated error:"
		puts $::tcltest::outputChannel $actualAnswer
	    } elseif {$code == 2} {
		puts $::tcltest::outputChannel "==== Test generated return exception;  result was:"
		puts $::tcltest::outputChannel $actualAnswer
	    } elseif {$code == 3} {
		puts $::tcltest::outputChannel "==== Test generated break exception"
	    } elseif {$code == 4} {
		puts $::tcltest::outputChannel "==== Test generated continue exception"
	    } else {
		puts $::tcltest::outputChannel "==== Test generated exception $code;  message was:"
		puts $::tcltest::outputChannel $actualAnswer
	    }
	} else {
	    puts $::tcltest::outputChannel "---- Result was:\n$actualAnswer"
	}
	puts $::tcltest::outputChannel "---- Result should have been:\n$expectedAnswer"
	puts $::tcltest::outputChannel "==== $name FAILED\n"
    }
    if {$::tcltest::preserveCore} {
	set currentTclPlatform [array get tcl_platform]
	if {[file exists [file join $::tcltest::workingDirectory core]]} {
	    if {$::tcltest::preserveCore > 1} {
		puts $::tcltest::outputChannel "==== $name produced core file! \
			Moving file to: \
			[file join $::tcltest::temporaryDirectory core-$name]"
		catch {file rename -force \
			[file join $::tcltest::workingDirectory core] \
			[file join $::tcltest::temporaryDirectory \
			core-$name]} msg
		if {[string length $msg] > 0} {
		    ::tcltest::PrintError "Problem renaming file: $msg"
		}
	    } else {
		# Print a message if there is a core file and (1) there
		# previously wasn't one or (2) the new one is different from
		# the old one. 

		if {[info exists coreModTime]} {
		    if {$coreModTime != [file mtime \
			    [file join $::tcltest::workingDirectory core]]} {
			puts $::tcltest::outputChannel "==== $name produced core file!"
		    }
		} else {
		    puts $::tcltest::outputChannel "==== $name produced core file!"
		} 
	    }
	}
	array set tcl_platform $currentTclPlatform
    }
}

# ::tcltest::getMatchingFiles
#
#       Looks at the patterns given to match and skip files
#       and uses them to put together a list of the tests that will be run.
#
# Arguments:
#       none
#
# Results:
#       The constructed list is returned to the user.  This will primarily
#       be used in 'all.tcl' files.

proc ::tcltest::getMatchingFiles {args} {
    set matchingFiles {}
    if {[llength $args]} {
	set searchDirectory $args
    } else {
	set searchDirectory [list $::tcltest::testsDirectory]
    }
    # Find the matching files in the list of directories and then remove the
    # ones that match the skip pattern
    foreach directory $searchDirectory {
	set matchFileList {}
	foreach match $::tcltest::matchFiles {
	    set matchFileList [concat $matchFileList \
		    [glob -nocomplain [file join $directory $match]]]
	}
	if {[string compare {} $::tcltest::skipFiles]} {
	    set skipFileList {}
	    foreach skip $::tcltest::skipFiles {
		set skipFileList [concat $skipFileList \
			[glob -nocomplain [file join $directory $skip]]]
	    }
	    foreach file $matchFileList {
		# Only include files that don't match the skip pattern and
		# aren't SCCS lock files.
		if {([lsearch -exact $skipFileList $file] == -1) && \
			(![string match l.*.test [file tail $file]])} {
		    lappend matchingFiles $file
		}
	    }
	} else {
	    set matchingFiles [concat $matchingFiles $matchFileList]
	}
    }
    if {[string equal $matchingFiles {}]} {
	::tcltest::PrintError "No test files remain after applying \
		your match and skip patterns!"
    }
    return $matchingFiles
}

# The following two procs are used in the io tests.

proc ::tcltest::openfiles {} {
    if {[catch {testchannel open} result]} {
	return {}
    }
    return $result
}

proc ::tcltest::leakfiles {old} {
    if {[catch {testchannel open} new]} {
        return {}
    }
    set leak {}
    foreach p $new {
    	if {[lsearch $old $p] < 0} {
	    lappend leak $p
	}
    }
    return $leak
}

# ::tcltest::saveState --
#
#	Save information regarding what procs and variables exist.
#
# Arguments:
#	none
#
# Results:
#	Modifies the variable ::tcltest::saveState

proc ::tcltest::saveState {} {
    uplevel #0 {set ::tcltest::saveState [list [info procs] [info vars]]}
    DebugPuts  2 "::tcltest::saveState: $::tcltest::saveState"
}

# ::tcltest::restoreState --
#
#	Remove procs and variables that didn't exist before the call to
#       ::tcltest::saveState.
#
# Arguments:
#	none
#
# Results:
#	Removes procs and variables from your environment if they don't exist
#       in the ::tcltest::saveState variable.

proc ::tcltest::restoreState {} {
    foreach p [info procs] {
	if {([lsearch [lindex $::tcltest::saveState 0] $p] < 0) && \
		(![string equal ::tcltest::$p [namespace origin $p]])} {
	    
	    DebugPuts 3 "::tcltest::restoreState: Removing proc $p"
	    rename $p {}
	}
    }
    foreach p [uplevel #0 {info vars}] {
	if {[lsearch [lindex $::tcltest::saveState 1] $p] < 0} {
	    DebugPuts 3 "::tcltest::restoreState: Removing variable $p"
	    uplevel #0 "catch {unset $p}"
	}
    }
}

# ::tcltest::normalizeMsg --
#
#	Removes "extra" newlines from a string.
#
# Arguments:
#	msg        String to be modified
#

proc ::tcltest::normalizeMsg {msg} {
    regsub "\n$" [string tolower $msg] "" msg
    regsub -all "\n\n" $msg "\n" msg
    regsub -all "\n\}" $msg "\}" msg
    return $msg
}

# makeFile --
#
# Create a new file with the name <name>, and write <contents> to it.
#
# If this file hasn't been created via makeFile since the last time
# cleanupTests was called, add it to the $filesMade list, so it will
# be removed by the next call to cleanupTests.
#
proc ::tcltest::makeFile {contents name} {
    global tcl_platform
    
    DebugPuts 3 "::tcltest::makeFile: putting $contents into $name"

    set fullName [file join $::tcltest::temporaryDirectory $name]
    set fd [open $fullName w]

    fconfigure $fd -translation lf

    if {[string equal [string index $contents end] "\n"]} {
	puts -nonewline $fd $contents
    } else {
	puts $fd $contents
    }
    close $fd

    if {[lsearch -exact $::tcltest::filesMade $fullName] == -1} {
	lappend ::tcltest::filesMade $fullName
    }
    return $fullName
}

# ::tcltest::removeFile --
#
#	Removes the named file from the filesystem
#
# Arguments:
#	name     file to be removed
#

proc ::tcltest::removeFile {name} {
    DebugPuts 3 "::tcltest::removeFile: removing $name"
    file delete [file join $::tcltest::temporaryDirectory $name]
}

# makeDirectory --
#
# Create a new dir with the name <name>.
#
# If this dir hasn't been created via makeDirectory since the last time
# cleanupTests was called, add it to the $directoriesMade list, so it will
# be removed by the next call to cleanupTests.
#
proc ::tcltest::makeDirectory {name} {
    file mkdir $name

    set fullName [file join [pwd] $name]
    if {[lsearch -exact $::tcltest::filesMade $fullName] == -1} {
	lappend ::tcltest::filesMade $fullName
    }
}

# ::tcltest::removeDirectory --
#
#	Removes a named directory from the file system.
#
# Arguments:
#	name    Name of the directory to remove
#

proc ::tcltest::removeDirectory {name} {
    file delete -force $name
}

proc ::tcltest::viewFile {name} {
    global tcl_platform
    if {([string equal $tcl_platform(platform) "macintosh"]) || \
	    ($::tcltest::testConstraints(unixExecs) == 0)} {
	set f [open [file join $::tcltest::temporaryDirectory $name]]
	set data [read -nonewline $f]
	close $f
	return $data
    } else {
	exec cat [file join $::tcltest::temporaryDirectory $name]
    }
}

# grep --
#
# Evaluate a given expression against each element of a list and return all
# elements for which the expression evaluates to true.  For the purposes of
# this proc, use of the keyword "CURRENT_ELEMENT" will flag the proc to use the
# value of the current element within the expression.  This is equivalent to
# the perl grep command where CURRENT_ELEMENT would be the name for the special
# variable $_.
#
# Examples of usage would be:
#   set subList [grep {CURRENT_ELEMENT == 1} $listOfNumbers]
#   set subList [grep {regexp {abc} CURRENT_ELEMENT} $listOfStrings]
#
# Use of the CURRENT_ELEMENT keyword is optional.  If it is left out, it is
# assumed to be the final argument to the expression provided.
# 
# Example:
#   grep {regexp a} $someList   
#
proc ::tcltest::grep { expression searchList } {
    foreach element $searchList {
	if {[regsub -all CURRENT_ELEMENT $expression $element \
		newExpression] == 0} { 
	    set newExpression "$expression {$element}"
	}
	if {[eval $newExpression] == 1} {
	    lappend returnList $element
	}
    }
    if {[info exists returnList]} {
	return $returnList
    }
    return
}

#
# Construct a string that consists of the requested sequence of bytes,
# as opposed to a string of properly formed UTF-8 characters.  
# This allows the tester to 
# 1. Create denormalized or improperly formed strings to pass to C procedures 
#    that are supposed to accept strings with embedded NULL bytes.
# 2. Confirm that a string result has a certain pattern of bytes, for instance
#    to confirm that "\xe0\0" in a Tcl script is stored internally in 
#    UTF-8 as the sequence of bytes "\xc3\xa0\xc0\x80".
#
# Generally, it's a bad idea to examine the bytes in a Tcl string or to
# construct improperly formed strings in this manner, because it involves
# exposing that Tcl uses UTF-8 internally.

proc ::tcltest::bytestring {string} {
    encoding convertfrom identity $string
}

#
# Internationalization / ISO support procs     -- dl
#
proc ::tcltest::set_iso8859_1_locale {} {
    if {[info commands testlocale] != ""} {
	set ::tcltest::previousLocale [testlocale ctype]
	testlocale ctype $::tcltest::isoLocale
    }
    return
}

proc ::tcltest::restore_locale {} {
    if {[info commands testlocale] != ""} {
	testlocale ctype $::tcltest::previousLocale
    }
    return
}

# threadReap --
#
#	Kill all threads except for the main thread.
#	Do nothing if testthread is not defined.
#
# Arguments:
#	none.
#
# Results:
#	Returns the number of existing threads.
proc ::tcltest::threadReap {} {
    if {[info commands testthread] != {}} {

	# testthread built into tcltest

	testthread errorproc ThreadNullError
	while {[llength [testthread names]] > 1} {
	    foreach tid [testthread names] {
		if {$tid != $::tcltest::mainThread} {
		    catch {testthread send -async $tid {testthread exit}}
		}
	    }
	    ## Enter a bit a sleep to give the threads enough breathing
	    ## room to kill themselves off, otherwise the end up with a
	    ## massive queue of repeated events
	    after 1
	}
	testthread errorproc ThreadError
	return [llength [testthread names]]
    } elseif {[info commands thread::id] != {}} {
	
	# Thread extension

	thread::errorproc ThreadNullError
	while {[llength [thread::names]] > 1} {
	    foreach tid [thread::names] {
		if {$tid != $::tcltest::mainThread} {
		    catch {thread::send -async $tid {thread::exit}}
		}
	    }
	    ## Enter a bit a sleep to give the threads enough breathing
	    ## room to kill themselves off, otherwise the end up with a
	    ## massive queue of repeated events
	    after 1
	}
	thread::errorproc ThreadError
	return [llength [thread::names]]
    } else {
	return 1
    }
}

# Initialize the constraints and set up command line arguments 
namespace eval tcltest {
    # Ensure that we have a minimal auto_path so we don't pick up extra junk.
    set ::auto_path [list [info library]]

    ::tcltest::initConstraints
    if {[namespace children ::tcltest] == {}} {
	::tcltest::processCmdLineArgs
    }
}
Changes to library/tcltest1.0/pkgIndex.tcl.
1
2
3
4
5
6
7
8
9
10

11

12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10
11

12

















+
-
+
-
-
-
-
-
-
-
# Tcl package index file, version 1.1
# This file is generated by the "pkg_mkIndex" command
# and sourced either when an application starts up or
# by a "package unknown" script.  It invokes the
# "package ifneeded" command to set up package-related
# information so that packages will be loaded automatically
# in response to "package require" commands.  When this
# script is sourced, the variable $dir must contain the
# full path name of this file's directory.

if {![package vsatisfies [package provide Tcl] 8.2]} {return}
package ifneeded tcltest 1.0 [list tclPkgSetup $dir tcltest 1.0 \
package ifneeded tcltest 1.0.2 [list source [file join $dir tcltest.tcl]]
	{{tcltest.tcl source {::tcltest::bytestring ::tcltest::cleanupTests \
        ::tcltest::makeDirectory ::tcltest::makeFile ::tcltest::normalizeMsg \
        ::tcltest::removeDirectory ::tcltest::removeFile \
        ::tcltest::restoreState ::tcltest::saveState ::tcltest::test \
        ::tcltest::threadReap ::tcltest::viewFile ::tcltest::grep \
        ::tcltest::getMatchingFiles ::tcltest::loadTestedCommands \
        ::tcltest::normalizePath }}}]
Changes to library/tcltest1.0/tcltest.tcl.
8
9
10
11
12
13
14
15

16

17

18
19
20
21
22
23
24
8
9
10
11
12
13
14

15
16
17

18
19
20
21
22
23
24
25







-
+

+
-
+







#       This design was based on the Tcl testing approach designed and
#       initially implemented by Mary Ann May-Pumphrey of Sun Microsystems. 
#
# Copyright (c) 1994-1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
# All rights reserved.
# 
# RCS: @(#) $Id: tcltest.tcl,v 1.24 2000/04/11 01:04:19 welch Exp $
# RCS: @(#) $Id: tcltest.tcl,v 1.24.2.3 2002/03/24 19:07:48 dgp Exp $

package require Tcl 8.2
package provide tcltest 1.0
package provide tcltest 1.0.2

# create the "tcltest" namespace for all testing variables and procedures

namespace eval tcltest { 

    # Export the public tcltest procs
    set procList [list test cleanupTests saveState restoreState \
416
417
418
419
420
421
422
423

424
425
426
427
428
429
430
417
418
419
420
421
422
423

424
425
426
427
428
429
430
431







-
+







	    }
	}
    }
    flush $::tcltest::errorChannel
    return
}

if {[namespace inscope ::tcltest info procs initConstraintsHook] == {}} {
if {[llength [info commands ::tcltest::initConstraintsHook]] == 0} {
    proc ::tcltest::initConstraintsHook {} {}
}

# ::tcltest::initConstraints --
#
# Check Constraintsuration information that will determine which tests
# to run.  To do this, create an array ::tcltest::testConstraints.  Each
648
649
650
651
652
653
654

655
656
657
658
659
660
661
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663







+







	} else {
	    catch {exec rm -r removeMe}
	}
    }

    # Locate tcltest executable

    variable tcltest
    if {![info exists tk_version]} {
	set tcltest [info nameofexecutable]

	if {$tcltest == "{}"} {
	    set tcltest {}
	}
    }
697
698
699
700
701
702
703
704

705
706
707
708
709
710
711
699
700
701
702
703
704
705

706
707
708
709
710
711
712
713







-
+







}   

# ::tcltest::PrintUsageInfoHook
#
#       Hook used for customization of display of usage information.
#

if {[namespace inscope ::tcltest info procs PrintUsageInfoHook] == {}} {
if {[llength [info commands ::tcltest::PrintUsageInfoHook]] == 0} {
    proc ::tcltest::PrintUsageInfoHook {} {}
}

# ::tcltest::PrintUsageInfo
#
#	Prints out the usage information for package tcltest.  This can be
#       customized with the redefinition of ::tcltest::PrintUsageInfoHook.
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
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







-
+












-
+








# ::tcltest::processCmdLineArgsFlagsHook --
#
#	This hook is used to add to the list of command line arguments that are
#       processed by ::tcltest::processCmdLineArgs. 
#

if {[namespace inscope ::tcltest info procs processCmdLineArgsAddFlagsHook] == {}} {
if {[llength [info commands ::tcltest::processCmdLineArgsAddFlagsHook]] == 0} {
    proc ::tcltest::processCmdLineArgsAddFlagsHook {} {}
}

# ::tcltest::processCmdLineArgsHook --
#
#	This hook is used to actually process the flags added by
#       ::tcltest::processCmdLineArgsAddFlagsHook.
#
# Arguments:
#	flags      The flags that have been pulled out of argv
#

if {[namespace inscope ::tcltest info procs processCmdLineArgsHook] == {}} {
if {[llength [info commands ::tcltest::processCmdLineArgsHook]] == 0} {
    proc ::tcltest::processCmdLineArgsHook {flag} {}
}

# ::tcltest::processCmdLineArgs --
#
#	Use command line args to set the verbose, skip, and
#	match, outputChannel, errorChannel, debug, and temporaryDirectory
1341
1342
1343
1344
1345
1346
1347
1348

1349
1350
1351
1352
1353
1354
1355
1343
1344
1345
1346
1347
1348
1349

1350
1351
1352
1353
1354
1355
1356
1357







-
+








# ::tcltest::cleanupTestsHook --
#
#	This hook allows a harness that builds upon tcltest to specify
#       additional things that should be done at cleanup.
#

if {[namespace inscope ::tcltest info procs cleanupTestsHook] == {}} {
if {[llength [info commands ::tcltest::cleanupTestsHook]] == 0} {
    proc ::tcltest::cleanupTestsHook {} {}
}

# test --
#
# This procedure runs a test and prints an error message if the test fails.
# If ::tcltest::verbose has been set, it also prints a message even if the
Changes to mac/MW_TclAppleScriptHeader.pch.
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
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

















-
+




















-

-
-
-
-
-
-
-
-
-
-
 *  compiler flags.  See MetroWerks documention for more details.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: MW_TclAppleScriptHeader.pch,v 1.4 1999/05/11 07:11:46 jingham Exp $
 * RCS: @(#) $Id: MW_TclAppleScriptHeader.pch,v 1.4.12.1 2001/04/04 21:22:18 hobbs Exp $
 */

/*
 * To use the compilied header you need to set the "Prefix file" in
 * the "C/C++ Language" preference panel to point to the created
 * compilied header.  The name of the header depends on the
 * architecture we are compiling for (see the code below).  For
 * example, for a 68k app the prefix file should be: MW_TclHeader68K.
 */

#if __POWERPC__
#pragma precompile_target "MW_TclAppleScriptHeaderPPC"
#elif __CFM68K__
#pragma precompile_target "MW_TclAppleScriptHeaderCFM68K"
#else
#pragma precompile_target "MW_TclAppleScriptHeader68K"
#endif

#include "tclMacCommonPch.h"

/* #define TCL_REGISTER_LIBRARY 1 */
#define USE_TCL_STUBS

/*
 * Place any includes below that will are needed by the majority of the
 * and is OK to be in any file in the system.  The pragma's are used
 * to control what functions are exported in the Tcl shared library.
 */

#pragma export on
#pragma export off

Added mac/MW_TclBuildLibHeader.h.







1
2
3
4
5
6
7
+
+
+
+
+
+
+
#if __POWERPC__
#include "MW_TclBuildLibHeaderPPC"
#elif __CFM68K__
#include "MW_TclBuildLibHeaderCFM68K"
#else
#include "MW_TclBuildLibHeader68K"
#endif
Added mac/MW_TclBuildLibHeader.pch.



































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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
/*
 * MW_TclBuildLibHeader.pch --
 *
 *  This file is the source for a pre-compilied header that gets used
 *  for all files in the Tcl projects.  This make compilies go a bit
 *  faster.  This file is only intended to be used in the MetroWerks
 *  CodeWarrior environment.  It essentially acts as a place to set 
 *  compiler flags.  See MetroWerks documention for more details.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id$
 */

/*
 * To use the compilied header you need to set the "Prefix file" in
 * the "C/C++ Language" preference panel to point to the created
 * compilied header.  The name of the header depends on the
 * architecture we are compiling for (see the code below).  For
 * example, for a 68k app the prefix file should be: MW_TclHeader68K.
 */
#if __POWERPC__
#pragma precompile_target "MW_TclBuildLibHeaderPPC"
#elif __CFM68K__
#pragma precompile_target "MW_TclBuildLibHeaderCFM68K"
#else
#pragma precompile_target "MW_TclBuildLibHeader68K"
#endif

#define BUILD_tcl 1

#include "MW_TclHeaderCommon.h"
Changes to mac/MW_TclHeader.pch.
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
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














-
+

















-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
 *  compiler flags.  See MetroWerks documention for more details.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: MW_TclHeader.pch,v 1.7 1999/05/11 07:11:48 jingham Exp $
 * RCS: @(#) $Id: MW_TclHeader.pch,v 1.7.12.1 2001/04/04 21:22:18 hobbs Exp $
 */

/*
 * To use the compilied header you need to set the "Prefix file" in
 * the "C/C++ Language" preference panel to point to the created
 * compilied header.  The name of the header depends on the
 * architecture we are compiling for (see the code below).  For
 * example, for a 68k app the prefix file should be: MW_TclHeader68K.
 */
#if __POWERPC__
#pragma precompile_target "MW_TclHeaderPPC"
#elif __CFM68K__
#pragma precompile_target "MW_TclHeaderCFM68K"
#else
#pragma precompile_target "MW_TclHeader68K"
#endif

#include "tclMacCommonPch.h"

/*
 * Place any includes below that will are needed by the majority of the
 * and is OK to be in any file in the system.  The pragma's are used
 * to control what functions are exported in the Tcl shared library.
 */

#pragma export on
#include "tcl.h"
#include "MW_TclHeaderCommon.h"
#include "tclMac.h"
#include "tclInt.h"
#include "MoreFiles.h"
#include "MoreFilesExtras.h"

#pragma export reset

Added mac/MW_TclHeaderCommon.h.






















































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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
/*
 * MW_TclHeaderCommon.h --
 *
 * 	Common includes for precompiled headers
 *
 * Copyright (c) 1998 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id$
 */

#pragma once

#include "tclMacCommonPch.h"

/*
 * Place any includes below that will are needed by the majority of the
 * and is OK to be in any file in the system.
 */

#include "tcl.h"

#ifdef BUILD_tcl
# undef TCL_STORAGE_CLASS
# define TCL_STORAGE_CLASS DLLEXPORT
#endif
#include "tclMac.h"
#undef TCL_STORAGE_CLASS
#define TCL_STORAGE_CLASS DLLIMPORT

#include "tclInt.h"


#if PRAGMA_IMPORT
#pragma import on
#endif

#include <MoreFiles.h>
#include <MoreFilesExtras.h>
#include <FSpCompat.h>
#include <FileCopy.h>
#include <FullPath.h>
#include <IterateDirectory.h>
#include <MoreDesktopMgr.h>
#include <DirectoryCopy.h>
#include <Search.h>

#ifdef PRAGMA_IMPORT_OFF
#pragma import off
#elif PRAGMA_IMPORT
#pragma import reset
#endif
Added mac/MW_TclStaticHeader.h.







1
2
3
4
5
6
7
+
+
+
+
+
+
+
#if __POWERPC__
#include "MW_TclStaticHeaderPPC"
#elif __CFM68K__
#include "MW_TclStaticHeaderCFM68K"
#else
#include "MW_TclStaticHeader68K"
#endif
Added mac/MW_TclStaticHeader.pch.



































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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
/*
 * MW_TclStaticHeader.pch --
 *
 *  This file is the source for a pre-compilied header that gets used
 *  for all files in the Tcl projects.  This make compilies go a bit
 *  faster.  This file is only intended to be used in the MetroWerks
 *  CodeWarrior environment.  It essentially acts as a place to set 
 *  compiler flags.  See MetroWerks documention for more details.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id$
 */

/*
 * To use the compilied header you need to set the "Prefix file" in
 * the "C/C++ Language" preference panel to point to the created
 * compilied header.  The name of the header depends on the
 * architecture we are compiling for (see the code below).  For
 * example, for a 68k app the prefix file should be: MW_TclHeader68K.
 */
#if __POWERPC__
#pragma precompile_target "MW_TclStaticHeaderPPC"
#elif __CFM68K__
#pragma precompile_target "MW_TclStaticHeaderCFM68K"
#else
#pragma precompile_target "MW_TclStaticHeader68K"
#endif

#define STATIC_BUILD 1

#include "MW_TclHeaderCommon.h"
Changes to mac/MW_TclTestHeader.pch.
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

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

-
+












-
+

















-
+

-
+

-
-
+
-
-
-
-
-

-
-
+
-
-
-
-

-
-
+
/*
 * MW_TclHeader.pch --
 * MW_TclTestHeader.pch --
 *
 *  This file is the source for a pre-compilied header that gets used
 *  for all files in the Tcl projects.  This make compilies go a bit
 *  faster.  This file is only intended to be used in the MetroWerks
 *  CodeWarrior environment.  It essentially acts as a place to set 
 *  compiler flags.  See MetroWerks documention for more details.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: MW_TclTestHeader.pch,v 1.1 2000/02/10 08:39:11 jingham Exp $
 * RCS: @(#) $Id: MW_TclTestHeader.pch,v 1.1.2.1 2001/04/04 21:22:18 hobbs Exp $
 */

/*
 * To use the compilied header you need to set the "Prefix file" in
 * the "C/C++ Language" preference panel to point to the created
 * compilied header.  The name of the header depends on the
 * architecture we are compiling for (see the code below).  For
 * example, for a 68k app the prefix file should be: MW_TclHeader68K.
 */
#if __POWERPC__
#pragma precompile_target "MW_TclTestHeaderPPC"
#elif __CFM68K__
#pragma precompile_target "MW_TclTestHeaderCFM68K"
#else
#pragma precompile_target "MW_TclTestHeader68K"
#endif

#define TCL_DEBUG 1
#define BUILD_tcl 1

/*#define TCL_THREADS 1*/
#define STATIC_BUILD 1

#include "tclMacCommonPch.h"

#define TCL_DEBUG 1
/*
 * Place any includes below that will are needed by the majority of the
 * and is OK to be in any file in the system.  The pragma's are used
 * to control what functions are exported in the Tcl shared library.
 */

#pragma export on
#include "tcl.h"
#define TCL_THREADS 1
#include "tclMac.h"
#include "tclInt.h"
#include "MoreFiles.h"
#include "MoreFilesExtras.h"

#pragma export reset

#include "MW_TclHeaderCommon.h"
Changes to mac/README.
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
1
2









3
4
5
6
7
8
9

10
11
12

13
14
15

16
17
18
19
20
21
22
23


-
-
-
-
-
-
-
-
-
+






-
+


-
+


-
+







Tcl 8.3 for Macintosh

by Ray Johnson
Scriptics Corporation
rjohnson@scriptics.com
with major help from
Jim Ingham
Cygnus Solutions
jingham@cygnus.com

RCS: @(#) $Id: README,v 1.12 2000/04/26 17:31:20 hobbs Exp $
RCS: @(#) $Id: README,v 1.12.2.2 2001/10/03 20:26:09 hobbs Exp $

1. Introduction
---------------

This is the README file for the Macintosh version of the Tcl
scripting language.  The home page for the Macintosh releases is
	http://dev.scriptics.com/software/mac/
	http://www.tcl-tk.net/software/mac/

A summary of what's new in this release is at
	http://dev.scriptics.com/software/tcltk/8.3.html
	http://www.tcl-tk.net/software/tcltk/8.3.html

A summary of Macintosh-specific features is at
	http://dev.scriptics.com/software/mac/features.html
	http://www.tcl-tk.net/software/mac/features.html


2. The Distribution
-------------------

Macintosh Tcl is distributed in three different forms.  This should
make it easier to only download what you need.  Substitute <version>
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

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







-
+











-
-
+
+

-
+

-
+
-
-

+
    addition, Metrowerks CodeWarrior libraries and project files
    are included.  However, you must already have the More Files
    package to compile this code.

The "html" subdirectory contains reference documentation in
in the HTML format.  You may also find these pages at:

	http://dev.scriptics.com/man/tcl<version>/contents.html
	http://www.tcl-tk.net/man/tcl<version>/contents.html

3. Compiling Tcl
----------------

In order to compile Macintosh Tcl you must have the 
following items:

	CodeWarrior Pro 5+
	Mac Tcl (sources)
	More Files 1.4.9

The included project files should work fine.  However, for
current release notes please check this page:
The included project files should work fine.  However, for current
release notes please check this page:

	http://dev.scriptics.com/doc/howto/compile.html#mac
	http://www.tcl-tk.net/doc/howto/compile.html#mac

If you have comments or Bug reports send them to:
If you have comments or bug reports, report them to the bug database at:
Jim Ingham
jingham@cygnus.com

	http://tcl.sourceforge.net/
Changes to mac/tclMac.h.
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
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










-
+












-
-
-
-
-
-
-
-




-
-

/*
 * tclMac.h --
 *
 *	Declarations of Macintosh specific public variables and procedures.
 *
 * Copyright (c) 1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMac.h,v 1.4 1999/03/10 05:52:51 stanton Exp $
 * RCS: @(#) $Id: tclMac.h,v 1.4.14.1 2001/04/04 21:22:18 hobbs Exp $
 */

#ifndef _TCLMAC
#define _TCLMAC

#ifndef _TCL
#   include "tcl.h"
#endif
#include <Types.h>
#include <Files.h>
#include <Events.h>

/*
 * "export" is a MetroWerks specific pragma.  It flags the linker that  
 * any symbols that are defined when this pragma is on will be exported 
 * to shared libraries that link with this library.
 */
 
#pragma export on

typedef int (*Tcl_MacConvertEventPtr) _ANSI_ARGS_((EventRecord *eventPtr));

#include "tclPlatDecls.h"

#pragma export reset

#endif /* _TCLMAC */
Changes to mac/tclMacAlloc.c.
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
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







-
+





+










+





-
+













+
+
+
+
+
+
+
+
+










+


-
-
+
+







 * Copyright (c) 1996-1997 Sun Microsystems, Inc.
 *
 * Portions contributed by Chris Kingsley, Jack Jansen and Ray Johnson
 *.
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacAlloc.c,v 1.4 1999/05/11 07:11:51 jingham Exp $
 * RCS: @(#) $Id: tclMacAlloc.c,v 1.4.12.1 2001/05/17 13:30:02 das Exp $
 */

#include "tclInt.h"
#include "tclMacInt.h"
#include <Memory.h>
#include <Gestalt.h>
#include <stdlib.h>
#include <string.h>


/*
 * Flags that are used by ConfigureMemory to define how the allocator
 * should work.  They can be or'd together.
 */
#define MEMORY_ALL_SYS 1	/* All memory should come from the system
heap. */
#define MEMORY_DONT_USE_TEMPMEM 2	/* Don't use temporary memory but system memory. */

/*
 * Amount of space to leave in the application heap for the Toolbox to work.
 */

#define TOOLBOX_SPACE (32 * 1024)
#define TOOLBOX_SPACE (512 * 1024)

static int memoryFlags = 0;
static Handle toolGuardHandle = NULL;
				/* This handle must be around so that we don't
				 * have NewGWorld failures. This handle is
				 * purgeable. Before we allocate any blocks,
				 * we see if this handle is still around.
				 * If it is not, then we try to get it again.
				 * If we can get it, we lock it and try
				 * to do the normal allocation, unlocking on
				 * the way out. If we can't, we go to the
				 * system heap directly. */

static int tclUseMemTracking = 0; /* Are we tracking memory allocations?
								   * On recent versions of the MacOS this
								   * is no longer necessary, as we can use
								   * temporary memory which is freed by the
								   * OS after a quit or crash. */
								   
static size_t tclExtraHdlSize = 0; /* Size of extra memory allocated at the start
									* of each block when using memory tracking
									* ( == 0 otherwise) */

/*
 * The following typedef and variable are used to keep track of memory
 * blocks that are allocated directly from the System Heap.  These chunks
 * of memory must always be freed - even if we crash.
 */

typedef struct listEl {
    Handle		memoryHandle;
    struct listEl *	next;
    struct listEl *	prec;
} ListEl;

ListEl * systemMemory = NULL;
ListEl * appMemory = NULL;
static ListEl * systemMemory = NULL;
static ListEl * appMemory = NULL;

/*
 * Prototypes for functions used only in this file.
 */

static pascal void	CleanUpExitProc _ANSI_ARGS_((void));
void 			ConfigureMemory _ANSI_ARGS_((int flags));
95
96
97
98
99
100
101

102

103




104
105







106

107

108


109
110
111
112
113
114
115
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







+

+
-
+
+
+
+


+
+
+
+
+
+
+

+
-
+

+
+







TclpSysRealloc(
    VOID *oldPtr,		/* Original block */
    unsigned int size)		/* New size of block. */
{
    Handle hand;
    void *newPtr;
    int maxsize;
    OSErr err;

	if (tclUseMemTracking) {
    hand = * (Handle *) ((Ptr) oldPtr - sizeof(Handle));
    hand = ((ListEl *) ((Ptr) oldPtr - tclExtraHdlSize))->memoryHandle;
    } else {
    hand = RecoverHandle((Ptr) oldPtr);
	}
    maxsize = GetHandleSize(hand) - sizeof(Handle);
    if (maxsize < size) {
    HUnlock(hand);
    SetHandleSize(hand,size + tclExtraHdlSize);
    err = MemError();
    HLock(hand);
    if(err==noErr){
    	newPtr=(*hand + tclExtraHdlSize);
    } else {
	newPtr = TclpSysAlloc(size, 1);
	if(newPtr!=NULL) {
	memcpy(newPtr, oldPtr, maxsize);
	memmove(newPtr, oldPtr, maxsize);
	TclpSysFree(oldPtr);
	}
	}
    } else {
	newPtr = oldPtr;
    }
    return newPtr;
}

/*
132
133
134
135
136
137
138

























139
140
141
142
143
144
145
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







VOID *
TclpSysAlloc(
    long size,		/* Size of block to allocate. */
    int isBin)		/* Is this a bin allocation? */
{
    Handle hand = NULL;
    ListEl * newMemoryRecord;
	int isSysMem = 0;
	static int initialized=0;
	
	if (!initialized) {
	long response = 0;
	OSErr err = noErr;
	int useTempMem = 0;
	
	/* Check if we can use temporary memory */
	initialized=1;
	err = Gestalt(gestaltOSAttr, &response);
	if (err == noErr) {
    	useTempMem = response & (1 << gestaltRealTempMemory);
	}
	tclUseMemTracking = !useTempMem || (memoryFlags & MEMORY_DONT_USE_TEMPMEM);
	if(tclUseMemTracking) {
	    tclExtraHdlSize = sizeof(ListEl);
	    /*
	     * We are allocating memory directly from the system
	     * heap. We need to install an exit handle 
	     * to ensure the memory is cleaned up.
	     */
	    TclMacInstallExitToShellPatch(CleanUpExitProc);
	}
	}

    if (!(memoryFlags & MEMORY_ALL_SYS)) {

    	/*
    	 * If the guard handle has been purged, throw it away and try
    	 * to allocate it again.
    	 */
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
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
244
245
246
247
248

















249
250
251
252
253
254
255
256



257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278







+










-
+



-
-
-
+
-
-
-
-
-
-
-





+
+
+
+
+
+
+
+
+

-
+
+
+



-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-





+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







    	 * If we have never allocated the guard handle, or it was purged
    	 * and thrown away, then try to allocate it again.
    	 */

    	if (toolGuardHandle == NULL) {
    	    toolGuardHandle = NewHandle(TOOLBOX_SPACE);
    	    if (toolGuardHandle != NULL) {
    	    	HLock(toolGuardHandle);
    	    	HPurge(toolGuardHandle);
    	    }
    	}

	/*
	 * If we got the handle, lock it and do our allocation.
	 */

    	if (toolGuardHandle != NULL) {
    	    HLock(toolGuardHandle);
	    hand = NewHandle(size + sizeof(Handle));
	    hand = NewHandle(size + tclExtraHdlSize);
	    HUnlock(toolGuardHandle);
	}
    }
    if (hand != NULL) {
	newMemoryRecord = (ListEl *) NewPtr(sizeof(ListEl));
	if (newMemoryRecord == NULL) {
    if (hand == NULL) {
	    DisposeHandle(hand);
	    return NULL;
	}
	newMemoryRecord->memoryHandle = hand;
	newMemoryRecord->next = appMemory;
	appMemory = newMemoryRecord;
    } else {
	/*
	 * Ran out of memory in application space.  Lets try to get
	 * more memory from system.  Otherwise, we return NULL to
	 * denote failure.
	 */
	if(!tclUseMemTracking) {
		/* Use Temporary Memory instead of System Heap when available */
		OSErr err;
		isBin = 1; /* always HLockHi TempMemHandles */
		hand = TempNewHandle(size + tclExtraHdlSize,&err);
		if(err!=noErr) { hand=NULL; }
	} else {
	/* Use system heap when tracking memory */
	isSysMem=1;
	isBin = 0;
	hand = NewHandleSys(size + sizeof(Handle));
	hand = NewHandleSys(size + tclExtraHdlSize);
	}
	}
	if (hand == NULL) {
	    return NULL;
	}
	if (systemMemory == NULL) {
	    /*
	     * This is the first time we've attempted to allocate memory
	     * directly from the system heap.  We need to now install the
	     * exit handle to ensure the memory is cleaned up.
	     */
	    TclMacInstallExitToShellPatch(CleanUpExitProc);
	}
	newMemoryRecord = (ListEl *) NewPtrSys(sizeof(ListEl));
	if (newMemoryRecord == NULL) {
	    DisposeHandle(hand);
	    return NULL;
	}
	newMemoryRecord->memoryHandle = hand;
	newMemoryRecord->next = systemMemory;
	systemMemory = newMemoryRecord;
    }
    if (isBin) {
	HLockHi(hand);
    } else {
	HLock(hand);
    }
	if(tclUseMemTracking) {
	/* Only need to do this when tracking memory */
	newMemoryRecord = (ListEl *) *hand;
    (** (Handle **) hand) = hand;

    return (*hand + sizeof(Handle));
	newMemoryRecord->memoryHandle = hand;
	newMemoryRecord->prec = NULL;
	if(isSysMem) {
	newMemoryRecord->next = systemMemory;
	systemMemory = newMemoryRecord;
	} else {
	newMemoryRecord->next = appMemory;
	appMemory = newMemoryRecord;
	}
	if(newMemoryRecord->next!=NULL) {
	newMemoryRecord->next->prec=newMemoryRecord;
	}
	}
	
    return (*hand + tclExtraHdlSize);
}

/*
 *----------------------------------------------------------------------
 *
 * TclpSysFree --
 *
234
235
236
237
238
239
240
241
242
243
244
245




















246
247

248
249
250
251
252
253
254
287
288
289
290
291
292
293





294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313


314
315
316
317
318
319
320
321







-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+







 *----------------------------------------------------------------------
 */

void
TclpSysFree(
    void * ptr)		/* Free this system memory. */
{
    Handle hand;
    OSErr err;

    hand = * (Handle *) ((Ptr) ptr - sizeof(Handle));
    DisposeHandle(hand);
	if(tclUseMemTracking) {
    /* Only need to do this when tracking memory */
    ListEl *memRecord;

    memRecord = (ListEl *) ((Ptr) ptr - tclExtraHdlSize);
    /* Remove current record from linked list */
    if(memRecord->next!=NULL) {
    	memRecord->next->prec=memRecord->prec;
    }
    if(memRecord->prec!=NULL) {
    	memRecord->prec->next=memRecord->next;
    }
    if(memRecord==appMemory) {
    	appMemory=memRecord->next;
    } else if(memRecord==systemMemory) {
    	systemMemory=memRecord->next;
    }
    DisposeHandle(memRecord->memoryHandle);
	} else {
    DisposeHandle(RecoverHandle((Ptr) ptr));
    *hand = NULL;
    err = MemError();
	}
}

/*
 *----------------------------------------------------------------------
 *
 * CleanUpExitProc --
 *
267
268
269
270
271
272
273


274
275
276
277
278
279


280
281
282
283
284
285
286
287
334
335
336
337
338
339
340
341
342
343
344
345



346
347

348
349
350
351
352
353
354







+
+



-
-
-
+
+
-







 */

static pascal void
CleanUpExitProc()
{
    ListEl * memRecord;

    if(tclUseMemTracking) {
    /* Only need to do this when tracking memory */
    while (systemMemory != NULL) {
	memRecord = systemMemory;
	systemMemory = memRecord->next;
        if (*(memRecord->memoryHandle) != NULL) {
            DisposeHandle(memRecord->memoryHandle);
        }
	DisposeHandle(memRecord->memoryHandle);
    }
	DisposePtr((void *) memRecord);
    }
}

/*
 *----------------------------------------------------------------------
 *
 * FreeAllMemory --
300
301
302
303
304
305
306


307
308
309
310
311

312
313
314
315
316
317
318
319
320


321
322
323
324
325
326
327
328
367
368
369
370
371
372
373
374
375
376
377
378


379


380
381
382
383



384
385

386
387
388
389
390
391
392







+
+



-
-
+
-
-




-
-
-
+
+
-







 */

void
FreeAllMemory()
{
    ListEl * memRecord;

	if(tclUseMemTracking) {
	/* Only need to do this when tracking memory */
    while (systemMemory != NULL) {
	memRecord = systemMemory;
	systemMemory = memRecord->next;
	if (*(memRecord->memoryHandle) != NULL) {
            DisposeHandle(memRecord->memoryHandle);
	DisposeHandle(memRecord->memoryHandle);
        }
	DisposePtr((void *) memRecord);
    }
    while (appMemory != NULL) {
	memRecord = appMemory;
	appMemory = memRecord->next;
	if (*(memRecord->memoryHandle) != NULL) {
            DisposeHandle(memRecord->memoryHandle);
        }
	DisposeHandle(memRecord->memoryHandle);
	}
	DisposePtr((void *) memRecord);
    }
}

/*
 *----------------------------------------------------------------------
 *
 * ConfigureMemory --
Changes to mac/tclMacAppInit.c.
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
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











-
+












-
+







/* 
 * tclMacAppInit.c --
 *
 *	Provides a version of the Tcl_AppInit procedure for the example shell.
 *
 * Copyright (c) 1993-1994 Lockheed Missle & Space Company, AI Center
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacAppInit.c,v 1.5 1999/04/16 00:47:19 stanton Exp $
 * RCS: @(#) $Id: tclMacAppInit.c,v 1.5.12.2 2001/10/17 19:29:25 das Exp $
 */

#include "tcl.h"
#include "tclInt.h"
#include "tclPort.h"
#include "tclMac.h"
#include "tclMacInt.h"

#if defined(THINK_C)
#   include <console.h>
#elif defined(__MWERKS__)
#   include <SIOUX.h>
short InstallConsole _ANSI_ARGS_((short fd));
EXTERN short InstallConsole _ANSI_ARGS_((short fd));
#endif

#ifdef TCL_TEST
extern int		Procbodytest_Init _ANSI_ARGS_((Tcl_Interp *interp));
extern int		Procbodytest_SafeInit _ANSI_ARGS_((Tcl_Interp *interp));
extern int		TclObjTest_Init _ANSI_ARGS_((Tcl_Interp *interp));
extern int		Tcltest_Init _ANSI_ARGS_((Tcl_Interp *interp));
185
186
187
188
189
190
191

192
193
194
195
196
197
198
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199







+







		
#elif defined(__MWERKS__)

    /* Set options for CodeWarrior SIOUX package */
    SIOUXSettings.autocloseonquit = true;
    SIOUXSettings.showstatusline = true;
    SIOUXSettings.asktosaveonclose = false;
    SIOUXSettings.wasteusetempmemory = true;    
    InstallConsole(0);
    SIOUXSetTitle("\pTcl Interpreter");
		
#elif defined(applec)

    /* Init packages used by MPW SIOW package */
    InitGraf((Ptr)&qd.thePort);
Changes to mac/tclMacApplication.r.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







/* 
 * tclMacApplication.r --
 *
 *	This file creates resources for use Tcl Shell application.
 *	It should be viewed as an example of how to create a new
 *	Tcl application using the shared Tcl libraries.
 *
 * Copyright (c) 1996-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacApplication.r,v 1.3 1999/08/16 00:09:09 jingham Exp $
 * RCS: @(#) $Id: tclMacApplication.r,v 1.3.2.2 2001/10/17 19:29:25 das Exp $
 */

#include <Types.r>
#include <SysTypes.r>

/*
 * The folowing include and defines help construct
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






































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







-
+






-
+






-
+
















+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#   define MINOR_VERSION TCL_MINOR_VERSION * 16
#endif

resource 'vers' (1) {
	TCL_MAJOR_VERSION, MINOR_VERSION,
	RELEASE_LEVEL, 0x00, verUS,
	TCL_PATCH_LEVEL,
	TCL_PATCH_LEVEL ", by Ray Johnson & Jim Ingham © Scriptics Inc"
	TCL_PATCH_LEVEL ", by Ray Johnson & Jim Ingham" "\n" "© 2001 Tcl Core Team"
};

resource 'vers' (2) {
	TCL_MAJOR_VERSION, MINOR_VERSION,
	RELEASE_LEVEL, 0x00, verUS,
	TCL_PATCH_LEVEL,
	"Tcl Shell " TCL_PATCH_LEVEL " © 1996-1997 Sun Microsystems, 1998-1999 Scriptics Inc"
	"Tcl Shell " TCL_PATCH_LEVEL " © 1993-2001"
};

#define TCL_APP_CREATOR 'Tcl '

type TCL_APP_CREATOR as 'STR ';
resource TCL_APP_CREATOR (0, purgeable) {
	"Tcl Shell " TCL_PATCH_LEVEL " © 1996-1999"
	"Tcl Shell " TCL_PATCH_LEVEL " © 1993-2001"
};

/*
 * The 'kind' resource works with a 'BNDL' in Macintosh Easy Open
 * to affect the text the Finder displays in the "kind" column and
 * file info dialog.  This information will be applied to all files
 * with the listed creator and type.
 */

resource 'kind' (128, "Tcl kind", purgeable) {
	TCL_APP_CREATOR,
	0, /* region = USA */
	{
		'APPL', "Tcl Shell",
	}
};

/*
 * The following resource is used when creating the 'env' variable in
 * the Macintosh environment.  The creation mechanisim looks for the
 * 'STR#' resource named "Tcl Environment Variables" rather than a
 * specific resource number.  (In other words, feel free to change the
 * resource id if it conflicts with your application.)  Each string in
 * the resource must be of the form "KEYWORD=SOME STRING".  See Tcl
 * documentation for futher information about the env variable.
 *
 * A good example of something you may want to set is: "TCL_LIBRARY=My
 * disk:etc."
 */
 
resource 'STR#' (128, "Tcl Environment Variables") {
	{	
		/*		
		"SCHEDULE_NAME=Agent Controller Schedule",
		"SCHEDULE_PATH=Lozoya:System Folder:Tcl Lib:Tcl-Scheduler"
		*/
	};
};

data 'alis' (1000, "Library Folder") {
	$"0000 0000 00BA 0002 0001 012F 0000 0000"            /* .....†...../.... */
	$"0000 0000 0000 0000 0000 0000 0000 0000"            /* ................ */
	$"0000 0000 0000 985C FB00 4244 0000 0000"            /* ......ò\š.BD.... */
	$"0002 1328 5375 7070 6F72 7420 4C69 6272"            /* ...(Support Libr */
	$"6172 6965 7329 0000 0000 0000 0000 0000"            /* aries).......... */
	$"0000 0000 0000 0000 0000 0000 0000 0000"            /* ................ */
	$"0000 0000 0000 0000 0000 0000 0000 0000"            /* ................ */
	$"0000 0076 8504 B617 A796 003D 0027 025B"            /* ...vÖ..ßñ.=.'.[ */
	$"01E4 0001 0001 0000 0000 0000 0000 0000"            /* .”.............. */
	$"0000 0000 0000 0000 0001 2F00 0002 0015"            /* ........../..... */
	$"2F3A 2853 7570 706F 7274 204C 6962 7261"            /* /:(Support Libra */
	$"7269 6573 2900 FFFF 0000"                           /* ries)... */
};

Changes to mac/tclMacChan.c.
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
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











-
+















+
+
+
+
+
+







/* 
 * tclMacChan.c
 *
 *	Channel drivers for Macintosh channels for the
 *	console fds.
 *
 * Copyright (c) 1996-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacChan.c,v 1.6 1999/04/16 00:47:19 stanton Exp $
 * RCS: @(#) $Id: tclMacChan.c,v 1.6.12.2 2002/05/20 10:24:12 das Exp $
 */

#include "tclInt.h"
#include "tclPort.h"
#include "tclMacInt.h"
#include <Aliases.h>
#include <Errors.h>
#include <Files.h>
#include <Gestalt.h>
#include <Processes.h>
#include <Strings.h>
#include <FSpCompat.h>
#include <MoreFiles.h>
#include <MoreFilesExtras.h>

#ifdef __MSL__
#include <unix.mac.h>
#define TCL_FILE_CREATOR (__getcreator(0))
#else
#define TCL_FILE_CREATOR 'MPW '
#endif

/*
 * The following are flags returned by GetOpenMode.  They
 * are or'd together to determine how opening and handling
 * a file should occur.
 */

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
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







-
+
















-
+








/*
 * This structure describes the channel type structure for file based IO:
 */

static Tcl_ChannelType consoleChannelType = {
    "file",			/* Type name. */
    StdIOBlockMode,		/* Set blocking/nonblocking mode.*/
    (Tcl_ChannelTypeVersion)StdIOBlockMode,		/* Set blocking/nonblocking mode.*/
    StdIOClose,			/* Close proc. */
    StdIOInput,			/* Input proc. */
    StdIOOutput,		/* Output proc. */
    StdIOSeek,			/* Seek proc. */
    NULL,			/* Set option proc. */
    NULL,			/* Get option proc. */
    CommonWatch,		/* Initialize notifier. */
    CommonGetHandle		/* Get OS handles out of channel. */
};

/*
 * This variable describes the channel type structure for file based IO.
 */

static Tcl_ChannelType fileChannelType = {
    "file",			/* Type name. */
    FileBlockMode,		/* Set blocking or
    (Tcl_ChannelTypeVersion)FileBlockMode,		/* Set blocking or
                                 * non-blocking mode.*/
    FileClose,			/* Close proc. */
    FileInput,			/* Input proc. */
    FileOutput,			/* Output proc. */
    FileSeek,			/* Seek proc. */
    NULL,			/* Set option proc. */
    NULL,			/* Get option proc. */
858
859
860
861
862
863
864
865

866
867
868
869
870
871
872
864
865
866
867
868
869
870

871
872
873
874
875
876
877
878







-
+







    if ((err != noErr) && (err != fnfErr)) {
	*errorCodePtr = errno = TclMacOSErrorToPosixError(err);
	Tcl_SetErrno(errno);
	return NULL;
    }

    if ((err == fnfErr) && (mode & TCL_CREAT)) {
	err = HCreate(fileSpec.vRefNum, fileSpec.parID, fileSpec.name, 'MPW ', 'TEXT');
	err = HCreate(fileSpec.vRefNum, fileSpec.parID, fileSpec.name, TCL_FILE_CREATOR, 'TEXT');
	if (err != noErr) {
	    *errorCodePtr = errno = TclMacOSErrorToPosixError(err);
	    Tcl_SetErrno(errno);
	    return NULL;
	}
    } else if ((mode & TCL_CREAT) && (mode & TCL_EXCL)) {
        *errorCodePtr = errno = EEXIST;
Changes to mac/tclMacCommonPch.h.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







/*
 * tclMacCommonPch.h --
 *
 * 	Macintosh Tcl must be compiled with certain compiler options to
 *	ensure that it will work correctly. The following pragmas are
 *	used to ensure that those options are set correctly. An error
 * 	will occur at compile time if they are not set correctly.
 *
 * Copyright (c) 1998 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacCommonPch.h,v 1.2 1998/11/11 07:46:04 jingham Exp $
 * RCS: @(#) $Id: tclMacCommonPch.h,v 1.2.22.1 2001/04/04 21:22:19 hobbs Exp $
 */

#if !__option(enumsalwaysint)
#error Tcl requires the Metrowerks setting "Enums always ints".
#endif


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
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








-
-
-
-
-
-
-
-
-
-
-
















-

-
-
-
-
-
+


-
+
-
* The define is used most everywhere to tell Tcl (or any Tcl
* extensions) that we are compiling for the Macintosh platform.
*/


#define MAC_TCL


/*
* The following defines control the behavior of the Macintosh
* Universial Headers.
*/


#define SystemSevenOrLater 1
#define STRICT_CONTROLS 1
#define STRICT_WINDOWS 1


/*
* Define the following symbol if you want
* comprehensive debugging turned on.
*/


/* #define TCL_DEBUG */


#ifdef TCL_DEBUG
# define TCL_MEM_DEBUG
# define TCL_TEST
#endif



/*
* For a while, we will continue to use the old routine names, so that
* people with older versions of CodeWarrior will still be able to compile
* the source (albeit they will have to update the project files themselves).
*
* At some point, we will convert over to the new routine names.
* for Metrowerks Pro 6 MSL
*/


#include <UseDLLPrefix.h>
#define OLDROUTINENAMES 1
Changes to mac/tclMacFCmd.c.
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16
17
18
19











-
+







/* 
 * tclMacFCmd.c --
 *
 * Implements the Macintosh specific portions of the file manipulation
 * subcommands of the "file" command.
 *
 * Copyright (c) 1996-1998 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacFCmd.c,v 1.7 1999/10/15 04:47:03 jingham Exp $
 * RCS: @(#) $Id: tclMacFCmd.c,v 1.7.2.1 2001/04/04 21:22:19 hobbs Exp $
 */

#include "tclInt.h"
#include "tclMac.h"
#include "tclMacInt.h"
#include "tclPort.h"
#include <FSpCompat.h>
744
745
746
747
748
749
750
751

752
753
754
755
756
757
758
744
745
746
747
748
749
750

751
752
753
754
755
756
757
758







-
+







    }
    if (err == noErr) {
        FSMakeFSSpecCompat(dstFileSpec.vRefNum, dstFileSpec.parID,
        	tmpName, &tmpDirSpec);
        err = FSpDirCreateCompat(&tmpDirSpec, smSystemScript, &tmpDirID);
    }
    if (err == noErr) {
	err = FSpDirectoryCopy(&srcFileSpec, &tmpDirSpec, NULL, 0, true,
	err = FSpDirectoryCopy(&srcFileSpec, &tmpDirSpec, NULL, NULL, 0, true,
	    	CopyErrHandler);
    }
    
    /* 
     * Even if the Copy failed, Rename/Move whatever did get copied to the
     * appropriate final destination, if possible.  
     */
Changes to mac/tclMacFile.c.
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
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












-
+




















-
-
-
-
-
-
-







/* 
 * tclMacFile.c --
 *
 *      This file implements the channel drivers for Macintosh
 *	files.  It also comtains Macintosh version of other Tcl
 *	functions that deal with the file system.
 *
 * Copyright (c) 1995-1998 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacFile.c,v 1.9 1999/12/12 22:46:45 hobbs Exp $
 * RCS: @(#) $Id: tclMacFile.c,v 1.9.2.2 2001/10/19 19:39:46 das Exp $
 */

/*
 * Note: This code eventually needs to support async I/O.  In doing this
 * we will need to keep track of all current async I/O.  If exit to shell
 * is called - we shouldn't exit until all asyc I/O completes.
 */

#include "tclInt.h"
#include "tclPort.h"
#include "tclMacInt.h"
#include <Aliases.h>
#include <Errors.h>
#include <Processes.h>
#include <Strings.h>
#include <Types.h>
#include <MoreFiles.h>
#include <MoreFilesExtras.h>
#include <FSpCompat.h>

/*
 * Static variables used by the TclpStat function.
 */
static int initialized = false;
static long gmt_offset;
TCL_DECLARE_MUTEX(gmtMutex)


/*
 *----------------------------------------------------------------------
 *
 * TclpFindExecutable --
 *
 *	This procedure computes the absolute path name of the current
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
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







-
+











+
+
+
+
+
+






-
-
+
+

-
+
+

+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+


+
-
+
+
+
+
+
+
+
+







				 * not be static.*/
    GlobTypeData *types)	/* Object containing list of acceptable types.
				 * May be NULL. */
{
    char *fname, *patternEnd = tail;
    char savedChar;
    int fnameLen, result = TCL_OK;
    int baseLength = Tcl_DStringLength(dirPtr);
    int baseLength;
    CInfoPBRec pb;
    OSErr err;
    FSSpec dirSpec;
    Boolean isDirectory;
    long dirID;
    short itemIndex;
    Str255 fileName;
    Tcl_DString fileString;    
    Tcl_Obj *resultPtr;
    OSType okType = 0;
    OSType okCreator = 0;
    Tcl_DString dsOrig;

    Tcl_DStringInit(&dsOrig);
    Tcl_DStringAppend(&dsOrig, Tcl_DStringValue(dirPtr), 
    	Tcl_DStringLength(dirPtr));
    baseLength = Tcl_DStringLength(&dsOrig);

    /*
     * Make sure that the directory part of the name really is a
     * directory.
     */

    Tcl_UtfToExternalDString(NULL, Tcl_DStringValue(dirPtr),
	    Tcl_DStringLength(dirPtr), &fileString);
    Tcl_UtfToExternalDString(NULL, Tcl_DStringValue(&dsOrig),
	    Tcl_DStringLength(&dsOrig), &fileString);

    FSpLocationFromPath(fileString.length, fileString.string, &dirSpec);
    err = FSpLocationFromPath(Tcl_DStringLength(&fileString), 
			      Tcl_DStringValue(&fileString), &dirSpec);
    Tcl_DStringFree(&fileString);
    if (err == noErr)
    err = FSpGetDirectoryID(&dirSpec, &dirID, &isDirectory);
    if ((err != noErr) || !isDirectory) {
    /*
     * Check if we had a relative path (unix style relative path 
     * compatibility for glob)
     */
    Tcl_DStringFree(&dsOrig);
    Tcl_DStringAppend(&dsOrig, ":", 1);
    Tcl_DStringAppend(&dsOrig, Tcl_DStringValue(dirPtr), 
    	Tcl_DStringLength(dirPtr));
    baseLength = Tcl_DStringLength(&dsOrig);

    Tcl_UtfToExternalDString(NULL, Tcl_DStringValue(&dsOrig),
	    Tcl_DStringLength(&dsOrig), &fileString);
    
    err = FSpLocationFromPath(Tcl_DStringLength(&fileString), 
			      Tcl_DStringValue(&fileString), &dirSpec);
    Tcl_DStringFree(&fileString);
    if (err == noErr)
    err = FSpGetDirectoryID(&dirSpec, &dirID, &isDirectory);
    if ((err != noErr) || !isDirectory) {
    	Tcl_DStringFree(&dsOrig);
	return TCL_OK;
    	return TCL_OK;
    }
    }

    /* Make sure we have a trailing directory delimiter */
    if (Tcl_DStringValue(&dsOrig)[baseLength-1] != ':') {
	Tcl_DStringAppend(&dsOrig, ":", 1);
	baseLength++;
    }

    /*
     * Now open the directory for reading and iterate over the contents.
     */

    pb.hFileInfo.ioVRefNum = dirSpec.vRefNum;
214
215
216
217
218
219
220
221
222
223
224




225
226
227
228
229
230
231
241
242
243
244
245
246
247




248
249
250
251
252
253
254
255
256
257
258







-
-
-
-
+
+
+
+







	 * directories before calling TclDoGlob. Otherwise, just add
	 * the file to the result.
	 */
	 
	Tcl_ExternalToUtfDString(NULL, (char *) fileName + 1, fileName[0],
		&fileString);
	if (Tcl_StringMatch(Tcl_DStringValue(&fileString), pattern)) {
	    Tcl_DStringSetLength(dirPtr, baseLength);
	    Tcl_DStringAppend(dirPtr, Tcl_DStringValue(&fileString), -1);
	    fname = Tcl_DStringValue(dirPtr);
	    fnameLen = Tcl_DStringLength(dirPtr);
	    Tcl_DStringSetLength(&dsOrig, baseLength);
	    Tcl_DStringAppend(&dsOrig, Tcl_DStringValue(&fileString), -1);
	    fname = Tcl_DStringValue(&dsOrig);
	    fnameLen = Tcl_DStringLength(&dsOrig);
	    if (tail == NULL) {
		int typeOk = 1;
		if (types != NULL) {
		    if (types->perm != 0) {
			if (
			    ((types->perm & TCL_GLOB_PERM_RONLY) &&
				    !(pb.hFileInfo.ioFlAttrib & 1)) ||
291
292
293
294
295
296
297
298
299
300



301
302
303
304
305
306
307
308
309
310
311

312
313
314
315
316
317
318
318
319
320
321
322
323
324



325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346







-
-
-
+
+
+











+







			Tcl_ListObjAppendElement(interp, resultPtr, 
				Tcl_NewStringObj(fname+1, fnameLen-1));
		    } else {
			Tcl_ListObjAppendElement(interp, resultPtr, 
				Tcl_NewStringObj(fname, fnameLen));
		    }
		}
	    } else if ((pb.hFileInfo.ioFlAttrib & ioDirMask) != 0) {
		Tcl_DStringAppend(dirPtr, ":", 1);
		result = TclDoGlob(interp, separators, dirPtr, tail, types);
	    } else {
		Tcl_DStringAppend(&dsOrig, ":", 1);
		result = TclDoGlob(interp, separators, &dsOrig, tail, types);
		if (result != TCL_OK) {
		    Tcl_DStringFree(&fileString);
		    break;
		}
	    }
	}
	Tcl_DStringFree(&fileString);
	itemIndex++;
    }
    *patternEnd = savedChar;

    Tcl_DStringFree(&dsOrig);
    return result;
}

/* 
 * TclpMatchFiles --
 * 
 * This function is now obsolete.  Call the above function 
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
835
836
837
838
839
840
841

842
843
844
845















846
847
848
849
850
851
852
853
854
855
856







-
+



-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+







	    bufPtr->st_blksize = vpb.ioVAlBlkSiz;
	    bufPtr->st_blocks = (bufPtr->st_size + bufPtr->st_blksize - 1)
		/ bufPtr->st_blksize;

	    /*
	     * The times returned by the Mac file system are in the
	     * local time zone.  We convert them to GMT so that the
	     * epoch starts from GMT.  This is also consistant with
	     * epoch starts from GMT.  This is also consistent with
	     * what is returned from "clock seconds".
	     */

	    Tcl_MutexLock(&gmtMutex);
	    if (initialized == false) {
		MachineLocation loc;
    
		ReadLocation(&loc);
		gmt_offset = loc.u.gmtDelta & 0x00ffffff;
		if (gmt_offset & 0x00800000) {
		    gmt_offset = gmt_offset | 0xff000000;
		}
		initialized = true;
	    }
	    Tcl_MutexUnlock(&gmtMutex);

	    bufPtr->st_atime = bufPtr->st_mtime = fpb.ioFlMdDat - gmt_offset;
	    bufPtr->st_ctime = fpb.ioFlCrDat - gmt_offset;
	    bufPtr->st_atime = bufPtr->st_mtime = fpb.ioFlMdDat 
	      - TclpGetGMTOffset() + tcl_mac_epoch_offset;
	    bufPtr->st_ctime = fpb.ioFlCrDat - TclpGetGMTOffset() 
	      + tcl_mac_epoch_offset;
	}
    }

    if (err != noErr) {
	errno = TclMacOSErrorToPosixError(err);
    }
    
Changes to mac/tclMacInt.h.
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
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










-
+





-
-
+
+

-
-
+
+





-
-




















+
+
+
+
+

















-
+
+

+
+
-
+
-


-
-

/*
 * tclMacInt.h --
 *
 *	Declarations of Macintosh specific shared variables and procedures.
 *
 * Copyright (c) 1996-1998 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacInt.h,v 1.6 1999/08/16 00:09:18 jingham Exp $
 * RCS: @(#) $Id: tclMacInt.h,v 1.6.2.2 2001/10/17 19:29:25 das Exp $
 */

#ifndef _TCLMACINT
#define _TCLMACINT

#ifndef _TCL
#   include "tcl.h"
#ifndef _TCLINT
#include "tclInt.h"
#endif
#ifndef _TCLMAC
#   include "tclMac.h"
#ifndef _TCLPORT
#include "tclPort.h"
#endif

#include <Events.h>
#include <Files.h>

#pragma export on

/*
 * Defines to control stack behavior.
 *
 * The Tcl8.2 regexp code is highly recursive for patterns with many
 * subexpressions.  So we have to increase the stack space to accomodate.
 * 512 K is good enough for ordinary work, but you need 768 to pass the Tcl
 * regexp testsuite.
 *
 * For the PPC, you need to set the stack space in the Project file.
 *
 */

#ifdef TCL_TEST
#	define TCL_MAC_68K_STACK_GROWTH (768*1024)
#else
#	define TCL_MAC_68K_STACK_GROWTH (512*1024)
#endif

#define TCL_MAC_STACK_THRESHOLD 16384

#ifdef BUILD_tcl
# undef TCL_STORAGE_CLASS
# define TCL_STORAGE_CLASS DLLEXPORT
#endif

/*
 * This flag is passed to TclMacRegisterResourceFork
 * by a file (usually a library) whose resource fork
 * should not be closed by the resource command.
 */
 
#define TCL_RESOURCE_DONT_CLOSE  2

/*
 * Typedefs used by Macintosh parts of Tcl.
 */

/*
 * Prototypes of Mac only internal functions.
 */

EXTERN char *	TclMacGetFontEncoding _ANSI_ARGS_((int fontId));
EXTERN int	TclMacHaveThreads(void);
EXTERN int		TclMacHaveThreads _ANSI_ARGS_((void));
EXTERN long		TclpGetGMTOffset _ANSI_ARGS_((void));

# undef TCL_STORAGE_CLASS
# define TCL_STORAGE_CLASS DLLIMPORT
#include "tclPort.h"

#include "tclPlatDecls.h"
#include "tclIntPlatDecls.h"
    
#pragma export reset

#endif /* _TCLMACINT */
Changes to mac/tclMacLibrary.c.
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
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







-
+











+
+
+
+
+
+
+
+
+







 *	file.
 *
 * Copyright (c) 1996 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacLibrary.c,v 1.4 2000/02/10 09:59:10 jingham Exp $
 * RCS: @(#) $Id: tclMacLibrary.c,v 1.4.2.1 2001/04/04 21:22:19 hobbs Exp $
 */

/*
 * Here is another place that we are using the old routine names...
 */

#include <CodeFragments.h>
#include <Errors.h>
#include <Resources.h>
#include <Strings.h>
#include "tclMacInt.h"

#if defined(TCL_REGISTER_LIBRARY) && defined(USE_TCL_STUBS)
#error "Can't use TCL_REGISTER_LIBRARY and USE_TCL_STUBS at the same time!"
/*
 * Can't register a library with Tcl when using stubs in the current
 * implementation, since Tcl_InitStubs hasn't been called yet
 *  when OpenLibraryResource is executing. 
 */
#endif

/*
 * These function are not currently defined in any header file.  The
 * only place they should be used is in the Initialization and
 * Termination entry points for a code fragment.  The prototypes
 * are included here to avoid compile errors.
 */
Changes to mac/tclMacLibrary.r.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







/* 
 * tclMacLibrary.r --
 *
 *	This file creates resources used by the Tcl shared library.
 *	Many thanks go to "Jay Lieske, Jr." <lieske@princeton.edu> who
 *	wrote the initial version of this file.
 *
 * Copyright (c) 1996-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacLibrary.r,v 1.4 1999/08/16 00:09:22 jingham Exp $
 * RCS: @(#) $Id: tclMacLibrary.r,v 1.4.2.2 2001/10/17 19:29:25 das Exp $
 */

#include <Types.r>
#include <SysTypes.r>

/*
 * The folowing include and defines help construct
38
39
40
41
42
43
44
45

46
47
48
49
50
51
52

53
54
55
56
57
58
59
38
39
40
41
42
43
44

45
46
47
48
49
50
51

52
53
54
55
56
57
58
59







-
+






-
+







#   define MINOR_VERSION TCL_MINOR_VERSION * 16
#endif

resource 'vers' (1) {
	TCL_MAJOR_VERSION, MINOR_VERSION,
	RELEASE_LEVEL, 0x00, verUS,
	TCL_PATCH_LEVEL,
	TCL_PATCH_LEVEL ", by Ray Johnson & Jim Ingham © Scriptics Inc."
	TCL_PATCH_LEVEL ", by Ray Johnson & Jim Ingham" "\n" "© 2001 Tcl Core Team"
};

resource 'vers' (2) {
	TCL_MAJOR_VERSION, MINOR_VERSION,
	RELEASE_LEVEL, 0x00, verUS,
	TCL_PATCH_LEVEL,
	"Tcl Library " TCL_PATCH_LEVEL " © 1996-1997 Sun Microsystems, 1998-1999 Scriptics Inc."
	"Tcl Library " TCL_PATCH_LEVEL " © 1993-2001"
};

/*
 * Currently the creator for all Tcl/Tk libraries and extensions
 * should be 'TclL'.  This will allow those extension and libraries
 * to use the common icon for Tcl extensions.  However, this signature
 * still needs to be approved by the signature police at Apple and may
92
93
94
95
96
97
98
99

100
101
102
103
104
105
106
92
93
94
95
96
97
98

99
100
101
102
103
104
105
106







-
+







resource 'FREF' (TCL_LIBRARY_RESOURCES, purgeable) 
{
	'shlb', 0, ""
};

type TCL_CREATOR as 'STR ';
resource TCL_CREATOR (0, purgeable) {
	"Tcl Library " TCL_PATCH_LEVEL " © 1996-1999"
	"Tcl Library " TCL_PATCH_LEVEL " © 1993-2001"
};

/*
 * The 'kind' resource works with a 'BNDL' in Macintosh Easy Open
 * to affect the text the Finder displays in the "kind" column and
 * file info dialog.  This information will be applied to all files
 * with the listed creator and type.
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
121
122
123
124
125
126
127

128
129
130
131
132














133
134
135
136
137
138
139







-
+




-
-
-
-
-
-
-
-
-
-
-
-
-
-







 * give the user a little detail about the library's capabilities
 * and enough information to install the library in the correct location.  
 * A similar string should be placed in all shared libraries.
 */
resource 'STR ' (-16397, purgeable) {
	"Tcl Library\n\n"
	"This is the core library needed to run Tool Command Language programs. "
	"To work properly, it should be placed in the ÔTool Command Languag folder "
	"To work properly, it should be placed in the ŒTool Command Languag folder "
	"within the Extensions folder."
};

/* 
 * The mechanisim below loads Tcl source into the resource fork of the
 * application.  The example below creates a TEXT resource named
 * "Init" from the file "init.tcl".  This allows applications to use
 * Tcl to define the behavior of the application without having to
 * require some predetermined file structure - all needed Tcl "files"
 * are located within the application.  To source a file for the
 * resource fork the source command has been modified to support
 * sourcing from resources.  In the below case "source -rsrc {Init}"
 * will load the TEXT resource named "Init".
 */

#include "tclMacTclCode.r"

/*
 * The following are icons for the shared library.
 */

data 'icl4' (2000, "Tcl Shared Library", purgeable) {
	$"0FFF FFFF FFFF FFFF FFFF FFFF FFFF 0000"
	$"F000 0000 0000 0000 0000 0000 000C F000"
	$"F0CC CFFF CCCC CCC6 66CC CCCC CCCC F000"
Changes to mac/tclMacLoad.c.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







/*
 * tclMacLoad.c --
 *
 *	This procedure provides a version of the TclLoadFile for use
 *	on the Macintosh.  This procedure will only work with systems 
 *	that use the Code Fragment Manager.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacLoad.c,v 1.4 1999/10/15 04:47:12 jingham Exp $
 * RCS: @(#) $Id: tclMacLoad.c,v 1.4.2.1 2001/10/19 19:39:46 das Exp $
 */

#include <CodeFragments.h>
#include <Errors.h>
#include <Resources.h>
#include <Strings.h>
#include <FSpCompat.h>
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
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







-
+




-
-
-
-
-
-
-
-
-









+
+
+
+
+
+
+
+







    OSErr err;
    CFragSymbolClass symClass;
    FSSpec fileSpec;
    short fragFileRef, saveFileRef;
    Handle fragResource;
    UInt32 offset = 0;
    UInt32 length = kCFragGoesToEOF;
    char packageName[255];
    StringPtr fragName=NULL;
    Str255 errName;
    Tcl_DString ds;
    char *native;
    
    /*
     * First thing we must do is infer the package name from the sym1
     * variable.  This is kind of dumb since the caller actually knows
     * this value, it just doesn't give it to us.
     */
    strcpy(packageName, sym1);
    Tcl_UtfToLower(packageName);
    *(Tcl_UtfAtIndex(packageName, Tcl_NumUtfChars(packageName, -1) - 5)) = 0;
    
    native = Tcl_UtfToExternalDString(NULL, fileName, -1, &ds);
    err = FSpLocationFromPath(strlen(native), native, &fileSpec);
    Tcl_DStringFree(&ds);
    
    if (err != noErr) {
	Tcl_SetResult(interp, "could not locate shared library", TCL_STATIC);
	return TCL_ERROR;
    }
    
    /*
     * First thing we must do is infer the package name from the sym1
     * variable.  This is kind of dumb since the caller actually knows
     * this value, it just doesn't give it to us.
     */
    native = Tcl_UtfToExternalDString(NULL, sym1, -1, &ds);
    native[strlen(native) - 5] = 0;
    
    /*
     * See if this fragment has a 'cfrg' resource.  It will tell us where
     * to look for the fragment in the file.  If it doesn't exist we will
     * assume we have a ppc frag using the whole data fork.  If it does
     * exist we find the frag that matches the one we are looking for and
     * get the offset and size from the resource.
     */
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
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







-
-
+
+


+













+







-
-
+

+
+
+







+
-
-
-
+
+
+







+
-
-
-
+
+
+




-
-








	    itemCount = (*(CfrgHeaderPtrHand)fragResource)->itemCount;
	    itemStart = &(*(CfrgHeaderPtrHand)fragResource)->arrayStart;
	    for (index = 0; index < itemCount;
		 index++, itemStart += srcItem->itemSize) {
		srcItem = (CfrgItem*)itemStart;
		if (srcItem->archType != OUR_ARCH_TYPE) continue;
		if (!strncasecmp(packageName, (char *) srcItem->name + 1,
			srcItem->name[0])) {
		if (!strncasecmp(native, (char *) srcItem->name + 1,
			strlen(native))) {
		    offset = srcItem->codeOffset;
		    length = srcItem->codeLength;
		    fragName=srcItem->name;
		}
	    }
	}
	/*
	 * Close the resource file.  If the extension wants to reopen the
	 * resource fork it should use the tclMacLibrary.c file during it's
	 * construction.
	 */
	HUnlock(fragResource);
	ReleaseResource(fragResource);
	CloseResFile(fragFileRef);
	UseResFile(saveFileRef);
    }
    Tcl_DStringFree(&ds);

    /*
     * Now we can attempt to load the fragement using the offset & length
     * obtained from the resource.  We don't worry about the main entry point
     * as we are going to search for specific entry points passed to us.
     */
    
    c2pstr(packageName);
    err = GetDiskFragment(&fileSpec, offset, length, (StringPtr) packageName,
    err = GetDiskFragment(&fileSpec, offset, length, fragName,
	    kLoadCFrag, &connID, &dummy, errName);

    *clientDataPtr = (ClientData) connID;

    if (err != fragNoErr) {
	p2cstr(errName);
	Tcl_AppendResult(interp, "couldn't load file \"", fileName,
	    "\": ", errName, (char *) NULL);
	return TCL_ERROR;
    }
    
    native = Tcl_UtfToExternalDString(NULL, sym1, -1, &ds);
    c2pstr(sym1);
    err = FindSymbol(connID, (StringPtr) sym1, (Ptr *) proc1Ptr, &symClass);
    p2cstr((StringPtr) sym1);
    c2pstr(native);
    err = FindSymbol(connID, (StringPtr) native, (Ptr *) proc1Ptr, &symClass);
    Tcl_DStringFree(&ds);
    if (err != fragNoErr || symClass == kDataCFragSymbol) {
	Tcl_SetResult(interp,
		"could not find Initialization routine in library",
		TCL_STATIC);
	return TCL_ERROR;
    }

    native = Tcl_UtfToExternalDString(NULL, sym2, -1, &ds);
    c2pstr(sym2);
    err = FindSymbol(connID, (StringPtr) sym2, (Ptr *) proc2Ptr, &symClass);
    p2cstr((StringPtr) sym2);
    c2pstr(native);
    err = FindSymbol(connID, (StringPtr) native, (Ptr *) proc2Ptr, &symClass);
    Tcl_DStringFree(&ds);
    if (err != fragNoErr || symClass == kDataCFragSymbol) {
	*proc2Ptr = NULL;
    }
    
    *clientDataPtr = (ClientData) connID;
    
    return TCL_OK;
}

/*
 *----------------------------------------------------------------------
 *
 * TclpUnloadFile --
247
248
249
250
251
252
253

254
255
256
257
258
259
260
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264







+







void
TclpUnloadFile(clientData)
    ClientData clientData;	/* ClientData returned by a previous call
				 * to TclpLoadFile().  The clientData is 
				 * a token that represents the loaded 
				 * file. */
{
    CloseConnection((CFragConnectionID*) &clientData);
}

/*
 *----------------------------------------------------------------------
 *
 * TclGuessPackageName --
 *
Deleted mac/tclMacMSLPrefix.h.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
























-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
/*
 * tclMacMSLPrefix.h --
 *
 *  A wrapper for the MSL ansi_prefix.mac.h file.  This just turns export on
 *  after including the MSL prefix file, so we can export symbols from the MSL
 *  and through the Tcl shared libraries
 *  
 *
 * Copyright (c) 1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacMSLPrefix.h,v 1.2 1998/09/14 18:40:05 stanton Exp $
 */

#include <ansi_prefix.mac.h>
/*
 * "export" is a MetroWerks specific pragma.  It flags the linker that  
 * any symbols that are defined when this pragma is on will be exported 
 * to shared libraries that link with this library.
 */
 
#pragma export on
Changes to mac/tclMacMath.h.
8
9
10
11
12
13
14
15

16
17
18
19
20
21
22
8
9
10
11
12
13
14

15
16
17
18
19
20
21
22







-
+







 *	are passed around and used, they will crash hard on the 68K.
 *
 * Copyright (c) 1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacMath.h,v 1.2 1998/09/14 18:40:05 stanton Exp $
 * RCS: @(#) $Id: tclMacMath.h,v 1.2.18.1 2001/04/04 21:22:19 hobbs Exp $
 */

#ifndef _TCLMACMATH
#define _TCLMACMATH

#include <math.h>

131
132
133
134
135
136
137
138

139
140
141
142
143
144
145
131
132
133
134
135
136
137

138
139
140
141
142
143
144
145







-
+







#   ifdef floor
#	undef floor
#	define floor floord
#   endif
#endif
#endif

#if (defined(THINK_C) || defined(__MWERKS__))
#if (defined(THINK_C))
#pragma export on
double		hypotd(double x, double y);
#define hypot hypotd
#pragma export reset
#endif

#endif /* _TCLMACMATH */
Changes to mac/tclMacNotify.c.
10
11
12
13
14
15
16
17

18
19
20
21
22
23
24
10
11
12
13
14
15
16

17
18
19
20
21
22
23
24







-
+







 *	event proc will have to arbitrate which events go to which threads.
 *
 * Copyright (c) 1995-1996 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacNotify.c,v 1.6 1999/08/10 04:21:40 jingham Exp $
 * RCS: @(#) $Id: tclMacNotify.c,v 1.6.10.1 2001/04/04 21:22:19 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"
#include "tclMac.h"
#include "tclMacInt.h"
#include <signal.h>
262
263
264
265
266
267
268
269

270
271
272
273
274
275
276
262
263
264
265
266
267
268

269
270
271
272
273
274
275
276







-
+







    Rect mouseRect;

    /*
     * Check for mouse moved events.  These events aren't placed on the
     * system event queue unless we call WaitNextEvent.
     */

    GetGlobalMouse(&currentMouse);
    GetGlobalMouseTcl(&currentMouse);
    if ((notifier.eventProcPtr != NULL) &&
	    !EqualPt(currentMouse, notifier.lastMousePosition)) {
	notifier.lastMousePosition = currentMouse;
	theEvent.what = nullEvent;
	if ((*notifier.eventProcPtr)(&theEvent) == true) {
	    eventFound = 1;
	}
292
293
294
295
296
297
298
299

300
301
302
303
304
305
306
292
293
294
295
296
297
298

299
300
301
302
303
304
305
306







-
+







    }
    
    /*
     * Process events from the OS event queue.
     */

    while (needsUpdate || (GetEvQHdr()->qHead != NULL)) {
	GetGlobalMouse(&currentMouse);
	GetGlobalMouseTcl(&currentMouse);
	SetRect(&mouseRect, currentMouse.h, currentMouse.v,
		currentMouse.h + 1, currentMouse.v + 1);
	RectRgn(notifier.utilityRgn, &mouseRect);
	
	WaitNextEvent(everyEvent, &theEvent, 5, notifier.utilityRgn);
	needsUpdate = 0;
	if ((notifier.eventProcPtr != NULL)
477
478
479
480
481
482
483
484

485
486
487
488
489
490
491
477
478
479
480
481
482
483

484
485
486
487
488
489
490
491







-
+







	if (!found) {
	    /*
	     * Set up mouse region so we will wake if the mouse is moved.
	     * We do this by defining the smallest possible region around
	     * the current mouse position.
	     */

	    GetGlobalMouse(&currentMouse);
	    GetGlobalMouseTcl(&currentMouse);
	    SetRect(&mouseRect, currentMouse.h, currentMouse.v,
		    currentMouse.h + 1, currentMouse.v + 1);
	    RectRgn(notifier.utilityRgn, &mouseRect);
	
	    WaitNextEvent(everyEvent, &macEvent, sleepTime,
		    notifier.utilityRgn);

Changes to mac/tclMacOSA.c.
8
9
10
11
12
13
14
15

16
17
18
19
20
21
22
8
9
10
11
12
13
14

15
16
17
18
19
20
21
22







-
+







 *
 * Copyright (c) 1996 Lucent Technologies and Jim Ingham
 * Copyright (c) 1997 Sun Microsystems, Inc.
 *
 * See the file "License Terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacOSA.c,v 1.6 1999/12/21 23:58:13 hobbs Exp $
 * RCS: @(#) $Id: tclMacOSA.c,v 1.6.2.2 2002/04/08 08:58:59 das Exp $
 */

#define MAC_TCL

#include <Aliases.h>
#include <string.h>
#include <AppleEvents.h>
2063
2064
2065
2066
2067
2068
2069
2070

2071
2072
2073
2074
2075
2076
2077
2063
2064
2065
2066
2067
2068
2069

2070
2071
2072
2073
2074
2075
2076
2077







-
+







{
    Handle resHandle;
    Str255 rezName;
    int result = TCL_OK;
    short saveRef, fileRef = -1;
    char idStr[16 + TCL_INTEGER_SPACE];
    FSSpec fileSpec;
    Tcl_DString buffer;
    Tcl_DString ds, buffer;
    char *nativeName;
    OSErr myErr = noErr;
    OSAID scriptID;
    Size scriptSize;
    AEDesc scriptData;

    /*
2101
2102
2103
2104
2105
2106
2107
2108
2109

2110
2111
2112


2113
2114

2115
2116
2117
2118
2119
2120
2121
2122
2123

2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135

2136
2137
2138
2139
2140
2141
2142
2101
2102
2103
2104
2105
2106
2107


2108

2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123

2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135

2136
2137
2138
2139
2140
2141
2142
2143







-
-
+
-


+
+


+








-
+











-
+







     */
	
    saveRef = CurResFile();
	
    if (fileName != NULL) {
	OSErr err;
		
	Tcl_DStringInit(&buffer);	
	nativeName = Tcl_TranslateFileName(interp, fileName, &buffer);
	if (Tcl_TranslateFileName(interp, fileName, &buffer) == NULL) {
	if (nativeName == NULL) {
	    return TCL_ERROR;
	}
	nativeName = Tcl_UtfToExternalDString(NULL, Tcl_DStringValue(&buffer), 
    	    Tcl_DStringLength(&buffer), &ds);
	err = FSpLocationFromPath(strlen(nativeName), nativeName, &fileSpec);
		
	Tcl_DStringFree(&ds);
	Tcl_DStringFree(&buffer);
	if ((err != noErr) && (err != fnfErr)) {
	    Tcl_AppendResult(interp,
		    "Error getting a location for the file: \"", 
		    fileName, "\".", NULL);
	    return TCL_ERROR;
	}
		
	FSpCreateResFileCompat(&fileSpec,
	FSpCreateResFileCompatTcl(&fileSpec,
		'WiSH', 'osas', smSystemScript);	
	myErr = ResError();
	
	if ((myErr != noErr) && (myErr != dupFNErr)) {
	    sprintf(idStr, "%d", myErr);
	    Tcl_AppendResult(interp, "Error #", idStr,
		    " creating new resource file ", fileName, (char *) NULL);
	    result = TCL_ERROR;
	    goto rezEvalCleanUp;
	}
		
	fileRef = FSpOpenResFileCompat(&fileSpec, fsRdWrPerm);
	fileRef = FSpOpenResFileCompatTcl(&fileSpec, fsRdWrPerm);
	if (fileRef == -1) {
	    Tcl_AppendResult(interp, "Error reading the file: \"", 
		    fileName, "\".", NULL);
	    result = TCL_ERROR;
	    goto rezEvalCleanUp;
	}
	UseResFile(fileRef);
2282
2283
2284
2285
2286
2287
2288
2289

2290
2291
2292
2293
2294
2295
2296
2297
2298

2299
2300
2301


2302

2303
2304
2305
2306
2307
2308
2309
2310

2311
2312
2313
2314
2315
2316
2317
2283
2284
2285
2286
2287
2288
2289

2290
2291
2292
2293
2294
2295
2296
2297


2298

2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311

2312
2313
2314
2315
2316
2317
2318
2319







-
+







-
-
+
-


+
+

+







-
+







{
    Handle sourceData;
    Str255 rezName;
    int result = TCL_OK;
    short saveRef, fileRef = -1;
    char idStr[16 + TCL_INTEGER_SPACE];
    FSSpec fileSpec;
    Tcl_DString buffer;
    Tcl_DString ds, buffer;
    char *nativeName;

    saveRef = CurResFile();
	
    if (fileName != NULL) {
	OSErr err;
		
	Tcl_DStringInit(&buffer);	
	nativeName = Tcl_TranslateFileName(interp, fileName, &buffer);
	if (Tcl_TranslateFileName(interp, fileName, &buffer) == NULL) {
	if (nativeName == NULL) {
	    return TCL_ERROR;
	}
	nativeName = Tcl_UtfToExternalDString(NULL, Tcl_DStringValue(&buffer), 
    	    Tcl_DStringLength(&buffer), &ds);
	err = FSpLocationFromPath(strlen(nativeName), nativeName, &fileSpec);
	Tcl_DStringFree(&ds);
	Tcl_DStringFree(&buffer);
	if (err != noErr) {
	    Tcl_AppendResult(interp, "Error finding the file: \"", 
		    fileName, "\".", NULL);
	    return TCL_ERROR;
	}
			
	fileRef = FSpOpenResFileCompat(&fileSpec, fsRdPerm);
	fileRef = FSpOpenResFileCompatTcl(&fileSpec, fsRdPerm);
	if (fileRef == -1) {
	    Tcl_AppendResult(interp, "Error reading the file: \"", 
		    fileName, "\".", NULL);
	    return TCL_ERROR;
	}
	UseResFile(fileRef);
    } else {
Deleted mac/tclMacOSA.exp.
1

-
Tclapplescript_Init
Changes to mac/tclMacOSA.r.
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
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










-
+











-
-
-
-
-
-
+
+
+
+
+
+













-
+






-
+













-
+










-
+


/*
 * tkMacOSA.r --
 *
 *	This file creates resources used by the AppleScript package.
 *
 * Copyright (c) 1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacOSA.r,v 1.3 1999/08/16 00:09:26 jingham Exp $
 * RCS: @(#) $Id: tclMacOSA.r,v 1.3.2.2 2001/10/17 19:29:25 das Exp $
 */

#include <Types.r>
#include <SysTypes.r>

/*
 * The folowing include and defines help construct
 * the version string for Tcl.
 */

#define SCRIPT_MAJOR_VERSION 1		/* Major number */
#define SCRIPT_MINOR_VERSION  0		/* Minor number */
#define SCRIPT_RELEASE_SERIAL  2	/* Really minor number! */
#define RELEASE_LEVEL alpha		/* alpha, beta, or final */
#define SCRIPT_VERSION "1.0"
#define SCRIPT_PATCH_LEVEL "1.0a2"
#define FINAL 0				/* Change to 1 if final version. */
#define SCRIPT_MINOR_VERSION  1		/* Minor number */
#define SCRIPT_RELEASE_SERIAL  0	/* Really minor number! */
#define RELEASE_LEVEL final		/* alpha, beta, or final */
#define SCRIPT_VERSION "1.1"
#define SCRIPT_PATCH_LEVEL "1.1.0"
#define FINAL 1				/* Change to 1 if final version. */

#if FINAL
#   define MINOR_VERSION (SCRIPT_MINOR_VERSION * 16) + SCRIPT_RELEASE_SERIAL
#else
#   define MINOR_VERSION SCRIPT_MINOR_VERSION * 16
#endif

#define RELEASE_CODE 0x00

resource 'vers' (1) {
	SCRIPT_MAJOR_VERSION, MINOR_VERSION,
	RELEASE_LEVEL, 0x00, verUS,
	SCRIPT_PATCH_LEVEL,
	SCRIPT_PATCH_LEVEL ", by Jim Ingham © Cygnus Solutions"
	SCRIPT_PATCH_LEVEL ", by Jim Ingham © Cygnus Solutions" "\n" "© 2001 Tcl Core Team"
};

resource 'vers' (2) {
	SCRIPT_MAJOR_VERSION, MINOR_VERSION,
	RELEASE_LEVEL, 0x00, verUS,
	SCRIPT_PATCH_LEVEL,
	"Tclapplescript " SCRIPT_PATCH_LEVEL " © 1996-1999"
	"Tclapplescript " SCRIPT_PATCH_LEVEL " © 1996-2001"
};

/*
 * The -16397 string will be displayed by Finder when a user
 * tries to open the shared library. The string should
 * give the user a little detail about the library's capabilities
 * and enough information to install the library in the correct location.  
 * A similar string should be placed in all shared libraries.
 */
resource 'STR ' (-16397, purgeable) {
	"TclAppleScript Library\n\n"
	"This library provides the ability to run AppleScript "
	" commands from Tcl/Tk programs.  To work properly, it "
	"should be placed in the ÔTool Command Languag folder "
	"should be placed in the ŒTool Command Languag folder "
	"within the Extensions folder."
};


/* 
 * We now load the Tk library into the resource fork of the library.
 */

data 'TEXT' (4000,"pkgIndex",purgeable, preload) {
	"# Tcl package index file, version 1.0\n"
	"package ifneeded Tclapplescript 1.0 [list tclPkgSetup $dir Tclapplescript 1.0 {{Tclapplescript" 
	"package ifneeded Tclapplescript 1.1 [list tclPkgSetup $dir Tclapplescript 1.1 {{Tclapplescript" 
	".shlb load AppleScript}}]\n"
};
Changes to mac/tclMacPanic.c.
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
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













-
+





+







/* 
 * tclMacPanic.c --
 *
 *	Source code for the "panic" library procedure used in "Simple Shell";
 *	other Mac applications will probably override this with a more robust
 *	application-specific panic procedure.
 *
 * Copyright (c) 1993-1994 Lockheed Missle & Space Company, AI Center
 * Copyright (c) 1995-1996 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacPanic.c,v 1.2 1998/09/14 18:40:05 stanton Exp $
 * RCS: @(#) $Id: tclMacPanic.c,v 1.2.18.1 2001/04/04 21:22:19 hobbs Exp $
 */


#include <Events.h>
#include <Controls.h>
#include <ControlDefinitions.h>
#include <Windows.h>
#include <TextEdit.h>
#include <Fonts.h>
#include <Dialogs.h>
#include <Icons.h>
#include <Sound.h>
#include <stdarg.h>
147
148
149
150
151
152
153
154

155
156
157
158
159
160
161
148
149
150
151
152
153
154

155
156
157
158
159
160
161
162







-
+







		    	SysBeep(1);
		    } else {
		    	SetPortWindowPort(macWinPtr);
		    	GlobalToLocal(&event.where);
		    	part = FindControl(event.where, macWinPtr,
				&okButtonHandle);
    	
			if ((inButton == part) && 
			if ((kControlButtonPart == part) && 
				(TrackControl(okButtonHandle,
					event.where, NULL))) {
			    done = true;
			}
		    }
		    break;
		case keyDown:
171
172
173
174
175
176
177
178

179
180
181
182
183
184
185
172
173
174
175
176
177
178

179
180
181
182
183
184
185
186







-
+







		    SetPortWindowPort(macWinPtr);
		    TextFont(systemFont);
		    
		    BeginUpdate(macWinPtr);
		    if (stopIconHandle != NULL) {
			PlotIcon(&iconRect, stopIconHandle);
		    }
		    TextBox(msg, strlen(msg), &textRect, teFlushDefault);
		    TETextBox(msg, strlen(msg), &textRect, teFlushDefault);
		    DrawControls(macWinPtr);
		    EndUpdate(macWinPtr);
	    }
	}
    }

    CloseWindow(macWinPtr);
Changes to mac/tclMacPort.h.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







/*
 * tclMacPort.h --
 *
 *	This header file handles porting issues that occur because of
 *	differences between the Mac and Unix. It should be the only
 *	file that contains #ifdefs to handle different flavors of OS.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacPort.h,v 1.10 1999/12/08 03:50:04 hobbs Exp $
 * RCS: @(#) $Id: tclMacPort.h,v 1.10.2.3 2001/10/17 19:29:25 das Exp $
 */


#ifndef _MACPORT
#define _MACPORT

#ifndef _TCLINT
51
52
53
54
55
56
57
58

59
60
61
62
63
64
65
66

67
68
69
70
71
72
73
51
52
53
54
55
56
57

58
59
60
61
62
63
64
65

66
67
68
69
70
71
72
73







-
+







-
+







#   include <utime.h>

/*
 * The following definitions are usually found if fcntl.h.
 * However, MetroWerks has screwed that file up a couple of times
 * and all we need are the defines.
 */

#ifndef	_FCNTL
#   define O_RDWR	  	0x0	/* open the file in read/write mode */
#   define O_RDONLY  		0x1	/* open the file in read only mode */
#   define O_WRONLY  		0x2	/* open the file in write only mode */
#   define O_APPEND  		0x0100	/* open the file in append mode */
#   define O_CREAT	  	0x0200	/* create the file if it doesn't exist */
#   define O_EXCL	  	0x0400	/* if the file exists don't create it again */
#   define O_TRUNC	  	0x0800	/* truncate the file after opening it */

#endif
/*
 * MetroWerks stat.h file is rather weak.  The defines
 * after the include are needed to fill in the missing
 * defines.
 */

#   include <stat.h>
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
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







+











+







#   	define S_IXGRP		00001	/* execute permission: group */
#   	define S_IRWXO		00007	/* read, write, execute: other */
#   	define S_IROTH		00004	/* read permission: other */
#   	define S_IWOTH		00002	/* write permission: other */
#   	define S_IXOTH		00001	/* execute permission: other */
#   endif

#if __MSL__ < 0x6000
#   define isatty(arg) 		1

/* 
 * Defines used by access function.  This function is provided
 * by Mac Tcl as the function TclpAccess.
 */
 
#   define F_OK			0	/* test for existence of file */
#   define X_OK			0x01	/* test for execute or search permission */
#   define W_OK			0x02	/* test for write permission */
#   define R_OK			0x04	/* test for read permission */
#endif

#endif	/* __MWERKS__ */

/*
 * Many signals are not supported on the Mac and are thus not defined in
 * <signal.h>.  They are defined here so that Tcl will compile with less
 * modification.
143
144
145
146
147
148
149





150
151
152
153
154
155
156
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163







+
+
+
+
+







#define WIFEXITED(stat) 	(1)
#define WIFSTOPSIG(stat) 	(1)
#define WIFTERMSIG(stat) 	(1)
#define WIFEXITSTATUS(stat) 	(1)
#define WEXITSTATUS(stat) 	(1)
#define WTERMSIG(status) 	(1)
#define WSTOPSIG(status) 	(1)

#ifdef BUILD_tcl
# undef TCL_STORAGE_CLASS
# define TCL_STORAGE_CLASS DLLEXPORT
#endif

/*
 * Make sure that MAXPATHLEN is defined.
 */

#ifndef MAXPATHLEN
#   ifdef PATH_MAX
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
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
244
245
246
247
248
249
250
251
252

253
254
255
256
257
258
259







-
+





-
-
+
+
-





+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+





-







/*
 * Declare dynamic loading extension macro.
 */

#define TCL_SHLIB_EXT ".shlb"

/*
 * The following define is bogus and needs to be fixed.  It claims that
 * The following define is defined as a workaround on the mac.  It claims that
 * struct tm has the timezone string in it, which is not true.  However,
 * the code that works around this fact does not compile on the Mac, since
 * it relies on the fact that time.h has a "timezone" variable, which the
 * Metrowerks time.h does not have...
 * 
 * The Mac timezone stuff never worked (clock format 0 -format %Z returns "Z")
 * so this just keeps the status quo.  The real answer is to not use the
 * The Mac timezone stuff is implemented via the TclpGetTZName() routine in
 * tclMacTime.c
 * MSL strftime, and provide the needed compat functions...
 * 
 */
 
#define HAVE_TM_ZONE 
 
 
/*
 * If we're using the Metrowerks MSL, we need to convert time_t values from
 * the mac epoch to the msl epoch (== unix epoch) by adding the offset from
 * <time.mac.h> to mac time_t values, as MSL is using its epoch for file
 * access routines such as stat or utime
 */

#ifdef __MSL__
#include <time.mac.h>
#ifdef _mac_msl_epoch_offset_
#define tcl_mac_epoch_offset  _mac_msl_epoch_offset_
#define TCL_MAC_USE_MSL_EPOCH  /* flag for TclDate.c */
#else
#define tcl_mac_epoch_offset 0L
#endif
#else
#define tcl_mac_epoch_offset 0L
#endif
 
/*
 * The following macros have trivial definitions, allowing generic code to 
 * address platform-specific issues.
 */
 
#define TclpAsyncMark(async)
#define TclpGetPid(pid)	    	((unsigned long) (pid))
#define TclSetSystemEnv(a,b)
#define tzset()

/*
 * The following defines replace the Macintosh version of the POSIX
 * functions "stat" and "access".  The various compilier vendors
281
282
283
284
285
286
287
288
289


290
291

292



293
306
307
308
309
310
311
312


313
314


315
316
317
318
319
320







-
-
+
+
-
-
+

+
+
+

typedef int TclpMutex;
#define	TclpMutexInit(a)
#define	TclpMutexLock(a)
#define	TclpMutexUnlock(a)
#endif /* TCL_THREADS */

typedef pascal void (*ExitToShellProcPtr)(void);
#include "tclMac.h"
#include "tclMacInt.h"

#include "tclMac.h" // contains #include "tclPlatDecls.h"
/* #include "tclPlatDecls.h"
   #include "tclIntPlatDecls.h" */
#include "tclIntPlatDecls.h"

# undef TCL_STORAGE_CLASS
# define TCL_STORAGE_CLASS DLLIMPORT

#endif /* _MACPORT */
Changes to mac/tclMacProjects.sea.hqx.
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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
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
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844





























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































2845
2846
2847
2848
2849
2850
2851






2852
2853
2854
2855
2856
2857
2858
2859








































2860
2861
2862
2863

2864
2865
2866
2867




2868
2869
2870
2871


2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886



2887
2888
2889








2890
2891
2892







2893
2894
2895
2896
2897
2898
2899
2900
2901
















2902
2903
2904
2905
2906


2907
2908




2909
2910


2911
2912
2913



2914
2915


2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
























2940
2941
2942
2943
2944
2945











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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
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
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719







3720
3721
3722
3723
3724
3725








3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765




3766




3767
3768
3769
3770




3771
3772















3773
3774
3775



3776
3777
3778
3779
3780
3781
3782
3783



3784
3785
3786
3787
3788
3789
3790









3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806





3807
3808


3809
3810
3811
3812


3813
3814



3815
3816
3817


3818
3819
























3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843






3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854

-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
-
-
-
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
-
-
+
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
(This file must be converted with BinHex 4.0)
:"h4ME#jcC@%!39"36'&eFh3J!*!$UFJ!!AiC1AC6G(9QCNPd)#KM+6%j16FY-6N
j1#""E'&NC'PZ)&0jFh4PEA-X)%PZBbiX)'KdG(!k,bphN!-ZB@aKC'4TER0jFbj
:%R4ME%eKBe"bEfTPBh4c,R0PB3""8&"-BA9cG#%!!!%V0`!"U0ABUe0dG@CQ5A3
J+'-T-6Nj0bda16Ni)%&XB@4ND@iJ8hPcG'9YFb`J5@jM,L`JD(4dF$S[,hH3!bj
KE'&NC'PZFhPc,Q0[E5p6G(9QCNPd,`d+'J!&%!!"+cF!N!0b!!%!N!0bCHJ0TD9
MEfd[8h4eCQC*G#m0#KS!"4!!!+R)!*!$FJ!"!*!$FSj4$D@P8Q9cCA*fC@5PT3#
PN!3"!!!c!%#d(A&cY-HdK!#3$3-"C3#3!mN!#PS8!!#Sr`!&G'0X!!#4V!"p!"!
5CA0PFRCPC+@P!+@3"!%!!$J!3,Ea6[1fm8mc!*!0#%8f!*!$cJ!Pkk%!!5TT!!)
Y2L"#G@PXC!!!&e)!43!L!9-#3J(!rj!%!alrq2r`bd3!!)!!N!HPN!3"!!!f!%#
"f3(!!q$rN!3$"rrirr$$3!!!J!#3"k@3"!%!!%!!!,5K[,#dal4p!*!$FJ!!(`#
3"()!%$&`!!(IL!!!(G-!N!32!%*239p8Bfa6D'9XE(-Zci!!!*Hm68e3FN0A588
"!*!2J!#3"d,"e+(92U!T@-GR[pQ)D4N"!E`GDf!YSX,#m4G4!EiQITp3)KPT0%H
d(A&cYr3Z1!#3!h)!!5SJ!*!$FJ!'ICm!!!%S!#ATZ`!"+2J!##dq)(4ME!!!M%i
!I3!3!GN"p!(!rj!%!Klrq2r`bd!!!)!!N!HPN!3"!!"!!!#f"X)LYr2AD`#3!mi
!!#$$!*!$cJ!3CG!!!PXD!!!I0`#3"!m!3Np"Ae4ME&0SC@aXFbl2J!!!Km0069"
b3eG*43%!rj!%!*!+J!#3"d,"e42GR+Kr#fBFJMkq0IpI-TJ*UkQ!TS9`P"J5$`6
pm)+Aj!6+&jhVJA"R3l-mrA84h-+P`2rGA3*P&NEJ'N"$CKFN#JhQ2'YNhclN-hc
Rc'&RLkSTPJJj9LE05Hm!SM3R(BPj-(BUe@0PJ9eGrpqbkL`STMcK4QGqpk0,HQD
-k+DFK%5Gj!aG2TfSA0YaL([!F2MV`A%B-k5mP1aP[9-#V31iE"9ebe!3E*!!K,8
2k,YB%jrr,R99GBfm6%BD*9C#P+fFPGrf0bNqh%-!j(fTpX[@AHCR!HlaC"fJ$rY
TAcFE,a9ZCIU1V35f!RiqD*dk2N)LK#DZK(dS@-mc2b!k(YP54-)BG9NTjd3KKcD
p2FXr$r6XM"K5,P8AAXRU5T1r@cd%ieJ06bHaj4$m6RR&2K$(NpIPqqbLC$ZiYTB
82amS&&H1Y,6Z#)LLqa[`B&mML8SfKSpFVh08GI1Arp$#NpH#%I9k!ZrNS1'J,-X
RR!XkSAVmQ1G*LA9Xb"Y#YScYHfF%"8i0ji8ad"!`L["[L4cGAGIeDfbf`[q3!0K
`0j!!D3"[XcTY08L#DVG*E`NeT+-j-,`aRhqV($LiZcQNE5TK3CbYPNjJR*`PGrH
K1Ujee25i5Q1VjI+p&9Qp"lXM5Q1Y`3q#,#P@Hb*+YeYJ1l9N5c6T-)PIB+4,8`@
DD+flMpEG&)93AS@#p[Z@8FGkpkij15JlpSS%Z0DQ@"1cUI#FeU-&b12aPm2$F6*
5pUCSGME'*Gj*,m)1b&d`"#33f5ZATdml1IBj&%'AbA+V@"`I!K+Tfm*Tc+a%!9k
Y0%e+fS))CMZNN6F!jh`'2idk+aL3!'Kj!!S)cb6qS&TpHqHc'HXcEC&#&1FPi-5
"LekVkNF%h,,L)B(h0`Tkr9XARqjl"p58(NJ3()h`EViHGIi$e8Q'18LXclRVi*F
12,-!ITU6EiX(Mf81Z'80T)C44e-Bk#frX*GZZ,&c(je`'%D1b0+B+0cA$L%fUQm
)L'jV4ZVi,#bh4SHpq%$9#IQ3!"Iea,imB'"6`YacX',r&m"$`rHKG&'26b"6*Z*
jrfU%95I@"TD1"VHMXKrc51#8!ae(208a!E9h&D+Yhdj@YM4jUQk&kemGG-M9i5q
Yd4VApaVaM)#fMV2'lZ@bl@Kj''4j#f#XKXR56QS4Z3lk0FH@YKi$#$'q[GaiRQR
r[,mm)l+8,k5(V&q84[CCNN0Zlepc#`p)2#bkk[%8imkMICp"Aj!!Q3(RA4@Re(j
%*Q(*&'EZjM0c2"m16Hq2,8&K"2&5V&aN*#*(N!"`SrPK-IakirFQf'B-M@-aX1-
kUpXGEAi@FlE8(k5S"3IaSm1j*!IAkTi3N@M4@-`5,a8Ml0UcY`iZPbreqLY2P6H
Z)dHjSV@Y`8"DEMRYmckLi1TeIJiGlRGKSaLPcEdc*)[Sh[efC3h*)$h,k55Y8`H
3!!KP)I,eb'Qqi2Df[aFC,'SQAjPib3Ala@*hlLK35cbDD0a,6GGCk-cLDi[VG4(
(KchdSjc@1TNLGY1GD%$2K"NNpEZ1Lc46B&AJ(QQbD*f8lR-C,D03Irm%aH1eC"5
CLM-IPN(F8SFhIKb5$Q-XjKfb3YkcLh9hEbL%m[YrYY&0BQXk$9N*GfcQbfG4'+h
Q381VK%k*$!jZ[QEHL22P-FqVe$3!iDq0d5&QebUiG@XQ-9H&4dBRZVX&Nc6%DPq
kR""%REJJ`SML`QNL!Cei9E`"*Ae8H5H!YljA(%lpF+dVReV[1TApefMDXURr06[
PITeTB2qQZ-#-G`J3HG8b4(XQ(jBalM4K#AJTqL!,`#f5i`K!5Vef)#aqD&iZTRS
I%Lh@NrGrE@[d['!m0k80AqD*KP-kC0[jqr&I[!prJHbGX+*@G8a8%8$V'bVY@-m
eJh0)90*ak54S3E8m6(eRCU1EhSLSjSr@dF)G6XqilPrpBmZhd'BTFG3HJ0Z'+cN
+caa@MMf)IM@3!!!U!h(V`P&$qeh#P-*@(`L`Q"$UXI2cTfejh,[`qF'qlAfQR("
T8jHqNeSR2E)CDHQ$N3ZYTa68NXYSlkD&kM$p*c`!'SFHXf[F"DpF`-G*f#S(DPB
QfL*i%,EFbh8MP0mG`pk)2)V",mSlKp2lUEQ4H*5@*Dc9XQfLqcFqSik40!)DM5`
q#Q2Z5('ZT)R-fRA-iL"N5"($Kce3E*1H"m-c`1DU%VUPi2%mj6m53DBb`08X!!+
eE1ETDiVH,,F8XPUi,fZ+KDbV[hq4#%'JK3@"0k*''GEmT-XGX*!!(riZ9R@G864
qH*bd64[9`"TAA4@9#X@-3rbK5Td@i)C+-arQ)hHJLe!3@r`qJG&V)XM9dP@XGhK
V@1YjiP@)Ger#4VqKlmY(CEQ6BNJ*6*`')Ebc*f[8hU8[iMQV6&TjSdBeUJSEkPe
VEPQQH[b-QH@4A)SAT(M)B`%V$1,A"UU(P!q@(iM9dD#dimpkh,DpEAG0qcbTN!"
KHD)mdD$ld$86afR[!J0e0Qm&*8b%!dd%e3"T*QQAc1m0Rr$(#%XDSU3lbl`IB'd
r1XqSUNZI9e'j3p63TXR`#N6!G4*CHA)&5'1&d4852r+p1CQD(jr3"rbU`jkp6#M
LraP$Yrk-&,36P($P@(#&LJ24TF4534lM(Jr#"ddFSY-A,J)SbmRhD0TXeeHmr)X
)Ya4GD5+Kq6$mS6`0ikqXT6I8j2I9*K6qS#b0-@R`"L$3X0I-qmb)9pQU1R))dpV
@0LMbK9IBb$`am3*IdDX`qjQ"pLA`YmH(hMXmMFP1lKGGG53h%[laIjJfA+Zd)TR
S2K'GVfYCHk`lAapUFji'T#DbLQZLh`'K"6LAT)Fl3Ph*RcUD#JT$d2@8K'$3+%&
!A"05,Z)qrrmd1QlM)h5&dhp8UhAbMkEE&lbCHLR(`kSPJUe`!#rHf"0PlS2!Tmf
hZL9+')[iQ%%"RGPPJY(rK$+MDq*@5dY#$%5Gr%kj5E*Q4)U0h-e+&!#hP,G$rf)
KNa%Y#iBMR3Am#E#H5TH%"#U0&dXh2f1#p,BYmM&lCa[)%KdaLq#1a5RGhrQPXa"
5mLbrF2mDDmVeq5RF@Ra(HS"FA!51bXYkTl9@1bXlVZZaK'VlTl5Y`ePra*J+-%H
@"QlHP3Sj5$XG0'Gb2$MAd2'25k)r1rAr)d4d9ZN(GMRVh(@9Y80cZSVLHIVIX,q
mi0eR'PC&+!QK"qSUr&ke`#Ikkc'rV!e6k#eY+dqYdYeaR(@-jXlpBhb*32dFMPX
PAMc''f#"*@IQE4B'f4Jd9i,lI*`f4M8cEN["XG#Q`)Vm#EF92*R4Lb`$6$-DSr*
[UB6T-4m`mdNRQB$pFYP`+M[#r4G6)LCHI6!MDl-YEZU*eZQ!h5XF$m6YpA-i2Re
[Q`*rT)3VlSUJRXeGPr-&9eDI-+qTm"%(9+DYG8B+U$r8`iZ%Ppidi6-TBC1pAmh
pNqD082SfKeE1[kkG4Zb6Y-dihHX6`$iUU%h1*+N0#,6%P'"1cI[M0pD'fhZ!cZ#
'A,mbVL8qbNIm2Zd)4!HS51i4P0eF2!NcV"YmS6dDFLqm(bh@fYT,@'5(!2d,"J0
K6X&0mP1RNamU5I0Q43hKaMQq+q"SZPLdKj823&c@%-m&8Dei$J9Vq%V#"01&3%A
rkK'-AUMSrh(qbFG99Qi[J!FZ`Npi43DH[`Q@f,fQRee5l6e"IqhqV9T$CUHr1V!
$SpH!M`+#+Y2h#-qb9k6r-6fV!@ma(MV&lU3-PZf[(*H4YTf2b%lJp&p8q(b0%*-
H+K0IE$9$!`Ze9VTCVHhCc"!0ZMJq6V1`0Q,jj25bX(NUECF1%Gp'2,X%I"`JK1$
6l1SC@N)@5K)#)6PM,M(5P0q5S$),2(hhRapTE(lX`qKBL'SIMrI#JE*QEQSUqID
KDXa02Jq!K)p8G#H&ZkqdK5aQ'hYHTqG6-q6XGRX+!5QM-I5"qrZRk%!G&qkebcf
&-rSRcMC)$UX()"NDi&SVTN5*4$R!$#c'i)J-%mN-4Td&CVUYJrhRDP5rDHamm4I
YTYiK(H`U$ceX)p8)5c&CM8-bfMVl-'j(B`8`3DpA08-S!Ck``HcVDrN"EQ&ER8B
,4JA,2I&bFqEI[fE%E%B-p&qUH)&Z"JTJ!cl[DFHL$cEUP@4[28K23N%DUa'4SJf
pcq!NkC*0lXD2VPHlb6aRKIb)@r89h2l*G+r#1MppQ,qMjaXEpM"d8F15*Iq+V0%
-`6cpc%Ze[J'X&,KJZHf@N!""TAP%pq0UGKY)f&T"V%HrE,M#,kH$K,Jk5)%R,re
4KA3-a5K)V6PJak*%56#EBFNr)XDrp[#`dG3'4fImalPP,p4-XLUV%ke-iFQI@@B
+C4bG-KT$"5@6S&Gp!*Idqa2&&UB,pPX*4&[VH1pP3"@h*PJ3#AGr5Pb&Nh3!*+%
#p100)P98!B1FY,jG#ELbTba`X56'hD#!)r0q"99epkK#kV11)188HS-q[[Pf0-r
EEcP1X9Xm*A'6beXh#C,Bch(d"QK9BC'4e'D@ZECK,JVU(iDQ@@2kN99fK#Z,P(6
c#A)k1ffp@F1RR$,(!TC"E,6`4qM$%l8m,l9&ZVMHpRie6ULhKZ504NkT)b[mXNN
%EEGVF%39#kkHKKJU0a-+&%,+jp*53q+99&pS0%JUDFV,i&6N[6)$EK'eH'Ch#`j
5R4lj3pB@b8'(UGfBr3163[)'Z#rUbK&(*9`-`UJZSU9I*Y%4$JM,elfZT%2GZ,r
cBA"pr*2(U!d#2%YB@SmLb,fG"1elYU#SHa)Q3XZMb2m['233mIhkKEp,d3mR3&@
3!)5PNQZaqcXbQb5I8K+Ea&l+Rb[)D[h(L`hNIXl+HT5#'6+q&6jLq-D6EG"NpL[
HFM6GL)6bR+IKA!',UCHk'SBMR!`#d1Ck3dr)l[al!Ar$lqUP`rG1X#2UYT@bK[2
IHS,P1)k5li@J#IU$RNe`qPr0dShA2`EICXCX*LaEi-CNXqXBl(jN6S*qK`*C`lA
41M@[K)efH!mr5+HE@@BSqDVMc'IM@V-0KrNiB,35Y5G@2,EVYp!hLHlZm*l"RAI
P5iF0[I@Nfk5JGBTF,J[TSGfGZA1FD8dXLJ(9R2JUaS5pY@f29p`G%#I1Pr%GTik
j8k%a5M!6Pk&G62(9G8`&f4ND!85F11Na!A[5Y%f&afA%jNCEiIqHJZ8KCfD6B!Z
-S!@+RQfC1D+THFZ6NqG@T4kLpQli#R61*VmVmR(#AY(#(QRiVabA6$Z$PrUCAq6
Hb@1"@"CaRBqm1ZG8DHF5CqHB3Gm++3NV9&4XQ"$A2&r,1ECU,VI[P4dBB)EUh@K
A[&)06m'EI)imXYPr@5pXd%-`1((b*i3d1X6PJm!jDqPia*DQDZSHP+$0@Icf!bI
F3rSp$I6-YNHE04EVKG-m,2@EK-lrGa)X3*5P)CFl5&RjrBkVDZ4Z40l[clm"pY'
I5SPJdr$X,FK!LfLS9iGaER&$TVjFEVUS`"p0Ujp[TVL+CASq3PYLeV4Hpe[)Bkd
#DD-L[Xc+Za8@Abdd4)&S`Tbr4LYj#@KK!'$FAPfjbpLC+TG&D[[D,$e$CPV8iKh
H&1cZ3UG8C$hh`1fQZr0kD$GEQ@fV(RV8$kUNA690Z$Y8Uq6G@L'UaC!!hVJV3U@
kp+1Y*a+jCGl2JUqrFLZY`+'V(Eq%"'A'Dh0*VcG5,Hrb'*fDrFSAZ@[5CXM1m4i
b(2IiK"4*&iMV@3p4"cNaQ#[GI@,ZPrcUi!YVm8mGVE1eXGq**fqQcq@5PEZmreE
)YpcjhiYVHpmL#EIVCcI--UVEJ(TEQDSFQARq-Ra+2*hM*VXlde[A"&Vm'ph8!6G
c&rR+C5&'F6"VbQq9iA%KS'%0I$`,%q*c*5R`kF'P1$T81GjqCbR[ZCHY&a1%pUb
rcKd+J5KqVdB28GUmLU5lQ3f)[C!!5C68k[TE9Bq!m3VpD*&6AiFq[,$f!*ZIR8D
FT@LQqi#QBl4#6@0hcG4,#UGJeM[2prG*d1$A-R'B6m&D--abPfr9,+rpbdV''Kh
R(8+R@hM4GSVV8KFXQeI,G+ReH*'d8NE"`CA$rlB,&r1AQ+CEH%+pLarE$1EH-bC
[-lN55d3NU[c#!(m%cTNiBKDJQVRCZ5XV#`#aRjFicE!HGcLc4FU`fA9C#dK0c@f
kh%flCGXcDb*p5PKBJb(IX&Z@JGa'K35ldSVr%#$r`6aDiaR+5230LiIX2-(C$Fq
j!C4kVrLLi,pHa6!5qr1&l"!%0B(@kJcf*SGRZcREc'!UB0J1Ec,Kb")89I&(ajN
55Bq'VBYK+J[94JX(HY8M%4RaEi[5354QQ$rQbQ6G"D'&p#[m-lbT9L&'N!!hT)q
l-ID0RG5K,fNGJ)$A**)PGUB`PC0XJ!U6#qb2P,%C9$UJ[6ei)cZf82Vk19G9fl#
fZH[c9SNl!l0Jc-2PCBqaMpAcPG`HBG&GGlS&fjIbpYAbR#bCkJNkIk,86pIab9L
eAmZQGU#T6-+!(S`55j3TUlb4FDSbl&*HLeL["r,,9FT"1JCSG94+Q+`8dH6JjZ&
*"@61,Q5MDl)3UUSd#Fr2cHj@`HG'[b@c95d2!#Q@Mk-ib%DLUh!r!YS"6IJL20#
r@0@U8)q"-SL1Jq1q9FL**C(mAFf1GTdj5HLhqNUVh,+kddDR%R3pANKSZ"9C+a5
iErNp3N1QN!"XV,Va(c*)I+Qc"BdHki[de,pKmAR#hp,%&bq13(RNSLEZr%258,2
T(4d8UU@[PVK'*"CqkGBQVlZ&Z@AHrT!!MTV8HkG+A%ZCkccaQbk)P6ZpM$EXi0I
l"5*LDi9EG(iRf(U6MSqp6U2Z%QNLD6cBK'$&$[-Z83Zk$"kl4rdqe`Q(*A1l@aa
II!G$@IiF#a+c2Z"I8DL+QJb#+IZ((iHG4VlKipm,i[b0YMj#[M6DLQT)9"aNaBj
11[,D)e,C$2h0AZHSM6MZGFXPbGhH"13Z`mE)J@k"9*UMY"p@i[1QG@0@M3aeG$h
46r#12LT`+-IMJm8Sh2,IILF`J+h)CfF,ZKR)BbmBmc-abU2bUDfER5MD9j!!&YF
jE@!VFTfrj6mChl"AfQBVR$aJE0)3#I`')!m,aLE%P&kE$GDe49mBZN3HJ`F,bK0
dlYTUMCr@i!P9P!jlY-,qED69e3CP""V42DAL!Mb1q[@,RKN*-!XlU"3ZBV8iBb3
Q4mq0YTUZ!ldDJB!,A"'i,$da@j)d9ha56KY+mf4H)qX2-pYK538'%Z,HL2YKl#Q
!`RAhHGk,1cGpr3YDmG)d0DAQH&+Kb6-CTM(N(IJ8q'EF!m-r1Sr`N9FXC1Ih'Ip
d+mATYZ9eZ(Q3!*p2%c6Ma&FCV+aX&F)lE*1p#FNE'qR%rTM5ZU8[fPG&I*FTa15
UZ$I"L(N8,p,HRXRm(L9K2&S`,0&Jm)Z"+JK6ULKblaYmCcq%FrY6hAm!$Hb@4`4
BpU05UJr`lZ-$pAh3VPjfHYq*XUB5b[%UZDR9#2%([T8JfUc,rlh`U,8Gk22IFRC
Hd8cmd%K*JA,+0`'Z-hk8)443$l`P(r,Vc0N$90mLrr3E(ShP*EqEI+mX`h&X"pE
bid1rJ3R95Td%9!U[RfS#&A6Qb8-S3G5S`qZ8&C!!)),UiXFm`apqDjN9rM`EA82
iJdih$J33S5crQ$BNY-('3)$HGD5c8d"V*Hp@'f&0r5IHqr!49ILQ3FClrIap*Zk
3!"LYVCLa4dm`iE6N$ABmZ#`ALdHQpkkB14k$`L,[NAaK#i"IjPdFCDh'pP$rT,)
1@6PG!5TrScr#N!$'83,jEYL-kabUYIYai#bhA!F6`+5B,)P-$jr'(P8iCC[ZB(U
#VjLJc`bFSTRTH`@F2Kk1,@T*6,jBNTT28Q5C9G,J54@-E#9PIlGN$MZ+5KY200)
Ib%SZ8(RXJ38[lNBV%qCD&j1H%#f$*dc95dqJXXVISRS85pTX)k$0,P49fFqeY&S
eX&+Gf)HBYfb8@31F9H5k@KheFrEEEX+,1BFi&)PVh3rBmYV6Nb+'&0(iI%X`QHp
pGY`YVU3K##VYVkZV11ZAXiLHN!#8d"5RjX"BVPfL&N6G0%TN$rQ9#EEN%HBqGD4
*#JGk&DJl+JHJecIYd8QdRq%#Y$hr8&l&Q*rjL1k3!26P+f``b+2a03-aFd5b,3&
aYEHXrKm4HRGhkZTSH2d)(dZBH6!HY90AQGV$bQE+'m6!T4`bS6[r0GVG*I8El3C
-*2VACNPb8$UlJ(!G0"arkf94[,AX-8@&bjbrj$,,-Lp9%SikMI&bL5*RI004"4c
8AVfFmfqUDUL4m%&f3%X!3`T%f1j'")&lFrTYJK",JXHNJ@Q(Y&T`L*()#&r-Mr,
,P+,KS@(rYUB+Tr!JE@&rAGI'!$D%5HI[b20drJ*de`ZYl0XR-!)(UJqk)j&P@G,
B"([GEJqKmfF$BQ2#)E'Q"TQbM9&MH&'R[&rMC#18(&i$h)N#YQ589r(&$jMDYVa
Y@8AB4f61fk+c@2+`(dZdj-iNcc%ZH1[Z@cifGKfZLJNcC4GpUh*e[-GV3F(k&9D
$NdVcLem-R''#jFV9d#Ci4N(5#MDbeFLK%!G@C16P8i3A+JPG'Gf1Lq1plQRLaKc
f8A[fjM"KkH-H,1La[lZZFb'V5lK9#9FEX2PX-+Z5D0#[(cM08i"jXr0fF2eQ3a$
Q#(2k8)6IAhh**[hPlC'2G0YD+P@l0&9HI,(MQd"c!#k)j4!ifdE*[(@&9h"KrZ0
UHJ5"$)3fi@5Jfd!41`*1rRCkQ$G-6l8rPiX+cG(pDP96%Q9IT(L4+1T(%mqND#c
J%Vr+$DacXMim"UJ5,Kp$(Z*V'0@@G#S)b8fPL#,DD5XdqM1iTL40RhDIMVYGfUl
DNXSYA#"fkI1A6#BFJZb-%I)D2eA()U9DQ6YK1c"`r'Xrq3erN!#d'8XB'HCad%[
jdBjNYR+EjG!8@[LbcV[5Y*kQd3iGcH[qR5a#N!$!X2QVY)5T'e2p,3Vkl#GcIkV
clhT)r*kZcQ"4[LkD`2qeCa8cSK%YIcL6jBE(Rm`qKIV4EC8b#Jp9H"i,RjEdZ-E
+$0+01PA2L6-Hck2cL4DCD2ehmZGDb#GI([4cQC`E"5XX8bjX`prQk)YS+ka@paT
CL!c#hrb0$af'0%DpP`'YH,qcb'p`LRd5A0i-BfKkK5p2B4[#(,DR-!f6dSeejHJ
HmS)#64ENXXQqfI4FmVNUYhU!8bL6ah&'Qhcc*DbII[+ji6ZQe,3[kd&&4$H00jA
aZJM-ff-Mr!0iAGekE#)*"epF(&Cii6TZ-kDZ*!YbApmSYV9BU)08fNDd`,%Q0Z*
D+3c%1q0ff9Y,5&PC3S$b1#@j*chXb&@*G[brB1jbpE68GEE4#Ml#*3ZCaJ)lRh"
DlD04hAqS1dfLY19e#S6pRQr0qIE,*!)#+JZ`ff4RjV)$4"TeH`j-(1%,kYdk,!@
ILX5S#p1[`bHi8U-6E$a5i@JXV-DZMD1D[c9UI-k+"P"5FUhFQU53!)`E8L)Y!rE
Sik5T4BQf2T6l%ac8`&+YZL)XmbX1bN-+N!"e+S%km%pBM-)FQZPkbkjBVRbkLCj
Y+(idXd+BYbE5QKUm1[[M6m")XmmQX(,@22TpE%cD1Nc'+9*EjAq$&+qZPREJG$A
a4emGRqQ29VNqaX!bCT@9EUPCH!NJ!N@*3b2fCIMFZ$XFa95YjThQ"3NjRZ,!fT,
ep)%-DfSl#M6d"6LF"QQkYJaCa38NB0%ipCabYBr,-1LfrN$PT#H@+Jlih@kGXP+
cVB0@`9e02"rq,l9"`1jRaJV6+9jpdlFFbkX!'*40Afr5TVS*!FD!LiK%Q`3&3ZJ
#`9r1dN)JhpF'F$$E$"NS#3D89@fbR5M2Ip8mVr3-SlYe*V'4PD&RAC&a$4IA)U+
B5H"YjiGr6@4T95--CkVd'-S+HPa`P$h1fYi(f#ZL8#3QE$E[T6EUk9k6fk6K`Sr
3l`eG1"JR"IE%#EbYhr6*c8KfC492L0',)b)Z6U#rS(e9@CIf@1MVGZ3c"#,)Qrl
5&-63@ih9f"@M(U@r@)IF`BdX$iaPk&+-CeDL4H-)L62T,fIhMVC,Z4f'VakpJib
'4EqkZE#kMkaTYC)ZM)rSfdI88ZB-pkH3!#+@IeC,$*),2La-lTdVpFm`pi14%34
iYQ+4c5idRU1VVABG6U"4Jkpbh'QY+`cl"RB)C-(a-5!qBkii$Kb&TbTM)k@C3d`
l%6RMe@[R[%RX4iID,ceFErkARL+rKT*e)N*,G`%UXFj[ErHP'$+Zi+@3"!%!!$d
!!,5KS6qdal4d!*!$b3!!0EX!N!0b!!hP13!!qB`!!"CD!*!%$`"0B@08Bf`J690
-,Xq!!!#A[%e08(*$9dP&!3#3$i!!N!G#`G85SALlVSheFKi[2H,GN!$TYB6+EZH
KB2IdYYS#)!ai'fB6hBT%(!2UY2HIX%FI&0A4p[KU9$*AL#4$i`0J12CBP*VaF"m
5,[)@LXma''!95*BV1k$iH$G!XSaN[IAq#c,V-!&61BM5CqcDp9,UKj,rhli@SB2
F-EBJVSD+f"mi(ckFmc3%d1)YS'"'3&*03rLVFHCa"1GSM0Z--,l$)pC"Q*&Sj,R
J3H)JkS3r)YTfU-+JF8&RchX,P+'))E,c!@Zb2MMFrY#3!*[*4UVAEmN2C%QNT$"
`J`95i5J3!eprCV(je,aEj[R2ce(0"ERd2RFVI9qYJ1C**Qhi$CX8H(CLGb#Frf!
lpqm3)NPPE*dd@,B"beYhUmh+K)+`D[reEYA[U(+N-GQEcDiq[##rP&G!DmZ"c1A
C,NH'1Q$%&BFU(mr)aI"jrkAGq!5H5G6MRckP94TPA'*KLY-h)8mE1R-#`@5PN6M
hZTEj[kHcaGk&c#C#JmFi5Q!chmVqjdH6,BKd%q[eZ-+SU4+fR8mUK5Q!)`XR@!p
8DIiT9PJ*JNP5PBkV$qcbTG4A4H1jP0(6f425N4jQ8c&'brrbR10'%-2-HpC(1FD
6!UM)RdM0Y#2eRlb+d6B2ah+i%Y[JCILYfihkcVF8"8mENJ"GL-9@Z2VNeU$"R`*
Q91GjKZ55"I+l0SlPP,N,+R9*(FqZpDXVDYV4a3a+&4V$I94j"482qcZ,'B+@aB`
Ui5a5MSpS`bTIB[[L*PfL19Z3!#JV@LArZJUJEAhcBGG'CIrS)%q6S68RDP0*BJQ
[-"k0cLaMqp@*cq%D6qmk`"Za%b5PR+AKNQ4U!X9dFPNhX&2C)*DJj6de4Y"e#*S
U"4SRXc*dj,caGC@,Ylm46&`0[!lM&kG)YCQ#c4kr`jZD@#8e,*13!+'k+&FbdDa
2,SH"j$3J)aefY3de0B*'Gerk!mC@M6dF)l!M3QAepEBNk9KMeJBIZJp)GF-D0Gq
NXG22[ml2SKR2M)D-Db&mk),1&@4hS*D8"DZUZ9DCej9@V!eLCr(lLUVpHXB'kQ3
K243--c*C%a#C!&XalC(GqAdCjG,*b8`l-(YBII*Fp-!UPP%lKeA)dAIDTGdajGc
#-F"DJ6,$8!912S*KQ9k$B58jJ[8TA-C[9R+G4+mXdTUPBN*@,SErRTId%Ekr'kq
b2`ZpeVHj3h@&lMA+mHGje-m@eCCmlFml6",6SeGrMHV!P*Q5"e#E*QU0V'iq06+
p%)J+QJjF6C%,83NZ"![J'%F)5qE8(Rj(Ek"`j*@8$eY#86%T[LQqHj@(KVeEl55
hDbP$KS"669Z[J9*DJ#JNHkTYlGh,62$!'qVE%PadD)[+AHrPjUDp%,5@B1G'l%K
%jKU2`fjFK+hl+0FiXPl!,A2DD('M8PJmAMi)ama9pc&NDBI69lZZT#aQ911i@YD
el1Ze!`X85lZAQk`pZARjRmjdZYCJ`PFN`F[J,kIf&fMqhQ"D6Ril`q5YlRdT(kH
lj#k+l@"dBrGQQrGjGIkI1hHD#acM%&FaJhcdZPX%K1m"FiGj5`(R)f-V+6F%Prk
L'+TN#!CFQ!Fk@"-9miaK5r03M+2dc#XP%hQ'2j[J2MINI!Y15%9kfAXajAa"!q[
qCZ%i4ahb@FRe4X#0R@Vj&*hQ2&AJSf,A-,3VV34CR"#SACbXAcLYeLcN)3(4b$M
9eS[C5ECA'$-pc[b,aQ5J(XD2MZLiVSk4'+YpQ[@DLqTmqUmhD3VaXR3e0Yc98NT
MJb0M`51ZHE#SlQ[SA1A+KHCIX"Z!&Nr-G09IJ*3kjI`iq0A$BY'IhiNSA''J%IL
lP9@96ck*(3A$8(MQ0kr4)Dc%N!$GQZh8r@ULaMK+3CPXr[fL"(,8HQ6CAqBNmA,
2%lUm2acV5TpDSMq!b06X8%DJZed8f&MHmKNR!KCYJarfFC0Ic091KfJAb(#r6("
+G&C+C!BlESZK[!2p)3`jpl08(H!Qie*&mDebU+TLbh1Y&QH9lG%+q#jD,[6KK#0
*TpY@bY1Ih)hq(,e!dk1bMKTH%ecI4QmCeLSR'G`b`c3Z,EHm'P@9#XCr09Lfa3q
4D36)p$[1N!"k2'L(MVL-1*Sma-X"2'C+"K#&Y@1dPQACY'!a+6#M4T+`6pCMUcG
"qN1$&+(KVaX3[8ca8D("-0$ll!PeZRdk!EY9J(c0rklG0!D3!"8qY[3BQ"BQKk!
elcE0aAjMN3cQk!RMM[NC[!rqDi#LRkfaH%,N*a`D[bE&ERA@me0Y0+TacIp(jAK
4I8(a"%ZjD`&M3TSJ[lmJ'h"QF9a'CdqF'AmMf-e#%"@M-p!`!rE%IRI-48c!,l"
,9ZJ3XK0B3$lRhilVJ(C'9IaJ[&ae*@)9Xc%D@bhE2X+['9DM*QFZ3$mG4fFLb!C
[d%mKa[&Nf"qd8$F)MbD5V8m6'!h2&"T(Y-[HAAi$Adji6$`f[p@)HR0A2"Re[&c
EXHHG0LIS8$qGl5H%4JeQiVTH)-+-p&jjCfX5l$5mlj54AY`l5!L@Qih5$Yrl'Pk
Q9k%U-LDdK6AeklC+Af"d3'Q-&C*"r9H`khb8kq5i1G6'6a"ifQJTAd64Sh`XHIH
AVd3FX@'[dp4!VjkfXIQaX@,9M-l0U%hN5EE84Z1D!k[93*Yfq-mrTBX'PA5A-kj
I&!4`M0Zp6HC$D3K,3UELb!iSf)'&P24#`FJ%VR2qekYB(hUkD4QZ"M%hqj-l83q
S%%e`Zp94i[Ue9%269K`")j1SYEd8S([El)*'9m)JD3kY-$[Qj0*JH"0eVV+,h!Q
U@!,M$(Y&9'DG-pcYZTKZb!iT&)9Vh'!(9MK`5!hV"K%&MMPBaL9'C1"&E8hqmje
HC#P!#%Y0MBc5A"Uef%I(#c2Bhj6m$rDCl$L)L1f1QBf+0a8-YkA%GEX3l23rDV8
MY[h60ZZ-pkYATLBREfYLImlkJ@!N9$GdI15X`#BY#dk5pU2c3ATjQRGRrH%N#-9
8VR90$R@JbPPL`H!8-aCeEHaSNJZThIl&Y-Ec[iXNGfEbXHiN!RTBf!K-NckC8qK
UI'3+qZY4c5[4CF)hjZE@6N9[L!4(p[`$SXkb(dA)2rl[H%PVV26#(a99Eb`Mq%1
*LcBkc2'5%'3V,(`UlYA'I[%YQmb-5SL2d)15icBp29dQT5EDJjeAB(H3!$mU9'(
,DF0a[UPCPmf[4,5#@Ma9'N1D86#d(+DLAJ!Ged"NJ9#+pXP#+rV"!VX[E[BFNF*
BpCrY6r8b4fSD4fCchZD%-C'202hPP1jpEDMNbp(-(F*SA8E9hCHlbNb'iiEMN!"
SY!rfAm1FaLhHJbPF$K)f1pV[eLC!m9apKMV)XNr"1+je(5*c@a4&5YX21ED#'U`
LX'DYkN)diqFLi%d5`@ND(KiaLPBN6qehf&+MBihDl01`AS0BK'9"B%jl33eE$hY
`LVd9Shi%bV'G%f,dF8PI)(5Y9$H!(UG(h9`T$@Ade`K#MRlf2KRCYN6`L)&MJ4E
mSI1GVHU$YT2A5'iSMVA5l9BN8RC-3UE&%RdjlmXl#IVJ36)'&14hFf*k(002X3S
FRAamS(H!aa#iaBLD!0#P0F'$1ELb*feE*@qm6(2ILeHa58I3Ia"CU'3)lhmXjEe
0Bq8kMfAQ`+Q(KZ5jA2kmAZ10i2iF%mA0Vc(8$bbSeha6&CVf,IhN[Zd@`m9Kdqd
FP)pilSqN9i"dbEG*KREZ)f["8D#mQ8#XYS$HeqBZSM,LS[GY,hqJV3(Qrh9dE@Z
)ALmd1[4[FI"()Ye2Z&hDB@XXp+SeQT3pAS33H4E"iCXlD0&T++Mf,eRhC[$0RS4
Rp6jM*'0Th)NpYCR@hB(FNTKXHK$L&`jS-QI'*m`Ur5efp*P!Yb!Lk1k#bk(ZdjQ
)U36!DA()GRfI3h[G-p$f,,CER4Np`qiEqYBr@d6ENXQJ(*q6)f"L+aU5E#K@f(@
kaRp0d)51PeH5DB-lAGDkGq[6MK6m-J'-I%5E@jY'6EUa&[[LSXAG'PR,#i8eYX6
j06PRE2dTi3PQj(@GkRpTV[RVGHS`mU&+l)Z+-KKaEXH84m1K2)VI&-Zhfkh@m3E
FfLcip*i1hm9CBY6qQSfT%jiLLEdBAV5E[YXNCM+)h`K&m0jDFX1'4@J@pkZ$E)"
q@BU+Ni6)L+03P4GH"!H+!$hCjr)'X1*!a@M`5"KaHcAe+G1)(NdGB9NX[QSfi#6
L4AmT6H'pR(RA6Vkpd9A#-P$iL@c4"[RN-(CQ&8i!c!BTdf#+)Da5k+8(@aNGm'X
IX*qrFaGpZmrm"I5pe`2JE6Sh[A4MDP+Z3k@6l,aZd)F@5e`r1lBDf&f#G3EV+Ba
XiJKI@TZCL35X$ciC)JP*VA,$I%$ckm&$Ap28HX(&`VQYFkF)T6ASL+p9fX("#5N
eVI@,VfS2q1A'XqFlAqDd8MCGCT6H0T@MMU!pcBJq+'-Q2K6&kTVcbf!DMZqfhmd
4'85i'L'TTXNdhQC(Uk[3G3Ffb(&#[XNM!'$G3SYpTf$*`"Qp(ehj'i11Sh-'C@I
Dbjr#LE,fZ$&+A5U(iV5rq$KJb`Bqr@3"r0Jk5)qUVpccDE0B+l!CVSNe'#UcI!D
S$0R*&dm"J`@!R$$ANlZBbYecPB*B$pHj3L[Y&K8-[VrSjp+B-@9)lk1mPIM@%C!
!R`&&h"MN`IZ9EDB&aVK(B6Ke#C5YXq*8,M49[DM$P([hI0-4dXqjHfdC$45Hmei
&@eMV$9&+6qY93d0+dSTY8F)%G5jk(X96X1r*Q482V`!HY&@4IS2LhM,LkKUhGT0
6Ulf@-Yj4"k!4qcepB*!!IAdM2k8ZXq@&ef@,Vmb+AYm0PbKGBF%51Y#*PFUYP%#
[r@IR5eTbX9b83i&j$RLNE1DQ$p(5H3!Z`k*'hqbD0SAQ0@!MDkRG5b9ZM6b`HA`
ri-qDkNm&qrZEi#m41aLSlkC9f@hQUBC+%**fZIB62KbXNqK',8Xda'lAhdeA,Rq
RdYV[J2M5FJim`IVS8&a(d3U)q%[YVecd$Xc,##P0a@CjI-p`QTBIYlaT5TN[%rS
mT2Hq--FfPf&V-P[0)D4"5+U2@U9,'C!!"NZe`I'(+ri6eVjAFYih@@-S,U0[9q@
Hr4dr3ba3h'aj`AZFCabAQdiFI[TlqAS8&QL"+(50p!$F`D2&QpCTp-XJ(D5`Naj
*#Q&bVX`r&-pfJp@Yc%[Sq-,(HYLm8*5'EjM[NJbHRBN$BAhYGk2EUQqqldBTMV)
!rI`N,M&bG@"mRRdP@bViI+KSrXBShZ$H6NEZb"[H-+bBiL@c-D"DDJ#*cSZRa,`
@Ik#83cHiqr`I-p$!"X"@YJ0+DMm*H1Fa[QVDXAZMif4,[kEc0MKKmm`CXZ%3qmp
MIX[cX+pFiB!(Zkm[E0VerEU9JEi@2DKGI*5U@*NG(jA[[4cHKpe5Gq%"*3a%YFY
-jjHdeQ,!5,l'KmHR)be-Lm,@q*!!JepD$LHk,R@AciA1L)C$(h!cb43IYJ[2U+Y
fJCM"2NF4HY8hT4ZVbHF$RCq-k3KCjY3+DVp@GSqM`BQrCJ618ABfTSZCF")(q2Z
fQPfV6)3GmY@VHP0,!!2Lf88@mMH'CK''2f1bGGKNQ-"dXCdc@KN&6d8ibDMU*b'
IC(@E(EKS[Y+HXbM&2AAY&L6PEJf%F$"J-R-PI@Vc+BhL3@G1-aXSN9(6c*B$%dF
[(!69Y&2EX-Dh-+6V%X9013Re-P5dc)I#(Np,Ga,l*Ghk")Uph`(,1jd8e694I9m
1j$$"9hDerIZ41i&k0%r2UPbae2@PhIi[Th5-0ABcD21Nf'J68G5hk9(c+,h*G[c
pYF5[4cd)D[MNHk$XTq!9cLCDpi*id1Dq22Lc4Hi$h#qPP#!$Y#,&$DS4!A#h63(
*P(mPQeI&S!eBYMbN#Kc)`-8YZVq%-qR$!+`+Hf@3!"$Zb1fH%KmD(cEpFZfkHGP
-`$d1[i+a9(,Y0*!!!D**lIY`QmD`Fdeh*+Pep&P+$)*b%ErH[MGGcQaCkp(!!aA
8)DQ+S!2Z$aj*c6[D%"D3!-K5&D6S$M&X5,@B0Ip(L8)@J,!$EZH-4IP`UrD5c%0
9hA)5fVN9Yb33"f$TPV483jGM%SfLG`i"-A)Q@LmM$``,T@h!C0r2$Gba)3q[9fk
3!&kU0Br-fMSISK+T&id&J(-R)j,fECe#%iQDGhf&qQZmha2,h8Gf4qXq8X8)`p,
"0BU,04rP*$!DeMH"ZEkkK$$88YT5$&P0e%,ZlBj,ZQIR'E!&qC!!QK1TQF5K#Sp
Q(HYCLj2@NAE#(MF8'f924E6e8jE"(@QEZaUq$pIFijq[D##k'Mp"0I$mTc+m6C,
*PGB`!L@0!8q([Fhc8!-%q[RIFHeFZSf@&242@I2q)#Udh2R'IVmm8B3D&1BDLf+
)FT5I'+Dcj(mmejQ*`QfPiNlSMLThdFJ!UjkL"@)MjI@#m12USZEFEU'HdKJXe(-
c@1G*ZBT4J-cP&,XiLLE!9*SABVeH``$PI99KU$Mc(50#@Z#(fKD`j&NAj(pFjB6
pBj1aE!rf#mYDMAX,ha4@`3T(b9@3!183De68j9M@[`p@%UE-Bi"0D2h0j+*HbIY
'(2L%J9F%cTGcb&PkheT#NM+9Hh&6C9+Q3*jbAShH@U(kU8ic-DU9Fi4+e9"3KpZ
lf(R!PLBKHC!!5aK,FqZ(L1l,q3--ce2bCkpMSfFS3rYTQPcrc2J0I9LiHf"CHe1
-6KF"'AC#NJlpiDA+I(qHZVP!(34eR'QIKjNU&f!dRe#q%,$b4fb"haq,"1i2Ed-
Q"0NJBEMYbU@!+Ur&L0'&!"Qjac,$@I4aG(jUk3U+JCYm0Jp11Z#h#IHm$)T+0Xb
-C@m5`9Z&("dQI)F,[BRPX#KJV5l`4@i-F-([jX9XR`RlcK-DhQBL,D09+c83%(Y
Bbr+9(&5e6Xh*H[KI)+Q9X6(9M@Kjc!mIPDKd*('aKm*)cq)m%3KY3mi4`1jacHc
25EA9CJfEM8FFEmIaH423T+LX)3bdPYR6Cp!9ac0S'DR0QN@VC8)qk!SS#+DpVT'
FiZkVd-pK@2NRNjaXKf63C`@c[X6Fe)H&B5b`iB+N*ph8#rSSqA5iTMM3BpcBImp
C#bDEV-Za@*XK,dlAFj!!TXe,Db*NYlQRaS544#`a8l(e6FZ!$95SbCp1kG'Ce96
VZjSLZiHa%*S5rT'k%ULIBE6S(AHZS5+mJ(DTiGFbA%K$1q%%`ZVaFe40!SI"M5Y
"HGU(S(AY`U)&U6XfJchUb!HEJEkQ5UYK85pRRU$3`&bEP@DUD03)LNaj!Rq@f(@
IX$c0i$he#M#Nf(+#rX[9JD@bK*I*-G#pf(&&5f'rMD@29*0L5`Sc2ELrKTpP'T!
!0FBRXl4rUY&TN`'3!*pl3HjR&@hBHB'*ZTQ8U0Ek1VJU4JS'`lKj8hYIc,*fH-Y
IIC[,2%Dd9hM(h[8AAZk(6lFa9b%kR%1CMU(kX5P3h(L@B33miTYB9a#X2'G*`hV
Z5rbb,Gh@d9@P@Y@XVL6f"6!femcT5fmYpr2qlGbH[%B$8X,mfC%"JM,*6XV4eF#
,pNSRkiH@T4(K$4STQM"6PZi0V)!D*k*@BYDaALFd1`FCP01LUkFGlDJACYVBfMC
KfdUkmbHP"68Vc(G1dqNb'U`8b')kk)UI"Rbr1lR'd2mTa*+!eB*$M,((ab*R6I,
hIENAm8i`r!#PN!3"!!""!!#dSDNkY-HdE!!!(`#3!dj(!*!$FJ!4[0d!!@3N!!!
B*`#3"!m!9'0XBA"`E'9cBh*TF(3Zci!!!*Hm68e3FN0A588"!*!2J!#3"d,"e*[
NQ5PPB(k"b!MVQ3Um6kV5IVS@9jdaTUYQBIBJ9jD'%2H3!'1(cUbG-d3198EqHdH
"Y&"%+@Ye[BDJSH01*!'D9,5KK"dLDYe+cfkNj24GLGRILEbR9qCAa(C#"m"j4Jp
R8bA,%$8I2(CE8Idk"+3-rLX(B')(if+Dhm&VY8AQ%GK[4A[hCE`U6h--hdG(b9[
RL(Hk%CFGY2K@dKhDDmD6V[#X#8)%%pH)&D%6"4MY@TAh2,S,9`T"Ef*8@2+`0-L
'YpTY[VVd,*D6T"I)*be"$efIb9m92Uk*E'mJ8c1PG32REY,-p2T%p,14U+UfS,H
UU'AI+F83'QqZiHN!&[icIE1Ai1ZAD)q91ce*0%!6QYHhS[hYr&Me6qA944RpXac
%P"PJ-KYD+$ESM*EMlU28H5Gf6k6rr+"9((G62AU)Z9+UrJ!RXU)$QdB$S-de6HS
(T1,*@ccJU@,ejq)Zm4(!ENa842hfHAC+2&h-DVSBT`m9U%dJmIchAH9AQSGeJ$%
1qZS,+hH3!0-$((JLDPHJNPq[ST1[iXlUBQ!eS)eXfRB@C$2H"pK&,3e9G-cjaUR
A6SbY4QcG22`e2am*9##l"4UVU5iTJ2YckHYDPc(0%TMNf5DMak1VfN0Q'N"L*UH
N(Ce0-6me95J!,&-Y+XEQCS$PH[bk&IC%3&)q@hlc8CS0H$'rM'Xqc9IHrbB`0iP
I%b5&#`5dTiJm56MXMG6'a%R+f'%$hGh0iQdfYS!cfKILrP5H'6HhmE$9NFq%aYU
bTTQfFD[2SN%4Q!U5beN,@IfGU'A+%1BaXpf)5@T408Rj`dr1kKN54CJl1bNe,DU
VC6!$*'ece*($8MC#pRcr#@@r"hJX)`NC3m!Hee(p4c"Q'Hjlhq"hY2Z"'Hl$5Md
@kG9U$K,f)*FC$Q3F#IY!)IeG,l!Q,,UqUkc*U-1,l5a@M1-p9[62Gd9I+!59Z1B
AVlp%4-)Vp'(Xb---"rkV&NX+GpYp*#d%3)RM9qa(#EZYFq-kiTTXdA[9PV*qQQ1
Ud,1r+$2*G)QR3hfJ2c![ih'bVF2!EC!!M*l5,mR&&XAdF%G1ATeeYSjH8[S$(Q1
pILG[,RahqL%8rdj$E%PlA1XqK1%$Nh!(h-q2r!"[4H`A0lhBL84`K0'i+U`+BEI
ThkI),TNB8I-rV!a*V#(M,h4j"-efc`3K$REe0ch8*dP3*mc@kV84pFKMr'JS+MH
2Q5-*"G#iG#1AG2,9Ib1q,J$"A%!S#NFp`1T#"Jk(*'0F%@qPFAj$iUl6&Y#K")a
Y6IY-j&)k09ChAf*crUHRQL*IqbB2UXMbfpk6IUpU!+HjlUX#,-(la'`!FEN&8Rr
UUaGfb69YRhq6%-mM#G@8#Vd+pF6,`C-LrqLbfM&@GiUeNK#**)K[qQI9Yd%bA,,
f%cX!H3[rbJL,A$JGEZ4"S!(#b*qJ+hYTTj`lVj`4JXhDdj0Zl"&3V*-4d8MaJYd
`G&6ZcelfT84Aq2@1R@$@ZBU5(1&ecQ8j+q+)),HKldD*jBGcfJS8aEH1BaE(MFB
BXHBXM)d-TFN)%UYkHDdkR[j"@PTFI1VbH5*CYVeTd9,hG`#Q`q1((1-mUEE5XJ&
f8ri$kmB,kYBLY(C[U`RbM4(#Y-[qeFh#[[8Vf"'dpX2a1PTSFDhp[IhSJdDI[bY
R0eId+$@C[-&C9#!+"dC6JbL()M`"mCairBS,Mj+Mp$SeL43#LpYqENCPT*G)bUc
iVUhS*S8e)8LAA5I&5SUf[iTV'bpdi35Hf)i0ME!j$rK8m$Jl0r9mh[4DrYb[BDF
e+fic2bVJ#*1TXBQXj(i@0G![-%[aBEZiEjMPGj@eDPCdEalb[*k2`TB$l4S`0SQ
P1S39[VQQ)Zkc-Y"H"UpDKG!TD8dhA06E1kChFV0UcV8Jq*j@45bPe$P0eB@9Hcj
81dM&$mXLjeJ,kQeP+14Ji1L`fkC5%GZ!FC%@Icf@i)AK(Rb!a9Ehp@%"XK-kc(X
L'5$9pH&SfkI#dVVZ(8Qb"5dVMbMDJG(1H(#j$V+Q(J)E3ViQ['(,c&qe'QmQpP4
91%iH!UYAF#[&lY$U"Z%NJPrQSpLK2+&Q+L9c$QcNPmScR2h98Xk(50pHmSV4dIl
CNHPkL-FZ&BXmG@I8'4#iEkIj!qb5cZaDlLc)QcbrjLHKMedPm+hqBNf!8pf&([A
PX'YHRB%8[#`G1i83&ITF$YP3a14(GF0ZB*F%#6Ya&$pV+r`Jj`,dLU66,$*dVac
0Td%l%*q0YeJ+Kd'`Hh*jjZQQU,G2RK%DAHM[Y(h!YRaeiVb'$Kh6K"#JTl4ar2B
8aU3fe**0+Ip"2N,*da-@C+dfj@598XHf!*j9+Ld`KEEZh""b1K3L@h`bl#FKq)R
(CZfhY)AleH!Vk5Pd$h3XE3)Ca8HDiFQlmE*)UG6IlB%iK#lcrZjelh(U)LQPYAD
`,FL!rpI8%CaHj%Ec$PqEJh$cBZXPmMZ-@E8#ZE*qEJT!!pKQILQ4NlaKJGF'Gc&
-#CarG52li)CIjmBSMjLq03*9C4,8[kNR6"G35UYN8hL42jadU%m3%mCm'maD[T@
*NkfiIe4A4f#lE5afLpZCf1H8DVq0KGm"m58d`ClCV&H#3Y`B-GIB9i-(,EQ`L9m
%8[F#-4TGb#`288q1!H!8AR0J+YiTjdpL)5"+Kq6&r%[[pLq@r@2k6!apk6BQpFD
*,(a-9ed2cS1S1*rVRd[PlhG1"%SadSCGM84&kChh%3NSrP234i-RIUfS!R1CK%!
FYN`LBMUUDrYIAC65C9,q+%3PY,%-pCTP3[UND@5jl4fCJ'''A(pIJaMTaLK2VZ+
T-+I#ld-3bk4GTQil4C(8S(BQ&J&22,VHme-Kk*e+%kAMRE!VJ@hRBP4Fd'hLr+G
q$2j`3#ZrIfhS93R+cSPbKTI-"#e*NLG0fj5lh`C!iJr!AKmAjpY`K2D+53KlI8Q
2NQC62kqCXcFG!3am0!NNUY90H&m1qfXQa+)@'b,mNBpa28edf81U[)cJU@,!Q62
($0fm+3G8JSD9+aYj0Icf%k,e#lFiYDVM@8U%0m$&#r*JarJU0-Q(2["f$i49-5R
He@)&HfRXbqZLrYi#q6i%RhELmIpR#RpmVNLhVPA+EcPIjJ1-(p$qRJ2cl@Qe6&p
j095T5mV@ADB!'qd9Gb'If#D[9#BMll)[PD-rA324+eYNaV'GD[UIAJHRY(bk6Jm
b-Q1amcLep4XiI'D`GP26PXJZ1T9i(6f!RKN$hJ*D"1KL&2ALkXAMmaR),$k"Q2f
"E`a,8fK'b')9HAe4*-#'$#UAXSDjkNMMdqV+MM0kqf9(cQ#cZK#[[G,T"0M2IX`
P#l4XMJX'`rRdlX-2V`D-2KA-%"@"(5qG'8,k4DB[JqIQKDbU'i#4GLLZDKdIP+b
IMaMEGPPUU#4"6[GbVlIIH6%b`e16Kj,a5GP,hMp9@pdm*r!'6Xme*&XiJEAR"Bq
jc4Ui9mYUVAP3Rji#'$B52A@SEDD,jAMGrT91&C4-`Kp#IAY*(8LLbl5!3)e14cf
Y!I%DMR$)Q,H,Pi`RCr%HhC43`d19KfRhqeIh!!a"8TD0iGe2(c-b%FlDFlZUCrS
(DKXikM4Pm%SmLk58ch-$G*kU(-P-m!Iaf6GEhd5bf#3#2cj#&rI(&9,adJN+Yqf
8P)`HSh$[NlTTJ$C,r-+qY4*MC('QYeG6(6&(@,@l%-M29"P(beF0R)XjS#TYUhc
ZZp#)m-e@X)Z9k6#R")L)'lm0@c(jY)16,5'$e#3lRjI#N`%GA1AGr0DMf"-))m@
'h,2(RJ2f"eIHV!)JCk,+VXQrak&9*H)5S98kaTcjXSRPE-4e`pR6446FJY*irIL
)YhLcGP(JGeV2i,B[YeD2,bql[U*UVELf#RIPX[X*b6I(laEQL1#cHq&f`*fhK9I
Fi-N-Lp"ZaIJTL&1)j6iKlbZJFUfb8ikA)Q-'FflQCGJT66p-2j`!N!$*RdE#K%,
4SXVVEfcUJM8fa3fBHaeCj@)#+6@Gi03*`#p6#M""26`eI-mLaN,S8lYpB$YY[*Y
YeY-Vi*Qj@4r,FL2eN`4`[VFF(d6lX4hqUmL-fN6&[!p#G)D)RUbX"f'r$pPLVLe
8i`l5SE)A'lfM,)Q[)0G+#r#8H#Y[BEJh$&!+9*U(8*R*i%9)E+N8rb5@J`66)Sr
0V,U$XJaF2Eh90aKBmPY'M-)C*(UF[[e'6LP5PJMkJhq(e"b$j0)&rlch@"rNJ(U
$q8lGU!%,aI4NMG2)'+CLlKT-VX63k6+`+I`dpUrE80@L(Z0r2C%5r!XTqmV"!eH
dd+,-!kB-Jl'HJ!'$%J,B$!j2i04RYbEa2MKP4%"TH4lR,cV5ZFb2HmGl!-IPI*c
+4d6kN!$&P+XkCeiMMD!M+mIK)@mRZC[F&`9%5RSGHLYS'b3KVjQeb(R205!)R1`
prcp)2U)Z)CHaIilL#+bX(NLDf#kX#,&6#dX&0IHTAM"X6@e@4VXTJH"TIa&@kV+
E2@kRcH2,fN%0!3l9N!"X%RPrT*CI*fe-NLR@r4"cIk9"-,qPme,bHNC,XRVEB&5
-ehG0J+rI92X(V2Qk6ZD+NI59Eh(L*`-ETcl03[hQDiF@[AbYJ9lhm6p'mQ)m%82
Q%RJ*[D5BUZ4Y'Dakc&HRmMb3!-,1Q,aL6rp"h00,%-r!5%BU'ET-NAIT206NR5G
fb8Y5Q5eQRaq$Rh#TH!C$GjEe!HB3jfZZee0dX%f@56aNpCi-l(P2XCp"mkQ3!*'
1%C4)%[F3Fph9@%P`Mal5lGrCU"16F$(3)LJ!Q+bH1@kC0**A[IZIp!Zb)Brj$cd
D&#bdepmjQNViC@(J9RdGb"Jd+Sb,IR&CK&V%B+ijfTfa-ZV*Uj,aaRNm3"@iU'Z
aCrQRlhFBjf-81C8R'1fJiGHN&N,EI266)UaQQ)qYZi"DQ&Mec``DjL$6m"j"Le+
(hV&iL,$Zf!3dr4DiQ54NrG*2[%11R4X3,8+FNh4e*-cFI(RK+$#lj90B@640#Tm
J`dm+EQK%TP(ca*CD!R"[[p0I')1RA"lCMQT!C%UJRY,eSa!NZp$!S1+Ekql@c!B
!HfaQA`UM*ZjiUj96DIB&D`lm0"@M4qp4@`+'rbI2f`3Dp!EB"KmmD#&Kc9FkrP5
Z2K&(-[V$)ll![q!rKD%Q%H*pZICBrLTe'CJQ)ZPF$0lkr%PF4Zc%NU+9ETj0*qH
4le,*HQBXPNDii'M&1)0)qh!hJJ"0GPa2rFh5CZqS(l3!j4GeJUqfG4a3@h,f9TS
C*R`F9U"&p&0*Sh68G,56pIjA[aXKPM6q1rUVpL`,S@k!$[`kD#3Im1@V+@9MF9K
+!C,@&&QEdX,mhep--PaRZA31$K[P2q`LEk*B#Kl6QdYMfYK531iiaCT!,'cIR3#
C4+'dJa[F4CSacKI5QG&8Dl8aHPr8h8Sr-4Q)E%!102R4X8f!mm8Jf#U5mY6&6")
M[%rfHiccSLk1pTG%NSl9`TL80Pbh'aUa*id"%!q8!R9-@pUj00I`CG,"Cbm5-r1
4QJ,29pV6*hkSDU#M5UaT8Yba!G[@GBZppRQ9PePPHUK%rkZEfJUrLQGEX"B,H10
Cc8MVpKT&l--aH#6R"Q#3!!,CZrS#@D[rQP2FrmaV8@cccAjh3jpm'c0`,meXfcM
JeRI*q,I&)km64(jYN[SBbIqcJqU9aLNF1%h2I(3L4kT,Nk8Y2X5Lh,8rk*d!PbM
*i#[MZ9!%#6VYCq*P8G[M!B"rBU!hqY[hfd)8hl9)!fAc#aYkS-Y-ZT86l-BTm%9
hK!ld6,AB1CP[A)4*%83RL)6pF4Ch0Q)#&,LV6DIcQji-a,R,F,Hajar'fp%82eE
H51-dQCETH'(aJl8M-LHLSX-2lHHS-+J(Im+i0iX`TC[+3Rp)lZ2b[b"NNQFD9)8
53aLiA1jGXT!!BddLX#+GR3i"T*@$!2Z9jF"6#+r5V-FD[1ii+Ic`Cb3YM8bcECC
6+bY"%[Sc`9aG&4SIBh)Kki#[jX#TI6M0q[XQdi'-&@Y0Zqi$&@1@qDbPjc#(C!E
*RmF+I""!2Qq&LA#A'0,LEQfCL-)fK+TR5K`UN5b*Vr0m8%aTXqXN(m5pTj4'fra
V)PR`epJHMaqaT!5FFUTrkEX(b`kAmDj+6P3JTH`C6p6,JqMUQR3"P&aZSC-pB)R
%L)LV$Aj,riCVJd6UdJ!$SmVH1cQGBDDLc'(ZNFpU@b2PXE-K[@9N%RVE@BDKKp8
jA"L[,QS')eDC*@$",J3C'q)S-RI%j`@CKekRN9XCj(ZSJi5dVKM-20#D3fShS5Z
c4(rd0lZ,6aHIM%f$HX'+FeGfj6FRG6&&QBl$YeDrV4ZFrpHBANXA-ZHD1$4PdH@
8H38*RG%i@i3Ver)Tr4XV!Q'J!,9qVqe!!h1C9-fa6'#JL!6XRJpTB@pc+Nkc!Qd
QIbrVcbqlfFjRQ`#2p`6rSf(0YRB(29@a(e3jH`pS[a"5+blaH!k3!+JrRRCamFB
BC(U1VaAa+4dP&LLl+4-!2K!1-!rmd3*qR`i%L+EYQ$bccmjEJf9*K[9MFX&E9K[
18UicamTB,8k!F,$AG+4#GRTH&+fLTMbQ[$akjB'KQ90!4+cSDE8TCTJ,G"dQjeP
Fdh[**dre54q%fi2*@A*[k@RQCapGpMc0P+6$caTc[S)2dhMRpm)"PfLR*Xc2EF&
9m#lecBLNi'b+U#&0c"`!SV59TD*'))9dC,cP)dq`#irkN!"m9Z8eeP,PHER*Uq4
Y-22V33Q99"dN"CpcB,0&KI'VZ&h[C05-!reF'QJ$+l[4MYaFa1[U[Ji,L)'rZBM
L(Xb`BX8`I&9YhI8hZC8Qp(@SD+MqEQUSUCpcETVP4IE[DRaE$+13!(&G#83kM0G
c"R'%R0AT!lGRADL+V-BrV*r(ipiHFJY1(KmN61aQ`Yi3bdi6FrEakmfP$8hDd4m
Y64"bZ$(R19%Tcc)YKE-V)UP)PFiC81"ZFC6TLKlp#C[MXSG+SFMAV1Z'%8630EQ
*U9Mh5GDc2!04b,NB&V1V)0LkF'0E9aEZDl0k$EUm!PJN1S#KN!$L-X`U04TVe2M
'R'020"!eq0Fe6rh6XdMB$!L#$PDE5U4(CGq[Amjm6k9JQHfV"&*1U5iR261,8PX
HLjQejH%I8j!!F[(h5(V(Aad6e4AfA#GGNr*0XDM(-XUPZlR+[,a%`@3hR4#[6,@
"hJSRpMb$4H+Ap)&cl$$DL[UGU$p3@6@-9BEZ(A@U4Ni"(kYLH'a(V@Y$%TEjI8P
HXGfRQ)FL0T3(-12)@C,$(rbd1BF'b13F1hEV)Sk!(l)BpLGJkT[S'%iDN3CVLa0
3jpM8SMQH$T8r+i$ec,K8d``(q"D9'YT!Le*EUJDMrf2)K8d#%raE%iL[Ra90AZa
c9Fi*YDIZ@c3XhM)VQA3[9bbaDjS9*JQLiJ2iTTrmcMDT8[TkG&!)!bHr[fTePi*
P3KdJL%b$12m(+F0h$cU@Hi&khQAi#+Q#UBd#9d5X38jPC#CL%iIT8MJc,%LihdP
B"lXC#5SM+Qc+BQa&K)jpcGBY+!66,KbhmeD1aQ[&dTbTbD4Ub3T([MD20KmL`K'
-AP[bFjm6$`YIP`G-3aQRiCk8N!!ce0"D30#,aZCMcIY$IE2K$QPXXI1*r$#Dlmm
dVrK`@JpAq%0'29RKlG3D&bIfI$AVK0Rb"0G5DV[a"krQm)3Nl2V+mV()m",T"j!
!j8DY$pN4P2S8I4ZZAh6I8TU'dZ@N#*-DrFIXEI&k'2[""!%5'0qe%J6B9FV13cG
8Rdf0-ii#Um,$FU54l+mCp2$24Y&MmqhDRIXNlFUb[(I#B$Qh+*'PBfQXli,qCSm
M`!TJ99F1ck15eLf@QI(E0eN+A#ZG!BFBhBbr"AKPfY'YA"GEFkJJ[54FUB&`jP$
hC$Pil!SArkF@-QM1P[fJ!Me)Q"DmZFNqfTFSDECk(GA)3CKD5'm0KY(AY)HJmmU
P5G$rFD`Z`S'-U1q5qZm-$F,fkNQRRZ9a$"lFSaTKikR86hQdd#N[F5B3Ba&26GG
%j6cLjGK*)a)T0$Yd130a4qXTI`BrI`5ifqk`!hLQfhZMM4Trq%$l"921q00QH9V
2&VH6L3,4Si)XZ2jlrcINL2b9d@@maDJ(1GE$lmR*)kpQf2Y'UQUpfdPa`VGZKk#
RiQF[Z$+Tf+XZ"PMKrclZQqX0c%r*#2YPcN5b+clJEi[C9MZb`#ES,0mL&*rU#*I
V#6KM-AUVHE%SLj)qJ#2CM3"9"!VCa&DCaLU*$Z9i54XT99Q5&Y3*'X@PT$@iZI)
9Qd)!TC!%!3!!2`!!Y+'MYV6(Y'%!!$@l!!##NJ#3!h)!$e(4!!0UM`!!-qJ!N!3
2!&4ME%aTBR*KFQPPFbl2J!!!Pla069"b3eG*43%!N!q!!*!(3X(8i[Ll,+1JY&J
'afJB[4rBRPmle+j!mC!!&r@qkkE0`!2"AS94-8UC`0DdB5ZPDZ#,Zr4V%6$1%f!
RTHLph1C(aL-T3q*h8JC83H+M`C9c'q"i)Zki56+3!$S%drKB"ZDFG0NU39(fX-e
1YU1L@+U[-0C*%'8hQSNPc[85M&*cqY4'HbZiQ4P,E9mYFq1Cfre-b1QYr2SHE5P
KDQ-rM&Q-ULC"$VSYBqd),N0rQ)``+QXK'(VU"S(NRr!`!J0d-)S6bbcY1R52Nm4
[qLN5%CL9M`P)!'KA3KU%(#lKfcQlE)`m2V8p'%k'BGVd-3r3#00IbMpUE"d"L+d
3"kJM+VK+YdY"fD5RLZpFTaZEqU%QHj8JDmAXh-8mUkrQZH$ki#'+X*83LjDQr3h
5DI6KDMhlF6d1LJm6'4dj'M`k&J'aC#rh5"kl@hdKE`3XIE)-DR`M'dfDCE-51i[
"NmVKR8@j4PS@e6FLSChHUrKIhIqq%Vp2[(aT2m`RcTGBGfrb8&4F$c[+BeM3p$M
(!pM@apV-XR29RV*,i56!*S9RS"i4l@mj1j3qTZV#0B)[Q1E&)`,"CA"V3-I@XXb
H1LJCbIkp3Cl5PIGlArjRMRa-5h9NLeUGG@@ANBXqcNBZ3Y0VNElLa(AYLp*26(&
bMciBqFJH(&E,&FljjB3!BFqMekDIf"X9XBYE1+h56ehj&YP*25+iMpF$b!piVRc
%b[0hh8GPN6cCbCXIp61bRD4kF1LKLri-`*EfUpd6T,(%rI"(PD8,rJTS2d'3!*-
dHRpAaZIpCi3@RHP5TpbU,UCK!!+Z-($"5TK6Ur5IMJLAiRcmGJjV@(jP@mab"'d
%qLm`@B6UckMl2+mN6EZMpijUL65k#*3F6903bDUJU`YHa4PM4JX-i2h--e)q1R(
,6T-&V[fRka&B6I9AVHS-%mm(&QNCGXN6-ibIK")-8X6I1l6fK`M@Ldpldr5+'T9
2R0a%5pCAP5-YG*KrVq5#,ZQ'YJ'ZB'"!mXCBN!!L*+aKqREM$Ik+Llj3TPG9BZE
dABqi(1k"mRp28!R64XlVT"H%0R)9KqT!5MR9b`VYfla"5pmHpQ)--VkXfMEeLKX
5*cT*DNX!&KpXek-k4"ALVK,"9eikJT2Ne!V)+Yq-eF*[SX[0BSf"+GYCDYK5H&B
cTiJp)0cpf$"jPf`!MTq@Fd`+*p&80EMX4h2JX&C#m*IkADa0(8)MX5"eqDl+J)"
Mq*(JG4kJM1r+0+l"qJHCS)-"SN31PK088Dc*!4K'kPQBJ9@%fQ-l0'l*'@jr,dC
6Ei669Lh#P`PdY'jH#qb'X%q!@dqN`)41)Mk8'Zfk-DJjhFhJUe(9!ccR(b3l!5#
[jfp#SGrU0*YF(`if9aUfTHe&LjA4)6ihU#-5CX"b[5HeUQike0&Hr56i"Hj%%&E
l!YK431Q"3ZhE,E)Rb-Up-(Nr*m&CJVZ9D9&F3"C#keR0f8IEkT5Z**fQP@F4VN*
%Ymaq*1PNElGPp#THq[f`JiD[+C3X"m11)`*XifMaQG5YplEjPUHMplY[JJ9)f9X
K4"U,Mjdp2i),heaZ(3IeDGfZhk"p)#YIX*YBf(`kRF!GVemc`DCViZ+l9EfFLZj
KNfMSZZqXRcjYDGrcDSSqM2G'YP6RXRfc'N2H#&&h,m$-!ekq9ZGVaA!"a)`@ad@
+4N6FX4jUaIfGYRr6jB+Kr8if"N%FEZb"FmUEI(3e8C@@-&"pLYi1XX1@k6-idDm
*bYEN$J#QED6[B#VR8efZC(8T21Pk9hlY$9c+UlbfU2-Fc`d43QeD%m!CrL9QblD
F@U25%T%H!(cHhEaLa`3b!HkX$I-II2-Ze-QeXrYG[&q8jff3!%`+"p6i8j!!Y)!
ae4H,B#R"(LjiKL%6"KX-P`1Q3c0&QQ6"M4B`#02PqAZ'PR*j"KCGlDQXcX*pfm2
5!25rKDB+d,,N"GDGRj4R`"K6EBRrRaj+aR("q$%pZRr65j6D8Hcid&l+iTNj"AR
l!DR#'V+ejc!S'J#rF!!'Ar%p2p%ljY0j%HJFR%5N53J#hF+(Smh)KKD9L6VCq&5
[8eA%%'5k0E,9#UR3c(jMD6Bpr9m2*18jeAkclNa(d)DRF"+d)dmRS)lV,#)$8HY
%9L0[b5-"rPrrSkk+ER,LUNT91M6LP!*[35#XVKJN'Np[5l)+[!dGXK4$Z5UrL90
'9Y$YjUP@mT%Gafjf,0hQA$8H!p5%$Q%)cbRip"JdJc1TCq"K+aGD8M5SUV**D+!
BG#-"ERZ'[,r+A%Z1RP$f$bSPRj["HE+&Fj[#r`Iq@P*90pKc+kqf$ICh2A),c6d
Za16Zl'c"Kc&ec@#LSbrh"Hb(82l+"G6(a,S[BJ0%091iYB8X8ND*Mje,@$GfC$Z
*ZA"'KAlRh@cIPd6BTPamUYFS(bE(lBU1TpATeGfp"AZla&IIF9AXVUYpKVjRdXD
+`PGdFl2@ISA8rkLReqY*E"66mY,fr6V6YR&!)cCj1baGK5Ni65dP!#N%jkbDk'X
cP8H0l05Sq-k!9KEFUB&+Ee6K3!"+#&Bc5QD0L1Q'U%r@MB8"A[GBcV029pAA09e
CPRp15Gi8q`%-,Kc%3YXT4$k5M,&PG#j0$XBSYBC#II&rHGTbRUPM54fA,4p("3i
UpiQ-[N5$pX!E@9J)8!k2LED2%Q@U2JC'E`V9"XkAdY31Y3lqeRd(5`!`#KiqAKT
iXXi+ESFrEif%BRG3J2SI4V$J3fBMH''ke5q$KDhEC+Y(9Tp$)Q(Fb1f`f)"604"
k!MDNh28k,,N`)*eEGCc-(Gl-I%RBY+T3Gc,KTJe[Iq9+YY4L$%UcFHh!`A9fPYb
[BJNA4T9hdY8$XIQY4M6"Qf9Vl"qq6P4I[kCCAb9lV6$FCZ$fN!#i$%UHK$#K&9M
F-DqbQrZ0L,,hp%HVf5B1``ffI%PG0)NPk44,G6VNe5TqA#YJHGhm9H!J-cH3!*&
I-3Qkf))Ve,YXFpDC-53Xr*0i3dL8AJHQB!mP&ASFQ9[hTc`j2)4C$m0G#bhUHTZ
*M)lMk*EEG6[UN@LCm'+A%,`3p&B8TdiJc)3l3@1@SmdEGq++1"T@SlFlN56Q*8@
1`60,lF,BEV+BFXlM'c3Yejf4Z`p-!rG+a*68,f%`'N`q65mmR[A[j!49B+ESP")
2rGJMM*0Aa"5ehPR8m5+@)ZmBUhdRI*8&pj1hU6)+0%NVP2K#JDV'Pa!eZM))f4,
PD0"R+8hJMHM6$'$5@N16KALdIZ2"INGSpTk)ZL8ZTJ`hh50@8$2LK1$2aC@ePdp
M99Qm!*pB[ZC9pSa,Tbq90BRPd2(Zb)h!#RXKBqBcm90-kXk2Npd[4B501A%KAeV
$CT0-P)R0Yk#`$$)Q8f4rSU,l'B*,l"G(Ec'K#01#)U'!kk0k'!V-i'RZjNek&L5
P*,K4+YYFCdjX5*mQ&,,8VR'&L,%ppe*lYRP4pkA1b,'!SZ3UQd"S+8@Jl!iUqR4
qBX-`#EAKj9lCY6409%!3mXUM,*',4'1ad*Eb&-BEdPZReBFU4qZ'I4Baq0Y2caB
AYEGHkRQ1JV-4C$i8ZR6dp1('pXdC5M8&hCeHUhAamFKk2rSZj)IfhDV`DKGb'1j
"PF0qF[2cPJ@UE1YI@Y%hkS&&#$&#kR)@fhYDV!URT"P988"TpMr@S[3pAQ+1*$0
kR1UCpkcR`FK5'%k@#T91"m+Dmq0("UmYhk&f$ZkV8`H,3T[YEGPGZ3JDMZ3%`#j
5pQ1-9BNS'Af*1Z83"3'l')`41TUb@-0&h#T@De!jrb52QAiMT9,!i*Q#0G@%99-
%,5'Al$AT&[a8KEH)abq[Nbk6r-M**JPjUKXTA`XYe(Z%2jTVNkG95U3Z-5ACM'E
aV"j)SZMrpZRip)H63Y-@G@89frDM3qG5B$,QEETh9T[SZmV"d+mee[BYS9KTi)J
[@`qM!2eqJZZ9)I5LN4@L3EiXrUZ)k[T'3lIJ1Nj1%@X5[@Z$diEiR)V@4QA(jMN
R+AY1h03Ca0[F`hEpFj4'r#G4M6aB3Bdp'8&I"&[RK)X&R3J90CG-4C!!2`C66pG
U'+j1+$B0(j%1jeQflN`Bp2F8GL880i'H4#jR!lSGF38miV``l)'56Mc4-k*`2%%
a3&DV$Ib0&Z$9QmN6Y)*$`qMQc8[FipGpL[ENE8Beh#NFC3(iCmEfB*iC8UP2IE!
(LYc5aP-9pd+F`QS!j3'hdJS"0"A%S33%Nfa1QS0BKk(hip(Z4rdNkUqY9ddehA&
X'q@20"lJVBK"0M`Cik1%*)MVFC0'6A6GVL6E!ZRr3c)T[pe#*-BqZi+F"F`#Q&@
$qD&4e2)YfBH"kCBrXZ0JUef2Fi8p5P8(4E8T0-C#d[#eC(1EANVjk1cLFmU,GfY
RrY*K'"jT@1(a6L2SiUrRl8DPHJ*cJ*GdSpiAj)2N5U[-,9)X@5"IfZF)!!Xe15A
"U0j(F8SG5Z(a-I6Tf3!j4H6MIi02LALcY@G[JII1%'1Xl@#rqqK!3JFcJR[R0*D
I,EdH[F-0VY6$Ja!L)brY2`U66e-6f#RFDrlU-I8X9(#94&EeGfD#V&UpTqIM9#3
RZQpr#3Xa,LK(L#C`9b(FFLX1P@b59'IH+FJKQY%fVZ8*95I-[ZGiir4L`4#YA'@
0rN#%"LJ2B[T6+LT9i"!c%iqfrPh9+%M9-83)beV#CF(RN!!CrqBqTchRcHNmCTf
f"@Qi-5m+0V#Nl+C4[0ZZ9-dXCeE$"SjqZ)`Y`5AcE!Z(1ElUKKrfVbB+b`'K,3h
NUSMfT[*KYI'h[8#4Xq`1[Cc*48R"@l+jkqj2E!B4H+bIT`)9aX5eFX(kNjK4F2H
TGd5rb+ikf"SA#j66V2pa8iFP-fQ&!B[FkLHd#G)Z)GU-Jh#NNefMj1"SbFUVMe!
aCcQjL1kkKEAS,qmAc$hBr-[R#GQ&[KQ$McIG6Q8#q9h)#GV(@a2'fTN0"2UrRUK
(Ya8YhVX4",YQRqh[RX$FZY#6[4Y0`5QYMj2*T,3C9Q0E@8MPG2,EhCd5MXSe%`!
&%"D$CTqCY'hla0Z,1*!!GQS#fEiNbR)IVMjCla-GD(A)k*e-pVc6Pcr#d&9Ldc@
E-#6m[k9UP@LB`%he'R*IGe#qc1YaBAa)R(Aeb@bbZ#lm&"FF&lC0)0-c$+fG4e[
R2Gl**+L"q+*JmQe1G[LGkNCp9RNee2*RT8*X!b`@2%B(92!Q3)PE$)A+Lk,r9Gr
NSdBlQi8mCGVJ%S`pIP0iC,2S'4@AV6EqmNZeZe1eSiK`Br-3*+!'&-pc%fb+eQ'
(!$NP5MSb@E6i-J#K$kESC-)kdI,HFblkf$UNLrf6f3(0Z4k0cq(1r&G$c5B%iKU
Y$r&6%H%KrA#eE&Fimam%$G[KM,HAaA0a5C4i(9h0UiYii+F9iUTfCH+5aHTMT5j
*!b`fiTQJ*,jDSP+2GZE5FcfXTaK$)HfZi0Jq2!Ml1f$f*C3'F+-GQ+pS#EpbLI#
&44h"RSqD+D')@pIAf'jrbUVTbK&M#@bGb8qE5A-EU`9'"LmT-Zl4XRaF+`G"eYi
c&Vd`[k#hYGdXA[,3S"fh&J)5Jj&6$F35MpMDTX`2'Y-F6DF*cac'!b5#dhi$q+'
MC'H")GF4ARiLF2DcmmQ59D-j!hSd3T-b!,P0%ALefe,1G4em&6!GhX"lr1[-LdQ
SB2p4-fmFeY(M5c-Gq##FrVApBB2mr0L,+MY%L2KhFj9)aYLjC0jjL$d0Qll,*#C
pkQ*U&FKhp#rq&9APbI#TR+hRRN%2QBZqKrkfp,T$ddEChm-6ha(KE$hhKcMCK9d
FdDdqJCjHrfhb(6V(+[39DVR(UNKLBqh6rAVS@1B@J5&L``cYKZU+,ApikCq0('"
+X4%0@fY-fJdG[349AEh`+aqd`6D9FE8e#Ee)EVdaC@LB)mHNR[!Z#hFcUKSX(@B
b%%"p[24Y@rK1ZIkXTK)`*$NJV$,(h0,H,U'+e#ck%bfN9mrHB+)j`bQ'LKL8QP&
IBY0*NGal-J6338l)6M*#-&-8"d8X#*P,E"@5I[!(0!EarU4Q'eR'F50@I4V0AA"
IT!h2XQfH,ePZ"LE8#I2ZFFIafhUckr+JA052NGReZ(21QPLkVLN9ArM@+G-0i`&
kUfAG"'m@!XHm"5UFN!!R(3)HL*YqhMEcEh&00-G4B[rqGq6Xj`h@4mU[6(j28"k
YeBRl-@&[2"GjZ(1YG3UUm6KY'29F+(9TJ#eb4AF6l&+d5)`ES[)h62hS[!"PX-#
BHF8rZkIHe5ce@SJ%65bra3&5impQ'$DG3S(1N!$JRdBKN38iMTEcdBaV[ANG#8A
8$(&c6K"&Mbic6")3)PadNLiP*CpPC'I(6LX++%"[4")mc0B023,[&AcX2%INm'V
QfhpB%ZdI5&&"(KShjRd058$fl9Sc$#'hD",d,%%Sb*6K)ccJR1"'e$-[b`CFG$B
8CC(f*#eq6a,**BMIIE%MXDBl1P%lDAC9PGak$[0J[P'CS!ekZF*941H'RT8r'jM
peI@"a!+88XC9Kl0IRH)(MRYb!mQEH2HMB-0I+2F1f!cXDE8$%m[Nf,T6(&V)G'-
Y)5pja!$r9`-(G#E*,ja8%cYJKE$!fI3)dfX`dHJ!mXM`eh5fV1YPB)a@JFY4P@C
DU"j@Q4@[T,2EbeZXaZap"JCLKG"M4Cc%91Fd$8NiMcAQ9"14crM+%NUD(N@N+!6
KiC!!6*9U2hGLba+,c@9r&RcP4-6p`8-HmMr!@P+preLe4J!D6Y&58CIbNXHb!$0
iTJ10"q*HX6Bed25K'B&CN9KmV[A$,jIC9LXEE6&Y)5BqMPcpIVMC1Bp8Z#SNLi1
$"AM[("EV(r0eKU-*L[AQ2X3bU&DD)8'f&3!0ADN),k[q'0d`1r8N+&@-[@HYS[[
qD-5d!X'd0XC-ff(@@,0I4LZLp+rQQBG+ZNf$mRQ(rK[5)@-R0%PiPV&@JHHBL&m
0d5a,V[62J#,cfJQL&[IAV#TkTUVQFNafqCam0l@"hk+HrQE95dQ!5l50Ar4F`09
VEV,kP$[jA"%`PP0$VXIc%CPVVQEqqa(iqU#C@Gl$kV"K@h0rPY3T8lf2SB(P'4*
&[C-''F3YRUGU-#PJQhUap3p)IYAT[Z`d,p1bc(TaMS9cZjH94YTPh+b8m&D!%1a
e4#B6fQAIrcL+Z(N9%pd!cY3AmhYY4F(qpf6Ql9mr6R4*Zlm`EE`5B#[-Mff@J[K
L3QqH!A-IYmi$8,qLE-2d4QLdM'6&c!XKKZIj!DFD*hqYhpE$9MmMffCD-QkcbZi
ZUl'[68V8a*jG9C`5mje,)X,[E&A!EMLq@cCN-)L'mIR'AJ[8"Zla+i0%Hh8I$ZQ
qJN9@3`[$@$,N-9-!kAUB*H8KNL-i"a'!Ai',LZHiCSV'hXJAR-"9k!`,P%[Eh[0
#)k1)lhDG2hC`C@ieb)LK9Y'M2phUS1ErIbQq0e*J#I5`aD)BK8+[UEGXA2Ij(EA
SY3,QcM6JXkDl`Dk$[e0hF,)-%pXfM3TQ)&N!#Jp%%GC4(ibmE%)qXEVp1p#ASdm
H6Bj[E%i*#2-UJeN"q--)'K3UaZa-(M(SfJHd45`I+LiP3!%H40b5H'Uqa,!iN!!
Ta%-Xep250*Y2HUMmLLY8#IJHP2`*,'CYaH8YU8dP[MTcGK01MJU&FKQqLrIDh2T
'AfI19jbRJRd0H)p-K`+Fp56Mer%5`&CRfe[GA22E9GTj4U1MijYHNlU%%hIr3CT
#3BK$d$4+Y0-QI&fb#KX3Rq(YdGr@p%QI0bF2(mETr0jUi4`m-3rm*cFaG5''i1A
YG5i,VkrG4BKAK+80Ur1r4)&3LZS-6lCQC#D[D(2ih"I([Zq%h-QA(PkdVc0Liq9
k3@Se,Jc1Pj,NEE"VU`&YY$Hj4c''I'2S`I`304ZL3Dc82P2!6EdEI@[Fe+h)4hQ
LIXM#r!PE#clf6FZqaId5N!$``TjKp+F,fZFH)&[IER2bZe*R"SG+N!$bcd)$mQ2
rmpC@mk("PFILDGf1PQ#+KF,,MBA%#F0p*1eNip1aHeFf9%C8f0VJ0H*GI1`N)m(
R#P#Q%5aI@'d"rcGS%6F*SHl,8dl$bGl,FM4[UF,PN!$e*3%bbEbJ5j@(Z-mjqDL
TcV[lqe#54QaXfY((eDY+*F,"FM)ZN!"fIpYh+k0a[NM[l"8TbjAC6qk,)iC$hb4
hA,6%U"dVkNlPqPaf2T'TVh#%c)c&X'm13N-h#$UEAja(Q$,ET&NmVar*lbbMA!(
[F`KC)jGZMYq"L`!r[`NZI#kMJ&`,[1f1Q!!2jcIPKNdh+l2d0&ki0l&-FGPHImH
elmSFMV39d9[#'9YlhU(HqYeeYdI*R&eR@cLQG[1l"9L'@Y%MkSU[5a-T%q`T9mM
YCZ1l'p'qT318Y`[LH5ddakK@q*lU[B34cQfG66rI"q95Xp`BmQ-Ef&8XY,1ZaF4
Y3K[,Hc"5-[d0Zbc3bZeFllSRZLee8lC83lIlJ+hH!cdXBf6bAc4"f5FJYfeRL%1
#r3ikdB"DfX(!UBH!Jc3H9(`B,hlaA'YQjADS[Ne$+1N6p[*babfdG(a0HqRcUH2
4963FV!G299J(cZ*)kcUmb3fmBPGCA"*iKm3lU@b,MEj(K6lhrM3lNQ5kKZ$aIi$
Jq4(fL&3!)NZ@A#PN%[U4A)23p1)EaKfm2#Mdqp+BD50K%X"m6NB'$9'YV&!&!@c
+TfhRkCd8C!1KHF8Y+NdP6TX4!QKBeeB0Ne$F1'TdJS68#LfRC4iK@$d1%ZGm13#
S+eEd2kQZ[`EQ`p[$3$RF@[&k,66LaIUHGBbkeir)'!LTl!CmcYY[`fmA#j[4hFj
4,AkLXam([IBpk,1[@Q5m$4Ad[V@PDm'&P*8"0%[1jJ#VMfEaPjJCFphM1S1'`!X
,[IJCV9DQiiqpa+rd0TRYAjDm!VA"mZ&9Vr4QbDGVYj4"iPA!BQGAR@A)MI')dfA
f5A3JU1025cdA-k0c8"5p!4Ycr-MSGa++Kq0RY%'NaVk'r$TlM6S!K%1@RN+RBlC
FqD@)kNTNjHfCmbG*`#D!V9$Yc%k3!"8N"4EGUj0blNUAi*Zb[D1Pb&#d!K4rRHT
`m)N+3#)Y0Nm1BBmM!39U+NlpXbCHJ6GQcca(FTImYDhIfaYPrqp,%AF#!1""Jc0
X&+FiMNiKKC(4BG`pC+&KXT!!#m$@F$2GLh!fM*2+#-mTB''A5!PM,2E,l(BRecE
#+NaNRZ@kfT&rYAe#e$DQEFLH(I'Y6,4N%kRSM+rN[GRZP4#AfY(4$$aIY&81dPe
+ZKGh4Dp'PR"2)km4&jS*hBjm3A5a@pD`Pa&rA(Zp$hXTq%`Bk2-0eRG&i+Z6&$M
cTI,GekJC0A64%4jC0-Q6TCFmAa2V8#&@rXm(YL)Jd%85k1`15F'$LR,HhUK(lRl
)[l5i*hZPEdML(G%k,H0'!`&),F5I0[Aa3+6Uj%IT!XQ$0q)MA2pUR*33ENJVQri
Q9RI`5`d[P#hHCPPELKaFZPjr(%$L,R',pPENcTCf3P8D56LF9SYHHDMk!pRq$(T
)NhU6lLIB48Dm$I)4dP8",!#Y2kcQd2cFBkc%G2DGh6X$GmfJ!DN1*SQ0*+5e,#H
jANYC@RFZ%EqQ2!)j%Q)qJMB-!D$I)Q9,4Lp99r$T95S*r0*HI,lJTaPThB5*DjX
Q*fpAkALGC0IT5F'D('-)RMG5S5X'aPB%EVa'JV!!&DE#!3TbB0TZU,YaiJjZULL
T`fJfV(YUb+2$8hqA'pZ9cl5-ICdM&"GeGi*`C*NTUB"T3HU(j"XINdHmq3LTC&p
d"b!"2p8GJE+2Uh*V1V@F&c0RNVIb,(@XbhIX@$M",kf#,mYIRND%a@V#er0b@I2
`$iV+QZ!8M8R$aJV5b@-QMf1qTEr02&1#rfGH-Zr+p6eJ0ScH2Y6FEGr%PHV8-cX
MaHHPIE@NjrCQKZU5$!*2bL$'02M$ieS#@-1HP%0I6RP!m09iT3+*+SpVXDr5C0d
UIK55#(p!Ti1H[Me%'-(2)P"Dl,k1`Tr28#3X$R@0Ihr5(8S3E+aAdM2)#Zl1mA!
-YZ$Q8'UEaR$Vr@''Y3aT&S+CpDJ4[Y[mRFZ6bk*Qd&**f%-j0q8T6@95G(A&54e
Jl,3DY+A,eJJaRf$1kZ9H0ffNi$Q+#)1DXShfA4R$I1qZ)[r8j4BHAXdM0d$$j*b
5EMZShcfL#,'hP9TiZrTr4%R#0c#S6D+,6RM'NBpeXS"SBZ'6mE8DleSS,1m94Vi
B[+0F6dc,5F6Ammb1DJ$mVi*i(cR-Uc86ajbc40IMKp(r+r@8h(IrTTm#Y9Jme!D
mimbL$kT,Fl1j0S)rP3Gr1&mMU@1V(c+bVEr(E993*)brMd+MQ!68R!VJPlML2[h
XB)aK$N0K3hjVYq0GC)D8%K&Y1kbGZim$i28q6DkUG'kGN!!Qr%Z+`&$q%5((!Cm
2[!X9I1I2*MilY1P6GTR,Nf0rSd*Zl`SLQ&K'cDh,Ydia!EVLZ["p8KZ$FT,(RGI
A9!i2arpLe1D%NJEpVCJ2`*N!I3cd$&8"8*Cb(f+%E(GjR"#***5J[Q&U!%Z,@mR
kU&eM'8-ij8Q3!0dlV9#baDbf&bS"kSPC2LID+,$UHeV[jDU8V!!e%cI@5Erje)i
34kp4NBE5![#GZK%EqN'ARpTI2hIfQPa6NXe0V6h-CI6*Y*(1C,qi2hjG&DD+YNE
SP"P%9XJYrR%P2jR)#FjkVrq4+UH3!,d(4[[Pc$J`VN-QX+kjAm)L2rYHAq*HmfH
IL5IAl[UchSYA9X@5SrH#1B$HZA,*YTm6[4i!chP4P[FbG"dr`[ZMBl8RJa%,lXe
3jiXak64r,P#UCJZe88EMbH!K5bQ@E-MP!(3f3)M4X5e)lJdqYS)"fA#KleZ#+B"
41TZRb`"CcDjE)#PDdeLZMBqa4PrREI%S48DM1ZQ,-aM'SbMCak"MNIMAPq+ZeZ"
*L40S$,(bEQ52$#R4QSleQeJD3&G+6KIrKKLZrNci1T!!+M+YiqTHc8Bame[0(3)
'e,"cpDae-[5Pj*)*%CR!3qN&'*8,J[kTQ9kj9GGkb0a[JdFp()MZ650JSN%h3ac
YS&(K,BKM$QSH4FFJY+m$Q"D'C[k(TeLrmUUm$5*c"b)YLQ*3*2JZ3p6)X`jGelM
Z'`q8aDUbGG*QSRRhCi8p"m5IV*5rDPlK,Emc`TTJN!$69PD%cRXA%3qL@P#E4`%
@d[FPJ(LXj8Var-Cc`FahmIp"rRD,R'f#I&I+rP@PL*!!ELcEc%Sa2kIP!!!MQQm
4@HpU*V**$6h630I-ArB`m5%8fX(SlQ)KDA@bUXQ3!0&J39LDb6d*Ak(BdB"3J#h
`0f,b-%XppMJ3Mi-`bm"9B!"LEhFaHir`rTK5a0e)c9Ul93XcC`$CLElkMe"K62B
&MPGf[SSC)PI5,5LjMa58b5+C%G3##S1E+L$3&d4Qk$kJVcT![T[Gb1Pe[DSaNlK
QJh8p-I!bG0MpUb!+XBSRAVS(j#SUSqL(j4RC(E&j*B8U+i'Y*FL&pZKJHq0Zbf-
2j-h@5FJ8[E,mK0qY9S5Y&b1#-jpm`V'&V1K!@9)DUc$Z%DG5Xpre6%hKZ,9@GUr
T9@iM@Xf0V4ZThIZFRA4MVB*M5(H"S)1iXcJm%CXAE(T[hiJlLKbbCXIM!C!!&"`
&FbK8*59qNR&%V3EXEANirdBK02rcREr'(e@c+A1@AT*LU'!@@AUG3(Ji1(JH2Fp
'1CpZK"[X8CR1d@&8!m6S&jmP`AL-H!4`fdLNYcY#PM&lf9D8`,RmIrcF4T,92XH
R0B$rNBQL'NDmRY#mfPkDLc9hll8HP4M1XAZ[L1mDc$L*LbjJfDr(1k"$9PF5H4V
4*+p33pE(e3bTUK(TTc0&d$"'58K'*AD4(fU"UbI%P#IcXf6mmpplQZI1p$CAl1$
FeEI&p,[d9r[V$&YJN!"c[BR@MSf86VjJjSL%p1B2kHk9(,jC4YE`X(H2NC5"0C(
3cJ8XDqhm4UmUjpZdJ%9@&Rff2dhT--)N6aE*p+rYhpPJ3*9P+hFB[c&NYEEhrIK
+!2R[LTmc'KphXQH#KIK[e)b'4P0G&EV6Q*lh(j86Bk#j#(aac(EA)%S*V4mm2r1
I!0m5G#VJSa"Aq*+baC*HqT!!+3iT$Y6UAMfc&@'@D33+"X8kq(BqH+8afcrN4KE
68[#aKaG(PqMHpiddePhD1)lp[hf*[Cr#9DP!`p)`,&G#,TTbKerFFTQ))ANAY'p
pLR-H(rSKZS!1JiYF4'kG`b0CaK&i)4D6I$[34!%eZc&mF!Jj(A,*HBRRBHZS[jQ
*k"0UT"(KP+SN#9Y+r(@E"$#U2m,('Ec(9"PD9dQb,m`k4FM4+akqb*Zq3M1dP+!
!TYe+Kf9Fh-&$U[fDNb9$ii3q%pc@L4Y0kS([ZQ3dGc!Gp3'TU&#K!jP5mh%DKb4
rFJ1Ej%!UKMNBb56RamXJjRJHSHK0LDHM"6dK$V!Q&(F'-hN8TLP-4`mfcq-[ij9
H%L@G)39*r&qL0@Z&Y*NXN!!MUI5CE-mFFFPUFYj0qe6hPfT!Mm%4ZfD-[Pe`C"V
i#PQKX2I$FJ'H04"rSC5'@DiAG0032[r2Y2IRhdFAFMCCYkd!86cH*MMMH!'rM%M
rF(NqS0SjkHG-QX$f-a*a10X+[))aKTCSRJXBEX)%b&)Uhf5IhV#2k"EHM)URbr%
($GZM%5U,B*2UETY@%ZIEkpTf(rV3"-QA(M"0p#2(6H4M#Ke)maGajc,U,RrcbQr
`R+li[HEm5cf,*r)'Vk8BQf,3'PhfrHc3UC[UHR8H-B6miP-F-TTF1A)0rh&,GK0
%f!3c(H(-$1i$1'ZZaP2%2CBUldr@e0-afD-[13[5Bk@3!+mQ%V)L1Xb(16r$ddJ
'UVIiPCqh*&Ak)b3l,C`r(S&lBC)QrQ!!S-`ppB-c[FiA4S0XaKGM5hqT1)V'IX1
6d-3Fe[abXTE-Sj+m1fJk**1G9J-bZ-"M&hN)bMjF9fDqN@-5$h@e6FE3!mACXRr
ie5ZcE$l''@[Zj"LPqHd*FB8LBjbiJNNDN5Ye5T!!aQ9f9D55`TU"fRFGG!Gfj9c
I-d)A1f)qQ`jp2X$US4-UML1(BX-`8(-a)Y66m*-j#002M)UUDN&CYE(2Y8fBSbK
lMYURSR#e93#J)+P48-jj6$UTiSLYI4%[3XPjb9B#XYFSNdiZTN6!!++)GDHKM#h
0bViKlp8"H$PKf"%$U-[dMhrb4eY&l'TN,!r%QTh`qFLTCcIMZ#)Ih(8p%ASYqMQ
6`fAeF`6+EDbR-D8!qSDDUQU8[p,")MH![38q(ZTkKj-PKJ$jV)#'*)*1i!h4Fqf
#lEARaV12&PD,cS$Fq+4!!JB,'DDQ+H4FBGH'4MQ`'-NQ#)a&I"a'21&%ie9J5-S
+%[MahQ($!pZ'rek@%6IY1@dLia4DS4mII+Fmf1pGkfpDJJiGHGi3iZD5fXK@fm3
6!paD8*mIA"TqVIJ5([-pBB+TUqhq2UhX3(qdCC&&HjfN,C6f62(fb!eJV2Ya8(@
ADf(P"rUkH#*20M,AIb8L2r*p*afXE%Sl-DU&rP5NrGJ+cAf0`0I-R@)PVEc3cT&
h-V*c"bf[M"@ENJ`h2rXr!"M!l4JEHM)K'9[r(%XS+%li2NFdG[@V@p$bM"TS1b"
"Hq4[mbUdC*HK#!Rfc3&Z1G)*iM6q4Tfa4`kIBDe%lciQZ-V&#TbQC,M1BBC)C,-
k1KL4e5jLN!$61LA%*DqjL#1r+bAa*lN[JkeQ5V&1%c-%XiGI4'd*ILIae0#Yh8Z
phq)m%-!HEQS6eQR4`i-Y,P6dd)M4Ji$X(r-3N!$PMh#P6D3El,pFASLCT&DQ00H
YMII"T"-R1FD@Y@pT6@UYT"Bpq&GC-YH(T`Dm$UB'Cr,-ZjLXV3,R0)%EZHT+m3c
IiRK*1#&TT%VkJN$FJpVUP%BfQLEP+M(UekFEU4cTDZk-R#ChT3[4,,6"RLMe(J)
5p*bAmeVKjVZMTJ@[-f4CAcdaJmI)r54pDHZ10D0!F&d(VMPG[M0j3J$4k@))Y@`
k1K&$kN4#QAT-kVY2`-D41e6@FG-4J-hrTQR'44B'p+mhYeBrLSPDQFcYE1bf1T'
a,l,632j9&%"MY5rQkhcZ*DA6FIaA!AcerL@12bK9'EE`9PIe*Thc84!lUI$hKeJ
@b8!Fr6`(L+EpT50`kblFJP!S1HkbeIlc5)i`DjJLLGJr*CAiFmCMk9C!%PMc-Z'
,*("j&XNC4DIFrA(!!UpG,FPa''!%iM3LreS!F[fp)Ue"CMqYJYL&)2Sr(HCa+r$
m'05QYA0EEP@Gela[jKPfAm3(QH6iqKp2Rq)@V-4mIT(fT$QRCf-ciMdE#44)!re
SD[[1IXeD,(,T)H0$(GMi#36PmG9k@5J($Gje(UrBUfD![bf6LS[I*`XYe95bFj*
bF@!d9T!!&@+G,f`RFaS#QbleLE!k(5Xe&-m9$2f)2RC@%HIGHKBQjeF%PI4V1%(
TPiHG+VX8#l'lij1h`@0`AHllQ'jE*6)P&ib"14b+YL4jP)(R@C@5Dp%MQhM1FXA
fXN1)hbF3#A4j[BZ6r,3PA,Q`(f9GRQKMG)jh*!@qSH3+0p&9S!L"&kD2'a(@&AC
8VP-X$RGjZe@8'Dp[HEb9BCU5iY8p48K&XK14r4H3!,qKjIdTYNCF6jS!h5iN2Nj
[ej!!hU"6[HGU[r`@b8ca9("Z,ikB!*Ld!GE4%U1&RP,dUB'lbPGdS1d-S)Lq9eE
@qS1LH&mpkPU&#,E2[ZSNT%@hCNUTCH42[HBGI$jFK&"2D"@X(f`183C!8kL*LX$
,JM(#l"6dhhKVlhh3)(X"%Bc01%)#[FrSD4@-cip!r06`H%[2V5Rm1pmmhr,aF'j
)difVa8(V0%hPR*!!#,D!5i-Z86q%L1D$-3Ja1d8ZS2bj'()!q8NcmHP%[@RhaTP
Y[UQJNBDF6,QiP&`XU"$c8H23-,G#aME4BYL`,VjSQ#T)(U%*6,)XYG(SU#,$T[2
2`bMjMPX5f,KfbD[NB3j-KLYF+"j00iYiqGGG%IdYb#9M5V358c(5XKi!T%%EG36
Q"ANh2miSGYa)U2bJX'0D8MRP'Ej&#`hP3CSZ`j%Y2D$1dLpLA3#8NQ`p*R(fUTi
RdPD3!%#13ZNU'H5QlDA`lBqQ`#j5[DqG!G,N'MeDGI!G*2q1I,0YP*m8b)CI*!k
H-9J#kN9[rmYBKKre)JDC!E-Caelr%QP&DU2C5k,L-h+dQDJAdqjZ+Ya@Dq&9YU$
#A[+&+15kkr-Q+6h22bSlYG@[&@1c`,`M,pX")PbVQr#@T2h$)Ld+pXUmZ8#+X&5
%DFPqdlURHAAqqZ+iT-9d8$!JlFD"V`G1K2R1%HCYQ+,b&G6r4a3!0H3FG(MLUDF
(HiT0hN%adBAZ6b-QJk85KSQHYH2LHmrC'1iDjVkGJmhKG+f9ERQ[2`+,c51QX9-
"LK!XC"%Ra$4+RZKIN!!IA9i%m2"SNkp[Q%mQ*2BJKV(C'Tk4[f#d65fKX,CLNI8
Sm40cFN%GM28DPG'Ydd*eGM[r6[DeTPNeF-&TB'`D%D1V[XGd`9a(TH+!S%Vj-X&
ri-lkZ%+Xcf,J[qbTKp9C'C0#%b9%DhGD)9b&DZX2Q"59I&Xa"X@VCDiXZEFU!,2
Zl9#0PZ1b!cRRBDr@Vb`T@S*VRq*K80mYf[IEGeLHVLLD!)%b+4BRk!TeB5EZ*8#
FNC!!5DdHYQNZHa+ABP2[-q0mF44D@f9aH2Np+%Bp8!E9H'U,6r+4P#%[0Qh33+4
'G*a``"'Y0$-X1R4LJbq2[HQTkj,f(rlcCNfY0A@m!3Y65hCkX1JK3iS-Vq@ad3Z
&AbU&pa2l-C2a8pFZk-qKF5HKN!"lpLQL&09TPT1I#GDCe&l$bG[jHa-QhPYfdRq
Tc)UX3VUYqF$cpL3DdeV@T*8EVZJB#*Y4Skjf%!DTQ1RZqi+q+VbH+9VE)`cf)@J
$a`Ca295a+$4Ve#@XQl$D"0L4bF,PQVI2(m4Y(X0l92LH@,'*i2@1Y1Z2XAH6&IU
Nki)+5K%%#`@p`'@J@pJSI[r!92@`H"iNa&T&h+ecT,dBD&dRNSHrR&&REJ1A8f#
e$S+rFGMH9+[ed@eckCaN-NC!I4lfhENA'f!Lbm"[,#h+,[cD4YVUDb'KA%T3q$"
lNlhF`'STEidFAq8f4rTBhQ2Y01HjjVV4fm`0HKfD%18qp[C'L&RcHqIF1J3H9[m
f2rXl,CBRHK8T*2k2NSB4m#$k2SCKINSq1B*`reEYYpdb$93p-$Vc$rdNB&I8VA"
%[0[T)#pYhYZRJGA*qKM&80@29YJTVeYK#L1S$@MZM&H&*5j1QF9RM!(!@d4kKi`
*#iUYNV)@9-Jj8##ULUHb[r'kG2fA)@ieKk24Ar&LF'jpfL`ZB-Brq1U5iq1bKDT
IpiJBCEc@$NaQ@f2D'"#b+-8i(FmZ[CFa!$!HVI#,mQSam,ImZZ**2S%@5cj2XXN
+9-9F`A!l3M(Bj&f53kcKIk@CMpPf#FGX`dc'1DNJDC(Re+rV@#b8UJL(3cY(Q96
%aARcT1Q[+6`$Q%RFqD*A+i3R!DF"6JdJRHjHR&@((&hIh@UDS-dBdc3B&I&Mjj5
A,'Vd-MZcVbJX-VUIFkBPfH#U1acKb-XlC%kC2(@4VFL%(UA6RA,N*9"L@!qSl3@
$b`2E13RIP4Er5*,"!"A@*j3D$(G(LEJe&rjP5''H+I1rh$HD44`Bd'A9"hh"4L9
JQ!2[NQp!Jh,NiVbGPJF[q41MbRQC2$Y9GAJ*PQ#ld1INkcR@d(6r`L8$M,4Aq4d
*C(HcB'@KlZABX'ibhl[c5#CR[A0F&B$2HlXSj(%''B&L4Yr%#pd"#l))Y)9D`Kc
1YACrC`0*KU901-9Ib#B'KhAhbXNll+#9M@K&kdS9U+B*K3)Q`+6AVX[kKV)jUd&
ffP"KQMM+-a`MjE@F,*JN`r0VZ1D5D2-%4K@TmFbVd3pTj9Nq1ZLH@8JaJ!@a4%8
jP[q3!%j)bTMLLCeQi8UR@!HpCaiYCR5LmT3YTV[48G1j+FXZf@0X0de9&Yam!Cj
ED(ES%j6pCPc,Jr4@4('rUi3Y8lpA8R+X31'b"`'q!0liH2N6N!"Q3l"Q&ICkq"(
!fMH[B4'KZVE"U!pG2X9hiB`A6)!Nd(Z-FQa4eUZY"NGjr)hB'4b4[m&c--3jJLN
&"&(#fabR-9k8QNcTi"&GpfVY2kbU4mAm(8!FEMGdN!#0R-iE@S``NJm`c*(beKD
&CkdjGY&V(5K,MQ-$J5Y``'3+TEEaAHk6*k*FVh$kj[`D"XiNJ9,)(p)&2-emq0T
Iad8f"%MG"ZL'`GU"ahD064f,-`f9b`N6B6*bI1#"%RXKVGl'V@94GrC*M*-JKdQ
&EEY(jAFPifB8iQEZ5T`9aYHL'Y%+q$`'q2-#-Qk'DEXA4Hm[r*8H6P$VYPG3*+Z
&-fFeX-jDTpVM2jH&c0GVhS@Yi[Dlik[V3B&ep@BIU5JErTMB4`!J8J6k,I!kqcQ
FV2JlP$1iJ,6BGT+41S2"S!hLaC!!,c)GGdI*+P(H-Zr2FMQcJ"VdK-ck45"@V[l
d5Q@`"Lek6(#c6JV&KM&E9G93-cDhA[4E0APMTU$m%@NiFG("mSZq[T1F[jeUbq%
q`%Jh02Ca3QQNSiSHEMffJ"bM!89*GASkp'lPh6Ic`Um6J1cch9VlG@D&0,T+QdR
#AYc&Q+#-5+49hEB5IZAmJ9flLqlDKB`MPqVZPir4TG`P2N#eSTF)0qCUmIfeL2U
q2%dSkQ"(!dIP@IJJlidb8h!(%)edHb9N-ZjA!dqJN!",'RhN"&G"PM'8q5*Z,HN
eFiCLIQ2rR!ded#5V@eqUD96f1UGRV*RREZ`A!X#PN!3"!!!m!!#dSF5TY-Hd@!!
!6NF!!+QB!*!$FJ!-ljF!!V*0!!!QTJ#3"!m!9'0X8fKPE'ac,Xq!!!#(`de08(*
$9dP&!3$rN!3!N!U!!*!(3X(8e6'MS9UQ,qMq(Ic5F[,,iVKcE9IiKE054!XmHpr
rE-T+GQ438MaVIL$%'i9qM)JeQMh80fq54mPjdPN'Al[3X@c6ISZ8"rDEQ#aD-5p
GF"Er!GXThhkkG@`E93j41J4'aCYQ0e*j'P+a%)9*rZTIVj[rC[GKpU1R&3AB&PL
N9([LfI4M0mIYhpIc*TTJYdbcJHfkaeaD`ASBfGCEH(+0'XD*m5#+TlKU@#XJ3h,
hhCRS@FpBj,8*TG@dk3Z"hd*rNfF#dh6mDVhK@h,c%N`1KrYK3h1ELE1(c2[ICYT
XHj2AeR-*QFVI02!H(SiZ%6i`IL)c+S20#p+9f2Mq&lmSfl5q(Z@TD8qm%RNC)DY
Rc,4%&rlZ1&$1#hp8$U-f"3e9)#!1e'J"R1[P'@L!Jd(T3M`KGCC&,QCKGN&@L'`
IdHL14cHVqaE$%fed)3'KL6$I4SEST09i-%pp1G1BNB6!+,hCe8!p#r2,5V'(3FJ
BLD4dRZQh)ca'[fP-!!4Bpb8elpFME,G&Gk9G#9$NPhBUl,Ze!['(CV$URSc-f`X
UGRHc9dS5lNMXHJYfDbba+Gq3!,)5pa6(!"J4HJ#S0ZLArd0!DSXLRE!rC1B@+&J
1fD1!Z1B'-[AKNp%cRdj*KTN)6eY3SR)"5`Z'%&bfTZGIXaK,0&JRILLZ*dA%Lm-
kZJcEjEHQc!S6'PB&VZ'IRV9V8EB%ZXk6S&RMJ&DU4GB29I$N&Y`AKi0(icd"+E0
C"SjpL*r45XYL0Q&4Re5J*$BQ&UcDD[3hGV`qLJ&qVbQfZqM-(ijD%J#AHMTDhM*
1YK9'`4ehY&r4a&+Y2FS(3bX94JKIh'hjlXZ*j*2N,l!8#!&2PMribX#E4DZTP[-
+26*(rB[-ER4`$m&LAAMD2RHF1c5bcbCZCkV#LJaC3`8rJ`'Ed8X0EC06C&Ibedk
&h$K"Fe2AA'mEa9j,rXhqkBe&Xi+F0YLC!aJGBil8d$X-fZX&9Qikek%jpK1hR9F
XSZmJNF&Pa9M0l6-,'2@*Rpl#q6SC#lG+"MEkQ#+[Sk@$i84I6FGR%5i1kl5Z,jZ
eaa91ErjSdY&CV$im%*!!hKR(me`pCUlRTdiNrda-+DfBNJKHFFBSc5[A"%Zj8VJ
8``&qfL`X[q#"d"j&26TbmB0E'*e0-rJ,,18E#a[Eple3%'3'$BV1h'pqD48aCc9
Ka6P'X4IHdFe'lId!48LjpKN4*m#B(L4))d0p`J&K5K)IJU(T+#a#KZBm6i"q4-a
4,Q3A2B2&DE19&(P9&NKAP-5p23c+BK"`R2+[HmV",LIrK'hk,bU@qLDPXCZ(TZS
LX0`RJ*JUEC(&dX$SllY'kh-3H-JCjK#)2`Jb$$6pUNIF3AL3!*jC$S90&r5(jdH
AJMk%PF(Fid-a4eAX`ALQa-L1#Vq5@8BGM0#TGqVYQEG&K+NTEeq-!0Yi6j-m6qe
1H4K[Ja!UJ$CIrM'(EHmD%'aDqB@DGlhkEPCiJ-"-6h"eSaIJSN"!9p&Q6,McaGp
hdY[-GHG15T4L%r08Tmm#*c6!*1`!9rJeh&j`hN0MPp%2TJiG8UqCp8@NYCSSa"d
8HqGZj(H$9%deTYD51i2fVBmm+b(D`YBPRA`SicGif'JjShC@RHI60D!`eITp8@*
k'a(0rJ9J,G4bAeJSV$dUrT0EJ(ZS3@jpr9MR$qp'US42QVB1SiC"Cd'0'&aC3rB
jjX-CI9SD+GB)ij!!G6!Sd+JD+$d+5hUlZ"f`GMJ[C)&jSQhbTZDZm@$`-2lj3f4
`8iDVmeT!pM`XdIe-`5+a26fl[ZK[`c-ljlPV`TQ69@LGB`Kila%)YCbHQCH4L,2
SiQr')P*J%3a`bRV9+ek,Yek-8M`(cplreH#PQkVT[Fk&dkLCp"`Ek&$2AFS04[6
B4!PMh&TQq0RBAc'a8NPI!l@pmI!eVpE'Gff"Xa&$BX#l,%hp85YIek$6j[)V+N4
pmbK%qj-QeH!`pJ2ii6*jQqeaD"@4F#"H)@&N+-aLp5fRb)HXKKc"E,C,*54QY)6
(5P)S[*SBX'h#mU,2e51qN!$)Fd5M-c!h*VMK(rF%Kh55S1Gr3$"Ze@Q'HGZEEL-
kKi4'%L-4LZdqQlp-bf8,L1HQIYrpA"EI0mYP20fEVmZEKP4dkr"rL39Ra([#,4`
0NE3`$##CkcHFr1Zl%3QM,2%j0Q,'XRS[lTRhIpUc638`N['`Yl@RQ&#GMF*GRl,
C4h#BXC91A5ejS(DK-bJldf$9kqj2TRjb2GG&KcA,@#&+DdDD!fKR"`BiaGCL9jk
[maHKjk*VJBdK85i3'5!0Td4kU&#J$ppETeRmN3LiiBY1m`@DpAPYZYimYbm%IU'
8@F*j1'6QTECe,-3jGH`#l-d*,9"a$GU"`4`C)af9Q!UM@1D&BNAa8#2jqJC#dd@
h!p6p*,edVp"!*8Bmk2Y$bQRLTIdZ12jm@jT4eGM5[ML(6eUP0"YbLZcRFk`e@A0
PFbGAb4ZM3!h&rUDZXa$[BeUAk32)TeCCSq1j$5(f6(,J'rNE!h[mTaiTcb(lfI@
YDq(3RJi`",[+HBP10#K-80)dmIlP"jrrLX4[B!h&QA4&V`J)62[Q)*SjBerhcEf
kB'8)#*r18`fI@L&b`*d6)d'FNikqQlcR5jpb`B*l3dQZl(+,LBLVB*`[Pd`&E@%
h8*d-*k5$RalaHQfeeF'MAeQKAHA%A#q9RH`J,P0S38CQ0f`6SQ19Ef1qi!e3e5C
"1r,CTP0l%RZiZHUY-B4ZLpaFGk3f29dmb`03l$)HNFU3!*@ThZX&TbB2D'1iL&2
,UV+LfPYD0''1CG6b#5bq3&`HIU"I5q@%53*%e@e(m09&YLlT3JDa+T6Rq%ZXIk,
5D$UDTP*2daYTMfbSBdr%f[E4i9m*[18R@0KpAcNpaDH54`EL*DNFZ4m[BBjF(i#
`3ddrETd9X&4&%q`+rirJhQ![(HH0IcT!l`$U&cFMED"4[M9Jc'-ar9l%FbYQAii
lkeNL!!1*'`kVj,`4+EfAVfkprNSXN@6#ja6R+MCF@26HU$ceRQ"C2&HFprVHI@%
EbHfE(EpcV2PL4"D&MrXi#pc'iXZ$ifr0pXRADkpZIVA'G)@HN!$K&6@2NM-@`Sd
"pNAI15*D*+kTD651iLQ6T0bj@1H`JUPU88"DTbGP*Nfp*'&&[T*RSH-kT9[D9El
'ISA@A01Ph6-c4-3!X3jDrAN69ClYrKGc6ACL1R'811@+3i5pqMHQBGa-I#ZpQZQ
-6j4qDViYI#Ui#aq)-LSiEeL1L[$!,e"'S9%`6Tc3JIZ8ML3$DUkaRV'0rG5DTh3
K@i%KKd9$RH#rh,h)cbmAI+BN1'@mbm2AACXk911m$,BlU9#U#R*F!!IEj[i3AS%
2TP3-dZ"r%[lhDGYCp52!q0'ejPkRF-N[T0-ZPPZ95--YFTQ#BNAeli2fD`Y8,H5
GKTVJl"M5Y!pS-5U$-Nj'A*8NK3iQ46TlMb#0p,hJq!ZC`$"b%`bA9#KD"mS-ek"
GYKf[f**jb184L%!,-52j)2(EH)(m3L@3!(Hh*cb2*J$j&#Jii-IHp,MjpDX1B4$
Km%EGe-fcb8fRdCp2hYbPM'0cIlT28MY!40jMqa!f'-ZRV9EX8(#!4T)41r5Hqk0
XUdrkFTq8p2&J9B%P$fSV8CM$%q,MS6d*r60Y0`qLECfmkhS8AZYPP`HZ[8I!Xf0
UBP,cJ6-C%Bkr@Y)'@(mi-QZkFV(L"%84cFPe1fkcceA%X-6a[8b$%UleZfSh0Pa
IPiS"CIm*r8)+%FmbpUTUihp"qRNQhiKQ3h,!#CkqYC&LCZ,RfKhA5&dCrr+I6!V
D&CU6`Yd4*`k1@[SiJa,dXCErfIS`h&FpT$56ad,C$-B`b53,p)[6hMkR@bA3&dB
cYh(Y)pXpp!h%`k*j"JBi%@[0`j0`d-9Tfa@N2$rD05&U9h-V,k0ZklQ"l&SiY+Q
d*miS,K(PUI*#E!M9b6c$NP@U'Bl!QYii$MK-#A%@HBdm6ekG!bB$qf&$E3,9@c8
,"-4fMiY%@9"'pST%QT!!8jl*@dX)JEKLf&Fp+*51)&J-RXr*3)`A2a0`qHqJM!p
DJ%IeQ"03[bqj%[LD6m-G!2kq0b",5r)*Ch`Fk![iCG0j"5YLYZ,J,i9"V(G&c!I
K"KdUc%+2l+-Am0flZ59$`S+Y`[hahNfEI+JPE&2`$BER'ViBT'%,edHlehk,Be-
[9#2G1pc%RfQeNK##FHT*$56,G@`UK@ISPF`"fZ3q[JLUpTSqUIT@AD%NVJHe!9S
bS'cjaZ@5)`+ZkM5e%Q"jMIRZb0`$kX"!T34F!1EdfI$RiBlD!(4$YG%RRP!AdaG
L,T!!L$UD0RGr2h*c-C0Vb@04mIhQ![,!@)bi8EQB!&5L-Cr`2d+6*DpVb3iLZ[B
0IFfkM8P%ka6@TE6PJ88!FTGV9Ni!Q$CV(VBlCRB$1('TbEpHA)mF@8dBI3V%YYp
NURD[AH)8G'T+CJ4bF"(f,G6P*b[cbr8&+pdH`S`C#KPSaK"RhG24(DE[3c+$Gk0
JhbjmY82QGSMU#Hlbd%r-'V9"6h214BZb-$4ffdqd(G9@e#kF@!CQQ"[0T)rE38K
`*bAD@e[B9MFkfiHY)TVj4JPrC`p`11FZFQ%U)kMP[2B8N8XjJJ,)cj95!lkAdGZ
-#DplA'Y"Vajq%A)Pcp!%ZS,D!kF$A5eX%r'Q&Jaq%m4E2GG0Y@*K`dQVNI"1kX9
EiFHR9CJd*T@0QrpJ1T(BEZ2EdGBQD+qA$b2UPQ[KaZU&Ih$VqUpUTb!qK&Iq[J'
VKQ*Tf39NM6`VpIC2@U#)`#"4UdV2Zd,0-PH-e45'"4(9(0S4@L)SY9GQ%2UrcHJ
Z%Rm&rD)@h'h+1h$'QQl1SbT1T(Z3!%bGeedr0G,ac5r9TiaFrbHXXRUV5h1XR0E
JU)iJ66#,EPM8!1bf[`3@'TY-4V[U,&SlD'1m8mlSaA5kh89kTIUcAC(#lLH[D8#
lZ!5)3'6S&,HjG3$'*(hHiK"0H)6erb["$JY1V@aI5Zl'*h0TJET1'S1'['ijL9h
FQ2eHXaLhK1GcqlcIb!#8*KijeKS1FDHHRbGc&QMNY3&ZN!$4P6IijGUaQA#$#I)
ehb*`UlX!,d@"Z(381`hKCD[Im6p@-qi)iNmZ(lmr'G`Li'%Be#l26%hQ[XY0a)S
1qccm2QSDXf`1RY*-I%@Aj(BB`"Bf+I5@I"k4"%PJa8c5&-p&),G!JHFI5k-Ce3k
Q$N4X*1Ze$l38(2kEQh')m&3HB2LmMNa`5U&cC+2brRS1kJd+`M0DFRAQi)jJ2q-
l4`dR$$J'G,3JLRk3!*,ir9-5Ym-RMcLIVeZamH2"H8)AD8IrL$3"rK@`V%9Ck1k
pbQV+hGlQ!iIj4EC@LeLMQh+6)N2jl86Ad3,&ddU%a#ejrXRhJ44-j)HEpY!YF46
VB$ZU3fXQ5rq#[0MRT%PBA*d`FGj911G)*#KjXkc9cXP%#5RrM8B0f`NdYpU2k8F
erK[r#%KCEY(F`pS(Z2dH`iIBG*h,aU6cR5a,T3I`cKI8E)N-"D+&9N"i-MkCHP+
aQ0"(A'5il3R"he(KLGGRB8Q(fR!PF)N9d8PRrQI)jr"`K+5HYBpNkr`NU8"NNP%
*V(NQZ'TC-&mNiC,29h*QhFD&5dLYTkHqCBmD$p"bqi$MT#3ejmiSjmlB&qJTrj3
Pk013!"D[hrL*+,R2JI0NR4H0`fT`cJ"D-pieRq$4R1%PYcEJE8[e'I2,Ndl@$M'
i&FCC1YK&Jk3eX4+hE+Y*V&q&+jZ@NVZiKK*@QkB!64$1q1[&er6ZHI'5XY-f)dD
3!,Km*+lUAd#jMPblFZ@ebK-cV8D'!"'1dI&6M),A#2d"(5Y8'%I)S'Z'Aid0RcT
XZHYP8bchLe,lAN*MEJGeZA,+NGrakB*4b*@$bp2Q[0"re3YGIMj)(S5GK"1UAl`
BjFET,eH3!&%8CCF-jFLk9IUSP)#L$bZCFbHNk2R(Q)J8N!!K01TEDak9ZH5p"D9
e(V+XApPYA#%IqqbS9#02KkLeirm+1`hL0AfKAlakHQ#'m8GL)NJ9"+%Yj5dMN!#
Y,B"6P[%LL#Lh%U'emr4h,!V""*Jc[9q6I$aHQI@Z#5#U#cB(ZZ"pbeUe)E$fGdi
Hq#+r#8BI"Tam9$ZbYH&09`8KUI-lCNfBpmakB,@iD23,Ul8@ER*2J#MkQM9BChK
1HBXEAdAFR,EkfdYq+[QQ[1b@pN3NecG#cE"lF-%%B-*!5-TSASqE!fmDG!3F*N`
i#C56MS$(p!4X-,-[G@2cBpqAQXdR&8iZ8)5#&LXfba"YMYM-q+bEI&1pVQQe0,H
-%HTUC0V*BdbCR9848'P$6"el$+GC[I(K9!YVIm-$-$69X&@#krJPKc%EHVQI[!-
6TN$*4@QV#M'KZEmJG$pfHIidGF#d2-#NX,"2Vj!!D(Chb(B%kLL2a$T"aDejQ9p
km`Qc3birp[MUeU"ed"Vmj9jfSq&-!#,*5d`8jEb)D-,U56@R,X$#)m!B8`991GI
C-khpIhrLYSSKl3J-EHB+0YiRHR"33d)5(#!'X#+eE(,'&C99QahDL`)d%Z3iQEU
T'82[j,fa2a1'0ijQp1Er2089qc+jpl[Gkq,4jb+rK8G94Ya-iPZN"K1Z`U8H,*U
mJcDlQ3GH`dZpTIrAYK,ic`'69q"M'4m1Ff3@0l[a!r!1NF[Fl0!#QkVhd(%Xp2#
@12YkAp%5ALV*MmaJe0!ZFmFZSrII+`p#U%pRMdQ(Me5(p+E01rA'#5mU6paTAPI
#K2$R'f%kZKLa1mXA-2`CXSi'p5a@"K$Q)D-1MqBcZLCRkSdRpb4+0#jB3eB4V,k
hVP++0iB)SMBjNLaKkTb"[[(V5$`dQ353!&4@aA(*9i+YbNI`1q)a$E9TTQcpX,"
BC((5+[Xp)ZNUa5,T)08!TD1rhZ,ch49+[R0)*qR%fK`mQdACh$fRRF0YcHN[&`S
i(3GPT(B@![*C9YVadD2BhM4FBR!k5j4)QTEBPi1-rR,NQS%1"bJ2kj2Ad(q3!!6
m0T@3!'[k%-eG1dDQZ)ef8Ur[HLA*dlFkJi(4E#1SkAcTj-(m,RBJbi(bLkaS-QD
SY$a,c5M#K@DTp#SPkSB0C6SZf2Ph&[q%R%E40f0TT1QrV5)2a1l+L$$M%*QIq%c
YkERiUJq'%AL,X'(FJh%MCkm(e3$PD1FNE+fDUf$qTfZVU&Tb#)((Af#EeLIK8P$
eX9Hem%r))%SM40r&mJ*)*UQ1@q`TkFq2HlH0l-l@R&+,!j,dP5THrqq6-m)(2a*
B2%cAiY9&R5SDZ[fhma&(A#i$'De6MH3NG1qAbjTc(ZV6%`%RQ''de1-5[d[NQDe
&1k3"V1eFH[@U8X#'BTYAY(*CbeG,5XhMjBJ1!rQ19%V*Nr0hI+$G@'j4UIbk+Q#
I!Q,h2eMFR59'L+K,#`fNfjq0+[#r!Em1r5)[B*&H`*SR3(ZD#D)IP4r@ECJaaBD
C((3IN!$BI(4TD1MMKX#q3!`Q5ZpKDH,G(,mmUXI)B-*jHPHJ9+qE[TaKKPEZT"[
)aSi51)`F4a$C910Q8&`[#NK)T"XiNDMehG3E'hi(SM%Y(@(lVDM[ZmKM)50iUqB
Rec[UAZUUEaD9$APaY!GNf@X9iJVU&lFDNj[P[*[5)'j$drDc#&)HSRVr9T@Rb)*
D@qFrXXbP5NV3R"-jb*BTa%5GTAjh`TFFJ#kZF'!lIUN!XqHY%,0T2UZjmf&Ne')
JSKHeLBhapVXja)p6'8QakcRMA5h[BiA-pUN,66J0a-@CYc9dr1'CrZTKIDSkB`N
l1b1CRYi"5e,2(3h+8l$FaiSTcF6D$4TRCSY`rUHcY(pb'@dBAEPiR%9S`H3Y%i'
'+QlR%1d0PS![Sh,eGADD5jmr5"Gf402rVhQb4[pYDBQYkKGdf,9p$42h"ETLTFC
-Q)9j6hIBZd8N0r9PFl)U(09Nj24(18-`HNR2@5!"dEUbNRZ&$h`a66Rm'dKA+iK
AMD`aQjYDa1J8!QJTrE)58RAI,+eq(kf--U2S(ZH&Rb@iif8J96(33[Ij#6CZSNh
$e'A,*@9lIFeq!rCaV)ED31Ul-J2hP+&CHjNk(IkF+)Al5ffjL+%R[[m5mC!!NCP
$#l+,LbV9Q+HfJ5T%+HN8iL&5M6i#1+9&l'#@A-6)il6!Ib+pH8q,8Sil35-+5-0
V8$RDQa`5r!GLqU-9fDU-D"ZX)0QPqFmA4m3C"$c-hhcmqBf(TV"3EBcP#HPHdVp
6#5R+6l@hi4mcM-3mUm)RH6@I@B6J()F-ef$Hi0KEpX&-k$4*kFN&,fYc`8RiSY!
8Fd1Q5&@MMA'9Pe10UK6*4LkFV%(RJIj"d%kp+S996-ZQ!S1FmbTF'X[A"1GJ,EX
UlbV'2a`NIZ@F*G9Iq2R(SYG)R9KGdLJk(`[fmda`&,#b!26'B8I*l*`*#F%*VDL
R9%*c65"p,1$XR`hq'V4[6I*m$4%@fI#B$Ui2f1N8%HE94D!'JQ1Ma!F)``R@K`6
N$Q0JEJKPF6ml+60r!hTF%[`!S+Ah0B[jqL4qI+",h,69B'fPiab8'ha-kBL2-Y*
-6BLJ$(L!ce$IiRh)p[SVr[TrG"jVhAp*E)C`,k1JI*!!Z`LC$[p6mVj9jl9S9a`
NRLc!&%m%QbRbp$M9-CMbX"RjcGqZ$3%`-11(IfST#i)YCV!(Z@&+%A'YBT@&dR*
EMK6$@lk@aYUH-KT2Q@NTj1Y!"S+a0IDJ,c(ec2BG5XIPTf0#J5R#`*('DJGVJM%
mY*L83PG-eV%cZ!FPLjbA2SE%-[Y8%-HN3-&iHqbM(q8jGH'a+D3M02mcLCPE%qc
9MLDhmpc#a`kY9TU)&Sh$60*m-flV&#2TT1*YVPV1ZkLQZE'Dpm4)*b!pT-EC+GM
Pb$#20IPqE1LaI),66S8Bc0)TjG"m9YAD,98ZBcMfa5RBY+X)`crZjHhYDT[+NeY
!V1bdCUF#%*L%R`mqD3b'DVbN9'aQlLf@YhiJq1HqUMCN"S*X4K4*kdjdFj!!3Rr
ARbcqG)P3TQ+EG4)95NqXAC!!"LE1!3i#3hiDfG"am@Fk,1qaV%(4%mG2dma%dNQ
eA*F9TlV-Hq[I`dELGc-(DBdYSF@HFV5k8KRq!M,4&!9Gjb`eB10F[ZipUIaK2p+
eCCJPH[eCi-%ZKSR`Q@1XPp8,%*`*dQM8@c6-Bh3,"Dc)arN0N3PY*aFB#UK3`UV
9[$@F#N&iX`1l2NP&0B0D*0IKH)kPHq&rTH,)+Dh6UFF(-4pbjSK"N!#*XqVr5mI
@b0RlaLa%AFh0N!"FeQr+MEh!Z%b6blDMq9UrAacc1"lq(LpZIaA$bZdLhcl+qek
C1QUd'*'$PC&@e4HAST'R@X8rb$[J`!e`A@qjm5K%*('eSDB8@a**)35hH%ihJX`
Ucf)E0ATH4,&(hV%6"LB24"*XqRe$@Rj!U3h*P(Xmch%*jZZCqJ(cRXZ5VJRZc9)
E1ZI-"S&qEi2)elrVXI9*FN$K`3$lhNl!Tl'8#fYJCNpI0SMPPh6FPU2+9ZYbT"M
SVPATih0c6%,#3'f[&9a`&Vpd'83bQ*A[`Lb[Pr*hM4`JccCPcB9p#iTh`+C#kC)
ej'K8AJc9q0Ki)TmX8b#DAQYJPUcd5f)kMj!!3U%-1&4T4mhCDDrD**1A`!5(YSP
(D+F1YBAmZ%`*2Z-iIYD43iqCiY@0b[J!YDF&TCFK!LENqhQI&lJ6mIUSLH!3[%#
Sf9fS8A(ldNXT-aB`DM2V5D,1CP6BMZTrfhTqVP,k!R1Z0cMQdQ&ZCK,Bp3-CL,A
+`3J''6e"a[!qim+B0ihcQ0ID60QH,P"+33JiDGIXTih@-kppSYEpSYKB$#pYk9f
0-0CVe1IXpHei)!6H%UPkYH-2A(SrFH&UU4@1(&qZ(9[MRqBBc&e4lLGLjAQGV(p
eeIXEXr'eRj6GVb8c*p$3(9r[+Lk2P40T5VYR!Q'&(ApEc+m*GSlf1qFVK*MH02D
S+`9q,&P!HJB"e(@L+B0f[+4De1Uq4,-5`M#-0Q-HE0G&Kl5VaHE5K%&-`3D%TIZ
*G-GR5M26e(X-NE#[AiSY5b"0B0X$S+5XGC2R!*FYMT84[-Nda%5ckc1C3!YC$0e
PJDP(13k#lY&[Q1QrSA[&6)[MQ8CK&Ye0USA"FR(Xjk)6lh0,$+9p!h8dNiUAkiZ
dN!!T@D0eVQA5AY%Q@rBQ2S3,,VJLHBblYf%Y@!21KrkX'r1`pq+[)aC0j%&XkGK
DllRTf%Xh[41&4d#bX[NIpIJjKiUR*Z8'")5db,ajKC6+Q8kpB1U4C*R%rYi25kR
ilfQCY`,ecYlRU"5k41a6YRDj(MT5p9If&8NdAa!r-lKVUhd*j`Y#hf"mA51qqKF
`ir8[[-V%"KXe(mR8j2[&C'!8eU%aUVief*p+lrM4VHji$GE6L(P'F#YF3$P-adF
H-kpNHc,[(qP)[iqS@ZB!"kdVqMMVlm85fEbEmcL%VF0*Jhj(dk415IPb9ip@[2+
pRia-ke-i3kbR6'E9QrBZbCKSq+B)iEhP3"k&*J5TT3T2`-qTKm&%+PSlCR5Q2MV
3+IPQ4P,HM!++PA+1#YBUK0!%q4Jf4rH-NZ9L'C+jhi"YKLQACk2k)"ri4lZ(adj
[)@SGM8E)kF%Pl$dX*96IN!"RU+ZS5Z62bFU@6FPr3c!$+hc[&%rBZI(NKd4clXL
0@lT9h`LJ`r)b3k8[2hQk1+%#*4d1QL@CMe0MGT!!09kjSiTPFq1rC+cI&8lGfE"
8-Y1d'4Y,00KGTF%X$UFdBlR#EJja`YZX3mUhJ9KjV5E6P!Ic9CR",j!!Z88ZkIA
63AHVEVHfU3d8`%RH1LS+1@9`h&'+dq5,R`M!qqMj8l[fSIBmXm4!3j-2S9%f*J8
Dam0(-B@A-&VbG4)M[SUc%dMLMAG4-K(,aqrGqiHM*hbDQN)B+,DBfplPVRp*L4!
d,rkm3UQ[VdB`XDdS`pMrHN0j$"0V1N[cEhH%A[Eijdp08iiTpI3(SMIAmc!k0`p
0fkKk0bM4B4FQ2K(0Tb%*hNS,4!r4Ck%ZCX#!1INi)lE6NEfl-C!!b[NEhFYqK[9
TV)kj1l,GQdVeM1LBapB@iNe+)FqVHJAep%pTGDJri+eVq$j3K!5Cl2C`brI,*pX
2"D4$#e1SaPfLcF*VY))(r"@Fq%Fd[M4fCk@TEbCU&RK*PAAeR6h$e+TQ'm`brFN
[LHLj)L9AGpTh)Yeq"PRP@2,C&TEYT+6k8A99,aZEN!#h'PEJ4SXlYamaB4Ui@a(
VhZ)rB%!&2q9l'-b(*BJbJ'T8N!#,r,qC"PlF@3%e$CKGCi&K2ie1ih43@3,ThXr
[!3dqr#BbPQ#9LLZr)#K,cZJ@!$YH+k3XG`P"G``r&6QQ`pKLSiE'2FQ55i-`K"A
M5fMmPC`TC15T6DI8`S(-AXQ["Pd#!D'@Z'BFS+5K5c-@"QFQeYrAT&YaFC[#2dR
Hk0iAkYNKGdYKS!AeY[SF%3q4ApFK6KMf6@bhrMA5qNaG`!J&6IKpCLU(blQ2(,a
#6EkID[iEeFqh(pB#Y1VGT!c+raUfH3f81@XEZJ**`Y0KD5,Nf@XA(e3)3(!TiPj
!A8S3ES$af,H$',`4CZqXF*-)I#iRUB+h%ha-I@HGMNcUBX#mh3D*plk@LHJP,I6
lXD+3!*ppE!9"&djYc#&aDkdf3[E2i%bTk)A0RBH,1,@[V*Y[q@GiTl!`i'Xh+lX
U`X*%jY*L"2[[L3"18aV5rpVSSqCi9LZF1Q@aH-Mq#9A"c49+Fef29jTmidV&XUE
Q'6$9Q"D'PB4'G@,8N!"QFJKKN!!@(38(*6@R-)lGQE'ZdXrL0j,#!Z-eRcrBGHF
eZf`a``RjTYlP[J652C''R'YS&833G5'RjBUM4EQ8i6hQLQfA)jVND$j4r`c3GSh
P0kTjQY'QMD85L0e)eNP[[fPmma"GZ)f9++dReXCEl!QZ+$IlA"@4Er8eZjeKRSi
'iRecRYFp-X@Xq2EG6B-ar(%Q$Q5"8*1!8mA,fP6T&GGFJ@#3!&!M*p&`2@D-`X4
&EDY(p4+9*9fjljQ`&#j33NkDha)210&'#ZLf&@U4B5LaBia0$'QGUjr$D1C[&9%
JaceLAI2)*E"Sr!"#$l![@QY[fhlq0YA10m0R'aZVMdBLLGLp&X"2CXe%CpBIl(S
mID$Y+a(k&2NL5-Ql0D!'A0cXC&mZXFmjkYGHD6,QmJJ61k!m%!I3UDTViTNk#Sb
U10lb,0R-D@BTXQ`fkGV--BiAMKL*A4&ME(lSNjG5L$4`r!AHY6S9+#q22B!A2MG
eN!#p`@53!(S`$Y5(cH$%0S`B$mpX9Rd)G[qmp*4+K@ZTb#%9'aICGU!I*qk0dX5
mTqA'DXAVdF8m"p#ZFTQ*@6C+l9kS8)"AF11F[R)$&kUb45,Ge(HJ(BV14jha$DR
2lZ)0XNl1m&Q,,(e4ah8(VhZJI8YM@QE'lNTCZm-5ID%d6fZmmjpH3N3ZBC+$`0e
4reG%J`aDBre&8r2$P8FrT!9'C9+#--*iM06DYQTH1ZfkiR@2Ca!49MfjD&pMU)p
--JB#j"-SPaI80P#pT,1DNDAI$Lc$Ve4mNXk#PSE#YXPYiZ"'NFipV%2JfRM)T@2
YGaC0X8QcD&B50%E(iRE+k1-E6aeNd#)(168#pdp(@$p@kjXm!-hY3JG(iE44%jb
TY6$i$"NaIMJ`MmPGIk,8(p&I(M,FpDR6@+lPl$H-J+e(21@e"#6q*PR+Z@q`)ZU
I*Qr[FdKTR3D-VkR,Iql8PL-'c!S[#jkD6-Ib`3Mb%8cjCQPB'5J*qDb,fHD#391
6q1Z4D@jrkGMZX,IKLj0T14$1,ETQ9()$X@YbN!#1XC15$`Y[krI(eLXeiIp%pD&
jDG"DlHY43lQeUA&2NPb1fKmH3!D&$dVbP'd4U&JD4iKDr)kqT9"pf0N!iPXp)ph
B)rL"$j+Z1bRIqVNZe9i(iD+@TB4HX84dU[RASAL5[Aqb!@1rQp'e-mk5e`+4[pp
84TV6HSqq4DQ@4%LQZHre5m&c9DMd1*B90eIcSjT9-SUCZ(+*6&-VqLCef`eTq0S
00,9alS%&V#2HU0Zf3%VEfCd)NFf*"-hHFrIXaec&,GPN&2,"BK$(505UJ16MbPm
5h1pCK)16AeQqFTRq6TQ6bZ2B8'Pl'Sf+!mqGr1mhe45m9+LMjNF"U1c-[2j842L
r%U*21Sa,HMEihri0jR3PcS5kS'B*9!"NH8`Q$UlKa4,$)eCDF[8#I$U#+8kB1Er
44+UBpFiqV&d,FP48B4rMhJ#PN!3"!!!`!%!!N!U#NJ#3"h)!!#k8rj!%!*!+HmX
!!!%!!!&jh!!"H0`!!!3p!*$cI!!"!*!&D3"M!(d!R`3#6dX!N!Fp!'!!miKF9'K
PFQ8JDA-JEQpd)'9ZEh9RD#"bEfpY)'pZ)0*H-0-JG'mJBfpZG'PZG@8J9@j6G(9
QCQPZCbiJ)%&Z)'&NC'PdD@pZB@`JAM%JBRPdCA-JBA*P)'jPC@4PC#i!N!05!!%
!N!9Y!'B!J3#L"!*25`#3"33!5!"R!31)-P0[FR*j,#"LGA3JB5"NDA0V)(*PE'&
dC@3JCA*bEh)J+&i`+5"SBA-JEf0MGA*bC@3Z!*!$6!!#!*!&-3"R!%8!V33%8A9
TG!#3"3S!8!!F!4#)'P9Z8h4eCQCTEQFJGf&c)(0eBf0PFh0QG@`K!*!&#!!1!#J
!,U!#!!%!N!0p384$8J-!!(i08`U6K!'ME3$X#h)$Y,)b+b[M@dhH@qpUpkCZ*YH
!-3"!!`#3!lUe$)!!#@NUrZ!"94)XqdV)@`lMjA1kK9'1XMr2MrqZ)$NhV"Vi%FU
'0AQ'BU0RDr#XAMm&lZ`,`,#T"L)i6&Fq[H[,VD-C!m8F@8XE1!X!N!0D!!%!N!9
G!(!!F3#X"!*25`#3"dS!93%6L$T6Eh*bH5iJ)%PZFh4KE'aKG'P[EL"MB@iJEfj
XH5"LC5"`CA*QEh*YC@3JEfiJ5%C6)(C[E(9YCA-Z!*!$EJ!"!*!&D!"k!(`!YJ3
#6dX!N!G)!&i"*BK18fpYC5"TG'9YFb"hCA*P)(0VDA"`C@3JBQ9MBA9cC5"dD'9
j)'&bC5"ZEh3JFh9`F'pbG'9N)'*j)(4SDA-JFf9XCLePH(4bB@0dEh)Z!*!$@J!
"!*!&A3"`!(%!V!3#6dX!N!G+!&8"%iJk9'KP)'CTE'8JdPi`db"YBANJBQ8JC'&
YB@GPC#iJ)&"XC@&cC5"eFf8JDA3JGfPdD#"MBA9dD@pZ,J#3!bJ!!3#3"F`!MJ$
J!0)%#%0[ER4TER9P!*!&"!!%!--"BX!#!qJ!N!28384$8J-!!4)08`UE*!!lLSL
+&Fm@d(1X4'`3p5`rIcrXejfrjql1$+GBf'%P+PL&999LjEra",'U"3ZbC6Y1)2Q
3!"m"9#5BqM@mKDIGaGRG6G,)HT+pI4mZ3pc&PmHP#aEjM6KA6jAe#b3m5Sk53El
SG,A`G'S9QL)q"HC1abaeLk9cJ@A[I"3FZ$A+c+Ce3%m()3a-9j4CR+h"Zf9c)KI
FIJai(r!m3+*2iaUXL26-$cGj+&$EM-KaUkHFa@0E8ER-cGETJDZ80pr*q`cTre6
rb@d!N!3k!!%!N!93!&N!C!#6"!*25`#3"3-!4!")!1L)'94SDA-JBA*MD'PfC5"
TFb"NB@eKCf9N,L!!N!4)!!%!N!9(!&S!@`#8"!*25`#3"3)!43!a!1L)*eP[G5"
SBACP)'9ZG'9bC@3JB@iJD@jMEh*bC@0d)("KFh0hEh*N,J#3"!`!+!!S!,B"(!3
"998!N!--!#!!#!#L!4`!JP99!*!$$!"L!*)!m!'B!)9993#3!``!+!!S!(8"2!#
(998!N!--!%B!TJ#k!GB!KP99!*!$$!!J!!J!SJ%F!)"993#3!``!+!!S!+i"6J#
e998!N!-1!#J!+!$#!D3!L&99+!S!N!--!#J!+!#8!4)#!&99!*!$$!!S!#J!M3%
A!J&993#3!aS&!)!!N!-$05i`$e0dG@CQ5A3J8d9")$8Z-!#3!``,9@j6G(9QCL"
KFcS!N!-)"b"QEfaNCA)!!!3c384$8J-!"RF093e$)K)4jPjZ%'3Y'84UmN3N#a"
CUkBQ*lFpLicJGZI)5EFc8r+CIhHrlpZ+2"[Ic,He3*,9cZc*j%RB[MZ6%C,P9Z5
*V-M[(j%rNjr*[0R@GK&*&K1b0bh*)LK!iJIr6PQ'N94%1+J,1hML*hBK,0+!l9$
&S4Cf%PiIcijT$+G2[eNUFK-MbHfpC'm6p0EIcBDF5mJT4aqj[p)@X[AQGIR'*!P
,+@RBhU3A&C159eN[%2cJbH(#&ajm5X-QD0&L4-VGcEkQ`r)XP,P*,SMR)FNFrFA
JLaU$lM`9cA8P820dQ"q1j-RJ+KhQ[L68+ciKBT!!RHr$(BZ5%%MI@aB0YUmG+cH
9Fc#*FlDI2+6+KXfGMlqi[`EXLf[bq5DTS"GBJ&RSpE(k4UNSE)5VZ#(4a%4T(NC
4T5D'+#Hca)G5#DG%eC'a54-U)Z$aJ`C3q')!Y4*YQG#!*634DR+,6CR$@+QN(kF
-V(@SLpVJf!+P0U0c9&M$',E[r55!`Li$a$PLQ,KZKIc2X5Gal+,YACH#6FZ"UHV
$eS-Ujc5-Gh6@aB"d'i-,eVDeLc'L6-mKjM,F%r*FlYZBmf)r3FhBZqB8*mKFDkB
mH&M*CEjpUU5NcqMUMHZl,G$)FrP&YX*lJ%6&V")5fb&&5#AJ#$hRCZLJ)NBKdc[
fS@lc&8+41k84G`VH8bAIPL!j2GVYU6-RjVbF3lRZ&DPJc0[DAFTb'rRhYdi*$'i
YhrbA$q+6*eD"#2hXL3&E#6aS*Xkh8XD5XZL!8d`D3&(YeTiH)j,QXMTfCIrBQ',
QaYKL5NVMZKb[jqBq*1K-Xm!cl6p*FZL0,qj368Vlrpap[%LPH%SI@AC!''TAaj9
1(AL#-@"3aPPimHVhYlZRfC3AeqX$cDJ8$@fJmqd&j*@%XYf`G)B2KUU3!"Si!i4
'pV`UFE3TZ%Vi1,Y29L@qKkdk$`8SRBhC9E-k+AX1V!#*JeYF)Z3(X`,GA!A9[Q0
'IDaq[E"flB1d$rZ$9epp#4ZUUbq"F")bcdZiN!#&AS+9c([M)*1*kmMQF"*$DeK
5eBS,0G(8$DlUGG,@)I*P,r@PJf6iV!k3!+U,`iQMEf'*D&FHY3@1%H!C2CVf%Lk
!`1`-EZQV3EfDc)k)alY-h[lIZ!qhTr,*MDZ6TKGp,[+bNp-`jPQCpEJ64GUkaD!
DXF'80&)2BbYeEc[GB!TTEhMfk&f2mYQTP@l1bb2j`E4mDbafS5aG4rV(QBS,DAF
-pIPCbZIRk[pq5'N+mhpAIXl%CM(qp[IPf*a9Cbj2D@i@qUC8h'a@H[,JJMDNfrH
5e-ha@AMdST,jr-qAljL($06eY9h'+bI[Gal`F%%Abe@eJpQRlELVUi0e"4+H`Fl
,5pZHa$lSC'#l'ZAeThN#F3DQm&#m#9iTh-1AH$!(GljqYG"C`e[Aj!i!N!-B!$3
!!!%F!@J!!3%!!3#3"32S!*!$P!#3!c`!"33JEfBJ"b"TG'9YFbi%8h4[F"Y*G'9
YFb"bC@eKD@jTEQFJG'mJ9@j6G(9QCMS,9@j6G(9QCQPZCcS!N!-k384$8J-!!'S
08`28kJD[er@b"3!X[(9ef5d!N!2`eUkkbhrK!`15,GMbI`'+QqmlTQ0ea1KZmTL
e$!!!#-*"4%05!`!2J!jG#k`5*(CYCpqGIhLhX@ahRMGQBYMCR-G-PQM[8aXM+$T
[4l%R@JehNa3*TD-X)kfLDJZV5Tp[``K[RC!!lER"++2CdY%'ULV3kRe$V432k"M
Y!L@Y5+XZMFQ@d*6hP3B%l(eihqpZpYNLUCT@eIX$$Ij!)b0JBM-L4#&%0Hl9p+F
Ea)r9peLe3(dD1m-cUEmJTNI22emfpX%chrkrLXhTX3#1T0H(,mLU#Ub-SIi1V$r
ATi"k(6EqLD"rqSK63-,!Dd"UNF"d"JTe3&bP4!2-EdKf'3D*&BJDK+N1i45NHCU
q`IDZM0k4f4m'G[@2[Ih`h5l5j3k1$`4@V[jbZ%DN(0MYq9raa&(HBZTdm2RPHAQ
1XJD(EFLEbk*ijaf262LVa'*DY['r,[pE`&Cpr&ZfL5bUMq9Y,V[Fc$ZJP-r"FbS
AF@JTUdh0+19`pYLM1ecZECDaj5#rS#kd"'2KJ(qY9pP8)qTV%D86m-ZIf!p#2eA
c4VjbShi'lB9U!iC43VK4E[TSV`lc2YUTC$DLDXM4,#Z`pPH5fCZSRi@*$TAEHQ`
XG2r+Y6A5mMIZR6iiXM99)ZCG5j`hP6[1fbhcMEcC2K5jkeh-LIRP)pe2TA*(lhG
pG%'&2*)#lf*@G9qj!rlmR1#acl$T[2,RT66IYec1VcqH#kp[m+aSl$+c@#pX24l
46aT(r`8DYMk4l*hTrN@r8-fSE`5RVNZZAH)k)Dj6G,f2VY85kRV5K2SkH+hf-f)
RDi,B%8d51`deXC2f%l%6[LZ,(E0GTGd,Y)[URrMTd3a6%eAi4aiMp[,J1`@#f*-
kNmf8PGlcc2RfV$qfh3iTDD2bdXGYJYL'$L)MYN+&iXrd9Q0UeL&+bl11KeQ(J-0
QZB3S"cGmpCBJ0RpQa)CAI'LiPK@ph#bZbES[3L3qfa-1qJP'0EJT[JMY%mV6I4'
[NLDLkr-bA)PXeeZViCDC4@48J[6VB(43%H*9i%3P"&XlkT*-PBI*DF"54V@#qq$
&T'9(+*S3VPrI20+ljHUe9IhhaXF')NdVY(1V0KqEG$i!bA%,a`YY*GBdMB,9KhH
Yr)fmJ-AMcD@LRY6DSB$,[-Mm%k3R6jLC%I+XBQQIlei"kHB$*SA'ph+DC&TQ&d0
R3))#`X!Z)5#@6PKp0fd1RSmB0*R2D8-QRhNaj!)T)N+cABL)TGh$[L*K5lHlCAl
&j%4Z1PUBUqEQ,cHNfP`J5@&fFJh63QN@p@IKd*@L*m'`6k+UJULmJH-R8+p"MEM
Xi#ZHbV)NU2$K)Pj3"!Tm*pF#Gjpb&53Q`f`lF$!'RQhJ&*e+3f#*5La9IhcpTCH
QYqhlH["9ppYRVamE12+(DhSq9Dc9Piqjj4li(B5FTULJM[KmRXA3*Ii"Ehmj044
D$-eDQ(`UAN2JA0QRR+#UkK#`rc,B-kQ*kF93`K)k3i9XBR9q32CP9DAS$&0!d8M
+eU#JI966E1$XUUT9E2[`2AED@H!+I1SH6Vdk14ZbH8)ZUQpVZrL@Q5+*XTf84I@
8)I)#Z*QT2@cF#H0kl@(1h8I&A&Ap6aSHV-2J'03)bG,#QV$XRQa$G3ULM"rTY&&
G'X+i&IY#T(h,*5k@+,C"`#5#+L8K)bSYPAaPrH9$'RH*N`(D,4Hjel@4DldEarB
9LU'Vh2+b0h98@pKjlY1E2eRTP8d2(%*hRXHM0eZb+Cmh4GUC%!G#DI2@radS9q!
cRX(QHC%UTT3X-H@F6+53!*I-2A$BA"'64c*+15Mei@6*mZVFNRqK+5ahl&RD5[j
EmUc3dh,"Xl,jJZ+c1`L"SN*5[+E@JT,#NdD1$TU3!+A"'#4Li08SH&-qq325'G%
drDK'rI5Vk8,3%4,&D(5U'`Bh@Be0`IZpR3l#I4!kRdTQAU$lTKR%F51M+TN2#@5
LVGEpfVKrX2I%qZHZq%&4eC2*C+c91UjG(aalpf(KqcqE5LD$00R8HR'mIM#mZqh
K,jr60b"@+LRUSZU,VGViS2Xr2DA"KmjdUS1Q1LTlkje0Al[F-6$P6fGZd'T6[GC
qVGICfc-3r12h"b(h2@86NT,Eq0TV[FkpE6dl"`DFX)N1*5P4%i"+V%Ie`2iU)3%
,4(q(8CLd1fBep2Rh'&8[MBjDMCMb2XURErdmfFAk4RqP*l[Q@fr4cN%[90Q@Z)i
DSrSC8%JVaZC`E1R+0jeR-ACdVYT*ArX1`'D&Z%j!Jd#c%`)SLJ[MjDmI1S0((e1
J")AX3UTMeqeGHrSXJrB[A3jqGFkj020kf3NN#Z-)!Y2eD06"rmKLlV5BqP,mJpZ
M`Y,-EmVSIiYZU[HR-AYmp%#Nf2*6epbQ[[-*aqP4rp*#XCNj$%X)A,&Pb6@RDf8
f`2#)rdf`aa)1[YKLGZ9-fVp"G8D&BZ'@JYAlSjZ5'jY+G,5@lGV6R4[@$Jd%qER
fjqm2X,U)fC9[AkB1KBp&fj!!((2$Q!CMdSE$hf)kJpYI%6eTK'Hi3*!!IrXLe`*
pd9'S95jIkb&f-R(8B#a+B#EeT"%IV%ViC#HhDD9ZUEl4(FlN"-UpmJ6XTA-Nr-L
2m3P*68aTjJ3(i12pGeNq2hmT-VJMre&lBE6aUTl'Jl2FEJRM#8N@*%e9m1&i1mA
,1I2Xm1iK$c(E'BT6$l)*VQ`66Qk6b!&TCdc"ZALFYIBeUPXQlAcm1df%cF54&LF
*5BYRic*R"Y`KCq0"`1P@"!e`8aAHRV!f8hafZ1bq2AXVRBP`h!pE%64`4kRL$Sk
l5h&ErJFlmZ2EQKBD&Eb2IUE5dq"U##3kU*YFmfE$66@C0LP9)VGFDGa4!0E3!&&
AGDC0iM!LZa@EXd`#')4Y25DN,D*F0d`d6NXC"JRAEfj)2,j9Bc-0BY!NPbIDJj'
4)libH6KHC-Qd4a8GCN4cl*AaVeZ+bQ3ZlM0RQL1MG0)D$#d0Y#I6'P9d+Y-BR%K
R'k1+rS+8BBX`+8SPZ)0GHc*YB6Im@fGm5iSKZY*MDVfcXXS-RdIN81k9+`#3""8
!9!"N!)X"KJ!"!3#3"`4,!*!%'!!m!%!!X!'B!!%"!*!(!3F!N!B")N&%3e)$!!1
+$9-+Qb3!IiC&X0dj141`a3jG5dj2(GX"&32EXIVB$&EecMiSU&KpE-&ZV1V'`$p
MIe6d[rp[Mr0f9KR'kJ!,Q680A&D0p-'14[HZ8aVX",2c+"6FaH)b3VE8Z5$*F`Z
3!0p[JRD#kG&%G-mTHE-6hEc*lLZ&K$2-5eVUQP++(3Xq(j[6I`6`H[ijkXV6kQV
rRepZakZIr82rqj'@*3+i-fUMJQe@`8JQ[%@VE)a9Y9jE2Q+EYiAYB49ph"I'dPT
-T*5d!R%I6(k-`pHZ'qD(TKRU8p[f6Gd2ZK"S@S!R"-J!R!"-[ISY!2lU#3-4I`$
`SR,K!K!FJS!"JQ*J,6L,N8'-h`a#j")kiZTMNXbp+(%I60pdq8A%+fc,'!#3!hG
"4%05!`!!J!e6#eXJ!`1QB-1UDV-`X!%LBQ!h5l(E@C@J)',$(ZVC`*K9-3YM+VV
hTe1X#JZ*BmLfiRI@!&)SrH'p`)*+Z-9!Tf0)-Sk[fIFQ)JkrkFEqqpLI1PG2++D
4"4f4ZS)CZ+2&'UkSDLHN6c)+ldA1"3#3!d`!!J#3"3J!0!!D!4Z)'e"XC@&cC5"
TER0PFR3JC'PcDb"H-#"hDA4S1J#3"JX!#`!V!#ZJ!J4,!*!&(3!d!#d"')J#AM%
!N!-k!!%!N!8f!)F!5J$""!*25`#3"3)!43![!6q)'9i`)'&`F'9KFR-JG'mJBQ8
JC'&YB@GPC#j,!*!$UN&%3e)$!!#f$9X,8c!$Gh-YCJEX'G2+9FBh011qY99@aMp
[6qr9HVIZ2IrL'aS!!2!0!!$S0Jd!!!Zb,4Z"TIJ(GQIlqH@Y,A269XhI@GL6%@d
lV3-R+QGCfFQZmRMAGd5&i&,%Ii)B&,j%$*hc3NQSKJ%P3S!ZU!lHe3A!Ni8FS"L
dp)0C(qm)NQG"[L$ILXeK[1,pDj-&TB85+iUjFYcRZF,59(MPm@%"!*!$$!!S!#J
!I`&`"+p993!!!3!!!3#3!`+!!!!%3!!!#5!!!"13!!!!*mJ!!%%%!!#"!J!"!!%
!!JI!J!32i%!)''!J%"[m%#3DP!K-'[3NRc)%-N`ek2NN05Jb%$Ii*!J`i!J%(q!
3!J$$r!%$mJ3!J!)N!%##C!!JJL3!%qBN!!R+*!!%NJ3!!L2m!!&!!*!$J!!!!3#
3!`1!!!!(`!!!$q!!!"r`!!!rq!!!Ir`!!2rq!!(rr`!$rrq!"rrr`!rrrq!Irrr
`2rrrq(rrrrcrN!2qIrq3!crrrriIrrrm$rrrq!Irrr!$rrrm!Irrr!$rrr`!Irr
m!$rrr!!Irr`!$r[m!!Icr!!$ir`!!F!!N!1!!*!$!3!Irr`!%!!'!"!!"3!3!!5
!%!!%3"!!"#!3!!I`%!!!%"!!H"!3!rr3%"rrN!!3rrm3%2rrd"(rrj!!&2rrd"Z
lZl!4N!-3"%4%3!lZlZ!6rrr3&rrrN!!Arrr3&rrJ8"2rjP!4rqP3%rrL8"(rj&!
3rqp3%2mJ8"!!2p!3!!!3(rrrm"rrr!!Irri!(rrr!"rrri!Irrr!(rrri"rrrr!
Irrr`(rrrm"rrrr!Irrr`(rrrm"rrrr!Irrr`(rrrm"rrrr!Irrr`(rrrm"rrrr!
Irrr`(rrrm"rrrr!Irrr`(rrrm"rrrr!Irrr`(rrrm"rrrr!Irrr`(rrrm"rrrr!
Irrr`!!!"!"rrr!!3!!B!%!!&!"!!")!3!!4!%!!%)"!!"r!3!!!3%!"i%"!$rp!
3(rq3!"$rra!3rrr3%IrrN!!8rrr3'lZlX"'3!a!%4%4!$ZlZS"2rrp!Arrq3!"I
rrp!Arq"3%rrZ8"(ri9!6rqC3%IrK8"$rlP!3rb"3%!!rd"!!!"!Irrr`(rrm!"r
rrJ!Irrm!(rrrJ"rrrm!IrrrJ(rrrm"rrrr!Irrr`(rrrm"rrrr!Irrr`(rrrm"r
rrr!Irrr`(rrrm"rrrr!Irrr`(rrrm"rrrr!Irrr`(rrrm"rrrr!Irrr`(rrrm"r
rrr!Irrr`(rrrm"rrrr!Irrr`(rrrm"rrrr!!!!%!(rrm!"!!"J!3!!8!%!!%J"!
!"%!3!!3J%!!(m"!!!"!3!(J3%!2rd"!Irj!!%2rr%"$rrp!4rrq3!"6rrp!EZlZ
`%C!$%!4%4%!1lZlJ%rrrd"Irrj!!&rrrd"Iri&!6rq"3%IrZ8"2rk9!4rqP3%2r
T8"$r)&!3!$r3%!!!%"rrrr!Irr`!(rrq!"rrr`!Irrq!(rrr`"rrrq!Irrr`(rr
rm"rrrr!Irrr`(rrrm"rrrr!Irrr`(rrrm"rrrr!Irrr`(rrrm"rrrr!Irrr`(rr
rm"rrrr!Irrr`(rrrm"rrrr!Irrr`(rrrm"rrrr!Irrr`(rrrm"rrrr!Irrr`(rr
rm!!!!3!!!3#3!`+!!!!%3!!!#5!!!"13!!!!*mJ!!%%%!!#"!J!"!!%!!JI!J!3
2i%!)''!J%"[m%#3DP!K-'[3NRc)%-N`ek2NN05Jb%$Ii*!J`i!J%(q!3!J$!)!%
$m%!!J!#!!%#"!!!JJJ!!%q3!!!R)!!!%N!!!!!)J!!!"3!#3!i!!!!%!N!-$J!!
!"m!!!!rJ!!!Im!!!2rJ!!(rm!!$rrJ!"rrm!!rrrJ!Irrm!2rrrJ(rrrm$rrrrK
rrrrmrj!$rRrrN!-rrrrq(rrrr!rrrrJ(rrr`!rrri!(rrm!!rrq!!(rr!!!rrJ!
!(r`!!!ri!!!(m!!!!q!!!!(!!*!$J!#3"!G"8&"-!*!'"e0PCc)!!3#3"!G6C@F
c!!*r!*!$"e0PCdi!!rm!N!-(39"36!#3"KaKGA0d!*!$!8P$6L-!N!@%4P*&4J#
3"B3!N!-d399c-J#3!`&*3diM!!-!N!1!!!%!J3!#!))!!`#$4P*&4J!$!*!$J!!
"!)%!!J##!!-!J`#3!b!IU5!a16N`,6Ni)%&XB@4ND@iJ8hPcG'9YFb`J5@jM,J#
3"cd&%i!!N!-&05ia,M-`05ia,M-J3fp`HA*TCfKd)+NJ-6Nj-#dj15`J3@aKC'4
TEL"6HA0dC@ec,#"*EQ-Z!!!mp%&%3e)$!([3%&804MB5!$%clP2rGhjIKQ'-daM
6DD6N'Q-D3c)c)TZ6T4'553M$Q#EM*#,k8+k+-dK*Q)h)b@+aH3-%M)JDN!"R8fT
T("!5&*T55fNHfaHSZUM,ad0U@C5kP,,mr9%U2)S83`LC[qqlGfEZK%$4YpFkkja
pIJ-EV+FJ5T!!"%%3"%'L'P"GTCqYqq$9Q0%C"Vkr!U![a6BfGk$4@63@TX3rMrT
3#cR,I['[PIf$#d4pjhFb"AAmT,+IVl*aN!#Z[X0'EE(FmkjLXqi8B!ka`[CUClr
hf@fRZMEAr"R'cSkDbUl0U,38MF9V3Q5Skepp-&*0br+BI$$hMXhkaIhKe"d`@AE
pDe4kUX(A9l4P@YBfDpFRU(k,UQ@ScUEU+[imf"mU((HB2`rfTaZT1KY'BIHi`mA
ICa@FArD9-#$@Z)EZqRdi&!Q$&ELcl15VN@R&hiFGD5f-c#mAc4EdaaRi$dUUpiR
6Q+33peckDHXr#!Nr)IbNUrB*jAIrZId1ke9I'ZBU3lJde#RqZHQ2&CfZcVh$fN2
824)ZTFT"aiLel(GPfPTbPA!+KeXGR4ehD2)"CaJQ1r(N0@r64cU#FEkd"893Rqe
B1q+l9IL,0m!NUBQ81#dD4H6%p+CHVjGqrYMd4mkDk9ere$Zf`Lh#cjEbkGcPQ%l
GjE&Zah6jU2kKlf#IH,,S*ijF5kj)9`T[3(Rl4!NC$Clff$mSUGNR,*Gqh[S"*[m
"*[q"50IpGEI3XP[qi*4SkTEjNP1b'UaP0aLdqNXAq#Kp'JPEI(ppc,TiK$k9aUj
ArI@akB[2+[X!AMbLkEVmHP&afA@j-&mjGD+NVTA0TP@R21pk8P`BiM9iKVSfkmj
Z913U&kK8XDP82TclDrf$Jir(h9a2+Zi-a+i)m4rpSMiCiL*"89Yh$4Q1bUj2A*K
NdSaU'3SD8pRhhbR+5rL`%#LDkeGHBDGc$QarZmTkKI1qCY1@iUFK0JQS9j5A@"q
F0HZpAiS!Q#+J$(@Y#kH8NB-`K4HhPEpU'djp%dY8h-R*+YQ1Bc04"!+a*ijU-ed
$9eD%cFT)e`lPRDj(P@1+66&e[3IM[mR(K`UmjfZXebd4Q&$1[FUaQMrrISN``rJ
FUM&TPNI1&@1"[bm5)GYV(frf,R8K3A&4b9-0f'bqHNRCpfGNZ!DNSA#Sb-X6`d3
B,#p%N8i+8c"CYM+Uj$8,$2R#AlPRe'CpHc(C4-`RAY8F$#$L#iXLkGZk,keSLa"
[aCH'bG8"3*d+@Z)mp4+VMVPrK3J"Lk[,h'lQK)bJ@89*HJX(Pjc-1EL3!,M""&V
60NIAh3Il[&i2LL)8&%88YjdXUDVXZPY**HrKB,Fqk"1l3m8EDS5@bTB%'lSYa8p
A#@[NNih9NVAc`l)E1Uf45+4XipUcmNF'!+T,Jr&,8L4LM542(dHfccS5pKXf(J8
DAjSV5NJqG*3q@L29dTiREcKlR5(rkUIQYUZ1d-Fr`I4$X3eFKVf@A)2V`PjRlSA
LIZpSei9+-bV6i4CiDh-0I!M"E*dr0lpKEkMiZ[b'IAMY#Z3h*-eVeaD[,EF#iHc
LkiVRH,ec0T1+e-Z&PC)2V02Rc6')`5dQd6A8pD@emURRmJVcFM`)DUqALcf+@ST
m46HMk14rj0QkMRFG9rUqM$kp'm8m[8qYVQQfPL8l10S2qbX-iC!!CQ*@,pUX@3$
'RCTIGUQBK$GYm+5h96ieB,`CVclMfZ,9Mh-aT58b$3HE8I!ik@4*9"U%#Yr9GLX
8H100Ga4k[f2FZ&mSIFNA&5@fU@X%"ST3'Bb$iG"qkBj1BaNG+GbaCla(rSf2[,K
l4c,SL+3k-UeipI$D@mpY&mCPp-UlpCcADh`Z8QPFFHXjB6(Q&kqHX4P,cV0QKJ3
U+h&K!!90P@0Ri'GTF8((89pVC,Aad+'9S5BZeXXeh$TLM!#"P8dXq&PVV63f&KH
FLJkG'mb&H"XLDlc2iUF,%Id5ld3FkH+IJhfqdU+r*eb6XqM[1,CXU0*idVX'RF[
i*hj-GrQBlX,%B8UJB0G-lZIiH6pqp(hmI"JrfU#lTU+rIef@+pU&EmMSi!)DJi(
9(aE5HbA"8d0!hE$0DXb10QdE-GS`p3&A1YNbZ-$B'28C03LihEA'HhIBb8`!8S!
QDkB)hAPr'S@c9i`3i,"F1%@--F2$4903j,#-ILj'KUJf&EhLSH*1N5VkQSXP43U
"0k2VeKS$Ii$Um(8F3Ble`5F&&r-J'f,K!Xd"&2GB2fN`-'#aPU%)bQrG10S!!e+
1#iDlF-I4leSheB@12STMQkCFcMjAMd)miErKXPE0RaTMRmlSRd+lc0D0fHF#%MY
6,Ya`a[FS)hB,U+SjeV*'NAh1a$&!k2T(XG9(%pl-2RI#cKd6$$2Ip*heQE')N!"
eihc$`i2#r2!4%I,CV@9Vcc`m)[a)iP[L%aQ@#eLK('@A()C!6!#G+!K8A!$cVUj
(Uafq@kaPefr$iMkDB2"YidAdEF1@(cjVB*4ZX@[SU3(VaS'KTrS`r3X0KZac9M-
[**UDDr$jV@93%SGak(VVaZZ(RMS%0"FQ''+,29l,#ehlTZ,!`Xaia4DkaMY-RAj
DfURbE-9aX&kdm1+3!09N-S(H,KFAZh%4BIX++*!!3mD0iETk"aH2La5-C%-rH+1
e8D310JS8Jm08MB*B$X4PEb[(UUeDAA@,IM604j91P$'QX%A3iD,rR`p$$(A+fr'
L9bTijD*66ppJYU0mFT%am`'N$AKDS-M299aJjK5![1Ub*mhA!%DA9eQjbJXT1Z0
V25ji-eqkZR8m&mkS,Vaj%4F1U#jFl[Q#GbNRK,`A9FPK+49N&hU(LelKPkI2fq[
Yc5X#H%k,G0j2j8lK&-kmI&3N)HAp9-mJ,H9#@6CA)j0N34&1%l)#,GALDd2B'68
Y0b3940@PA(!8E[rH3K&+8N)pD'BMZhHrV83l%8d[0i6p86X1Ci0)+L3AeeD,2Hq
L1-I2Rj0(29F1Q[9Pp[*5LejKGP"XPRTBiVmEKRP!1(fe-YVH3&3k@D*4dE%P%#`
N,MK&0Vh8qQ-P(EBK+NQpBk!SjC*fHT[$1'mE)QVM6#9P-bJMffc'ZlFKSf"FV&@
hZN8(a0@15T-R"D'9+T8[e#,l9#r+NB&F24a!N!!lA8-6`mNDS!jm)+0eDU8!-AI
MCai11@dPR(N`rUjEi#%)1#Mi'"p(P1C2&"`lQA5*LM"jm5"$DRVS#Df&e-iV(J[
3fQc6HA05dTH!C8f*bkF9,La(-8)+PdYaaBiXmHSj*ii,CY$NJ(2)k0VM40!i282
'NjaGPTc("B4hkEd5#021a83hIZKV9ENRQ+9mD45&U3VP@kR)RcFk,f9+YqBDVGZ
1'%rHfJRJ[@$L6J$[3`5ZYa1i&U)V[[(*4QcXm41a`(+Ai@3*-QKRj3kae&SjF5F
jUqGS+)DbF`H@F*`@&1pS`J)T#2*G2#eRf1$)25mi!k)qGU2SGUf0#@bXC5M)F4c
dmrAc+,)X,m(&L#r$@JC`1D`5C(b#Q3*#j1@DD,N4f49CY&KlI,&$aMCpSfCpid4
AZkpe3-K,jJAlc-%%$UI&p6+T@BSMH4DFX@RPDZ2*j+@#5Q0f-N$U3S3rG0fST4J
jN!!kI+dHmd%lYYr*!CKFSNEUiH!h23$f3I(h-K!fJCR%8F89IF#S"6(L&INSQ-h
*"j@hZajpS%)S!(Y)9U8cP9D3!%99hBJ&L#%Cb32RSPmm[9F-!&N0)kXq&Yp84dB
!Y`N**J"b-3DX9m,Api$m[)km82`QMT`AV+2'm6S3aBb0E4%MK$P0aFC861DQK-f
4[`4apjhU,,l2Sc1Y0mSU!AHrp1AHSr(ZVp#GeVX(iYfjk$E,h5mQ8,M4EGHl%bJ
#k2EVh3N8)34VE5+"J&3Y[IpHfBc!d4LUVdl,JR'c&pN,*L"4M0TaFE"60*'LXKX
CK32V&h)%V8kmLUYc83i+jjdY$S24I9j!8H[!M`,6BYAJS[8,JGSGE8+dZ`[U8LN
V4XHC[IfqY#C#@BTlrHd-9TdL#8)&G"dG"$TF)J3`c"f+&(VVk1VfS+X@U)aZVaR
QT&fk%QR%PA%8#D1JbP[MDleYC$e8%a#ThXY(G-4')&`'8q!R30S@rBY4`bCPk'#
`jIDQj1[VGj!!#8e-Um'9-8cQ*S-CT%`TVi04H`8l46pe&AS*C-'B'J8j@eqN1$H
E5H4`*(3E%j!!Q63Kq6l32k&)c!3L19BDQSQ-%@3mhQCNA['UYPQHCqB3TQ4leGZ
fkBLFS)`meV`R0ArkI%2pS0C8rlCYM+mahMeQ[U&Um"`E@eEb"PQ1)eQq,-Ad@22
"SbB6-EA*G49JUd(TV,B098"KG([Rl"IA!l&@lHZX0r&Khbk62rp(`TaX)A+h1BV
jXHEEpTK-hRl0lqKFIQ6I2"HZKGfm"5m28qL2*jJ!ZkbDU%6(6&E+f5%80CM$(CE
$BQ4[Nqm`EiCTMUQahBF-KdNi$MZb9Zd9jRdJ!b%Ke!&*Fp&B'+*08#P0-"f(pSQ
FcHJHNd#rJ3[14G%%)K!&ZUllI1le1@TPb,[1Nli0E1Pp##q,Yaq'IC1h&i'pVLZ
AQ$P,CfD66#MPN4855q3[V@5J5#ebaTAbIKKB,rNLDhT"YT!!+@P4Df&[q8&chT2
l*DfF`3IF0!GRPG@$"IDH`!m8PYkM4AQ@0Db-pCBRUe'mmfE[L8S6+NrdRYMRY"6
DXp"4LJUZ&2U*j0%-4FMPk(b2N!!bqb`If6I*N5Z6BUiFfAFQJZJE!(9Sl!c2d0L
PeXcY6PiZ4r3`&ii8&lbV*++DmT)`*59l3f6ef&iqp$!bD#*b*l*S)KHUj0$BAXr
3#l8i,P`MP,8aAC1L1lD0M1hYkA05f'[d,K1MLp4,Ed'jH)q8)4"GKK9@82(Cja,
[)10damM%-+XE*f-,FEVXB--aljA`G5Le)pE+&983pHfqeZL18DYA9'e$apMKSC&
HFq)3Uf*!@j!!ieC2,5R-EkJ3&IDD%AA"(,2pKQl(SVIL`m3GH)@-$eNUK63a&#j
&PXZR#A0je,YY"%YB2FF`1,cGf3P&!1"VB,Z6!CLeF)1C9%X$-QQAf-A"HST%qi5
CZNd8ADkH)r4Z1hHRPXVG`m2l4AfDPfMC#3Mb&BQ`"KqB2Ej#4H1$F$5JL&k6q!#
5m,KVK)k$PMpBKS4j)XJm[Xc#dSBQlRc(`1S+'bJk&rAqIe&cPa[*eGal&++XCjC
$`Y[P%VD5C!Zkh(UA`PeKm`G!`-QhSYbK(1`,5A,fJ!mK5i$0X)@lpqLHeY''4NR
H,[q#V@5IqBiX@ZK4I@)MYK)9'U&R-KbG#ia,C'"TG)-JRdA5JQY0-!MFMTmYZ0T
&kNplNXc6%m-!h[1hiI0B'!53!-4`Q*FaZ+Mh++YMYq*5c'63Dm+28cBCr#HrT6+
5Dp`,9%hKGM+A31ahMFK)S4L+8'E8Q`pffT[0#cf5'DdJ3R!L)[Ad&6pGQ59h!(5
P3"$TU(E1@p2VV,LDAHK,pcS"cP*+a8')IhK,1E&BIEdiS%8jk,56L+EbeUl*+9M
,9`cCK8,d1ZHKf'6pFqKqIbjA055)%DH`i!9cB*-Hh$Y2P""M!LP)ipcVfcMCM)K
NLXbKp#(''#iNTX)hA,@)&YBX"p$jmRSPhBC+YTZhm`KC5609a`)P-Jd'U5GB&'B
!VUA(%k+3!!TG4j)DLaE*qAD!M5fX@P0b6L9VJMi8c0l$hHV%)rN)e'cK3l'J4"*
l2cL*55N@$5Am*4iNNZ&Cf-4jC&([9bHR)qXNa)HZ)f&rC'MD0)dB!JS)JTNA1@f
DV351U3ELQ`rac6G85j-*X%1p6&e%C4beD11E@(h`a1kD%$baX%PR2j[([Akjajf
cZBFY9M+MHY)m+D"@3&$1fDD@@""9#`SNj!"TbR`SF!+6'CkE!%TSN!$3k'YPi!*
`Sa!#fEMhCR("PU8`lR(@,e0&I%Z+BP5UVT2mC9I$*NZGm+B[*ee4%eaRS#j8D6%
MHViH,h[b+$jRK2D'B9k+(kj0ASUDqA"lRI32PM31Pq*P6r,R$1QV*)T[TNh8&`&
6kCE5Nb@b+#J`*XT%dP!++6ZUY)+G3NU*4h3p3BAAPZ+eVXc3bcqUmI@*YV&C09C
8S#lqF(2BbF9Q81khGl8GK,%%PrI"L!ffVV&Ur[3Y9p"q"Ujcm8M&513%$0QpZeD
*%"S)VARNR$F(qKYRMlH()biB13U94eKe$p&@[NHiS4+F+c9EUq#%4%Jl(AQ*VS4
`f"NfSGZ-EMmUD4(#4l0P3)3N6f(+15"j(#1hM)J-3PCU'K$Q+c9Krbf-e'6*21J
0[IbCl'jh$S3ZSEML(hB"X1FVlr`%KE5$M`b+P'XJ01T(JCB"D32Qm+3&"S9N#JZ
rpjDG)N1mqdKQb#P+ACRT'C@jf,S8erXLBCL@Hj@5Kc06*d3JDM*UbDU(Gi+1Vpf
BNHbiFkIi5[MZ2(I%FHTYF6SUiE2rNCf`,jC#`0H88c8JmMkdDQ%Y&bNb8c!iP3[
fZ0UeQSVfS&)*#ibfE1"VeUT48(IFelI`Ba"[@PBdK2fZKR#,0U1cAbLrAi[L5Mj
Q)%)%*a-Kf&iYAS[M$Qh4rNrh[)KS@k[miXZGU1aimAqrZ"q9jZLHI5!D%+16dDG
"EL!Qr6ml&+iXqG&R1e#41VlB[IG(U%3U+rQ!Y'22&j9FDGk,'PH%rJGf1PZ$3)k
D,5q*Tp'SV-Ab8QJr9&UcBd6c1`FX2cc*aI-D$$%$dPHS(Z#SP`-0MJ["D*Bmi3%
pf)iU*8X",ZrkLqq[EUYPT$83EVH-(!b%RAJ0K%[403!L$+'9BPZBZM8BC*LCJ8V
)39ei@XlF9*%SRdp2bj+MUXqENhjF%CUI#"+jk(fGc!kL[FED%JL,R2NV4(,'U*m
S80pc9K!lqc2-GY0fC(5)3GU$'-6%$!+P+!2(Df9QV'cRU9PqBF'1B3YHk8TcaBL
m`"a0[6$1G#N$NZRcCM5HHKA*Y$h[9D89akiA)VKS@PC``@MR["Y%!!hk-N6(``K
XdGjP4Q#RLVqT1BD#Z1[iiX89BL24@P"J#6%k!pB4japF(M6M+mA,(cC2l01FAAf
D4AE(pH&+A`V6D39EaB#$[+!lSA#,PSFjFp`HU4FGq,NMNJGQlqM5,#2HGFP3Pf#
Qh*8R!PKSLdiBNiSKS%N%ZL4j%XUaFM#X%"p[e%+fMI%Y6%*jQ$2H!6C`hrQaU)V
X&)hBaZf5NZDZN!!@kNScF[jFN`IL*JL$0VN1+-S)4BS@bH+k%8G,qFM*9qP!2Ke
SS301H4*Gb)CKLp0GPQ4Tja)3pba#SPSM,&h[hXD0eQ6dTBP!8@p!#,Chfd5HU!8
6r5jrSN3+)F@1a!0A2K43(A,hF+J8$-"('dNdlUjF1E(AF',(33E'+#ifSBKJ%3"
!#3X8c06U0U$Kb!L#fkQCR8Z%"-$F(h%5)jJ9@p'I`!cQQQB!G"-A+4)L#a#CLri
E1Th-+MA0LF!A3PF*lf15PD)Z&RlNZdTVZ)B,1Ad"N!$CQm,Y+dBq!m&)a@$Bl`a
F9kE0F$SG)ehZ''#L5GhX551Mj[6HMBcDcFDQieb3!'&"-i2&e'`&'8BI"bkC)@,
EbaH(1+Yh0fAe&XHcHMFEE`aQ-cTF5aR$GZm%('caINjAhd#@H0*[q2U[L-5N#pG
VSaeXD1#YXB4RDHY!I'XR-He&)c1QTSC+AKL8!(%E%`&1B"-U6"'INc!))5%"2%c
@%p'NM"33*KNBiUhbD0)6q4*pHKH0*4J8G-$)&Y!hDJN53"-YfNQE@,a[d)6pX3P
$e*r6-Y[Mbj3EhYAHaTFQd+A2DG2%mVEh*1bTA"KmR4FL29biq6BqY*J$1aSbDR(
!8C*J+*VXBK,E3a3Ja&c4$(fb6Kq6f(16*fjH)8pq5Bq6[jf0!$!mTQ$)+i8"Y#A
@C0!biKH9aaQ82j8P0e6,kj!!QiceRj8EUS8$8+AY-,pGDH9#$6)FL5BdAGTmcU[
qa)dXN@(,1pkDY1!$0A2SIqKi+mLS6*C1llr$-$hp2EP"hb)QkN4"`Xdi[*X1,iS
9MmL&6pi32Rh&ahN$(*f*$La%ZG,eRJH0q(M$SNrkB2SYqZAa9XXD,[Eb$LHEk!V
3kFdT*JkdDU@a6LaRe3#@N``GK`(biIY6QXr28j&9@99NF$X6!9(6%lQjM$0)@(9
"`VT$&YDF!lU`,,*!mZj!jU%X*Tl)Af6Kp)j4#fI169KkTrGhbCEi`@PX,1KG`8*
,AJX@eSBZA%lf*+cemr!T1b'X$@[3JF+,SPp-A6`EcJ5,CmkNB2()$BKL,!XJkH(
LVhi$#!e-XZ,2S*hC6bD*Fecir,YK0#h6@RjSSND!+Cp8-BJ#L5e4+FLSR'LS9h'
pdrU4ic)Dk8TlqFVeq`A)VYa9&ErlT(`kLK[Ch0Y!"J!UJ&+@#6mU6DLJb&qc1$U
McVQ'j8FUel(bIeTPj#q0&jKPLX!Y4mhD!FXM`Uf)C,B[a-@mA!`mfZ#id(3"*V&
Uj@f3!0rQ9Qfr-Iq%Yd&dS*6CBKGII'V"kpTRIM2D#G5Mm)+0`hba6PTKf(Fc&Q#
UL,JLKH-S-a50EIj"LEAb"4K8+Nk9IeTFF-YL4#6qb1SAGQT()F+K&hD#!!f"h(4
@D8ffb&fbbHl'BDK,6VN,"biTVAb0M!#lb[mhNGI&MImZI%)4Q(liVa'P0HEFmT!
!dXV'3*!!ep(KIL-hM03,Z*`3500qqAUpI-9$KC2pLi'QMaZ%ZQU6TG9VqTG8VHQ
r(91%`8Za`1a9Ld0'2Ja69KF&5(D-!HN6IkM5LiFXe3"'95KUKS(4&6p@ZH)S(eZ
ISarcUBj96ACXVRiXP6MQ6-HDA-U-K1CG*Xii4)APl%(m*5f@#e6K"V1A,'I,Mj`
SjmiGqelmJMT6VV0*[qX#'Va+XB+$50M6PpbhGiHFN!$ZFVQ1[92'6IT0ELDC1E#
a6-S9D-C+"AkM6R@qCadmF#6V9(&Z9NPflK'(6(c$5,lBqp+,1K,re*!![+8M'F`
q09Majm(L`F1-4NE%#3NUPeQ[f2@+RbSljB3@&4J#)k9r+Y8r&HXG0LjHCi-bJR5
RF)!CLSH1bBJ(PiM4b&C94qh+EcN6ka[&NBQHV8*ddhbUde&42ZJS&k)Md,RRdbp
fIkTmZDm`q9,ik6eIl!BpY[,&LpI,#mhaC'$+9"$Z2iiQZHEckl43j$!Ak3'PaBe
SKj@Z0`PPLBdZ[Fa4%dJqqQ[QlQS$#A!r)RZ)brZqV',FKQbcGaR-ES8iHS`,5!i
CQ$L&%FVSaKb!b(*c6cNUE%FkjB9-pf3!E@N3@L1KAFAER@a'iF3N8URb#2@B'1T
$VFP[G'A'b*8l!9j&#-&PpLil8&D$iS("k!S3b4rBD%!@ilbNqCKd1+FGNkf@Tmi
*&LLI`-rdU#A[[N1Y"mS-EZm6)(k8`U(cdQf(4BZESYqlHaPd[TC9mKkBjP6f%6f
`8D#I3FTKE2Nk`B[cC(2Rhi3MqU3F6,6`rTLi[4D`eRr0cA"Q*0hR*,l#l#%I1ZL
A$q8XBF(9#8G@9-Ur(*lTZXaAIR1B)cNa5em5)VRT&Cf$a6%Z&R+#)[BTjFRacd'
pb,bi`$N`G%a@AH6T)#%i1"&dPK4RR6SX6`Z63S'Da%$Ga1,UR3KaAI,dX@hGd`H
LrL3Mp9LXHd(!)PKN@Me-cL$)i3LZZ'$4$J4,Hb4mN!!,BHJB2L`X,TM4HkJ9iV4
Nhqmdm"*JTPVl-ZpZ3bP4d!5mie#J4`[J*UlR"59#ELlH!Y1-MC-KJQDGkdhkF-Q
9qr9'C,LDA,N(0VPJ8Uqf[22M6p*R3pf2[F-Afp'JeTP#"VP-3VF*Y$QPI#b5&6Z
i-ZXE1KLCj[0[l!84cfiQV9a[FVGb)fIAQe"mhSpN4H`i@0CLPe'&I45`,BNVQ2)
iA&[Fd5Th-[&F*iL5PGrk4J(4*UHGXkhBF!",F)Ch8G#$@#fRPJ2G,C++M&)RiQ"
NEh5d%TT&)%!%'KN&6D!'#HCflcJN'$60B6(Kd(-!%f#qQVR-I0FNTchTGi1iF[d
hQ)+6f+0&4P`kbGe+SRf6#dUq#l2Cd'%HjX)jV,-*9-i'X-RK)m9(()2ChEP&$V!
CB*K!6"%i,eb0`LB,2pPh@i9haY#2@'8K"@J'9*99lPB3*fEEQQX`a%--L2f"$@$
f5+2`bd[jJl`8CrEp!8--Y%eK3!5SF5VVJmN@)5Ll!-$SLjTl"SbMF6hh50EJHpR
PI,&im-qih0jdUR$hThX+2pfYf-$DRqljY2$,6emNK%j@J`d9)"$&6dTcFY%TQMY
BEQ-6AdSc4`S6+[iBfa((RmY,XLUiSPS3-fc5&&h(i!r')*%!Jdpd@Spd[RfUZ1*
8VTcSd+`l,8l,30m8BAB[ABAVlj6Y#DhJbXEGdZIqGcCY#K%S%eSM(k%06Z[*(35
qlaSS1%fb%0%d5!lf6b(+&S#0XN65Ib+Va0&j*,%!HF*KQ6QJUT8@!&58kSXZM3h
lm)VM52D4`BUJLajZG'[L3$p34Y'MaE9A&)HCV+biD%)%$S,99RmX0[(X%L$)+V%
G+Bi4ech*M*2U`!*NjMP3jV+r`b"ECL+6%`A-bG$j2e,b3q4#"'XJA!0`+8Af`Bk
%Br1eXZUqp*kq9UKA[j568I4hq4$%RYqZH*23&6VYm3!eD9SN#f,m+KLGKk)-q3A
$p)b"9[9RU!6j2@frIVkqI9+p2CCVq8pCS[J24a#G0`Ul,m-miVdTl2q(%4$NbJ(
c"3)'`fSiYm3%c*&hj-MK8m9b`ZURi!$JATr2dAmXqXLCrTYMhJdF3FEBk3`Z(LR
1e40$$MHcSJ3CFHF-0pk#!8F-V(*([BSK+ZT(#'e!M[TbrJEdCpfYlj4aSc3A9"!
#P2)#N`3@eiJQ!VVF8!L&5$R$V,C(4YKSBLhc#+@96B*'0ah'KZpXG*hjHK1Z@3i
%!@)%hN5)CmS!XfJ!"42&43d*FH(c'5`-SRIBH*-mTIjBiV0L5FDAK-KP'LZ@Imq
XDifDmbr[NcrY`+G$L[d$!bCEcK&`64XYSXce&LfrCY9EHdedp$-Ye(L,dR6#i*'
*bIba+4`d&c9!46EcB$+kN!$F,+$Ha4$r-$B`Zp%S#B&f'Q!T"L#E%!86J#cRL%c
%%V-HJ5)6U,3q9H0ZV[p9*!a#A8@IEMYYd%50UhJ465LZcA5h@YlN55DE2%em%BE
@+PP99!cR"6B1a#*2E!aM69YLBqXJ5$RL!*Q9%PV!H4BGa%r+f@`+K((beVVLFaF
!FUdEE)X"Gije[A6*F,S9acU#PbF2fi-#Yd)hIlj%KqZSNI9XHCRUbH')3NFHl6j
*(8fpZp9MDI8lqHT@I6PZ@XUe1YiJj,BV(("[8X#"8$8Q$&d%Xa)LL#N`DKR)K-F
8!#bkFUHcE"@65$S-Ki5(Pf0L"6I"Z1aH0b8Q@SiUAZNXXAd!'q+TiX-Plj@VK-U
*UJP%4Xl)BH8++`c*HYGE$&b5LZ[bee`*H&Mj!T(@NTNe'2$Vk`XVk!-PJF0*4rf
4hrjH2e$3f-SLa#,pLF93F,IRla5K!icq8Sf9KqPCmI%hM*`M"FXZThAMUJZ%e(b
SchXBD$'FQ)b+6*4%@Kf-8ZjF1`C-X*48#K6e!)c-C8I1BNMFX6R4%H+1PBQ10(I
N*6V-h0'Jk'6GD2DfG25BYJYNY$,F4X%88!A6%qm9f`Blhcj5A1li)#E-*eQB6ME
+p#$-fQ"K2[Lb,XcD)'(QaS6jB''G,%a60f'DTLT-%`Zc)&LB@6)LbP4-,NUpXe(
F1mEMCc'#`E)5$*BiI"ZTkB%Y#69p60CJ46P5Ubk&1+")Xb!S#Sd`BidiEiN-YM5
Y'#R-M$PYJhh)"*bAd0'8IlM5!D2$L2-4$854[PB8iRcaU4#PU2`20(,dJkTF1@5
J)dHM8cRLDmdraY%3'KiHeXE*U,q@Sfp@ZFTL5H(P8aA)HKp"G&p5I'!`VU!MdNk
Ep+%f,!aN+!#VA9-S!#mK!Z"+1`8J329MkcJ!9j`jPSM8!`ab2*69BB-"J1`N'Ac
SLE`X`6i[bf$Zci-fYI"bBNa%3hiJSZ[PM%,0&3)D!Fm94#+p,-,J5%TIDSZqe"3
LV&k9UV%hNR90d0,XHX4ElMU@2%!Uf3J+dpTAMAc0fB3"lM)KJbpZT1LbRXfB[#9
rd*0A63XQMBqb3TGe'YIVlF4%5$)c$9U$RZ8SG@8&4lR**Ke`dT!!IA,Qh0dU#bE
18K$-2d%`ZP41(DP)k,3)S0R)f$-5*jT+PXF-M'M)FakUYb*r![!HpX3cK[DG!-V
S!TLp$eXeaE1m&MN!X&&L"e2'Rlq)4PmU$-ZEkF`!B&Y[B!2+Pp(#h6+Srp1(%"p
2Tim"Y+a@4Hr-Uk[rP@Y+%T'a34JNV4i(##`6-4-+-r2Uh"K+$+LDSUDm1QD,4X(
)jHb!XdaPk1M8$4daTT3c[S`+Q5-CPD`d*9"4"1-ISS`S+m5kJD-cEZ#)4Gi@AMM
`M%B%IQQb#0b05+RFBp)9XRiXZ63fNH+#"6NF85,UDS*!@e@,MdFaf$+fpL#&`6@
&Qefa1Z"eZeZeP*b!&KhJ+*14$F8cd,VD*kmlPZ%Sa9#B#'#ZHTbaE$qQiDHXHKe
RrM9Cp5K0'!AqC@f`83"Ua@6C2(f$&Qa36aZdH*``fr02U@UMP,LNEp5ZAC+cQGf
23De@q%!LHrRV8jhMc9hU'eZ`m@RDf1*aaTNPV@rQe&TNFjQm`EHLh"N60Fad2H3
CTiVibRJ32kY'$09MXYaN((%UMMK&JM+4JF5Z)bl9%DGD#I(5AZk-C3(!'RS13%F
@L!Xp3)Y-+&3bBUI`kiK2kd)2G$q'M-[YI##KXVl'3YFe9RfM*Qa844Xed8EU65b
L5YmNS(96$Z80[M1'2`DTTYheXS[EU'2U'mfH',c4Ur'**$6JH1Dl,4bJM8cBL%&
#5NGZd8TM'DZP(+Kk*ZVbU8l+3qN)R2(%j25S&`Qb!"e4NjkB9![XVq82#H$jbUR
1)0Kj88)i2A8Kc$%(#f%+E6*C2("aQc90IE2KTZ$0AL'"*q*L[8',$d0kF)1E8Xj
dFV(20D%P6ppLmBYrrXb%4ZUGMPS8f[M&fKhe)#B*XG+f[EV*i'T"i`X,0f-[Vbh
[[1E9GMQQ1fV,RbM[e2KJQJqDF[5$TA+$p`1e"rLSLBmHH1*!jr,$P@m`3&*UIAB
8h3bV#kFZqIT8#mX8qd(SBTV5J3badfiQ8Q%,[rlj-hceh4UL*[U`k*9+Tk8kD8$
+NXUPck5SG&iD)df3!2+NjG)RdRaTPV4)kJfP3S&3GHKS+"+bKEi*l3eG#c@(hJK
0$+d)PBAQKfD&&S9kdkRdkA4GHL#GP5j2*p1ldfI68p,'G(jk8hTYHR&kYMPNGTT
Vc%I0@HCbFp+mfhc@h'DHC(l1A'$HE*jRAQ+HB6IC1qcepZ0fUrf!IBGpMpeJIpR
qV(f0[F`qhhk2IBEIj'rherZ2qh2p"r`lrGImBrb6r2Rq6IkerXAqf4RqM+D-QJa
IaU'-l)b[-RCQl-qSc4LGdC@a)U-XBeh'[4N,-fDB3UC58iHTfV6,G-MN-Kd`IGE
8+hk-RpVbUjV)51VZCA*2k1kEj,Tdpc9bqh4h&,PZhAf$A%9hRb@h4AHI)YHXZeh
XqQISVT(F*ESlNGbCZMZ@h*Yep`9bhpIGDH6Qkfi4Z8EGc50hLZiZ)rH-lMj2EUE
ZVLChUqiq4qj*h9e$EV(ZrT,F%Ghp"EQlG2H(j&ETlJTbfhAhFh*0ZVZFAAZrl[k
!h0YeYi$FZhAhqq5ZeGhr)(H6lUiLph08&q2(`%)p`&dX!$k86`HQk#k*f(j'GdQ
SpNcG*6(DYkT3'3R9#If![1!B!rb+h$lp)`R)lYCG#J+lSU1UMD-Ue3q3!#$X3RF
TL-a,pH1[aDCJRU9[GBB1c0IG"R)rdBmhifF5(9qKSk2J-%p8SCY)"dDVZPkJ,S0
qKCM*[%Gh+5$-1e3ER+AM$PAA+1SD8A@p5PdXJ(pRi4%54AAJH6S3%`#aS6NQ!!V
X0!YJA8aikA[dkBiMGjlZVL4hXhlahmJYd&e+@1RRG*IB0ce*YB3*[)6d'&3ra-p
S1R"H*C4Q1V"AGH8-GAfPSk6%NXl@A@,#p#%9XibMiihk!8VBk8[k`NNJDDIZAL8
hT,[ra'jS0USIa4B@HNKhhb*hVQUEYhLEd)HUVLR8T8i!ce+A8GAe-qTU8h8e80G
j9GI2U@Z[[Uc[dGEIk!GqMCrTG#"E2d$#$ah5&dS"%r,Tabm`dp0a&X#r-2[(Q$T
N8@hjIHk5qP9G"G5e4,r'JAQ"ZZDTZSJGT8p8ejkLVPJ#S+9,%e8(+1LPdDSZ5M+
53G@96ef&q[61%K*0GkH6kp$G#q6QkZi6j"lAh@CbkhAh&A)lG2GPFLfkqbUl)NG
haj!!Zd9h+GKTDHa1)IF'A34M@ILm@"%$J-3biR2GR8$Z10hp+EN0Z[YcFM(FM[K
%"a6R82N[1SL*kJj(9cYdB6+J2k&rB-#6V6Z-DN4hH-ZMqJ9QK(Vp`mrJR0BGASK
6GcJD06Gpj,MUH-*RGZ6QCe@+aj1NbPcP"X-*JRbp)6Bhe`TadbFc0k4Z)39Q%bN
`lhiQc&YM#S`i$HU+m[6@G*GCNrqPPe2PU0Q&Lh9#SUYGG,893rc0M9pG,LB*Ul#
*G4KrG*di)(D,R@+-@#BQ`[e-E%)ML'ZSVK1&iS`i+6D,9A"'LhcUA#FDf[[%8ba
B9)bSR%9PV(B0ViRDEVc'DB9ij@Nlm5V52X2VHHdNAXpT"r$kK@E$kh20KGF2Y&b
mrN-lK0FUE3#[-QdAAKZe4V`fDG9ir9G0`@ZceS(A69S6AVeD+9l$QJQ[2fQJm(D
L5DEpT'V5XVThm$-4USqVHq1NY9$VRX18Qd%bhLEG+aUNQk4jdQaTXE4%@K5k*,T
#IUNrK)3PmN+AT$BSITC3LmJ2AB*V%'9L*83a9k`9Xk3'X83-Lbe3)8e5!1-R+9)
p$[QN%5L69ZQ%C*0@5Ph56NQ$8TP*#0l(BN&m,Ne!j3)R6P61SX*#j'6#3Ua&KF9
i'C8pU*a"C5XUEk,#BQa'j5Y8AZ2%LFTd9&L-6k!5338$*NVASr)++Lc'Pe'T3q9
99'T3DH2%LFSS9&T3'Be+#T@h8!QK-J@"fBr+2k'b&*8h8&Q)bUmjFD,5J-T-9$#
!U*L2bJ48EN,PTj`i8AN@P3*8ISE+#P3QSE)-P9qKBN4P'LSXJ$@SX!"qU624qcS
6r4XadAmK*VUCQ1KILBRQ%420*5CkM*MS)@+L"iQ*PK!6rBfBD#%adGq*L@iR*PT
!6,5)Q1KIL)Qq48bdP*MS,Q+Lf6%Q5JI3E18A6&,[l"2I33F6q#2L8V(@k(!T$ep
!cJ0KC2#"B"dKqhG#pYXBXY$03$CD4rB*1PC4!q2P-V,LJZrG)2B#b4Rmr!bNp&a
Ya1Y0`9DH"R*q6Um*p2STaMS8iPQ3!&lc"Cl1$*VJic6"166"ITVJ"TVJHPT8$Lh
+'er8!"C9T#rUrd*(25fU"Yd'[I[lk'LKEJZpr!"'D3C'8Rpl#jVf,%Ee$3c,M8R
mk3QD6!K0dG$8rRYQ+4-TlbdKIMdG!jqK+MAK0B9H$AKbL$$mR&i6-+kH-$`VJBc
%m$0k6C)`18-AJ)i`2#9ei'9%$NiBaSQEmFURVZq,'AJ9m1Y#VEJ(Y'e'0'`4c@F
&L$bEcd!dS[P9F4k[8@)2AK2)Q54JpQKqRNAp@M0rH+f,aIRD4)bD,Pjl33c3FYX
JT#kGH9r3QAHCcVbVGHE0ejPhKFkm2p5CGlR1[0mMjPe*c&Y!c2YMBYk2L(Nr*1E
p#6([@Q,HkiKjja2crTkBp`CLhYm4mrjR#YbC&,Mh8Z$qG`VF@45iLbP`raX&lMe
ki*j%i2a,dYBpD#aAK4MlEfJ)MBUa+acJbR-BF)3UCm00@J")YK$D2a,DZ`RYr6T
D2cd53X5'jC!!'qh63fCNi`%-"k++Klf`PP&68dYX##!d(2$ad#Ua62Vk-da!@U8
6MR#"d0"@%+mhh,B9K1c2SP'm8A%C-f48+1Dkfl)eNSXKkIc4G3aX"ZT%,KU14p"
`TdiFUMG3a9eY3-2k"JcNrLbDhS0FHrdC%)q0id'e3m+lM*UrVf$A,)K!r8aA50r
JR+A3ZLdRP0crl4&J+hH11GYY%ZXRl(+[0eShPPrB[IfaS[N'$&SIK$CXaX!!e@K
NHFCDaY'2G9[B[(qGe[*!iISe`PHrC[hbkMAV9l"J1G+AL9i(-A6ETBIN"l[)`d+
JF@J9GFqZDSCM)QG596-'6E,X`b!"22$Kip%6*BS,!kKJd#VUX*dSdA*8JpJNN!!
&AMm#qBVF&)-ECX3lTqJ,(ZPa`DjR[Q"jJp1p28b!N!$ra[Q235iM)d-AL&fNE`B
Ar2KQ)(6C5UU1"3m%JNdZbCp4P)$$1FYjUj-PqdcFI&6HU[XP1VJZK[5%#LN6@D1
jeU0L@6K3mkJBTdKY4F*ihk!`+UG!XRAT2UZB00N#kS$U3&8c[h#S#JrVDU,&V1i
hM(ma)1j86h*eIqEND'M3N!!1$$"La-qi'jR!DCRLiSAJmk3(H(![Jc"DYb**Vqj
9d'`K"b,03BF4Jr40`L"p(F8B'1DJQcVj82d$q)KTmB"1cU$!A!$fSBD#$!bk"i3
Xj%da)DrH)#j#b,'*$FYAD6+Q4"$fX%&@E)2qZDpMJlAbe@qr`FEHClS"Alf)$3b
a$AShAa36VZiYNkr4%$(Q"#Y5JPSFbeLikX#1+4IB)'Q1`+'1*J6[*-Fb-HNh0Uq
hBKQTp'8ie*'8PpemJKY8VicbSd`@UPLN9apbDL&q[$%@`5!A)!D0-3N$4K#G4p&
FiVIKV8cbLL5iPiDBUrca[83NZ(S1$j%hJ`K+9fmBd"Y1J,"Gf)iXq-4[VG```Kd
dr4-mD+4qG%4h'%@HlJ#pQ!Q'2-528p%(bfSG2c!3"`BAh03iAQ$J(Pc`8909-b0
AA$3X,VD5382rXa`X(19G4))Xk&dSSq)NK@eC!$QHSE)CFR%8Sij[d+"2K3mk+A&
9p`MB5`N)UMEA,!3#9dm1!'2*8"k`fHQ,2IDRQSN33+EI)e2XiL(NUqZ%F6Q1l+8
"jCP0DYlQS993Z)lAG@!CVSb5@@BGX8`,"T!!Zd*XdkB2,9'!S3f%b+HKB(MJQei
9#rA("K[dA!PLS2la-K#+YVf0e1bJmK-I&6h,$$5E'ZV)$(3l2mi2B0N*"NVU$(4
2%!2GVQ+Jf5S'![SFEVKr5*%IZUBD--a*$90BD&8rSL"Srk#%L+-jN!$6e!!)aFG
SSSqQm"!#Ger"0Ni@3`b9APL4bH4BFV',mNk0VHBP&,H-5Ja!'%ZXmH)C&ZF54Nf
$T@4KQ"CXU,#)fN#ZI9aZ`$#R8%q1`rbS#dbpcATY6M806UHH1KrP49e5dLUP,V%
TEcDV@N5pbhPS&5Z'-mVNJ9!QfdiNYKYq&YZYX&iEAYR6GX2'i1eL"6Db3116[")
db3jGb'KS%rP,X)L9G#*JQ2K,4h3PD1&e[qRdHR8NPaJ*JbKj+M+DGJB39aP!"#(
%mVPCP9b8U(#59%ekf*+Bp10jQ230eQZ2Ip,6T"pI`j2Z2T!!(5I91*!!5B0Jd53
r&Ld+FL*A)0PI,9Jj9&4+Fbc"-a#CXA9`!5P#!1hM5qa"&kkrL!XjFB!J"d36U8J
B*""$MS8JK[6#CSIKlme`5d&!b5"c)Y3&r`1GJJ&'LJC$#6$TCEK&ChSDHPJ88j1
m!R%p(KhM2E`)!reb![GES`0#"QbfNZ"%`B#3!*@'PVC%Ce3NR&L$03a$i0bMj&r
ie'adDk8BZ$C9XlePES8Kf9mcU*a5*D)V2*`@#AdRKSP*R5K*kX'B-c-4M$Q6$Lr
i#!qar-l,&)aAJS2a1jR%ZLlei'd*B$TCC()'3(lC9#16[8'4#6*1FQ3bfcDeb%5
&T)1'61D"6&CHY0*4-+03hVTE9&2!!kFP9$IeB)[B)(rbLFU+#8p4AVDhjZ)A)9V
',a`qF0I,mL+*X&'2#Y&SRKGSU3S5[Vji[lS6`fl[P,[LL3f6H0`3Hf#QkQ*lpm5
JQMa2[)`lr,p%XkEEFD&raSF*ChK6`TPG(0qmhQa1'I$"1jQ5JBNYA5j(r('KGe#
c[Dd8eFm+$J"@'Z5)IcLE&!4j5A-aC'PF*AJmKbke*)35'f$8X`fLhSELq`*TAEe
Jd&IGJQ&`c#HQcaZp[2E,iITd`fJkP!DK'4d8eG@T0jiATRZZFT5GL)L80,B)a)B
(e3[ADC!!'$a@f96RchE$2Q@TVm1!QhA#dR#CNf3qb-ChP$)3H32!)0[[!bKlil,
5mTlKQ[5Re9V([+X!$'Cp%d[aU"Sc(SjJU*G1P#brr19LJ"-,(LJ,SLRcC)C`0)G
D*Tcl,!bmLC@UE#AlT3qA#AjNY'8aJbB,9&CRF!6$MCS#"0LBk"4+5&l`!US&e&f
6(&NNYmV#R6'2-Mb9(qiN49*@+rUTUBkX9Lb9QcCpTq$`JJr2k'V&`L#JX95P9[5
Ve!T'RdYU49T@5JFAV0Z+KVFqM#N"3IkTk#SQC--d9Z+RN!!H$"%m1#XP3%bB"hk
#X%E)G@C[K@X#`5-Q@3'#9%5"J83#3f3!)-M-!3A-cH39)PF'KH%@([c*Np)&BLS
HGE*%9bH[k%RjlHj44R8hK9+aGHYB)cGQL@mH!aSemQEBIYF*2,BC5PhQj)"MkXV
Ve$G6-5J%F8hXKa95#m5R&bJHaB-QK826VmklkUKGHDEb(X8HBl9Z5[ANLchaIrG
L"aImT+"ljMJ1@"Ed0kZF0T9M8!'lHQk+P-KXhq5B#X)mPC1[FXT86KG&YYkHP)J
&-j!!QAGG[0+ai-0[Id%9dDJ"16SIDpE9VY"eC8'!@A@3!"5"Pi4re0m`Q*0*(r,
E(#ad9e[5j&Mpr!b&Ijc"(jh1)#9d3!rk%e"23[8fT9&FiL5UJ1bhZP%F$HrL`EJ
ff"`-++VjN!"L%cbXhQPfUQdBrVX'`iT[%kHY'cIK3GH)YPCfcjM&KKf1E4U3!"q
AcXT-Cm4jClB)9C@lYSV6b9)!93`Sa%0lEF#`EAUh#Bp1A-APXP#iMSC0!T%(L2r
mU0M&kHVbRTDJG!BhZ"jrTP%1&QD'$F2-$"[+9-jQPE05VD69Y!8EG[J4m[S@1jN
0VX`LF0f#L!l0U+jXiQK1#p4A82F9[IXj2$kF(k4TUGl+)#Sj+kiDmHH[iLl8b#Z
"RK5Nf%2SHej%UN'pL05eRKD4fM'e4D4De)[B[[EE,b)ZS)prZ*DEam80jM,K1e4
+iG)CqT*Z3QFPqAK#j63G$f,dMb(U8pd"M+eCTIcd'##a4Jf+65CQR%aK#JE@pkS
'0lE!1'M'MmRk)ed9`r93AN`SSG'83ELpUTN&1P5#a`Mc4&JGE0C9k!*T!QHUUDU
SKlXJ`2T0200G)"8R-Ye5*#'%M&e!IVe@c4Hf[k%1aZfCR$AM)ImHaf#@hRY4d4,
UHB``h"P2B$3S1%JKY9b249IqEk*PC$*iMf8$N!$%#q`jLFAi9b3@iap(&ijL5I9
NeN$QKBDjA+-H6,cRJ,qB3*5C3bCEeCGi8X8D6DUPR1k"dGV'Bf!G6d*AEmM-S3p
#XM#aTGHBf0+q,"("#RNJLVdBQ10YU"2q4bZ%531a2jNbU,%N(UCMjH6aJ%ZBUkB
RNNBX-aDem$#5!2aLmLcCYkb*,0Qh,)FAc0pM[ICJEdpCXJFI#Xk5G6G`6HEm)a1
NIF,rqa1NqBe%JV4(e!R5A[8r+d'Q#a1,-EHV&T2kAb9"TJhrTa0NZ[6r9)*FX$+
4)"HF3i+FBVefcpkH%Z3p"ej2JS`YJ*K#(Z6(@Hp3-!Lh-U@k4HQXkDcjq$jNP!8
'9&)F*""Z,$Bc-@"5l`39NqBS$L3$5KV-&)T$3AEf,`jKURKHQ"0#l%dQ&LcGK!A
le-b5q%meL2KJ1p`-Ci1TbSVrJ%8*S@PLFc3%ba[4)a-e4Fk3!-V#$Xd+5JK,+#&
82%"6UAT,U@"$SM*GUEJ6JH&i$Y1ck-DTJZ&#f6`F$aaZ91BFXN(mQBP*X--''aY
P5KkhUKPp-L20H*NY!BKLB1Maa%0[*K2!qSD,&i"dqTN+S$rRiJAJR8`!cf65r@2
q-B8Tck`!TV[a0jB!P)SUQeC6lkTb3*!!1L1[hdZLYF#&D,fX2$I99rcJjZ6FqM(
9YbLGGhB+Fi+"rpHF4'r6kjT%h2!PGXB0A`ALY0V`j@h[E[L5*a',(Z1'3fEVrPM
dq$JAqK3mISJcT0d,U984lN8XB2hmLer!KP4X!IfcUDL`H1S,!$+rapiS0qR'idM
VD)MBQY$mbiX[+0*McD[b6H*6Fa@'5Dk6&([E@4Ll&bZKZYE'9RA%9X8)3QX0b"a
rJiH2`V6dTpIJq%!'K(E-KJZ6(FE(lki4Yp4ceYXjUaNEAZ$,$aX#P"LCm!2%!BF
8jmH'khk*")L(eZ8-b!0laMjmN!$i0"+8)*A""E-@%XQ'(p8C24&Xp&M`$H+(@5I
TSR0``B0l,`C&G`6hha4(N!"jF3Kd3SI+*Cm6Nq2!R#j9!BRmXD#RMc,Ma$r"9*X
Sd)mf&MmGGIH`3(0mJE@[Fi&PXDfmE6dNCZIV)K#+)Efj"k62D'*hRie2E1)c#EL
l3h%%Rc`6"2rp6"c"[4H$!)aX8PE2Up8(Q@@((Z!B$5@%MZ,G)3*P-5&GC1#V%&5
0$i&q)0h6JI%*qGlEij1Fr6SQ18BebHEZN`36c(Zpc+fk2(0mLHCe6fiN0VNP9Dp
MFP08Nf[V2VQ$h31`BA`6p$Eh0-'$h31`i4mhb6p1L8qbr(9-mPR9*"Yk#-"Chci
4pca"A(kSTm[2C()c&mFR9rZk%r!Z(&k$`bML#(-4XSQ1`qKk83$b'3*"e3,D[fe
!Q%Q*j@,'lS!ALrpE0+KJPj0$RT,Lamm`+Gc&NbX#!!!d%%&%3e)$!'EP%&8,0#F
!BQZ6lq%XZ1++Zd5d+X%"84'*d%b4c-ijZmH`d6)e06-"!B9%3+j(mASQhl1l)#)
UQTQ3!cR@1%dj6Y2A1%eI!fCP69qC@D'TSC+Tik5CB`Di21qlZlKFMih0ehIrlZ[
phIrl[J%G9!B!!C!$!2%"%5%M)HB1R1q1L)Vkmi+(K@$c12,2*idE$&F,*m,&`#A
!jF"4Z%+i)EGf'H[6Fe-j6&i'0lC9+643$)Z502906FHhUi(b,eTGi'6kNpc)I`c
V*aR9,c9li'Mk[r)PrPRB9e+m@X5r$[ZE0%Rp@CXBD+#$j560(cL'6TI2m"r#jNJ
Me3!q-q`EU9QGUldF'%6Rb5@m9pJAdJ2UppV$JChd1lQE9K0i+reFp[&2``C*AR@
q9KTi0SSq)6r+(`ZE)&eA6r,aBFp)9pAIDFm'RUCMjBXm-Qb8K%5J24LiPEVP1+d
Lm#%D+erM6iH0NiV9@ViNE+Pd3rfMGL+`LLk8EpEU!fqLLq6Eq6r#&NJ0DUM@(VL
4hL*IjRH',CD@U@em9YKXDB-k3fX*&'Qfh&-,$mb)SKr,QIchBEfP2HTZrN(BVkA
YkSGDAQ!@l5kRm&I#AT*fURr9%J16D9rjIHhE`"hdRh)ZrdhBF#PIcH&p`[iMl9A
rS#d2A%0IPer6AJeF6hmPrj[rApJEdNVeH5deX)$qPlb2rbAX4HQ`QXCI#2ZlP+l
q@6XBQ%!(b#YiBGL9*k6(eHHdeB&Vk3@jKhBJF$pp6hk%[aXf3PURpYH1"(j#hj&
$q%GK`k4GkMBq01`Yk6EeEHf1`%0dL"bM039ZTUIN2r&cB4(52HVpr(MB-HP*pEb
f+R!6lC)Yh"-@,!RU8HhH`#dd@RCU5U#CZN4CG8PK9"*9&pSGQ[+qaR8qQ9rLcIa
"[Tj(D9&ke15S5e(083p'FB24APe8&kp0E"bY6jTm5ABf*Nd5T%-'39,K!JeE+'c
1C%%k85G)*Bf#C)F,JMX$0`P%,`)436'3!2a`54-YcNP*GSY6Sd8@CafGC((Ua&q
L)%iQhNLKJY#Uf5K"[N6mC1)RXVP*GN%bJV0@,BM9JM4C&b6G+%L'4PAlVhITD2(
$Sf[cd[25$ZGPL4qUcY@T"H,Zk-fTBQhQME2L0HI9ff%maD+FNL&QAFK0&PI[68r
0fjRH)'j1cUa[%22&9#QK3VbTCCqV2S-JGH8QTqp0VdGpGa0M&V%jpDE4452jk(Y
6mX6ND&%Z5%r06IjrJM393ZRkpDq+'M8+9*0&665+QZSdFN3+X@E*b%@0HG%SZic
N*eq#)aNeJ4TPd4LYF8)ebT*Q"(q##6jB!K%TPKZaJ2-`,!&%r%KXT*VCS8kK4MD
$+&1SCQ'UQ!5+#p`d'9USdH`d-SD8#BM)#@j@0C4KG3a6P%Sla"+#@@5dJ1Y4)d8
96MP9+*8pL,RAFNUNANk))TA*JK)(&#Hm6,f@S`b"HkNFl8!d8fTa-+"Ha8A)-K8
YNTFU4ah6[@B*T"L'3QE,`8b$9hCLA(%4&*PS--F`P@![+P4N0)Z(-B&ZQ4+4H)G
i4pN#b"DR68,mX"r"T,Ia8'LeD"#V,8j$04F0+L@JKJ@b4#JbrRFDH,9-JH9#"#+
Y0T0C!TQ)qE*BV8U'DYN$&JE1TMZV554MN!$--5J%PB)6-"6#5D8'-eR*VQSVFj@
Sf@,9kf!$&-bM(H*Cm4NA@)RSB4iXC5+D6D0-"+69#X-5$5kEC$JUX[QL4*c5a3i
)hkFN1%*(,X*a5Za)J8!P5c3CTbb(BE0`Y16m0,E,CNb3!)0Y$-Li,5Cl+NFc[Q"
a6Z)1$R`+ebCS8%lCd0PX$aQH)TI(0TP+$Ue1)YdT8E0+5b59AD*M-ah5f2KMYcA
FRMMCUC!!4)"MeVLU5)5L'JK&2Pm0HE$J`1#+3A%C#!S1#c@G6'Ul+bSEXEPUYX"
XVPQSSRJBHi8UCXR'MZK4R)aSdp1P12Jc2BU%fG&N&QJf4%*bJVG-0#Y+-&2$kPN
CI%pCTc,a'6Q'c5F!4(DL['#'-++SNKLTKi9FPCdL['1"dcL&!-8&H#3ae@Z*YLf
41JLDkL),*3Bm1(-@8@@m&+H+P+'U9'4H)@c0`3c(5LFU))1A5!0P(TX54Q%m*)B
+#+NiQ&TFC,k#P1N#+U&6*SG9*V0$QcR'3F&&MaT&AQhNKQVK13-R!6*rY9(%3L3
,!N(*MP8E&4G"*8N2D2)j0XbQ!V!k-89fBJU4%JXcdN)-id2iQ6(Gl#)mNC80j0#
1%8h--AcX9E#0(3(S$)9`)c`FiLK)P8CXVj'Y&I#jem0@&JmMQCe%$KGKLJ3V4i1
CPhY9"U5-J)4'VmSJS4Ij"!F"8+pkMA)%'H"'d)d!GdBfJCbi8@CRL!(&`c$N8f`
'F9i&cB*l2@aP3d,&3E!8Qm9Q'FNHQ$eX"Q%9604cJ&a-BHaYdmd3MFPNMV%*`Ud
)4d(QE#MD)5)U++BC-0k'U4!pU&cdPRUIp!`++-m8hUVde9U%R-bmK&4m2@MK,Bq
J[@C#8$)bGfa25ba)cYU8LmCCFPkDI,3Mp%PKpHCMFQCqDN(bGLZCJeaXeX*8"#[
)3JXlJ[9)a&P`1B,db*IblfpEBFP)cGL5Qj+DPlBj1D%JGA9U@Pl'6Qkk!2S(jLY
PN6$`!PLqMZ",XY$#NV"'q5SX'fiX0+6)p$EPk,Bq+p)5YkIPLHP6iF*Q$[6kT)&
9F&Xadbj,fjVNpqlS08@m*`Y51kE*jeSY-5[0+Q(P%3V@11+"rFP#'cJFkff)"m$
e%k4eVmM5(Fr$jIZHLid4FP,"*Fp%2YP&+)64121a5S0-GS@@B04YeYkXmdP[GTV
3Y$HVS#`8j1Y`p`[5DT4+Bh%dX8[JjX[5S9+I&!NZN3D#8%-Ab&*)!Y`KZ#cCFk!
f269,V)M*XqB#L2(Q"I2j9MN$mprX$Hh[)qJ$KcZYET+2VNf"K&PLRTMfAQ+DL"C
pfDZ*&F%%UID'I+jPmj-G(-@@'*1&Xj)-BSXD2!fX2f+X-r-cdUSDa26F0ANKU6I
iI9*c[R8#+!p*IUU3!%j92Xjqihh5MeMmL&,9rR9bm+i&,@bDCdp'9NL'Q#)PCTB
VYBd@RC+i26Fc"%FN*C+d59MqZ!AX$X&P#G)R2@925$[$l8SX5!e*h"f5PT'm2Bp
Tehl-![T+S"k(kbe)Zl,NSb(YeJ6dR(!i,cReBN&bHZlfC"6Q8K+6Yfq&NKpIehj
-dTiHj'SYU6-aXd8q,UHPjbARCPSr6iVT-BPTh1aBA%P-Bd`YZHN*'DQCq3a`r&+
MrG)!3Gb)6m1TfY2cI9)F8ZM6ih`d6YAL$'rPNKdAGf2[aEcNV(5a)$N[*b%[-c8
[+fA[IFa6jBNY+5KA[T@APTFeGE$dbhIPJk9ICTQeAaBLL#3,l5F$eJ0pdNqi`%r
Y@K`q$-@9qS,MLUHQpaM4HlI`jUImUF#ER`kEYCpH4A#",,5IKQ'p&[%(F+pVF8h
3MA`3&qll1'l&2rUia-S`TI90IVVCE!9!JkZeRq)BD"Q-qr`d%`(Z-aMhSDCJ"F`
,Ti#9`Hd-V'4Q``f'kq@l%KG$10lYl3D[QD+f8"XFBe2E`k`0cNF`$1i&,DjRDl@
aq1S@&qK3q`*6Qh84VKfZ&-k2FF$FZ$kqMq+'rk[UjZF5l@I4V2eFM4LlpI0T,5i
*Nl0pcm8YQBE+i1FXlHFdc%HYpr-DZ'JY&PaM)9UXehFq0UD5YJqdRer3BN8YY[D
i5DlPCD([ch2-V@$&c`ZKC3+#5,,3[XE'r2b96rSD'r0eZaDVbZGh,DJNfpFAYDr
[d@*cY&LbE6MDQa9k3+(M&2UQ3Yp4k%F+lD[3"S@qT0$r9@JlShk!iUY#r3VpMd)
r9UK6S38+AFU`(e(SES9qUp"SK4j8k$b&HKM((Xamc0Bj#[f,3Umc2&fKXdNER[S
B8l5h,!TebD5iE'CM33UGcpJ"HiG#,l%jYc25``TGMVD43XHMI-[iVQ%kCLKdN8+
lf-"4KIj*SEp@k#b&lP-SFQ`I9N+jQDd$fAeZ++3iHTP*A+23E+ET8i@Z9'L43Nm
Tp0q-86mQBTK#cbVdV`SYCU,N+r5-3JmVG+p#(e6S$`VpLC&1-Z'J0G1Ucmi@jjL
JQ2bH3Yp5k2F+2DE3Z3UGS0$I-jQkf0&IBc,pR3RN8fJmZkh#lSR0k+I3#`Up3k'
$Q8U95C!!TG$Rf3D-91J`KES9'U,31S9H9+M-6U5A3YpAk""fBHaP-c[hiHaZh46
D8k(2XH&&6&DFrMrBk3a8k"rC(CBb(4[BR3-8ZP'Kqa8k8k&$&IUC3YFVp"D&[Xk
8,@6rRf5Le,+M`@9fX4ac2c[@i`Spa(B,bUi`1D$l$pBXXTQGi&jfbFFBkT-+AD[
3rJae(c[p+RC`3"fNd,F9ZJULXqd*"bq@H`VB2Rh&N!"%aRSrfirI+A5C3NmS0%+
K[f)A!!ZA3NmVG+`5p6#RDU$B-ccE@lKL81Q!K2Q'Q+E"YF2cPrL((%SUlT-ccZL
ap'[[RK9D-Q*GVp22TikeGfhkXZ'9P!9"rBr-ZrM'bXKUTc+`VIHH@68AeRDlrN,
DK++)HlkZH[rEK51(ETY6mIUDZ,VS,EmXqf$hiXiH"lilqH,KmI((lrqU[Qrbc3(
$GXhFqYUV8@j0NX0D2XkBiE[bq+GRrhc`LBQR0[pmicHj5mHmIFIdDrrCqh4MX2$
MaJrcERRJh8HqH2Dr#Rihq[bUrlhpTChrH2QG6qEHpArr(U@lc'pZq(hQl&ZI@rh
jShp2Ifc5Z6rplF3rGrcac&ZhrI$3(jE(6MjkldqAIlhpcSIIfrrpeErXHqE5X5F
rZqQ[LBZD2`VjjX&IVIHH9h*66CZEjeS$Tmr@P&r$I4CYeMj$#q'cRQ5KIIB+eYm
LIKjZX"BlA*E#N`"TPjMAQKqpEJU$H#@!p0RiU94NJiaQEC!!hAGdN!$)Q%$TS02
D)(b%-`+1$QT`""93M"EZ)!9ZPcCS&kN)C'Ph1&`6h$S#j1$3-Sd0p!A($RC8+i-
ZD)1'D,&*CHX3e&b&NBBb,CBKL@NiU9@*@ANTI&YH@Z+6D9PjD@a0f'@EblCaSK1
R)-c(AF$mdaUbd$i0`,SIeX[J+V6)BUJPGHB3Z*ibmR4KTR(Ur-kAdIrT5Zh6,V2
fk4l%)q"kDT&0PAN'CaV,D@b8`fb1pZP#,6+QJm&j-,!9keJV$6MGLV4ZILeb`(Z
9LhXQTF&Z&l9Z@maDY`E%pm0Ydb)(Qeh6eSLG4Mc6`QHh&l9ZJ9VNN[,DF4FFClN
P)che2V4!ZlR,f94R)KRlh'r@2XI[HTqI*J[YFa8hAB`BTrlj%5ebR+fK1JUSFA#
M$'MT'Hj'XY8TLI[ZJf5IpjfkC)-Kf5!%S@5KIBjmphN2a"#TPedEjAG)*MSNUr9
jiJa-X"jl-Y*4BL"Yk6d&Zbq5FK1+6@6S'&Q%T+CPj+DQX`&aUfcEM5'f5HNX`8l
$0!La@qXee+ce`VRekJhA9h1M26F+%SmDlT2FN!$0$4P(!D5-3XSFKF,U+,6B4U&
40`S*f!fjh8Mc[BCUE[bB1JS*Ga35lLJNh&'iB5aDY@jFbihfQMXFMK$3!(1AqMb
a6DEAc,A*2'hAM-P06!r"4&)iqL,FE+0HF("+62rAYriLfDapF4K"Gl*!A3Xl!&E
l!PpH[X$&[[K5Fk[%eZ$R)$(9D5TViV6*DQ0YX,%fD&mXm%RI"F"Gepc&a0C3!-A
8)`4"FcFj8XP4NKNcN5V+,C*q9+fMKm$G10PPjPAmXVDKZK5r4paZf,c4)&bRlI"
UQi&UkpF(VmDRSSbpF[#U4"Dm[DiJ,ad4hjqAP@`,eq8AT+8cT#eTZ53iZMSMY5#
0K$lTHj4B[Zm,pb,FDh$)%0phJj[MZr,GarGN*"GNT1hP@r,fT*&)IQj94PTQ2TF
6dR*6q#T`[`IP3GPe6`%+Jm&b`AEm(LLr[4SAc0Zj"`RTbFc84",FRhLB8H5M5%f
fd#FP'H'`8dRiQT)8"0F'"fLG"(L@K'mT549`&VK0F!GmVZmq4T8P*C!!DLYTK1p
mdK#qQKI`C*l&-rKH*@)96qaBGDh$8"j2Gk`,pf19KH%TY12VH$k3!0)k+"&EX-U
e$Uq'6@8)M+)P)@-P[3#(G*+%Y*5%a*q%c`I6MEjMdc[j2F"+"Ri'CQ$k&QMDJpK
+L9R&SNbHVm6)H+UHD%T42+ZBXZKlf$AbE&%+N89'Y"dZRDFUKD[",3(5j2'Gi*V
(dj5Z*m%V&IHeVBrIMrL`#F*a#fcQ&!T1E$Ubk(5!cZRi*MCp0e`D(!T0dce`D'&
-afHckB!$dh("kGem`EK8"YqT1"-i1HmjITpR6J$,[fr[6%c1fjY3N!#FQATaRbf
90)KRYpU+84&Xe*U5jc3j8R*`5Q*Q"ViI9(KfCf6QNGTYMM@4$`ZjPp3Z5)AP-bE
)KeLUQj0UeZEJJmQFhLBdEFk,)#2$c(R0*mi4T$8VC@P0$P`Uh$UiBMLr,1f0K%2
bh,Y!pZc0R[T05KdhZAZj5L[*p31!c!rV61Ak)4pNY%0q!!cpS8Z3!2EfK2,qF%2
J)1"HI2[E#q(f%Z&+i2"02LI5"[C-90SJdPNVQ1aIRPK@*0jD*R`iQ'G+dqD9J)c
fd$`NYAR&H(6K$9R+k31(Vk)j)f34BZ9!V"b8jR-J@Ni$4"+R)P,T0)K8@NQNH4&
3r%SVN3*"aJR0!mbC&bT)qr$jBYmmZ#3iL,B2Tl82FZf$A2Z`QrZDC-qqLdcaZkQ
j1r0DEBYMjiCf5&3@4EC*-KFeip`$6)5jHl$'JFa&ShVZUi*d'#9m0fT'ph#Iacf
!F6`qK4(Kde%[Pk1))A#(&M64jhDcDCQ*0EkQc%AVC@iFY,`"$@MkZ3ZKC3KM9jK
FX,15X-j+pbQ$iY!d%j!!FZCDTQRQ,UcafAmQ%[M-0G#%e(!B"hJBUH%`$["`XH`
T#'@-Vh6`XdPYU`l,DV2GfD%+9F6-AMC9f9JM)Fj%df"QT#!9G*HP!Z6a!Z6a!UJ
Y#)FULqd+Q@McCKif56kfr*'Eh((,,JH1&A"mXm8"(ETh5(3hA-L-+GRX'c4+[SN
`S@RIi02F0qdJSDElCU$J+6!bjQpCHGTBQ6"Nich,k+k-+,G@20BRC3HC+XiZ"IN
lN!!"HV2A#Cl8IMBBQCQk0b(2HYIXI-GGEI51!mr1k@#GM5p)fIM+Q2f"i&RcKLe
6fV"0XS,T"2a-Nih28pQc"#QeLa#&i18ATkferaj+Kf,LET&pTaDR$#@+QE4!6)[
1bq)f6ZG-2fKEHEAk)&jZHkHmNS-06mT-&&0L-P,c@Z@j'DLDCL#McHLV4IP0-,X
)CU@8-!0IIQHJ46XM9)X5R4hT+Q4lAUTTbkjrENGE1L3AjH'-e-5dZfhjYA4)JrE
[,,4(CUh3SQTY'TkcDZM)Q)cq8AP+@Z0F-0AM''[CUYT8cF,[GV23D*h96iXU0EN
,#ZkYlT,ifpjP&JjU0K,&l&)YUYMN,N4$TEXNr[IZ-KXR0K[PipRGY5M(lbCA#-K
m#[E&`5q'm5-*#VF,0@UK*4eTB6B1-45T-K6hE,+KMqM3rK6Y'G%k4@8SlKXk&!i
jGSATIIrlHqFid9$Nme[Li8CU8BG-,r88ETiMQpb#GXdYD#$H8UK&K6Y0fJ*2AD+
k"HhU@r"Tr4Dh&T9[dr(Z&"e2EE*DM!ECBK5&&kGU83QYl[18*Dc&U0FA!qJ[RU9
&jE5kce1IY"DMq(%RLNCh(Y+L5"f"6%lU`Q'D'i"UCVEQR[mNQJ5DHmQ6D)*SlZa
ldGc4h%RhSYfPZ3H&S%'SZ3H(S+QUZ30$d*!!eYap-NrYcNK"aC5D9T!!Tm6X4K%
J"@83P%a5@@%Q6jE`+l,VNG8@2!K6bfmSdBqJ#)BABmM(YQ6NTK6J%dPDAN*L'Ri
DY),kSpD#2DU(h3kNUIqL@Jkkl#clqma5LlCdR9PELREr8K5hPqB,d[)FfE-m[mb
hK+98@hTFLaT36X8Md%NVY!&INJIrI0+!,jr8STE8d2NS`pp,EefKrG8amYG@)li
9@Pr(5&q6NIA6mSGRGqpr@RBeML$'X)QBLHZ)+HV(c&KL*[8NaYl%6$BaSiZ*m3B
b`j!!EQ8X4UV-p#)Q))ZC9'Ek-c1!'FDkfFL-KCP`CYL%jX(%L!CQ'TKC`3aM*$*
'iTI-K",6`TPjKCPaa,3aTQf-Y-(26!ic3iKC9N[-CAE9bdbJbr1)UAfH'$@"'*Q
TAlZ5Q54L9VFc`ijJ04YBc84CcF4GabDXBbVAX30ka-i-1ij(8TKKKrJ)%rd!%hT
r+62XZ2FciIE2*qB38hEEF'Ek--1B([%b`jKq`S6BaBjX&jXF`TL'P$$$KN2BPS3
`PAZ#Q2%``bEXBFSbf@&PXXYNXZ2)A%"-&Q1Aa5kFa86-BT1cf$&P-B(bQ%"jE*2
b,M,$@1aQ&pM0VVfE6G[1$QKl&c2GQ@&UYNF5Nmq%cQHLl'##lMM06$icl$)lf13
GE2)1PVf5Q5J*M(8#%b+"LC[!Q"i8L8PM@5fGX8jRLe55lD688ThEm4hV&EM"eES
@9+eACm&jUR@p1pcBDYf)JFCDZ%h9qX63DRe58V8H[k4DpjkZeNHUeAS3J[CaeAV
Y)EJ"F21UpDT5Z(biPGAk#8`mF35ZUeT[D))$iiC"F0P`8(!l[U2GAJ,A$RF4,J%
#'(@p1NRAkaTdr6,9`8$A'lTdrF'HZLlAkVVLdA8K80I[23fATHY0IPhIh!HZRkl
rLF-"FC-GcJ)h50GA'H$!i-RqF*'krVJ)PkVVGhKe2E`8$Nc#RiI$B-BEZVkR80H
c9X""84B)@9rUHPk-VZm'B[j+A8r%iL!'$f,5`3@kRPDXkqN3,"f6pZA$B@$046J
XZ0fSSrHrV[FckShj4VdZbDK26S!E!8F@5ibkS46Z#"b)%h1-HP'f8Cp8E04(Bj,
h$D0HBc6U$a6#$6$U$hpTe2fTF&L-D6,UCm$dc(bM(P3#Ci($K!!-"%"*!*!!QL&
!-`DD3@L'3[%L(!JL&)SHZ2j`8#3Z-1SY)K`3@X,KBZ$!S#A8U,G"J,CDZ"9`+q%
J40YBSll"$lF*$N*[J)!E`+aGKCYRe$GLdNCFE#-8E`6#4LKIaZ%1`AA"JF&P#()
C#*GI-HUeAMJ`Z2'm86m"a3f"4[ef-+U(!$IK8MH0-qUP8&B+`8Xak5`%28X##(-
GM"m&Jj-3iL3ZFa+(HK8#AqeTe)["j"S'Vd'`DphK"K[e#J2FD6J`Um#&+U#`)Y+
SE`@MV8$FQJ)(T9Y"9,&j-SJbQ-Z$M,U#`lB!)HL94VfdHk2q8%UMIPG@SrjJ!Pa
5SfiCdDJ,Ja[erH&`r4YelUr6HA'GAYd!&`2A"ql,1Pd[JHZ##i5,V0103$4ki(V
#$BGl!fi3A+mk[A&*R9k(`FP0GFJXF)2Vp%P$kR5l!@iPh20`B'aI!$Hr6KpYJ3Z
Ydbm"m6)QAZi1ekp1VcA#YF-"i3B8hNL"J`"9%+BU(`j+6hMKXZ$!X-&HTpHr8UF
r#i'Z3SKL%Hi3A#%FQ&rMF,MFY33i)&h,VY-V`,KL"4`Z@`(Q&H2Up)I!j#j-H"!
APa%S'$4$U4N##a")J%"EJZVdGCL`(m4$Z15Kr$Um#B(A-Ur'C!HGaNZ%q1412((
[Uh%ZSILGC'P[KGj6dl@%Cq0YHrCD2MNH2I+SKLVIjhQk$jf-Cl[aqIVT2TB)dGq
1&c6`4QkEI+Z&@QU'B1,eNAa$!kpYi+-lqCL4r%pq[V@'Ef"-&XZHrI1j(8`QbG*
D[i8aPPh,FcLL"6lAdm-*D5'TV!KT53Gq83Gq*66SrUUFfC!!CN$CS@J-cDk[iQ+
lH[j'!lmeL)pXi-e"[$eHGUhJ$eE*,S9Aa&ZNeK+1*A8KB6A2bUTE1IF`'B8%*%S
Lp6Z*jX[4Dj2Z6R2prkMQU(U9DDkSDUAjA"@[hm4[a22k(2iR4@Tpc1ATGZa+NZ`
"emN-Raj'GiSL)Sr2mda#TDdU+pPmq6`j#32HqVCT5Xk+,*rMHA!8r8(Fi$A0Bfd
N@lLU4j)H-f5f@jEfc`HPF`U&(XDMhY8PTK5P%SC5$SZ4riV&b(r&`N6(84a@+aC
P8-TS,81C#T14pd80VK)ae91mZd1ELX!QP(232L-)IBLAmFP&0JJ55VeEk-@DL0$
IBS3"SrE@`'M'5J+-BTE`+$ppJEq-6*[+ICZi2CllAZ9Y,2FX--NpN!$4E-XqM6l
A-`Q1M'a,#j(b+C)@mU@a[#4HMMk0GhEbSNk&+4Y1[B*8R8!L"R9k!(84hQ*@dm6
(a21D!$kTM@rXj$8bNID&'PFfG5KFEV4dj'"6SUmedY&``c,Z+q'0XJhJ)4'ci8N
ek*R#MM01MPQ1RPZ'GQe9["a9a!q9m1eHIUL0(kcKK`*iX*HBYjPjL4MY'PZXCZB
a4TV-c"PQEQ,'c)BrBHBBc!UqR#hq`Xc[QIQ'QEma%mE-&elq0Za5YKV&12QBf3K
6DTE)q4CCchGF$AS*r(mXLGT)dM-*k$$6`"[pLQ5Vhb8hZXcjDlLKaK4BM#50!G%
r%Zre-k@ANT45(RS`3HrNBVcUQMb5PbJ55`JeV&FI-%i66&p0a")q`d!pk#pL5d%
aDeILbmXfhYLJ@#Z!SkJ!`[&E,VUY8!0K`Kj`F$FTdAB-(#SlF-V!ehX-dQPHGj(
FL6ecp8lN!,kpIJY[kq600AbNR6pJjpi!BV"S0V$d1i'8NdR9&NGU,-kJ'kQaF+N
j"!apMXG-epA%c1'*4VSBVjHdTGR)Ti4jYek%qDNjk''%jPBGB)6N!"`(%a4A["@
+(,bS(,8$eSrNMI'+!`"((,aBGPVDk5R6D*Ujc#bD4LS%l'DmkED*(C[mhk*M9l2
pJ1mPI(*0"aMIJMfIkNJ`b3GSRYK9DI*Tam'58VB08!j0L16KrQAmXTdM5leXjlG
Hjr&qIQXppp[0MVBMF&M,`M%VdNTDdSTNUbTL#%2$GGiBS$Kd5@[4R$'fmdCl"bN
"i0cBCN)LdfD3!)CZPCAd)@(8AXT,krL0%Yj@a&mZiNJ+Yd*11j'ccFk[L[K8k+L
"G[ER0Q&YN8e'h(pSM@XHRmTf1qeSfNjpR0SKTEmMm8C1ipd-CHjQ+(-h`hfjflG
fapeX%EQESI,G+ZA*5PHV0&cQCZq"SbDfmBIY2-M1D`l`dDL55l#f&Ki)JN1eVIV
'Cb&#bTj#HSq3!-5!Zf%5b8fcbK,b8FR+a%(#@i8",pY04$Z+D5)Ib3#4icEE$CD
KiI@RHC[hY`F*Rq)jl)Xe)`!51U9NhSRMXR0l!$'GpR)if0,effL-KH-P2PIp[06
2ErKjQjqImI-52arYJ-"ii,**F3hR*UXZde@#k@UGkDVBG"9%1eD@+f,RGAC&1jm
83-`$YQ3j`HH+95Y*1)*)12*)HIJh@r((@r(M'(l'b,6lK0pjC&UPHCG))pAM(A&
fIX21f`1)UEI,adlcCVCA$`5`(5-(MUSPe-B$SD-XLA#qV6L%F%,(X%1&6l5Um1m
UZi&6Qa*"f[)SQCZ!Fjbb(rf5V8Iqp(!P'Se%hXDbR+1XYE[GFQjf3"!IEH#Sc%G
lcEB6`5G6!Q(Ae4bGa6--"dcJ`RR8Y+,Ib`dPTX!lb!E6bp+M3HF"8e5L9Ne#[pB
bY$r2X*cN$6Am,MX[Y[0(!iM"SX(,0h[jM4VHEQGR'd!-&MF-[)'eKN1YZAQ"06R
-Gj6VAIdFr'QX8(BRE3Q(Y+5RB*%181Lqd,I9h2p"bD5i*-Zr&SfK3ECI"V55MG&
&dDp'%kJbjFa*!iQA1i!Y#NFpD$KY5PGURP[#-cZETMA[Gm-Gl[3Ne2)Q!cIlq6X
Ph'cJ@i2iU4VbPHCD#MpYjcICH98!-9KFSm0j!Z`K[Yr1epVjUJ"LX,L'ccTfEVE
c*U)0Q@#JlF33IQdl"i4I@C0*E%rb+`%,Zj2I#&K)%PBI0RN33YZ8i4eX"R5`HIi
qXhN4N`G0da32TYMDQfJLhbG%dq&M')lb+Maq'Cp)Iq(a0NJpPSM"[R[i6U'YZ%K
D9X8IVC(lqhRlD3CiVPH#0lbGpM$EB)6e(0b16%9J"2Z+!YSFmXX+'jeT8m')RN`
,DcREI5-JBY5ZBVk+l!ih"a#c#Z#YP'cC0HaV!$&ElI+3!'+q9Z4RDhL$R65bfN4
LX$KVUkUqXkD"QGD-2FYD9IAPCG))l8JM8kQNb&`NK"r4H8jE9c1X,`q[2m4["*9
E96T+pe1T,%NUR'005*'fp2AM!S@QY+B(hfRBa8IAi&G&EZJ!J+5S2U@!)I*f"XP
XCD)B3QV9ASjQB&NN,93k"5i$&,Z-Y10VPh#+3%klDESXX8(1GP0BMFpLJ*`0P@M
"iD33eL(I8Aalb+JqDGUUf$qII'ZGCT!!$B#3!,'XQ*qaXmSRJ*JcGYR9cMHbSa!
$E0@Sp30IT4eLhdQYKe6%mY+LCE[,X+[k,GK0XKf`SGlN[M'VQhL,35P$DM)K[3Y
54K#G8ejMD)%9aSfeDKiRRbHE0T955h8EM`mLf@bb-TAGY0$@!*`4,l3%d0lP#9"
HDm6f9@kGD3dC4p9UkGX'pBFeAPlJ*@pT20$1ei[m3#PrUC-IL1FrH2Q"%QdL5#I
jic9mNjhIDqH+Ppp9`i[pr0%'4l@PX!%-2flR"kUdUe[jMY-%2KIBq4UE42emVVJ
QpZ'@r'4-S[G"kNQLC*mVdNqL0*!!DNN83Aj+*P%2mMXb4c)+`i@VFdJGK&8J[[T
9HpJ+hmF'NBM!QYI*$p-Xl'ePfC[mpX`!83r3mJRY@r+$pP2%d`1H8k$[8m[8rK3
bGGappe0iGm,60ih)ji%XqNXVIH`p@5-YNF@8ihJDR6ehiRKUa5bp,!UNN!!SV8A
IkCFh`GA#RGiX[Ac4A1Ej%fIP*bQ9(M0@"2"PRAb$Pcq!BNB3phD59K@k4d,cB%I
*'p!-)U`eTC!!m3(%Ca2TUKc"L"V2J'Pl@T0UbLPrI+A8A@1$KQf9`(!l+EQ4eka
S5N4j*a1ca0T2a5`&E-0ai#RHYAKZ1#!DEJpFmQBTi2$8MZ1+G6E['&+NCMriq0(
-6Z(Xpl&@+UYXFTD9j$b6a*32hQlh1*kkHEbI,$@MKhNchKM5l0mX0BY6%kHV03[
2$03r4VNRVH'cmdIb*LmIJrr!35H[m[)J2i(N*Chm35qr&QpQ1q)Srclq*IXS6hD
Y4eNbfeNV3R,(#Rj)"hf1G8A+(`%eRY#@FX5lZkjjP9&PVqS8fDm10AMLD4"Hqp5
E9-5#G"-HR+pY3f-#4liQCj9N'5&,0bTNUE%*lbZNUk3l6XY5[91@kVahX,--q"U
lfmQf4`VSLm8"fii(S"2rfPpXD5%)6&Hh#AJJ"bmL3LTQCL@-Y,Srb)0*Z!k[KaT
C,d[V,JJ!X34PA6BCH+4)!$JPK%G84[J@K"4'k-N)A`XNVB*`J,`'66U`6*!!$L$
0M8%2MIhe!KlB)B2lej("rHJ%-1C&$0`XN!$IAD3a3r%qP6CF$(PK$*icZb1ICTL
P1ei3R(Fm6bh5(Gd%kBjH'&["hLXMM8&hKQd[#UjYIB$RZBh6$,`Pk6D-MS(#fci
3R,F0TaBmrB1qcG*Y-`AT0YcERb9,4q)&k3MHh1-(Nb0i6md4&B[V@2`L1)mXJDC
2F)#Ii!$p!E,d5B+!"i@)d*rdC#D8L,i,r6VmH,29VNe3X5Z,M1`D`NE3mq,K#4K
CJ2HrK@aaKT5!B3J1rq([C'G)%eNG%U33l1,$!r#''1cB`reP9cLRQ@CAH"Dp#5D
*YTLP$-L3!!%C5M!hBjEJbQ"kp`5"K*hCNbC)Hh"kYk+9Z@HQi-SdBUU8U3K5TJ9
Nj*r-#%(+3Vq!'[6bcA*LiF%#Pml#D@D4dm`DM#LE42-&8SkHBCEbqL)F3'HETGh
)(EY*lN!AB)3HQQf@YYF*q&l%3M$IMPi"m@[a,5K*F1D65qDA#P)qY)mH+%Zj11&
FD"Z0$*MV`5)3#faZlJ3"Rp!)hfqaaD1Mm8%YLh$m&Ya'TmR5$VcdFJFbp1KG@13
,cKhG`AP()+MBG[YAXT3b6*!!8Y!A`Ikk,1dX%D5Gf'hl"eJi"Aaf**ah3TIp!Mj
#ML@FNm(0rUSX*9m3T'6dKE%MK5@UJT5)VCmd5rBN$U*iDj58'#Q3!+pSJ$S*$9#
CX%@3!"))5U$X5@!Sj2XBKJq+'$jB)H$E*)BKpF&N,2#fRdNa@23@R!FKXH[JmcK
0QUC)Ne,`iHqkJ)pr3)'SDEX&CeSq80*bb(QR!HT0!UFd*)e*RE+8IP+3!0*aK*2
`8VadG1dS3RHCG16[e#jbXp5"#2Z4R&CJ*)3#S"Ta,J@l"0)P3c,Li![3-B4dd6!
LEa8-&9`&h4PU+%M$3(),q%&A-J*D()BZp"L4M"$qm&U"p5!aiY32T`QZ`bbh(hk
$'A*[DGp&JIA6-D,kh(GBB2efM)""qhS)V"q2%HPYhiX#kpGMa%hfI5HipM&SNB2
+&jf1m%T)+3H!L24"dLGJF9JJAC*d*-JFE!ek+%NkYMIR"F'9m`DEL(iRT2Z8MZ5
d&m+5lP6kqeL!#qPHTC1Z9K#&G,I58BhYl5'ipM,iXcGEB"h#G0**$)Q)G"$68FQ
Y!4[5B8c(4Uc"P8N(-RdV&VMb'REP08ceFXLU!piZVa"Fbbmb%RX%9D%iUq@$9RQ
#KY-Sj*QA&`ZZ!#1"6mhY!TkkT(ILa@S!*L+"h6L3!2DqJUGp!'d"EMXfZ2Pq@GS
i6T!!PL&C0'2VPL8,RQ8*G%DY)Y8H%&beK849,4*Jl6c#UUT8a[XLR&A),9)9GV8
+ZrSbpV%+QIrP)l*diKl"H3+`4cUa$G%4%Rf,+)9%Da#Y*&'%i'TSSY[08N2hqbN
JadJSeJILPE,)H(jNRFEGJY5BM`9&pB%pUd[#I9b6ffQi@CS-X$Gj"!Z6"*H"!'h
*J,D$!GSIMT!!*31"B,YPD5*H3$B48RALNN@!4%9XhbIKT$Zh%'!J5+1KlS([m,B
ml18$b*Je513e1185l1-$KB,d!#UN@pYNem1NdT!!r+KHr(Dk!5&faTp+GXBrJ&i
f5f13!#V(B"0U8QAAQAb#I1B$`A9Q1*!!R@IQim*"0B)VU)5-"#N),B4,d"Z#*bL
8AXDV)ep'C4T!'1`LMp!#cp0XTaTUM'C&F$EMS4kT18'3!*U4XfUDm!"Y%Z%N9JK
1%@01m3Ma(Q#*U#(&IQad)F)&"#kd%,M3!Z5@Lb6D*EKDBJK+#cDdC3"$#F9)@lA
JE$15D*RJDPY"80V@)&a*0UN0p@EE@(,I$AibC32ChJf("1H'(")G&k30k(rP3pC
Z4hAP`rkeca&F'aNXf)KkG@-TUK"T)rCY@5eKXq`3'9U'lSR,!2KmVq'CAF*HZSc
VALEA[C`XZ#iRN!#kmI)VJR3C((fiI'dmmU#AjFCY#)q`N!"S4KUk!8jH5(!#fqK
&DlS"X0D,M(!l!*8A)+JHRC,UN8ZpU(0ZHN0`h6516#m0%X45[!a9+YdNZ-i5+#Z
G4H)kba,A@3KmPP5FVV0NrqRe,G*eT*j,!f6ASdb-4cm3T%Ia*Sa,Df6AXi'NCR`
@pG9*)pRGNlM#5EBA*jF)VU[XhPFhND'VJ%aA)H)P-#['14A2)fMA[)+VJNP3F4d
KZCbVJM9l+JB)8J8biL@8pLXBc(X)J$RH,6XI)NRTS8+XAT!!TBX!'[()pAFK0GQ
AbA6V&YG@eJMDLNE3eK%XI"dKJb4EF94&5#SUX)X!M@49F-NXimV(%E)8,`0D&!(
D+'Mm&+(YDdQjheP-8PeePH#UEL!ieG%)BmM0Ue%A9(q*qlRd%Y*Fd,X)@Ap0F1R
NC*ak*'3eGJSZSjmN#L2*VXCKJXIBLfE@++l'*B!XRMS2MF,[BT1h#*l*6A3fIVF
fe,-%(S8%rJ[#`55F#$Jl%3Pd)S$e4#6FL6LFSLT"+X,@6N5#,KSS1)[k38%4@Qj
&Bd(&m8`#%*id"1+ll!CQf0RDRaGFpMiXA)"`2JP()i'1YV!3&IGS$`'MSj&l,Z'
!*k+KFJNjEL)JdbAXi8481[L[rNN6d@,`!Uj-a(PkM`Y1Eb(dHpr(LlMalVmke!-
2I!9JJJ1Yfb5l1[d%LRELa$Vl)(3p[))CFJ68,e+b'Z0RCJ!a)jZBb5EQ6!ia39j
QKK2cXXT-%M%"#F3d'jMT5BaBc-`JBPVbL@RMc!`KCN-T-i1*D3pRCK`a'`Z*K-Y
UN9c$@8,&0Lq,)8Pi'4TlbeKMlc*Ji@A@@VU-r(Vj0!Z4+Lqc9(NC4hHCjH[DkSk
8#Q+YKiA[)hb&KGd3pQ*KR1#k3B#,G10qK#NXl)d`N!#&i`9A&31I9IFJC$QeDKK
#PTZVd()l`9,NL5d)XeL)&XB*YV8RENC9`d4Y3"2dGM4U'fm'2)!3pDqJTH1T(dG
Rip@C0k'LD84fZJi)H6fFC,6Vq-'a-9Q@RN@KjeNdU4Zafmpf#DjRKj08m#`NIMD
5Y101)N1H"0KTV*+PUkM9Vk*@Ed3lq#Ukp9i&@q0LfA9e#C'J1!$*A@3KkY9L"J@
,NH#+@B)V4KB[CX@EBVIJZXB++0G1)LaQ)3$+Y33@SQUj0Tb&U05ZX8UY!NQVJTe
I"Fk[JX([#ZaE"B2e&8L(&H`N+mB$Q+!kV%ELH3LCXaUYj,Y3m,S,Z9P$iHc"V`A
T3G,44!&3'#biP"L5rmdi!M1kQRA*NRNKBRcQ[3F!!9@Zj3KH##@l,)2)53MYCMc
5UQp0r@2NEr#[m)FIe%dfebXbmJQh1bjbIIr)"HcI12`ELhpZfcphh1I%Iep1Q!3
rh[-C-q-'%9)[+pdNI)cipHr(%E3&a#qDi(C2m(M')rkm)jcp(4Q,!hp(-![6(((
SP2K[(60q+5GmXb1mCF*LjdbRbGrkMZKjChDVNIHYdHf4ija-d3p1UljECVT0rL)
MalR(&ik,mlJM2*iPj&k4B4j2R-Fc`B%rS9[VpEc)b#mBhK-iCHJB(cQE'%,kaKB
aa%AcE#,-Mhc'iiiF(mQZ-6B@("CkaMQ3!"llplFH-2KGT)2`c!,2Z-J*(VH(X9[
U)8F8&rPTa!@h*a5m2-kEfEBmr9e-i8+bYK+@f1EB"2c'dh'bMkhr#jNhJE#C'4Q
jP0$rL09-XRZliAqAEHAM112j6h3`QNfL@kbXlR4%BqHkekal9E!H(c*JmlZakSl
jMbe8Gbj5(eQNEZZDU9VNYSr9$(RGq+RmUEqEfY"ifIMLX(2Rc`mpGfcS1F9bEUJ
U2mhqhJKqPrhVqm5)*ci-2RC8AA(ZpH!lKjqDX&$Gj3M#Jp8MFeAjT39[2l(JcVP
U&M-lJcmk&U'ZHZ,Qh`blF'T#le-Me,h(hMVfeq#22JJqrRT%K$ULQaV5$ArUVjJ
*A8TX0hNb#p5P%@j2Y(U1Q#(r*!ErjCIAPZmCpIrRhjT2RF[$iQCp[ri[khr00Z&
RCJ)(rYL4UGHr8@lmRilihbrmllp[GRrQARrFielrjhrAVpq2,,6qlalhUrpdcR$
hFUlIj[aEiC),'2fRfahQGRrMG[I$CR[(*'`HFBYUQIrBSYL&D[kaKEdA[4AEh@&
(G%hrqmaIcq`E21a8jErhi04Y9f)ArAABXI&MHhI*(kL@L2FM4KcYLMMDTHk)rA-
XqIYp4%6%1l%4lb`DXZLG#*2&aq0M4icr*r%M6VdAm9D%HQMSd+&rIq,prXHZU)r
rrNje&9bDZREZ5pKpE2NMC0pl4"`EVqjriZCr2R(crd9m116+fqHk6MdI%Ia@42#
aL)LhKJH2rBhD0#*BlE2qX2S(fej2YpN*cYGqTqBlKcYrie3h6H#f2iY+CCqm#Gd
(CTq,MSNTM)Nj&H%KiERcm#YH1YrMijk&ampr@(JPjXVj$h[fl(RqZF,H`mjI+H`
p*Ac[r(-alhed2SD!E$AC&8%B!`!!(,Y"4%05!`!`G3p9$@Be%4!KiZj#[lbmTSr
`90k&UP2MdMj&)AT+[lp%L''CdS'3!!Ci[(EE+N95THRShU+5b+L&$+IVpPM'T,5
&#VUlU,Dac1KdT9*&N9@jaKJ$afLLlfG@BVb!*Bbe$)Hj!f'-C+r-iPVA)hrr[jF
dDB8dRTRGfHm!&@C1-b-2)5)KN!33)H8Ejr2P,KFH2(1!39$K6*3C[Z2$i8QPS5P
3`dX#9Z6E0-NISXNP#bH[lDpql9G,PS)P9Kdj-cTh1+P-bJdeTVbV$%%(MS0cGM%
Q&Cp,$kl*dFI#f%FGUHV6jT,k$r#LARL1[GJ2VVP3LSpVXBr#f-FplLV!B`62-A"
1JS!L3B+Fl!$)AV9jH"`%bZc,p)9LE$d%5GL`@N`VljSUNZF2)IkA4V@4B+TYM3G
IQT@r+G[+PAH5r-"9p5T0rqPUGl2FA,jcrG9dPIXZ,XaaIj(b,!m'PY$rH8F#5ij
9mUX$eApFiBL-MK"-PcLB#G*4&#a3D*D2qjih"Gfqr)hqEMm+rZ+3!'l(p`albD'
Mhh1@[@bJiU[!pH2d+&'63D&9aaj++[!ilH[%`cJ6a124Tp9,[2ZU6j-MrKe#C,T
Ur)B$3Q+#+PG[,pY+"BV-HXF$J'p436XH51E-B-F$dpb8hpcL0Y+'HDj95*je$mN
Y2U[i'hU8KreKAH12qVA@U1KN%dC&'Am8VeV&fkh4lQErG[1Fd'5'6a`IJe#PaH0
#&(m[d@E'%LIXd$m-*48cM##@ea&"--m`C5PTBa!&fbJP(MB,N!!(!E5JilXLjkA
bBE!B+mac9VqTih1[HbKj(HKp*00("FR)HBXlA![YU0aKX&m,,5H!3ZfjpQ@c$+0
%8V(!!P#pX-er6q(Ll@h2Y9fUf0i)k&cV5$i`FQ1KDQDVeR2&jP2L34pNZfAQi&`
h-XJbN!!!V5&N+DP$rF2Bb'R!i[X'UPGCCK8#A0F4hKVXZ0mpC*icf`M!p4[*ENG
iebGFBkpC#Njk2q&'b2RFkm[YVETj&Q&!TlIfZIEPcBBJXLeMFTDK)lKheQc14XF
E&F!5Jh$)3(NSZ2JeGjmiMC!!S"8c"3!(lNLB`LHiYHH1Q&jhGVDZYP3",M@K8NX
"HPHL-!Q&CZ#*Q,T3LVS`fb$8'F*8499CGdc8cAfqSmPZbhNH)"I#D)*[8lIGeb-
qlqlEfY6GX[H)'B@56BDZfQP$[Ab1hDqC8E&bcZ%5cB*BTD2HjQ90ChD+9ZU4hNf
'-1F`'qUF-R5l``@BUh4P)$!@YFqA3b,TmaS)kNjfZjd`b'$(j`YE%-,4-e&(Y#D
8d4&J1-AT9Dd*)96`64$0h,dJ+X8FJp0#0!(dFNl%j4jZ,SD![4`5C)5#c-KclFQ
XBCKULN&BCQE+(ErrkGIB3&J5%MFrVe[4h@fQ0N3KE!j'*RbLFCSl`Q5'A`!bl`e
1DcX1!h52lQa1L#D%Tp2bQN-6UhUi'Dh[GFYB@&'b1pQdr#a(L*@C9*0-kV8[TfS
eQ-KF@8*cC+b'&))JBF''0TMrl$DN-%9LbM)@02N0JMN3PJM5KmDcIBP!4#%#%B9
Fph!+09cTFQAl&&YG5i'@Mb!$P299DH08rp9ie85S%i%'K"H4dC!!SI*iS"D"[QS
3$+r-Viri@Xh+lU(I1a"m+TYE(@U(!B**J)GjNDS*hKV,$1lKfRJPmPX)r4G6f&)
TM2jQS&E'N9GC-[D2#0&i&K)6%K,m-)k%IDdb6126mV#d2'j&-aU1VafSl4q"L,I
'+jqVl)%4-$-)qr%`IMTTB@C"3a1bJK`@q!-%j`&1Jm`XSqNAX#%HH!0AF)qMK'"
1(,Fi3U%m%PL#!m8X8BXH'+(Ke-@fAI!T4kHA1Rd9L8j-$Q@VS(id1r1T@PG3[aZ
"TjP2H9h"Tb8V(EJK4A("V#3k6U'Mj-hU@8RU1&(pBHN*C1Q6Z3r,c*PCb9fBF%3
5aKR1VQI#dMX(`8-$LDNNAq'UH'2"+4ldVhI,paiTM*b2A)X8VdD'B2J-2#)qp4U
AMr[T4I@TjiP`di[LJlJ)QQJN[5![Ve'B55p-*@K#kQ@[MPh@LFX8"-I5I#"fq#P
ff"K,N!"5+AL*S163b$P+'J3P%@4$P5["cqGZEhDeBXZIj*Vbj5elGK*BRDebNJH
9,ckbNp$fmNdcFfFVlmbHQ9ZT[2Gqir[fS@Z+KLSCG)5hfl0"aBCN+m@JI1@Gr*Q
j0k#Qm4B'pI4KN!#k[LQV+EDGKdh[#h!@`H-+9dNY'-P50KPN@lYmIFMd)KQFY$Q
@S5#C1f3+D5(m9VhU+JM062dl[V6PTG!c4%[2c2cPCY8d$aqECX,@58&1-+pPR`b
5FF5dfaNE'U@KjJ5S@KKAM"Xmlcr6B*JKR5!$NX(PJSCfRjQGD@L[+rK`Skmi8&e
rib3Qk`-(AkUIl[K[l0%jCZ3$FF*KaF3qSahV'kMq6SqFBaPYdGMNXV,p-QHCK)%
"K3KAANHeF[U'mL)R*qU958rpk-NVZ1BTei&*TIi'AH4BA#r+1ApDQ+QA,`Qf4V"
9!*KMkNj-84Id6SJ,TJBTK@`H&iAXK'RXY"pmUH&3`'&`li3q`F-&DqmQ[[NNZ$'
4G6+4eCQ`"NP-rDIA)ha04mY6&,i`KdF-cX6[h96KN`+NGlYLk"'[Q"kl)T5GX)c
i*6)fl8I'[p-ZA3H4$iShf+9e@0lde-'q9JVjP[83QI6VG($+dVr,+NU#F'e$K6D
Cb'dE@2CBQe"eQU1Up[N)kU5TeiTic`M-E*p+51Je!2)QchcUmh09pB,`--H@`X8
#$MMd!KkThpdrF[&X&PdC!jeEFI3DCIZZVAR$0qh%p+#B"0H4@FJkENrJF-(5I&)
b8&e+*'pVr!@*,35HS&Hk&Ji2(Q`NJ-,D05B)ZL3))SpFNiB4`bIcd4%iECh#BJ3
j+#dSm!5@C)k1N!"JNkU6cr*!I5"38+q3!-M9Gd(JTYI2e"q&U5)q5Jl9Ac4qF'T
&%)HTNiJf`',[bGcilZXMm59)"3'Pd1@L`S!fL1&L8XQ%Dri"6L#0@)DAK"N,VB&
64bFQ@lk"l2p6(l+,QaPNX@$,i)j!Pf&`29fdR[Yf)Y%+kUG4R&Yh`jkYQXePMdp
(0K+&NAZc9@)G#F*MFfCcbSUNK1%U&FA,&'Dd6ZNU-Ya*6d1lQ'D9h40E4#G-dCQ
L$Z#BY$KmpX#N6TL8J1pY,!0I9VTPP,,$`PM'[4'%J6&CV@$i%X6EJSH'@HQr@&k
#M(XMCGbi"Uj4YVGF'j%T4)VlNZ@S++GN%(IIR5SYXipY'N3H*UY06@T8H9Q1qQj
JLqM19*DFqBGA@0*[aXpM$PjcIlE+Ej)+E2)aJ21ESD*rLJSTikLP#P%d1kAb3S"
6#frD0e&ifje5H-+LpV46X89"YC++-Aamj@I-(EQT)3PR@E,E)aB*cXZfiSV,Epq
dba0(mq8*C0(6A+f$3dc*G%rES[I1l"H6E0"UD9""%3Bj+@1L3GeJ8blEC2[4i)Y
(r[c9RDf,[Liah"A@YpdYiVYrrXU[p4`5&EFcL3PcX+Fpj2RfI(2ad$8$H4'bRm%
h[`SC3pGDLD(8CYR,"CL&!SrANi-pKrT(4*!!D189-%[,A!&V(k"6cjYI1E6[fqj
`epP8aMC,c$X@*QU"p`2[GqINA2R'H1Ha5TKLTJ'K$e6bCB[c8TJ&FX[BM`VNq2j
,$H9qL2PhXSV0iU,KV@j`&2*@BEdQN4#q-6qUI$RGYkCC[Z)2&KVcMa-VU8l`VL!
)&pc82Me@+G!eFk$5%EYb)6Pp"!SD2JY80h`XAf%*21"`[[1Pa8(i$Q5b"MBA15J
G@qb@*K@0*V'T1FUc1@a`F5GeV-mU1MVK-L-T0NUKEKJCPFHA6#J*%J-h*i5ILGr
N1-%819lILi+pQ6,Sj[J,JXGTBh(&`F,4N8NBXU%HJU-MbbT--*(%Y0""JN'))A$
M"@4qdb-C%0ReCiSYT2emhP8BBI*J`mIp-!M)Ef[$C`9IT'FD2PEKqV61"@LScq*
lfK'bIY*3iG5Q(bdbY6hYq8mL@cPVBQ$)f0XaQ@[iq+qK!+kLQ,UN5e0D!GFE2SX
2hh$&$+0)8p"3pk"0l%8&aX@qi'bi`)SD(QUqPMU%&1feNjTZ+*lYe$dZPqqVI%f
r%Z%PQmbSY`A,UrQACS2V,86X#SSc)$ZPbNqV'qTPr25-&($eJca1aJ$jX@)C6K[
F&-ZJj%C*MN$9B"2+0P&8Z#rqpie&k[c$&TQX#56,a8`3(M0"''ETaD#FAjHff$-
LFP@,(lJJ(9JhGQ"G`fG"$cpipq4,alCdRTq1EkR[YdQqAL3IP#e%%QE(NV!,LC*
GD4)q[T)NM!dIPi66m56-CdQ)KhVA#9MTe-mL!EIN"m%QA2%jIX&[p(8IcRBTYQZ
4Rlre2l,Bl,PdM*9CHL1,65SffPCEMMD`PLhLVc$FHjDBlejHeh,41Ghe83ZpTPN
QHFY14IjEKiRe$V'T@[YdC&PMZEEJH%(!l2-fNk#&)(!KCA@G`9[M!PGa0i(VcH0
k-qY%8DAEihpAj'9e-%I0JfpEH2c`bkaRDh[&$R3pKUkEijRSNmLmPeEH%a'6f8#
)&IjaF4eB-)eHm+(5a`YcA#i`C3%pd+89E)ePR*Z*!!#B)-FkK)q*j'Bi%H[[S0U
HjhQmN!",dqiF#2IM1jUcRPiBE8rll8X'YLYX-T!!6C!!JpdXZkqS''iq5SXqiA,
jYI0Fl#AbHXQXE6iIqDGUHH,L-!R$X8f'#X)8*##RC`5AkILd%ERbHXL3!(9(#Qk
P!J8C$3ic4Z'kq9H46+1Y@B9IIQr0)FFkfe8K5jH(Y0qm[XeZ4Ilp6!V`VNa-Q*U
9i[kiMJ%a[C)VN`!(AreSPSTJ*+EhF2&d9U8#'K(%*q%'C(!LEUZE$I@KXhT!i!8
(3%VQ*lX)pPhRXVT3M6kqdDGmkp+UrBe)!M@0JrS,[-T3I89Q(il1SCF0-dXV[39
,+fRUbDX'&m[TFm-,q,b$5YENkmd'TT&JNNMm1iL%Dc1U(GJ68FL2(3i&Rh[pKHC
@E31!ZbR$93#00,cXEX29$Aelfk53!)(rCMB32r3#@aUbQ&qR!Nq&(+)-JNU#"2+
BFqI!1,IrGK@hTAUXdJUSY&p4j56`CjeV@L*1U,X`CR"21`k#5'@[T*+Pri#Mq9h
+PfDI4UkJ96SpqK!1ILTl8Jd1r#X`T@QZmb*%!Srb'Uq(ZIHehpGN%(#b[A[ma2c
B+kY)Q&JB)f1GfDKhJS*eHekrVkQ9*`k0*f3iF[ameeFiFVfCZRDcVRZTDiS+FJQ
(BGHQA#qI2dC(,i8IEU6$+pMKrrrE(Hi%+E*M5"4$l+fF`NClfPSh+9aTmNl33&3
k[VNM,qD!ZDIprlBBDUbVV@"&*Rb-b!*M1rreZe4`'&p"-e%U&T,DBe'#Be'3!fB
e0-@1KKUB)*C)BYA+YRXRU+UMQ,2mc(IG99E91##C!0Y159618b&I&eZP`UDd*DS
`prd*l6Y3X+5#A&ec`B&aQpXNE@l-[I#C1('cT[P(TXIX[b%ShlTq1!k%d&'#3Gb
+",!#rY,-IB"iZL#HE`%'@HBV"[ba$m8Y&B@5%*bc2f5GY62PA(#9iP(K+N-SX8b
a2@p('(09!'kEr`p-!Rif%k6VAQe19!V+&plMbBRVK`$Rm8J&B&d0aB0Rm,1UTSC
H8B!STCqDRd("aYZRq+1ZhcNZ100F[ra11[+Zh34FqFH(q'YFqJFSPAeXiJ`**B(
QDB+*H"+2,ZlKK)`qcLP@dd-1`U$LG1a1S&Bm6m!cZa6A9$(SM`U6MULY'5lS5qC
G"f$9,PjrN3SjRB#SAk-*df[f[i&$h-!$2"1"H9#!`P`@'dBMNHT9l5L`$8[(jXe
K5S6Bkpqb9c935bkaLXeVTmU,E-Hfmp#PcTf0bCahBX(CLhccfY5`aF%eA!ejj[f
+%Zfrp"2J6FCr(UE&cfB+iESfikH-PM$[GVBV,T!!'GfkL&"'"U&L(@$i4Dk(KN6
0ZEfl8@ldPjT$&YcC3aHj4S%h8fA1iA!CGH4X9hh$MQ2[f3%8r#'Nr[ceUrCN*29
&e+Cf3lPKAM8[*i*%9XcG12$Y`-p3E'%"V5[IJIdh)GR$D)i"G(h4YM1F2fCkGkh
PfU,j4)EN6lKqNI0Rc+%hYeQ''iQqqiMjk%i%C+aF'V")Er5"`qNZ-HX1EQf@`Ji
,PaVm6&(XdbM4@I"LD*FYEBM#G04lR&L5lZBjc8p[1FqY+c"%82kBDhi0j+F09cr
d"'V3qcm`TmPCR5b!B-&36lZlA64`-BDklFRZkiHSH!BfB"(R46eS"`-CkQF3B@+
5S1cq%9ra`rKBeR5R%kkXThpq"%BkI6`R2S33G5F,Bp[0lPdfA+U$Z!J2fV"JcFm
h2j0JB#K"j(PFTbBi!hpRrKiKHd&bfdq!DP5i*9-K84%8@5pNSe+BeCI&K1"qPMB
,mD'YeFL!bIe"HTNXTqlPr9bJ`bMZ[5BZSdfa6'!ec&qc-jFpbD9Xi#0ZS6*pa'H
MULLm(e9(j-q#P[GMN[iAiVk2q(%@1Y2&5ij1pR%U0R((i@3IcmFq[,%"FQ`Li#K
Q(rQa!jYL!p+aMp!S2BTSHGJLQM2XDEqNlfaNRBR&M*NQ$[e"$,9XKKZf-QNCc`J
+M)L(R4kAfFYPpL+c&jQp$,+A3IYB)%B5AQ,bb[PXFm,XcaF3c[c-R%J1rQJ0VQ$
"PZJ"AhSf'SEN"F8LE*,Fa2[HYI[d&`m42,QRrI0D`qbHf$Y%%&EjIML%9k(*N98
Sj(AGj3%H1a#P!h4**IIecUi%aHS5cC4$`XZ(AM`%TT%*Ae9bG#4f8#Yrq20Z2V[
R#%%3RbZmdZa1!#XN11k,%)m-!X`3'"6@Z-j%hUqS,@4'4pF#qp'`L3`[1BK#5DF
CIGNZ[9aCbddBYP@a2@$hGH,(+D4j9,%V0M'E"6KL'U*P1X8N30EC$lip0P5RiB+
6$65bAJa665G,V*5JYeYLYR8QP1kii&D9@)$R`!c(K*MJ4rm1+HR&KbMam`A*50`
9&q$SUB3!4aq(!!rJdFER406)dXJ+09qY99q,r#,k12[2SdimEL$JM)CEJ2H`G4!
"P3!PXaa+6NLL#9L"4eZPB3MI6[1JY%'iSNJ"epD9(!m2R"JGLBNb9aq1A`)9'P5
SF4@N)(1hkp42k!#Th,@#UfkM&jFL``j26m1p2KM5k,#fBkYG&'iH*l9`!cNhF++
lDA4%EMUk)PE"J'R&0MhZ5MH26BdY`iT2KH06[I'Tc[J8A!p5,XDfV8Hq2,+',Jr
iTPk2rlL)PTeLjXli`L1clXT3riZ$jf0,99H520CGE+-c4Cf8A2(06kr-F'B1L4%
H5ia1*)CcLP(#Gf%8LG$"*@GPLZmZ!J4Sm*S8J3Y2@G,`)bRTLBYG#@"#iIYVN88
FM8ejUG*B%+XIJTPBp%[HlkY!4JL(6VET#LJ`b"#-m,V(MQFIL34,&4$C$Lrc"0J
bbbT6#q*MJ9m%qB'f)lXNiT+"B`&M8%R*ac&!Q"V2GATE("4F84IB#lC43lSaTj2
h#G!Pi00k&Zlr)kj5G[JD6,@9ZB1[SBPNR@a("K`$MQR+kL(PB2$q(SCbTJa#!iP
c#&Y,*[6f(!4E-Vc+h3lMGf+EmpR38VaZ[S*JQ%4Qim15l9Bi0V!Z-C!!1UY@Z!f
kkZ8Y,%J@PEBJ(5-J%Fh(+D4)bPUa-5G6mRj##69+CSIU*22'J9r+e-!8'%0VH#R
!bM9S3f!0l"S,cM)#kSieMb"hLCKJl'6%H!@)kmqiX[`9X-%D(N2F3%2H#R-Lp#`
B0M!pb[p"BB3G@8jJD`@Z634`Yp-&a'aJFcXbD(3I)mG[ZABNQ!S3EJqBLAB%$RI
%'k,5rjP6I$CB366STB'heka(%#Z&h5Lk0eGJqSUe(!*LVAM4IFlZR'mB2kTSa!L
p%$mqV0&aN4STP",Sq"-)-CDMFFrbEVBmP,'A$r*q!11Im2lrbDhiFIdTRmLfFJF
[VrV#f%B2ISC%NjU)dl8)H+N`J@HFf'i324#rdRL(*&lqBCTN*Q1LiaCSm0LLR&-
@a9ej&PfJ*ikB1phBmNq)j(c#P5G18H,KJF4$GI6S!Nq65[pTFl#r[EqGQ%Pd+03
``l8GcF-&N8hXHJU[e!R"3P)(@DJN,#8e18l%%rU$-RjGq49DmA$P9bjU2[P0Q+@
%9fBZmZXmKdF2pq!abK8m4$k8@FH@jC!!R-9)2"J*FH*54N,L6S$S[-MB9!j5m`Q
4'ZPk#f3+bF6KD&@4r'IchYkFe158-9iJ$(V6"CIVedm([lF&j&K`P)@d9a[IYIF
d@T'&C,DL-kG0M4`C6F22"[%9J9T,lS(c10qE4!AFF!ZZDjeZji+Q!X1LLC[LX*X
q2K!,Ni2pKmc"AErNQU@i$I'1fbQhA(`eX)L1LGV@jQ3,A#2Ir[k@%L1p#H'mjU-
V&M5GJ@0C[hf"rFc`r9r4`2ZhN!$5Qdh*PJII0M@22@PRejHBdE'ARJII&S0`c`[
qk1frE$Pcbpf0BR56qCq`IA2Z--,qKLrNTNXrZ2pVHMcapp5&-"&F)9J$I`0Lm@T
mQ6iMYN$eHeZ53kEZ,j,TF+fIL95k!mP0bkXG1!&hACXTaeNqFXR1K#@('kQ4Y+r
ca81QNlD*JVhF8F9)d*S%#8Sihm3*Y,9MM"LXL8qQXc%#Q()dGQ%G%3`C#lfp&d5
fGLU4[5f-%GN$iiKXD5U4[5dNfphKZa2Mbp4T)a,VhDk`+T-JXEH&Zb5a+@3kPEM
KCa&Bi2QT%e4"8i+-"EDR"Nk-QhJQ2N&&DE1kBrmE%('Zi3%`B&,Tf%r%1XCXcdE
4ZbM`!l$FV35L))0$ASNU85%aa!aqHm0R['b(kjdUM[jPRrpa`9Rh$Aq[ITUri9q
&,,29M&i+5bb'ml65U,bccHlBZFhZMU$phK[q[9B,P%kciBp*$pRT1ddAHSq)5f@
RRc*9hA[)H`5+9rZBF`i-m(FTi*)"&c824%6hE8T2ZNUY5@64IA'f"KA&PP5`%HH
2[Q492)`X@"mii@dC(8'e@+Zm)QA%k@Xp)`Q3!)NjN!#q'KGG!Xl9ArH-`1RB&RH
85h85"JaQ!pbp)&A`BT2,aLDPL5qQ6$`mC@*rI)+bra4&@q-G##cBr"9`QKcVM14
,M"Ycc%a-*e1FFHJ3DiLG-Q"d["-[QNe'EBfA&[p66D,$%88c9rfHaAmc$h!9$@T
-@63MQJ3k$5clFHPpj'5S"P#FkKP*9%!kp#r8&CRL-'ca5#U3!0`Vr3%!P[Q$H&E
J6q%Nh8(m-4c6$DM$VePAV1$#PUG9FTN$Fa$1G-%N$jf'F`N9U(`DQ!%6T#"D5Hi
Q6JVNq2@E66pjErN%6b*$06%GCY1Dh(*d36BihQ'4*d!H-[Sq&VV)Je14`05lNd-
S1"E,hU0P@5IFjE5X8b`fKdEE*hlX@'hqm1Aj#+i1MD+`qQNdm5GQaLY1U)#SGXB
2KlE6iD`cIQ`--"eViJjR@D'3!"Flj65F51i`4jp4[+Lqdh,8A`acUjP*RX521E"
X9pPp14lY(m'!U*mFJ94r&Ujai65kCei"L&J"YYR-p-(TS%+j"jQS,LAHYL'3!1T
NBB3@+fMM(4LN4$CPZ"l5d*X`$kV#[qd1R1,&l*2pd4Imq4fCQ+jiPH"r'(MDFr+
e25r02ILRA'l&RPPEFrhrGZ(2ZC%rN[r0`Yd[cDh"U%GIr[T#hRX(&le8mfDJlD8
PEqCmbc"pE1!rEXcGQbZrF#[hbp`Va`pqrB[+JiGAVAeSpaphrmf1hrhZGprkai-
IIR$VUCamiErRVZpIm9pE1VlhJp`(&flq12ILKEr0[AlKCZjFfj([eGArG@l*Kff
($ZHkrh&&rC,F,3!!4)K"4%05!`"kK""9$@C&!4!a41j%[frl(-YBC-KL&l(kC5c
,-R8ZP&J,"Q5+M1&4MaTUL#GC1E"CSV*M10iH(QkkJ4#5F&*#1*4bZ-m0"[$pDq!
!6DQePQ-)T9b8`fd)*BE5e()&5LQKA*35,b,ZlrrhIGmfK35HqhPrer-#'kdR+4H
5)!J#)!J0,qlPhh3im1#(Nf3!%)T@RPa,N!"2Mm@YQIaR2a5p%BmS6D&A4I5D!"K
DH($K'k'Qd-IL(3(%Si+[[1lj)-%%#8`cGBdMIhS`ERfbCf*&3#6JD#3X0K&TTXe
L#S#!i9ji('![!VY4-&p,*)!Z$@2*[96N#f92UFdX6UahEc6TkRUj%SN65&ij)EB
$9"d!+F3PcK4ra9eLe#3&I`@aS#5iSR'@2&`[qYY1Z5f4,A%F%A*RmN6)Yc%LaHm
NiVrFB,+l*92BA3!b85m2c+RNJB1"q"dDeR6+@6c,NVd$RFhZ5Zib4CrUXClJVSj
jfh2&GKZQ-1e9TlfB6V"TVdh(&A`%E!AS5P)8!#b6H!!0NKJ3HHe62@(AkAU!GZG
YY`"J#4"F[pq@DNXe0#Pd1UJ`M1%%k"5ZY)VY*JpG#Q"0VU',VZe'9qHd%54d#1c
hd4"Al(9FN4IXEH1#9DS,4Nd9!6!Y4!#,H$'6DdHR6'V+RM,*23C'jMd#[q+#0%)
F%pI2!C3mjA[Bi"!#dijHkj4DdC2E%bN`4R+)fqC0U8diNiVMeN5$VF#`2$+#*Aq
U&k@f&%63BM6GDNeb36KX2i2$YV,$5[32%d#B[+&r-#A!2H8r&G[2M8hj%jXX+$@
j`hh+"&%%m*XI)!3pKqchYp&fm*2$q32k5*GX0$8kjAYJ@baZ)'(bpSp1f3Sd*ZE
f%&+BV$9Pa!8(R2Mrhb(BCJ9RV-)9Y5MH,k2PbHe"FkF0+""BeaJ)!'0Ni%h&"I$
Q'!I`pfjp(pII6,--Q2@D(L-JFC6!V[F10'Ph"e`Gc`*mlFEr-"rKFC42KVR0VA[
9(GQ%)+$&jjf)MJ)$2PXLL1T%&clr,Y+!c`*mGN5Lq26JXbF5J#2iCG6SFL13!$@
XrGN2!GKBK8ADE!TPfK&-0b0S4F@#1HmI$)6F-pIjC`%-0`!(@L8!i8-@*L3maN1
kL&6)K$h)I5AX`1[X`1C-1jCpFf,N&qZi&!PARH!P%@p&*IG%T*!!1a(91r`jmDM
*Shp"9bN!0Q8Q3RIFmMEB"LlK8F!pRk+S$f#5ZrY-paQ`13hD3@@2pTRrhNV!VV#
10`3j&I+jilj&P*SX)II$p4GqcaX5!GXjpH*&XVJ6)XbjUP3!dK*)!CG(hC@+ep6
3Ve1mrEh+pBjjL`T$[,[(*,dpS(M4@F)k5aES,%&R!HXX@+#c303*MK(Q8HBHNC'
J6VPVXS0)9lEaAD03GZ5KJ9m!2R%["%NH2NU3!$@$j,MaSSpR+Qi*Q@*"a10'*d8
pJK+!PiimkmF*9fM3iDKpNC`Kf'j`4-VF#G#0c9V6H#YpM!rb-3,S'aT*0!d!A$3
KfAaY*pdR`@EkBjjaPXMHB1$j&#cT998-,(,k*eN`i4-$D)J*i5U@+H6T,bUF*@a
0mNpQJ,AVd9lHcJ2G23#LrbR"r5%5H"6d2Md'L(FR26J)'f%)q8p"dTrkHaiB@%I
LP+DD,-ND6bqraq-Q$km%j)3VVSD086mA639iD%e42$idZI$i)Y+**Q1'*[)d$B3
[+5iR-3-E3`Uf0Z,amhX41jY#KX8QA66*VK(T%"X@Q5)")P5d2S*XSXTh(ba5hTa
(H)aB%q&J5qQQ133Xmq@S$A1-$FI380[,id4mZHdJBI$*@D&,4&GiBpBBL*%00-%
YE#+"#CGcc&bTZ$`EJCM,kD%A,)SL0(D+KJQKFCJeTX95m#V4kpZ2m2@+&ipQT35
2E8S"(Le+!alGbJK-+&c+2BM@C%a-91lLNDYdi*&3QMjp""c-46ckP%%m)XT%2!i
UBhLiP@Bd'P+'m3JT'MadbRSF9U`3NEbC4Gb*,"r!bj@+MEdqBKfcM4PHd`&JPPq
b$CmDBZarqpQT%iU96I66",dQ1&r-%+3,EHc#)@@pJ)KkE6-BK&"@H2(#6mFBSN&
P$&-k0Q($4+25pa&YD!K4S"A)Aaq0+4G`9'XJiDi-*%bdTBc!3GTN))dGLbA(S,6
!)d"RBm!##YEYMmB#kCM-$Q3lRE8TEim&FS3PJbMS-!dD&LkLh08liNI+8fa$LRb
)FK(6MbL2db'ePB'$EimT'@rhqE-`0-HIL8I-Rd4N2U2`FXa9QHk#r4bNk1rDjMX
fM'C2fHVB)JHbr'%%iK&Eq(-%3-I5U5XGZaEkQVQe(N,'TI8Rq,e&l[Q1,C%4)3[
raKB89EI3&$*aPr-@'Z`%djX23#J%6memAJ)'ZSiGFi@1LI"la`"1A`G(Ieki!Xf
h1&B5+02&(DXr*k,eFQ+k3j*)62VU1HH2H-ALQkI!,+hHVp"4-`,"(-I+aQKS#')
k&Makp@a)`PAX1KbqqY)TDNE#[Y%M$M@(h3-jKC4YiR,H')hHQS*r*PFQ")KVVlZ
4&d2`$GE#m-@e'-[Eb#8`UREmK2%6a3pe[iMZ5@"b'dap%))0#*lDIKF)mVAd+K)
a5R[6h-r&)BK',4KfN!#,DF+T45(-Ljm5%!HBm,8[3N#1ICk1i[Si'ajXL'Jid#*
-')qmiB'6YBeF4%&e("h-N!$p"T!!p@&3)hF"A,)Sam8-!EjVIip,(kAcBJM,G1j
4A(Li)$,ai)'hdlNA36QGPbJMH"3JS+Ic"J6dG$k#J*lMU)06TI01,XRCNFbQ!,M
lPDQjXC((R)ik5m3V#mK%`pY$%!2T#0BGH1MJcZPFSecXIMhMG@G*MH@5*C'"MKM
V$V&ZC'Y!X&(*a@08HHSM0J#2IZAaVjp3FKdr-IR%SDPVF&9*l4PaE'#GNN#%D4`
r5GC30UlNCTA8QK[j`r8eCbqGGF1j)d(h[8KF#c-ZDrfFmpNMj&E-&31#+dUVB4D
c%Lkc5!Yc"M,'@9d)Gpi!Gpk3!0YM+U&Td52H!@"Q3l+'AKXp$fme("r(mD*6UV)
F@2$SUr,4#,jq"0q)8iNG(@FaGAldZ#+biUhidGpl&,c'f'Z-AK1H6p'0ReKZbP2
R4HNQ)KT"1ZiqSF4-!$eVGBTB@kR%-4PNVc%)0NcZX63U0HD(Ye`kbkBl%93UBY)
$!(D$8qGDMT!!8ba+F%Rka8T(4IT`)d$DerI40KlHmVF65LIE6!bEkA5IcePJ+rj
GmPBSDZX4YG3%BQ0eZ1"d2B*(3aXC4L@cab*k"#"Q!eG,XbeK([&J%0!)l*Fc+SU
F+!`iP28(ZKDi0PHq0K%@MpkFleMj,SC$9#abV&DA%X6qJGml('*aXUEYpH!G&"I
9B1c[`TDqLSb`l!a%990Bc46@-`1Ae3QA-diI3BL+#KC!F2fLK#[c'D"Ap$QbC`4
02+cT2!!3`U,qD%G9H)f@LSe#-)[+`5``0dPajJRC2M%#kUBY&$K-dQ'BEab'k9i
NN!$%2qT6'X8lZ@GLlS%r+"SbVD(riKfiXje06T3R'I*Fb6@Jcj8@C!Ia3!+2)-Y
@'J0T%2ZD`!NmqJ128(E%-T-[!YNqAH!%KSa-AFAA$k`,C'(V8V)'"@621d8)AdN
4`GbiNk,"+G(Lk%H'XTNL)q&PABZS'dZrcRr@bBlQmprak&[XD0&`Y,M!d9RUd@+
CSd8FhEV!`5jfm#!lYX4`E-N#ahDTajBXH#`6i6i%m%8QBS`E@!5$cEVY88&CK4r
!R)P&3M2,c'-3(`&VI@fP2iXbDCBpGiQk3)kFh5C+p*XS'53QG'43#KH2C#84E43
'1K"23iaCJ&QN+C!!T,K66$![9BC16dV!2ElHjkM[NS$f"XU1V5F8&eM!$H-KZ2U
2iV-H,([8@UrMK1V+"h3Nd'f)f1XdMRT6b8GSSJa4TKd'-da"LMZ1Z(5X3!23lJB
``2FSQ(`d%d9AA)"LVmDa!8GCBA#'BQq%*VCJBMLh4mL5e8`iar'+'LclY(k$U43
a%EX)D%!&dV*-!S!&1a#`mV&i1DCFbZ4&pp3eJ5b)eC8NT!2C*Lq%4-&h,+B5J!N
J4T`FV0!*4"FCHkbQ&q&kHC%4q&F6Q%3[LLmL'M*-VI,a5N)qARPm@XFVZFEMP9c
jH#8$SV5Tl2'P&U"2IrXbF-&K)`B+C'0Q8N('3J"Ff68DlXYdZ-qDJ[h&ibA+b[p
(5FJU(N9%H8efm3ia)`0lU0Lj[SD+R963YYDEZ$m1Sp15dr@K-5"HJKr[GdL3!*C
!Z$`2dF'BP-!+!,QcTJSNNm01*a$Hce!m+aEAISRA-qLm51J,6%kJdURmNU,L2VN
6IXCP+[Z9U!BXadf6&apDI%!1Zlq-M,#1$p@1,``G3R(3PHRF#91(6!l!mbk`Q1F
*C)UI9EKdLcJdTjcI256KJLf)LVP@qU(L63k+Je9(+r3,-[J!kIAS$#b(VlqihbY
-V'BZ`iSeb$T80TFVUrUp"&cHIUQCCr4!G#hlf3pr[4P$RN+!M3-BFSq@')aRFc0
(3(f+"382!RBA#KrjDRE,q@TNQL)qeMhC-el#m0D1H@ZGfRBK%m8'pS(&fMFp&M+
!+CPV$5'!l$Xb4S-!DP,J*[(D,`Q%YlC"E4*A$pcA[a(6663Y0dF`DK@DXSM)q4c
CYX1'V*p$X0L-P`C[G'R`(5qe[r1PY"MBF!SLT"Xr,ILaiUF2!*00iKd#fikf1ES
"K$b+!8%'J,3#*1J6@eKRUk-&R9&$CapEEJep1&V`Bm920beq[lHG!!R-b9FZBLi
HT-aiSBi!M$K1ab,$cNMlVq0&a#8J6SRl+#YR6BqV6BqcK4)4E,SkUTkq4!%'BYN
V"#%Ql(3%SLJYI!5!'!&kJ++G!+Vp1Rj3"Nl!dV%9JR1-&@4DK5""*+a)P,TTHQ9
(GimqN!#,!4Y)Q!%-4X!,#")$iir!#*+&%XadiK(,e0)"UjVFR-#9,#[`#)cR6JY
!-Lj4dXqZ6&DD8'$+'@PQQ8"TJHmJe"R`b6@H!j!!H!m4$"21Sa$d1bfdlB4(k0B
lh-1jU8#ImFXell(X0+Z-')Q2LIMT`%mLN98'R321q%i,EH$h$pJ'QPMfeX+%mJP
LR(GD%K2,$0,NRNVSbNb11%8dYCHCPT`P1be'%+`D84)Crf04!3aUqUcTM2d+-Vf
`5AT&-Zd0KdrA&`41IrA!SP@-J"m-+MB1Jf!0#d2EcTZL2JbhBhK&`,5+$EmL$pF
C!8I*C#+EkALbTl2#qeLihFGKk3e$EJM)C*DS!'C#6-5[`1GcQ"lRp#3RYL'3!*N
miiZrq+XhN@JF6b`"XM"%5(,jZAETbPqpMb'ik8dM!(M,4bJB#YhNS))C,81L5Lj
J-r'VFAb-M`Pd"-"Q1Bi*JL!5,U@Z"#pHDZLZ3[F*S6[#LhITCdFJcAKV+cPPC2P
8@*C3@#C5P&T)RZqS3M&CikJ5#XViA-d5'f`)@5R60i,AYi&39hb0XN`Kde-[1a"
p[qedkiI)2LU#GiiTd9pPYIcP(lJAA9D!2kJJ@B@A39D8r0Mq+jLU!HJ'PK5&4l#
N%J(j&4eq02KC$lFUJ"X5`5HF'(%fJ"$KBBpS)ST"BIQ9X@-&DS&D)NDlQ*`r5J3
-ElIi")RRkP[DGTL'`P#I)P-Sp1Be0+Y4'ae`1&"8imTbHG$X(dB#af#)9hf9M0I
E$PdcXH38`Q(raFK4R&G#e(!q`bJ1JpbGFZ5Df2CT'S*CPpMfGMF50D4KBckRY`*
&+%bPF5r[G)BV,1RE`2*eU8"iei&'!a!qM[mPq0q!JR)*3*%"hT@JMf*mZ)3*@bV
%%m6GQL$!Neh)i(bf%`#fR1$ddB!I1hkk3%ESK+(k@qrFMBmBL%iN1Z)G9H[1pJr
qhCe$rba[9GKSDdp%Kif'M0[%T6'a$3aKR-3)Mb9Vk"UZ)mLMlB4#L8-'E9RrchF
@@,)i$K)j*C*5M-He`!hac`l!@*!!$X)4)Ic%fF,rk0V!!XHdi"JVMK(eMm(`1!f
RBBpHqqId"BBe8,C3DN#)"VKG*JR4I'Rm[HUVB*+5BDbh*AMRp#Tq%-i8YQErY&a
JDjqYG)pp"i!+J,c$#%U5Ba+j@'*%kfmDk2SQjrYje-@ef4imITF6f+pX[3G#)48
&*X&3J-KK1c%"UJk1V!-l[38!'6Z1&GeMh6d),VVQARi!aF8$`9lqQ0VJ!&!i+&`
IQ#02-T!!cN%'*%,a"&-(8F!RN!$133E53G#@36U"(GX%aLJ'aQM$,"aZmQaM"8k
PcK!!Qe$JDf0"X*8&`3a1!0TF"+f$&,3Zch(@G-L44Y'["Z(e&)a4r'c,#YHE!I5
lL%3Z8@ar138jqN&%M#&CK8rYZ&5k`e35d2%rFJ9!QRh"X85$f0+pcaLF2Xe!iTm
-"+55$bTjP&dMST!!ZqR6$#@1Ra!5mN9c,5K)D9K'&`H6VX(VH[BDBYPHR,+pKq6
K",l@B@J3"K*JR9S'YF`T@dmpV(q"jf%FK*re$+6GCL)`F4F&"j!![P`IAGI'Q`D
%)0()+5R$A%[fZT!!UqQ8GJ!!4%mT9$er`e(i@3rb925JDaZ"9Z*)cL3)Xa%5CS`
TNBMX)N5S3S5@"PEdFP'"E''l)2"9"Qk#bX!"f%-0H)Rf2)"D(qXc2IPhCDBRFaP
M#eSK@Yhi'IS1NG5*H86JY1ENha@b&mBfkS!'@#6''JNX8K40,ZUc50pDhmb*25T
0p,2q*NSQ0bc*aF$6XjLTl,!pSF-55A(39m+q@'#f1@#Q!ZBHmrS[I0ckP4JSXJM
!m*r!i&dXEMX2NXkZiC5@[iDe+U-e!B4qlD#3!05["-5GNArF!2")5S4)h8KGJNe
3XAH5X!@BV'a'&ZPP*2**F2eAX%!&*Nm&P[PIZA)rK-3cjIpIkK!bXJRD`HRchKU
#5G-%)Mq)JdFH&88NB0SkI9lX$"2hVcR$p6"%*2CB(-c-,Y8pdDQ`cQCa-1X[fIT
GF6NK)),ZeTXhA3#jFdJ[&,!9*"ec9Ce+$i5+LDJ2Y*')MAqpr2Z8i!FN@Jr%"k%
I@(`+"K3Z*,k`T1pd[dRJdK%BRNCD#,40*KCS($@5[8X0H!kIF@T)aKGkMF,b#bd
4J#cAhF@Q%PDN'JFN1XZrc``XhQ$Jp5&M8Cjl`6Bd!5bb#B@je4@R$NSShUTJ%f'
a)b2p4rX&0QFPLPq&9`%N`6(,9F!)0C%3AI@P,K69#irriiC%'!H3!0XAB(J95`!
*8ZLdQcXGB#JQQ3SSdY9J-%NY1Z%UN!!VNP5R@5BE#)%!6UED"ErHr,-I6[4E[aH
mTj'Hqr+jP-0+4p9I"`QS!QFDb2'Ki(S@l-!XQ#p8rDda0K3lNdZ&b-R%*-19LJ3
JM-Q6p11Y-'C-G*Be+I!"B(DkRV0QGS[fRT@',DZeN!""K`C*)TGmAcY!4ScB@!&
,S*EIMX,ShlD08%$bZSXM(MS!6TF[(U9#Kf0Y4p@b'5'!@QK#MMbJC"HM!,cF3rI
C)(9(pE[j)Kc9J1-,qip5)J&1"E2&C(kFX,(NL[PNfN3G*'`B)Xr$M*N+%@Z%B6!
d''-&Z9@Q-%2T4"*-3aaQQ!d0*I(i(4"kPbFDh38!M`-i6N,[J898TUlM#YL$3,,
'RXrVm@0T'QMY!a2qCP0Ia8"f,4EhSRBJk#&3qCphdI++3h%N@!3,CJ1Bh#d55(#
BL8*Li4Y!'+3)#4N'A5SeL%M*8A8B`!`S&RU)#Icc(&SZ[+!)q1FC-*USHNj6"J#
eQ"`$!*J`@1MmAfpZPRlf3jBe,Yr2+H)*r!V@HlQl,kFVL624`3-Ab5Rql%2aSN"
`Li#94"`9*J$"%ac$kraarAQ3!$5H6F6+ZJC0bkl""PUf5GE[YTfR)QBMQAHY%ee
,b)"V0BVLbdd8I5YYU8KbpbbZ(F&`#NTHFJ0Y(bh'LYHQi4DcY(dL+rc%lL4V-K&
4L@(KJMRRdh8S4N)X44Ql&ZP#C"&T@k%)[(Qf$D4YfdKEAaZ5Z,!)'jM9Pcf*h!U
ZXJlAL3ZkQ8*&Jr`)QEU[lUKk*Jq1R3q3!#"0kMH,0@!6TcmfEBTHZ$IIT-('!")
I,kPZZ@`LGemJeicBXH62XU@TFeJQ$YkE$f1r4E3B+1+ILR59(HJHSf'QZh$hNfc
*@TKVVk6Pk6pUF1c&UVZ[aXY5i4!ipl$BhSM#+!lZBa%[Afa@,pi2Jme#&[%(5+K
KHk)3mH*TeIRFBJYF$je`[SR-CEh-C@qba*Fd0+MY#c'hVAQqc'$CFIhNZ14JMR`
'9%ALbTUeY-b#)pHX-6Tbc6*bj$p(Y&,TM*db44*`KrNa$T!!`R8K1e4LM)P!&[h
FQ@%95!ELUd5!r0!*j6VFTJ518-aE$l*T[KT6'KV!pp)a+1"h`M"NcGY@jESFPA5
3!(!)Rh4B1DE!f!6')bq'3`$eB8"k5-F6LBL`m)aKm*GP&hi[UFL)%6Fa'fKbJKQ
Jl*@4M+bR3@!Z@`&SQ3b3!)"QHd)J&S*C4[%dEd,Yr1h[lE53!00'A,-U!8"mMEf
)Z$*$3'P4)4MB$(Fa@%mIfp*+"0B5X2YH%GFY2!lfp$SYSja*%-25bC,db%A!Z&T
X(#3`@5qhpIIb[[kMa+)+aABU0))Cf'FS-Qi3XQDjd(LkCfSD!Vq&#L*aY5!b6"R
hqQLIBmc81(dND$8U#AL*)5d,cl(YfC%9KT%dr!%f01p&hmY@LL*N)8)"aP9pYDa
"AUGf@K[D9RC$IVd0*CAHMSpY4dhHAJC"E!ANB@*!`&BD1[Y(IhUrqPH8DIHVaNX
[HVUifi@SNi$m2+(!MF+3!)[36K$b[ajI6-K(baJ6-Z!F4Gd1paL##b9M(JU09RL
#SaA4hUB+6bp)*"94)H1(-+MLQpaM'BMZhJ&dpP9%S4BMZ`)"lhDq-i!LXKFG2R4
dN5'$%F#%$0"2KkL0DiA%!X4`AkN$k@)[c#Z*B*9[1'iqCBhdJbDA!$TC1`X"&fl
Ea9$XG#03QaTkXb[#&5)HpSTi,ikT#10kZj`)@`958F)a$`4)5rGRBA[#-mI(%Mk
lC[q[3fZG5[!*Sq%H,B8HNSeB@Lc-P5jaY#)mq`%HpYQ9A!$NSZ1f!+4NLa)Z*03
-3-Tel$"LT%JC3!d"@"MB8"'Q!LleBbFqeJN[NKIXh6V+)Q!LK85j6T!!J-E$V%X
pT*`#X[%#1*d)"LZ-DqaUNb`biaD+$@`L@EdNbhL*Ir*K*BPBRa%8U#%ZkFU`GTM
2@6r-UG"pZRi$%U[#e6d8%1DF2E4#$i93Z$LM"e'DT'r!jd-"#LjaNJMlR!bUT$f
@N!!L+Y-l'EY-C+k#Q&XJDp*MB$8cRS`+!j)eeL5*!PNDJ-NH)Z($"-j,![MF,4*
3[AHQl!3$fPlDQ)m-ikLi"P20R4e9AFdb3L#1l659X1KKAHI5-mK-G'IT#%CK2if
ZM*qK6`M2JSjj5#E6p1%admcMJ2r5jarrj9HIJ5('jp@UCANS@Z%c[,ieNpZ"9PM
I%&4`B8FbC@LP,f*"%iHrk#4AcHdjiQ(La)P-aQf)b!UpT,04&,E#c['DMH)&A6K
B[(6I9JZ+F#ib$[J0-5TeYHHK*N&U+SH43aZb`VS2EZ*4NIAeaH9Lf`HB6Pc65Ne
pBYZ9kp`AlH0MNB0*r$"2$-AEF&"aL)U#kiG(b"`,%E9qq0`ehj,UNaBfrF*[ceM
-++iMLDpp[FqA3PG,5iK39IrK53qF)RFQMJ`IHSA)Qf)E`#&88$k6K)b#&(%!l**
5LZ'VN!!,!Q,6D$I-kjY'!8j!N[VaBP-S[26e,CES!"p1pa+cP$4meC*JLK55NUj
DQL'S%2b#&-$bLM)jFeF["&)6SD5M6A`c9pl%0h10QrKQVV`*#C[iTVS*2pY%"G[
%3'iIVLeKQkJ3Qi40m%Pd5AG2iR#3!+l`krL5-q)QMdFS(00a,eKmZBd&BM%kKN5
Yae0daYLT8DjBI%qKS*E2'L#J8"-BSkPU&UjBNLkLZe$Y,Q6G2VhZae@dT%1@-N5
6Sq3@-4C83,)HL`'NZA'1,pI(QmDLBcbF[FVf"HFKfC(UXH!H'4!IZK*m!d6Y0lL
Rm3fiX64NU6mENmDG2fP"C"6ZZHNb2haL4Y*1XqM2HQ&aHFcramp1)Y$Z6"(pD(S
qjKqAFY+LJHU'29qkc'ZqpmZlbmbL+mZ1TUjV89VZ4QAC+G'&aLP3UA3+af)T(E9
lbVR(CBk,cMq[-)[&@EFaS2MD&4UJ8eD!p)N"Tf,&imkb!9((-Jb)ZXaIr@$AbKU
c+'9j-8#keN!$JNV0q9*S3i'+B`d'K&hQEablr9m[M6UDfj%iTjcEAHB,Afl4h3M
p)05bl0RR-TGVKcCH"ZTGMXdi[-YPhMldMmTPS#ikDM"!G*PrC,PDFd28iilRd6c
Z-VrHpq*rAFE#"ael-5$S-MXFMmqq$23ENA#SR$Hkc*pP2$cK-Y$A1VCLJ0CPIZ6
QPGJ0dGrNf)(QQl!i9rrMrAG#R`"%HPXBGK4Kd,$,22QI"ejlTbeJ8,hH0JBGUc"
Sd'8qrBVR`fPZSaK!SNRB"JD3!"X[kRcl!%2r(+(rHaPp#FhUJ6if5bj32rD6-BE
fYaRDRaM3PYJLZQLE51+6lc+((V[ih`cC!SCXL3&C2eZqBYSFQKDkc(qBpEe+KQ+
8S@JhS1KL5bHJL'4$,[21r[#r6`2*BKEK!T)Jjl[-J6jlff@JZFTPVTQqe(`CD+j
aQArcd,0E,`20jehQ$hrl,dY[L'D4brcaeqlY[!`dPlR-DrrdkTHAJ@D0bcccS[h
Tbd"cKmYFrErr8(a$0'YGj[`r[P9i'@KZGTP04`,2A!DD@ehQIp+e[$P00+@I@f+
Zf@BKZKh,IfGM+(B4LRm`"+KI@',&V"%fr19r,$)cp$jLk"de"U0I@Q)5D`CRc2j
rra*MU)8*0HY8fe3ji2c!%[1cCSL3!1e,KU--V8mB@YpH!#d%NaN6e[@p*&*`P6[
2rGr90d!+blASjhF50d!+VMcKhqUF,iN8LmcJhqrImT*S)CLYQrlbmKZJ"9IEm8I
YqCG%#d*!1[2eiKXJK@$`c)lDhldN8R#%TArqpC)E))9!fTjmV2!'5`9(RI6Hh82
64!ZZEdNa,X6D0f*#&)i3BNrV1ElPP$&k"R51Rc(8'KKUARfhYj`e1Xf[EKe2CFK
GB8jr@prT,HH0cTcrrX,I-I51-[3qQLCk@**$Mcrem3h33c4p2lVj`3h4JrXirVM
frlS"HR$UmbRrrX%0N80J1e+q[qF'b#'kmKUA&Yd!16M4@mU!rBB,"pIZm&bCIN2
N%1KHE0YrmJE)34$mB0[U6fqiF(!QhF0lIRj$p1$N[crld,[63ZrKGjqTjY+IUlR
REp8m#S+4R$Mi+TK3!YGk+"QEmcBBp#YVc1-X4,LeeUZ&#E1(Ker)ZPe[eJl%2%X
qBj-@-,8$B),$f4Z)'GG*+miIHh9Cb[kMcb',cV"!VCPdea)FFhTV8kJB*%VGa""
88-)[I,cLr)4ec"'P9TTi$i4-QLJATBXd-30!Z"DS2&!!lV*6-52VpJ2,([15c`D
HVNKlk+Z%PjKcpP+[(4!p!U*"VBH,d[0RXQk21l[NXjM@ajGJf@0Qjqhk,`%dGRU
iBb'BH8j0iNFRQCHm'BI&rj)h8bbrII2mZmlEXHJibj,24TdqlVK1`jrr$+a'(3S
"',3%a45@*!B0-9fK(RK92R$FI-FVaNZG[Yp@RrUeFccVQ,2NXlMdKcG6j[Mi*%[
X**Ym$j-Dad*jQK"J(H@XilVFBEACE'VA$0Ce9Hl#&CARhfdD3),m'IJTEb,9!cQ
11IKj"6m9q+PVDQQkdh5KDDMe2)XSRMHRjDmq1H)CN!"'+!Mc%3&JSmL!#,c`0q@
#X9a!3A(Y"E83KB4#SX8i`4EQTR%#LBAdAXeAM5qA0I#+1[#QX@!P)b&H-4E%`[9
i$HZrbS8m[,bJeqMbKUMAKLe'3%Pl1-5)Xa9TSBh(P*Mr@[[ceH210[UARGeRKL%
#6-pM%UE1Nr1rDGi2N!!b,aH,ej`*&PrV@[,H'B[i`Z`8jrMk&,MRda2@K1!Uc[%
aUHJcFV1T6pHY1BZS4#!0ia!f9592qH5T#MB9,)kpm*-8iD"r`e6TJhk``%%rAq#
JA`J(Z4U,GG)[ccGGL&iJKh#dLX@,cd#FY*1B#(dPZ[$UBLrQPVpk#XX#ii"3@X`
km!H1")AL-J$LPJHIH+P'`CV5M4a*T%3`VJ*1i'K*!-*X'6fQ(*pTFK51([[X9rr
b4`C+C#lil-&-!B`3*X)@!RMK#h1Xh#U)(8rfZN`P%3be3'a&`e,@Mq[0XmrC4S6
1G-PA%&N(8Ke!I0Z4!,Hl"b5i(Hk"5+ekU5Dh4eB[b""E4)J&"F!Ff`B$4m'3!,&
IkTMhVG9ZcSJShRC5ME`HSJQJ-@e"L--X`%1*fQ&!XJNQ&3("K8$Sc80KA`-5P)k
Ad+6#S4C2EH!JBclq+C+A$YIa!#i+X%Y@X-1(b45AViU539TH*1`HRC%'%2VF0Rb
JSa)Gjp$KX3N6Pc#4kFJcHI!"!mY)K[&#8cH"RN0NQVUFM(Vk"eYRjVCLqmZVYiX
`JJ!K+'JdpJRak#R"R&e)RJ[MTDGRr)J),qF'CU54+@QL%CHd1r+1a+1Mh$%Ml@"
$%j!!3'$&BqV6-p+Zc#HbIB+4QDZhpK1`9E)+TXQ,V0R*ikVrL6f#YLCEUlU-NUf
IVeHMi4U5%#-LmKCCFr,bbkm4Q,$m84#kH-,HK!G,IX6K![a+(Cr#fHXFA(eSX@c
qJB(,mD0h@IPdH[3$)4!NUV@MbC0JUQ8CM`6ib9ZXpGr"CrRl3)qATj!!%Naml'2
'A*B2XY%d#56q!qbBC,am@!lb&K"lP+(UJX1X`T)5Q(K[q68NJik6)C@46&cp1N@
3!$@*M%qK,1XHSVH)L!$PMm,N@PJB-R"F48S(U[p*Q"a2j,I4Z4+E**9c!*21*92
&[1Th+4Y8ScQ!D&j+#mi%)L9SiM!ZmeDIJUP@1a'Vbam9QYePB1(i%b&$i-YE+a-
0'NC6P`J,$6[bl#NT@0iJ-h8a'XDI!GRf1R@kJmVl*KXD2+Q5ETZ&)FJh-qN6#@Z
5"PEQV39)1#G[,8eCdj4E(9@rb4#@c+Pd%`NiPlU-ad5k3"b*d[)%B)$pVD8C2@T
c-P&TC!B0@%kSXh$$8)6,'de!+F,AZUa*Ri3T`J"S6(*E3$DaZrfNQU"jTr%3CBd
k1Bj)3Z3i$*J0Yk'Nb@ci[,86C(5&ijip`!c@3X+fP&Yd0Fa@0A"$6jQQ`e#4C0c
UA5+r4,CHhX)Xl@-'E@'DZS+!S,bI4'SeY&J3$V-`@K*&@"*-MaLL`+FA"9&jD41
NIIbb&jE[H+Q&rA55F@'hLrS,qqPq[80ZUT-RhQPKM3j&+QQ@cKHfcT1%THNR4FL
+-)48-5pGb84VJkQ6(BE'5+*ebqQ#)R2p"3SEYUASEbXXP6D%eP2Z)*C9lJ#e'bY
!Q08m*CM,&L6#+K()Jb2ci+4fH@)mQL*DZbN3kK2FS#*T-,T#Hd(d61q%-SePT(+
iIl$ld82AL+`(TFe2K$a"0i,83+JE@G-e,*@RDq2T,@[1*U5ZFkHh(,kpi@cB6q5
D"JkcNaJe'0PiqVYVcLHNNA1R[`Zfm[a9lTXN0dUXMaEcfp0Z@+2Id"XZ2PhrK)8
QSIEQ3[VCA[H8e62A+92aX8Mp@0lpC[HEZiraSe2bHNPTY@-blh92PS6Zb4le)kS
fHh9bQ*SGG8`Z`(5$fMfLIR5Uc8SQakMC4XIN1+D$DRHMqU'9Vjbm5Efb'G2Ee1k
*kSH004P5QeK,!p0&&C4q68Q80&(L`[#9fBKChN4QK9I@"mL!m-M5dN64)'0S28X
K['I"6'Td5MP)h6AZdHQc"H+q,AYb65)G5M$+%`G#%Q9l$MAE)h%03Jq-#FKe2dP
hFaMffN3hh2)DCB9rq[MUU9km6&l61c"j&4!A*krGR6fjCA+4EGlN(GEXb9Xa[%J
GVQ($BFL9FfRmk'5SU[qNLkCJ,S-KT45S42Z2aP49$Q3-#)E6,YT%Hbcm%d[XbQa
cb#`LS658BNZB!(PJY[RPU5!NABP[r+NP$KCdpXNBLR8`VMYTmLjqNjmN1C!!##a
qmlL05k%Rp)LNDX)0PH(A6*2`98)NVfN4['KaEc0#"6&Z5)392S`LRhLkpBbY@R,
K*h!0MLJ'PTaK**Z6dC-N@V*ABRUBTKZ*pHAK6EQmpQb0*C!!`TJ-%+TLJ5@II3K
feXITpF1c'(bq#XQL$KX2U5p!BMX89rIU4h3*BmcM[9)Jf#ZjBRGD2dXd0jd-R+5
$G9mdmTVc`L@0Al6`iqIaFaCTYiYVcj*bc0JAABb8f65I4hm5KVPrZ!d+Z@"'1H&
PQa4iZ8pbJI9ebKZhc8Ze'4E+c`4b'Vr)P1a$iGdFG,1AZflk,)!bqBcq)#2Umpk
a9&Yh$beirbJ1UH,E525$K1d!fiSTLJ)d,U&$5`q#FBU$2N@r858j'DD'"18dd83
BMB0J$Ne3'H'!@,j2U-b0QebcjVe9Q,li5CBpNFS34J*QKTiljlf9VcEcLRiNamY
r&bmJSa,KGR4+5NI9jK*Q+K4Q+0U-K`KNFe*%JNEEDNpK8j4pCL+4Ph#J[GqVLRP
UiU1$Zh[++Yk4QBp-$[16ZrUE$S)pCiafPF-R,"'8(a`d*NS0bZTB4&,T8RSS8e@
5[(1-CGe9d45@I*813'*dTCNba6%H#630,$J8)[r0XSU-QS@%KKibp)MSh0QTqdc
KmD1TqeL!'0XpP[TD4JqQEb+JM#DR4Mb-GEYArM)Lrli*CYS`)I4L`'YLGZVpMT[
Dp['SQJ!'(!1m39d-aMab8P#&UkUr,EC(,BpH1aL*0$"$jE"JNZ$)BN-,`%b6-Td
#0Y!V+`F+j3L&&)E#%%0RM!SMrff*$"2lcj)bDkME*'9kBHjhMd`Ebi0PTf`QS(U
cHVm04f!$$daG6e)a`5YNJ@`6$fJ6l@0FC+bkU+SB!U[1L2C!eK3#XqQ&59SR3i3
5Q%#"$2FDMbCe9UPhM!bqBl9UB'erLLTd-#j"VRXdpBjT@hJdYB@bY@CZ``4EB$+
p@+kbc+[",P2LS1c8PZV(S$V1DhKpJLU)k$FXBYkH-+'ZBDKV$-XI&Tca54BXDD$
YC6f$qJBJN@jL4k!c(8X`e(%c85+,6@'#(H4KQfNL48XkY8S9YX!H8ZHcjT!!S0C
RlepBT3iY24GJ`V13!!b#D"[9i9!6*A'(-5L5qc"c8%b$15U`eQm+)S(1Z&Z@@qD
@Bd&8P-!$RpXFb@4BGV55#LF!Lc8CAfNJUJX)@lr#3$X'QQpCJNeD1ij'PN&('`q
#QZJQ(,C`0a))TYl%)jDkVaI+2P2[ia&-IF#5%SCTfpJUNXfm!F8r@$`X#%8%IPS
kUR5Af#CK4NJQQp92U%Zh5AbLejSkK1++U$Hp66@*T`TECS`IA(-)8E83MHci!3Z
2!$FkPl&dr&le1JM))Ih"iN`SMUm8qk#%lchQ9!"VG93&Fm!fcJ"L0RDBHJ%1SJC
ha`rZr3YH8$8+pq0)#BNE0Bk-MUUAbp8M%MLL%8IFT84rXMSV`5&BXFf%)0M&62P
p"R0q3iDC9f!`9Q&L&m9H%fS$UJ,rbdefE-K$99i`GrplHX``840pi4*28PS5Bbc
aJiX"$P`-F"$#K&dYXSp3j8SUJ%e$&B`)K@N`qL8r,95k6Dji%aMK1U0S&B5*S))
1@G(e3cUJe!JhISJ5mJJG@D1eCQ3Qea-PmP5'K5EN5NVkrAT(,$b8$P%dq1brNB%
c,8Yj)Y`1GY8I'BElek%LP-0L0`Lj!3"VdVJ,MJZ$8LKVb%[h8C*qI1DRPm!8hZ9
B-iS"$S"S`,j534P9flaDNYY6#SQ&TBbpQ1SeGAN(88R&--!eP,9UiBj"l8!r!Z`
-'!#Y28BIKS)fZG"j+K5Sbql2k*%ccE`L#U#b5[k3!*!!'++!*FFF+C1pN6%8-iZ
(H4SP0r8Yd'"%D!!RFM)&6-f#ZHN9+10"m#"e2[2@GP'#6b6)K3S@5P"2"Ca`*4P
!5hYB)T!!aeL$LD4m6$mcSX+@V-6Lh-c8bA+K,e,kU!3lkJ`TYS'DJQCLD52E+(N
bXR#!GbK4)BSMImQk"P3@)JZK!R)jBcT,(q4M"ifaKH!m$bM-3I8d594JI,'#ML@
M9[PJ"-N!SLq%3bqTKlDfpV$%V1Qlaj*Ik6d41*KDK%FLG9QrefCLABq-ji)+!Z(
$IdVp1+pfT12MKr93G082FaNB&b,VpeFjafJ+JE26j1SpiGqIZSbF!@E94a'3!%-
G9GqZ3qC,Qikb4++%8JZ5-B`Q9m`j%8Jc0E,Q)GQJ@A@0Nh!09!4`TB@'`[64*EK
*Ic&YPJb&#cD`#1G+Q"d!XepfbE3@i*D`!0Za!'AF!bS19)D)%LPI&"C'DD+&86T
SBDJCkha+@!,PFA9*6USI+@V(493(aKJI+*hkQR&j!YH4X%CrH3kR,J2b*D@AU1(
51bm4e0Lpj"+&GD@A#)XfKah'!`8X8)kSb-aE5iQX[,38qDKb#L#)RH6mLfVGA$$
Z4I,!b9#M8)RN,j13!+aP$JVfYjbI*#HB!JN0`!kh!"S@C58X!3J24ae%eK5ih5C
mT)*j+6ET@-+9#DBBXTar-m8m'XM%1Y0))#I2iDKcjF`ZFY5cai5%5jK%*+c(M`B
)lR56NMi4Rj1#P19@i1F9S%r'm,AXX3&EX11D6P84@30$EU++A+Z-h1J*TF'a$)m
44a&YKfh&QjaJ`jT0%i(F"*11N!#2a$r[bd1M[-8!pL`P`I$K1'4UPAJY`JZTeJq
$NC!!Pc!X*'%a0H#SHe#L8#+l'cVIdlDVUK@1!A3EC+Ej3A)h8HI2ZPN1Fh%ZX1[
rUj@CJSFMV3$Q"NdGD$i4#fpM`-a'(19PL6UeB"1#62(!(FG%HS%TQC!!!#"S8%(
3MHePB(Z0cQ"bJJdi,JJjJ)"'krmJQ'BLbI`XZ)@Z&F&QCd[T$"6!%5d%E!&85(G
"k@3R"#iaqc(4cl+c[5B2@!jImRb`&0R*mm%BPYY'NrrNM0DILN4C)j6U%3JEGPq
BXN+HL,MF&c$T%J"Fb[[%&Jjb5LK%5J-)m%j*me$ifHIZ-lNDS"`J)68JL6eH25(
hKGmV#E"Kq!KN)4!E!(MY@'B#m#"kLTK+aARI)J0JHk,[4XI3%He"J!$6P(pmTf0
B%21JNK)%fQL0#R+bU8"9!M[&%l(G-e2,%5KISHUR5,8F#R[KGqHP&QPRLKlk5"5
`*[)VU9*G!GCE*YUYS-T[YJP-*aAE5c)9*&GTreF*aXIY9$%HC6AYI4G@1PBd[3j
QkB4K8J[&)qFF4D63%8Njm-R!F%@)q#)!e69F!D#p5#$k-M$G#XTXK8C0&QSfX"I
%e6YXDN@b*MVJr`fV1%Y(%apS@*9m43$m&hG8M3bcSU6AG*)"b4%)1ZFk%5b0eH9
X6j-065PceT&KF*PXFA4Xq`Qe%#JD9D"Yrp%a+KT-*[0NJ&G[bL"-E+iplkDk1A`
+iP`#`$B2#P#mB09HV9Fc0kimKk3G$8%%E&NSjBAe"9)H%VI*3JdCYTH%8Gk)+C!
!UAap)1mS#DN)%MhP(5h9,+`L#f`TN4aVl(9VmVbSINX9,pYINDmKY!6P+RND"J#
&`QG"m%+T9K%6"mA8L+P[QEGf-L8qQ)VY)Z'3!#"FCjB@VL51&p8aN!!6pbp%dh"
C33Y8MTTF$(NA5qSjJ5&RR`Ud&K"m-ih#MKep3$ekb+$djD4YIPkFK&0HI&V#D9+
&+Tabh@KSDN,cE4#4%dNij380`QQ6L!0)1!QEbpY'%k2GH34BeH6&C3'9ec)k-bm
AMB+#J-+Jie3afcFf#)J&jX1B2!Z&N!"+Z-C2YL%E,3YL#(('QUFb8N55$$c"d'Z
P!#G,p3%RHG&T!dlbSJ,J41-hJNkUGY"fDE'qdD`L06)Yi%K9[J!F+3Z1#!QZ9&5
UF5d$Y&5jdY`cf@+5fY%a8[KR")eSC0")V'dQ+8kQLPIJ2+55j6rh)CK38''*'EP
b-[SP!ij!bBTlr[B68$R%'eb8'2$F31TNYiY)5JEhJYXj*Req$1+TP)ZY[5KX6TP
)cNF90C'V)'0C"ZAa4G0d1d5)bF9cS%+MlTdGEN(Re(HrEcd[A-ZhIYkhIG,Sc1e
Eb&d3R$BiabJC!J%)YNm#JrJm`"L9b2U$P29##+dCj*N)QJQ!IfB0C5pATqm#S-F
FK94bTFih0H$B("cV4!-NA0QHJdB!`59bffD@FJG4F!Gap+hmGqIRLFEPlUKDIS*
B`(kSd5SG#GrDVaF*)Q1Mq2DEHNVj8He#P`S8)a!1XT%GbR*1%ShcEd2K"hhZa--
2h3NFLG#55!d'4iB,!!6"`@mVVl'Q!3*qS+,$Fq8SSQ35@HJ9%FV9CMqG@SIS+XI
@kXSIPB&$JLJpA8m9&NDeQ3TMiP,d"L3*!q"k$pKKD8%LA$0`+LPESm6c8BPV3)k
8q$N-X+SNhp(8FHcchkP56"K0V(5XAEJlCU%1QkRkh`8"aii%Z![*d&JLQqT'5Qk
P,EE@"hNE&2XpaEUU2aF8ZlXY+SN$bQ3*h#'Jb(F5f!F%+DR#%PQ2j#,HdHcT`e6
NR$l)+[R+9ipI8rff,A[f+[bXY1+Mh)R)RCYSGISaX!-[HdDK9P``JbRr$eB&DD'
UHQC[GEUf(54mEb3Q9%e+R@#Ddp6TU,"TQ9NHbF$'*Y*#LDb5a6BHd3)NRf,5#F4
KKRLRX,$SJ1Tbr@M`9P)dK%QTMaj6T4Bm25S3)UaRKZ"K"(3l!flCpB"VH3b)1HK
IN`LTa'Hr(ZPjG#iAb-P%,QiDS'c(#+#L"'ZL*l+e00!@4EV4e+m381V!PXp,(BF
URa'Ge8mL%"'$@eGYafHGX%NN'r+J81aPbGF!3RVKQK&)d9m-m%(&Kh"eIJZNM&[
a),rqLMP5%V1+Er#&8'pf&CR+JeHJp)%DfXVj$2U)@BqRm9[m1KjAqF,i'rcU+qM
+6R1AmeY(0ZP`N!"B$#B+e5UB'Q+")R2,S)p88RaA,#kbY)cjP%4",#"2YXc%4##
,4dQC`RH2Z'+$V#QZq@)Uhb!U6CD@)+"kYeU1HGJ!9)-p3pFqM3eFr6pa!p43#fI
k))hIR-EN!lf0dY5me#f)lLe(10p&cF64e#e)TX5f2KFIk4)U"Vr+Y[Krc',!8EI
Sp"@X8q+[%K5Y0aJ9UL0$Cd'8,8f3!,q'kK')[@brEd'@R#i-fVJ1aEiI)*X*%EL
IQP+RcG3rH0,M+#Vr+59(TD)%%PdTU!kh!ba2G[dk-LdCjT5K#!0SBXl!%Hhp[J4
ETVBJ6brERE18KXU6(9@,8D9J+5Aa"Q64S%9&Mhd)KLaChPSc@j3arPUC384@44G
Pe@#T0!)iI)&KEMe#,,P"N!"I04#M5"8(c%F)+1J1mK`NL5Cam"(FCTH*b&flN!!
JYSY0YS2YRJ2#!iL5Q3T0YI[P,MQM#5$*A`"9a5Z,mE%0)-b,HX)Q@a$f"N*B(K0
()P1cM`1`k5k)C#Q$L9-9pFeJRHL+'#+jLAdHea0UKS8$)@qck4S)Z9p,(SH(0hN
5(VEN,AKmN!#m&9R'fNUlB%LN,[-ZB8)f+9)GC3-!lQ4Fp08H#aa`kqkTH"%-Kl*
R,kqdliBj8I*@)R2,(BRZGlkdV0N5QhVV(Dm5KL3EL,43b)3&G+Q,Y3J%bp(8$9"
lj#%&V3C!,a51(%UAA`')h5!X#T!!''CS68hH3PIZ6Z0ENbF*&fFGV68$X,@eQFr
#Y%Rca3$I+PVC%T)Chr,+&i6Y#JJCPYI&1ZhkJ&jFm(@pcBmD,RY0hFjEf2`E-2p
kAhEZmT65$S`Jq"@1CK'%lAV+(Qii8,eJpc(P$IP`Bq!Q9ap2fH`EKU[5KD[d(39
(I++(VXq!VPX2AEXHZU,a%%5!3DMS)bdFDMK)24KSq[64(!kL-T@ql''JHp0Dhba
C2lj[F3pN#k"`'094m9cGMPY[1hCQe,DS2-8S,!6'J"K09JckLJRQX#h)@r#6MKr
a#c$lh-SH$b#bBDk,B)4V)6T[XHN0*-MaXa!relmJ4@YZpRJ0Mk-F&EYFZ4M0GMK
QViUi!GcBa4ae$j'J+)&EhX-Yahc%e!Cf6jfpdNM!3U20)&k0*YF5m5UVHSG-VR,
YX1bfc9l&MP`0J#HBYpPlGq1"U!!c"kFF64k(6Aq(1H8@`E6248580mK*585!6Ia
2J6&"`A!A@rj0dHal2(P$YS3UCjM"KhFQUrSF5mj)#LmM!5Za6DMf[()Q'eJ(%jc
,(S5UdYNJ3I3)BSFYGC!!Phpal([$I"Gle,)&h@-8B#8C#`S`98KjNG%maJ)6$SP
XJk0mNcRM"5B`PT(V+&p2h[S8%hG-E$$fLe@2K%Ge+d0TA)*%-MUVRe#GY*b+*kq
++1CdbFI,V*f--V&i8"$h*9`U@[kQRK,2I%(dUfk0M--NZ09$M&ci%'8*Z#*F(43
%Yhj&)d)9Fe5S'Q4!XaI*B+BH)-&C-*Fd`E6'-XA*(ZQl,daZJD(-Bf5XBmZH2Jk
0"QhcTUq`c8YZe3HHQ8$fIT`8S@pkNKlE8,cIT`03,TV0T5NV`)M8-+8PMQ#a+%h
[T+6U%GrL&*J*m"mATUp#a6V(U!VC(aI#a-mamqRN4M*C5K`154ARMd$P&*Dd%5"
ETL!9KLCZpXF&9$frcpf88cJHSQH*Qa90$e`kK8U29TMLF,-rQ6UGpqT23DhGD'S
j9&@IJQ+f3(#!M(bJ'Z9`G`qC#Bfrai#p9F@SR16jLFa`U%VD4@4*phQK@&#!"IR
19hh+kDqJl*`lR&$E!N8DbLiBiT+LQ#dbXKHHRMkhqrAZedR0%DQMrR&KYLI%YT4
J'f"(Ac0XC(6+-C!!@SB[R4)DdjACRU!k)%J$8#b5qUcCdqF#N!"(!f!UlIGF!SM
MIpphRk)"B!VRBJ(baimQ$`*pUeSirdqf"#'f"1)l,!'l[LC6Ea%%K2,G+E5d4h,
GEA6`p('iELmlH+M-`UDB[-edl-Fl8Ee0L!PA3V%QaJlY`+'5LM3TA5J4LYajDi5
&m+F,'r3I*$!32`NAAJB(K#VZa$@iH`e6NAA2Q[drZr%cM*mar&Jlj[h2Q`4q3h-
BFAeM%M@Pa#K%b(15+I'X)3Z%cL`BR9XLMIS%i!49i1FY4@`jDb48SV,qH5r@JMQ
BP9a4+J&qS9bj19Ah$P&@P-0-I*5*`S)'H5dQbB!F,Zb"'9%4&X-P4$T9@KKrR43
eUF#RG(&dEKcCI@(kJG(XZA&(IQR$)%C`B%U1QBTX1maHRJ'`(k#ea8kRJ`!$I'X
C3k-+UV)3&338I[#!+J+NDikif1'&T3i[*!8+G2J`9j(ad!!#Im9ITdqUIPhBNUl
dPR$"I4JkdXI2d#(HqH"MQ*f&Bb"m&TdN"8!j"9!1m`c8b!,dmYZY)%Bk3&XL4iQ
bSMq8SZdX!!1)EAa,!q$P1LI2e3-m%c-la6Rlk5RT8*58258G$Q2""d!$H5N-D"e
PjNp4DYBdEiU6M!i0NC-[9jC%a'452$Z,44!KQKLbd@2XT4BDeG16NTTMJJ+Me6I
Pa3931ZdqY[E`5N28!5!j0jicPlPq!`8SQ+G*3Ar#-db,0URQ9%L#NXRSTe6a&UQ
HE(cl$[l-L`%HKp+0J(U)p$-mS,5YK4CM0CMKEcc(PN*I)3HCP-&FjUm9c&c5,jM
$kTP,%Z-Hkk8r,+5PGb#C'&Fa14I%R("b(iN9E+'Q'3Y-6P-df0T6LU$2M!T*6*(
!8+Z`!RYDC-HIBP(+-#a-$Pr!8$#Bj*C"BRh)6B+14%5c$XV)+ZQ2iL!`'+Yk,!k
9Vb*[C&@2qCLa9Sf!e&r,@h[d+dC$KZ@,M$"hXE2&,9(02#$1(eS'Yk%M4KK)TF#
`3'%3&a3D#%21&Z1!2*Ce#3P8qJGi*pXm'dL9m2-SLY%ecM#FHiG3pD#"qFir0#+
)Nrq45H,%`)E[J")UEA[f$*-+e2()!S(pd3hdCap%+A!2Ei3+m8*DA0XY)4#Q&Ke
*`0bLb&'Bb*8GF2a'jRTH1BJcaFX$A)Y!r%"``,eKS`1LmjMM'A4I)mGY,ZGMFN!
R)Y5IkMqiC3#"Ub)PqlkU+Vh3H%RCS-i%#NZk*iL9jdD!`RS)PK+K5@V4"lF)+@-
5%&TdZ&Y*mX6Gj(3f[(L6-l$3eUR)mJJ3EA5F"4[Z"QY9ZUN3LCQF9CN*Sirq`Ca
r5%pRLVIS6m!Bp,aGhL!)`&"l+@-G"T5&3@bR#PU9j)B)`%be%+bCiIK'GCj'Jq8
XlVk*#Z%$!)9)N8#@%PD-&8)*J3,4@)HIHZFJU96!jeD+f-4K4VUY)p@Fb#bfPAq
I%8N14ZF2GI3e1AC%,NERrph8J6C(6D5E'Gm0XJ&cdIKVDQ1G-+8Hmh0dIDjfKF&
#r0cNY6e`"U$d5dTiid!#P3h9Fc+am3PABm#`-!"r'-!elH$fmV)"PB3I,D-cl5r
r#N1#Pl@$aD0k5p-9Ek-N"SBQAYC%NC[)39%@2J4qBQVTSCCAL"ifM,*0'XL&J3Q
eUN59!DePLXFj,4NPS8&!*)9hcq1$e#P"#@3H&8KK(T%RY3['JcY)Z$1#9!2!eBq
T8ddqlTEJqJALUlUN6b6f"jUJqNK(3fi23qA4(!)bl#$6,[D(V4LF"5Kh8*0)cX%
X22l"HC!!'T!!ZLAKcbM4$Kke'jV'"55hPp-V",hpb4l"q5Ki1J2Pa`f,arNFTYk
1%K#LFq%EG-PIdRrd+,hfKpRNfi``qh`TC,*Bj+hY(ac&2k(E&6CdY`U,XcfS)Y!
R0+FP)Q',+!m,S'*EURE`e@mE"RB*LjLr9adB&4Bh[iMFRL'MSdTH)8TU+@MRDFA
LVriTJkNdC+ThmaFH9iqBV`kG,+#5rjr#NZ6IerU*V+@[d0fS)%T3jmX,f-HmYA1
e4XAcqB*+hhj"C9D*DZ"FSC8GC$-8E2&"YC,E*%j*"1N2Mk!r-J*1X`BrT)jqXr0
HFJ,+Mm*9T)44JK,$a8d$lVl)$P*ia`f+XZ3%#$+T5[e[!+*5%M[paJZ2k`FB4Y`
KjD`Z%N!`CRXY3D40VjcN6ZG[1GCGM!,[80*3c5Rm)5M5`VLa`JUBYj)KFi0cU+8
B19h6"r8$YDcDK+&NTU46ReM!$)SpTC5&$aQ*6$i$3jNNfYUS-#`S2q6ecA8XL1!
2Nb%5!FKkDff8A!mIj8lKchC"CG*V(BAdCm23(`e$aSSSZ0-IV`-J&2l!K(a-03K
U6GP%hP-pP@m3-5#4`9bYN!#TDiT4T*GA`X4fN!!%+YcZeFT'['V8ep[X9869a@Q
SiUfl'5!*kV+CU#-5X,A0kNX2$2YTm5Tl9F9k#jPU3J-cXahQBXPec$$ljbCbRMG
KQ"P)),MR,D1%6H5N)1mY)m#DdSZPHSeHUEZMkPrZ`f34i&ZQ`RFGA'39I[D#c,L
-+Y6(5b'*'lM0XS@2iHL`$5"0pLSAL[FQb)4(-"AE@rdIBCJ*`X#(QpDT$9Dba9M
TG236L1Ch*'6T@'H!@!0KSDJ"IPk8K6D-+Pl8Mf"+)PMp#eDJAiT#pY+&Ep#M2ec
qhkc3XF6BZ,`E"A&e3[mI!!!FPN&%3e)$!%6B$e80Gc3"%#(q8!CIS@,&aZXB-m`
3I6,X1S+8Q-8MaLJJFl8c,DPNi6a2+p!L6U#Tb)MC*A8`jicCiEBMhV,EHGkLk+E
(R%HmaYXjBjcc&X2-cMQc'1)a3p`dhSB-!GYrrlrh[GIAdJ,ZlRIhq`XEY%AP8))
JH!)J-e01LQ5R%rr%i-H85"Qh#!H15d(f#H"RUjF+4jpMUlIDGej-&NN)Qr,$LF!
VekHFY&3#28qdEVi`hMdQVZLA@T!!6,40Y0SY6d-)KQL"Kad6fM[hfqbGE3LcpED
0Q$bUAlTL`,DQFlpc$4YHLm,T#BUba)S`USU9Q6j+rr#AUr4,"j%@YBMaG9C+'[A
KdJ2SS-6P!8bUX@k3!qiX,D[[FZ[cQNYTb(,-Z[R1r&ZVR8jPFR-TMTqYVPKDHY5
6@B@()@JdEPlA#(+GTNm5@CKq`UaAhIPKT(G41IRD6r,$RheeA@-`R8ql)8db5*1
m9[[!'#BG`U3"A,jDhrm'ACCJM#A!aRV'f,34LE(ePLS0B`QCXEaeMH-05)4$QCB
9kaUYpQqYj8!dCYZ)`ASFZT1VZKk2LeKf@9E$Z8-AAF4$Kj3`+THf09MN@1eMlI5
"aaUVr3Yf()63eVB@!hIJeGPiYBbrHJFH#khfclMSJikKUp@[p*i!#FJ9AZY8CF)
6G63C(IdB(Z,$1(Kf9C+IEB-Q$E-&A6(+&R6pNf`"YPC8X`ABI8&5!@e'HTQff3e
ee!Hc!#l0YNpfVKDHS*8[2U*Lb1`f+DK[b4JqD,JrR$Pd#qU`E*1CGeZRRJQ2Sp1
hH@QTUl`@ra*9b4m(bj*TdfdSJL#P@"1,M@QS(LN6a,+,r*,&QNZbqX-+Fe`-[@`
"m4jCb*JQd9r01J!HRdZkYGIr)6BabS!5H'(QMlE(G+mNCF4F+5"X-fGZ6dPIX#"
Q'K#LjdK1mUAMZHPUZTB%UYY6,UA%CSUL$q"NmMbjd)CC!K4Z0&kPa3Clc"h,ha#
9X5'AXrB08CET(IkQk[-eL,+J%'eU4aH5f1CMp@NeCc2+c&Ac(mdiMQhCX+dJIF#
j-PRIMmp51"m'k!12rHLQS'`r(PHa5(ZY9'c3jedJ8E`+i$%*1%fpb"BiSLb(,HL
#8e$60)"9Z`EdVN"B4bhPDJF+XNVr3lfJiblm"&-GB2YDBLGH2SfK*2V!ic`@1Pc
r'-#,f$NIFMfQ0ZrRi'98A$$@2H%p+@Tf3Y9GbXQ-UE)5eHb-M$dkA5aG+0V0hT0
b-cYaNdpM#MqHRCQEF61QdfAV)K@"-TCe+IhQTH2(Xc-LPT*55)jZ5MX38),jifE
KFYB!YF@LeEj"8VYc8cbe[e)UYXKUVib[GY%B6qh$LYU(1+STjiLL8P+iqD*D'9R
KVfJ9AKP4iDmLpHMqXeFi138Fc*'615&CQ(d-#+U1iPqL,0P[,-rdFZ64$NAeR!N
E!6cCEViY9hkB"%IC#(I0A,085SHC$iJUp9UQ`p+&&-%eVVB%K4DN#Vim48HG#@X
2'ljT[LNG4Qk-AR*86*fC+`)L!)%2U2Xbbha6Z4Y+4&hBK3X$Z($Sk(-*"jMGI1&
6A"fJSrX,-4epNGT[1P5IYqifIGkbZIKia,Tj@6@)UKX[cLAQ-@d+!S%fQNMZqXl
VIfcT2INfMKF"r(2JU#1b-L6@KQMDm-R#6'Jf8KNPF1dNDZ2VaYHCa)dcHT(q$62
QRBe)T#X)$G1Tm,UZUB2IVN09mead-DU$jRjP-*')3LQMkU#Khp*Z'4'9H&4&)44
#D59-`%[`D'3)CC!!#AKM#%)TN33mk*D3!+JX3-F3A0jaKSY-$dqk&bfLV%"XV%#
@45k3!&)9bTJM#3-PPEpNk,bq4!rc#h8PdRi1)BcX`dSI!d,iaYF)!al$H$b2abN
m4[$SKLP!'!JN+5"`54+1Z%Zck1X2"ee4D1LiK)D+"aNDHJMG$I5"aa`X1U!Z$p#
3!*8'3Y4&8kdQ0&5Ldk)K"CRF'65*DlD#+[*LHGQkRkUj1@URERXX*cI$9#[-eLe
B%'&8c#b51'S%GPa5(J"S"#aim0(02ZjL(hhd-Cj*bVDdN!"SScJ1&aC[&-a%fId
&)8d5VRdeRV`UefL0*cX+SI[INP3jT65#+LFVU[6A-e91,NL9aBCSK!j$*80QNQ[
IFRlpFZAkhHckhEMq$,mH6SFT6p)(QDQ`kmPFC3PGIk68lf2A,d&`DlUq9A-pMLK
G`aDlTHYV)'lCF0e&Up5BfKp'ak4GrPp[KZ"Y8BqK@M24)JRF#+TP%pQLfh"XAKS
%8)H$Yc,'Yd)!Vh,'VeVYM45JAX9M1Q0m1KjVLA&-Daec-pEA@VCT@*qZB4f(60R
0&PZC#'lN)KL3!+T2Z5`+biQpV'B"CPp8YqIZLSNL"%ak,CD8ZcdP0bG6qfl"VeC
-j(0cFP0%"B6F*JH!j)S&'MbYUDji85M6U-Sb[,Sr$)1E(4MBJC!!P3Mk($2%K`S
*)8#A''H"ISpekSL!k0b!#BK`hHUGpi-0cK)M%!SKci4"Rq4dNQ''M44E4am%,Q1
9,"5QiI1BHQAm1EV+DPmjQ"qQJ02qA"D%dmC!`dDJ88+&E)0J0lA3"ai-0'`!$GY
T*TbP5K(E6QZ&dkB"$6ULF6&Eb+#KA2rZBU1!'Xc+dPaR&U0M6J`&&kX[qCj6$iM
Z$p,FiQLU-6@a2cM1TUda#e41"B`KK(BD[8BG[IUAD[ZFIHbe,``kKI,Lm#NJFHA
D8AkYF%S9"e,h`fV9QE!8MJTr@ARJ@08fpll+Dpi[,riha`IY,`fpF2JcSdpFqAc
2&fE28QIf[Mfmd[bZiCfZcikX',0dIfR#jqlkdmkrlI[@JZqZrYUd@`1GihX(ApR
aQ[k)mG9$hlH'qhrJ1pVaSqHrN[rATrlbc&rGZ"QmP*@4(NYNRXJpm1,a[*aXe`p
efe2f*,qFp00G2h[bEhlbBmrPae,6(Mhlq-PR,Rlch$HHrXrUU8mppr&reApel[p
pp292rrq6rjhd2a2rjDh[V&hAX'V0'fpZh[L2YHq[Ifr42p9mHrkrflqhr"mqr0H
PVfrj`m)r,VP[`rfEr[RKhdhqEGhGFhjjlhp2[fIHlHGrImH[V[kQj4GErkleJB1
rE[[jk8GZZllrLl[rrU%(QbmdhGNiTE5iC*R0UF"+GM,L[$djD[SH(3&35#@S+0(
AQL#3!"[2f#9@CblQS5bK)r[3`[j`NZ#11m'4P[fG-NPiRFe@qje$#+e'8&8L*!p
RThMi5MPFaCmrHRC@1Fb*&'"!9GJ(-JVMdP1($Z!NUr(bQA$#bp25%2ZZr[l`'$V
9EEcEClbFF+ai$3%-VZ!6Q[[$5!)GUi%*@j)rH-+AjJV-pq3&Nm3S,JTD+hl91`I
l`eede6(09DpSVVU)j(MJD*V4NeL6*)aR%dJJ-U5(c6ETCG4Y0`a4L#'E28'4aG9
5`%AUdqF8ed&pLbdVlMY2e3--Y',J)K$,N!!8AP%e0l-G3eGS1L90KTI3X5YIjB!
h$F0[3H5Ad!+G"c'e4r1bJk%P[$Ml,0$5Ui*!Eab[6F*VGNahKb+N89&im!S0"N)
(GI[U,U0L*4`"A@IYC8TF*`j6!HLfNlPJ+*%ZRUbJSZ,*%LSUhQ5e2r3mIH#a48&
&a9[`Q-Z)G+1#LSVRDSNdRmT3%4haB"TE6*C48EQP8Nj31+a6ApYIh2VD)`'hi98
3[Rc0&NDY8ipk[V*d8,``)&Cc-dc6LdLrQ!99e8+'mBU"UJX"c5!8J@Z(3`mfSUU
Cq6%"!$T!!SYVV2EQG[SJm6%FBNc6F)mXP,L84%#6!%VLiC0'j@E""@6cKBNe(P`
lPNQUAF48Z`JNHLYAEDh9[VZ%2["SB+UP4c8,*%mce9D(U,C"SeSFm9!A@bc5)(N
)@1mFeN(LXiJY5!#AXJ8%Z*d4+",Z$l)Sh5L&kcRC+HSPQ35V%JU+T5-,SiYGbLX
+%Hhel98c6X3bAYbq*dr0bpfHGbNPim4h9G"i&mKmqU@85fVZGT8&#d8L096Fi1k
Sh3M6MbUBYEL$J9ib,20V+h)0AUALd(!Y6X9K!-Ka15V!8S$UB"9mHq@pRGI['aN
qZA+[F+"Di+C!,4'GJ'L5!YB['Z@!eHlGa!*@5[2T!3`1I9ia9D,ZL!TBlGk&TS"
eGe*d`)T`F*jD,SH##&&ie8-6XSS@+@6G[bP#b,TF#3Y%-`[mPKF8XRka84ZbmS3
P!MpXI@MP!55j[Ec5aU[jZf+kE$9EKa!`me*+ER*-cGU65-4d2*UM#'fFVf2T4h*
3V%HjC%"@FL!MHc*5U#Tb*+`TfS*+Z9$`&q(X"3XLM&C!H16+MN%TD!!)#BG,UG+
iEDa+8aQ[`Jj$5QiU"M,Nf(S5iH&3M5HV[4I+3K$N9FXRMLQ+-k#,*P@R@35kh(U
ARS+J!%--$N)-P0iLSF`-h!1&`lKV9*XBS'X39!iPfVQa9"SYb,(JFJD(MQ*"&i)
JHKd1aEadq+E*f,0(P33ET-jdb)$QN!"d%-XKHfUk@5f[IY4#b4#[hT8IaD4"e1-
9BT)RC2J@G@VYj9KJiPK`-3cG+R[hYFmlkNQ8pRCL%pk[B[Um9,V-GUmDb%F`&qJ
,!F`V$$#IL!1B*q)"TPZJ`,C8&$!I@@m#c(d6SJ#c24jJlKXa!HCY,Fm#-,G+J2R
)K!)!Xl%LJ(PE-"*J+X)&*3c01'#'1Ek0!*Pr%D#T2Gd%QpVK'3A1,G(!@@@Z+(!
#q"`F00-b$@UJ1Y9#BZd1&@fSdL%K15AF#ic+#6b3!"@!bdC+ZD'*3F"%hL-#+%m
m14%qb#!*iN3J'SNj%QS$Cbj$j5rU@A)jK$dHF2H4!iC2'SD`GI85q198"!5eQ`'
`'4M3[4X(k&`XSFJC**1ri8H642$%1%a5M@QC(@S!eR1)U*'JD!a1ikNqZrm+Vlj
9NTYhkcHrPaUX8Ml**)DR#ZfLK8m*I%maE'hFkU%$A(kBTM3Ql'VJJC-VdH81q0+
mDA4mAM82[E"GQ,-DqfA8)59UCf,VJB#Q!-TTf'`)"06bPT-`k[8HHAfir,h(bKi
MC2M!aH&Z3q$pamaP-rF'!NVM!2BLQZdB@)+C(%($)i%!YMQX(XSrkAMLb0,HX[F
[PehQKcbMPV@Fl1dH&HpjKXA4Y%6,1q1"J''@38DdD+L$SjC@'ch2)b3eA4+[!i@
`NaA'Rq)8aPb6F%QSEjp20HT280AL`Vc1kaY!Y1JIh-,$3%0$ieeL9$A5%5B#)!2
5MX)[S")iQXP&eSX'@QMZS4aZ,cqKJ0NqPB'C0f*5cfBT4iMV4b%l&6$jmL33-Vp
%b%"B+XR)@L&*@X8E!45C2IMRb$aXN4#lFX30HTNDF@L%GT!!+@T[(%9Y++`SGjH
XU&CXfFihEUq3!+)1&Ak"+fSaVc3`i0HU+l"I8GHfKq+V5pQi[#QZ0RR6CcA)KTa
G9mQ"caEeY'&*1CU*@UAYd#M,aj6eJcM+fUe49U8L4[H["LRPcJ[9Q"m1G8J`TFa
@TLNEp4XMZ@bd!+T"P0i34-NBMjVNd%i#md'fLCZ40e%m'V8*&2(p6eGS%dp,QbK
I80!QCK9QmYPX*)GY*#r14VUM(86hf`Yf%&'$#A++iK9[&`rSb1@&TUlQC"(XX9`
c-@Y!3$QI+V'9,k6e#9pUcD1a&N-jTA#pS8(BNic*Rm9KdP8)Z"$%G&lI"&4#U$N
#!-e@ZVQL%FB8T'K-1"h2!4Fp3-*ZUNKV%+b-9)P`1EVeH@mDV*ZEh'D*G#p5YY9
89Z2T$kGIi55@1XiT(4G+KY'!%!(N6ZELDY+iZ(DMXYd&&eGE4"GAQq3b9ebI*NG
@aUAY+A'5F&ZTm4@T+PNJL'cLTLUPB1m+qd!#PU228G9R-)Lli$L&fCK6q$`8USZ
p`Lq(TCZEKXk%JeiD9&,eG`E02Z-EH+RUm4GK(Z4eqDQ4f@1H9#`0[Zi4C'+A6KJ
42IVAYb$"CYhXR-m$ap%3JEM)"1+C1!*4(5fdQha&#HfS,,4%C2'D#L,E!j%GQM@
K6fM&eTGk*Pb6&QY6QX)a)6%KYlQ-ZDr'B8iKQ-Gk@HL5)R3LH%8YH`$)I01"1E9
Zi@-K3H@AK(p8V(mdYV9VPZD#YHb#lm5jB"+EZ)K0I#r1a0V#"+RdBZIehpB","#
@iF'V,I%"L%rPL+Td9d%!"#Df-'CHMm0-A3Jc$MUdD6C(AL"I!3"#kD,1kh@*PIU
!Jclk6q,6cBQM)`*cIB8R+i53!"reP!,d6@T4K0#%B!1DK1iXQD3eM@L$1l0XG%%
[XFYf'9-jS,5cN!#C[8L$CQfKeM%&r6DbJNSFTJeL8j-)VB'X!c`ZE*684"@2*M-
24mpS940&B1j5$L!!CDrCYff3!*F!ikXI&D8Bj6!BmahJVb-3Z#@`3#$3I+"lPYb
aK(8id1(URL89P+e0FRkMNlC`&Fe)"&XJN!#!J`S024'5LBPM3"PShJYA#kU8c6Z
S1AC(1$2+i55HP"a1GlKNKa1FJmcKe+C8S8@b8S@Qkd-F6[BTTdd1Tepp%Ze`ZM9
Qfmdf9-8V0S6i+L8RGmDP(-SdCVYL1@SLpcL[[1l!"daJ-$BMe93SCXk-+JC+5BG
5q-+bqKEqP(rSZ%(++U3UQk5Uhqm`UDTa#929HDDU%UDUmp'UDPaU8Y8G+G'U)Z0
19PaETH,L,,"dJih5$CXi#dJ@R&p)(hJJMGXi5"pic'%X,'%XK"JJm+R6f!*(r2i
KYYLY+DbY5Q%G1d@&YD`M3Q&PS'DI%SXU,Q9d4JSXIY(2q'%JZ+FP`bCP!i&6LUY
4I#U"8b#*`!Q+2G3pDkGJJhSbHXcR)"'59-U4NNUhhc!PPCUZXU65DDCQ&dXURBj
1+MA0-b@9cTq,6LSa`Z#9!JT*XFHcYj-D+$mHT4(UQN'&(*38JZB2$P6(Zi5h'KH
E"6@,2FkEX4Ma5HB)NSV+RqF)Ka`X[&,5l#09NBSbGGkpcYZjQNUCQNUK*KeA8j2
92Sr-MjZiSChp`RaQNRH3!+NT`G4d--S3dRjK29[JL0X6TS"(84-Cfpm0PPAP4aU
iUL!CX#XJ%cL6GQK`4T8M)3TH349L$DqL#M&48CDNN!#b(9%+bCG!-N30+C)DlTP
J8N2cqSUUSIP0NaVQ"H1TJDHZ[")S[Uc,"3JUQP$8`)GQ3!dm5$f0ULiRYE4G[i&
!TP"k96CiQYjK!S8(lp@#!X`IXf43U!`&K3FRQd$KRXHL3B(pG!'VRNZ')k(5cda
1CU#!H8"`P38%[iS6%(6,PBq05X"4+!KD($RFP9k%H9feP1T4,Pd&iLrD5@L8-!8
rJ+0j!6q085B0G*0$H5QrhU-*BTJKBN1))5)'N!!m,KQP9*PbLA0([pbjbNfGF0l
RV8++`MQLk4T9AN1e)@r9-$SGQNi$kbc$iLiNlT[l65TDc93dS!e@q%&*INTTP%R
"VY"eAVplR%)T[$B8Vc*18j3J9b3A(15Z@U!SB0@hiK4DIdL3!$Y+c5QNB,IU-+j
UB-Q"dEL"l@aP'NXZ0aA"N!#H-I4D()D#@U08CQ6N*J0#I&cM4V"fTe8c@)C+%!@
*2HMB5@jkeK&J(AhSQ+hTF,11$R48D6SFV-1&SY[2Le(T8&R(1A4-eh3-X)i'G(b
S&#A[m,!10&H`VAAjmI0$,5"-V8LEYA%96Y)DcXT+4,YU1GbP9bI*5lVJ+AP*E+6
*5f)f@9jL5lB6mK)EYjf5Pe#2l4!c'lEEaPN`h4djQ#D8`e%jQ%i%L(djI6G+k6X
[*58VXi5rUrZlC9A@BM6d80(b,PpNL5G&[DJ9$iXfId!FGMPTqd(Kcb'686pq))`
I+I`hH#UXQBber$lH@5ChM[21HEacTk*!I)k!I25BQ1M`8!HIe)kZ2JelFKIF3`G
%KkQVhp4e&9dZ8jI18AGClYb#cR1D6PA6Z4DG$CV1!8hR4A3Z0(9@NC+N+k-*3,T
%!1Sk)TKTFQ1d9bJ880aEd33Ja%cclN)%)"6aErpTAPEfm6KfIpr[f2(pl26Bm38
,-Q-TSN+1*8ZjC#!X9"i1HZ%JDL8K8F[aBh&GSX8m+a5T'aY%k`dY8QF1(#iHVFR
q&qL(pYVJbQRK$JarSJVZPpDJJbr,%Qke[-i$FYdkREY$Pf@CTZ,k$FUdc+8%B(!
CYBBkIiN"R5!@d!$(@GXJ@K*P1Vr$Vd&)cc1%p+-i#-NP(63Ma!`(TV1$-q)Fl0%
35mG-RRk0J1`,ZN4bS,FIpHMm[eLeXP0*Mb3,3hY`51-'3hUJ,R8kZG88Ske@F[f
'+NV$Z)iarX-iM$GS$F@"qKq5NXIi0d3rd%EZ3$)!Kh'*pi'6KGbm@N$B*3(#l`i
9B2LG9K($lmQl)KPqbiJ,5P#5fh(-`%r"pa[@TFGd$#"#"fE-q(ZfSKEQG293%HB
AN!$`TjqC1Q6!+3lml+3AKP9Zr2KA!-BiE3M8r8F[SmLD6Be$+%'R[L1mGDZ%iqd
"qYNr8V1+aQLGZpd#ABklUfP#l5SaP'%BAi@8$MTlhm'4l6!`pF$8`X-2q$TrAER
JS&N6D1LiLbP2D5b"i`%fJH-bf%M*cP8H*LJrML-SmfPLjr8je-cEhAY5!U%SC3h
4P#+5S(QVRQDAI521CA8K6JelqBFi0SZ#U2`i58,UCXk-088%,*qbblmHjr+@8)G
+8bdRZ%J[0Df*Nk6XNXNb64Z4'[-d65M3BGM)+Nf88(Z,('"5UTd0cQ8!J04ldbH
Q4([6*r*QC+HCrbPfD)Z5d&FD+cCjp-T25Y*L&e[3%5bTiQbKihM$P$l&H*0hikG
0,3i6Q('6eeE@Q@8bbH#[8U+qN9ha&P[3a$1(KCCpBcNeK8KmT0d'@p#V%l5*5YS
%Uh!jf)6R04[Tefc%U0R)Z8)E'5aJ)p-d'cNAYC'R0"[T#pR)Z3JE1DIC5%M#eFN
6N!"5XTp-9`MGmB+i,DSJEL1&d#&m#LQb66&[NDHd-B@2"$ZNBP,lhjq$UZJ#[M'
*i5bfD1C(RC@0H%d+Ef4($3FVf8XRmLQPYPXU1U1!qqFMNiP0U2!TEQ+c&U$@-)"
D&3HJGM2%XD&)a,'K5-3aRehflFLA,A1%)Sj0YXlV[dbRCMXJT$IL1N1lT'P!m6G
-MAJH&[(0DSKS5MrB4Jh0b)J@VjM0BMkDYI!','ZPiiaTq643[m[rmmfFN!!Hdj!
!d4Zd*'*HL*Lk*'+k4"4!6(G9K*MH0aD*Q1*(9!eUZH3%MGHXC!IFGc2HY%6jkEM
CA%%M[#%H'Nf8Jl!G%(H0Nr-TeC[+M9Y1SqX`0C*!dKP0*T3T2MkPjQcX)*CpipA
*rQ#[QDS&l)MHmJHHkIhFD!RF@#8dq1jPcC(6F@3h(AN&"j)"Yd%jYNrYGLZI0fD
QJV3'P'(jXSG"("h+"!1QlK)ib!S&NFQm%5Ec[BU"6f1TBP`0YdZe$"VfaK))5MY
GUalc23U$T*'ADK%M5GI`)rNe'f'%raY[NJD!PM#KrQ-FSHi1&HS0%0GlKbSLe-U
d8+'qIf4'KITqAm@%ZXkM&HSk6m&#rBH4rkK3,ccel)Akk2(XPjq08"I$U6j,&ZU
a-3V1re`&Hj40lD1THrFAPlb0)dG0NeS`D8+dm(GLSJ8#5%d*J-5hN!"3dU$#$SN
D@0TNhXBQ,$H!"2$#ak+,AP-@@m`"`l'DabQ0P@JaE0Y&a[X`ClZ!VD+Sac@J3Xe
!q)p)hjR66ifDqYJ40@0#1YJJ#&$!kXJ(Mc-fKX#'R4RDdm&Ve'28j-REU!'@HaQ
`r$)bX0L5%(E2'U`Df,#MTr2K6[[!NS'2"qS(XJE5"hbGlJ&VlFF$1`DU"pd$8`H
1$1M(p@m1R1NFU[Q`Xk'Qmd"R[@"r!!!aY%&%3e)$!&L-$e8,ECFJN@bVrb3[)3V
[kRGTTSkVZMc(F44A84YhUlTQHe)S"I9#&h*TcGEHV[aFfS4"1Lj6Fef@lA*"rAc
T#8jE)eDRBE9H$V0@CFYeVC-CVY[9j#bXB9P18f'%X&cl-%*3T-TAfceI$jIQqr[
phdY6`*klhChCRId!&AGH*$-M2a%5%3)4)JEh+Q8UNF#2R(F))-AN"Q`+M+Ja@p&
`NJ98[SRE)*DLMMl3[EP!cVGLKAlIRjI*9XlH"NH,)5S0'@SjT1AR`4kjFLb5VdS
NI[4,&MaSc*9VXCSRVG"-HF$Kqd5MY%*S[NB8!aR4$D45')JI"T)rJBCdRSpHB4A
R+fT$D"#@c26)%Pb4QK1AbqMEpLGGEmdX""B!YVm351+R90Y3Ni5`k)Z&T--h"a2
YUrX(`'F4[K"6aN%+RS3*PdbQB-)Q62GCQ!eDeALB-e[VrX%Cj@4TQ59M3BB@9dj
lU@CH*X9,C#2ja)0Q%NLM`cGdfP%1r5Lj!3$aL$J1$9&j4'UQ&IjpIe'j[Y[KkM8
BpJ`Y(G(@(aF$e0rhCj8"rIS!GE(YY'0Da6%q$NB-H)fmHRq2E$eBlD[49Lc9f50
Vd*LZ!BJF*ZKi"%fX%9r@+R[#k3TBU6TekT5-"9l`eQM$P2`ajkP,cJ@jkPKe`R!
(V2$-)!###%p$)mj(dm2%N!!(V*XCU&AUB'0@J)h-@'4KTKU6ii9@KL2Uhf56Imr
KEE0#'X'8KMepFNPP9P%,2"P0Z6LDFAEhl[c*$Ef6)3jIS!QqQDYm`2'+fcS*36M
NcQQY9UUV(-$a5@A)F@9)$&1$1qiXKfB'VE$,!@MhpV'`GZ1*"c8eVcjeCc+P6&J
9%`k[Ye)#fLFMl@3MjDCN[LK9Q',F@6j@lM[1CSXJSYSBAIp6@l6$-HfcLY,XZNT
*9C6aVU[jA(f4'a5&k+6%dXJX8f)jHG)$-'%bL+1jk@&Ri'314[[E1b6ZEPQj+S*
&+l-bXRIEBYMBPNMi8KBP11$&U`KRYB)SIF'kZCE&8kHr+1dhVZC2q8rHF&LR#&a
ML%Zpi3"m-R*%PUU!PHamq,X1c6MeKF4)S1#48%'pcEh6`cCeY*ICKI#0kNmLL5+
@U'TqE-*`RjF4'&(3eFX6cB*%1LKQq#`cX*Ej$"f@R*jJL&LQ*jP))YiLPRCDMM5
K$V"JR)aLD@D@+f)j+IANZYHY*0G!%3Re,JY49XD$a(Saj)6#HLPITQ6b-BYmmHA
`fTm@NK$kXVk-%q)0KpC%fBMjY18`El#!d!F0H&--X*Qrhij`#,'XUBbh-RVlN!!
$QajL"X2dHUeFdI6kq4L#ammd&'9%3)06UT4G9hPMJ6+I5-i(Y%#f+#e[bM+kUTR
K@PL!KTcdNcKm(TRN"*md8E&CJ%CiLB!5@2Fq6!H3!")!PL[h)i2q0#-G!$KjHU*
IiLaPNH3lVQB5I1![PFbS$Rf0R-a+S[+,CC'SAMdV4c+CYLfIh0`$XmGa8qFp3DR
@*S)r1"9&-VbS-,N2f4r#&FKq2UGKFMlh4E0q-LhM&0ciQje+eL[6$5i$*aS-plc
+`J+*!@Bb"$fFT3e2E*`2F2!8)[K'3h$e`EAPe!KLSZKZ&S%(T3%dB*e#+%MP+K1
SpUS""0c%"CMiKPpP)XTpUL(C&1)%#pcfaXp&Ahr"QcdA`dr9Z4"q20VjSdLDpfp
1KNQdJ''*Vf2EmDc8CXpq9,'J2&ThpU1qJmSMkqa(hhK0H45QV6hKfQK8maCpN3i
dU2j9*[b@@NZ%X8!P!FD3!&LFNeZB4+%S5eDGBp@,*APel4eV#S#AFd0rrQlaXF6
!h'1*[X!JXRmV6H$m!'b$-EpD9JNQeYpNpV*)*q#i5#$b!SY@llM@H*6CTNi'56d
a3`eNp4*[1bqe$brdq&k9mMKhSFIIq)(bf(r@Bd#a9cj8(SD*l(L##Bcdc*XLi1I
+Hr,,dKcXNI'*Kk"%P-Z*#5a3NMTC)T63C)K8S!8#"14-#$+#$`KM8@#LfA#HBVM
H'j(PN!"XH)J&0,m9%X'm6,#4A#FSY1A*Hkc(8!hZ!,*#pE#QjPFR)j0aU1l(j0#
DMNpSBK2#FB)-Hbq8U!R$MJX$a(5e-BCUAB6K0PYPU%jl#ip*"J1Fb%U%Xi3'0F!
XDBI*UEM3c-T!0@$#'&FXbk%K[%,,F[bBhlS,8D%qMQ$pe0p&l%T6-)kQS"4+cdk
%QDk%6ef*lHH'rUNVdIH`'2MH6J5jB"E4%prEkB[6aADkH-JUYdNmm+'bG3*J(EC
fckkL`4fIPY'#%(BLl#3UQpeFV4BK#`i)Z9CrX[1B-,RrL8[miP&G%'C98UH5SE'
*V50c@bA6Z`3Mp'Q("A&dRa++H*3*lElrFbr&aKTMDrH,*SPPIJk[M4l*XFZqkA$
$&a)9fLTHQ2cL@,LK,h&2Up56BLQ[pV$CL-[V8M[D`lP$XX%*JV8LPJXP`VPZI'U
k!JCC-mT`1bHa`cSjbXd26QJ(+9iLR+*$m[rcrk,rMrpLCrdA8[j6m9m3rqNA&4`
)+6P#ebc(&6KM[B!rZN%68C)K5'(3+K[bRfj9$,Rc6lGHd*!!ph'SP`hjIc2VC(4
crC!!%V3E-A$j)EPBaB[[*kDErR3V"KbTac808D0FbQkjD2(Lla,6pV!MNFM+ZY4
6l9hPB8a`Fe8BQCeLSj%13&lUNDMQiFq)T-qB0Q%)-q(2%!J9J1M+TkVPM4j9+Tp
"c@ldr!-X,6%bV4i*DkNM-3iE*1iP4UU#)'E#e-#pBbf)DLJ2XGNpl@4R%UqE+YF
kUP`HUP`qUPbP9,QN[!ke0`C#rjpjQj!!F2pYCVHeQjVM)jd8+[eIr9!*2l2`b*Q
Q!d2&N!"-GI',)8pc+2kV9aXLR*!!eY+jChJ!-4FKp%r#0&+aYe"R1G3DiHT1+Si
6CS@5a+6N5@SemLfdd+5f`SXS+`!XBM,rR65R"3l,Q[%Hq6#lG-6ZKL@$%RDS$`j
CmNFp2cJ9PEL@,dr4j6%YjNU+4c3P@[I`M[fq9*bJQL3HqdQ)QlF48-ddQMJ-6-S
LJJDHFFlilJX(r[j6TcM35eNiDr2I,NdNC%a$-2,E15c#YLJ['Kk6X8SNiX%&Vem
*d313!2JbQVS)m1-K%cc2hHD`pCGc-JcLcr4a8l$[2Lcj8kJ4C8-I-G&a3U+C'8T
ma!U``%'Llch182*H*%cF5K)BdJc(6LLKK$0rKKdX[!D(kYMC%bphi[V[q@5X!Qi
Yhi0DXeM03E8PSDK5I*dQBcZJm[C0KTkk!lM'DGepAb%BrQd(Kh,Q*"`qEb)Nm%)
59h"L!!MGdd4%le3d)Z0cLDFj8EYZ0dC*P"rJ*KHZr"lqI&5)'cNdZ*M!*9F@GT&
T#RehJTRLFKb9liG"1Y3`89`IMTfU&-`kZ@-rZ4(ZTb4ITL3r6`B%pcqUCP,ZS%S
RSd08"3&,!(k`&H*eIcjf#NV59iM2jZSUR+HJf,XQF$%$JdGLcrbDb08leYd[Sj&
H(fI)$["Ha*V!#l@5iBdL,PQK5rb&Z#YA&h9Fk*+"&TF-Y,a%YZNEN6p-hdKGY-8
P)bdZ'6RVNZhk4Z6Qp)h8a9TF-YcLNZ%@PfMem9S&L`Fj1'5TI!Qca$Y4kH!3p0T
Gqqi!h-b5DF)CjR8d6@`ar-3d#iDR`N$X,8fRlj!!EMV--UGJfFU1r9lla+QmI+j
m`ahhh8G1*5VUirMTQmP91S`j0Q!dXPq(kE6"YI3-6+1ER8$ajaVqA!CBH)f$BNa
5*Uk"N!#lc-dQ3$!0%&VAB&5(B-VAm((SFa`kJp-PQVrY)#+DdC!![QbK`LEfVRe
Tp[BSJi41,@AFBM(Qbjf3!!!"pfT&&L+ch($C`d6Er#U8eJ&@C,06A0hRGq0eh'D
3!*0S'cDcpb#ZAT4pcbTE2ir'S&@AFplfIBM$pilaieQp1[$PF2#,k4@#UJ()X(9
)EVdD+!"%c&K3+N1U2R6Y&**1T8U!a[BhZ%)La#U(MP)BpFV"m8fe&3j9hp%5(")
KHXi%J,#,T6)r0ErE2H8*D,-im)h*F$lme"dbpTGV+r3+(l+5PB!4cN!Xr!q#k9!
&N!#)lhiC+KC`EK`2,[T5"'aGI(`E`VIE%$JDY-V'"UGr``p4eHB`k5S5B43IIL6
A99Gj&N&M!'40r(NNqXc20q,+3Re"2[0LIAe1MTe#T))JH8pJAC,KImrZ3PQ6Sk%
AKVi(m-29r*4R0cjf9PE*a$+J&+dQ(hcU$QqXS9#3!!FAPY6+d"aJN`iF1lfL2`c
B#Y+h`3SMbG[&NG#c#qcfP,fjpN8Sl$C@f!6XGc1Bc!2`mF2PQeT92RJmZZAR)P#
"i"hF&[0"HM(#,b#F)`b(i*M0f)(N`!-PNm18-ldGJp01*B%lZ3,#8BS2k+3K2BN
I5ZNDE-C@&f@LN!$1Y)T$1P$,![Y6ZBS$MI,aZa9Ybk'j8+QFQ+XB)%9VeS@F-15
+BIcTj#DAYI[T0XP#IF'rHYm@DF*-2F3L-"a'hFfUB&ihEpf3!!r`KiG0[3dLIJ(
-Qr)Z3F9BAKKpS[[8&bVkE+EerEqi"NGQQ"dhH0!J6+%#HN5c,Y%0S+!8*M08P0i
m6f!RGFqIf%cr)CjQKD%8H,*G1&!1U11EB)a6c"j@%4Y'49!8f6jFX@Fbq,kF*(M
ej&8f3q!RFa8lf,b4c@l4Z,3mJ"$XmEQ+!ka3TU)j&5#4qP`r"-##iZDfqUR$LGf
*()Mm96KA`UbpFB+HSMjZ)"UfT28NE`kK`P@PD5dD1#j5)Z1N2(bN5QbN3)k3!2S
iARH6P-TQ0%G[Hq[U(XC2Bef+AJl@RH5AQSf6[')!41(AT+`Bd9l,[)M4Lr(-#j9
H6'9H41K&9HC&P&i8ji*D&NEG8p'Q@A0"@iaCVY9J'D@P8@45l%GL'V)GU$MJkM9
K*,j'"(m2j&e3p+pC`HIkBADHEpf48K'SqcMamkBY4mEXS+C[fA[9Nb%QrlUU*b8
+(8!-Ged%G*TFdr&a"PAX4HQVXC)Fq(BcQEM[FqaNFqLqYb"+"dQ8eT4+RH#!idf
%0q+9pekN$8Nj$&B-XB$dTQMEIiE+h#dDl)+TB2B"C[D8c+NfqeGMDaVE&SKYUm5
fU66#HTEB0NpXZd4XUb1QZBKTPiKT'V&X9R0PQ,8Q`kD&$)2@C9K6b$!P$kEi&DD
dCTKLCTJ5&Naa8c9l`JRApQ`q1&0qm"CFrRUp3aBPNIrQFhrrr"F5XmprdT5MEph
AMQ3SFcX#Jli9iaDlb5k+Dri-Vk6FCGed1EMDSqL1HPb+UUb9-+"1i[Xk9b)"UN%
d-0%BF9A[[AAXKp6NL9Dd(9Y43"M!&ArcV'F6VV!$#&4Cd3PRElMUI!a1!AMj9$r
$dYMLA%ARYY[1fikHLQ'h)qC)$#F5q"Ka1k"bFVV+i5eTGK)Cb3Y9rjCZVZ4F6+j
L,05SQ4#(Hr`)ZmIl$c(*T!Lq#+SE-hH1Q"XKYNjSTA#K4m#"A0R*RB%cp)@*l&%
&P"ZhGM28NaPJ#'*%pLXJAY9T!`"Ub62LXA+*r8+(22T$r4"[mM0i68NArpEKa!#
b$h8)S*@61-i3ek0eRNd%"JR)m#F%%0V63$*5b&cP!JK8H1XrcH``2$SN#i+!Q!@
iDE*-E"JJ&Vqd@l0V4[0(Y9MM!`5m4I4,U6'&3NJSI&*#8*VTC,MXjj*EZ#A8p$K
#Ma[e4P0LA!&b,3KM,4fU`XqFc0Bj3-Bd6L*`I(-AMQjDdr&0QfF6")"8ed1NA1+
U6$pfVfFZT$ANEcjh4bHDmbB#Ni8PK*8ie!YiH-&GIL4kIbmlTmJQba2)4VIlBM2
AAEG39-Rp3IRLG`8%J0!EAU!Jd!-!bLVKG[A#a$[Lm"qr#p2Nb5`'aP&SiVcm`%T
j9c!!$2ca#3mlldp2[!140`kcVX2,-r6b')BX4h[`iZ[dBJR*XmbK0KqE4TDR9cL
j1L6'0ciV(k#L2PhcQrLKaCGPCFQDMQFqj1-6ifcU[(R[(+l0bPCFUiT(r[1beIS
h$%!!#MqTEaf@49Q$Ri*%%j!!VrmXIk3qb`m`#"9-IafA2[a%j1%!M0khNYPJa[N
rmD@0cdDh3ffc#q#i,89Uqc*pV0$(Y5are2a-$%M5bjejrLKjQPkHDT-Ii'8A$DL
M!5cqadRY(q)PNEVG0-"(!rD)LG%H35,JJ9q3!,hdNDH26QA3HiSEdVMYM#Jq44q
(k3-"J&L%f&SLL*DamZNi'CXT`)*j'!L#c@j-FJC-l`))LXY-#L0jVPR*ZPcAE9C
!&U$da-kZkrL)VqPipJ&&'FRS05[1d+`9KjVi+-Y+kD22A3GTr#9LldQq$RqkF19
jGN&%Nf%A*VI5C"Y-[aN((m,"lRaCV*a""SD3!!!5a(N4Nej$!"3#F-$JEJS3lD'
V$kcTf')`m)YD2%LLSikcMQ)9IKCDajBB#ND5X8[60FY6B,HKcS)$L[JmA*2ffC+
+L"4C(q,L9PBFP@B[h#-q'UfqEj3E%8V'6MZklAU,SaI)F"$!pkil(MfUmJ6,P!j
S,SP%bd`8cY&A10K88j5I@NJdd`8rmDRid"#%!053!'MfcLUE@L'"%!HFXrHq83j
0*Lkl18[*cie5TT,(SfhY@pUa94kBj%9L$iD-+%-'a%Z`@ba-465B1%VHHeBFML9
2'JmXSfSC#"FXFp9kC2di95fPUKYJkM4AcdFH'0q%Mf1e9If4CRUe*#Vk)cdJ,am
5BZ14AH1E@+%L8jSh3ZVd*eU03UT3jJ+M2U&QEj!!3%Z4))+jB[YK&N*TEPX&!GD
c!+qK)J!)IUdd@XhP5r@X0-F'IF[,b5F(1mSABj[,mm(RlR#6#L)J#A8@I+UIQhT
I4P,)IYF2*"5#HMkYS)1TZ&#[F'%f$Mf!H+Ub@4f1TBCXfD(H4QX[VRfMR08p055
bXTmGfRef8550b#4fCd(SQTa!(++3!&SNV6#5D69550KGrYQlY)&)fN2D!)5amGF
rPqV6EePPMGBBM[cVYh"*T$ESDEGRDje(NK38@RPI46",)5!5p8bbSp!G#kqP`%9
I25VH!!9JAS-#-pR*k@X[m+#mp18Rb[k!JJSbLKm!C2Lj*d-D"b&9VZ4bMZ'$[!b
8qqb6C@FI9F(1"LZX"1hfXa`()P9c(2cRi+Yl&N'SH$jJ'hVDH3,KSKN("qkA3c[
qPK,ZidMZBC!!S2hji0Sl$%F8NQ2ETZ-Fb"cEYQM3S'%-qVLfK'CJD-[2+I(0X@h
(5UbE@pSjbIPcfV5#bYAbb9XlrKE+X(CiPLpEBKHP6Q8+[9TF!IPi#m8J1QQ+bXH
!D4rhbF3j,)Dp5eC`VFj8KZa'BJiZ'HC0a46`@EY8#(2Sh"pFQeDij3f(HaEZRL0
N%M#j[-P+19C1NdeZa-FFI!%9ZiNr$QMb4pf*!8UZ%@6B5(c#iN)L)XJrd!*))&#
rb'lq)29J!'iNGVB4X%i@jLB,U$acXNKKpNjf!',5N!$C"5A3"hHd'PYdDql5VaD
#UlfV[d+LXmShA3MC#-FZFMEVd`X0%43i"&*jjGp,!D`2jdA96HAed2"91[,VE&j
-TSPL(l+SNfaV1YD@8MKGqM3QG%'!YeTPA,RpjYKYZ"+a#KU#kJ&!2A1GXhVI4GS
qJ'j8qk*Q@I&CaeMe0#ZTiQb2,+,T2Mal8G0GV9+ZYaMU3-0p(@r&PpI-c*AQ8re
mVA+`8A[`8MF4EES6`4iff$NN*K+b@)U%a-#X*4+63rDhN!#8HqLeff*h*b3R&8G
QNMPbUNf0XkU&f+pKXCrZ1!4`dUmR,a8@1'#A$))rTi6J8E6R,MZ'E,j14EJ)mS1
CBH-FAX[R#Q8#LS8V9*K&ec++br[Fj1)8*iDX4l0PrC'B)P$c4CdY(8NU*'+bFpe
Teb),fAb5XYI%KBL9)KCl80L8aH-GGY"Cdr(FC8@e[mC9jVlV5!L%&E)jc8h*BhE
eMYdk*N6j,l99I[Rp88fYr2lRHl(*!5A4KbM4c!c$M3acbX&Z2(50LL&M2G*BP"A
l@M454K4"NTqi@mN%mA+KI#+%aCaCrLNdPB%f4[53!!+lGhPGb'`0KdFB*UXAEVA
4VR*ZZ-V@I-jN-$m'YcJ4D2d43[X$!EcdLKG2i%8E"SA!U*&#'4hSd--Kj(*D3N,
$C%HZ3$N9AiF,'MYH9EhTUkP%)AcTYqi%CVhR&-DpTVRB9H`fULU5fcJK5k6QFHq
HhEhZ661*Brj&Q!-E`rfhf!311RcjbPlPSShHSVM)DjM,-NSCGfMf#F#c@P)*"pf
"ND"i0j`6f`1c[Mb-d#65)fk,96VS)LTH*LUYiVi5Uh9E3L+h+mE2a4bc%#D&8NQ
QYCF-[QL4q)$U(i,U(l+iF"SFlH[-qriB4YpZj8"d-VMeSTDL4Q3lrVbSZ"2C)8$
'X29@C29eE+f9R!T8@`&Ed2$bMj!!+%e)I(CLFq2LMeL!8I95#[Z6i'S9JJ[%U`m
+D%)h@+9EJQjbCCK,[)JrlES6!%L3!$p#!CFaEKDLkX@2QSUEl()4MK3!,MS6V`2
#2!3(eMf*EVM[VNmFB#IH4"XH2TVS"%Q88SJa'4f`iLl(f+fP"9cr+2imLcrVZ81
%,h*d@iZM+rPSC2!3+CG(De#Gl(1*e`qU[T9!#'Ddmb"HBh&jBQ0!pGS2UYjiIG#
e844X!)RDr19Q1$&*Q&+RYjjraM$GQ`A3(8edXRX9%)V()5"i-GH%UF,&PUB#r!6
`GQ$(+KI&eCL`lCi&p&N`,c`3$Z3(B%b(k$#rFYLMA[Z&0M3Ki00QEUj``9)q!Z`
VjT0k!E8N-lLbY['Hq'Mb*!QKEL+%!9EqAY1E$j**l"')QC0#5'N,C(iQLMdF%-8
e)5,F'B'Mm@2p)"$%CQh@'TbI&`8!$rLHaBD'))EXT'DXM!Lb)))X)B)5!e!Sh*6
U3q'I6YI&I2cJV89jlld@JQLrlQKP[5+(XZc1`NfGrD5XYe0eHE&49*Gb%SlPpBm
*Gd--D"HN%T,T)fY+U5jl,e!GQUNkb0"[)&3+5T8Bdf6S25U5de-UL3Lkc2!lQjG
T(TGfU6L3!+"KSSXp*'1l%(Q*[IPF%Z*0#B@fLQ+Z"1(N#CjE*Q$Z9@fHVViI$,f
XACS)3E6HMcqAYB!Z*N0V&*%rL+S!9ECBSMZUK*V1HX3QIPPFU'A%DSM*r[Zp9#9
FJf"0cqrC)([qrR#L4lJMFN)TS[GA'(`Ca0I3a203BMfk%N-c'#38`KF[@h"["pQ
E`q0I+S8&VX'KcRcDL8#ZLZ)-e`iZ6!r"35JmYV!BA`CdJb)%`eYl%[Xj20$KU#h
+RpJDN!!q06$Mqbi)C6MTV12NLREN['&EV#2Rqj!!Jcd`[K#&U(E55j!!9SQG6h%
!GbI-`1#YF2K+[,k[Ki!"Cm%NXBe3iSPB35LG8c$aVX"j+"XTVje3QHcLX22a%),
1%5iDc`94p5[G$+YH)mG,C%QiAMlRH-,*F#q)[K`QKIpp20(PLl`k"#F0TmD%DM0
F!Rk&60hJiSK`iZ[@QYa6Xe2VKNM9r#*0eBM3"bZEb+Y"ZU"*85GAX`c6Gd%-G-'
C[d6lJ,BIa2D6[$N8,ZSj%81PCbM#'AMHPqH#"0iiAVh)Vdl%L)cp5@+lCY$b!5a
Pe&$%`Xf-8*M3J@q)J6%)cJ+*"5H*"HHDMKm&&$IAlA"lKi!NB2ZkU"JF9T3&ECX
L(QkQ#3Gak#rj82N'#BLE3M``8b!FR0cXP`83NB@#ir22)`2V&3&Kk@BmirKUJN*
QIm3AY8&Fr%"ETX#&U0ClU$+h*2`1S0-1Z`l5m0981@3IKdDhYbaBElH6k$"*G"J
+i2FZ!$mI!Akr&XhRVcNBaS3kkZ#`TRH"QXJ,"2QpQJeTlVbU3(kmB4hdFbY%T4h
NAlQVQJ%q0&lhA4MJLrVBHEBakLch4P)%9-Yi,8$((FR`4KlH-drJ(`*FVi"FpPM
##G*1BL9!%2m4%H5A,l+S1[UBI&0ad6-8d$[1LK*GB,J*&J+Tc`B`L9$R*l1X+,0
F8+$RVc*a*+G-E2c,6f-#pjrC8A!1%erpUdhmQf&PSZ+%5P"d'SL4[6#)S3S3`fj
[#@)!%&1+JP(R*-XN8,Si%F(Z1$YZVRj"4K*lS"T+X`(ZH+08FV-j'jUTeZE3k(h
qf%Sf1&1pV$ijk1T&!lB93G%l5S!d0[Em8Ndak"VNac[q9Rr8A,ei[aAFdXq1h)@
bXHHRCHKPVZTMcbr+N!!Mcb)6i3!8S&KKN3P")80R@+"5jdaV)1+l&9'&VQ5d*)R
lEQdZm!Uk'FZb)+C,Kj8Vfj3,4j3,4h$K2QdV4&Bh-TA8Vf)#L3iKB4Pl3e4HhI&
mV32#p4#)3!F&893)2j!!$!dm+,6(X8l'0U*-EbLfJ0*P3D9)%5i9c4jPSkR!M&I
'G[%'X58UF+CXD3"EfX%1T@-,ddpLNB,LZ((@aK3K(P08,J4cT1A@SZYTDb(DQT-
+'i%%*ZEe3ENi`9Uckq9mlSJXKRDmhB*piCRUSYVGkaVFm6EB&pjb*`0AJ(dF@ZI
(1pl@(h@!IIR`FC9K$3*+`-$S9S*+`-#SFcjJ*Fp%3%$[`lBmY8-C'P1bY%p*hU6
)a&39H4!Db!T2'U+Xa#JVPeXQFP8SYNdQ!KYpE0STe)+i0XHCE8$f$Ql%4LD`NH6
B4QbN8V"#+&$4k3NQf!1hf!')*chaAil)E'"q5V1R'H1fk3JCcVDPL+[A5Sle6Zr
J(cJ)Y$%BGbE&34J'cE9cr#+6SA#kZE6)N!"`0)`L1qXb@hfHLr659T&NmQf4('+
VqQ6HX#dZ!(V&aHi*l68i5h6CJJFG)"&8Q!dAm$f%)&Z5!fCD&AFJ9NJb)0IJ3--
RpJFiPf%4`L+%44!,&BX)&N%X([i$Zj1KL!8@0aNX4&FZiUMZPSddFQ5h+i%U!`8
*9*!!0@Sa2PI@I-Zl!Z%-Kka[KG%ee#fIHfm[[3+mCie`Ce'qC*j"2aJXYTfb*3i
kDVYfXJr8!RBS9Y#aFS-K)bZApGM-RcQ2`d(!E')B!q4MhXVYr`b6bfi2`Y5"4*m
1J-$9VP5%'[)"VC)G4q8qJL-CK0cQi@krKT63-EN,2p22RA$BpYcRY#)Bh'icRRC
#18'"EH!KGlN$2k-D,!JZlS9MD)dH0Ubi`TIjiL`#B4TSa#&3$C!!&GeKGDGr,Uk
#$30jer22b1XJl9ke44XBXKrfVcBD[hM39N#(I@L3!2KAja%@j3mi$Z+a&4)2V0k
*R19#b2Bk&p&!Pf#iE2qbCHM&,J3S-95j6K65@MNZ,B-6&&d#EN54Qee)a$!$H!e
"lMCUbfeNfF1%`Shqr#N3q#RIDa#6+GrA5@J1Z&q"bJHJEL8A(*pcZ"`Je!C-"RF
BPZPlRi11B24N'6UTZbcFJ!V"9HF@"fh9`ih`V[jmlL%-PJBDJ,KZIi#""Uriq!c
#RLXZ('Ma+`Jd"#r8p!)NST!!!$YT[V*Z6FHI6lPch%NA$R$TPr0f[HS-IQMMFFV
%#XJE3i#r*ihj6@Q&'[Yd!"Z91!QLL)PXGMG"b!#0BBNX!8kZD"C`XUq9P5dpQU2
XeZ$KI['3!1'j5+C3!LGkE8GB$#fP(i!2qjNN-TPGdf'BR15@QA9SVC0ml*!!FVP
G+A$#"ap4$YBI)X44N98HIMK*'mSm4!'&#N0j1)'+"@CmkYhXd3cF@AA19QIMkRE
6cd%J$"ZL!(5BQB3U!rDL!m%4UAk@`p-4JKh6R&G&X$Jp1jPNQTlIP*B`Xr1E4,K
BGhSp2D&T+QFdQjR+@@[0I&*Q1!Y$6qD2+PY(GfXhphNfe3BA%+4Lq$L#SU0-'KT
D$3&!RSRF)cPTR`#F`meHX1%l6-M-8aGS,%$-5NZB(Nm@C+8*XR)@aP[+BLA!iT+
&f`I+Sh8fpcrjmk[@5Craq8f[lSeC$8GA(d3iRF--8Rl-QV'DQ3"'H"G%ejYC#MT
(V$[C'3j%FfG$EmBTM0`R3[EX'22Q$R6m#&,80i%QbE$e*2rr1hB8HI-[P+iKhkb
fMNj+[D2)0krcjm3l@"C%jiJmmI&9C&ZG+"*4#!,c#SKHGmj+q36Nr%0YeNS*NF2
9C,4rUT4$Hp,k$$YU"2a6F,J`)%j!bZ%9LYb)!ND6+2KL'q)&KmlkpSR3#lXhJ#d
[ch1J$-[@8S6*3))MV+pDZrGrNeNRXYXkM5"FL"021"YBhr%ShFrTaY!S(lSEI3p
r0Y[N3lRSEbFHLqlk)SaY%SbP!(J*X4GZ#IKST%kHfN(S"a#XIS#VqA1"q8eRXjd
-m3!cRT850R`fkrHXkBLm`-@r6f2pr93%r[jrmQGA,H0#l)p@@l2%rPh%p+[%FR6
9q6XrXAa!9-6IM5MXAV*fkjdkqJpCXrm'PNHh%mZ4F,qlRQ%jIqlA@Ikl9iRPR3$
31ffjIr,lClqj#XH"b1NEJZ-i'q6X"0`0!)V1`UQJPCNeF)fk)6h!4E-9dj!!FLX
hLGdj9+Y"AILM%%['5(Kkp$I)%!c,2NX1#`ImXhHh4&mRSm%Re*L"cH5L(eJQ,q4
@Z&p63)PHrf$L)IFX+f#i5(``QB,bkX2dRXQ(aBHYlKG1I)"T9lCbB$N[B9KmQ*X
0blH--0bCD!mU&dLhp%EVri@6dUFhLD+(J#a[c!XcK(+cTXJ-"`3,rY"p)62-##8
"NThd*YdcT0KFPXP&4'lqfUXf2U!9eR5%E9#U"NJ#&`I6RZQhCS@Ui8*'h&(SP8i
BhXcqEh,BLJ[-Xp(T4bR#TNphfX&&bI`XZmiM3q+JAA63UcJS`P8@"b'VdGrJ)0G
C"c@M8Xp3Q$YXRC'Yk(CiPSr0A["BS5cC`#N-cbjb&,#!kRp!Jq!*ESB4#0,Y!bE
G-S+kMBN&[8XZ*UM#"d6AYli`N8VV44Hfr)1UD!GM4iL`BN"ba&B8VKhC'G[jRcQ
eqYT'2JEFa4Ckd5%"0I'CD,2-,B+d'PC)UjFcC&9R5l,UH&3cd*9aVpGN-Xp96HD
JM98[2DX[&h2F#5`48D-JSKS8)UUYPQa#GD[pD,-%39DY%%qM'H*Tq%,%%bG')a*
$,6#TK-V!hH+Z#Q'1erFcbDQmVUIApd6M2$%#8INLJ"#B8&U9Zf(dRM[mTAm&C0r
,+XdEd3`8dc6SCd8,0h)iV!IG&XJcGV$3"0`Q!"F(AI%d(Sm@9)@X'UJPUe")0%@
G-%`4kE105,D+#j!!E"AZhHaB#-+Y`PY$K4SMF-U&J)UD3XMVT"NUS*[)-Gj'LJN
bX4',ZQDfLX+0$9eXPh[Y4MNL``mJ6'ai$9`R(1H+RNf+3N"5a&hNDS(%53cJFi%
VCS[#`3`ZJDL2E@9a&,*4plFTEadP*N6m[@Q4P&k0&EIK8",4S54LJ"*4j83-,,a
5eD!UT#'%60GS2XI0k,1)3hXQbG))40R*"'+k`ed*9iJN9h"dBAZakLLfq!BU+lD
P0,ffG9h2jMa6k(lBB#GPfjrr`,AZU#d"m"@LqD9I9KjGC4#mrrhJ5frS,hcM"&"
ajb`QGbqGGh#&c!S'jc,$'L"D!T0P,ehR9qKm22C5!UmqQjG#j01J*)ScJ(QQaB!
Ea"m,Sd4ccUZq(hlTMBjY@!4IfTafJCST8P9EN!!U%RJ,(I0'-(NCIriNMA!cZA-
)([*TG!+EZ)H$e2a4+$afpEN(XUILmqMFeL%RUaD2RcXmm4!'(F'I8TYXrbDka#8
(%`SkA%@ikNML28!aQbHiQmGhi8Ur$S,M1N*DT3KmRI3ff-[3cFYZI`!313SXl*r
MB5"[(,X-"(K3E1iVjeqE6Zb(Jf[2iZ&MMBRY2SEZU80P,bSmGi'PZ62$c-b`-!q
$Z`)GK)k*-TGkEp"N+"YcVqd*3@,30TYSF!1libD'-,`*3Xe#YU"SBZ(j63ebp8%
[#'Mc"9h`LXjeD`8[([T%&m5S90Y*X)GCYE#ScA3ac!rl-`m4mRCr*c2*4JmL3ZR
Sda5'm3#22Z"El2bRZK@'dF1QY-Q4#db1YjJF5CmX"p)Q'kG2PSGD6$EF'804"Za
Y-F"XFIQlDCI(,h"jDB[*mI6,Z42iNrZYlr#MQ0)Bd9pD@Ea+kmL%e9dH)@[iLCB
eSS[G3Y,)4H%8i3QibJp@,`iIV&j5V96,MNbiSfQ3!*!!283d-pK33b4P$jS`15)
8(a0XS+kP-`iYNFVM#D8MC0%K+m(jL4pcPl64$CmAa!P))9-4#T9(heH&#1!ZbPQ
9!+B)(dpJH$XAE+I150#jI(ecY#$8bFS"S@5SDpmcdKa(m8N3632q[jMr%q(k`K9
&%E%3UL[$%+S35U(cll3J9IP!cS!i&0@hNNQXHdIJUQT`GqC%&ST(0EB#%Ba,I&(
+I-F[1SElDPI*pB*-[HHE9`M@d'ZeemN2E"j5[4k3!)8'%G(@1bfD8+GGH*@k*%A
M%851kCp"df6EVMPd9$q$`U!3EZa%baHTBQ[$Ah9V$D,"G'mE0`3)6[(i(EBFE89
&NqBNZIdJqc%'aq&FpY,QLCa@j#B-%pYp0r3-bBXLQD5'Ua*l@E"L-(Gi$%&UYQc
J#Z1cQ5K%ddI1Xhej8fXPYC1QBUkJm6466JUTh,FM[F($KNJ%kB`E(Fp$Q!HiDhQ
aT@rX*1"#IT("hm`-2T3qQ)QBNNTbKXEaaUKSQ1Bph*hmIbaqCHRp+ZP3rSN$!'G
#DDdlbSj@dF1#a+#1`6N!QeS@X#,q`34US!bXqHP)YRM8#Vp6NPd9M1#TAVd6TcP
U#-%dM9CKbRbKhq311p"eaj396MGIShjm8rjUSrYR$eV'*FIa2QGe0JHRFp8fcee
eAh)iUpfj,+$LVUX2j86K*PV52cG#5j1EX,5-%hM05cZ@F9S1B@QRTBAP%#hG@&U
dc',TTQ84bb`Y#eJ@DGQ%CB'@P9JfdE)+bdTDjV#XSZ8#PMPDVQ+j3-XT,&GTkF&
bLTDc@(TS1BrP,#h(iE,Qc`DTS*(m6c8EA+KqD%'Dq"2((c[q$1'2C3A28Z!TBU5
[lLZ#NHl[+!6rbf`@q#F3VZXLakdileHFbh55a%9-Z-VXR$bT'dL)35FM$e)#T,[
q!"9!(8PrS+[pbqF@Mj2Dhi8rfeRYFc28@iI2,Yk3!#f+6ZGq1[)fEi)ISBS2kT2
rp8[([R,kC0m5EkQ#L`YfSBV(S**h*F,N8Q"30lX@LSN-falHTE%LpMAJTB8!DY1
&TYN5&ji'N4j#XliDS6'I1bH+!6amR%b8!C8Z[k[1rBXr6M*dALYNKfRBfq-%,&3
iq)L+Pe'FlQdQ2LT'6e(RQK@$I&`&"j&Vr[e`aFZ*F6Vq3hk-*[md,QdAPqkD%q3
NGki2KrH-NL!KJf#lVLb8C0Ym3VTRP3,B)mY*G*!!9$R2EU0p1K(UFC!!!TRDlkk
&!k#5`#`@@#"!Vd1`-r#UBM2MqH"89B&l5YQfiD,rVK#c%)S+i4l0LHk$I$(A,H8
eLmU2eEj'8#4PcEV3F1)MDJR1[GZm56V35&0d1d@LZ!jc-P@F)q*,9ZaJ&i3@6U,
F2ETp6R3&R46GMb!%A,2P6MDqS6TrPd@QY9$N,XCU%)*K4fGdH80KX-2F3((emT!
!MX(&!af$5qc+h'VeDMjVPMX-DUlf95kV0ZY*"iF8E5Dk`TZb3RTL+4[YBm@"C0S
S93TGA45(jN'F2I5m9,q0Be!3PS[$T"L`SZC3UcA)#@'4bl5pKF2V8A*ijHTjl[a
5ACUBC@J4lVF`N[GB2Hi2#(!Z$d)#lKA9LqV"kQ0LJ)d'Y#6im3q-6#UGPkY&*FL
qQVR#*',"YH(Rk)[S-ENd9JlhiB!9fY*IGllVYTjKjD)NL+flFNQ(*m109!9'G&%
3pY',Iq(,SGELZPTM%!kQU+(jrR)fadepDKCkPYQPU3mK-j1EU&BC`(X`L8('LEX
r[LXMq)0`cSq4F(!NLALcj',&aQ@L`kJUEXja@1MH!-0!@IPMr*-!-,GUhaUDY)*
*UG-Q-5$-NbkR69V"T0C'mqN(S8K)&,VDN4JhCfiaJC%iFe4d4BN-"lp,$G*r%GN
0IM41+[qPAkGhb#5k2G8Cq4mY'GQQ-c+fQ8%&BQ5E`XK`1L0MjfM!@Bb-I8L-"%J
9@a+-M%ePVSKR'-QK-%0Rj$2pGHECM)c9%#-0(A48HeSb8[eYKT&Y#QJMJQ'G'@C
'RK(-0%pMCKaQ11TQ%jM+2mRrNkPP#5Sf%2*Y"A2-L4aqNX5SH!--`,[FNP(rFHi
r[m+-kKY+Be3FM-)r!8E6D[KD6%eHB#UCa6GfT%fYSDNU6E8V8q1R6B9+T+RYD92
Y2&9ZTDQYbY5D#d`p4P-2TdeYTDQM0(9)Q@Srfb!a9@bh+@hU%+CHSSNPAhhLIk8
MVr5P65c"a")!m$hL(br*'(0%0qB+hCMCK$k4EXba0M,QYTE',$Skb41`Ci8b(8J
+'(#$CJPc!2M6HXMakA)3Tjr!&VJj&"C$cZl%j'JP!i3I1dkJc$)6b4mV9CT-3b"
kBpiDJ%IFR9A%E)BX)cJHDMI(VbE3Q2lBU`5-$GNXd9ca-QY#e2a3k6SdYTRBPaH
*f1rMIkK,YJ-3$RKfcb9,ZA&ATM6ZGU-Sr+h&iHCE[JrKa+!H[1Ac,)GQHb(NJif
KYHdH4iXUdqLHr5b%2(I&b!i1RYh&QeTbiQj$qEI[X[-K%jedCHrLXaM8,`BeS&R
QZNkK5e9d`N+Efii'6F4VFPKUq!UD#![m3Qq8%236iBFI4e!,AG49XD,`,R2PXMa
`8BjR5(IpPCRq#Mp6JU6RbmNKap!,&6(F`*f@iH%RU1N-d*!!5C6K!B8*8[k@f#$
PHi#mb+d2*[ab&Ni[P0J1$$CSDT`RIV++!bM+F5DZlrM(eqQaSErqa`rSY5BDkM6
T1,eU6AZe$YI-YXMDE)YX66&Sc8P-hDIT3F@8q'HH!1P)11X(p[phELa3jk`ml6-
8U)YB5G%e'X-flNcR29cN(1V%AS0"h*8XB1-jr*X9(0M$TIZAdcYjik&eAh2HVQY
pUTdlhiRGC[qAFqCc,cR3lE)dq38++F0j%J&0iI4NT)2Tr-mVFI%A[$i0D)mj3JN
Tkdcq*e8Z2)$YTDle3J03-5ArXhYFL$#4B)0jp(i'!#3TH$%GaCbNAdhE)Na"fNq
lL$YM0849"Q5!%"XjV*JSF))#a34NV-#iba'ZiX+8EE@&Lp-lq!)!!#'"384$8J-
!@r8293YXU3$CE)[rlLlVZUc0RYV8(P,VjlTm,U9d'BENGK`QpfYYBGhfYXeZP8h
5BhBLlPC$CBmA1Bf(ZDbh,@a+JbfY8*8B!NcNH3X@SiK1NY0FL+GA1`iDK'SDJlN
SjAR,-!k$[D6DprIrIprZYp[ZSMecjR5Hpmcc"aTX*5e#!#4"%#4")-pDaHc3%'l
LMcHS)XA-+V&i4CK@ZD+H92m)V`qRh"HArXRc6%IHdL,&hCDhjlRVVU9&qV5V@J5
RAK2L"b-YLjDHaU8-Ph1iQ(%jL8XeK,FEV@ejDep(8B*4FEYUPNkjrMBdp')e1JH
[$3dphIXY9&`Zr41b,!%LKCkrJdL@NdL@"C(AF@R'T4kAqEM-`f@1MdKERA!l#4h
VJe#K61Jc4UM%5DM%JY!+A1T`fBA,EP`DF@Rb)j6P*25l2JKpaJJY@V!mN!$5DaB
XYq@RK9MQ+L-5%+UqlPU`[#0[`BYBA[5[4m8iZT%JrIKI1r+@4$#CTCU-`0%J*N[
m*jI-YCaX`f*[cB)A(h@*E[jMDC!!IZMi%204Xb9%$hqaC#jrX@!jUZLMF,@,+Yb
-Ie(qSXVd&+mD$E55S$hIda@qZ'!jFprXUPN5SFrI9-1*S2DjC#lrC%F(%cq4)YG
S3@4@Ga[pN!#(3iaNY6##a#JrJLfTL-KX1RC+k#(PGQf"IN)%849Sp!3,rb%GmlV
d4j`9J6T%I@Kk`LQ1k*'bb#bUf1Qc1#jXdCRC31c8Z$X8##T"S"r53kKqb&&AK&)
A%F95$[23pQKJSN`BIme3&T!!Sa`44e-flJi'J[&31PBfT!I6ej!!SH1ZXU'Km(@
!,"!FUAA6GMS#`90$k34$4q+i(+a5JN6Bi54XX3RCQ[-+A)l-"L"1eCkqMHKM86m
Q`),*$A`i#-(N@893"[K[)eY-PCCBV)9j`Z&$6*Y*f4fHi!Ha5iSJpb1c+-JC5NX
J%@[j@(Xp8ZX6M%0`"adk`86,)4Eb#HV"r!VD%2@''h+%-PVq3&8`LN[RLb!Z581
6B&$8U#bR$$6+'HLkL500V9*FB-JKIS3FbM$a31[3N!"l#3)T!dH&q))1k-Rfcb4
N+LSR+5%$b8Sh`M'Jd('SZXd9G9AbX*TH4Z(J#CDKBMSHBSZU!,aZ`19CA$ELXYc
e%Qj$Z$`RSpZ5)`j6eZJHij0!HF%4&11"$'iaYV&H!'dE@K+dP%L`4D[m&kQ$#j@
69%a,PIX19(dNP*-)Q2@"I[-iQM48JF6(r`R(GTI@T-c"bUT!JE[da+Kjb"KY@B)
0AL+5kDP6ihV3(JeN$Z15cTa#4IqT',*f(6q1-p$pPq@%Zh`"C+c3AN4QdA4T9C5
V#!MSj!82"!3Np!0G50k"8qBKUQaY@ckd+Q+0ZeVbkA2'1T&Xb6F204F#I"fLcS$
(S6be(4q(YlD'd[%bJ6"rLVe)kGG&X$R,`j1k3qr!4,)jhi0%@ajdKc`)6IfTX!K
R6"cJM(i!"A''MM#Q*4J8Dk%33UX1Me-5G!CHh%9"4JRBAB93!jJNjSBGUS!k3jN
B$V*%bcCcDTJP@#'1X3)`(MCM9*!!kITh&jTHkKEj#)#e*AP!P@X"P@-!j3e(L!9
4L!@45"X44+ZF366'JiJc5%q3!,+BXbKHh+%a"Pqe2a*BiKf40RG1)00Z%YQjrkd
VZGek)KM28!"f"HqSZP)92q#GeLIec0ekmiHh"4GhTNG4KCcb2Pl3C)pk0RVEpQf
jF`NDKiS6%q'8IYJlile9G%hPFLD#cFP"SJhZL(U#r@$8TdAjQlC5Hi@liYjDICd
k!lKMLKcJFHjBGHGe9#lp@ZMNf!iiTQ6S5&fK1bTk+q$B*!Uj$$VfkGCp5d@rZqU
%&bkJBMHmARD[HbUAXd+`rj5Y!3j9ZD[ZcE*dL!!NfLKUpP"BjTka'Uf+HqBicj!
!PV+f[,dfa4UCaFF6!"Z#p$&MM9Lp0Up9XG'#h-rZFiP[J$Q1KJYB"RGKHPCVNYX
4kD&&%CP-T!p#RqlKK$lGidmS)T1LX$C%6Y[N"'1Xqd&3h-##E[GFeV34-aJRp[S
V&1fhh#5mqe%YQBL*(JMPQ$-Sm-p'-#BjS+1iG#5I3)Ulq)14b1cqDCkSF((JNX$
&L%XFPbjFVL&!18L4r[jT`#a(+I%jNUV0lN5iG`SGPhjFFR$*CKf46X'5KQ,P`ZC
aaR$'F*!!E[HLqLj2bVCSkBEV08Xhe(FT&qXCb"1I-8iLQ$1jUd9-6pl0%YNkmrB
SUVp#peMeNb+QQ*03D2"-G5`I'Ql,khN2(AAkF"ZYQ"U6TmENUEbpclMq"N$Q0#8
`'IL*d%Yj'9[1P%@Q%8$*pJ'%4[fP638*#`#G*P#GNN0C6LSk+1jfSdPP@p"L,CV
Y#`"V(d`Jq)G0"`XMkH96+U)1QDMM54,95(S*JG(D%Z!J6iZ9&KE0pJ8ZSYKA!jD
3!,ebSSa2jGSdd#3KJd-*fha"AE!#bi8bdD-FG1FNRkr58m4Z#23h@[rek0!31`J
(rS[l2NJIJ('mE`5'Mq0,@-5mU"Y"J1DVaB&XkVEJ`k&e,9iYpJ6ekE5#jLd95(#
h[j2PTQ2c"LlCXP3BMG2Tf2YIkflr"%)U@UkD"EZT8r*X,clcD,RSjNd(G9#Sif'
+J@`k*+MEXq!jeZf4Y'i2G9d-X6l,S)kl,-1D8#kCC#Ll95MREJUPEY0Vfb&DE)P
SDA"!L-Em%5(T6XV+E2m*VB6j[0U+"i5VTMl$-qTAY8#@4+2+@'ZL1jb8A`bM5Y1
G(UA#'iC`"TfG&c8!R3TdK%0MBN!#T$1cPZ*1B5d)HbMmC!,cq`Up*dP`f#6"-II
&qQpj@M@`)9'2iikbcBNbB+@Q[Tm&rl)CCj!!N@2DJKm88jHirP[B`2+f2!LVQER
&SCe!&KJSQT%#hS`BH6-bLUNcr,MIh`CL+Bh%Ve40$JNci-k"cJJ6[YK-`MUj1N-
6j6XJ2QSKAY$b-5NEm59+R"8+U4Dp2@1+K*,f*r&fR5RaqacqiMP4NqkAqB[rhab
6iT+&H,0*9iVmaFqi6#*2@SM[0LAHYFeIr&YPTX6M&Uld*db+9eQ)ccIT5Uqrq!1
55A',c(bJbH5QC2Q,pjMl%%qdjHhHJ#C[#E(!hDZT)I)YZ6eT-V4fq41iIBl*$,h
K,kjhQh6HBY2eE5E&MIlL$eDEG+A4Ap`V6'lk#J[aAT2LVrZ,2hV0C,$8@iJAQa6
IibpZ6*YdjE5&q*K*m9CrmIhj+2iDQfNSDR$9l&h-K5l8-H"4CSU*I$8MrG9m)1c
a!4-3"#"(`%3,P'i)4+A+!3BX1AJcGl'%-qLpmeMe*Q0krcP(R`DLIM9`4K8'K!L
9"+M-3$FUNlY'$4*2#1TUTfrJ9FaSlLD`a'K(1(Z#FAFkpQi*`'L`8&iC+B0TbDR
FSPPE9D4L4qPYa3a)mVN`Rc9Ec-A1HQUfD+01T15'PKUZDDh+3!0UqTeU(!$QV5T
JhJTJhSS+N!"f6Qq2hPD1l""kd"DP,KdM0mE!E`$h!,eLReDLb9mI81,6pRSkM$+
CMThr,$k05AiBKrS`HJH!c+#ae&HCdFkaZ-Ua1"b,$a,(fR9q"SPM0e51hB"M0`D
*Be'9Be%i&KdNMT@T(#Z$Bf@$a,'M+XH1`V'MJm3aXmSa-a`c$a,(UP@19F1akN(
L@+[+X9BieMT)((1T((2"-GFJF5bYFL`0ap+$a,')bV%)()X-%XHU9)j9`E'U3H+
B8H@B%BiC"iPMee51AB0Me`D*BpdUalVK@2FJFHbdbV(6F1cd)((XR-UaFh$Xh#"
a6&)j*X%aDC!!1(C5jGK*1(CbN!!iGPEPf&NiGRD3!$JfUA*X%Sj0$K,(CP51cF#
aQ8(L@*(+X5)i9M4)("Y416B#adEqIcMQ2F'UU6CiVBqH%+2Xaecf)bQ56je!BD$
$[8!N-5!hEqq2(k@LTdXJrBLk`)993,$UM1XVXEc)D1A&Lhi+*e3)iS"i$UTp%lQ
I+8ND(*!!qh8mZEhU&LU+[PGNkmGadr8'Va[$Ad1'#Qr06V8DG3'0bSPPEARIr,U
p%qd%A4!-EPT`BP9EhPhrm53%SCCf9maId2a3mdFLH8Y#$i[N25Kmf,G,4`(Me1G
k6C0J!JjrJDDd8b#I+F,JaGd1(JK-B"NAk01"bEDmEamclF#G14U"1frdjF#G6JI
[b1l,J6Z-KKfiK',4aK@EhUK,mb!S23R"QEDmAfCY@M#1SYBl[ZX[k"I85IT49q@
e8YKD&1VTp!U,8i%-Vl3eA"MB"p)4JdK("Sc8D"#TFD")GkibK(6RUJ%ME65)Y((
!5,FB4,TP`%MR'83kEm")$3E6cJ%(dmibJdM,"ScdT%'N*`H-0+dKEIrbjY8QATi
fm6*Mq18p[5CHHJfrh,AGa-YZ`brrVGl%5a-,[eYLiQA%m-[l9jKiZGfAJ6!q!P-
UP)8S9SVKNX%PKD'bMRZXAB,8#QAeQr93'V!piUHqmN!LES9khCL5p#Q`2*!!m$l
X"8Zr2cD4C%SX6D`JBKeABT',)BDCQQi6J)d#U2(%,Xk5dMe6[A&!E5G'Vrma"`S
eXDrH4+&kCMp8D`30Sh1N[A%)K,RbXaP&VIM(8C-C&IDC*N8'-U#K8T63#L8Za+R
JB9+j,U$8&@PiGDYR)`SF(-C*Aj!!bN(VAi53!230AqF+Hf4f4S&EqV5rbSmLGP6
FiX8!d1%$V"J&+Qj3A39ip44[9-*4VP+hSq,X0BLYJYLU1!kU"k%Q0-Q-XSaKNmH
`)*X0Bq+&1@PDTM)Jd+XTe%'9+K%3X5dAJ35$V1#m[d1N#JQ64"PXCLVhYliAc9K
iQa!d`(S9C63+NhBcmRZm(BA&qZ0U`9[13Pec(8)L!5FlFLYjSG-r4N%d`ibp0-S
[BGL&AP2'ZFc96#(e&qGi0J*e%bPBF9%A'RXXE')L%4c1Q2klkY8k'N6*L6#P,(i
!(p)))lh0Kj!!%rQU%X2$Y[N1'5BLfpL5CL,#KEp#L+I&q'8FC6Qf6,e9+qLiCe0
Ybd@#!MbGE+-"C5jQ$'IB#k+&Y,R1cGQ@Md@9pp$JLeiYSF56lLSNP,pMD4f@&XX
*SiiPM(Z(LVf8B(CKDS[mDTImDJY20*LDid`f'!)q0-F[iG6j%Jk'Pka8@T&drXS
b[i3'VI$XK%2,b+50[-dPI#X9Pe2"EEfF`2L@rc[%j#d'JQ@d6&[#XQBLhSV%8[[
DCjk0E-KjAdP[2Npk81Q-+3qal"R$SJSSf)jjaYa(!SQ,"iEQdC!!2#eC`C!!6`a
*2k1hIV9mU"H*20@hBQBR$EG'SQA!IBNkS4&JVjk+#qUfG!RA14`)#Cb5&2eJ!C!
!Eh40B$,H`CJ)*Id5*(dN64l5806*8*(N9fpk$hLYUS&'G5U6!Jk`LP&pdMaNLlT
c2"X98Pm8k&MC4ka'&j5+m`-Cqf8-j[cb(D(EcH-`24E63lDSdGi-KRV,D8U'AD(
99fh(ePcGIa"+)4PRm5k8b$`[NCTbPmC)9l'`1-M#CD9cHU9c'U(5j@1[+f9N@TL
XmS@*ERr3MF2C(h`B60d1"EF-1N'6e18ce!f5@68b#FQNakFk-j&NUM03DcGfQ-H
KR"RV$+hqa(CNc5Il$q!i$h'aVU6lQ(bF&CfDibZBi`IBFHUFdhA1D4bRdhHF1KQ
CGT`9UXEL)"S$(!@Ud5N-F)3b)8bZCE`(k8L'$N4UQ5hAZS95DUPmq8$#8[Q56F%
G9F2P9,jm)0'RmU92QAXA+F`48cE1C3UT3561B4KlXTR*&-FZ'V,$c(djKqii&HP
FF4H-@J9CF"S9'qYDXd4DRQ14d1T864`E9N@$(G$!*rAF"fm93Ib!qU$qH#"Qbff
RS0Q0"LZ)4P#h&hVkrFPSUV*2Qq&%bV$kT8ma8&2QeQfEIa4i)NkSS8aUcr,dacP
U4eqSMBAlIdeZbUl%E)@qSm"C"`h2L+0U!%G+`'"GEX5kZF3c&SHTSl!M6XI8AXB
He9mV4K*qK,rd@jMajNGqaTCZi!)mFa*N,SkCEL$RN6PMkIk,)fLNHFB-Zf`m-q`
9N3E+#UL,ldjl+I'$B4arj@[24S[-f-8c3kf!1c"#RS%5NJHVN!$K)CQ3!,dpSFK
a6ZL9V85)('2Xh#!KPLA*GXUf1S'06`kiElG`aF!@IMFb`)8P!e[iEpd$A&JrX)@
l"NK`e`!ciKl[!"If$QcKcCN",M`p`)@V"lC`CrV*,U4"!$RG!2k6[SC4(TJJK08
ic4['8cSDU9%pY#hU"!YGZN0Z&SHGRD9KCfI*B"G+8AHK3JDl8*0bTifDZKQp&G@
GVDV1`KID3#P@19b+3C,VD2%IG@f3!'4AL!DQS$[`04"riDUjRiEe0()9,qUJ'+G
pB-P[dF'Recj&pBI4[2pfL@+&k#kRk#iZ'RG(DTRc$SDZQBZLL@fPJcecPJ'jcLE
fYdXd)Zb$$H#5PGrLJ9&034Q)GK60`J5U"ZMNb&[#A5E90NFIfI1'PMhad1TD@p@
D@S#JShU`cdaULQ[CdF5bSj9PdKlRp"lR0$)TlXZN2A,(9-ZN*[p-FS)Z1FL'E$5
DQA!'R4h@9%CfmiVhE9'@M64Bj!!bNJmB@DN'!"R3XPZHfYd(d,,E!QKa,QFN$[J
",9mi"k$*JeB4"LAY``"GdPA+T$S-&"i'drjK%,G#G*G6G"FAeDHKU*pNJ4$d"8,
FHX!r%0DE#J6&2a$@$c!3NR'%`5@%JC&YlJ',c@9Kl,Hj#VQThYceKMGA#bhGpU"
&F-R9*j2BRLCeD,%0fk-1+dbT#HlK5DH[N!!#'A5Jh"@"IYfQ!,!2NpNikYl*46P
rT%&p$X9f(i(q##c&TU!)D&pPLjdem6Rr03`#Q5(mV`f!(Ld!%M5!P!d&PJIA9[T
#3-lqV5e2qE+I!I-e5cI5!)bK"-bQBZJ*(`6K'hk"!4IApZjPYhhXeX4ZGl,E(Hc
f5hCVC,G[XpYGl2C0h1EXhFPZGHbfPYe@XpXDGPZ"@hVI3qb@C,I(f5h&EZ[CM5R
eNX-Be(5&+M04HFQ'H+X(&k)"0j-!KZC-S"[9Sm1`idiV1KV*IC@S$JL'8bhhkID
TI(X&kq*8H1jLhC3*EE!9'j61$cf($c[(Ca5IAIa69LiZp`F0e!1QKVjN!kCJVX4
98lH5Ge`TiIKh-GHD@30D&ljBZB%CUPfK0D83l[82aV9QPX4ZGJS2DiQ0K"r*@mX
#jEq8X5S!KaD8Dme%LJ+'!![RJ[QD%cM'36Bmjd[Im"aI9jY%LfCpR6)1p$"6hDc
$KieL$9CVN@k(-B@86@0bC@LUh9il#S-cHM*aTfIB0kLQY8J$!["MQdm4RC+[2JQ
([(i%$A@NTaj64eTAE(*#M@kU%peRTrD'h+NpJdjYHG`QEh$8ek&&SD#*lL`0SUB
$(iBahZY5IDdfd3(9I6SS#ZPV23I*,66q90Q5E9p8RkpIV-qRiY"&FeKaD$l%mZq
p@4Bl4lIJ$NcfdN"B[DDqGbUr"6r$B4l'(A-L$,N&fLbJc5+dp6kd@IjS)bFaZ8a
'ZibKAECJ&AGdlTb!SVNI-B-BKUM0R8FrAqKe[MK(&G5X%`r$%Q6NJBZI%KdBL!K
(M-``6l35@lAFj4Z)',[Ta8-L'*Qe9CMGReDD(pdHVGRVA(iZ-X[-6Ra14L9Sf!!
KkaZ9,8P$'Q&@BdL0LN`C`&b%2i+MIJMLjN`PX[5l56+L'ML6!"0BRE3,MbR%[p-
3%c1LUJG[)ThMq*rLH8qQi+m`9C6#Mj3RL"r2fhkQMpXrG%FpZl@#'0@#&&[`2&[
`2&Z3!2*I3'cZ`@Ta4RKaka%+%PajjA`aN6YI+*JU&aISF'#!U2C36JMCm-H"D[-
i#YrldH"3`3N@)QJ2BZ!rIC`*&`$!I')U(i24BpYPFaY)C!S#1+MJ!`d+'3caiX%
)#UV+br'!Jk"BjdPS#"L*lTPC-J%0jZIR!&"l8Ia`4NN#c46!ADA2j66ibp+PEj!
!5rTkFXM2N@c0%HIKK$b-@`if%#FQSEJRX)QMkXb9cA0XJ5&AbYEe-'8FKCQ'EXV
`QeQ'Ha,ITdG$2%m)Q$!HE)!-[U#&`CSNV([[MNf)fdAb3dc5DlDTRGL`d1%S6'"
F5#EdmI3cA%M3`b#5a'aNGfX9i@CQ5c`C!2k+4b%R2!iIfA5#,f96$YQ4K*db"*Y
T@b,)M%##*`2CZ-S*-Y1L$G@-P,PK8+#'M-6%DDYS+DSr4lAPC5)RNCE9'9c@1$D
2QfDJm18)if&89#(cY'eUMa`ZR@5Eji#4D4Ma)"-,E-Md5l3K*h9XL#)kbARR0U4
&8N1Be[Q(,E4QI5bNEHH4#Cm)EHAhUj+*&M6FC,E"PfJejjJCeHLEP+h6cX`1SK&
R@6bHS9$f-0$PK9UHHCiTCdE(N!#`*HG2-VEI,aZK5INCm1!Q0Yjb(N)A55hS)V0
D5!3X3kC"Bb![#,lYP!!fVaBpRKk0K-Y"'aNBp9XkSmlN4*8+c3AY"ea+BDY0)dU
b$qHf1B-NZmmJZD!+NQ`RqBr%8`L8X(JU$EB("Tp0bpaRif*'&5iDi[4NRkLl9+J
66Y393"a+MfV'Mc5Nc'!1K9!"@&c#pT&)P#GF&DkYRRR%9V5$p1"K!b"j6GX!6Xi
cURB!!k($)Zi0%jL'aV'4%P`JZdpQJ1b0(5dEIfIFR-!'VkY,"JV8)M"2%hX(Md[
aM+Sb!mCqZS*b52@S@8FJiCINFA!ZjS#9hl2U)!(Cm6Ip'aPbp@!cEC5&i(YJSXB
b1J*XmcS4KQklflF&GYS#-Ql#AKq1ES[qiSeN`FMaNDSA+Y)&[KIPcb86YLTlK5&
@"L)1(iQclr%I,`L0[6%RVM#QPA%I`im'pZ1SQVP0B,YBdJ&EHfX6E!e$rJjfiQ2
lqE1acJUBGN')k'mE01kbVqRmPI2kff$m%-[Pc3%FmF#d0$kVmAN@i0NC&2ldS"$
a$*UD(QC!k`3"qKEZH6IYAY0jJ)eR8,M8Sb9jQJD!(d4Sa9RaBS)ClLPMM`G#B(B
Lj"#F0cB4R!m"`E8R&CVGkXNAR1b-![DdLC!!25f`'AiKkar%GKE%%m(r-EBirX&
MB)Zdi#D%FP`1jH@8f@#*Ca"+TCLi5f16B"Npq9C8b5R[P[L#`qHkaqJq(p$$Em-
afHM,5'0F'`UEe#GY-,$3DBA3"5q&dr4M#LJ+jfcrlI3%QbV5hk"AB181'-'@AI(
S2KEFK3hhCm))l43,ce+%CcF"2[Kd8hK1U-*6RrjU+`Uj[Dl$IX`mj8-N"f'(C4#
U-TF$DX&Y4qa4ld1UX"cM$,1I-@Jpa9KVN9q3!*(4*VF'dXB&!lPDT[*4@Xm!m*E
,$&!$B"C`D'"DaiV),!b%9&'f`93)C5BaHQB-$Nbk@`f3!)!S3hl36%E2$)*LlfN
"KmcPc@fYLXdje#c9bC!!JMlQLN",F5%XRP%63$E,!$XCfbU6Ul900T`b%d$QP21
`e4SH!Y,2L3Y(ak2rK!,9jBmiaTRTUh'B[XUi,iRRmI#Q4kp,Qd[)-%cL%NY@'Id
5(ZEdZAiV!RZY111p*#jmBH8[qG&JkT0qTPk!+93GaS5d$TZYNAIBf!-J6SJF!$c
k,ijUS!iCh3*4E#G!,jNS%PI+f8P4,)jBVMULFi'i`c`1-#+l6-J"!&EdMYMhNG!
4A,%Gd8#ePLf(4D")frL!61D`m,M3a2C$KD(mE%Vq[(!fbEF2!!@QmM'&J$Vc95@
&1**eH6kk(j5`e9QDc[#I-LZ5d'Rq"6SG%p39J-Na0(d`)&A)f%iLN!$Gae%BJ,M
rK1MhC4NH9[&j1+5%S63'8"&'jA"MB6$$+VjZe`cqXBiAa2!i-9Ca&1C,f)8a@ZU
@*9JedqFN#,DGM(e)MkHK"9p9fU,Tc"Zk*cEe18*Y3fkaR'Q%2$%4&MN!CF2LEE2
q9[5fCmbKH,+eUMMUVJSN2kK+E,9AH6BLmC6V)CI8)RP$jh,Z@I!I86ed[cAkiE&
SI0hU@SKQke[prf(CLV,ELdYhdHX-QpKS$Rf0"m3&-N"DkYR)(X!$4pV)J%c6G4F
U!kJcpJ5+`A1k*Yh)!PBNK3hlBi2ja6pI2MAmjQA&[@qVqGNr&pi()pd!bNETm#r
9'PhD5hHp309IS08FUlcX!5XF'MlCl5imH80aIqIi(iql#e%pB(q3!&9jT$1Ak%0
h,f82[m-2[4$Qm0I$d&8f'GbQ6SG-!*h&b@m@m3lEHP*931-!0Iq)&8Sh`IYZa6#
!**+1!j@C`8HRN@e8S,pHiGRQq0k2N!#ml-Tm*T6N+Jli$1)6J`J89MR3I`hLr@A
$aBA'k8qh6"6J1+8`50KM(UmXK8Nl!QQC8CQAdNd9jP"PBE4+3A*4VZ0K)V(+3ZT
)R-cF9q8D6RZ0dqp[95rB@i8&Pk-9aZMqLZjKQ2aKbS#1EUhc5D&(AD1DM$QcR4k
l0*3qbkZPU2+$UL#TfQAc0L1UAFcMVeDb#KBfhG+F&%l4Fr*,aqYi5!-DRR%'(SY
d$TrJ&68GVDMQ#NeGTJk`eL%-Kdi"FI1LcA9JU1-8m%!DiZ6GQ%B93#F(*'$+'"m
SrT0'8!&ZML&4eD8,+(LHY5*iPP%PeHDk8q01"1Id%"'L4e-4LfG9@9C86)!3Uj+
T@IXLEdl#"9UA!5"4&'T3PhQ(P`ZDf@1UqNE#PV*TSI1P!+(m&M,$R&3T+&qd4Si
5AEX'VV8XA3``DE9$$`C5-$Kj$CGiZSX-8S,er&5XBiaSA6VK,MhTF%lTBTfb$QB
TajhQA,Xj%k$#'c@6'+RhCa,Y"#Tp!U3L4UaMj#-4a!1%RL2RmEGGqULN4$U*bc[
5Ikrlj$HrD8fm*pdLYEce%qR!(#R[N!"0qR&Milj22jEq6f1MG1lmZpEcKE8Y(kj
erZeFUrUlHHhUPSqPYNmHqHFPfTpdPr5G(hemr-GMEEVdcU%hT-$pap['m`l95cm
kp0DKGhmXE5iY,0hqp#*TT,"d'I[rmM,ehm,P1elj@(VPd1m2IA$PkV)edX,jdV[
&KaCGZ5SGr,2d`rR5qDrCVpDYdLI(TAFDIR-eUhle$aH[UChhmZ,5imG+Abje(@c
VSHGGG46qX+0DqS-dq9MrY38PU@APck9ET3dleajD['+9p1fV8X26E4IS!$qA!Jr
rbmqP[bb8MKhkrFqPh)95GE(8)Gfd82*m,6hFpT!!p26$9pXZcQQlMX")5PNPAdS
,hpZ`3ITmAZQmV"r1HAraLS8V2PkbH2Zq$aEm,PqDbC@QYeepGGr,#kA[II$"6ej
r3rV`VCqmGRA1STp+eXCpqk5&4dU[I2$HqGVD`[0(2V(QrZ`6DprrhZel[Z()NAH
Pllcbf,F!reUbN!-Nr1(HmVqPAlrFpX613hrkXR$*cMHN"ZP8@p(h&V9m18pD++@
PIhK0+PiQr8hkD28bUFcD8*KlT,!LkdMTmIa2VY4,IpMmdrHN`jZ[p%TrH$GADQf
8T*F[pdTc$PQIPMa5mk(0dVf,RelkHqR2KfEHNQllTI6hV!qNYJETRqGGNHlZPIk
P@ITrGDqmMp0A[Gr3F1cbFFQ@$`#3!aJ!!$5S!!"I5!#3!`J!N!-J!!!r2!!(UI!
!N!-+@-!!5S!!!%U!!*!$'Qi!N!-"GJ"1F8U$CL*"l3!J)$`r2!!!)MbTm!!"5N&
Q"%T!C`T)3%K"))!K33!%3UG"q[r1d2`"!#m),c`!!"PZ,`0K!!+X9)pR3%)i#Pj
#Tbmm4%&836mm"0@S(h!"%F!+ANUICaK1F6!mUA#R4N2k!#SLL%(k!#!`2+P`TNG
+JfF%F!&1G8lY!#*1F8U$CJ+Tp(!!6R9J"J#3"3&1F4mkrrC+(fB551IJi%(krqT
3d%kk"Dj-h`F(,cVrhNjeB(*"6%&%4%008!!$!*!d8(*"E8MRB2"d8*r#,dJ!)#"
2)P3aD3!8!"JK3!!N-A`!!3!XdT%K33!ZS!,I`NcI$`C1G8Si#PjR$#!U!!KR$#"
!)""R"Lmkri41G8MR(`C"q[qHF!`L+J!%`VJ$'Q'NCJ!"2NKkrij1ZJGZ@%q`H[p
DCJ!"$U%D,JJ)+J"!!!4R"L"i!UDJ'b`U!!3U+J!)'#S!"*I8PG3J1[p@S4ir1!)
JCJ!!l&42,%JJ1[p%)JE#Z!-D@%&K!2p-)$Vr2-#i!aT"q[mi))"+K@B%S5*J"#"
&S#GQ!!#d+NJJ$P#!3IVr###!)$Vr#P'!3IVr!##!3QG)HJ#m,a9)H[m#,cVqiLm
krZ)[1[l+,cVqbLmkrXTK!!e1-"pR)$m!5S9R##"0S#UJ+f!%)%fJ)b"1S"mJ4k!
E-Gm#)'"J)%kJ(b"(S"Yb!")%j`RM'H34!!%!)!)"!1!J6D"T!J!!(i!")%fJDYA
8ep4"q[jf5T!!C`K`!D#BF!1JQ#"0*8J!#(!!60pJq%je60pJq'!!rVir!#"1S"m
J4k!E-Gm#)0A8ep3`1!)J-F!+B*()*8J!#%cIB2K1G8j@!!")j`!i+'i!$%IkrLT
&q[iU)"5`NQd%)")SJ%U!Ea)J8b*Z!!LL,L!8dC14NR!!B!3`22rC60mF!%jH6R9
19[r)51FH1#BZ!!JS,J!-+'i!%%(krESY52r83Llrb+%D,8Mrc&92U"``(cS!$%8
!!'pF5'lrl$!&8d8r!+J298m[,[rXU!d`(c`!$%B!!'rF3LHTQeP2,blrl$!'8dB
r!+J1)"mY32r`FJ%I!DQE)'lrm%U3!'F398m[#+QQ-"p)`()%`)&Ra#mZrr#TSf#
m%#i!&'F+@8mZZ!+Q)&qJ'cmmS2a1ZJ5'9%mY32r35S"R!!'H,`"1ZJ2@@%p+!'F
+F!%G3!!@6[S#'%KZrq4)E[rJ5'lrf%kk"@T2l`!-)#lri+%H,8Mrh#!)C`!"C#!
Zrq5K(Le)rqJJ#'F!!93[,[rN,`K1ZJ@i8%mJ!fB!!+CC6bmm3dp%48*RU"mJ(be
!rr"+J'F!!)iJ3#*3FKM6`5m*6VS%Y&K2FJ1`3@Cf)!dJ3(!SdF!Y52rd)Qlrm#4
4F"M9`#e+rrJ[#Nkk",TB6be!rr`JE[r`S#P35LCZrp3R5J!S@8m[,[r`6VS9c#!
IFZM3J9'!*d!!,&925(Vq-LmZrr4)E[rm,``["#mZrp`[,[rJ,blrk%kk#XC86bm
Zrr#TSb4Zrp3PE[r3!!`PE[rF!"!PE[rJ!"3PE[rS!"Jr2+'B6VS$9P42*N!r2+L
I6VS$5P42)J!J#l#"CJ4`!'!#F!%J!#9!!"`P4!!J*8`!*%Kkqm`r2+$m2cbJr%k
k![K86am!6VS98MmmSCK1ZJ--9%p+J'F%F!'JQ#"m!!!"@M!35-$JJ()'X)&Q$%(
k!+iLI!!!!c`LL"em!!(rb#"ZrmbJ'e92U"``(cS!$%8!!'pd5'lrl$!&8d8r!+J
298m[,[rXU!d`(c`!$%B!!'rF3LHTQeP2,blrl$!'8dBr!+J1)"mY32r`FJ%I!DQ
E98m[,[r`UDB`(dM!FJ6!J@F),blrm+QLB-)NE[r`5T*R%&92,`UTTM!I5-"b"-#
"CkS[#UQMB+33,[r)(8!!&NcI((K1AL"I6qm!$Nl36PErr%MR!$"#,[rm2cbJr%k
k!La86b4!5S"RA#m!6VS"J&K25J"R8#!+*N!J3#mS!!`r2+$m2cbJr%kk!Gj86am
!6VS81#",)'J!%+!I)%XJD!!BS"mJI!!!!9S`%%M!i)"b"V#"CJT`!#"m!!!$2##
!(A`!!Irm%#lrr%cI$!"1ANje6PErk%MR(cKC6kPe)"mU!%KZrqLSG#!0)%!J%(+
'd)%Y32rm)%"F5%2Zrq`Lf#,B@8m[2%4"9%%r2!69UD!J(bK!)%!N8$)U!!L5DJ!
%2!%d+J!'P'S!!Mi#0LlrmNM$1#lrlNM%PS3i!8M%PS4U!P+$iS-p3rrf0Llrm%M
$1#lrl%M%PS3i!NM%PS4U!P+$iS-p3rrd0LlrpYC"282rqM)Zrr653Me"rrKC6d+
R5'lrp%Kk!'Cb!4m"FJ%r!A,r,`&#*d+RU4-J(bC!,`#SF`D&!*!$H#m-)%Y`%0(
!,`LSpPP2UA8J(l#&C!*Jp&92UA33(fB#B2C`rcm!3QFJ(k!b,`ZT&#m-UD-[,[r
SU(0-haci6Pj1G3!#!!"19J!!51F!-#4Z!!JJ#LC!)%!L+!!#$)&"6%&%CKBL+!!
'$)&%3de3CJS`+!!+FJ1`3@F%F!"J!R!"60m-!%jH6R8[#PP22cbSER!"(`"1ZK*
i)&mN5&P22cbUER!"(`"1ZK*Q)PmJ5V(*CJB`2!)!B!3`2!3!*&p1G8j@!!![!cB
Z!!J`!dM!!S!!!!J!5S"["(!"B!*`!#BI6Pj1G8j@rra)ja`!0Li!#$m$6VVrc&4
2(8$rr()"X!&Q%!*$"rp1Z[q!X%0Z"(!!B#KC6cmmU*p`!4m!6VS4m#!I+J"C6cm
$(blrr%kk%H!J(bJ!X)9Q!R!!60m!1%jH6R919J!!51FB-$JZ!!JNEJ!+)%SJ%#C
!)%!b%!a"384Q+$)S!!)-3805CKif"(,rYN&R'L!S!!4b'1+S!S!!N!2r-J0)`E#
"C`4`!'!#F!%G3!!160m-'%jH)&pF6dl36PB!!&925'i!#($r2`"1Z[q5%"pR%L"
Z!!JJ+!!%FKMLU!*!!2pJ!R$r6Pj1G8j@!!"96dKZ!!K`rcm!6VVrC"!ICa!JEJ!
))#J!"!+!!2q3!f!#F2p1ANje6PB!!%MR'$JQEJ!)+'i!$#",-,`$!A!!*%`NJ#B
m!!!"*0H5"T)!!!*)"T)!N!-J+$`!N!1!fC,CNLJm!!!%N!$CNYH5fC)'NJ#3!h`
'NJ!!J!"`!#4Z!"!NJ!D5!*!$*!D5!*!$)!D5!*!$5!D5!*!$2N*!60mF'%jH6R9
19[rN51FI1#CZ!!JU,J!-)!XS3#e!rqK`*0R!,8crl(!JfF!Y62r`F%MC`#e-rr4
`2YR!)!b3!)Z`K@-'F'91qJ#b3N!q!%*!28$rj$B(F#5f3'4)F!5f3'3%F!"J$(!
!-!0CJ'S#9S$NJ(J!1!-Y42rif+lrk#4%&)!J,[rid)$3V[r`)%!`V[rNF!%8%R)
!%J,MB0&Zrq454f#`3N!q!(!"2!!f"h!IYN"N4(!"YN"N"(!!B!a`!$!$8i"U!P+
!iS"i!$J$,86rr0LZrq`N4"5!)#lrr0#!d+lrp#"!-)C`!435FJ!5!Z0Jh%"54f#
d3N"-haci6Pj1G8j@rr")jami*'i!##CZ!!`k,J!3+'i!%N*!2!!b"A!!-!(3J$3
'FJ!b!V#"Ea4#3$3'FJ!b!Y+"dS`J36#!8NCJfN*!2!"`!Me!rr)f"VC&C!!!Z%*
!2J"#3$e!rr"`!$!$jB$3LL"!)"!Y32rd-JC`!$!"d)XJ3"J3GJ!@",C(B`!!JM!
ZrrCb!F""d@lrm(!!-!06J$3(FJ!b!V#"Ecii,[r`GJ!f"#e$rrc@JpD-)%0+8'B
5)#lrr0#!d)`J3$#Zrr*8E[rb-Llrm(!!-!(3J0#-)%!`%$e!rr"J&M!&d%$34M3
Zrr"b!$)#dS(5M#""-)"54b!Zrr6LL#e!rr4J!2pX8NCJ!2p%60mFq%jH6R919[r
9XUc!T*AJQiV82*!!2S+,D'UkPrA,dPX%A5l"RRjbXF[%$S6[CXeH%"+fD#*rGT@
@C80cMG`(bXiZDP!*SNiB%PUM-c3VHQqJ3Z2#)a%$T%P(GF0A4)bb4!j,T%4X9`Y
+ZZMFJ9QCp0d+%Kc6+Ei!'f1r*bCS1Z"FQpc(5C!!p%`KjKKR[Z`qPfEjL4)f#q5
Y(YNjmi3NcBF83e,&V%'h90[L5'HlBp9-NLZYGamqKPIM%*kdmCMX#NQ1HJF"MNU
(d(!hMjYh[!-R-qAi8bA4qpf2EQ&0eHj'FNJUd4BY3D1mieJL&(VJJDXIR'$$fre
HadP(k6)ArRi*J)cEE6bhRaKBD6CA[[5FlZ1Dr[e@31LN,EeG`m-QVUMFKK,-`kh
458fA[Yb@R+8-A&lY09f%%(l1b+EJ[GI4+@`+X,0@B+fPKfL`Z4``0YXQVfDGJXl
2b8h0IA,*V4,'r)11$l`V[XGF#'HqqYNV*[hR$SBH`URY&e0qpCB6m)B%VDUNU84
UGHNbQ'`JPqApSR2$R[@!E&LlG6kJk(iC`#%I@!b$5Gbi#f*p9N'YE-UBHUS'QT`
#L2KAI$iP`RR`GKMiPT)0G%jM$GqjP6Ve0hj[[8a0!Tcj3C+!Z*+A%04G)*3f`)l
cI$VAZ&(l(-PGH5[jA@AA4edEY6d-2QFi(XlE2#+`K@SeKP2b5$&BAbYDQhMT9'C
X#*!!D!$kBPF+R+(E-*!!dPP[kpX86EASc'PmSlTX$pr*jFk%k-ZN-fYPJF-eZ'p
%ZpNhHlc3Ep"@lZI"'0&&1F`$#Q8pq-A1)%F[lIkB(GMTl)Tq8NU@Gp3pl[+kqpf
+"R+6+Q&*H(biYFh1[f$pl-CS8*UN)"0'R&3F)F#P`5,E)(!+$`["-&1&dMXY[NI
2@'0@McJ(A(@JIdG[VZlq3h`ie*)Y-pY,[(SP`$S5m5iYHT0S!Q%-bGiRVTmQUhj
qr%X4U`3Gr5ERmrlpjBp'GV(@jE"$jU(j+hiekl("C4Vk1lpZH)(%(bHIC$dk$#V
SfaQZcMmJY-ccpdhG'VmmHM1Lq%PKbNRDc%Yh$emhNB4dQ[%bDfcf6mLrYSb82He
aZrf,TP8Q'Q3*L#aYDZ5$ib[#c!"Nfe&,DA&%9#A&8m-Q)[Z!F'BFe+&VSp"Ui@,
1eSL$4E@3!2Tfr8q(e!`!YIj)lP'KjFJA94XpBa*F4[,&"4eN&GH[PQ1qEQBk&RR
GrpTce1h!%38T0eP24c(,QV[1'fZqPUQH"QHhi3l8h3R5D6b66J6Vm$VIC`d1U'I
hHf'+j2qeIcbhF53a4F,8B9je3hF*X3SZRIpq*j5'hSDBB-e[&Aj+QX&#D0AAm6&
+"U2qS#8SS$#"!E""SM+G'qM,4eVicPDXXb!i"b,2(R%#mDPkam4#RUj!k[56K(D
'C,CRa@ULD+1FLq3-kf`bd#+GANTUelqLqph5jI@qia,ZYbY@eSmfM3(dZQATq@Y
8#F510h#BrqC8ZeQiaMj)m#f8Rr264L1GK-Pd03$SVj22mRRr56IpI0Rj,*lJ$PN
5kTZp#p%0VA9N3!kp3f3`Qih3Q!cfVhDJ-"U98#dq)(Y,E@QZM`$lXR6Le8IA&le
Gk-"k9ACrjLlX(`rVE[rUD"A$I`ckEXa#09UFj)cFed2c"dSZ6S`C&YA"P6R(E0L
5Qhap6mkL6!`5rDERGC!!LUk*2D1bEa+Z#'*1R)B9%4qTJ,(QIjqDB#l%0e*pd@9
MV+VmCNSK6j!!Z&S'"ej99rcb4*3mGlpJTKIpkaV5#BE,Ii,qEC!!$1jjI1kfLNX
AVi4G-ARUcj9T$k"%f'lj!Uc%#N4ekqQVPaG1N!"PL25YD+6l(SRE"!9p,""`P6i
"9I6D0,k-4+fKYDjZACVqrUVhBDkGiTk@L&$ED%l9Li55dSb0TI(q[)@)#QrQTZN
9!P1UN!!$ZqL4Y,a4qUSLZm,5SLA%mUpcQ%4AE-k[H*!!hKG3BG1GiL+*@Z'b8DJ
TPK&e$fq6PImcFNH3!#MK3V+2c[3#qRbP"e@3!!!4EIbYc,&EVE%[$e4h"!8X-6V
Xj`VZNhYXU!+QR$b$2JLr1BlJi6#eNRI"@`1(R*+69MR"X3R"lFc'k1C%lhUac5@
b8J0NMSIfIKiX3ZH@p50CjCA'6qUafkF5U@3XB4*l34b!0*f!*a"SZL)2%GNMf`D
h64lVDj)USAm"2cMVRf1"39FE&)55a',(JH4X6B,0e$Em9*VqLNFpI0$KCjJel,X
HeDbldZMXL)8r+[ahih6PSfBZ11[RRUIa(q$K#VV@hD!!GF9d3ZNEU"JAGV6$j0G
k8`0eDJLrCIJeid#XhhafpdB(VQ1C[*6$[QQ@U*+Ti`1kkI9m(jGm9&heT*Rpp,9
IQRh)Kl0pHXQT-jSF4AGQD-D(F+GF[R8P`0D4G9A6A`LC6ARfP@%mP`Qp@fZi,G)
9@m`q%dDDDZ+hl"q*&"[Z5C36c9P98HhArTE-P@ERG%kIlU1Uk#krY6%m8(VfhFb
pbKZNYh1[PM5*XGZ+aA!mFHrD$4V1eDiHMY36Q@FAl5baVk6#GC1&`CEK%4Fj%Pp
iKq6@["(1Jlf3!'#'rfX9UKeZY@!DpA!jR-"(CdaIHhK#%HEkH2-P@KhmBAhKfVJ
iAXkm1ecpfj3K[arhbc#q8Hb5('qYlY-B3dJSl52X9#V&PDGmN9EcY,j%+!1'qjD
2%&EYa#f%N!$apBNQ&X4!NPbTb!)A6Q"lf'1N[,CKM@FpE'JkB6IINX&U4rl3i"D
f-J**(%r$bl$qp-9l3#aQD,q0dQ9T[$U%T8mCfSqKa3mZH64ijR[rqFJZlBKAa&!
-H(da*qf4UT($UPmSP((aPla&YPL+5)5T01lk1%FT%Qhr38DYTZ!E&r)T4q3$@`D
d*qXQUZ(phLH24%6dMmM)XH,k`R(p!94iTk'6Hi"p5G4KUr`FmmMJX6TcP@Sb%`j
53jD0JR0X2(VN`R'#X%F'1bMlbB&cY2()J4NJbe%fUVLbJAZZDF`ZXQY3-b19C2U
H&l[@JG3khi'AffdJibaBVd64ZK+$DdL$V&8b@INhIE(U@rl+Pb(L[S'lfjQFjQ,
e3RRRm()!C@4GDqSI0p6-ZH)8iB1!Me2lfXV[B`cP)!f16GfcCX9AbJ($l53QEYB
1TFq9rQ%N%)fhF1N9dT+#idj'id4!%LRSZ%3pSqfCcQ%q'aP6+C,jNDelC3-9$3p
DMIp-hNY2DFH),EV6'D&QdM-X9-6cZ1fc$kkp+lLAMqPAJ-(hH+1'T*ZSLRf3!0&
qaej*pLJKfLKYGG`(ID-B1G,)SA68Dcm+R31M"aj&L#r(G,BAJf0FU#d,Hi1aCaC
9-`-5#AI0HYZPJpQD0p!b2U%IjlqESC8hHQB!S[pAiifTdrBHU[$,+6(ejeL4J)U
jH(+1NYCS*TMrR[93ll5YG%eJ9(&A4qhU*T(*NbTr%V'I-3XKi[d6)%P!kGfij!C
54fhmX,A-00!-lK(`CbJMU8Z@Mp9Lm"D-HD['mBjqS6P4j*,LD25@+#5fK,(cRKf
#IPbGEab2XreEi[YQKM,&[RF+E8#h6A,rKK'"p0i+H4Ze``0afm$Lm9CZe(2pNUi
K$SGlYe[`-%3DeJi)N8bqLRXVbUf3!0BT!ii@@jp6mG8j8&M@$b9,P2G`'65m8ae
`F"A`+k`XkeIG[eS&(`SN24AhX'5VErpQP903jPk6*(S[aUA0aLQDFb)0M!SiKHD
!CRkC`%5@"0h-LXF)S9@#iE'Xq*i4$`I'c@*5B+T2dUEc#%m[(k+2Y%[k18M1cp'
bpD%PkK@ZVfTMCk&aTSbpb,`MeJICkkANkM8KYhHGcSa8Chrc)1*&99iN!IYUB(K
+mmbr&G2U5--m"r'9)cfIcq-+H5[%V+!!bNTmJZac*83-l02aMkV8cLZ9iG0L@"C
K'8cll0bK5*!!aE9Z9-m%4GBjNLHjkm#rbK"'!a4`6-e6@%b5fd60K3[JP%+NS*'
jH2D28QSlc*LG`@ack*UG1BV0#rTb2QK+PhEjU9AChZ@HI9'Qqh`,[*apYCMEFL'
%!P"5+cq*"Uf(+*9qEGC[X#V(EjdRl8ARk[mLYla35Ue4UHRkI)pji*Fbj-AdFp)
!qPcGIJBZeHpTM%0#eTq-b)2UU*K@8N)Gq`,pG))!`D8-8N9T2Ll[EX0%5!)S'AU
4j3I+*&JjKS&fE'DLkhGT1*E4D@"8VadLBk"f8B!DAUBa+6*$Sq$aDTVQDr-Je4c
p%XUEqUFZNMTYm,BDKIJ1LZrI!pPbPL3(pfGJlJ%[KQ0"4%Uei*r[@BXH%dG6bKS
+f)p4hC!!!C9He6V,*4fmZ69"6&,cZdf[+qiZqYmGC+4SLD)c,N'#-K9YjHek++[
V!bFidD4q!9H#MciHSD+i2CMq,H6&iG3bK2VL(&CLBC-j$A6jGZbJ@%)Ma"FX$0L
F0VZVY9k#4GY*c$LS'drT0bR5NN,hCE$2bi3"$9(Td#9&hG&djmaBR)2,NSA%+H6
rp5&DCSb*G9[6cNlCS(EY0(XT52r"[ZY3JbjG4)mk&aXEj"GS++h256H&PL*`"B4
QL4*Q$Aq*lQkIQmCIa,05ChM@[TREV*A@cKP&M#T3rS`*%1Y5XXL-fDL!D8U%P2R
580aV@P#'3`H8[[`$LVXB!MD5Ri6$e`N3,"NX+lkI2[f6CThmCR"!)ZiqE`[NZK&
c9d`5bh*CCpiV#'VRc1,#Xk"JE3rfi9UMq'jL$%PUj5)8l)58aJ%TqhUb(T'6Y1Q
b2,l046RkCFq)Hbc0*#0-`pRXNPehq5)Xe'EMe5kG*@jXL4&r&`0$RJAdAKYraS@
lJ()#Q4FhS1U,Q2MIcCKV1dGiCPG$8jM#GkDl#F6@hHiYlE1JlEr8ITcR@5Q`pJb
racSRM2G&ElG$%cS-Y0kN+ZHSH+N'Q61`a,LmET!!*eab%DbZHDRlHeNiP@j%B8'
PZ0*)NF-1,N!2BJ-(REAb(qY9k#-e&F+d*G&S#pJB39mbrp5,YEVrIQ8%$-B)djG
4S0E#LUdcNdUP3'N!lleG05VYL@&"cT!!l9kNXYbl0(")hKm!K3CIX3&1c8m8J)@
!b331E-0&S5N18J"*Zi31RAKb%9qpkf&GEj1eY"cLZ$6Uri0J!UUeidc9T-42D(-
&(*!!6ZffP[223*JpK2DU@2!$*CH)U#1a%-[#TK(0P1%hB2B&&RKB2h1(i`@&M9f
%Id8T)CLqr(4'&X"r$Ve-jPXrj*E)E!5iH,YXHf)B,kTAkIk$jDDf!e2E$ZpkSP`
JG!6+ESY10!4aPLZ@ck9Y1ZC1U"4"3M"KRS-`Q&Gr2#!NbZ(RRPhGbBLUFR@6&`%
4+@bYh5GDF2kJP*2G5faa#%e4Jd'1K5S6YIAZ,QZ!Ldc9FJTY05+PNY(-UfQQRh4
pp'"b4a4*TK*T%9U)XTpbeZc4$alIb[rNdBCkk"8HJeZIqSf5iV&r@%C@XaeA)lL
1H3eN"-L4iEP#@NiN44`l,3X!C56U!UeXCSiZX1XD#GV$S"#ql@ED*bim2p9,EIq
`fm2GRmiI@5D12jCXKVkfKR5IJrFI*Qhl0%VUN8TQiKe88'(j`36ZHl6"qJmCKqe
T-CD+f-@JKbl@QfSkr6""6-DR3iH[VB219iEDr"Q-FlR&E,$rC'Z$"@8$36`aYL2
6Jp!@$&(@9SHabidLX9('L%3%II8,IbYMX3Kh%lSNT3$ZBhcde[M@@@+Y'$hRdJ,
MdS%L)jhCkC*p8F#9fq1ijUJUQLVrld6C[)iNb6(#4AGD!P+p5mRQ!UFN9j1hK9h
j%cdpN9#Am!)p)F,!k*2lGC&1pk$36QIE#eIClTraZYRVDQar5J*69Y'Je-XN%Yc
bUKPAQ3HF#m'q5mqNiCE,bND(%GK-83ja4qf-PEdYhH,X+)$XNbj`*M1jM%EZ2N)
8V-A*2F[q2451h#-1hmZ[qHcXi(EK8fY-cd+c0@+#ajd"c'U5c[@HY@FiN!"qjTr
1@J51"lCLhrpD,CMLZL)Q68K0MJVM0F*!K%6ZKlP,&`Hl#3@aNcQCpGRqZBqV&dZ
1UG!1hjVe'ZS%*'qpKS'@PiaBEFEAc,f&!G!LrN,9&"ZfCP"kHi80*`3)D5hp`RA
ICrJSqcS&0)Khe'jeV%PicRb,k$4pd-,"R,CL"bCRd1RkDP*$AF-eNm)mH2IU036
h@Eh#JjQ5G*BjN!$ZV8LG[!BY3b4HS9-jUi%!'Zp,HDaCVj)EA2hp6h()PJXSj4b
rabBS[QEeZ"9%l[#$K1eZ+1[PF'XC%4U8iTL2T,9#$&FQa,E`+26l!+RdeJ[EaBT
-Z8,SbqJJ)I*2eHB(IcJbB4EF')!B'jUbI1E&r*B8#"DKTqD+AicL'bT,p8e"eeI
"hJ'L!2Rh$hR@FVL@mJamV,BUH(ae04kDA2ilE%ap"l`UiT2(bIhlG"Y3"0JVCJr
Dr(KB!PpMTTG(IAVeNj*qJa9[iI#-j3G38mDh@f@RN!"h+'Ka+pZKY2"m9pC9a9U
3!*h5UBH$EZHQm-!*45cTG+kHCm9[amHX9(f8E6'6DCN2QYTjqXREi@h(DH`$,[9
ZPiL9H9&#G$IXCSCjFddB)b,)rB#[+a[B,'%mBc"REE%*X5ALkJLb[Q-TaCG*Ub(
T2-S3ACihPYbRlDVrd9A$q2*Z`JaT"k,FS[2qLK[$UbbL'CaF9PKMmAa)Bjm1Q0h
3%*`[Ec"ZK06h3"+Lkmp)%CB$NrV@M&YLLqYGJ6DrjKacI&QLNA"HkiH8`DiSPaE
V*JpK5Th%-0'0aAId1rLR08Rl`9N5i-5YUrYf[r@U`kSPeSGXSCrqB1Lq#iIcN!!
h&Vr8V4f1DYUiBcAV`G3`P[`3Sc9%lJ@JX&kYb+I-)X+$qQQKC#h"Tp3EV&K@06B
Hk8k,6N81+9JMH1bJ%`qfE9`[KT@26$PYrLkP)DejSQJN,qkAF$PT[!!BT3DGUfd
rS1YMm")-e9CLqmVc10q#FcF)d*[P#K6[,5,5&KUT![Ui2[,p(eQPqNNTbiPL$0C
G$A(18rV%Q`ZI,K!@U-%SmM``B)N$Ylf4r0DLrQ,D"rTq*Lp#&H8b8+IXPi[@KQG
ZN!$Q*4p#a2f4D#Qj8@qXA([#2m#mI(cGeNEA#BQi&X%0-HrrCj!!Gb3Gp,HFAmZ
ea$i)&RMQ*fadD3%P!T`klJR(JkDiYT&fXIMK9("XLe$L[8Xc4"TL!l4,*V%PNTe
19CN`ZRk8i0D)`N'E%e)9kX&B2354ITUMB%AHqhE@qUmm3R9JlLDEK%)8K%@$X&U
)d&3!S9TL,QdCe+lMD5A3R*dMA%N11b-cFjjKmG)(dRaGde&ZhYZM"9!b,NP'Nam
,k@'SQr9@RfeVA!pG6NrF!f6pIGk5"a"#kY1Hf8-$m#*qmR`EhZV4*4%*!NTe4hi
@TCJ#C8h*hY+Jra!rrB`$SI)p5Ne`C-a3e[1cFd)1@d-qaSbhpd$I!NaaYUi(91e
&$4R-TKMp@Dek1KPM!P(#hGQYr'%KITc68R21R)mk8&44G*MYUMRGGHHc%)`UKE%
kEBZ4Gm0ap`N-pElhf[i%5k2V%8CRFTc!9#Q-EP,RXh@h)Kl!'QDR-9GYrF8Dkl#
[c#prp0dPlNfJB-I8G1$(a-H6UB@h$elJ[2jA$Bb6U*CT+D1,kaK%"9cJAFFY*2R
[G2H1$28B$[V($5G)8)#!F5`'B@k29Pr'3*BANL4#Gf+BT8l$jeU0(8A@V5l*M-R
khr&Dm02r8eQ$q#JAG6%j&HYHc0#T2r+ATpIFB3dPHX14!2ZAYT1AkBa8MM-#VG(
`FHNH,1SkU@kplMbE+h%XkG4-p-dNij!!EZT,++!lUXHLqpX[U'[9&!rRrL%EJ"9
je")UN3K66p,,kq`$a*FGSEM8ca24N!#9*PQP-NVeMGSX$m3q5"j$e%b,&)bi%e$
365LJ+HJYAQ5925DVK8EfIk!l1#VSCDl)E(j32cUJV*!!`lT-Ce,qm`ZK,i5GmYK
&Fih8@R"LY-Z%pa9&DieH!2qlQ44iU-YcbV((I2N*-EeiCB![`qd,a1Liq$aeTjF
@#TrlQcANr'6+dXm*S##[3LYb48U6b3P+4Dra35FJI4D[U'H'kSqCe9Qf8SI2T0q
-mERZarMr)XfUK%1hl,c@R3((IhU+)ffFQIQDa18#fQSdUEK5K+IaIJ1%bGP63,R
#EUd$QYPYEkH&k&p$rYep,8)+C!ZU+BF+X(qr%bZ6-MLXaGRS$bXGXpr0U&@MYmM
Ui30r)`%(4MZ3!+6m9NX3kZRk$2RQr,Gi81p5JDA[JbSbZ-Kkej33eXf(0fF68rJ
kmQNH(eDr-ETj6F[M**Lql(F0jlA(&D@5FS@f&e*ehJ0*jbmN@f'a13b@bp-r4LL
(BANRVZV,`HE)'Z0"lr-8Fl1LXQ1,2cJ@(GjC5P%6k19YPdSd8(@Z*bJ#2j*i0%k
0@l`E%0('q9PTpcr9mAKIrpeal1cZd`pG#1N9rhi5(FEY@bf5TLI8hHH0)ThBME4
-iLpXK$D[`,"TAK@&@6-&6celMVED66TAF9rC$aD&Y&1H@CF91(#&6c!(Gi(pUX$
"D8Y*)Rm%6bTKI4#'c2+&M2H&BFAH%1l*H*,C&iP8[2XC[lD2)9UN1G5N09aDNLe
Q@Qq[q40M+4E-HXaE!N5mB3L[Z!"C`D$dC2f0)SQMYJTplX(G!J+a[aq!AK6k[*c
SPi"jBIac+Gmh['GB(Fd[Q[TGraJKlHlB0jE'f(Hhf'Sam`i-hVB`pjBeZ%ZQZj[
$lK#J1GkmpN-IfRFc8p3Xa#ImF#E(VJVQDlUe+r&6-lSFia[0D+C!B!XV28d)G@h
ZqQkV@UMfRa4RQ[`GHDVDm2+6,q-&pffJRcQfNEP)rf+Ta8#KG`I)M1r3Uh+k9%#
*cfFX#QQUC)CjCk#L@AC1kXfI13ZGb1#!f&fVG-@6&PF4X9T8KMlI"*F8pBV#eS4
crC2EXkH,V-!9qIXrK3Q+cI-V#JBL03FR0#dYEi[N,Y0ffX'K!jdakSRQVSpl&5k
Xecc#$Fq&P)efrEV-Q56eP*GGICJ8'(2X82Y4JV#d&Gdej+[pTN"TB$#SJ!)(Bh#
LHq9&FeHGRKrFC`0Xe3l'+e3$,")H0G2CKic29jTd6Y3qc0[M$CTZ0'$35bKMHa$
qh0d,lS98Um5!0M0AT(E@q9[9D5ACeaF'c)36UG`X995kR[U(e[L[LN$41K(KVR'
+%V!2(MaS9!ekPaJlh'pphNYLrMr(DHVfeJXB3M4c6@'&A-aqe*!!baGh96`*MkH
b8b)&b96d8[,+Q"p8,A0!SfBBGU1!jaiC--"%Ck#!##`26qcZ#BB+3+(ipd2m0UK
6Hb-%,J*8RRq54'3p&Z#3!1XIP-Ad&0p`q"PqUi2I%jfHi((hVPRbJ5,fik8$I9l
KDXjQ(FLReFj"*2qNlTRBHl"HB(f6IVFJjVkPi@lm[9m'-VXT%,#bEMjS#UD8(3$
"(ReKT$bf!PRkjTNdlk#AhE@"9YG3faY1(+"bKcE,FrFRhGMiX-a"SSrYHq6h9&5
4QR8*-[cKr$Q3!!SSj,SS3@23pPH03*VeArE4jYaNVqq9"C(JSF$0JJ82',T8L0Q
K9@"SfTPX$[e`31X`acRf(F`Fe9Yq4JRdaTli%1Z"m2EkkL1+p2Zd#*,JRCQFDV5
,4Xe(4%*FKZR2d'MCa8fJA"-Z+qX@+-6Thr+4[CZ"32hm$3GHXV`pm6Fr#`a'C86
*C0qN*q-@e(aNlB'5B"Vj+69Q6e$6"R+1E,*'E-9)'QXGG%N1(dPl9jprNfiV@f+
4EUp0eSJ,mGpDTV1cddKI#XiGpfMD#JA`ka&r,BT*-Q@JE"EZUZbhfI[Ic0G@b+F
(a6`e`lL!Q%#m5DNCq4JMql`T'e,pmA3Xe@)1!bkG-VZ'%936'[m-Z1$*aJ911V`
JA3XLmY%e)d$N-lEH@hL4dN[l!5B+KKrb&j(h3q[2&@3&-,KM$FBp(+pM)EH'm4m
*K"-IYFN#FI44'[PYjXR3Yp0AMl5#XJLUP"j4i0meCeM0MfQB6NUT!!G@D9R+d,q
CA6PEhhHA,dbkPZbR6-qD-XcQ"VZM$qCq*SN0CZ4rq$hGR0#$Yrd1('i[64pT"#"
mYRVF#UlaV@I@KjTpLcQ-km&(&A1+,[T,P)!D+qF5mSYaIhXBlFf'dDfE[m`'diB
0c(NpjI[-hZkP"b(`p"@eKBC1*8@D2@3@q#%kEZhB+qU+H%##Ii,bmPkj1%JfFa)
RECQJQGp84"(M9`TZVSR6Uph4@`T'QbQ,e,d!UTC"3apHm#JI'[I-Aa#NS[H')*9
C!Kj"pJHYBm!dURFcJ&R[Kj@@EJ'E$+0-EqLFIF[m3902@Qq9iFIEQS28T1ZL4FS
6VF'qKEKjH-,*IZ3#1VVBV)8k95NIT5d8efDJj5h(f"hDB'[LUFq`Ii5fePL(&ES
%&KcKS9,pc)4f[B-RE"dQ+6qKMibcY4dabqd6VhE(cV0eSMUaekdT[N8a4bS%&Q@
NGm#p"j1kIeqIp9jQ*Ej4Q(4hj6lN4[VL,i01&8865'ZMU1R3G0A-$#ZeT1-j&#h
D`fEq6p61GMVJY3bLcj8Q`FB9*JP#2i)i,a,`iN`$NkQQ%aR",%dp('E9Z1pTXal
Gj&V%*AP%`8*XD,M1dCa%'&T9!)LlUS`8&jXVT!SqLrja545+c3V'cDaHDeIb8X[
rRQ,8&9`HKiFT[0eql"Jj!UK!CZ()d-mlKYqSTC!%!3!!4!!3Yr3YklId,HX!!!%
S!!!kD!#3!mi!&'eZ!!2[,3!!'6d!N!32!%*239p8Bfa6D'9XE(-Zci!ZH'eX!!!
%L94&@&4$9dP&!3$rN!3!N!U!!*!%"1#h3X(9$l9XEMX2p0m9F&GVDH2%i*,4[T2
15MDqbB#RcL(Yrq#EIrPRr6Sj9Lq6+-+h)TeDGI%$U*fiFk0TAVkK9Ih@ZM5A(e$
6#3jMmmTm'BQ"B!Vq)&ZPZZ'+@i@he"54Z4SPA-KJP"J,0LZ'2@@$liU4*&Qja2T
P6A,3LZRrA[L#H&8JVE[&QaBY50QmG96`TTM-k5BaLK3-TUlPcSr!`jGljAL'@Jc
-IJJ*6chd!0VA@-#kT#HhZ(j[BR`YX,j$RN4NjfJLiCdUjF"[`K50lAF%Zl1U[*+
N!(jDe90#h*Q%5H6pUjD'iKCNmF2U8R,MCLfVLhMjcr)TaXCC&F$AUG4-pLi`@H-
99#*Ik`Z0(a+[C&%(-a[Fk,'EJfpEYF5c'D+JX)FQIqhHIQKBe8`iC&PLR9('E99
6`&p+1C-Z1c&9!9U&Zrl+6bX#4mX'rF!IHXC%HG#q&U'#P'Vi`IA@iUf,26C`i'Q
[M*RMRBUYI65QhKTc!eac"%a+&89469J-'G39J9#4rU@A4@DkKPSGe!Jj6eHX[!L
aVcmdT*K)JVTL[8Xp-I9H'm*BGr#f*HAX@K*j-PcP1Y`S-a$&Rm35dPZ1eNX,L&R
hAa*")IMrY&mARkh'-RBfh1F3J$)@JMB(68*6V[*1K0FG&lHD2mlaMj,$64T,9,@
AHIdEf9a+d+r)!Z[6mT0qGq31U05`ea2@Q5eqIC)%U)eXF[XCfIAA%lM'jU"q"!1
G),$paX2dCYb+"K*m(GbljH*6H%)J[1hqJM@bS%c5QQmB09'S[F!e"p1&+RaUKqT
e10!b1U#e64J63LcL1aB6m8Ar`1G1&USp"c2V*P&QK,1BQQPKp-MmXT&S%ZaVlAI
UFUaGFFB3`cDc'c!3ISKjX,-NCFcEGr$r+f@H0RI@@rZGrH45JFTL@MdS[a3(pG`
61lmdXAcJmKRKMR@%DV%qAEY6fichGBmc8L9J`m+6kMN0*KMXHpl31ZCTi%[bK0X
MZc2e@"mk3k*NFcEqEJT#i)-)!'I2NcmXkY#Y(9F+dJQCfU((hK"h)D2kmdLfiZc
(85f"*L@cfDfY'pNZ'f-iYJbeqJU,r0jljMDdr3#*l@ATI#d)LN4*&(M,(Q8)DGQ
T#E2FB(M$ijLp-@piJKHK9j9J)`dSY!i4VE%fqJ4#fA$BiCMrYaSjEKp,TQB-R#*
1lEM,YrRaEHd*pdp$4Hi22*JFAGTX5mi(,QV[Ce`#qKk)88dMq6*V8"[IYkEe6K8
G4J545S2TIb)KX$N)'Lrc4X*SB"f5,D)k)[Q[A@3"4Le*IlYNq*D6Tmp9ml8ejfY
#3I"5U*HQEcN#(`qBiNrJ@DhZePdI'6S[[%Ym"8C%C#E)jC3dJEC3ENpCrUh0&9c
ZSlQZ-5BeiNG`)JFTPi93$hm6B"8"i*!!'A`Z$H`q#KJ(XK+9&e[[iZS#AK(hk-Q
lpH94dqHfXqaU)`FlBVEcUQB8Z'C'NcNYD`'GU'*VXR9@#4-"3@MVr-h@GrV+!QX
X9j+JVr3A)bm)FMq#8M--l1FDbB8M@+Q$NpQALLBLkm20bY05)5P`Q8FJhNmaGT%
e("Blq9VBETV9X%9'0$%R+NmG,'0@ef&Gd2$J-Z9$-[()*h'C*HUNAH"lU#@2+U9
bb%*F6FQQfNdYE&[b(4c)LlB[CKkVR4jCEFP4'k(BQ0La4*JdeMlA3V#eR2RpXaT
-[*H)hV@!ZM'"cEHK`4p9T)p1kU@H1+Rcd("%6V03Tb4X%9TQe64iFA0lXCUFCjc
S(8'E2Y6fNp9AkfArP,1HfVhD,9D@6R&&[9bcU920Ipc5Vm*0b3Z(%NDqP5c**40
cUZpL(mqachbQ+9Ah3[@[YpAVbX,"9*cIh&$X4$2SlTFmrB#fT%(aM-Ek4qiS#T@
iJMEpQ-qFBFN%Arhj!XdV8EYqYjK*FF%(5$UDD%@5#C9'(+h6%@A,H8Db+dG!NU'
8i(KBdfqArh2*INd!5!'ER'pfEa'RD!Q`C"&qKT8T-5VH45j6L[H1&+f@-+GPL"a
6"KG+Q*6)I6&dQZMj83I*AmaXaDrVFNaT,jP`(1bQj'ii(+5hm"[hR)-NeY6NH)#
2q8XR,MJ[Y[dZ@3MQRY45A1@`cH3(1r5$TiSS,Ak"bfGEXhJDk[mPC[c29&Rj-Y8
CjSS@X-Kl(CZ%$4Z2X3&P!jb"!8rN$VqRRIhY#IEJGAT--$&+QIQDD)fh6F*jS(@
m5-f&3ZH,B%IH`"D$#8Nh96ieb9ZTP@[UVjj(i@Gp'*@@XjM4,Gl`$lmd+'2Tf5h
AC)i16Mj!X!8)"flR6`qX+J6!BD+A',,mAQccP`TP%Jh9&h"'B8K9`6a(#$YF&2$
m'D-NcCL4PCeTiiPrS*CGcBkDZV"`leMZ#Q-r`#`8-@f!8rj"Cl!@DI*Rk,qDc,[
XVFcY"q,r-U'mc#HhBPU)ephaH%M0#THF&QeX'SRd%4e(6bU,lj36UF`I4rDl`k4
GI(*p'-IhMfp!3(QT6)`Xp)DhFA*iQmUbEl$Z`'IpbjpVUE(EdLA2Y&C-"qXC,+h
!ii5IB&!,)aRRDmd#RYe#pKqP*$QU4IDiale*m%pqq`EEA,5hah4Ebil%k)LpV1f
42Xd#TFSRJ25@"$NGfLG[2r!I@JV"!-h4JJ&jj[km+29'Q@4`B)Xf@XlMU'%0R!m
8G51+@l&[KlCq3JR$M`e%3*X'YdVB#TQPY'F4cpfb-QMK3&rD*(ZZTid@XV)XLGL
-)ZCKDMl3XHHEESD#9'0X"I'Z2I"p9J$5,"i+D6#iZmUK"0N-CDM%ZfBlRj`TBk`
F&AG#hQhLU3h23I4Pk+6DdmZafRi"PB2aFIbZ1,)fr54!kcjDDC,[PlX-e)JU8p4
U&$j%RB9fX-q3!%AY+QUDD%#8cHGN-p9b-26b25FJZRVZRm5V%6#$!CEed)mG`XV
$F$,)fq2+HUGk[T!!RUR[bPTQ%bT-ASHb,[B&DB*+FIcmBSX$fp6Nl9IM*FBmea"
ZEZ*0)0*alJU*HQ&h*adB[VEV%LYZV@!i3mS8H6!4f()i84R(4KAcUqehAq6BQd-
0Sp)q6I@f,!`-)FNmC#BUSC54rfJIXS0@A1lFC+eHdb[F(Lf"k&IGV!I%*b''Mr(
ae+$!24djJ$h$j8XMIE$JV@la%jR%jE$j4LCl!$BeTEr%jK2fYqp!dQlr2Z-DaB0
RllEZY3P`KNLliebi$!c492J34!!fT!%*E#m3'e(15SIrMJUUU"+DZ2P3,NEqCHS
UZFEYZ@'hfpJ`llNp%m3cV2(4p@2%JSPV0c,a-FI38Aik336GmH9"AB4TqLTAhJV
k!imPZ"!flb5J[EdE5IbI"`,,hfirY6R'HMi"fPSGVSLkKFG$k*dB(q3Y#YB@I!+
cpk#E$h6VTm%Z"Vf2!IR4N!$jph4%&1hpN!!p'&YIR@I-I&H8P@P1lEqCdTTmDMJ
9phL,cY8jJ1dFEE%q@9A3H)2cMm2TfaZ#Zl1%e-0Zc%I*ZHHa3p3NT6,)Z[VXSbR
2ZNYEZRalC(Pf(Yj**VQ`hr`",3k$N5q86dpYHZ%JqaBbNikmT,($Ul2%UaIMc39
ChI$*'rXU15%aq1A,pQ2b2Cc*'6)ReVp%&%#Q82"qJ'XH'!U"8a@fPE2S[a9B0eD
5EJpJ[GQpBB5V[4#QkFDpVbPS0r'cI+rl0Xhp#$*)PDY'rXIIK,BAA*-H"c(i`fh
INDHIBic-fZ5N!U&c'IUI-5EKjUNImG[Dh)K@`%j+2&6"3!BGVrf(9MD3!+fY,,C
2Alji"aZ$e[bK)HN[L`%1U+iX4&2mFam2X@,!%J2#qDFfrm#Gmd2#DQI'02'$F,p
*CZCR4G$`le2qmGI-S2b#4Tlr6&[RcLpD&d9!AHZ!AQbhq94,"PlEMfc%%@@lM$(
2,#ipY#5L1&m&e4'lPU[-EQT`(i@&545l-'dk,mX6[@*LGK#,NCm2"c*DppDb($H
HHQAJ!c98&-ZNIZBV0H&SqELpMQj0Nl"%*ile+B$DGc*%STHIN!#`ASNCi+VYPqk
%C+eiM`mlM%BDNRZ#aTcDBHmL$kBIMFS,AS)32K"!RKHF$Q)Nl,d+B@IYM6&,$d#
`q`3$+5YaQRXMeZRMBkckh6b633qqf)pb%pq,B9pC#M,,LS-IAh-XPBb''cHBZ9Y
bYjdD+ZX'XiGT#IL*k#q$$iJ,c2HAZ+8*T4fhD8Ae49Y)I3"5#&a08ZRaJ5fJG(6
G1X$FS6DYCP*qPX`%'4$V6X&Z%R&(rd0"6e)JiV'l3QPD5*URKC2d@('L[%23Mim
Y4BK*LBR)c3CKIGRi(i`bC@G"`ihd8Ar2J1#'kjUh%%A112&Z'X[FPLX-1`GCEF'
a$dk,8E%'bSCH)qYcqJ$0YKmLfI!94EP@!*TMK@EQS)RiJXUMq*EX'6P*Z*&hBC6
9BNiJNMQh!rUI3C+%EXJFXdP(D2EE`#"k#[*e#LFk6[$8JF8EZ*b&eTEDSffGlG`
pCV5h,eF)d1NF2'DH!RSYrbd6G+hhEY-G5(,[CJEF%,920ka5)G8iFI&iq",`p2)
8d&k)pUrP[&K#rZec6aYTe6C5Yc&6@qh+%@%ZVVMi1VNCiI0i+JEZ6YA('jBIIk"
X3EY-'UXdrjA!%9%SYR%+m06Ci3iZUXZ%Dh-+T8BrmV8BD2SRN!!["cVKqa5EcXY
"mG5[C6m)[!SQIZ%qjG`r'VF-hqXZH+&l$Ei%-Mep)1aGqrN[5*45M@LLChP1D[4
KPKlIQe!rX*X)6STc[hl0$0H1@ZH'X+LJ,3T0KcP,j`6XV*kB$%C%5,Ba2!ef#V[
!AH&L#d@8Xi4`fiFa%$qHl50%`*RX(dm59faqfql[5Xk1@TQPFJQ&P)@-+JVH-bj
+`THQr,6p)X4fcY[I[`a5N6`1Vai&[H,,,NEKFhi[%0Km6$mDNUJ'XJ2H!FT)II6
[,DVM&4l'QlfP$b65B``$&PH1FeIb8S1VMrYaqFk`aXHk`L+Yb"0mf,RN'c"NFe1
N8JecH!eK"pX$mMS2cFkf'ZbGLR-%3"62UL4[*PM4pmZ0T266#hDk!2IdBhq'2pD
c,Kp,IPcH#c1H$k`Bch"RaBc5EafRQF4CCHTj$3A8*HPZU[F"aR(VNlc8bZXU,NJ
)&AhL5APl$5'[$PSHY6`,LkULcl-U5f(2dkYN`rePm-pmI&1MSQjheUEP!'2)IBQ
rX`LHdY9HkH#,f4&[Qcb!M9RX1TfbY[!GJ%8PccrE3DeB4,fmTqNe-GZ6p0&ZB+L
K!%F&()"K9[`"HLAlp@`XhPb)#h@9&Faj'0hp4"4e[(IL)Kf03AAjlckV`4,Z8r0
qPP[pXQ@m4Qdh,2KC(CV2SBV`JGpZad++aA2NYI1-D&G5%3GQ3ZRG+[kGI!U%BU)
Xh&GeSXUG9!-LUehG#i1Q*NJ8#+IBCB)F832Ram6VaaMLS(fiIETTH0cXP*IZUdB
Tk45)NM$)@P##"M'F!+A--1&l-2bP5Q(FiVAa8'53!1c6j6VS*,fkiZh@SpZ@HfE
rq(jMHG&ZPTD`M9HPCA0De,PDk@2K6MqBVj)C0G-MH2DM!@D@ijEXEU6qc8H')['
I&J(rhddd(55L4+PKF5@#b`,#E!)Q"Qm5!J-a)Cb!meYU[)N"SCiLZ3V"-TUX9ZI
-lT0p9eRX+`kb`[J$,Pj&AafCT92"QMNYLjADY9iSAN(bbrEN[+%MiQQi0c-TETU
@PJkmhQB$B'K)LhcA[#!Q6qUfFL9iKA6ki,Y80YM65kr38cUZ*GhD,2DYRb'6#HA
Ihm$J2'C(H$P[!iZ*@"l)L+9!jmq#!RXr#T[H(fMdfUB8HLX6YTmccql#`I$h[K-
Nf`3K&Li9%,HU+C!!64LFr0Y9UQ8[2AR,U5`k-[%#-N`kSN#43qi,cHGm``m@IEd
3Dfeae&3J4(d!AVcVN6G+-jpL*BhShASU4D5I'4,rNS65['ieLiQ0L6[KmUXjUYB
PhZ-'$RSY+4Ip,`Qar5HZK%Y'(lpSURZ*aiHSh5bc2@B+N!$3ZTSG&J6%GJ8e*@[
,dU(!KfrIGF(RNFHFc83Z'UJG-Kj*A40ERPMbRV&Z2G,ZLqMTQk@reiZTAJk9C$m
`1(Q8MaGLE*SV@hb#$Jfk*RHXDk)d@ll8mrBpU!cdiVJ#pQ)&BfaHUNCFNQ,,%H`
hKh)Yj&!GLjG@VJHm!%R%+C5mY[0dm+@NIU#j5#Y%F9J4cNNke*!!&V0DJ+&B"[Q
CIm,9RUL4mDX3UM-hhr8i&*02856mYPKU8#AB!(CbYYP*iYihf&mCVbVrLrJmHRD
pHr!"&kSTRLpm#KfaiZE0bi'#5TTZC&`k13dRp3U3!)XdU(MrD'mNGQ(L*TD$rir
4B#5H(@$V+PRl"pGbYDFLq8[bG("J'&"j`B&$jmMr*jLFYZGLqc03MkXq@h9cK6p
(,S4#k!,'J-)A8`8%r`8a2"b[rdj[ZCXi@jSUm"d#@[%IY,3)(LQrC"beq*&kSq-
c2)2E9aj58P1q2QM(GfhP)(5P[Vm!@ILD)qQ2-V6HAG`+k#i5Z@rKX6q5b+98Xli
UYfS5aKekja&eVj!!dCZGh1ImNN(NhmhML%690(DHQKPmjS4lBV#MUQ'FNlR`jS&
D3eZf5jf*18QqNb`E%I@4,2MZ5F)dT[Jq3Ye%B45&$[J4Y%kU66Lk`2`kj4[Vi3m
L*653!!q#51$(SNCXZhp23R$BRTi9'C0$T-0XD$+aqMCkNh$'pFX9IQ*M[k0'ibl
h$bZ(2V'mk2K%2iIl3kQXMQI6AdN!XKQ`BF`ZVCEacJ$[-$6l%9PXaD,8rQ,Nq0Q
#YJfPq+Ch5C!!cNF%m5ef2rJVdFF00edeC(2a)#Uc1U@`,PeePNmlJGiD*GrN2UU
cpbL2B&T"B@c"bE"@Ad'M6"9KPdfQb65P%b$"LAVI&Q4J*1qG)3XBAR8EC%LeMIl
fdEa5G*18'Mpmj,fb5`j@1#YhKY*Af8BIUGf3!"@0f89#Cpl9hI8[1kh&T*a!2Bd
,!9Xce0KDbTJjTB++S"m*pPA84[hGZli3qee-mJ&)6!`@"[2b*(aG-cmY1@V@&@P
pFEe-BJNB)R)09@JS26qQee2PB')JIM,'V6fkj81cbFf!Fi166%!!5-rFLQ0Zlc@
5(5-E)i60qK[,20#5N[35`4lRMj3mSDDmJkTqFZa(52XH+p*M1A@2Nc8,a0A`bL"
*X'2SBer5h&r3DYMVA0"CaKAC$&*X$[B9f%aH)4YG%eVULKTikVrr)Ceq$qUP*[l
*!$C3Z3&rkLELdT8*)3eLSN0m1E0(LFAI9BF)%DriRm&""j4&Ab3qJV`BYkcekPC
XbY!8KGCB&eEP,6Xc9#EYC-KX)jk*99!hqNT@1hrJ0B&D!kQB*QI0qch`'f41Fc"
EfVMjGc8GS+a+4l)(GmBM-*jZG`1FX$F4aq'e`a(*@m)48S0-MLk*NfrcV%,"[PY
e66NUTaK%-#dp4#3XQVJ&&dLh"XK2q4K&"*bp(kd[MTK(N!!f,-X*U&*0MqbLmE$
MjkX[[4aF5#5bAM*0Lm@MQ34MS!*'i,`Nl&C6em3GLUTVNbMpr"%EUNBHl!Kph,h
m4!@-4N&X2B"l`F*PjPkG)(qTmTE6MJH#8j02c)I10GaB$elA0@ZXTVm3i)`piVP
AES(Dq-#Vi+`fFFA'T$R%mXF`PN"!+J0%TiibMUXqj988`'FD0)+GcJj'N5YKCjV
e"P&X@JFHHPEeB)`BF+TiB96N[Q`Xf9Didq-6Vr43P('N!h')k"B8RrV*eB&i[QN
3@E1fj`'D*pP%P(Lkl1ED'GKFJSbhmLH(&DTaLMM''qqI0hID2Pc51Fam69q40Y3
c4cbR+ar%Ik0l3Qj'A9X[c1bC6TNNN!"jhQUrI(rpb"ZB80@PY(*Q2"Q1ASiGhHV
%f2j1PM@Dh314@&5d-TA*2a%@hT9iP,Y8fFaB+Uff&0IP0YlceJ,VAQ5$%8`ZhQ6
9PcPNVdKV56Tai9'Vr*JEdF@L2)J4L*Y'VAZX%&TkkSKGQaDdBAHFdp2,$)[Mc&f
ISm02Ak9&jPI9JALeYRS+YNTk#BD4T3dc''e)QK#fQ'Kf[Ce,`IfLD,`P&0,JmrC
,ajdPK0BR'l%UP$i0QFUI)hKaJcd%RC,)N8q`01BCmQB8'Uc%5iG&c`kI%bXD'94
M-q92SHc$a5f5AJ+C,I(K@`3PZ&R9VcRTpDCLE$[cBjdUYMP@HP!2$I'+0HHFTNS
1aY'@685dAPY[k0T"Z@)(qRFa9p[1jJKQDaPP,QR9!F('qp@&`frLfibd#mXd2l'
mB-5bP53ef8iQk9"phlVT6!rh&c+PAI3Ch+P)F*r"60TB5T!!aL[21d3pIeLe0YY
2QlXQ&(-aQ*1D82EHlJ(j'D$U$8U`ImLUX)AUeTC[U[!85%$Ap80,K+ASaA)6%fd
LbK2hUd'JF@e%08%P5%TC8SP1R(ad@2a1j+aSMHCPdapVa$I"lAK%N!"C(6cV"2`
QAFa!@LbXNEQ"jZArMbHl5jZV`lVPMHljfN5NX2a1+pA%3I0lm3B2D8"QE5PImJN
J$rfp[U!DG,MN$06,`mZrek-+Q*e*Yj0YEZjNlRRa+Te*6)P'dIaRmEpXjGc`92(
e3ABrkE2ZN8bjjNbJBKk2rGRI!a9K98b'`iXI25`P3q1(C'2`G*DeVJDYN4Xk*"#
PcUNip3Cd&I3c5YNj@5V!L2RYj)Ul%#!3[J#PN!3"!!""!!#dSDNkYddlJJ!!)--
!!&JA!*!$cJ!4NZS!!H2N!!!G5J#3"!m!9'0XBA"`E'9cBh*TF(3Zci!!!)I$68e
3FN0A588"!2q3"!#3#S!!N!G#`G6%@f`GLi0)4DkN[b4RC2,[p#G'&Ba5`H5melD
4TILkXNc(dUD4AADeYh`"ae8f(MfSk)LA3PP1c[3#,a2j``qGXElqPTKk3KGX'TD
k!hVB4Ff`[h*lLUD'L`+BN6c+ph@'P!&+HQC-r)R0'I*m-,@$l!'[Q8GFUd@%2X2
,T"Lj"'+11`*Pc2PXHmZMq,k0rdC$J%*!aGkV-6Z`A**1B`f)kF9I0hGA"S9eM5U
U&Q0DH&Nce%$r6!CET+h4Ij+E*AKY)T4rN!!eeR69mlA95SVK,X6LPP3-CEEURhK
&'T1aXj4@*5k&L*3eldG'S6jC&9E10a(FPQQmKqIrX93df1k#Zb4FkJU8eN&Jm[+
fM`+19c'+,b8P2)XA80L+X%#62HeHbH!&`TTk,1mMj*HCmA!qY+j18l4Sj8`$D"&
6-N,Pq*YIlAa3$HJp'#hFE["N-$K#*FR2%2q5[N9Vi3+dQ&$A)-KC%B'e[PPB$k6
*+f+Qb6bH%bAYARAL+02j[aX%p8j%jDD@[FU+(0q"3dhB0PqX'Fhq,4qVi*G1Rrl
F1&NGh3H[CM$D8!!I0VHGIf#5E)MjG#k1R,d#@hZ!1erY&#"A9lb[6r2ZR&'[lHr
T25rGd`e@GdhCrqpN[jiDMdMSValBrm`'"*!!LZSPm5meDEVi*LSbYb(b#K(ZMSj
adYT)j4Ue,hHQK(XLGM%i6JV)#`2$Ik#q,0+E5-%YL2[&X4Cbqm,r5b6JAL`P)MY
H+USBi-`1G*B!c8mQmq@PGI)D0*2-aqP"hLiFXPr)e!ZZVA%ka)V+FDTJBL#(4K!
+pa+5pSC)9K$#TeJVpNrF-H@+*B[ffalK+R3dB1(B9QYQId@H"rAq&TE2V!2A1cD
FdMJ`PHBjD0bk0EKHHU#CBr(j@aq[!8U%XBUZlSDp1X9E"2TTT'eAdJ61[5B*I,4
@QKA%YY*qfaJab4Gk-,k6N@Vre+JLI*qh6234`RM&*d1pac@LC*B-YU6CNID4fFF
pA&)fU'$[G&G)q1lLPjK`@5Vp9N`4PM#lCNSPd&Mb@SD6d%'YX'2[db,DT`MAr@8
05'5%bY9&)S-1elM)C@c#AS(FDlPQYJ#X$6H2CK33[!+fC)UEhS)*&*p$&EXbjDp
5mU3+m5Yiq@fNMBJ*I[M6*110iP)qUGj$hZI88Q)JF`1&@A2'6p(5K46d3`Nb!M'
0S%YTkKj4A3`TlTJfl+Eb6X!+)rdVX'41@UbNSHcZY)Bq@`hDPBjqUBR9@FRmBdU
dJZP)h@rEaa3!KEaaQYX1LAEYSkdDj[IZ!+b'b#VLf)qF1a[1k2KPC!dl4PZH4q+
b)00d!HTkfL@Z2UMI5,9JBl%,ejmh$NDer$LFhBi*KU!2EN*9JE%MTp5Ze`MMD'*
M)ZC$T5%P4,8kX#Qj%Q[`QX#H8,2bHhA'Z')N)CJkRc)LpFb"p,%i4RfiQ-+C6`-
pCVU&P+bQH*)L5J`(EcMUTYrXi0ZaFh9lf#qVA()+5MjeP*[$@TYJIm-!$CHIRRH
i8jEc3m52b0H%&Q9b[aRQQd8B`[5mjJdIK9c,p!P%dC*9!#aZ@[2`UaZV+R8##Yi
BMkGMh&bMqT8rl&#"+BV2GV48c``8G+Vq$A%imGd1b&AV[-MJTdb0i*dmlCCGIp,
X*Mb06c-4%GZeQPlGm99jZe%l)@[+e23iTBVid+$454R"TT`UHbKAfN*HFLSmY8a
26pQp$dXKQ2b"9"er"%(#Ri-!#VM`EjHBC+,I(+U2M1XEFaE)$q"[,VBpp%b,,Tb
1'CY8$Td,eMaia%'YFMB@J$Z1Ml`KrT!!!R*0T!V*(U',df0@T-S"-!Z[ieD*k%N
&9G'-SM6AXXBZqdZdNYIDi!Q)[)`TN`D#(G$llHDEG-`AffqpE%d$+%*jK`!ETm[
P6mcEbQ8EZVJPK-eK2FNl1(rcf-8F[j[LVl1YT9j+CdBZ'*JDVSZ(d#JRelLN'-S
3-qBe[ql[mdD'qIJYVLMBrhlH#QCEKB"SamPVB8e84Uaji3"Sia4aAeHZKVkZQ9B
qb'k*9bi9(0$H5a[bG3q-G0U$h*&*j0S+eD*fYDAqKXISJ%dNMbp*!9fL`cH$#Yd
CT!+b!pE+C%)kqbY$1,"iKhm0I1UhrMm["I91RY5`*d!1h#eY)$VI@QX@4e3&p#D
+FaHT[FUllBTS4LUkPKBlS""HFM#00)$ZAN)XrK0j)G2Ad0L#23Mcj+TPEY,iBP$
!aqMJj#m)['%RT*-&#43'e&qbdIQ!+%*L`Zp%(lQIB(m$jj[2leU4bGMcIL8)kHH
2b3U*!R,-1j5dGR%S@4C0)#F-1BL@I6!qUU0Jp3AmBBmYlF,JIcBS9pi8RdEF'%T
kkFjKNc#faNlP4M`RBq5'APV@!SB3kh!TY,UHk0S)EmI*f5@*,Jm9-#Jh#G,&1Gq
1F)'Tf#hP!2p$Y%Z"&-YPZI"AKJZTm*D3!"Vq0(-mK8PLKRKLkmD9rX,K%15EI1(
G@-53!#QK9)+Jj4#'%U$V6c`L)!*1pKp*ZJfS(+,Q$[`*BADjZ+!a*(fPZ-PN5r2
H@IApm@'N"TRQ08UBHRSD-m2p'523!rf0SPMC05DB`,N*-R84-L+K+R98-2DZr5'
i%'')1l@PEAk+K(1J9SSSGAlE&i36L$k&6CQ&-M"Eccq,1L#3!24I428,eE)'GTL
cSPc3,YL+YZ@PSQC0lck3!+FbDRXQ,Ul)b&EPFXb6!AmDF+V94'ImM&88ki,ipGa
0@i6qSD,0)F")Pk&0fT50bU-PSQiaVBD%P2,XcA4mI!%Q-r#BhNE+"9m`(iRpPPl
U3`IFH8$1J#f6PLBCf-qHeYL+C@,TH@P@TPQUh'"8ENi"eNjCP`Ph0#Ze$PVqc9p
jYLj(Q6qZLU9ZIAVE1fE%TD`E2I3P4k$qI#Cm+ef62J6h0VADr$b*,A"X05%SCBF
"68V)T4r9Mhd"aDjh0i4mXX"bT29d3kDaCHRD#cp2HrqhbH&D16U%P[UF8M3@@'`
8*qjHUV#GAmP`r$S8LF4q5`8i$a08PmI+ImL&%N0GD$`%HB%qcILq9jd93H0dF*h
B!i4iKR"%6p$eTk39hZ0@d8c+2ZIreDFNi!BP+35eMle`YZV$K@PXFIm[`81CBk-
c#AJ"KiMbdch8kmfP,HQr,P3lB@TT[pE0GZ,!D,(afA),PkMKRM34PBN`lE,S-Nq
h$ZQL!`@XBTiT[(i)MLBbqf4b!GZjVf68i0S@!pLJAZdS,6$eS,5qX$f0$@f&aS8
ahPXl-2**i*b&J1+h*YBYFB2Y9*8L#@q)9Ld!ap+lkXXXmK!N"$ELVBj%)J-`&X#
j#,S+!!e+Z#&pqQ*2!iAC`CTqi@b[2-SL4,I-ca2`"c8B'X0S9hYmX)2Rbe"MN5N
QclrR*8A-4E(YNfd'Zrf8aJ2!e,0,imlMHB)8U"PEPkmNLSI!*pk4+b@lGMKKc'l
lU&6-i@BbCPeLLF9@(QfX*T8r#TG(4+G)ZCBRU[)P6FTR849TMNdT0mcpXGFrYI&
pR9(mh4qBbT+,eAFXTK'R$N`Fd*hSCRSH*D+YQN1X[T,QMf`@,"GS$*YT8@jX`&C
ZPaCdH`jI-@RAAdRVP289qmICQ#8#,XMhJQ6)[G1!j5V(',Z@JYhbqb9Te%qhSq+
G5lNP8K8Vf+2qYmrN6Sp*MHF1RVXqY(0e6%59b0`R$%I8ZTr6,IYm*U+(PGlH[bc
G8U6f1*!!Zm*B)$NbrBK"5`m%l6eAN!"'bD-@BB`B,lQ1EdS@T14,)8E,$TpJeaH
,PTUcqYcpE6#fPbjRk@Cpmc&,Gr%*QHc($qF38S@fAAJ"AeiSkpR5kq5Nfm"*KZ#
*lkAifcDYS8Uh-lAFk3@,8J$p!hlS,6rE[%5Lql"AV#(l#LhI#!X(3Afe39Bqk4H
aZmDZ'5GYR`V5Im(Y6jUhVaYBc-B8l`ME!8TMrcld&L,F0hjbND[XlMN1A+6REPb
1%YY@fHq8kTq434f$#c&5jd4(L[4(R0SULX("Q$**jAB4ck1KVV68`hdPTHlah)B
8rjG,R13#fdRdB(ce1EI`'r(#I3J'%-j0Yr@L)9rkmPb&Yl$i&6bk%dQSRJI5ASr
$[GJ&GQbM(ieCZpf+4&84$,PN%#1e#%#mZJR!dHFHSLJ!D5r[cb@1C@mQC-N#-jl
If8Aq`r0')&PPI980MNYQcm@I!28J$5EM-)1pbc@F`RkF&Rml&#3B+#qFK5Kmdi9
U86SA(Ef2H"c2YcI580bA2IHi$Ke-,F2A0Kc)-Ie63bTlfrq"IiH"qCJ`U6Sk19%
RTj(qedHXlDCP(9I[!(5-+2,2Cfb*#P3(Cc0hdJkEl#Z$1mSN1JkeiGMc3Qf#cbU
AIdB"i)#K&mAaH[Ype#(B`p-G%-VrL%%MqcKpT0I!AaMd1fNPpQC4M+-dZ2lAb)`
9U5dZcD0G2phM%rLlbUJR@p23RUAAm(pkdJcU@E+c,+@$jR353k8c+ZZfkhPQc)H
HFHdrqXJ@h4#jP3k))pd-([YPBVc@P)H`,+aSK4,*Mimj1G#)Af,F((bEKP[UriF
D,iTrei*[eD$F"P2Z(`KqhiCCe1bhT48*@TUXqQH*hZINRPa38YVjfkfMUDXj(@)
,9Ci8ShqSaU1hMF*5"-("DeSeCK2kqr96[USThB5i+@*%21%6fkK5TJ"FM5IRqdE
CL,Qk[$fAJ0CK1480q#*"qEp+aI$8SrU&FPB01pjkbDiiFIeSZM6Yl4a3!*jec&(
bhpcVM8EUr)'Hrl@rH*d[h#Cfb@2KbljiP@M1bENG6PViS0HKi13((!DSE+!R3dl
$8pMT6$56IbU+(#CrflmAJ1+I3[G!j'C6U)pXlMRG[a2&S6FF5[-hJ[4MB&0!fBb
lLh'THH,)qI&ri%AkEl+NeCH'lrjjjpPF,mSCNPfjE(!KV,aejI%hKDrZhECfdQJ
b%ZEZQA5aMl,[90S")Y4F"31AL!0E8I8)'ekUM%*FUST`C-9-iTT'(6Si1Z$(-NE
Ak8@Req!PGa)5VcAiKZiJA6ehUCjlIFdb0`HPEBeP25!E`eqL3CcRE$S$13C%4Sm
6@M0JlpE(#YP!HDDa9La6T*cCaS(#JAeBDp1Pfc-RbCQKchqm8ecEYUIJ,'&lEM%
`G-eQ*N@K8I@ciH3M`X9h)#i"[5iire8!Iq,'lU!+i)fhaKr2V0*,i1Kl53lf6`'
fZ!-N+SII$SM*X0US00#NB3N!64Cq+EP345iXq`-EFYM35Gl)qkEjekZQK!,IN!!
Q&Cbe9'c'&`Sh8kb1kllV%mXD(ZQlBRRMG'&$dqAdl!+4V`hBK,fZ(A0K&+BRAB9
Z@q%Re+f`QmMG0KH9hd6[8%*`9SH93Y!DfQ8A+H4fVkVR[Xd8Zq1![fEHQE@pemQ
S'([GNNT%lTZF3hT!YdKHH9V*2Kb)[KP6ldMAPDqJ(Z*DTR0VRbP'e*pEj8Y$*ZD
4Q%%2M*(Se#QVVib3!1KG`r"FlY9lTF(bM%PVpq'`Hj!!Br8Cbb*LdZ#B8ZR,NB8
aXqj#I&JMQK(lID3ABY4Q10Cc'i&8LV@LUa49[i(1[5SZq(QmSph5SBc1j'A@lC3
%2UqC1*EE4,If+[#C%amlk2JM[me[PaC$6P`9e,1rmN[B9'lji0332bZlce,'R&i
%KVSCqfL)3pLA[*-F#5jT"`)3IR,dHM%V2YUT`qf-ZjXee-M4Y)pR1pIS5AA-#U0
l)fQF+f[DY840[)N9Cj-Mk5RBK8&T0[V`k!FTRZDj#R+2*Y0(kD[,U$3MJ2G$-DV
QpL-Ha"$G$"04HMCI"pCC(QefGQF0QE8$CDbHAXY1H2&,GEU8bXl1mCYRMK[iUiV
3jZfC$+!Uf@`4rm-%[kQ%`FD%NP@ki#,9!"ebfKi2iZU&1#Q#&i260@Idp!GjIjc
dkIF3"ZX)#+F9!!Zr(q1NfX[Lf(#PK+ja2@4&EI&mZU`'Kd281Ra'hX[KE,Sp4V#
($0Hhh3ik"0dXX!q!lL-YC4r$Ha@NXZb!fHFR9FVDV&-%UUr09lK[hjlV"k6VGmD
DfMQpjSCCIRC1q2B@F`$AXK`VrE@kNP`VB(4XhLLT9B4qBS4Sa"-HFGiH26Z"TX,
9[rIDJ)F-"`DmaCHD'jNb*(C1HkRT!QfDGCf8)-fl+X58kV[[l)Z%"'XJTM(5R&+
,%D'k4EP0CKCCYY1b`l8Eb`BjC4@"5%1"BiDRdLV3hI88bJ1@%0PJK(5YqLFA(eY
Sq&UEk-$3qR-*6d6b%jcF!8XZN58NBE`PGi[9-[Tj(JZZ5NT$IK)AlV$5LkK4d4k
&K1DYQdfcRU%'@6mh@AU5$&UZV9'Pkickq&`U*eDB&"T4eU1jXq'Ce4q!N!"CB,P
[DcrRB4Fq1,bCh4PiHhBLQq0+Vr)V5jaf!0RrMqBp9#PDYKV`Jc*CGahpreNB2&A
4B3V"%GYId`P2&jjl-T!!LhcipmJJHUU0l%!K6e#p[jJ4k9EaeSSAkmKRKNBYQ'M
Cr2`Cj9)P2U'EmlM5'U6PY3UT5k*4i$jQk3YjMC)B%MN6'8FY-qXfi#qLkKIlS26
F9L6P4@fU'0bAb'6Bhrb3!%%rH'&[*ij!b,F!R&&p)1cFdd%TR*!!S'''c(&h59,
DLaEdb(Kf@cLb(JXH)`5LMrCG'!"bZJ09-R*+bBSqp01rGh`DN!$)T)lJb&N2ZX-
-K8D'aI5kmVej`+2a[#N$R0HBHpmB5Y"hr"QmBYqM(KKT`fHN5MQ2Rl[NDkBT@P'
&"Z-cV"Gi4!Fr#"f@d`JGcLd4fRUk@YF$D@09qm$&"EY-&NSdDJ!"5B5P`U2q5Q#
eA')!3&+"*EKPM,2ID*%9A96al3QHRXpC*ZI+&5N+#jNB$6!,*`[a6La0(E1`BQM
'cF(ilQME%XmI*8F)',)L0kRcq&1X5r14KP,a8##DecE&Njl40$R4M*YcE(Cd!,9
PDH[LJqjhq)50)%E)(Ta*pBJpIpcA#5$X$dUedqJFS(BSH'D2@)(jE*L68eEd2DM
%kQMkh6q3!)FB[TkqelG*9mM-LNd+Njp'@6@9G'Bf6E690UfY&Rhl5$X6Gd6Kd`K
P,Y3IK3Cf81'a5hU!NL(P0C0`E"@#16iV1BcC$b@IEf'A5ZT0kD(!2Pr0@ZRpThB
U14[c4+Iq5I#,3+1@ZQ,YAQdd4*J(iZfFI!`UT!NL[,Phh9Z-Zriq%UC1AI!da,1
BlibB%#(4GM1V[L3YQ'fG)i*B$UDbBRU9c"TmV+UZPBCHI6$&CLeXDTdJcFm$jCT
HJ"!-a6GF`R2jYX!mej9QDL3A%#2FbmMi#995(5H2Q!3h@1ZD8!4aICXfJlLU"@H
XUMKbp-[A9#G"TVF@%U2$YAh9-#0i"19pCT6MRCb-ml8"e*keaR%%4i6GiYPI29c
@pH1VL#NT0jlNa8ZRYrbq[bJ(U#(da@[RkJQ(Ma,bIf"#-i*K@5b)VU4,QGQdhRR
k41SG-UPbN96NDp"%kdmL5YpJaFGU"eBUVpZ9Drdq5dqhiSeFCq1fG,46amR6D00
2-F2LPHM+!CpBjX%rRMFUXH`!#pUd*5"9&GBEX9@F,D1[K#K*#X*,M$39b*Eq52k
[Pk3QEU%KLjZjD4%ESA(@M1q#eK1qaP0FpPH`2j)p10-Z%(k&5f(!mC3hIUA[e-S
kbNTcfJjk2-TqPB1bUqqkI[6erFSQi$ADYG,&CN4hm%H(T3fhVNMaY'DEf$bBi(S
r5kTacDkTIpDD,Vmq8NP2$2SjqNPj9V8cm9"j4SkV)F$a8KY"'(%FP%8$F3GpppZ
*UHicK2m4`jr1"HI[PC,d3NZ!mL"c'U"1b!"eVSaY)YDj(@PSC$99f1Lj9Rqf+J@
&8%D4cC08KIGfS'MeURYYpQrpXI(JK24,9pJ432aeKL@a8MC182eYU)aX%1)E+3)
9ULU6HqFDhT+3!2b9Rpa#h0"lHB4R&hCGD!5LaiqMEmc2-(VQ2@P#X"%daQ`15cQ
G#FM,U'EbPG!VpX90kHNe%6U#+!!F'F+RTj%M9Zc*(R4&8C%9%Ra,-M4,6Kp*l[0
VX6'CM0Z6USJ&rfqYR#pCGHY&bL4$RRGG`VpaL$AE'GG"S4lXK`2V*$5lm&Ib4V*
jFN1HM[hfNcS"8`G"4H@TZV`QTp3hpecGrqadDZU[c28ADS6U9BNp03XZ$bfVU*k
XV*!!i1Y8p!6Tfhfrb0jjHXJ5E2!AAQE9kCQN"VZKmC&YdjSTA0bM06e60M'0@L-
b@&kec6T,K3JI(Xdj+Tm"eaCir#+bYAXVHI3h2R)'9Bfq-D95lcb@I"XQG!-KCq6
(meN%$GP#,K2-L['Kfl8,XRQ)B23f(GA)Er,PDpB-[)rPKbCRa-,XLmL6KQeN[2(
8ZrVGFT3epD8dR%6bSNb8A#!FqA9$Ej-H4kTK5aT,BTXS*1jThXB-pqZ*EFU3!'A
`6@GY5SM0j$@RQ6K6p6aNi%0$G6J"GVMm6pDpe)Rcd8j*)he-UPb"IM#6B3l%$+k
cUrePhi%d!(9X#CRh5"G%Eqcbake0'l%&eFpJ34h(1[#BlQ+kB!I@JDDD8ZV8B6I
VM"@UG,QGdijH$F1k2+9M`EI!&(`$L[3+#'DI6crX*",#1*@FPfL-Ha-UU$IC[bY
[GXIDUiJ2*4"bec[i+Q"IqF!@km0qqm3-9%`KiTqkI1r`2-SP+Z0hM(A#dfNQ2b5
@!`a9jN"CB#V$GpF'iBNJ$b+C!fTEkYjmicMrYec+r4&Lf!m,k$[*34Uf-A+U%a[
ikSUFX"-IRH6XpVV$"6!KG1l2@qLk)!*"R&JIB%Hja1pTAfQ5Pbp51[Qam(UJ%jP
(mYAe#D"[1D-'4K9LIq#mVfphA`EehQhEGIK1eI$Qm4ce`0Fd$MLp-LBC@#8qSZV
Ki,Z8A!8Z'4P%rh5[kk0Nj#FBU$N!k2U%3A3rPfhC0kU!4c1Gq+ZkLb+-T(##&-V
ecNUl*Y[1fl#[MB-#qNMaZ1m,"*J*GII3Z2NTVQl!KQ9QqJhP$KfSX%pRNbMa+e1
,UE$(ck@[ZJ8$edP@R!AF#S@4PPF0'&'(GjD5`pA+cU#KY$c*hDS@dr94!e+3!%A
ND-0+I(5M`4UXq+05I&TAcS`d&U8B6G1LEEVLm&dkPd+V-)8)$eM8[hpd(Q$,5r!
[+PRd6AhA3bUClF-XX8QBleEQ$9-'!9,85F&%9(M[BdJI%2"Tb24A$D,*,6DlXjq
UQ`C-&A9B1'2hUJZf"K2(5i%6I!Qq+#G%V!9GII"-MJbcb1l5@F5A4HlQTQB)B*b
k2$J`+Dm&S`bd,hM+3XFdf!d0'A1a@eq*,XMK,SEeI%m[-cT*)1QZPIV089RcTl@
,(3ehcDK*D81+4bICrVlXVrkklL&&h5'K$'jfPq!KqU*4([+0lQDSCmTaS)[k-r9
iharrb5)3PALLGQHUI%fa%2VP0#3*j+r2hiZPRcLa%-#V`"KlGJK4lN3AB)G!jG`
`3%(-#015IH+('kKR1hi+AV&[`&"X#0EU0IqFF!4BpU0@kl9UZG-hrd(CY&2iU`[
l@50Z5pCUA!#r[HFKYjp'%Lh[i0S)jH#*pTYNTM-0N!"ei&+M,&!F0RSY6P'q&+5
BY2!kL(VJJM4feLS"3rSiG@QGceS'am-!L",FHeda9p*8V#SeNF!`#Y0qYMJ*,hZ
a-Y`+k"kjQe(,RT90@kp,`m[EA9HD*+16MepJ2A9`6%3eASH2LEIKMckf6RlR-kN
3r[I0PYqaFK$R8l)dR!"S3N#Kp!Z6(KZK[PdHA+a3kKfPGH(j21FPZ4MXPp("NPa
MD@qc%p9@3GkZ-3pjPp+ilSNN%&PL@TFh&90T!!LFTUfJZeiVfV#q42TkX2r+TQh
Il[-P9!8T+l"a3,1fh-aTAmi6Xabd,&jIEYfT%ZQ+C-$)INQ'JGJ&SHMJG8p1,jY
52DDqEX-2KER!8B96+V"%Jd+*[YkKkJqDFQ'S'q[&ejGJJHlZcaiLIS-X9Kr++R9
XX`VMX[qc61f1SJ!@R%qpG%HDSZ9HPcUC6G#&'(Gp%cC3FqJ-2Y*$@baMifc#4G'
%p2Eq#%a[i)&#f`YG%ebGML"32##J3GhXXPPc,EXKUpL1'R"p!Br`-SGaQ[KaBAF
!K4#PN!3"!!"&!"#hp#haYr3Ym3!!1QJ!!'mX!*!$cJ!9`Yi!!U4E!!!@V!#3"!m
!9'0XBA"`E'9cBh*TF(3Zci!ZH'eX!!!%L94&@&4$9dP&!3$rN!3!N!U!!*!%"1#
h3X(8iXXZp(-krTf8IY"Piq#rik,"FeHi09PXX+HqVbNSXImj5m86%'83J!02008
HiH%4L*(c)IEi3[$9Kb@DaNZ9#L-cE+j"D*)*rmGr(q0I)pYVB36,65&C4R80PLm
1C2mB3lkV%ia3d$05+DF9T9(2i%Pp,R',&KYJ5,8pj#*e3YhJ#L0Mf&4Gp4Q%0'T
!3ILQ#B-T-jY5j`%ZRqjkrfZ1lfpfq)`E8jjB-8pISm4Ip*,XqE2XPr#qY-K8-r#
P[N'(59M%(GA+I*(6##2)`q5bS5'#JAp@46CK9(I[J4*chDR4c-YSr*[Y3J3i$8m
e-aQrJN4@'NZA+hXiDl3flG[-G[8UNf&h,Gr29Nf*K`L3!1l%$bUl9K+i(`bpEC[
Mc`LKjCmB,L'X1ipjTEqf,FM!f$$p6C4,@h+EMJbi$U$6@S'459-K3`pQi0bmDcV
RLSfIJJNp-aDhkif2D1!4@Kqm!)h*lqP4eQZ98EU"*QmTNdd++&fjfqPL'3p'*DG
&GZ"CKf!T%V$`ki1X#eSjLD&&'D`F3PMM'rJ'@@'hF5Z05'cp%DmQ4a+l*-&T964
*"V)AeUpmCpR2h1%mSMF(q+-'Ti6G#E5R4q%"a1iD*-E0Kbeqc&YI!p[e,ZcFpEm
'9D+(Iq#bHE5T,AD2@Xf#%arVJ@EGdqDc5""D%ENc(ep%!9*"`h@iM,Xl*I5MPpE
e%Z*phC%ffD%B4%k4l'BBAf16e1jp!qCLJ+9i6b36qj(%hGb3!+SI*rHid3rN8#C
lH%eLG%ST1Xh(&`Ii$pi%ZTSN2S""dEL2,3)Z9JU9UA51mhqh,DYD$X+#`[qZqXC
"Rd$ejC@MU`eaG1M'1IJ9@!@,rN9MPA'-PA8$Y8#ILi$`@eSpYb1LN4"D-b'IJd'
5@'#hEA&MhaZ4'SSLLISbddS##T[rd+Jk5L0T$A%"m$UC#S1fCHaED)hNjNf$bCA
,04m83Dl+!!TfDN*CY0LDdmQZAf'ArmUG98lIBhCJEJ9&HpR"2LN-dLSe01V"E3I
*&pl-3m2eh1Sb)Dd'[lH0HC6QI(@d1d25#"8U+#F#(#&2b'L**[Tqr9JcJ1a-$NL
1$I96Ae+'Cpp8'PPmAk1C&LId&i[[c,$H%$MYZK)`,k3U-+'U5KHCY)`"8'fQIL&
'jIljFj4jK'hiEI#8q9-Kd4p#`"*TUcZiBUeG'CdNB&c[VBQmb3i!1la(*QINT5i
15"bR2PmV0$(`V`0#RIY[KB&'pp#8[Aqpi%$&8dRD*bpI#c9b0#Y+!Xll+k6'`EX
ZM2ac"H+j2drQiC!!%QeT1N!*`Ci6C#krmAPl)6p4LND96"hB8%["-3Rhl[-,0lA
6[QRh((GX0BqXCCYm9GcT4J&kV*-Dp201bp(fP5Ep6kpAMfJ-HBVI"![-U6qbp%j
!IA`UM++9Ml#HEJRZeAC6`SDI#KlFf`4Vm5$F&ULP&H1K`LHqaZHh6@m(GA$ID,)
KNfD-QA0*jNj5$K8Bmd3L9rpd%"9A(('RQ[kq%6b1dLiEc1cqK#i2XfTrI5)JU"+
!S$$HM'rr#1A2j*)N%jh&D@M0rL@cQ#"3hBr#SI-6J$Tb3N0"`NE#'JQKY2F'r!)
aGYq-pL-4MGfA0J$L`c03iRf4"1T'd!c9%er2XIiqIq"e30JjT#J$FNpb820IS9-
4BdN3AR@Je6GVeFh@9T0+pll%L-DXVI%#X)NVS2R`ZqJ$6+*EAVNXK#bb4cCk+8a
D3d''l2@(FYR8IR&fV%3V8JMG[%b'!*01'CJ(F+lm)U5MQZ,(@T)Y4NhmqPL`qfS
0EHl@32U5NreY-X8MYIANPeG0AU%hf!eMD"Lh,S66&6$#,!`NAJlG`rGVL5+DZIX
3G&1*JrX3bTq5'iB4MGjGFe#fD'UP2(D4J'lS+@R3DRcPqN,$SRch"Da[Hb6!GXM
+*"bQa@0`dl#GFhLZ!%la1,TF'Dh[&TC-mTAm+D"R"18K+KYe@kB[Y$hBp$#41T1
mlJFb83q'BH&H@Tc3KhBN(D2T&K*aD&RBhe)q0c5k1FqPSp)EF4Tk%Df4IZ)BG!f
MCQ954TRK19d2U@&,mkGd'rdqdP&ZYlD#(9rAeYX`Z&0FM&`f!24EG6SdJSiD`0,
%eqcV9r6!LJYMpqDqP6MT$S'UGaMU[&43JC3f1Q'LidP%2VjJb64$'@2&"(N3Vfj
!1Qe$*VS@jdFharZpFE*!!IcM6aecDZ+@lE@!iLNK,a6fZH*m[,lH'r`91Rk2aBr
(0X1VYGXe,9mN&,1U2Gb,C2Sk"L11F*'@`"@!jh+M9kJ8%a1eJK"$8rR%lCC9F5m
PC4!4S!+VTh-d8J2$G,ifVAC9HqECdXm$*r0%GBcIFA!AJ3)ej1%Ri4"MQic0kl2
CmDYDA4i(6)Qdp3hEmB)M+i3R,3d(Ghd%Pb+FS%2qjbDFB5N!aYrKY#f&HSGBAYJ
hY@hJR8mHTr!RjNdA$C5&eXla1B[rEUk`)Nb&Xqj)55Eh5UN1!"dQrN3B)D5)H"Z
qZKr1[-Y@Dr+6*F!4BJ&3@9Cc$-*9jlT&8+-A&a#KCd'&2hN1Nl@VpZei(a+SF3C
A3%L(H8q3!2Dd2eQ@(k$5GA#C@[[ER9(#@C9(*%c1k0&(fSKdSHk%CE1ZCA1J*BR
2'AIadGCkF@5rikr(SY9RT8TIP0XiU8)3ZPk*UU3BTP9hh1#+J[RRG`QjJpZT*NY
MSYLr1T,PmQC3dIe5[p&X9QbGKm+b6["0YafcQ)!(4q@cK28qNcQ9H&[F*Gb@Aec
f`YV'2ri#qC-cB!A4+X20U1D5EekA[De!%Bf-MDj0HrU,dFPk`1,C#eUX[LeE1Gr
L0fMhYRF4$#YH1FQA1E'JiQj3Mh8F$j(9)Na[mhb4QiP%MC@L6`r"lDlVR*3a*H$
%c2pC'P,@fjUK'62LN!")-VlCR+TjM2`"9RYc3Ie[jUDX3r5@b-&lHD[CjK6*dD4
iP5Q%fr'L[`-%6"[&I)+f49&4`ALCj4B)*"KFK!1Vj4rLJ"!ESPadE0YI3,eERRV
e*M%TfP,#i6r)-!lEpeMk9,0fq!'8)EJ$1!D+X*pqAdHkQE0cJM@UiC`R%kI,QMr
+QM''45)$Krph*,(*3Ia8P'IT@"T!HHK3GJqEd4"N(+lTKJCcpXJHh`"a&J,QTE(
C8jQ4Yf#V$&"Z0I"2!fl8rZ13!#c1ehJqV-U)3d%-BSS9hPS!M9Q5LcUE$N8"l66
hK3U'RGKm&l&TDm*&1!P4PQlYbDGN$1BqZaG"a8r53MTS[0c1TK3X)aX#DR6SM!-
Z2,a&iGCQJ'@$V9#C`dfZk4G()[aadj!!-KHem-BGIPI(2FSZHQb9e#5AC,Dl1$9
re8`k+(&"r@VFl0&f54V$F%c6E6"(BZ!hC6k'PQi4H$Vq@MSH*AXT(b)(e$*MN!"
-XpT9D,G25SQ$EGiA[)Q@f`3@"m6jPfhe+lUKEh2Y)h`@4fX1AGG'""&h@ec3hPU
)bVd%C#&D86D6%[YlF0&E@YL*mbFGQN"6BRK!kl#hpRUBleqM8H3qVh+hjXhDEm@
9h!1IZaN2I4`#FZca*TAKqYCDiBIq@kJGd'd1XP&!-jd'FG%p69L@Xd"F"%jUYkQ
#%l(9arp$2H#3!#i!1Re*28BDFk"c25"dJE[TU`FBjMYRk-D'(Ca'q0#NeIX5GUQ
Y#V&XDpc!4PdZe,G&l55m6krmC3'M(0eLG`c-$ZeZTVA+8SYS+$BBSDI[S4SV`k[
0A8A"CGkT-CGGd61Ke8"jr8PTTaEM6K$iRh0e[&b,@f5[1h)2GAd1%"DqjAY&!bR
p+T9R*P#+c6(DR"&)cdQrhZFVXciH4XZcfU&@NCX6AcR0P+ciJHcXjHm0dj-C6bC
'`@RbcEca&5*CFpc#,C3-Ra$lP&#kl1XZ(k`9Gf8dRGl0!5&kKqbb4K5YDp2CAq(
'HX0[Y3RK9H8U%rf"V0M&'V#SYlm5&(MI1N`*!cU"`*QBrr-#-Q3'556pfD`2'cX
cKhHYdLS@+0&keRBQe35"SRF-Lma8[h1j3Z+ipqaP%Y8LfXZYF`18ABfV&iBJNQb
Z1'iidA1(RI2G666a,YZAlSULp%Ta%9QrLFHEMC4r9QRp)UrH&K5l(Yd1A52XQ-S
&GB#aBe"d[i"[kSbIaS*c$QciLr-K-FKQ`Ukb6MmRca!c2M##l6$epilpM3dA`la
2IR,!jX-jI#E2$X$Nk&BG+m)YXB$TdV2"PfeBfCMEqKEP*U*(MaQ(aUJ&lMDDh+Z
&pZJKTbc*)&'6,L5Q`9VaRc-G)Y"Be!T!MB5#!T-T1bIAqL4!GI4V!3&V*6blm!2
3(S#emQAqC`4pMQrmQmTHf!`HS9dc9NfPiQ6[bqr@bS[)GK#H['m*XImbD[IJYK"
r-cCCVVMal5$Ae()BVMbr-CVX-BC4FpHP)lJD"ED@apUBLqT9KA`Y6Nlq,mh@AE@
'FdB-0bNDR5ek$rjJH0ajj64MLH%PG")VYPFVf,J6rVaYfVYLi&f`)'IjK2HcK+,
9HEfFQ,I*ZM8Y4'c9QiSI-eqZr'TY`9m'A+I(ZEeT30+hjpa9l!Z[*`M'Em#I,dQ
EYCKZrM4pdhlY2YTXDcbBJRqebDk@RP'`J(FkGc&Zq1JY[b-3[-RV6,4T,PqVV*+
QejcB1hMLri(+L$pM4#h"QfIaj%+XFK$AB69a(TC*Ef``*#EkVlck%85ck`bdGd9
r'FDBfFi'"fKmdTeUaIH%A8+(qCaBAAFkV%2PNl#B+*)+I!KX"Am'1M(3lTS'CmE
PI@bj@S"#CicPA`K4lJ&)NJ*X3c2(DV02*0#"e&Y!l9pTj2@I(4Fr6hk-F&01-aR
q(qYrrj!!6bESB'035kQRdGR)idH,$`m-9&-qRj-mli$QcAU18AfJiSrB[`D@[6p
PpX[6)k`NMmmKU,k"#G@F6me!"KIY0aDdBd'EJ"0)dpb#M4YPGLhNXQKImTdABHa
cR$jU2HUVmAG,XI2rhmDG#$d!!c3fUCI3Jc8)p)k!P`AK$45Hq$"SchXaBpf'b0H
(F!YFKJS9j#(@ZfA"keKF3CdZP(lTfLTA-djYSU9[[-pB6YaXq,9Y8+qL"N(qpMm
lM%EfeLV*Ip-I1paKGXkK$5*'X6k-*fp+bpp#,&%TG)llUX8XX01qq9k@P(FEb@[
-"S1Y+K1'%!fh6P0pV(`q&CiEllV3`R0lN8*Z,Ac$p%BE408dhJT4`iB@a50-P"m
08#FVkV`[q@#[l1p@bmfl'L&C!rrH10&)*arB`ARf2Gd!mE*&!KDXEF)hXX@bPej
HcFSLQm%UJ1D9+,&c!RUDiDFk6NlUF%NYEF&6pl-Q!#+,E#6L)h@-j'MpAl#UK(G
'l0k8h+A@hSF95mZI9GerZ6NPApph,[IlmSXIR%6"ScBe5Ief(VmJmFj&hIV9r1M
L"+3-+1fDF$b2brIN3QBU0Q(L$KUBeE8XcNm'+a6A%rM5[i%jcr80UK`hX@Vj[,"
0*1)4KVrE,#4M*qPEZ2+#(iRP3d2V`C@8"m,Br+TC'LH1j"0X-"DI&%B-XC3mk&q
d9[dR'K2[0eea9J-Y"()Xh"0l(`jKH#DK@0Aah)UiKCCaF,bZhp0!)MULqpV6pM4
S+fHf)&rfJV(G0``"$&8%a1"NaRKZYd9MZihm2fL)dp`CpE#UE"f26MX1JK`L[i"
TS%UeEJ(Qma2(ikKLU34&T@YXQ%c8fL+,if,*"dL4KIR"kd(N09IST6d-f-,DX[Q
LN!$05TM%'XPScN'+F'8q#CXXPPGc"jPE94VCR&CP&NqQM1Y&I@8R#dR6cP$8fb5
))mQk6lCb&qB,pcAU6eZ66rFX'm4UZHam[hM4HShSURSNNm3A92)+NlGQSchm5Ed
M!j!!4E*p[lU%,p8K&H4cE@rkrQ&#l`HmaVE,k[K3YV!Vq6`(pfDJ2RYbJf9NSQl
*!2XKd03K'B[b6#PYdlp!fTr[e(eqUdDLF5(&Ip2&'0)V##"rfa1,0F2ilYN30mr
`@PFACp)K6k,d4pJq)YVBI0@DcRcJcZ(3+4S@J-L')2Z5qKZIKD[VDAKG9eU0$`h
6"jC,(KcZf(bpdBIBqBKTbY8eN!$Ar,6SFHT5"3UTZ59d[(H2Z&#UIpIBfRIj0I#
Z+3aiB1"K9(q-GNU+bpBMfk0b8Z"DQ"(V8abXNMR5f@ppHP22Zq)JM'p#LBjjiC+
VYG)l0l9&m,DED,la$4J-dQ8k-S'3!(04AfXG1-&!NdJf@%BbpNZ88NQF[i"qfrh
%e99SrQDIk!%KXiAF[rITj&9((f+K)PXN!6QMUkFlGeUiYH999$pjCkm9$kGU&PD
aK%Ur3kLAfeY[&#Bb*ld4RhhH"IIVIZA#$6X6YfIjN!!&b9DTcU48-6(6N!!iD+`
Z+VZK(CNNhk$Pk3H%+VEd(JZIj9*JX8a+0m6hld4eKBNUcJ""3CUcY&9%fPFC+2F
T[*dRD[D[b8E-#h0P@m'9'`2a-@RD14(*T01N30*pqjG&iI*fAYr!AYfZCr"RYKm
IMY4+%J+0,DQMi8I3kNil'%L68[Mp[$Q($&-VbTYq"SD8jrU+1r8#UUIjJdJT*mP
%0I*8["AF98SA(E$RXXhR+kf5@0Je$4TI#klk-IM*iS4'(BRG(@*cGdQ"4p"QE@%
SHSB9b!3HPq"l60fE1SK8'G-0G82[I#h6mEpb!Z)QcK`fVVR598F*VV'3!2ME,6I
5-GfPJZSNB#iEP46Z'F%BlC[DHrbXZp"+kESk(3ZIAC*3b3H6DmdK"HZSI[VH0Xd
eRm1UDB#+ZbhI%)mIcfiL(3!M,EP(1ITD2L(Kep@N)+H)"3P3d!66L$pBeLZ3!)i
4BL6QbC,EKIITd$p,FlK-'bbe)%T#4CYfjr2X$*8&(RNCP#9*!$Nrp`6L@ZD-cS[
,#d+-2$p@(5#YH'cMQaLQa1PMb*8aTIbhcHP"#,H#d0QY*aK`AV[MM@-)B(YF5bR
,Ra[pV&#dmlS[T3mS-8Hkf8,3kB#eUh(+e(#9EBZA6[iPr0I#ie'lla+i`(mVPI0
R(q4VcibXjl[1H`[k'KMrkN[aB5T9Fhmp$jTQi,UALGaa0FmUHr9G&!qY`&rkQTJ
V*'hd4fK8Z0iFCp@keR!JKiHKJ%raGIB0DQ9'k@rq$lq[1Yk'5cliEd'4GFqFJ6j
@a'CQkRA(3I8#kEFQ3dGlVTjNZ[IeGNC,DS-L((b)1r6![lTk8r80Up5)bV)R!8e
REC(4AdU*`C+Z$IPd93+FP#MPJ8RD5,(P[BH)cR!p&(CJANqR+GNGkT(SS#0Zd1(
R'De4E#2[#1M*j#HV4NVD)P@,!F[PpAKIZ*&8YQ3cb48ZMbDM!,YmraJpLq0@&Da
alYqa8RGSL1pf+Xj+)XrAYpiLN@@1PGpk+65Mf'KeKRA[3JX#SXklC)[4ScJSeR6
ca)T2fD)[kXjr`9r`0+Y"8Uqk6V3,A`LA%a!N4(34C%pYM,dLb%H$`3[afBalFd#
'[JKdC3XMN!$,(95KFcN9JY08heDX-Ti`'&6a4dfIQl!UGjhVCba)E!($03!'e$j
4aJ8kZaS(L!Phf[jI#pN8)m!"0"QBYb`bEl0Y3[pIT[l[V0@$)2c"2daCrF6epKE
c8,%0dI@E-6De3NQ9h&QN)XlY0N54p+CZk%DVkpaaE8TpN!!FB6q!XMLJ`ak!cQF
l!%BHQA8P$!8pe56DEG,jGKCb(V`K"1'q+I-%lk3K8(Y0P*!!`5elB-m`@D-qqK9
#mAVB`FQC#N*33d1[pjV!)ch@)1j4aDd%()LKaLZ!j5*2+SY0hb8IT$$F,3Ef'X+
BD"&)RmIDejh3T&bb%qFaMS#PN!3"!!!r!!#dSD1fYr2BJJ!!@"F!!,F%!*!$cJ!
2@*X!"9bG!!"(G3#3"!m!9'0X6'PLFQ&bD@9c,Xq!!!#(`de08(*$9dP&!3$rN!3
!N!U!!*!(3X(8me``e[bbZ361!j!!3&l#ZQG8JV3F6(LrEMCMd14QURrp0$&CK1b
li)8"Y-pjPeeS0F`M"bpAJ8BT2EE!e'A(YQJ)6e-0)16Z6"H-'D&UmNd@aqU#-U%
C2DjG18&JSVpmm514E$!'r90jl14#!8@6LC&rrc,!a&2qTrhGNPIjCj6aPQaEifI
rHBU#D!D3!-h2%(U&1NkSU!ZK`8YVMIMAaTIi1'*'-%Jl"L1lXbbC+&if4!f0pN$
Xr[,-l!k3!*YDVi!*&J()a9NJ%BM!FX`9[$)$SJ8NMI!d,@EBS9h@jb45V1iQ"&d
3p-H8`&1B-9L%h%[&1"*%@amV&eDX*Y5A)YIK-NaDRB@8UqVUMR*6ZlDk53*[1i9
pL1jk%01rAaEYdfbV`+JfDJ[pqck5iqbKUN)X[FJ@NS(FcLGP8r4Z)Q#dGG$C6L-
R&GKPV(N5rE!X,9)arAC!'fG3YE&(E-5)ED-DrAD"hPXB9pq+JTMrIJaJSKr,$V8
GCd'%,RcYNQFlKBJXeGSN("B)j,B+p`TVhE4+!pZ+RF*EZGM8AZ%('"Pd[p3RYG`
Gj-PJ2lpGHUHYqfdHI3&&$Dllr8a6ZYXTa$,M$)ZHC-"LIJYT[20#ajKM*eFf$QL
8ZB@CAE13!#CC&'Ph5#$P2LRqe5TbciU60MJYE(#+,M6eGQX,)@N)0qA6'0SNk*P
"pa2FjRfURS18C6(%,4cY,p18kKlk9YR31eUY4-GiT1hA-LD'P6-!dIr)$ppQJb"
)h1Kef4"U$IRSrC(H#ip(`P`ISdmdqfj-T*5ld'G9+FdL!c8-aLhMLXVi[`M2c''
jlYI9!9IM1%U'6I0UY`TplFi+`lPCK*!!BL56j6i&cUq#iN[e'+f'#+Q!j$J,qZ%
Hj3MUM5%E@I[P%+DS28Lfh,mh@m52!9'80D!8C95,QbZqYj+mH#9Sm)42444VMQ,
F2CjS2iaecGmlK)2'-d8F#Cq)VFArVH+"%-MdGA$XY9rR(P6#)SA"%ZAEbNEMRBI
qkM,)AF*Ac3Vak@)MLp,VDf4+0FGT02CDfF#[aiL+XbGLQI)6&4Nc8CS9%@2kbNA
X(+SGla0rdT-28PPPh&",el'@H4ST@qPR)5(Rei6ISU[)h'LBMUb@mG#""&TG)9i
"Kqp(rr[r1N&jf@`IpTFNqDQ%#*'"qC94i)b2T95qV0&l%12QeJYhTF"IMHS-U,)
)-DrM$YbMRC+p`XS3bMNKJ#6FR0rh[,GBRU#XPU[CYQjR6%Hpb8kZjYM%i56QAFX
T&lk!JGVRBPG-LQpq9RFfIX)JjC3+fp4cUK-2V(0&08((&B`jUN[0Cl"f&D9'@e@
M4-Ji'"p2[)N)6+k3!&EV&SPD@P4bA42!A12GD24f%r2XPS'DC+bGdETPMM3pLCb
AH&)&%)Hqpkjb(4ZeN3kdmcR(U+[dPN22H)"q-ZPjq-Xrr+3"5Zr&#D'G$m"4qL1
8419KBB6F*M$f6XQmZ$i5$F)fPV92ABrPHIm6*)24!S0aQYY9lB-&iMTSl(2@,ES
AeEJrcFjb49$'"U@-l63KTi'5BXcb&Yc3@2#KE0Ilq1KKUAkH3lq3!(1U'AqK@K!
ffM5Y!I&GQ4IJ`4d@LrIBHKL[XaIpFCSQ"V3-V9PXB8%9$kld0'Ib1`rY8`pB-@&
4)*%Hpd*Y"Lcq%PDk4-BN920)RTL)ie-SC1aaiCL2rhTe+'#dJqZ('Umd(4p`e%9
#&JhLcX"ph#pXjA)06Lq)-4iP3J!G9GJ3@PrlCPc3Er)YIT6(DVQJ#VcFdd-(mZf
``RC&-q!UY+4a-BJ#DXmm4ILRDaX*MUBrP1"#q)#PM#B)TdX``P4@NrYP193QfSI
NTf9[pRliQXTkDLeNc#3%AMCa`R@IcH6YLEa*DGZeY@('0*XI+0UkGVIYNEP+k@l
Q0d1E8j!!8mb6#$EP1D!9lE6[Q-)P-pEBf@+hbBMp9P*ad`fll)`l#NREjm[S2'b
bqdXCaQK9c(l0(,rq&U-K`D(1&hh-VMeY#83@Dr`[lXqehX6@I&Y@N!$BiPPX22D
%[$6M,ckNV#4(af@a%2m"DQ%'X,AQ[K(1j$+T8Lq0eN(p62qDLpbP8*&`!p%mF+@
q#BT1kfrk-c9SSHV%9&q@$8'JELiiJFbVhQkUPV99IS0f`5C%5Uc2Gc*CaE-DNf#
4C0F5`Hp-8VqrA1,%1(F$%e-Pfi-R$`G4Di8)2-42ID*T-H@qL5,B336heGlfX@%
,,e$ll(ejZqT"k[Zc[([ZXbDh&@TEDldV-*hfpBH)UV2mE&C1r1LFVY@RB"2a0@e
TlZdjB%5a%UR%`PfFGdi*F@Y!i2(*XH[#rl8+a,p+&Zp#JjUcqlaLADEALr*hB(e
%#aq5DYS4S8@$B`C!bX4*MD@q-kd4aS!Ze-12YKa5+F@9*0%l,fq[L(`964XV8KZ
d,(@Ch2'(r44-$K0q898SHJGCL)5MN!"RNb844TY4PXfN9I)pNN)h2THX!eM3R)C
3(8U!hd+K9jRLQH@aa@*'JFIc*kde5(0afNKjX-qM9'XaJ)M+Lhf@M[4RrN-3q4l
T%UqILReSmQ2IfT4*Mbri4d8PpP,$YCLr)!XNc@@qLJGQ+M!d0$HbqbXk,!YU16J
Y9Jq0Qp0Yi6(SY8"d)@Rq4hEKSAAKfH3$IYb1kX`M8,jH1d1ERrH-!!A)Vhb&"cj
MDIXD1GZA$SAVQa9dAF"b0`VQGG-(#qB28jMq6MQB@MHP!5dej[k3!"E,Sm'6RiL
SchN6p)N3PiU%J'Hd`*&8'ii2#`bk8)4Z*5H%`(3@2dbL'12-HUp3Y(`+,pSEUdh
%kp)$ej(1'JjP5bhe+YCb,9c'($98Al0)IdNp)`TdBS'MBY9'LFPMR9QfL#6fIr5
V`CZC86iq$MIE5(Qjf`KBahLI`F`l)2+M0!E(0RLBEEfNI6FM#A)L*KTA9Ym3-p2
1qBdkq)h5e@+!h,ADABc6[1F0Vf[Eq&YB*X869+T(Am'q0%hRe)Be&cZm,e2L0Zm
l6k)VE#V'F'&p0*aPFAUc9*[Hl,9"2#U[YjeRc5IPIIHE+([#CSHrVPAjpar)aV0
d`d,EXb""UL00'9I'#PS0P#N4lE1Nc!reS9[Se%3Cr&H6$RIm&UNl3)X`e!Sahk"
cG2XJkEc)Q+[%kqTcbl0k(49UMTL6r-"I4-F#!EF,MY5kGRb#fIm6*a@-6J$XqrT
l8+"-TQSeA#"LFi&H0@-`2Af[mR+bXe'("UPVb)S"Ci@)3VF%V+l-FQCKR%LBKH3
4(%D2Shc1,*!!&Mp"iD@XpTaCQ*,1+N+E,BXi#Df&1p,!JmBeC$5B@V1D8"pMPPc
V936MH*hjB2m0NYHT[TVh#jc(M%8YNVhlX(HNlc(eL*E$PI8khhPSF!d(M&31#Yh
VL4TFhTGPBbb%XEr`Kh3!fiU#ViG@2p8'8Q(UeI0Q+!N'l2I&(Z'pQ2c[(`KJ0pQ
(-j3X-UcZkV2M4VHfTQKEQff4#9[fic(KiD,UEc'2KrB)Th+0'T-If*V!e@"3k2,
pDQJClLMU12Q@@`R3i"D!ScEGlYTiL,&&Ql9er3HT@mU!MBp#UYc&Pf85(jL)j-i
$NU`d(PMEF[4XBV0Y`0DAa#6'XH"9SbElN4iqeMl+pIZ$%@#P-Y`ar#(9Yp4Il&V
a4(JPB'QSkJc2,r'&LNT&1H"@S3&N)Y,Y-9Ce5+IJbYbC55j%%"2IQF&&,HmrLRJ
9L4ED6TGCFfe*Rc*#qRE9Rp[E,0UZ*A`Xq@#!A1C33DhHZjSPc&eUN!#bTbDVGe(
*SN2F93K#@jhIU`"r3,B)1TRJd8%NLikCjfZ*K4qL2*%c,!2U-ZRFM'Z!-"0%`bA
Y"jdr'UF#k($mjf11AFp!(Q5)"pcYP"H6VMqicjr*B6ZiQ08!Faf1R0RLipl$[me
B"r#Q)$BbC'3AY4,SDUY$f6fhB[fm#*3i#Jp(Tq1S"iIA&jLZK&+3!*M$GDc#9'C
H"(,YAMipH,&b*MrLTD8JT[6hAQ[1Q`*D8br5q`0D38Z(Ab1PQ&,`($Qr-ibQ1r[
rfL*q*H&mcK!4"FTMEF$Z0e*0'5+P!"4(4%qZpk"Y3mRaDZhI9dD,CPhh,jJ&"H,
XdKr,D[pH)PcV84%XQHR4eHk!M51AUNcS!blf5lq&&#Dj)0,!iS+BllaieBeY,)G
J!R[`6EMRV(6k&`+J,cfi365c1ERmaRU-XLRD90C8ANLNeUX"d@@*-Jc1m"C4a2U
F2eI1B8XK8c%2X3Pm(kG'(5+Jp9r`b)BheLMVDSe)T+3fpD"DcR59LcE6"RV%jGq
l(`MG*Gk5VbH#FcL[Q+V[,$0Sq+AVHpqP4bi-[k96#@`SL!%DU'ar*e%aVp*$rJ-
eeK#Q2H*rE'RXrA[6Jh1'Ed6cQ!`*02VRH`ipD$qadU+3!2M5PDiNEZP64RiC#Eq
[&5fG%XFcQDK($fN90CBR6mfC4DjqD!2[P5&N`k-&%6jP[&a8$C'@(h%XDdK980,
"d*Rj#NA)1FF958M+!eXSDlf$-FXV8IX+qH+[P)@CZI&1fe@baEhE!QcLX,dCmQ"
q*TKN'ZjVk@)h#lI#C`KrVdee*c1hY1LfjZ2Qda,DYN)Nl2a)VZ'`Y1p5!lJf#(M
)(CNYBl%rEL0N5&`bZMZN06q@,qmHDCNQh"ec-SZ*cXC!hS&@Lph9@*QA$l,E+#,
1MVH8-M*krS196M5+'-0(M$'PNKekp*PJXj!!q[--`DqPYT-)XeH',,j&,-h(Hei
3iPR[4BU4L'R)m+mEr#j$,PYVQf%k,3Z9!CrVI18*"(H2bRSjQVd$8,jR,$CM9h8
a#M2EVYKK(&TRKM4ZKh-F#AdAH68Vh,3f"D+#HQ%Y"AR$rQT5"+&l5BAf6j-Z3[C
rN!#DF!RRiI2*pYEVTVbP[RcBRr)$RNS`KRIEU*bi[[-&GCr0kGG0#dRlGdKhLQQ
LA'Yr0Bj"%SK,IpQSeVKNp#J`DUcl4C!!S-9VkQLH+4l8&fJ2lmmqQ0Lf%Gr0&b6
`rqS0r9!('rC3-6!jN!"-K@KI4+8Ad8%mr$IhTA#MPj`N&qYQ1lGd4aJD6(Xhdpr
+9IDI[jXXQrhDH,G)%TdT!"[L4iS`L4lcLVD180PZ8!F"ZT8SKLbk%&KM[K3hrK3
J&hDRC8*CiGmb*MJa-rB`9bbB@#&hUCbS!HUDY$rK4XHXIj-a+6*JqrMpdbb9ZT2
Z1**BY5X3Udi6q5j&e,0aS2h)6HS)!hZ"jMH2hq3,-fmC-*!!2FFNN@j"+Nhd'!-
FXjVAfGArBaTH1**lQrT5l3eHiV+D0$(-)lhp(k2,0F25HF(UK*kMT@&[Tr#KYb2
ZGrHmTk#AYC+'&UC#FAP4YSc%DmF(3Xa)Y@[4(imDe-,XCFDYJlSk-Q"#(iePDT!
$hZlHJaSkT!+&RprP-bCUeEm9pH'mK,i$(dh`r-0ZMZQ"0%T3IV2DL)!DE#@HQj[
3A'h$i(K8$bZf!@KRTGNjaqlYQjFVqi3V+Q8hCm0aCP"d2D8hh@McCq*bM8DScBT
V%(,RaA51Gi,kIq[,V9Y#h)ha%fRR%kD'M#Qm,'`B`UHF*c(84FeaPX49X,AQp-+
YXG9MACJcLEjh"[5TaP[rqQ5pc)pFea2D*6!a15Nl#2"eBreJZT3GISSrGfX`&b1
k!RV*ii`6"3@9X[5I!U)@@3pVJL'PNi-NlLQlpM-AGpi9S5[$m'`jqAmU0A)*ZrU
HY"%4DmY0M!Uf!RP00IfE$+Pj$[@ErkcMr"GIT@NQ00'K0Me[*$Y[5NXRGLYE[-U
rkhGlAXcjH+9Yd9"%f2r0Y+Xp`YjiX1rXDkfiK'H5!J(66`I!N!"@#@!X2K,"4UQ
EFqF(dm*ZBHS(4(A`-FSF1E5qZX05YMm`4hP#2p6d(kE#Q,i*MjR-I-hG(CDj#f1
1Y00!5H"ID'lh8e$`E&ZpZh0dqXT5pdTPL'1ckJ&SJCDU$DKZKG!UQX8lA2RID'3
6GkAjTRAmG("LL2G%+dr`P$*L-mYSl-FV$#LUqq4$i$R"#kYh1+(2Y5JbB[0#lBr
dBK#Hr2mYQK+mf*-)pc1Hi4FG81KTCZqclp[X[2Sk8QS8J1(0#D)X&`i+e0D3!*l
4'8$B+4*pT-HI%EZV+3@'Vq%VrHhY+2#E+d"-0-k+1c-JULSlqZ#HpTQ`$r!K)Jq
"`@D*5f'JETrc$$r$Gl4R,`6LKpfIFE-8C46CCB0EHE0%U`iCHRFD&"1(PHGFd,F
$(V0[pQ,%je$qrRTL4@iRYRmBZ8MacEHq#6T1%S",X9f9M$A')4LT0@Zr4(kkka9
A`c0aDSF`a#FkN!"qG6T)kKdAQ-mTi[j+r+V3L,,l$&J(GDKaN!#mX&C!lpD#hE%
GSBBmebpG'+f2Bjam4[EdmqhKSeKB"%FrY")@PI(`D$lKl8L'c5jR-#'#C)F+AR1
[+XX$C2@MSJ(-IeY*!09Gh!X#lfGb%&EPTj3TR$%)6efBhhl#SE*L1jAK@"ra)I-
!hjBl64cK%QNm)ID&dEJ%(Pl-`pe3kCRcrHYG1p'`Ucl[FJrZ$9M640X8NmG*qp*
l!*)LJ!!T4Qfb%&bh6P5EhG,[M+ZL8C@#fe,V60B6Q&K,KbbY[i39Z2&T*MfhX!G
Y(NSJaE*$EHNLGC@amhq3!&XQLY9e0Brj+!f8kV"j+A!q-%lc!"Dq!0fmX!603QF
[G'DFFA[TdkmZFbr3c!592R5'P[NLfLUdkaBY$TlPD@Q"e)kaFS516m!QI5E$rp-
h!XHfDAm-HGef8jD+p)0'q20,hJEGRYF(hjYQXGVdUX&-h@U$I`"N+HU&[Y9G8`"
b)fQ3!2kXB#IHj2d#(iphPq6q[frbqK(qP2PSL%G,cCTH$(MZ#D4VQ-EcJYa4Dc2
q(AI&XDicTYTI#hd*,G(9+A`r%"+9cd%D1$QamMJH%$*h%3)4p1F,250ZZ1PcAhq
#3@9L`XK[i+1@IYp3ILcPi1B&5cic3`4S(fZXVTTP-r5@IL,J4kh")2KTfA-E`U%
%X`KbRF-@8EQ)$(Fh4!0+LP#1GhclYV[hYHN&kRj1)ACUL#ak-84GdCKQNf*6rlf
dH13'Fr8@)+B)Q5&Q"BSCL[!`K9SChQ)Vmke!pZTPr1ND8Np%RGp,%fEfLCjlm4d
GMDeNlff&Rf5PVArP$E!ia*EJj8AX4NVFS#M9XXpapZ@I$#5eFk(e,$S$KNkRSk$
J%Mqah4YUMB)Bk3(,)aFYEDXR3Gb&mBE,"'$F4TU#Ha6N%p*P!QV*!2jIT8*JKpY
@ej0PkG[q)V`SGB+YXqhjC"J@pc8m01CV@#k`4[b2S&GMr@'V51UR"V8JU-,pV"J
,CV%!b0hmcT8,2l9+K'G)[qC''V8LM+fF(mia(Je(LNhA)(HG[GiqNLMrjXPXbK[
3q5!h"`JRRQHdk-J1jMp*Ba#mh4l4DPXBX+mCj*ZT3*T8kGM(hPS5,(@mHkLQkh5
h+BrYD!&q&TNV*6phR)@DG4%)ipmk3BX5rda-%J(hmkHRKXmcMI%LYTNMjC*GA-R
%%88NVbQ1#i-1*fVZZMNAK%$k$,E(VY2$U082DTC&`aG'&epQ$)-6"0MUrHBEPeT
PQ"Z4+qJG%"(aA85Q2QPSGipM!rX!bicm+qYCU)HiK463J+r60&dm8YmR0Zk`d[#
+Y-V(1Sc#DZaC8U+PBYJ,X!kd@k+`H9h4`VjQ`B0H#p"`"VhUCSq+U$k85T(1,lR
%G@jp'l+["r9cV3JM`al2(Y,!P3jUmbFY%2L'$``M0h0-DeH86Gr1BjAFDV!A-#i
ldN$"1Dd1Jh'Gchi)Ih,*am5Em%$DM3U1%NbCl&C&&(LQQrV3pfM*1d-cNeGr-eH
0c!RF0`A9)Sij+D,Sec33X*Y6'jQ[3U!&j22NCGAap`"m++P2e,RPY1D!Z+-JePB
(XbUib'&NR'G5jG#P$9D8M+F4Ubj62TdI,f[I4-Zl0pT5f*m$D08!$*Q&BI4V18q
PV`J#$XY!ZT!!#a,Z@N(1&j4NUQR))b-8Pd`8c+BcR2PF1LVeRl1d4+A0i)cb*Ad
0HEHNI),4@$e0)ZMpF,8('dZ,ECH6dpiqEFrHeELVd5%-lf4K9`KDCbb@%l$L#r)
M5lZke6d,r'L+3(L(Q[3f5ZpRq#+69SjbQQ"mfRR$D(VkGQ(fJYf6LYL!@`Hm3DZ
PiPGGQ4[b(h0TMMQN8RIm4SUq4&3am3+3!0NrQZYD2*8Rp)ir(HL!`GL'1S(+iE-
Ch'AUipD8h--hM"dM2%*KDMl(la488qaA,1AZ+VkBam@eTJ2Na,NJDi1'jl6V+cP
9YL"q$dm+[8YCl'S4@*bNDm"YXm$iijNa"59FQ1MGll$AKTZR*(Z[4b,b&r3%ZaN
HqS`'`X+6AFEH#)L"Cc19$F6FTaGl&X!1RDM'+KbKV&`1J!3"VcdfRb5e9YieUr8
!$EY8DT+6aj1IL2m`-cYTr3qU+Pch@)PXPckD-8K(cCMXTSZ`VmK2e"Fa(,qTMmX
BQ9Ke'%*dj1E!M0'"U5L-DXR(5HhBb'pAEmh&V4khc'5q3"EJiD!H$1)S#lEC&BQ
FlG8@U,NUP!ZJZDSETad+hp8K")DR+,S,4Ea+p`66a-eil+C0LPaXEClD2PHNDNc
C@J4U(C`lEqQJKYJf&b`(HVj3Q2$,Id85V8$QEJr!AD,dXC6dLqE0TZ3YJclj#Ad
(!&heHAX$FPk,G&iQV$Q@ddV#!0ZIYPU`#aCh!LlCS3JC2`[Nj&Ak$T8TRU3'"C,
0GNV@PX+2,BL5&a08%UadE*kLm,C`HlKdZq5MS"j9!2Fm$LMT-ErC+q+*eH![Q6-
F(`$DP'Z2BhXj$('G@e1$Q&Z*YFH*N!"Dlii8'p-kX005D5b#Ne`)@396Fcr$$2a
hLPH06lChQ#KHAm@TfZY`&h)QrfNrieKKhr6HeUbQ$*L)#)l,Ma&2h0@eh!cNKTp
!eZI#p6QDc+MUkeYrfSU2TD1XYK6VBT[Fdb3G@-#"#e[0KI[8HRRRZYP6MejLZa8
$9pF'#PaB%56VfMN4@(KE2@Bcb"bAC0%1CVE64UMV6$`VdMqRrkEl,3#e+X[[iir
hh32*)j!!HFP'2E1I@R)+UIDYEZ`[&+klD89)-!$q+[E(Jm+-pEZ$2JM3#)HI(,1
Y#CTj4LSDjH21lMl&JUSh8#2S-4cQYI9J'kad$,)JX#*1[miXG3SfrX2pl@P6Laa
&MXbLd21rFkGp-KkjMH2L0+lNld4`q#K88RZfVGl2,+SPKrecaqJF*[bZAkRBCkC
f*@R"@mZkpY,lqmY(KU)2kUQ[C!T*lc,(SAHG3qIp,3C3Ir8Y%SjAfXa9Q!2+fXJ
#9S`FT-Jcl)`4N9XB+*ETlad+,A#2bpiS&A2+hj,lDH0L(%J3MDlFlpV-YPKKiLd
FjcZ`%e8kL@m$B-6Y"&SiGdE!+0d4C+36NQN%0TJ"bTYb"'Zcp)i2*5Q+9h!Fir`
,K%K!0Rh-2HS6e3Ma,c3p[RFHmTa`eSA'd2++AEaGqhhUF[V$fb24TlQKm0jlNB@
*38"C,(5a$$YCi)pkhZi1iCp-")"diJYDm@JIKB"ZZbM`EjqSpF$cpUU%J!4Z!1$
db1f9VQbbUqJ4e2Lb#Aa`bEV9kmY'XPGRNkJd'UcMUqL2G&qT#F+NFN-Rb9"e`Q3
8adPFI'kV4TDTZFXBGcd*&,[Dj%3`R66ebN1kZq!,b2F'Q4p"6XJG4H!YQUS[i@'
5cClX9%*20Y8-((jm*SBAd!j`h8I61KM(3aCb6blYD9)UbY!kG%pE`I*@0%0UhHU
00!+'%5aKec%R&`[[LpkT%C0(+,6RNUm-LNd&`kE&"%j-kT4p&Tc`(mjA2NG`9*E
ScKm*CiEec6GM5#N#'@V*RIQ(`E$LEqJ-X0Hp5@SkIN9+#25VQEprQM*Ai(Jp"H5
@VIpph`@0eG*D,[I665"l"PcMHHIKS%@G+J[N`C88lB2DKbd(+00Y6NPXf5X0U1[
NRB#ic5T`Z`BE!r4p0d9H3RCH((%TMMG8p2PDeakKNV9d4hT-C#Z)5@F`iCj[Z+*
!,TFJ@ZSBKSpcBk@H8+DJ)00e-B')[d36jC3N@qH1hS[#Z"f*U4kh)$,8fp*Qcd*
eSPE'&Zi94rr%m&LX,Q3J61rJB%'PGM$`,6cTqhI'%*DP3bY&kbSmC`Y(i[AYQ1B
5B&@X#eeRSkrG6[bQP2E-C-p6I0G!UVTiVEdKSK8jirElrrE6h8ZCC!10Y5PfDdP
m!)TlRD"H`c+C&9IDJSTr+1(cla&eIqR1(dpjaQaFMqq@0%fS`Q[246D9ZZLPN!"
KaH`*Ya8kCT5iKrjU@$jAe#mXcMXErS$SBKPmK$*c(D,3#[SAIq&lYNUX9I59$ah
RARLcVdJNm8N9"+kmbr#eil,h92ScBALjTf3pA"(%Mpp@!"BQM"dhM`#$A[N,eqK
T-Q+,ZED@[Cpr-YIikp45KLKdE"GeSb,4"D5R,8hIXpQA5JTS)#BGPLlH9Thq!k"
I@F6K@ZaV2Z)UQqMeY9SVjZ(Q8H`5$Z8PE#@1[,XV`rPC4YVM'ifiI&@D9U'fq4[
K8&Z4eJKQSMi1%`EFa$Td52KqNDbQ'9ie+"5,-M&4f!aaMIJ("&JaD8)'elhj04*
hGBRA3&kK(m0i2-8dii[1lk@$H51MITi6*iKr$'(@*j93ld98I9b[E`+ZL@"fMGa
[S)D5N!!64Q4(,%SK&$2RQrhSXA"Rd6J5fjY4L(GJ)XLk(V1N`TmqX+0CXQ%'Y3e
*"*QMYqbB*V"ilkl0V(-eB2TQTYBKEF#503GdIS0dML-rFKLh)TdL0hG3l6d@caj
`jC4%qbFFTG+9!U!UKQ&Cp9QH6+eLI2-0(c0QS'YdFYq(Q"US'#T`,rD'1%DcR#T
)jYkm)N44KBf$+cBV@Z-h*`11+p!Ylj*AbHXd&bVZJIFDBDJL44jqZh0!6Yap2AF
(KVR[&QD-(-S[E1fC-801$hEhf+NZiF-X*60TUS6AjhdG6F8E,8FLU,(RN@'6'#L
[)IQ[qU2H#DTKlrmM0(,6MRrf62J-)XEG'h#9bR415YK#BcC%q`#,[!ZYh#S4K'c
plQpLGrmBeLP#A03A4@Y'`PE$FY2)!GU4c9+)e*aRF[abh(2hG-%aV5CP4TlS,hD
JPf)lNGBk8QL19h05C2TP$%"FY4lc-"DXpD[rKFmp%SI5Ll@PBc9QpKNF-+XM@+F
UcjfharU*q$1P111b0a45X9dSRGNAXhk&dEDcZR+lc2qQ)`e+"pE25[19aYlb%B[
UCD8I!PpM!pG6-N89[-XLj05R@jT@fY+*Jhd'#NLGT`iHDLPL+mA(MB8VdMQEaQ6
X%YH[KCT4d4Hpb%XFV3eAb)10F[YUAr5[[F%@IQ!E!E(GQjlqjVUrV9[81#[JE6E
,MYeKdZ*CXfrHL+Q'%8ri8jVfH2Y&JUJj59mLQ)Q,-PhA@(RP3)hJ$c*mh`4Ai,P
Upl*JE$2q9@-qS2,6iNU6UP+eUV1UN!!e)3IfqLT!$lGpbXS%cA@E2YmRI,BppH!
Z52X(PSmmcJB*DPkhG&NC5rG8)dpHficTCJ%hCp#',%`R%J1JI@r+*pj9p9p(#)l
epXHpU)6J`99,@XkUr-C)a#NALjUkBeVG-'S`&%IVKBLTH%eH(VFi0YJp-L`(ckH
CeJE-jJ40+q[Q+F8Z,JK)U2mAUQVdEPXcTil2Hb39dN`4MAUdlVcSaP-K3!Bc9pK
@1`F*H)dGTBMQ#QehBq6dp&crLE42#Z6Pj@E2R2TC"MaP#(CbQCVLDDER`Cb95V1
5Z2#$elR0lpB-TH3P'I&6E8$qlp@miT`8%h,+E8RRik2MG'%iAF2eiJc)iVE$hU9
!bU0T-"hmck@&-LrJkAYmSfG"Gl6950@f1#4L$!60be!M%4K[GA9mMSY((jC9((d
YQf8AL`'jj)ZqFXBAR*E)F8ZfDdNC3l+9m#hcfjPbKALE`lacLT9KTGf'PLVjqX4
h+$%Mq%K4dpJ6U`!MYc*'Xb6E*a(Lrpl%d3pm-D[HH+#`0l)G3aHX(p-0Vfq'bqC
G$*,A2M*0'lEYVerR+A5Y)46K9GF9#l0ldS,)pb'UPZ0rh4"jAkP!*R,"`HNVkIm
@[#QkaX-5HA*'GC[#*Lbcqe*EUTYJDTZ1RfEBM%1C0reRdP"IE$@1K8%aGkC$#-4
cH+'*X-,TLC4RP#MKqKF*B2DX,'`SQ!abS2I)kMN*c-JTqZHU2*MIUZ'rd(cdFhV
QDP[6,9('AP6b-hSrF0acP$iLCQApUpSBH)`MQReX1mLbD(NaYl*9hmDYaqlF4d8
42A[Ym*&h,S5[1J`Q'aTf("VF4$,[T$#E)[m('X&,GCaPXi,1@m6m0)c,PlUD%RZ
88#[#T4M`bpA"k*A(d5l8EE[Z0Rp%*b@r%44A,`mp[dd[S(K%X(CZ(B'5e5Yk5I"
Vf9UUh&d6*f'BELq-@0e&RbA-dliZRk95p9+@Lc`%5hlY$E1E5H1V9`4iNZ4&Epe
q4jGhJd62XBTCpQGEPC6l*3X*PmJd(+b'UfS-+3XG63Z2+N"G5k238QP[!#1(8!C
kc&M9cQUTQr)(ZKD[MU4("F-2!qP091`[c9AYD*i&FmD-RLbSLRXc64&)RIAhIGV
Ma!A[C3Irq$2U%QF9)eGrNYU$TchR3ZK"!5-"L12#rM)@&9rkX%ha)lh`8XPZ'd3
i66C&c3a(rJUVdNNj9)VELb(lUle'"m#4K[+8dfrr[RSpR!&$5crHae"Vp!h+qY6
IJL`fLd'U,9Pm,K$(jBr0m$68##B$aD*@lNjJD!E+%TE#p@E8Dki@ZD(Y'T9eP1J
'&8IJF@"5dNY"*8`b8hl53eD@l5GfahZcLjNT*IBVMpH!Kh4R'cl$m2pM2jQrZr%
YJeh1A[e$Gc$ENrjp4L[N#XmK5Mp*F@N*"V&VIjGj*-IjGqeXdBAY9+Gr2Xr9801
j8mF[N9,NV)UhE@'[ceRkHQ6hrdT9l+I1UjNA6F5D%Q!9C%R3ArX%0KdN1VBlJ10
(`XiDa%(dUd#1Y@MBS[E*@[(,fG3Dd!mKZFj+AQKjPH%QGfhKPEG0!kUV%CA0(eS
'r$ZFe5I%YU1+1FHC3reVL(EC'cPZC!#V9b"@f(aPlARfJF1[J)Dj*eiL#UGe#2Y
0AeUbhD#S8-BI&R[qK3CjGB9HYjAQR1`530'D,Jk5KaEIIF)HFH@@arLeT)ArYMq
f#M$c9Ef&+r13!2$D$,r(S*rjhml,MZ[G5I+Gf#aN1!6TfP0UI*rD&"HTGAN6!Xr
bEr9!JaSd))qNDmkk8&VHZUP-R%2'%LU+[&PT+b*09[Nd+9U#kSRdL,C55JM!K&l
"LX+4JKc9(mi@%,!NF5TNdcDcjHT8&#0pKp9%Z'fkS)dS%h#+i,@2!,,$fq5lerm
mm&Si8,Aa+CijRB$ZGE3)!&A*3DJeLrBKHk`3[`L0bQVSpN6aVSMY!*C%,r4Lr*!
!$S+GBb4(0[D1Hp4aijYi#ar3b"(e3GKbbJVb2"SH3GlKMe*Nf5J!*B-Y*QLqrX2
5b%R'#,NAHQbU,L"1-IARJeUCr+GAFYD'QpCDKUpi2@()e'*ML%MqERSQT6lEc#6
8$k!1#1JhXb+4,T,%YM,$&C4h14j6+qFk"I`!MlQ`PCdZ$2!fE[Y+LUc#2IrIRcN
G0pZZI'$i1#Tp,8*'A69`1SALSp5#58HZq2VVS6p*8e8j@2-H%'2-5Na(VQJ6pTr
6#lI((j!!##R1j-lUSBTi3e)%#8GdmqK%"[Q!Xp`$k#IE@h(,%@YpC5#E8-Q$#&R
mRd`T1+8"d`$,(I(+IeH63E-"SXZ-0Q5%0#*Y&!Sf-#hXf-00H63Jfk%09i3iB8)
hSUm(X5[ES3bT`Z@S@&B`TLqj&Ha6M0P#cbi(qe)f6`Ciai)'pqSh8&&)Y&bb39H
Hb9[rp*Tr*FpfI,A$dC6LQTEf1@L-MJb"2PDZT3%qr[,aC'l)RkU!H5%H@e8$A!&
'3hD3!*lcC"eVmDHXF)'2%e*#%1`k$[+pphc6criGl$ff4D)6@9!EBXH[KX%Ul,5
"([8B1"UPbV8lM*!!clTNeiXLId5bfGKp5BX1qK,'R5likB-R0U)3aMUJ3&,Mf5L
&SerjbH(ZV-hGk,SrmcCDGET,Q+)B9J+@4m'Z5D9T"@f9k!@(VX(6$`fK(iVPemJ
-c608XAB2Mh91%-Tc1)8l$8@QR$UmRI[299r4Lad3G`%0#F1K,04ei8Cc*HFId68
Ci&hl!dE3DK-5CH*G25V(Ljl[VU&"qG5'1fq!S21I@3B*Khqr*fS8C*,4)Grq0Bd
%,NF945BfBDmcC,pbPFLcXS61r'U`m$hQ1Sk'0m"mPb+pVLAJ2SU-ZY+D&hkmp$2
[*b'lM!fmdNmN!RQ'keT@Q4Vq6MM')%)dU68%#fl+&05&ehcA#J,kl@mD3fiY3C2
jGL8"NajCbZm%Sb,QqYQF)"3l+fKp3+[d(DJV0PNGFVq0GarBZ2,)X4XE)ZM$B(f
U9GqB&pE`2J&QZ12#iR0p)2PA9I)a@IERZ4p*9kB4m1NUChP6aFPfQT4Eh"M$)YN
mXq&H$)Q2(+B-HM2Md@jkDap%X(0$M-AY1"F"'E*48rNjk&j@3D[RjeRjV5'rT5G
U2i1hAFI0e3)edJ@*R*j&UFQbB[1Di@``E`k%3a8@29LTTCdKR1ZL3)[kEYh(FAL
,f)a9ZNP0[X+@ErDkEi9U1A`l#6P@MA1,RD*&B+3b9SpI'5'iM#BaY83c"AZMAi`
*T6J4Jj&[R+e`pfTf&k4B-2`0qL'4*Z#Ja55&8iSB6qF*UZKP&!d2L8P[YrQhbII
E85Xqd850aR'[*1+XIa2Ca%6Ta'I-af(@"0AVAK9[H%3H&2)lp)eQVElE,,Ylk2h
ES66HahP)C(&fJQjbHH'S`IGl"lkESD8Uelk(cH[dYq15m4[rjSkJ'`'NGE'PA&c
6cppP*Z,ADlcDlPGGM[GJ'&!NR#e(BP,FRZ`A6q'ChrVmYG2(%+G$A-f0JHcY$8l
9f38JGcHGb1!TKp5CG9EcANS0$cfeETN9XXlRp-CANP#EBb6Fe"VSIm0@hhJH-Q@
M6P(A$XqhUG#D"bFSpkVXReFHE`&,&QSI3iI#ci,H4`$2h*-%`FNXU1YPVeIjU&(
a!Y,4YCG'61VE"klc#iPji*cUE,S,'MKCR(Uj-dA*,4E8!2i8"'MM3[hGG$NKU5m
paKb1M!Ec4I"HHGl0$q1PKK*hb`i$T&-pjTdQc@V)bq+@@0DT8JLj(kI1N!!M+Ea
,RDD"IPbZGp"jQiF*8AS5f4X2KClP"6G&q25Gj0j4mUDiUJV(Ei1C0Pr9MRq&@8+
$qSX@eqhAVG`VL9*B'Z3d5GVV8DQ&b'qUCJfMl5'1YQiQPZUe[`dX8`"GReT[j$c
V1f`T2a,lj-e'CaMRV8Li#Bl`h+X#9FIZJQ6E$%U5!b%kF#3S"kRK!6M@&l'VkU6
Ger$+L65,MJ084X3lkREZB"R9)&3eh*MUlP0%GNam&RZM@@p@e**bpX$H8c#[Xj5
VfBbY)cel"C1jRbk%R0`-SD3*+2ERc(e59$P"Rr0rYS0kH&!RE,`PND,SZ&DJ2kf
FK-)AESYK%cU[SfdhmF1B`1)m+[NSDa3%9ZqQ)b@HDSeaFN1N[HS"[I$2&$)"[*b
N8`XEm!L&eMNXAbMM2!K35+r'h!6kjN"G9&2ff(8Je$$$hfRqpQT-kb&Y!a9M-jM
%AZ0NekU21iriFP'$"MG5qFFT!YPrI'LqiIRFcMqqS60N6c,d&*iEG`2d[GBKE'(
McdRjiPp)RE,pfEa2hYXYJSKNd'3mpqLB@jJB$Gr*Q"lGr@k+%q+LmZ)EF6(4C,q
k"!SE2D60IHM'P4c!)d'i4l!'8A@UH-LRFN,+(j5[GZq*aT4-8hP"1JUcq6DE(Sf
*e8LRqPqSM#"&'9VB$qD#ml`*0d"5!FAX0%&h@rGf&8KfI2phh'KAf")5`*-DVVC
),Uq%SZJ5ImB%l(AN8&GT6pL`5Fr&Ai,$h*S%6-4jmpQXXPcqk*I-(0+p5-(4`Le
JP6m[q'a)AK3&0R9[cK#fN4Rm-T,RR-C2hV+[L9i)#2lY,q@NlrHSke#BR1DA`cE
pc)I!b6KaYm`K4mi$-R16@Ei+CHa[9*L28a#UVGB""URN&qB@cq`HmHB'irV9hR%
cr@`Tmpa6TkjS[P5d$5hJKjKlIb!l$EeZE[h46C8P(YQe,B0cb0HqKAjE68C)m05
M`$chb530dD0Nj*-+cU%+1!C-83%$AEPmrfkTq+rm$hEfGPkXc#XF-+)FMZCdC(a
$Z*T'j&*)C2pMQeTC`AAbiUm!VQCa-YmQEkDU1M$q%@01c9!6m#4%KmG4l0@0,JS
QU!Q@CmQ(cp"CFAUaBBArQ+kkHZCIR1)YVDcJ2iU$eRZ*e5jG%-36k%ci(&mlN!$
QF8!P`p9fb4"hfbTmi[V0XRBR32TRp8(M+![rV['rTb&k9SR8C2+ZShGiLVAAN4@
Y3IhR$a1m&44ZlC`A"qkAYQG$*1DhiS)"3)4#1jr@Ue4kLbe&Ym@5FJNhX4$VFE'
[e[6DUdR$e`!b!LU(6&r-jf&`XKkSi8)TNGR0T[(1)M6cVHdV50&d%H$ZL2jC2!L
DAAEH1*+KbPKlPJX-H(EbpEIEH&`CMF1@2bNjiN5+82!%HECb2QXPV(BVjr@a$$$
)F$Hd(-h,VE+d4iQCdN6JBNq6Pqf&@(CB@%C'm5b5kEL3!%`21+F#!Pp1%lHL+df
mU9Y(EffZbGYFpZ2M&XB"9aZFEBejilNZHcG+!KS-T5dm@X)P,e4Z'8@@"dGCf`I
X0aNG3"IidS&hX9X0YEdSkGhU&)DLH#JEb*SB1#k[5Iq-%hG8Q46a3(H+#Md`aB2
$Bm-KGm-ENIPM"#V&eU[9TCID"DUUelij[fFT9Z'c'cIpql%F,kMFSqPdZ5K$4bq
ENMJiKH3H"$5Bc,rXCV#3!)'!'NrGYKG+aMSh-!B%rG`A3$RY8i0@EX*i[k"AlMQ
H'f&JY$ZKXTIeA8Va$4FFpl*$qM[kVkLkA99H%FhfElh$Nd,MGdSR)59N`3Q%`R9
1)6PSej0X#85T'$j'l-`fp(lL6[aJ0Qb!CYU+d#EC8!08ZM'iVTBKF-P%4GNGN[f
rAqhNEFZCQdNaUFaT6A"&l![J[%NE"I2brhA2lbN%3l89dm,YV+Be3'F5kfZFff#
d12`0b$U!1EpXJKYr9r1GL'J',4&(9TP2Gk!MEVP(Q2VPm%R!*1jpp$%c1a&J9PZ
'J`c!(U4r!bTeS6XM$Ea*(mmbRaq`m*&hfE'+TNNVcb!06hKS8%HiP-M4JEXSaQ9
jURC++5AhMEEhMMFBCh&3LX6D!LXHd$*ChZHN9jDe4`581L0&APIcAaiUSJpZecP
h,CZ0QShBYNKF"[JaaC)Kh9&15Bq@-Ca0-`h0cc&XApC*pb#`k40`ImJ*Uj8JTTJ
cFCZT0j9eFI(K#"01lcG1DG)9SlSk*448#U`mCfVD+[&Z&SXEAYbV%Hq1a",#l1'
PeRm#e"DSp`TbeV9TH83RNd#+`Udh%M[#d+GX&+GFL(#2cajS,CKq,K*1i0qi5M$
Ca80``P,98A8QIGrJ'TDdYja9[U$q"`&"ecSXD&Lc4pVk(9r)q*%Ur+@eE3V6bX'
c`+'CH$S")'H[$+H5MY%5,2MkX"`69[ae'$YNU'DD-m8aSCAbQmBh+'e2AhXA!rC
,TE'F$$Yd$[(2lIUHjK'NcR82eh"1[#RqL5Gb0Mb`cC8(65F@P6B+1$9PhdbTLKF
rc$R*X$S6LZX0-*5[hiDrCEG,-jRfN!!q$0bk@2NRN3jRfDDkKpj2j$2X1ZRJYiS
E@IYTBbbmjEFj-6P6j3Zbm('[0CP8J[f2Dh"9qCMG%`BjkpG)Kcd`,0)`[meD9cM
BNa[PV'Rb"9#mqe52@+eE%T6G@!DQm"&4&6,SKZ"4e5B8q$pN4dX$P52#$RZh,0A
cYa@3!'YJUmiE@-aQ[mC5hN0'$8kfKH%!MSkY6k[[V1FN3`HUfG*j)j5Y&Ul!pNP
N"fQEj9QIV3[E,YV@e0dZbelqS%Ua,mF(r&DaP-&Z08ki*c(@KURZL)Sc"PZQCD$
Fi6rqepXBhlGKlVEVH9(jebP'hN+ke36mEAGA&(VH0Qe8DHI1[c#!+UL(6e$`cH0
iYbYj%)Eb&rNiJUfeTp*m9`"IHXQY69h9h31C&#d!'(4IIf$%PV(4'$!e[4hKeD@
Z`DPLT0C01q4I5@rqiIKUQYZR*!2#Me3fYGEGiYSR3Z(!Hq(9--SDILT0,PJQ+)X
pNkmB-ljX+eKNq+%HZ6SQ,RVP)hE[`kbEp2aMl,M*N!")G&319mrfP$5(d+*LqZa
,!V'@K#64B6eHVJmBRFIZ1kI%e(%HBKN8,[X(58rV&leVhL[kkJUcA2ETZTGr6YT
2H,d&#,ThhAH+LL&82efU(B*eCIY!j-b("1lXfHhmkY)G&Z3aKlkLblQ)9kKpPQ)
DY(JqZYkKBFi%Y,@5mX[@jH+-!ji(c%pX26%kC@V`&JBlAV5iL0+L6(#ZLrZ'e5N
pBP3Jb'09M,i![8pMrBp,C6i@p2S0D2B,MTkJLrjU5MYP+I%1!l(Ik%Q3!2F`'YD
5!pa#llPEDM)J0Je,#2ifXb5*$MKf089#1IaFm6HU8(4jl)d9@@k5P[&BJS,(+hV
f0rXdmrb2e4B@h,bMFiBXKm4P)lLlkeJrNV2J+Q0Hd9Ch+[Z[Fr26$TQQRIUKlJQ
TAT[dN5I1"BV,E"4`1jUAY35P+P)3[kC*ePAX2CTJCj!!31am3cl[%#D9jbD)[0d
Ve*rRMlZVf[rRMJM4mH(JTJBDLD9Jk`Z(A-+p%@T%$4IJZ[ICNr%P,`)#$Ak*P0h
IiS`p9N[EGh,"&!PKCa`&4eR"LmTYA$aG2c-I+U4J9UNAf5+3!(jj$c,`h9*L*e)
Xb#6@4KQAI6IG"ANTHhJlNPkG#eLqhZ`m!8(C&YH8KcYhQDl2(LUr0,Krh)rdMV(
"9cDThMXZVR,BF$CmbEZGK$R"ief4IQ@mkjfY#UrS"XVYXiPac6F[[K#YhCAX8NP
c8)edZ0`kDK0('%DPjG'H+(-S$a*C"pEq1dpfC,*-mb%,%@RUfK+QJ)%mZ`(**eP
6a4!1"%0r-GiT*5!rk(M5G)BZpY#+2,E[,2dr-L4TVaF-1`krTNGiZILr`"$F-$`
06pQ#VVNK0[0AV'[-TqmUp5P!f+A["1mU+br6,Qlk4"2'XAGT2`,1(6pA"8$6TcD
(RF`kVaJ[Ed&pSE6V1pEQZf%d5qA[H5Nrm"aQ[b@Q%8"cdVV(5hBCbV)JqZUIpj2
X`TS9PV!L(E1l$MjK8EVZB"'[S33bmNcNVkSR'J%YM0i[)3&8AE#MZf%8[KhZ9Bd
*l#Uf+q$XJC,"IFCeY3"c8k0h@iZcc1$8q`HSb$mDUQ(8)[mPJhq1SZm!60RZ#8l
RFSE+N6P)h"V3&23q!3'c#&-INaPr&CreV0jUG6biq8$''Q-'-lcl15+CHmC93[M
G0H6055!r&'5F5l)KGE4CmJp&iK`j[LLcY4%fFheqCQa!QQcUG"q[f3L$5R@DcTN
D2,cYiPAK2%0kN6$%E''Mr)l6kX95h`p*XQ@ZK'Y$j6HTr8Mq-,0dIUcehK@"P1S
AS,9N%#p#bZ$V%56TpBqAQUP#K!)ciipMld,(kJ+N1-C[Rb83ci9K#j-d#Q--!&U
UE9FQR4m-M!lErDN*MBm,2b%5SNJ9drrkRhN"F(DHL[,NrDBa"2bZL+Cm&K&aFQl
Gf'd-B6TcTGCkl*BEQAjU(S`LLBk,be1P!R%fk3P#)!LYfbUC@bU1k0f2Eim+c(Y
3,em2%+9KAI3`0NiiR4i@XNJ9Xei(,[+2V)am[Z$L3DE@'c`eNijb`BmPhRhpF)9
BQSe8-PUbM$fq%X)Nl1&*ILQ4dI4Gc-L1jaIQ6mMdC)kihqme,Eq+K'e$dV`bRC3
Z&ppXMieR+B,Y@"j5EkL8*IqYK84"fJEQp%eS(@"%[3iJV$`GfES1ddZjqK!df5d
!PE#JPZ"Y%[dPR*MFDQqMdKrXrekP-9,1)q2BjF4[p4J3%`mjMRBPkRr21XH1V,K
-mI)IpT8S,rLqjPH@dS%)$)KDC"kZdkC%,3%58Ph+mmTk&jEN(b6c-fH430ajPG4
-ElPl(PhRm4!*da0YVXi4M+[4f9VY2B$FN3RK,BNXV0E%XR0HLIF&j)ZS+9q@1*C
a)2pT!(9qb!1Qq-(*MkCrB+Tj-"PS3kf$rN-FbRd0(MH"lYChrLj(5h1pJ'"4$S"
qeehE%XeRmk9QiQb'Z@r-8cfF*3+a`LVe'G4'R$dT0eBPj+-[LYLefm1'!(V[3!'
kY2NYdmQ0'Nh$[(QbN!#m8IdrE3J&%Tm"m9NML(BVX'Iqcq,r@-Ri"mEhkEEDih$
RZbYkN59d6X%CRiF9B@2kD*'SbVUS"a&Eq6eV()3CRQL-j'0A3DBJEbaGc6%b,!C
43Tb0(dG8%EI$SP#bP9c+&LJPNG,ZL$Hm&`mV'IC$-f6elKjA2[1b4VcHPbC(jNQ
bCQ'LFS%CQXJFFXFmpfI)L&b13XHZ#NQC8pj,eIS@C!E&1+UA-9*MEdVZPE"l-3a
)F!+X'ST$U!k([lCC)I5$NUcSlIq"E28B(-$cJUYlXQ3+d-I2N!#)3+mZ"mB'Uhp
%"fGl2p@!lP)"[#QRBA-36rj'r&3$))Z$[59-kD#P,hLlB9CSMZ"I`lCqrI0X1Kj
&P+caL4Kd50efM,%L#!-h1R'RfVi"6fVmT163hLr$L5SE+c9eQpMcj5("G#CY1-I
p8RaI0[V2(UX2a%BlJTcQ(Uh*[JB$dY(Q8Ib2req"M--",J'$05hqjF$%AAj&eI5
H"1VJ)5cl"h$H'fL23%i5*r@'I,dZlJ,6#(A%PhPA)3%[F%je+#5qD&#S9K6@"q'
-L'!Zq(DJY*miLi"9b*2J!A,q3QQa&FfqMIh+4N-U!&br43E'6,r@B9K0YJe%"3I
LUG$bKNL%N!!SNR0pHQP&2hCrTU4`CU"a$i)1HQd8C$ppi6Y-$#rqQ024kHpM9hG
h0b80cEqKE,cRV0[ZJrmb1iG1KrZrL+[Z&ra6HK*J0'KKF(%Cmk,+H2qM",'jKK2
5UjRGdp`4RrNN)Upb9K#R`)m,C*N+mbXN45aHFUAlV'eH1URm3S-&Y"(jiDi(5"C
5!Pb!r2-SaC'(0Ked99kJq$&'N!$l!%ZRZ(5E14A`TXNr*"5Q*IDa`JRJ3pY('Z1
$b2$&'N"d5[E"K1XIiqf&Z%Fi1SBic`SX8Hq9&4Eh6A-2eCh3$*ZEPB-m!T2$S$$
!Sjp[2qDNF)IXM$2[aRKCL0YqPQh8Zc@V!Ka1$ISK'XaFSB,j6M6N!b@[!j'5QS&
*eC`KKq44pIAa[RaG[Xj0&NN'RY(dSr9`1FXFBVJBFNX-FYG2D8FD&T5IVUl@q3V
c"())*T&)U!TeiN"0Q1["qI0hCf)m[0AfU#3k6YSK#ikd'`)2"MaeNATY$Jl"Jp&
L8"UilTRipdrma(klr4,b*MLmDYA[&LC#'iGhY[eLAH8iK1ESb1X5NTV&+-0F8lX
0aX5bml+J2r6i!ralG[EH0MZM*&D@U31B`Kd!N!"Haqb%Ij@R3J&dAU9a)S4Cl'8
iX@Jm&VP3T-GLS14,&HCq'9Gl`$QSbY!jF(Y1-B*LG`kQEea(NaQ*0d0lL!PlbQ[
)lS[UUiJP4i[RP'9[05Ub9qCmFja(-&p&*qR"hYj%NTYQ,Rl"3+h6lmHS9YlJ8Pf
$0'5X'DFZ4GQm#+bNi2%*!FeXi"$-Y6DB$qRTVeFPr+BBc5,fbJ9$p3`QTT`hQ-j
3Ph-4$I'(L%EI2Yql"B0fT'IL[l%lC)QA3Q98RZ3XP4@)4qLKFFVQ%mZAd-,K*"M
LRB8-HN'KlSS'$Q'FGDcLKKXQ@E[41$NfE0R1CYT)k0$@JCCJNkm@"p0U%RJ@q1d
i[k"3QRf2SCEkIJV,)5-#di%!Ik@'+&(-L0!H`6DJ'VJEMCUG-G$UBRR@dmIe,!k
0G)[ZMD(-apBNbY8pl#"m3jf%[GD@V+c`HSEDH3R(Q``Dma2BP#60'phdbpPj5CJ
fXa9ZRr65RjTb3)kki0N@3CX[@e[Mc'I(NXTD@-!TqANYrmY`qbJakBhd5E8A4fZ
,&"Q%FI+-8CMBm@%cd,fY'$pk62LNA!IkCrf*cA8(8f'CFmQ"##CB#%!RNUM*q93
3I138"RPAh!+HMSfILFSYIK8@kQ2e)kd,0(caD1cSiR2qjK)Y66L[@-&1V-fa8SJ
&D`h3D4$B($Eepl88pm8k&PI924I66l8Y*AaG5G&*5*L&eYM+QdN5$9-4ZX"-8U!
(edJSQP9F984@'lHlIHc--CSkP+I*-5bHG2kdDM86,qCP"Jbp#6$!YGSX1'3T%TH
LZ)23LiSHE&dJC&24pf),3qBQXh4(PrSAK),+IlM$*M84kHFhRH'jV,`jYB5%MfS
P-peLp2m-lmfqmc&542`Y8Imr3i@-i[V$bIHhdZD5H[EZ#dkAp!"V&G2Ahi9&-G+
H$$*2qk-mS"66*35659hYcpH[ae(Dj$)-dh53!"5i1"(SJ6$cd02cH+U8plK"3`V
,30UPN!#HKj!!IEV6m%`0LUGT+IE2pKBAHmC3%!cK%Rh8PV4Z-F!IFq(f*K$*+@)
&ZYd9m,$V[C)C$TmT!I-$56hp+K$T@`J*aq)P"F0DXb,qaj)#FPd1$ZGl8iE0([b
mJ1Le!JH2-I"%Ic5-Y85)1(P+R!,6FF&18TqMS`l[PUdI2d4CRk4f@BZ3!+9eCip
RN!$S8F,+Y226A&5j[$fqY!lSrmYGqeHBKJ-dlLCU,'A@kS@cJGP8%fBNJLajfS@
fQT)4eFeY1Gmh6VFAc6)#c2ZZkqU[Pj'bikP+a(Akq4Ef8#hQS8SG#(*9r)2kchr
F1,HA3j0U-ekhfljXhQPYJbC14aq&+q4Bemldm,4hd9p2B)@`$TjrD@ZY@m5863T
6'!0MZ9G%CP6d*@cQl1Y(Y$Ej-6YTr*`c%+R`U3@fe2HL+T&"4*)m8L[3J6,4V#@
"MdJa96%9CH',ERQcQKHqEF&c&-,P-Z00%"5T[kQfXXaJAGk")*'(@*pGS193`3a
PQ*a%e('@SJDZH@mDA*D1,VlJ1Z-Yq*NJ8YVFTV8MqV+6kGHcpT1B#*HC)24F2+r
kbiL+VmX`5ND(Php41c8XrZa-0l*bQ,U*1)8IlKj0iVi!G3`%+ATMK*Zb+USD1hr
'$ac*,8Qd3FDFjblCTTAerb95BbA5-%a64'c8!48A"I&5[rX$2HlE9@Ul(0D)"A*
0U2#6HTj!VB``)P[fq-N8,AJ%3SedA9h,e'jNmBEI5pQk2"[(Bf[#5mcGm6T#BMM
6PjrT6[eJ@5+jhMMLHIN[D9"i@''jH64m0p#eReNmqNQS51Q'kXq0-+Mmi[mrHC)
lSBd+K$ADp9qr"[X%DYTKc%*69b0TVK-Gd"2kF1-M'L*jZqb`HeJVJ,IYXq6[@Q*
lke1(%0PI!J`ha[jD$0ThZeE*kMNCA*UZM`fZEN`clS$P2*L`FM(BP5aV1E(*9KE
p5aCl6Ga&R',c$Zc1"HLIqpVYh2@DiPCZ)Vh#p[XL(K0iEE2D,2Z2%9#PiqCBJD`
U'apjq(p(BeIbLID)24@[%KL2`%Fd-5,iP0H`Kp6$LM0!CKUre[E@c(1`SrX`VB*
CPe4X)NR6i`#T-XE&a5kYKajFXA8#LfPC$X"T)D(2ZDc'NDJ59DEhKh`JdY0(JAY
%E,V+-HJ8$UEQ,Ek`1Ne6,b9II9YM,JF5TMV5el,J%!2ljGpQ@,jYhdH'%A`-+FB
S$$VRM6lLQehdqZm)""*2*#Y"haK4ii,f[IB!mK9&+)+$L039K3G&Y*85,9qaX!m
E'aR#h4dGqDS8#XMrPJCfDL(d%F6QIJcQ+a)1dZGfAeLqCYXI)'%)@K1%q$4[G+#
*TPfHLpl5#(XY(FkV"cEQ-HfmLCkXq8QNJDdHJ46YjU`Q$Di#a[fR'qD"h)U5hEp
YTPVI8plhDkrDa*`PJkq2"J9+92H!J,PSFr!-#9I,[`rq`@0U&'rmpT!!"PMT*)0
+MUIb!qj)mfl[K9eqNdNrI2,Z-0Z9HiU850(U`!iLUm1SNKZQ&RhK8dmVTQ6d0bq
Jq&G0JP"Ll9Z6id$fDdEKVlj+`KfLb`5LPr@lf1)`+Ia"Tib-j9!,ZaRN9,FrVHb
@@GdXJ)6i&h'*-S3BVa"8(hm*Hq[Rc`rJIbiiSiGH6-Lj`$RRdMGYjAH%1im"F34
ZrK(CQ6GUCE-U-Qm&)LmZk@ZIq(Ai8G[6(-daX&!eeNEID#&"NqkcfkiU5`L[RHq
$AG,Qm5A!"S4)$f`YbEk)cR`K5)c8DX6-2`kA3JE["QKLhTb#HG)"Gh9IFfI@E!P
'5*hIc2L@d)*EZ2+rqp4VAP`NRG,20HU'hCEXcecAbakE6leY%UNm%V`VY`YhkV+
Hb)8AlLfhMCe8`I&2bBF)P@*+*aj)2-#8MMChAUkpkjLQ6mR[lG#$r+F9-cT4@8Q
,p2fZiRXPDkHCfIQ&*fJMipmDfk4fYShPLX[-+YX+FSS9DTZq!aK6HP*0q88!Hdq
$cY'JSL`T@mFl[U&UTj(BNSZP[)mNm+@3"!%!!%-!%,Id,H1hp#hM!!"[,!!!fH%
!N!21!"12LJ!+qL-!!#*f!*!%$`"8Bfa-D@*bBA*TCA-Zci!ZH'eX!!!%L94&@&4
$9dP&!3$rN!3!N!U!!*!%"1#h3X(8i`X1XY)XQAPe1*8'3LX8N@%VJE#HlR3YPIM
BA!e`-$PaD(IKceTDI0&M1+Fm2Bld)49Shl#fp'``AX8cqXa&3B'qKiIlq6f*9P%
8k"YJX'A,X8rcbPq3!0QmFA0-$C!!%aHm*5emYD5KZj*R%a3GL#mpc3"$9P))P*h
9@Qb`!URffhcp9c!9f$PE@XQ-*$L)MS)irkUr@5MHFI0@)Yp*d9(d5$6(Q!X#Kdc
UaGE`Sr$qbZ'Ml@`b!3G!%rRc'pNiB9B`63(%la4qJmV$2#BQ(r%'#iX$K$6Td"A
Uc*4,@6&2B[D2E0d'4$IY6+,kGVFh9@8ZCE%1T3@NT1bijrXk3J4PLhrfS!C0H&!
(&!4K6,"UPGE`ZGVaZC`X",chkHiEihk4Fj+Q(ArN0eKH'NdikDBpZFI$"8!r1L#
HXP4Gq&`8Y"[q9CraZKr'N5YSU,2f*di)5Q)31c8a,p[!%HDQ2E39MR2j1CT'`)[
#`b-9E)rlh-McakAhlfSkXmT348X!KkLaCJ0P))%RBp0G0"$MNd0Z3QqfL+1VF,9
``"E`5SCihq#K1bhXl&CTjEf&5X*A[)+N0pdm0jcVm*!!4jGj)5kjQj*[&R6EV4a
amC`AIC'p5@r#6[UE*X`q40"H*mM@am#XLU#%SM5CVmZB"HV)11bdYUJUhF`4CK*
Kpl(-pJHF[(N,Hk!JjK98Z5fkBiII#*`cSX#G@0,MrGr38Q5IC"RN"hS58EkA4Dp
iKM&fM@4*$fJB",*aB!+@9fa$DYE4JZ6mUQ6f1T'idXZld`+C*pqFE`USU,LL,R,
5*-'M9`,C!XMl1("!)AlRdb-Z#JaK6ld)J5#q03V25ICj)1el$C3D+ekJ3EU$NHK
mLM0aZa3#N3U@'!B-,9VVll%X[i@,TccTchfCe"!QZhS@0&ZeLaSc+KFm#!3,RhH
Z#rIYSEfi&LZXDHKl+3(E0AJZ9!9*88*2f+"3q`6L`Aaa'HHmTG4!@%lcLh+DRLk
0ZpX'))pU[*d(jDR+)Cc6D0L#3H)(q-",k0Tc0!lae!`iUNd`Tq65!RIC$)5Je%5
0ra4Y+6KJ8`LE%Qb@'U-A@A##YE@SD[BCBr)+B[YAf0TN#kMfakdfir(fMSm5)"F
!)+EfFAd0%kLeBhh)q[S3-cqNLr[3RaM)SBeE8SDbUMQ64-#4QF+Aq)&*jV%9Hd6
F@U`rZJ9a6r"dYm#Y)NM9'Te3'Uj,PRVRh$k!5EBYAX8i#aIA9,SMSH98(ai"SiG
m1kEc+qRbSRAQaGS0&K(@`1a8b4ID2@%-dSG*6iNcVVM!C)dFSIl4"AEDahBN(5'
9LAIT&Z'Hcdqh`4%V0m%mIr&B"$FUIbPH-$-*4lbH(8l+HS)),3$"2+)k&J1)A2D
jL`j#8dqJZ(J'#N9Ck)li5Rd[*FMT94[R'q0(rVM'GXe[ac#5YK*T24ZkI4Z0VpQ
3!!Z'BfhCN3K36PK0Jf+P@ih+45Fb%@4q[ihfLVm%Xhq6N!!IBdFZq6ESUE8Z'05
k#H-$&pN5q$8GVpFV"*3UX5-X0cK&l@Ikd2EN9)PaH!(U-(XPK[-C!+$*hIhF98`
qGTfe35LamMH(`HLbS23G#pD6qAi5CVVb-6EaITh@eK9c1Sq&9eANE0qE8J[,[Fr
3hK9iY3#c,GGpqT`8D@cJH8A8h3p%(BcehcELT#DUdc6lbRiZhTLDa+68Md2J"`!
YjH0K3Pp0#U-G&@TZASIAp#C#6CjRMfT`)lk$T21R`+2F@c$X*X)4UbNM%16%3"&
(40C(ZAM1`BH9f4!`2$d(3A!6`p!Br$!kpHr&hDLFPJcLhlpG(*G+%95jp&hTY@X
GeSP4,&+62E0SmqSqPMDG%D9k02Lk145EaIi(lhJ0IK8pMVD)[M[l+R,)9#iJ[18
d#,pN#"@HU*54Y(K+Ml9$e992DL0+05[H0!HPf2`hX%rMG)hADB)!N!$K4k@r0@R
D30,'K45AiS)MZM0ZlZeGk2V+3)fYCbrai*S6`m#ipC1!iG8rZ#Ya`D[125j5-SP
N'1SE5V**P6A%@QFd"1*65Gpk)QC0$l&qQ&N(X+(0B-,aeCE$5`FNGX98!fG%!FP
M9GMIPA2@SPS+++c%MLN6@d3hKkBPrKJb"Pi3r0cGqH(%*S9#60F0-@IjEfX-)JF
,a`,H#jUY9j!!bp9"ViCHiYNGL[@)0&2iF65P(VQ0Z&Y$1q)+*LQZ2ri#1GTBQ&I
qC3NIB$J1jN-AX'9T&JA'SeC[9k&N-GKb`P1YThf,cm8IRl0Y(6$SY'db"IJHi9M
mJYeCr$XSbe$%K3Xr,)VYQ#F&hQR""BMrcd`dJJ#4PhG"AV`qdC!!98Ac@X0+BF"
C@[@jX@rC,#c5SYDq[q(QGVb3!$3ZZdI%Y4k*&ND@A[@fiFaV*MpQeIIGddBL2Na
pJ2+I8!"ZHT'c#pQFACDi`HU"3MYPVXqD$If+09I4LI[2`MkaMA`hieAi#aNUY[K
8IQJ)cKJPH8)S%bZ89m`M3Ar2&DF-Kp(CDl"A-@@FAIMPq"RN[3A@%T*mbrUD-mb
L#)Hpm3ApSkCDAT2'KUh&QIaZ[S&PNSq11Qe6p8)V'F-Fr$hI#Vb1aTj"I2SqPr2
c#k(VY,e(I(-b!e)-C6&5r8JpUYa9R#8pi59kZ9Lp*d"4T3$"Ubh!jh&9!%h(IdY
Q,cB0%"%cqjmdb!Y*3)+4)NERmr83K#dRK2eL2J+-Fm#V&G,(K3Md5meTp5dcd&T
XPhecb1S,U9KQM!+D[#2lbPRBEFrD$E9X#0KZMVk*)1KJHKMm+bP!,0J![9dM%D#
(DSd$'c+$ZHZ!5)j3a#AeUM&Ae*MdlN-ra1r-4')Ta15A$G6,#X@,i9QPSGRHGQF
1id`p-BD'GE'6bX1E6prHUkXpU'UcJ*%-*qJ`bmY[Aae2-VjGbXNYqC(UI[p[3Qd
6e[mDkJTEa`J8LJ2e#G+$dG2U**[!YRj*F`j,25HTK)qjB+!K!mErmB1`(b3+A0S
Bp9a[8!ISc4jY5%*IIbA[!P[VS%"2@pJ'c+I,Tp)YTkdJJ`r"mQiN),fVJ""Tj6,
&IL%Z"%,1eb8dTILP8S`-ebJGV5kj006a'Hp[-#9eA(9+'SEU63hAfLC&q%0Pq!f
e'eaY*C%1Z`aa8jcJ4H9HSqHB!+i1K6ABNq-qI"l%fNdb0#paemd&9jBBF3plG[A
Z,bG%DphKD2mMX&jp9+d1G`%mkl0M&aSLi`-V`I'US+mL#3+2V@e3,$FAQ!BY8aE
fa,qEpd[J8aLVjbXYadjLqT14eAelDMdd"6D3!1GJ'`!YZZY,bYBY'((BD`D-d-l
DQ'4&FXZDNA#l'MTJrb06eV%Q%SK&q@QS"N%FE!(M*mJNj!AH!Y34XRAhmb86M[a
bF,&$,ATd48))P218S*NdPr"HZVI11lFI"(C3r[Pr,%+X#P43*e)39YCJkHm+Uj1
0+qGc,cE5528f8Q3UE*,!',TdaZ"UQUk'hD2[S6Sd["d(@r4+"%PU4UXj,h0"1iF
AH`16-jGAC[c)DCHl0LC!`J0iT9U#Z2%b-Vr20#1[`qQX,H3r&pU"bclG#YmTq0H
Ym#Nr4*'[+NC61eb-B`YA01M!CBG`5S&#-mYH0N-ZCYC$5)T8**!!f,$$MrajG@*
(1hSPm6XXBe`8lP1#2+C,RhK+TSYTLP#U$KZRaJ1YPR-DTmGU$%HQBS&FM&+dcJN
*Afai9dL42CThF2E'RAd!SSbq`LY9)6,@QcZ4(G8"9[NcVLY",cKcIJeDl1YFaHP
#%kG"*8BrR'A2VS#83!RJ),j8A`b3!'er#($ia)RDSM[hpJ&R!XJh19EN&-#c3FV
@2fB*b0-9#if1VrBC8FXmf-q$2-eBk1fTS!#r6j-Vdaa40jlT1I2c%MHcMipTBeE
bcX%ZJ62RVRA%mfeklZ(mCQBhJXS55!m9*`NV#(QYqrl''143apbBXYiJ&CB&N!"
!i@rBmM$5U(edm-%#ZG(E"@8$30+F4DX'4a%D'L83-YdJc+A@5#,)iNR[YM+0Lh'
LYV$TC,`IFLA(0)84e$eA5J%Rm(0S6)r!Ie#%-hLHRjjRi9ejXDfdLPI+j63r5KB
N6F$HHHd%H5ZFfE$049@f*SMI"1ir[!#@A$U01,keTQ"TP!h!!Il)0-L')8JLB)6
&p8cbmCqMqZ9rHE9hBA%ITT*HRa##'R%562#N5dpP0aA9pU-!G*lf2HaD9jT@dLk
AbR3b6CIVcYCDAbEJZ4@f)%#a4lV%S%V8&(VT2PQmIV%jPbk1C[bj54GlrKbEGYA
[-*pEB'A0fj5"TNP2qC()m0h!UKTc)BCj+#rA$"3T$@88-8pJ-1lBYL11A!cUXS[
88S%pTN`mcG6*$)j*K&f*,Gl*G`5!-8aIm@L%DE`3h!K(L6I4Y9P[j"kaddf-Jc6
X20$"Pc*dck61NhhmLVEBNiJB!DChV1&KI+2Z+5B32@LIXT30kC8(SUfbq(IkFGB
UT$(X92l9C)Gpl6!Hm-Pm"qP[Z*i`D6PC'c$8hQ`CC@8@L#VqJ+N*!S%IUa5+1!!
U1+d6pkd1)FUK5*T)V+)B6lQ!5XD[J*U,Sp)-fH+a$R9bG#0XbKjCTXjiQ2h*+TR
ch0U)d8j[-+MHNTaXhf!j!L!45&jC,mh0mrb2HA4a-dENENN*V)HRVaD%#AAp4G2
CUXYK8aKhPk[a8fkhppXDEbLbG([$D%'0Ia$h6e%Rpb56Ni%p,RmCKBb8$4daP[e
FLL"VFUE*Fqj6TV&d4UbX@d[G@K6-NpSe,YL!q3Bk-&UMKVkF-m#A$`1aaGM`$dZ
2iUp1N5K4YRUe2'j)+hL#3"144`F3jHq&C"m3CB2hBQ9ZJHQ8QKfHHP0USj@(1+N
G@`m*@(%U$TVG2H4a84"iAZC'i%k'-k0V3YdQ'd`0mJ(i+46Zc6+L*C8QX%KV[hl
BRZ`6K0[-eF"3Fc!J063r$Q4(m6qNk-1cd&(1Qkb""G"kMj[Cc-M#TI5`L6kl-9(
Ee-RK85G(+SV@pUq1cj!!"5ij%Pd+ddILJG`qNN[N`aM2IK!eVm(VXF'hjhL0)+l
S3LU'BeHmBrKCI%'YifKQr"JeSH#l%"P0DQcB-Th2ljB,(64S3qH6Ich*)maiDK2
hVi!'TUEfF&9JaEKj'&Gq2AAUcpXljV&(,acR$#fM&9,XQ0k)!q%k*JZUNJ*NapA
KBB+#RM04Pi*2P(1#kh'Sq#2qqNj84HBpqkN)h)6a4G#kN8f$NTFk8Qh!"SJKA-'
Z`9fm$H%9ZXGH$Mm"p0l`#'6&[cj"SA0+HB9rN`J%GCmqZ*ZLKE5@rH8@UVYH!%-
93Q&0jeY-bB2p5S05'"a"q3MjaL1mSjKS-HYrFIpPBLN`cCBS`R@E6@$MdJBe@cp
eXGJpaD1R)5Hj$c3S!1ffcYS43kU43fJIPBQ209k(!hahaa'qArcXadDaIMV[T5*
@6$$FG[f(pm-i#!H!Zk0A(%Z1'J'dM2pHf#!Q')5*f#F`JclM,Z*DrUpP5)b0"*9
FHemUYJRaY&VIZc[Z881-#B6'+Di,)R+`ep,(6#rdK4G3A)aBH*NhhF0iQ`KLA9M
[-$I$EEJT$NV%9Z8VY!53!&,C`BI[rape9E!J"J&&TFF%lZVe*8'kh6!HHmBai'd
+aCVlp$4MKQ8"I+bQr%lNBIfFHa'%H'fRr9Y8kqmjVaFL-D)[(!,&E4)kLcq3!1L
3!'#6Ca5q-+R2RSI00"*9B8',$"Ce(mdPk9!JL0SD!bl#b'H*,mUb%LFd&N!UVdq
XM+eB+B&+hmK8#mQ+)@a*"8Zh&k*pP%K*!Q9Y9GSKY%9L`mBM+FK$IV+r[VQ63LB
BM-6IkCMNd@kDeif*JmkqiiX3@*&f[MPq)RhkB,,5XjE0TQ(5#56fC@4A2j+Ga9d
GeYj!JjGhYm*f`I%d#Gb80FKB#rCrZ#0IIiX")eq,18Zp-T,8#E!H`&C1fq)UVq6
D3AEZ9Df451m),G)(UE-B5*dj@3)JriCL6Fl,f`pa%cT#0@N63UC6Qm"G6Id!'5j
E''qUlG$$q&X(f'!D+i%[#r(Q(Rb%)$'6Fa[cCH6FbpCpcD-MCl#`3lHC@&CD2'G
6Z,&+VD3ph!qmT$Phh+Tfr#[ECB*LHHSV[EkHmJIPV1E#`PEUB%HjGdM8Ff%I!*Y
51bTfHaeQQ&l*jUaV8dNZa!%rNCP*SdhBPl3ABD)8&-N0Y@3NR+K%+k4rC3HC!Rd
%62-P'`')RQ@'0'46X@VVl2S2')%(-Q4SPXE&'9S*E0UqUp@e82%S*KUhD&(1R9F
qYeK#m%4m3hKm$Z`J+ieeVMVH#f08+TZ8pPN4c0YG6+f)G`m$E$qhK-E+4UA0-SB
d*$j%-dMd#24GJL8A)3I'Jb$V+BTqZM$'Z&8-CS[2c+,XQ0apFH845Qr$4YVT'('
,`EAF*UYh"rMh+Ih)ZB"QrhqcP*Z[r85UVkhibGV#DK#+'TZ`Gre`bFI1bCE0,H2
j@eP-Pr6ZX&6`8e!!*N@mr`V9SQX&C)B`(0P[+P%9Kl1eb6#bm1%a38$'cTYLX$Q
54%qqd"['YFlLh"eFlfSG$'JY*2lTJ!J+*R0M!k#hJ$[!*mN@3eV-J8Llccdr,aN
@pCje@EbeZ&NXmlMdB&q"d`0Dh1$Yd0YL!Sj90@S#-bimUkmLH8)0l6p2qiH,1TD
[)XljjGjH["'9$@T8-UR`Jfbh0*J2(Rdip'5!ANQP04Y)*ecASK&6he'h@*R1k60
)rD&SHe`bkD3(q$(ra2*5*$c6l@KMAQCCAFY2`16LfVk4jmIhRRM0rh(a9ES%FAT
0mZ16K2YSGQ5*ISe3*'12VBe4X&0+4Dj5+rUFXh'lGN'$F5CSK-U+PRBc'@!F4Lk
M'P)%*D(iY2rA@UVVq-LB[$)eh6&4[2'AL,AE6E6AZF6XG$X@fhBD$cA*P2(bZ,J
IQRMTlZU3!!(I0QKU8)$C-*af03i0NPSaEe[ZKp-GUB5`XH$5bY9qlc&[58,L"aG
23aM2D5fN5me(jrQ$RT4@%T!!2KP&*diaYB!+PUi,1HZ'rd&EDF`#BX#lb*+bK6Y
c[$*V(SAPNMMK6P4(8AVTBK34!%XYT[8pZ)R0KHi0)9"QiQKkDRPLehGM-8l8q(,
Tppp"f!$1p4dfVhQ0b0([qNJ-[E@j)pR1I[Vl[%i@ZPq&jQ%8!KZC6+C24clfTS)
e9UD$VEYpLBEYc51p[ffGMS3$8"i+%b"TQIPXf,2j%ZZ''AC`'2YC&K+pXB(CN!#
BA`K)G+q&H(mLd&hJke1&1HYaN!!h0F'2MKdb,XkU9hY+l1MRV"rqk9JM54Ekd@k
e()B(bBi8-ATZ4)-)ipBE@BPAb3$ErjUFXZk@L(VZUqUIe42pC)M(XTYaB5ilU,#
UjL4V`TTI$4m&%DP#UF1DAiH!#08pm)kApL'T[UVLbbXZ$K6h)mU!IB33D*5[UqP
6AEHd#lV9K@-MABHjaaL5f6['GH&C#TR0M8C2TEC0CBEQ6"2AhF4prdp305q#[#2
Aeb*ce)+F'S2'F*EqNQipCA45a%!&V"8e"+(%eq&`!Yea"&Tb!bVBm*lKLFQU6qX
BH,IPZK,9VK(XUIUm,U!JeG)5!6XKQE#XjJa3Hm$h0d+5fZ#mABMXp8q%8Z[3r9a
*[9Pm*HYY)$%V!VH8Ed-qT(5jmI"S"@VJbYhlU)HTFe8#cX[ja"'5GT!!X@KB1,R
ShCra%d5Np5Q#)F3[SamVJTcA8b'[KbdBjV2HdNQD!KmNDi2#f2VVFr1rN!!b)0L
SerY!ec&Z1fGU!CEaAr'YE-kAE`jl%-jB1%0#Uf&cKF@ikDMV(XiI(Jq)Gm!Aj`R
HIKX,J`'S8qELr2cX2B82+Q)ZbLDBH(i+F5Pca9fDM"0HAZYB@4cD@CJG#4)dSiL
kU,0%p%YRMIEep61`[B,J*VYmDeXUH&c-PNNdkYlZD#$ejDPL`L,8LmXpecRD6m*
r00IVf3SmC9GQ3N`Ha&3C6JS(6&%$di#S(rZd$1G'dMk4BbPffI-a'AB'jPV3beM
eUD8RV&4Q3T8XK+3$N!$9+Y)k-pc#ZLG'"QLee&,m)bi(G--SZHRKbA4d+K%GNHM
Z6G+TbQ`6QYBZFk!Zl20ajI6T0R%MMUlNlKIVJP*STHHEc6MhKENdQkQY'dN*'Z6
D'&r-cq`dC@$'[-h+DrCPc@*@Ga[T3US"!Cb4b02SBr[LS62kKaEN`@eRfSABVTV
VeUIPRik&@K0S)ZGlUJ45`VdXjb0C"eP[!c+XM,Pe-p5q"pqjF,*Pl!SUbZhrehR
dIX2EkDCj@DSK["69PdHLjN#H&CP@Ii-TMbA$chYP))E#I%mZmS*'R-B4V$&,`0p
JKbD-1#CL91hX5M+Me0r`5F-miYh"k@'$"G9H"AH)*+GGm0ahm%kh)4aeppkaU'2
25NC6'L'3!+LU$[R5c65,$E`#`AFQ5*NhI%%!VfZmEUb,$FeVrj)Ke0aHDlVa+!D
9mqABL3CDUZ[mFHkP,jJr5kj'JH'G3BR$ALfejdF!(NB3plGf(,XpmqU)hp0Nq1X
l&akFGNbb@eA0,heXdUmM'XY`Zc$#SP2h[Pm4LkVi+h,1JC@V46KPCj%)(!!,YE,
dGRPkd`a1lS5CB&)d3-dPQCG8a0+HZIJ+01`&hFJ&%ZX2-D#YTV0d&''SfhMcr@*
ST,E6qpABKD8i5#mS`aFjl@-$PcA8Il)FRGd6ASA(61BbThB(kbih44(%8@pqX5k
#lpI5`TF'l"C4'4pTlLFhjSQkqIQ@B96(2r`"9jT!$5G,`L1blSGqD"[BKX8id$h
LZU5EE(DDDM)%E$KLX6h@rXP'8V-K43QYhqd&2jHD#"ArIp6pqCU2SQQS*(Qh,p[
Vq!ebLTZ+LIX)XS@4b(ZSfEGKm,YA"fK-A,`)TLj6rjU@GeSX@TlpG2lrUZ%kq"F
j5bXXCCe9MYFqZ6PjhLR3i*AimX6FlD8+)TSKUK!LG9XlLeMHN!$6!T[VNic3V!q
b@h29r14j'@5"'Q0E'QScVbfE6C8X#NfkY401L,%*8j0[B[mIdeISXrK[2P-jq*j
bA!I@JfaFc5G+XjcFbKI5kprE3qmZ+`j2XfE2"R0bdD&mapACb#Qpq$("6DKbZHV
i-TrY`&V(1hZ`!4h4AldA6R0(VeN"EL3)#IRJ)VNd-i53!(#[9LbRllCmr*HkXL'
TSrlGVrQIZ`AEEiT"6#cGD8-VU-mJeCXBEcG+mVB62mZmBeMR5YCF9L5A53F0!&R
U,U2aZr(Y1TY4pI5`9X-DXI&5fITrPE'61T!!$+aT5J&cQ"JXNcYah'0m#YQeVS8
pZIZhE%'U41kM2jiYL*0'N`d($b&86j6&,XML!*N(90*VlR"DA,LSc`9icN6*5Bf
F+MaR+"TMFS0hSkeJ%aIr%1KbqGQAh(J@iA86R5K'ar+)GaHX,lTVdlS%LJ0$L0T
BUJ4eJb&`KKem3amZJ1I$YbdM9#3Tr8qhh+YQV$TRU*`H9VJ[Ndb%X#[CcB%9XrT
PcNiE!cKZFB`k9YP(rIJIhVA%+jrU!$1mlQcYBjh*eIc&6hYXL"Zj29l&@SBPdl(
)1E(dKe(JrG-3`BA#4T[kPhqplK[4G5(Llh2[d@)X)6aIc*j@[,IK#IIZf@*RNNK
1If'ZEQb8%iYChYTCX[*b3e[HQDQP!S(Y@Y!ZK,F-p6e3B8$`AXKM6%63hQ,1Zil
3!$PhJ,L#H+J%J!Z5c%*AL*!!feGJBqF-%fd"$GJ4&EAjfG"Zlm6-d%DG[(imHp'
4pFK*iaIl"m"QJYp9k!rL"U&Rf,h+-f8B"dXZ2e84`&(BNAq-JfN)1`&Gb5%fr%S
$rm1'K-J)`ml&dY8U*e#5IpEZUr(Fm#"a1eZK,qEm#+DmiEh#Xielm(X'F0B!lbL
'fBVFVNZ9NJ9")kM(&CJ3%9VR[8HH[Cp[Fp-#)EPPkUF@BmPj31qc@4qr0KYaQcU
a!Q!T#Ir(dJ2X9k&ZHKb(Vd@I#Tca$a)3aj!!cF+QCJ$+pR#aJVTCej9"LVH3!)k
f4`U6dZRFL9C%D123pf2iUSS1qQIJLpF#!@[%ib$"p%flKiYQN!"5kh@D*p,G22R
Db@'f!c@K3q,PF5BRSk'qfJ9@BJ12MmiIVhS%NbI@LT[pZ0J6C5`1djD4fBM,6U6
,eqZ`VdKbiX)JfU[%NY(5RhRf,PVMp[mard-%6V5(Yb223EP#@6R6RaA9&&`2`"V
CN4Nb4qZ,R"j(NaZ(L5AVrfj&[J1"T1dN,NAD(0(Mk*l'#98Xb+jA**[`F(d*X((
**c'kER#@mkq@U9Z[L48%b%&)9f)UV,Y&K"5MQ$6ZJ'`rRVrNh#jEYDr`RRT4(SI
1MLK'61qlqP()G"32CVQPX)l'TKP0$TLTS0GAm2r8U(1VTqHJC&Sc8NB,GkD'&H,
6@6*5f#YpK1jc0ei-e@S!8hb1@26!UIcC!R#DKL8-,i&Vf)0HY)C2)LlX+1)IUGr
lPX"QKYc"8YXf#)58BljQMAiMM8dH+S@i,,6c9*PaRa0SK+r`,RR83Cap#C!!f"G
4QdV+UM5501R+RMSE4,i1qq#pV'H+0(e8)9&NAke0N!$GX[[S*H68i0E2-P-h*+H
,#aD[H-"QI`[(X@89biq%)(-'XF3D&RJJa%&SQhqbHp*qa68(9Ua``0$4h@2aP63
ldD,AV+0,DcZ!%`jr2l"eAF'Iq5$q2IXkqi+S$-(JJ-AEC)qc[D33f4-M`rj)dB1
F$dkQLV[L+MU0Z4M#eBlY+T3iQp&HUYq'1PmkLiTDapS)9`h4"Q%dPHiN1Ueb-3b
dN!$+9)#dT-GYpeSA1*L`CT!!cp&IIkHR(ZBXT+cVNGa52M[)+Z0NhDV'S*UmQYb
AF2#RX+Sf*bLh3$S8j4RHZ%[84*c)@S8'[c[Q8[4GVDQ-YqCGH"ll-c+$5+QcAQ5
9e3F8F5jY-S!m[LS*kNXCe,5$Vfp,a&iDe(pk$L[fb4H'FQe$$c)!#%mffYSdH+B
c5iNplGb%pJH65c,%YId`(f,9d1rehiFIQb-JZaVRJ$"*8mfl)$Q)YcEI$V48ZJC
%k005qV[mE+,0-E6'R8,@C-KU#qU6@9&UG"EHfG+,@DfZlrr9Cb+KI0d,`Nq&%5p
[RcC1'5UjUI4lT5LL"J,[p26B%AT0KU!Sj[AAEip!M"9P,VAih1L@,1RiAbRiQR1
XH*J,q4`2@0r$TaeEJi",J0mbNXLef$X'EjSD[PDe'N@lKQd6(`eQ,-fC-e-A6K+
TM69k6T!!iLX2GpLi(A8`3MBK0VBd11+JDAjkM*YaC,BHhNqRII"N'RhU4Sh&1kY
$FXfrPb)Y+b`XbY!j+%3aqj5MePJV1dDh'9QV@NJh5S1$8S@&'BLC)dK3bpP&80k
iK,#4r,&Q&I$b(qYLA4N%9RL48p2i"3NXCTNBp+*X1a0qZfXF0mF-jHhd9+eVaD(
DK-CDQBZF!a,eVa3aRr2JiR`fr,6dN!"Lp+lkf(8,P[8qE$X*[Lpr6(d[b"0'lqd
#`$A`Aie+!6,#cpFDpcd1IfAI)ZhLDGU%ZUY,BDS0-l#Ge'$LS%qXmZr*98cV$$c
)26$!X1RXh4NUl)8Ih%&lB)T%e&Z8dhm04L$Pef$b`08dY@)86(K[a[*+P%aVGhr
@S[(4')kG49'5e,38GXZbA[r(B,4[jQ4eFak9pk3G2amb8H)JrDYZNaN#5FEm@Y#
q$Y5'M10R)j-1,X&DJqJ09$A+"a@1hiGh26XHV'![h&Ce(#440T@MY'0mAYF&cXM
H-[1l8#BQkN13!*X&fD#RHSA(+*YqQ-8Ea$RZ%d`[c`G$c,aG&C*Pk''V+XVVP3%
,@Z-IrSlK*4e'NT9C"I!lc,,A2e(A[ZNBcD!ahTHS0c*j2D!dh3&8)mP)bBUr)X#
PN!3"!!!m!!#dSF5TYr2HH!!!Y`3!!3bQ!*!$cJ!-2TS!""l(!!!bC3#3"!m!9'0
X8fKPE'ac,Xq!!!#(`de08(*$9dP&!3$rN!3!N!U!!*!(3X(9%"mL4REP""484kY
ZHPm56hBYYdbBCd446H$m4$3&`rdrSm)J4(FP`kik-X`,6IQqC-f,EKPYQJLbe8P
,#([lqSdMY[H`3PdhM#MC&kFr&JmZ2%X9cLh1i!@`GaVplme8l14lf#8m3+HmPX"
G1#3aP-j[Xa$,5(TCI$RB[@9D!!RiehkhV5J4d,"+fHEDEm@kQX*PG89XfT%Z[L$
HC)(L2S#Q8MJAZlAjS#&Y,+@VX'41h,Ul+ZA[&5M2dY8fkhYKb'B&b#9QjrG3KB3
8ikQ@$4'K@(RZV#AT&%pTZJK`(0cYTMA29E!SaANQ41&-)bZG0UEabd8(L!Uj93(
+q'lad"*CIBl@0B`,VbM[-$HjS-*0h!9L88LD')Le$plK9hMSjX[DBi2P'Lq@4Z8
l4$S22d[@6Nk[@flTYYeP4aT4pNF,X-%1NHB22YTN+"1HF$`20-Vr"L&ZYpf9pB"
km90@d,T2QU19XcdXiX8Xi@`#i(Kkp"[IZdY8+!Y!T!J,8)aCAq5p8R05b9[+-8"
%X+Y9L1DpR"B9P'mECI[90f!0i(3dfKm1M@[krFhR#1K`5%F`A5QS@!(CajSb`1`
"ZRlMq0Y9EY[mU3FIEiP3ijd'ZfP&NqkDqhRZ$Z65*Km#U2UP)4G0-c5pBb-)Ter
2Y5j)`ll`6pEYpRZ!28,"qcT)p-PkCTV9F'N8kbU@(5km@%[cQkj[4BXJZJ,9cBR
hA9+BA4RKq[@la4j,[T*-"MCkd8rb&)))'KUX+lVjF'i@(CT1&hC2r*c[+aqh(PT
eX2Yj"p["@+02q@&L0HUlEEm90V2NEC2CCMp6D2X*2Hr#%1M2X5B$qJDDfQAePKA
"l[qD9R4%GP2VJqQl+hZjC2Bq[`DHNL+r*dl1J(Dl,PhM+rr*AUB[cTTE,9N(0j6
)(PriR5kq(&KR#N2HZDE2ZCEapE#QSkd$Sk"V0f%VRdE"Ji%@cQ@"VUqc`NUSq12
'hhiiCB!eV[UlL@NF(mmJ&FEr#Mlc(FAmX!T)mT@)DCQ`KArp!4d59Mem0h6QS&"
Sfq+S88+"Y`r9PFkfiL+PT5PUeXJX)r,MUCZ$q2-0afMpem0!lK1"h5lG5reU'JP
bmaBjejmIINMkMMP*C`Dd4k41fSd)dZF%#'%P3+kL)0jSZX0!Y@*4"@R@qP[ELD0
#L$fb'(`ik#Y$1dU4[R6[61`SHl4i1-)$pj5$TJcAY1&0C)$'V,2UYUkS6,-Drmi
TID)l5"*6q#h`SYp4GcY'HYD%AecRkENJ-ApKJ3+IL*,$c4,T)j6K-!f@dYHcR`#
`-jcHRG@DLXA8EhdNI`0mUR(#GLYXb(3Qap[j'MQ"J'$-A3D'l1*&a,GI6e)cA(U
L9Z0R`P8C9fQT`E-HHlc53jkCcf[p8)kiXR8Ufl('VQdSQa$J-(`1Cp*[*1mhbeE
f[dQqeUYcPfjAM`QVa8dQ+FJ183JU4SFaU2PJDbh&lh&FETS@kASJmT42"PibiXK
V4EKh*'qM14&'G!$e[NjmdmNh#AqS"h9+8@00c14L$U-d0M9DMk%VC9N66%9ijP@
$FG"01U),2I,J4S4Yk0+Ijh)1F%&b)@6,3lYp5H#6(#[m$Mh1iJ3-IGR-3!Z5XU!
-qkp2#I%eFY3Q#f6e-`F9*8L)'a+eB*Ub'li8ZU!3FYSI3-iPYflplk3!YD%$d%J
3ZZ$EV%AD(6LRJUMJ2e[$kF4dFMKGhp"Yr*GK-)@G[f)qdQ*2Bl*DDV,9%,iF-Eh
RhCZ+h9IF*M'B0iT`YdV""MYF2(#eRqq3!&A+Q[K52VGXVP*DRKcd"$#rCpA"pjC
2q$LH4bkSqU0q"H'0pE+[pfMrXM'#r28-+A[)#2JM`ZblKmQmjXi&k-)fM2dVH%Z
CAV@RQ,BjT#CQYGq$h"kGCSZ()Bf4+MQdFXCV9F[[$YFc[-3h8dP8H[d*eY0H%fD
JDKdI'Z,[3U@4VEENr'6lGB(G-Y0V#BVUGiGAa2(U8p*8,`CBPbd@Crmh45dcXRY
XI4C@imJjp%pJJ6mDTI@V'%H5PbbM!1Th9ajj5@6J[iGdXC)k39["4#haTfdH(9@
8ESLNRaq)C'FZr"C!*-prTSTDckaeFBEEHGXEVhbDrp8YpY66aU6&f@QE`(`"`Nb
k*akhFm6NFS#QHbcYIM*m"P"fJ+[k&Nc6@*-(&&K0fjFc5SLrm0'TaT!!#(),0CN
1i0H-qZ`%M-(KpVVb#4b4Y#4`%8J",-3PKdY[aM'P,1+!0)V$b&,qAHcL,jq-JR`
M+p!1h2f$3"&[(iNi4d#F5+li[f'L"N6,@mhkq)&4"-q&Ge,e,-F4UJ`Q'iTd28!
4DCZr3$C6Zj1a((%)P@c0APfR6Yjlj#qApf`!8Fdm'UPGJiS$kcU)"V2k4FB%&1F
#%hK,T8&'Apr9%hSI8"Gp-k2A*#@+FRKf@2BNhB2B!X4CXaM1rEL!Vrl1)'V9hdC
5JNJ0!k0e+F,c$[(f6-`VeeCQ!8eVPm1G3HCANC,11YMUcY,C"EElZJ0!Ar"ka#c
JQIUI)[6E9,,rl4FX"Z-'b)-%pN6@LSr-l%LA$E,F[*4SqiP'U"mmd@N0Khj*Kf1
HI@,CE@GMS2fel#HD[faZeLj1kC4c,1[f-PUh'*[f#'e2Aka`L"Al#36L"%0iq'6
r$baph8D#H%)YY3NX)C%BJ2(+C!TGJe5'9eZfala6R6[m[XLpQkY[(Xm-bPLb+B&
KQdjG8Q$LbmrTbEQCGiYm-84ZTcJ$E#Sjm545cq8Pm"@'b%jaM!pRJS&2H[%bK4Z
'8DSXTr''h5lK2TVlKLSaJHi[8E@&-GX"f8&,cQ*%#04#GD4eeQU9`LMES*BZcNB
Sb1-b$'*JpP`iA(F1erCC`LQZG#B'N!$6M#Jp`"VQ5rCY+q+eJp6VSQM8KIeVl@1
[!i%2N8N5ic&i0KF6b're`4VEI*9pd+56k%`bF([XIllABi,#cEb(H$jH0BPTK89
9HFmL8eNB2!D44UF$"0M1G%bCq@-*T%`Ke,NT&KQA(ib,'2NehbmTj-&dC4dTqiF
S$3rLQ(%LR)ClJ4GT#h-bZKVecbjRmerV9qCQrjEK[HiH6raKiU%$!aEX[qTH93J
'c#*KrpRhr8)'rTUM&'`IPeIKJQiS@5HM0KD*TrV-c+3#-!ah+3@e'QdbcY*$*Nd
GdEXmhJmeXPh`eMr22X6f0`LCb-ZI[ehG3!'rad[U,&*9G8e31f%6EE6TVI2Ee+9
`cq!Veq`D3@ID8@""-)++)bh@kd-)IQh8re+NYV"MAAb0D)RjF!mJGL9dcY5kAGZ
[S6C8Upb1mQZ8(9RaY#Aak%92"D#)i@S,D1im1M3cb%)kia&8XqK@&f+CaT)Sr6r
KVfd5$)V-A[@*K&dN9Nh!d@,hbaYZl1D$QYPkMl[Te4db)3qcIUH3!!D0`-#EDmA
@f"l$PF+2Q"F+Cmm5!`Y89DD4YFF(U1L8Gi(1A'a1TD-hX3fHr'pfD,9XmI5%R!K
bPE)4l&e&#0c32ri%PQDJa+"qNcTqXUJ-aH0KVk2jd0[%Ij'-jm,rYqSVRENI`J&
k4"")'e1QP+X,6rRcbK*D,)VeBTl`b'N(4rNSEDq-5`M,6`hN#!6UfHlF#4Tk$mG
5qMmcTe&ZGUPKM'kJ4QjMD)DJF0[6*8MfI-F3*f6'CIFHQqCIccb#N8L,8m-kP!m
hLHe%1Bb2'2d4(-8MX5R8F@lV3G59&bSJ9iR,JJ&d1"SE3f40amT@DHN,#BpLap6
VHc3$JAQPLrdCf6l44blimc922$-5J,EkDIfd5*3*pkV[Af,VV"%R9m$q5mAf,#j
aC(NkRJcq#2[T319Um(1&F%eRc6NY2m2)(DEH+$#pMJlQ%AT"LG9Zmhmh*m1NV`9
0L,a%TSR[SqD`hAi5SMfF6iAhiBQ3!"[FpJY#f&1l&"@G4Y2"QVf4QDJebkpr8S"
%TIlL[!YLaV0Ki'6BpZ[cr(RkR,(Q4Bcp3D%&0jKXFq,II5#Pi$1G`BJ**6Pe"Ki
*mkpah0PY"T(BSqH(d`!*mZ6k-*X3Xbh*B0b*319*@%NJDiM!YcH0MN4'N!$XM2%
jHZdi(E[X-3EMPe[ABm-!`qeh5)MY$U`ljR1"M(FAi9`i%cEQJrb9flSiK'2lDf!
SXN"CUl*cN5D&il"bjrHb3%`kFjpr`#aUQl-"T0S'R0cfi%&HRE92d'Il$RYFHXq
AFehAQKKd3iVE6YDi%[UrX8!d#'i(6fB61,'2`B)i,,(V(Z03K0$[fEZ%iSk1F0X
c3kZ($IebFP9,C#F@AeZ-km&cPH#kHcjP#`Pbm23+fFB[JKrSQ#XDl2TY)dUTXlD
aIR%pdPX0'ZT23h)-"Q4kV)QJ*!ArHcTZDaMe9kXU1Mf`4['&j!`p,P[`Pi[[h6q
h1T9mIjm)FSM%BBlUdcbd`MrcFh5C4q3@CjJ*N!!LI583Q)1@aUbdFVUM8F2$9D@
Yl13BDBPDC8jHCFlVLc21mFj''FR!aXp20&C&q3c98HB!-B2bAr&@DKc*bBhiNDH
YALk(MHF"Mc!0Ri5!flSRfjep0IUfma5k94Zql90RJpQTY@2BLfTY8X28KqhrGZm
b6D8Ke(Hr,!me`[8#+6q8Qc18MPM#qq3Ue#"adfCI9e!@!@9Uk`B,0S(aHll(qDC
fJDcpa(4,9$2ddp,,Ldp@'bHeKR#lNmDZX6J3Zp%8e1Pb`TXZ2BHdSDT@#Bh6'(+
I,Q(4X$2`@l11L'%VaYJ2(K0ADjXTd[UjUT`X3h1TS$EZa2Q-+5iXV3G[cXc8UTM
$Nr-I@PQfIYB6MEXhE5CZqM8r46pR"588fciZ"1ZM30Gl&1m5Af)!8Bq,YE$RLI9
irCXXDYIhce@*`iBC(4[@AF+fhpZ`mKaYVUQ+k3kDmHBTQ$V%LQ$aQNZeQJIXr8q
69&"2BRTV!CkF!q@ABR1,ReZNPIUI!AD1KLJ*$cd!FY&&J@&6RQVMJcp"-3K-'@R
[-A8*f%9J4(M2m$H10#bqYLNU5Qjah9Y1L[Y`R92CrY0N*F8CVk5-i'F4#%*V+%j
8AK@bRUE1r$MABB[*$RCI`DiMNZNrmbUq$)VjMj01pPJEf!MH1jpmi$k@)U[)qbc
lUa'"6Zj'aM`&(Eiq`4Rh8h8jU(V+"bNl8*+@)bf,,'"6VlHY!%bmk[hk5024r[8
#k[F-&T+S6IDa'!(I$6B@(M,3`64`4Y*Sk*c@S)@CA&01Z5PBR&Ule'@JUN[B2+G
NJVAR`Y#pH",BG#)U&lM!4QN&C%D,lP$YX0Z4#&PZf1a+#X["--R#$ZL,q(f,TRm
)4"G9pHRY`eL4$fIZRCM+`G`jjmiLJ-a)S(j-+A@i%(3e!f#F*)+*ArM$lRQJM*S
NhCV))4IXYGNq$EAR5#19P2-VPrjK"1bCrU'dX[Md%[I58Y"UmU-2)XbJ-"LAFRB
i9DQ'QhQ!,0#4,bZGmXZ'5*IV8p-QJY5"Y@P3`-V)YH0Gldi2(DZk)L2aqF50caS
[fdpDKAZQl6-@ECBPUE`hph4H[UU"6i6Q*!Hc-1`&@`Ikm'D&Kh%B`PN!GdfBJ'j
4HCTU"m93%EY8Df3TqhRr'4q)5NrPaB,[fS4VG91fYJ-!kaP$hj[HB9(h+0CPh2)
fbVFl*8+,BDFYPNAk-k&K$)L)hUhTc-&C@hSAR(-eZmq)bLYj!-&k-9VdE))JQhT
NmkHmEkShGLlE[L2,l`kD&D@LDNMl3IA,-ULhpijqa`*M3@kKYXb-CTLedi9IT%E
FFLC[ZQ@6rXi,RqkA2fQ(Y[cVJcpl1d53!+UY%VRMhj*D(U2q"TYLKR*+(r52KcG
Q@Rr-mXAF1XbFZEjG0k1J3L"'cb(%@eRKlU$ic#i1kIk1B4IJMaT@hL`PbKll#SY
3N!"lh4#LUmKF5YhcLli!36HjIHd$pEdAmpDp)QmGYGV-I,K@-H"rMZQG&h"'9Le
qL!6GZ5[-hFh6r8XKT%Tj[&lf$mUN6mA2I2apZlN!HB2U#F52a96AFi0QBJb"KjU
X)L0h6++$5jk6C+b9FURekY@bldRBFDqfGK(p$63f*QEJ!Dp8fRXD,Qd8X$hiDRL
p+c,QqNI8!"dDZpVk34)cDZ"4rLY*Tl,eLlChh(*KFX+#J6dDFF@CUlpj2(Q`k,j
ED,jE22BKC,mUeUINS(LB3f1II4"DCV&$F*H*FH(3X"65Fc1CD5F8d@d$&d1AhZ1
NjdjE5ZH$0m2#XYR&4khfaI+T6KXl9@,d32*a54FL4+VfN!!%!8lHZbGjAp82a@,
rE[4aV)QipM1UVj+8JQfDr(UXIe[e'iCNh&I90Lmc3j[)@Q$3rm,3bG,QQHT+#5L
ZLbBU%V1-e@YeM"m'S,+'$&QHkXF46kA$$T+)Q$fb1q,X`fTR%`d&(HY!9ckEdiX
M1*B`iRTL@(Xr`A)2P@jEMSKHl@$Q*-39GF8!beUISRB%@qifd('d#-QUZKT1i!q
8,TR5)ddV4HBP8k99mS+"GGbjR3PVfpP5#L*r+qC!C(Y-C#[JCkdTSRlL5TFm5-T
Fi-FEG&$TXk[EdM8Z0&AhBC0H1CZ8'ZK,cP1L`@e(ZSQdJSBd&G(N9Qp&Kp"5$Hf
Sh!@h5J,$j'F`Lf1mCE'jL0Z2NRR4`#raB,6&qbjr"lMICfBUq"2lYGG3*V`UPSd
qZSdaBkH3!-ZBbJJPEh(D0"HPJdBC1#X@T*h8DSK[&RViI"kMhhiH4Fc9$J%I)fl
@ir4'0BQ$Ael816iejcTUrS,kaqM@X)HBH1HXPDK*YjqM,[E2+Ek#!#VXb[L,ZIB
X$+i(GSKFB(6ZqKAC(24S5j-cV1)Q#9G'ZRd!f8lqZGqJ0@8FS30`*6lTLa&8TMX
LIUAm0A($cDaBhJdA!eCL$NJ,lP*P6"`"#-k&UM(+U"S@CH8GE91%`!"PhA1'&fL
f#jX+'VFH3lVAHNK@QD'A[I2lfMbB8I5er'aLJNKhKmXMlBTql0a)e(`1hE0LYMe
plQ3#-1X!mb+BiF+l`(`EaV@GMVq)Ad%A3j5N-LF[`f1pr%C8QbdJCHa1KlJGMAb
"5ZiJfCZir4qTS,'*'I-#Q*L3!+R8cG$,43B4cE+MLBPRQpLfX+3`hTj$N!!laA!
j)LX51rQ-03EqZN$@Fck%GaH1'eBK+jSm)"8%dP'j+"M@4l4CY%p&#5RpeFUe#C1
m&DV"@Ir$M)83)jiH9@BRT$L9CANP$aM+JX&Npk!KUQMCQ"V$V*k$fHrZkT+e5Mp
['#qG6D(kf[U+[pH4$RM`Z9'*Ydk-'h"&1T,["'!6mHGMU2DPI1)ePdXh)FUGU[$
kqdN'RbiIUI+3!,qUal)cZJJr5kKeCT*i0JK'9@IU5,(2TX6K,fABUl*6KrekjK!
dpb%HQa%K*@[a"l4r,4aldHK+f&BErCqHFNAXVHY(C1bkiN1hH3B!jBj(@eqjZiS
$2pXch9el`$d1&qjQe2m!$KbMR!Qi5ArTLJ)P@81+lG$J$bAUH2p!`)-i"!BR''5
6c2$Mlh$m3VBb8S&MH30T'lqmRSkKcaE%h`J(R"$B+Z)b+p#rT0KmdT9KI$@MM)L
pmIXrj2'"r)0%!2hQ*44('a1&L3QpTF&ja&ZY#p&Dj5fQ!Aj"I%GU'p!f%&dp`cR
H2U2),kHTR%D5$"M4G$30K1BaI$2FN48(3Hce-YH&!,3BU0V6B(CU[N"*(Pl1eq&
48%+feU$cjF4D05fEC,!0a,A[,3I*C1J4F!rE#dCUBb+`F5A$33H4mZ3bjTk"IL4
ICC!$LT%8`LRE$M5)6INFq9qp#6+DNM-3(c10QjeEmJ[c1C1KNDI'$(*%iU3'!IA
2[Fp-1,NZ%!c'0eGVh!'eeKHAQCM&fG0`cl@(%!5P4+"pFebei["Y,#0a(e&4PS2
F`H!3G8M`ja(`NNK+DN8Cm`CDEVpHf#,rddU"kSc2A,RT!qdQBQi#Up%bJb06DDB
F8iLEZ@HSBZ#Q6HB0qfN&'VkhG5IV!%4&mm[a'MGa+j!!10)d)cdYCdIV'E5'EC'
,a8)1"9%rm@qF'ci$pRbdB*UVc-Xj4@IkPh+YA5aQCFXrQ@i-jN8G`f&4b3p"R@R
R*KReJ3(35I&-K3pe)8DIkm[+!j!!c[*QIX11bfmba%dXZdaL4cN,HU6&2TH@c1!
)#XMp@bf+Z)SG8&A#a`XC0KVd*kq0rDTX+,2HJ`$A'DL8@SM[K-r4[k)l8f3EiS!
eL1T&1hf)jB0G6'lQd5D*@dY@"d[&!U#MUiXfqDB(A9UTmFM6V05q-YXH-86e%ia
*6e*PMZbR5'[a!6YF@MChpRAc1+Dq'98hP68r@f3q5hTK$hbHZ*eVH1N8!3k1p3d
!+#CjpU("V%b[k3DMEe'Lj41Ib4!XF-#bB-9c(-@fH3j)Z['m,Uj`(CaM(Pkl`UQ
N$EGqD[kNJBJrer(&YL"&fiK%`%i3VYN5SfcAiiMBU5qRLhaK,+`I1KL3!'F"BTb
D4E8PaXFk',a"[Dq!L@@&4qJ#rb)*VpQP&eI+RbN)4Ip)2iFY[(DZpG%ZLHXHX'G
cqS*ZBm*#Rk,2!,feQIc9$lclhjH6)+XN%bYHE9-C"pMmr#L&+ki%Y6T!S2bS-LG
($V(E`a3#FYjYfZa@#i*i%*TV!2j`rN[TQ$!r3QrjPfieL+eKYKhamEh58k!lr`3
id+$KTdq'a5hC"!j*Gc[38bV1$jJ'$lY3qq1e&chUPQ4[CUB6j!Im0GUY5`P3[1J
Z#e3!i36BM5Xrl$r@V8VU9YlZ8S"#&XMbCMIRU%-5lhJGUNYMBSVf5KHQ`cD'!XQ
ALcBCYm3@ZmjPIb0d1j)mC-T2RUpRJ#f3!,i+"0qbe1hF6#LRrZmmFl6aQ@6ZIZh
L@CL3!+&HXG'-+UUMq6p-lLHAMk6!Hf-4R8RR5K)'D55!'8LfML&SS*PN14XUI1*
-6J2`9&#hF!"iP0FZ12fkdR),3Ndi'DiB44@61PEI4KdeQU5I2#c`'EA3$E$Nja0
MQ$qFG&q*dbZ%%4+jBMDQ4P,k'29UN!")3bPVN!$dZhJ`6Zf5-IDJ"+*jK$M"lZq
E*QQ655qP'eIFbe*3[Ik#,YceU+9Qj!EeVD9B*@,Dq5"kZ4`EiJlJaM4F$f4*+&m
1Be%K2FKD'MrM#$%m$LP1Dm*QG%&e6NqlJ4$imqGI-X1jCb0L`I&cU*NX+V)J2)I
GhhTSHCrEZ0JELLM1#X"BAdd5"Ji&,8G'9!dr8-8M*JX`PJc+mJh+,0J#Se@SE&G
F8Y"Bq"SS`#1kY5dSG3C5`"`3F6"[lh0',6KPS,Y%eDrfq(iX21(CNafR5Mrb'iE
4md@'G!U[(9RDS%4q'Vm%G%VK&2E22feL9i1`$YVjVlGi`#YJP-q+h1V8VDHQAd"
`D3f-&rGl6AkXfd3jMFK,Y&SiG2CbldB0FI0,)6PQZRNXq#UcJA*E9[f1pP-N0QG
4LV$-I,MIY"Z1$TQA[*P`#'(DhVMl6hRkdE"l299+f2MYheSVY1lb*+5QK6#5)*Y
2cF)Y2dX8ZbirFB$qU9AQeFkqc#Tl3ad9C5k5SAMFpCZc*2Q2p5K`e'R3-Z,"k0X
X@2*l#f!meFQMI#Bl$[I[f0lE6$kIS(eFk!f"d4DI95"V8+Fr[#("(af"#f0)(9m
j""99L"VFJIc4hhhVUNh[5eJU1i-RYR3+AKihHIMJ@,4FHKq)IqfEYF,S3S2#fcK
@f%jfA92"cHaZ@@GB1#M'$[I&[eLeKYkbEd%(T,BliXf"$@3Q)(j@-&#*Mm02%,+
*ebcKJKriMhTA!iF,@9YaXlc*q!c!J'UR`0AL`%#V8)&F%3H4Jh6R0e2A@5$kRI&
-&Tk)"l3U9p60bp'(DBbl960#C#[3Fh4MSRShT,B1cEZ8I$IGJjMM+[!JUXiAKHA
M23q)&c80#H!LklILC,9Ep`Jhqjc&ZX*4rA[c`IKT+X0qX8cU11S!Q1N5@2Ykp@!
Re0CHc5)ca1TK3KVU!((cZe6-)lK#YR24d&a*Cc`VMX&[q2&4m'q*AA2Q")A''J'
&49(f0fp8mj1KaaaQCJ`SD6PiPmBThh-!d3lNE$"'(CV#JV4JB)F3IeEAE3I-pi6
A5*@5jAr`XfbP'G2!q&+`LAJ5leNY)U13!0[2N!!d[P+XDH%SPQV8CY2%2KUdfR)
H1#M9G#VlTEdFS(EEEV`A9NPb(0TKqYrqjfFKJrcbl3DheTXHJDp5UlANHJm`B"`
kGYLL+@#QCFb9X9,VAZ2'e@Ka1K4NXG+C3bHIYI(J!QJAS2FF!KcQd)fT`@+SQMc
+V2@BLBX'1qC*SB[X(!#HVeqaCe,ZLU(cAh63VclbGR[DV+J+(VT0*D*-IqDCMmM
N94q"Ud`Jd%+*k*)fFdTLh,)1'+d-%aRIML$P)@'+THrkJ%M$dV36hb6@PIKL9jR
pe-LDY4lUQR`&8qEZl&!(9kZMAkNcp-GFhZ88M`c#mXp(Rfj"r48@(eA3%k,aHT5
81AE@'GHGjAC&"55aS$E`X%fRaAF"MQqp9*@YbaJ1KPjQLqpmaa!NYJ3-cC5!%j9
$-A1[Rhl)+(3SmZrUeFJU&aheM[J5Abib'IC,L*0(,&hkKdCrcRaNZ,Clm'L%N4&
iK'mAbFUhJi'J6""Xq"VbTa@)R[D,r"Ym"mqJqR2A&&IKm&UF8",936[CV-)MIK(
mhk(,`j`G!kbPZc6ZrcIEB#Cj[Dl`eM6mpRkKN!$*q@-I6$Yq82C@bbq##RXD[QF
IXTdrS)T-l980iH6l#A6'FD#U,U5#333[TPX["mmJSqeDY%V!PVErc#)pqfEUBBZ
3!+$r)lm!88Pm#rr1,('MCZ6Y0#4A0@KKhGI[K+jZIjRL(&E[8q%YUG31aLQ#Y%P
4A(-ae`4246,f$k#rmfH5r+HQ[DLJ-jqC!kS8DLj(3B**)X0@&lSIDRHbZXe(&"[
f2S%3ESl9V@1r!1!K91"6VF+hHh+$SVTNrPUJLIL!,3ABNEEGJE*q%P"3@3rR6FS
12Mh6p*lG(1f21AV$6"l6jA4kr,b&VDT0!J0EUG6KBl0HC!`[VdKTMPRaFZpirCb
dTShfG@Mc(M5"iZ!l!`3!2p*D@`dX&Efi6GYlJ8dJ1DV$1"AIfSBY1,--+Ui%Xl(
3f*Da46cq`[2e5,bdp)"hhiL`r8VHI`@P4iM84XQpI6SSdb8E46&-VZ)-90,ZhQ1
&F!mc8U$V90"c,-8-ejV9BfQD-aF$ViYb5Vkj#G&D%hqIB3VT@*Up*,5ik0`!!UM
'FR"qZNrFLfq%N!!!TKDc2@F*1a&fq&hqQNc[Yc5SDjE*IblS!a)LhVBAhI#IpFh
B4G-SNi+4L)365%Ak5'XQGi2-I[*S3'a1C6HShkD$K+Rmm`D#Xd5lhl1jahXGHbk
0pY"`rDpQTZ61@DBejB2)S38+@$hma*QlPRp2G3F3mM1)Ae9fpNF$)qeA"0@C$l2
#XM@@A!!UGeEYD-hYmH9abVG@iVp5Gpp!iVIEq5M0@iRL$EGjq1I'[miEX39j5I$
(kFL9d+hT&G4Ck)dU25G8V[Er@8NR%dN!0Vc`jAFUc@VQ+NUYH9$8rq,9RVZblXJ
r#NRVcIl-Gqjke-6m*%p8X-ZXD8hGh1`[6lqG#-%%Sj05cfC)!+R2p%h-cTJDdZG
J8CYS`-$Haq*Kf3K9+4FBchC5XX'H%99!rq$Ti+b9$j!!N!#kN!#%b)VFe"a,dKp
F$K`02$K`S$Yp#XAiY-VXMX)0NC`#PkdHq)FIL9D`D`i,[1QF@dBY,e*38+kCI8Q
&QPPFJ%i(1Lkem[cDS6P+hEKVdG&,k$ZRVHF!cLEL#T(K1FZc&"d5qNmRXS@mQ8a
A2RZa654qKJ%*%alj+*3IC!3'Y$iiXmbcKr8LU#e80DI0H"dNVH29'bBhYD$9SdE
e"mR'RS[0kd-mIhXcLXN6R9S&h0ihrbiPPq`D4(PSZqJ0mcPMLI9q9+P")%AfSYN
&'Tp&VC5`r--D[SEP6Vi,K53YX2`T,UT4VJS9+[,k6VF51S-I19LAaeC)K,`J%dI
%ApGUe!&Ca)T)p+B8E,L5`VcA@0qF2NldMFq@C2Mr4b6LZB&khpT)lfZ"Pjej@M0
(m6*b-iFmTK!jSE%QXZDPR$PqjES2#(A49"2e"qqIM@kXNrGTRDBGXLiXF5i*c,2
k25@L0CMX+#iFjRUIEB"%,J&AZ,@V8hDXF#0CUD8+UU5A3HRTUrFV&fLlH!T5+B2
jIIL9ZQ!`NQ"cT['q`KRrbqEdd0hL'qkpcdClGD9P9VD*BQCXMfML++8RGqdAG86
LdV3dpD&cAkTAr4+!FiMZ)VAD6HD98"dDSah"&eV#G[""3h&BDKmQ3T&LbU('"MY
mN8+%k5#eQP"Hh*4#E@a2)8L9@&,Z(`'UmZY$D[854M`[a(&R*5cUrR4YhGFXaqc
DjJL,ir(ape9MXkkNG1jDq%fe6AR[6el6VbR8N3k5RXe%9-VQSG0`XI6%,fq(Pd6
MXK5VBDDXeH4#fj4pRR,MER5$19M)a6Jq&I0fAmS%TM+cV2)(T*NVJ6d9llU`kN[
Eb%NchS$DTY&a'ppPRNCBRZTVGI*d1G!(HjA[jSFUlMe(d`e36)jqieCQDPQBF8f
a)$0J3F2*djVLXRfQ6hYBL0P#F@M)XeSd3e+"8%TDY$4&%%PVfI!5IM#,Blf6$Ih
T#k4qG*%GrHBYAG'`,U'[!3eDCYPhbHLQ&KCG[!544d6IUaP[HX%PB4c,0pTGGqD
lq,'mZml,H[DiDKZEqMpD!`1V*3"(cl6l,4b8K90fmJj*#4@Sem`K$P@*QSU*f[*
jQ'(pk(QLZEZji'0Z'r$3-+I--PI`5E9VN5i6FrV+&86&GD&H3h[jpKF6P[T9a%4
VqeNmhCK@Bq5'6E9bfi8D8ahpUNJY,,p(LIN%`Tf`Ap0!4!IPc!Sb@`AcDP"Cqam
*)9iQPf,m&GaiX*&)9fE2CKkL`N9f3)P2`28N"0b"VNY(iq@+6qI"pBp+021JLU$
T'8eS(e*,GFR#Jq4[S1YbhZ$P9!EXp)ESq9AU$Pkbb!!9#Dp"$-IhCA"PkQHNEU%
h@8BR8FACQG*9d@`Ub2EJYAk,Ri&'$KL+Sml(Rc62pN5%+L-IDQ2I#F+Q$Sd@hl,
UYJ5Vda!FkD*c"[p&0Y2%YcrpK-86X0rc,+A1I!'mBiLECAX48eBYUmrMJZiVf-C
8C9+4qBk"QI'L908aZ08&mQDh+2ELI+&h`M*TaJaN%!!ceqc'f2"JM$5!jm%R"Ga
*UjF!rCN&8",hNS9ZkXD#'FiZkFL9*&,he8"6KCfZ1,V"P%&,2)F'@%Mr$`E+1EL
M$UZGN!"+mpF*@,05J"[SYaB!h4)[*JFmFYXm0$BDDG9eU!e0a#-pBrD3!0UIQX5
NdPJ[R&EBe2$6qYjIRb+Ba2Akr+b[)mT%2*YHN!!qeT-pGX6i(D6[8@M6+V,Z)[a
NCK0MEU"U%'cE3!4NjVGjU5k,QE-mS*jq$Ki*ThBiZb#mN@FlK9pk`&*03XCEhUJ
(Qe"%qK)cZH$2rJY4)ET82f[HRD1MFXd`GkLXM$$bLjeNSadI#i'@VB*!*$cLXAL
)E(f64CmVi%T6*4&D*f)-@Eqkd#SIr$VQ#l[6&YLbfG1qq0M6FP6d@LYYT,GFe'9
b6D)d2L5Gb(4bkYb@q2ApU&(2G3TGQ"5Eda@[%lqQUZMVSLSKJ0-8),S9823a65J
*NEi"FCj!k'&cYLC[2,HX42dj&bGSBXH)*SMlLPTDDdLZFUj1+6fG"maV%XFY+2@
Q@,3AYdb0b+Sb`RaVfhh"-TL$qVV``Y36U6c)[1FA'aKq&qCfdK1-IamHk`l60J+
AE0C+!kc9SJF33D*3R!JE[S(#eCF6AYT&(jFrb0EYccpD`ThFie@"Kmr[L,@92k$
%bL0mfM+#j2DKl92@ql8pM4E-KDKmGQjKp%b&@!6,G"riR3mLYKB3r0'2EST!j"c
Y"kNYBq3A,YT2&A'CL&$)50%d'KBb(-6#+3(bcL@mfqkb1CZ[1U0B2kKkDbZ+r&X
3Qh2%0qQeIRmZLBZ4H2aLQLhfKH&8VM`T-H#GIGRf0&U,5YEZ@9#Y5,d3U"PJ3C!
!GI"q4IFr"ZNQL+QXZGF*,q@4YmfkNSFrYpVQE5Z0f3Q!GY)S%J6)Va)EdICQ+H6
arc3#E#ITJc&Up$T2!aVK`$Yda@lp+Q9q'IK!DLZET,T%X(GY5"Z'9"bq*Ah3j56
6RFAV!+EMfi63Ih@H[$Hk(d)J2Z@@`b8H9"6T)MLPIkFr##3TbemS-`fQAMbZa(4
NYSBQMIVZVEJ55CMRe+%fL%3kc9XX'brqJ189J%-p&54D@EQ8BFim)!M,mZ)b9&j
#ebTlaH&5#SQ3!,LYr2PjCA**'219P@IRBc#QZKUHNVSeUTbR3)qMaIQ22[`FeS*
hh6UYM&VT(b-B'E$b[Dr(rMQDiH599hkP``ChD92@*p+Z-`MVM[8``H`HGp'1DrQ
mPbAQ38UYQNdSpZ35CYGZUUH,qQ0`TVde$Gr-PPEFL#Qc18344kcZ+%"#9`@-*f2
dbpV-f+*1C'ZN9N`j)YY$Y1-l5E2%NFVJmZb'bq4!VVm&GAjD#,2pLa-pEYXc2G'
cG0-+[LL8QY'iC,Pj1+BER4`ljh&hqCP&#J%rj$i`H)I)ih!1M*JX61UU48K$(AD
[k@0JC@$UNU*E66LJ$984Q*(m&&4L`UE**GK+I$C$$9B!'DkRK-G*2'*9iPdq#CM
ZGJkE(L+j`#U4,Z1HiJ5[$r(Bi$f"XH*(BRZc(E`4aI1&&Z9T11YE*0i6jcBLc6l
BIQZNS9DSXe,8HDDD"h$2D)Mp&#a0*!liDhd1I1r[*mq5PEXA8C@4K1Uf3idrC#1
+Mm(S[VCMCS2UYC4Hqr+SSrQHFKI9,36[br[SdiPXL-pB39f$N8Ye@(pZ,Si*,Vp
,Ujp[0`TqIj[G@r-hJF'!&(T2%h-VIG"[k9%'N4EA&,SES'V"##9E,&[G+A4)c'S
1j&4hK(LX[&@@q)KJ[EDJ9hPZN!!(4PAqX@a)Y-UC,mbi%GTcE+eN#Tb&GcFH#`#
Gk9(a#+QCQ[6XHApS![kRm[4$T8866ArZGH5*i(akX[jCM+S%3P8[*EKGfl8LTE!
q!@B8bfrZMMiGVHAK6S6DR6QbS%GU-EcI["1eGklZM%)M$*[YJ+H4B$XH5Y`6$8a
UPf@R(l6DGieP%"0Rh`q0hKmZL5FA)%ATDpBK,!`#Je1U1m#4A'L&!M%"CEZ4NZ+
m0'e1m5q%T,lfKp)TZ(%aZXi)XH5pm1iq[CVkcVYh@YqXV'9L!kl!$rmKGC84+l)
ij#P$`MaFdk*Rjl'"Y&!35Mm`jA,&*4r,2kVM$T6Jfq5VhcDm)e,8f'p[P(`Cqm#
1lDFYVhThT8Ul%[dR)&8%RP`+YNmpC9[LiCGFjSH!XFUV#pmDN!"+Ua&906lRB9b
&5$E-i4lLSQfKBU285aeB%+C6)KUPkAmLQ6Rf&LJqM"Z0V$(hSAL`UI%paL#BMd[
`a@U+cZGXr4rrI"fFar*3*N[C9JXq(pkC"Ki[JYI'&12(e+2brH)9"6T*SXcZQG4
A,'6IK%Z%B2Tf"a$HJLZAEqDVG-*X'1!T4ej6f02pFA5GI6#(QMAXjC(X!r([8I$
NNka!`NYmC*263ZF&[k4lUki9HX@!Q6Nm*1)+NKFrmT)9YT!!XKVjD-K+DmJZ%JH
lE5eBGq%-H8fBi$j2Vcli@@#DdThZ`mjV"e#20qlG#3&DeQ@+U5EASK*1HBVDaq,
VlfeATq`j$Acm0ED%HP21jdRI4JJm0Pb3!(VPAf361'ZPZTiD(,'LPUY%[1%N"jm
Ic-3U'm@6lPpFMh2EjjeC&`!@Nh(!$4Z,YiVSYSCZ9hAHVN0X04GFP&[+dIc[Y-b
4*p3Q(9%mU[Teaal*UQchHBl$@Va!J&kF@IElT!)ITdlYKdV+,IqX$4"6Q3%@'kl
h4e-F%kAe4aPCf)R*J(M(E,Q#AmH"TL4-1q,&$)68S#Jc@f3)JZE-M6YQH6J1%VD
#ZMTM$(*qPdQ!3EZG,6RZ!FYF9f93pk*8LEGV0I+43I"3p`adI8E5B3iY8R#6XS1
bXU!!Df0D[r4C3"I@dVAR[l,kMPL%('G'Er3PrchjHSZ3!"reUSdqlZaZiiEQ$Ci
$q)C81"&"rhbL3mQUj'qBrZ%EjiNp+I,d4aIi#CEk(k3S&FARZC!!q(iY"j-BeFG
qa@3eIiPCPk&hG#q"q6`MZmQI5,EUT#U)Z8ZkTr-&R!1R9dI-"kl%H91$66jdNNA
RX"%E%GNHk%)2AH`Y0'pAlGRSmrXl%9aZj#H"b09)FHjAmd0"kMK4KRF[4kdB2-k
$'%p3adhm2V)bhkG3iqCVLpIirh%%9p`340TfEJ5`52H![Ud&f,Ja`frHT$)LXR5
m8AX4rT4!#k!%AV41N!#RAT0mH&RkiAQD-r[MD#MX&Q9UD)hd(K"k(G8C1H2dfp#
(HRI`(G@$p@`[,CCRVrU(b2HiC'd$5$+Z*L!Jaq!UX@V+%%pKYdBSj-PY,$mdDad
FM,(KMJhX&eN30&U`CK)U3aN`kD2#Bq0)SYAk2Z#bBDCX*Xq0mpCq!$NP-`8Q!jS
)-#q)MD1mM[SpQ@)"0Nqh9"!UA3B+#TB@6XFhB'b,SpGJF'PGc)l"DjGMRQ5lVP"
#0Upf+-bKE$i4XIhqZe#Mj09BA&`qVdZK$a!P0('%XjqFT,4E"+8A5lkJ5d2qQE*
4+Q@1lE!ZerlXU"e"baZaedMU)VU+E-J0mUfVeAYQeSApcQ,AR+`de-j'!f5L3)c
a1`@K%Nreb4A[RR2G*QhD)MQQmlAJP!c&M3'ZqBSNXE"QU$R0C)p0qMAqLKfqqGm
*2p0&Q#)D#`a-+L6fe%,B@FDce#4#0Vb0Qi)5*$hpQeP$F9pGG@CLFckaALZ+p)K
N!p&4MJ-I[0%(j$EeZb+,1C6K(@BITh*pcREj*$Tp5Uc18D'EUXhqf)HZVN[2GQ*
KXJ%L50YY$Vk4*cGH(8aq8Y1-8!--Ai#3!*kfc14'"ALI,MD9!D4Z443823"-AaA
[b&VNiV&#ZrI@a58Pm*1MUk(%'KCc34kP,2B@LDkFi1pp4aZX+"+3!'eRqQY6DY0
IIPBVB-Ji[`U50Z4VBm$K$4GUJ,)XdkFfLpKcilqP1h&1P93M)%(!j8hcQMkq)-f
kmqdkHV`cM%da[[D$!e[C5r"FUPU*RqSMKNmVjf"pT[a55,+rdRI[arNe%qQ+#)2
@YEC-qJlNN3`j,AmGZMZV8!mEU4mH#-rBfE4SR&JPUDqIPF2c4Ib0L+Sm8p)[69'
H@"jS!Afq9bF+,p%pKLj@MQhKA8h'KSCZqUj`#)+flk2Z'`fq`-P)f@Kc93`ea'D
!N!!-d%j4c9)Hc3)9Q9XpVq-`TC!%!3!!3!!3Yr3Yh,Id,G`!!0RK!!%Tm!#3!mi
!%,f5!!DKVJ!!(1B!N!32!&4ME&0SC@aXFbl2J#jiE@`!!!5*9%9B9%0A588"!2q
3"!#3#S!!N!3%i,G#`G654D@ifiaX9r5,'ZbL6H2M69`9C80S#5('%+Q3!+GI@2k
2@'Bm`XqY16I"JB[%c3$6aH0SQDIe-5JDF0rb,B*1&m9Me-8F35ZpjDl`(&e$24+
i'EL5V#q$pF8*QSdXH'*bm&`!-#JDEjb61bcPR+2ZI[e*DX#f$0XTcKTVM&A+dp$
Hhm(rk"BFYjl'IrRqUr0i'+l"(B6II*&kU6ZGZAc!`!2B(Y+9q2Y"JmF)FTPBCL)
PG1dec,jNjFmeK8MR"qcHT3-9#kHV9,@"0f2h@i!KSAK+&VSA+CVbkfhmq)3T6%e
9YT(2$G@IkhUM0-&R$*[D9@J,ZlR"-Bj$XeNBE[2UrkBdR4UZaSq9lh-TiVfUUcl
I5V3r1Cc1-J3V[$'8"K@CZA$*PF&r"%6eDHP22F#*GaC#04lpV[HK,9m,2Eef0Fb
"HRkmq,%Ka5$m+dGbFqYCR(E1ISXHTdQ3!,(SPL!8rRcc)FaRF@aR!PPalk6IMl6
RKJcpYBePZ`2h)8p,iMX',[DVI9S@+6MHHE(mRTTmVESc,MPZ6"i"Z3VrpTPpJN@
XZ3XRN!!hA4ME-f&h-A-8i1aiaHB8BRdbC!5Dj6aE@XMdiSljN3aM+m3FKpPe0CK
35Q&F3-5kIhD4%&p@T0h%3TqGpRYP003!Hil3lf6c-Gl$TPc$%9@J+C!!3&MMZ98
V3`eS,TPrj#JbrQ39Nk#PjGFXN!!r+aE55!V)X"4V2*mM,EfQeJ,`Cd&BUR&M(1@
lACQP`'j"`40['8J"$lCf#hXG@'p$p$'$``B%hDZ!+FYQL16@lR%Ije2Cr)bAR%X
-A$11iLFblR2&(46YQATNF'aAcMTr"i5p,F&GU#96b&`TdXVRfa*30Yr3j%"`Beh
'8Ei-Tj0)Me+*"jh9CmXh(CSEXi#I2HRI(@KFk[ErNQqm+N#-iGEl*1Vq5Se9KPV
A05F@8EG@l`d8bAi,5D6JB[fle%(%NJ'AV&NKKkeD2"d--9'8hp)BqB-5Z$Hj#Zj
Y+&NiB3IT%cH48fRS+qQ5'5p(XqifN!#*A2q-`R9SKf%K)VkVhUbk"F+hDcA-eak
0aLEcbS0pMXEPF0S$X#qLANM-pNa"00VZ1Jpi!dX#CZ-UE"CaVb5@m!BYPP!Ffia
Vj8Zb*e$CD-1$%T1)#HGSLV,Bc49$!CLmM"I3J[JFl[9[``DlHf*MJ!B$&[Eq2%C
P#4$3p`5ISl+I&d`R8A%'$#i*aY`2C1HYr,@aXIaS'+#N66TQUqqpP5i#IhkIH*`
SeZ#6E&l9L!9cD'Q056+N*1IVPQ`fq[R[!+-2KJqU(mZF(J,Ue'mHRYfDSZ`&jk8
lEDN-rAU'ldXj$L`K6V'1f'Tb)@Jb8*2f%qYC5hL[%SQB9&+d!F-H0$eKRc*[1D8
#$JIkZKRMGQY4r95`A,hk6rFmI)TYHI@I%FfSI&'jKJXNJcQ$lYmb8"j2[2#PFI)
4HE3H'U`@T$S8+R`3Pm0jmI4qV@5RG"IFec+[hjfD8N5+!3rHk#DF*&3TKCDh5cL
)bK65pi-1$P9@$)2mq)CZ82(@%le),!Y01*@0%+`4$9(VPFFla135DI)lr!$8V"L
mY*4)D"mZ&CRA,m[3Hb$q1EXmB6eXel+kZbXADD-J'INX#9f'IlbNV('*l&H5m9@
jVX5VU[!6NjBR!akXdLB!3F*1Am`AX`QbBjY#f`[`99Md@6ReIGd0V1SK`*ZLMAB
22TjJGjKVqd(Mj`C96Sp(GR2+rV@Rcjp1RbbelUVD4`c%Nm&[q*1SeLCkID&1@)3
'SmBRCB#%QY9h'M3hcZk&CDr-e0Gj'R6!hdLi4pADqYpbaCUbUq&cj(3&q*c9h$j
D`ZJqBHa6Bfk5VUM2[iCMMbeLj2hDD+d'*%$E5X*#Z*a,KeB@+F0$QZQdZU&j,eR
'dirJ`(djG8mi@blMC`*8(Y14[!IZkfYS)iDAYe!qe+Q(m3(RI,ZRD#U90`kj`8S
[KNajk`9hfT@P,VHqTNqU51S`Pp*fR'QUbp&39&`&QBhAY`aQ05QBZci18!#9YMD
lpqI(r3"QXU'V&$*Mirb#Kf3KT[KL'jCIiM@VCcZ4M3DVJKb@HYVhcdcfTU)XLYQ
A6![X"qNHA"B$hN9,pikLJ32(hbr+&$)m6-fq'&!mVlZiG[ReJYaPcb*Ip4!jCAE
I$QHem)eLe"LhKUdID`S0-DUDQZ96b)%,kihEp'%,1DjN3)rUA**G2@H-JVG0l,H
EL`G&6B0U+j%q83CcVhr-4"81i!fj4c%kAjJ4S$hXE&JEQdZ(f(R'jC@PJ8&pA&e
*1kX'DqS5+pX&LdTaQHm%TSjD%#j`Dkm9-@[S[C0"V1qA*6LbE+Ib*3pFQlS`Z&Y
&rB03-4dIY!hE)MbQ6I)NrCjHeH561L+'N!!TL3AiR)1URhCeGj!!-XYq[0Z-'64
ErPQ4,`[a(+FP1H``fd*&qhq`A`['e2-UMN@S&R$5'V2jlb9-*DRXIq[',cHQMN"
MAdqYqBbcPpSc)m$Z`#KJ!)3p,,FR8FlrAB99LHhXiaBpG,-6G@cDCY*11LKAUf%
"Bkfq9lAe6@f(QqNVT&e4m'DY,E[GI*)3fE"4!Y(-YUjr1XA'P&+rdI+AmV@GhEN
8eE#qZ5N'H"rSmQUGr!15aH8#@PXcZ22IAS3PZbdTXH1b-cLl%qrG`&q9ldiJd1`
FFKPl1N-*3$8[i(A`-$pA0#S+BmMiPfEYD,f)Z+c$9dU[)6A*H'2S2iF'",rmY9c
,HdLlE&!9X@QE`#l[1$8*KN0-BD`X+GSdAMU@JPPA*!XF8q(d9`Ya$mX,%T(9!b&
+0*N1V0RHVScRLGC'80a`NU++CNdI',M,L["Qh#R4+F-%+MDVX`eVG0ebE0'9'Bh
aN60V#aQCh3bcqM'-j+)lpfaC[h0'JKcG%43Vc93A&'XkUD2#EHG-Aip,A0ria%M
!0YhFG)4'+c)-ccN-`hSbp+PQhCPHj3[$dZL9pb#QYcbaXle[YjG@Ha41NK@q)69
B+f(jQ(%EjkLFQaQXF#k!YSmFXfr`[AR9d5IT'J-(`A'T&l%eEm,`,"HPT3N8Blh
#H#%$Vim9GcCMMDqm$CfKD'qR3Q6Di&ld+,Ad-dqUJKD42D"GJ*2VVFN+[@T,GjX
3NlUPB[0FJIk)!)'T!BkG3`dAmM`YBTrklD#CTQDeJD,Df!5`G%9*MQlBAK+B2#[
(5X)[ZjY"&)d!Q+T5M)F4Je3i6X2cTPd!lf%T!(U5'XPkXF$9,F-d0CN$T`L6p6Q
2`'RGB3QMc-e&S9RDedB2,[3I2U'-Lh8E$K#$4B@La1!eH$2'ACEKaUp+kH-%+kI
44LIV&bGmd#3SEVR+"lZpL&jCm42QGJq2)N0fSjDD%F+*(apd1UBJJ280cT86M5E
i*("[i(ak'XPJ!Dli2&pp#AZCI6YSCNGNRkIM#"R"[K"V+@SjIY359%D4U9BP2P$
S9q`AEhZD*H2Uhpj42LjId1l3m')V2K#J&lNme1Rpa4(ef5aFHL+5(FT60@+6Yr`
)NZNmr@B5`@&Lj*+!!KeMr10J,!6XAEb&F6MELf8ii"l%9BDIf$febX3ap5[@!fY
S*83%Zi1VlT5SCZj!C)YaBj'Y$SG,8a2R@qNDB,%Q$%BPpU+pVa6iBRYCl-pZ3+*
l[[m-!P&LS1-N3crR-9-KMc6V1#(H65JNM4"Q8J`d"EN[&,j,F!483S3K5K+Rq1#
`'+6D$UAVF+IR*Ch+,Ic5Dhb[4QjGI(2T$2$'CLdPQDN@'@!'bBM[lk(%BNVcTHI
cJeT2ANS6m,MT1212,rm2@Kj#*bH$pAp"SU*'KU-GJ#q,fA36cLY3r`VP&+(%r"P
iTNk!pGYEZ!&CYVQJ!D%DSV5q0L,lkpk)ed5mbbaV`j*0Bqjjkrl#XF$LiUB8T%9
bV#q'HKIJNGYj1-`Mh@j2VCY$U-,Z&@jYE)H2BL81)M!Apa!6mV9HI'9Z`5'6)X$
km#!"Q+@AI"CN,hj"YH1JV&jB!A[iJkiqGJQMjK--C'YkK+K@DZd#aMq"HaKBNKr
e5&T`'hlN8hT"iHhBPkQf#5G)5KeU)@M$M)DjPc!B5h0fZdHLA%)$q-c(F,Lh)(V
eYQ1ZN6B+Jp!aee+RIk(0Y,fNLrD5c*`02c0*pL4`3["S1!0CNQ6i(Ne#&$#KGYR
H&13E!A'I*E2(iB#@3X#L$RjYmF($di1qma*!hl!)d@8"&Qe@Q0P5*02'lZ8c'$F
4jZ-E4#X6SjmTrMA(R+V(0'cYE)108-2Tqa0YIYm%dS3fFi,FFSi$A!5f,PST5fJ
k[qq6RAEAJ5E)U4Z)A%DCB'-,1BHIAG$meUP@6F0Gr%kBZ+JfGb$fcL$3Ne,jeBZ
dC)XKDR!MqdC4r8JaKm#EL5Tkm%c%8J*L,I&"MaLKJN6JiF1A@ID2`&c1SM90JT@
ijYm@0KF"RHl8'6YGD6+"Zf2PqH+e2LdmNVU$L94D#9YGl!YRkp&Yi#iC&eH,`Rh
8X,[q%[GL*CL)[[09YL5Z*KU#Bl+D(,J'Q6C3-1lJ4e656q[-qNX2f2jj$fkriQN
c"fT%ki62R+%f#3G,UIVd0@3NJJ"YiFBa8q%)YB,`lS@R##6-$dM(SkDd1lkNi-m
PIE!jHS`&L0TTLq&d)-3le,#CkA(+Gq$FCl#%c5@Bmq993EVbf)dNY8U'alFJhjE
T`9+U'd1V`%+i23-b[BBM$h3TRXbFaT!!,0IkL"R-VlZfkq2FQk2-dXF-kdhL%JY
Xr+B`I&Z#YQX3jGCLCN4R$r9-A%5US(UY)a@3!!D'!dbfVSTa)0+3!$03%pG%jam
'4Rmjphrc&S&"HRi#S0p-r6"*D[q4ee+64amPQcdKMjRB,18NBULB`B`cI)'d`%G
QEpHR$B%+lpihZ5TEPSEB@`0h5HKJ"cGJr1rqYl4H5Z[(SU)Hhffqi4TH-ETil'9
,)$XL0cGh)19iCGc,Ek0ikDmUFHN+(6*12[8KAPKC`[adkdR#F)c8F)SYeAc"fTZ
JlD-9RVMCMVBUf$ErZXI)-0j,T464%E6MQh2EY8,EJh)!6Fel,c24UhJL1hm4%-c
40J-Aa'dK0TBB6m9Nj83*Z,ad25Mc$(h-9-U@[cFVr+*m'GH#q[`p&3rG#b(fZhb
+K6kmS2CU*&ZfB!+6D[PbDJEB'cCfbc![6lL[*)',%II`DpV8cJ-$j8M#l8SLV)V
@kf@$R&96+lq9X%94LBei``2DSpFD[G[m4Q-8R3LkTrMLCQJ58UdBSij'#2CCVBP
3D`cCRe0AmI3fI#q0ieUYLkDID,1rL+c6H4bNq0j*i&hXH@S#&IkaMJf"i23#H0!
'j"l)#1FcFpIMa`S4[rZYBCpQj6'YXE9l+Bm#*MkE#(C*"NekmXShmMhP"Ik&YHr
-e(@`'5`pZ0j*HB+jl)(0AaAiibi&,@#R2ZGd&'Ik[9#fVIU3!&+YTh-XYVJ,&BZ
b(KJ%H6Abi,5AYK3*9X2bS`ZKr2Z3!-(&0TUS@%hF3&SGRdBL[,5X)XQ3!*GTIb`
F5U&b8%CBpGJ#$S(5-G$!,E'fr`2)(`4mK3bZ6mfL%99P!32)j@XV3D2-Z(D&2dj
#@5`%Ldi38XA![+PN*D$2jQfXN@-NISdGr$lE1`+PYXHSi#ripJHYbpYYRA+&N!#
JG5A1ABpS0`ce9X-Z3Y89eha96$mX9eKM5Nbf&4!D4-0pRl'HA`9Na-D(2ZMi+d)
)0Nj2A#2q55q(S%6+"RH,h8ll*YqMH%JLC38IaP!1@%PHpKFLZSd8695p,H1Y+j6
SYLrKkf9B,9F6KKbjUU,4$baC&(!&2M+IT8'%SIJT+8mPKRe%%16(2,Ii22UC6jR
D[6)HR(0J1F+85$$$4FaRP@@a6,I9C)&lLCj'NL`50[aA+PSFlSJT-bl,lBaihPE
4NpA6P3HdV`$lN3N!cN!m`iA(3FY4l`3bMb'9U4C(MZ'UC!(Z51#Z#e@q"Idk1i4
9#,L(!Fr[*QDf@0)PSX`VBf`R)I$aBD@%LYJJ%1#"cKh+THYP`fJJ9U1Sb8!N!DC
PE1LYiSj@&XI3I5Tb'%GY+RfMkSXP*UB0J4jEi+p)!CElP'(f!F$1M8%3r(J80CE
lFdT@i,VG11&40Ai#6eAbPMh[ZMPY[FHH+6kRjVEHGk&0238h1YA0H8iF!N,@GYd
eH*ZmieQ$*rkdJ4$)rA*l@8aiEQ2XT'KGN!"Am2$qX`4P9CikQ95@U"HcG#3beN2
)r!30X@(Y@[-Vq1!If"a*ch&1*N+!94ApD%@Sa*E65&`1%M(V59jq`Y!Z!8['F4N
*1F-Y(eQ4jHC6IDHAcJB,hRY0e0"li5P,ErP4b9F&'9A$3mSJcqJ!kBq'%FSCB*M
SMKi#QBVBrHfA!!a#0k(&%I((Sl8KaYPf$iI1!d,j)6ZC1UfK3c[rpYF#RV(XZIi
99Pp+9'5P-$aR@P9`6MTDSbX0hADiB-+c1S(YM$'D%aUK(T3dFB9"MKeSi$SPRL!
%bD-pJ'Y"FG9YEaLEjje8ie@&R[hBa%JdARmfTVqc(6F!0N(YrJd(@)#fHm&hVEd
CfD+i!ZcFcEVa!-6RMP3VR",dQZSP49UK@a1iCbEICjiI2TGb,FrYBUk6NZ@KT"j
lp$G0)8cL!2#XVpJI#P#1)T)#0qXIA%VmYF0!100HFd0Y$hNbIiT1'MPC1j0!!cM
DYC4d+U'Kpd5I93N#1LNcLhL4SA'j!ia1Da5@lGV`B6'EBNKX-J5CIUU(qERA[*N
e%3@8&$M@AA`KQ%0e[Z`eQUh+)@Mml$kajf'F[l[BP-cI*c0RL0'IekPE35q[P2Q
3!!p$Hp`'Z3i%!e@)qCIL1(N[F[K!l"6&U6"&CL`)6bXCjcfh(ZPL0A8IU%eVTJI
l([p%eqlJ`PY2SKDNE`#8%qa)hkaDMFZm%[k6h@!e1Xch3jT[hDh2GQ[9c3&%TZZ
)c3YJa3AIdqHFBPR!)rQdJ4Mar`%L!),mTl(MiHhbd#ckpaA#YMNCLlJVmUD%c9C
S@K6INqep@f&QVV40N!$"BkPD(aPCVhr'jR[BTY'ql@'Y$GG8MG4kikHBGf4,3'h
EB0L(cTk,qD#,ik`lkCP#qI)RK@&8T&q6c!M9LM%BU81h0!40m(T(&YRjh,6P*L$
&HT,()9Pk9FNBDm2#lA0Ua1-KP$"RCHKFc"6!9XZ['+r,AlFq8r*)Q*mE#)!*Y9N
kqjmqLiM5R*8$V4(HYqUF!+ef2NejX9KD)q4%A'aXD*QRkR6c!(f89-*#%66j,Pm
B@r,YRC3Ni[,,dV1Gcm5,($(XE+Ub+&,ML[J,b(4&S!8"LJQamT!!c("HMI)+DN&
'JHB-LAb63`b`$ep'c,0I!U#'fppB*AY4Hf++$PK!q#9[fhNA5,d3,ra'0()ZM(F
3TcmU*,@3!2&,IeV4RaF+KM'KCD-e*pl0QI*Ff"8*T6q#bL,a6d!#-!Sh"'Uq@aR
-Yrk6C+36DkZX(UPP&T+4CQYIhd"%Tr5,(#bK0pUUa1[jFe"S$SJ6)J-RKfMNr&N
Pae#%rEFNeHLm$*)%rB2a2#DI'D(%p`91e+l+#LijS56E8j5C10mBe*2D,!YI+[P
SRdM$[k8#aalelGCa[kK034Im&qD,1FV`S-XbjTl13b$T)TY#)9U$J$UMd$-(5+&
&YVPLk,jA`4'!Qj%fTVJ$aA-4GZ6`aIUQ`$br,L@XTfA[8p'%dT1SGf,+$`)K9D!
iZ%p-jr8YiZBcGF)BEQT-&p1d'i0kRfm[rD`kIq!Md[@V-!jK-d`4U%#2'f9*PB5
m3C9UrE0lDA*q3r#)F'[Mm*1XbY9qGq$Ke84bc9i5`Z%cpQA(AHC(4T-jYhdjR-1
&N!$aKMV+([N5ZXq5"XVP$eFSRVP(+[Z5JbT)keaQFYN3i&M&UG'MQpB`I$Z2&h@
'8p50p#S!%T*'cP1a,#P$jY%6Cc0ZecQ2(LNZTi+Gh06mAePl@0a2lZ#ClPZ5eZ)
j"HE`SCQM85Ya"%@-+j!!`Qr&`HE'NkeCQj'TZ8(kB[YE49qQS&Q%mF!ia8R`U5H
F+i0Ck+5'NmF-d5H!L*lP*[bEcUpHj%RR@AR5ref,VmilSak5A'#lGlm*)QGM(JL
8mA0m'[8U`4Mi6%Be[j%+bjQe40lm`2P2$+Yf'B#&LmPUK92L"ZRe"F9`5-MMN!!
MDc2qFJ1@'(K9pf9%T4*DV`H!-!,8!'fcZJH$8LRJIcIe5E+`Dj%2AhL2c%h(q6f
AGkp,@f0RqHU%!['!e&9Pq4#L`D@GJ"KS),QGpNkk5jYaN!$)3+U!+$&Q-S+&KbV
fr1!8)X`(![L`X)cbCYe#4,-[r)&l#'MGfAJ&A0pEk'RG*j[K$Lf#8!"8)[dYapG
kbmiFP&6,f2'5@CUrKmAQ,frU5ZQ0,"Gb!)C0PqY8&[iqE9kQRIrA6DlD"j8RAa!
k'Y[)1BJNSKeqJpa3Nk)p8RPjTJ'4qbVkCb3pJ`))E'+-bR,'80$1"II,bjqT0@I
Q&%Y2-ea3pYa&2Tjp$0Hl`HkX,0mM*"5D`EXbJa"kZHCrPYaE'-[6mpJYVi`MIHF
)#CNUcb5N1,LN3aa&L(rL6XC[,QN%0ENdqj,15fR2alfM@,9!%3SfYTVM8G@V214
8%[@A9,C!dm`Pi"ZUK9IcS8N54iR0bchF+)HHSNH`!@U6j*LV58h+fRX-HAKL,RP
6Tdiq%$R2148'T)8Cdc`(R9k`'f3cp[9X!EL[X!B1J[J4)Y&ZG1r*Ia,4,d5b!59
8YpL#APh+fIicSFA'8P)R@`j"Q[qRQ0D-`FA1)XJ@XcE8T-M2fX!R@YhDLDI##MZ
#3ChQK,lZb6FKIEYTrp(+SC,rDBAIacS`&bj+PFi)ZL#(VE(RqU,8JG0*KK8,@CK
Q4cfqSj!!'4YaZ**LmbZ82N'f2IDSc`c"[+H6-*e`1YaG6kBkT"kLiQ2%RlCDJF6
mYahQqfm)jS&($R'1ZN%r"e+G&hX,k(PE6jA[`B8"PAp[P3fhBD83VZM,'RYMmZZ
lHYdP$P%XhVB,ebSf!a3bhbkD(51E9B*QP-rd!jTVV!mLTE#i,P*",ZVdE5+%RTa
b%Dk5Pi6-1,NTmGA0!hZSD2MLZV8rm*'&IJ@GS)5EE49rmPIKF*!!9SP9K"h')AM
-1L"lIbHNb"f(2V&p44*6F3$N*Vr5Hd#pJP)pp1Q4"UFQh!%H@GkQk`&5qP[f0fa
Qb#4UE*IhTA3&C31M@!C@Kj&Q[lIMCl3(Ej4)(TmL5`5288CqklKTNHPE`'4TUiD
YZjl1hj[eZ$S!&kKi&'E"VFY%q['`J+#PKFA)b,Jq1@JV'!9meZk4HUZm0[Q(KM)
ep43UP46rBha+K-`&6`*'lF&8i0N-PJGUCf%%q*ZTXhGf-AiK+CNLZ&%RGAUN+T8
,[+B$emiIZcN(ClI,+CI&2F@)F'%Sad$leLZU'Lk3!2jNm9VK,l@P@&c-"cZ#cQ8
DUD&146ej#qBUUG8CafF[S11aCrCeC"mjq(9GhT14p+Q&R$f+KGc!`pUH6GA`Yb1
JdajNT@jjr20qQQXH[Y0ZART5&NapP8G+65eaAB*UKMp!#1JdXI0G663*TRK%P*G
@Zb50#6E-1lf(ZDF9RV#d3YK#mF`rLFkckBTk!r4pkAQH1"MTS1e(qK&%6k*F#@j
aj@Gb*`Mr0R*lqea@(-,Lq&aLZ`CpN!#5dBqj1-J4Q*0lH-LHbFl,0lEb,$Yc$3d
b#VlB#l,dHLVZ#%3rjL3Jd(R(F%+`pERZ"qI,eYZX8EkhG)b-d9N-+'19Z@%,XlT
)rK#',e`%UZJSia6+0!SEllGNMQk#Tm+RbK`[f5LKDC1,VTQT6hE'hNGCD`,)Z!d
ZUj!!iD-"T9#$dN6BC(r,jkRDMSR+(-APiIpUYfB(1L+$pK991ilQJ@jpMEU'D!d
KBLJr0U"DbZ$I6"!KNC+h*ijN6i'8k[cf4Z,,HlI`+bF$GHNcIMVk4I[ZeQ@!!+@
3"!%!!$!!3!#3#3%-TJ#3"mi!!&kjrj!%!*!+TC!%!3!!03!!Y[&1mlEa6[-!N!2
1!!%V"`#3!h)!"BT,!*!15@0[EJd!!4)YD@0[ENe"3e0!!*!2J!#3#3(Q!*!$J!#
3"!m!3X(8iHr%)(JHNZXl)T0$PMe1&X9%h,U"-`j,RCS+U(NFRSIR`'$MA4ifZ1e
Np(bc"k[8Tf29`V5Ebi-dlUp1aif&(6j6c4PRTLP1eK5a-h2EPVY&cfClKmZkIGS
2aXQ*%PIPjC5M%Hph@9&a(ZfDKkIUBkh$)JJi(L3&)ZG6@!#PN!3"!!!`!%!!N!N
"+L!!N!Gb!!$NBIq3"!#3#Mke!!!"!!!"SiS!!D++!!!&5`#3m``!)!!)!+)"(!#
!998!N!--!#J!+!#Z!8i!Y999!*!$$!!J!!J!SJ%F!)*993#3!``!BJ#5!2!"Q!#
&998!N!--!%B!TJ#k!GB!KP99!*!$$!!S!#J!G3%m!)G993#3!`i!+!!S!-)"T!#
)998S#J#3!``!+!!S!*3"%J)!998!N!--!#J!+!#0!4F#!999!*!$$!!S!#J!YJ%
F"!&993#3!eS!!3#3"9d!F!"a!+`%!Np,!*!(5J"9!41)1P0[FR*j,L!J5@jcG'&
XE'&dD@pZ)'0KEL"[EQaj)'*P)("PFQC[FQePC#"[EL")4P-JGQpXG@ePFbi!N!0
D!!%!N!9G!(!!F3#X"!*25`#3"dS!93%6L$T8D'8JCQPXC5$5AM$6)'eKH5"LC5"
NB@eKCf9N,L!J8'aPBA0P)(9cC5"TG#"hDA4S)'0KGA4TEfiZ!*!$8J!"!*!&E3"
Q!)%!SJ3#6dX!N!8%!%J!C`%$L$*6Eh*bH5`JBR9d)'%JC'PcDb"bC@aKG'9N)'9
bFQpb)#KH-#NJD'&c)'pMBh9bFQ9N,J#3!he"4%05!`!!IJe6#T1%!D0Y!1`,FJ1
dXM)V+q0E6GjElfVhTQiQei!a!%!$!*!$ZV8-J!!*D5Vqi!&9%Lcl5XKE$Z2PFlU
&8Bkb2mq2rkiJ16HX'[J4bSBeHBCLSfGVm+aH2`AZl![!X+N')MK-9ckpkmZYSaN
$a4aC5aXi#`#3!d`!!J#3"6%!C`"&!+d%"&&eDA3!N!8+!&!!(!%3L"T9EP0dG@C
QD@jR)(GKFb"cG@0MCA0cCR9X)3#3"3J!$J!S!#kJ!J!"!*!$e%&%3e)$!!%5$9-
+Qb3!1iU)LKA2&Y"cV%4X%28X2hmrl0HG[qIZcJbR@0KK*5TBK999BZ@rm35aUJ8
,XQ8l6L$jN!!I!93NQ2Se[)@RhFACh8h5b(U5[AdI,N2FaCI(T3X@qBdi9dq9p3X
N2%U1NN'qk(5em(4U&CSL2JAQ6XFXGBZPFi&Plh`8(,JebXbQG8"2"b%-6&H8@Cb
Y`EYPFb)Ah(i-H"r`2%#L6q-DV)Mdc!mhH5K3fic)FDZRR-9M@e'jc-h@kB'VP$I
IbIX-kIp8rmPY!*!%EJ!"!*!&D!"k!(`!YJ3#6dX!N!G)!&i"*BK18fpYC5"TG'9
YFb"hCA*P)(0VDA"`C@3JBQ9MBA9cC5"dD'9j)'&bC5"ZEh3JFh9`F'pbG'9N)'*
j)(4SDA-JFf9XCLePH(4bB@0dEh)Z!*!$U8&%3e)$!!#f$9-+S`)#lq3%RIe6X3r
20R[6fe4df-HFLZM8#BTkGR2ZaZNi%!m91faR93P@9C!$)GjY%k[k!3Z5$f#*[rQ
3!!&qbQ3heb8D6Gbbc@3d6L&F`k&$E$C0a1d64BTRk$3aJ6Tr03C62XCMTU55r6c
p+&$rDmb$1ckA3(pH"EjQpH*A)Cjm5p[plRC3rBR6-dfULZ8aBdPB,[3#NbC"%Qm
I(D`#!*!$1J!"!*!&8!"C!'3!N`3#6dX!N!8$!%3!5!$SL"P8D'Pc)'&bBfKTGQ8
JDA-JC'&YB@GPC#iJ!*!%5!!"!*!&4`"D!&X!P!3#6dX!N!8#!%8!-3$SL#GCEh8
JD'&fC5"PER4PFQ9N)'&Z)'PZBfpbFQ9MG#"`BA0cGfpbC#i!N!3S!!%!N!@U!)3
![J$F"!K$EfjdD@jeC3#3"33!"!#L!@,!!J2S!*!$I!!"!*!&D3"M!(d!R`3#6dX
!N!Fp!'!!miKF9'KPFQ8JDA-JEQpd)'9ZEh9RD#"bEfpY)'pZ)0*H-0-JG'mJBfp
ZG'PZG@8J9@j6G(9QCQPZCbiJ)%&Z)'&NC'PdD@pZB@`JAM%JBRPdCA-JBA*P)'j
PC@4PC#i!N!-H!'i!KJ$H!H3!"3#3#!%&"P0dBA4eF`#3"KJ!0!!8!2`"HJ!"!3!
"!*!&!qJ!N!18!!!"(d&%3e)$!!6Q$9-+j#)!hhB$MR'R6XAbV0j%XHBmX)IiV0j
8,+HJL(G6Cr8c`3!G"L,18R4@$cZXm[rIpjiFhYRYG&J##k#MF"NjQKYpM08c$@f
cB&cB,DfDBBi[Q8@'KZhRa2eh1KGblU3+QbXZmrjdJl+K'E8"E#iG,'U!L9ATB$8
iH")""%H4JmH*JiXFe$A2[B2Y#,$K`U`5"0`DJf#cY2MX*ChTT*3S[2"4)pjUZHH
r$Vc5*(XM!dUL`bYl#@3++G+qArAV)0Jeii&kIZM)c)ei1q,`DdZCb"5#5`TS9m8
NY6&2mINh23-MRM'-lh6%63iY205!1aPr01FI1[ikDb1j$**hNU$CKaEqDXNA6IC
m`&pcThAf4L+8'Sm@!!!(#N&%3e)$!!`S$Pd,V))N2ZS-hqrZ1!QK5SG3'UP4i34
(3(PI"fEcS0Q#K"92C$K@P-9HE6bcNT,DRQeBDc[aqqT$D#eNV8)&DdiZN!#%#AZ
,hfper$l&pI[)`U"CYD61l#ke%eX8NM![bE+N5i83d[Fl[Hr%iYTckrF($HIR0$%
"*$3M04p'j!kP$U6rDXM2CJM"X&PTH0km2Rc"[HG&*i[#(f(pFTmm#RB-&ck*PBN
HVS0Ka)H%LDfKbLLS1)"iAb3)Jc1%ji')q4!C1e$+EV!VUAf-f1i`r41*8jqrIEb
"rEcklR#mrrCRJq1ZiMrE`$GKa94jU6lIZC+pD562CdmRci59Rbk'XX9!h3"XQ6c
JqBAi*cH0kBALkBGRaJ2-hYTYaHF0X#p)F@%Qc[1G#a"XIL%ELH@5#bPrb&FN!i1
YP[[jlmh%-jAekAJS-Tbl-E)iZ1NUIe-VBQ88rJ9pHaHLJ@Eh`JAEM3p+f0FSl%E
'6qCa%KQ%2iP,fai+q-jH!bq+%HV0m$2&U`*Z8DmCK6Fa4b)0ia2aZ@G9,ZE96jq
F'A+Ij$iHhQhJ'jH5ilPL0P@@RLYfq+@YAja2bVlDmpZP*2I,Z@h,"(a8`Dpi+2Y
+*E`HZ4D#c&!IJeYh1f)'[V4[2$Rj`rR3DRRZZ4P-krfTLRlUKe(i$rbX&E"H4f%
A%L*8[*bH")%13M,hk!)G4+,3$D[JBV+Bjf8aYbL,qSpN%HGN)5K8P&!iK!STh+E
U4DT8TGX$6l2Np#Xa@8ElR,`XQErQ'&P+VqH5XPaq[HHa,'[HLHib-$qZ-$#P2h3
B[-MXF"J%MIj%-2JJ0p8U(mB,prl%JeVVm1,)AeEZm%SE*X-`5BE*-dbU,YN'[m&
EE"B'2LhLq,L`#pHl0G5RHl&m3iqUh@40JD9(e*HQ86pSY4)kbiIU#Uj-Ef"*EcR
J+"8ZAeLlS$BFA6-Mk@jidB4mU*AB2SM"$YV@c)e6ZP[!58"@0Z$l&VH@lU8)$TU
qSJ,ad0G!-NIYF!j!F*SLDT[G(%-YY1+4d3cZ'8#`BSaZ+d%dCmC1$q(@5Y0rN`q
4-!-1ha'[$Y%FkIYAp)0PY8QXb)b)T$fUCG50fMlBQN0K$6RbLSHeq,iNERPcAVd
2Qe9[[+(EK2lK4,8$e9plc0*lJPa-QD5UA,mZQbUjH0&"TCi'BkrrbN%mb,j!0r3
@J3lQ8k*c-HC8KkQMJU2r2aJGiYI$JP0PlehjamNGSp#DZrFrd!Vk!ik0+iAq'Y,
8GQJ8b+FSE'$8UEldrFcdS3m&(mk+)&3YAHAqXNrYkrZ8F[9L`#PmMI6H+Hh-((8
LkjhDFB"S&TqEeBi0Ud!1!(&rJpk4f@N&#pS'J'H20CY"b341$fQhhDmiND1JaHN
Q)bkIkK@TGT&k$DIBHaEYcql,N!#4DFY,JhDhiZVlbQI`3@$8hN,c!hH0%aR+R08
FMJhh@ECjV+P0"-Zd6F35M*55`k6eCJhMU!Pad[(@4`i-qC2)FY#qJMUR`YdCfbM
k1+r3R&+J)(jr5rhl5'YA@SKK9%!H!r4H%bbXF$[d"pU$B5U'iClN)J&HiL#@#!(
!L2qjUqG!m2IZ$Cj[E,49[EIkj1P%RrrplilrR[f1Drp0IhAHNmemXqPLE,dL6N2
c[MTmebIael4Xb*KF8MHPb-KfkFhFFMMC`MmUKV)T*T'3!)2Ae6fjaI9)fU+)ij)
8%AiRFG(NYp%@hXk%(Q8Bbcj6m(CIRC5SP#5r$ZF!$h4)A#jj'S*I+SED&@CfhK6
FpVLZPQrXXH96Uf02NrfU[bF5ljA5R4hMrU$R8LQ8U)lQ'fK+'"6Di#a18cl$iNl
VlJp+rKN84R%G82lDSS,c203D9B&$eBHXGIk'SJb-+l(rfG(,Xj!!DEJPcY04,9,
L6'kQcY'!L6Zfbj2jCblQ4rRY%feAMe6hl#aI[L&2l*K[(6A"U@*M-"M+KMFVMAc
GZp+Y@52A'"`acI,B`SqD$mS[&rh"B1df%Ajb5p*qEZ6m`5(6P)mYmKN@+"XUcXl
6Z!R*AdRCJ'RkYmE9`DZf)5QrkCU0"KZBYS6dV(%l0b3&6'8"2YK)i5r%+M)`#)5
pZK+HQ)46m[i,Y&`!4QcYX%5[kfc2IK"GY2f`6%#!Z-*dZ5E6YM'#C"Jbl+%p0VT
KKR$,KbILh%H2ldDLRIm$L1&i+'1D)BP#Aip8rh[I9rq05RFMf,P*YLZeYS1hZDV
-RSReYqdQ+T!!rFbi0"[YfR'cUAf6'*A&PNUqjeSS*)5cKP5GFBQ$Lem4K9,T2`'
9dfT#+q'86&fLP-,`J3K(+Hi(,C@*R(maa1K#99,Uf&MeUrA*%8pADE*328BDZ%I
9arQfr(+S+E`FXbE0J9i'#D503$%DUN3FZMEEJ3Uc`S,"3PUK'qV+ecpqDb)@pld
!!!'e384$8J-!!XJ093Z8SX6XB342CpAGe5'%+QYY#3bBY"a*C-$N"+Jb1CP)"J%
Lhk'N*4q6$L8h((P&ILE*QIaYB-%fhNkIDAH&K%Nb%pNN$FJRfl0MlLe$r14lMUk
jBj1#Qf1pV+J3!qd-q")[6T!!2&(NN!$XH$VqIIf-lF$JY8&`Z,`m2Kl(N!"fG26
m(+Lc@!dY,VZ@Jq32[ecHi',DFQR`2$R2R"FmEhPV5TS[8GIj4FMFPUJN(S$krrc
HmXjTT(LK4Sf51[S8m0FeEMVMk6SYm6VJhLGTV1lRVZZ"EaEFUUI2-L@THq[lVS3
2kTfQ[&34P4,qR6LH8leTcUSC90r2)#jHlq(PSQ5$"LU+0r@-Q$28$kPkq[BSR&*
1dKE`$GP@`m[M1pi1h+5UIP(#Y$f["YEirkXd45,c*elIF+LUHqKZJ#aQ&Jj&V0F
0QfVhJ%U,iK)b8Rj5bF3(R&Ge&@C#A#EdNS1e+6!l+jT"0GNjAjJ,"X-fS4558*P
XpZT"@GPQ4BRK,$U&MK11kK6e3me$R&PmRZBeK3+'[KCeKV"#+i`Erm##D%'$C3Y
&%VFINEJ[pV`2cNF!!!'e384$8J-!![3093[FXX#Y$`3R*l4pR,E+,9cS9G6V%Tr
E2UVLrRe&k`k+#h8laU81%*IMeD[KZ&rGYQdIS"8K,pp,FV&4FGX(#qXa#P`NCE4
GVrbAd[T#VfM,r3Re*3ecY$mEP0C#pVha3DjUN!"UKaJA-eeFRekm(d!DYF'LjIV
ki@'lV9ff%4XfTid[`MqGTkrIr-H08Z2RQYdRFfCm%reVr)q5ZeS&TQ!EF&3"+6i
#@"Pd!%iQbLiQ6TQbP$"D+p3#T3k[%+J&a`QB&HN9`e%"!i@TRSpq41E'-KF*+ef
Y3YXIdm(#Tb4#d[D[L[pkkf4+c-ND!HN5@EpmG)mZV-J)Iq[a,UXa*kPPGerLQap
2iR2K)Nh92bG[iR,lp(Y)jfcaeb8Hha*bcRH98B[[d(Y'VT5,%hmEqZYhrMc'4hL
LD&YQKeplle"Flhfm[)H#CTR`3'M"adK5D0hlB4H60&a8F401Y5HehLpe#)T8"HB
1aEIS)*JDH%-bDfGNB0V9N!!SjLN38TkRF"(GN!!D('BaRVX@iB#Rb*UTJhNT&Z6
12U1%V%JKlaXIpiKYGiKCQC!!pPcYm43#!!!"LN&%3e)$!!+d$98,R"6&p9%!hb4
j54VAQQc[Y9QY`(p1RFT8hqPl9Ri9f!Um#Q`&!,j@MEDeZEP[lT*ee`S-%pN4!cN
3c9F'jrI-mC-IZ6ph6qa+GR0XIaXS4q,T@IMkII8#j)ZL-j,2I"hr[[dG9f5[$5+
hcl&C-MEhRLRXdbr01c3U2@pDXFKTGZ(Fmkd+U6kTDI&,cPa2DK3HSITrrZMjP+3
b2#K9DT5&AV+qfqSU!kjPN8RAV,ZAk&6EX#`0HPbi&UGEc#@dD@[,*"r&Na5l5B6
%*2mZh-m89c%6-8#Y$3"@1i0ALf%+#b3%GfQXKA05lq9S`EPBLAj8Eq4&D"r!(S2
N50#kmM&4LfJ6UL#,pS82Ei#*`@k&G+U'aeJmj2p$adlZ)&Le4LV)+(D3!!#09FG
(9'3)pJFp,$-Y'EP2#-b+Hr+4+K!XLeb+8j!!Q(9`F8!kMGP!SAJ2#fMEM0Id#YU
*1Sl5`QdHYK!+Q1GUP3%(P8GKhIi2'&60&Kak'&+irSc%krLeDhBd!J!!"$0"4%0
5!`!'G`e9$8-L%K(QAQi3C#dC4'Vb4#3,%&QVTLBRYcf,M1"fjmK*Yc06mTPrGlr
[fiSm'pr-Yl9!NYA1l-RN5GLq1j-4NZ9@j)QXb1mIN6q6RmQmfGCf%8N@%l)h,FN
L+%$L"rp1@BD49%3iU!XlH1)RGL%XdS$Y8-@K&RB5AKr2MQN-Tdqr@5Tb%b2*lEe
NEa2deYr0KTa,b#P((lQrdKDbpHCeqFBN#8XTDGMHT"F9Nj*A@5m3r1$*iF)A(Ra
+`bCSd@*%bYh0[UE$mLb8Z8NZL1FKb4cpaH#,'S2Z2"A0G593mh5B(ilNbH!U(HD
q*03V2L&LN!#Glm-GLj)350pE&JffVadV0j9c-)PcYTmmT-U'cCf2[lLr"Zb,Dr,
j*UQJ&eL!@HMeXIT'U5KXK+Zi)G(%4'NH4P'P*SBS*l2%Ke)*Td69NE&*%bSLi2'
$"P$iBJ#e%QfCd)!P0"&UFSY0QF0BUD3IT`bXGDL,fZ$B!U8fSh08@--BYZrp*)$
#,J2%1@+BZ'k&r-qa*h(XSZeGPi*0bi'TkX2@JbVR0)ahG0E&J(3EJ`[@YV@,-D*
-cb(Q-Y`6mPcZfjMcBMp"cGLljK3Rb&aVTMai@-PP[RfUT+62k1U0klXYd-Kcq8@
f`RZ!4-@X%K,E)89)*H!)2HGQk+!L4L(61rDKE[-93T%lT4&h#Yj6*Gq@)$NpfZf
T-bIQ[*a$ZHi9U@$-fpTGbR)EqIHh6JN-ELhIr*F2iT-R9S%)rHb*!9X*2'JQcVG
5aT+bk)"66"T!8Hh@RKiMNZDb1RCPrpLBBZE'f'*+5Z1k(+rRjMiNk%bc`$2Y2dP
bk)d[lP"05[[rh(fm5+9i5KpCGN!BDPI(P8iGH))aB&$'@AMak[HhZkICP"IAk`2
0U"30ED$cl3ANPB5bhE"dKJq'UT!!'MJ$K%Ef[#TaY#Qi5[JiZdp@*Ek(V6S2"5L
GMGP9XcSTH`kX!)Q$@e`Lj!Hc!YeF"G@qBdCpV(kpX(EYJl32qi0AAhd*'kUV,i&
`%M,25lL3!)9HJTA-Hq-JNiRVb1C`%N0V@&,9LJXedG30VZTedYBKmQ8[pD@$C2L
X$T!!US[$LD0[BBPS9ake"Bi4i"NpQ[B5,S$!l!aZkDY"[CV-MSM(ZdcHrYqi$lH
RmXQ0Uj1Q&hdZmV+6dc$Q@CReZ"0&fVV&S"Ua`C3d8JpM+h9[1peJ#QP[H2ESABr
bfDQ9EXl,)rR"Y(aV,(DK,&e(qXHCLJYTG`ceq9R+jqIUrhj)D3VcIeGqcX4Q-Il
fpqABR&9R,NpTEKEkTP6FE&CkmZ##0U6Epj,8cI&CH25LN[RmcjI[Q)F-e2@eAFB
V*qph(["`34I,9E@$fDIYZ+ZVJh8&%Tl"cXY,fjl%2ZKNB,XDjI@RH3*a"UE`8,`
*ALRF`jGi-!Gh[Rked&R$@pIN$J#3!``,9@j6G(9QCL"KFcS!N!-)"b"QEfaNCA)
!N!-m!!8%)'pQ)!FJDA4PEA-Z"&0dEh!E5A4PEA-JFQ9YB@PZD@jR)(4[)&9Z8h4
eCQBk#e9Z8h4eCQCTEQFk!*!$,8&%3e)$!!!`$8X$@f`,YfS!N!@S!9[Y[`B'!r!
4fr*r#&K#bBm'eKXaPa-!N!-'!*!&$3#3!cm'!B!!N!-&0Li`,M%b0Li`,M%X)%0
[F(PbD@GSG##T)$%j16!Y-M!`-5""E'&NC'PZ)&0jFh4PEA-X)%PZBbi!N!-L"J'
!!*!$"6BZ-#ia&90dG@CQ5A3J4'9XGAKPUL!f,M!Z-3#3!``!+!!S!(m"F!5[998
!N!-J(kNJ-6Nj-#dj1#""E'&NC'PZ)&0jFh4PEA-X)%PZBbi!N!-d399c-J#3!`&
*3diM!!-!N!1!!!%!J3!#!))!!`#$4P*&4J!$!*!$J!!"!)%!!J##!!-!J`#3!aa
KGA0d!*!$!8P$6L-!N!@%4P*&4J#3"B3!N!-A!*!&%!&+!!!"!!"N!!!"%J#3#*e
"4%05!`!!U!eE#PT!!RIi(&CeCqR%2P6X%(Y60h9ff+'2YaYlZYfEEiHc(faB9@*
9*9K9BMf'(9B&#DJTT[J,i1(,8`"QDIbQDRi#lM$$cBqlU)D,4ASBB5rYZ5acTL`
96)r2pNKjl1M&V$6BJ'b3!'ZD%ZB8DBKG0`9Epd3(4ED8d&f,-,R*JQ8b36(T0HQ
lAa)VPkLN[F!r*`mLD`#3!jp"4%05!`!!UJe6#T`#!Zr@j3bJ[U#@m9XCReQCTDd
@cmSkYcGhYGkYfl2&Ej`"J!%!D!"JC(0C'3!$#DJTT[J,&1R$QbkNIKkRaq`VEU4
dMCZYeC+69%EUD1rE8eAPM-)NM2YcI8"Z'lbB&D-,`U9`KYT)$S[40NdGA$B!#a9
f-0*INe$h8`6(+)1+dE24hj!!*RCpBZREE[)VqZ-BbIX1!*!$6!!#!*!&#!!d!"S
"'iJE8'aPBA0P)'PZFf9bG#"NDA0V)&i`)(GTG'Jk!*!'#`!,!#X!+k!#"%X!N!8
G!$3!,3%BL!*H-3#3!cS!!3#3"6B!K`"+!-%%!Np,!*!&!J"&!#m"2iJCAM!JBA"
`C@&bFb"dEb"LC5"NB@eKCf9N,NX!N!-B!$`!3!#d!CJ!!3%!N!F""`!!+!S!N!-
B!$`!3!#d!CJ!!3%!N!F"#!!!+!S!N!-9!&3!C!#,!BB!!3%!N!F%5`#3"!G"8&"
-!*!'"e0PCc)!!3#3"!G6C@Fc!!*r!*!$"e0PCdi!!rm!N!-(39"36!#3"3%!N!1
!!"rr3!!J!L!!)J53!!!Q#FJ!)K2N!#)J!J!L3!%!))IJJ#%2m%!L($!J*"Rr%#J
DLJJb-SSN*M,b-Nid"MNQCI3b%Q88*!KRr!J%F-!3!MrJ)!%"J%!!KX#!!%!"!!!
J!J!!%q3!!!R)!!!%N!!!!!)J!!!"3!#3!i!!N!H!!"rr`!!rrq!!2rr`!$rrq!!
rrr`!2rrq!$rrr`!rrrq!2rrr`$rrrq!rrrr`2rrrq$rrrr`rrrrqIrq3!crrrri
Irrrm$rrrq!Irrr!$rrrJ!Irr`!$rri!!Irm!!$rq!!!Ir!!!$rJ!!!I`!!!$i!!
!!F!!N!1!!*!(!3!(rri!#!#$!!Q"!S!+3J*!#)3#)!N)!K!,d!2i##!!#!K!!!J
)J!!)#3!!#!S!!!J-!!!)#!!!#!J"q!J)!r`)#!F-#!J'ImJ)"U#)#!bJL!J-!BJ
)$3')#"Pp#!JC4`J)'Im)#"``#!J2q!J)!'!)#!'`#!J!!!J)!!!)$rrrq!IrrJ!
2rrm!$rrrJ!rrrm!2rrrJ$rrrm!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ
2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ
2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri!!!"!!IrrJ!)!)-!#i%#J!K#!N!
*K!)J#%J#%!Z3!!2i##!!#!K!!!J)J!!)#3!!#!S!!!J-!!!)#!!!#!J"q!J)!r`
)#!F-#!J'ImJ)"U#)#!bJL!J-!BJ)$3')#"Pp#!JC4`J)'Im)#"``#!J2q!J)!'!
)#!'`#!J!!!J)!!!)$rrrq!IrrJ!2rrm!$rrrJ!rrrm!2rrrJ$rrrm!rrrrJ2rrr
i$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrr
i$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrr
i!!!"!!IrrJ!)!)-!#i%#J!T#!N!+4!)J#NJ#%!T3!rJ))!!)#%!!#!L!!!J*!!!
)#J!!#!`!!!J)!!!)#!(i#!J$r!J)"``)#!Crb!J'S)J)$+#)#!`"L!J0!BJ)'Ad
)#"P(#!JCr`J)($!)#!ri#!J!B!J)!E!)#!!!#!J!!!J2rrri"rrq!!rrr`!2rrq
!$rrr`!rrrq!2rrr`$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrr
i$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrr
i$rrrq!rrrrJ2rrri$rrrq!rrrrJ!!!%!N!1!!!!"3!!!!L!!!!53!!!!#FJ!!"2
N!!!J!J!!3!%!!)IJJ!%2m%!#($!J""Rr%!JDLJJ5-SSN*M,b-Nid"MNQCI3b%Q8
8*!KRr!J%F-!3!MrJ)!%"J%!!KX#!!%!"!!!J!J!!%q3!!!R)!!!%N!!!!!)J!!!
"3!#3!i!!N!H!!!!"`!!!!q!!!!I`!!!2q!!!(r`!!$rq!!"rr`!!rrq!!Irr`!2
rrq!(rrr`$rrrq"rrrr`rrrrqIrq3!crrrriIrrrm$rrrq!Irrr!$rrrJ!Irr`!$
rri!!Irm!!$rq!!!Ir!!!$rJ!!!I`!!!$i!!!!F!!N!1!!*!)Gd&%3e)$!!#!$9-
,@b!$!kCJ`kTUXc#`!5*LB$G,XGYCPD!JBX-HkYR!Q&8a#f-UZ[HR8k`+#iPMb,E
LGpB!8LMpiEh!JNUia8#RBdJbMUrCpbBL$VrTa[llf*mk9dmSTT%&(C'kJKQiSm8
DVUKU*k42-JV[4Fi&!*!$9d&%3e)$!!%"$9-#h0B'NrI54Xe&%fd!Y2Nh,VcE64Y
Q`QbqU`[IK0f`fq6GGYA9G@%!#6LPL2pd"ISD0+Bf([[%R@[C6S+*X0-3qX#ck!"
SN!$&[[i%[JB!N!B")N&%3e)$!!1+$9-+Qb3!IiC&X0dj141`a3jG5dj2(GX"&32
EXIVB$&EecMiSU&KpE-&ZV1V'`$pMIe6d[rp[Mr0f9KR'kJ!,Q680A&D0p-'14[H
Z8aVX",2c+"6FaH)b3VE8Z5$*F`Z3!0p[JRD#kG&%G-mTHE-6hEc*lLZ&K$2-5eV
UQP++(3Xq(j[6I`6`H[ijkXV6kQVrRepZakZIr82rqj'@*3+i-fUMJQe@`8JQ[%@
VE)a9Y9jE2Q+EYiAYB49ph"I'dPT-T*5d!R%I6(k-`pHZ'qD(TKRU8p[f6Gd2ZK"
S@S!R"-J!R!"-[ISY!2lU#3-4I`$`SR,K!K!FJS!"JQ*J,6L,N8'-h`a#j")kiZT
MNXbp+(%I60pdq8A%+fc,'!#3!c!!N!F%!!$rN!B!!3#3"`)!N!F$!*!("2q3"J#
3!`B!N!82!!!%!*!4J3#3(S%!r`#3()%!9#[r!*!DJ3"8re3Vr`#3')%!92q3!e3
Vr`#3&S%!92q3"93Vr`#3&)%!pID3!e6fN!3Vr`#3%S%!pID3"2MfN!8Vr`#3%)%
!pIEfJC!'9[IfpL[r!*!1J3$ep[Eprj!'r&EfN!-Vr`#3$)%!pIEf9[prpj!%JIr
hpT!%+rm!N!U"!2AfN!2mrIG@Ij!&Uj!$IrEf+rm!N!L"!&6fN!6rIrCr+Rm!N!0
89(p@+rC8+rm!N!D"!&6rpT!$9[riphmUI`#3!e48UrFVp[p8+rm!N!5"!&6rrrD
3!rcppeC8+P53"AqVprEfrrp8+rm!!)%!92q3!e6ip[prpRmUN!989(prprK8rj!
$92Mr!!$r+e6rrrEf9[rhphmUJC!%V&5V9[D3!rrr92Mr!*!%rbY8rrEfr2hf9UX
UJID3!i&rrrIfN!2r92Mr!*!'rbY8p[EprIG@Uk[rN!CrprD3!e6ir`#3#2mVp[C
@rRrhN!6rJIH3"2D3!rIir`#3#[mVp[C@rIq3"S(fN!Ahq2m!N!cr+rD3"[q"pj!
$pT!$prMr!*!1rb[fN!2rrrMrrrMfN!2hq2m!N"$r+rD3!rIhq2H3!rEhq2m!N",
r+rD3"&6fN!2hq2m!N"6r+e6rN!98q2m!N"Er+e6rN!08q2m!N"Mr+e6r92Mr!*!
DrbY8q2m!N"crq2m!N"lr!*!a@cP"4%05!`#qeK"9$99%%J!KBZj@chfq1BrM#%F
)D5V"[)53!"l4*+IB6%DL*KF0jj%Qab9+C#`j2prF+56a0JC*AIqF8k)%%4"a'FF
b0"8'NS!K@*CPA*F*M1eBeQA%8XC5PPT,U@A&XGDa0XEFprGlR[IZ[4K&1Tfrrmm
!'U@R*-U")%L#)!JL!`"GNrpaeIPA0D)c#(cI3SDq"-IikiS2QCUI!#RaGirr`"d
hjAhkhfSV4Qp5VYjr'eEFm)hD#VT+a%'qqJB4YG8((AITI[-C"H43lIjAHb[X6qr
GqHlXNGq"f&Nm8[[ZE%b`-6i2@[VIrB-64+S2"cT56T!!HjmBq25RBGY()&QqqiG
3mTGVR%20bcmFf'YqpcC-Imr6'CLZj1Rpp(Ud)RlQmfISp@K&SSfR+d%8V[[mQB*
r!JJq5*qd%b!JMPMlPj`,abeKS!)eRVRmUZA$JRm#(5N241EXjT@+k$Y)[Tr2,cq
PXV"%T@lHmqHL[e"*r-6aNfJlTI4Ir82C4qDAR!N3Uk,K`RL[qZI1Af6f@RZV&lY
[iHDaF#&20JE'c(QrbR22iUiHYQ&`8D"hhdGZ1F!8"X&1AA[8h[NGXF(RcS3$%9!
RMXmDFckRBJ963C!!G#ZEbP+(P+9U5QHIhFir[qMm"5A-40-[4-0Ak$EMChR'&'S
+61(Q$+dj-%81&5q'0JkTDjZr%GMXf+`5YFTHV$p5PFmNJeFkdXlRMja5MMhr@A3
HLcq2aCpALG*[p5KhE[Fh68PHZQ0kdT3d4mejpdIGVMe(D#Lr'JXlR0rkJhRZ',m
Ue+khIHX28qC1ddmKFqP3RIHdZe6Q*1ZNbRCpCe9qD4%46GYfGYc9BD1S%(ZdSrr
GfD,6JiQF8R4+'a&+jH$0rbTH"'LiTlZj`qET0'KArPq&F[RL&"fSXNZ2)V&4qqj
Y9Lc4&m&d"L)CEENrI9*Pj)-%M(q)PU[3AbpiTIH(5R8[c1Y6TSF(8mX,AS()NYM
fXiammapRcple[LS'3K6VrHrH%VETBaY""#pBQ['UIl(Y%mdl850j+&mCKLe"j!G
%lKhU[YIDF1H#F%3I'cqZ[c(q[&kLqrA8q#k3!2e66KSdchjaa(c2+SA&0-h@5dC
qpr09+J+bFh`NjADmI+8!$2km@FApEcffb,l%#Up%N55rA)2$EMHbP2[6hEZY$FR
qF,cCcXZJl(JGSR*X@%$+m49Yj$[U!!&Ia@Tc(PmN$SpIX)a)eD[Z!'8-(VC1`m[
lDc,@[&bT4cf-B@QPb*Kf"M'icXKJ@dRGMe%3[&)kI&f%[#m#jAlfb-XTS+6RTS#
#PdEJZc[h"YjGXA()EZp!")51#)L#TCIcffVIAD(EI$G6F*[rk&3pmB+T)mTYbdd
U)Qml#PjT8fE,r+[,NqEH(q6GhfZf@#aj9mqD*Pm'A4ReA%PD,'D,,kX456hc@$J
@[IS!0R%QD+,(jD!$r0*X+8rQA([rY(ZLl5r94jDq&)JrpJdXA3`Uq+(GAZ%N-Pa
(JU)9Ndkpj*iqHe08MIH2(aZpkGd+C*EAYeDf0R8JF1afLU"SlQjf0Lp%*-IrDI@
I9Z10JCG!&)l@VY#(3MQRML&LTZqA-dF''jA24!84#,[4F#`8rb$U5a'D0Lpb1`V
QK@p("Nb6GCl)Je8GLEfe-reGpq+6dA9V`Fc&H5$Q15`IiYSJXX'jPr0$b9%!hZ0
,2kUdre[A2c`(i,YVKMlN1kIVfV(@-9mU&-m$38q,c[YSV1XqChrA$(1H!a%"ZpA
P[-d+M6mrV@6Q6Y'Gb0jR)RYICem&S[r3b9!S4p[3R+G&'B!C4+I5eZ(ikH4([61
[ap'9ah1fHr5[p+&c2FGp3B1503C0,jMj`c22AEP1G9h$RlcRVYMYAI-YY9hA2hG
&1ES@&FcmQK[LL*U(i`U6TEKJ-JqM3+KYlm&2U'$H0mHF454F4)9hiPAmbCmQ%$P
jj`)-Ai5S6Nh%+cSSDJD!$*)Y&450DUkpiD[QecXiZNrCQVp(dA,+"RCAM$mh%U8
A+$Ur*kih!44bDJ6e"KJHV!Q3!(GF#Xm*m+h*#P*9H*rc!A0HUA,Z94&chY**Z9G
5P'[&CNeb(k"AKl4ANdI8l,ISEpeEdk0cMcM4f+CQ6k'rG92ZMmi&+$GpXM2C5"I
LjV`k"@#YL6DSFA'[LQ'l0d[9l0ITEphVpdER6PTpj0ih$k!BR,AjkbLb[Vj$aCe
TjVaCNp'0S4JaN!$$+CS4)%*ZrM-35kTj[!f4AmM`V122P`H)iIh%lRG@4a[5c2-
243lfcr5EVcl32c2$I-hD)fZcAI(C%qK[hB3CdqCQjpKQ(0P2l(lR),&epE**jU[
VN[[lC`E-hm'P5lJdDHf4dVL(e@Pc*c9Qdp*R6GB$Km%U2KUcEh*6M0REQC'V"cD
k9(IcH(m*4jIhM9XTqSQLbXTZ"b$9hr82BCFV30(%bJCL8ImeKiS1+G['3`V4`5$
C)N+5!V2PNI)5YkZm@`a-d%#p&c&Y0Q`I0,6jrbmR8C6UMhK"B83!fSLKdGa!4Ne
a%I+CiANlZJ()hUGE8EMCN!$G58&Ad("NfMI!Uh'(MQqH[+A%hS6&9)bA8Z$@',`
XD2#EfahX#aSm+Gh"5`Me@mmC2-!5MVUYY#pZITdq(82f2RYIDc1bZB4+Y2jC0LU
6-V@fBj*8bGBrHcD$m1!4+++UZeap,aSfK9,)hPc`$S8844,H!f1IH(ZA5[Nk563
iXV0$-R[DRqmq%dT`PTL'5jGTU)bJ,&FjGb%#)dD[ICX&Ujf#e6jLYrPe#RcG$l$
GT@jdm$9%Fm,M1EY8TrHB[V*3mR+qM*Me"-0L*`,BR!I`I6&I66Xaj(`Z,J'jbmU
"[`2dJd5kLC!!6*RfqVYZhJY!ZBX!rcjr9"p$dhTZ@Zjf&G@TI6LZV%JHDm,aKAT
Yq`aQ,Q-MC96,J3BQDrrlpEif5[b%LmpMfCN3Pl[3A0Ze(MmhBpJUIck"e&drmk!
C!SJ@3J0S)!U+Q"F&@I3S@&6R,@pR[P5lMd%`F38CSqkIN[N5(9apLhIa&(90k%d
)XP%1A01S#%PpQdhpAFGc6!LdlSlqVY-5TC+Q4J8"ZREPDfK&ef(dFC@ck),'6aU
,R!NYLb8J[BJM`%'mYee-$LHIfpaeBZq1VY22pACG(VhTIGpHFeI9k%eG!k(VjVK
4(#LefX2#LiI!3NH-SmirX)jGcJpIN9feh&cl[Sml-hmiMLLC0'V!iCZB)8p$jh3
8!a$p$mh@-4*#H&TJmd9!kIBVaQ&ITQTFHhUS#"%D94YMG28LSZibmR(*l0`0%-(
Vq41RP8H!mqaPc'#"YdRP-T0H%BqcS2Ul@X3abcc#mcD11)XDP@5C'!i@C*ED,if
ZE*DC8QKc1VqBfAADY`r&ZFqFGc$0I2@#U-r"aH9P'M$qC8GNBaUfDk8!$"I6-R(
-J,2)q-+hbQK5!%!64GT$3#T%$VI!l+H5[)&Z$6ddafe!)"j'!mKV!"c'jb'rdMN
V04A-ZhE93b@Ul8Z`S[VP&JpG#CemT9SeB+Z4S+hZP*[a9I+daDe&b'c[$$I`pSq
-2rp3*Qq-5+KVPr'fPHTMclE%U0J8JdYK+[*%@dPjL8&X(*A+88GJVC'bN!"KC%'
*MU'G[382`fJUM52r6K1B3-eRMe8Im$5ldC`3c3fHCLZD)l,jR(H,!fK1%mhH,ID
J15DD[9Y3G')fSNmp8Ej!TpXmi&FITUpq51"A(d"[-UV3jlL"',fUNa'L"f$dTBN
D)DC3YrDZQpL%M+Bl%*e6Gd9CZZb&q1RFJU[fiY&e%fr'TL1KBQ4ej3!Aib%RE4H
1140Z&Fr4kbEH3KQZ5IN3DBmQ0kidiBVB!"QJcAl38QRI`jH[-eaZ"+&Na(i43'd
j$R`32drcTA%ZM+GJSH9E5LEf@5XRp[P82%+$a1C2Bm1R3"Ul!CY1#AelMTZ2QBH
QDC5PbHX6Fmc$554raZEMbK)bqr*N06CBJb9EpfdTD@ULDI1IRA90!)FSXJF%aV8
`m4Ub&'c1EEd,KCrD3LC99e$i+3RbUQ5Y5Pik,`BK`ZJ+6-K+F-KN0[)$mGBqQ9$
D2VR0haq`6h1d%+UJm#Tf@Id6R)F)B2[$B)jYqS6T884LplQ,GDYrN!!$cZ9j16J
pkKV&-LX3$Gd(iN3A(6J3f$'Jlb$JSK@CX@i$q@9THD$Z!CLAIHdd$'!DX,PlK)$
)J`4SA@h1Jh&B)CZ%I@e,ci'8IE(E9$8Pd%Y!%TR[,)LHQQl&jA!TE8pXBMQ,aHC
Pe1RB$I"PQK4S(a9!K6Gdf5q'Ljda)BbaDJH@ZQ6%rr#Eae9JS'S5L,)99+a#B"8
(A4SETj4pM!96LJdR0cq"B565+`G*V'*)8aGH,[%H1(A'4J4,mfSfV-3Ki`mlkbE
f'8L*6C`"&Ql8LUYjMRX*@0N)d`,9cBLH+VLdj#,-6Cf@VURA(&A$5@NSk!e)pCQ
jXLpMBk6efY0*-[hVbb"63F1!k(PZhTKS,@`VkE#"Y5CF-H(R3(1VSiZ!Yli-hbB
*6[1e0fX,$Gfh6f9jZfN$YCf'EQ9PM)d()`$jV)&H)`-LH&$JD#`IM(#6X[XY!!'
`p2lfRSlqpT!!HIJk%b%a!3Y)@Sj"$$GlLkf-r$"lbeJe-[d+'R3BL4aPH4,*(,8
C&c)!-XbJ&jC@GC`535K1+V$a$,bB*BUpe0&Nk2MHXDk+G!FiI#TYVQLDc9ZjNSm
#D0R&B"J-(-0l,0qQUf!TC99[F(,arIV,JV@dkGBd)2+bAIPd'FJpKN58(qDRecZ
,3XFIRhQ$IbmDZPEdMbhj`$Z)`%!3p1C0V$!Z&Ua8'6DUA2)"#NCN!EDb'X-12SF
AA8hia,Y@1[[IMfY"(Lj%iR!4f$+&l([(E[!2Ur+)"--FC`#d[ZJE`6BZ"(m9*Ni
UGY(jT'$H1amF6C)`i&8r1+Vi"3)',a$*iqKANIGpr[aMPj!!bIDrlhXM5S$,2AQ
pkrS1"0i+4FEVi%8MI3FSfqXl-(V6$4PQ[qAE48b!ZLi1BmCpRPF[HPqP9X&%,R)
H'j,RcF`)k"Z(iNP+40"J5MLm-i)$krS1j"3YLaj+bX2EMrMc6d8q'Q$'$dL`iCd
k2`jB-UpJhKZh%'ZpkjE-kre6a#D[8+%!Xd`%)"PR,TPRVUbiTQ0S)rl*$ki0QLZ
RrS#+4AU*KM`V!B1(`SG%`rKc'0"HZEGbkU,fVdEA6Ih"j8%X[T2BQlU3!!kSbRG
hLX%p",bqAimQPCK3-#m``'!3*5+L%-GabI)M0e$#qMT6,pM&0JhAQ@JEqA,)*Dj
%q-T"f@bj+*V6Z$P,0SpDppDfIp81B5aj$3,T,*KhGYdSJS@!bZGUfbZl,S0SF!,
,Z`D[(3#H"`VQ0D`,fGZ"PN4ZV-iJiHmB$Q@5qACE#A8,AUNGS'ijCD)Q2H!bcHM
UFf4QjeD14ITJ-"MZe$-2qXQXHe-h#3d6Qjq4YYbP,J'"SNB8Xm)$RDT')I[jV+k
Q,fE49Y(F5UAk($-3!6+a"FdElU2T*r"ZBbB&0"i$JDp-E0"JcU[+*d2M,Cp$T'A
)3&mMEcQQI$Cjq*EAU[+0Ke@ZYEi89[(#,j!!B4lET%H@BT*E4`Gf+#Qdh8pVU--
N%r`d[ddNT3Lfqrea'A`!pPAbHZX1Rj[%LXcK+f4APC4-i#c$jKX*HM([eeh8E25
Lb3QFa9A5)"S-XXaA#,KBX%G1qNKBPJmT+hMZ+5ViPh3K'aVcjm181S)I,(er)`*
kiBjeI9@ATe"f"YCLeKhKQ+9r`D[ZEQB%)&9i"E'qi&Ab#KA`#U-34NGGa3hiQDF
*'L+SA$)C"c4i$d$6463T"&kNCM$JZ%lI2Z05KDLVU#"eEdXiVQ$K,&N@,*a`5JV
CIDDMEZ*R(A902dMR#%,2-KE)a3X%FU9JhZElr2QFN!$XeJ+rA((`UkCE1ZU@,-"
2&iB'))KErIP!qKHpf5UF'A3jL`VQ&Eb,V2),hND5&0mXQ2F['d"5"%(9-@``e'8
!1T3X,dh'mPi+`jM'9*UB*"2E[XZK&"SlLd[MYFJS)bVLXr)Nc@I"T&6YMPH('d*
1cm9XFE%Y&+',CDA*[m$!"#jfmb5061(TBK*CYE9r`36"h*'#HHX@AFkASZ1JRL!
0V3&%Xf'[G6MqfMXMcL'ep)Q"%6-Q!+9rZbKXSQJf*(HZ'eqk%35PJPF3U3'bY8U
1Q0faa!0h`Vd0ZUDjBjPMPLS3`2X1EP"a1#MUH[N+J*!!Z--&ZlEV`KBV3,C+r@9
+cX6j+1I,j,!*R6Y([QT$*`ki1FYbPUr%-4L&,TSMD)jKNP"a[)`i'P3mf9&T-c8
N1`*M$ibThEaCBDT"4HiF#FFHS%e6MZ'0p[KV*f6h1P0$I!qL12lL)$,%G[f0Eb"
5Gr6P8@@c0X3IIkHiZb%j&@ZieJ&bM-m'aQpli!`SZRHp2"`hU8,VF'*&l@BFABM
V3jB`b0apH[lKB9Z9+JkPjVKpEBI2J-K40QHhEpq6Cp5,b[RNP4f"RBqSV&!5Vf-
[Re&PUK#SH&6I13+Mm%dEEXmZZ)I3JU*kC63J6FGRFN4J)8`m(5$U!Pe'"YhPL0C
VG!lGrKK-24d,eS4MeMAKE[H+hJUPrh`@)MGT@*60&NaNXZ"rY@!@KJIFkdlAjj`
$NVKV6ailJmRaFpmrGaU635+PBl,-&hS&aJRUfIppA+I*URG1(-FNZHpN6r8lQ&K
UDfP!mRM1b9UD$&CM4K-PrJ&aTSdJL%-4aeRe#TbJG6[1aNm$[)m%aY`a8i2MYjF
T-Ym0BPC$mN9-UGMR)%2(LN#-*$[#$5,3$ZMj5i$5[rkfmeYeCXGB8A'ic$'fX6K
X`UFKA)LQ"TKX+(FKMV@&J!kK"+%YYP)bS#ZcC,+[M8AjAZ,$!Bj'9jm0qQ+iSY`
a0PqNL2UV*$+SXK&cGh&B08eIS(`V([q'RX,,"Bc-XGf4Y04e-&PQp#J,3Sm8S3I
!ZYdBRLe4XED-PZEie%'!N`1I4'dNFd`bf13f-NE*8EdKQITX%%kYAS@(,'Yp95r
#X2eh()d0,qG!"#A%B#SfMjQqDHf!Sle#I',Kb&0$EY2iN!$E)EZI$b'5HmJ'GSU
!&Qc'iQ!R1&F"EB%`F$S$!`TP)i6*!-)mGV8llVpD$RL5"ZL(L4a3$14b22QBDV1
F8BF!&YGCNll)H0`G(drJHMHp(QQ&)G)R)h5%M9$DRXGEf&3h(e3frL@'&Y+3!-Z
[mJ$*JJ-Xh%L['(eE99Dk3iS03qSZ'&+SLRRJ)@DjERbcp!)Mj!9)@"&%ZDB3bE!
1RJ,1-#$JSVSS)Q(')%#61f*DTC,)U#SX*M(Fhr`6L$Fb-SJ-,X94Fr#J!U4mQ)`
kQXGTbCBEpD,`#%8(1SYKL*i+PbdB1i&-0h-d($-9hj2RAQ%b"FE'kc62#)BAGL5
Bq(NV%ZN,jh3f+T!!)K```jr,cMS3CH-NJ6**`K"B#h'Td(iV#!%1qpaq)JIdm3B
NdQiae-C$XcX5'&CQAieKhIE2q1+$5!Srqc&GrM'EAicMFRCS(a%Gk&JFrc3I@q`
jeR6h0TYMZk1Y815T,@3HYjU)UL"*I-CLi1ei#rKpRi[0#H@@m%dq)T-ib-!A#bE
#aQImkLii)iMJN!"p),!9Lf1k$3ah-X-Q2X*"a"%X0UBY&L,qM&NXml!S(D4PEk&
,UrR5ChbNPlRV,K6cGSD2hUhKPJZ',f4bce`+i&"mMY[M1I-e"1*&cQ9KhF+"`-J
8fLd@#6)pc!R*#9!ANpKTdD[5AI4k)J)JQXd')PiKb+$GQK-kaeK-e6C5C[A,!HP
`Uh@IG%)eY8Fkh'+bCaT)EhF@8C6(2QF4S5fFmLbkBMHq)NH(5*!!IYCBj(-3BB+
k8l-ELf"@P(,df[mHT1NTZk3$Yh9Nj!L#bQdBh-1$efQ4*c)5bKl(UaGT1"f!SD[
3!%Ed1mGhGF"4'ahB2(m)"1$QpaZ,(&dSPq,faEj1[S,YK21#"3e&lN+Y%Ha80B!
GAl`4a-I$2l@jR6&DLJ6A$&j`2CR&X&--kAc%&#5XdL"KI55&9@%@`R*)JE4qK)4
-RLBH*2pC1(eVM-+T1!2@HqfrmR9l"M)JhlH"K1Bl'LbXUHfil%Y2@"2[`kYFVl#
QBJ1I$B6F6lF[RUPVJm96X6pB20*"M4GG19YN-P2&Zc$H5"(B1$Pdm0LjRKa&TSX
9FmJa(36A$B#hl$3j'@iM"m1@CCC(8A`VGEYeC[Y`Q%M4rHh$&0Q"T-CF4$8IG)(
KmUk+9@eG&HY2*keGLJKlDkhN2"M*dSSj-Q)Nf@49r[a`3&ZkH)A%5c+(%pbQX+-
F(U'YblliG0,Y'3LbJG[X&d20BZJ"`e"AZN2hL+%fle#BF!@`*)GP'CJVYMb+bpf
B&TC[b0K4PG'f`GpEPA%kD8T)Ci#b+!%ihN9N!J")K@)+3a`)T0c44GINLq1RcTd
8,`UY&-fA`XF"aiT*ED2cq8J#$U0BfTP4MbL)1)UMQ!8#G6G+JF*C2C'BjR8qUaI
jZQ@M**58Q3"UQ'36"ZcALqJL*p`2CRbI$GNmj(i1SQ*Ym,HUp#,244a*`3p$0Qr
8!(X62A1rLCaUD55NDM*%---B!NfR0JfVYXaIcFqB`P&U%+bkKS1aNl)[[8A&-1R
%")B3lXk3!'P'&-6C0)hm9cZI%e-'ajU1BKF""XMbKP9aji%)%A*2(BH3!!qS1Ph
j!Xii'3X3UA"C0(#NqmK`XMch(li6H0[YFQjZ5ch`RYdqU2BGGP'`T+Q6pB8m1AS
L&MN-Cj)Um(CJ-m#%'`@TF5%"RCN@fV6bD@+Pf1Q*G)N3J%*CEc%C3dB#&VT)UJJ
@40QmBm3Ccl6!l,'B`$Dmq+CiBC-[I+Y#5CFRDXV8hrk#&T&K#AF-q8j9(jHHqpI
h@dZ)R"5fTHV)@1E5eAR*c3T16GRl2EkcGjGjp0+1JCd&Q`IbFcI[#,!*-@pbX[V
X1E(*dZeYmUMBC$4hjfMQldB,4Tr4YU(P@5KC,bGTBK,Mb4Qjr*!!JT)+QhK9+&i
9L!Br4Id6k4V4ifF8%Y-21+@jJA+-VP,,N!#8+3qPk6qLC+2cF5VH4&)'aGrJcYj
!CXCS)%1TIF@p1I8RHqVeBkFUI@I$Vq5Fl)(&Y(lbh(jLXkPM0jE,f9,X%"%%,el
PMPZHFHkQL'RPU)13!!QSHj-hc2IcdPkMSK)Q+48M-`iZKBPZ"8!1L-TqJ`4cYL#
CDQq"KkV%d"++X0N8*3)dE5LhQh!*iYUmH@FJdlqMPc-rqj51hGLf-'ME1EcY"MV
Z-N9[2-Y!A5Y[28(EHP14la-"8-fKbC2)lP8F34@aYec+'d'Na'KS!BcB,edG4E,
JBY,Y*02HTReBE,PF1RPcE2Nf44U%(+d2EbUkP"HYXlm0mm4N1(iaZH8Ce9h(i-#
YIC59[c@3!,m,#,-cG`Hc[X6mapd-QQV-kp+,Q8#Nr*-+K+k93F4X9fM#YKF#UIj
fmfl6EPrGP54G)G53!)-faZ5JTYY*E+@)&!NPfbH&ll91SLXI2d0&VTSY'%+41b@
cGl4!`epfN!$1L&0)#bZ5aJiLHX-ddPmL35Lj&(L!!#&rEhl"`-jR2%ZkhIc(**R
2TdK8IHp#9(XkKLK[kS!j@Ef20Ze`Q+X9%QSN,VF,C0%iNE+S'&bh'%&5CJQM81b
6`r!#TQ8V3TZ+)%T(lNp08@+K#QMk'ThZ4jb8JAhljiK@j12*mHP&a9k2((*hJ`M
L*mq(3,R+qLDrf'2Gr,fVNEcUY'kqG)de(LiXGlcaGr-6dq)eKle"&m[Je09N3f)
d,iRQ&'bB#QQBC8!Eq-A!*cc3mU%cGR8I6)CkU%LB@&KA4-k2V@qL3,h"-Q"*`m#
mlM5j9GM*JGVY[B)&IijVYq`VNSeN)0F,Ff(p4ml(XG%eTM4+BZ,!"V"J#KrNB&q
#!*p-!9kRI,VF8KLDd'DVpaAa0ZYJ*SKYj"DmJ"&iPIAfcq&9i'L'a)4"lb*l!1+
0c#$%1jSdTIPLG6#!R2J*PQ"Lj1L@'aF1eK@aD0qN5*8E3D$UIiB88*J@#b3"m,X
'52,-MS)GJG(FQVK#`E8#b&+X1D5rU+b(P&q+hMHd*G1qS[mG!TdB%&X"N!"TIKd
L)r4Frq!)9#pS@GFhLG#8CMQNBT+4EdT'6#J`SPU'YTBb)13@1`I1ef""F@)&QD%
c&%Nr-eb'bjYh$)cZbXfJD`@M[m29XXkGP6he1CAe2ESI5&fI8epjV2iFEfJLB$b
D#401r0MF*SUqK5-%aaBLT0RF%8ZP0jNa`EmMm,Z-r)&-QKJB)Q5&BH&9P1Q"k++
mQGrE[HBG[BrX,-MFZ9Pk0aLp*95@c1K6&N,e`JfirNCH6R`"6DlZ5Ai@Hq1DDq+
FJ5Rh)4V#"f3*M`lcflZU15K68S4`X#1$["k#l%CfNHIep'm2j!GkGhJCN!!,$N[
%!)"4q"3bL8,"G+'QM1(e`)lF(D1C34Flb#PXLS,m8KiAL!jVY5S)Nj&E3I0U#cS
)9,qV4&YiEMif'-MhlbMJK5mfrr&D3K[E2M!J8HG5RMAY$FUS*3UP6)L1pX8[rS+
p(SS80Tq$'4fbP8)NBY,JDIc1)NT!,2PNU!LJf2[5#i9qe3j"j2aS`CZmAD8Tc41
J+EIE-J!a[KLmA3FA&2*6-'rjdBBLifX!!DAT(6paZMcqpl10ai0Gaem0U)*[lN!
4INLP1AG(aZcAKf0r-4D1Li!jLB#"XJ[6FNh!9'"EGMbcXd"kU`S1$Q6C%pZTb0H
+MDBT(jIBTe+aU+(6C&cF8E#CVc@4dbIfM*DkTX@((S#a@C6!a*!!ABq'P'Z-0bf
@a9h6Rl"jGPh4'hRN8-`+S)1c5-QHMc0%',"aGNZ1Ga#jeV5B3%h,'*&Tc(NG5Lm
LdYZF1Kk-!pqifMVjHpF3f(dT+!Y'd$d&i5#a4%FK!U#JHBeA@(Jp'Ba"m!%r(G+
UZdUmVh@(cm-5#T821f#H[0j8@K5+Y%mk*9mGakY0HYVj+"DE3FAZb&*Q)Xrk+,-
rXZ(4kK322H'1(hT!lkb+GNL$YTLfK)f4jM@k)a`K"5p#5(8NS,kE)Ic&1#"5"d-
'"&N@XL3YDqa%`FYCB`B9B%VcbU,J4%*8,rVP50fJkmH@m+B[iVTBEKNI`1Cjc!3
L$'fqZL,(Ql4)AfG(*ed%3E00!SGkp+,#`F9DSBQ$354DkMhB2!S$%T%9%b$#aem
N`8(i$)kYj#$iA"iX3*eI)bY'eJqdFZ#`XhZL@88BYLqB1DP)"e&QRp64kcdmZ*5
G2Dq86"UAKL%k$hQqjK,&0X9e44f1STL*VRiPf+PM9Lk@dJ(aZM5GJZe0$MDBc'U
L%!+Bl4@!"VBB*5#0S9Rm*,J-NbP[!dAd"++E9!FEB4*)kd9EkYkc9K-X&41[pqE
lci0QZE2JQIaG'4k4NSIUK2'@bI+-ILH"#6kAp9(+9RbkGG,hD&,F33!AM-2qG(S
%#VLqGf3"[f$dImBAF1hidFr&J%Z(LNL!B$(QCB@$ZUcpM)TISZhhM*K*EFk#ack
KcDNiF"`dQDrHF)3hM@`DXMq$EC'`PeXa5G4&"YR"@mV'@41!!NXBN!"!9!SbN!"
lU5-6&%PUZ0lE%+H'HGk'"$@dH"XLe,#D0iID+$K$@l*X`Y)M6$5,EZ&!+MB%dYZ
l#[bM[BrX+-J)R0H%H5d*dd4%SA5%Q4dXc&@P3TMC3F,FV!PcPDe8#M093jLTl3S
c4F+F&bc-!EN4*b)Z&+9S2+4ZQp!4)c%#[3Dmk18G[)8"mq,PAX"m`X"SCJCmUT!
!JPEBNaLik,33@SfC(V#-GRFZ'+XFeMT,4iF!p&p-SU'crCRD!*bJMCPHGX-XdeQ
%5*+6p8S9B[*ri13`&J'mX5R+3`k%YM2%@G4H3X82R!%qirjFE[dp@@`6S*@RHB2
AGQD#U,)$aAaq`D94!C+MU%kNK0S,"f8[((MPeV8FH(Z3!2(6T)`$$eRd,C88H!X
QPhL,mQ,+E$SiB82%)Q5ZFf6')EahRKGeAT2Cfqp'r9l"0@RS`mSh8,ce8F*Jj%l
1,)SllN64d8IL#bkD"+2GJP%ELUNq!hK4E4NiUTLa0&(B[QJYm9eL-'`-%99P'mD
q4mQ#"QT+)5'[[Z4#dN8%9$U5AJL29Gk0*H1P"1)'XR$GPFES!mpbEp5p4L3a#Ud
$`3@YVe0NQ+`m6bE$kiUN@$c)",(mAiK&b'6RMN`[()[J@BNN2'eLJU2&$)fdL8M
fd`#fGIQUJ`ca2-R!0'6Te)6Xp@%FeHP*h$UNq('3!2H%e1lI`I(0fFS`(583!9Q
X+dT%NQ1KbKkC`FqYK["S-818,8Y!+[4NDkRVapDe2K6!848&S4!$1$0QiaS3N9T
,kk$5#eYeKP+YTB35Ka4Y,X&r8jk"R0%Vb"ND3XT%,Qf&T*!!h%U#5GkYZ&L*pA1
LNd"J3FMSp4!bY!,E3BaMRf8SY2GF8'M$H%R2k%J*%+`#,"GU#d&bYjL+4a4BR4"
RNB&j6m'#)`A[4K$"ZTDF84%!B(I@&EPYdZZX#e%a59[eHj,+!Xb6A'X*M%)ST%6
JdV6$T#A`XBJB*mT,+CR[PX#'`EMaAfi*6[i$N!")*dR("h6M!"FId0eK3Q3"r43
D$V+T2H+J-[FHQD5X13aJp!%Di%e+rZ[1hQfN*-@a$KbEaFFk1N`H4%Q)SdcZENN
3Np[r2TXD06'$$*G1qR#l'pqjMBflM"X$f,JJl5LfYAQfYE'3!&*-"NN6faD+E@e
&[1f[6G5SJIY!#J(YLmf+23)[CKDp!*6Ff+4LBZ-X)I$LQX0`5"-0m!+SEj(!"A`
U$ZV%3@em8#FIC$c%SGV%)FAZ'X#J21$IRUDA3B"S66KXk`lDYrf$9Ri3I0#VRS9
i`6f4c&iD,ZCM8ML'XJ+Ef0VK,Y558%X@8)2d5*0fpR*U5@aJmRJM8iH4486dLid
kK6FbX&Ia'Vh`CTQ[lq`0bM'h5J4CfaI"$`Z$4E#@$lNJppqk`cUhIpKL2IL`eeR
Fh[*A1+&a3U@'Jicp+B&j@JfVSiU!k&1RXj!!d(6%e$qI5-'aH'mJfed&NRf-Sc*
Q(5q(U8DF!,EVpRG'iG$$38l+-l)cHSrDhFl!P%"faYXC[@iDPZ"KR6bX8$Sp[j4
pL3DQD1#PYbredS%LBQ-+C8ekYM20khL3!0MFia`bX$QX%)N5JGUlQ$33VeDTTrD
"A90DK!f,QFPr2S'4QV-V823+NeR*dQ4$FL#CN6b4$#8[*LFN9bGENamNjbHR*fF
RebAliVCiFE`mIL"ZLI[MRm5VidIMJr%(idr&&m6ciY2MXq2ViRd*@b)V8CTS5!`
N-K+q4%pL@Q*YBNkL2A&0BPCLEQ*P*"ia48BL"b)$NBb),p)6Q4CC'RNfmQjNAQ4
4j,l)UXL+Y&6D[M4A@Q1D1He5f['dR,4SfQYT6kGeTH@P68ql1@e&,"8VLlPLME(
0X8Za-l'MX3QaCf2YX@YLXf*cBbYhahChlKlClGbpDAIZlKGhRpPpHRIflQ@lahF
[f*fhqkVGYqfqIIH+9$a9Q0UA+NmG6'e+@91A8LFkqp6Ii5Flib@hfZd6h8RFV4,
G0lPV&GfhZ$XNZSpcYdjd(q5Z,VT2FlGEG(r*hBMSMP-hYN*djh"hPHJqaGel4IF
*lLi8hArRlJfLqb&hfd@hQEYc4,H9ZfY&Yi@lNdAh2Hi1Lqj-lRiPZZpbpl,SGR'
h3(6IjqkBk(l+hB1Lqe[ZYSRZ!Zk@LHjRh%f*lJI86DX3hIr"hI@L1iqlYiVZ2h&
hPZMq2qjH)lSEZ2XCTR2a%b@KAU)Q%J!0DZF"Dd@A4C`f@A4CU'R$SXYL62[+X08
FhUT+$*!!$'X)m'2Z$SQA,+#d1Y(P)%M6a9ECRUd+a3!@4*S5A3kLb")ar#eY#C(
CiUM*2'#kk+lKlR`aI"!rcr,`"@)l$Sl)8iEYRZ)"b`a0rmj08A'&N5Q5)lSF%*(
MKJ1QmI#!SHPaEKSc0,h+655![bIKm5DkBF"l2%!6!+0K4"-!"hD#"(#9*Vc%c@+
jRh2h2Y(pJVZ,a-9rj1imd@@2PAKAG"Pp%mmD@&K0,#3QB2S$r#cM!4F03KRN!G@
'+j1jk8@a*AZ@4+lS-K)Q0KQ3!19c(Rj)$'#2RGJM''H"*%bLqa*hik,lIkNEAiR
TGc6'iVH)lU2FR@%ijP%k*[i$3p0DEM*kJ+HjDBkKk6qiDDQKD3dhA63dr5Fh93Z
frKFIrBNBm+riQF)$FX8!&RjmNf#8!bEZ&-12%0,cF",![a$kDdJGGaL1r#GU5PB
BQZCadbTaM3,c#$IGCfKLG%c10ecl*6GT(S"C6cjP'-""ReaQD')[Ni`DQYUjU9)
XEaT[iKEG+G`0L1i4lQi@hEHjfbLkJpaeLHlVh0dRZUpaeb'kVe*A0BRZ"1iZ&ed
1GQD0ZQZjHlm3`4-NI'*@D4NJSick6(4AFrGcdIdcGpH)lRpb&kT`e(b489c"j(q
+,#BN1P4F(4I#T)bq5VbJM#GAG'LV-G'K)`q)#i3),[(L2p$*%KeLa#3k9)a'1Vm
6H#R`YK&%U99IFc0S!e8*4L0iiFJkj55(mY*-*1j6NB[Nj*+"Q@ZimDi6b,3m6XL
cB%Q6NDK-2"9j8IiPEZ"*HB4-18Y9NUq1mp8L+1+EiERkJAT@QC9IA38YS9HT5kT
(R9%69)Yk#Yd6kKSi66L+k9@U8Nf'3r9&DJ-kbe3l0ekPeT30U9q5N!!aQB2*0%b
HF"r&jbPh$ckIZb[aDA@I`DICI3+IppbAmARAI3QI6peqI$jc@r(j(ql0q2`rpbC
m0VJEm-Pc(m6RD[FKI+jaPq2cYfiGRdAZIIKFlql%TmpGL-pLG`UIRlKK@@f#8p'
d(-1L*HLhmB5+ZcbJhqI*@3$ahX@5"f'U[64jQeU6[$jjAh*PFQjb9A*GI)mDMmH
5&A&i-Y8Dhj0F#L$3%Hp@lI%pk%C9R[S#STLKCURCb69UP9UXPJ1F6#@,SHG)6lS
`b*NF!f"T6PBPrFN[NZ2*-dNh!-aKhZ!'-!ZMlq4U6)k3!%I&C"SQ*%6b-L6%E%a
)M*-`bF&N-LCIBI)Q*L6'38aHa13YmULB6-'%a2Jf*KC-S0B`Z4q6ec%K-Ek'55N
QVf)bJXP5mULB2)j*0bE,-,&KmLJQF8c@)M!V-2QrQ#c"j%%b5F2NAmQMBV)'NhX
aJCT204f6eCKFMmQIbD0LmM3Qmc$j$d`@B2)X*LfBr"L61CKmL!N*S!X6%X$l!SP
Z%%MdMia%rj14D#%MdApM*,U2N@J')p%I')PZB56k)b24+NDL2c%5hFj)p0mCLGB
c%Yh%5,51NHKI')PqcdLdK*(Seia%+c8N5Y4**',dqG3A-`fTIj2'kSP1!hSY#aH
55JAZ2"3')3#EA-8ErMe[q#0Y`rLYKJfAmBEcjBEaqBB0*iG(X+'C1cGbT`drjIL
T``qFFi9eYa-EVq!PIBfAp%0H8J8[D5S[D5+cd-3Xf$dXA$D`d-`Xr"I"JXA`+XU
[rNQmF[&Ra*!!'F(3-'iU)r@##@kB#iG9ie#KM3eqmMC[&)F6X`3Y)ISS($LACP+
P++ARkG1BkIeNl+*2FDEhBkBQYC3l6[US#A40cAdXbS2V(S[bbj6mX*!!VLGeG$4
0l!NIjmPX0'AcaDIN"C@0km0D"kpb(i[q465F`a[mer"TRK5(kr"U2`CYSSDlrN"
'P@5@#K'1#f6qGi(-,3+CC`TNEKI)[%!Jmfm&-RmJN!$jIc%bIm()2)q4qHmBQEr
$b2`$4ZC[-$,2BQ5qKj&j1L2ccaQClfGNrK8Mmcp`d0r,3AmE"rerjD#Ic8%rPi2
qCacd0iZJ2q%*V(raq@X'PH-PTGkG&Ml%%kK1SFN6raLfd@611+,3Ll(9FYlm&lc
jVEcj6mAQ-9DMC&4ddXF1k[X%iB&88qaKC4m1Rd-B5j'$#+GAfF6%bCVDK2k[B%k
rCXYA-+dR*rYcG1ZFhBd8EA`Ee"eYhPqUJ+K`VVk*MELMh+PMdmJS(2Z[JE,eTk(
U%qEM%bI$J1ac8R`G9rB@GT!![i#k%F@QmT2(ilaY0SJCPHDp6A(Id6[H!-I908A
)FH2%e9#p@$Ga6XD4RZ[qd-b1mMhEKL0399!(Kj16TAFal`e(6PrPh[G3jF3ZjC6
'ja-rB+Dl*LiJ)9,Kle(-80&K'mp#0&l&8TLe`YQSVl)F!V`9N3QGdTbB(*5$J2*
a+a5MZ8R*IHVI4pV-lK40IiQTEM8Uc4$QCkeiBB2$DT2Pfd`SJQ0IGQKP-`ihrl%
`eBP!)i2Dm)N4SF3L#b@I1p)pRa6b`@P4BZ5kDk+qjF8aGbacdJ2C95T8P$I*Ya)
[R6!aMHZ4R``14[@)HF`bKXP1emiIIHHh#iphk[1$rcjG@,mH"1q3!,CXIHL83B8
Bc2FVc(P`B!DM-USb4e29j9dB$'qc``GJDT[Gr",-Fl2aF`8rF(cIh-E+#&*5C80
cPV9rj[ABUVCpJhiQDB1LZCRYF&5%Ui1Y2m+9364X#21!F6,dhB"A81rG[`"U@[S
XrHf[Ke49[N'Nr4M#3ZeI3FHcLHmqVES,fSDGfGcr*$QjQ8''!9l91)ZGV$$#9'd
QTX+(V2hYlr[+bA&KqrZlb'`i5Ji2SELMmRJp1ikZEAmIMJ@l@mijLc`UH5TTUkm
YCUIM6YkSP$B#3E$rMVFK"Q&`HKXlY&M-MLlkh$SjM5H98a4*a*&*-aFAdp!!KR*
e!aq5FqiSR1j#UCjhi()-e-R*UXHTk-c&,UN!`2FZXlC*-Y4mJU*@b$%XAc)i,Y@
fmelPS)R#Q,#TZ9i6DdI#)pL&,0KCr@I8r9M!'68$'lM8$2cFMjpCq&RS&I3TNla
SAd`AB83cLpNDS'C%mpjQcYZSY'Z#ZH*'-YL9!fl9b)mNK,#*'8Xd(k2AKh[9V4k
9EMG,"XN$hY1UjN2S6lDHB,3VlUqpBGKqmjED'kk`m[hE@rC4&@!YAm+*#b1,Y98
YULdH-CFrVaBpL-[@PfUP-K)i0lMHKi#"dG'0qk#+NEcpmZCAHGXBErAP0KKB9)1
"Lmc!Y,[2`$GZN3bB9Ym"!qYCYC-N32Hh,m22Dd#kemL4-ad#im5&T-6E-mJEq1Z
e39X9S!dA"LKl-('S)H!c[TX"M8cK0I`XmbT'mK,6lA%iEpmJAc5Y4j3Z"`8LLCq
5!jkI6U4ZU"'k*)ABY+4j+Add-f6Ti1"[rDBLN!$"PEUP4Z"P0ke(i!df,5Hc$!U
mT[8YAj)APGX@GU&+V+B(B8)-pA-rKhU-FP+hT,&!%EE68[ECVIqMS5KmKJcrKF+
+bl[biA"MLYRI1U'KL*eTmiA@#FiL%J5V9QPiF$1+&,c+G+QRdKp819YZSlh%FS[
pqB)e(beBHf9!R#@%1*SK2aQ`C5Nal,J8Q@ZFSK#`4CX3f6S@fETJNIeJMa$CG)U
1EL@e*YQYjfU)ll@Q94$IXUEeC+M-iP[P%4q1Z#X%TG`9$@NXa"dD'l6%@4"TJ*b
3!$AY9k[4@GeVZ&EP$B#lkRiKP6JZERBCQK[CQ,d*J!5rE(e#A!dBK(*F#S8FhE0
JeV9m5BC@90@BTKK,L)F!*Pb#DENH'S14!cS!@Z#X(XVRBcGHJ3d)CH"`aZ4BiK8
CUIqS+E6jYd-aL"6CZQf)E#f,E!f,E%N0NG%4Qp)4QEjGNG'eFY&"CR*Rh`8L3l-
MNSl)k+TZ%*PH3f4,@'6VM#*6M%c#)Hc#KmmJF4ia&-hC-++Y$1pMS1&,rK64Tf$
HY`Z,9(1@1bBE#A6GKS"@fjG$3-qbbF8+cNbAYr"@Y$fbPq,QB3PZm)![!@40TeG
Jhp4-DSck@Xpj&(N#M*2(1lU%eib3!&T8Fj3cRV&NR0NC35CMiHR$QK*"&T&Jd%U
Q[+cHSEd,KXVpl9dbkq1#0jZ@JU)r6N8rc(IBl*FV+k6QhG6X,[FdT,LKc-1`bfh
cGUL3!2B`,i[43J35$*&Ycj+UZ[KT)6!S-a8[ZL'UDP6LdRp$06,BrKY#j-5SJm`
4ja)3`#BB*ZA0rQrRl(qGP[elX[-pTbTa2*4-f1H5FLj%Hq++)6Zr&d004M"%J$!
T1Ea$1Yql(Fh6D`kY!I635aF-K6rdAM-!*[Xe0QS``)GT&p,G-S@Na@),16LP)[G
--Sk%jBBY9`Tdq`VqV162%JJ[Tk@640Mk5cBSP3F&Lm08$H%QVHiATEG)4Z39S4k
c@@0!LTe"VZR")*F3QD*-"HS@BNRe($iB6JI2)I'`jqTm$X&h3iLUi!Q-26HQ$5"
P-j*&il(Fp-6fQ3EjD20[c&l)`"jl5AcfY"l6[,eAYE"*eESB28G%"BmcfaqX,b2
N")Sl@Xl*jX[4[@2Y$hU52F1N2P"6F'R2)q+VhYqq'Y8LT*!!%-X6@hACmqT9)NE
G[5AYUrNBPqHBCqY9r2Cd$`,C+ckVT[H)V63+X"%#S5SGJl`*JmSNd1I1*080e54
HpLLVf+1X6mHMJ"5LH5Y4BGJU!e!8dUSk50FEhAq(hSJh422#VI*'+RP)1h!E(SB
h62qb@LimBBe&9#YePF``NSA'J)'@MJARmeYRN!#kYGDMcr8+G2dr%X",GXmDbeN
q[AIkf(1MH)AJjXfC1@G5)1,##a#44+*UL'3q08U8P-Y+f[LS&6MiqrMjNADN15m
3KH*P+"GAUF1Mb@jLp421fTmF5aC+T8*URTBaD1`BNN0DX$PJr,qFNQVfPIa5HU#
%B([q"@`[$'B4U"8#3mS!iRD'a`lhSYjR-fG&HcMcZB8r0r0R,VDjVH@EP&',l'L
1*q1+mF[1),@ZXL!LpFFaQB8CPF9+N!!SFY5EP0ZDT-GrUCD!3F4L8*bp!!A`Z(d
fLT@R80eDl3fIfqp&Tm9q+bA5@B9*jbrhl$@hE`#4LE[rcPe1mZ)!r#c#cd,mc-,
2rIL"fMQ!b5CmMZ0(KlH-F2%p3Jl9eE6Q$9#TMqX2Qj-fIDIP6,,EdTSXC#+#PFJ
2)))kL0b!l+#&d!q635BZU%3hEC&-Sf5chGjm"Dqbq8UKPqb!E'%pPM('DJrl+2Z
#)dUl,b60+rF3S*H0a!P3#5E0CC3Y8&@@jMa8A93"0GE4Y8IQ6YYLX6GYqZ,1&NT
Hd`8-KERc!4Hb55M(TNTbc9FM#e[J*#q@Yr6)dQNHCH"GpJ8!erSbmRIPDeXF*%D
ZlPNrIGU#D(@CpL+'5RjS+%KJR4*NSF3j1ID$HXb21"XFSSaFCQca,!&i6%ILi,G
QIa%Vh81Qj#G(LXdC%%@8KPM#cU&%T1@-XiLGqT1CqQc1$Z-G3j'#5#iqZ4&8"r,
4VFK#[b#J,fa"44lc%+5I-40$6!LEKCm0T#S!#Y4&-eI'eYrq'6Hr4Kp*d-Q#bMT
XdBiYfXAJkr!DUV$XAq"RN@H,kl$&$p"TjqEAC+81b3Gam3SMNd[02RcPEaZ5%Il
%$X2aDc+9`8NN$c)p43J9XX1TVaXr(X3E-6031Tqb3`"@pfYC2*&ND#0&b2bqYjK
39e&4'4J6)+&L3)p8CAmJ3FGiclC"4hK+&'!XZMSdA'&#93Pl25c"4m$ZPHBh"(!
p@bDq2QU$DZaLE9"B$UV5PZd"Jpqejm(VYG[RJj9E'!c1Nf"`mjHHK0iYSQNN#(L
YN!!)*)QBj259eB@rlP(UAH-eJ5)LB&J90a#`6Pak,Ce,&8**pa+TT&[,G0K6(M@
#pBM+5+'`r8`QC-0l3+kB)j3UAbB[5JfY2hd1#BNE2VZFleRi"`cqclX3r+G,![5
25G#IYUJ"mSY%PDDHQDi6HKV8Rc1LIY-R%cHXM$6'5i``J8@lYN)i%m8epRiJ#l-
k"T!!qJ"m&,Ed3(Q"(m+UN!$H[Pc*$'ET5m&UqkHrY$(CqLJ*93jdD31cD`c-aX$
(4D*GXV5Fe&CSP4!-kjC-b[kP+PmeVh%$1cPD$Q(E@Xq"K,r5)TPHf8SJb2,@FeZ
S-&Y-PAP69GiiGZ@XVe3RC6+S,J#%IdT'RXp[HCl*Z$j@l,YB$`"04lJiDS(cj-e
8S6Smb9dYj)5p8A5[jDj,$k$+mc,G$a+26UmXBAVKLeXb[8TXUq-0U'UM`pDbPil
aVAC'M#SSJLG8`CL-R$LY50dm4b,GLJLPdrM*36H!L9j#%9+I23DP"3"qEU@$8AR
h4ke3)`UP&bUj%"@4a$qpLBU0C*j!3k'URKa6lXaM4idMTj18R%SqDaLq6!k(SI,
e[08d&kQVcbER+,3&+@G-3X@'+E*6CJCei8*2jb0X%*!!&Ak3!'IQUDaJJTcc,qF
+*[##+TL3!)VZq!J5@kQL4'aImk(p4D4H!YAa4(hlc[1,jLe`*VHF+LiMTkGP&1c
Vb-0*KY9FLIDKb"G4Ra-'p*5piY%![R@C`4HjmDVQKb`Sr2"M3D#1YF)*CY-Je%e
@KK+iGJEGDBJ)XSR%l[rQ41TLfS"9m&Gle1hDI!hmNX!R1$TZ2Q0iYBFVl&rCr+*
H4%hIhJG9-b`+Z93F8SEP(Q6PIbKiI!6-YqNP[)`X+A48%p*#6SZd!&SqM3,)j)Q
Zd4dl+e6-P@'S&QL#60jErdUT*hr[DpZ96e9*[A!&L&NX1kmdNMSJHj-[p8!I$XB
`MbS4[K5fLB'N-P&$4$681K%&K)5id['6PDj"1)C9$L(,ch+A'3Eb)(kj*PL9ZQI
E3N*AkZBm"4*!SbA`G5U-B[a*@4"NPY)NIZ,i5H!RJTmdQk8P4Mq&$a%kh3aR#-N
M%&BScTm)Ihjk0AhqN6la&N!hrb`R6ABjQ@JRa`Xe&EaIb&E210JLKECI+DS32d+
HbYU#*(N-hX3drV!RfT%L#U46l$K(')9!Z*41GQ+5&",C6CF4m@FMaB&8*IBT9Vh
L(FM#4'8fjh5KiQBP1l3C9J18U6Q(6$DaK8-6DqfPUR`#b-Nc'%M%8092!GTp25h
%J`4a8RDM$@YDkc(c!CKAR8(98*`UX%)9Y`r+B+!#!S),Ei,MTl9)*%$a9p0DLT*
NC4[Ym"jaqr`Y!AX,SKhA5KAT[Zk(L$3HTk%MeXY[3B9lR4&8Ki-RRk(cQS'F[@f
NQMFaDKK)$AR"$8d$KJE$aDD3!$FbQ!6`MNX@`H4Kq6$0f80aKe5a6KGe'RV1cb,
ZjU%QUS)05"#K4TQeH+10lDe36ZJbqr&T-m-jXEf9%Jl0YiYSdPC'qrY$R*%VGHI
QHKrU!qJT1&PE,ad9Q9JG$e8MBJPmQDRLAli$,jN!bNI`NrEeGe3Z)Vq!D[MT4-$
%`bG)q42q[Lf4FAG-S)19e,m6fZL2-,T*K&RX(%Sp*)Di*!+c)eZmL&dRAmMLcB2
@[@%k'Y9#19*LL8'2,3$eF+E3fJCkq)"(m(J88(#)6k6Y*@bLb*`qIKPUJ4raQd%
dI331!acmJLV6i'Lk"MaJKIC3!UY,5SleP*3F2TMjrGS6TkTc6jekjjA3C[qZBlZ
UPIF4&eKCd50)UUA#m)"YMe4CZD#0Y,`)J2F4J,&3dYTbARZXK3G,5SjIZ1PTMd0
)N`GSN!!9h&['S*,Y%Ad$UALLL&iif"b#kXf6hXUVR!RI)9E'KFH6J+I&i0V'KRI
Fa8*"PfJ-[4!kjSid3T8R'p'ak+,22e2INrRpFcheYD-jamkFlDNre[0+6Rdk5jB
,ES*6Ybb2S1&NYE1F99AhpcDYT+Vd(5p4elG(L$i#d[K+VPDKh*qrAd&Y836Uh6j
hG"'$65Yp+DMR0YNRZXXFAF5HD%UL+E)IM,*3)lj5S!h3[QPP+!P(M)p8Q6QDE6%
jLkHLUZ9&HM`0+bN4X%SR3lkaA9,`%H'"k)&#U0US0-rJ&+Ya+(DARFp[)mG&h4d
41,ZH'&)Yjr@LYLJjS-ML`LZkYrG8C5ANNR%Upqb*R*-jhdm2(c)1lkVfqipjR1%
Tcm-F--J+%63Kd5!A6JV6i"8[ZF`MMmKU,8R&YTXD!e49JE&CHl56k--)U)'FNq(
DqNVfQHPa!5VaA38R6jm0Xb)MX![MR"S0!LaPpN*VN9@3!11JfA!J15`8jhe!%HE
),*HAQeeQD+j+EBiq(YdF48&64Xh%)"8i!"e6"8[*Dk)+@58Z,d%@6dS9(G,l5&8
fU`Y',m(GM(!XYRRR+#U`b[GR`"PYTP*Cqm!JPLDbR-eR6eDI#ZH(L0pcRLTVYFG
C)FIQB,`6BL9PA9QKY81dJ'[YY)!V%RbDZN)XB"99NibIa8',D"1[qMM6K-0mUZ+
N)idM*-@5KT3cYNR*lITd,'NhPY4QU,ih#`S1X#MrVJcTPXjK`b,mVr3-R+fZ&`,
1BUDjfL9N3b6N"$&C+46Z"EBTj'+MN!#p6*'bb[e#c&-RJ+Qd,H`m1DY"Filh+PM
UcIqG2aHZUM1KG%YeA`ZfU&EJk[UHqXb6TqZh%rM9FZZ+HEpji&HX5#r`LDh01c2
pd'm5f1(225rCfRcfA1M8ZIT!IDMkqp+K,V&&,)@JB48-ACE%RBT5`G$+0R0j-%2
Ge1`LJ+3Q-h6a+m&-5X['h`3MZIQMQj9Y0aM)2AAbH,S(Ib)hq1'#hqcJ(bkTHI"
E1(KA!4rYZ!j(lkUXeJk(+NJ6(`j#hrU3!)NC%!Mb`i0D3&c!3#FeHaN`&H&4!0E
M`3h@dk1,L1[99IRdL#SI5dDN1MF`JM#i"&GqT")VX+Y!GGi)KM,VFdkIKADIhT1
9J9FU23@3!"lmk#4KIR!5Lr)m(NNZ9EZkfpkSj11Cd11N&-clF,cQijPmq*Ti2*1
88*6-#T-MkQ$L30*m6IZdbSK&ZHZm$e,bi5ID&YUMPRbB+lE`21`-NK5mT0FcFNk
'4NqI2&YpmN4e[9"1ae8$YVa)&CCQd+1r3#%Q-Yke,+Bq65KdIDe")+1A4RIQMPS
mMM5ec"YC$$QXc`+"EN2E)#SfdYABemQSa[9e8K9FqR95D(`)Rfj9KdqRFZ*6TJj
q28-Gq$U8HkP'I#+UiHZCDMp!T,JD`LH#"ajT!GM8`K8d13KSSX)KGUpZT8TM2Br
adbH"I#6X$dN'D&Mm1-$C0RXIc00LA,(H`p,8p"4-Z%!LmeIP"aZTH3%*-0(*6*3
a%mAia03qbeFU#cplU',#TAL0+JG(U-V$TCQBkM"j(1-+iMU4I"ljJjPIPbUGTcS
5&K&I*30V%45X1LDG@U8&9!86JVS-5V-rES4Uir5()@V&-iJ"1QaCMS'SaU(XHkK
55LHRb0pklf1H*0rlf%5*QC3i0#@fbpVZS4F-5qI3&!j0EIG3KcM8X9@(1VEL8!F
1G@ch8*-ie-59&Gl4S4F-5qG3%`ieEIY3,bMYVIC,"%IEqCTAiZpp$!*&K$Z4pci
@3CIDcZ#8BA"+,(pEJaf'`3l"pVB'Q`b$6Gl+aHbNNXR4lfG6U3KRMBXTLU'ePF%
a@I(JE@,`,94JY`QPQlLdMLmYB3@jfU9ej!(l@JJ&S@+dQp!rl#$NJ2*m#LiLCP8
)SZ2Y1MQ86R[[BbB$165fA5AFB0)DbSZi)H)C)"Y5RJ%P-1ipB+r!Ta(4#PqT"KL
0S,C5ZQ5ifXd#5DRBHaqMkSe'6i@`YiJUA0Zi#YGE`PR)@0-)15QUJBdG3!!P$pR
k"&A9BDm!-CDl-XUB@$%`C$M'','XEdEbk3(feT5CX+,Be[@dE-2LYh'CVV3q!A$
LM4(rb&N3#4jhT6SLh,b#"'83ehDh31A(KjShZ)S-PlH#GDLPk"A-CfNrVGp#`RN
&Q5HNHq8"R3)B+R4S-#Z#%J[@NJT%Z+GLRC!!kF,!Fb(cKM+Yc[)-*ZL6)Z$5aTI
M8&RVEJ`a8CP-THd9dk2FECTe4%4#*DJBYYZ*12I2pQ1aaP*%r8E`+D@LNb,IY'*
HJM3Q6Tke[B2ME''UrZTKMZCVrqA)YmeSa!ZARbSdfjKJXJf5`mP1MMDY!-&jXEe
TkjNKXqKMX32[%82iP'C-#Ea%T["U4ZdF,e2HSJK-eq'"DeT8QlZFP!6RpQCBX)4
aUML`R-4c*k*5lQaHjNjaN[%J9k2Zf8BUrR+DFSGNe"c)ldI@(5%#r26Sl#1cMra
G(kPT)+9%fK"8dMYYh65UT[Iqk1aTXkGp"bSRlarP3C&YE62GiNak)Q%56UUq-k@
Ra2,Ec(PNVUe&$T,aYCi3dGGYZ9H+D8)1eNBYSeSAMfI5jaPdiFZQ@1@AZq`9r1R
M6j03ZPjaQ+TDLaK)C95YN!!&"EeCQ+JlL`c%+%4kG'm89CZ5ST'0)L+%42QedMD
UXR+IEM-5%GPiICm!-lVCY&RcM+Q#abmE6,PjD,G'XK+$(!@2"`e`'"4"H%PKGii
)%+6m4d&rMm[JG*K8dE')DB-UmPB,U6Pmb)(#kJ!PK%dhIPS-H3@1N!!LC#K2[Ye
V#Nm9MG3`KHI(%L)dM9093D"693HCa!1d3[&'AJ3SYN%k&QJT4H4'S,a9MAclM#T
(0AqG60+RKlcS3l-*cCdUSNAdhT0T+'M@-@%+e9Ce8"6qAl@q5K@(8N'!lYpiZd,
CZKh0@kLCUZHbHaki#3CRMV!3(Kj2)0mY(#-NNC!!#5R[FSd9H)[P3UQ2XB*Z-AK
f"cr3&&3m&BUYG+Vd#alp5Z8VeG9)'&rjh@K[TRdfNH21R3eAmU1@$41j"JrZaF3
i+(Srb-3k()V2+b&5'lfH+SZAkZqF3hGfdM"Hi(S[B3i4'eeNUV&,Fi,4"l9$$f-
l*i1Xcp1QT%#DZKdQMRS!k2rR5f4ZV4h03dZa@6P[[l*MU"rrj*!!Q)N1iKFhHik
PDXi&5#b[#%"SP!'MB@)DLQZ(l[U@jr*+lE+(4*UK%CPe+e@KCXpJ4cma)X)JdCA
"*'@3!*%&3CQ*bek5-LVGl%9P,iG!M1kbcdG`f0dkAXr@[iJl%+hAhNpCkhbqB+-
,00a)FSDL83G&Ra4Ta12EJiRpm+,PSr33"DQf3A+b3CdEEfmE&!N!'d8!f1deN`$
X-A8j@&Ep)bk)D""aT9)QLRKJKCM-6Zri'c2Zc[%mc&V6@qZ2i`(d!,,K%e1a*j(
C3$(e@DV5'8fS`"UGEP6eFKEJDaNqaDViaV0URpU(cdIU)lc18PPiS5XGR4%eSUI
qmSkiNBr!jf(eX(iKH)c$fKlP"&@%%e5aKpkK`r$"B@M#BHMJ-(6+11P9c%N[(+B
r!Q2rV"%VM*@ck,(3j0r"'C4&AjJ9hTdP2FP,1Xc,3'H2fL-&KDCb9Bk25lR`!IL
!cb&e#*mk9BG"6P3aG4C96Ke!8i0U3'HrfSr1*MJKqbi,@E*h)l1(6j%UHP),dMB
mPZ"fQ6c-6+,6U"U06++$4kE!Cl2DM)pCQI(*9EPr13KLC2K*M@'`qL5c'R`S`)h
8"GjC(leTeZQf36Jp30*pkKRTP5lRTjq8PpG%03FcTlVPCDjH'GQ92lrQ8(R!hbr
h('#q@`H-bFYhH-$RIid$2Yq+!cCT"d`XhUS$D+K*AZ3+U#0%9%PrmkX@LFhR9Fb
iJmePXGa*Pf3QUQ@BR-RGT'@YaQCU3N9IckZ@F2()mqTc2EQd@FejH&60dAI#iqp
jf+bH[B!Y%(UZ#V30dJH$f["3L*ebq4A,YmFLQITScZBU9Y&ebC!!YK&eF@#RV!!
!)Yr(LKKEe4`aqC`Q0j)LlaDD%S2LdV0mLD+YSh+iQBL1-rZL&#e2TNHLF3iL@Ti
&3A)I%86*8-B`Q!A$jPacj&'#lGZeiKE4K5eK'a,4Fh`8TGI#$Cf)X(ifd++HrGK
[YfHfX,+%F3cDjf-8UPK-i)aD%k*(19Y*K"l"9Trfm!%%E'%6X04),2@*3B2@AL6
I-iLdb@D%2`UET3TqeBSU+91)J-RPk&%BPPB8QfZRMS[)E6LrQVV',iHJ!PNi+ja
0S*!!'%V'Z(X)S"124L!+GP3YF9b[cmNjPD1IVG4h$(-%`Fl+d#XpQ6ei@EYr2`e
a23pM"MaeaIlppF2(kMRQimNRGhMR1r-02Bpk0iq$-L&'!VR5&@@MI%5#mP)ej`-
-UZB(85,aFPB)dF#K$$lh30JdH9`+Hai,Zm`688hH9SNUH1H3!"*T'2BmL)Q*(UC
4(Q%)KJV0a)c9m(U$S@+l`B"ULq`M)KJ'1"K@')+"3@K$-,`B&!`VY'#J4Gc0!$K
fjQ41k5(ph0QMp58pcpqY`#!`Pihjb3[63pSXT3SKm!L1bf6e+&2ca)*-NPfZ"JU
XAA$)VR2e1FDpP63(#$)8Q$QeUT`$)8`UX&-J8U(k0UT3KadU1f!5,!PrG245+)M
f4[jAm&DdKEpFKH`I8,A4"clZK4I40USJ!KXEQ0VC)Dbf939Y98DS6FPkZf(6EE0
(bBD%4bJT65J9&k93+Yi93ZRd#NAEq'i)TXCb!032N`(Y"FHQa,'0IpeM$8+(`44
Ap#%AEc)+RK4NXXISV#'HB5h`K8-+Q2i&*DG0hZ3dAD0XhQXD6Sk*kI&6M)m@)BS
0&iaK)U4XQFKY4'BR&3+b`+!MYeQS"4dK#VN-+aa`qfbD)J+C0-KXjFG%62QSFTk
81rli)Jd&[#+K!8L!8@Ak&%P$aFDB#J+#D!JPF0)&K*CSKE(+fTU#(YHFZ2CCfb#
*4VH+ab-UPj[m1R9(bjI*)L&@+MCecl%fiIcFN!!X#RE'5S$!V#8A&[RbpGI@%@2
bY9""RK,Xf@TZL-BA!e'Z3(VQiLT#6m'1bh"F+EfSHGd$b+C-2r,Ki6+$"1dhGN0
3`fdYpP8B'c[)#8qjf"M+3Eb'6PldmMi+*&fT'JaHTRe11S*K&H+@T68Ce3a$$D)
S3q(Yi1MeQ9qEJ8j6MHdEJaTQ,RBE#B!Nh1kPk4Y5H4HJ9D!&ic96MYjqT$i#miT
#HL5DNHZkCm"!Xf*N90mC*,JcAZmC(!8R(jP#AH`Ai!8(V)Cdqd0*-Lq#paIH8(M
"ES"[$Rk`P+`,[*dj2E3L*4H-10X3)3)PN3I%4B@pU8Y(PNAeT&%XRJkfr0-JSa3
I%hXIaHYkX&5aiM9[jfZ,[*erZeM6Bpfc2mKMS@#9(ZYIfVI[X4J3*4@eYp-QdK-
3N!!)Ej&,k1C"JCN9rM[b($8$9**`$)"Z-0+l)K%E1`Sa0X[08br@42kQ`TT0%rX
ZD2+3!&rN)mBBXr)+YqF"J%4@16@,-Njkl$D9#V4+GIPZ-eIVRj4H[HNi%f!GrIQ
-3#Rj%#MN`4QSfXG$4H-2Qq!a9JN2XY`Ji*XlE+b'JKjrd5'GiM@")Ue6K05)f0S
NXe&%+CMiB@M4R9K('hS6@C)!kL9JG$b!3H-DHT[IS@56&0l%bqQMpm3$M0lGA1c
XK@"+LI'q%#1mbdM!-'Ecpbc`*,NDlc$*T4'52kH,&fDh-U[663DcFfPZ43m5d[e
"p[&iHB4)S(f,bK8H1cMb`D5Ur1-"%K*&2@*"#HpbqRb'jG`T&c2e+8qaHUFFY[M
kKhT9K"j,`1hA!XFpm-'NBaEAK9Yf'VB8iTNDm'`TLZR&`pU@hZJM6f'T1FDHT8A
RJ,$iRNV9ar4(+#RN35iJ39r+LecP0SiN3228@e`50FVa3U)-JTB8U8mYCk3V""K
&AC0%MdaXEk@(p4fM+J-SSkS`khM`!i$EKN#ZQ0$fD!f80C%($dCCBp52,TQ(YmJ
`&[pENA%MBE,6L"*JLc,LELSbT9Hd,`ik"K%&&hMf,S-#C%990"a9Tj2$bMVje"i
$m&9Fm$K9d"q16hRTCfm(XVqBA$YAKrQI-PDdcbDH,)UpZ$![ZF+P%-@@+JHkqI0
2T+UQh,IXJqaMLhP)3NmXAFD#+kE#YYcf)-4lmdX3qCeHF%p23*6&4XF8B*)G6q"
KQ91PXG`kZ!4c`!Q$#BNhajT**"3mT%rRm8)bERd3LE$FQ"0%r`FRkGflSNH62jR
j`D36Hhlf0NF-Hk*S4L*im0'S+dPHi0KFS*`$$`S-`l()F(!aadE8F%3T!jEBpZH
c8Eq$(f!A,-`G4'EJ3',F4)#H*c[4(Lm)&CfVbF'(PbXNi9-542HCC89Z[am6J(J
P*r(k$%Nm6VJENRKI"5AaqMa*[)4-CSrHG+mEP9mk8E-iK256jTI!V*rB+f9"1I!
JCMPD8[!XTITd(p*rHRhPmA2k+jAe`b&BG0BI*`1dZjIm&TND4%+2#J'"MR(AP2X
914ETi%)i-dU2"D&X4Y)@+CdKaSl(D)V(%UR6#Qll+JC*phM!Xd-bJkbk!#"0(h#
55SNiDIe&8%E5*B[ClmiaI,e61m`B8ILAGkKKDE1fI3`p0J"emjBDNaMT0BlHp#Y
cF((L!B9ZUPMXl8a9KKI,jGAlc0X%qqF%Ec@ef0$4$4fRS@25SRf#4'9)PNc0feD
b*(eKXC!!AHa!`C!!9#5(ijj%+&@#L%*KfaX!I)NB&mK-`3$Z[[+Jk+0Y**0%FM&
#"9M0j',kJ0f&MI4JXmVa"hTX[clabU(llePR$`,5r)0hEeYkq,"IA@m3aD`D5Gr
BYKU##q5DLDbY2Ik[[p!,$UDNdRD5IM#"6`9QI['D6MqHJV()`dJ5aK9NB*RF6j-
Dc+f8QGbA4%3r#&*JQimV6!AJFT!!UVQqR)qRAhiC2p6YCZ#hMBb)2Bj,B!UVRK,
Cq#%[`89NaUI1PC`iHDjHpm&f%d3k)XiGUkirQA0K4X`0fSApqm@0i)bB%bfrUJJ
Q"LcI*d(0ZAeE33V"dPFedLET*GbA"fUL1+Sr1ZLYJ0[%$r5)bP06dk+QC(S[VM'
m%"ZmV#&"N6LX#*NM44)c-B8'4@XH#l,m`HdLk4Nmd'G0X$ZA(%GbaY[$T*e$'iF
3Dk8e3K6d-*(+D4dMGBFJ&k-L+"6KFAL3!#pJb,`Gde)b#Z)(QH3&1T-eSVXm99N
,P8VdB*26#G&iX54!9,GQ9GkXQ4*66-EZ"Z%kbC%hF3*S2FcH`QK@i'RiJCkUbZG
S!YR`!4-dQ(&2i`+qP1U%-eX!*a1)%HePhdSm4-Y`8"-HemlY-cBeQD3ADA+bm,K
b5-r,Vb3"T@RSXZI!LE0jLGU3!'jjIH)5CL15IU,1%hJ(DS#b%*)eqNB`b+`9ZPP
H8Q&)A8Lbm4DD8fGF5(jCYfElj*H+Cl@-4$cd!6)rBcC9F6%iQj)&[&B*TdCkh$B
TlHjHm##cKC11bVS8iLaR%"@4HafFi2hKlGT8R4#%V6hb-6UhMF,E))&ZYb$iM3D
c"hG*dTATdiA(E50,U`DVhS*5ca93q@N%$e%FH%NhhNTNGFrPBl'(p8mARUJ`AK5
(TlbCr0eK6aTfEEYB*i"PkQ)#@2Td3mGPk"3E5A2"j+[I#$Qbj-Z*BpX#&Bh4RNa
JQMP4ph[)Ta1VYN9!#fE([R6ll!3Gi,VM!pLSZ&0'&h*#pC)rAkMVk40AqD(40",
L0X#$QS6HG-5U13,&)M3$jMl2-5!Pq[1pKhK*Y9S@822`p-"TJp,'SiBP'SkaG`8
GXr##Uc-R0Q`2)2)XlE(IcM)8!hfDb4K&4SK,h3D4e3"iK2Ukb2BmTabD(X$Bp'c
kL`X@BC1l"S!YK0md2je&qlFKaX*d&PJUAKid,,"X@`#H`C(aUQd%b5G"E1qr)rD
-39#MS$%5T4hE*dVAc%DCJ22BNp,iJNeY4VSiDX$dj%i[%"ebN!"LD"`8P0d&"G[
32pFJjqUQl522YT&#9ZpS-2YIFU(Ah"Dk"!IkpVh0YXAPpAMfqHN)ZXac&5CJfa2
eeNB@'#ZdY(r4Ar[E#ML$U2eYNbM5CrkfiNPdJcf19k``eBM)Pkam(+C5)pi)PeJ
(9Gf*aj)Sj3IK)C,D5(ckT,P(0V4RUIT)'jb*P5EeY+A6%-PbLai[,6T8&"4YG8C
GSU)1S10KQrV*@fK`i4%R$UG8pK%pAQ1SLiBqd+8H5&(aD*Sp50ITJB9HMZj6k3P
*kd5hR+[[1I'+Vk6NXB-[)a&ai$!5%'H2PCcMD(pkmi*iGIJ!aIkAp15F20Yc$Xd
P!riAUJe9e@rGGXI5hHiBEAG-EJF!pdi2+$-mHY206j1Kcjm1NY(lreS8hJ2`hSp
*'6@L-ik1-+Ud1e%XfF)(FDN6aTG@-K[%Jp#0H*)l@64X+JSb2+BLJAAS5X!ZIH0
-5Cb2rSedJ5iCIrQ[j*+)3,CpmCa1GcNrHh"VPp-d@e[1crir@mkfJqHd#'V$F[$
JKR2c3,k2d-3r@$8i%KJC,!r3)q3prMrKI')r(K[8JFF04J-B,mB`0rh(Hq!rK-(
+"NpJEL)HKHVZXhY+iY-G#Mq)A6a'iP`c-8#6B(DVM!b2b#B$b`l"XZ-hCrRXEm)
b"2b6Y9,!2eQl03,qbIl[VS$[&MT!`$mCN3,qbFM@#TKCrLi+H#YBeKKZSq0&0"X
IE!"b,c$4MViFG1cAaE'RcYh0)qHkrrT(EN@@SafjqEZ9H6",If9NkHjNlHNapYh
*SVH'X6[fG%4D0V0aap2(6j@mF2CiID@fAm1aRZq(kM'mGq#BamQc9!U!K3`J3M0
HRP'f9adX6Z5N,6TLMIMdaVe8"3P&[1LN1N-M&M&k0bfY5KHp05I`d8eL-5rIV3b
[m4cdA14mReCN)''`XcX@D+[r!S&UTK$4SA"p6r@TBlp"`2Eqj4bic@@+!`9*c5%
I`+dqKZ!Va10Ne8&l"`ji&N&BH4+'M#qN%iB[#*8M6GiYNUSq4KehQ@cm'BVRG6P
E3LR&+ZbDY%el6P@IHU%q*leGYfV6jHPZqNSSY0e00mT(@qA-h"k#`h`lNdXG4#k
efkq*IJa(FDDN"YT(RGMel,Pd0T3)GGJTQiK%I+$fj,PhAUL44Bf-h[5(E(Df%U1
)M1dj@[PASkrc(%9"4!rc"BqpAcFp&VhRI54Pi,6Pr3A'j[1H&qhZp)CrfThqm%r
cDV+lk[,@X4[pYT(IJbqA2&0I@Cm$[$YfkRMpXG-pi"fjDcUC0JljBrChkC!!Bm'
(81)!Mcd2dc3N(MKKXdhc+b+6d"%2E3ZlMb'3!2fpar$r-Ima3lDfA5p"YiiG5iq
GcUeLjq&Yj*CHEM392hdbLq9(e1d,40R*9lGdeMGkdqdj&$80&T,Epfc(2*R`pMI
mlqPXQ*j(1fE)e+9M`+J,SfY2$TG8eeH'Hmk8H(1LS#$8-MkUk+DB(Fph3R3Q8[K
LeKi'LcaXUdb)4qZ`l4eY'HJp+f9'QU--,1h&jC29,jcmrVQ5bP0im+,6fqA+H,8
F9r%X-UH1ijN,lQ!TC$$(PrTakCA+FfI1qRUf`qYC2d)fi$HJ6V%Z54GYQ'5*c3j
5CP5jhAeia3&'&,(MGMCm'4ZHHUAREZkSDMSEqH-kpXkQVIIBcaVpGFecDiVpMP$
SK6Y#)AUFi[E"kKJF95jf4mJ"UhlM(D,4#pY%)l@eD24#665+E`8D[A$hdHL&ED#
4-C!!9Pf["G,@C[$E#+3A,XKbJdK48Er89rIBbiHG[k[[bD&FjjecIh1m[JHaTqF
1r)hfhi93Il`NG2*X6XRCfT!!GXE,*kX"aCcX1C96XUZkK(i1P`b3!0J"!!!ZM%&
%3e)$!&0X$e80463#!'0'lM2[R6X-)b)bNa%4iD#S5+4%CQ3Z[IF1ep6F6fCQVTD
LL'+ad)9S9UE[[61b(e&480(F6fEZ(j+CN!30,TI,9@CUDUj8a(h46-h-#-IKpli
ci,LIrZVr1qI[qcrIfFphcJ%EAB%%`42NNT63R'pl1M&aK[+!r(L-9AkF@re*pkF
l@kaC(X%43RGcCpYkNEU%`$UNNP9mPG3`PZUe,GD1V4dV@N['VT!!Vki8jCIELI5
N3'hq`N4C8rkMkIKq08QFTRPX+I3IBM,rEq&NfDR-e@*YAHKAiM(qIH&X18j*iem
@IL'[9rkT,E1jk(aaS&CQHi,q4Ab'$bVm9Lj@5RPqi36jYM*@Hp*@63H,frQ3!-+
KmJ2+GpTpYR)kA"bKf@hhdap%+jp91%mZ8KCS$EBh%qR6iK[mNF+TFTebNFmXI&"
q8APBHmPfKNi4ch&MBA-C#8&EDeY($@+#GYlf!QdM2XmI,db5Uj3DRP[BAakJ2+9
pEUZR`m5&@JYE$lT)r*Sr@cK(VP"'D5@f4R5-f)U2+e`X0e2DmY'&)q@1bRLYeZD
RH@*l,FDf1j'q,SEce`UlbUZ9TEa6B@pjLI+f&QTE46Z)8EbJm%IjhmSIfLCE0'd
XCQQIf6kQ[F6P['GK(cP-ZFTE&riUIkMmTVeXHj91&'GS*fe(k6IL+rch`ZRb+D@
G&Q(E6(m52q)r&lD8VbQ4[%RK,r)Dj8rYAlD0Y+QiK@FAhReDIPr*d6k`ED0Aa-[
D!GXlp,Vi,Vp8Q#R[9lTVRpMq4[Z+HhLh`XlbAZ8JleIiP[aAjE$fRZd3c4#$YC@
f&64!I)lI+`b4pbNlqC(#'r*@jDbfblD$TSZ9h&*i3CD8)1e6f`BD++UDB$04Kep
8(()KPIf+!h826FM5Z-j6q$&qQkrP4hQLPUJRTL3H5lbGZ$D4ZjbajM42R,BXZBZ
q2Z@BU#B2A#r*Keb5V-$BA"XSiY885IlF)mRENb8j&UBDjKQBp8!@BH,(T!T#C6!
$Pe@Uk`I'9USD6DY82A4pTDS6Hi`#Q8+XN`)%`CRC,4%q4Q`+XFXBlm"B5AC#XfD
@r'C*6Y%P@AG+XLYCd5Cp6V[ih`lD&VSQ02*Dk#VrfiVk3F4Qrp,!&4(qQ[!"ErU
I9erm'X&5j4HMG[YAA9NHlIrJ`c84SIpH8q&I%4hHSX)IjSq3!$HHprHSrFM4BMF
45PmH[HE$05h3jr9JbN*@426SNPE-Zh`D&HU2$[5,QpG%,)rqr`4TDJqP4iqHp'[
8+9&0p'YqTep69#I(6#$4*$ZjAf2@la3G6[,BPmM)6NfL6Y([$03i`6T&@A0#2j'
%(L`KL"6,R9M!@*L8"#3H&$ZTC[+"%kL6F4"J!Y8U'5K'JH#!0Nd%&1SdU8kQN!!
b!M&6S5dH$'95UGF8EkDTC%NAf-aC#De"6STZR()U8#TD-1G&P3&q@X3*dNp&XU$
%3%5&&@P4C4!6i%98$23*QLLYp#QJ4B+$S%AUVj5,U"$NBbmbb8!&-a(#,9jJ%)T
%&IH#JiL)"))TQ)'%HVp!r3aAD@&+!&ZNK#5H5Pi3@d#i8[95L)Il)BakV`k"Q[d
Z[lP5GCQjhk93dY5`L5J6M)MrUSZEdGhkc3l-J+4Q%q'5##2i4EpCN9eQd3)9,Xl
B961CLEJN2#k"L&*SJS4!0#R8C5)Vd@'19ki3-"[LiIV83!4m0*@mH(QQ"9%QF*L
&5T'3!1D&+")#U9PJ8RkA`dXCA%8fhbm6)k3c"q%EP3a$m-K&F+I-A!S"+PF'NR[
+FKJf#kiPrY2B,T[!)&l`+L$hhMRC8c'3!1Q&LRXbpfRJTl@Z"!3K`#[1Z#hNqM4
G&LmcPAe398*GJ&q,TjC3+MVm[Xhd8H29Mph@F(TL4&8JL3"ZeVJLb!5MZ!K'2'X
'29K`5($"*6KF4!613NmRNYlZVX*Z[-E-&Z$Q@L89"!Y6,e$"*([9%6L#bT!!AMM
TJNmrJb2)i!iNA-"j"3P+K@k43"D%#``-kfG&k!f)CfAN-h3`ibF0L+MLRF%%B[a
qKFb4HYL8+k,UKr8Yi)d!62$+!)XNTK49"RUA5"e%6('3!)83$"fFQ8Ur`R3*US+
8S5M8cka!e*SZ-*Pi2!%"'SS)03"Qm3*K'+C$CU*S)3@IdNS(i4H3!$)G%#9ibZL
)TmRNJfB+pQ&`d##RRjZGh'@@FPbF6*!!qFe12aCqXL!Y+0NaXe0`%&'5p#!QhQ2
AM"80U`S@838,S4),%p*#-00$p*R!ER)3RFM+,Z+d'`35-d`HHhA"Uiidk%b%D#-
kI13)5*91E+q6V3ASqG6#9T8@KM+TK!i(8BS%+`C#@4%[8PJMj84,k#a5@%YBK(`
#4k#T9iUFBJLji%lJR@MZR)b"H0`T-KrL3V!`#6'!F4"6*+"Dm+Q&VEa#k$L)P1#
0f#`Rf316KA%394F)H)iQ&ba-[CIG"0)B6DCJ,b%mAL!)D-kZ!RdNSS0LN!$4aRX
P"3*(T*T96JU$fBLdAEXQBTAr['AelP9lG[ZMe%hKYH+0fPfl`eGXPDk'Kfk-`'H
&@[((fRG4LcZ0iE9Z#qPUa)EP8D%VSMGZM[JJ)M*dplr&HfiVET@rbM-jL)b)q46
6M42%LF3FJ@j(6$"TXme@HEEG$DI0EQE5[TS,G!ZBIC)FdQ#9M3V-5TJYST`HM3R
H`SaK4-"1jiKbCKqBE*MZSZ9H$6YLF'Jmb5"MpK(6fH11"#*QG`Ed6TLdJl&*FN!
r-FFb6GJGr['5b%fESeIY@)kkDA4ST"L81SAN(0-0-6`XBR2dNRJdd686ZJa@qIX
iXY#q,mCk)0CYB5j#p6UajpQ&PEXMGX-9%D'4lXki'89mBG+qA`AQDf5KIDpL[42
V%*M1NKbF,mT(-X@J)rZf4'jD%KRUAh2heQUmV"2"0J3Q&k`R4IR'D[(kNGc6e'c
G(1'fNFFYVI+mDY2G@mMKTYkNcD[$C!0CD21fBHh%r#"-0##9LR*f#D!0Y&VD*,%
0#BcDY'4jq*j3Ik5mLEN5rTph"2,YB3SNqHiRSL@RR-N'4B9',iN))m,U*ZEJcYU
m!XK2KZa`Q''3!'mQbMRPSRVcCXpbQJ,F0hV@GT-fUaU6CM"eNTcC6T3[@86(,9+
#HNY5QBDp9XZXMH`qIG2QL$fEPZk*h"fp**3"d'DGJSJ&mmX`@C*m29B-bLQ2hji
Fk9TSG-5jcG&VPLq*aSY4e+ES*HZ)iNRDV$`YSFTd4)aF%aUp2$cqfjjr66$1EI)
YlQk+C"SUPkrCZ$XL2)aPZ4'afJLNNeP*Q#1GM$L[*@bdbJRC-&GKU*B3,!YiBAS
V0$*dPA['1$k6M,KQZQAQ'B'F-`,jE84hXY"'p-&k0HC0B5CV#GLcK$j@4d*6!Z-
'JI'Bf@M%c$YNSaqF*Zf(@%cmC+(p8!%iHCLIJ9QT*GJ!Cal-31[V#I1IEHh`RpL
5(%re$kG5QjdIXV8IJPQ$mX0P`)M#T$0-%beKJAYMBTAEm010b3p0@'25pdZB*M!
cV(F6NSM'accG%&FUf#'PfT!!FJCf5!R!cX5N!NE4fK3G$pCi#+!E['#(+!aXCh6
AR9(IkE`GS)fiKdrDe&LlY5QlHB112rH3!+lDN!$'*Qd)0Rp)5jK*@K[!DE2&QY2
Qd%0)id1QDN-jq21YmP!Ac(DY$FKUJqc8jUVeE*ZNik%02D-0aB'SeLEiL&ZA`@p
1Kd2$MNq(3kqDY+%8Na#bd)CLBiCqJMNfCQJ6V8elNLT0hK3BY(c6QMfVGkm*4@*
FZRYje1C)iPkQB6BQLf'Q5[,VBD+P3bEMZ"#e+A`h[JLFYbcG(4iD!HRKDGV`8ZP
XjlNR((GiR6BF"mM9fL!RY%N5k%+"(K!SC[m4D&q"GK0SBi&@#24(JAiPd"+'lB6
A1S'@#I4AJEiZ8&@JQ`ADRdQr+p#P![e-S)%#rCG!"`[8`M4HCZ&eYViUd*m&@XI
NG)'1*(9EDQ9+83qT&+K$*+q4*RCA,G!&6"fN2aES-FEc082G*p#A8@F3k%bmpc'
pVc)Bi`@k5+$Tl#*)S-m*Y,G!4`[d)i%Q#,3eUlN[C'XE1mm!JEbQY@)8f`@Dab$
0%ZJTJDB*0%#JVc"&NaQ*K3*p8k"r#,5+N4)Qd'F%HNfJ(`TdV8!(#I3I$(@4%3H
SiI(`BYRL(L-8c0F&qTC![a2S$B'1&HK8JEl'D%TRVRqHdI3,)mJUd$Kf@S'G%jX
a@D"A"2UH31FcN!!+Sf#930Za$5J@D'H"'J5k4k!HJCi6U-Jm-N5J@3,0B!I'AYj
QIZr$cMC#S1d&QX1Z&c&DiIeRQAFQ#I3TGSEq$%C(GZC5J6B5k$X#c4GS2i&q,p#
M!KdMd)N-f$$frb)MTBDj"SICbh,-6ZE@)`)pa(B,`1ib1J$lYrJXXS*jm%0fb%H
Bk&D"EK0SGbEk%I0q2A-F41F*p,"!Gi&dYMdad-9bcfDf6l1CN!#IUAk(lFI$!Qd
Qd-m&'L,3EpJ"S-)Kd$-#R5)NhXHTB[1hMmNVbYibVk(TaJ@Zi*AcDrU%jCCP("T
BeITUNY051EQN`kT4fc2h$cR6,Q*+E2U1Z48&8A1UZhmbq0cd8dDc+NaUfhAeD2Z
9E52UQN4163[Cpf9peQI$L[XGr2Ema&F62)%ETMAVY(4aqH8$`bqf[$BclXM1f5d
D4bmXlE`hIpf-NiN'64B,DerI2GjkpreCErljVkHA"Dciji#HbrXrFILp[ccrkiH
2*eq3!2lEk1h3-3pFHRIS5cpYIVM,f9eIIIhM[jppXZrIa[lppeHDk`l6IcUq&Ml
brT`2IRMMPc@2V,rhh"HIprViU@IHqZZJ&hjlZ8e+d+IrD09lbEMlVVrchBXrIr6
JX4YE[qraakC&Yl[YQE$fQk0&CiAP%Bp4NafdmGBGj#$dq)23i`qk6"EDS+jBSaX
CP!8c3c1L)HrA&)hh)G-fdaYelQd32k&"'M6R$RhM)050"jZY3B2,Q4)!(9b[$8T
!&4qYp1#f[NN$!(q,54A-IQh`IY+SLA+RA*Kj-)-*![e-'BcIHX&BiqZT"JGVJip
SaUUEZb9dKYR'X*XU*"QE)Z'TACY@K8EaJk'4QlC'VJU0C'ZLE[JYUM#"Qdi,,-C
C&PVPXB6NaGTBe+F'SeBk&T@bX3fD-30JFf&)e`cU$`m4X`pI[V2#XcF4-$C5'iX
+beM32aDpbpM,QV(268T[(,jm-qF-EHaXcCLA+Rd@dYlD2DYb%CQ&fPLMeYaerF4
D[pY,3EjIbdGp1"qpI$lUa2RVY1CPclQr0H6[eI,$Y1CK9hc(fV"l6F5MU1cPCpl
#`GkDF6jkrRcdq[PINS@@2acV8eBr1[2mU9TcAj@`1DX5BN+YQ3R"2P8I4'hkk&%
3-D(ZMN4-f'(5*L$V63JM#fe#"0E&Q*q#bGDDCrZSb2"4dGjk)b(iq"I1@eAM*m`
r[[i`B5$djPR26KMQAZmJ&pS%[(j0`1YAATT[VH@9!Y8D+06jm`5YH924FXRL"4*
IY`"[hN%Y$rXbh`[q-Y#SpQ2E5")m&akf1l,#ckjZN!$&RSM)hFXMeV!,rlTiNYh
90IC9Akli0'eDmcpT!GGdNjD(ejUmU@5"VJJ4A9QXPJIhMII!&%[bRcBbXH-aJYb
kQNK)PLD4lN4[HQK%Hf'i[$"FfRLmZie(hKLI$KKf-V(6*0(5fX-d($lH(apj&IV
8Ah&AllY,pFUPd`ji5'aH0i`ICC9(Pk@kBA3*FF2i!Na4KakY5(,6'$*KE[Kj)C'
!'dDjdlVTdG#DkJ`#bD@0aL[#k!i`V5AjMbCN`Tcamd#Q*--,`3YJpHDPrl1R4`r
84Z**f5m(V,+K4T4rR)m*dSFK4T3l!*B"PAm$fLX$QQ!$QQ!$QQ$$&V`VchIIek9
SV4m5Z*'a*QdN@[#4+X`45@i-CaU3!1#DSeNci*h0J2E3J*Ff`d!IA,a9'3K00Lp
F3fZQrDd6crN3A6PbK$D+R"EEdR`"6[XUe!E$N!$NMZl(J04K3%Bc`0d'0*)'E,0
K)m$khEF[rV32%HJSR(N8cM`+N!"'CH,-jG#+mcE2Xa1(%VJ,l,5'J,C6[jf@f5Q
"[G(HfCAkGZ&lYr$M1@4i91MZ5&jl3M[NVlhM#iQrYY*lH6FmiX10SI(%VI1q#B8
`E(c6-1D-VfQiq6ePc!jY6#A,L'0L60SB[25036iCFdU5I`j%4JIP9AD+A)r#!bh
RfLQqIVA%J3k*FVY!1d9ZDRR4EJQVjbEH5ZYSEX!6SkpG03f0A#AYkfL*Ub5Q6QR
VSYV4SqSYb&SmqBjN,4jXFQGK1BeiII%34Z[L"5CYFC,9-Lk05EAImbRTk,#*iHK
B`kp&q(+X0bb2MSK['G*p![%NM0ZTMBY*96N1MI8iR(iF6YmkikpHRS`lk56mmFc
D1&6(aU'Y')GZF0aL5Ckq9*5RidAkYmN``6$lBBT&HH)-d6)aQ'RZF"29U6R[eP"
-@Llb@#jb9qjq8(M'4f'raq!AhBR-h3m9U$,QiT0MlL4*RT&QTaPfL[IHhfI$p)1
*%HR[JMbGR+*85k3J',X2qRr0Y90mh1aFJAN)c#IS#)`Eb'[,G[D+@QQ5dqMlfZp
qmK64+[rZhkSPjYNTf"CSr98mj,$MHVV[H[Taeb-%e9b%kppmelqjA`pVHh4,SQE
@RFQH&0HbY2@aAH+1&9RYpfprS2bqXLH+RkPqX[5f[lCYaj*'c9V9$+Mr[1,V&Md
DhUalima,&eqXH[lm#qIq[QkYXRYeq+V3T8[#PRrfFG5rScGYr"HkVXhA2VVkiDY
rrH4[HrI%h&RJj91[R$`D-MIpl*(,rES&"3H%h-2m4[EG+cQCPbjIccMFlkhZI6Y
hDrpkepFk[0fTGjqH@Ed+ITca6G-rQrc5lUH@2lIqGH*[dhqImBfYF0*r*[phfMr
Qrr2,i(Y[qEm2QMGVa!p$KJlrcMm`mGY"JmIQ6mJE2hVNU)$XS,XhVQ4HbVPqH%&
'pmjp(jljB0,M#@f-c3f*r2qY$d6"9#PYq(6PLRh2lGLeFqZ@plGpX2rG!qmFHZq
4JeiRh&(L)(-#P9@(j8,JZ#r'd,QBpeqF1qcCTqCB&Mkpk-*A8kFm%RLm$aVrFE`
2'[rKjS-[jRlPRhhD"hpapm'BaH0bq`plDXkc#aFYH(VU)e11mm&02h2U6hX)2r)
!k*Br*G%lDlM&lhMCpQirqK"rlJTLh(k+fbp4iAIqaA0V*fK@([A[q01i)q##%iP
eh55[h1(U0%8h-p%l+$M469hM[A8V[rPqPBPNchAXC$,hS-b5LbrMDA`pMq9GH"a
+-"9a+mBXh)ma83r`FRiI,q02m',q$+rQ6r*5P'rbmeVHPRIN*E`4EmCEm4SqJ0I
cchN&raTM"(TJZpp%`ENh-"VQ*Bb`HT&AmHIjHIi#5X6qRDp$k5KXe'kqQSHME&d
SAmUAm$#qR(r'2qC4r0mmQQr#F,&rm8LqKNI`cI`DriKIj4rb9rPIq5ImEh`[hi0
Grlp4m$)ra9rK*e%i+i3RT[1cr!Lrc2[aEMb)"r-!B1pa,rS'cqChq4@H`c2j*3K
GjaRm-%6IiYejApiC,1hjkl`VIiehi'rc6V`hlm0lmLcHLaI`(rN-rJe[b[rN6IJ
[["hrLEIN2r2@r&FqNIr'Tr2IQB!04BMi*2iI2TRrPdrMrq$cq6rjPk$M(U"mMpm
m2SZ2i$r`)A`S(mkri`2aqjB2iS2j@*l2*r!m2Tk2jL2j+&#HM42F"G9A',djS2F
`A`#DZi2@[[aK2T-rb*2iicb"Yq&'hT`EH+,`rh`@%&&%`-3VZF3hm%rj5Vk#lq2
2m4em&pr*Yr)Yr(fqMAr!pr0hq3(q$Mr%hq-(MmX#rcF+6QF"$"f5ZFSGh-)[m%!
qMRr"a`!lPh[4rIPLRXZ(m@Ij8h`1K"EbTrNLL(l&Tr)Tr"'`2&B@D-crH-`X3!4
X22&@@H!,d2!9RihIL9RJ,rMG1JZ-!EAM3'pr8%cSI4Ed,N)@H"V82J*kEjN&Z,D
62Lik8REX4(!G*'(C*"B@NT!!GS@%p5YC@%"#E#8*aiD3!&$N)X(q*3R&8558CV2
3QB8Q,%`PiABX#d8X4,"`QBA@,156i'G#rVBXc#HKGMX,HeQB6%,E&L3dUQ,K%!R
0'1"Ql8KS98c#@NDS`J#mcklI,5AK!![[a,(3M)5$l+LI-04H4[6H`55XCST@Xf1
(-8H%c@6"3),-''5""-Y&%Lk8XI!U#k0*#'31$@3(#qT(3M"M#fC%"1pRi53,M24
J*KV!$Kb`MJAQTJ$'($#2K"!R#`dX4*+3!,kDK'a'5[Bf&TLkl'%Nh,@c`)jkPfh
BPHiXc'D"(IA+("*bpV(!YMq(Z5c(`J,E`KcQTKbfcCNE@6M&!J1@Q8$#T@J@XPL
BcJ)$FiQ4FTeYlA9'k299,,$MCC!!Sp)-2mZ$KjQ($TH`F)i&jUI$M*EZCeJ)C)&
jT6Z$h*HapBeKJ@RY'm`#1f[Ii5b`8hCQHDdcBq['GU`EBq['D1r@Q!9'G6Hf'pd
B@rX$,$#Ufc-!l98@')#ZE%qk9V03`3,EKkjXClSbdGGB(ZR!&(@iaJ*PJ4(8JIQ
e!mYPEhGLS58,,"peBXIVa&4dBV[8LC(EUB#&+56d6Q-KM)9d&M*BB'QS0cY'lb3
5qM!9IGJaqV$ddBFGZmqh,"K*k-R5D%qf$6hC0[4NKqr*FQ[2)bb`Y0+6%GTc)!X
Xc@@apL#,Z51,Y40CE!Zc@*l+BXaCl*!!@60BB-4P-F#p@,V[a9*f,qE%AQalHPe
PJE9$[9M1kM@A"ADN!ZDJ!TE(#jL,#eKf+@$%&E!mrL2El"p*lT0rM0CjV&RRh@&
DQRA0BpE01f#Lc,T1B8EJY5$,V#G$+,R#V#rEEpE65XakPd#cIXaTeNZDQ29@0TJ
NXeiM`%6$"-0-0Z[eGKKFI!k'ca@B96!Uc"@BTM"6c(T&+8`$$#iUXQ%QQ[8@Z@D
p4c&-2F`kQ*d`Hf'J[!H8Qp0dhEaBecf#VTF0dr@DqETH-92A@p6SZPLZkkC4ZLj
"B!8@qfESqR1(G(eA'8b*VZmmS1YEkh9pbd@BcVVq(Llf3QJ['&ECGAeT#jLp-"N
`8h4p5C+ZKjA#E0$ekLY1[5(3UEp3kG6rIYkTVm9NEB&6VpcVe+9XTri1Km%&Mdh
@HA'bVQq%X5AVcJ+BUFPkFN)bL)E"43S@,JLjTLAVbaBRkeh!e'9qXKlA0PNrPT'
Xfk16pIYR*1[PaQ5pl"a-EV,q4!P-Rf5pH%kbrN`%c'@BbFPkG8@brU3+-bPC,rA
$()!"SR4BXRjl*``3Yk(`0KKZ0iBC$J2&rMUB(6#ip'I#I!N$3,9T-&8`J6"JU*f
AV,Ie`,4)eMZZJ`("*3"D!U'5*XPk+`S$`PT"F8dj6#N-%$AjbIU!P6!id!!30`"
!kcq$-56V&GA*HSZLC,d(J$@!kFhTbATG&!`Bkb$i"Kcb"JlcaYaNrB`CCLm-L(a
TBV,q2"LHh`F6R+bIGm,!'HHcB2+5p4Ff`)6"G))C!J2(RiZ"JI*c9j2eG@"FZaS
''k#!B"%!"6K'J,#T"JB%QN$XTpLiPA%`@f!Jp"`1Xk-"CLNfYpbMmcS2FU&(6q%
HhG8!N`k6kp'AaF$dJCRLdG-%Q-NHIEdG"KIV"hVdf"+BM6"c2(UA+SmH9q(4MaA
$C(VdSM+2ELhbk(B2$2ASj9NH[4K+RaRLdDY2HI3R&h[dfc-mHPX`G`53!%Da(Vh
9#)pH8qr4kb-mqZF!8K(RdEmqkG&lK(Rd0d$BQ652rP+)4km#XQUd4pm"TEY!r+j
f(RdR#0J*a0CUQ#JB!(UrNdII"S+fJ@(E-)rq`3'2[Kq%[4[Td3p0p1M[ABATkY&
Aic)FLX+2H26PNcckCf$kE+P(McCl-2SGe9jL&B[I[)'80+FTT##Lh'&KCA"-@61
H9XT65*PVUeh0T88Em28[+*IlBp[b,R'LBcYhe3NbaHFFI(aVBk0T+0Z,4aj*@m3
EjqUj[BLRP8'3!2Z,q*-#8C((C0'29I(l+fQ$1iEFckG!,l8(cHH,R&%mq5,+lAT
9"LGY14%A!0cZ!j@m&Q9"Lj8ElqlRF@9mC4&I9mlI,1+Y4+*j#Y-Fb`ldbm*+QQ+
RT"b,$HF"T&9f0BX$l#3hNIY0XZBj(JH4Epe&+QQH1iVjjPi@AYVTD*jQjbR0"1B
Y'a%GCVpRifZ,k8+H9X46YRZ[&T1V+IClLr&hjp3GM+RDHp@1%'$HE`pTaa2,5KR
6ZRMIJkR%(T,,MjC9XKZrf`e+(1D+!@APh"@(9k&8I,%p)jI[hPE-(iM$hp6JAEE
cCiTi[CfA&2&D86l1pBd*3kP[XY5ZjK2X0,)+*K1V26MrdERl`2rSlJ-hZr[!mHi
qF*1l$k5kZj*qkqlZk84dY2hHG$L)A*efGkjAbEeFiQiRBbTfGhIXriRZ$S#ldm*
i@JP2&NqcZPMTR&K4EM*+5-GA'TUqJrqG6Z2Rdm5F&VcC6PkAaQYT0Lmq`qm[jl8
lf"lJHA1#[j,'BMG%fC*ZBU6-&2hY8-3DBkCLl1UmdbLVfj+GZ$9*mjhX!DdIQk"
))F!&N@Z24A*!l'1,4**i+lrH`GhTD)I+@Tb!VhX-I%cCUK2`BAI#Yd4fNEI,5rQ
H@2j*#AmhPMpC`Xr(mKG,H%-XKS6bRE(mZ4*H'F[&%VidPYHAm)kah,rAQdfk8k[
9BCK#(+alf"6B)Q*A-DFEbFaUpe1fR%YQZ+`J5h-R-X0b*9YHmmfdlN`Yfa!XSh`
cmh"lGK'21E169jGa+jVEBYjaqqQ8ap*2S0daPj-fFlh9NE5&l'FrZcS+5I&QI-J
S2V,X!'Qd8q,F-[`UH`"5JX@P,Z5HFk5jCd8i!TUlq&'RBc,qUTSh8aQYkF$&e0!
-XXNTXGj8PNGdYl4M2*LMqMcVAb#,4h+pdd4rY8,G-"NB!0AJeJ2ecUJ-p-I*TlL
R1"l#i33b5ZFmIl'B0a6c!F@m,6lR&22Y'(`R-$B8QHJMU(hik8@kff+Mff+rfk,
+E9'GUNLba#NmZ9M`!3m'm0U5Jla,YHMBceh9hSXT+(*Dj1d!!iM%GQVKRQU6Vdp
N6%9K2,NkANd)8*SF"LI&39%PAeEYpDLKL9F6TLep8SHS#PfqHfaS!NVYQpHKZ(i
mL9FaYX#h5%!42#FCL8(mjfdX1a9)!@9&h"AVRV@hfi0cH@hT1PjdRS`8NYGAQmM
PD%*G!RRPipLZPDQBG'$mCHLMD(HHiK*1e`*#N!!U"E@C'ca,HZ@&@Rc35Lj2lD*
*2B$481413ePUJQlVMQpJH2Yq(S[QYKK$[Ed1)ek*C@GX%bBpj[e+R(Il#9TEH)(
GM2maPiqca06`#KG[9FBrUZCYUhPi#FII@b`VjNr52R`IN[aUrLC@$E`LeX3br9`
#Mj0T1r)@ckDYb6XmQikb1SaP6(!HTLk'R2kS@@aJUAT),"D`T#EJ4bASIRd$eiP
&!SqVjm[SA"iA@aQIVDYB`X6MDpFYABKDB'hF!EF%FKC(A55AeR2m+9rV'934P8"
V*5m[jLJm5E,`BUp56%H6lb(FQkhMFreSdG,pM&YYVeAe5YkPQ)`'FKA(ec"p5Bf
P"8'05-ep),*"`9mcXb[h(V$cpG8mMQEaMLj@Q@K+RV(2fS&(LGq#GNjDcl)6d4$
-cZAM'`lalADH9Jr![+fAICjA%!8I'IF'Z[F%*+6JLA&P!NqZ!TfqUdMlK9bH9rF
*ppX9LkZ#$#3LkQE(#i6ie+dq!3NTdRe9SrZbTlSEJR@N+Z)[@mQDCPGUCGc,ZC0
NmN"c#j)dd,1Q0JJB1CfD0)q-EpM#6PI1Zl3ilR4ISE$VC4mp"dj!3LU%p)mP2+h
D(I!'HY'EX'jZANLcF$'e%5G9M`dR0K1"D#4RTMEU-lhYCMPYQBT,mV9eepaf1''
"BTEh9LLf9i[ijL+q8H!VGr#MjAaP(2qY,9pjKT[XI&dDIck@RbRL2Hbm[S`hDNE
#Q9L#A9I*(cc)2el(0jHC#)c*b%`fMYPJmNf6c,+XMMC&C(B0UH-UQEd+SICNGS9
mkb5ccZ4$*bFHDSVaPaA-E9MCX+U+AhA'bK+r5XHUZbrIQGZ6'FRV-mKA8$EY&!m
XQR`fC3QK+a,XI1j0##6"rQq"@rqr!Xi"F0D(+"aSR1mE"b0[#KGNkbT*YU"B`S8
d8EDLk)%e#ZEU#YP+66F9e912'dB$r[L406HASh'6mYGLM,2!'VZiihZXJ0a84N'
f9i#5G2')C4VKGEmT``f+`eKQL,+p%JB&'1`9+f6lQ6Z4Q(km#NXHRNSjaAX8Ii`
2&EUd1*lbL9ZU+lCEFZpdMZ09i5Lq%jpi)4Bj2(9NU"qeDa[N'F0&qIjcSZc"8,1
kRD,mK&'J'*+e['bAI+KmPlbMJbJAMd+aALV*'b0&qIBUE(V`H`l,&Jc%K"-NKf8
fQ9j)Nj!!M$$&N`%@6V,3MS9m%J+fXl#1K3J@qK(@J(N5-J'CKJ$!X6*4[SHLDFF
`[$PpYB4"GD)F0dHdR&e)b5$&)rZS4Q)Qe6b)Z@ajBl8h$L3bDRB*VC5c"8R0hNB
V(GP,LHVX$PLh)aI$*29Z9ic`[MX%blXcS4d1Z))KBA%f8Efb'YJVVdVUP@$)A1P
1PUfa(%b@Fl$-5C2)k#ijVS1SjT`RQ(f5QK1&qa`,@6D4,$PI8M+`2l-Bf-akB$0
h5'VQ+6,,P[$!JG#6LI,5FAC4[D4!kY*qA&k+PY4,4-HP$-bbb'`kCV2*E*JSGd(
Pq2*"6%D)PXYGDBa6`&JZ5FAJK8Vj1P,&p3KF`Q5XNq3-l'+AHK3ZMT28`h#'H[J
FX36-i3M*FIJb2@Cb("j#`df1IZGT$j1PAe0#XY`23')hL)khmJL0hC'6Zjm"UPj
8ZdH#ZAXJ-#J1P$BBQ)%%Nb$*IH1!JHIklJ#QEibNpL9ZkQZ8j-j9Z%+"X-jAX8"
D68-Hk`aRGLX$0GdU-!brQd,f5qi'YQl4"+X5HjRBaX61J+TZXh%,R5V+9X"Z"er
l'XEAIU@NYPm&QIB4Q(8R0j1T(bmFViGK#%jM3,5,mZZ$*G4RbAQkMT,Nebk+mM+
FXN-,5He`!,`GSL6D`8pQQEMUMLY3q(BTXXhE1`RAfjf`EJR)Edq$e0[$X4a0PP1
al'5@e%iAb3aCS"-13$Y"PGSTQq$D5fV[0#al)ipBHSG4-TLlGcU`'33ahiZB)eP
k*k&3!pj9kX$9CjpNk42"XR#Ib`64')K[[3JM%$f,*%[2Fqc`29G*DXq6"(N%b*C
Hj%!J&`#CjC,8V#0N"[+cL"HcmL5e9e[-HP9*PPjA#%bj&l*A34aS,'L'Q`)FSS#
iT1!U+E+)eU""4'P06,D,MMqDd"L6SfN-#ArD@E#4d#55*1)QSiLVIMNJbXP*j&-
B*S0*-8#*I$`BDC*r`T86fH5RD@Ji5(("Lj,PCcpaJH2R3-,lmd$*dIS-dG8k!d&
Y68llkbH5qQX)QH9+PSNc'-fr&8Z1k5`j6rp5FXa))p-CdEXXe88d%4[rj%V*mH4
RG,G*,P8P4qNNQQL5Ef2mTKq&l1`fd9+#5cLU"#2Sl+Y&Z4'+lMB#FIC$SU94%cU
b4T!!@pNNYBBNf4T"XJcB6K1h#ijk1i&6Rb3j2Qp+DdhbjbMQDjdXUKA)*R*&Jf6
"-##b4a8NpeCN%pZCf!*b2h%R4HQqBbe%Llk4T$',EU-D"N)lfdX1C`'F+$ZRSL9
3i66d&A&)-XN*NX@cNBk(9-S#r28Dm(G*ak$eDE3McVKX-4)N"YPf3DR@,L4acKF
GAHB6#Z-`m#)@6I@a$%c380M4E-DLkR3rqU%dE%`jNZ4pD1A5qSQ1XR2%ff@RD%H
%A,*iSS5f-XP2p*(N*c!k)bd#6m,RN!#,CbSJT$i6J46ac'@'Q3b-A&dK@DVhdh"
X5[88H*fN--H6Na!XTGKDMk#@NXc%pL',A*B1)d6HhLQTYh'MhLE*r6E*j,FE5il
E`iR-E52CI$p5JZT(Bq,`4a1d2j1K[b6SA$$8STHTV5,8eJC+DLhD#8IY2++m,Ik
F80X@),i'cpHRdI%QZH-kT'Qm$A9F6"aG8L%j5UU)cK*XYXR4L(4$DL0d#CC'FfN
L-NBV0#LY`J#N&C8FVBD6JpD85ikDUi5VTJq"8T-[b3-md"XS1JDX*"S')%'V!bD
"E3!mA!m2,eXY1ZSr)jIeD$RNHJ0`H-HSU-B%)i0EB#Mm-V4-29#$FH&EA!-5QfZ
J+,mj(418#Uf,NY5k2($@'5Ae$@3PaaYc#H`cCXPaTTl3FQB[3k"Sm4R#Y&*d[$5
4S#jZ`l*1Y&49XYDm#Nep96!j4Y98bI&m!CNqEj3FjbZ)p(NdQLqJ"h5m-*@Xck(
$GB(%Fc'5jGadeLDG@``UcU'IFS(8[k-dD!U+RDrE4f2+"-[De63'IeTJE3,e)k-
Uk%"6KSX@%8j#ZbBL5`LF1&fi,$P-CN+dUBD&cmM1Q5C"(PA+6ff5ie1@r9E'XE#
&A+r%H2Q8,&&q,Ppbl2#3!)XGV'U`BqP1@SFlM"D$fe+DL3jY$Xdcb6UU#CiGSTU
#rN&f05$*B)K4-[3[Lj%F'$5)**Xf'Ape#N@5Nj%qeU1aLGe)d,&SIVY8dA&)PA%
9G#4FGUaBXK59-C5eL+(Xb&Ah)a8PBh6kGJ86p'F2R-)%T*5$5LI-%a-aXD#1"-$
1HY(ac""dUA)ea(5dK8mLaHUSX0j'1Y3E)fr13EFVGm3Tp50SJr$&8dG+E68#'Df
HA!d!1$1%kp'AQeH*MXpML,S+Y*pQl0(A)!4r0d6Z%BDAePc4m8B$AB+mJ"h5jS[
b5bL#Ud&ee8PXr@LLlRQ-'F3(eKIU5&*rB3U#j9`6ZJK(@iI4R'MHem+Imd5,NN3
AE4FX3L90,"FXTYCd%D)85aHj"-Z'HREjkD[XFZ88GVP[*lQ8Ri[#-&*4hJ&(aiL
1(9P)GijGGD4LXDXG)@"RPH6B'NAfDHX3bE'YQ1cN0T!!pm%"8JACAdC[Qp6pb'M
UZkJ2b1p'5[)"$+&%UHah8(Q5hfQ*8BZLie!,dSdFQQM#mbRcVSKHaJ,mXJF19,E
jc2k"!kFCMFBTKJ5$BDV&mS2"-*0Bc)H5HG*if%96MdC!b'J`*$(Ne+00JJd'3bB
`aT!!T)8'3m*S3r`rBi,aLa0ZarLZb'9H!P(aE3+,#BD%b@`f0K8a*YpSI0M)#*J
*&1KkF*6&NQ#a629*6"edr(U-dIJ)'"+-6aZ06kZU1Y-iK`5#QZ#G-F&&JeAfEi(
a3B["10-,BNSED"KQ5I)*2I,+CaBSH-4)U&jSp+%IR'0*-Nke'#a-DAm,m95#F9E
)&B0P&$4De)A-+Bm2$miH4YEaL&`[MjI-A-ER"F2BTK)Y),ir36r0R*6`i#+bHJV
6Ke-j4j,C'0pbP'mbT6m4bSX(jh2@JXIR'PipF,,)B-"Q[h#KD8JhCD5b5(bTqp0
rh[YeqZ2XAmXVEE*$FYTN"`3TIqYciFJ&CIqi*Mr11IcdR((MP)-XK&r)Z"X5FUA
0NGHRrM+eErZTIalT2IAhM(X""5%KLMVjQmQ6PD0ZTN2rb3K$%C6,)3C,i+mh5-#
IVBamZA(crlrpHhNEbFE'**+E%rljR5r(Ih'dh%L`4p0YaX*r*KL("hij*I"Sqm#
[%,*20M&mEcKka')iqZFV,HBB4Kpp"pRLk#m@`mPFGC,kV6VHJ-dY0"JQ'!bc$Ip
9[mM1[@)aA+e99FkA,EhfNb)mr*ZL2$,cNIj+dmEaXlH$ARmVD8UIS(6ma*F#!T5
I#UCd8QCJmjiM1jJe8rP11DKXblbJr%`fjM#ah94PKAT@jGjrcbY8M-06&rj5ifI
l+ER2j33'R%d2YY`,$!MChciR+%3a%EXc30N5i!fr"$30D"d8mK[3R`3d#ISc51Q
JL-Sl6F3i*9mC!CAh+G'1%#KX(jJCR(-N*%LT$&+fCLVd8NKIc[rkF2UpG!)B!!!
G(d&%3e)$!$,1$e80C684!#*MlP1rYLr0Slb*ce+cQCK*(TP5RL9*+aIB('#ND3S
qQYkN0K'M0`Gl0E3XNd!hJlNF,dFEm[ND!MU4F@G`cUb,lZ`1-L4%CTH$,-GE'*c
eUQFf-+L-KqYJF"AGb("B$KZC$2hqrGjVddCQMVYhlqFI'kBR"8'3!!4"%!5!D(m
AjL24+&jmbb`c3ENCf*ImkpJ1VIfFD6X[-5Q*lc*RR$PASH*`QMmF5fNlI1dRG0q
b!L3D1+B+PM("&*rcHdkBkD05rQ"E15jq5!6Z)`*2hmiU#hY12&f*Mf,jih(jibi
Ba'6$MQ6b5AM)a"6JPc-@RTk+M&0D35HM#d6iTF*SS'*%ZbFerKbIrZf`iqrE('e
NP1Ujik2L,EPTVQf+13jh1XK8'2eqjfLJDL%0bhA'"KDdP*PlKlA6h+1GK-e(rRR
[PZPRjeIb3l00Cf%@QHNMXeceC@MiXB5[MUXZll#JYUeI%4VeLXGiZ&pY`rF3UrJ
a%E*FB49c$%!4Z&T(,c6c4'U-*)ZFA%ADTQ5DI8blNZc$1'+`MkqpkMM'4cYGSXr
KA5JiV#p[%UU0B@)4-i6KL#mr2Qc%$'+)#`"B21rhYEQkNdmaJQi[6%'UJhr0+mB
6iEMX0*)&r'Y`L-P0mF4STjF%G%-iT*pTV10arfq+p1baSCE*i%J-@DIEUIlVF%V
6h8K@"Cd**1d-hCIH8'D+Q%*c#dBF!TEAir`pF'mq+NL(m#H)9$kN(d6PA1aJDK3
fqJ5@8DR"Q#KAZ$1k,S"#l)DBeDiNB4$F-QZdJp#V%U&Yh8M@VA[4kh5H+Alap[V
bH('E`[@**DQhqjjIjp$R$,LdG')(A@Z"2[&K(TeJJ@Y,4*aYqQHrSNPXJheHA9G
GNc"m(m4fVp)(N!$#'N3#Df,*(f)U3j5E[Pk[@lqH#MRGblCb%G845Mm'Yh*M1,N
q-+EU9j!!jNX',kh(p@U&F#dFHfE9X!FIF19Xe3S33"-M0JB3`qY"'N`0Ef')0*)
p2J-dY`1!C!SG$ZAIR98G,3-`KZUfr)!bm%e*aKM*P'QM(F&K1i,Z,%("QT4fHbR
(KUPXLmSPYZ'2Mm'-K83C%UfMC!ak"8Ke1HDi[ffdXq`PrGf,UL0!PqVQU`*H84m
2VeceBSNi2"i@8q2"3rr4GQ4K@-'3!&4k52Hl&i99,c,@C!2@UmiSc01(lFh6e(!
[4$V*GB@50Paplpq8JG4S2RRl,@c31qYDA'jf5*[6YRfB2NdrdhdSc14bE"p'1Q!
hT@VHJLTT*Z5)#6E*6#dY8Fl!4J)T(9Arf#81[eYVk)RU+ia4UY23r8[qiUH2iJS
USBJbN!!A(lkPfrb8RZB38Yb0E6(ZG+m05#N[IEbiC33fC##P@Yb'`6*+jJDm3QT
3p`hl3YIkVqRL"pej2iifR4T0YDbr`T&#eEI8LK)iJi(e9*JQT)45pMSFhDBK*4J
)BA#G$IN"+3@4GS`-l1c`'XaX`B'#C*VJ#Xq05dQ'G)TK$UI%JdUQI%SQA#q0jXD
e6(YVKEJ8D353!"`IX"%j45,rlpA,V@XKaBb01TNZjS4q6#Ne)SRA"#8ak11$IDj
*IH@SrbqF5#`9I0JdA1mcHaRLS8-V+%`-p%)p%H)Gib+)9%CX%'H0D+@%b+jT5NT
U*feh3e#YR'dN!H8bfm43Rf#V6SpJN!!l@S!KEYHd$k"abFH,3)RElX6J!QT%T0R
IlS1BJS3H*k5TT52T&HhRJ#jQ+!34DAHBRD&B0T!!qeeFKjY@B!&ZFCD3!!%6`a@
1*#G2Q(i'8,4M1kIIlL0QQQ!AVYM0-E83T1,98h$p2MF!dUGc3lXG@iEUjQZE!1S
fV`!(Kf1ej&MJS-ef5e4m&-,%B8b8[0cd8BJQ'T[U&MHLfpjKVPZM$hd8@JD(-iZ
qNB18RZTHKG6JjIb6U6pb"a6eC!ij3"L6$IND(MKQ`dBUU,Zp-*qPRXaEU@q@$[6
h281JHfp*#XQX*5AiH5FIc1h5-NYhF&'ljbF"3Ti4(+BTT'fD'QSDe2BZDPX8m1r
64##BaqNq&`#V3lYRb`jdXjXZG@UEZK0,KjU#fMfEKjSZDaZqk2bL$9hf5r4hr+A
l$j9ecQR0L9UQZ%-2[SX`$EbZF`FY8r`LFhRBaBi1q[8JJ*0mEmR3NbcaAE$%4iN
NE(c6f8U)4%0e$lS8*FL8KaYQRb'8Ma(Z2Mr#%+'@8SX3'3Zf6Z5I$#[jT-aS)dD
p&cNc0mKEXElh[r)%K"JVQPQPlUYS[qV+jiEDVfiCDMmQEfLcUDQZIcQQkQCklUL
lXZ62f+Y@"ZpK5ZdYPF)J'%*'a22MXdf2,I+C@DFhQA@ZrEV&ajRL0S#S,`$&"i(
X5CHr-,'mYqle(CDk`ZAAXFMak1%G@Pdr,H-mmd%B"5iQ$0@9P!ZC0ZmNK5T)j!S
@0b$R#ID'GpSR"U-ES'Td"XJ0'$!f2E#2qmCGC$3M4h#5prGKm"F0%CDU*K3Rhp$
Z)`LcQ4HXU*[23L41RK%`B%Q1N!"I9MUK[[eD$J`4!b`r")'ce-P%IhKbE*'CYKj
L0d)4pL!PqKdBih[Zb"4V)5)'3[p*3p)9(%8`ED3U,Bm8ZJ8A-U%*mL8lTLSG-m`
6&SN0SSA*afIkF-%Y1*6JmdJ(-ff%SE"Z*RdNN!")h#ZT-GT'FLmrc8h@@aNHSdP
5#3",ih+cpI4JArULe8+PGM)DT8mNebF`k*FT,H,HrQ1%%,64PQ$lc3J(81&SH3U
GbqiMi8+SRC8BK2!,*-FaG(XBUG&ld6b!SI,*J2Ga"@BFAG6-@JBERU-Q@S&R$LI
P*LrYS06aeaXC1'TGY85F3,+mYreUZ)LKD'q$Br(S5B!Q#G#3!%Pd!e2pDpGFQZP
$`LDYp"HR8l"&k(665NCj8PrTh9p9!T@r@&Ej#$V+e%8ATd0"QRQULUQK#lj6A(1
p2L"'$V*,3JRKkRIDEaT3dqHcZCi(#$!G@9Pbj-GrC*Zi'MpVR(cl(k##G5+"Dkk
"iABe5'a[3%*5E*F)[G-Th08GfZe#cP3A[G4cI(8(4-0&[k+ZjjHQ#p%28)Jk2LK
&JidZ(%+3!-*GmZ'-V!+GJX,dD"P+Iqm*H&20XHMA"GY4#Dd4N!#@V@KH+IQD[X4
GG!Ne+cT6SIKUJd2FMD)3X'UN!-#D8jA&Eqlj5JUF"$l1VbS6+8[rc8rfPR3,Zl4
!FeaVqEQCZ[J,Ba"AilN4lN!$%dUBa)"SY,fYa%2X4qDp9[-2MlkkQ3e+TJG9T$"
S'JGY-'J8AI$4c!82$AVpm8mH+6(bFH95ULAFm3q2HXAq@q("r+im(,U[[hlBmYf
lp$0PJF2ep0G9AhcYLB$ZHrR4BD1XlI!eqZZk0UrqLEBpJ5SKiLD42aV,qrT[KIV
#8(XD3NhJ+P,F-!&DARl8+EkIHCe(*kZh%8eBU6&SM2EN%VLdDPTN@L49UZDRQFk
[0(KNU(dqL2dHDEKppU)8R2HKB1pprilfM"F)mjK6bi49FJ@Ef[G#(3P,ZD6+q"U
TJcZ"a+k-(+,6b(6-!4&apIQ9!Lf#-)[S+AR"5P3ZQLVD(cBeYAIj,!`PrFlNTVe
jhR2(qhSNCq"UL4jTf%&GFNk*j-3&#V66CNj*3hR#1*qE8L@bl[NJ0KDq#'0&UTU
%iD0K`rMT[G[-5H3cm`qkd@M9lCMbeZ50CQE)'8FB4UR(M)j1[RJT,$`l!0Ef-U#
Efdl-@d2L!"'JCMk+c4S&P8+16ZpK@DNA99Qq08!KKJ)SZMKX(0JH!'KfQ0Zl3R$
C%kPB06,8hZASi2c6+0$2Sb53!*VG21R)H@3@p8,4dXeqRVZLJa(SY)6)r![)K#q
5Ueb9A')&9pXIhRc-Ml62lI@TL[BE$fA#)e"(@0K&3Sq)B"bJZ*Dj[4kA[,%XJfB
X#*3&D2JS#%iPU505!j!!aU1Z(bl&YU[A%lbN@lF&@c$Na-HG"PGEU'K8*#-3PKm
VqQP6HePrA`9hP"9b!Jp-Af85#MQ+&DDd31,j%[I8Z-F5YD(Be[heJdpDa$ZQ%"K
ESEUL$#cZ,&MF!&@1XCQpUR6arVi`Gh5RKc`Y$INd1q66pSFp&YlcTlPX6,VXq*p
QUf-NMPGLZh0@fchp+qF-MkjH`)DAI(A$XG'9@mTRZ(lQ,lIT5j08e01EMR6rDSJ
qk(*JSJJmMbjQp*PpL@pIq1X(4HkCQ0&l4fCKlYdDVQAS`MI0G,8lfH(qR3CiJZM
NZhPlbhj",feXd6*N8ST'Ia))Lc(E6eiNC"eQVNZ"NF6DYLTaCdI&mrTiX*13!(8
B5$ZXl@ShH&%DD38VT1dZj'SRQh!madFYhKq'H8%H)$cad)rbH$ei6mjbEhhmIf*
U$DC8Hq&h1859c,aMLCaTf##`QTaM)RiFlkk+4XHiRVLpIPR'DCLFKNJ9#I$-iD!
+Bc0N0U%"Qf$&*XKX43hBLUcBLQ3f[3'EEX@Qbfa+!cE&LNf4fA)0f(*@E$QCEDS
"fj39fe6)P(0)@qiTU1#Vjk@VT@*9DX(!#jUUQ5UZ9RGH!cN5!'(N),'JGREYhbe
mMZrMKI`N"E,95T0j-lV5`IXlaT*#k9&CA('00CGU,9,$Re$F+qlMiC&FVe0[V0q
AH+#1T[C23Yb#d"K"8i(RqrXLDG'MQ$U-rTUJK9#Yr9E&,b$190ThU"65II,6ZeS
JV*mYbQRmk0jpR`lE6PcEd*(-&I'MQdE%Zeqif[BFR)H[EHL8R$(2h5rGhhB5cQ2
U%qpYD*AFb[MG0mma9P12eT0P&V2-m38a(bZ#fiTCYjfF2,&G3(Gl0--B!lTSElK
)Tb,)I!UJ#9QPNhXZ!I&#1&#"$UjA9i[V&6iA38BU[kf1Iqahh(XpE6`4H-9pC$*
39#LLEFr1[`p'@&dPJBNT0Cl[5@kCG%M'DC9H-!hFYSS2V(,-'FUJJC5C0lGP&F5
*19Y@F6P9F!S+UpA9RHZ0'HM5ErcUcem3SkYpH%'&33@&B6D3!)Bbe!TF&1H`64a
*XcYJ%-',X4FdC,rJQ-2,ENT,HAr1R$MB('jIS!NX3+@+p[X+'5TT'F@F0k-*e@L
RY)3UmfGAI'e0Ae&k3N@'&*`%+KM,+YVR2jp61FcjZ5T(lVUpX[r[T*K,YA[dFC'
'$M!#idJqRmJYGhKQ[`%l&`+Rq64X@L9m5G"#LClE@P8bjF`EYDrZC488,9EG+AF
---m'HfQcEQZGj'Pfkfi"l2A2P6i#pX&1QRUB6Ee&4d+B16BYENp%FRUlXN[lRMY
2Jm[G3%N-lf,$rqYR(Dj#L3F`EEXY--NT19@daFqeeQ![XD!JmY@RB$5lZCrc9N9
pSp9TI*,CrdVHpbHp-*MBJZCbm8m#4IJF0*FEdZGPFlNUIIDEb`ATma9cH9ckR$'
A&dQI&mhPNr6jc0p`253YeeUaRB9UeZGp$fB80@c3-[fhJZRT'a(hqDc*q4Z$e+L
e-Rflb94irBj08$$!%&%,31a-5J*kJ6083i68AVkH9-f4UrQ"kX33M#96,&R)d&*
5F6%+Q1EmAQ@FMVf@+YY6rVQi8[cl15iGILil5Y"mfiq"0+)%KVNb3*M6N!!!-PF
'$A1U%QMQbN"L6N%#dP`CA-`CPm!e9`BFFaC*J*XVJj!!15H[hdNJ*+8")2(SaFf
pZ[XIke2qKk#@`QVkbP#ZDDBZPP#9!EP'P3(*c$-4FAJrNNmmrPZG0Fai`0AY0'F
1ZC!!6"*qHr,mABFHZ&NIS%T+I+#Q&H+"mraHjKKf2($Y8##9d2HMiA4)2`Uc2kR
"q96J&6RPE[V#Y!h6iT+h&Alp-Fk6Mk2JLrNJ5p*8VVYeK21cqX5b(kfVT`,SfmT
9J,f,QQMG4Ml'9CM&[eD-Y!J-TTA2FFAfGZY)DAlmhYBbQ-[4-F+B+cfmNYG@04k
TAI8$EL!p,m4X`Fk`U0K'@pHf[PVmddHaR-Ih!bjka6!p#K0FpZYhm!$5Ppr9Ge!
`1*dDkDD*rRUP2QaJ3E!U!Dd+CX*"'(-GXjp`rY5'&&V9K6a@'Q,Q3!4SbQiIc-q
K2PFcdVX&kcTIVd@`k23$%`$3G)Fj["!0+qT!E3IUpF&P'5bVSJN[2*6"i83[Aef
C4ZIAqJ"'ShXlJ!AP`jVkE[fYR##&aX-m*U1Y`-+$mkFS90bPcYQ9XdQT69F1UGG
65*`M[*fZ0LRi,SAk[!BHPBVLd!YTFRf)#`4L9`DZGA3YT[Tf!I5r+$ERPR0*q5d
LkcjH8fMeD6c%qk(G6U1-K1#N[j0BEa([B+NV0Ac"@FXq[,,MSM2*2Ll,(l-b`aA
CmEbcQAh-N3Gdb`ajq@0XKPj![K`-"Ir)%KjX`X113SG8!4D%qUH0(`#FQ)Y`)e-
J(H#XS2(C0r%+d1XSUaaP&4qVq&KPJP8Q!Y9G9$G39Rp'1FfRG%TqKZB)30%p9%R
jrqS%Tj!!CaXN'B$-GYM92B@(,`Spq@HJc)T'+&aGc(5iB-MB'16kDlG'Hm[mfA5
)SqU`Fb$6kBS9#LG,fC!!56E%KL(LDcAj5aKJ+CZ3!"U(''#V+Y0CFQ8PYR9UTFi
,5l0,#'r8[&B$BBUKhpLKQ6kVTF5UFrSc+`Ca"(qSI[LC2fKmT3id6L-CUFYm"!)
&N!!'dKTA'HTlAh'd%*)j5hF',UJkP$%9k'@C-"MI#+5V25HiRY)!k,L@H6[J5Z*
R'LVATJ@d$&1XEqE`#)pZ5"8p+AfN-$KeLNmpp+2X8!%rc8,5EQ#`iE#dFB$-88"
hp6[rKr-90k,4A5a8B-80KG"IpHDCQBF!X8'"f41T0"RabB6V[CqU)eq'j`&dm@i
Z&D3d`YYUUK(HpL`3hSpA$9q9i)Q2%J@1S'12ih$LN!$Y@IDAYfh'bjYAbA#Up`l
rN8rpqJ4h4-lJi5R2E+1%b$#1F*Z*Q*!!"1T&-I4)Pa[BjT05T%8,'1kHECcTNa'
Ifd4T#C!!%"N*4jS%%BK`[EIKJSjjLUTE&*!!r"e)MQ$42")--38"lq2$0KSXc[Y
GaYHb2rRj283DMcKGQ@dFECRTZh"F,SlFmB+LXL8YpNXUjU`cHj!!2-mkh@RR5,@
c0Zf-FH[PFAhP@ej"cDYiV+Th#!#"f48%lDqLQjFGMkjK)$#b)+K0Jb"4R0k@[p6
`5fc$(![FX*amUGV23&ED52P!LC@d,GrU3SUQ@q6YUX9f*Em#-2F#!5BT6TKQmqT
R3a)b`r!k1k4d0cMNm2q,8(mD2EfI(%HkrTKFlGH"G-ZkZ#-2!%"P'JKh+&+%G6q
!NGUcdFrpB6Hl[MMla8`I8qKj4Q!c#Z1)P9U[hA8FQJL&@LUZHURFRI'#54-lEN(
Fq[%BJ4,iDL&26B5(@8FFNm8D)R"10YC6dPD!q0-LG5-l!a8,lBhPH)#!*Bj6Ta'
fhiI8(JhH&Mi0*8)29k#D1Z8,S&2h8'8M(SAY)G&PUaDbQmb4mq-l)A`m`DB0qY5
JUPSTV53j@k8K'c0d,3U[TkTLNJiV#D28IC%!jMr"+lRU2i&BI'9f@IUKD2N"&S(
#beNB#iEUJdJF6$h8K3-!i1[rb#eFa-[2$6`-'fHG&lB%fb0'$'R)HNS!aZdHQ$j
(aRi5*(#TU`#K@9DGGG'V%"SmdJ8K+PKJU[iPJXqZ)T3@bCrS$4D)0Kp*MDj32F3
PM8,*T'USAM(dVAb+(T8P!Yr4jL#TCbGN6,jPVY"Gc5*-`a9&U+LZj+MC0BBI4pL
3!*@eN!!GISU'Kc2kB0k5(hd3kJe(&,PPr5MAJ"Mqp4-m&"Ea'E+r(UjbP5ib&+U
qC*jGFJLG%0$RQedZM!Z9Z&jKPjY"*H4bif*"r&`*Mp(Mf2SS+b3aEV&(0+mTh"h
CPAC,L)%dkbi'9YC&Vlp-M0N$*KXFN!"(pbQM%E9k!!k-UclBaGhjV9cEH)Sf&bp
X,J3IK#Y5YmNZ(@-AQ0BR#23E)9D#3D1()+,Rm#Lf%'B1+*YcE0+LKi!3(L#%G#f
BFY+*Mbm,q+$fE6`Y`l9[4qNaaGdJAm*A4[Ec3@l'UjpEm*VK'PjKlSpmbNMX@H$
!r[4!dfjZ`Bq'Rq`3+Ad#C3h%L`L%T,10NPJ#-F%!ZR&A(#q$8SUXS-6kql$&()&
4FB3*[09YRLfQiZ,NMEZjLX!`I!j$m(Zj63p)"8Q2F,9i0ir6*#S'TS9P9Y10$DD
P`5J1N!"[blN5iC-)RS'S3Q*5fFd56r'KAlIi@PfHKBFHE!NI"d14+dN-Q"6R(F+
8H+!QI*C%*%Df$FDJ)PE%ZPJM#)A4piAAm'h$[iAJr$!Ce1Mi)`*8McJdL!)&m5c
Dp5c-&$ppp-!Y2GdBJ3,V#"biUAZU(I@"!brSlQV(cB$Z2P#I-Kri(JQ,DIF,J3-
[l86Sk1XU[EbQGAL%kXK+Ck)Q3''r+"59rI8XP,ie-J)&-8*"H&#L#(c9+#b'`2k
Ip'!E'PEc&B(84[#@drcI-QKN[SkJ')%&HJRkLbZZ)fLYM[l4!4aa[@@&T9V-P"V
QT&iSD+cU'![R*E-2`-'@Z%"$#B'VZM&4K*mi*Z25*+8Z)fjbT!Hm3mb6k-Sk&M5
*iLILKmY)Fi%a[d*,9+hmE13A3%)*&hf6L`MTB%4#*d+rc8!9KiQI$l[,kXZZPBK
'KJqmm3K!$*56N!#L'[dbGZL(LX"3-m,&GL#dbh0%3+!013`i%"TAFJ12*lq*)0%
hJA)'-@*"pB[GK,BZSd)NGQ*K5k%)8B'`3hD$PM,)31Ka4QP#QNkE6FLikR88)Y"
[pK-d"Zj#iX,Slr01qh$8&9eH5@@Cd1!LiEYVYM&mVqkV0U"%6l#J+VRV"B&LU,2
DG"HAfS2UDUX`6lKhY(r&06rGXI[q"cV6$ADGDJ(l(+42eURqRMTljPaLhkQQ5E*
,V+ZZNVV0*VdVrRp!8M9bY9@U-V0&dlE&%[$`%VQa3pZfQ!$)P-)8&AKP2aiZfmp
e8b0#ke3+2f#Ummf84BKReA()qdV`&U@mC8H[ef(PZ0c!8HK9G%Zc)0LU5EKUlDU
akS@`V+ciQE&bK3[rq!9"Nc"N**,#8c54R0EDQ$(HN!#$%Yi8NXQRb%R6#-Lk)Na
R5Dr`)T8B,Y*Yj@j*j*5'c`XiLqF&mJQTB5DchNm(ee[59l%LFpDkkNYkXm[RrF&
Ee,8&DaS!*@P(RN!%KZDNhE&lUiPB!FqHkE)dd)l8jHTK9Z5X34VdTL5L5CX-,[b
[J,$JXe@$@Vk3!$AEI@RLkI!hjf8+AFrl%,MKTSGdEFejVEp[am6l2"f5@4h`KL&
$lb-ecVIDSllXh0D!D@F$aed0()qN(9,BMKfT6"Dji@"KANcKXQ"GQ5P"bIPN1$X
TK`DR5965Y(f3!!JHZV9PfXV2(0LHGMYYH%4D2AB'+4%@X#fdf3q!Q3cK&FYf8Z9
M#Q*eQ"4ZXfGKlS49`,R#VF*LUDP2`Lj-Kh(mmk48hS0rRk6RVk2BLFTea41cV@Y
jeD'-)cKC*9'G6*N*BjT%-F%P3[M9%8CR@mPC%0B9VrVceJIhVZrP+3L,1T`'R++
[jF+kR-Fk"&CJ!ER8V2"45,)hjBGjY6QA4+M,'Pm3DBmN1Tp&NB1kRd,k%3C8E&G
ja+kbeklbN9ePR9eP6pirF`YAcZ9hm0611YjFJJGbH$11dm`Hm6i)-mCD[U@CJPD
6l'K&30*D0,MS`5TkD,hjJqk0q-4a*hj"BH#'I3"2qTmTR16059q-*ea9-)$Em&'
#UJ-KV6C[X`QI%5b2(hefl6mGZXh-ED%q-&"K)(D(G`jepPje#-Yb!Dm8Mm2-S"2
kk2jPahNFSU3UKG6m8c%%cY6*"&e@%1h$D53KJ!92Jl&B3,JM#XcArm0d#SHPclh
XG9EhND!KG5dSUKr2rTRPi,20hc$ee(6@p,lp[FV22fMYV(Q*`MlIq,HR6frU@GZ
leE`0GI2XXrrAh'mqDflYk,R[fAGk&[hchEmqm1f((rMGiX@,rrBh26Zrr+Zc(4q
qf2)[RhrAh2jdipqD,cbparbpTa[0IEGU&Rhr`mmr0rqp1A$m[a`qDjljQpqF0Ir
[ApkkpQ8M!!!m$N&%3e)$!'NN%&8,E+F!d9bArl[2Hl0XGZ)Dec5%0,NXbhD*b@B
*NNNPD0c%Z+iCNkkT$H,)eY&G+dRF)jkFe+r(lLC4SeLDLV@@i6$L-$3+#8PJ,*-
kcQ)c)')j%Dc2T`ke)##LiJ3VU@MfrIc[[IZm86V-1GrR"aZNTbJRJL"i%YNPAYl
TGZ2&rp3X')"qH4H8UhKT--CKNLalX0pRE3+U9*S@L)[4[`[M8a@6!0Qf5IXR[C5
bL+G+Aa',a&15X8FfC#9YP4$'e*("jZ)@prcRBclVGp-ZI1JA$Hd"TfL"L#Cj-"K
5m11(---fk8fB`#4bQ%[#J!ic3mk6T2cjU[)e64(4Fl!)LZF&fd$)V+RMkQR[J(,
kdi*J3#4Mhh0hFcr%)iTi6Tc&&G%8LXCQ!95S4Uk'pI9rp%VA!a1SXj5YL6H[#%4
pTibqRk`+1@h4N!!'hCV%3paI2S[lprYpTr6eDlf@)ReN4V"U$4)(EHJfC(SUcAU
8+mI,[YFPYVX3KHLN(*e%p$S@RA4KH'MiA30)'P&9Q$"(Z"mE&YEFlCll9*T'1Hd
PaRk[*081dkV(p@[AVqAN%VfE&'0F*+1RY*KAE!r&D6NBER)F5E6J4#4e,RPS0""
Fm1hSjUTc1PHr%j-N!lA$M#D1F%00IY45P4qeMC,JLUE"DF#EBqf)H1Ce'*6cfa$
CM5aeab&V[ND-JcJ'K!1fHQ2F9CD[-Bid4BMKmY&eZJBFV"''D$qDKh%PEKe4!#U
@hd5RFGCT[@kRNN'6YcD-&IYj22FIa2EA4r0hX-J"V8LRV6J%`!4MA"3'"4fLE2!
Fa,4SHPC[&ZH[5Xh-U)XQ@j2I"N4QV`d$#58ED[)KP&Nq@*T'!d1N*R4$La#lrpr
*3QID'9K)!lAr$Q*BD4UfEh&K)'6Z&6)%,)r-k+NU-(U1FRlHfmYeTd5QB'5f*!D
)3)p-abBbaVEGX"JqmL[(Ri"4fiCr$@rK2QJY3paPUrYl@q")%cFDd$`9U%-cK@C
r3%5c!mhr#,5L1B$QmB!*c6LDD3&r%m#PlX$X4+-"b)#jBc%BC3V906P69INQhbQ
BirS!k*cL32NEqrdTflQ0RKP5C'!a%@6UEaM3L#r9d61XSriQ*eKZNVXj)N,8!*3
X(ZJde%&e3e"KrG6UKDLMRX5qjC@m2K"0fB`QR@A@Ll8KCFP,06-M(5AkrZBj)"B
mLYF!Mhm!B`$-6EEd`[4#)%+YKM'q4GckVBRZqBDY!19e[$A'"mHiHqUS',8%8lD
ehJ2hBTXdb+6VGART1EV!8,pBGf%b1f"aNff@QJbe0Y5TbBC$kY[(bql[5I(dY&$
dZ6ieLF4kPPLr9')p%JGBiX"5L30LR83Q'QjLa"*S5G@Tjd21"Sq`15CYlPA2fiF
)84mc6[%NJ%Xf'[8)ZN(q6J8Uqh)E4k!j%)JM+-qfHN0b`kL)Bfjherd18U3JRmc
IQ*le"-qKaV8B(m9a6R*XLT)B''BjNc%ZRVEXFQN1jYRbJ)"k`Np2#!B@arbELXA
S`@*NVhVaG1NZ9ird'DM3HiD$SKrE@4*GP6i$&6&",**0j#-`ecVLHCBCi(EVZHN
3EqIqp$5BfrpSj*lc"!iT-hj`"EEa6RTaL%!d!2iI32J[RXST$0XZlC+L,-%Tj[J
KhXCpS6LI"4X,9jA@&HM8`m93#fZm&4V3Gh9j*!%)bhVUM6!fMqTXIJZ6T-EA!HS
'&+BUHN)L9U486,`PlZ&Y!5H,1X49&UP3*&Y8T)jF1"Jk(!"G86`&"[Z2Clc@38F
"&1%3$p2bERGjJY!EDC'JpV8X-VJeEh4Fb9VkbLLZ'!ja(b8YBe0jHUq8*#**Xq,
U+%5EV46"Jbc#L!K&2jUBT5Va&4LZSSr6"aLR5T[eSL0#fUaKQiQK+MkMp2RF3la
46H)eU0EMG8XG`+YIEF8VA@f"3iDL%PKq&4%Ae20iPDV(m6+UPJmH!Mjd(DpHG3b
[J(S"VrhU+&ifG4#EZY8K[&+U'DmkY4'G4935ZBqb`cekY4R'kPQULhdqC"eeM6S
q-f'Z&MkU(%hc(kb*SkU9I643dmMjA$B`@XM&&ZT@'k8"b-X0!UP)@8HYhJp'f3"
MkLLLkZ3S&k+UeGiG0*9Z-0m!qD0lakKk!&hPq)dK&aUAr2YTB[i6QK9qlPkfBp5
Ib6T[#l8`YXGa[FTIC94fA1&qIa8q6rJIdZX*kApZe*mPX5aNFc!YS*kR)j%k8kr
,RAA)ad,G2D3q)(@R2S$22kP25GeecI,[Ifj8[34!UI&F49GCRLDm`Ti4%L!+`0A
pUSc-$ecK%('rkkTdVc,A80!ZCFNR5J!D@PbD6j!!9Gf2AecN[Q05mb!"*FAJ-F,
AaVBRi*63J0pG0K-+S1KR)i%3k2RZ'A!25Di$U!Fb2S&GARQ,"hME,#$M'd(ZQk4
ZD`ki&j&*91(ZLNp)q$f2N!"h$'9E$%Ll'!A+Ae&HG#`THRU+J@j9A&&CCrjEY-`
Lp`Y`NPJ81h9k-3q,TbjZiH&BI2)Vk+)F5l2PX9c&e%ThZHdF&MGMq`ZQ0ri1Ib(
P*N"-@iIY%)q%iVI'ZZ"%deE2##B+40H*(`eq62LKj2Z0A&Q)S,Xej!,SE%8f09!
fhG&,R`!UPHij$G`+iJ$LIiJV9lZk%JeFEm"K*2&6$c%$!p-l,L-6Kcpj#)Vrjbk
mV23MGqBXSFpr4fFa*)X!%6"ekS#)-"[`lc$J8DN$Q&rQC#R-XH"GjiXm#N+*!+3
qa11UJTF#`)SApi2XNL`cekXYH!f`V0l+XRS,XRU@H`)MT8i!hMTG"!F"cm63@!h
)bjfVGjHrb-1"T!!kMFfiQ-Z!3BS"JcT'f'EeH[Uq5r[dpHZ#8i2''dJ)Xq385dB
`Z)-b@bPH0HT61pJ&["V8"ljr9#eeraULE(EBq[UZ3SMmEAhhU8BFRGRpkbPQ#[M
9dU[eABR8k&B5"daCpmV89f`Jld$+TJ6#3%L!4TBA9686S3R%&1#4J4K)#H3ba`$
NKCam+LE"S,1U0#e86e&LA1b(X@I9&$0pTUaE*cSk$U2M6SL"JcI'G4UG*R5+V1Y
"eVfU9m1Q#8#[Gea54DB`Lc[HMU[i$,22-(dD0@*rcVi2dV&&DS4,LjmU%U-p1(a
NDTrYU"S1J930GDVB08[e)6,'2X-J"N6H(NaGK($YRA@*VAG06E#N6Q5GM($d6+9
l!T+Q&352%C(--I*S"j6BD5#4M-a40$0k+Yh68U0JfkXd[DehLE8EMUUGE*SLTYP
K+mSD0dR20Q'5G1KH(,UFJ5Xd!kHpb$kY"mN*kaRf+U'AhfENrPFaBD!qAJ3V*SB
%"H+iK#'"X14JM)l,9!5f00jS'EGS3&J8c$*Kd)YqLmX!#(2F&6+,66LZrS1l4-m
8mm&pUAlE#L'6HqS`RBQ"&KE83A`EdNJ"aY9'jNT6B96d2QS3i*M"XJj-1(1-bXf
Y'0bL35!Db,KqC%mr6"9c+11ZP$+D(qch&!3TN!!@XU"r@T1UcjC3"5!+cA,'3@B
0bBiL3)Z!UZrS8kZKQ"Fb8MD6%`rp-b*hXXJ,3L3E2&F[1BE2eA4N(*rIL&H-"6r
9rK18CIa(+F[i(k)!bjq*epIqUYBkre&Fk@4G0e,ArUZB2TJ%e6[qF8I#&p&4-!,
[S)234iP"pZ03ep&a'*-XB3iPJ[RSh,0A(k@ZHHA(GMfEG5dkZKE(GAeBlPTFUQX
4AHFXeE(#1KjMhGBlZUdIefe-lVCq5Gdb)0pX3dFK3V0Ef6'EMQFXZbiEcNSf`(Q
+(3485J6mB3!%[eMRZGT95)%i82lMS3kacTmP"-,'HYdYkL8'3-Kp&83HZ%,C4%*
&!dk!VQk'R#,3SBr6AL)5!0J[QMQ#VP883&Z2UJS3a9AA!-JDDY(miRM'LY9@EiS
6-5jUY(H)!EF'1J!@[i$j*8VQPe$p$Pa3ZbPBe`#eTZc&hFF8%TCb0dc+Um+fXbc
6l1L$DScPS&bEhDZ1CbcB"NFh+0H"H%-E2YHATNR"YaaNClPRb"Qdea$4-4EH35B
+8R@e83JB*PM`$JCQKDi6-L$D,QlaA`A!A83!h&m9UTG"am"h-@aM+`%823G#G43
(4biQ&I3K,5m`'i#JJJ`bdP&MQE-iM%ZK8Q%"e5JXS$l`F3ZSTIB&e&*K!I85!+e
Pr!*D,1Ke--"M0f1iVB4J39c0A$R)53PQ-QH6flBh90F3Z4CY8)jR,2`mC49VF9K
3--96T-Vfh8k+E(JG+E+0%+R$X-Np3je3p8jr)ECKd$6ij$F*S&i!N!#C"pGPT3R
)M(mK$1YA,dTLQTYk23ClQ!e[VaJ"iY#-L%)NAfI-iIi*HR9D%%FaJmJ+2a-!V#J
3l@(N)iB'G$i0JTXB!&C-*q%YV@eIkf`$@,-93A(3GjdN)XELGp!('A$aXaJ4li[
GjERmr-iS&RmIKe4JT4mS663&5@fUI9aA,8)$`Z$Dfm'XjSC)3e++q0H#3Fi8)kH
-(TXDNQ6SATihb#qP,38LZ,V+"B8G!'r#,qrkeATdmK5bZ3r''60e5eIREKRNb1"
2X3a%jTS1+$8Ej5#Fmmd)J%8deRdhl9S8(H3F,kYih0!Z"FLBf$jNQAeNL%eCb4`
ff*k6&R!K-qdl0NCAB!"639)q1K)b,&D8$lB(`R*RqaT@)'V0B,Z`&Ch4!Z8`$[F
&pPp!)"mkLkADG"H+IDH&BKqcN!$cBaI#e%-h$h-F5cTqq[%$!JfCa90N3$D[J"'
d&PZR``$D$l0NUpK2#68jlR3NQH3N+f1UQ4VZG2cd0l4*$'j)YT2*JT(qSM1-m'-
)V%p0UL-6*cUVB`ah-LH$9r!KKTVa)BVl%06AXUe[bP[I"%Y%C+81!+3BC5)!l+5
8V3J8,RLI6#'8(39`**RJb*5%`6M*6%Sr$A9m[f!3JFpP$J$V+#Nrmef-X-5!LC)
SDX(Lp$4GSaUC-4KiJpQ06#M)#Jk9!GN6JK1eX8Q29h@6J6Uipf%E*c-T#b,L%U+
k1KJ$8L"'lBBJ$3pC+%+&)K8Be3NHY)-%Yc!"CZK5VR%B-0Y`Y(!TV@feHPF6)M*
JM%[*1X[%JA`-k++,TBREJkX6-V*'S18#ISlMafLm+QHIBRPJ0r5qe8%fP@Bf&3X
,!2XCb$j++2IUS2(#Z%[QdL*MhEM)&Vf)VFjad9&prHUJk0%e!T-*UR&-(442qel
L'S0km#)ch$9,cF#F0eeFSff``N'BM&(,,NZKFf9)dk`*Q644"(pq&[aYd@LX`3'
r0A&Qe+!+aLKFMGJ[!d"VT!i1RJ`jQp'*NcVa1i,36Db6P8)RGB**D`SjqMDj[j[
@q@(bE(-l[0AKM!j30S99M)#V%`XZYU(j++)Rk106M,Gi+(iYm[A[NdEM%+Sa*)@
M$X'N"k3$!531G%VZkqh4PEp2RN9@eBP'0NVQYJbf5iP%jS*6X(ZkS03c`#kTpF0
d(FDq,2F`JDX,*+4!Y*&((R8NHC'dq3+%"T&9fS%l6m,C"!YfcH)80-iRG6h+'BS
mAr3`"Eh5lB@+ERClHiSSm-3`+ijR2%N"lUUBP4!*N!#,54)2A'M(XLH!-Uab,j+
#dJZNITdhc6ji1ZFY"%b[T[T[UUBAVrErqAra**,'(+TV2CN#Rf2++K$G+)NPe$V
mQ2(6#$)FN!#&9"TMLli994ELl'8bQR"*)h`b"'p!9Z+M"#SL$'QR+L6*p06GF%#
I2GC1P3cS%#991eXFj0+45LClH$1lS4KbpA(TQRKhrPd"rdfi%XkF61lh"hGH$P'
&%0EGP`B5a$`,!-Aj*!&maYU2A4B2IR!#'E*$22KF1UTMR-#8Q[A*$k'F)HS%6r*
1[HE$B1BYU+`GXU"!Z9(Y%"6im&q2reDSj28`MITjKj%D%638+F,eDi!c!-M(mQ!
ZlEL8CQaf(B9"jbLR4LYqR2MTJ+#M%blfIr[ab@L%)4cMSJd"XqpiaRfE'mEqip6
1RdQ6T#NLm+R'&'2#"-9f,"P'95)JeYa(!)H(TjKT'9j(pNlA8C8fMlQZrZp[DV(
+Kfj%6P@l9(YRr5!jr$PKKSY4*lLH`Sq2-IY2PrZdZU#3!aGGL,TGi+U2VY+91br
r,&2V5LX&(PUE8l6C&JP&FD5[AP0Q6JCkpAQURaQDpS0`00DU#4H)H*l`@VhIK"'
NPGr8A)N5)4PMKSMPA20A-)"%j5aYU$)j2Rj`6%D5hZFf$`cdU-*#`Jpm`)+0ELe
3,ChSf'`E68p$GVJ`G)MIJ-Tj)h@)RdAL$5brRjEfVk*2rGZ5Z3M)qb)Fc[ik$k+
+B#lD6bjLP'8&Fj&rhJ8+d-*!J6BbKI8'1@8!T-8[-'99AH2)D"DSL`GC9XYK@Hd
5*p0[+E,3IXT#lj9-(XX3$SU1@mkXMC4KSEiH[+Va*Q"+[)(U1+D,#bEd@0-TLp%
2MQ%LUS!d8a*BBY"1#*RmGI`Hk,d`)"NlaIldIIEX)aP-N!#PqNXTZP0I[f%@0l(
P4#M,Bl*"a5Fh8K"'Q8U$8-V-,%Md!Fdhil14IDCB!1QM!2)fS4XbP4[Nkj,4*GB
r*K&R6M$&YCD,Vd9hq'PNjYU$)6*PGe#fJ*!!6YRaYX&RkC-b4Sa69Bb#B09'%P1
4+VINMM)3[9qj3)DEe(2RC&$@3D#-#DdT)#1A5REFUSR39ed9ER0cDCS%l'@%EeK
'q'"@JTJCSR[$(U$blpS4T[RR"B5TD6Y$*()!A+hikIdQ13*F3(I)U0DXqHFT8!&
k@Ff'!H5+)935BQA#KZZkL&A&4JQadKC2@KmcD5J32V"J`MXa565PZD@4"8aN#)h
i#09j,Hc26rJ6V2V+9bhFqURShab8a$QI"@pa@3694GF0*rYr(cI)JH)`!N8$1Uk
(d+RPKkZZF&YaJ%6dA(hB%3#q6p1ieBiUJL6@Iaq*,i-j!k(iKf$d2h*9EikQSZ,
BX6Y&%9@Y9MeI&LjN)[HpHSfA'(e&('ZUdNUmS&GCdU!iG[A29ET*2U(#)J,096d
p#S)8$TKP1SP+S2bBNP'8k8p&'Mb51`F&QlIDa@31K)'fFb(r`d9L%X0AC`3cYiY
*-X&f`1%MB%Ze#9I)r518&-6aikm%4'aYXhG1i$XN"mqh%$ccU6BP9-m8V'%35fI
ZEjM6adYfSld1DM#raJ*MLJ&'XSS2LrC(S3ME65dY$E80%Y+b#)&Sbf5!+R3bMm!
Nc2&4(-*%VD9%HDNhIlM+U-(P+)NkSFTYCP8cS5![H6Z-cP!K3diYmRjI)Qmb4jK
+G-L!Z5j"*5IR0)dC#raUr5r[SQ!GKllQN8*bYb3Rjj[UmBa(h`(a)9LRj+aQ+,4
l!+5liIk4XAe[q%#iX$30`F)JSFki[&i`h)cmD#)FDSdYiedGQK%Jd"CRd!!(9+"
'%mAi)q3mY&#-2dQ0BA)N!Q)d$+HM2QcBK!")8P-J6QQ(BVVp6!YPRD3Y%P"X83$
bBV'@e"1UL[#AZ5PVD4T&#-F1!Rj90,%0U-$`Pc8afQ$5fR!6AE@Lqj+'@P4VJ&2
%JphN,Jd5Q-BU@-jRe9d9FRQ4"l+119k6krTfk5+F)$k%`VFCS'Bc((-`,,jS"%i
XlJ5FR8DrEh&[Z%QUj&bj!kU#-)qCV6B!5)RN+2)K@-k%eNGZUL1-fFIUi&!k9qc
@'%BjM+F$8JC(94BFKQ@hTCFf08BCb0b'KHFb%$FANi3$#*L@1F*pTe!pF4lVE-J
f%2!CB2)R)(XQ++ULc3*$DmkZ+@ERI1l&6p$5Pp-,T*qkPMF@",-QiVK,$Afa1)N
#YNfP!aF2q0*CeKS96i9Y)KNh"aN3*Y@K&5*3)K'Iip)0V8Y*X9Zq"0-)90Ji'4@
h&G1Ki3-"qVB4Z*4Nr,@LUl+LFM*)&XBMc@&1K-U#k'aN)P3*h-kTQLd3r'`DGPE
(#'IJL[X[%iPZh34`1L!6k3e56c@Dd`KDC$*0kRrN,5)edYJjRP!TQMDa5d&$EbV
1()!p6aE@F8DLjpaEB#6)$M8cjbBF,+SS3ZhF1KGAXiP!L3`0[F5%V@HA3*CV$,d
L8lE#TkDBQh"B0)&M1I5UjJH$G!"eDN%`Nk(d$'Rb"P)X!&,C*aR5E56iYq`5PCk
6"b(fGl8Fl,AdX82XXj0(eJYb"N!'@EHN$'#$!&21)1Xq*`%Q4HKXU'[&e%lr2$4
Q),@,)A"YP5%c)hh603*2-(JmL-TGP'd#V6J-0f2EG(I`NbYYU%)&emR9a#`B+SS
#(H-[fNEC4Fk,M4E'dRk@lHB5maTUGE,GCM+IX'bh5HS%fDkmVMd%F8bJQa'&X($
#XI"CZ,r1Bb4a!jG,MQHX[9dL#5M6%NRDb1a06TJJbJZ-N!#6M*!!HeK99VSDSq1
RJe`lGGaP%cY!'jQ+MIi4)RaQ'&ll16&C)ZkeZAELA[Xf%IHf1N08&lf!kb"cl,R
*%5$28Yq@Jq31QVEVei3Xr(A1%$2Z3H!F4C)rG94p'q3%NBd*aMkHXjmPm)f)V+-
,I!Ye"'@c"Hic`HHXkY[5F3ke5ee`ldheLJTh((+[b8f4%5-V9FH0aK1#1F9K%[+
-4e`f0Jj*"U&Z3RQ`i5MVTP!DBX"!&f#%bB'Kk(%B-Xc,MC+)&'Jm912XD9f9bep
B(E6e"T3CXf$fI"P0%8YGNSI6!p6kNLd#P,LC6@8ZXQip!VbNL)8Q[3Qdq@eLRdR
(qDpc5(+,dP9F-9`AZZeY51DqcK!dqC-3D$)Bf"9BU+1&G[@9d)J@K`*l1ZhL#B#
&S+!N$E@$a8FSLl,,Sk(BmbdaUlh3KBqje$rTG8c6#6*!F$lc$!8ApjI6X6"!l9#
Zl#k0lYN#8HK1kpChQTCRU@Q43AX5UL)mqmP4lR,2!VJXVcR+Hph$3%aQkjqHBY5
HGM1EYPbSJ0Bd-1N1F[BN8bl3%8GL3mf%kTN[-[*f)N%k`%NGG03`+-`XNd`&F&4
9D)T'QZL[Y!HP-k$N&11e#$("T1A@bFb84!KVE+2)F#3Zl%l9$,m6UaQHFXJbr-i
K#*''TdM)$X"*"QqdM9i#m4cU3f,[m"388e)er-la$%fThJr&2iQ%5L38N!$lKd-
mXCJkN!!h'U5+'k3mV*`-0'3Kh&Y*S$IId98p!4rk`CBQE*Q,UL!!M&5j!eQJJ`e
5Y!%`B"K9`mm1cm"VeR$')A3fr#aHLiGRkHh1N!"8NBp%k[hTZjc1[hTh[a-J[TP
FY3Z#6)bJj,qlFl&HMGeY0pi58qa$ARBBkJPBT0NSeJ`rQhm'VeRjXlKNcNE#XV2
-F-[BSb&MF)I$F,Z4G8D)*"A63-V0!$1JUP+8[ejZ[)r'4ZR$3fDlM46S`#80eDA
eN5RQDh#UNcZKLU#LI3(CGG!T*pmNjhT*'@)4PI)#!Cd&$SqJ8Zmj,)+Z@S`Y'UV
'rC@"#mJ2'4NQ%[V6"m*LMU0`SY6XA+FcL*JQHLP0ej@4R1a!'VY*4-2*B3fU)T`
$9&&p[T18K0"aNF#kM@eSCDi6D)Lf,QrB5J"HZMM&E"f*`M@fa%T'GK#M"Jk+53,
Vhcq5XK,`1h3U(pFQYHXkEC*M)MNT`Q@f&9[R#3N3)VE#`%Q(*#@C,T(6EU[f-3-
-Rk!PIBA84'!`F,c-A5*DhVS51[FQ,128[1FA,qk#@S$Qj)cYfDJ'JDDQ-DH*1c%
SM9feP)LD98Kb$)qjZhG59)-'#k8Ek(#mT@R(NQ`lST!![4dAh&j#`iKJS6#BaX!
8rE986Qc&irXQ"UNLaf-r"HS"aaSajbmpNN%(B#K22'$CBiKDHX-j+hTiX`3mFCL
MJE-hq3JrX-MYpH9!XBfQ5,&Y('SKTcBF8Z23kjHERjbC&f64VrfK-*JJ3`fU,$3
f0aF(8hQPVeM1PIEUUDJ8cFlTC,J9Ff"`)D@rD`4!5$BTk9DJp3U"K@LT55G'eX"
F!X(i0G%5dp!d(--EbM64ap8K3T@05IBa3Kr))&A$dbKMC5qN#Cc'"!MC5eNFNrM
+-BQ[G#EaPGBN[U**a2*+pcNQ85p2`L*2`N6S3(SDkcL5iZ*ATVL8#G#&mSeJFbQ
U-(`e&YpFD)q1U8Ki5NT`M9T(TD4["+hAT8KlN4H)I!",Gl1PScYIeA@QEkJPKe3
J1UDVh($4"b2XL[*BDB`I85dZk`6lCil@jhQYce+YcqYDRjHd2XrUI+CI0+Mb!@L
ULPeIDhK+!#AP),fi)*``VdbpK%+ZAS)#qa*)hp-Gp1i0HbDFc![L@$IIhU-NeKj
pCZ64K0JfmYU@h&ME2IX+Jq[J1)50*m24#8AB5!Hrq2CF(P85@llibIRY#9'jkR`
i0kaF0Y'"a5jZ(4C0Z&!%*jTLGL(ZrK!AiNV#*qVrXLdK4UiX@jaE(EQmmXR+IF(
Yqd3&fiZaI5rEER)2BlY*5AckhhFX@Td326H6'h2V2*GERbcE(G`'3A4h-'cb*X)
4qB,'hB8,'LAaZb[,[PbA%+00VcfHQiVHmmVHi1U6@P-m`ChZlGMX9")(pVaIYr9
6dA6BZ5MAE-,3[h`jq'L4f-BQfLC2Y0Qp"GZEP85ZSAX&QqJb0Y'9mN5rF%ad$l[
3iIiF&cU8a2,Z(kTXSNNfd9DGLHja6&4dHl&G9"*r#NjH4a0P,2F`PZmPPV0T4ZA
Y2[GkE2FTL9Gklrq5$SJa[8eL1KbbjQkP5N0!rGQ%dC!!Q4pcVm2&Q**`Zar)Ce0
HaUDmNNfC,V8apVG0`!Hl8ZhHK#[95Q,ATEA6D0VX!"6j!2E3!F!N04F()%hEi#l
("B15H+KRCAL*"l$(F3"(h01aq3KB02Rr[('E2'3f&63FNbP"eIN58LZk85%*"i+
QI#4$lSRSB%K*22Zc[TFC'jBa0JK(XJJAF5KQcSi&hE"VBqieZ$DQ*%jr(RpV#3G
M!J-8D6ZUALe@%R-kRl["MZ4e1T*lT504f1%9XdeEP)4hp,24fq5"A[d'Qd,*jDG
T)1,&$F-b8FITq("KNj*)REhq,AB!!q`!kYN"&,+$MNm)LQhHiQ!#TU205[#q'9r
-fKi%idf-m8kCmA('bMLa%PeZ9a+V'c6raKMq1M(mASRK%JPlk(#`ECf5m2Fk$fl
i9)bc3FDP)B,*mpG5m4`44X"!`H4ZebL*GFmrRQ#X(@#XVCHRY)J%GHcSjf-34@a
lPj*il,BR*M+@QKK,RBbPKB68b406k!UEfRSPq0BIIN'+M6CMiiaNic*V*bU*Rrp
AfqVEj-*$C0E1P`E1J)X1Z-#&B58apipr[iHQb&JEPeQl6mT#1Uce+X&cejd,PX"
DNj`a*5C-9a)c(lN[mTq`pN-P-IqH[bfK)f@$0$N1rqFb@i@MqPa*K)ljYa*6V`b
!6F48L8dH"j1+f"$,PH"2krThE`Z+N4%6@%3-I8%#"rq0VIN*kH$GmhlJBS#aJ`$
MI6r&*)V&b&m&``VEiP85Hrl2R!3lp"hXd'YPj[f6D2Ta-"aPfd#59IrMcf(+i"6
JQ4AV!GF"aVLfX1QcB$M#YZ%iPMmjC',-H*UBFINE6li)GZ`42Im#pV*0b$$260[
B5f3`dN($[Nm10(i5$,Ha,5#88irqcjQ-@6XBXfSG'5@1JA[B0M"UcSp2'BP40+6
U0QZhUjXa5JR(2a-'$T+HpLr6pB`"6l1!i4Y#`1"J%Si`pXq(hfI$lU"KhbF$Sam
,60UX*$BqrqejM'af-,+T&B+!R`L6"fQYZFG`8Q"4@,&HG&eN`rj#M2q,-'b!JQM
Kpb-X%cc0-X%hj119KLfaB,f5f,UQk`F-U"#622IY'hH`j8VLmErmkNQ@pAD`V&G
V$diGKiX-fMlP5JN0R"eEI0ba58`#F3krF(iR!pj2-e,rKTh8JbIP3B%*Fem+pc)
fY4#E&MJ)29JN-`'(dPIRrL8lZPCfG%NCJ#aF5p9G3HT"0'4QJ&aHR2hQVpNN9V*
*,(1!Mi85ZHG4PGf&Re'9hHe+F2iENhj!j(kPPV&ZK`0m,%6(HqfXfIR!8cpRc'X
KjLe`!)jJXF`B(0C[61[2h%D$SJ+F@KRB@#J09`!EB41@Ml,&ed&FFXrFrlr"#`*
Bb3KJQ4eX"2IB5IYNmEpYB)bXCBcFX34')X-GbcfFpKdCLB2,VRjmmhK'#Z##-FE
$KVC&#IkYfZGm&)$VbNS',TEC`B@$+5$air'9cl0-9mY!a3iC91Lb"4R[rS1(meK
QDD(-XN!#&JSE[J-3r2HYLJq)T*TD-I`iK[BLQd"8C`)JUEUeYrqB@-%BTXJ-+f)
NX%FQ!*!!qEelErXYXB)GD93qdMerqHeIcq64hmrNmE8cZDRrpjS5AE@)L3HjIKN
CkVFN*J30(NXI9'A[@iNSel4FAHC0["8m`L@cV)cLhMl#Ek+HMD4d#Dk[609BGLE
ib+iRGjeE-*cpadq056(bC#(lm)SV0K9HAABNDTf3!2+Rjeh2'dl3)Mj$0ApbGh(
3PiF"e0jH0#&BVBB0(Ac6,TrR8Yj`80k3!2M$lT0R`Tlc'*jChR!jZDE)[X(UFVP
S5cUfa#i+A9KdZY!hrf(@b9IeekiZZr`dVLE#+qlEP9GHc5F%IBQVbhbH(!`TE!e
rRFQ&K$rX+MU$lI9X1dV"&4))%&'5cd26#(qphT'%4@B@RFNj#3@[ek'3!'QUH2B
k(9@1'@!NPCDh5-BB9C&0#rMJKEUZ8l)5rjUX+U%+P4Ld4l"+9$hf#&5Md[P-6,C
r[+H,+q@,2H1()+kd+f!DVlM5VU,4Tk$)iH-eHr4lZL![U3RD$4lY'P,LqN!dU4@
(eE$RF[ZQQ42fQ$f2r1EP4!`9HfkUi5LL6YC&(rRTlX39,NDf&#)$GP!'&&r,,pC
ImaCIA($AiC6"a2AA`Y(0ZbB%,bjipr$HmJiHMVSZ@Lp5a"Gba19QG)D)If)4X8M
iYFq+UB2eL0$YB0@i$LE+%G,epkAVEHC)AI3R*bhG"X9qq'kM'(Qi-"bjh%iJ*r8
T&3!6EQ-I#BLhlBk0TSCD5A`qR-fF9),LUIceqjA8eTqXhcN[GEH1'HeMYSErSVh
925)8dFLUD'Dj4f"%mGCF8Gmm&h+Ae&cCpH)[lQ('38Ci6e3iJ8l$ZIalA-9V([I
Mp36hi$8I&Bkbh-Yj"+pXVZ$PjQe0j*bH0*TMU0a[K(--UY,p+,r$pES1S)KR4P(
YIj0Nj&ZZ0-%SB&X4Z!01Rk[Ni8"JSe1X)iaZ'J*(c,$)$%`QjY3,!dr&2PBYYMk
8E+ILU'p"*$BEjS@"&)FM3jb+$B#Mc@%iJrJPNS)!H*im$$0%@DM!6!NU4h'%mLB
hZ@Vb$hLJBfJkpf-j[lc8CEB%6,&Ba!#MlhaE6GQU8#X95XXef%M1Yr-0Bj&PXdj
!1'ef,"32'#$+R"pUBFAAJV%N+(@&i!KH1qY1*S`UYp9m'B$,@Hj"0"!a5HIkki&
'GYdRA'mBdrrjcMY*K)3Z"UJ,5TKCKBXRA&)(4Td1QN)DRFrc%%PPf+F0BpB,H[j
m1'8P*hPbNfSBbcPAQS1T9-aF,X+"a&f"68("J5V9VPfYJ!dYAA)I4U%[*95dV2C
!$Ad3H+d3KQT2[(0RjNjbdX05FmC04#-Hl&[`CF$#+LZmh[GPJ"b$)H$CV614pQ-
hfH)f$(b4pT,SFK'kG-kkNjbL6C8d82HLc1D2BAmM%G6-LFBk!$U`MhA[hYpU`BF
8G4'$@9N*NSIK@YT-5`FkG)jp(M2f9Ndl1[1Rl"9c@9`j-N&'A3hm&SLC$)kABE!
qRcf("&$Cmh-[Na%epdk)&RNV&S+$$SR%2B*CH(rBJLMQJXm4*2+9drRIF6Q#0KB
%Eca+l+&Z*$HAE!`NHijp),R2dkX"J`CYc6686-ZdHR1#ee#Sa,3XZ,DKQIX'KXj
cLkPi9c6f`9eNG%-90Sl!0H3'kf3+2Yl+KD!43lk6&Ael'88X3(c0R$8@jej'eAd
IZ3Q`S%T(e$Ec&5*(PNNZN!!J@Sf6d02YRRR&GcH%2AG58Fd#!i9X3j%iTRPNqXB
4eE-M'Q2Afl5[1bkAb+,6K60r+NALJ%XDDUCC@H6,D2C6*B1C[j@Ub`YZZ$UIrX!
f0N`$)j&j$N)Di@kj%Md*$lCJ3#YS3%`F@qQqekJKdQ"")9A[ih#"6-iXSL+kClD
cBUh[e&f%a&'#i6TlVL!'DUdTZdXL"Y50U#T(FBqD'(2&XPF$b31iQ8U*YTMk4XL
&$Gq9"If$dK88IYa%696l'ZPEP$dA4[fXl,N8C6fKcSDVlQlTm24U1S%Z#bACZ`P
d`'R)"'G5&)#-,"kmP#C[KlM@Rf+116MBJ%Dd`F@*#e-eGN0d0YXkmV5'#)F+XV5
4L-`*9mFSNPkfGk)q,%5L-`d4XL58F(1UdXqZPcdB&SBVGIHpXmcC-L905je05m1
TfSbX%Kqhp3J+)E02YCJ%DS'*lidaQkib0d`04De%CPAI'+&#DZSB-e5*'BKSF6#
r@BIj*S'T4LVCrcfcP+pjVbbGrml(XC6hr'FXYC-5&IHdDE%dD6iL-D@"h!kNkN"
8U&$'Np8X#'d0GE,1X"Q9%QIV&6`N3*Fe'XHd90eTDE3+GY%T)%A8,L!&"EbdS0!
+me15'rH!d5H,m##5UCJ-dR3+%GH`&F1D6'L%[G$FcU'a-G-f3lFBIli6KG*dN!#
)ZQ%XrFkGPdPX1h05UMh9Mdc8jdY[8Jmb4+X+V0)[)c%R1H15+pH@S$'UD6RY*G0
A#kT'5XkpF*6bMGp5"lA(Hh)bEad@YX'02b+lq5llZ![VG#r%0C'l189*`mRNlXZ
(q[-EaAk3!24&6''3!*Vq2$4[IA5&eqCI1%5&a,[c4eR#'56d8Y0c'jT@DNDFD2C
MmprRTp2Q@RHqK5AiN!"`RTV+6M5[8l2Y@662BR0prJhD[-+G[jmPc%$##@V'ldF
cNjV*)66eE"#Aj8%dX33V%Qj5XhBAQSHTD9U&CKlE[&IHA$Lqd+)B8f'Ldke9PAI
!cDqQI!Y%k(U!f(FPG`pA98'cdH+V+YpL+cjQ5d8*TA$,+)AEIFK@%$[89e#0E8F
qUXVI9b#kbJUSf*5DmSR@UJ)5i(e)(4&T4a6E+*c6P6rqI(*4eSaV03A0@,L#)N0
8N!$32UdLKf6NQ)UZ3m%RT%`i4CHS#6YKRPQCRdJPU$$cF$@()5)-88aqiYXA)IC
Ek9[a$d%Ie)[m[$"8C6KpjS@5$qrQH83*4[r$Ze&0*DU&K-[9M@4&cVb8D(*!8Sk
A,)iN&VBeQq8LpQlbbcae)1F9mB!V0kVJ"p@3!-1R`JP4Y36IT#*5e"aUa%Ae2$9
-SPT+$BfSAUH'8e3[8D0C4+'lD(6!A9p-6jJ5"(+U2U61UPF#%"`Tj9ele`6pHB4
iK$qVjYrH@mdY*c-JK+D+$k@l,-+P,[%!95hYrhhcC[Z!Pp&JQA!0!pIiUU2q@(9
8J50eSG&XbC1kVB1b[HkN[jJqUJhpr+f6q-%bU,biP`UL*FAmXpG3!A)2A(aA[H5
+qPrUM5S`5#`8&J)Cj!RJJ)(N%r`kHi6&@EL))T&p@'c860+'3bHiX5#2Q0a3JkX
CI)c!2G`2h-EUQUU#2(S3"a*MDMeY4i-F25BI'Lh)5kHL,Yc8*%1hSf!H$cd8a3K
&i(i[d2@GU2lS"M"qKjDIPKj5CT49cXQ%`c&e4mAY--%pUcbiZUabRVb0#VS!m2N
Y2TJcNSH45Ndj(P(blJAQ-UCK3qbfGb5iJ9"42YKfSUXS2Be9q9Z-DSP5YkfXZ"m
*b01QAPSJ2FhqS!+lfdN6(+$8mlT6TQ+)J(6""GAG)V%)aArXYaGI&"-+-"+T%#6
YUkaJRbQV4eP`R@%UCT8`U3-IR1F(+6JFj3'rT@rTU`$iZh@cTm45S0XSj41(&FC
M0mJp0Ni2L+"#cJVfd1[,RE4&Um,IL0U2B,#A1GXV61P6Q0+A3S469R*DU&JUf9"
LTJGb5'Jm!ZrkIbK4FAJq#`+hkGT&IFQ2V5JV+0bC`T!!BVDDmXU3!%D+[PV6P3#
"&"T08X5P)(d+Mr0Sm-#0DH`*FYhB)VRjj4TEf`1pB%%a(K&b8db(k-X24IX%9k!
`QYP$0V+P)V3b1kN5HL1j*%S4pA$(9YaEDR$C[E&*4F"$D$G!kS1[PUEC$jJaN!"
)jcbFG1)X-r363Q%Ja8"bRd*44[4T2')J`SpEUli-J)`UU$%1E8FJcdp5)#maRDl
*L1Xk`GQ!UMbR**Il!9C4X'8TNQf9R,50RDa+C205'eUN$3bjJA,ji(jA6F(,)+Q
bLKQ%qU#B943R3P@r#@(*AJG31345"C!!aJmKMD@%cNBZ%4(H[jHU,)E5U5JZA8+
c"G26K-)BAKmYH&P!j3,[VA0UjZ'("9k"IUT1Lb`,&CNUXc@-hEMj-a(*'N-l+e6
c*JYihP2Ad@FCdr#S+fb!kkeeK&$&NKjD#!KXTl!8R-hm11i8,LEPCC`jDDa+CZC
(SjAV$ahelbr)aFYBm%a$dK9L53pGie)eHkRK+C)E*q@%6$6ZSNV6$A#,D2"3THK
SThk8ST!!N6Y$bU'MRX-&ca"*`B'f&ZS8-S$Tf8YTM!dQ9P843kUi!dD1QXSZUNM
M2b%8840UC"HVi3Dq0&'"Q49l-CQMe"8FfK5*`"SL0(NUFZr"+iaB8+Q@GB-#4b8
'XD@Aa*DSa*Ejf4*Ee1X5@e3,X88p6Q`KFQ1*6dN-8"q3!"Q5*cH+jB6VH-3@!h[
),2pPCil(MbSJZXbj@I!-$9@RmQj51%#i2QUaV9B20$QLFl4,C*pkr[q'IBaYa#$
ZlfGJS%8HHPR&1i4#%i1H`-1+S-jT+([GId)#KC*6+!U$H4B&#ma#&BpKFUB8h#K
CN3TQ+#Lc#@N3#LMa3j&f6lI9&2`8NcQ#aQp#CMKleV&+'Y0#B9Y0j4p$iEJCr8m
2YILcXYd3L'6PEiBSKPl6M)S8D@GHk!JbE50qc*L)Q@Am-*T(BU5qIiLIcc%G%dh
R`4Lj4MpiLe9pLS3kj@+p@YP3,mK$c4''@R08EA9[ak[&[CQ@UqEITD$"-af&[0'
$Y&#XaP@S"Zb"@[J)i'0cHKUa3A$FC!X-ST!!djV+0D%kQR6!pdP[pZDD[Zb(NE8
ICd"V%T!!Lc2i4#F$8bMi0YBlf$p,UXi4DN9AE5KFS&iJB&c%il$N)JGZ`S$9)lZ
#pa#!SU*%HR,KT-`Pa'$9H3Na#+6$l06$$&khF'3AQ-NQKS@H359(-a@kcDVURh,
ISJmi$9QC`hQ28*dINb[&j',kf"3MfriQ+p*Y%#TQc5pq&+V()+$B2@M"6b%jG+m
cD#2f(5++"1i!m!r6`ciB%5d-a6p#8GL9lm2)99Aj2P$f(PG0j50kNaF1jLJ-8YS
)44"Cf[A4ZI`@Ha3UZCa$Y%&5RG8h5'QbdS0C)PD[8$JAMLb1KJ9SeYX)eN3J#+K
8$i8,&G*EUFUZ`aM3lQ%EiP*")#J3N48iBNfr&X%"j3S"$eKa"Uad'[ZAlSifYFG
J9MLKr[$Ieah,XR&E,e2*MdTU,L2Zb)eEMZUm9K4VD8,*e[J"bcS,HT!!qGI6Jk8
!E*B"hG6mYU`J&`&cTaLRTV&9hQD2)S@Q"5L68"&m'cP6MmP&mq*BkL'SSkGqY2p
M&%kXlDaL3C*)P$8Mee!N`l*A'5N0`!6m+P`8YePHX@q$F4k'@N4X)k5!'3HfMA4
1(Q@L1cLAZMFA)$!p&[dq(Vh#NMH$Q$E$*'RQ+Xb8FU3P50%Eb-AdP03*#Y55MIk
HapMMXkSTHS1C2CK2'*LI$5b*aicSQ9&a-`e*$f"JGjaHlK)%NTJd+4Vei`2le#J
U)`'&),GAQ(Xb"F-+f',QlGQC91`NUP1J+38Z%4XbELBK(K6-b`#DUpYL!"d%1*E
E"##iI,%Z!&`q9aH-!Zf)%rKE2LIJH06@mRX*0!C3I@Ij[H-fQf6%'RP!jm*'2(T
,"Q2,C`Z,dI!DfSK"f32-3*--*5@3!!m%iQ8!%k@KM6D"BAT-SA@`r5+QMHSmcq*
"1E03m*i@3+GJi(IVQ,V-SqNA-DRa`0f'iBB80R5&9C+FKUL0)5Ffcei+["l3FA#
RVJp,AA[Q1!T5#ESUXk@+&eRC*jB%f2lTX!cBFQcB'MU1#`1IG'Hh%Q$,jM*JDa4
aR3#E0,RX!BUS5Fm@#EKPRj!!J&ZfVqC!YJ&EZ!6FF190HL$Eh#hbX)`JM(mH3K!
rA[P*FDCFr)C)JLTNH`D0*N("`fG-5lPlA&Hj@riabYebKh*RpM"ADMEC(pqJU4+
VjZC)Jr+[(iF3*bAPlFH&5e$`R!e*ZhVhii#NhSeAUP+F%GZ)eZCEe"Q'k`)5-UU
0L0Tk#AbaBN9(U6!rZmTR&P3qmm&HN!$ACDP)C3C+),*`kd&k9)4+jQjN0mTb&#6
$$&TKfL-A`V12#[X&!)J)L$FCbKfN#B*e$hpb"D"2Lc`I[#@a4LdJ`M9$$5)b3h(
cffZbPYZNB$`P"q-c(-&il3[fB,afNK5-,j'm33)KK@HKD)[T(drB5fF#A6+[Q#`
2%BA9!"RSA[j-cB(Pca*T)Z-qJi*U4kHBUAS)'%iSiJY!QFX+cS61%T+!"hBq2X4
4E(18ZD)2hBTqkjc$%5"qV$kpMi)qZDTiKEfUBQBp3(28RL4h&S-jj!b404AF96!
ee)VK(-G`dV&K+JC`(*X'S'VJB9PD*SP-L@c&QXTj+&3[Nij@1P+BdPr32@b3!"F
U,rQcY!rpAl0e$Mh'd%dqIlYZ)6bbFKHA6@#bJ*D3!-ef9)iA4'!SfTL+balcE''
2Xqa21h!0(r5)eG!4%[*3"N)@,UZikE-bB8r0Y&j*L%-L&KJ8T%XHZR)T,E"HTpL
H%US-$R+IK*r*3%[ZJ""Ujk'UmMAP`qcP4G!Dcpq(i23G-N5kUXUfBpYj9eRCA&G
CCCCZ`"`Dq&E`!5V5m2KhkA8H+25%&&!!R8!q#P#hlBTDja%MchHL#N@F#Q9rq#5
UH[-IP@4Z6&@9Gp@0dFF9-Yc[MN8bLSljBakB4VXESX,"8(@,U1AFJXVZp0hTZpQ
M562Z1@`B3-A21GG34AUKb!M[aY4L'j!!!)CQ2a,Ud-0p%T9&DJTkV0kZBU0IM$D
`3Z+fc%j2)d-TL33ET#*3-Y'KQ4P2-b*$K!,BLZK)81`0Q2206h[9djqL!%-mQ!9
9dL!$KlL9K0,cb$$lSj+UZ$3&Slr1)h85R8X6U)id4"a6U#R[JUVdmY56dL9DT#S
HNbr5K20IPNc#CH[08CfTej5[TmI66Le'J9(lE#ITiM(1*`V-B%bBGkfQmMbQd#*
P2ck,XF((f0!*0TadX!'&NBN+#f!`R-Ifk6"#N5+M0fc&a1"MqmmY+&Z[Zd3CJ-Q
L$pN5eR%,D,1jM5f!B6p@63[N[m`@D*-LShl+&-`GJ@G2N!$BjAPIQVjR'URqr"P
N8B#(qlZSmLkILS`m55FS)(00eIGkm$1#Rb"q#SqAcBX2YZ2D*1D1-4k3!*qP,Qa
p8*bX)0ilZNHK!YrKF,3)"V6-CdcSNPb#FVRAEZl"id(,5R)r3YDTl0+TAVq3!&3
!3X!!F(+cQ2%6K4d#j8r&4@5+VN*D%%3[I4C4SH38!5"DiUY%X5+9p)K"&TaPL6A
6dU%`PQ6ZVkQDPZkHVfddP5V38[&PS4C(eEqYU&D%)(e"Upj0ULarH*`CpRBbe3+
NP@`i3flIY0!aKA9ISY9p#98fUPJc*!5YFGT1!5S0NMlSFBmdVETadk,LN!#QRM4
'UI&,X)#FRcEm(%C[6EJ34@CG)*H!V'C(*FUY+2`*aS2&!4JQh-C'4P)Q9ZNH'AT
6"Bl33q,TTB0P8ZFPe$IUH!`X*M#F[k$FLdV'9H9HN!$D'M5'J4JHC5L8L4Rqb!!
mE#NV(kD#bZb2lj!!#YIA0GI0B!G)Nc"HFY(Vr"+2)5NaLJShNSZPQVZNiGl[T@Y
$Z#BM88dSMRNq(KFehiim68[2HTYP*bHb8e%J+RU-F6P,&D@ikd9ZqLr8e%3a109
i(,Eil6lZ!`Mbbae%IiNA#LADcPJfGmNX5pHU'SH#-M)fAQ$L*iH)88F!&B9E8[J
3f&)C`-Y8H43"`&8%#jV+X`6BX%6j)-b*4(!ERmh4-E*+eGIXB%-Z@"m2MGKi')q
0[PZhDKi9dI8GKp#BXU@rN[k+B39e09M(05KN"`r`4ZeXN6d%!FAUm'Vf#!5U-Sa
"b81#!9#h+Kj%bFf"&NCJ6XENHPN!K@+'(Yi09P%A,5cJ(C!!Q*1L+QkN&+Pd&F,
@IIBVf4-Sb'aLkNC$(qq8h6d'L*M!k#BSm+B0!$Kk69GC`G[di&AC6)i+)c[V[M1
3!*Vj[`lGAI!f!UKR5Y2DUllFLD+VU21i"&bD5EQM4pBb8$%iJ#)(5mK"c69EbY!
&ZFHZ3Qb6kbia(K8)pYS!)p9D'9c%VrAa)3#$@6,",P`b`8U%LZeAh&Yai5B4m*&
F2MS))KE!#+RFDldECMY3HaPN9F&4jTT(+"aM5B"%"`3-`#K36f"JLr&D,lm&`&8
[E5[)h6!E881bJaY$L6J(-GCAPK*k8RN*(mR+*Kc'MBX)#JP&&Jjmk@dI!C9HHU1
p-Lk4kD3hG3djj%J(SBP#iNLSS5mEA8$$NT*l9jdRjZQr-NU&QA5,0RehemP*2UQ
D29K-STe@IAGr&&4Uf5"9*)hVZdR*e`9BT*`aXEkpF+pZ!53eH)"5cdAJB1+E*Rf
,`+QrL"iI,AVNST-9AN3P9+c&i1M"4e,ficTr!!!aL8&%3e)$!&JL$e80CNB4%#(
MlQ(rEEq@U[6QllUqZClQmEQZUhUUYRT"md4f8MF'l-S#[@iQXl2)RmI@mT!!MZZ
EZB83`KAYjjFGF-U-L%k21"F1%fZ5m6cVC"kh%&l2`RU%F(S$)i6P@BI4J)%QhD5
EI6-HkqrIhrrhG4dJ[lXNlb8[2`!9GeiNmb!b)K)Km3!4)JCIDC6*@!`rXUpC!#N
Q"l"*#+,Cl%(J*,2SI$2R`#a&,*AJHr2q['r##2kqXb$M29bpVCBKMfMd51[34iE
HEQL4%lI$KBTBl(HrB-@$B+jGM6BrC`6lfrd@hpH,T"&%q"T@$+410j!!4@%JAKK
)i3`#k3*IHS**R#qRYL)J,1e[ND8i)MNQ$TH4Gkc21GlS(r!2!'arf"r(cf9eDh-
FbU)b'T3@haK-Y,,iV`'IKIP!,"N"+lJF*P`kQB3*Qc$Gr6!E409iQ6GlL[rD&Z&
L'9UPe)!-6NmFp9&,I)b,MkK'r0'2c$L3!%D,Vr@S5eRd5mQY!)MVa183L-U,8M@
0d1mlFmVaj4C(GiTKcq$X4AAA&I'!p[[1M2*!Trk!0Pebe'9ka'9mR)bSmU3+fLF
YXQG$KkpCR6!d@iYX4M$G$"!j40"a(8+X1Pr'Q(r8j[!Eb@*YDNP'r3plQY9D+[k
SEHQZE8#1@mCY-0`U)p6I"B!Jc-X3a2PSHBJ%mT!!XA'`f`ZS-51J4KBV+Y$IJDA
fE!q$%F1IXX&rD2'8'%'93-U8GA"Tk@*')3Qm&''F(5'FeAQqX(aVpf53!&-A#,m
rbphGEhR#D5b(%QaejY8H)pR@$Y"iZI,)4H@4+*B'pYiI$ICh'5'("E$ZZGXKGHH
M(kPD3A[qrQ45@H!A#mlZ-T)#eLF$V@%$j6#bN!#6'Xc3EQY[E2GGBC0&!P%VLZc
kSM[5B&R`'6PTYTfJBXT*HpZ*3Riiam&%0M)T-8dPTNNaR9cZ!T!!-"R!T6RXX$*
S-JD$rI2lT1TZ'IN+JN3A-c+mi[4d+(8k&[-P$5TX3)XRN!$+kJ&$qV#aF6HVTKT
[6PThRLJXHCI[Y"K,"+`a[+AYY!!kUEXS,fZ!P+ammFpDe0655l%kIpBP3AkkPh8
[e,UeTQi@&P)hQMH1)JSESTYjXBQ8mjS-`i!#MQjHD'BPbN%a`IdX[R63X26SiN+
Z-Vh!4!(a"M'edV4Z'kbI9H*N"&-c-Cd3ddQT&pDk&jA#UXUKQ$l,kT2*F"F*AMc
bX#*i+Dp6)IPB3$llD'Mh&l0aU(Xj2-r&m,T&h8D9L2V8d4"[-)ZN"ch`UAM!EIj
q$4)K*,"Ymlb9TR2E,GKd+iXAKYGYj(1QamZA)@$mjPa1KJ8S1+9*fAD#0qDIpiR
#I%MeCh,5m#509&X(LeX0#EL3!!Yq%KI[3b@jZ#G0G'P@R@'H)T8%`6d$``'B"'K
Pm`&8d*YQSP@!*BmZp,YFT3b+I1q*4)&ArBQ+'CfKmJSAXe+Sr'&-&+T(VmV&4+A
GSmY[Y-$SFEQTDkk!e!B,`4ZBLU!B0LP#VN6e@h%%UPr)UeKFb2r5ULp2UcLP0Ek
b8kRkBMT%V5F''1CjK48&LJ+LC1Lj0N2ERER6jqHN+96[cVR!q%HlfbRiB@ESAJB
*"bA`U6+@N!!#dVLlq$XmQKq*0R%!&VlZeCKjFLl0aEF&ZEMmjccf5j(h([CN,NA
a8h%TL"qAHZdU#ZDCMC-K8LX39qaVf,3p)pAHBep9ReCHV6cf9H8+jC9al+Z[ZT9
A)GVDSiilU3lHSLrFJ%$UAf6-DfK$e6!T,iE#l&cB`L#b19NkEQ[XQ#iYD,[['e-
!ZQaE1`[hFZr'UXEHM9AkZe$p@fR+jJ-)$DEmb[`L4$LmNBA,bT`!iab"a`1X9Md
MDY&9&TSf'5#ba1*-SDThHGX&UEjfX0IVAP&Hj`rfqUZEP0IHBei$JYfmS,`-%E[
a+$-@kC8h4D,28A!94UACe5,Y-mq#J#L(Na$+Q9`1XL1FT#2#Ci$Y!"-6K(lJid1
BC*P96YQ@'+6hK'8lY"THBJ*kE`6e&0kJZ`5PXe`&Pr%Z1X"p`&6S'-C8hrKNH0)
1F[fZE$h9m2A(a3B5cK)V3$K0Q,4GQ"i@Dd94G1FF6(DC-BpZY#,lVZ6`hiC+K,N
b#+%"AdQV3NM-M24h!"L-FSFb,#S5+M4YairjkhY3%GTE5-p2r@hBUJ4rGNTFeh#
5cAPfN!$`,Qf1VZI!IQPcj%0-U[j`!%NYQ%2Nc"m1q1adV*@1E6ADh4)[I1KN03"
8Dihc[H-)X1d,-T)9+NkNQ83RXjVM(5*&`3NJarK[$p`@T[CIFBKA[#S1`*a+Lc8
b-$DYP@4Qif4bGf&m2[@XB)D1++Q(PjQaV[brpe&XV#LkHld)33ccarLFDT'FUka
F#-fp&+Y@ar("j!qh3h19XAAUSPi8X`@YK3e'(&kFh&XIbQqAFcB`U0A4I$!@bTI
M9Y@*,PLC*SEAZBJYa[)Q$MHiS#e%E)P9LV6+rmArLr`2rSXHmep3q8r$I`(mTaq
8Y5#&C!RZ-bbEiAce-2i3Y&#MX#)*&K3'VE%Krm-KaC!!DrlKd%%0H3HRGYQ3!2m
,Ldj'EJbh+NQkZK31hbkR+hMb`pM#YRmiK!FZ$Z1BZ8LUAFTb1@h`j'pM#pD3!#8
@bmMLj22eEHdK,("b9kMVR@+MN4C!A0V&L1VLfl#NfkJkNa*Q`VG"X#F!cC9E65f
N@M5Th!C8DkVPVf&TXES&l@*)69k-FTSJYLj@9a%!#a1LJ2Dq-5#kSGc1C[H)MCe
(2%lUA#ZTFlQSFrQSFefQcLAP"C!!ZdB`p[r'fi4Zqhrpjihc&(lAe9"Up2rh5bA
Gc-SMEjS@2#SH5A3AVhMN%8kp[h#h)AB*C5eYHfUV+XN9C()j$#-CI3-pPK1VBHl
X40Li@#DS3%`UR,MD,0p!2#E9#Cj%@2&M%T@&ck3&2*b%0HdYmQ0fi)MH#dQ')+`
J'jbJj*YKIV%8N6L@$dr5i9%ekSL,9l3N8[cah[@qT*f!Q6KHHdQ"QqH3!$ke$UC
mL8b%%FbP,U9qpR$CAhj[LC1k9)&MY[k&bl'BM+T)2(iKMdR)(H(*h,XbZSJ#h$$
Jm5VTH)!2hd9BLf3qAM+6Xq8FTkLrQjFKX(ZQMm1qbL1BmUdJ),5GpjR01#-48!C
Mlc2Cbh)kk!p[-@Lm!S9L0q)%Hbb$#bH)6ma@Z-QZ&*i8*qABV4-I$q$`2rKNY"S
1,(m!161B[)'Nf8'JNRbF+U0l3HTf6!DI[`pJaQEFHdCK%Ik*LIM%Q)4VjdD!r`r
(F33A"5$22GZ)bCf+K+9p,2B)&fMEZD))+I%b$V"`j"r`jrfX2C9(H-8-,6QYX$2
-YZ$2CPJJ$XY9q8a)#De6`k(SdU)3e2+pkmPKF$d9q#J9q$8b(MMk83H6FLpe0aP
TTFi(!!*!JcYV,rkMaL@3!%GIeYkE,kkf,B'JYmhJB)B!,dCIr4`aU2H0Hpp&1$j
XCh!13&lBQ-%(EC'"M"`1QD"$[&Ql)emFX4cXN!#U)BG8$6e%PZJEN5qQEk3i-Z5
3!,SKKp3GFmJDI52b4[T'LU0$$UNGFNMYN!"$e'(l)'R&LcaFVc3qK%ALQ9QdF,*
jppSGp`&MCXJ`iIEb(N)4Ga3r8G@!i@N`%1Y3dkPm6MFG&TP0L'aLlhU2G@DT),H
dElh[[2Id8Uakf)kIb[lmSL8eaJD-N!$k2CK1#Ca)Em)dbYRG%hrfiFpU`),l12h
&6'4X(pLh3a`Q!@bCJlVD"k2D$P2HKj[Y2qBN'G`V%Hl@JheBKV"jYB(Z'PZaqmh
HFdd-"pV8C1S@+c"IrS`%h,G#cE%#kH93C3mcDhhM)&GP6-*kTlLcpjh(ClXl4Hk
J*GM-LJdiHPT@lPHfIJh"Re'FYjhc[BD,VfMNelekGq$$iFSAe6X%G3-`B#Y4h(S
h81#'D'T!k3c*iH#q*45G4Td!`I9AQlN6S)KEVe,#G(2$b)2"$SHZEdQ(J83URUX
!`1[NC9QBkM[[R(,je9jFl[A*8#(dr(dbpHZ$hAPLJVYc4J)dZ!QPm0m*MN-(3"&
qpVXJVB"YlAKadTFN!1[N@kH4TMf0"&'A-GrBYI!0ISQ10SC&*e!%6EMaSV"110S
c5!i$#0['YaFMVhlT$Sl-$QIPUjZ'Kr1bF3NC#B,HAIk9FBEjAHHcmpXXFpd`mcd
!'di8TPcRFA0JX8,'4J'EU-f&`22hH@0cfDcF-$#V,3E(!*%di,),%rT,[cXVI9Z
0%!UmAP`5p(@!hCXb'hG[!U%ZB8*0!(ijJmEm!'jH(0fS9K3#9b+([b35%NM5`6f
a%+!2GI`"LMR-i!FZF`-lN!#FB+"LXTLb[lZKDm'Q&(!0Gcmi42%&DZL4PYL,8MU
kPQ'Vdc+@(44CpABGMQ9PrEemG9Q4I1YHGFPSF#ai@Fk-99F4H6@,JcBBFA8YrY4
`J'@FIk4%XN)Im)iI15a0Q+L,"!4a`k$,Q3cdkDDY'h%ChlMBc%ZJhJFJZLR2,)L
,iB("amUAAUUZG*['$rpi(pb9BA)Fj#$m5k,cZ833&bX(+-#`DQY1HJUmJ&h4AAr
U0VhEHCN4!N(Ja9EK*PQ9'RN!8jaLi6"jf0SN8TqSpYRU2C1"Cq3NJDM,Vl-4!LX
CUpl,TSeUPSY3dR!"-,$DakV,Q*K-4I)D!#&Y5bFkri$Lc$Eq[E1aml%m@2YaZ&$
#U$efJTNL2Ji*8qkim4a[$JR"F5@3!"CKMB-)b!J4$Kq4%6F4MiY%1Ui8Eb5#FJ2
KjcP2FI((q#NU6Y,(VZ,Pr&&eFj&A9i%9r+Q8eAAUiiN28IS`N[LJdBHTa)F`IDK
)I)M3KpaB3-h!T&ZU5e4M,1#1XXM9CN`M0%hPQ!(lR9L'D[ZVbacG*Sc%9i38EeR
"!5,rZ"(BdJQMFrhk[T5+-Yh"K9m`hANbC3Z&Zr-IGN`'QHPVkjL8D&S!&Gaf%L"
Tr&6$8l1XCR25efc%1EhYC1C`airCP@ElN6HJ4VY)M6CIPMUc!IHD-'r%)pGYSJe
*@3Y4Y,*bp#4Tfhq$VP`Z3R3K9!LlM)8p*I1DfrT#BNd6f`#*ECc%0TA'6[H5f2T
)E(G*E-8N0!F*l5i*65@4pDU1K,"1*F3dN!!3d-U%D,)*S43J&+mLP*k%8-b%8%*
#+%lUCSrDi-#H+36kfcIFJQ0IYkI9S#,bEYcbPmGIL[8HrhG60VeaT"l&-1qdq,Y
m%kPEl!`l,Blj'hb5FUfad@(KESm'1YS9+EUb@XV315R[#pb*")3'eF$XBYM4XH,
@l4FTd)P8PpbH8#!A3"4IUA%p`"&@J(iD%cRKdJf((,LYXFTj[T-"D'aaV,VQp$R
E18Y,GDh6%VA%DQ-ah03j,5!hHChFm*C8+kQ-q-'kre"JQPb)b5'-P4S&"hBi`GH
a%lah1l0,LZ),SlZaF-G)Z'%5kiak'Blb5#f3!--k15e`K9ikPEQU3(!MaRN'Ga)
2T!3M)MX9b+lLU!F!BFQEiV9bL29J&hPj[hi46r`lq%a&Crref9J9UJpL#&#9LpM
1J0E,&YF$!S!%32KEJJ268LXQN@2ZFRkN*$c$hf4aT&`kr!TQJ)3&L'PbAQ`BX"9
rY"UpTjS+9p9Sd8-%X`d#CKa%SDN4QTL8%R4QfKJHqj,NZ,D8JSk,p,T)$jCL)`T
XDd!CUqR`&(l'C+EB!KDQD",TiBeVFHPYTaSq2q*k!!8JY9e3+AHj+p12eH-D#kT
cKBeElZX-Fm&%qM%lL`35*h3""Jmifbp'2ZPQ&a5jcA$j-j%e[QMr"FFY0%KbVQU
IrTN)r*&J``FdphN)i0JLR+XHRRPEA2ba2TJQ,fBe-)+Q%GIN+L2TQF!$%1"M+eh
XSVm`mcC8hJM-ZKJI#r6a0KiCME6J3c0pQ%AaM(*#cFHQNH(Pe6EZ$V'41r[P3p5
Jjk'q"rc5i--bX[48`kYRqI+a%6CehVaR$-GQC-qTKN@EH1@p*RZ-Im)$5$AK*rR
VXc)RQr'6P3Mqq2JIm%hb"r`#$k'$kCrYdSHIX$cVKp(l*K)E6,MialjeChpN$FJ
f1rU0Z*0%YPI6c36Gl-[`6I2ha30aqRLJ`$HPMp$(T4+j#KrEk)&LHS$9r`L4rHd
m*6DhR"l`d30la-*)Lf!4m-)V@&kk+G"0MI,3KiUcdBMlTQJN46GRk3C`Ic4-BLd
96%YMqi+GM-d8%%%I$!3TC5F@fIbQC`!-a@TQJe%mqiaiFElY("-J!m"jl%$E"Gc
B6cAXhki3)aRCCpJCMMAX)"2[CjJS[IrM#f#,[dALAFl(i8mEMVc'MSB)&pCLF3m
YGX2dPq(#fh&KCf%qfXlJ!J0(!!IX2)P+6dS!%`*S`-2PP!cD3dHAR@SiA-TJ,hT
a&kQ1BUik'Npi@@RGRQAi&dA'MN[l$&H@RB0UXKB3iQY`30VKMLXU8P5pP4Y9'AC
dQK9`JRLrUH0)%`F35X@1ZR6*QL'A(L$$3CVHXr*+j+V'#`a6@N#j*!SYX9#i3'm
Z`Z,QR2cH3'`C(I"ERiBE&5N(J!baCCjHC9-6T"$X!(&@('RL*'4XYC1V&2pa%e8
UIL958Rqi(P[P"q-mLHh")hA+)eAL)m3Y*UDL'NaF5UlE,bk1+5mDmBqLDk@3!"`
BjDlep0S4kPT+9dp"U![F2Cqq2[)!0lF(ZrV69qM6V1MS6pm%HrQX8"Y2[cEbJ!N
U+U9k`N41IkXf+k`+9FlIj"0NGLFTY#3T)TJVYKpL*C6QR*89c@['GcH6Qcm5A40
&aV,ff@%QQBeG[Y(4q(0G$Hh6d4[YKF#@qaa133(%3F`#chGbN!$hA45%l(4m)%%
1Y'YTM4P-a8ekJKZXFE)"V&1&ffL`c-jPjVGh&aNVF1cVl8cX+BM)b%jf@[GC4E-
cBT,BC38TDR,dX)L'D1'd"NHQ886*AfIl$ql4"X*T,fN$8-@T[rq5e"jj`jJ[-KT
abEpr!iH%"p1E9QYQd%%N6JQJL@Fd*+i8pL%fc!`l'YDakTVeRr30SpY98F,PFC!
!,j-GQAjkKKmU5&pKC[j(D)`J)rJ"-)DIG6+SFVT4ibiZ1G@C,%KrZmmk1ArXTDS
j-6V"*0"U2FC")&`aaNPq6V-kHj&`XKImlYC(E'H3!"cUYh##IM5ipkqSi*j#FGH
#!HdX"(EICb!L'fmm[@$RT'AMkHN8295,Kjj5Ca%#"JprL3VIE$apZp6BH,LHLja
[&d`MS"`YRlZepkp!#JFIcr"KXqb'9+-XS8r6%f!HEk'T3`dYdIJb%0T62KQlK%Q
YCpB)l0D&bQ"GAG6#VEmmbDJ#1+YhXb&1NRX$Zp-DX,aZFIE#TE116!)Q9c#C*%I
EDE(*!Ac8`JG3daVl@i!NIeFHUk,LUN1&8l'['p`34+6cUp)B0i,aFqc)$cB2iRH
LU$0&J(-b-$DC4FFCNcP+TpH`L`qcK5`X%)"+1*`eZb1(mRGr-K!Blalr#BUFbEh
T3**'Z'k41eQPhLb))-"@X-N6rh%C8(TY3A6EC%&2!TqJ5hk0MBYC00'`3qCdGZe
8`qlVP$DA2T@CA$$I2FBmGfb[fAJ1cN*-IPT"GJ"*perJLKij5GX(Y)dZRe-0`pj
VDHaBB!+9kff4136YYEdR9GfC+ZPiJd%1K1`VH5ZqJQSQMM5Ilq4MP3ZR"Lmm@di
-QqiXX)I0G3b&LB,-A8C"iX'-)3U68r1h8*4lk,26B)FQ&#Fe1'Cf1Ea8SYQCc%,
P0l2+6hF0!LMTeBZAQJ18@58$heZ8C$XDlpaM"j!!'aHSN4C"I6!bE*`6DS9mGPj
!X("f#V(L'N@$H*q6R*MX**!!A3KCGPf-+XUdN!$6aG)3TfBJ*V[2(A8XUT!!+F5
THYZiQE$5L')2QT1bFVc2EMLR'VEX9-MkipaKMPa!35#4N!$*UdiU(V1YZr(@ED(
'Ik'1mmFI0URDiJprdie09LQ&hNU&CLB%RNS)TahLaNY(NhLNX8@QTQAeML%"5Tf
L4JScpaDC'4l0YXm%-4Ncflq(-"NSBeK2)l!$PmH"bMCc3S3"XQ(K1"YTDqHJ9IB
8mLC$q&%i[SR8kZq3!-5[mZ1M4hai&"p+m&!3JUV,cY-&,AS+K*a+5dPPQ1bXj@q
R"ZT`-Q2hUST2IFf,D'B[[FCpIkrRNL+iae8(1i1G3eG&FDI1b&+TZTcRHmq[r05
-ic,I&ZE!a[$*,6D"$4CIBE&E1HL1*bF1mU6-84QKLPY8k`aJ@6@Z*)$Z`dM3J"[
ZKrAqAPm"4QJ5ff&h4aFYG"!e)"1G9R&6L3ja6UTAM*mE-QDJ6,+A*CR@#M,iR%(
U!f5r&@5reH$QCh#P,cD2r!@-[Yl)Jq&NB'Z6QU3!XKjr0LPZ3eBSN!"'E,d(9Ad
2@qXK"`,0RF8@9(cm4a6+0K3qZkSjFI$lV-#SHbR0q8Pap3M&"FE9"r)cSaZX-["
!16NYM-8fi8qpR[3(qr'2D-,5b#%KZTlpUUNi`SlQi$)"d+)QpKl!bqe`8Gd6+iH
$lUjB'E[TaNV`mZ9B$GLKT-+)b8L9BAGB'Qr0$Z$iPr&R2rlXiL%2IXQP5iCFHT%
[M3TZ*p,bFM1kNh8XpYi'c6IK$m+-$Qc!Cda@cpcaDalV"XeM(`iilSLQ#f"2Phe
h'Cb9*%bTaM2-2ieBlXN!i)l%DYL0#ZM%@e!32"REKUA#LCD@![B%k&DfGj`EfkV
-e*Eh![6-QJGr%#lLC6#QlA3aVh+aPch@JfeS4J#RbcK8iDDMI!Q),eH)kdh3iLc
JaF(!2IEqj(*53ZA%"!1Sr2eC2A53!-aHed(0,"G+5KdJmc24X+&-0-L%LR!Q&)l
+Vr8,J4Nf"kXfCrZ0D1*AjYZ2$E9#$9Q*c"J*&@4!"4P#"F@U3&!iM+T%mjiDamQ
#IF1YDERZ`b'+D,hZ8Q8m)9Xcl,c#BFjk)Y9VU,YX+K,GTCf8Br[`Zm+T%!r8#dB
*aI5q-D9dPa8(k3l,U$[)i$HJ9,*+PfK8CI"$DR66FPN5#l5DJAFf,p1m)Ue5F4P
"8++V244M[9"jX4@&I"cU68Q!pSL'V!6I&!LD'b93lK@eMilq"!*GVGkG#8+eIS)
rUe@rVLD$Ta59hi@Z!&)fADUlTJ5h(I1+6Abe1&"0U08JXrbIH+K,1,SJQTEIXd'
fr1AC@)Y`1q5#8P6[6r$`DV"HV62(3F4DG#+'%"J-&")Ae`diX)2TcH2e,j6Q!2[
J1'FqBN2k9N1$KAdE"KCDi4!8DKbBYSm#YN%MJGT$,E(eR"KSX!`feSmGmNZIjZr
hr3aX-Yab9R*a44VbRT!!1pU3!2HpaNNH'&q3!&*6"qJM@+[BJHFjFAX!CT!!iUe
`fNTm2Y*#S)!YDj,D4JVa6$3VL-i56,c0I`h%4XTpCc4QZcMCI#@)9(1B'lpc8e2
p5#G$U[[)`4*9%Lk@@bb2fKMU"G1Aak,3Iic%fRcK9eVKPQ&6Q8eG"LH!Rk"51lR
")GcebY9YcURHUC@Y4'TqRNCU40+$L8hiP3!GX%dK*bFb$0'h33fd`9fr9&e&f`p
Jqh(H(*S2YCb*SY-c$'(c(rF9Z+Q!aij2QrM6Q5JaXEq0V9&60(d)8aP*+@TKBd)
Tc1LJ0p4!)a4RPY5#MG5#l96$lrS8GpBeF'b(JL43qi,S'*a1P&ReY+)H0UBT"h(
4Ar"&jHZN)$B+pF"#JA+`FFJ[Xf!LXeR,EikM!VX8"@(SCYa[H5&&)61rii0+S#i
q8%FTD5'kp4lUc%-C[c)-bf(9!4SqQMU(V158k*UK6HHY9P)G*UQ1P!,fI4CJRir
![Xq*d2QRESB`3BiD1*hT'D$`H)$J[PFb3G9Cd"5iMcHX!hj1KDQdJ[eVGh3`Z)I
3GFI"`Ef)MjeNLb+fGNmi55#eY!q#Fca8$'rNB``!a-!INPY2J&ef'F,Gd8TUa8r
`rN@4h*HE@&9GI9GqUVMNT46!fmk%%S0F1!N5!U[2"M#**1HrCjK3CVJT3-ZIC@&
GAPPBp#GIaJcZ[fPB1)D&VrcC&RkP9PQSZ*X5$*d'B'31$Q"S!X#`@Y-"$%"K5P-
['RaNP04*'aFKK'eR"mhaPf3iYJH%iA,'c`0VA*BF-QH#r4hU'!,HilFR-S(qMP(
YZ5j(0i,A(L4$lbZ*d@MMmGRQA-$4aDrhrTAqDPR(p#G'i(!RZfYRjaZ2,mMJGHl
SMFHRCG"5B)@*4!!D5%b``S5DN!$"Qka1DI#P8e$`jBUL`P!aDTb8IENkjRm#`iK
P@!h6SEA+N5A+JAA+JA8iF)Gk#!UV(*@+kdFaHd3A)98CI9edAGfpI,F&UR8l@%!
,T8mdU$i`$(2m8(#2CD@-hN'Eh@"d!+h(!NU6)4`UJKjPSdPr[dG'er)'X59U8+C
XU3TEfX[ZSid$#mpKNJ6Cf(R-aK39(P8),Y4bH1M@)VYSDd(DQSdD%i%"*Z&9JV6
B)&UclASKIe(QJR[I'5+q8(p(6L[[GR6YI3IL#afqRi!U)$j1UI2V[HrSVaSJ[N,
SLXD3!!D"*""Jj"$"*""Ja0ER0q)h`f#IGf"EVX&('4C6UV4$+GkiU-48"AN-TP!
9AY4+9BP599B2,H5+B25dM2R[q0L`NqJ$GR@-+cZ(kQfiJih-B#2aaM[Bb+)3K5#
IBP!6,,$kEl(E$bpkp(pIP"Prhj4U662'd`YK-Tc6Xf&(Ya&[l&lBbcp`$#KK)1j
QNY-[$*HVPrK$SN+KG(-C8L(K@"K"G9BQYRUFQqc59P&NmKe4('+VqQ,HX0XZS(R
&THj4pA%i5E5j!aXXB"!dQ!dhi0f1p&UF8f9U"3m3PSdc'$GR3GJ6r4%FbM!*BK,
%*)#*KNNBN`!Q(rq)AFM3N!!#Nid-&'+S&R'TmU%K'MQX@j8893V0"63`09V12MD
rl*CR!USCEPM'+JcpG-[RA0&0R`$Y'CYi-#KI[-#!(``@fdkkBaXXJd-h@G2J*$3
HD*KSB-$)b'GFE[2lYLY`$6!Cl+S#meJ`mZZr`mbbdi8%Y6p@UF-IF+ql,*)-"Eq
kb)kLFJG"N3a!RREaX&kY5Y+Bh)0IlH4"0YalMYL--"kZGkFHXB%dJAaYj8IZm3"
pU3k))$#p!SkJcAV#X(Sc(qDcX`U%D5#%3iSD!#Z'ZbT2[jdHKaLU#SlMVmS,B1a
HF8IQ'+b[pBiATAlqN6Z,!IN3MRM(qj!!%18E1![LY4%8,icZQEcK3,,f!MI%`*!
!AcKXrDL45QYF8FH&Y9)da*Ui)Sd8&bL'r,Z$KM9V6cAmd5i'lqB#2#c8iA1SXS[
CK*fGK5@`pdRIie#65GrA5'P@1Cm!`3H8EX3(,$qf1#aJdkT-KRBBP+PmKY10%26
N2!DKHdqirf3$ilE$&YUULd2`YXj#rPNm,&-)rh$FHMr$$"jamadN2#FFZ+$"Rk$
3N!#fd!DV)TS#X&2Q%bZam6&RRSIJ`[%1r@MHV%IVa`pYfdj9Q!"VNa+`Eh*chi1
d*SZ91R50,K`(3m3-0VZC)&@!3&LL3J#5UeF*)0RA`i5@ASe4CC[aFUeibG"F1+d
Kj1!J9``UT4q2'q[01#UBJAY+*4HhB@BXDXmNAl4914V*iZTajE)APF[U,j(BU-i
T,eqET1dNAU)K3V@T[*a"Ti)J[YHAZCS!1LXZZB[Gh08fX[ZALFGD+HdFBJ'KZd#
d'"b`6QSri+4dQ!$(K+ZU5"#R9bC44,kq"fQ&dYIh)*%L2QJ4dd+Zj&KL)9I,50a
b4H+mrGBEKD[+YM'-fXC$VJH$"Bfd&)2'B63*CBB`T6B6l11Db6qGPpBCJ$JFl%)
%Rf(fTHq"hMM#A$5%bI&L`8bDB#ClB4k2XcVaXjTNTEC+HEA5lI`lEf(F@1j,rHE
"+bZLaYc9mBq3!%$Re)+86aVpaM*QHj(3"D[9mb5PQF2'r8`rTjjj%+'H&bPaA#Q
5p1`+mqND$1J)"Y3hJd#NeRL1rrmbZiCmqXI+N!#2RrU0Uj05(`$bdlYm1r-f$UX
5Jalb`VI'8@eY*NHX)0M+c59p'+,352S%d2bLfQXNKDVK$Y,81A@CNhR5q!klC[L
p8h#a5%'0J)A$*c5T%3f)*Y'iaGh+%dk@NIXPdLhXd!#aA1rMe"KAp$35Bf#mNFM
AM22V2mqL8kUE3pSYb)8Rh!Z-clJHk)N[B3a&mYPlN3rajiCE2TZ2r2R-Zj'e[d5
`fi4J+H9G5Z+&)`*ZLQM`TRU`phkNTarL$VlPEYq$JiLpM-A1T!ME29E`HdieK#p
aSqkM"2m*0@crj1qmQA%MG6$K4cU-AK,q@K,j#4)i"Z#d[N3#Va*Gm-XV&'(2'ZI
eS4UpfihHIi,!)fY)i#Lf,hmY)A#qpHN#rh+B"&i$d,c'RImlVlIhmq0`&!JI[5'
iL,-jpXl![3"!D#qF#(TB9&8lDA$4-Qj`V4L'P)Fi$(EQdDQZk#SI6985*X,,)pp
!K@"@9S-F&-Um[IF14piMNm%YL&F+QmP(9KNQ6q3KZ&T6#SNqIc$cV,1Ab5jF)PC
0*N'b+V'mCI*MFH-ZrVN00a$CjMC1*"FNc!SAqe%YQj9[&)QhQj%@G#d`E1Q"k[q
"8p)h(iKQKB!TGr3*)`4*-kE)#+Z%#(j8Ih!M*)8NB,(PRVLcRiLC`c#j'FM'chQ
dSSI8l+Q'd#`)D3TXJ)16Ckpf'Vf#`("$)KlmFr16-,VqpCrR4"8hJQH$dbr8PhB
KCS"`8,c3bdlbU)kid&Ukd#XB6,D5ZbXZK)T'[S%,1BkjN!!0(EUINYSKikEX`9$
#[AcCc!YFPX&85B1dN!!l(#8S31`I8U&b!Nd`!-'XV@*QEA#!dGE%%&[-3)9@Lk&
XI5&LMAD*)@Rj"eh3#T(@%52&m'1G1bHF1$,plQ[IYkR$Jb%p(VL($A4MJ!%+k*P
*-mc$JT@U99LTk`NfUQBS'h8PSUB`0('haf5fcY&"KU!fGXcZekI6H4l8PCLQ*M"
0F`V69$,)*U'M$Gk8'))"ke#BTDB%Xe4l-'D*#k-)KD&PQ$9#0q"KERZ%%XIR$Fa
L+TmeqVa1K1+a1UM)6B!pB$jTR@eRU[[5f@rp#`$kELCPRV#D3[2,&2e-U+%L6Rk
eB"J#HG-+!CS!e`5mBU%M(X(VTUbQX&&9Jf`8'RmQD9#&+@*f6K1,9Rd3&UhDHCj
G#-'S9AZDUF&L'1kh8%f4#D(FG9B-AFp*l"G[)mN-Q0L)38-Y'cRKX)BKXpXpeP3
lXX!2)5@FmU4`R(#4'h8p8!J"LX,Z*+F+&%kX#VI0h#A6LTU"*,$`dG@XKS),0*K
YdP0-43R&[Qj@&+4(CA+GXLK&D&'+d%p&U(%4qJHHU*M6&&B3bU@YUC!!jk$j''E
3QLL`0)C3lQH'X(A)N!!&(!jaemD!Y#FVVQ+,lk#EBPY+S(@kl8)QljV#B-)TGNC
frp%(MT9Ah6%!V9$*ErjLmHSi!pkGc`6HI&hri"XK-)U(@M&jX1L#K6YM4SJhRhK
X$NV&2cRrjJAqK+(%Sfr'm1N("5P826d84j-&L1kR93bZ3Hfa'SSYbhZdCd*[[Yj
`'T2!QcI5$Y!'8mDkLjrr$3bb'mE58Icjd`5VC[*!$rc!0c'FDf`G,[*Li5U)(,[
cV!1M8rdE$&0VNC-9deFZRCej&JpGa*r,EPRrH3aZ5fiNP&`iJE68aGL(!&eZc2#
!MCq&Xra+U)`,5&eG4S*VZ@I11Sm"@mjlrB$#d5"Kr4Jr"SE'XMD&4!iDa2hUfZ-
,XI9`BQfC2RZl+,E'aa!p$BhX39IR`Da8Cq)a-r&BL"q$8`*G#%--*3lel+6&)$$
Q"IHMJUQJE@kMKqIBj6E@LXHh3CdCU"D)5`5Q-5I(2r+!A6C(G(8VKXR9e5eHcBL
KK,(J"#Rc%*-69V#*SB,jT6[a%SPYjfF5LrVS49J3QU1@VG4IrjUGql5dK8ED`["
4#k0$&UCG8*DN,8`GZe!H'V)`j8`dLD2AQiDm0Y11[C!!GUcpU'-[$9PS(cb@Kfj
I[Yli$,q)8KI82aNCI%J-2X,NV)!80(`qjiX`+'ifRXT(i16JmM[D0h4-eflSQ0@
-C2VJ)c``0&M$piJCC[#JQ9M&4J3QH@)"haA&680"+h"#H2&+6"Qf@!bI5Y"ml$%
H3$Dbp6H#k3#,BbUGI[(U-jVSiMbJ1"-+J!kK+c%mAJmb8%,$Kf!Sq1&PND`J&K2
E"3QKJAK[5R-%M4r"$&9jrlM[6i8E#hF'4B&#C8k83@9#k35[[6f%"H8,m[E&4G&
&&jPe@RF5,UHB4-U*h41[QYeCBJ4RqD#NqECA$12f3NI*AB,pA(HQ6f&%JpF'Mj1
Vh#iLV#k`HbPLMSfhK`4'4aei3J`J#RB*&IEf)q!i[AB-`mVhSbNRP"Fl`r*"QYK
Dl3YZE8k%3HZ)[5G`a1@eZ21d&3f"bR*bi8(eSc8Ff%)d0fEbDSi$%fDL+hIT&C)
A4$(*eh"8E!8V6Mc-`a0$8CVT3DX`1lH*TM#9j!*E@6$9(L)UD34Nm`Gp$rVELGb
dqrDQ"c&XK-4SpMXa5$a8YCq(J4FEqQS*`4$bPccmqF6$6kBrc!a+k5+j012bU5i
4E"CF226lIdlrD[DC#QP4rMN#J'##*+fmbLj6NE1#ID""[$Q9QK`9%#(qF3-+1kT
1II(*CEQV4ZMYdXbi%!-[pHJ$,Se4H!2$6*R#N!$j3+r*JfaJZ)dT)j4Z[+R-b)2
#L5,Rpcmb8RFY9bTY(CNmA-FeGam2UhhABZY`jM1!IGY12*XA6C4S5[md#%e0$NY
TDLFJQUG@61ddEFA85P-$deDD1M%eD*V"e%R6(+BCQQBacG&d'kCCQLjLZSfQ&CJ
ZdM52D390"c$0dh3Fd`'D6Q%k6P-ATP-dlFA84G-q6(YT1J,R-fmQ3-f&j,pUQF"
!al-$dX3I1rjBmDF9I``M-)3m*dQ-[Z*I#6%k2k-`mYIC+2#2&9c3eBfZ4+X[*BB
diQBLh&d16#lAc52)5DC8!@`#Q(,p"BaIUderSC2eeCHQVa"CAiXrDjLXFfMT+FC
Y'fr)(F(`F&pmXTSh`Dr3[E[daIrbVGZr1RUaEjDh9-d0rYV3[D-JZ@YM)A)050'
!Z!DDHY5k2ekV-U(ecH'MJ86SYS-YFmF1[Jc+2)K3[3-TVL*RAVMbIq`Q!f@)T-h
V+(Eqr#rL$))2+YKDHUaVK+##DJYIS[SkQX5p`ma&GG-5$B0ChF@AUqCNF20rR+f
q(KZKblr'Va(',q$3HR(SfM("+[)`q("D6a!)8M")QZZ%3LQf'fHNXeGT3&dh'XH
!4SYpl2aCU61B,JX4MkRecX%3(q3)`Q*P"HEb!T3k3kJD0M05#%a9C(PdNp0E6hV
[#48,KDL`j*%+-Gb2,qUiTAaQ0IR5i'HN0j*'V`-K%9pLN!#CA((D%kF,TY+)h!&
4+)kcA%c9PiLjNY9lfC9JD)ViUR9-$0NF&m1')*(EI2KqaVkeSh#2eD8aN!$MiF#
DN8TKCf8-882TV,-FH$LkqC''VZQbKUjCGNIZ-ET9Rp(,!r`Xkr!YMQTZicN,T`E
G*SDXQc+#HP%TfkaNNS&#ZL-e5N'G&"FYJ2PkpVM8[S$,S#%V0fK*-J"&B8k2dFA
&B*!!fh0kQZ%U1DebeladEEBi6F%b8!J(@KM)Kd`@erX&e&B!!`%ALBjTE82(EI'
!QaiBbXMMR`'C9)BBeh*+SR`mFB4*6)*MkjF`FY#lFVDa(3l!IL0iZ,2i@YXj[EV
+3A'`9[INV!ifKSV*r1Yd04"DS!rIjX0"d1`k3@0)$@DS)LLrRXPc!%r"RQZ8hC)
UNIJb1I!djJ("3d3-'FlFHqbH$1-2NM+2SGMJ$",fC-K0LJh,a1"1&4bQFA*Rh@D
'G6,b-3cF$e2Vm*fL440BP$aU%F1l[1L6Y%86@046C$lb%8J)U8&(23TMBrmYCLa
L0kq+!504iF!U#M1r,DSED"`K8[rQjp+(6a+$NqU#r-qKJLc4"4Qp`9!"#E*%%@3
SAC!!d8[d`$'#M,j'JJ6S&*d9JSa1*Bk`*`6*#Df8,XKA1i[0B`8CE5C"TR338IY
JU##e'`P"PLK3M%KTe55%'Aj9#0-m5TKfQ''6NdeJU[!FrdqQPL(J0iA%E3q%Bml
Nm4-R3GRRB!#HdD'#qXp,rrSV&P4PDCUJl"!8rU%Z@YE-af*Tr#",b5bq@TDfY*Q
@DV68ULbe(l88j*!!PRk3!,E8bN[P)9VDSbaY2XM5fl68REDdKjBfdG*@CDRe@)2
%8V(GZE5PV9KkPaD@[[$#rdQAh&bGYV!8#dX"TlH)If)NBFaKhCLVG@0Q%hSbhCL
MC@6-*810@3a38L#icJJQKRN8d0j@e4$Q!%LRCl[PQqeJ5lq1,A!3&"+2$"emj1S
LJhj2GK,8-XUXmC2AP6#T&FaZe0--3)J(S!UEbk$*#&S(`FhcTaQ%b8qH)V#Ve@f
))-A$JJP5d+(4FGBq#Q,N5@,a+rNIdj,eJ(IpV[0MmFXFcXdViGaj0'1r09fll*E
[06JLD"YZq9bM`GjZ+2K!8A"h[FXbT--81AYr!!A23bDbNi,VI'kM'Tqj0pIqKA[
X2XM-*KhC2EdI$h@+KqB3M$NZ82T4%i1Rd1E@))`*Hda1-6d94f!``"rd8)3!R6#
p4,S+`mP9-*(`M(,A-Pa`-VBR@(EpNjRq#6p6JT9r+SA#d"6BYNS(%RL3!$'m$&'
B$##3!*Q6Td++%+6mFa+$P"m#b#,(2"M`p3`F9kL`,DFDDM1de-i,rhf!Nb(LFV@
M1,lKRhI5kj6qqCr,kA1(#-TTNB8q[C,fD3E(p!kT@Zq3!'T0-3M048c$RBRNB&,
m3db!DL5FlIhVraZ(#$4m+Lrk$UAF`NCF$'A'F%`D["!Nf0VDM)GiX&F!`@2i9b8
i4BG$eim1$XM'$aEre(DZZ1IjHKi`*hU1r9FZQ9[HY'"BC'Rb"c3[KZXMdT,#C5N
e#)cc2hl%$9I`m4M)2'S*aU3X0[QI1cRBDlD5iTkMAk-V5[lRm,MCAbc'4[,becR
8Cb!dSba'db6TeG+f"[&,kc((m$#T+G&e!3dJ38CZ*LBDLD!"--%9%c$RGU5EZ2&
Mb@"Mi24KZ!#3!b#[384$8J-!60i293eQ9")!)H,Z41qeCchUV6QDiPbDSMr+H4b
PpJV$1*h5aIB818pcGjc'h,TGU,Ch9m@f0feT1UbEUE4+%CDTi$J1`lSXba)ae'h
8DCTEPc8*B9K$Q2VpB3`4Tb10D8#0)rhqSlAhprqqlqph[q[h5TcRHIECjbXGC6i
8!I%$!!'3!`!K"SY4,Jd'r*&l2kG!5Y!K6ALZ62T$ap*I*G!!((jh8IUV)HqI)L0
9+T@!bfDfAeZe@$S#B-j&SFbCVTBQfHIHiN!S-Ih6N!$hd9')3$m0m2-4*L3R9kC
r0$NJqj[p+-Sapcp1VM5X)m3HGcU4EX0CXUGlM`eCa)#aJm)ql&V-[H8m`U%1'Ia
ZD"R#2qIF*6-i-Rd%REASm%mZlLPb@d+C8i-Xe,lR9lRldiaGq!PRZCfCXlcQ,(H
T2"V+R(!RhBVIC82S&YQbS-PPHpSjbjX9C*1kp8PKI4)b*pFhBG*"60)2RD8kG&K
eD-NXEh#&(#C(12E-mSDmGajJiYm&e*T3jPf,QC2@i1FG$&FkZQ'8SB$V1rKj%8(
Z6af(X5`-H4qRLBAi@4Ib2R`&Mi!J6IF#-3FA&q"L$lXi"cqhKlba2PV3)h5Xm[-
fK)(E6XK!D*'Bm0-el+Shh-'IE#L0AZSf'2Me#6kJaqI`!DB0cq8$E+JPQ`q`c5X
a2U"%$2!"*@m'6PL5KG`("(`QIG[ZETQ@YBm0eT&cM5d*al4rVa8,3PYXa[j,F)6
MZ,CaIfK4KLf)6NrQVh+Y3kRiBfiVA*CeMKicl%-4hSIM0Zk@%,f#`MPCAHMX+54
R$!!8kjeAc6ZG1FMUL+Ybq`JlIUIUH'QaLBdcd6V("a"@a`UH)"*Nb6XJl,XI[A3
e5J`MaJXBb[Lp&@99lHfqdKUIY3bee,hhrU,#9rjaBLaPh9-S(1-S%1&PBlZM&XG
f*h2hH!cj%,iq*"AG31k'@%BGY@c3JQhdSiJ&h&Z+5B3c*b`ZQq*%d*L(i4a$*(4
)a)D3!&Gf@L#Q32KaPB3aJ)8j,$RUk%JDRM29*#(B)4K2h'i,"GM4GGV#a&Zk%Z+
082&kHKV%4m"YlC!!3LcaN!!hZT0#XCK8+`,6&@AP*iU-5Nea%CE2eC39PlFV4FU
l5XQTdLmV6VcSUm3e$('Jf(LLjNYIHAPaZBlb&4R,'R5F#-M6BAUJeh&%Fepc'1B
(jBLaIrpECK0cCEN$aPTbN!$&9TR$`VV,"[4RNYY3)Db6GQ)q-18d`qef&60!m$f
FGZLJY'I9LJ2JQJ&Gl1+Hl(4rdm3U-4JX#(3%Z&H6ZGLk#849)%c1#Y!a%3pB3LQ
BE1E-mh3-LN-5(Ed-L2eJ2TNc5fKbeNjN5@QB6BF#1%2-rE50bm5)X2LHiP(bh#8
lKR3d!3R,8K+BV*KDK03EKd"VlR5Ac2V#AE*p2KBr$'9Zla426p!6!8ck"UU'"TT
)"Yc*96X'fR,[Jc")1rkB!)4VqN21E6#p$l-TQ0U@bpeI)-51!8!$)S@069VBQ#9
bELV)$THYLX4b%i3`RBRPHR60&f)CV8f)TEL5M5X84#46*F`%r4$+PV"*G!SK0fF
3Q%PBR5MqaT!!ie[SG$["4)c"L1H(QmeGLK2-kl)M)!TKa%09Qc%'aeGD""d&l)P
(NVN@@jEPlhpMCQ43m,YXbQdAL+80X32,-2e+9P2`+BkS`S)fjNA)dN4JmNYfDBX
15,UJ1(A!R$a9J8)KLP4lqbQVe9G8T9L,+j6LjmU8BV05IUV)k,[T!S9EAaDE[f5
hp!*PMHU!)l#dNFRNNp6XULiUk&!Y5)$U-6,X%kK)q1$UA3K4@KQ$S33FL"GfFP)
p)Vi!VQVLi+Y8a#(+"q-%[&6a"*(KUek8QG0dNqB-6%!Xb%e+"'cbd6'3!!mDUhX
R"DYEVK)U1RLDK-2FIi%Um!)B[`QjRL9X*a[F`aim*`CK1C)$NHekm0Q4(0pLKbL
%[5`C8iN#kCBL)8S13`ET-!5jBbN",4LI`Q$AT#JH(rJQmG3iU*m"'c9mS4PVi#!
+H$)RSE"`*k(JpCaR6YUD+(Jp4e91BKHbmiM)&DS1!,*hZcGL%ZkHaiVGb@%ac$k
,L9r`5cR)X(pKdB$4dmd1ZL-"M*j3LS0b1Xqf5Kd`%++Ge$'qddXE4VC!,AaKYmj
HQiiiMZM#&a(#eiU1fah(f90C*&UX`1XLH*J0%da@%d!QQKUVGCkP#mBq#%I-dD9
h#SBl6Xbp3'blE@K66[BY)PV&8cYq,m4!A"($"K++ld&3aK-2ZCLJK#qU#!*b4Sb
4")19-k6NXf"IZ3ap*'AKb$T3ajCU'fdT[e%LDe-Q%TZH6R5iG1'qL+#-8mq'a)Y
eZFpki&50,bArqSSC@18(U)[2Q4%EU!SriPALEkUT%QFc3S343Nhh6+lD&+4+lck
hM"(V["I"H"2b8DV"GAd`LTU5"XJb+(`ac"FK[[$`4C)[)Zj51a`piH+(0$G#Y-3
44cTTG*kf"4@Y'!LL*+CRB4(KLfDqD+&&d%K99&1CU,#T)UU8a%3@ICJa9c+B&%V
VHpkdNLjVc*Y@l'E93ZC-UmJFbEYCdBD#`AJ$#[X+86fcUR`EClZGSUKcXKY6CeE
Li(149UNB6e[I'f02MiQRHe92Ml#R*r$d6[ldK""flHR8Z+FaG@BC2HeG*jALhBe
GiB6B&LX`lRd4YMZ)k(2"B8R(%&p'`[B(Rb@9,,"VCNBp894ikX#*+UA)pc2Pj)(
LQTH8DJME1(*I[qBV29&44[aFGEIqUmKq,f"UF9bT!3Ap(P9@0Z"i@ZiQi#Ac,6D
SG,d,a,[)ZLa!BHf,2#f9`ZMA[Se+l'RCMQb@"CQXiG#LCJP5UKYU2G*kU@hq"hH
!k2ff$$&L#B*Q-*!!XNdk+[RTRE5JM2#H0hQ@L0!a61d,,U1MN!#el'XGFYR!JQl
h,MX*B+9[5!!V1Tq!P3lJhR95!#XGBT!!2T-!9[4Z0E"SkSB"!TCir+P"4UD&qI$
9X)`e'D3c$mM65VpRQI+5M(b5ijIlmmcVXi*mfSf`4&K"3Re&ULHaDkD2dIANlr[
A'3cl,q2Dp-2R$9*F216"TX86!qaBD@MKfb*RpLYG'6DK`J8&S@M2N!$pH0GKrhX
&4`,rIqGA6Cr8IU[rJ5Yr(IYThiq((cjh3EQhlElNSI"6N@GDRflHdq4SHIc4[h[
LEhIr6FHIYYrCr@rH[63k'EakrZ2VllZ[13rZr8R)C[R!Xrrd,ilph29rMrk2M2r
fiCGCTdl@92R-aSB6qeik8&*8E2fMmSUbj`Tr9[VR,rk['rrcHhq@GZ[0[*b,Cpr
1IIhbXfrmepIq)R[41fmYqpFPrc,l(eliTqIrqjVrpmUrII8rIrjI2[hZLXr@IIZ
,c'hr-I8lXjBZrrZ4(icpd2Yrj[f(MrlpPZrrk2Hhrq'fIlcM2khqc51rHZb21hG
XfVcebBfrR[qlZhmljk'jIcAiP`XHl2hPVQm1I1fHqpHZ@[RepIqmiDkCmHQTL@m
XATLr2GdJT,Hi%"ccZ5+PkMQ@kDY5"fjPR@+G8"SK`kZc96k"UTe)0LUJhJHJ"PN
SbAJDPBaaH#2VGG%%mHDpU`bC[L6)P`#b(!%5A4JIj[IC5fAXar[2AV"$#8b)1d)
KRR9JTkh5XhFIAV[Z[*9K-`HB-3(&TY9ZX6@K8cR-ZTh1@fE6R[FC5jPK%bjEE!M
G(4q$iQ&K0+[)N`HPR,35-a3*F*!!-V3r$dS3aflq`'H@@@bYG1"aeB%IU`lX)fC
$cjVA&8VR@E-d0(0'KQ4[@--(F-K6di+)e-1R#em"FeB4k3XlS5$iZ@22jJB4&&M
B#lHfJAhdkaPE4PM8!Y9(dkQB(f+UUXMS%T[F$I3B42p4'U$c$8`G9Pdf'3PBZqR
LKC-@'kke!p'1DmYa,BcTIN)Nf%j-TN6f%G)HMbarVr0@'1Sa*R[jC1SY-MQBVa!
3bLY)dG2khJLV'NCBeE$`94@lf8EXCZ%M)Hr+'F&Z&Mk#Rbp8l'DEQYf`U5mbGS-
-QKD%-S8@[EpbBHrlpp[pNB2)GVK8fiZ&&Ze2qrQ@mr+"8IN%8ij0A1`2,8*iC8L
%EM3dVN3S@'&A)C&)(*Z-IpJ*JYDiM)3F(4jXEd[)Zrie@T!!B%4kq+B*24[%+Y3
(@8K'2)$$i8JPhT&KbF#H1E1FCB5EM15`9e49k8I-BI0#hP@hFiI0`mrRUUTdGCc
$D+U61Bb*a(fVH3F"A1%$%KNZXL4bY4[i!1*BHje#[""C9T%@&CFTTiU8bI)+Ap'
*'N9R(ViU"85Gle4*A5cNUZHU8Y2JUhQTiVN5TH4%4FQTXTU'1iQkY),!V$T9GNS
j8D(`LVG1GX3)[NFi`IHlDJLq-E#YPBRJPrpcN!"AMiK!"`aZ*X0+4Z"45-6%b6B
rf*2*BM1l@9!ZiAUc6KkYGET,8(3&HB3LAK$KVXpT6"lGhmPF$j9D&GRRj`IeX`b
mqli'k)S'G&,`49pjX9*F$P,&H+VX4+&21IQFfH`VCe3(2+-%fGKAGDd),Y[2[+k
1h0AVY'XfY3IML-j@FNXb&d,#3Mk#Y$bm4L-Y#bSM,CRL*L-Y`6T0#h,$VE*r*1e
N$!@UP98+H'bmjp!q5L#""'4L2dh0cR&)"@L@P8(3MiZrLF6IDQ##(c$DIle1pZ[
ClF4QR8#EDjQ#9KS0b*aK0@6elmF!M`E!b!-QNe"T9@pd@!m[3!&4p8LhkK%2Q(b
r0kFUV0Lc,cUN#*bk8Qaa0Uk`V+kG*9-%DA0qKi2r!9dEFqMKp&jPL0LY6S"bBEf
E#qXhUa(@`AKKlFUHA,ACmK8*Di-ZV&pE%bqXKfp`BFeY,+aI5eBRV'SKCFIh[ea
aYE%5ASQmRS(!EVBd&YMMCfp@B#'+*LDZ1FB)`*hR)$$lid%0`895%q)E*i`-3)C
Yj!LSqGX6,,d5F@@'+m1Ef)SZS#"r5'!Vf9L6f0KBASh#VZfPCKbX-+Qf4U+9&A(
QQ3[BT!K)q6jYBT`i0YiiK'q!#q&ij8+i%+C$N!!f8#32mh"61+p8*Jm'S3,Uc$%
H9Hc39J-9K!$4K$@+d0#%m6S6S-caGaN*AN$'j`@j2dM,kK*,(ZLG`*310XAq!k&
11V%J,I'-fBX'+2R5lVVXb3RNd"%PEl#+&D3+9%K4U3Yep%6S%k)BX0XeKl23Cc*
LYbXpJlP3S`eFqhkNCfP16`kaJNM,A[YhFZipElG(,QKA8)3M2)4+MNmffqe)BTZ
bej9VqZQe,@dphlR9FiZZdj0Y,F0bD9T5lXma,hJQ5!p&[S`(YN1%,Vf"E-ATEL#
5E4aCqFhHC#lpJF%dLDaTIl!9S3DUN!!$b5p6C2hG+5q!b)i*dkFTkE+K!B4ih$Y
N%N)ID0#%2P"TpRma"CN!!)-3@Y0m1(daFrTL`@M"qJT)p9J`6C94)'!F*[CL[-+
-SKTE-SR`'jSHU-4U@SM9dU&Ua+SMTD110'L1FNkZfZUQK'pehj5M3LN[-%IYC!3
E,iTUGrR6K,Z1Y0I[,TP)&(1EPZKYUU*24@`Z#mUa`EM&T4[Y[+DcUSPUTa8PR,A
8cThe56A1bPBjUd#)dGE9bGa$c(LM1&ff5PbLL%NLQA*'*$2$9RNL'l'YJ)TYm@d
hQQ*Uc0MBaJ#f*iIVhKK0%K[V@PcraLkN22TPE8ihC$hTVYZ3!+84"3'%a8bJ``Z
-6@LLf9T)$6AEk%TL#a'3!#9N2M!@2*!!db%pH5-AIA-M3iSp[RTI@XX"Hk%D`!l
U!X60ZGZ`9DrBDU@"3(+HPcX[FfC&rFjc(+'RL'KTbdCeECIfm!PQB1ha[+9F#kY
!iaKbPiaY!3$Ak)EPmGPLZq2[M+4CE&9pc&a*L$GiapNNQV5"c0L,BV&6&FLU$Ai
hq"53!-`NCLKPaKEZl[%dGYP,BEQ8ce%9TMM$&p49S+NMaFE+D%-qNc,N5A2Sb#*
Z6UA"bD5E$(m`&#KN#KM23$Eh#'f-U5JFi5"N#JUmX"j,jVTX#51UB3%j4)JdQ14
L6(Q-0EPE5+(bm4qa6(2!L0!"$"(6!XQ6XG@$**Ul%@$SB1C$kTc(1dFd9+U,'[e
PMUpc5L*,M(BHjPr!9"q'M!&YkZFCA-Q"EH-1aCPK8cZS2Y2jq1$0QFiPEHAZ5SV
bLc$K`RaDeFS+'81K58EJ(3)L-p1-Vh8*`k%hHT54(iqU,pBNibCPMZq#X64!CSD
!C!aTGM`MTqCH929#BDLF!DiX)P(`B*)clJC`!`bd615-#RZ`(X#L11Ei@+C@f3Y
QMdcfh!`DXQFfa,(l!(I*hN6c,h)$&4USLjV-`S4kP![A@JLj%qCrNq*IN!!fQ%[
rVmhYc1dP4P!V+M&b&j,A`T5*Z,*!iqP8Y"HYN!"%RULV-RAeN!!jAD"UkY2"3r8
)MN928[+RKkRjqkD,Xh$dbC!!F$8FFV#bifKclSS-%KF5H'q8'GHBFX*aMVVb@kK
-X#SF%9%",L+"hVT$H8ref1ZpD8fX@)mhK#dJPqhc,l*KZQ*L45+J$d&mSVPJX`a
hMCfYJ8&e,1rNBKL,KpM@lD*!6*ZJ#TX[RP1)q$[#3P&("3U66-VKAqBf5qAJMLd
4+,83dCGq0lpJfA%EL9+'40E4lUk!5#%CkI2%"ZLb-+$TKie2X$#05$*lSJe!Grr
4$DJabMid@VEcVHH*$*SHLK29)JPZ'i8fdp"BIj%,+QRQL@U!GNA&qKA1q[G8c[V
cTETkfRL6e42,%M$5&)8q#G*8S8)#%pqM6*P(98&4)FL`qADT5Ah9pTVipZkXCRX
QA8N%MDi#j3ML1GmdpQ'M@CfT`p,$LH##afA8,e2Ip1fUR1bGfMZjkVHhSETDaj4
b62Ma+dj,083"QmU)JURfqLXfE,bE*q"D03PS8B%(9FjGScUCi'k`!c%&3Q91KXM
3fNddX16bSEr5LVHG*Kh5*Q2T&k3NHkj09-M6EA@4NJPbaUi+0&r3L-+lR*@40[`
B%j(HV+Meaj15GehR5GIGiq6ZqANelV'#XD3M+8Z%f+'#5GF$"H*!9"hHKcBP0X$
%1b+1NmFUGG&ZHM#CbpLZNehaqXpT3c`iIhjGl[Q&66[1kprYXPf5(!%f[@'`j8,
FK#ZU#9!2f,#VK@IMdPFiKV4NJ#a(-b@C3""T6JBccqX)4F-)p@T6d-L-%D6UZY`
DAHG"XhmX3F38T5qfpUccl,jJh)["#P8S*8XhKmdr$9HRAKVL"M'SA#Uj6(Q!TKe
YE",lp8B+TeaU5PqF5-MK$hRJJ"%$3[QZjP3449@,S5LNQ%mFB''6keM!H!lFb`L
3!2cN9%hMJ%Rkl+rB29l029jV&bfCBUrAdAd*rm3I5Uc9VMRY"CA6YM#RMF!0LZD
d%D'bHH'djV52iTb'k4YI*DH*SaK38P9!QGdi#!keAZr',GS"Xr$cI-KlENBl`"Y
h!%d2FU#N*S"bI,8!b[B$+B"5Jh"9QDm4@!6f6!"62FM2r('Q8-T*@[Fq5TKp(3Z
k&-+Y!V'D#K-+d@1l,h$8mmkVQ,+AQrTe*iId%1+6'EU6@5!(DUS2CfY1YM31)fk
G5dlQ98"!*f&ePaiSVU!%8l5r8GUTk`b6[PC21JZ@jS0J#'4M)f&*$D`2X!C46Lb
,SI+XZf0S(VQ$'B9B"Q($9SLELclK%%M$0`Tqapbb9Z8@Mkl)X2@kjKBb"+k%![D
,QPZZ0eCQf(`(ZB8#BMZ`*9VSVJ(-Ui6U5m)EK$a$Cmc4RF%#19,ZBU%F+HFUhAq
'P*&M5'fc+S30cP8Pm$BpJC[0,)(GKPXmLIH%[$qHV59aV(%50qfL*!VAkqlYqE#
4Hqm@KCP8el8M9h$92ZqQ'FfPp!QE34`Bd3jm)Hj!QPkSGLN,eQVL"X9P)9mX$Lf
FqV2b%f@q-h!UHi"$kNrQ5B"T3i)44AZB!Q2M32je[4MZf"JIb2rkFKl)(feF"(G
N-0H)Mfd%e1S[m@@ZEK@BP!&i%"SZ6R$iUL%iXM9LHP[#V+84`,AeNld+qf4)D[B
aQ'Y94%ij5*&D%LC1PPa4Am#RA(TdK(LH(CqQHJ$#R&p+i@6aQ1&$#pmi%)A8LBU
[C1QEk$U[kMSVVL%3@,,d(3UdUcUAm-iH$0$J`"#`*&c4`PhaLKC),)h5SLG"aXR
bb982GG3Ir(QS3`[SPGC**(r+`E+d'V#NaT(X-CC"%TPplr%"(,D'"r*%d0981GP
1dlLT*Er1,5hR@rTq09[DSMe2kP&q8Sh$iJJ2)(N0&K@kKfA6UDJ-SiZ8+Hfmbkj
eGD"V@0APelT1SkY(e@A5ZUc)5Ji`-)SZ4HYk!ef2UET'YDi9k&SZ`-UkdV3Z0-j
*Ii'*F"3IZa[N*VTHYSM)!GlSiT9+R)Z2S@MN-cf6)+hTZ"He)@hVJ$DNlAqS$C(
-G)XfK$[5JpS3ENYrJS9&b$MCUK(R,C@D$$C`ie@V($$E8BhhDQ(e')A9!f3S+$J
TSj'@1hZk3J[4Z%P"'e'A2#P[b#8b96iL"k)pmSV9J-q%$5,-i$j%(lM#TqcBNc,
D`3**Mj%#@V5CGICSRF1XFaEV0&QMr)NZ9#M$L8fF6U-1TX#f&PdGUZdPZMDKkh5
Lbj,S'N1A0G&9EZUmTA8qMmih9*f+UM-0R5Y8RD0DCa@kENpdGC',p!-EXr44RD8
rBPFT@DV8kiM)L'IT[lP-,&d!5'IQ&ApHFV,i!,&cVSf4D)*EA2k6dpGr8PcP1p$
HE[59hB4D9li@$26+0NB`Q[EXNlf'I!)r9E*S@0!U"q00#+KHHMp8-fTZa'5!lbf
-2N!IHaa!m'L3!"RdSZBZQ24lXdaXf'2f+d-2jU,blRh`@6TiHfjL+MC`KjKQh!*
$d!#-TVhUi)Cq[$R!+i`9FP$rF*@+"If)Xk!rVSB&c@rF21PQUbK8EDClKGRMC9l
A&#CUpkH94rrbXd16)P`#YEPDaEir"i'RBC@a&`'$cVb0DD),j%([SDY-UD#b-%m
R6qj$P5GhZmU!$PDq86IFi%mrI3+3!*ReXIPIjMSN9k2eD`8I'kNqQ%12F80mPNL
qUal$%hd!E'm%"F3%*KQ!FT@rMB`jdIfhN!$i30X!b'-f--md-Qdm)`1GRdR6IEL
QR"#KZXRe!BN1dijXkNlp62EA0!8r!b')#@h2D-rf+Gr#Tl*b`fRXNApL6iK$GL9
#ir4Jb8ip#!L4XTHN&+Qjh-Rh9q2N,*SiZ@UZ2@A9VSIrp-lk"B8VJ!cL`[AkbB5
jecAcfKhe9FU-c5$d-leA-eGQ6R26rA5l+K`%3RhkLFBLApQ!*HP49XNNVMDaDNB
m2kS+!PAHQ'b#6+b8JH"AL$"VBYQ0I)lbD1i[dN+[KETL1b&%YR9k&[pm*`dq48-
H-D6%%G'mPRGpb,V@mUiEc#J6-cTj!bP#,Q2KD%hX@8"NJ(IQe[(8X(P%8r9%m[9
YkZlK(4Y9@qf-fqTUe3(@Z!2'+YRUlI9XpD-kRSVIDT1kB5@TI53&@0C5%jIT+Zd
"U("-ZpKRLUMM#pBa)#S[eM(""frbl8SjMk0H8#cI3D0XqV`+cplPmdZdH)eIcYF
Zpk-aTd$S9iHVR4``EfAUQq,$Tq[*H0"c$a'a013E@+$DhKafc@3qaa'[TGKk!!U
mEPAcd2@kBja['BN-),AIK'YQ9+jCVh,0HP8bilFF-p)R8[+e*,'Q81kA+#Jh2C!
!FVTj8r#Yj%(Aj801D8pHMYXB,eE6LrH6+Xek-CbLJ-Ik4)-Y%F+-DccAN!"SX#@
DBLA#JY-c-(bK8MKNS3U!'lNbTjRUQ5HE)DLJNp+a)TM,!E51D'mr8B6'dQAaEAR
1S-(EI0hTlT+j4r@QKe1lQ9)H0USF&0ZGDNQiKJ),BRY6V3`%F`4STNLaE4J'A!,
9I$lP(*XbAlKk+TP`qe5A%""MN!!MBRU$XUPDMJUNQ0j[hS4'a[4CY%hF`$[)QMJ
H9)%V(8!ZQAXXB8+DfXf,FcV)VQD,1L#I1G90,&j2'Xmkp-GATBe0`p53!*Bekf0
#$Z1TL9!FB#iS4@F4B"dQ!G+TS1V#Qcc4T24PiNJKQ%G!fM,"h2p1LJXaFfIm%@T
6-kV*YEbkr%Bee@8ZVbkYp95AeTZU,MAbGA85PaC6ibQ3!&A(UP&+DGBRJ@`jPQK
)YIT'hHU$LBC8c,cSABhQ,G4%#Ff4Q[ARR"G"!*fMaNQ+A891(D2KaV4$(d[&T@U
Da-fq,BN'@P!6E!kQGZX,1eriq5,!&bDqk1H,'&m-@r)#H8b"ES3TXq$c6T(M(q4
BrGidI*2R"8b,)1"2$@e``C-DN!!D+TS#eC-#0C3#C8q"1Ti#eC8#G9K(@FL!,`h
l4Lj@a9*ZMLRE$'$B%X`ZM%,aSB@kP,rVcZp-lFjr#Tr!9#%PN!!55,X+D3I5$U4
IKI3$k3FbS%)'J!`!D9)K68#DJ1aA)IZ"l!FbTN,'J)`"b9d[*dUNiCJ!`S&cP@h
DSi0SJ3"4p,@Qiaqm,8!8[8&Z')B6i)UZ#,QLT@fI20E@%T!!pq80-i3RGDrNdk+
N()02fR4&S[V8*&39ldYVEMbe4aNkIA06Kj5KBcFheDi-Z@jZkR&Pk1M06He5KM,
UQMVdB4T0ac5)8[86)9a[qf4kDPBi)9U0A(Sfi9*2A[-3a'dV%-HSXAmB%flJNcN
!83M+AY6d*iLQ2ffmiH-9dC3%64S,9FdKVp"R0HJiTFYc&XFN[jAD!3eLHM6F!Y$
RM&hdc9+kS-`kN@#9bhX%Uecqe@TBjBTi0[H(GbGArGAXZYQFQ"62j[k`j1@cZ6r
-Ujr024M(jKkXP-dYR0$C($AaEf++q(qLV#k(@&fVrB1,9[rBrkkXlL*MG6R9X,U
FIlGC(4TSj9-#``,N,8pCmHed1erkTCm[!c,!Pp6-35cl@H-1@XCNM#q(jI$lpd-
Sp5-q,j4CV3R(YU*"kF*m"`Ua8%DD1Nd)6fS'0N9&#qlHe(SBRa#JcP"B-V9#0QL
@%(YqUA8Sh19pQj&iJkhiU$!D4F(BYEk2UkYGKiMVM)'Dll(rE--rQr%BQQJ,"D3
TGj2Nba"D5B-YB*2*6plf-j!!dp-q,fpZKDHr[P%d@BeM$bE1(KkZKMf-T96(HA,
*j+T"Cc,hEm@RAUS0hY!N`4LH2&YA5(rj1Ek4Tp8EFHjCrMM,0''Ebp%mIHVSMa(
i@rkibbDfCdL&S2ceeDpHIIhma15abH$Ndk0,4YF'YirD4V0'rq*maqM&dHZMei+
6ScmERAAeAi,r'[cUU%hbI`!!+qY"4%05!`"bCK"9#bfR!0&XNlIGT9l,5TCD1hZ
B#YHk,'XYE913!$3%p@jjrmY#fR9EY$SFGfQlZa6krMCYJHS`id),9N#P3!JQa"L
6SiM+B)45hfmf`$M%N!"%N!!SjM!*U5#9!1-Ka1Na$2[lIpqpGqqffrF6cjcc21G
j,aYY0dP,N!!!34!!3D!Drfl3!NBMIM46(3956*SD8P%I6-8HU9"'HRQ)$-jrKQA
m"P1Lh)U!B$cXUI#*H8eLE'ej(-("Q`c$GfMKiD,1-f,Hi!42%bUJb,r"ZKhG1Jk
IpC8p4Z1`Br!MSr&V"[j3kD8KVUN%bY+,rjbA1q5D2YbK43BrdV68GMcDjFF`Iq`
(fJ3-9,@045#lQ*MF)G'MKQLqjhDRY,MGMl8[D'K*kFeXE(!AR'`)lVV+h-Zbi3[
$4D6+1EJA,G(CS5fiKEUB82'D3`ePh5*SlFqHYaFLE,Y5'c%P)AKYaD-iHmKB'@M
9G,CT)"i3pG`KhhXJ'%B(XXVH"T&$UUf#BahY3F2P6p##MkF28`"j00hNV2!1-@@
AfC3pGe`6A8A8PF"HhZl"4[iN[LKX'XD(MJm(2ZciD-0(""rG#AIF6HT1bkc0M++
Z&rUU`8e@G5a3&RTLVUqA+NUmi0ZA0p0rm*8p@Xj`&e[i2-jLY9)5XmkPDf%YV!`
[$-eN,'BSBIl)l6lC)1rDl`i&r9XEVp5f"&1m,AA+qampkhDR0kDH6!qk-l0-lKq
TiaHdZr-bDheiApe!pkl3eJG+0Q2,p"ANJMbc5rl02a,)+UN0[+0TQcB'XKjXaqe
jUUT(`Pjd&c&fY2iG+U2Nh`MKF16Al)K"2R)@Ylq+HZ6Ar-M#hA4NBCGmC$jZa@K
(&Zj@MRbE(8PK4`EiXKE@dC([,Xphj0[+NH[BNIIP)eM@`VP4Mec(Mj3p5dI+V2)
4,+[X8V3MCFqbEUhCkpT$VkjVpjMp@Z(N(H2AA3+SGKXqESG,S)+aM&M(d+Q)a0`
9CJ8lL5&eeG(akm`S*Z[`X3,)4!Ff%q2BJ3Ydi*EcdJ2(aLpbS"'BKSmU1!ik-)[
BaJiiLKq`M&rh2N#Rmh%GMH9'GU"92K#,HX$FNlAZdYd"E4+r@H5J'a%2PLUY(m)
Uhr8DTm-&paQRJpE@4'efB$S"XCApCZAiqrciSK#'Zk`k'S`0E1X$9&eXDqD`fJ6
RV4H0`i'G(6SDlrAXJ%#9a3iFS32ric2R!b9@(,#1k,0h'HHa!`QU+RBJ+GU"468
ii1M6CamecQ8(G2R!p9%2M)2k)88Ch*4B15Y+V!SVaS!9SaNV4XZX@!&@M#&@X1-
eG!3G0ke`0d!$mBXHEdmQ((HTr2*Aa9mZ&+1mV)[bFQlaPf@AE#qK6S#k#G4QFCc
ER8S1FB'63jad$'jbPqS82CZ3!$LJDG2cJ0)Ji'S#@H[-c!Q@"B!#kZ1kprNM09Z
iT8fhD6Ufe3G,PCGQpM)XIER)8IcPZ[HP,c&S(&A&`%U`aUSq,UVKMiUB82(Y&Sd
V,VV%'Q8*0G+Aa#$HC$BLj+%dAY4JJQN+`e,UBaJD4rX("[6HiY"%33ZTKmdrE!L
f&&cab`liZcLFQHVfCkB(kIdee4&25YefXXlG8RFbXk8"Vpfl[0I5S`[[6+[`e+M
#8dPi+KG1`6'i,JJ-E01kR4TJ#E$"0JYNCK9F#DTl6IS4hkZKT5ji-UYj6G5QkK*
[D,K5((!bIlIKRGV8j%K9'Dm)HUpK@q1eV*1elb4A'JP$#SD4LlY5Qa+XmkFhARX
8iSD,KQ1%6NT"Y!k@AY))[(E!44L0Z82qT%[Bd$@9f*m!)QH[3KG*9hmX[M["`"E
crLZ2FJNfK8`&*e2hqNpQTLG(h,9miYjY[*TmlP`le)KA2CBhKhKT3CMU45X-0U8
GAHS99KaGiYLJ"+N2r["9SmZZSNN)D)+ZQbialBL5CNA5J#E9#mYN&8ZGI6CJHVX
@+9f$ES3!1VVdc5#Mdj11MM+1GS@2MY,XmEXD1hUfDfhL#6&@*fiq(3`rhZHDLSk
dSTiEZqEPQIhhpeKZ!MMrm*,[i5JD*([MVNJhK,BpX8D,T(64B`J$iJ&la9[D`EY
F!b!X`m0JTF,%hX(5$XdlC$*qC[BjmL!Je%4LDMm6BfJ+HlR5V3fQ+bfebG(BZj@
m+&Fk)PAD!DAek%TE5HN6'+5,iHU8IRMa`b"S2PD9&QJi9(DN6!@KS80P3S#lA(C
Cd4&#PY`K3KGI9ra%D-T!%e1hJUPV%--Uf@GqYlA"&dbQZUPbF`3e68BNkDd#-84
Ld4J'pjSD'j)MPhra(6qGcmcIa2BfQS+e@BdT`HUfhNYE0rVpbGNk2GpZhb&K+CP
ec5iL1S+,qSCbqMHUr,Eb'M0eidC"pKi8F!F)b$CbGkCH-ACIZ99E5JLqQ"#F%4d
-bAYY5'kRafb'j2d9qqpbGEd5PU,hIZh!%*U8)la*56k50`1%E,h@$*,AVlL9&!p
$ECd6*9!mI&pjA([BF*1#j,,L1f9%Ga#L3fhp8Mid[d4S,MHKK1cC8bj*NIh6M#"
lQN#[M#0lpA)ID'5[IZ[N)IXpJEAfIJm@iZZKjXGERPY15DXpjB3)hP1jThL3!-X
brLrlf8m2I3e#4kFEHIKM2H@XmI,5Up*EN55lRek3!',m#c4l8cP*V)e'f'B5J)"
+rZ,YeSHbbNiClpNpZq`8[@E%aZCi!&Q+i[!&"6'k"dX(0!E@Xb%ieR[,9UfAK!1
jHT!!mX'"j@d+eH-%+QGbpMARq$,X@M,'["SAq`RBQ&F61'6-Qm1B0dGPcCkIjQ-
H+e61c(Xf`maVTL"P'&Ac-@mICjk8GIQ3!'k@`VJ`h84MR)eYIlqSe[K!S9S,"HU
XK"C)r,+--Yi6+VIURACkc#j(!(B+KCl%[,JGb9j@VGdIQVe0Qi38#rVjUiqkq'G
aXKS%Epk)AGc&KK@a&0PlA*VfQEMVS@eDZr%I68M2kZScrZ0CmfiPX2,QiJ0$'$*
0h-U'E&+'E'*$B[+3!+YLRZK&U+5p6hr)DrcG3lA'haP,N!#N8N+T`4l02b!Ha4H
[QR,Bm9I2QK'BUE#I&[0QHa%-mc,KMq2BimCe#+UX`)X&aN8!pT!!I-#1,&TZ4[K
H#GHJFXTiQ"KG)CpU1@)f9%fJ8j9qhNCkq5!Bp9X`C51P2GLU&XhA0da'G+*q!b#
hKkRr@eHRQ%d,lp$&(9ML#mS5Am!5GaM,XF4XYTL&@-T#5P*$NV*Y'EFT`@TXKd$
+[%6f3pZKb'Z+N!$AcTT[X@MY#'8Rr!IC9k[B&k[1QN82E3S!XX9q'PmY-+jN!pj
J+UpN`pjJ+L2C$pAF5U#QCIc%0HJN(Gf$3[(MqrNM"GPcbkPMf6*qilb!PbTNFRN
)*!@5ULR%NBY(PVK0YrGEq6$q!N2IbQ9"6M`@8!MdppXS4)p"BdN890X!T1qHRBG
ZBUUS+U@LAXFLAkmlBML0e*D2r4eB40@lfl4qifB%acBAXZ!B1RUka*hSAL,NQb)
Mh`Ne2'AZpDGIDGK@A3QUKqa0QrY3h+l"jMjU$)r5I6bJcVEaJA+fQiKGa"`Lb!2
Ema(MQfc%Z%hG44p!h5P-h5QU-Zpea`2STKQa+8JG@&#XM3RkZ92(eBM8SHEbVGk
h$B&6YFMXf19%rUFp`K@9q-H8'TEbH6@R0BH+RUr[,8d"YZfThB&@G,e*`1X4%-D
IQY&*9IK@MZH)[l"9mi6pA9#!G9TYVr33F9ji9I2%d#P'LGG)'JqhXQ9r4aV@5[Z
UVfTbphkrQN,FKc3mYPLl+8+&AiZ-j&$ap`-mM*Xlhp$#F-'h5YJD)E)hYeJ`j@S
cUPUKDKP6p@S1e#Q54CY-GX0&Z,8H$kD"qESpPp-M(!Pf1$cBa'mEZU[cCGE&VE!
RDi2(6+#p4&JLAeGGQp*G&d%(Sa!(q(lQU!E`hF'GJ$XIS*ef,QB!c1D*&#UVRCN
BMm,%MKLVLL)L0Raf6e1YT"*bfXih`f)N(aQrBL`qRq0*mNNVEld*YBaT&Qhq*#B
i`CLpcp18IY#*fG*$UkJad0Vb%$LJMm0QAm)9Ep9F)kdjq'+J6QH0d6iES9B+dDk
TVB8Z@i88B)[#Yl6KX(J%LF+X#cNm(q'6kUZ`[lNU9!qQ&eL&q"3kN!!l*,[dc(c
%5pUV-hQNbcUeBPN$Qi6LU4AH"XCfqTl'UcCrYNaXYX0*krJSC*0UPXQ9eMCBLXC
e'D9L!5bB!&EB&8(PV)(Z4m23KJmlZaA`''%GdJ+fX3$-U%1(2P+&Y4FME5"R%`I
$JFZ"If&S`6Vc'Mrc!"fbb(&Ba6XdDpiEQK9K),Zi9dZ%hY!5pXZSiL-Z"lVL@CI
AYL,[%%FL2ad+8kJVC2E[R)eYM2-q)U4V*r3VA5EUD2lRL5HU#bpKQ*f'8HL"&-S
T#df"Q$EM')KT#fT',aXb#JN@bL!3p3lUIN#6rJF!(DFHUY9qB&b$3`NfK@T0`"`
`!(bkPkQRG10,&1`P3!369+ajUjL5%AU"cTF%3TQ*VNh'"aPJmb")I4c'alfU`K#
kRS&NkjR55@cJQT!!q3YP-3#YD%&9T)BfeVRiiR#P8S$Af3T`(+N5Q"5kG6GYTM4
R3L9hp#`0Sj-aG'l*5TQK5aK$jiTEQfAS%TQKfd*0M*fh3dKEF*E#c0[j!)#HUcP
$II(GIGS2T-[!NMF`G6H`T53a%(3eP&c0QKFl2mJQ#iBT%8-ZA$r-(ij2HqR+P"-
J)Vc"S@3M9+aiJE%mPiU-hmT3ZSI#Lqae*j!!NJ(h[J0b`i'[A4e+S3SAd,$Z[*8
d63NKb56k`YkN#%$b#)@Q($a)XkGBb$P$UjFfPUai&k"ikri$D@r@IDa3Dr1NlN`
Zi'(j8CFI(E5&Vdm@D9@G1hAS-'&65'%J+kD*8E"@[1"U*3I*A"'aCMYMU,hc$+r
k(ik*)icR#MJMX$9+mq1T`*5K-`LRXB0Ebq)D6`a54AAZ*&&b4A&'+b$ePH4K#!H
T2ihL6VFaKYFbKQm$BUq9@Cl)ch+JpXmCD[mFE1H)[4D)[CBc[h"IfTP2M%6adSd
eYQ!Kh%N0X4ZZE#jMl8%NM0@3!*2BVDNXTSQVB2+fBNkL5Q(cTcBf)bfYbMM'Jh5
b4T%QcbZLD(+(`RJ5aeJIN3a3US"[aG5pRE-Ujcf3!+jr02i63a`YCd4TP--dP6Z
ZQqbEbrhkZHh)"Zfr'Jie54Q`G!N'cF1,BFD'@RE$'-'+e#B)*B9EA+kS$8Y#dV"
-94X@aUSL2YKr!'3APS0T)q5d`XE4D,6#$br"*(qNIL'9)AaZ&aj2F+IJJ5KIZXP
HBJj1F+@!3@-D2`5caL!YVa-S5%Q&#S1i@b!@qID`$5U8$5Ta'ekkT%2[ieY8BSZ
MH0c"9%T3)`('V3JQX@e@8U+Sl1Ef&1YNbb!DXj!!UYi6318lCPD"S6Gb`F8k!M-
X@(@I[(L8ES%6-'F!h!lMb#!$qJDF!$lkiK)$MMdbdA'@L!jIiIGqLF*5,8!Y(TF
GE'pUHQ0$-,N&Ik9+(&V'hpI@id%#G$A*GJaYZbN3`C,m'"#3!-Bd[j@fSSGYCR"
LRDVU6TCmU)3lVHc"UJNX"B)!V8kD!Xf60@55G+a#NSj459)Qb%D@MXP(P[l-YMN
0aF6bD+6TFZGK%d'HmQ3DK86G'SeJ6d-+"[rQ@IHZBbGfD-NQaYq(kNmbB[a*P4K
rjG3K*FBI5b-aRX%%N!"La2JN5E2G`p*J*B9Q$k91*2'1R`1(R#5[,mdN'56jE4N
LbBXTh%X+Kfd+0d1BHk@%Z@I`N!!5jYi-%qD(T2[VN!!5j[(cc6$k2@,dp6C'&b2
2Uk+3!1GH+AQZX&akD&damVcIe3lb[0H*21q)hShkJ*2UhNG&UKrU6NCR8PfR*#1
A&L2`-Z3l`)Me$f4JEe)'L(99e,iSj,TA*YHpf1JaJ'8P#VQqV*H4kc59qC!!%1Y
*E"Q&r@5F!5M'%FeI)#(E"e@bABS%Q!+4*L,Hq4#4Q&cY3QZf-e(IB52ULaqLa&A
0`4FR)I3R[i[#CkcLK$j,EUfLU4c**22A-[*pV8cQEia#jR0fK@NV+F1F#IkFIUj
NcXidNrbD9LjZI89#p1rUN!!f+)cJ,T!!N!$qJbVTAka5dK!)U+j5Y&RCdY#!CUb
e"3H+(`**GCqdBR`MQ$VNN!#Um#i&$+KD0NM8i169I@$9I6l1cQkT',mZiU@Q86#
P2d0"K2S5qUK"jdBHpYZ##(`*,95BrIfXU(93ZST9#kP&)aH&*Xb$#6cG$F$L#2[
U26QF`)If(DD!JLhCKB89qLrEAXR+N4Q()kUKKc5%'1T*I%4J5c%8`Cc5GNEbTQ3
8@2%T$NPENF&33kmde#"YVY$SU%+R%6-S'Cq5CLJG(bmVb09cNS30Uf-9B!XlY&p
U,Za`Eh9KKm#B5rR#$NIIZX66N!#8Y"cCkF98`aAeK"rUkp!c4'XL#QHakVM+UX1
%i[+JA#%Gq5X%4D@'&C8DZ9*i3AN3"H9"Y@S+1c-8L2#b3-4'ZA%U%XPX")8KlQH
XTM$%4UF`4$XCGBNDKPLMX0hJ&)CB`m)3Dr+&)GDS&8(LSSFKMVl&Yf*+Me@,Kq)
f$f#ki9MM"L8Fi9($%A&p`ack0fV1$H8e6CJL-JqKL5B@QML"d%5K8fJ#U@X)6p"
%h29ifDH%*pC,`a-`*,1"-D,9PI,S`K-`-00%@dT#&)CQ3K4A@I"JLUZ@K5LfX4$
&+0F*DBJL-%B+AV0!KF#fUT!!E-@$&BCkJK@MP'$&Qm6U$!3VkNhGcKqXN!#EL1G
Vc'N-A05l5C6!aF8-%b9Uq-+VKLm8J&J0AhJIX2"&IBj$%VlBq$mPI,&aA$hK#km
F[JJjK5mi%6p@)H,(U%6m!a5qH#cYiBYkd`dNi3Z'8++5TUi%JBX9qJi8qT9+S8F
a3S"F,I4&DU'2DpBB"FL8KL6KS8QRhBU+#EAV)85JJV5T89!'@3mT2mUi2J82L!T
dT)FTF$#U!R+B2Nh,Vck@9+#Qk1lVKI%HhI0UfDIqSY#VC8rGN9Af90QRmGPPRiS
lV0i%%ZdhSa#Np)Lae65KHM42bRdc)(UA)Q8h(NMNL88S[*Ufa6D&0m'Rm0SYifq
)*eJKXSaIAC%S&hI%[IQh'X&@eL3aD61)bL#Q6+lZ&T0#CT!!URcDlfeXQQ4BfCb
jq6qjq1E@32b%08pdB+YihQYSC%DdX$mXRR!9PQkakViZ2PP33A"-f6S`"0D(ikG
89F3G`rEmbLJ6RRN!D*IEI3A1a(mb0GLL6XT0EAR(&#3%F,[T4Ij!PF,[GK54EBh
`4(@B(9Z-eBXP$&J-9Lr1)+XA&f1e!b%EKNb(4f$BJl2CD4Z`HI(rSQcqCR%f!ep
"lDGHE3'Z)QNdBpc1cqiY%NCX!EZh($TfCpmVXpYT'l"lbrq1l,k@2(D[)(C61LR
-IcP-MNr0UEaEF`@CR!Pm`!b2)JN64LJRiX-H50HX`b0bdq-B,)h!V"aFBSc-Sm"
0lPI#B%Rid&fp60LEjh0J4R@-"4-%N!!1@3e"lA)JU-2-pmlF-R)MJVSA'efB@$!
QNDiP)RF&+J+,SlTSUm4&fe8AEDqJK!Q%D)SiZ8Q"K`k0*JBa*c`e0#I89()akkm
XF'HA'Ecr@PeQ5l!p'Ah6h%c,'Y@NfPYD+i`*)T3BeR+!KZZ2-I@0I`b9pqNQ"cT
X1C1R*rBqQSB(%%#B1VF9FCY$8m4BU)RB1,&#*i1fDiD[ammIm6&Uf"%`j@U"[DL
q1q6U`e6KELe#L4CKTIVLU,DT5[@eZ5+8&+"8bkLC@cTZG#8p4!$f(lPU-%mhL69
hIGDBTmP(SK0j&A6!hKr3+%f%%NqGQVmL6i9r(JX0rG'@rNR0i),N0S0VUN(J-3b
&$UJSp'MBh"&QU--&MaZS80"R&E&B+5#-bD4k`,40BbqG#iUp@%'*5!T+%J9rA3*
R,PKUprA&Nl"m%T()Dq)XlDf1T8fe0TCb42iZX63jH&c!R8+PbY5V-#$VL$%N0Q!
CPERP)cSp-1#Cc'-R8BG62QAE#"`p'+-J+3'[8,C,JPETVZe)#UP$a95+af&mDA6
+de4"!hmAD!SXb8!4Eb*QXL)H8iXilfKP55GG#b%kq#+@Ii3KkJNb6D`@mbZe$GX
br5h*l5BYlM,9`-bSBNkc+de1Fim%'BTFqa9aEji[P0eQB3EFCX%$i$Bjk1e382r
arJbicHUKm-aVcEV0'X9YMXe@hDBDe#Jm4)j6VELI9Z-kafE!G9T4HADP%JGF"hQ
idpPj[NX&I+cX22ZBmqaRcV1M(ZI*+d#(qlc"+I63[21XK`#+iMa9PP3b92V`%,T
29I6EXJ0p8H*!afEBJ4jd!M3F6,c!@FaFD$pcS4heZ&#9X8fe+Q26iN+E`HRr*lM
3qN)eLf&Xj`@r58eJ1&&N'9qf$LaCc*L49ED1"f3)e'C"M3f59)LXXKGTHXVE[3M
1,1BQHBSP2R5aBeYXajM4RKGS'fBH+MApC!-Yf1d%*+ZGr`JEJQb`4bFE[LL"+D!
LGHNI#$$5@-QRpkeHEM+'c*k)rhibM%hK4hU*#6Emi%'@a+%B'rRDUQ+,lZ'6qlq
9GA*[d&hp#RRB`NiA#Q&'Hq%ifa*E5kDNG,c5T3DBKZD+RY)P2IU'jqRIU1IRPpH
FrPYc4-XqY@MCJD(J$@cU$3m(A8TTa,`qGhi+H5Y0"+Er[$2h4rhm'fB&*HYN`ej
E3"%,k%,3EHV#@e14N!!H`E+N#aR3#-N-&4k0J["B`#q$'iLJ83*qql&p3qV*fZK
VU'Cc[V6N,-&AI!Nr9*G3fpL5m683ZNaA`SjNY-qqk*FTICHke-k4(#dBlSqjU--
9B@E,q0[VhMATQR%kGGP--V2&c'IK6eiC29K-5q-9N`RN@C3D8GA1b*DMdV)PiYE
0E`PM&@5kJb%F3TjY6ba,+E*(!ZCf`a2,J[H)*kcF,-AG%(FY-b9B'a@I8ZRr0@F
$E#S+$baDPY+0"1Qf9`j+6'*-JKXd,&VQ(3TZC#M,$AQF`cDe*q[UE-(fBQLEkNf
90pT0PiP`f"L8)M0R49er[kj4FJBP$X%e*TPd!"FYc3b1UB1TfcbL06-d56Vd)"`
jGGK3mp-9$T`1r)B5L,"K$MB-fir3&hfDi5*H&9*UZcfX$MFmJjH8B[,cCMB6C48
10$2-,P'dRp+@QaNXb)2$*TI,CGqM[HPk1Sd("&HrC1L!me"fL3bcZK!)0[1N,Bf
EUH*qcrp1P+T98DH("IK[L2H8hif#6m(*UV(XaU(TG`'Gd)hk1VS)(A#qLfPkGHF
M#0FFBkM6,Jep+l*6bH4"0F@mi(#kDUT&-I-iLEC,P+2l`q'M0#8H@R)K5&2N5q)
"8m@XP*-44ZlDR8d`b[[ER,Ud8&X(ZUJjPj1lbB4Qc$,q$h9)31Y(Ge&1QcP%aAP
HQKa)+T80+S%Cf@a0rCY&Fah&0YY(R9YYT@38`kR6%Dp&[1lZd+faqkDFeckV5,'
IciNIUCQ$C45kGY*V-X1,JIEUMDH`cNN-@8T61b1X-kClk@,F*(V+l8P!,3kb,-#
#'kr)r-mI0YZk+j6*R8H)IZ&"3Nj1a+D#+FI3j+-&YUJ+@2808qMIU#RcbQXU1Q*
)2i2*LcjYFe1+iha1arAakrdk9kM'TY#4DK8LCCBSbS6[i`SC*!Ta`,qG'ZlDj[@
K@JJaYqZ&AUSVCfNP[(Nm[!S)IDZY%iY%rdPD5[),hL8A#DNB!$TV4k9*6+Uc'0E
T5HC&*QkHN!#H4%f-+kb+Q*N&r6*YiFa-r)rL!Kc-"4c!eVb3!&ZP1lF[F"m0eJE
V!%P9SdKaB@XVdLc-54e-&e#-U#BfXHl'-+DFMmD&XAS"6)DGM+2LBNCa-a*f`lJ
8K-68U$b4[%UCcZj4cCQDVcQjVN0[@Y4EcAG+%D$1G+58+X$VrER+T1P-CY$,3FE
UQN&RlM!H)mrZNc(ffHr+XjDaZ1T$,QVFqQ3k,DbPX8iea(4B-@FhR61G*EdbG2b
U9ZhfK3(2I3a4'3#Hf`I@SY0fY5(J9Fb3!$'MK[G(P!RCSQ*F5h6#hI`XN9'(c1-
3J@IPjTVY-2Nl3Yd#bP4l%!k2H$6pNCeDf&S4$i0!!r'1bYF6-h02j6Aj+f@c06q
8fUTGd1YfA`fQNUDQaK6hiA4e)3YX,-"E@NGSkf(9D!f)SXQ"GiL3!&"-3El0L41
Ed9)3A-Z)R2)R-9*S'9lm@VRj0@jqTGcm#MFr8@jqJT[EP*[EF,08Z9Q+QrR+cAc
FA+IFA)HEZFV0A0cm@,Rj-@jZ8'jZ`-e0bXe0mN@V@Q'MJ3K@N!#BG`KPmp3Acce
13bkI,'LXDe&-9,jD0Xpr#6rV'`rQi8HFAECq0B#,MeD)!(0K@KN[DpPd`[!Qh'c
d&BPCC4X(*h6L4N@3!1HB!kd)YQDfD,,B$8cJ"JMF3!,,E!)he0k,RbSQUSU*URT
p$)Qik(C,K+L&ha3cSrM$0$)9#mFj*"lSPA'2Gijh6ZI,4%+DUQ#)h-%lNc6Y3$C
rJ31kUG*!D3Sre8H6-2VkEcaNF%&e!Lpe!J(f`[R8SY"F5@f4Nr!B'Y)PA#$L05"
MLckDT[-K(H2Ta2'VPHr2Y-C+,UIX5b$K"EH6bjT5#Ufa4Erd%h,U'$DTj(+`4Sa
0Z&cR45&f$"rKfarB"%0U613MT-CSK!PB*p[IV"%phL(9e046I&N09`VBNfBM8+e
+-MFY`I6[[jNT(Pqk*"%`IHdh%mlKJJTFG1,%M`h2RBThqAV&V@GJkJj!ePk@!Z%
i%b,$c(M8%h1`G4GYrIm(%qAbcFmSkGG9P*Kc"S2`!IA&N!"K3PcEr*UQTiBIfFU
-Rc,RFiS[-Mfc9PdJc(*GX#U06ehPmP*6iHP58rMd%`$T1402h'4iEXi,erR$mGF
e"aldcTQG%)c,!m$ThCR*PSSI2$S`h-d*S#PmSbZeNUh)9CTbJ"6fZh&4eCj0c24
9'jU!m1P52%CmAE3j)B[PrqJDANp`kA4lYeNI68)RjbQXPGDm#PLaS1Rj5ZYGbbT
-KBB+P@L)DiRM2ai&PN`hS!X6PbQ-U9peD-2Ba&!a6#`JekLJ)5Vp#%LmT!NF16N
#C$0$j9EI`,QpT#BP60d*PhD1'1l"#lPEmLPjN3fQp%cE![8)8cpX+28rRAJ%P9j
S11X,LmGFJr&MheYZZ[ih-df9a2ljCjHEQfELkjRqSYE+,DAccTkT#)aQ"+IhSeq
J!a99BQ1mPCSGZ0-l6p!PlT!!6R(Xa*mMGJBbb![*#YEjJQjF4N%'VX-4pE*iU1+
C(9V2mHX-TX,%4-0CI`L,1$[r-Pq3!1(dDEk8m*R6NG(X83I5[K#K&0V`D6c%XaG
L8GBhJ"KcrB@GXk+K"*BN4PY5EE#eaBBBRPFrkFD8rDa2ZRXQL)rGH8`,hidEG"[
M4hcqMQ1IG,Z+k+IRqEZ2FC0J&9)N[N!UpHc9`LrmdPmimaF,ahr5l3r6!I&'Rpi
cNiZNC2r1QH)alN6+hFlS5D%rZZ"X8T1QfIqfX-PS[&ec0)&Zde+5F+'R(,S8)h2
0E3L$&5P*AK'BY@-Sm[3Hr["KZNLZbU'DThb+YS#bep`&cNkKRcC$TIpJIY0bFcc
(j#daTa4HpBUc`BJN8YZPK#)r()ZNQN$LZ1,)"T&!V4IB0Pi(31U#&q'F1c`i0!,
A&Pj%kXp6MdZ@fb8pKJlripjbPBMjRY+QSN1pVM(,II8N0EU0k3f5"B2&MmhK"3Q
A6j)GXkQ3!0,-$8d))(GaadfAM`8L0Ih8V*V,Tk#Y`U"05N#fRa`RhrcMP'!pfr2
LMHNiMM0%eY)8m$CUR"lX@@T)"-jim@9AEK0HGrF`YBq%%H-&fG#UL8Ibk&+j&mr
rjrV,G)1,jCe1cB@cA@+G!k!NE28FQNG[4GR&i#VDSXbF-L$G)&6"A`IA@1I3`ZX
FI!U,CIaR+jBDFXX"((R"8MK!eBP-hTAC@TfMkqkpUZf!iUj`lUN3UDa[RP``"LC
%RF6'!lRPeS"RJKq6Bhr`*RhPrP###,Qih+lRZI)1h6""GBG@$8"ENEK$p#+j8hH
a*YKBqCLjEXaYTiFe6-Gc!(RZ)T!!LPHJDdVm&"!pNXLf!X4%qLS5K(2,eDE`BqF
+p@Hf"P1FUc55Aa%(+8*J`h1RmUYM*AAdFf#6Z&-mK@35h5mQXK&QS1NU5QUfDbS
9%5Li!QjSCqF%&D6mHRlN+VDBBCSiT62'@%dlB@C!$pT9!1RNM%5!8JR9&m4'@a$
MBKD6V6NA%TL[h`-'(hm19@ZBJ-6mN!$-dMH)T8MehePL,TJ+KV)QTq"$T&-UDEq
ZUEPbXDM`e`@$%T!!#ZaUlpq6Bc"!k48"Rp+YY2dXh)-(aIk%j`jYUNpTaP,EXHb
$KAZR[i),01c9$'"G%5D)G@!)ZF%6BT&rR3T-c3'-cc*0SBh0&E,UN@jS9cDXj'Q
X9ifd+35YYjRLK5KZZdS@4DkG'UmHZjL6GjT5+YSQSK1P8,[CRp6e+G+h(Hbfb"r
'lFfKjrN`rmq8%"(`(c-c@RM0`BR#Q3BEkK&Ga%6IV)LqQBNZFKEpIC[SPXCmJPR
D+B`bD`RmL%KHY@S4`bTYT"5*V(J935!@)Tjd8iYUFU0raaqXXl'069pPM%UT01@
3!$P3-Sb!0(+)3SJXJ)*%$ph$C,jhcb"!0&0KLCP0f5)bcHSKiaK--C&Z%9`4Bki
HkV$#Y*J),NBIdililDSBYY'E!%deY3UH*!VYC%V8K9&A&j,GZq1k,r[F9XdD9G`
ZN!"*q4FUd%*TDE63BXYV8jFR+ilN@lRj8e&#AC'FD-S)94,6J8Tbf""055aCE%G
!FBdHd@$X&aHXK5'0UDCH`'cKHh8b0HHhX`PX0j-)GQ#@+9CLcZUcKr1d2qLiC[1
'`Jl-#0"2Ga!C3LP'U)4q9'IX#c-#HHhk4$((p5%IT0%PrR9qi3#Z4,#G'CF!JBM
NF+Xr6J[`1faEZZcm+([P8"CKTbj&DFH[QYKkbZf'*9Bh%I1D8j8iS"bTH5&U0f@
GSRBB2cScIk+cJ166T&#k#)@Xl1)c9PN0&c10c%5k42i3L[hK3Q&-CFFc(EBKa)T
E0QNAp)P)8hH`e+m,DV9G[&+,*DIQ@bklf+AKIDUQih,9K6e0LU'(#+'bRaP'V,f
G9jmrJ&50hZ98E6I'+FMI#`#ib3H6!$5*NDXX6pp%qJ!UFVkXMQJV5VP$A##rT$5
P&Z5VrR'Q*%+1'QA)BD8,RY!GbIbLAj48lUh%BYp8*a&25b[2$VDS!JFd@@3rd[e
e8a'VL2S%&V%(*kB#$@#&f!N0i'6K*&lp5[66"Ee"bZ1aMc-3PkBL3hX1Mj!!M6#
*UI!1i5[4e@AjEh4CTMX#C988(2K+[*T$cTF9r04Y339HD&5RQ$-LR+93CKCic'`
6+ehiKE[aBHS@C-fXCNfBJ@#699#!UN-Z[Y6cEj0ERH"ZLEKpcZ+m3ecB5fihbia
aAL3h4rq5fJ3jIDQk#63bK2KHLC-JX&*3'k5iaYc8cX%*Z"EjGQVb1LI$ZB9Km(#
)G8adUddLN!#9,NCPQac2#ZK&2pYGbqFZLraXJp640*fp'MG9TMSP&6Ap()hIP#)
XGIjSXD"$kQkN!`kEZI22Kq4&r!!%HYP&cj5YmcK3V66rk3@8F&m21LVZ#Nir`K&
6,ZKqjTdPj(Nl9&bHLBf1fA2b0)N#139*RNHdQc(*qQkJAJ*LqpSH`B,4h)U2D"'
A#))[8ISJ!2"(Y%RcbeRM'`Z5)D$#`qE*CM'(KiRm,F&d09#R!P9lal,3P[+GT%Y
'Yc(FaQ#U#Na49jHKjI3i-mj[,FD1!3Nlj)2D'Yj!qpXkmF-2l"dEefj#3`FcfiA
dTDr1ZB+r-2YFI$Z*Bp"C5N[-[iX"X@J)8iT!%%dUJD"8RE2He8pI6QJ#QU,l!T2
%+&NS-S%(Zka5a(!Pm9[&JAB#`1d&3$P#M6+&R30N%+"VF#CcQRCI@a69l163fDA
,P1T@!8U`RqDNfpK[PhCFT*rReF$(4"Y5fk%'X#pQ"E0`k49Em)8K$i+rG"Pf'2B
bL5"h3(5CBKdhlVam+bir-1fbH#cd[,dTll,r(J!1!f)X)(3+2E'@b1VABI)epTG
bmqQ,jSl`QLG(M[JQLFGbRaHEd[i$XF[HfReVa8BkAL5r[-F8ff*QC!hI[-*rMpS
&"RH-p*adK#+b&$A)Z4VR`EPZ9&`I!XfCM@l3$EE!*T&E[pqRJ,S0lc5i&IKI"4c
Ih+d)TbmPi,Y-lU0*cdSb*CA3(q%!TX3SeGdbrL[m85fHJkRLK0H8XmMJ+qbFb4k
+b!8ad)-+r!$GGVl-3m%`64XER%b!PPUjPp&*d"#8A,U)A6#$&D"YXX[-TTHQIY"
k4kTdPLlf(MiZZIB6F0I)rYJ&K9EY*pS4J"DLGX3e3&qNfjfqX'YNK-(K5UV$(d'
KcXJ,pQ8rC6Si!qE8%A*IHE9G)Da6kCPVU)"8%a+Bm2G$SI2PIbSA$NrjrUN[,e[
#DqQ[TEDUUQS*2LcZVhe0D"'D,(YfhQaje[,3jem+!Ab82M20d[(2kmF*LiA(,4X
XEZ%&bbV"2hjjL6#,A[q$m(mlElEmA[M%XTLpY[5q+,cd9f(QAhFXqYhU+Fqmr0S
cRApqUM2TTDE,`MF&haZI6!Qii3ddVF2bjGUe`RqYAAYdr0H&TUm,jlmZP2kcm2$
h,cF*6heG1'!C[q1!m&q@d6[ZYEciq6Hq%[lljq-q&Ik-cafIlA*BBP[I%4jlJbk
!UrfV31XZZ'LjRXX6$JZ"ULSKLrdBmGe(PMfGei6cPKm)Edm@,P[qi6q@@fC-&Ml
m@(K(q(b#m1)Rib`a2%ci[&bi(HTq5rMGZ1H&+F,#cde2#CBC`V)R"II&*i58MiA
c`YN*`ZZ#CCcPcXmEK&FrhfYTrra2`Lq%-KbB*Ic,j`92#GqF)DcR"i)cCLfF-G0
bPl"3q2Nd)@q'm)&`G)C`3[Mf0'(b0#&lKT!!+`4Q#)0imDA``62I,a&f#TDY,rh
1NSGPjCDr)Hakk9qRI(P4H1+hPSPc+S6!AeDZ&S4T&8,C+L(`4[R+Lar2H9@BYHl
Ph`X&A`UT-dU&SAP#U1+[cermeUQb@H1%SA,Kk9HR#Ip4+L`'!*!$'!!!)IJ!!&-
`!*!$#!#3!b!!!$mm!!HTm!#3!`TB`!"G`!!!AF!!N!-DEJ#3!`&f!%ja5S0Q)N(
Y!#!J2$mm!!!L2+R`!!&+3@B%5N"R#NK!5%%JJ#&"!!4#Td(krml3r!%!,`J[2!!
!'@i[!f%!!Ua8MfG!3MJ+AN+R,ca%394"2c`%eDJIF!%4`!TH5TpR'%ja-$bTF+G
'3rS!+L+)3IS!)$!mUA#Q4dU$C`4`!8je6Zd!)Nja5S0Q!URdF!"1G@!'!*!&!8j
a(cVrpNSICK*)jq$J3IVrkP$36VS&VNcI"`F[1[rH6R9JFN&-384%3de3!!-!N$4
3FN&Y51GJm(43Rm)[5!!J)%mL9$&T!"3!'#&!!#3aI!!"!#c5N5&"!#kJ!Yr#60m
2"Nje5MJ+AQF-)#S!#'F-)%!J%'F',cVrK%je51FI"N(krjj`$#)U!!6#Z!-DBD4
Q!!%q5(VrMNkk"fjB6l"kreTQ!!%1S4SZ#!JU!%!!"'F')(J#TU!E,#S!"#SU!!J
B+J!%Pp59e#!kreDK(Mmi!L"Q!!$X9%mX5#!krd3L"X+i!aTB3@%!rd`J1[mm`,J
$'N(krcJJJ%U&CJ5K)Q!%)%@J*fB!!,3U5#!18)""q[m)))!J1[m+8B""q[m!))"
#CdKk!,`[&8Kkr`)[1[lL,cVqiLmkrXS[1[l+,cVqbQ%!$8i`(fFJ2`"+K@F))%f
J+U!VB!3J6D!M)%kJ(b"(S"Xah`)JB'!J6U!I)%HJ'h)!%J6R#H-Cj"%!!3!J!J%
!i#"0S'N#!!!IJ!%J6D"UeG6Ae%(krRC+N!"R#(!"S*K`!k#B)%dP5!!)F!"-hf$
i6R9-hf$iB!$q[Mm!)%kJ(b"(S"Xah`)JeG6Ae$!i!L!a`!TJNFJP5!!)60pJq%j
e6PB!!%MR!$JSEJ!-4rVq+NAkrLSJ&,#5E33J%LL!5S"[%L"6)Qi!#+)Z)"64Nj'
5F!"J"$!mrpP-ha`!6Pj1G8j@rmK)jaii*Li!##JZ!!`SEJ!33IVpZLe)rp4#,[r
)S4SY52r-98qS($!I1J!-43!!Eea)E[rX-!9646m!U!p96bmZrqbS$6!I2!!-4J!
!Epa#*kQE@8m[,[rX-!C64Mm!U!iJ(be!rr"b!4m"UCXJE[r`5T!!Ca"96bm)UDB
`(dM!FJ6!J@I%,blrm+QMB,`3,J!8C`TC6bki!UBJAk!E2cbJr%kk")C86be!rp"
+J'F!!Ci[!%kk!pCB6dS!C`T`!4e!!"C1qJ)B5'lrj%KZrq")E[rB6VS&DNr[!!`
J,[rJS4iY52rF)!KR!!&N)#lrj+%H,8Mrk#!)C`!"9#mZrq3[#%kk"EK36b!$CJ!
!TPP2,ca$6d4&3QHS(b!I,8$rm%U!C`!!ML"!)P"b'02",`P1ZJ5d@%pb!l""CRB
J$5"!F#M4`#e)rr3LE[r`*&&`'0A!,8Vrq#m+6VS%ZPK2,8$rr#"Zrr#J+9"+*Ql
re#G+!#KC6bmZrr"1ZKA-)"pbk0#"8B!R3!!X98p)H[ib,blrp%KZrr`[$#m%,bl
rh#mZrq![,[rS6VS+aP42,blrm+QM*'lre#9Zrp!!$#9Zrp`!%#9Zrq!!&#9ZrqJ
!'$mmSCK1ZJ0@9%mQ3$mmU*p1ZJ0+9%mL!#!,X)&Q"(!!B!*`!5!!*8!!(#9%!#!
P6!!N5(Vlc$mmS2`r2+$m6VS#q&42(`"1ZK952cbKQ%kk!`a86dU!C`4`!D#B)(`
!!!&D-"")`1#!FJD`J@B-3IS!VL*m!!!$2#+)(A`!!Ir))'lrc+!E98qS($!I1J!
-43!!Eh4)E[rX-!9646m!U!p96bmZrqbS$6!I2!!-4J!!Epa#*kQE@8m[,[rX-!C
64Mm!U!iJ(be!rr"b!4m"UCY96bmZrr#TTM!I5-"b"-#"C`J[,[r`UD*J`L4Zrr"
+NQF398m[#UQQ-"p)`()%`)&RULm+UD0JT"!ZrmJG3!!@60mFH%jH)&p2l`!16Y"
19[rm51F!-%)Zrr`r2+$m6VS#,&42*%"+J'GF,`"1ZJ'!@%p+!'G3)!SQ3#"!,bJ
!$$mmS2`r2+$m6VS"hP42(`"1ZK3i)%XJD!!3S"mJ5b"S!"LJ(b"m!!!"@M!35-$
JJ()'X)&Q#R!!)(`!!!-m))!GI!!"rr`3,[rm60m-!%jH6R919[rS51FI1&P2UA8
m51FF-#4Z!!Jf,J!-*Qi!$M)$F!!`!HD!1!!`!h)(`%%k!(!!,8$rr$3%FJ!b!Y+
+)%%5%(!!%!%d"A)!-J,LS()"`)(4V[rm)Llrr11*dSXJ36)3F!!`!5e!rra546!
&FJL`3@B'3N!k!&*%-Li!%R!!-!(3J,#ZrraM!Q#U%#lrra)Z!"25!C!!!8cI$$K
1ANje6PErr%MR(b!NEJ!)1#i!$$SZ!!ib"(!!-!(QJ$`!-J4d"m*#2J&f!$B!eSS
J3a!3G!!8!#e#rra`!$!"0!9b!$)#d)(QJ()#X)&R$()"X)&R)%U!Cc4J-M3'FJ!
b!P5"dSSJ34)3F!!3!A)3ikL"V[rm0!Cb!$)#8S(5LL""%K"`!"!"iBL"V[rm)#l
rr$3(FJ!b!Z+S,8$rr($rFL!f"A3!0!15JZ+S`'lrrNcI"2K1ANje6PErf%MR(cJ
J(bS!5'lrk+Kd)!dJ3#!3FSE3J5e!rr`J3&a)3qlrl#,B)YKC6bmm4%&836mm"0@
TS#!I+%!J3#43-LS!#**U!!3m!63U!!D8DJ!#2J)f,[rb5--i,[rZ5-5@K$J"5-5
@K'S#8S2LJce$rrBf,[r`5--i,[rX5-5@K$J#5-5@K'S#8S2LJce$rr3f,[rfeN%
p3rrk-Llrp0*#28(rq&P23UG)E[rd5(S!CR)"(`&b!6m"F[m[!8)R3UHT%b!I*N!
[!+Kc"S8!N!0i,``J5h!3dF![#+Mf@8qTG5!IX)9N!Q$d98qTG"!ICJ*JpR$r2`"
#Cb!IS$)[#kN8,`bTSbmZrqLSFdcI(2K1ANje!!)!!%j@!!")j`!`*'i!##!+*N!
QEJ!)+'i!$L!m!!!"*0'Z!")J2!!!!NM4VJ!5)#i!%Le!rqab)01Z!")L,J!5,8(
rm#3m!*!$J0@Z!")N,J!5,8,rp#4,'"*f!"B%,82rq1D$HJI'49*$282rh#BZrrM
LJhS$aN983ce$rqCf!6SZrqEVBce$rqKq3-J(I!!F"$e'rq*i!HYN8d3p42rJ+Ll
rq(i"bSGR#(S!1J46K@!#H[mp4IrHH!Jp42rN5NCR4LmZ!")[!$m$8NS[#NkkrcT
2l`!1jd$4E[rN,bi!%LmZrr!r!bmZrqa1ZJX)6qm!$LmZrr3r!bmZrq`[,[r`6VV
mV%r[!!j#3$e!rpJ`,[rBX'i!$'3!!6S`,[rLCcSN3$mZrqJ[,[rd2blrj#m,6VV
pMNr[!!`5!#!+F!!3!6e!rpTd!$3!e+lrl#"#%""b!")!dflrj'!F2blrjMmZrq3
[#dkkrI"36ce!rpS`,[rQd@lrj$!ZrpU`E[rHCKBb,[rB8Qlrf(!!-!(3M#"!3K"
J3#)S!!)-J8&-384Q&L)S!!B-J84$69"Q#M!S!!Tb!l""C`4`!'!#F!&-h``!6Pj
1G5m+@8mr2+KZF!%I!%kk%RJJAb4)@8mr2+TZF!%I!%kk%QBLAb"+XFPQ"M!m!J"
J"$!m"!!NAdje6PB!!#m$0Li!#$!$5-!#J!!!#!"+J'm%F!&J!R!!*Kp1ANje6PE
rr%MR(!!f,J!)2`01Z[r-9%mG32rmFJ'`!@B3!N-(rdkkri#`3fi%F!"J+&P22cb
SRh!"(`"1ZK(`)"mU!&P22`-I,[rm6VS4i#!I+!#`K@B#F!"-h`!i6Pj1G8j@!!"
)jaJ`1#i!##4Z!!SJ5L!3*N!J3$)3$%&"4'BS-LJ!!Ja"3e*Q(MB%F[qf3@FD)#J
!"()BiUJ#J!#3!rmb!dM"X)&R"(!!B!*`!4e!!!j-h``B6PiJAea26Y"19J!!98p
)EJ!)F2mr!%kkrj)3(fF5)'i!##!S!!4b'1+S!N!!rf!#F2p1ANje6PB!!&925'i
!#($r2`"1Z[pN%"pR%#"Z!!JJ+!!%!S!!rj!$B!*`rdjH6R919J!!51FB1#CZ!!J
SEJ!-)%X`[!-"F!!N6#5!*M`!!!%Nej)'NJ!!!NJ'NJ#3!b!S2!#3!i$CNYQ5+$`
!!!53!0Q5ej,CNJD5!*!$I!D5!!#!!(!!*'i!%#5!"T)!N!-N"T)!N!-J"T)!N!0
)"T)!N!-q3N"-ha`B6Pj1G8j@rq4)jami*Qi!##SZ!!`J#bK!,8$rk(!NfF!Y62r
XF#$C`#e-rr"`50R!,8crp(!qfF!J$*!!Ll#&B`C`C8lk!,*#3$i!3N!p32rN0JG
`*,C!C%K`",C!C!4`!'!-F!!`!eQ!DJ*@J15!H!!i!be%rrMBV[rS*%38J#!ZrrM
3J0#Zrr!J3$#Zrq4`!435FJ!5!Z0Jd@lrj&*(B,"#3$i!F!%m!$B(F"qf3'4%F!'
f3'3%F!"J$(!!-!06J'S#8S$LJ(J!1!-Y42rmf+lrl#4%&)!J,[rmd)$3V[rd)%!
`KR!"&"*b!")#if$F3&*(B,4#3%cI(2K1ANje6PErm%MR(cJNEJ!)*Qi!$$SZ!"!
SEJ!53N!m!$)&F!!`!G#!0!Cb!$)#X)&[&%*!0!Cb!$)#dS(5M#""-)"54Q$D3N!
m!(!#28$rmMB'YN9N!!#i3N!q!%*!28$rm(!!-!2PJ0#+)%!J%#e!rr3b"R!!-!(
3Lb"!'""f!"B%YNGM!!##-#lrpR)"`%(4E[r`F!!`!e1!0!Gb!$)#X)&[2MJZrr"
f!$B%,82rr0D$eS`J3dT3CK)J,[rmd)$3M#"!-+lrmP4Zrr)b,[r`F!!`!G#!d)`
J3$!328$rm'!@-!A330"'0#lrm()!-J,5JG+-)%%`J&*()#lrp1+),8$rp'!!rfa
54Q!!rd4-haci6Pj1G8j@rra)ja``*'i!#$BZ!!`QEJ!1-J0`!$!"jS!i!$!$FJI
!36S!F!!Y32rm0!4b!$)#dSSJ34)3F!!3!63&FJ!b!Z+JFJ(!JG'Zrr`L,[rmiiR
5Lb""-K"`!$!",8$rr&*&-!9b#,""CJC#3$S!8N3b,J!5F!!`!G#!X+lrr'-#B+S
3,[rr%Li!%p)"N!!"60m-1%jH6R919[rm51FI)#4Z!!Ji,J!-1Li!$M)%F!!`!HD
!2!!b"(3(`N)q!AB!0J$@LL"$%""d!"3!,8,rr(!!-!%d"A)!-J,3JHD!FJ+`J@F
-FJ'`J@FJ5S"R0'!b0!Cb!$)#9)(5LL""%K"`!"!"FK$MU)'Zrr`d"R)!-J*5JG+
+)%%5%(!!%!(KL)'Zrr`J,[rm0!Gb!$)#iUJY32rmF2pb)$B&G!!d!j+#iUM!E[r
q60m%q%jH6R919[rB51FI1#CZ!!JSEJ!1)$`!!!%NdDi!%L!m!!!#50'Z!")J,J!
5,8$rl()Jdki!%L)Z!")Y3Ir`*$`!N!1!eDi!%L3Z!")Y3[rd*%XB%RB!&J3Y3rr
ijS0k"mC&8N-p3rrF*Llrq1+$HJ2'494$282rjRB"1LlrjZYM282rk(j!b!Gm!"`
%28EriRJ"kf464$e%rq!U,[riIJ(+KfF)HJ!k"&1&B!*krce&rpji#$e%rq4+4QG
',bi!%Lm!2`055Lm+6VVr1Nr[!!lR30&Zrq3[,J!5,blrm$m$,blrl%kk#`K2l`!
1,blrp$m$,blrl#mZrr"1Z[bX6qm!$N*!28$rf$!ZrpL`EJ!-C!!"1M!Zrq*R1L4
!2blrk#mZrr3r,[rN,`Y1Z[f16qm!$")!)!T`!"!"28$rfR3!0!$8V[rX)%)3%()
!%J$6E[rNB"`r,[rQ2blrj#m,6VVpm&"228$rfM!ZrqE4E[rN-#lrfV"ZrpjQ&M)
ZrpK5E[rBF!!`!G#-)%"#%'!!rhS`,[rDX'lri'B!!*3`,[rLCcSN3$mZrqJ[,[r
d2blrj#m,6VVp"Nr[!!`5!#!+F!!3!6e!rpTd!$3!e+lrl#"#%""b!")!dflrj'!
F2blrjMmZrq3[#dkkr@K36ce!rpS`,[rQd@lrj&CZrpS`,[rD8flrfNT!C`$r!$J
J!2pk-#lrfV"Zrq"Q!!#8-#lriQFk*%!r,[rS,blrp$mZrq3[#dkkr3C2l`!-%J!
J#R!!%!%p32rDG!!d!05Zrq`J3K!3FJ!5!00Zrq4J($mZrqBr,[rN,`Y1Z[eS8%m
p32rD-#lrjY&Zrq4@E[rD-#lrfP0ZrpT+3'F!r`!i,[rBGJ!f"#e$rra6JpD-)%-
3%#)Zrrc5M#""%)"5E[rBB-i3,[rGd#lrfc3ZrpK5E[rBFJ!b!Y+-)%%3J'!!rVi
ZrpKf!$B%,82rr&1$eS`J3a!3)Llrr0+-)%%3J&*ZrpKJcK!Zrph3,[rE0#lrf&*
b,[rNF!!`!9k!jS"-haci6Pj1G8j@ria)jami*Qi!##SZ!!`SEJ!3,#i!&#e,rmK
`*0I!,8[ri(!Jem!Y5rr-F%MA`#e,rq3Y62q8*M`!!!%NeklrP#!m!!!#50'Zrj4
`)0'Zrj3S2!#3!i$CV[q8fDlrP#eZrj6rY#Jm!!!%N!$CV[q8,@lrP2qieklrP#e
Zrj6r[0QZrj3YE[q8rp4`I0'Zrj3YE[q8rk3J2!!!J!$4V[q8)#lrP*!!M,#&B`T
ZrpKb!$)#dS`J34#!B!$q[M)Zrq4`!$!"AS$QJ%cI(2K1ANje6PErM%MR(cJQEJ!
)+Li!$#KZ!"!X,J!8,8[rb(!Nem!Y5rrJF#$A`#e,rma`50I!,8[rj#e-rj3Q2!!
!!56AV[q8)$`!!!*)dDlrP(!JdDlrP#Jm!*!$J0QZrj6CV[q8,@lrP2qd+$`!!!5
3!0QZrj3YE[q8rlMAV[q8,@lrP2qmfDlrP#eZrj6re("mdDlrP#eZrj6rT#!m!!#
`C6e!!#K1qJCkF!!Z!%*!28$rM#4Zrk69r!!!J!!Y5[qS,@lrT2q3!#em!!#!!2r
S5'lrk#mZrk3JEJ!N6T!!8%mJ,[rSCJT`Cce!!#K1qJBd*'lrN!"55VAZrkKMD#"
Zrj!!8NL4l[qS,8Mrp#"Zrj!!NHlrT#e)rr!JE[qSNHlrN!!Y52rX)!KR$L"Zrj!
!)QlrT#!ZrqbL,L4Zrk69l[rX,8VrN!")E[r`,blrT#"Z!#41N!"36b!Zrr#`V[r
!!0'Zrj3J,[q8N!#-X)9M#R"P28!!+%lk"RT`!#i!3N!p32q-*'lrT0Am!!#!!#e
+rkJYE[qNrj!!,A`!!)!!rqK)E[rS,blrT#"Z!#41N!"36b!ZrqKQ#R"R28!!+%l
dC!T`Cce!!#K1qJA!)'lrN!"5V[q3!"!3(8$rS()!%J$5390"28(rd$!Zrp$33$e
!rp)JEJ!F)"$3VJ!J,8$rX#4!,``[,[qi2c`"*#mZrj!!6VVlmNr[!!ib!#!+F!!
`!G'Zrj!!,``[,[qd2c`"*#mZrlK1ZJHk6qm!$LmZrl`r2!%N,blrZ#mZrl41Z[P
F6qm!$L4!,``[,[qi2blrd#mZrj!!6VVlS%r[!!ib!#!+F!!`!G'Zrj!!,``[,[q
d2blrd#mZrlK1ZJGS6qm!$LmZrp3r,[r3,blrZ#mZrl41Z[N+6qm!$R!!,J"#3$e
!ri`YEJ!Jrk`JE[qXXHlrX'3!"+K#3$e!rjJ-EJ*)rjKN!!$#-#lrM'B!!)`NE[q
3!&*+YHlrU'0S)'lrN!"55*(ZrkJY52rd)'lrN!#4l[qN,8Mrm#"ZrkL4l[q3!#e
)rq`J#'F1)'lrN!!LE[qN)#lrl+)Z*'lrT0AZrq`Y5[q3!%KZrr![,[qN)'i!*%k
3!&"2)#lrm,#Zrr4N#R"R28!!+%lk"%)JE[q3!&+Zrj!!%K"`!"!",J"`#$e!ri`
`"h)"`%(4E[qB-LlrQ(!!-!(3J0#Zrl`J3$!328$rQ#!(iSJZ!&0ZriaJ!2mi"'i
#52qB$'i"!2qBC"!JE[qX8UlrV"#ZrjPJ!2m)"'i"!2qB1#lrQ(B!0J3Y3rrieS2
@V[r-)%-`%$e!rjSL,[ridUlrb#""%K"`!"!"28$rR%T!C`!!`JaZ!"MrM')!!*J
NE[q3!&*+YHlrU'0S)'lrN!"55*(ZrkJY52rd)'lrN!#4l[qN,8Mrm#"ZrkL4l[q
3!#e)rq`J#'F1)'lrN!!LE[qN)#lrl+)Z*'lrT0AZrq`Y5[q3!%KZrr![,[qN)'i
!*%k3!&"2)#lrm,#Zrr4N#R"R28!!+%lk!bJJE[q3!&+Zrj!!%K"`!"!"0#lrM()
k"M3NE[q3!&*+YHlrU'0S)'lrN!"55*(ZrkJY52rd)'lrN!#4l[qN,8Mrm#"ZrkL
4l[q3!#e)rq`J#'F1)'lrN!!LE[qN)#lrl+)Z*'lrT0AZrq`Y5[q3!%KZrr![,[q
N)'i!*%k3!&"2)#lrm,#Zrr4N#R"R28!!+%lk"F!JE[q3!&+Zrj!!%"!G32qJFJ!
!-J,MU)k!8'lrM'!!rf*`rh)J1#lrR(B!0J55Jq+S`%I4E[qD)!IQU#i!Q@lrM%*
!28$rQ$!ZrjL`E[r5C!!!`M!ZriaQ!!#-*'lrN!"55VAZrkKMD#"Zrj!!8NL4l[q
S,8Mrp#"Zrj!!NHlrT#e)rr!JE[qSNHlrN!!Y52rX)!KR$L"Zrj!!)QlrT#!Zrqb
5!0*"8d%p3Ir3-#lrd0"!28$rdL"Z!"`J%0#Z!#!Y32q`*%![$#mZrlJr2!%N,bl
rN!"1Z[[b6qm!$M)!)!T`!$!"dDlrN!![$#mZrl3r2!%N,blrZ%kk"lT2l`!1,bl
r[$mm!53[,[qi,blrY%kkq9a2l`!1*%![$#mZrlJr,[r3,blrN!"1Z[ZJ6qm!$M)
!)!T`!$!"dDlrN!![$#mZrl3r,[r3,blrZ%kk"fK2l`!1,blre$mZrp![,[qi,bl
rY%kkq3T2l`!1F!!Z!%*!28$rM#eZ!#$rV#"Zrkbal[q`C!!%U%*!28$rQ!aZ!NM
rQ'3!!-)`,[q-CJ!!M#4Zrj!!8NUel[qSBfJJE[q3!&*)NHlrU#e)rr3JE[q3!*(
Zrk3Y52r`)'lrU*(Zrj!!,8Mrl#!)C`iJE[q3!#*Zrk3J,[rXSLiNE[qNeHlrl#e
+rj!!5'lrm#mZrk3JEJ!N6T!!8%mJ,[r`X+lrp'3+F'Fp3!!S6[S%3L"Zrj!!8Ul
L,L4Zrk69l[rX,8VrN!")E[r`,blrT#"Z!#41N!"36b!Zrr#`V[rdC!T`Cce!!#K
1qJ*B)'lrN!"5V[q3!")3F!!3!5i!F!Jp32q--!Gb!F""d@lrQ$)ZrjK`!$!"d)$
3V[r8)%!`%$e!rjJJ"q+),J"6E[q-B!$r0M!Zrp+4E[qB1#lrQ(B!0J3Y3rrmeS2
rN!!5%(!!%!%Z!(!)28$rM$!(FJ(!3G&ZrjJb,[qBF!!`!G#!d+lr[#"!-"!p32q
B)!ILL#i!8flrM'!!rcJ%EJ*)rjJ-EJ%!rjKN%#"Zrka5V[qX%+lrQ@!!r`J%EJ%
!rjJi,[qBGJ!f"#e$rrM@JpDZrm`J3c!328$rQL)ZrrM5V[r))%%5%(!!%!%p32q
F5N"R!!$#$'i!'2q-BJ!!Q#4Zrj!!8NUel[qSBfJJE[q3!&*)NHlrU#e)rr3JE[q
3!*(Zrk3Y52r`)'lrU*(Zrj!!,8Mrl#!)C`iJE[q3!#*Zrk3J,[rXSLiNE[qNeHl
rl#e+rj!!5'lrm#mZrk3JEJ!N6T!!8%mJ,[r`X+lrp'3+F'Fp3!!S6[S$+#"Zrj!
!8UlrN!!5%(!!%!%d,[q-FJ!b!Z1SMS"3E[q-B!$rBR$rFL!i,[qFGJ!f"*+$iUM
@V[rN)%-`%$e!rjiL,[rmdUlri#""%K"`!"!"28$rR%T!C`!!`JaZ!"MrM')!!*J
NE[q3!&*+YHlrU'0S)'lrN!"55*(ZrkJY52rd)'lrN!#4l[qN,8Mrm#"ZrkL4l[q
3!#e)rq`J#'F1)'lrN!!LE[qN)#lrl+)Z*'lrT0AZrq`Y5[q3!%KZrr![,[qN)'i
!*%k3!&"2)#lrm,#Zrr4N#R"R28!!+%lk!9SJE[q3!&+Zrj!!%K"`!"!"0#lrM()
!-J,MU)k!8'lrM'!!rf*`rh)J1#lrR(B!0J55Jq+S`%I4E[qH)!IQU#i!Q@lrM#"
Zrk`b,[qHF!!`!C(!,8MrP,(Z!#"PB#"Zrj45V[q8%"!JE[qX8UlrV"#!)'lrP&+
Zrj33%#"Zrka5V[qX%)!JE[q88UlrP"!3)'lrV&+Zrk`3J$!ZrjT6E[qD5N"R!2[
H)'lrP&+Zrj33%#"Zrka5V[qX%)"Jh&CZrjSJEJ!BdFBb,[qHF!!`!5*Zrkb6lJ!
JN!#*NF!Y52q8-#lrQQFQ)'i!'0('XHlrP'-D)'lrP&+Zrj33%#"Zrka5V[qX%)"
!4p&ZrjSJ"qDS,J#CE[q-3N!p32qB-#lrQ,"Zrp*N!!$#-#lrM'B!!)`NE[q3!&*
+YHlrU'0S)'lrN!"55*(ZrkJY52rd)'lrN!#4l[qN,8Mrm#"ZrkL4l[q3!#e)rq`
J#'F1)'lrN!!LE[qN)#lrl+)Z*'lrT0AZrq`Y5[q3!%KZrr![,[qN)'i!*%k3!&"
2)#lrm,#Zrr4N#R"R28!!+%lk!PJJE[q3!&+Zrj!!%K"`!"!",J"`#$e!ri``"h)
"`%(4E[qB-LlrQ(!!-!(3J0#Zrp3J3$!328$rQ#!(iSJZ!&0ZriaJ!2mf-#lrdT&
ZrjJi,[qBGJ!f"#e$rrc@JpDZrq3J3c!328$rRL)Zrrc5V[rJ)%%5%(!!%!%p32q
F5N"R!!$#$'i!'2q-BJ!!Q#4Zrj!!8NUel[qSBfJJE[q3!&*)NHlrU#e)rr3JE[q
3!*(Zrk3Y52r`)'lrU*(Zrj!!,8Mrl#!)C`iJE[q3!#*Zrk3J,[rXSLiNE[qNeHl
rl#e+rj!!5'lrm#mZrk3JEJ!N6T!!8%mJ,[r`X+lrp'3+F'Fp3!!S6[S"@L"Zrj!
!8UlrN!!5%(!!%!%d,[q-FJ!b!Z1SMS"3E[q-B!$rBR$rFL!i,[qFGJ!f"*+$iUM
!4p&ZrjiJ"qDS,J#CE[q-)'lrV$)Zrjj`!$!"NF!Y52q8XHi!)'9J)'lrP&+Zrj3
3%#"Zrka5V[qX%)!JE[q88UlrP"!3)'lrV&+Zrk`3J#"Zrj45V[q8%"!JE[qX8Ul
rV"#!-#lrQP0ZrjT+3'F!qpiJE[q88UlrP"!3)'lrV&+Zrk`3J'$F9QlrQL"Z!"M
4aM)Zrjj`!$!")QlrV*2Z!##3!)Q4`#e)rj3`,[qDCbBJEJ!BdFDal[q8BaSJE[q
88UlrP"!3)'lrV&+Zrk`3J&0ZrjTJe#eZ!#$rP$!ZrjT6E[qD5N"R!2YQ)'lrP&+
Zrj33%#"Zrka5V[qX%)"Jh#"Zrkbal[q`C`K`Cce!!#KJ&#"Zrkb4lJ!J)Qi!(#+
6E[qDB03YEJ!Jrj3`,[qD8flrQNT!C`$lCL"Zrj45V[q8%"!JE[qX8UlrV"#!B0`
JE[qXXHlrX'F)F'Fp3!!SB"3JE[qXNHi!)#*Z!"`LL%*!28!!+%cI(2K1AL"I6qm
!)%l3!(!m!$iJ!!"i)$i`)#BQ)(JJ2$dc-J!!1N0[EA"bCA0cD@pZ1N4PBfpYF(*
PFh0TEfi`-c!a,Q-!!$`!2L!!!(JJ2M!J*LBJH#!m26-b!!!k3fpYF(*PFh0TEfi
k4'9MEfe`FQ9cFfP[EM!c-$%ZB`!!6PErk%MR(cJq,J!)+'i!$$BZ!!T`!$!$1!G
)3N!p3!!S60mFq%jH)&p2l`!J6Y!!F$`!2L!!!(JJ2M!J*LBJH#!m26-b!!!k3fp
YF(*PFh0TEfik4'9MEfe`FQ9cFfP[EM!c-$%ZB`!!2!!q)!!!H#!q-#!Q*L"i)$`
b!$)%N!#"FJ'`J@m!!E3p42rS282rkP*ZrqJ`,[rSX'i!#Q3FFJ!b!0+-)%%3%$3
(FJ!b!Y+-)%%5%,!"C!*JeP0ZrqS`,[rUX%GM(()!-J$5M#""%"!d"h)!-J,5M#"
p-c)!!$T$Efe`FQ9cFfP[EMT%C@0[EA"bCA0cD@pZ-$-`-5jM!!"19[rS51FI1$i
Z!!JSEJ!-0Li!#R!!-!-i"h)!-J53!)&b!E#"E`!"Y$e%rqJp3rrU8Qlrk$!ZrqL
`EJ!+C"ab!$)!dS`J34!30!Gb!$)#dS`J34)3X!&N!Q$@8flrkM!ZrqU`4f-FFJ!
b!0+-)%%3%$3(FJ!b!Y+-)%%5%,!"B`*Jf$!ZrqL`E[rUC3*JFMJZrqKf!$B%,82
"%K#`!@-#B0J`,[rSX'lrkQ8#B()i,[rSGJ!f"#e$rr$@M#4$%K*`!"!"28$rl$S
ZrqTi!$J&,86rp0L-*N33%a5!&Ulrl5!Zrr$3J0#Z!"!J3$!328$rl#)Zrr65JG+
rm0D-*%-5%R!!%!%p32rX1LlrkRJ!1!8Y42rdf)`Q4"!6&)!@V[rY)#lrm0#!d+i
!%#"!-"!p32rX)Llrp0+"dUi!%#""-K!N,[r`e),8VJ!3)%)`J5)Zrr65JG+Z!"!
Z!"!J36)3*#lrm05#e+i!%#"#-)%L,[rddS(5VJ!3)%%`J'!!rc)`,[rUX%GQ"P*
(B!$r"$J(GJ!f"#e$rrM@M#4$%K*`!"!"28$rl$`ZrqTk!$S',8Arr0U-*N83%a5
!&Ulrl5!ZrrM3J0#Z!"!J3$!328$rl#)Zrrc5JG+Z!"!J36)3*#lrq05#e+i!%#"
J36#!B!$r-M!ZrqU`4fB'8NGJ!2m%1!Gf!$B%,82rq0D-*%-5%R!!%!%p32rX2#l
rkRS!1JBY4IrmfS`Q44!6&)!@V[rY)#lrq0#!d+i!%#"!-"!p32rX)Llrr0+"dUi
!%#""-K!N,[rie),8VJ!3)%)`J5)Zrrc5JG+Z!"!J36#!)#lrr#)ZrrL3!)%d,J!
#-)%L,[rmdS(5VJ!3)%%`J#!Zrr`L,[riN!#"0#i!#R)!-J)N,[rm8S+5JV#"E"i
[,J!3,``r"Mm%6VVqA%r[!!``,[rU8N!q!'!!rP`[,J!3,``r,J!+-#lrkP*!2`"
+FJ!b!L3Zrra5JT+#X)&X(LmZ!"![$$m'2`41Z[jF6qm!$$!ZrqT53$i!B!$qA#m
Z!"![$$mZ!!S`,[rU8N!r!%kkrMC2l`!-2@lrkJ!+B!$q1%cI(2K1ANje6PErj%M
1Z[if6qm!$$eZrqS!#Q!!rMK-haci6Pj1G8j@rq4)jami*'i!#$SZ!!`QEJ!1+'i
!%Le-rr!J2!!!!56C`#e-rr4#3$`!0JDf4@3XH!!i!be%rrMBLL"%%"!L,[ridUl
rm#""%)!J,[rid)$3V[rd)%!`Je*'B-i[,[rd,blrm$m&3QG1Z[fb6qm!$%*!2!!
f"VC&C"*`!$!$d+lrm#"!5K"Q"&*'B1K`!#e!rq3f"VC&C!!!U%T$Cc)J,[rNH!!
i!be%rrcBV[r`)%38%()!%J)Q,[rm8i2@V[r`)%-@%(3!&!15JZ1S,8$rj$3'FJ!
b!Y+Zrr!J34)3F!!3!6i!,@lrj2rXF!!Y32rS-!G64dT!Cb!J,[rSiiJL,[rXG!(
#JS#",8$rk#!ZrqcLL#e!rqaJf$3'FJ!b!Y+"dUlrp#""-K"`!$!"jB$3Lb"!)+l
rk&*'8Ulrj'!!re4-haci6Pj1G5*I)&qJ*5k!DJ*#Pdl4)Pm5(c!I5J&R"+G'B!+
M4Lk)6Y%LAa)I-"mJAdS"C`5Q4f!#SNG1d3#3!`S!1+!"!!8!N!B"!!!"HG`!!AM
F!!!%23Dfe$3%LJ#3!a`$XJ!64%P86!!0!+*"6&*8!!S"5RCPFR-!!3(18e45)!!
"!HC3Ff9d!!!"rN4-6dF!!J)+8e45)`!!!Lj%6%GB!!!#1P"*3e3!!!*'BfPMEJ!
!!P**3dp1!!!#ANP$6L-!"!*U4P*&4J!%!UC#6N4-!!%#iN&9Fc)!!!,kBA9cG!!
!!`C$6d4&!!F$%N4"9%%!!!0b8dPD43!!!hj'C@&d!!!$LJ3"rrmJ!*!)KIrr*!!
!J!Dfdj`!Krrr!*!$eJ#3"BErrb3!!5B'YY1N!)$rr`!!!DF!N!@errmJ!!)&!*!
&J[rr!!!#G`#3"!2SrrmJ!!,9!*!&L2rr!!!$!3#3"!)!rrm!!!2C!*!%!J(rr`!
!""F!N!3%5`!S"!!8V!Dfdl`%Vrrr!!!8r!#3"!%(!$3J!"8k!*!%"!(rrb!!"'-
!N!@#rrmJ!!4c!*!&KIrr*!!%J`Dfdk!!Krrr)!!%N`#3"BErrb3!"+-'YY2!!)$
rrb!!",-!N!@"rrmJ!!6$!*!&L2rr)!!%d`#3"!)!rrmJ!!6P!*!%!J(rrb!!"28
!N!3%Vrrr!!!9k!#3"3,rrb!!"38!N!8"rrm!!"[$!*!%!J#3!b!!"5-!N!3#!3!
()!!&-`#3"B$rr`!!"6m!N!3$k2rr)!!*GJ#3"!4,!"!%!",@"VE6V!%(!"`J!",
[!*!&J2rr!!!*NJ#3"BMrr`!!#G)!N!3$k2rr!!!+%!#3"!4,rrm%!"-,"VE6X!4
,rrm%!"3a"VE6Y!#!rrmJ!"Ai!*!&JIrr!!!@r!#3"B,rr`!!'!#3"S2rr`!!'33
!N!@%rrm!!"S)!*!&J2rr!!!E$!#3"B(rr`!!'aF!N!@#rrm!!"XL!*!&Jrrr!!!
E,3#3"B6rr`!!'cJ!N!3"!2rr!!!E3`#3"B$rr`!!'f-!N!G!!!!EQ`#3"B6rr`!
R(cJNEJ!)1Li!$#CZ!!iSEJ!5,8crm#!m!!!"*0R!,8crp%*!2!!f"VC&C#ai!$J
$,86rq0L+)%33%#)ZrrM5V[r`)%%3J#!ZrrM3J0#Zrr3J3$#$8NCJcLmZrr3[,[r
`2`9#CdkkrE*2l`!-3N!m!$B'YN9N%R!!-!23V[r`)%"+%'B%8NCJk(!!,8$rj$B
'YN9N!!#S5N0R-L!Zrq4i!$J$,86rr0LZrr!J4"33FJ!5!LBZrra6JpDZrr!J3aB
3G!!8!j+#ikJY32rN0!Cb!$)#dUlrm#""%K"`!"!"2J!YE[rNrqa`!#e!rqJ`"e0
(5N"R)#!ZrqMML#)Zrqad!F+#J)%Y32rS)#lrl1+),8$rl'$B0!Cb!$)#dS(5V[r
d)%%b%(!!-!(PJ0#,)%!JV[rS8NC5V[rNB!$r9%cI(2K1ANje)PmJAk!P,S"U!N+
A6Y%LAa)I-"p+!@F%TdCJ!U0',SK1d5*I%Km`(b"I5J&R"+C(B!+L4dl4!*!$#J!
iS!%!"3#3"J%!!!'MLJ!"SSS!!!9,8dp59!4Z!)!!(!4b!"C"6&*8!!S!ZN&9Fc)
!!!%q3Nj%6!!"!8T$6P4-!!!"BN024%8!"`&Z4%&833!!!Fj%594-!!m"fN4-6dF
!"!+D4P*&4J!%!YC'C@&d!!!$%NP$6L-!"!-H58026J!!!eT35808!!3$CP"cCA3
!!!1L8dPD43!!!kj69&)J!!%$ZP088L-!!!25BA9cG!!"!pjMD@0Z!!!$pQ4MG')
!!33#C'aRH!!"""TTBf`i!!!%-RCPFR-!!33q!)$rrb!!N!L"rrmJ!!!3!*!&J[r
r)!!!)!#3"BArrb3!!$!",663!)Errb3!!%!"*9fX!)Irrb!!!&!!N!@)rrmJ!!"
J!*!%!J$rrb!!!()!N!3#!Irr)!!!JJ#3"!3"rrmJ!!#5!*!%"+rrr`!!'&J!N!F
H!!!BD!#3"B$rr`!!')`!N!3"!2rr!!!Ba!#3"!%)rrmJ!"MN!*!'rrmS!BIJ!*!
&!3#G(!!QV`%Y0)!!!J#R(!#`I!!kM%J!!`#a(!$0R`!qkL`!"!#l(!%*X3%Y0-!
!"3$&(!%l2J!qkE3!"J$2(!&Em3%Tr83!"rrr!!')#J#3"[rr+!#"l!#3"B$rr`#
3!k)!N!@#rrm!!!%!N!D&rrmN!!&H!5Rm&!#'rrmN!!'d!$jQp!#(rrm!!!)e!*!
&L2rr!!!#K3#3"EArrb!!!ed!N!3""Irr)!!$c`#3"!%(rrmJ!"Mr!*!%!3Mrrb!
!'D!!N!3#!2rr!!!%I!#3"!)"rrm!!!5k!*!%!qMrrb!!"3B!N!3%!Irr)!!&-J#
3"!4,!#d%!"T$!59GP!5[rrm!!"U6!*!%!38!!#!!"E)!N!3""`!j)!!Dd3#3"!%
)!%SJ!"VY!*!%!qMrrb!!"G3!N!3%5`"Q"!!E#3%U"0J!J2rr!!!E)J#3"B(rr`!
!'bd!N!@#rrm!!"Xi!*!&Jrrr!!!E3`#3"B6rr`!!'di!N!Err`!"SR`!N!@!rrm
!'lm!N!8"!%mF!"`%"VE6Z!!#!&NF!)d3"VE6b!!$!'-F!+R2"VE6c!!%!'dF!1j
E"VE6D!!&!(FF!3Ve"VE6E!!'!)%F!6bY"VE6F!!!rrmS!9ib!*!&"rrr!!&HA!#
3"[rr+!"Br!#3"2q3"!!"ANi!N!Err`!"H-i!N!3'F(*[EA"d#-3JFh9QCQPi#dP
ZFf9bG#"%DA0V#d9iDA0dD@jR)&"A#dPZFf9bG#"%DA0V#d9iDA0dD@jR)&"A$Np
hEQ9b)(*PFfpeFQ0P#90PCfePER3J-3P6C@GYC@jd)$)*8f9RE@9ZG#!c#90PCfe
PER3J0!P6C@GYC@jd)$8*8f9RE@9ZG#!f*A8:
!!"YC!*!&JIrr!!!FA3#3"B,rr`!!(@%!N!@$rrm!!"jP!*!&K2rr!!!ID3#3"!4
,rrm%!#"Y!$K"i!##rrm!!!A`!*!%!qMrr`!!"a-!N!3%62rr!!!1)3#3"!40rrm
!!!rD!*!%"%lrr`!!%C-!N!@!rrm!!"-K!*!%rj!%!!'(r!#3"!)!!!FJ!"GB!*!
%!J%!$L!!&fJ!N!@!rrm!!"Gd!*!(FJ!!)1J!N!@%rrm!!#&$!*!%"%[rr`3!)8F
"*2Ri!3Arr`!!&l3!N!3"#2rr!!!LE3#3"!%&!"F!!"IP!*!%!3J!J3!!)U%!N!@
%rrm!!#+V!*!&!Irr)!!Al`#3"3,rrb!!'$)!N!3'8h4KG(9c"R"bEfe`G!M%)(0
eCQCTH!C6G'&dGA-16hGZCA)JFQ9cEh9bBf8,5@jcCA*d)%4TFfX34AKTFh4TEQG
3BA0cGfpbC"Y&H'PcG'PZCe"KFh0hEh*N,8&`F'9KFQ&ZBf8,5@jcCA*d)%4TFfX
16hGZCA)JFQ9cEh9bBf8E4AKTFh4TEQG3BA0cGfpbC#e"F("PBA*KEQ0P#90PCfe
PER3J-3P6C@GYC@jd)$)*8f9RE@9ZG#!c#90PCfePER3J03P6C@GYC@jd)$B*8f9
RE@9ZG#!fK5F:
Changes to mac/tclMacResource.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







/*
 * tclMacResource.c --
 *
 *	This file contains several commands that manipulate or use
 *	Macintosh resources.  Included are extensions to the "source"
 *	command, the mac specific "beep" and "resource" commands, and
 *	administration for open resource file references.
 *
 * Copyright (c) 1996-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacResource.c,v 1.7 1999/08/15 04:54:03 jingham Exp $
 * RCS: @(#) $Id: tclMacResource.c,v 1.7.2.1 2002/04/08 08:59:05 das Exp $
 */

#include <Errors.h>
#include <FSpCompat.h>
#include <Processes.h>
#include <Resources.h>
#include <Sound.h>
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
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







-
+







-
+
-


+
+


+







    Handle sourceText;
    Str255 rezName;
    char msg[200];
    int result, iOpenedResFile = false;
    short saveRef, fileRef = -1;
    char idStr[64];
    FSSpec fileSpec;
    Tcl_DString buffer;
    Tcl_DString ds, buffer;
    char *nativeName;

    saveRef = CurResFile();
	
    if (fileName != NULL) {
	OSErr err;
	
	nativeName = Tcl_TranslateFileName(interp, fileName, &buffer);
	if (Tcl_TranslateFileName(interp, fileName, &buffer) == NULL) {
	if (nativeName == NULL) {
	    return TCL_ERROR;
	}
	nativeName = Tcl_UtfToExternalDString(NULL, Tcl_DStringValue(&buffer), 
    	    Tcl_DStringLength(&buffer), &ds);
	err = FSpLocationFromPath(strlen(nativeName), nativeName,
                &fileSpec);
	Tcl_DStringFree(&ds);
	Tcl_DStringFree(&buffer);
	if (err != noErr) {
	    Tcl_AppendResult(interp, "Error finding the file: \"", 
		fileName, "\".", NULL);
	    return TCL_ERROR;
	}
		
Changes to mac/tclMacResource.r.
8
9
10
11
12
13
14
15

16
17
18
19
20
21
22
8
9
10
11
12
13
14

15
16
17
18
19
20
21
22







-
+







 *
 * Copyright (c) 1993-94 Lockheed Missle & Space Company
 * Copyright (c) 1994-97 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacResource.r,v 1.4 1999/08/16 00:09:30 jingham Exp $
 * RCS: @(#) $Id: tclMacResource.r,v 1.4.2.2 2001/10/17 19:29:25 das Exp $
 */

#include <Types.r>
#include <SysTypes.r>

/*
 * The folowing include and defines help construct
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
36
37
38
39
40
41
42














43
44
45
46
47
48
49
50
51
52
53
54
55
56
57


























-
-
-
-
-
-
-
-
-
-
-
-
-
-















-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

#if (TCL_RELEASE_LEVEL == 2)
#   define MINOR_VERSION (TCL_MINOR_VERSION * 16) + TCL_RELEASE_SERIAL
#else
#   define MINOR_VERSION TCL_MINOR_VERSION * 16
#endif

resource 'vers' (1) {
	TCL_MAJOR_VERSION, MINOR_VERSION,
	RELEASE_LEVEL, 0x00, verUS,
	TCL_PATCH_LEVEL,
	TCL_PATCH_LEVEL ", by Ray Johnson & Jim Ingham © Scriptics Inc."
};

resource 'vers' (2) {
	TCL_MAJOR_VERSION, MINOR_VERSION,
	RELEASE_LEVEL, 0x00, verUS,
	TCL_PATCH_LEVEL,
	"Simple Tcl Shell " TCL_PATCH_LEVEL " © 1996 - 1999"
};


/* 
 * The mechanisim below loads Tcl source into the resource fork of the
 * application.  The example below creates a TEXT resource named
 * "Init" from the file "init.tcl".  This allows applications to use
 * Tcl to define the behavior of the application without having to
 * require some predetermined file structure - all needed Tcl "files"
 * are located within the application.  To source a file for the
 * resource fork the source command has been modified to support
 * sourcing from resources.  In the below case "source -rsrc {Init}"
 * will load the TEXT resource named "Init".
 */

#include "tclMacTclCode.r"

/*
 * The following resource is used when creating the 'env' variable in
 * the Macintosh environment.  The creation mechanisim looks for the
 * 'STR#' resource named "Tcl Environment Variables" rather than a
 * specific resource number.  (In other words, feel free to change the
 * resource id if it conflicts with your application.)  Each string in
 * the resource must be of the form "KEYWORD=SOME STRING".  See Tcl
 * documentation for futher information about the env variable.
 *
 * A good example of something you may want to set is: "TCL_LIBRARY=My
 * disk:etc."
 */
 
resource 'STR#' (128, "Tcl Environment Variables") {
	{	"SCHEDULE_NAME=Agent Controller Schedule",
		"SCHEDULE_PATH=Lozoya:System Folder:Tcl Lib:Tcl-Scheduler"
	};
};

Deleted mac/tclMacShLib.exp.
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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
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










































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
AddrToName
AddrToStr
BuildAFPVolMountInfo
BumpDate
ChangeCreatorType
ChangeFDFlags
CheckObjectLock
CheckVolLock
ClearHasBeenInited
ClearHasCustomIcon
ClearIsInvisible
ClearIsStationery
ClearNameLocked
CloseResolver
ConfigureMemory
CopyDirectoryAccess
CopyFileMgrAttributes
CopyFork
CreateFileIDRef
DTCopyComment
DTGetIcon
DTOpen
DTSetComment
DeleteDirectory
DeleteDirectoryContents
DeleteFileIDRef
DetermineVRefNum
DirectoryCopy
EnumCache
##EnvStr
ExchangeFiles
FSMakeFSSpecCompat
FSReadNoCache
FSWriteNoCache
FSWriteVerify
FSpBumpDate
FSpCatMoveCompat
FSpChangeCreatorType
FSpChangeFDFlags
FSpCheckObjectLock
FSpClearHasBeenInited
FSpClearHasCustomIcon
FSpClearIsInvisible
FSpClearIsStationery
FSpClearNameLocked
FSpCopyDirectoryAccess
FSpCopyFile
FSpCopyFileMgrAttributes
FSpCreateCompat
FSpCreateFileIDRef
FSpCreateMinimum
FSpCreateResFileCompat
FSpDTCopyComment
FSpDTSetComment
FSpDeleteCompat
FSpDirCreateCompat
FSpDirectoryCopy
FSpExchangeFilesCompat
FSpFileCopy
FSpFilteredDirectoryCopy
FSpFindFolder
FSpGetDInfo
FSpGetDefaultDir
FSpGetDirAccess
FSpGetDirectoryID
FSpGetFInfoCompat
FSpGetFLockCompat
FSpGetFileLocation
FSpGetFileSize
FSpGetForeignPrivs
FSpGetFullPath
FSpGetIOACUser
FSpLocationFromFullPath
FSpLocationFromPath
FSpMoveRename
FSpMoveRenameCompat
FSpOpenAware
FSpOpenDFCompat
FSpOpenRFAware
FSpOpenRFCompat
FSpOpenResFileCompat
FSpPathFromLocation
FSpRenameCompat
FSpResolveFileIDRef
FSpRstFLockCompat
FSpSetDInfo
FSpSetDefaultDir
FSpSetDirAccess
FSpSetFInfoCompat
FSpSetFLockCompat
FSpSetForeignPrivs
FSpSetHasCustomIcon
FSpSetIsInvisible
FSpSetIsStationery
FSpSetNameLocked
FSpShare
FSpUnshare
FileCopy
FilteredDirectoryCopy
FindDrive
FlushFile
FreeAllMemory
GetCPanelFolder
GetCatInfoNoName
GetDInfo
GetDirItems
GetDirName
GetDirectoryID
GetDiskBlocks
GetDriverName
GetFileLocation
GetFileSize
GetFilenameFromPathname
GetForeignPrivs
GetFullPath
GetGlobalMouse
GetIOACUser
GetObjectLocation
GetParentID
GetSystemFolder
GetTempBuffer
GetTrapType
GetUGEntries
GetUGEntry
GetVolMountInfo
GetVolMountInfoSize
GetVolumeInfoNoName
HCopyFile
HCreateMinimum
HGetDirAccess
HGetLogInInfo
HGetVInfo
HGetVolParms
HInfo
HMapID
HMapName
HMoveRename
HMoveRenameCompat
HOpenAware
HOpenRFAware
hypotd
HSetDirAccess
InstallConsole
LocationFromFullPath
LockRange
MXInfo
NumToolboxTraps
OnLine
OpenOurRF
OpenResolver
PBXGetVolInfoSync
ReadCharsFromConsole
RemoveConsole
ResolveFileIDRef
RestoreDefault
RetrieveAFPVolMountInfo
SIOUXBigRect
SIOUXCantSaveAlert
SIOUXDoAboutBox
SIOUXDoContentClick
SIOUXDoEditClear
SIOUXDoEditCopy
SIOUXDoEditCut
SIOUXDoEditPaste
SIOUXDoEditSelectAll
SIOUXDoMenuChoice
SIOUXDoPageSetup
SIOUXDoPrintText
SIOUXDoSaveText
SIOUXDragRect
SIOUXDrawGrowBox
SIOUXHandleOneEvent
SIOUXIsAppWindow
SIOUXMyGrowWindow
SIOUXQuitting
SIOUXSetTitle
SIOUXSettings
SIOUXSetupMenus
SIOUXSetupTextWindow
SIOUXState
SIOUXTextWindow
SIOUXUpdateMenuItems
SIOUXUpdateScrollbar
SIOUXUpdateStatusLine
SIOUXUpdateWindow
SIOUXUseWaitNextEvent
SIOUXYesNoCancelAlert
SIOUXisinrange
SIOUXselstart
SearchFolderForDNRP
SetDInfo
SetDefault
SetForeignPrivs
SetHasCustomIcon
SetIsInvisible
SetIsStationery
SetNameLocked
Share
StrToAddr
TclAccess
TclAllocateFreeObjects
TclChdir
TclCleanupByteCode
TclCleanupCommand
TclCompileBreakCmd
TclCompileCatchCmd
TclCompileContinueCmd
TclCompileDollarVar
TclCompileExpr
TclCompileExprCmd
TclCompileForCmd
TclCompileForeachCmd
TclCompileIfCmd
TclCompileIncrCmd
TclCompileQuotes
TclCompileSetCmd
TclCompileString
TclCompileWhileCmd
TclCopyAndCollapse
TclCopyChannel
TclCreateAuxData
TclCreateExecEnv
TclDate_TclDates
TclDate_TclDatev
TclDateact
TclDatechar
TclDatechk
TclDatedebug
TclDatedef
TclDateerrflag
TclDateexca
TclDatelval
TclDatenerrs
TclDatepact
TclDateparse
TclDatepgo
TclDateps
TclDatepv
TclDater1
TclDater2
TclDates
TclDatestate
TclDatetmp
TclDatev
TclDateval
TclDeleteCompiledLocalVars
TclDeleteExecEnv
TclDeleteVars
TclDoGlob
TclEmitForwardJump
TclExecuteByteCode
TclExpandCodeArray
TclExpandJumpFixupArray
TclExprFloatError
TclFileAttrsCmd
TclFileCopyCmd
TclFileDeleteCmd
TclFileMakeDirsCmd
TclFileRenameCmd
TclFindElement
TclFindProc
TclFixupForwardJump
TclFormatInt
TclFreeCompileEnv
TclFreeJumpFixupArray
TclFreeObj
TclFreePackageInfo
TclGetCwd
TclGetDate
TclGetDefaultStdChannel
TclGetElementOfIndexedArray
TclGetEnv
TclGetExceptionRangeForPc
TclGetExtension
TclGetFrame
TclGetIndexedScalar
TclGetIntForIndex
TclGetLoadedPackages
TclGetLong
TclGetNamespaceForQualName
TclGetOpenMode
TclGetOriginalCommand
TclGetRegError
TclGetSrcInfoForPc
TclGetUserHome
TclGlobalInvoke
TclGuessPackageName
TclHasSockets
TclHideUnsafeCommands
TclInExit
TclIncrElementOfIndexedArray
TclIncrIndexedScalar
TclIncrVar2
TclInitByteCodeObj
TclInitCompileEnv
TclInitJumpFixupArray
TclInitNamespaces
TclInterpInit
TclInvoke
TclInvokeObjectCommand
TclInvokeStringCommand
TclIsProc
TclLoadFile
TclLooksLikeInt
TclLookupVar
TclpAccess
TclMacCreateEnv
TclMacExitHandler
TclMacFOpenHack
TclMacInitExitToShell
TclMacInstallExitToShellPatch
TclMacOSErrorToPosixError
TclMacReadlink
TclMacRemoveTimer
TclMacStartTimer
TclpStat
TclMacTimerExpired
TclMatchFiles
TclNeedSpace
TclObjIndexForString
TclObjInterpProc
TclObjInvoke
TclObjInvokeGlobal
TclPlatformExit
TclPlatformInit
TclPreventAliasLoop
TclPrintByteCodeObj
TclPrintInstruction
TclPrintSource
TclRegComp
TclRegError
TclRegExec
TclRenameCommand
TclResetShadowedCmdRefs
TclServiceIdle
TclSetElementOfIndexedArray
TclSetEnv
TclSetIndexedScalar
TclSetupEnv
TclSockGetPort
TclStat
TclTeardownNamespace
TclTestChannelCmd
TclTestChannelEventCmd
TclUnsetEnv
TclUpdateReturnInfo
TclWordEnd
Tcl_AddErrorInfo
Tcl_AddObjErrorInfo
Tcl_AfterCmd
Tcl_Alloc
Tcl_AllowExceptions
Tcl_AppendAllObjTypes
Tcl_AppendElement
Tcl_AppendObjCmd
Tcl_AppendResult
Tcl_AppendStringsToObj
Tcl_AppendToObj
Tcl_ArrayObjCmd
Tcl_AsyncCreate
Tcl_AsyncDelete
Tcl_AsyncInvoke
Tcl_AsyncMark
Tcl_AsyncReady
Tcl_BackgroundError
Tcl_Backslash
Tcl_BeepObjCmd
Tcl_BinaryObjCmd
Tcl_BreakCmd
Tcl_CallWhenDeleted
Tcl_CancelIdleCall
Tcl_CaseObjCmd
Tcl_CatchObjCmd
Tcl_ClockObjCmd
Tcl_Close
Tcl_CommandComplete
Tcl_Concat
Tcl_ConcatObj
Tcl_ConcatObjCmd
Tcl_ContinueCmd
Tcl_ConvertCountedElement
Tcl_ConvertElement
Tcl_ConvertToType
Tcl_CreateAlias
Tcl_CreateAliasObj
Tcl_CreateChannel
Tcl_CreateChannelHandler
Tcl_CreateCloseHandler
Tcl_CreateCommand
Tcl_CreateEventSource
Tcl_CreateExitHandler
Tcl_CreateInterp
Tcl_CreateMathFunc
Tcl_CreateNamespace
Tcl_CreateObjCommand
Tcl_CreateSlave
Tcl_CreateTimerHandler
Tcl_CreateTrace
Tcl_DStringAppend
Tcl_DStringAppendElement
Tcl_DStringEndSublist
Tcl_DStringFree
Tcl_DStringGetResult
Tcl_DStringInit
Tcl_DStringResult
Tcl_DStringSetLength
Tcl_DStringStartSublist
Tcl_DbCkalloc
Tcl_DbCkfree
Tcl_DbCkrealloc
Tcl_DbDecrRefCount
Tcl_DbIsShared
Tcl_DbIncrRefCount
Tcl_DbNewBooleanObj
Tcl_DbNewDoubleObj
Tcl_DbNewListObj
Tcl_DbNewLongObj
Tcl_DbNewObj
Tcl_DbNewStringObj
Tcl_DeleteAssocData
Tcl_DeleteChannelHandler
Tcl_DeleteCloseHandler
Tcl_DeleteCommand
Tcl_DeleteCommandFromToken
Tcl_DeleteEventSource
Tcl_DeleteEvents
Tcl_DeleteExitHandler
Tcl_DeleteHashEntry
Tcl_DeleteHashTable
Tcl_DeleteInterp
Tcl_DeleteNamespace
Tcl_DeleteTimerHandler
Tcl_DeleteTrace
Tcl_DoOneEvent
Tcl_DoWhenIdle
Tcl_DontCallWhenDeleted
Tcl_DumpActiveMemory
Tcl_DuplicateObj
Tcl_EchoCmd
Tcl_Eof
Tcl_ErrnoId
Tcl_ErrnoMsg
Tcl_ErrorObjCmd
Tcl_Eval
Tcl_EvalFile
Tcl_EvalObj
Tcl_EvalObjCmd
Tcl_EventuallyFree
Tcl_ExecCmd
Tcl_Exit
Tcl_ExitObjCmd
Tcl_ExposeCommand
Tcl_ExprBoolean
Tcl_ExprBooleanObj
Tcl_ExprDouble
Tcl_ExprDoubleObj
Tcl_ExprLong
Tcl_ExprLongObj
Tcl_ExprObjCmd
Tcl_ExprString
Tcl_FconfigureCmd
Tcl_FcopyObjCmd
Tcl_FileEventCmd
Tcl_FileObjCmd
Tcl_Finalize
Tcl_FindCommand
Tcl_FindExecutable
Tcl_FindNamespace
Tcl_FindNamespaceVar
Tcl_FirstHashEntry
Tcl_Flush
Tcl_FlushObjCmd
Tcl_ForCmd
Tcl_ForeachObjCmd
Tcl_ForgetImport
Tcl_FormatCmd
Tcl_Free
Tcl_FreeResult
Tcl_GetAlias
Tcl_GetAliasObj
Tcl_GetAssocData
Tcl_GetBoolean
Tcl_GetBooleanFromObj
Tcl_GetChannel
Tcl_GetChannelBufferSize
Tcl_GetChannelHandle
Tcl_GetChannelInstanceData
Tcl_GetChannelMode
Tcl_GetChannelName
Tcl_GetChannelOption
Tcl_GetChannelType
Tcl_GetCommandFromObj
Tcl_GetCommandFullName
Tcl_GetCommandInfo
Tcl_GetCommandName
Tcl_GetCurrentNamespace
Tcl_GetDouble
Tcl_GetDoubleFromObj
Tcl_GetErrno
Tcl_GetGlobalNamespace
Tcl_GetHostName
Tcl_GetIndexFromObj
Tcl_GetInt
Tcl_GetIntFromObj
Tcl_GetInterpPath
Tcl_GetLongFromObj
Tcl_GetMaster
Tcl_GetOSTypeFromObj
Tcl_GetObjResult
Tcl_GetObjType
Tcl_GetPathType
Tcl_GetServiceMode
Tcl_GetSlave
Tcl_GetStdChannel
Tcl_GetStringFromObj
Tcl_GetStringResult
Tcl_GetVar
Tcl_GetVar2
Tcl_GetVariableFullName
Tcl_Gets
Tcl_GetsObj
Tcl_GetsObjCmd
Tcl_GlobCmd
Tcl_GlobalEval
Tcl_GlobalEvalObj
Tcl_GlobalObjCmd
Tcl_HashStats
Tcl_HideCommand
Tcl_IfCmd
Tcl_Import
Tcl_IncrCmd
Tcl_InfoObjCmd
Tcl_Init
Tcl_InitHashTable
Tcl_InitMemory
Tcl_InputBlocked
Tcl_InputBuffered
Tcl_InterpDeleted
Tcl_InterpObjCmd
Tcl_IsSafe
Tcl_JoinObjCmd
Tcl_JoinPath
Tcl_LappendObjCmd
Tcl_LindexObjCmd
Tcl_LinkVar
Tcl_LinsertObjCmd
Tcl_ListObjAppendElement
Tcl_ListObjAppendList
Tcl_ListObjCmd
Tcl_ListObjGetElements
Tcl_ListObjIndex
Tcl_ListObjLength
Tcl_ListObjReplace
Tcl_LlengthObjCmd
Tcl_LoadCmd
Tcl_LrangeObjCmd
Tcl_LreplaceObjCmd
Tcl_LsCmd
Tcl_LsearchObjCmd
Tcl_LsortObjCmd
Tcl_MacConvertTextResource
Tcl_MacEvalResource
Tcl_MacFindResource
Tcl_MacSetEventProc
Tcl_MacSourceObjCmd
Tcl_Main
Tcl_MakeSafe
Tcl_MakeTcpClientChannel
Tcl_Merge
Tcl_NamespaceObjCmd
Tcl_NewBooleanObj
Tcl_NewDoubleObj
Tcl_NewIntObj
Tcl_NewListObj
Tcl_NewLongObj
Tcl_NewOSTypeObj
Tcl_NewObj
Tcl_NewStringObj
Tcl_NextHashEntry
Tcl_NotifyChannel
Tcl_ObjGetVar2
Tcl_ObjSetVar2
Tcl_OpenCmd
Tcl_OpenFileChannel
Tcl_OpenTcpClient
Tcl_OpenTcpServer
Tcl_PackageCmd
Tcl_ParseVar
Tcl_PidObjCmd
Tcl_PkgProvide
Tcl_PkgRequire
Tcl_PopCallFrame
Tcl_PosixError
Tcl_Preserve
Tcl_PrintDouble
Tcl_ProcObjCmd
Tcl_PushCallFrame
Tcl_PutEnv
Tcl_PutsObjCmd
Tcl_PwdCmd
Tcl_QueueEvent
Tcl_Read
Tcl_ReadObjCmd
Tcl_Realloc
Tcl_RecordAndEval
Tcl_RegExpCompile
Tcl_RegExpExec
Tcl_RegExpMatch
Tcl_RegExpRange
Tcl_RegexpCmd
Tcl_RegisterChannel
Tcl_RegisterObjType
Tcl_RegsubCmd
Tcl_Release
Tcl_RenameObjCmd
Tcl_ResetResult
Tcl_ResourceObjCmd
Tcl_ReturnObjCmd
Tcl_ScanCmd
Tcl_ScanCountedElement
Tcl_ScanElement
Tcl_Seek
Tcl_SeekCmd
Tcl_ServiceAll
Tcl_ServiceEvent
Tcl_SetAssocData
Tcl_SetBooleanObj
Tcl_SetChannelBufferSize
Tcl_SetChannelOption
Tcl_SetCmd
Tcl_SetCommandInfo
Tcl_SetDoubleObj
Tcl_SetErrno
Tcl_SetErrorCode
Tcl_SetIntObj
Tcl_SetListObj
Tcl_SetLongObj
Tcl_SetMaxBlockTime
Tcl_SetOSTypeObj
Tcl_SetObjErrorCode
Tcl_SetObjLength
Tcl_SetObjResult
Tcl_SetPanicProc
Tcl_SetRecursionLimit
Tcl_SetResult
Tcl_SetServiceMode
Tcl_SetStdChannel
Tcl_SetStringObj
Tcl_SetTimer
Tcl_SetVar
Tcl_SetVar2
Tcl_SignalId
Tcl_SignalMsg
Tcl_Sleep
Tcl_SocketCmd
Tcl_SourceObjCmd
Tcl_SourceRCFile
Tcl_SplitList
Tcl_SplitPath
Tcl_StaticPackage
Tcl_StringMatch
Tcl_StringObjCmd
Tcl_SubstCmd
Tcl_SwitchObjCmd
Tcl_Tell
Tcl_TellCmd
Tcl_TimeObjCmd
Tcl_TraceCmd
Tcl_TraceVar
Tcl_TraceVar2
Tcl_TranslateFileName
Tcl_Ungets
Tcl_UnlinkVar
Tcl_UnregisterChannel
Tcl_UnsetObjCmd
Tcl_UnsetVar
Tcl_UnsetVar2
Tcl_UntraceVar
Tcl_UntraceVar2
Tcl_UpVar
Tcl_UpVar2
Tcl_UpdateCmd
Tcl_UpdateLinkedVar
Tcl_UplevelObjCmd
Tcl_UpvarObjCmd
Tcl_ValidateAllMemory
Tcl_VarEval
Tcl_VarTraceInfo
Tcl_VarTraceInfo2
Tcl_VariableObjCmd
Tcl_VwaitCmd
Tcl_WaitForEvent
Tcl_WaitPid
Tcl_WhileCmd
Tcl_Write
Tcl_WrongNumArgs
TclpAlloc
TclpCopyDirectory
TclpCopyFile
TclpCreateDirectory
TclpDeleteFile
TclpFree
TclpGetClicks
TclpGetDate
TclpGetSeconds
TclpGetTime
TclpGetTimeZone
TclpListVolumes
TclpRealloc
TclpRemoveDirectory
TclpRenameFile
TrapExists
TruncPString
UnlockRange
UnmountAndEject
Unshare
VolumeMount
WriteCharsToConsole
XGetVInfo
_Ctype
_Stderr
_Stoul
abort
abs
acosf
appMemory
asctime
asinf
atan
atan2
atan2_d_dd
atan2_d_pdpd
atan2_r_prpr
atan2_r_rr
atan2f
atan_d_d
atan_d_pd
atan_r_pr
atan_r_r
atanf
atexit
atof
atoi
atol
bsearch
builtinFuncTable
calloc
ccommand
ceilf
chdir
clearerr
clock
close
closeUPP
completeUPP
cos
cos_d_d
cos_d_pd
cos_r_pr
cos_r_r
cosf
coshf
creat
ctime
cuserid
difftime
div
environ
errno
exec
exit
exp
exp_d_d
exp_d_pd
exp_r_pr
exp_r_r
expf
fabsf
fclose
fcntl
fdopen
feof
ferror
fflush
fgetc
fgetpos
fgets
fileno
floorf
fmodf
fopen
fprintf
fputc
fputs
fread
free
freopen
frexpf
fscanf
fseek
fsetpos
fstat
ftell
fwrite
getStdChannelsProc
getc
getchar
getcwd
getenv
getlogin
gets
gmtime
instructionTable
isalnum
isalpha
isatty
iscntrl
isdigit
isgraph
islower
isprint
ispunct
isspace
isupper
isxdigit
labs
ldexpf
ldiv
localeconv
localtime
log
log10
log10_d_d
log10_d_pd
log10f
log_d_d
log_d_pd
logf
longjmp
lseek
malloc
mblen
mbstowcs
mbtowc
memchr
memcmp
memcpy
memmove
memset
mkdir
mktime
open
panic
panicProc
perror
pow
power_d_dd
powf
printf
putc
putchar
puts
qsort
raise
rand
read
realloc
remove
rename
resultUPP
rewind
rmdir
scanf
setbuf
setlocale
setvbuf
signal
sin
sin_d_d
sin_d_pd
sin_r_pr
sin_r_r
sinf
sinhf
sleep
sprintf
sqrt
sqrt_d_d
sqrt_d_pd
sqrt_r_pr
sqrt_r_r
sqrtf
srand
sscanf
stat
strcasecmp
strcat
strchr
strcmp
strcoll
strcpy
strcspn
strerror
strftime
strlen
strncasecmp
strncat
strncmp
strncpy
strpbrk
strrchr
strspn
strstr
strtod
strtok
strtol
strtoul
strxfrm
system
systemMemory
tanf
tanhf
tclBooleanType
tclByteCodeType
tclCmdNameType
tclDoubleType
tclDummyLinkVarPtr
tclExecutableName
tclFreeObjList
tclIndexType
tclIntType
tclListType
tclMemDumpFileName
tclNsNameType
tclPlatform
tclStringType
tclTraceCompile
tclTraceExec
tclTypeTable
tcl_MathInProgress
tclpFileAttrProcs
tclpFileAttrStrings
tell
time
tmpfile
tmpnam
tolower
toupper
ttyname
uname
ungetc
unlink
utime
utimes
vfprintf
vprintf
vsprintf
wcstombs
wctob
wctomb
write
#DTGetAPPL
#DTGetComment
#FSpDTGetAPPL
#FSpDTGetComment
#TclMacInitializeFragment
#TclMacTerminateFragment
#_Aldata
#_Assert
#_Atcount
#_Atfuns
#_Clocale
#_Closreg
#_Costate
#_Daysto
#_Dbl
#_Defloc
#_Environ
#_Environ1
#_Fgpos
#_Files
#_Flt
#_Fopen
#_Foprep
#_Fread
#_Freeloc
#_Frprep
#_Fspos
#_Fwprep
#_Fwrite
#_Genld
#_Gentime
#_Getdst
#_Getfld
#_Getfloat
#_Getint
#_Getloc
#_Getmem
#_Getstr
#_Gettime
#_Getzone
#_Isdst
#_Ldbl
#_Ldtob
#_Litob
#_Locale
#_Locsum
#_Loctab
#_Locterm
#_Locvar
#_MWERKS_Atcount
#_MWERKS_Atfuns
#_Makeloc
#_Makestab
#_Makewct
#_Mbcurmax
#_Mbstate
#_Mbtowc
#_Nnl
#_PJP_C_Copyright
#_Printf
#_Putfld
#_Putstr
#_Puttxt
#_Randseed
#_Readloc
#_Scanf
#_Setloc
#_Skip
#_Stdin
#_Stdout
#_Stod
#_Stof
#_Stoflt
#_Stold
#_Strerror
#_Strftime
#_Strxfrm
#_Times
#_Tolower
#_Toupper
#_Ttotm
#_WCostate
#_Wcstate
#_Wctob
#_Wctomb
#_Wctrans
#_Wctype
#__CheckForSystem7
#__RemoveConsoleHandler__
#__aborting
#__ctopstring
#__cvt_fp2unsigned
#__getcreator
#__gettype
#__initialize
#__myraise
#__ptmf_null
#__ptr_glue
#__system7present
#__terminate
#__ttyname
#_atexit
#_exit
#_fcreator
#_ftype
Changes to mac/tclMacSock.c.
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10

11
12
13
14
15
16
17
18










-
+







/* 
 * tclMacSock.c
 *
 *	Channel drivers for Macintosh sockets.
 *
 * Copyright (c) 1996-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacSock.c,v 1.7 2000/04/24 06:43:29 jingham Exp $
 * RCS: @(#) $Id: tclMacSock.c,v 1.7.2.4 2002/04/08 08:59:11 das Exp $
 */

#include "tclInt.h"
#include "tclPort.h"
#include "tclMacInt.h"
#include <AddressXlation.h>
#include <Aliases.h>
71
72
73
74
75
76
77
78

79
80
81
82
83
84
85
71
72
73
74
75
76
77

78
79
80
81
82
83
84
85







-
+







    int port;			   /* The port we are connected to. */
    int flags;			   /* Bit field comprised of the flags
				    * described below.  */
    int checkMask;		   /* OR'ed combination of TCL_READABLE and
				    * TCL_WRITABLE as set by an asynchronous
				    * event handler. */
    int watchMask;		   /* OR'ed combination of TCL_READABLE and
				    * TCL_WRITABLE as set by Tcl_WatchFile. */
				    * TCL_WRITABLE as set by TcpWatch. */
    Tcl_TcpAcceptProc *acceptProc; /* Proc to call on accept. */
    ClientData acceptProcData;	   /* The data for the accept proc. */
    wdsEntry dataSegment[2];       /* List of buffers to be written async. */
    rdsEntry rdsarray[5+1];	   /* Array used when cleaning out recieve 
				    * buffers on a closing socket. */
    Tcl_Channel channel;	   /* Channel associated with this socket. */
    int writeBufferSize;           /* Size of buffer to hold data for
192
193
194
195
196
197
198
199

200
201
202
203
204
205
206
192
193
194
195
196
197
198

199
200
201
202
203
204
205
206







-
+







/*
 * This structure describes the channel type structure for TCP socket
 * based IO:
 */

static Tcl_ChannelType tcpChannelType = {
    "tcp",			/* Type name. */
    TcpBlockMode,		/* Set blocking or
    (Tcl_ChannelTypeVersion)TcpBlockMode,		/* Set blocking or
                                 * non-blocking mode.*/
    TcpClose,			/* Close proc. */
    TcpInput,			/* Input proc. */
    TcpOutput,			/* Output proc. */
    NULL,			/* Seek proc. */
    NULL,			/* Set option proc. */
    TcpGetOptionProc,		/* Get option proc. */
1350
1351
1352
1353
1354
1355
1356
1357

1358
1359
1360
1361
1362
1363

1364
1365
1366
1367
1368
1369
1370
1350
1351
1352
1353
1354
1355
1356

1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371







-
+






+







                                         * retrieve the value for, or
                                         * NULL to get all options and
                                         * their values. */
    Tcl_DString *dsPtr)			/* Where to store the computed
                                         * value; initialized by caller. */
{
    TcpState *statePtr = (TcpState *) instanceData;
    int doPeerName = false, doSockName = false, doAll = false;
    int doPeerName = false, doSockName = false, doError = false, doAll = false;
    ip_addr tcpAddress;
    char buffer[128];
    OSErr err;
    Tcl_DString dString;
    TCPiopb statusPB;
    int errorCode;
    size_t len = 0;

    /*
     * If an asynchronous connect is in progress, attempt to wait for it
     * to complete before accessing the socket state.
     */
    
    if ((statePtr->flags & TCP_ASYNC_CONNECT)
1384
1385
1386
1387
1388
1389
1390

1391

1392
1393

1394



1395
1396
1397






















1398
1399
1400
1401
1402
1403
1404
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







+
-
+

-
+

+
+
+


-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







     * Determine which options we need to do.  Do all of them
     * if optionName is NULL.
     */

    if (optionName == (char *) NULL || optionName[0] == '\0') {
        doAll = true;
    } else {
	len = strlen(optionName);
	if (!strcmp(optionName, "-peername")) {
	if (!strncmp(optionName, "-peername", len)) {
	    doPeerName = true;
	} else if (!strcmp(optionName, "-sockname")) {
	} else if (!strncmp(optionName, "-sockname", len)) {
	    doSockName = true;
	} else if (!strncmp(optionName, "-error", len)) {
	    /* SF Bug #483575 */
	    doError = true;
	} else {
	    return Tcl_BadChannelOption(interp, optionName, 
	    		"peername sockname");
		        "error peername sockname");
	}
    }

    /*
     * SF Bug #483575
     *
     * Return error information. Currently we ignore
     * this option. IOW, we always return the empty
     * string, signaling 'no error'.
     *
     * FIXME: Get a mac/socket expert to write a correct
     * FIXME: implementation.
     */

    if (doAll || doError) {
	if (doAll) {
	    Tcl_DStringAppendElement(dsPtr, "-error");
	    Tcl_DStringAppendElement(dsPtr, "");
	} else {
	    Tcl_DStringAppend (dsPtr, "", -1);
	    return TCL_OK;
	}
    }

    /*
     * Get status on the stream.  Make sure to use a new pb struct because
     * the struct in the statePtr may be part of an asyncronous call.
     */
Changes to mac/tclMacThrd.c.
120
121
122
123
124
125
126
127

128
129
130
131
132
133
134
120
121
122
123
124
125
126

127
128
129
130
131
132
133
134







-
+







    if (stackSize == TCL_THREAD_STACK_DEFAULT) {
        stackSize = TCL_MAC_THRD_DEFAULT_STACK;
    }

#if TARGET_CPU_68K && TARGET_RT_MAC_CFM
    {
        ThreadEntryProcPtr entryProc;
        entryProc = NewThreadEntryProc(proc);
        entryProc = NewThreadEntryUPP(proc);
        
        NewThread(kCooperativeThread, entryProc, (void *) clientData, 
            stackSize, kCreateIfNeeded, NULL, (ThreadID *) idPtr);
    }
#else
    NewThread(kCooperativeThread, proc, (void *) clientData, 
        stackSize, kCreateIfNeeded, NULL, (ThreadID *) idPtr);
Changes to mac/tclMacTime.c.
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
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











-
+




+












+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+





+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







/* 
 * tclMacTime.c --
 *
 *	Contains Macintosh specific versions of Tcl functions that
 *	obtain time values from the operating system.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacTime.c,v 1.3 1999/03/10 05:52:51 stanton Exp $
 * RCS: @(#) $Id: tclMacTime.c,v 1.3.14.2 2002/04/08 08:59:16 das Exp $
 */

#include "tclInt.h"
#include "tclPort.h"
#include "tclMacInt.h"
#include <OSUtils.h>
#include <Timer.h>
#include <time.h>

/*
 * Static variables used by the TclpGetTime function.
 */
 
static int initalized = false;
static unsigned long baseSeconds;
static UnsignedWide microOffset;

static int gmt_initialized = false;
static long gmt_offset;
static int gmt_isdst;
TCL_DECLARE_MUTEX(gmtMutex)

static int gmt_lastGetDateUseGMT = 0;

typedef struct _TABLE {
    char        *name;
    int         type;
    time_t      value;
} TABLE;


#define HOUR(x)         ((time_t) (3600 * x))

#define tZONE 0
#define tDAYZONE 1


/*
 * inverse timezone table, adapted from tclDate.c by removing duplicates and
 * adding some made up names for unusual daylight savings
 */
static TABLE    invTimezoneTable[] = {
    { "Z",    -1,     HOUR( 36) },      /* Unknown */
    { "GMT",    tZONE,     HOUR( 0) },      /* Greenwich Mean */
    { "BST",    tDAYZONE,  HOUR( 0) },      /* British Summer */
    { "WAT",    tZONE,     HOUR( 1) },      /* West Africa */
    { "WADST",  tDAYZONE,  HOUR( 1) },      /* West Africa Daylight*/
    { "AT",     tZONE,     HOUR( 2) },      /* Azores Daylight*/
    { "ADST",   tDAYZONE,  HOUR( 2) },      /* Azores */
    { "NFT",    tZONE,     HOUR( 7/2) },    /* Newfoundland */
    { "NDT",    tDAYZONE,  HOUR( 7/2) },    /* Newfoundland Daylight */
    { "AST",    tZONE,     HOUR( 4) },      /* Atlantic Standard */
    { "ADT",    tDAYZONE,  HOUR( 4) },      /* Atlantic Daylight */
    { "EST",    tZONE,     HOUR( 5) },      /* Eastern Standard */
    { "EDT",    tDAYZONE,  HOUR( 5) },      /* Eastern Daylight */
    { "CST",    tZONE,     HOUR( 6) },      /* Central Standard */
    { "CDT",    tDAYZONE,  HOUR( 6) },      /* Central Daylight */
    { "MST",    tZONE,     HOUR( 7) },      /* Mountain Standard */
    { "MDT",    tDAYZONE,  HOUR( 7) },      /* Mountain Daylight */
    { "PST",    tZONE,     HOUR( 8) },      /* Pacific Standard */
    { "PDT",    tDAYZONE,  HOUR( 8) },      /* Pacific Daylight */
    { "YST",    tZONE,     HOUR( 9) },      /* Yukon Standard */
    { "YDT",    tDAYZONE,  HOUR( 9) },      /* Yukon Daylight */
    { "HST",    tZONE,     HOUR(10) },      /* Hawaii Standard */
    { "HDT",    tDAYZONE,  HOUR(10) },      /* Hawaii Daylight */
    { "NT",     tZONE,     HOUR(11) },      /* Nome */
    { "NST",    tDAYZONE,  HOUR(11) },      /* Nome Daylight*/
    { "IDLW",   tZONE,     HOUR(12) },      /* International Date Line West */
    { "CET",    tZONE,    -HOUR( 1) },      /* Central European */
    { "CEST",   tDAYZONE, -HOUR( 1) },      /* Central European Summer */
    { "EET",    tZONE,    -HOUR( 2) },      /* Eastern Europe, USSR Zone 1 */
    { "EEST",   tDAYZONE, -HOUR( 2) },      /* Eastern Europe, USSR Zone 1 Daylight*/
    { "BT",     tZONE,    -HOUR( 3) },      /* Baghdad, USSR Zone 2 */
    { "BDST",   tDAYZONE, -HOUR( 3) },      /* Baghdad, USSR Zone 2 Daylight*/
    { "IT",     tZONE,    -HOUR( 7/2) },    /* Iran */
    { "IDST",   tDAYZONE, -HOUR( 7/2) },    /* Iran Daylight*/
    { "ZP4",    tZONE,    -HOUR( 4) },      /* USSR Zone 3 */
    { "ZP4S",   tDAYZONE, -HOUR( 4) },      /* USSR Zone 3 */
    { "ZP5",    tZONE,    -HOUR( 5) },      /* USSR Zone 4 */
    { "ZP5S",   tDAYZONE, -HOUR( 5) },      /* USSR Zone 4 */
    { "IST",    tZONE,    -HOUR(11/2) },    /* Indian Standard */
    { "ISDST",  tDAYZONE, -HOUR(11/2) },    /* Indian Standard */
    { "ZP6",    tZONE,    -HOUR( 6) },      /* USSR Zone 5 */
    { "ZP6S",   tDAYZONE, -HOUR( 6) },      /* USSR Zone 5 */
    { "WAST",   tZONE,    -HOUR( 7) },      /* West Australian Standard */
    { "WADT",   tDAYZONE, -HOUR( 7) },      /* West Australian Daylight */
    { "JT",     tZONE,    -HOUR(15/2) },    /* Java (3pm in Cronusland!) */
    { "JDST",   tDAYZONE, -HOUR(15/2) },    /* Java (3pm in Cronusland!) */
    { "CCT",    tZONE,    -HOUR( 8) },      /* China Coast, USSR Zone 7 */
    { "CCST",   tDAYZONE, -HOUR( 8) },      /* China Coast, USSR Zone 7 */
    { "JST",    tZONE,    -HOUR( 9) },      /* Japan Standard, USSR Zone 8 */
    { "JSDST",  tDAYZONE, -HOUR( 9) },      /* Japan Standard, USSR Zone 8 */
    { "CAST",   tZONE,    -HOUR(19/2) },    /* Central Australian Standard */
    { "CADT",   tDAYZONE, -HOUR(19/2) },    /* Central Australian Daylight */
    { "EAST",   tZONE,    -HOUR(10) },      /* Eastern Australian Standard */
    { "EADT",   tDAYZONE, -HOUR(10) },      /* Eastern Australian Daylight */
    { "NZT",    tZONE,    -HOUR(12) },      /* New Zealand */
    { "NZDT",   tDAYZONE, -HOUR(12) },      /* New Zealand Daylight */
    {  NULL  }
};

/*
 * Prototypes for procedures that are private to this file:
 */

static void SubtractUnsignedWide _ANSI_ARGS_((UnsignedWide *x,
	UnsignedWide *y, UnsignedWide *result));

/*
 *-----------------------------------------------------------------------------
 *
 * TclpGetGMTOffset --
 *
 *	This procedure gets the offset seconds that needs to be _added_ to tcl time
 *  in seconds (i.e. GMT time) to get local time needed as input to various
 *  Mac OS APIs, to convert Mac OS API output to tcl time, _subtract_ this value.
 *
 * Results:
 *	Number of seconds separating GMT time and mac.
 *
 * Side effects:
 *	None.
 *
 *-----------------------------------------------------------------------------
 */

long
TclpGetGMTOffset()
{
    if (gmt_initialized == false) {
	MachineLocation loc;
	
    Tcl_MutexLock(&gmtMutex);
	ReadLocation(&loc);
	gmt_offset = loc.u.gmtDelta & 0x00ffffff;
	if (gmt_offset & 0x00800000) {
	    gmt_offset = gmt_offset | 0xff000000;
	}
	gmt_isdst=(loc.u.dlsDelta < 0);
	gmt_initialized = true;
    Tcl_MutexUnlock(&gmtMutex);
    }
	return (gmt_offset);
}

/*
 *-----------------------------------------------------------------------------
 *
 * TclpGetSeconds --
 *
 *	This procedure returns the number of seconds from the epoch.  On
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
175
176
177
178
179
180
181



182








183
184




185
186
187
188
189
190
191







-
-
-
+
-
-
-
-
-
-
-
-
+
+
-
-
-
-







 *-----------------------------------------------------------------------------
 */

unsigned long
TclpGetSeconds()
{
    unsigned long seconds;
    MachineLocation loc;
    long int offset;
    

    ReadLocation(&loc);
    offset = loc.u.gmtDelta & 0x00ffffff;
    if (offset & 0x00800000) {
	offset = offset | 0xff000000;
    }

    if (ReadDateTime(&seconds) == noErr) {
	return (seconds - offset);
    GetDateTime(&seconds);
	return (seconds - TclpGetGMTOffset() + tcl_mac_epoch_offset);
    } else {
	panic("Can't get time.");
	return 0;
    }
}

/*
 *-----------------------------------------------------------------------------
 *
 * TclpGetClicks --
 *
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
229
230
231
232
233
234
235


236






237
238
239
240
241

242
243

244
245
246
247
248
249
250
251







-
-
+
-
-
-
-
-
-





-
+

-
+







 *----------------------------------------------------------------------
 */

int
TclpGetTimeZone (
    unsigned long  currentTime)		/* Ignored on Mac. */
{
    MachineLocation loc;
    long int offset;
    long offset;

    ReadLocation(&loc);
    offset = loc.u.gmtDelta & 0x00ffffff;
    if (offset & 0x00700000) {
	offset |= 0xff000000;
    }

    /*
     * Convert the Mac offset from seconds to minutes and
     * add an hour if we have daylight savings time.
     */
    offset = -offset;
    offset = -TclpGetGMTOffset();
    offset /= 60;
    if (loc.u.dlsDelta < 0) {
    if (gmt_isdst) {
	offset += 60;
    }
    
    return offset;
}

/*
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
271
272
273
274
275
276
277









278





279
280
281

282
283
284
285
286
287
288
289







-
-
-
-
-
-
-
-
-
+
-
-
-
-
-



-
+







{
    UnsignedWide micro;
#ifndef NO_LONG_LONG
    long long *microPtr;
#endif
	
    if (initalized == false) {
        MachineLocation loc;
        long int offset;
    
        ReadLocation(&loc);
        offset = loc.u.gmtDelta & 0x00ffffff;
        if (offset & 0x00800000) {
            offset = offset | 0xff000000;
	}
	if (ReadDateTime(&baseSeconds) != noErr) {
	GetDateTime(&baseSeconds);
	    /*
	     * This should never happen!
	     */
	    return;
	}
	/*
	 * Remove the local offset that ReadDateTime() adds.
	 */
	baseSeconds -= offset;
	baseSeconds -= TclpGetGMTOffset() - tcl_mac_epoch_offset;
	Microseconds(&microOffset);
	initalized = true;
    }

    Microseconds(&micro);

#ifndef NO_LONG_LONG
242
243
244
245
246
247
248
249
250

251
252
253
254
255
256
257
258
259



260
261
262
263
264
265

266
267
268
269
270
271
272
273
274
275
276
277
278
279



280


281
282





































283
284
285
286
287
288
289
332
333
334
335
336
337
338


339
340
341
342
343





344
345
346






347

348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363

364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411







-
-
+




-
-
-
-
-
+
+
+
-
-
-
-
-
-
+
-













+
+
+
-
+
+


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







struct tm *
TclpGetDate(
    TclpTime_t time,	/* Time struct to fill. */
    int useGMT)		/* True if date should reflect GNT time. */
{
    const time_t *tp = (const time_t *)time;
    DateTimeRec dtr;
    MachineLocation loc;
    long int offset;
    unsigned long offset=0L;
    static struct tm statictime;
    static const short monthday[12] =
        {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};

    ReadLocation(&loc);
	
    if (useGMT) {
	SecondsToDate(*tp, &dtr);
    } else {
	if(useGMT)
		SecondsToDate(*tp - tcl_mac_epoch_offset, &dtr);
	else
	offset = loc.u.gmtDelta & 0x00ffffff;
	if (offset & 0x00700000) {
	    offset |= 0xff000000;
	}
	
	SecondsToDate(*tp + offset, &dtr);
		SecondsToDate(*tp + TclpGetGMTOffset() - tcl_mac_epoch_offset, &dtr);
    }

    statictime.tm_sec = dtr.second;
    statictime.tm_min = dtr.minute;
    statictime.tm_hour = dtr.hour;
    statictime.tm_mday = dtr.day;
    statictime.tm_mon = dtr.month - 1;
    statictime.tm_year = dtr.year - 1900;
    statictime.tm_wday = dtr.dayOfWeek - 1;
    statictime.tm_yday = monthday[statictime.tm_mon]
	+ statictime.tm_mday - 1;
    if (1 < statictime.tm_mon && !(statictime.tm_year & 3)) {
	++statictime.tm_yday;
    }
    if(useGMT)
    	statictime.tm_isdst = 0;
    else
    statictime.tm_isdst = loc.u.dlsDelta;
    	statictime.tm_isdst = gmt_isdst;
    gmt_lastGetDateUseGMT=useGMT; /* hack to make TclpGetTZName below work */
    return(&statictime);
}

/*
 *----------------------------------------------------------------------
 *
 * TclpGetTZName --
 *
 *	Gets the current timezone string.
 *
 * Results:
 *	Returns a pointer to a static string, or NULL on failure.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

char *
TclpGetTZName(int dst)
{
    register TABLE *tp;
	long zonevalue=-TclpGetGMTOffset();
		
    if (gmt_isdst)
        zonevalue += HOUR(1);

	if(gmt_lastGetDateUseGMT) /* hack: if last TclpGetDate was called */
		zonevalue=0;          /* with useGMT==1 then we're using GMT  */

    for (tp = invTimezoneTable; tp->name; tp++) {
        if ((tp->value == zonevalue) && (tp->type == dst)) break;
    }
	if(!tp->name)
		tp = invTimezoneTable; /* default to unknown */

    return tp->name;
}

#ifdef NO_LONG_LONG
/*
 *----------------------------------------------------------------------
 *
 * SubtractUnsignedWide --
 *
Changes to mac/tclMacUnix.c.
8
9
10
11
12
13
14
15

16
17
18
19
20
21
22
8
9
10
11
12
13
14

15
16
17
18
19
20
21
22







-
+







 *
 * Copyright (c) 1993-1994 Lockheed Missle & Space Company, AI Center
 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacUnix.c,v 1.3 1999/04/16 00:47:22 stanton Exp $
 * RCS: @(#) $Id: tclMacUnix.c,v 1.3.12.1 2001/04/04 21:22:19 hobbs Exp $
 */

#include <Files.h>
#include <Strings.h>
#include <TextUtils.h>
#include <Finder.h>
#include <FSpCompat.h>
202
203
204
205
206
207
208
209

210
211
212
213
214
215
216
202
203
204
205
206
207
208

209
210
211
212
213
214
215
216







-
+







    if (Tcl_GlobObjCmd(NULL, interp, objc + 1, objv - 1) != TCL_OK) {
    	Tcl_ResetResult(interp);
    	return TCL_ERROR;
    }

    resultObjPtr = Tcl_GetObjResult(interp);
    Tcl_IncrRefCount(resultObjPtr);
    if (Tcl_ListObjGetElements(interp, resultObjPtr, &objc, &objv) != TCL_OK) {
    if (Tcl_ListObjGetElements(interp, resultObjPtr, &objc, (Tcl_Obj ***)&objv) != TCL_OK) {
    	Tcl_DecrRefCount(resultObjPtr);
    	return TCL_ERROR;
    }

    Tcl_ResetResult(interp);

    /*
Changes to mac/tclMacUtil.c.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







/* 
 * tclMacUtil.c --
 *
 *  This contains utility functions used to help with
 *  implementing Macintosh specific portions of the Tcl port.
 *
 * Copyright (c) 1993-1994 Lockheed Missle & Space Company, AI Center
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacUtil.c,v 1.4 2000/04/17 01:52:56 jingham Exp $
 * RCS: @(#) $Id: tclMacUtil.c,v 1.4.2.1 2001/04/04 21:22:19 hobbs Exp $
 */

#include "tcl.h"
#include "tclInt.h"
#include "tclMacInt.h"
#include "tclMath.h"
#include "tclMacPort.h"
49
50
51
52
53
54
55
56

57
58
59
60
61
62
63
49
50
51
52
53
54
55

56
57
58
59
60
61
62
63







-
+







 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */
 
#if defined(THINK_C) || defined(__MWERKS__)
#if defined(THINK_C)
double hypotd(double x, double y);

double
hypotd(
    double x,		/* X value */
    double y)		/* Y value */
{
416
417
418
419
420
421
422
423

424
425
426
427
428
429
430
431
432
433
434
435
436
437
438

439
440
441
442
443
444
445


















416
417
418
419
420
421
422

423
424
425
426
427
428
429
430
431
432
433
434
435
436
437

438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463







-
+














-
+







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

    return err;
}

/*
 *----------------------------------------------------------------------
 *
 * GetGlobalMouse --
 * GetGlobalMouseTcl --
 *
 *	This procedure obtains the current mouse position in global
 *	coordinates.
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

void
GetGlobalMouse(
GetGlobalMouseTcl(
    Point *mouse)		/* Mouse position. */
{
    EventRecord event;
    
    OSEventAvail(0, &event);
    *mouse = event.where;
}

pascal OSErr	FSpGetDirectoryIDTcl (CONST FSSpec * spec, 
				long * theDirID, Boolean * isDirectory)
{
	return(FSpGetDirectoryID(spec, theDirID, isDirectory));
}

pascal short	FSpOpenResFileCompatTcl (CONST FSSpec * spec, SignedByte permission)
{
	return(FSpOpenResFileCompat(spec,permission));
}

pascal void	FSpCreateResFileCompatTcl (
				CONST FSSpec * spec, OSType creator, 
				OSType fileType, ScriptCode scriptTag)
{
	FSpCreateResFileCompat (spec,creator,fileType,scriptTag);
}
Added mac/tcltkMacBuildSupport.sea.hqx.














































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
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
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
(This file must be converted with BinHex 4.0)
:'(4ME(4V6@&M3R9TE'46GA"`Eh*d,R0PB3""8&"-BA9cG#%!!!&2K`!"R-Zree0
dG@CQ5A3J+'-T-6Nj0bdb-$!a)%&XB@4ND@iJ8hPcG'9YFb`J5@jM,L`JD(4dF$S
[,hH3!bjKE'&NC'PZFhPc,Q0[E5p6G(9QCNPd,`d+'J!&%!!"6iF!N!0b!!%!N!0
bri30TD95CA0PFRCPC+@P!+@3"!%!!$d!4,5KD[qhp$5E!*!0$8JK!*!$d`!E"Z)
!!8kd!"48Bf`[9'XJ4QpXC'9b!!#'P`![!!X"b3)#!q$rN!3"$[rm!&R"4!!!J!#
3"k@3"!%!!%3!4,BJ!3+iej9l!*!$FJ!!YN%!N!0b!"4YG3!!!6X!&ed+!!#e"J!
&+&"bEcBJ3R9TE'3J8h9`F'pbG#N!!)CI!$S!C!+4!P!"`!&!!)%$$[rirr$,4!!
!J!#3"k@3"!%!!%%!%,B4*!Dieiqp!*!$d`!!&'!!N!26!"%3L!!!0#S!!"(+!*!
%$`"#G@PXC'PZCb"0B@08Bfa8D`!"q"T849K83eG*43%!rj!%!*!+J!#3#3'D!*!
$k!#3"!m!3X(9'#)cC39m,jXhFF*GKeE+C''@,bq!9S!pcV,)e4Q(KI&i&Y*@2$d
K2Lq'TT*4qi!5(0-cAqdb&)KCA4pKGN(1K`f$p%Vd##m2DFdeSX6BD[K6)MEQ`qN
1(h[D!8V$+T!!ZD!(`-$(h,(1N9em`r2A4@ji)(Q(@bYU(U&R6c+r$NL4fa&fAKL
jj6S&ja[riVHlQfhcTd'AZ#Q22D',HG5@lQ*X!-Z$cm-H2,ErfP549FrM%3*8rQM
d0(8jIqfD[#fa"Mm8kqLV[E!p+f,Y%Z0'`T16rUb%)J*jaj0'"rbrjaHRfZiRSJ"
#`G82h0LeKTdR*fJp&)4MVf&1[TR8k&PCL)K0AmF-G2AUICEPAJMdarX(9fCH0$N
'Ya*S[a##i@K'+HjSKGd2PQm@f9rLSP'%JPAkI(ir4@k%4&+F9B9U(mER`1#GB!I
M0eaZY'4Lrmp8'Z"$cj-TpB2f@6a#[VQ`pjGFIVRCN!#l!Nb'4r(C*J5f99#F!V9
lA"$JVfcV$FNjHKS"4P,@cEPAEUl4HVS(N!"lAck49p9@M6i"Nbrcjl1ce)MM1iT
KdrNC+p,GSh9RCj2m3H0Z+$M#*XPd3GI91!@5X&S5+m+X6CJEM*eI'6r@j@qiSqA
ceK$N+Qf1TU5Aabf@2Kb`B$3dbEFiGYTC[3+-lGL&D3j1lCl5kdDMH8U[q%+H["m
B1i!XjQRfBP0q)lYeV58N-,P$[rCKHK[GFmfq09Mh6r)[Xd)I$qr!qifENM@@!E+
UB2apE(42hcYk#CJ&cB-0@S8Fi2H2#q!ilM[M8J#l3MZHAMmQP&mREp,qla'cJ+K
4XjeeLIJ!K6RFq-)kCb4RZ,h*eMhCX`,bT%*UUZZrXTbNX,dVpEqC4Q3*kbD3!#U
A4p30`6#Hj05Krl11`(`K4"jRJbTb89Ue-kI+AG5ricKJ'aSYek3)q"SJ+m`1a3K
33UN,-CLZ)JPcIII2cL`LE(q$-@Z*Y%EqDEDjL2YMIlUh8NJP"mp0$aRU03k1#T2
`QR0,)[MFfqjd[KPj"iE`XA@Y9CQ*r3d&N4&&[SCY#B`"3r,+EDVFcbi0AmTl(+#
*8M!4#-66fS'2-F#KVT-d'AeZI48dh'B!UV2@AFa6`mYljLh-p3LLcpdTFfpIYG4
Ve&%'U5fP"&aSiR5EDjrfic)%+%Jrll$+I$VDBMibd8iD8H10X!IDH8f-Kq66CPi
dSIq$,P,$X3k%3+9,b031j8&e2B28,ZX$!!EVpmjCeU2VcZNBQA'rj&r$"CeTNdQ
k603"4$R0$B6qf&TE5k`,N!"Lc*H0$Vc-,RLAJ#5c5SqTK49[eeCcaXCD3Ualr,1
dN!"RLq"hLmDl8GV$EdN$Tq#j,qVkF[lhLiZUJLLGa2r)''YEpF1@mH0GANpU,3#
c*ZN-"p3DG@k,bc$pLbQSMY@Epd26p3+Q2c0Rl31e6$hMlH[cbY[dE5jd3lK1CK3
Mj8,!HlCpD'V"UHjAjD*#"jaSpUmh&pG+GpZZ8fqA-8'RLpLGbl[qc&UKer0(bq1
bj'm1J#i`CT`@*+31PV9VL'E`5%T'(AIi5Vp*[5qH2HV#8Vmb8Gb"db6!Ia*Kp*B
MCic#e(jdV1Y$"VB@2[8[EmT+5%JDP*!!0&TI#*CZ3UBB$e3AqiL08&E1`@EMF0&
1Q[$dDNSNmdFe#VaGT+Pc*AB29'$F[k""DAmdbD+b"L,CcG4Q9$RahiliD-*jlfQ
XN6G(rJE4&hC8PfTel(-(1MKI4BVp-!+8-lq0cSmTTla60XP'jN$#JQ'PD8M#fDk
h@jc6-CD9kQ0I(q+L"eA&*5ApB!AADfL,-#f-1d8Y6N4([f3(D6hCp`dqBpq&aCe
MV[P!YXDB%!1r9JH5N!!lX+e"D[CH9EdCNZNS8PA9($XpJ8('F!XVI8'jr16LE3U
')%HEqKU+(MiA[ER$HjA**64CDDGQk+cY12U5!jm0hA&5IHa#b3Hp0Pm'8S*,1(L
Le!G3&U&-Yr%IG@pD$R46jT(mm6YXiH-#cQdR@2dlF"BVl%(IY4-kcQb,#jVX#m(
Id&8bRCZj%M*j6Z)5)V3KA1*MLrlZM$V`D41Jh(UmB3K6fG1SkP4aS)(`Yl6IQc(
#"X1RT1[`F)!)d[R`06,f4cc([[("ZP(5JJCQF(8fZ9`*@6iE0M1HbC,66e,JM'5
ACXE*`qT&A*5M)9J1!d,NDZ$c%m)[5(idH2-bGBp[e!V+9Y1j8AZI@HYFK5m-E["
Hf@hZ,h4q4+U2+CFlY&M38e4eJN,Bb2&$2`5K6XKh''rj#qe5m-4%raGcZd+qNL$
Afq!Mk9`E0P5%14-M3!)S`GBSma"U1lEqm#p6#1U',884'[(F1ZKfkG+1YM3Nm6r
9+*!!@-6bTC)@`LYY`f#KQVkX(9XlA++5J63BAjRJ$1(Z,RS-cZQ`SlT-k[rE!T&
I8[R1%Gf56VS4l4,GfCZR)Ikj6pZ1K!b6Z$F*XLr`@D`,M*f`qpSdh`#M(BHK4eI
39cQ[kYr&eTM`rrY[lDE+RHZ6-54X`d[PbNq910UEdi3)Tbd44@RbkiZVK`G[)HB
KXeXBV@dY[["(FA"Sm&0!8"p5lVqNZjM#NfUH'rl"qiX04pbR8qX#+Y4KMA([i)Q
1jr*!YT&Ra*!!&MQaD##5%"fFm+dr4,YVlj9j3[-QRk+H2&5LK$UKe!fqhQPYbqQ
$)0cS*KNUf$G-+6pd#Ta1+f6ELjQcrl!,e[AD3!1rV422K-pbX%hiZ,6Z(2E4S2&
VJmGEhmD81`IVl`X)Mi3jS6r2*%c$,))IT+%XT1(R8-1KY(1"8V8T[Sm`rH#+d5[
e`SR"rSM6,Kf#1AXd0r!b3RJf62NCT4Q0rIB9I2YcU[cmp9+K#hiC-23Yp&+8`*(
lbN0f0j+#J%)Mde4T13CQLN*U%a,k59lk&Qp%VG@[9cQ83I0D,(a"Z+CilFHiIJ"
!C3l2RKf[Zl3mH1-0CMM3T+FmfKqPIX`[Y,4q3Q+EbmL9U+I8AA8VI$%`*)idEk2
j9BrGKm'[9RMUiLaQ1a"9@-`aEQkaqS0Z48(,PBX$)dFPYJdVQf#U4"TDld#S&r8
HB&Cm"F0(fV16$M%rC,)N9AHf"UGTePr1c6hX#)*bph-MANAS3b$G!dE(Ck*5+ce
bHKYT#"80LZGBR)FMqCFFK@eCYR#!mTch$6Yf%LYHcf$b6e8Z+!6eSKKBP66@Vkl
Q65aeBDG)Y2&9P0DmNS(0bL&#IUa,)E$0REEqF3(cZpZmRqT!6Kf`2`eSI`866G+
C&(PmH4)4pfUU+$V[LQPD!)hrh2U)dG-RZ@$EfHYH8XTV8#d#-!p!c04Ya#jTT8L
r36DQ@3E+dNF*$cjT5YSCV3+2U(5V0%K,!+'m2P[,B#"D%Pc`!hAp'#iZq'`%CVL
Fc"L1-UVMZJJG63YYSkHJm'PlBfB#'C!!A0+q9RJVA*VN4d,@%&-c!GJ3jRVkU4f
f2#Up)mj5LN$E4[Qi'UE+0r8FTl*5B'jKh@2+m@G+05'T)(@Tf632K53Lda)*$eV
jA1*i(2CRJR6#D@@m%Z9Q*MT+c[2Z'im#aX[k0khYEGQQ)Y)cC0lL34E6&--A,RX
EI([QfX*T#C656#XF3Ukelp89hI9P1TrFrKMep(XT4ZCXp$,$8+*R@[(TNE%,V(a
4d@qVS24#LQP$Ti25VkBpVl1PKQ+1,0(Ii4)3YB13!%!-Q[$fT,PZj"N'XCe3SaS
)8TG9mdTJ$'fB#E8PGGjA*IR`Dp-k+jETi68X@d)JY&&3aNMjDZQicN"ReqYdGEQ
aBDRBIa808U++R4$Ia21QaaRi%lH@Erh3$TI9Abp&B4K'JqFSe8%PK4f$ZcC&L[Q
k[+dm-IjmI*9eKMHN4J4m*"-Ya8-Sa%[8RiMR`2Y+j(ij'qV9-HQRmdVbmVd@(iU
[JTYGMAELT)AT'@J'fb$$S8blm5"3)IU[,&EA3QIU!M3C"qI`2+ReVGj*`Z0KCc9
GD8[bTHb6fDQ&JZQ8%QAjkE#N1jV$KA,+0-c@AXjL`q,686X%Fh[h*cS&@rr"[fI
,heAVHJ'(G8(Xj1#Q8HJ8aG9(ePS`PI[DE(J8*,)Leaje6[LbRle9fUrPeCY6LVk
NG-`j50CGM-U[DDVVpRZ@-9qMm5"@E&SfhpfeRRXYr%$dXaZ(IN)a2X!I#Fh#+3i
bp"N"FLLjcRAr!,INV-i18@Ar)1fDNDS@J-84Y'FS8SS1"iEYPVjr!DS5M5#G)eq
I*@&@K*Jrdh',ekd[9-bK(C+!Ukh-FE%p9P@dPf[HGcp4+8Q)rlT"DcNa`r`Hb)2
)8f,a!0MC'(rA[I`caZpk4i4p,@*iCRC0U@)Jk19KVh8(+'(M0%V!XY--KcJN(J#
0N!!0*!)ihVef#'NU`0D",qHL)6JeKfRU5iGL(bEkZq)qj3jA@kr#$mjH+8$)&V#
!"-,h*F'2$RFRZ#US!hjcUAcf0,2HI!ef6C+a-%jc(BDemCEA&UKINL9$A5Yl[5*
LhHq(1m59r@(bDk8I9GcC,rQ62H4d#I1h,L!)jQX`PFDDfCYkL-Sq0aG&8hJKphB
%20,i[1iIP#3`5!lP,(8eZ8XR(#HhqLJ-8J,2F'k2!Q+!AjjKi[YqcZGVjlXl05*
[P5cU6F3HITC"e1R+K0Bdh#D%Blfa9L0J0+#I9&0kbTF@p@VcdEX2P#$TQpmJ"-j
3V[aQpea`m1@P'6LlCQLj2M@k8#AN2"edLiS13c1Q6*1@!H,3i%I%Bc&pGX)p1qp
9baC1a(3[aHk6C3TimIeK9UjbJ1m(iEp,EMBUkBf%"Q$&I#Uf[96%)U$Il1Ff)"-
$Z`EM0RGSPDC,Q'Z[`eT&0+b3!&9S!cqi5cfTC#AQKAfJR"#(SCk&ZPB%,acbQk@
0J"AEPli@baZ-92DN*G5)j!%#G"'Fi(qYJfY(i3NmUDV$r`[B$qEP4E!EZ(KR99q
9a20l[)jaf$qM`TmM&C*FA`,mBLT'Jkq8'a3KQlli-ie"IEk104,(@D-!XSk9X&b
j12FDP-@k)+eZ4*2Q%Q"ZPY8E-(KRc5G+CDmMG(2dhHm52*iZMS`fI2r9mXmBe%(
Taib(D'0b6KPJGYjrR3,d['P-kpBe$aZSPq$(@KGfrPX#CSbT@iXG4a@k+k4$hl`
)k@!)Rr%9415A"jMmjG5kL#XGY!dB,q#cTeUE8(B!$rJMhNLi#j+@%#!c*jYa#H6
k"[`qL)6)B8p1f@aVp2-QY2r+LrTU!R0Q`qa'KE82DcPSJ`1m1dmV8QmrD!k,MDP
Pr)2,Bm(X3dQ2N3&3T#j)5'FBk8!`!mdec11SP8mP%eVXR-f"GD&"IP(%%hRZ8IY
K12q(M2B561P&[8R4FY`U!ILYBCSkVFqc#05PPJqapm`ZGcEHa[%*i`D5(e$alli
-eqVi8aQ`N!"b')KhZJf`""PlqE*h@QmM6(HXKjDD8lZT%VSkCR0#64P&B6adRcB
cJ43N%lR4cQ&D,4Be+HUP9XSE*lR0kGHCBhmFbRmC@4TiCU'ASB#Er3[K`aNFcAd
(6pEB[AEJ5L6"-cVV!QhUdU!Ih,e5DH%iYc`LKXKDVTDk'GX'Z!#$rV([1A'XZ6f
X`,mSC5$ML1+I[a#U'(EqEVX#jmIUq$efd$CJr#2HM6E`d9!T"+hjRa@"I1N[M0i
48LGM9$S$lf-)9qZ(PXKUV+jFN!#RNB8ifhJUY`FBacd$hQYc$10NPRmlcU6bq-0
,+@6dq-UJHS[QI+G!ND(0`QH#q*V#3+Z5p-kel$8c-ETVU,*!GfSM)dbG2AVaDXQ
#`83Q1-iF'($!NpjN6!Kih9QeL'[I%(G%HU55L16D3PR[[N13!"S6mHCha0r*ld'
Yi$*@4$&1&VXPmPc"d,1STJR1RBG6jEh+c`V5ZUA%mbDKp#(qdcq%qb&`&+4k`5C
[qp3kEM+A&jiT$E)BD!9PCIX3dlY3pa(2#Np0pIJRA1qhS+i3-fc'QG%R,BK[fVK
@$-NU)UMMSaj6!bXG8&CB6[rlP32M1"e0'U0j8AZ+,2fSVS#BbC1b6#Z)N9MUeCU
%la6Be8&[M)4*0ah3h469YRqAZd%Y#jXc+4%ESbCF4b,V2YXpif!EV-@i@[mKiq2
#A*GQ4Lp,mDGI54h*b8NQqdXR&$)HpRJlEk#1qAiK%DkQQRH*(FbIRa8FE%GT*(2
LM-5Zml6#`IE"6r0*"l0!'"QX!%%b-2TKDG)YN5M@ki%ae6-f$jLBeRPR"DiQb%N
rB(!h+Z1DRA9`&l#-R1Zr#V@Qh0S%9H1*h(Cck88*eh(3`[,%hNEFGD(Hk9%QL*0
Kb*ZRDDJjPfQD(iR&&k3ITUe,pY3PkIdIrS,MQ")+VHAlb'f"N[EQ9)jAi5%LB(N
cT2CA(80f+L@-KVrS[MK1AA9,Y+N9qS+%L,,haLEA``TVC+!Q+65*L6a9c"29fKc
S)p%K1lV1,I-!TC!%!3!!2`!3YL!%$,MAN!!*!!!"1`!!'lJ!N!26!!mUP3!!$Rd
!!!Bq!*!%$`"$9b"3FQmf)'0SB@jRCA-!!Ia,9%9B9%0A588"!2q3"!#3#S!!N!N
"QJ#3!kN!N!32!%,"e+,!N!$IccJpKp#eYe!r2MHGGRl)r-C3HSP)(HFX*r(Uq&r
["3khm66D#UcF&#5HBlFJe+$+XD!fUe!5Gka,G-i+XIE)PEM+'aLK2kNE#pN--'$
)Giq0qUT4`3U&Ma8)a9r)RZ"5L&QaR`@SYJ+RGdQ(Fii)!*I$%J'f61!2V`R+2pl
-LlbUhekZ5hf)@Ir8ZG%V95)j,VGEDfjfB@2MJ[+Np4h43A%!3X(9#Z!$dU'RGC%
"#jQZ*b%Vc[dd[Uf$8pf5#"q21`UIkk9jXYmD-ec1((6m)+Va98V2p))eI9C$iGc
1ZP"q!'b09kV!UK"*b9jaM-9h2NdeeBEf#%G,&fYZVHA"'elT6T8!RIIGre0ZcGX
%ADl`ISdYk&8I-BJNC+GD9KHj1)XF+BcKmLI[[M2CNPA4+h19)"&41SeQclEZK-e
S#TGq"D%-2'PJXV4BE#bS-l%ppY0!0MarCBb%1Tc2rJ(V!L[cr'4LiUEj$[@TZIA
MJQAP9Q$C`MN,2fBiT,91V1DEiS(X'9FbeK$,&TjFQ"hffE[+MQc"-2hR&M9iZ%Y
jT`Y"#6Q8APYCKf&Qc*X)U,'0a%e1UMSMNUd%E44PG3`,$"Yjq@QkKK44b+CDmda
AM5@e&6H1Ed!C,pbDQDRHN58'R%qG"9mZrqDKH(*!V9F+q1rd6(X'K8'i,R8l-lR
P-+pTB@YXB4"B45N4)NNEJ$A05+ImRle6X'TlAi%Chem0Sp49b$jh(%d#ZR`rV1M
+5X4G48VMPj`PUUIG)8KLT9A)JBdjiSBX-'SL&d!i`DS@lBMr(R[KMGGH6BMm&V#
cil#BdR-CkD+Q*V[d[1RD"H*ZSm*[)3q!c-K5bV9G1$3cDXl[)jE3e+9AhI)HGV2
B"XrVXZffY1+U2kEGCX--lLL$i"P*2Z'ikd%jJZ%IX,$PI`de50JEDJ[XT`Uk$09
rr%K&S*I'MRL+FljK[20h'Z3X'A)@cFI"2)3GeK1E98cj+qI0Y*Q')@"@VJJK%Z8
Sj)c0rCX3'TAa,@fq2qYe5,[0qHXQ6JN1"FiL9I-q+c'cad54qcp&LDm'IC@bil0
&GZd6UeS#F"+FT'%cN!$)f`rFjr2fl23R$TBqM!Q)2IpR1H(LMRC@4echC&XSfjc
"*bBKQL9%#4NpD)lZAq`2b'I1l8rrNikL"qU)Mj%)j&[kNlMRe1%)#E1qJd1&eTY
+Gc"1kSc"*3-1&5$D(Djq[b0GD)`,G"Mi11K`109CQhJX(4mdYl+l36MBZ#6Q$%K
N&b8MKk1L-8h3@')XQ3SlC,lXQP)U$QNiVmkcRUCpH)Km&E3Q5-d&$@aYmRJN4R)
eHjIR6DjRPfrk)#X2Q))k9PPG(9AKNKmTr4N@f4[Vc@eC1cD-1MLR0#V5C3r+,CK
&&Xlr"(HCZZ2)J%XmljLRV*f`RcjEQ42SYP%6r0Ef1m3b1FdT2#GPXjRll41b,hB
63)PYL$M&+Bd"2i$),@"B%jh(Zj!!f8C!+6EVma"cMG8'+&!8HSGmPLY[XSa)DCG
kCRjjITe+kJ,V,P*LAQeQ!pA`,H,pE*c"R#8"%`2q6EH$06,Q&KAb4-VXP8r6XKQ
)rk--clEk[1Bj[bDl+4L[R'!f+R$$dJE*V`i*d[c4mpHTq89d3MS`IH%2%MSSD(C
idHk!Qm9rfabEi+55dcR+YGF%R)G*ZRM-DI*hNf*riQaQC2`Tj(V-fC*eB3&XTl!
RDpJQ`T1(hRL(&ApYi`EpeKfMD3NmEHNF6Q8)2LJk[&DIZ[U"%6l)c4mCi-DF8Bl
QeXQ4Sk()*ATT,VA*A'5FC&e1m8,0fGDSjeH(LV"E08@C4-jb6F6%6&Ad3AH6-AY
55KSqKJrfFB3dcR'l2CHEA5Pq95GEIR,Pj1jAIl0"-!r6B5(qLV#'e!f!LIeC!Gp
lcDDbmKPVVN28-m(MT5*qGcR%aJdc("4JZRRkXFk+j*QfZJ$,f0)SI"D[`&UCe6D
Y8K8+C"!#k(p#$8XIjMCABKKC+pqT"J0Dd(dGp-GY#`-#8*lTFh+,[Md4VJeqLcj
Q`a-@V)`(U!qSLVXd1-pJ'-aEH#,&qUGP8%H9j@)49%Q%bZCfDqZaV8!qm1M[,%S
Pl6)-[VS"$")(JRDY3J9[bGl,*'83a(q&!K+G!)+Cf-HXcQ[A)%edeeYD+,K,%pr
D[UP6+HHh3BY,j`))RJ+KjEl"0+J5&'6j,q2U2B'4*kQ9*ZfiiTRFjq9NE2DHEeA
l2cp$Pd+kTMp[!5Ue'f&,SrKMQN[!$JQiA(c-qZ-0EVVRQXU,b4rVlJEL-[&`PDH
fSeU3!!pdJ9@ba&@VUCC&ZCNfL8$ldZahkIhkRi@6B(L5fMG"'MP*"J$!d,6)hY9
MUA"%c`#PN!3"!!!r!%5d6(DpYr3b!3!!&'!!!+5,!*!$d`!2`58!!"`E!"EYL`!
!L(!!"Ne[FQ9'D@aPFb!a,M8Z-J!!,ES!U`#1!Y8#!!(!rj!%!`lrr2rbbd3!!)!
!N!HPN!3"!!!e!!#h!2CaY`$fF3!!'lJ!!"bI!!!EZ!!&r3`!N!j*BfpZ$3!""%9
TBfpZ68&$8d!!XH#ai!#3#S!!N!N"(J#3!ad!N!32!%,"e*p01e'D*Nbb+)*qmhM
42'+Kj"mB`+Y3jZ!!TC!%!3!!23!3YAP)LE9p'e!!!"`E!!!Kc3!!'lJ!$91r!!!
*e`!!!e8!N!32!%e[FQ9'D@aPFbjPH(!!!IAS9%9B9%0A588!!2q3"!#3#S!!N!N
"QJ!!!@S!N!32!%,"e)Tc*VcEhXaFq!Va@cmJ9kmAd5RfqQ+1LZ`))l6dK0lNh(f
$TD)e+3r&b2-0&(`B+cQ[PpJQ1D2+VG1@NliFp"Gd5qa!$ZN'laLT0F@!hSf!r9P
YXjHPqc!AV$m(@JmQ"!#Mj-*P0Acp8S)2R#Kpe9NB"!(8%3pqeJkTCQF*m$)rm3)
mk+KAhSY!G-U'2kGe6P(k1RmXr0CH0"F`SmM&2[2Ta!FL*bQ+c$9GTUI0IjYDbc2
e0E9#9cKiq-3X!E""+'ARR[aU[)`i!NZV#*!!P6"QU-fd"!)BHK5Z0MD45%0XiFR
31eMlmrbAefITHB+&5r5D*a$Hm-[6%m1Y4Z(4`BKUYep)C5d1Gc1cZ8a*1qhG[Q"
e0erfp'f@@S@P$Vimmr%U&fPpK1BAX@R@e%DK#NQh30j[L&&-6"VbVe9r1'Sj1m$
60&,m"&RmKZCHGC!!@!T$jlp%6-8cmq1GmSY%N!"5V[GGQ4Vl&J-J3X(8hC5Z1SU
feJYkk[H8!d*rLMc%d&BRlY%mUHF*PkL#Dp[(EphbCLGA)mhj*(2*XL3-[Nf4kE,
H@b`U)6@h,9ED'KYZdFrc8XX3lZ9HFEkM9-,EjjQePQdS4(MZTdFY%m!4fK2"P9l
,l,4fGMph%,aRD%0C'l$H2bf0qZ@m9alk+bD+A-6d2kTkml9HaI)GpE"Irlkj"3F
h&32[4)d8r$$%bE[lR(8,0*3[%YbS+fKBTIAhA*H,cU#K-3,KPKhS2LJlI3Dj6I-
!14"lGN2icXVS0Np),J'Ie[pVbNL+pVf*89ilI!GU+3$a0ZZVTH&Qk"r9UQ'h$eB
kpb!JG-bj5pZL4!Hd3j-UQYVHY-!k@q9PM[K*hYbZmjjJ"mbBehSR+(NqeRLH(k)
Ik@kH%)Zm-%T$!9KmTEXilF!HJeCZ%KG&,[dMh+k[DTRdjC,NeE6""%mQCHQ)`Uc
&pJ#NZD+JC9P%Rm@e3Z@U@l4Da`8i$j)3)eV@jKS8CZ2r06a(SE@qRjflX%C,AZA
JA3'L%UE-kJZJp[hZI)-$$a#,!)k1-@NeN@UA,8U*62,pJ"513KbR$Lh!r9lGU86
kp[@c&26R&&1*$!UXTK)l@'pGMX03Nb'bAFZ%Ik"dZCBHk`ae)3e$&VBld2rASR"
ANhH3!$[bEC4!@23%cpk3!+)0GJdUJYHi#B"XKAHI&B)MZNDCAF%9FYCY8mBKNDR
J"eB$GR`mDU%")N)Y3AB"2H4q3*TS!8l3HIe`Sa1kC*DeDB0Zb@V-iZQE1lDdVVJ
r!$)qPKjF&SKbKeVMplUkYX4VBe9E-Vl+8UKZ'0@FUN3j-[klkF!41H-T0)$+)p5
'$j&+mDdjdC!!UfaZ2&1fPGeq8dCdREF9hI&I#3#ADbhdXFd1f[![bdA3-*S892$
-NEIT-BRX8B(2q2A$[`N`BH&k05C%m-i&JMLZcH&aQY+M39ahpe1X%SI[@N(5SF+
'[pR)G0PimGK&iK@pBZ4JZK@XkEmQq96XV5hYF%BT4bcX*A(b1P[Pa1"EF,S8*mM
$#)dFUKLeT82kEIRR1Aj6S,6G9UbF`CR3`d)YqM&+39QiP8B6J6CNr,DE85QYKYE
QA@2B((#H,YjKaDq)ik#R1L(@r!r*-B1E6X%HJ@@YB+@3"!%!!$d!J,F%NCHhFV2
P!!!FR`!!Emd!!"Zi!!f8A`!(rh`!!%fI!*!%$`"0Eh*P4QPXCA-ZE@0`!!!eh8e
08(*$9dP&!!#ai,(J!*!+J(!!N!C#`G6YZUdd2cSr2N*0U,$T*RiSXD`C)*@C)Q%
Fd5mVjiBKk6+Ck4#L4L@4MMSS0RAjeflIj@NF[G8GhAY-cNZq[1U'l$SFdF5fU0E
J-UPp4k[qDT(P!MAiG&qM1ZCkFC&5b2F+4,82"p,'!#RAc,K%30F%U[Q3!,J9Frq
LldG-ldHLDN4JcqRdS"`ITkSj`UAI`(Emkd-'bE$lXcp)(&e+')b98-5BCpkTN!!
l!i4,UBFDe#AXQ3FA&kR[PV$R2642"d(1(qCI[bDQj@pD00U6ZQH`IUSqFbLK)IA
r216JVJdTl3)!%Sb`$0f6@CcB4jZ*#2K[3E-Pb*K`lJJG()8EVpSe`S%a0qH9Dh,
RJdI2K"k5VV4YE9C5!mAP$p#L`Pe#f*8ipllV#8If")f$(aSZDI!rRme%51C-XQq
Y6Lf(X@YjE,$&&lF-`D5libfa,DDXZhd2kEL(5ZS&(VSi8ZJjjNlH'KiZ9qm2&&e
I,9qm5-+bj(&1ECXFmTiipR'1`re@)`5,he-N3qldc%&Ydr(T95)86feLG4M"Q5$
bLk-HmCK6j!r,*9`32)lQaN`!ZF9UXeUqNGJ4!jVJ5D-LaFT8T-l*#1)QM#FMf!c
Ic#B@('II(a)8&BqVa5JRS9IRYqU68pqpQ3lkA4bYmR92%NcI!8F-9)"+h4e%mHP
kJNBb*k@ZU!)TP1Jf25HRd8kSbbr!rC!!'QZqMS*DX,+(G,Rb9KAj5[NSkm`QA#G
`LmZGUQIhd[4V3-hPVELLG,103KbbQjMifL!+8"ja2-'!TdhclK5!["!Uh8(R&5h
k88EihB,P*"`[59pN%VNBRHSC,dT6@-mijq&BZYKQ)VKa)@N'BUf&9)XhPNLEVE9
0CiS&NrBSShR)[eIG[0D1L9H3!2bKbpm9X&6BN!"!$,j[ki0XELjdRXmBbDj)Je$
b*+NFepMiN!$ApfUJr`Ee*#6VN!#2cV3HICe[&)'R'm')@@UPDGP%QBr0EUFZ0[%
!JpeZ5XkNSpBV#UX(%h#+$*!!L1#MHKTXQq4Y$N8f%!ZGCf%HejB-r#ZVq`PcQi5
H-31rXRAIdlFc`PM9)SfpDKVL"Ki3+Xl#[j3cmM&*@db,cRZdXS&L5VI+4Yb6BIp
d1LqCa6-d%%%qmdY2[kd,dXh)HCT%L*YL,aYX(KT(M!%CbUB9VNfSDahi32A,5('
(Uhdjhl'r(VcmE[JH`VpTr+1i95PU0KUYa0eY#,1d56!pr%'Pr"IQDkYM$`iHff-
QfDRDbca8d[Y'BTll,9$Zj3apM(!-B"#ddJV(+SrN[9aq-"$'8!%pbq-24Y!Qb"m
iRI5Y+69jUf"i-C'U5VZ@lmf,Bk8al9iM2PY&j+Mh2K5al[Cm&L"5Q!rca%+`$J-
9b&H)U+h$1B$P9BCVJ#0KlNl0[G4q8QVNjkpGXKqZ-Sf"1Y&IjN9IlMViKPVG(2P
3+T8Z&KDk`q2B2d,6RR+94Xc,0!L"5)pNZ924Qel[KTfAZ&kDJLaTk11+``5P33U
jYm('-Be2Y@B3h'ClE[YK-Eb'p+lXcMF4FQc)-I9jTr38U*lh[k@GLEe0Ciq#iCc
Ea)Yjc,#RM%UAJScQjE@i8LT$342J[JkiaC)T-H#G%HAcSK`d6&KIbSI'BP4MZPe
-5'NJqDT0B`d)+!&Y3fMRR+"l&Z!52`K48QkcmIhTfES'PE4k[**Q51CPfY%JlFi
4dQ4'AUe3JY20A@V%!R1e'0b$%Ia[MaQZR"2J)lJ1Dc4hj2eV-RikfTpk##kd,V"
D`R1[b0mSB&9KRSISKAPZ'A5[GJ8DI-&MTIckVG8bUANq2p6R-b055a8bIJDAc9f
UcpC&BXPYAB!`a4!`NHdRQipDVb+BpD02GZ)B,f&r&pcS8q!P&N))2'd+(8S,0H&
4S9@EA*emF)!)ZjA2$53@N!"*l6H-E#V)&bPFL"(d,$h)pj+`m9#8q%mHHrKSa(e
DJ89f+dl$E&M2)%4"XkMeHQ)I@hkISQaF'Ba$cChBeLHCF,0CDr!j3fT+4'2)Vc)
U@CZ0'`0)T%Cb)HF-FZXBZIZ+DNr9c9[RcR3'FZ5qPLN$[IMlKXC)Mc(q42Za'TT
fL[#HVE)b#J"kCQB8h$3P%`DXR3,DDrq*[8k,MDG+e8PQl6hAj4@rNpX94L@F6MI
f)$A&#A'2,XZL+cc3*mN'36QZp6[@dp#-Ff$PA5)p"E,((Vpl@hT*hiY5ja!K"9q
q@94a8C@`)&J"'Ra(TeNP)(E-K1NhjSDJ1#@rJj*+2YK%[T@FadQ#S2@VT8Z['%G
DT5)66lpEEC3MqD,m!CK5`%9%%@QHX`2K3LG3am5h#+3-1k+RT)jT$V1'01[qNfY
C`P$VNerNM0C"*62Ud2T)eqkd`XXq0D4#`QHXUl0!TPJGGcrQ#T@Am5C6r#QIASr
(SAKMZE(Ej@Lp6!$##QDGNG!XicmP!Z3icbAJ[YXq10ceGYp1*,(MV,1A6FDQ-V1
q"MTKaNJQ@,NP+Rf2'@8#YE6BKUR[#dr40hc(K1,3P#8VJZETea)kbVGV+m4JUHf
"&qc+'Z2C+hePhHbGV,iEQ"&,4EThkbDB%k9m34+4HL&$!Kr!C(EJH&1[kqA6j,3
k[#3&i&9cq2Q,-,@G[lM`q+CSYUd0FJiY,FPXVS'AmAr2M)BUd8&V#lkRcF2&`4!
iADaH*1@Gm%p+9)8emNFqIi$Ir844l&)L1ac!QIr9K)8+i&Vk&`%SIkkjKGhh@kd
ppHcp)863I9)K8eX5EU8fY1ZDAM1TJpI(RN#Y66d0XGZ6@hJ&mYFaqC+*1URUahj
!8,e9IT(ieQd8@VZB1mA9QcG+E"dc49)LZ,5Mkr-Yh4ddV[8IL4J*+%jj[UZ3!1M
A4lQ[bPEI!)RjI0pANQ(hcNBBF`YDKTLT6MrJl1RRJYN0dC%3HE9j#D,hrjeR[F*
f0cQ#9F$Q8F6KB3LUq3TJ[rVhrGiK!D[%lKA+(0QVeMAQ9-%9%V-DVLd69N!-5`m
Ik-(cJXQa!J,DEC1&qBkKcR3KiaUDA%NRk"&ii6Bp'6`VNS$,5rmX%VZZE`kaM'd
frepkciSZ&qXFEa8QHfDP6K$NK6b(f9*k&8EX43r@qCI9&qIAJ-2YGbYU@44U(FG
XaM[d(*+NS+3'E-#6S*[&(RqT`6U",ciHe@-G2S[3Td(iiiJKXr,!$ShZ+ZSfVQ4
m0XCD*16C-a"6qN2TPkTp6UhLjlp9*3I)2qi#b8k!)2%i,bMNUq4H5)[CqDVYD@K
`Fa*UV6rD$d@Y+j*Pc6'M-DaEC!kN-(1R)ZbrC-Gb2[#K4hKcKr,Rc5q1're10&E
P93bkF@T1i+d(*R[d6*mB@9-cI8)r5BXiZDDeJD(e9MFqU4Qr#LfP9iJ!$Zldi[m
@fkf8V!*mbpVR9mBY1[+NR&!liI6c"f85VKS(f96FeJf!l[Y%6B6SRcb[ZJ8`Clb
DPjPdGkcN3(jcZ#f@&@kahSHT9feeJlh8G$&,rb!J#6(1L0Rr-4h@#V3Y"l"*HKi
(iU@AH"q"&&0%9'hYq@a!LTUR'lV8M[(T#6"eTjj)2VP2pIHVHI2C4YfFpA9"["k
APr4-S9CS@P@&hGl@iC4m8GCSL&lL+T!!P'*dZ9!@YFla+&l8e`Eq-Y-%$Q)`D,!
2%r(A([PU@M`)kjALJ634ZR-`XY0frrAUN!$5IkIUf9YjLFM0Ek-RBEA0NC0rQM#
bb3%1UPPPR03aq4AGr!p6i,Bdl'%)X[JS0b(jklDFD%-36L6E!b09qDZV3BHA$M'
aIf6ZGdd4$Y@3!!NM!X@c%"%&FHLa&mLkQNJ(pb+VM*Pm9e%flkLATFC(k(#!1`Y
-blhdEdUlX+3rNNJ`*jr*&6*2hTaRf)6,IR([L!93-4dfkA)UqmRQqYbrT4(+rpm
JhCkF-If2Jdpi2`'mHfU68hC-JZK2pfK%[MmYYr$lA0eI[pNSZepb%%!L$J))S#l
kT!%*2XA#"QjkK!IA"`'`IFmIjFbcA)&E[`"ik!!HC%GmHl[-5aNXbEc4849%k8P
J-E"T+%#-PrDH`NL2Y,$RKQ+bBpKHblCmSBVFRKL5GBNA6fc2h95`M(`"`,IjINp
1,Xa+jkLRJJ@-`+HbmS(G[(+PCf$N6ACk08$EP!TaKaZDhQJ0AYV4JeZV)VI'6DU
iEmX6B0Ae"q01!G84#Ib'XJbCN!#D#3Q9Rjpr0U4aBF)lX4Fh%D*PUf,Y4L2Q5KL
UTmTD"YUp+,XmeN!9HF(KH,a!R"QHrK-12@D[F'[j$N+)DcSha1lI`jK3)iQq#%f
(%"%,VhirjD'R16ITKEAmH+Jk$VVkHr#@Emaj4Emb*`D[L0pVh*DX4K!$D1F%+HB
+5G-p-bQF2NG6B(mGemk[%Cq0cCYbk+9P68XAj-SHqPIJVbEHZ&AeS)kG4Z)A[Ia
XNYr)L`E&@QRMK5'6DjQGf1(bLF&@BTc*h0@P3RFr@KCpl#BEdM!BGlN9Cj-d-EX
95PJ`0IAFqH$L3@J2h1kapBM$)f5d'29B%9@iKrID5*IYVekNe3ZEXrcDc4"d)cJ
*Z(4%+58k["*cIbUBa'A#0'i"%TfL*8U)6eMATd"1aAHpDV(qrAeaM,DjV`+1'AZ
$Q!kNM`)DdTMJDB$i*aMj!Dj1fUHkQLm-0b@)Zhq0rKrE+8mpN3C4aAAJdbP29qR
bR068i@AQZ+F@GaHAVCKHh2JQ#JpVZaj8mQ0adUj'HV,D9@3pb4pTLaVBC`d$,3+
hrL(,$(2%3&R2!CZ+C&JQFqRNHd!cG5k"eAUNK,f*F'e`)Pi%$Q'D(`d3E#m@`$8
YqCKiVRA#EPJiHP`RRa+'i4rED,PNY'r9aaSa*'K,*21"B`irmL-)0i46K8Y0)DR
&)Yi!R)VJ6Y#Ylpl53jPSVd48aV-CHL,Hr+-(GVJpfBm3*F@r`pSCR9iH&m)q(2a
#pXb!paRfSa[kKl$Z,MjX3#q-eb$P`parp'XfA3EcZf96HpehDq8%Y#e#9GZmkGd
cm&-[F%`[K3aHBlAp4r%,AE[KN!!c+rKZI)+$XfcBiZN9e%X343#e$iUqpPS%r-`
TRG'mmdrSSH3V@!DT#,2L26&9REKRaC3JaK8H(N#BAf@N0YmfN!!$YX56"J9D(mS
E$R(+%,d2Bah`K'@Kbfq+VFUYrY#'cJQ42)QeMh6@+5',6c%XDQ3K#a89`AH6SM9
2`J#3!&a(*1-1!LqS2mXV0FC!Ul5YeQqmH8q[%3BDh3"kQb[8F&YPR3PEc2SmG-c
j[Ar0Ik69+[1e1+mpDZaSZa6,C2dTaXY38BhD*IX%1U,2JIBfq8q-e'JNaN-q28f
A[-MM65rfTD"S,F%P`YT"bL`NlElr1Ehk@PLL2-NFeZ[4@Gah!+'rpliEmqm-)Kp
a*S5J58#LbTihr6[ZlV*Y94#ZJSHXpMkm'!eUQ6$H**NL$(a%ma!0KMZmmI9a2Cl
QY"ECLkGT9H0QZ@U((TeId-lj`CkG0dpMQf#URhj%M305fG"A2FkrHDD98#U6*Ui
M&0e+r)8`JLHYd(9pbE1NbLd'"0@ij+2GN!#SrFdA*!'&(#K0LM[iBMA*Cl%eCKC
a#JI6rc`-ZChIhU3Rd[+dcM@8pMNdAEMK6!GV`+#9R!*TR4$NjD%UBV)PB#$"`JA
MaIEULa"+Z'MS&VLda,5(CmZ'NMSd@&2f8P6CH0351+*e1R@$D@q$JPLmiT*LGZT
S%8c,+aT4I9ErQdCe)CNb8bL!'6#M(&d'!)H%hCkb&e$XUIKri,fF#3T(LL3[Up+
R$ACM%r4!BS+rNi&+ehR-pJ9GB$M@-AKTL"BhXk&$mR!+k(Y)qV+SaIH-e+pTh"-
CjV`)"65m0(N4T(I5YGCV#L2IBM1qmIURHRFN9%0D"ErQp1-6HH0,Xb%$FA&Hc%2
BRi,kCPGqc(#H4Q8F`H![AJkGCZe%cLT,2)JPULN1E#"e)hiaJm1jM)m6di*5A!5
00VNTFH23eN@"j"5#0e'9IpH)KE#KkH)ZN[pej3G6K`@(B$YP6iZj#fHMI#(3JfY
a(QIJ`5$Nr%Fq`h8jBA%QVE*9Vi1C3PkM5`G%mCDPR"r,Dh!k'@dhDiZHkp'*Tp5
V54R+2dh&!Dq,Q*S2YYI&Z1EE-Qi+lT3QE*VUh$j"KXm*j8*Fj%l48NR&Md`JL)"
800BBXD#6XpLQG$Xe#kNb+40X'cNRi-B-E%SQRQXCXh4"kJmVfqY@AK'd1+@hQLc
EEQ1ZJSdp@QcJLi$`)hSTY@T!6&1T9,r@KVFYpkXjjB"VF(CecYK[Kpf'VRSMPid
FYX2dmJ2H#!)&[K[4)[dm")Qbf@Y4KSGFDee@3BcaX6J"pNiM!dIV!L'ViBQlFaV
j$DEI(iVEd"T5+%f6)1(-3hXIU,$'`"Mjqjc%r0A%E2rHh6-1&eq09"XhBiqpQFm
8`La$Xf*q,+cJM-"#&Rm-'0hXma3a*CeE6+6G'3"`J3P8mI(rETM4S22B0DYYIAp
PbNH@hUBL'k91R6Q#l)8cUGP"rb3+flddAfVKFBLAabTHhY[Z0AAMfY))mrGZ3kM
VXr-kRc'63aT'TNUM8+`S,qJ!Ii"d(DZN3@+)d*9ADBU)T"$f4BI3N5cRL!h%-i%
NLp)*[+Saq(2B$U`XhqNjjZhY!p+FFajmihVYHPBfbLm#0kZ6m5+HAVN'NjQjZ#K
c%M)%L'3P1m,ZNdZ3!(@#q4@9DQr28f*iA"'(CA36Rk`Cd&@3!*!!`QhJmbHeH#R
!9lN%q$iT06&K+3,rl5G4[VB@TE',MYTMQ[`8L[%HQbMCUqi9hbH%Z(Ni95SdPdG
cf4UVT[B3B'6(CaEcj'4FF3C4hU2IFjEE[#S&5+rHk4Lb4i(K0Chhi[iQ4i)9J48
kc*JPeD*ejrAXB1"3RB!d#8APA'aiEI1DPEa*PTb)#F")4VEH**HDYpQ3!&&&Ar0
ZjlXP!hUJMA+k`P"iS,A6KDEXJV"i,1ml-(r6feYi@ENI@eZ6aJB+h2#ee90KLY@
3!$cTjU$aZD&bXp46MATMhP-($Y@jV`U8Fm`6hHUNB4[d2eSE*-8T`6$1qlBI%-3
jP*h(A8f5&),hi('Fc%r-fZGT[VbUD%0%h!3G,!ZL%dLEre*%mSl+3"HIj[kh!p4
'F(VV8h9F,52&,C!!T[[bM0FGI%q%lBAi[!l(JM&IhDqfi)cCPl"+8j&CBe&U#k#
&$Jp,5("Uqd"S#T!!@IIp3GKpIiHC!MD$X$9FbD,8cC!!&6("B34ShIeR,BUX1LL
ViEZbJTpDiC-91N6dC8JZ(rF,B%cM&rdK0"FAMd-3Vfb+Fh02FUHTPL(+#f$h8B9
faQXmZF4#64pPFM6,30D1pKH[p4d@k18JYlElYY[i)#ShLKCPr-lVQP@MY0K*"58
)Q4YKEUiI6P[TZlUfkkcGieTR`T%C6NN*9pRKFH+SlciUD"Mai-hRPlZ-'E!$581
aA4LP-*AJSqd8hHGIRGk1*PMb8&*`-brC1ZjKk$`LLi45Temq$,2MZA+Nl&j($+Y
kX1iF!6QDml,QQ$PPXUFh,Q$G+`P*01X,R5PDIQd(a'N0cR4+9kY0*kLJSUkpI-0
B%BNp)!i3+3V"e',TPCKdTbL3!&BiM(+-FdcB&p2eY6[kTfiePCIHmQM2B)jFe$F
cZR5,ILXFKeji0HSNq1QV(B[%0CNVqdV!KR&$YLl*KImF9-Dhq-AVp+eq!A&RU3[
EZ#cr3FhiQZEZ5+Eq8L1q111k![*#9iKDq'R#3hPm'6$blal*'3a$8NP-$1k(r+T
i(r)$jhZ5PKFB4LQ`fpMjZH+f9!,G(d5-2[5A5KQSmlB86Ki01$`ZElb$$d1L29h
[V,f@516'N!#M!Aq`PPS)m&Uc*Mp&p[V3Jp-RkS&r3aQ&AXa,bU2B$ASJDYU4eJM
-aaY[k`APA+iXf6!@28V4"PJQ0I0Vqcb6k'Z59GNqj0CJ2fP8&A%A0+hlI#`J)$L
R9@+iAqI2%#KF@YD$()@%J2Z6Fa8QGF"XN[TCUXj#klQN([R-YUTE)l@P#!1-L3Y
VHI2+FV5#,5bPPl699a1ZJ8G1MChV9,TMLcP#5m5``YI6"MQH@"%hT0"Xb(G-1d#
dZH0+GF(@%-+G6c)@'CNK2UadFKi"B,4c*GkdM1$q*e9[il,Q"b*QSQPSTECp-!)
(eK%U`16%9hB'1LPj3k-mc#BC#aD"#8*iUBM[FrdlEiJm$i'(JmirBp03hN4a#(2
,J4q5B4!d&eTLC@p+*$9r#2PP2NSG,D`@2MPa1r%DC1lH@2ka!IG%9(cb@&fl1,J
a"4@U)BjqhK`VJ-1Q#rp6G0C%Y@SNppSG%NBU*%,*C1U24TUjD![3'Npe!dY0TjF
0kdIGL(QkBK-AXU6[3Q6VJAYDBh(lM5'T$`88)1cYi,C$h@E"1GU'`jXZR9a%MGc
[LU`#5D"kr9L[&RG$cZ(3Ph(plflQ*qd[b8dhZa,Gre'-N86P%3Qd*R`4[c`1BpX
k5[6`e'`h13VN`S*jBG[Fh!23F0XqChTC3Aib1BSMk#9%9abCki4lPRQ8I3qD)*C
ieG!P+ILqe%Z!'@C@ibU5EYUQl"K)+-LErGc&jRAi2dp`eI-1FE$m&CdTcZjN),Q
&ekr@k-L4(L8i5S,+JBk2S"AbHNkE49T[XqI*Tj6S2VC$,LBXkjeY`B@%UUGq,bl
4)'L+9hC)CkdAmiD'S%U&mHP$,84cU&GU3(jY!eE*+[Bf!E`r&b0$[FANe@m1,SY
m4X66iMeB&re(*am`-'aPllb'MfeAYd5bkMk[Zd'mZ4HRlhq86%N(9"6K[SMqV#D
9PVq'L,SB5VTd62(UAmPMm11XX50i!,@*L8Xh,!r3+5GY+U51KC9k`P`UMBQ#352
1-6&mBcTN8fFKb1h$1UBFpjeer'3j2'PbKPH@J'(T[*(ZaUq-apCmM-*1L+bd-l)
jG3"RXQF#K2kVZdF4!VEl'i8YRPcjeC5%%5bbEDPB#jS9iY`Z@"EX&Vh-a8Q'j'm
5`-Ia42fh4Q3&qD31f"bibL(8SCA&%M*Dp8@$#i6SE*NUd(G,&c4!e3N4lFmA*b"
%Yh[Ai19)@Q`f&rGe(55,-l6GGH*6qP5-,[qEmji@dV@0FR0&T9JC`[mZ(maC$pj
,r9DV-Y1N[*pDGhA&SLM9hfF+pX8U@B[$6am!je'#88+ibG5BcBSP(3bqimd4%@,
E0#qLrAiMhPA$EKrpF5mQpTb$b6%%J24#Pf,T-0C+0FqGRKPXmF3!QN1X9&"5hYc
E-,88Fa!QHCi8mlEbe8Z4D`%VqC!!&VmVQ-%CA+6"DicT@f"+JI9F+B2PT3fXbf4
5pAPFq$@FfQLkJjGQ)!CeQEF'iajf$VZi,Kphfd-kKk`IRphd$M+Z4(iVZP5mL,M
55+9rj,Q8*2EhF(jliK6KA#$"!jkk+HVX$T1r-h4dHS%mpb[c1aN"P`H&6G-3JYj
GdZ+eEAS11e,I6!d!p'8Jh6m9JeGRS8jF@eH-9,lUBFDXG[GG&#M[fE"R1("H5`i
R"mL'9T!!UQCEESHIk$6+'"TJ"k,e@[+)&mMBL(BCBb&(3kKa2AhJ$&2D(L)AiPS
fRi*)BRS9B`qeBGfJiP%[[E$8"S)[EBJjifk3!+m3UFA&#-)qeq*aL"F4#dk$jEp
lhJ4Zp"Tm(B)fI&Hjp`Ieid*ZF-4!jAIf3E254YGIY%6%`ZQ'EKG[*&M`L$L[#,q
D[Sdhjp+U6cm+%Ej(TpaD9`"5[0`"1FP$VBTcLMBq12CQDQQ,Jj-prNV+cQelNk(
QP"EbB18AEB!%f0@@51ipXeM65XL6J,91b@*4%5PlHjVQPLh0Pfa10XJLI$9Vm@I
MLKI(#P+#!ShMG,G!9CrCXS`PZjIL4PVZ8iaL2[S8+28aE@4(Vppe3m,9,'5VaXP
j+M2$,AlD*$FVF4PJEA'L@Dk*I55hYLR+[p4k"amF%R%Bi9I8J2Ch[R`FE[3rX-J
2XGrY)I%YVk`8rVSi8bH)VGD#qcS#U1H1,I6M6AMh4i`-E!"10+b%ZBb+dAaQa"X
dCGe*HJr8b154FFB,@GI[F6QI(+CZED92aS",0YC6Z%r,S-`H)GZ128F`jqL89rb
j12,d8kS3KChmXTAhkdK0PXj@J6I(ql[GKR)SS(M91,G6HpD-rcQ,5fa+',eQd'Q
-8l`hGY9mq#F0S1pe(Y)%Q"%RPTec6eFlDfFbqc3L4fiT`fPd,re6M%809AJUAj!
!DrHY"+B!F2X3JYHpF2,"jK!!JaCRlaUq6)Sh')'"i!'qZm!q-`FcJT4cCEH!h82
-F(cSk5NF&$lIdS#ifU+Eb,#Be()&2MNq"mJ&`r5bDKi#)+4!R$!cB%KA"ZH[9%*
i"i#HaLYIYRjmGKCam,Q(ci@Il29[,BFLSbBEMdMlchMIAFcJ-PM`"*J@5m4mUCP
hQ@[dXM2CDqe'#%FHq0efKffr""P@6'bD#&X12-(-fiLH`r3-8PFTd-q'2$LZp`A
*JpLcYR@AI2iAfhJd2DldkPf-B8V%pb*N)&Aejm@M'(M[iP&"8iaJC4+dQVYF4$C
XabR5XEm2X8JC-!ic+"-[PP2IUHh1VZm",8'+4NDpqr)&Hih"PIj1hiVrmXU"J,(
SGXph$f0U)S#Ii(TcVp1c$[qf)$NS8aG`3-HSC'B"%X4DI*F#&jBH0l)KHi2HThE
rf(F[@HYA'pQSD5%ATc+99Ud9JL`UAYX'C"MUme1JM*CTaM"J0VI)8l8$f)`lX59
ARjaEq(+SbK([QmIbJB2("QbBSI6Xe23!ZQ*hRS+$[b%T3GV-P[PU45@Xpi8i0Ab
(*EmG$I9F1#,-l,ScPc5i2U"bi)B``ESPLhMMFqLhZ3T,`ic)eBI#*9b5U8(S2e%
e0EDNclY[MH#k!dFCrb(+$-'lpAL2Lfd58"@*!2S`e4,q5%'GrhICEBIacChIK+q
L%I2D!5i`16!Q$DNf9CI#-"IV5rhaX!C3+cXR-K*Cmk6@`#&T@B`VT&18)%6!*iJ
k@V`4PL#AeGXjD*%4P)X"'I#,D@%@D1m@XDaXNaPbhbH)pXa@PP#NH&EmPp,+'9d
3Z)crRmDXEi&0$Mfja6Y(DFa1d%Ip@fN!9PcMAQ-F-C,U2JIqa!kEV)[XY6pNfTe
SQ-,+)q`&[!D2idF%kk9lcqUX@U-QFbjUV4LH"M$1h)1X84X+4"qRf)fDc@q%Cpd
DH@HU8a(dEM%X,',T0SrJR*kddP0f&%q2!9#b2BqNjm)XpN1D"a!P1KT)S*k&-)Y
i$UD1rE3N$pb+Y4%f1#$ahPNlVCU#T(XYKiP"(I8kKP&blF-Y3JjD)4)"C[0KIQ-
8#L-NALk"Sj6mE'rZ+1K4L*l$lZ)9A5IciT!!-I`6S@r(5i3DXE(0mCNdK$R0j#U
HReSRB&pTP81[L3!PSm8MVMTf*f5NAfY"qpp9SZQ*bHL#6@#"Zph%J"f-p39a8KF
-VLQhdYQ$[ZeT@#i39fAfrF'e*l&rKLak3H8!RAhqHjJCc+c'Cdkl9[$2*e$bM*,
%6'0%-mCJ,KcH5eaUk9r+2"%+KrQ[$N10%$8p2c3L&d%GLM*5GMSpa6NeL+fi2"l
MSLa5dl@*CGDRqM59f2rj3k"fAU'P4-#hjC9#iZEG+$#RDA1Pmir'l#q+r9r$88d
HD)0EN!"aVr!A@"1Pr'!B9IN0`HciSh4C)T4jr'4bC*d48Yp2e4,Yca`QP&IX"+-
ZY-X$ikY-)"'eVdi&`laY,2crXMicKai5UNe`3XMJF-,f8E#XAZSYEi-JE!q()el
6P`llDHZ2ALh'f04&J(V%6RTi[6@MakYq(6rh'i(Q+#J-3,c#BThk[326[Q,F[m#
Ek4YqZ9(4!Hc"&V@BD3[mm`Q%NeG9RSq(+YmkMm0'p"J!),%'09ZqmZcXZFarh1i
j$('K(219I`Q@F'5CMK(11e!d60*G+l%p,2c3D1c2Z!DDZ9)VmiaEDYIU5$Gk9M@
m5GSZ1`TNIbI(R"i4#e@d(mafkJf5pba+,bDCYRTQYK,'*-%Kpm)rYmpP[qm4Y`*
F5+[kG52k,%BN!5M#5di0A4035iRBmN0pAZ4qqM#,"i#6(i5-`mm0YI3pId[LeG&
!'-RIip0C#RZ%**V)5SkhRmL@&NB#r*(IGd9IblNQS6[k"Q1,-B$GhCN6,3Z@e"5
$9X[Y2VCXZpAR`pj5`HhFTaK8`Z8!%S&IEE$6$qDl+*RMr(!YhaJ(5TSHK45)IE@
S#'SHT+[bPeEi,TZNUh!UKBM[9'GVjI%1cVj(J[QQ%@)N![FDl050KD0rrE#b+@,
2I$-4hSc&9-V&pqVhHjp[42A&Y3[DjShJKeTrcRM&6G1rpVFPHBGHGCZXp!["rj!
!+43T"TraHcVNEZLmTIQ8jleC,B-Al9mk0qKpI1MjYpjfalRqT&PTZB+LMR,U)NK
2m9QrA6aPCaF%VK%$C51Qf%#VI3PH`QUb5#CY$&Cc16j1h'eD@2V`[e"4*53F(fM
He!kk((q"T*p&U$-4*fCKTjimVBE00k0&["''KLHf+elGcN352$0F1+pG[Q5fJ4!
51T4h[j3qYG3@&84FLI$Hc3X2ETDm66dJYa`@"L#'K!p`3%2,l(TfVpDVa1F(98V
kMKA4cZGZY3GZ3NqlBcH*cC(qL65XLi*0MMJ*kllej"U1Le#jmpDL1dh[[CkAcR!
L-XR`"1jlJE$1GhH*jc-#aGmr!8(AD'6HYmUNBbpLqj*QY221UdJc',LBScENjUX
H+K3fH6(Ld%k[cKAERjDUC5(Z4Z-L4(H'RZ-$YiBBfk,DNd[6"kFiXXmB,3ANDK%
9ehQEbH(8*q%1-Pc+SfZVUAD9Ji`U0-rF%Z`9T+abMmK5Y(Rpm2ib5C!!i[@M[AC
29NN2HdSVbD&i4"[r,kdMcQi3Tlkei&F1%YaZ6f,md`i-PXYLCQ[#jceC+%KACVh
+q"S3!$6e(2ac11AM%R%YfU+ba@a@rD@kFUb'KJFUHrM9A9$FT`%c4f@SMlJVTVk
,99rI-h9C*![If45b98!&cUhMbi)SIk*V-9h`fF*I-lcM0`aSRB!MhhPYqTR&`32
1'0NCBU(54#%Eq#+V(8q`8ej"'Y"%mK91lpNYYLDeYM)i92E,6e0LPI$aBj1+9bR
G"V`fT&TjHbE3%hC%(49rHN'c6iCT4SK([cT['+q,0233VNKjT62S-F5#hCE2YM!
Ued%8Gp,LrK@1Hd%&U@(8U4LekC+e3bd1*Il#p!5-dj`i(6P#[1(lYG,RSMRFr$-
,dalr8l'PB9'!*3!T(3Yq62fZ3lr)5PNVrZJ(*&rPCDVPN!$iRq1a,YEIe`CcFCp
*0)[Q#eJX![`cS8@ci"A-*jh#lCa5e[H!AKY0b0pZL52d#J%X,Q1HkEl05aV,%jp
6rQHA%pVCV,(6T0-36,fZUU8""iXSl9$i218P%rDh5H6'XDECH('h-M"k&LDcRK"
k@GYC2HqS3P0e6hD,E-"*KVEk[MpeE"mjRU34aK1@'%V%laFH9F'+e8Q)c23b6)'
9S-F9HJcab@eSC)"BCcUFZfi5cX8C`-J[990Vdcc9Mph@+)bmR!abaiM*[Ak@jZL
#6cTD*kIm4,F"I49JP*qApC@jcEAUUp"1&*65qSmhpR8APZ)$M,ah4YAiCcPH8j*
aAilH+X86@*br[qHk8fe4KD$pkB#r3F(3jN0JKr,Np9BFJ*iE8`&eRjbj5TqG3UV
5IbK*IIee8Za-d#Dhc*il2!lUBd@idKANBEJKSqKrp3&m5e!4e[8Xp&0'hB[M,qJ
BB#NZfEjc66Ce8&RfKi6MQEM$$0eZ1Q&+SRmQ,3)HPr8%&91XG$P3--(E#fJYfNG
d@E+*l`0XYDJhYkmJ8m#qIh6`&@$E-ABhp45fV-F(H8VHB2rG6,iS$HF"[c1AQ9'
K8Q`C`L5cK"Sr&(0aL1hV1!BrQ1!HUHTE[UrHRJZB-VYlUKj*i'r5[rh6H(9S*aJ
%f)MQJXHC6)D9dZ#3!*C0G5TGBTVrIe3NkiAZXQpA$AR+b%aA!NTdYcSV[MV,#[l
m36DLYB%d"4f!AG'+mP-Mj!k1B")%8k-lAFq'eL&q$h)"&cd*SF@"2G,#S'4NJZ`
*l#U6J(S"rX0K)%!d,GXfKl+m-+9-3#a3@HSr0S2&-L`ZlJHJ1F%-a(@(0eYe#rP
JSP6P5*M9JbIMRLfMIIce&6+HJZ#Dd*4J2'$(4(FQSU+Vqac$R6UUZ$6*eH(#b18
'e3,ZKV`ZYJ`5E5DA'C(RC[j`dZ#[BSp)#+IZjZSVPEapa)IH%qFG+5k+$S$F%j,
b35(kM!Lh-6@T2G0m8&C1JrP)0,V"L#$[k%9iI06Uqh6TYI'bk@!JkV#5+9L+S@f
6@bbd106JF9p(YM-blKDPB9KhaVXK)4&!BYb*p8-DHXT+A88d!HjRjHB-@B5hlND
ilq06S'U`Ga`!(#5%i9L!q)BFr,TN*HVU,k)IJP+UVbIMQhcNj8PZ@Kb'J94Q9Q-
)Db4@5Ti'Q&[E"RF8Tb'"Xr5&SHdNF1al&Lm$M+kKf&PQSq1AE(b,G+5P1X[BhVi
Q1hL6dJi&'#Z+VAMpbmi5Z@4)6J9p0GY(6RM)m`8Li(PFZ3ijjb1@0Q%,iESSRRR
6M%V3(U"G,+eQmV-'6%UcPG-iLZimD$$,QFk&5M2aQmU5+AZj08Ha9`%N3A-P$r+
E)'BcDF5dhYjSLErLUee#p$H8LZ'b*5p6L*2H`RjdP9bT!KH5icA`)NT9)9SY[fX
q'&4QraK+!$@18Q8eJ)HhCYR9%jXp8Zb5eQ+CH(@TI4[-%FlUEdM!Xm'LBMrM--h
q-S-',r&J3260B$NcZdT@DGVi6-hkipreMk8lC!Nm*DL6JI'3!11U#dEKq2ITA(+
4l'U1FSp3@k"(0rmqdQhj55B'LTlCU,L[I(+Y`"IlkSq@hRZ(4D*"&B6G'3jB[0'
+k$LX*,c55+0)#Efm,MK0LA$6q'f16p[$00VLMD%!+*0m4LX1GMS`P8$N*6rCmF6
Y60fGrR@mpV)[11a9SJ@i-!F)i0qNXq#X#+4''0ce3I3'Z1dIDl63+QL#kV9BpY4
92%#bQ*Yjl#-%CKf6[A+MHbiC`5BRdYqAFdN)@X8j*M3NJlq5jH@qTYlH1P+mmm-
BqR%Ce[l8pA9-V#FqXM!#AN99pGTUcSAjUP`KjMmCBTGRl'q++*Ji2'ZB9p,4K89
1[-*Lj)!N2)J&JYS#B4Ba`6erk8bk5Fd6k[D(YUmGq-PJRS4V[a5+-84VM0-f$0i
++GmpEX8V43Y4cJXJ'JlJ'21kCc!a4B!j&qjKSEPMDjG$lM*Pr00L&p(lYK9ThZ*
(2(8jjMYY8JIkhTh1[0%TE&6S$B,'f@@Hh@L'0PlB+S@e52h)*T'UcC2[KjKmN!"
GRV3651QZm4%d2l5V0FF8Tkq'ZIK+1J+SIR,,V-I-f`#QTMZ`@3jlN@&L6,3"'NP
J[bF-d0+XIe'*2-E,kqY%)V$dr+3Kh(1(pika1dUXLKGb6KTdMFdpG(YD"U[4R6p
CbLiGL$GI#C!!JjRQ#`',UkVLVSS(6d8er4&jaCPkmQpDh+i#Yir,UjqGq,qc@4)
T(Fe$SCE'2JB[$aFBG`MF-i&ZSUchRK54%-!Hl8*Yh68cVcRAme`raZV'kIH,pY`
B%Uk&D&c&51V@N!#Hf1+*LP"l@)QXFp%35J5)NjV$'DlZI3pj,Y#@6*+5Be@8"h+
fEefDA)KmSNfPJRVU@1K+FT4fj82+Hb#TV$Z'35MYf!GLeDCd5"M,ZJ0GK,Qa2M'
&f'rA[XdJ&3'aIF4B*3m9GQP1A6XYl+cB2dplTdFb6"T%$V"1%lYIU*Q0q5b8'2$
6EBYal**mfJD)jF36$R34VQ+4I4D-4("*3R%%VG@Z2iQEqS-!B38J&ZidV&p19&D
h%E*#Xh'!5PDZpF8-hHFI,a)T4c9$AVJFX1-6mY#dJLC1Y1SPCLphLbR"8&qB2&@
f@Q`)qI`RmEY"!3k3!26mG[%bBZS+kTHpVHd'qb[-G'5bLp)BRYDS$hXMKZB6hQY
S!N8UHV&#rXHV*qeF$I(XLbC,&8a!4[*+kBK&EpkdSbbPRQdhLhliEciECQ`rViZ
QEhRc"Nd#k#8UpT@kmk6!VXj!%LB!"XT%6@6(mJ#UFREfCdc&pm)(AM)Ya#KdjZh
MJ2%3JA(DFa1EfDZXXKM[dh[0,jH21I18f[kL0&S#KCQ@4q-Uq)CRACdd-L*EHf*
(J@,pP6I6B&QPlQXIM'iM&P-AE)%)pd4FXBQim5Ym$!IJMT@PLJEeb!&L'a9!C++
beSjK3`[HmX2p3N,YbIZUr4k++&"))M@adi*(D2J&i(-Ad4jFG2ZZBMd8ihQF+Ui
lECHPL'!ETICD2@D83,B9+p(5m+U&[k`m4)Y8iFd"f,[!l[UcR*eb!IE2Uj3U!S+
58(#`DM&4rPQ&+q`3D[LHd2,kJX9*5U1Z`bp*kJGGQr!QM-Uj`pJT`LV)cR$[X@$
`XE6FedSr*SHZN6&9K65A&b0m68$PhVC+@e*QJ(6ZrE&!fZ[AR'2jT8!N#iMAAdL
DF+aDmkDR89%SFi@#S%KU*jQd#HaLQS6-FiC5bpYfalqM0e,)$j462aP,%6Ck1e$
a'e2q!SVP8PEjDJXVTmREDaj$RLCme-F5Lb'XH@`,'UKcMJ&M8hK+QESDimSZ9V,
Pq5hVeqV0I')ch'(f$VCGb`2*pJFC"@V!@CfYpNif#U1QN!#pqhX3FUjJQb&e(DU
QjaEc(0rdK*i"$dD!JUNMHXN@(&!%eVTc$Akl%bITPG*K%KE1hJI"GM"liUP2108
YqFGhpL",,c(6cV#*MAVR!m0)96`-ULa`#C[A8flcDZGe6Nr1MC&qdKU`Ya8kr55
MY5Ef8mqp6M&D-CEf$(*T0akXjqYG`dP8eH`D&RN"Pc0l&#eX'C[N6U8b9"P*a&0
GfJqD*bXHiaFd$lJ(2P,@XSC[Bb)B'dedH&H!j1ADh)XS`c0dS!mSI+,-Xr"hF-"
Q!EZ,Vj*3FidilGU#jrS"m`UZ2VESf1T%a,Qa%'[&X!23mPk!9h)&j*e'j%"iDr,
UN`!(h[XdFB`(Q6H1DCBKF+a8KbbKR9hJLm-N`1(5)L&T!S[UH*!!2-eZNK54C`0
)ePpfV8*`$f3d[D#m,4D&b0FHdm39hUc*CS$,`I0HV0JJ-+[B@U"""T3Q6UVm)dk
Y`1fSBpJN+VMB-5U!#dRpLXI4YqUD""+%&eFf$GCmRmVHam*q9(8eS,YI%QdmTdK
FL!r2#+fXd)f1$-0VDZLeGFJ+k-Md-H!V`jQ52DIQ!C,jd(k`!mMM('jA&a(KDh6
0ErFT@aE1V8SUZ2m4rGpa@"H9H%Bqf)6`qF'UPEUEPm#$L3"hjQ92NLlMfR8!lCU
Qd6(BZPA5dkGYlVf*UL4TYbcl5PHMGdR&[`Ypee69"p$*,V!DJ*!!f-8MammKEjN
YQp#Z*l!6'0"P!'e#S19N$dPVMZ%115&,qV5!J()FkPSZC4JZ*SP-STP&Ar-krjL
mLB0LA04d`NBc,IYhk"a()kkq10f'J$&Q8McNJJ'ZqfiB'H-e"S2+m,[r568bYJq
LcI+9L#BFjdY61mJU('GqaA3eU9-!)0UF&A6F*f&9a,%K+h625#)R8@@jKaSjP!E
JGP)&YJ!qb9%+20JT'6Vp!ll-R'32eXaXbdP%eRA&k1PNC*i96EKmK40I'bUIT'j
KXUm[C[KkNTi2e06c'j)m32"AFER$L`84+@VA5QZHTPm9JA5cBa-'4b%9-B#VeY#
82qB-',&T`B,%A9l%F9XGiiLUMRV&ZKQQ8(Ip!V%KN!"T3J&8d,l#[%%2EiqcKAI
0RJ!M1kQcL*AD$VQ$K3AGG`)I+VUlI@5!I'1)J2f!bP,X!ZEJ9$256(Cd8HCLE!l
jVN3R3[p6"LPPTT9fGc+Lr5*kJJ9U@%8#EKPa`Sd'kVlN(U0bU%$!48"ATaH+P[h
[IUc"5D5%p2T88K"KBDl4[`!,e`-L59re)i2L*dMGYeha`-`3eJB`QEDf4!IGN!"
c[TTTbLSbS+Sb!i[qE%9[p5E2dDS`!SSX0+jRS'94S9"5$B#-K+8%hbb,R)K5E0X
6#j[K(!PpE-IHEl)9)a$d-C!!5XTrP)AJ)S-#TG@2'ilV[T)e+e2$)iAY5PVcZp8
E$SH5NMGS"IqTZrk!`FCr&0ie!mrrP%bd40Ph4Qb(R@qJF$DfDN@fQUNM(FB$f(U
dNA[qL63Eb%J0VN&cAmr5McpiiCQJ%@4TQGEiSD*QjXeq`D+T&impje6F0%hVGAl
$VVh2a6b9hUAi-[H%d!+a-i8[RVD4"!5(hLfVF,rF)!l[IMhb8FAmMB*[McA0M0c
0*d[$i9LD*B*)3cE6A$$99Z99k0R3YT@VmH9IG85&3BN+3#%B-'d2r'@b#P"bd%(
%(rj`Q&r0G"r1c!kA!BH`YGB6Cq*!9%fC1hEaDIU6e3--Qd40hIR40(*S%VI##rZ
TC(Z+2J``+VPbcRi"QCABTIP4X@PCIE+rVdcjZNqCk#jYP$-VH694FNFJRpefk#1
1ae`VUZcU+IdQQjiYM%Ilf)TZjpHScGHKDGJNHbFR,pFCN5Hc+a+IqE59MS(Pkqa
%m$P-aU(@RZQrL8(l+'f")l$`rYL+ZqGl@BYm#DN(iFAh[0HIf#,b+4!XG6UXXea
Q2$FED4l0[84LHK)Y*@fSUF6A%5jD-C*0B`4kaci22e#lVcDkV0[)PTS*SD8&k0e
3AaiX)k@0RS,-HfEIf-!,hbDY#pql4$@rdS62BT8RKq,"cm6!#XTEqI5a)+HUh)G
VB-+jl(U%kN!lQGPV((b-a"G-XcS6Jiqb1L-FL9mH5@B`maKkSqSk8$,3&j8"MJB
R!Jm0cFhHX2h*iJ643eC!K92+,@%UQ8SkidRJ(5"S9rHZ!r3ITb)Gk[&XYd!M8,f
LEN,BaX2!L[YZbU4EUB'1jBfjr29[AG46L#[[-d`1BCR)p&+RiDfkC1r`'T%LqeC
@T)$MmFXrlDfR@bP&f9T+eBk1eC3IldPh"'!0jSZ2i3E@Zf9!m`$k5B+lcZT`00,
bMlP+(r!e0a16qIAmI0I$[B956I)NS3KH%#phr-[2Q3d"i#Mp2$[$-kUQ9h"aC6,
ffD,"K$30JiAG,H(Mk-H,J"[F$GNA6Xf[@D#`fk*8*NG6bL[23!l%00!p(SAHHQH
%N36i$%Qp&CZTp!bkiQBEc1aN0r`RDp1BeLd!%`3Z)"USbAkE@1,kRcUH'bdZB52
GmS2U+i(dh8ZjH(#YNZh$lQ)E+!Y+lG$*1%BbIXQf`bVi`lRQ45&MAFEf$T3f3#+
Z`FMa[fRedcINk`H,,Fc3qk)1Z+-b#NjR,c8)!cb-KThV4D(%ebhIkP`RF`Mq[1%
DG`+Ba`&"ppr3c4DrR[rc%58EZir1%&)(H9CA)aZRpNX05pGjRp9)HNm(A"e8dMc
F3[bF+Lr6*N`$+c(P$0PNcMrI5j1b[CDS*dP(201L'dcBACdpkfN#)Fi2a'SjT8V
JB'pErQ`@6fp)KGBb3[I8&YX36k*2b6c@Y!04R0&qjkpE$555*dj(&R41d4ii![Z
-[rJ')&q$BK0ba!JBc8VQF(+DIM`"R2L4rbf,GZ"*IeDDh!BJFb`2L*H,!#1I&@5
DhGANmEfISKNZfiUm!,N)a32h$P*e9NF+c$BMNS@ZqX1Ffilm&5fF'%bD9Dp#3r0
d1Lj(6D3m@DS+%G0"rrebmH8,NYm2-9B1&+c'&A3k@#UIKe%K*flh$d&cZ36b3p[
0F-3#Q2$iSmhq-b$(Y(l``Tc'aSjCCY@Y#EL9PM%AS"2c%5mpMQcbf041qCc[+q3
!#Ek-42*6d'15[2$(Sq1H1YFjr+(Ae!(9#'C0m)Lh"N(!0c8aB-e9[MH4A%+Sh%$
P!f,Kh1,kP2`eZJVm0eK+83q-03(pAhGS#GdU6C8d21)0)2R#BpH59SmP#bQq8(C
UXQCT[MV9!"ZLUmB)),'FV4-EmTpJ$P-Zm-400(cdlG@k1i3&&Gb#XM)0M&kp`04
S$2+amT!!3E-"a%eQJeQchLRKeIP55%3$R-9QBYK,M%T+5d`kfr&pPLl#jKk6Km6
'p'L2-Y5M@4qU6Frh*5ZpTH+iV6"SpkjqcA5q3NKT4F+HS@0+d"JeU(S"8Rd6jUp
5+U3Dr2j5ULJ)IGcV*@d)k4Q-AEkfTXP$H0r@F,bB()RJEEM`KRbQ[`A[JTcJf#P
dM4AlY3DdTp,T3F+Ma,RqHPA*BlZl0lN5)e9lp'+cEi14[Hf6-i+PYB9K!!,ELji
eRQV0I%BPQ1f2kiklfpX6''DiBRJ3d`J39E4H`X,k&R`qNA@Fjl$,(',9!TRS6'S
3c-"[cK[SSH$B(k[I4VEYa4FB!Vl$*,f6Uj!!+l5k!1C92IpY*K9I$+$Vi9-f9Sp
bA*HRjHV`Y5M#XDl*3Pd6l#CF5+dNBkq3!(XG0"h8U$f2UKR2*riQ1$p,CSh$k(N
`qiQ%YJZ6P6i#TXV#Bh`I)jXhSM9,jp[2UfK63k2dHH%m%+13!++Y'c*UM8X25E6
2j3p`kE8JArY-fl1DcL`i8Hk-IZ%,[ZB5@CFm["V39Lc9pbh0Y9&2d!-1dr%kH(q
ETh13!0X()*JFaqDK-+R)KZAk'5fCm4UX%K%1GM$8,SQZ"-ZE90qP499XF**Dqeh
V!jDXT!TI$HmP(6L1$9PFlN+eh+X)G"-25qAfPGhpcD%2%bNQXY*b'5@[b4eqJE8
2Cr@[QNYVl$J&3*K%2$4&Tj,f(YCD+SeV8NJrGT5GCYrC8Y4ThBCCX'cr!#Bh2"l
`kTl6'G1TaEE`jUp5Eelk!`$GI2B!MpJd)ej1hcQEE3Xp2-3q3YbJCp2&Qq`Q9Xi
-`F91A8rl8VPNKM&Xm2hY(V6rRIJ*f#5*Kb'*C8N@2+i&lCqSD,,R('8E+D)cP3S
DCfJhcC269p@CYc6%"$mK58`'ep,I6*aR#3Fq`MBd55JiJL*+2Q+`&LmER-EU9NB
S@#YJ*Bc@1DHBU!liAf8Aj[`Z(Am9%*6hmh5%lY6$DhJTcqDUYk1*[RCB-cH@AAq
jSpbb93qA1"(RbCCR(&YeeelpYh1#j2+EdQJr#XXIKq4I!SjZD2l$+`8RM69qa!9
"#0+j$"!D3[4ZJ&C1$DQ[Va+'BmeA-cl"f"UIES99@bRKq&V)"30XLf#He(`+iDI
!aaqrZJ1p$9ED*IA$'lZ9Z&j5l9Rj9jb'3KThV@XKaDiQa+(I'*arZG521h-1BJE
q1Nm[C!F20,VApb$Q+0J6PYH8kK2AJVNir@,H59aNqdQQ8r-jK#KbiBf%4HLl"Uk
$cb%DXXlHeLQMUJI#bVP*kCJIa)cZX9)d#X)",$j+khl-8hFfF#6P-4PmYF*(jm6
hCJHhbH*ZjiEH"T-p0j!!UZ0p@H-IMSI(U2(QIDahCFF3,k#NI6L#M5&"#B8-,6q
D*eaJNj&S(`PZjH!j"3jh-q@mhQBM"L0HZ'r3"ZR*iL!e%+TepqJ!pc$AbDAHk%m
)%p2b*&B2T)9YTXTE23aV+@mIel9)P0f%-1mh+41Q`4f&rIX%5,CR$pUKE(h+G0e
-90pJr"l8ETNeGG)J`NT'!8IX26@fd%qpLq$qRYLZI)UpMmGSZf-*X`9ePcSLmX[
Jc9!@L4+Tf`LVaV%lEKYd%rU)fJ3Vc))ZDI-8%aNr(2#h,kA`4)Al8S'%lEAhE68
bbR`)[r+$d`9SqZ,[mX-@ENXP&%1K$jfEfMMZJX%kb($aQJ$NHB6`)2h83L"BB%9
`L4`aU3dCm,Tkk9TZil&-#P'6EYhU1HLR!fI8aj!!*d+XUQdrHZTdrB*-PQUV9&S
-P`HQ(06C,(l+AYX8Fr)1YF0&RhS"8bZ&ECUD6RXJ8d)`TQL%-2*L$HBk5jV!4G!
Rcf%PLeSe3UPX8%2m!!*4(aZ,GE)GRX*'clNF'1$&B!m"(f!GK(i1`#'8&Dj#YV%
Th"+mcpYCd4QdF)N1ZXlJC)YP&mfHlqhc2*L!L$aN-cEmGHq2CU4q4hapF`"MjL5
dNe*1B5$,*eeRKGTCDf4m5V`,9&MR-9P6(Yj@YH%[52ZA$"D%HN8-eM+3!%lEDeJ
YlKm3N!!+0QL-Q9a#Lc)'ISA(i6N51d',Na*"$B'X$`C9'Q$!XlT$!+iGGZ!Y)T(
@jr4jAS86!2"(,-lN#0TPq4&4Nq2,1eeFh-3p8+h"Te6)4!5@qXk[ELrLU6S@hm@
HL00BJM#C9r#D'%aiRr5``kU&N!!H%H8#q0Ec+PC2L25r%#NFChKP3c+i8FP(i(*
ceGPqQP"$5Zmp94B&f$-'UqA[HV89b2c823YNQh9aT3YITHlleR6H8kpiATrK+rd
dj!ii[JL3!-YIU`iG,&iY"62LqR`X"BD*Rq-e4Eh&!M6iQTeI@M@Z1!aFHK%j$ee
iB5frkZGB[KL5cH!9U9&kT6TM"m$1,Q(clrAP#'N2T'CCcR3C26)IN9jij#ECmYF
pqPUD2hdlB23QDS!P#FCZL*qjmPYYfK1-AYU`%3G#d&STi)pF#QaDqC3)AR&N@kJ
YMGF%8dEj4*m%r*Ne[24RE3Vb9VVQhrQi&ES'UVpZA-3)1h6YCe,6eHPcXl822R'
IDakZBHZcqq4)NH"*QjPLe8ZS-bASb25Di'b'!M"XFLq2!CjkrAkhkaMZGYcpZq5
,ldM1IC2c,YHa#+fDmG92q9Nmq3lH54kiCNCc*fQSiR'q3c0JqkHc0#+VH`SPEBJ
jG"6(LQ84CaGM+Y65+kM!9cT08jkJC95QM,UQ"+ME(1TVZ$+6kPiM[+m-R6mNL2!
0E1PFIV*pU3IUE(6T4%Fp9*!!hJB+KRddR)#!KP,Z&-k[j83(1bq%pdd1dUmf8@2
4ULUTfPP+&d)J*@)fJ266eDLbrMUKCF#DT+L4q46(`UC6UV0HEL&0)J-le43F!"(
,cFp++kZKGlR4Gq5ZiQfLe3I'b4d!XMBcFZ!UZ"@,*#EN,2i5fCR'$rUQ5GJA)S[
cVQ89+A-b@'4j`8&90M"1)R[UL+#))k3F6il3+PA+TGC,6VaB3G(Ha)h[IVRY*d0
0X!e#,M),p(P`HXe9+6,c!*pa#h@"U8Z'1'Ka,Ac'lZf@2-)RMiE%#p3kfBSNBrm
1j6B!M'TbNjfi35#9Z*Z$p(6dmUa25ELFC4NDY(k(e@(I0KUZ*aDY'rrVK3Jb@SN
F&31-1RhAa5*`$DLa(!3[1!jZ*S@lpdGrZYe$B+MJ(-(E49mVJTj3"X,E%b45Yq$
%"IGCq-d'd3YpXkL2QQ4)ii&%(F1'GrFA2b0XN!"0Z(-faUi),JSpp6Q[XM$"kI4
48p*pqD`)VKL)*3Y6K$5*`bp,&QpI4UP5dZ)85CERZlfhU5Ck'NF)1jFb4lJ(&ce
P,X,8[4CG0ZMR8#BHNQR'p+)pmp,Vj6XYl&1chC,+aLJ'flm03iTJbc56XDiHjAJ
4)haGRL45D[fbJbqLNeaa)aXm6i($IK!LBC(TE9D9Ncel3D,hfB-PDqDR!D&)I+)
`)!4H3HNC9hF$K-@mHFM[(hUAH$I8h@C@IJVILHCeGi)1JA%*NdL`2A1-XE!6i!G
#CfQa`5BR$'`)*ESi&LE%mkrEIULU)ENrP26VSHNi[*`TKZK#K`j+ajLaEdkE$&j
'J4IPQZ&TH,Y[a#!q-FV9b6-!%9l3[58PBXj9X5DX9$[jiLck#Lp1j'VkA+'54RL
&R-'IieJ5*k%qDd`,V)9f"Nm@lc3,!$$a!fpX+b6Tdr-p4S45heRYU-X#I9M#MLp
FKBBkkmENR5dmGJ!fN!$S+fF6EXZI1Q+9&qLIibPU4Ka"HMa5Bkl))!DE[pM"IV"
dI#X+mV9R)-hZ+2ZE*Heq#2G%US0M"D4U"Aa'0QK-qM2bTC[82eS"iR(9')'@Xb$
I!Uai)Y+KqZG%%4J9Bq9HUlSj*M@C3p3#Ze6NSkUpmZ+0Tp(#NFS,Kc%e[I4`#-C
)+MjCmGN"jNCHG`[k-3-XJrBD4rlX&5qb)4G,2"k,i%&%rF0%k6mRUY[*"KiSM$a
['Y"3r6B`I+D@95@!Uh!k4L(lrjBl%fi+'BAiF`C3XcpaUUf#rEJTY4ZTi$p$D#)
aC+(&JqJ2FR3l&AAA(#Ij-h[hlj2)cfR#DaADSk81#$AiFC0ff)2h0L@l4`qRaeC
aTJM,jdL$A,$-(MUEIL)P`pJI3D'N#)m%+C31R3ST0'Y!F&QA5i#C+BhircAQfE[
0U'A`!%,(E9XF+3QNGqHr@Z*CNUQU&@0PfTMhBY,AL91eA$,#N!$$H$Ff4#DTZU"
9#ckYfXY!,Kk6+qHpJeQHT&1r)YEGhY64`G0)3q%T@MbHqGCh*0PLI'$'U9kI"j!
!!m*@pXXhPEbkk9UKL)9NM4QhR8`Rd0[L9afYB%p'h!8i!60P`-L"8N,ha$q(#AN
04dj!p-C"CUh"lT9d@6afASY6eMb3!"VQHR1BHAdYk)PIHl8'FYia$XfbAI0D!hq
a24f4iTacY49@LNfbpEXG"AQrZE6Tp'jM[2+JT-##I+[aaAD8&RF@8'0EC4(dJaR
k,[J!V&VI$Hi*YL!V`GHMbGEBkr"8311H'*qp0*6lGeFaQ0ZIZ0@Jq5*6mqiaF-a
qm2HDFHXRSZqGbY&Xj[Gi0cYddB5qLDppa*eJJ1-,[S[QSdLGaj1rV(3'qhUGr,`
dR8([S'iFeU8KKd,`hXS%d!DEkX4pR*48X'%#c4E3FNRPNpJBmQPA%ZK4lAQdR'+
9bK4hI6BE,K$-C,"5dK9j+,G`8kXkkRRN2J)U!hGYic(#k!jE$*`88e&PG0Ih*[`
MHI1i`8mpX,rf+i,Hal5!*Hqq4,,'`S2CXFA$[,iVJNZM"85K5@TmfLNkm*KC2Bd
dDae#Ij!![YA)l5)ade)pECcqZ3*`)hqC3"@A,@FjJq9BDJhi[5PGX(NC9!23+6#
d8M6emI9PPDZI-E(CX+!GVX*I1'PmD&IFjZ[c)me@j)(hl[D2a+#C1P+h!4i5[*I
Pb'CLQ-Df&aUp2aE0kIADR3dqje$5"+0SDYBkUf`[-,h%,j%JjqGP&1b'Dq$hDBr
#ZLmZ,TaI@Be'D,d+j`QKHXM!"D5*Pj'Q,SH0hICLK5R'kKm$KQFqLK3TpZ`GZNM
hJ9#0PjlGi5q-6&PL5mM5MQAKIZ,+J)h1h(MUS-Z0j$LUmN*YbUXp58kaDIDm[KC
!!&e!l@LUfY"6JV$h!Z[h(!lPDE`jKR%liLFliq2aiArHm6#16L@0EmF0UcT#,A8
,)20q03(DK1AC-R60kq(63r8aI26j,5rq6LH+1L@$`lN!*QbX6l)44&"N@!2HYL*
*6M6C,!LSQ[XQR@,,*M5rX@eGbF`MEaQ0J4*k%j6PcNG9$F'SNaB0i[dU[Ui5MNN
*q4ZA%CN[C%,mSfY-EramUP+T'aIN1(6`VKDNm)K3FkZ8r)`i+'@DVLiHGV*,IQ(
XN!!Jm16#B8VUG!KiCm4d"L3J+k3,ci#l"Z6PX6Z!mT3*MPPGS*i'Q!N%AH5DFhr
F,[ZKN!#d%1I!G1rBb(Cq1"amTD'+83Gm@L)pMh%R)cb1QJdkc#e%#D63,@a(ml`
l@"!#dV5A8!SAeR)qa*Xbf(H`Fq4JFLSF@5cIPGfpJ6(j)PR-hHS1Jmb0`VNM6[p
FAZh[@DG1KGPi)jF@HMeBHdS!NV&`&TRbp92IN5i[4ccY4SDJY+E$V$IZRmYY$V[
Y5S029&XFPCl9a6fU@ljGqhYq3qABlF@PmQI'K"P4L+8Ie1aKc0HhH'`fB#DCH06
E#+AQ@8PP#Kb)ATB&b3(rFCl[3MZTU%Xl`S!HR)(af0[XT""2kJ9T%H-JaUiXi!Q
581bGi3rDa$85cheJU+E2p@2EkNF9),V'1HLL8kQ%#dlHbD@B9d6d$6`"X'#,K0f
a0!-68`U-3rGV&GRBECPm""K%(i!N4V4bp1l#'T+MmLaZHKPl2R8cGG1)@$i1`$Q
ZNY($N@TG3bqNPBMfQ!)RV"bemQDDMq28',66Z,-!3Vf%EZ!3RhFGE5c&d"V-DDf
2iP*mqRjM"#Pb',fIC6@,5@l`clij&il@K,2MB0Xc%'S"hNh-[rY5m$[JPK!pp$A
X%A411r-[%ITh)mr2Adq155lF0DCF[I1SeAKa@K[U[&&80ADK@CRZUPSphTbm'T3
N`Vc5bE24Gd9$+fPH5a2$d*TY,04X[!GNXANP0[p!Pq[b@`f5*03kD6pUUdSP)dl
2k)VU1[k!BFqiE)df(fViZmD+$,Xi*%KPaae(IErZ&1!VD@Iq-Q8#81QCYa,JFe1
*+YGMKQF2%CU*3bbDAVS*Y0fY$BmkE-cX+pN0IIV+YM2"bHQ0VU9R0*UdFGjUT5e
H#4j(d`%aT$R*&l+,bljM03J$*fp$Tp!&IApT16M-9'*8C[d-EV3K6S5m$fXaI0N
2r*M13Y0--pUpI!I&!fS*Hp*j@(khC9SV#Ce)YP9AbI9#lKB9eb&$fkXf%,-6*&b
ah6[cNYeCIS#'Z'mU@UU@-*9e9053!*E'@+4-'f*@!'m[l*15iR2`Y+P6#T&3M%q
"lf9EZKKpQQDQ14GUB)Q[-hQZ#+1@&$P+45mD#!GpcU[+Bf`cLm,IPcP10L2VY$b
YqJ,&3Hd[MrXa*r91Cqa!fD6b$N8a`2L2Gf,m526k9[A%i-9F)Dp,!!di"S%*jmB
8[(c4,#3#&C!!'S5UG(D4'kdMf1kN6G33@2PB@*p26[29qdI'LG+2(rNF'rRGP($
b)MM#$CNdj["@dkEe5fGHaa0X29"PekdpIhiFAC-+4Hh5D"pRM5ed9[J!TC!%!3!
!33!3Yr3b!EId-J%!!#(0!!#J[3!!'lJ!%FMC!!lGN3!!-)X!N!32!%e[FQ9'D@a
PFbjYBh!ZH'eX!!!'VP4&@&4$9dP&!!#ai,(J!*!+J!#3"d,"e)T#9+X$-1)'pP0
RDk5a3Mcck#%,V--83D*%ba0fV")!r6@XlQ#X*L'99p66M9@EYkLLEk@m&NhFr3L
2L`3UHRPp*K[X'Z(`GhHSV(84MYl+&Vd&,(c%M4iUq9I1drI#ahMT'k'iFQ2#*Nm
m%mU%HVQ9"*(E+PQB@[Aa-ijURR5DaN0ANDMq+ZG-VRN9E5"-IU9*`2T`eq,UVH3
CUCI3([DiGUC$54P20qL6+VDZTHakbRfkACRL$&lq$(Y$,4rSBRj!2EGSCVAT2ir
dP![qlX!c#eVpVd5TQ*!!b-ZQ)M8r$bmAjAYfYJ`'R@pGZ+dD1alV'5AJbXZ+3S"
6rd$@EXibiMZhKX-YL`U`C+JC'85-#-Id!G[b*MFZT13r%Q[PAGJ3RJYhj4!MpB$
HNlP!S9Jri)-fNMLLE#+q-RiKGXHh&$4h&c2*QrI-DSRq[r#Kk,dE4Z)8"NQjSjq
IKqYXV@Lf8%%)89iLmp9fc&d[LX*$@#2SeKj@hRKRhe)C)2alZ9CFf$-f9Fd'HPd
c3Akem1k0R%m0YTZ*-$B1PaM1HVZTF1"mP"cf8Uh#)LVqF$P@$ed(5P9kV1Q1!Hl
AE4#',LD1"ITGL1rQD1Ba#39!#R34+$5Uqb5UD9h00[`K(T6Jqjk&QX386T9e(RB
1GRr3GfSZaraSKTS`0TQXIB5mI#IqTkFJDaY1d%hTC,-rqY6S-(V%4Ddc6Pi%LTm
@$D[U,!rFb,S3YRiM1*3(q`@X!RZ@delm54)P58q@58@%*LKr00m,D#`miAe-jBp
Lc[MaZNS1a5kc5bJil82`dMYphPHFP(R!L",!NJ8*%`,9A&TbE''N+mM)fP(FU&A
I3jf#iZAQ0%6k1EFRlbFkIIJ'K1lhVFp5AY6L0-A10faN!2GaV)$P8[Aq46EdHa'
V&N0fq`aNp-qNI2#6+(4B)4*-Y[i-#&iKT@(AMX#%mkfDJUq+fcG!NaKlqr,[XT8
"461K[UFU,Q##ICrYkmm55!)p'F[`8"4U%B+K6$fp90@(ZldLV24XqJY$aiC@1JY
hfPSf)$L(aABmpDmN8GXHidI21e"-Pij(RDT"mVf@&dLMFD'S,PJIDd+f28!FRl`
`+-@G6VQh2j[DmI`HI+%@p0TdfEITKEIdQ0&3LMh`,aKp0b[lqhK0-4hC(CaM"aL
X#Zj(i[aIJCRer9Zj-)II1EeY#b0dV[TY5%Mh*+0dKJZ82I'rk6l[#Jc%h880``#
4TBk%DEFR[2SmS5IITKjD)4cAQ8R3SNpX5&m&)Z8MXB@Y-(%3T65#UCp@#`Q+5Y0
'1B`Ia8[,T-!rJ%BU!f`l92XE@6VJq98YQ88hHJq3!(aamCH1V+kmSQHmr#Rp#E*
Ip#AhES$aNP8-Qi8NQUBMUF5Ul"(b[+5KZ&VS!P2h*emd""h46hQ#L"#i[A'ZqF4
Hi9-BRq0Gq5YbZJ(ATH6"MZlTiXZYPA6&3B0AF4I3b&jh-JNVA'P4F'!$VRAK4pR
SQ)&&h1*%-hCKjU9"j!V&BH2(5k(0EE6HI2$AAUeT&92MC3j'Sd##lVpF08e@q)f
M3CE`K3,@'*hL&DXQCfH5EJM%*jZRm&J%9+riMT!!VQr`i4r5J-6P9qEKq%8IlUA
EF@4I8,C3dQL1[D6+1Q@KNcaFiV#Y2ife5F5MJLR(i4'BbU$(T6"ZF"9`SIV[Vp"
4kGip-FAZIL35c+'a6&`ImDjqZ,VQFaUX1b0i2A8-TqaH*Nc8P#`384Z3!!QA!E)
U!3GS+QF#HdUj5CiPCpMk3@aBSj!!lVUd+"aKQBQ$IP!*kkiT#L%lZ8"Kd4He(`2
NUN-c-Pa)%i"Qbk4*e$8QmY-S)-X2dqGUdRljim#6j30%2S4K4p12i)f+NK$ZaVK
GQ#q'"SI1Xde(04jiFjC81q,k,,b528l"cZf"e0(1"pEfe@3R2)PqHIc`+X`BAF'
cl)BYcdP$U'FCC&`CGcId1"*X0b[)#5U`Ak-pEe4HbhkJJN[d2K21k2!I("PcVl2
NV[6aE&R%E0DBK*!!+`B6Gh)&0iGiJ+J,TU`SaZLM@N&ZT+6YjB5rei,'BdNY"Qe
Aa"+1JHH@0B"dT54B)&X*-9"aM8qD-M$al5X8"#*@q,fpfEAQE2[$NmQfF#6%,6%
I-rXB`-40aH8mSRa#Pi`5KpqZ2NT[M#HV&`eIV2&rSM*4NrB*"d`eAQ,NlF8kIhL
E$F6lPf+1HrIU+[U!QEI49kdX*jC'66rHkf(IQH!CcS!)3@Gm*5Z"SMF$f%I%N!"
#+`A"9Q'cJdhY$XHH9M&',paepjcA!T@YlpX$q4bh,11LA$,,FMV,AcR`d-1mFdM
MBPDVD!D5qakmVEYVphKMaPBrpM,+FF4KRY`f9FVIYFj++X*9&Efi6CQ&a2XX+k*
e,Eq*rRl+BiU+CC'dVX(5l"m0`P!KUHF#Z)45N6rch6$**QpDSmUIlk[*A,U"%%2
dqM""2dKPIEZ(cDAHDi1PA&(XE2pa4Fa[*r'ceblYkYi'p!TC%%T)#aE5)d6qGjP
F,&4JT6M#$pZ`IpVGXpKZ5N5U'eAG5+(+@f,G9*hr'MXebZ)C`5!E2($a([,-K28
`-VH$,Vh&SLXL4iJ%hk`Bm*-M6JNk@cRCi@!U`G+3!,qETV6+aeiEXa8q-"'D,Jl
%T%A-a*!!rd'fU"IHVL3&lA-8p!A+QNRa1Zq"SjBm$$fLGjmNlSQpflTFk$ZMaRT
m'dXFjYS*4@5d%#TGkm9(M9%+i8reM'N,8$qSJ4EFp4D#F`)4[SUbA)f"pSA[M0Q
2(E(846&+UY6HkTYM*haA&bPV@N$dLBJT+S2P&K$%f01I*$QmRl$&F0)U*d@kM6P
5&qPZe[!VemqESrh8XQ6(Zk!iJUrI`!lXL1#jFb@MbZh9TT[R(IafRTRT,0VZ5BH
JVS*9ifVLA+!"Vf$A(AhlMjIHML!CA2+LV,Di3(A&,X5HE0+R%3lmfTG#Q2I&e4%
e5$Q&lCNI'd"DAhdNbBac8AGi0V!S85ZLPCA`NMi!VCN1l%IKL-bYf@J2UT35D8'
RCV(J6!@05DkG@J1b"iE2X@bZrl9NdaaN"9[FVC`2q+2GJB%f3LDUV((e5NeIa"$
*r03ea!)`[ZEA0ZHrhIN04DGmqX!lMU&MRDNpIMT,qT(HSUKf(qbIDHF58f%Ed$d
f9q-5med8(Q*GRTR-3Zi*1mG*l8#1X&LT4ihUKUpi`mkGV9AVIXG#*Bi1qhhLhRr
BJ0I3eqDZJJTq9l)KU-LmF2r@K`EDX*3lVq!(e18fk[K&VF5$5f)c'#4)$'Y*'-E
d[ZSY$BBk*AE&BARYX4b0-bk0BaNfpX+Tl)bAJICTdA5)EQH-KC0R6Z*bmNi,"KL
*&BUjZb@AE*IfN!#laNarRpR$Q*-3!dMd"LYI,k14IlPpq3R!hCUj(ceQ58ab,5m
5rXKX3a,%HB!UYp0aPaYHKMlZLiLCB9"lN!!pGJ*hGVYMEp`2X-4$NN60QAR"#*k
el6dJaX)Gd'8$KIH3!2!q6Me0Ca[403kVbi@"[+i@mf,8CVE01i@DYK%HKDqr66*
3TYI8h-Z%HIB&X@rhHpp&5N`b[ecQAdPUY[QYT#PUZ9Ai)FpNiNbFYiE1(,dDaLX
lk%dj3q8bh98Fi8VkQQqRq'U5cP"eD`P%K#c8L!bFcpQ[a2T'KQrGN!!GFL!216p
Ecle4d*hqLel9)fK)@R3S@[`RYQ)VNM+d-BjRPU4TR5P%11E6p!BH)80U5-)F,64
bJ%A[m[ULp-@ITfKQXr453Y,BYGH!E0[PLaYHGJBB!C)VKkQb$%S["4l,R**QN!!
4F5qVkME5m$bY8)GHmKbccEE4PdK[cLFdM@"LZX5L9l0p"DZ1j3KcZ*mYjB5K4ca
KS!JX[9),im$+"qTqe@0mN!$)eHhP"V9L)R%PAGHi,N)q`ahQZ5jQCMbI#NBVh,a
9&QZ&1[C%f"qHKX)Di"fV#$PHZAm%G(VmF0RND),kB$HH(P!`EfqP)!SGcCD@jCX
NqIZA0##1JbHQ,GV%"a$ER"%jlMJGRmmD+ii'A8Z!SX5fc,G*TT'D1(-dmGcJcP5
0-,H3!%2%LJQR$SeI,c(8cRBcFB06UALUZXLL9X'-e-(*lY#h@E(5[fJ-Be%qEBR
lp($L)`B4FDIFCZB,NUmda99i,c,$51X$AAM3ZefDE8ZQN!!Hb8ZGi)ABfpE$Bq!
%3SEf&GeTk*CS0a@rHir,D6*&U6GH$%*eXI!dlF+LKTk%*i+*4c22)'1@XXL[lTG
AJ8m'[@aq`TA(ijNcA2S#+iA'1CFpmUEp'4Hme@Ce'mXBdceQSLIHqpp-@Sdfhli
paBXk'cL1PB4UiL)FG&NP&qHq1USX"KZAYqhm9fLD8j!!YE@P#h@5$K`3+S)1RGb
FdASP2P"L0FRep0TT'p1MC-BaTh0QPVhIIlN'JH4cE6Xa`r`XCCaNbd*0iA6&AD0
@25pmE,Zm,&H+8!%*V$NdI"*8Ri4j9++$p&F)D["i6c25dZpGXA(S'M!R"&r+Y"[
RaP82k&`6L0)hfI34`M5e)2R'!A%F-X@FqrTUSE*RM%JdNBm8&LhpbG%b0G0aHY8
jP0rIbYT"9HlXq#PIeipbX)khH1XHVYlJXU["6ekj`1!5d3%r9SRYQd&YIZkVY`0
IZ#V@K2PKH`BBE`'bKE(aTLk%JKIi4fM*J#N8IQ(h@)Yp[h8ZVU0EkAX#SFab$1D
,9"(NdfcKj0"(f6Jbb#J)39fC[Df&*bjlQ""KeMEMbH+H5)0XU596U&AD%KC-MY"
iIX+c#K9VPafLe3+e-X8&mGCIkB1T@hF'+[193R@pJ"$dKm[MX28Nd9"C!#CEKdC
2VDNRVVBqqk-S@m%@F0jHr"6*qHUBNj,DMLSpJTADm`%%i8pZhX#H#""Il!8jDk0
@N!#Yc$*a!ZU!Ec9C@lN!Alb!HR,cH##@jM6GVQdDB[`+dD"H4,XLRQc31$`q1DE
c%6KT*"ER3R'FQ6BhP*0fjGh1!%EM*Af[5*4*UDS%J%q@bm@V$F%a5dV%[2[HNS1
KkJBPfKVUG2i@f-(%"*%[*$i0lDm&dj&GjG06eJ%&N!$RN[4'il(p0jZ**c"LCj3
9@d8HF6ELMYBh"1J6Fb5S5i`&@6#[1j&b2FZ1C!L$')d0V4D1Y3VIMYq!miXZ`0C
i[0p!!c)LF!0l#3K)9[0+dXZi`4HNJRdfTDF@r,UG9PIUJMM2Y89MdT3'AdcNN!$
B*&rP+86!aNl-`)$!A,E)E&LpT1+6'5k"RUa[&T+2S-RL8*,'%JAdad9&GSF[4Df
a&E-GXSXcb3c#&[T`EJLV24,MU2aPrhXNGK'jhr08+"0FbfU9)XI(j1+i6XJCP18
LfGqk1&Ca@0*4"Z!m5GhU68)PACRUD+XB9Ik%L*4`-FclL-""A&*R3[dqB&iN#(C
(3iblUjej"cX,)GP9Q5-96p9H0BR23eSZm&V&bZXfZXp#R&4Bf`BrK4`T$D%h&a-
+&f#idUZ+iN[6HR@)PD)Tk4mYdr0Hp+,iB30Sdce1C*!!DC!!,Bi`$`E`XBmV9EN
BNG4''N6cI(3Jb*E'f%8IeJLlMYIIQ0epE6iS!faYh@a)fYh3NYrckZ1q#4'i9`R
K"hpC'rcQCk9'Zd)SR#EI+8qRB5[XbN9kNm3SN!$H'Y0Qm$FT%Vq,H!i8C@9eYTC
$[@&4!"-8c-!Yd')223+$ceZ2390[l8(bK!d!GmhB8"#Fe*Cip*bS4B,r&$S!eER
aYCA[%@E6)LfPmbJ+DH-A11dJVd4N2V(H%8Tl4q$)f9PFJYBCMXS0C'G@Lc%@5q'
#'*6!$Kq*r5@5P"l6PIbBiqhB#MZ4j-226*@k!8S`9a`-C("qX,C)R4,#QGI8+(Y
XhMTP$Q)qERUL,6Mf4E9S8efG)U14HGVKp$95dD,lbmIhlIf%[BEj-!krcUjTq2j
NjE![$HS*A)$!r@4k8jaMQr)-!mdC(R4*C,'m,!!k(q"S@#*b85AA4M6"VUB-PbV
m#jA6AQ2r`('D&,h0H!VQ+JBK'aX8C0QkT,R)MTa"0LEp5K$2f(L8VAE*L"*YU)+
@KqLMi)LdU4kb1D8DKdGR2-ihE#-DYreHAAUH,R54HlQ[fFFNbpa2"JI`hANdrDl
%JUHJ%&ZG4EZ)RpH6Gr1r5ZAJYj9pYUJ5@#HfJ#d'Y@ZpeP,U(AS)TEecG6lcJL6
%TVKI!V$*cjmMXi+S#C8-#VqN#(#jaPbl'!lrZSm#ic+q%1Q@,48HYhFE-V!iKR#
fkVT+HCfjSR*IbBhA(TpV)k50+Be[KDC(R9pKYmbR*Q0M1HM)"0fbcb4XI(MBhj'
6,EqZ$&c3!YMfclA$%`F(R"PCMId$BM6bHXN+bdfd2b2hdQU21jj2f0MQT[+dp!)
8r0iZZee38aNB1Q[UZ%9d!Xebc3$YCZMLL*kl@JlQmAqIiR#!faQ`"`E$NFMl2qI
Jc"KT$qk-Z'+Dr@dPTY)cD[eY#m*rB3[F-(@EDR!'lZrh8IFXXVU(ZP1MZCb4EFN
RNH+`ffjp9$YQN!$0&kLIHfH*!48H$TR`fULEAk5P4)-@hEl"e51,X'rGkpVUh(P
fJ[%G%B[D`#&FfF9a`dSD2P3Y*b@E2R*'6e$ZLh+fEQ-Qb*E[8VbH*c8!hF0#V(J
bV+ii'jilcmcErY*1ELb!V`*`KBi,V5`dmI9ME1BlhajTlNTp[UR`kjUKj9TPk3l
qP3I[M%cBL`9&+AAPc&@aGdi&13Hl8%#Z$jGl4Gkp`pERGR%+lV"[[,r112S6DhT
VlR$D24@T,8XD`i,hEja+h0TZ)25[K1,`PE8h&L&cUUN[3JXAb1Cff8b*aX*Z`VU
rf9$'qM'+cD*Qqd48@XTGMIHeC88Z3M+MTVqYbU(q5*DXIG#`&XIEZ06iC,"CQ4)
PrF8HkiL1HDNBkkeCC(`fD4AiH@fH3qTUdBr9Ph2a1Cm%`5,1Vm2Zh@[E(RIG@i`
mV)[2i8NLKN*(bMa$iSXC@S0pXLH%$[rNr+(JN4E"RUdiNfeK6%b`KlI2YqbQP"0
Zj,VPlV2XqEY#%p)DDV01q)r13l*pLcGFDSZk,pAkINZlDiPRNM@6ERJ++@I!4+c
Il$jr58X86*9Z1RNGV0lIq0dHXiY8)EpTAMBD@&JjJ3d8#e6[3KB%$HrVk$9b+H@
q#M-'K3rU+d9f8SHpCMFVjiYcPahbJABU5VjhGp*ZR+jXG@6Uf8UVVR"IerB&k0R
mla[5Hfc8QDECbcbVckTYZDT4jBJDrY3$%@BA",Hp&Cr"Y(23"D#i"K!FBSQC8UU
dC"E"9"E'$b"XH$dRKpXX&!Mdq"I1I6D5i6+P'A@pIP)mBhLMZj@L-1KG0iYr[+C
CYmA-BJPf2HTlL`S$$CeIJSbC#HUQq'bp+rR+dYB-mp8jZjpD2A+ULafUi9JeVVJ
HA)SEeDrK96bpN3,6*DSpb5&GAY05QBM@I-MrJ98TZF6'Me(69,,M'(8SAYTBfQe
c03-jAfG2rJlQq'(4A9*!4U*ff@FVX8L(bmR8V'd6R4hFk,[+-0jQl@i-JBr-Dd9
#CVCj83L2l33Ejbi1Z&UZYE2,K-pj9A+'D`f8Acd'AchN36k)Z"4(,FMm&N@A*4D
e9dJ+fpef1e"aLG9i1FApp9$blPSKrK)[rL+SB("@G(3IPGm$"j,c*Ue&GdR@3bQ
NE34cCBZjmN1+4+cFrXNRah@Uj,-F`S$iP9,E0E`YNH4[Hle[bDF"dcl+-m51H(h
Za8qipPM%-59NmT(ADK-LrHmeKZP3RS5+)QNb$lejjHYX!fFjrh)#VY+KApJUB!H
j[!ARMkX9LQRpV%5(FFrKUk,M+eaT0kA-U(CllMcVQP$KlYl-%+(JqJXAcB4512r
i*&ZV#EAa3+EA%0aqQX[fVRTi3'VP5U*SS"AkBAb2-1PRJXkFfk,R@0NI549(NeT
pdB-Ek`CGa'`SkLJGiTYLG+LfZ-@8dY@k4I3i+(k"a$(q"3,(Ed$arU,+dK8AB1*
5I)YQ[0G8-VEJ5YaqIPe-cS9mX&Yr"4'j#-CC+$(JlK1Z,I%+Cq`-HXIr,!h'NUJ
4r2*dj[@VJTAep#%pm%qe-f&K3e[)C0#5(jF,Q"i"UeL*G6L%kZd4X9`9qcmE5@F
N,`EQfcXThXIAea"Z@)%@JT'50qA&2fm`EBYpD8[rm0MDPYLh+"cRQKD@SkM[qEL
QViQmX`ah&bV'dGl#CB*Q+)k'mTa``65c&jXI$$pTFC!!18Crq0(S$ik+U%m%D[#
"'JY1Dbmf"V2%NDHF43RSkfPqma,*'8ceR2(*6q!*4a`"8c%h[Yk)KIc,E(p[hlP
HVPqU8"Z-!81(fk(XM'LpY!HmX6E1YD3c8(`Zp5@&l('e8AHF-ieANapT0ph#UUA
Y&FL&@'RarINpi`cMQ`jq"%2TRPfT$SebaR8%@'KERE,6@I,2h%p9qqU+3FCriRD
+ZM0l#mG6R6TLJ%mc$l,Q%0lHCq,215RJ*825'J[APBj+kP8)*#k4j[l+1GR,%TN
3M-,'FNJd6L-qRKQ3!&hj'Kb,JmA3YRJ03+L6fcY8!1MXA920T4BhV3CCA#4)29e
iPlTaR3Ec&9m!(pGl0C+9h!mRri,QS6&[EIP5`3fJ66r[4hI231m`TpMbLN+)S(M
-"8D%c28-MSaKXE65,BdK$"$@Ec"))+Sl#HL$QhIMKTIp#2!I%VL%m,mJkL@HZH9
ZJR!eXZ'd9ASV!#k4r2@jL9E(N8TT4JZK4XJ1UUrGhF!Eje8&THpb*jRDLN5XDB,
rF&i+$Lb9(#352Z*`HGhle1lH4V+S&amFiacFTe8I@qUBVI$-9$J&+TdPLpSkNFc
q(mrUJb+VlDHDHU*Cd3r`lqYJP#[jTc@G06$IcbG*'@*$&-$H))fD[-QZ#djil$m
ZaTjiSIPQaN(cYfY4Q%"h1E4*)S$UGGj%5*qfXC0&3JYFFQQFZ*!!h"+%JNVN''!
9emYc*56RL`m`T1GmIUfd8I%dNr(9qMT+6K*Z@m0Aj"1(Mb"E85L[Br+%1LB!lmh
0VZM+3p2QH*J'dM)KXY6mek[HL4"k0NaVm92&Lm'6GYhBF#XJVQ+1`j8A!2jB!(!
2[X-6P*p2fmS!')41[5*E#1*i&D#p!C+rf-PN)4QHA)kD9Be+PQ-a&[6GlGDK!4r
EqUQ&5N4X3+rZ#&Q93i9ShpbKF'B5bVh-#FJmRj-PjU[P&pLS"(`NkDd,fZq9p&P
KQ6(@)fdfe!GflTjQ[Sdp&-rbl[IH23LkBE[NRm!-(aI6kl`q+jT`Zj`NX!pKCB9
eVrIf4RD3!#'2JC3"0[ZrV!4U$QfmNmUd!+YF$TF[Df$aqd&aN!#,4KI"BXC@MTI
q'U'2K@V+qLRTCcE-VeY@eJ!NHUMkEpV0BNhA8*Apa*TA$RVe5mZGDQIf*3(m)BC
rcZ60EjSd4*-Ni(`TI2HFQ*(rHqjIEa#Fi`UG'PkkQ%3Li@h4pmE*DdE(HkJV&X9
G)eY8Up6(8G%X3Ga@FqA8!$XDPcr!$9H"I5P664B8KZSR9$C0ST&-4N22`maBRaI
DL-qGJ[-5FeV*)!Fk2C+,F2fqMQbfm0TFNNf4GqI89KKM`f*I!!Sbj4$$d,h8Qm&
M[dbUFIcT"X5R%S*bP`"c66D)GpF(&`KhP(")e1f(F$i)T01&&$Ai5i+!0PA0hEb
,cCC%ST(B',mqmM1PJVYdVM,Gh0D+fRYjI(6QDqZ1rhpRf5fmTlY(irjUQ,lbQHC
!2XH1mCMHrlj4EmXMSZRP0T8`pbJB`lDV&)3BVC`f`dE`FXUd)Fqi2#5Hda2QI&F
5fY0qAl)m3!bBcH$J,`'c6aITJIj*6Y&!ND8IlrKRX3NN#U1D5CTG![ej2RGNBZi
1`(h28!ZaR+MqL-DYE8ZN9'jl#-2Gr)GVG,44CRG8j91$5U6J2&Hk25cZE'a2Y'(
aSakFLRjF%%i5MZ`MVQ(&e,f3!0Vc3qN@5+hMQIQUA6Pm!F4f*&'bU'DMmEEAZQq
iNjk[A*C!KmhS"r0MP!Yjb)e#JK2CrlBkA4VlB42&9Bk-T,5&V5FNJDb@05cV'b)
6HD"jB$*De!kYbPLlEJrB-*E#"k*iNRpU"BqS*fQ0hXbX$0[)Ab"NC0kBB`94)2k
CQZXBLR&Ze0dJ5Rj"[TVS2fqej,b'SA2IcRGpEl'Xd4&Ll&ibi)'$qqXFIP'EQGN
GV8!X$fi8YmS#1MZp0,"RNU3P0!(60[dX%L@5bDaI'Jmbi9X%!j(+c-KAAH`E5U(
,qL'0Naj0JaNIdpEfBbLY"GCdMTJ(R*0'4fE9D"$L$LrICb#(KVdhJ-N$be[EL#J
)0cPr80)a2k0r5PMfF0ahY5&1[0J8GqK9`K@C06YG8l@cM,#$)K-0'mqifT'2fPd
(ekhTf8riZ2Y%V6Lilah&i-2c&$cGB+I,Ipq`HTZk1hfLrjdbUdVaa"3[`j0hiV'
fhfD9Dd4e[#%V@fe,%9aGKZp9R9KTAlSSc1G5#!GRK"rQ#408d",5N!"i"G5L$mm
r2QK`cAaeD-1ZN8d1liPcqe-U'"`NiVM(YE22KLKMK$9mY+K-U3GMI(UlQCqUF%N
-!!"%h'+Kd*0H1F5l00@kamRJ#H'#%q*PZ8m5QG@I'88aL,YBh88`c[p1Jc@9bMl
2936Ja1+cp!*"e0K)JpKQh8cLK[3[Z-%J*HM1mp(46IddhY'kL@2c+f[PCZ6&28f
l*k9J"q@8qap!8Zci'&RIIbB#SN--"V!Vi3MNY$),%,X(cV`(r"2)V'JDA"[iJ0-
M26P`Tc&h$rblKZ1Z!3AXGmi"Sr49(,"#rUpF2f)I#rkHRG$c4IKm%!l4lX`C'1r
(G)0*8,!IhY`NYq)MQ64EH9N#-TrIqEBf(@RFDF-Z*39JBB4qk*P6(EZ86Gm92[X
XCq00HN4mYTU6[*qH6TQCD&K(@*BZGc2B$a1-2d&9ZTLQmr9I[iN[MKUN3mEcr8&
QkRSRc1r!"$E9GHjTL%aCj,!0AYNZ2BfN@U3$j""&cY(R[Y"%cRak!$QjY&',5cm
9c"-b5imHVJ3BC#2")hmajCq[5-dGQ6dk$0ZAipZJFDIGfh,%45M2E)i*8YV`l,j
%hT85e3Q'H'V8qBV&b8&HN8G6q0RmRU56D'G#-r!'ffKAR$0bE*F8QHDH81b,NRa
N)AFMd)`K!A*I)kl%i`QZ3@QMSPU&p4VfU)#I!Aj%2SQJYKi*R1&#dS*rII6Tp@1
bD-C9hXIkK3amF$J0B[)0jRTjm-$(C[4@B![ae)NAP4TmbdMbqc$F5#$RbNV"i+)
H58FS,I2CTYG#fMUe&"X*[UkM!S3eUG2BbD4-iperD2`qT5j81TdA%ceY),G3YpX
MDGQZLZ$9$)U-QD,UX@q0*Q38bKQ8E&KEB-h"*N-e,SY9%jk$"EN$,j[FlMcNP6j
@bfGCm*3lDQRI,d(P0-4iSMUGk$,PV3bXIG3D9ILU@`4JS"SaTZPlikj)BpEJl2G
KM'l&jTq-Mq%"#dGhlpkY&*q'@Q`3lQ6qH"j3`bqN%R*mC%UVY4[HfQB"LEGLlGK
2HM@&lV,[*$FFNY0hcD0*A%A+MQQSLj[M%5*6dQ,S[$E%-0[!J5E2l*A$DbXC0mp
-[[9kU(#i-6#ec5Z#!a0%Z5eASb%j+JLCFh"Z(,QeTKfLq(S!bKGh%h!02lHj2I'
QSaSaSB'f#*!!"UYYI#iEb)ReMXGp)hQ9#p%C#-"bqilR'@*1rA"#qGrZ(Q2Fl"E
1+cDCX1k$6'IGpU#5,&`0S2T-!*jT1Ki9aklE1BYeU8iKKNFmG*c,6adJXphmm5!
HMSZ[(+JCNFXKjbiEI@LpRHHZ5fi+[rZZZe@AGQ5-jLINb&DD&N6`U[ADEAqC[4`
`$'fX)jeNjT`aN`rVSPbdA#L))Jl[lR+#)q,EJZ5Pa9Xr6LpG+(6V()qV*@6E%6P
Zb2CG!("C(+UqURa*AlBPJ!P"$0bDA)p'$UYVdZ%,`P$GX0PD4MbP#[VXVC@eR8*
*2@BYaTA3"V9dYfPDFmSP#TZ62PI*ha6K3Q,9blEPR4`BQ3hidLE3)@Mpc@h4-mR
k)l%56hQ4plJceDDMA4#'5NK[ZZ@fYmGNh[p3@"l89J5BV1+Fq2*%`"*efCA"f9Z
8J1,pDV&#Y4h(fr-8Km0KYM![p",Z#Fq-2)L3!,U(J!&Z$a'!mq)`(ce6H%[p,q8
rdNT),%Yk4[8pTQm)V$lZlPKRG##e!Mfrk#4FC#J1Be0jUJA+6%pR!(jIC,@+9k*
S1JFfE2JhU!,dHlX(FHF0$`6cH04BlHTA&m%GLZi32Rid42dGT+6K-N(%GMADcHh
$Y+UE8T3UaTQcYXk*c0441m1#dUa8rFb'RGH!jLDT2$-k&CKFeFfY-"%Sa5D18@[
fAT2%DB45Lq(U4C1LMVEBb4Y"4Ff4BGRZAX3#mZV9LfYcVkl*59kNE'U,AQL&cRS
'C6U'YIapBj,(hG-#9%SSNQI)V!RdpPXd6NZP*r*dZ"'c1Nqej"X61!"!A&C[`JV
$%b3R#B1$J6ZBYMS'PE9LA[GS#CDG!M-0%h2l@VSGId[T"$Acam3jp!6F2*V`'0$
DDkQ)3N*,@DSJr*2,#ikI*-$EfLJ1"P9!(!+,bAmCLmP)iF4ppAk*llUPQ3aL%c5
0T5"6rZ8j(D90[`+#iZq*RDk`"P"T5S(4lk&mS@D3!1a5l"(QTFJB-#*L(*aISmR
mF&Q#KcfUK6qU2miqF4Kj6B,8S,dF-e#!E0"SGi,q9rlpaAJ4Lm`Y'dNU'q*J6LG
KlQ"U$8LVf)N[[VI-"QNJXQh*1j)jRk*rrd`dc,HCjiSPl)C3,aIGR4"&X$h5!SR
-QjHZDP"b499T+V,@rINr1KaFC)Z,j#MmDZlbCAY33-SKm-'CICN),A4)LP+4H4L
!,PL00JB"&(6%)Ee$+-`1Urldi`2!UH0FbX5)8Gc#)XY"Hqa9La1MKfVp"X%(3hp
i-d&`T6iCMZX5Re@Sf-JSlI9'dJ(hJ2b1-DCJc*Q&(dcDmPGrH(*"pmQ*M3heT')
C!Z2(6(3Qdd49913eJ&,alYm%Bch,Ym%lM'p9HilpmE",*Z'1h2GLlMU"T0T93D9
`b4qHH-E#+@E&2dp%&L(ZI`mNaE&ZG5N&J5YlZ[M3k&,k[bGeKh))lMXDb[%EMec
feeK!"i*B!&(1%'A8H8[&Ma`8LK6GTAp0&3*,*Pqm5LBQ-P0S8k*iH`6+r4qicdI
29'0l8Mac'*2dmfYFkmEL![jNRE@XJGLR(fT*+09Sr,LlXI`[MZR0qi19lkZe4-i
P021h&aXbiDLHJ5idERY!FEb!RIEp6@%TU0GSV1Q$,Lb*FE'd[`Jl8!IRcX-Aia6
Iq90Y+fZ"KUaITLaDN!!Q5XP!jcl%b[00'ePJUcK0ml2aVH2Z*Np@bb4kZaP4DB+
)U$clNl$Q-Q9!K-H!9Ea)3hPNEmL)p`rIfpUF4fT#SVah&CG9MFPcrG[Nm@2ZLhj
KSd$!-f+Q(,#(,bb!60[P+*ZrKDi)rq2$!I$qLLJla-c)-CAJ3H(i*Qm)qER!J46
LR5FfS+%BaCQj,f+KZCRKP,db[k!@$iA*Zdph+pp!ZSm!ph0qJVeb31%5VpV3$5f
imp@VCrXb9Uj@S3'T5BjmXcDhAi&&i''ekY2#``DYYVX@pTMhY"&bjI)M*LJK*Da
BQr#j3'eZcGA9K&r503`[LqVDe-P$UDXIDPAmF!Jlrl''LNfG"1I!&`#("@+V)NP
l&K`l5B$8lGXrec0"KjbQ$!56J0!([F9)GfSJ,)l1-3qP$AhJ(kflNJRALVZELQZ
)#*G6iSNRcK@QmA@UF*LkRdUG-kPTlX5lMMEb'rlDXRbILB&G8IMlN!#DbCA$fJr
JqXS!$!S#r)N)PGVCXF8E(-p`$FA50pb2d!RT@fFr+Yrj5f`06&TbB%Ebk)(krh$
P)kBDJNiqrhYF4M18A+KN3#85f%SlDplX,Rp#36Z5$M%,S$!#QUe3)k$T+p'[A,@
#p#(cZdBce[#UZe289S-[&J*L22CfbX!#TU(BN86ki!Lj4"+b)NAA$I@JC1AP0)h
B"L3E%VD'TN#J*J[0jFNPbFMAR@1@%lMm*r$qZ!Rk6Bq#J,HP'e+cf8mRhPrKhIi
q,c`'qH9AR9Z'EVH15('(JKf%M34LH5p!I%mQX*LD#L04S'`+P60L+b3e$0XiEVY
X*AjQ-Tj,G(CVUV8+irj8[N-$Aa&#UMdX66CAG33SSMSRr)VB0VI,@N,C2YZ$ac6
CleBp@UI$L)Y3@C0RdePFf"$#i!frpK!h5%CQ$jQEPEQM,cF4)pkCeBa"&%,SR3%
6[I(6fMZUpKS,DajGI32VU-"$Npmr@J-bHmiE6c)b*,XmY!94r)X$i[#m-+$JA`D
Ar(&(SQSQqqI!3CL6i0B(fS8jB2+,1YjAqD)8XrhYf1%FCrBj9Q4-Jp'023[(N!$
84UIIDk&3p%qJ*Aa5U,D5mL0iP2QNUm*%pX`X1f8Ri`$"*r!h'8004@5i3E*AY$D
JTcI!$VGm9ldI(68j08RUqi3+Db8Gf6(fF*!!jD1(a`c-F#HVQH5f2jTR41Xh@b%
19fCBk#0,9khCDhRNHZdm(-mHCfd64Y6ET+9,R@r,&a6b3D!9&P'%pj95D3F-i*S
,aaK`N!$Qa0(JXEp,"Tb3!*FldmMH'I"4bK-A2j,9cmMXT('FbX3DR4dTQM-6IIr
hViA1#6Df"D[)ZLmA%1D+d*+HLX*FRhG-2i*$G6hLViHLcG08-bN@XBFQZ$UB,XZ
*MML$PA1r,q!b%c$dRY3f3XrjpZ6'ICrr!%JJhN1N-[hAj+"Ya8D)#rr#*+HLf-N
6Q%6Y3YSkMIacEqRjmdHrhjII)i%`PhRiK5+VC%Ed4rD@Z&6FZkbkZ5rD#Xl5h#)
Z!5hl,bK$hl4jjMcd!!Z4m@j&EpG04e5A[MM6#M%2PD#`"R8aj4`%L5XG[T(fpG4
8*1,T!`eK&cDT6DhK9KX5D'@2lEFJS[GG3CPbr9T'Xq6h@$phT9DZdE9dLJdFhMF
Q)a(M'+Mp*NN%K8aRRG[("[fcU#erZZK31A[rT!I*Y9KBV5C!*q3cFH-kmIAFCbT
f5JC1FMmep2k%,bP+-Sjf%9Z5%!HUE5"I[XSQAL5r-aFEjrJkV[Iq"-2$Fe(!21!
Pd,cccP&-YHKBERU8D&%KHLT5U8@*Mk#(MT!!IJXjLb-qq`(@Z6V+4+jclXj+8MJ
@",-+e)(bRY05M@aHI*-3*#F#-'H4fBhj$k*[aGAfB9ikQNp%bLP40'Ai+)NY*p-
EEZ6Vj$Q@BGD,Yp'j8LIVAqPX5G0rQZ6c[r'GbFNmRr&D)pESISJlBf)RP&KH-mX
-FVP%[!FeYR!G6IVbEH)+-qV&d"VcT2U'"SFhU3'Q@CYj,-&lpdpQE-DU0q[f@p*
M'i'c6h6G@TEr3ZG``H@UPC&k!`MapC-$5*Z,baKD"RX&rM0j2)Xa!8X)0QX*lb,
ikMIJ&+ES9CSVam`+%!ERX'3@f,!c+`-JY@l4fp[rI8k4523XEMA1p6H24)DlrE6
b$+hBTAlR4##kFAi,PkE6bl$"*Sf)kH0P3XL+Xb$U4DK2RmT'VHi[QGa'-SY4Ye$
')EVjeNU-(6NGrc`Jk+`'$kESdkrCR9Cb0q&AYfa)K6dL9B,(,re)d%@`FHKeB+9
-*DaJJf#T#[Af$ZZ`2IX0UF!-YVc-BUmNYEj6Pb-[e`dr!Im&i,I)1eD4qiATU@2
`ICLrpKPl@P!f3p$q#a5)f*alCYLD)[BZeerH#LXL&M'@'jT'62-,A,U$aJ$0+E#
&jC92rr"@0b8#5S5$-GQ%qV-`SVZ'`H+)hVR1@)%ma8EHHeTIi9!PA2jSP""JHF!
cL9DAdR'8&'fkX4cC2SB,Y3HkABLaaICVdG4)R6Sd53#Y+(5!R('hZ0-*K492)kh
*SUYlRlBD"'-bE%GR5IE%81Bc8'NY!%j5r4`kU$5*S1VHheR8H%h4Ib&P6BFrbDl
lT`pR0Ucr%UFTqjE'd@Jic'c5XrJ1$NXK40ZlY@9f#FVYr!pCN!!p3`VMpk&U40'
Kc#f#,M+X[G6$H9[fZ+4F'ZJf-5@J,NM69Q[r2fQiJ+2rMj)$8@VV*+l#Z%D%fq[
bKAk#CU4A38jTUc(iam"LG)lI3eYf(0BQJPIFE$PQM@mRU#T,6icdi8%)Y[#+!1L
hka`2[kG&frX'-pkhep#fl+6m%H4`2@Q+c"#1hHq1A1RXQSa2Kh@S%L%[&F,UeML
bqEqS'$Elq2BQVKA-`UJb9MQ&q`YX"46V8ej+T8RaE)QRJ+V5UMTKdY$&f"(0Prm
CQdpU3ESl&DGVih3`,SD5[`5ZB2CBkj+b-`bpK2PAUpkKiBJ#Rcj)eKl*VrdLR$P
mC6+(CCXM"Vd0B(a+B"P!9D(K+1Q3!0SkR02443abmlPb#"&KQBTF1fGa4[b2P"d
[qGCHYYqe%'0fd2I&LC8+!ceqVb9G[d(*!!FSpDH$2T5['[)kF,MM9J#T)ReY1[Z
'J5r0bX,+F2&'HGa3hbV`NE&lpRpFlJEHI-ST%M"@+Zp@,dHqVjNBd&@$NmTILH(
A`SrFBb*lP"98Q@R#Q1kbR`*C'K9,Fqj%GHk1cN!GHU"-)-%(GmcdIEFZrlV,EbV
#[k'5("Zp%I2brF1k5-)ld'4L0[$BqP$bN!$!0%BXc#(E*Q,"dJ@eP`BJ%C5Fiam
hcG((@D@NJNkGhiHmhDcTPCf`EHK3+p@aPJ#PN!3"!!!q!!#f'm*aYddBP3!!Emd
!!++b!!!EZ!!1bam!N!j0Eh*P4QPXCA-ZFR0bB`!"4[Y58e*$4'peC`!!rj!%!*!
+J!#3#3(&!!!"K3#3"!m!3X(9"a1Qk3SH50!Dl6Fh-eaGHm)[iNNEG@(9iqKK&L)
q%TMLMN(@5l"3DMXX%)p4Z@&lP5T0"%GPHIPGapVfjA@1hQ*pckl-*jI0kbj9jCl
Q026FX!5lN!#&[p#"TTNKLG#%U8dYfCb(3%d4IfA%QkcL@`JeL3R@rI0*RH)BhS(
9LZDhT`9#G@21Q!)Gad[h0`PT9FSPFJ,DdTF8FR*3NFD)3M(Vrr#)M5mF,T%X%15
Gl2C1Y3Ar`$PcVIpfS#$hCae$JrC&(r"91fhPJLp'!l@a-NU(*`"lerLfE4Ri-q!
q4BS`'"0,'pRK'UjBid0BLRe'p[D)6I,8iMJY,+elXfk')2+KEYM*&'C)SNVA$V"
Bq8UPHCXNamN0HV@Ql40Id3H##rYZ*TaE&48mc,+X(U,lCjLVj+E19H98J)-lVhc
,pd[NFSYA9HEraS"f2AfB"T)V8[-i)k1QkP'+i*ZiKe#1e9mmiFXN[)Sm5)mA[BM
cm%id&9I(@bY$B[DbL9(6mD2G835`TC!%!3!!4`!3Y@5-lVG0&rN!!+#p!!#N@`!
!'lJ!&q$Z!*!$N!!!N!0f!*!%$`"0Eh*P4QPXCA0$BA*LEfj3FQ9QDAJZD!!"p2K
849K83eG*43!!rj!%!*!+J!#3#3'D!*!$ZJ#3"!m!3X(9&4RFHhj"k`rXApbELa5
Uj`ETN!#P)N0,rB8@"4#6TMX2Y%0eG"pjZ2PL-SPA4pk0Vpr+a*CaGf[13`lk,!Y
cFe%QDI'&hN$*[ZVK#+XN-2IJ9eJlPhBDY%chclr+[3`cVEXYNH0+CATbmbf&S5K
bTZI%4C!!5iSFNYraI1qQSTUlM"4S!EPQ`8f+KU1m+E"6XeNifG$"Qm(*YePq+Qr
`F"1c%Z-IYZ9-V!LUIAl0r#8eDaS1kpQh`X"#`G5CE+iejM'$M&1[4Fe"pDkA4Ck
d`LCYLFJ,KI2aLT8j2Q`4NrT""AIb')I,Q2$lLaHK3[@,Pb2EGBH"2A@[QB98)qF
MD4&LKl3Arpk9d6FS*`P*cHemm(I,p8pb*U5#FlC8-L%LlLpB--q#iphl1!-*6K4
JTC!%!3!!-!"!!*!+SV)!N!BEZ!!!826rN!3!N!UPN!3"!!""!%#f)!%SYr3aP3!
!'lJ!!+m@!*!$d`!4S9i!!+6`!!!56`!!#LB!"e*eER4TE@8J6'PLFQ&bD@9c!!!
Se`#i!%`"Q`(a!F$rN!3$$[rirr$,4!!!J!#3"k@3"!%!!%B!!,IcZDUhmlQU!!#
NL`!!TNi!!+5,!"E4a`#3$Ne[FQ9'D@aPFd0A,N0KFQ*[ELj%6%`!!@%"FfKXBMq
3")!!rj!%!*!+J!#3#3+(!*!$jJ#3"!m!3X(8b,rPMk)+eYDi`0Nd#`)8*hdX['L
VacCI+6RPpf0a0CIDR`H!(LCaNbEiFBqd5*(SK[,HM4lFN!#8`92cLrb0k0+S()T
+"6@pc"T-J5ApYKPhU2!MaFUZ,%XAS1fJlmhcK'eMiV#(3JT-3%%NZTN[ACNY!JZ
AhDAM0bF"VXMZVFR*PNP#mMbi(L$qaaSZ6UFA6kkG[U5!fCRCAj0"6ZXL#a4i1$!
1pH0T(eJEB29"iP(AhZV6!fl,ljA4HPLNKJ!1)0dLB9&Bj+%iX+XH2IM241Q8,kT
'8BLHGKKk@KV%`p+jKPr`TC!%!3!!4J!!Yr1jUVIcZDS!!+6`!!#RV!!!T)X!&SI
*!*!16@pbC8CTE'9c3eFZ3dC00MKV,N4-6!!"B3&cD'aL2j!%J!$rN!3!N!U!!*!
*!SF!N!2Q!*!%$`"#`G6)[q@2SJV@eVM!f63,!K3RI5bmD+[(0PmT1HAhBh%ePpU
I"i!H*R'6*[KaMl4&Q%`ZKaF$"`!0(1DTB,GVp*e'(lf[qX5Hjbdl!8fa'jk"%2L
jN!#[,LZ1"%!XX,$6f4Ibhk""Er9[@![rXYd)HN2rNT("L0l$"`T$ZR1FL)@2TGr
qDelJi#)QCr4Q"8#r-5*N%@,6IJm9*H-B*EcYS"#`2-SrK*%"rk0DHK6m3')Y590
JVmmqhE13!+peP9UP5qC#NiDJh+%QC$(YNPD`qQdfadNhJ9+XkDc+l0)m`kq8FAI
kkEU!TC!%!3!!3`!!Yr1jUVIcZDS!!+C1!!#T!`!!T)X!%eF&!*!16@pbC8CTE'9
c3eFZ8&"$,N4-6!!"e9jcD'aL2j!%J!$rN!3!N!U!!*!*!S!!N!2L!*!%$`"#`G6
)[q@1e%@@eVM!RXa6!K3RI3,6D,0[HemT1HAhBh%ePpUI"i!H*R'6*[KaMl4&`E'
eG%K4!1qPSPSb,YLB`4,jiMGFjd2q5f"qiDBhLGqIK6(DXKm0hHSJG1F#Ba,0*1Z
KcpRp4(L#m6,q!L*eb@5f1TQLekZdchF)-*9NF6A50V"k#Dd,"RiF`2VCdZKFCq5
5&#he@QdHh+X'8KZef0LNr'9Rj`TAbj3Y5,C6MKa5BjrKahVl!"VVKKSdFUG*ijb
8%p"L)`'2q02")r2`AEccc3QRQ(U(4@a@c'N6ElA!TC!%!3!!3!!!Yr3aJlId-B-
!!+HX!!#UH3!!T)X!%!2k!*!1690-)%-Z3dC00MK,,N4-6!!"(GecD'aLBfCYCi!
!rj!%!*!+J!#3#3+Y!!!""!#3"!m!3X(8b,rPNqi@@`IM$)Z!&$I3AkD#r3abNYV
ViS[i&f#qRf$$CkBkUkEE9@md!d"1lcae(&MRI[+3!'9%j,'UFBl,4kLEL,V`qI"
(#mq6DI11#&%iT%mMle4ML"Jm![eL%N4mEY"K01*jqZHj$6SLdKZEb'aXMhLSIci
Sca*GT)$0TIVKB(E($Spf@AUkMRMK#5M'cE,em"JZ%![D%85J%XIB+Mb(1+`UA)L
0G490$LK(Lc&DKVqJ9A#F#+e*i8cPY5Q[4rZ8DIFH6F0MQBP4@D31IS!i(a4*@(r
B6RA3p9FkN9-&5hq)&[V0ljmkRmf,#(4+XN9j!hip%TR(1#GCd`&1`A&!TC!%!3!
!4J!!Yr3aJlId-B-!!+N$!!#Vp`!!T)X!&RD+!*!1690-)%eA8R9ZG'PYC8aTBN0
'66Bi5`!",EpcD'aLBfCYCi!!rj!%!*!+J!#3#3+j!!!""J#3"!m!3X(8b,rPP)K
U5`ILhbhBSfqAPIVQ*-$c$`V(JS[i&f#qST%@q[R,PG0YUVHB'3+GhRD,Y'RG%H6
G5hPX@)Ld-hT$"4(V4PQC"hR$A+N,lr2VHFP5M$-JND2ajL#B"f0D)&HNZeiGBHm
l5lC5ePF5T,iT#hH&SJM&**fTH*lr!'@D"Ndj`AU%!%SJd*IQLT6,jYL5a!2mSf&
TKkK1X,)KTVarVe@&ab)SV'Bj4B[$T%2BBaF@L3m9#+Z#2'9"SQJbFh(+1#HTK8I
qL4X''GjdqUJ+8%*T4L'CFG@j4#6bD,BUPpr1RjH**`'VLGDa92e21dVjX0'bKAI
BNc*rm)%h'&BKXHBB!+@3"!%!!%)!!,Id-B1hp$'$!!#UH3!!VA!!!+5,!"+MSJ#
3$NeAAde66#j$BA*LEfiZ8fKXBJ!"6DCcD'aLBfCYCi!!rj!%!*!+J!#3#3+a!!!
""3#3"!m!3X(8b,rPP#'(U`I*K0TF)jXR@66qk!QehA3S(8(UlB)ad5%d@%i`JH@
@"RNNJb-[Qq*rcK&lNMNePALC9%ee#HShlXCB(A%UBS2#)G2Xei89H!$PjUfp!a"
A5Bj*pVJTKFmRX0CiIrjT"KRY*!BfRV1Y0Q+F2Pr,DA"@XIL,+q1red+q[$09,l(
lC60&jC(#(rAkP0efEq-69531pMVrFIKCf5PbIZ6B6Y0-6mH!A#Z"0FPGcd`BpH&
D*ScJk#XHhLE3MNUa!VUc519k1d%&[`-aES*3mTJ*$2X*+(cjGfpHmTZ3!$qY06q
bBRmGc`HBaR'ZXme2VV1YQ2!`m`&rm5+e3E&P!+@3"!%!!$m!!,Id-B1hp$'$!!#
Vp`!!VZB!!+5,!!mb4!#3$NeAAde66#j38%-Z8fKXBJ!"UGGcD'aLBfCYCi!!rj!
%!*!+J!#3#3+U!!!""3#3"!m!3X(8b,rPNlUP#`IR"D!ZNfqAPCD'ji2'(9KpF"H
Pl)CKEC9))8c2)J&,#[@LErp&J,#$0j,b5"F,Rd4bD"K#SR@BEPjDhPBKSkV[Z8N
qG-TjX0CphH`9M,!3T)`6f1dd$hAK`0GQ(p1!9*6%Pfc,lZD(-!A38iZi6Ma'N5"
@EM%C-Tq#bbULa"IN-&4B9hP,5G!CpEXH#hL&6RiA)PXNV+&,KUP'hjKDVeL'4'#
$+!K!Nl5c)'rdCdEJqB(Gq04GT,"'+kf203X2HD8Jjh2!*''%Z2mfSQSe*Y)0$a'
V-A,-J('K8q4,j"0bRZ)HAXC6!4Gkp8#3!,-qTS[blm-)f8'6R+Z)!+@3"!%!!$!
!3!#3#Ue`!*!'T)X!!-%Arj!%!*!+TC!%!3!!N3!BZ03-CVM8$4i!!+5,!!#f%3#
3!p-!#`'&!!!9Z`!!"Fd!N!32!&0*6e9B,R"KG'0S!&)!!'CdF$S[,h0dC@CQC@i
k3'KPFQ%ZD@0c,Qea,Q9NG5jKG5m[C'PcDh-[D'9bB5pSEfeP,feKG'J[F'F[Fh4
PCQCPELpeFh)[8dP299JZF'&dBfJ!!6#S9%9B9%0A588"!2q3"!#3#S!!N!N"QJ#
3!fX!N!32!%,"e)TdU",mmp#!K'e86kj)$ZHYmprl9D"FVi!I,I[P28(F"`N)$%#
l[5ecj0SqU,ZJ@jRL!aMjS%VY)i%Qmd@$c4h@H+4BNhAhCphLE+p,rr)A1T,9MGp
4JSe"#1JKmSapX2p%pk%f0pV33X(8MRSl(80DPrV(GZ%1)l)eP0@HifCAXK6,'NC
-`jU"$EEeQ+'hq1LhPbeMF!H&#86pXT9RpiUrc@2(p,"f%V,A1`Z0&J`'Jmi,`V&
"8RKUe"`b3a0d8+qfE*((05SeGC2"1ep0,jhjEGa!YHp81MJGiCUPZkF5$Qrj"[#
LH$RT5H%9i,4,aGpGlUMRLf,BA"+AR&1KX1`Mb0bh84,hX9Q`kP`DGfii"eH[C6d
Fe+AMCNBmbBD055160c8R)2,JM$9MRUd['a6k#$3,$4Fj$4jB95Db&kbd!H0IfUL
!!GSbU(k3!2V,ST,JH`#Yl9pCI'N)3RfQ6*+EVdPXUeZ4XNYrdM(E"l-MRCe-5Vm
a!U,M,CQpK-,,+H3liY9DZ1VqdG!Mfc9f5MArNNC$Y8)@!(bhLaadNJXRLpJc%ml
+aQ2+iF#5M560963JjIY`5dq1h+0-![fZ9d,iCS*2*lA&Y(`dXeU'1aUPSKF6b,L
2T[%+L`DrekIFeIl)ddl-1i8)2R2mL5KSH"Zl'5PQ)r8HUM0P#"cK+Y)CBC`MpT+
#K)U,crG'(r!*iQaQU$Cp(RJE8S)qS8[em[rGp1-2XM#JY`S-5*!!GG3,#"P[a4)
'a@$%Z[RFLcH1*a2k%rRm"ELq#(TX"m!LX9jp@'YF[Mi5)$5crCL1jX5B8H*hYAD
Z%Y-M-f-%l9P&AkPKE'D9N5IjC9jr,fJ-f$,bAab1bCLB[*&D*$T2RG,eeVD(IpN
1Pb5ZDa42pcRF"E5aEq'l1cec'`1+kmNIJS90b*f)M-$mrbmdV2MK9mKYdbX"ELH
hcN!+mr(3#*mUq`KC4"'+Kqhl#)hi&rfhVUNZXhY"EIqPd,dP$SQh[,j@2CkSRkX
YR!(l2PqYH9T-GNfhh`&I5ZM0,02eakK[ACj(E*A9+(-lMpcL0JRLDf-$[056(H8
3'%CVd$U!ch-QeZBC-LS518SQ$`%6Fr3lj$rN+R*qUcR,c5Tk-[h5$q(58qS2"kI
6p%8AImDE6%+liX[YhL3!Bb,X@9!J#&N)@%65KIJQ`rVfAF1TXe&H%2ir*Zc(qTm
rCA'B@-Dcb@IYDY'i[m(EBF,@DfFV[cJPMUKj4R)8Hqhl-FKhDj(I,h'h&42%,PL
-CVE%bBSXDRqV9-F*#J"Jrqa4jb6-[f$i2p$&&rh-*fjjf`hFa%INQ8'kl@hQe,B
IR-FE,lE8Q4`CHrDXj9"PlG8H6k)ajleBa0Q9Ue%bhBkVk(J[@*iGL1Yk*4#mq1A
TbNacq$%IS-5"'h%22iS4Jb10'&qUFeQa'cq6lD[PlbFfE%H(aV22%c%a+SE"iL@
"2k,kMF"T'VJ6efqRH36hGN"HbR(F8-C')[#3!+B#d`9Rr(95N!$i%h1b&!e*$kK
YFI"NNKiPNk!je6L*#c[m%0"Zi3XdbmYbqK#[HfEU4mJm%eU`mN!HZ5"&XHb0m&H
6L3,`Tc&h`m0![%XeSVZ*Y%DPfYHDC@mJTYQ,ba"p"1eq@[h)B&j2IBVNdPrc6Rp
i1`-Q0(I3%&%rcakB@9l&+pKCbfa!4SZhm&R`"-23Y@9l4*!!BSpJU%%V6QmSD4$
lFJ-r8()amF(%JQ%0H($2jha1GaMK*1AP(c,DS#5JkpE-Qb8jRJJ!Q6Qi3)0$#H[
JQhrl'#LCM0RpbGPq4I`HXr!FXE[)daPA6AeZ'BK2f91h639KJ5c1+1m3SE(r+N$
De[$DI9aLi8j%++bY%'U(+dF*9!%Rc)"XJ$Yb3`@NKaebI2e0VHpH+6GMGH`3PEP
d!DRbFI3XGCHc38B@NpZ[be[5FP!M+d2iVcaX&#h9$1mH1&`Q#i,,!S'3!"2P)9Q
G9'VTmY9M+8RCI['rd`c#QErpHmJ`)N8'b,hJr0Dl+&64pklPUe3i2JLiI+jS9KR
r6#)r@6&4!@IhJfZiAT!!dfk'[d[`h3mhid&56b8#MLT4RT8QC(A")hZU-JlNa8[
J!B`5%QHk2+T"A4fJJ2`@-HAal[8a!+@3"!%!!$!!3!#3#Um@!*!(d`!!2dMrN!3
!N!UPN!3"!!!e!%#d(A&SYr3`M3#3!p-!!2Lp!*!$FJ!&k2X!!,DD!!-"h`!!3L-
!"%*eD@aN!!#P%3!k!C`#i!13!!(!!-!!J3-1rrMrm-Y%!!#!!*!(TC!%!3!!1!"
!YJK,ilId-F-!!,C"!!$*d3!!YN%!#!&8!!#fpJ!!+hN!!",E!!-S3f&bBQpZ+3!
!TPm!5!"T!MN#+`(!rj!%!`lrq2r`bd!!!)!!N!HPN!3"!!"$!%#f&lE"YLBC+J!
!YTS!!,Y,!!#fQJ!6M!#3!lGG!!!(6!!!!qi!!bK6GA"`Eh*d)%aTBR*KFQPPFbN
!!2N3!%m!9J*"!J!"`2q3"!-1rrMrm-Y!!!#!!*!(TC!%!3!!03!!YKHf`EBAYX%
!!,Ef!!#i4!!!Y[B!"3E+!*!15@0[EJd!!DiJD@0[ENe"3e0!!,(JXH!!N!U!!*!
*!HB!N!1!!*!%$`"#`G5L`,pNj(cG#Y)Cd!IRq+M!r(hll(3c@PLL`hG1JM48Mq6
Q'G&-*Hc%K&&%8h'&K0UT'Zfc3E*aKEATDa*Y5D&A@c8$F*!!96'kY5GBbhpPh%X
A-p&!GPfq@cePdiQVK09[X$`C[ipDiYkQ4KbjUd`aC8Qim`"CJlm[2'*mT!#PN!3
"!!"'!!#f)"fCYr1m)!!!Yed!!,Qf!!#fpJ!@KZX!N!j0Eh*P4QPXCA0$9bj$BA*
LEfiZ4%a-!!'J)h0SE')rN!5!!2q3"!#3#S!!N!N#Y`#3!rS!N!32!%,"e1T!eK"
XkhFc*h%SLbp#G)QPe2G2m0M&)BRK6d32JKf2T'6IhJZRG()5#`P#$+RS0`0jZV(
m`FQ!U"-fJ(cTMdSbjZjE)i2K58-%iS!862ELFY("5icQm`"A5"e*k*bK(Z-jAmb
f'!BDA!$dI4$fM4"hZb'ZS*!!rEHqVVlH$l!4XY$[fR1@C1ZS6+Y`*(@R34Gkq"P
0iLj&kM69bh!'Nc%+GYmH*4JeXiV9MGE)$RRml[5XX8%riilGB"cI9F9adrkX*r`
(5U+#22%8q9504fCl('D8'L,*%pPkE5I&SkBDV%C`JNXZZGVq)3!LDqZQSJh&ada
+3(!!TC!%!3!!3J!!YL!GQEIcZpi!!,K%!!#l'`!!Y[B!%QAm!*!169GI690-,N0
KFQ*[ELj6D'aL!!&QXR0SE'*MCQeRJ!$rN!3!N!U!!*!*!Um!N!2a!*!%$`"#`G6
U30B2RbBh-bH9pcFb`R88qYT2qjZl$V'LrfGm)(IflXVj8AQV0LfM"M,8HVjqc&%
c0P@2BL)%`Fmb*$X6I)RFeE+Y+3phZTcPp9PUN!!pkX338G,2U2V4A%IU(K9c6D3
lK,*!U0SNP)(&!`r8KJZhk)HGQq5JV)NKM3rf*iA6QV#*Z&C`XCGK(9)%rQKmGiE
rCMRRR![l3dj'[8eeNiIk4B*-D,L[l+f#00NDr9l19AF@hB)M[m9CqB@)qH40pL*
@@TLP[129*a02E(Mb+!F(p-%$rTI0&H%LYM%,FPeILFA4K6!AC+&IP4@84fG)!+@
3"!%!!$!!3!#3#VQf!*!'Y[B!!&MrN!8!N!UPN!3"!!!e!!#f#%[MYJK,i`!!Y[B
!!,ar!!#fQJ!&c'N!N!j*BfpZ$3!"UVeTBfpZ68&$8d!!XH#ai!#3#S!!N!N"jJ#
3!md!N!32!%,"e4SF1)aDQa)RpZ5*#VcA4'eqmGk$a@%P`KE+RK*Y+0KPGjYEZh3
RcqSJ(qZ$I`k$5,$*Ta6HPA,fUICUFmDYMA!%%ShGJUYh%*d&NI*hEkFf'$J,!@K
%`,""AYUd)ATXV*2Kr3VrbmLjYXfca-EqQGp'mF'R&2ZT5Y8R!G0(,ADjSjLHdV,
G'EJ*dS[(L@4*qNi9PD9Ra66R4b"ArrRaBCQlqLmIQmb+#109"Re)AkBH@ZikM%'
Zq(L*5T)FBKa684U5%cNA--G`3`#PN!3"!!",!%#f)"FmYLBC+`!!ZdX!!-QK!!#
fQJ!E[cJ!!,cZ!!!L4`!!$,-!"("cCA9NEd0KFQ*[EP0eF("[FR3J8fpeFQ0PF`!
!Y@i!Y`(f!UN$S!(!rj!%!`lrq2r`bd!!!)!!N!HPN!3"!!!e!!#f)"FmYL!A2!!
![(m!!,h8!!#mI`!&9#-!N!j*BfpZ$3!"S5pTBfpZ68&$8d!!XH#ai!#3#S!!N!N
"jJ#3!hm!N!32!%,"e+,![f6NI0d+dKR3"qJJFB@i'fB$qIiJ1HD-D*5U+I&6mb&
Zk1dBm6QRH3)J09f1'eJ5!$,8kUe4E@Z0'ZRqTMZB9rqc02$ZcNd*D,"1kIiR%Sk
HZ@X9&ZeAYm[JD&1PME&Cl5IaRe$GDP"-RNkEh@43G-eM$A*[4),BbJ#PN!3"!!"
&!"#f"mkqYPTP,`!![1i!!-@5!!#mI`!93A-!!"PF!!!'S!#3"!m!F(0PG@4[3f&
bBQpZ8h9`F'pbG#jM!!(e094&@&4$9dP&!!$rN!3!N!U!!*!*!CS!N!1R!*!%$`"
#`G5FhSaD#LedD)U4T@*PhAF%')*Ei96P"ER(A-BVEYNMMKYKGTEjD'!"AfrZlKX
r&Fll8C!!,EELQp42[eV0T3pPmeIVj#-I*#&1I'4Q&eKSq-fIjX9-HL810$-)(@"
Kd,RHK[2UQ%A,,XHLlMISE!SC@YI)ARM5V%CEa&(iJ#R#FI0K8`$'eM-dM%"kXLK
qMYm$8F)if60-cbKYm+jf&(R)P$dFd!"#`G5'ak"X1EA1D(Z'9d-mUL6b*Rm@ZHH
bFX+(al&2FmTcAE-4k+DcT81(H#@*B)mcmERSHiRCS1(IkIEDfhCl@J45MKc'4La
PjBMf"jfaqPjB`QFLPY8C'#1J8,#m6L1acd-lD2Ebp9dQJXVdQ""%U!NY3K)@$2K
+,S!TQl,'b-&C+Il-rN3mN`(p(pNaP%"@h@50qPeUr-8S+0AklIf)C`prTKXXI"i
PEU5FP,L0kISSe4&!,PMd!L)IH#ZiR$85Ce`2p6NSCK2"-erTpl+J&ScKDYf2p2Z
fpA5@d"I[L@86,-1dI+G&jr6TN@94jYeErh3FHl#MpDEXD"&01Dpb)RZp'ClfG2C
T)iPmje,6$hFD&GqGc%p$bamNj850P+U#dJ*"bffaTiZY9ZhBrJ$J!N,Y([5KJR4
)P3&'cdq$!L%XZp0'Sjk#S&beSE8[2),BQ588q$$,F+$i(Mbk"'DF#MMmX@G20!X
BbhqN`0[kBSRe5JBLiISTN!#5b'K!KF!A4#Lr4d6Cq[68hhCKPCPp3m+Tk@(B#DU
D8@*(1!0q#N8PBkXHARBlImYJA+b!N!"&ZX&TddD%aGPH'pl`(ALZVJ,iVLGQ"N9
m9QI%"+P!JF3#B[B2*(VC[H2`,Z%eb!,-E0-A0ElRFb0S"D@m&)6V#CjbKGm%Rk%
2kK2rNk6a*#,6mNB"cHF$&CjXGm1D!,IVer54mYIZA`ci3+@fp8)mYGBEDq9rdE`
XJkB6P-rB1L$+0LQ**EcLF)EcI9EM88crE[k#dZr$1MJr!-IZ&EVX9IL[QpBNI`j
0MfF$R!BDF-Le&rIGSh'rJ66eSd"P4jJ'CYk5$'EdKrq1R[k+9Qi*R6$lASeNIUa
#C!,T1p!P*qFP52I&b5c552Y3GAJR&ZpZm4B@B6"+DK`lEX+TE`rIfZ(&6-AZXPV
(4[hSC%13!)DrZepjcJZLd'lF)iR'A2P&[`!$-@edm"QL6"VAQNjP5+!HQcDLf(F
Ar3D8K+NR%2Ca1#e#ampZ2D9RdXV**ATYC)G%V&qY%K'm@FG-m@r4fpqf3UmjF&N
a(q"@GfVFpbNFRda%NZ,%CJkhBm6K[*%NTSE&Ei['Yf*QqE44i123TIGkKp&aKIG
pL%p9eBKhjHG'Zla+bR$jU)ZrP5fPQ96q%Fj,DmIC)k"239R5eklfGmr2QkI'hq2
Z*cGl[%JHArF(RX"6If8mq1'bRNqH[P-()KTaX+I"RLeMPBBX@mq1#&#r!0#-U*C
qF38dK-EabNhCjB5TM4!jerH"bJK$GDI(-[AG3QC$l`V*FhCKpf8+DVS(@rmp`2[
&a5-Rdk4c26b4@!9I9H8+"RYAcG5'ZDJq*Y'4)+Mq(AHj*%J@JEYdMGN(IhZ[M9S
FR8*-NTNIpai9#0V!%5C'DYAQSHUpVINMT(Bl*[jP@4bY,T8`4Dl3RRmj@pN-C#i
R96EATqZhapj2-8!DH*3CBSlPZJ4lM(B1BQq3!!Z5pZqq@3H'mI[B"QB"-G3SEj)
qQlZ!%4-)3dM,Lc)09kFe*f31644MJh2qKb0UVHIb0S+q-51'TJZ+k6TBJqCGPjK
QC9XZ9FVYhqX*4V)9H6(PHFq4f1@2XK(AV9bXXB0K-[45M3e$3UD2DhSd"@3&3B0
r[PaMcPCXX`4k4jk@Y0TU*&mVaabCfpD2212I0*)4$q`QRJ9KhI3Uc$&kbL)-Ule
"#$V(DH%[0b%0XB4aH'Eb&p@kpY,FA,LqLdI)j)BV,EDUE`AE(TXC`DPHX!2XVmr
MRkQRbQ,fcZ[@E'VGHVIi1B1Fq"FHm2%PGLVbMbhkUHFQCcZJleMa"aR(Nf,@Mq,
b@YQ)!Xj"!B9SlZ5d*#0Q4"E-VEFqGJc+F"0,Yi,Bj6)Qe8DY'YFFaHNa#&M(3Za
P0X$&!+Ummh3J(p!D@a8a(K3&9j[e)0YbjiR3l'!ihF&9$eDb!XMQk!K*X1-`RiC
0H+rrHerhhk30#VRYX-iB8L*(hpE)[)NJ*2@b@c'Y!Tc[@P5J,9f[4P9Q1D(I@4Y
!$NPe)f-EcZcB61)hZqSc,5LQS4C!3d!IYSm6`(!3S6cJLY$5J"25cG1EC&GH+ZH
A0f(G@QY1eP08$iEqUh'&-2+CMV*b2l0%h1fAYKSF+hA"$(NQ1leq'MIHKlFBTkm
P8'M!&3KII1,@%R[,&PlFPU1cXSr1hCdr+Lja,cH-B`+UMD*F9S8NPRAaT%aLqJb
qr2LjG@31,")AIpp8TY`L-"85D+Pq4F-$#,Z0JM3h2VS'AbpN&5ZXLd05J+@3"!%
!!%F!%,B)!lqf#&Xp!!#pe!!!aj-!!,ar!"G+D!!!!A%!N!2b!*!%$`"`Ff9eC'p
$BA*LEfj6GA"`Eh*d,Q9iF!!"0K9849K83eG*43!!rj!%!*!+J!#3#3'D!*!$PJ#
3"!m!3X(8dC'I&!hmR%YDGk#l$(h0L[pq"r4%hU*"+4FVZc2r++hJqlXd$b[8+Z`
L,[lC8qldUM`QZkk)qifUC%U[GFaE#+$&AMN324PKrSGR9b9If`jFLa[8F9$K1Ve
L$cpE5*!!l"(JllG"`(p#0jC0V9F9&5dC`mqI%$EjY@A`e**9mS(5(Uk!q#SkkpQ
LZ5VN&HGf0f@SJ%,"e-NiZ4Tfr2LD35$-+@X)k5@#9V6HJfHNil44"KB&l6qP9$,
#2c)@!MkrX''"El2r8&i9c9fGE5M2@hlf39Fpp5+9+#-iI'2(bfi@pZaXRUFY-dM
dR2L(Y+CT31YqAZZ8I*ca$LkqB6fdMjd2+*lhfbNDe&'MG6!DH@a2ZcU0$cmFN!#
13,GcU"#hQM`A%$3aJKhZf`e8QC*'2q#lSa'HJR@P4C*R4lE3j&Q#aKbp@[EY%(-
`chFfXhf''UPjP1l'E$68j81&Smmb$E24MaBeik'P$[##QkVHJjI3326QUe2PDq&
J0NC8BFYJNI#aY'X0J+@3"!%!!%N!%,B)6Dbf#'+E!!$&NJ!!bA%!!,ar!"QEEJ#
3!mB!N!10!*!%$`"`Ff9eC'p$BA*LEfj6GA"`Eh*d9'9cG#jM!!(b9&4&@&4$9dP
&!!$rN!3!N!U!!*!*!CS!N!2@!*!%$`"#`G5L[rqGkf,&!4+hZGE(N!"i'[(Shbp
3qJe2)%EiRDJHeLKMZ3V[6hMJ,!,%E(Tj8%fGC9XaMEm0,iq(kX`al52f%YNG11A
94NBc#VNclc8`k'PYP3h6B!SC$rfK-q%,i40%)$YI3*'I!--l*kIVPX"YCm`4a5T
`E!4C2k8mX2pG4[(2VX0YI$RTGhSl,@89UQAQ@3D+dq+YA#3U9@S9KIJ0q+8SYH(
V@%FccbTbZNGT35VCU1+mE[%AN5XYIQ+!+%'L'%Q$[JSJbdbm5c*FfG0(fY'2U%,
"e-C3'4VA6BI&93E3LqJ%P581*FF`VMdFNH(qJ[KJLFBXi+qS)cP$3Cl$(!q!MHb
MCq6MJ9Pq5QG--ZY!UJ!(4-dqDGA5S3$8JUJjSlY*S!li3-pdEJc9MHrIp*8,Mff
6LSjcj((EJrNJe)(-K(D`RMbPi!EHL6&9'N%0$DF&I6J9l98kK[M9%)cf3+@3"!%
!!$!!3!#3#XH6!*!'[(m!!'Djrj!%!*!+TC!%!3!!-!"!!*!+[(m!N!DfQJ!!P(M
rN!3!N!UPN!3"!!"$!%#f&i+MY`Y51J!!YTS!!0,!!!#f33!6eEF!!-Si!!!29`!
!#)J!"LK6GA"`Eh*d)%aTBR*KFQPPFbN!!*L!!,F",J+T!YJ"`2q3"!-1rrMrm-Y
%!!#!!*!(TC!%!3!!03!!YKH#SlBAJU-!!-R4!!$,HJ!!bG%!"3q6!*!15@0[EJd
!!@[+D@0[ENe"3e0!!,(JXH!!N!U!!*!*!HB!N!2E!*!%$`"#`G56kGAZ`HYlHG!
LV4m!frPBR2QHBhj!4Bri+(X,#ZMR4&*VXRkUJ2CF84B$f[$`jeE&C(!CPPM06$C
M"2QiPiL#!4612e-a%Ip2YG$!,!l#+MY0TYD+1A4VLliK,m`9H5dYeAUNfjE1JeU
!1fcIY2iTqMle`m&L,`,Sk#cA2cLpLVKCp!EJ0[*I%SQ)IYLR64S'"eVk[,Qq0J'
kaI5'ZHA22R5Q@r[Zr1GC'1$,'QD$SELMES)Jmf6d*$A5G*PedZ!4QXX'd2M*kUE
6rbfiVMXJ[c)jlhqE"!#PN!3"!!"'!!#f)"f-Yr1lZ3!!bMJ!!-cZ!!$*d3!@%3`
!N!j0Eh*P4QPXCA0$9bj$4Ndf1'XZ4%a-!!'J4A0SE')rN!5!!2q3"!#3#S!!N!N
#Y`#3!r`!N!32!%,"e-LrjC!!Ep!@e`&P'63-Ni!FUKP1l30iNc`*!9&f'M91LM[
Y1kqI#M`LfUhF1!Ujci$(1-eXXkI3N!!EL92cMrX4-lLaL`5#+!1(4E%'JJ,jeHE
91!(Ca%NVj5b2cJJLjiba@&YH8#eQ6`lCedCHQF`k0NSdHe(65-69di25b&Z0M04
QI1NiQGJ-I9e*rV@Jp#-8QXr0)6Kc6l2*Ej9F`,jXH+0Yl&#X3K&1db3G!)bAF34
Gfkh#8m'ReD+0E21Mh3jH$%$Eh-(Yk'r[8Zi`bE%4RKL3!'JE"cZA"BqZA[bJAFp
3aa,l&Df2dGVZ(q5ClL-d$JGKYa8qiQ61!+@3"!%!!%-!!,BJ(BfhmlZd!!$,HJ!
!cPS!!-R4!"099!#3$Ne[FQ9'D@aPFd0A,P"33bj%6%`!!46PFfKXBMq3")!!rj!
%!*!+J!#3#3+`!*!$p`#3"!m!3X(8b,rPMk)+eYF"C0l-9*1!(+R[CFd$H*-m#3&
4GL*bi)Sll6Z[R`Sm)YUYh$J+ZFq!ZHD`Q$M$UVDq55cB*e+Z33R0k,jXeiCG!%i
qZ%+P4J$lJ88+b0)J!%Z%la2F,GEma`2K"LR4ili($rP%r-f1mDR9&fl@R[KEIEp
r@S@-DU,1f!RHdY!lCpZip*5m@"mbRJ*qMf"aqD6B#SHJ$'i2$`4[j@PYX%FEHRT
j4r+6qfYYKY,X&*)-b$p&i$DX9!SFrh%T3i$bi6kX,@!SL"&MDLiT@@9QPIkarih
'SD@mr-Uk@he"a*MR2U40&C1[rZbmUfC4!+@3"!%!!%!!!,BJ(BfhmlZT!!$-lJ!
!cm)!!-R4!"#AA3#3$Ne66#"$,N0'66Bi5bj%6%`!!CE4FfKXBQ0QE@H!!2q3"!#
3#S!!N!N#U`#3!rB!N!32!%,"e-LrjBml+$EA!@5NC*b6J"bTfR%p!hKMYU!Ml![
!CrAFBL'Z9%%eG4[(`RN5[bdrP9AqfeG@1X)kJZLV+hPEKlhTEeG,44k[XBeQXkL
r,%m&Cl08XFB8"R8Y%Tj4#SCeZ&4`"@,RCL3#Mea[a%Pr`AC&(A`fRYd32eDl,*h
BEZELa#)6T!d3!8GSXXmQ%X-0fhMT`b'@(eQT"K0-#q8(6kLR&A6m"NBZ@elEeT-
30#Q@jdN83P`Q5h`X20c*`LGp4Gd@LXdhf$-Cm%L58fLP-"$020BVV4YhZh@KF5&
V&Yq*LPPbP3HmbbCFQk,pih(i0b!di+@3"!%!!%B!!,BJ(BfhmlZZ!!$1@J!!d5m
!!-R4!"Cpr!#3$Ne66#"09e*eER4TE@9-D@*$4Ndf1%X!!3D*FfKXBQ0QE@H!!2q
3"!#3#S!!N!N#Y`#3!r8!N!32!%,"e-LrjC!!Ep!@e`&&6f3-Ni!FUKP1l30iBlD
J)q[V`3q[Z-4$A+L#DZSh,cYb*AjDIbQqaAS1!I#!fUi+Km(2"djbAiZRU*`'I$"
l2SVB2E4pTcfk-I(VZ&N$"M3,d6SQqd0bB[!Vr"9(KSLF-KGl1l'Tjim(8N1ZlfS
CDSD#Dm$`Hqc6-X-,ZK-Cp85*0"-DqSM+qQ0*&#lP0eb&-XcNKTY1XMHAkDdUBSZ
0YeZ&Pb5dHcX`8(r%Em!-d98bdD0B)DpQ)bZQL3Qa@3HAG&Tp[9LXkfYD*h2X*3U
QZ+fYK+b88#5Z18@DU8`*I$6[6JC6HLYm3+@3"!%!!$m!!,BJ(BbhmlZb!!$2`J!
!dT!!!!$*d3!2fNB!N!j09ep08d`Z8&"$,P0SE')!!G+iFfKXBQ0QE@H!!2q3"!#
3#S!!N!N#U!#3!r!!N!32!%,"e-LrjBl84CEA""rSc,56J"bTaAbY!hKMYU!Ml![
!CrAFBL'a8+FeG4ZAREN5[bdrP#YJj,F&NHDi+,Ja-NUIA[-B61X&T6$,i4B00ZZ
a8#'8V&8Iq[mQI%FGXp$6b32"`,Dahh-J"Hf!V%Rm"MKNJ6Q8Llb%G[[HFD6h,CR
2bU,[IL*26(QEjQc%M0"d06#K'r,J*-a9F'jGU&)Y-U2BPL&l6ENbLh'6!F,3jk&
J5i@5ihZPXN@MlZ"A8Frq-+U2cHq#-ph*CkBBFL03hchkNRZjkbhkR+I)EAh#kIf
f3X0j"r#"f3'Q8h(@#m0b!+@3"!%!!$!!3!#3#Y%[!*!'bG%!!+XVrj!%!*!+TC!
%!3!!-`"!Y"eaFlId-+N!!-R4!!$i"`!!YN%!!a6Q!!$6&`!#a`m!!#6`!!*dBf`
!!'RG!)N!c3(P!Rd"`!!I!"m$$[rirr$,4!!!J!#3"k@3"!%!!%B!!,B(cTqh64V
e!!$5`!!!j"`!!0,!!"B!IJ!"#rm!!"#E!*!%$`"`Ff9eC'p$BA*LEfj6GA"`Eh*
d,Xq!!!!5RNe08(*$9dP&!!$rN!3!N!U!!*!(3X(8adCl8UQpJX1%0e%p$,V,iHa
2El(jCkKc2L&2DTY3K2lHELeF"Yrdk+m!j1)+'QkeLm)BKq9qM,SpjjiX+0%SBF'
Y&V2l2IdIVH6C`YJebhVmbI9ec'UeH4D'lV`#jTLN!rKSUI1P61i!+6-Z"3dII*8
N@l1T$+FRb"ckYa%l2X,&cJKD0G15"-pqSB-[(#fITib1-#%raKS"F0LA94Z3!0&
e5UTTB@FSl4Z6'RYlKSMhrrhAa5IH80aSCr[E`X!LXV-R8@hQX5(ZT1h@*6U)6(2
G%F!r4lL$h5!52LNV+'Vibb,c`SR5"E&FT34&ZUa-p5Uqh"*CPZG(%JaeVKC#CNF
e6iBNUZ2#XeMqX@C3-XkUQ,S)L@6j@`l)YV,F*+X&a$HT2!qXq5!2ATC82ZMNqN-
LHN@qK[LiC2dRRB@*eJT#Nem-Yhi(Z2[Y&'eDH-ZAJ6b1rEhe*$*VI-%NaQid)%b
UJSk`q,()4q-#bp-T+fd5-)e!8GDAV%N*ALhTlhac!d$S(Q458LXVdP%9-"VEiq#
VLRSRjCC94VLGJM@@Z1J-4"Lf2pcippU*4&4*%F5iT&e[a5p,KdA(LM$d1ei2Y(d
BC6(&,B655H!Ce#1rq1A'CEAj&L&#h23H!rDi05l(`M@QQ0hKR5&[aS+RNUrFc51
LB&[XeFp6$U%9m$P[)*iDKLMb*%14kF6r`%Ia&&VCEU+qXEe&J$q"8BNHFL`jch$
2CBVQ5hXY-$p[+ASefJrihjlJe`YB1-GibE)kkN"f%JE-C`P!REZZIjA`A(flk+A
l6bY),Q!XJ&NrTF,df2h`fSA6UUAj6Y+SlZ#r)8fk[,YAUqXbEUj*%1D8[ZmpXpU
L%k,&e!-XJm*P1U$KT(mkX89EA%mfLSXY93fCi@8d2)IJB42+LMFNRGB"G!PUbI#
3!2LrR5(@3V-l*q4%S$$@'ia5#jbrbb)YBVTjYV)HpFAeAS#5%6pjX')D!2Z9%8Q
eiP%dbqpH8K1rZIhVF!qpa5m9!HF4JDH1E0Db3b08hrK6#3%b0%U%E-F$JkShB(1
e0M9LC&F!l29fMYpD(S)5pCPP0,&!"YX0UJ&BmP9Eh9(!6)[(iFH"Nc!fkVpibEj
0)D"k6FUFTQ,$1`YCMadL1i[cGm2kR#`kKQ!HYckl*3-NT228TVpI$d+%VUhI0dZ
N4VLDHG"RCfc`9jX@p@U"F!ihKcET*@#)BQ$C"m6pkRIQUjH,!*TKIr)3Y,'T$`*
XNTcp[Nj)R`HC42f8%E'cTC@UYPX%3`B9$#6ECKR62(4G6&%3X0dqFIZ45chjl'k
ilYRm!Mq%AEFi3B289F5MY-)RaLhNL34'&!d!,bM4rIpV4qLLbj+DjcY(K8!9mF-
e&URX)c4iqB!$(3b`,MIP'`!SU`F(fZk'5B9bK02T9ZYM2hH[8A&akDKZ&Y45lrX
rb3`JjXe1ApM@#(XDU6!bFl"!9p@rirh%k+@rE`KjCrYBcb!MRpfdNRikb%T4HBG
@!Nj1edF$k2b48qT59)r(@4'Gr9j)H&`#(pf,P`[3kEcE)i8@pM&bNGEM+X5GjEh
NV'D3!+!9H)#&$$)*I`D#**!!dfS4I[*iS8KL"J6D32&C`h[IN5T%[qC`b[aHI$6
[iS2T2&qAq&#0$VN1Qcj4I9K[p+U-cSiC$pL!p!'&Y$"Jm0rf9"a&G'#JT%q92VB
FE'qrPj(D@`M,14UrC3A(1R(Kb`l9qJcXjdhS!J9hKBI80T,HE"kEZ@cD2hA,9ri
c'VK+-)$f#[aP1qD'#k51(M-B@Ya#HJJBaD0V"cYqCHGJ[%-e&CTiTr%2##BMMGq
!dRZi8D62Mmk`[IXpk6q8Y5`Qe#h@@E*"ADd!jHc&q9$mXHX6!Cbq$T!!*dQ8mNY
VIj4%iqfaK[[lPQBD-M%q#CX9dLTq*@QrELYml"13!18LGkH4S'B!`eSbeaeSYb*
`hq*$Y!pPU@J5486-#24F!V(Bl9#bV4aRLHL'51k1)p44KIcG$@M!Hi%"rD&&MdP
IkP"%`!)fk$R(BkT+XV9q"ZG$,ab2'lpYcBS-XXGBm5h3'4d#'`AUAm*ql+,PeQ[
6Z)[K'cjBc311ZXS+drjEai3i6-9UCHd9fS@qdj%j@-Z$c,q"N!$-Qr9PrH(2L[h
X"VXih9fYZ&hl-kk-kNfmdl#q*ELp90GA2d)RCT)M(KqX5EL&`,R(,@h*lmm9Qb#
IV$NCpjH1FA2aN!$fCR-jfE0cjIkVX'HVQd3c922+L!U$a[qrKUYra('RA8N-'N2
[MHQbKdiqK(0ij%86Ai,eTN%HS%)m,!hcHed,f`c[Y1Jqj&hLZiGIF)"hBNe)h,Y
jTfG(&fabGEm8@Pf1&3N9@aibb5a9(dC35(S0Kk2$fQmK"ef`r1EpYfPpkZ-iG,b
`9l-SQ33hYkqbX$*F!&lA"Vala8Km&!RjQfD8id*QLRE&PVEcjFmiJ*3#9+hU%Ti
hVqF!*UIX'dfa644c$HHJp2R!J9Akih+NYM%G%G58p$5%[VQX*b!9IE#BT"Q8+-'
(m#CPZY!Ke@&+UC+lT%1M$$@k)RQk9#`9aVI$5YS&,$E6NS`#q@Ur&H8E5ZBq[j`
(bQT+HA*&m`C`mZ!hBm,IC`C1)e68'S%)1LC1)3%k1)aejB$cJaje1j5D"8-MQ!V
&-Ue+H!LEMbde)B4YG&ae`imBp8kSKNCHB',)eJB38QiUar2#lV,Y44!"Z4VA2XV
[&PGElHD")Z&hZ"aR3hE``*!!h,d+&P#(L9P4)+"aC!eEcTV@CUkakJ'KrT!!jdP
1$Nd+EaRK6'"[PB*XDpCa`Bd3m+D*0ABZ9(9"03ACH-8L[!a%qKabfY,""32D)eX
G($i**jFIr$c02@M-8RLI`abDSjcI1RV,#Y0E9TjA)lVlJX*+#YcQFQ[fN!$k`iJ
4akG5DEc&a`b06iZK5U@!@R0@[`a"6G1')S"8ZYK-"FepDe#q2I*DKR%c52jl1m9
[k8RNP0qXU&Sd55+A[N#%@`[A-"'hM1!,IUE3,0eC@mCj2Pbc4$0iF6RTcY9PTdE
JCCI%iR(E"`Ca3%aJJ8kKK`jcM!5H8[KD6ANZ'Tm9(9!b[0&GScHl41*K$Jd4fM+
i3[!bUV6EY$#)%5TEa8"GH4Eb#4Z"-V,20pI+FD6X#J!8hM1(b'*6q9Fh@BG#U9(
L4NS0S9[jI3Rf!dlEdQ*A*3T%flU*jq3Jf"TbQEhCP3L9(6alPC*QiJ%cqHf#K)k
X5q'2AeG%kjRl)2ThpbN8MD54@8#b1l$2M'kL0LlP5@+i*13#IX"qKA5@5[$8`mI
6TcQ1rdU9Z"9KCTBkb5JMTp[bjiKC,SJaich3PEGZPSI0liM-Z"B%r612`i"GRKR
qE2amrSL0STKmB01ABfKRk+R6Bk+"L+cE&K+-rJ!%54@0XGekE)IT2K9mp4[*BZN
`Dea94"Ghbl9$@iD$0JIN(18N#$&B0G-jjed&ZE3Qi19&@K3X)H92PUmb[ifN0+)
Q+cPYU5G+kb&[4D8K8"j#0NU0MZ1h[hm@+)eVCiiD`6j4294JB9dB(%`VeTM6B-(
(R2*fCI)U!b8PLE4NiT0j&-Vi2TVMeDYNL-,ELSQi0B!3('EdpJLdCM[FUK8UlQ0
i(Sp[#NTNeRJ`'Uqq"S)PRaPlmH$h+SI-&)A8VG"el@Hf!ShaE2V53h1bAQ`!1SX
S@hU$BXC!bGSY5CA3R1q0'SpT1*+3!0%2c+UL#6)N)!2Me`qEa[N#D(aD28eZSle
60SPc*'hM6[kFF141m`[BrF1c8jEl$48r+U5L,ZKf[#HT&iTjD8E43N+K@CLGUhN
-2I4$Y0ddFm@pSe)RXREZAj['r0+-"P+R2Mk&-%[JdaYcYH2,AIh@c@(VASXFfCH
MJ*8@40R&ZP1jV"N,Fhj`X!53!%0m9Ee4l84k"#`p,#dd%Qm&"j8AfrYS$Th@8a&
UU`dE)UaL$DVFmQ*``$PS4)rbVq!r9AElkNa&r23k&I$%MD2TFQiR6S%36EY3Ll&
[AHHemYMP#kmb&XMkk06"5VPR,GLHQrST!(kXD6+54M3L[0a#G+2!Q%,62#IGeHj
Xd'+e-HJ%ir6k+bK*j%aH$q'+6aBc[rRLBG%'82iABjG6$iV-4AdGK%(H%UFXJfj
`)RC-,Q`c(ri!KadV(%m+'b`RJal(KL4%QSC3AUhfY,6N[VYI95@iS#"b1i[B@aB
(a`YU2![S450%%[kQQ*i*!`F%-2'LUM%9NU'A9TGR'jU&Y9)VUU!'cXL)aA($YSS
f4U[!J8RG+9+j-3lh5Neb-,9*jb$Hkrj+rb#!0`%D8lUjYSl2"(4eCX4d05Y#dpm
SE(E"[9UeTUR1kD0C0EflqPe+b@c*qD#dcYrmfa8)+5cj4haJXKYVcC'+irl'"0r
NRZcGBkq)N!$LrXL+V&jhHCi)6lJ['TFQV!bCqAS@S(N4Trb0IKKhFcUKe4fU8Ub
i9&0L$'c`'8kmH'Q91Shjkh1CdaI53drFhD%)d24-%ELZl[FbHCYp)4l!k%*0K8,
q1-#)G[D2RXHP)lmCHLRKbliM2Vq(GSeQ[@A"$3&e$"6FG1E)h1fr'#H"3Er12ql
*DX4ESGj(hN)[K*UeRFpbD@N4q)SM-2rNJBbfHKKpr"R+@FFGh[1j-fZVrfkeP"5
03f3Jca1CfUTS5Aq(6FikJM3hPh$lI8iX5@UjiqTk&68@5i9r3ZHeX)RZ+YiIG!H
F0H9!-SbL`k*@$$B4Fmr"EXS+1iJCkMb"Gfbk-bT&H1KMQacCajKUV-d4DEq%UV%
&&#c9DmkJV3%qaRe!BKA02b1*`*c%Pj[pHIMZ0[m!fj1Q!Y9$6i@QJ&-l[@K(8bC
E4+l2B(U15lGhcI0NG2%bG&IlJ3h`#ZbbTT+M8MYR(%Ta1e&j@#G#hliP[h-)#h"
l2N-,,Bi89IJS&f`""UM#-J-CI'SL+D("6lb&KP-`B(Fb+rM!KXf@83-pB@)UV@m
f@PJMdfqSikeRNqHSGE%b+G"Y2kG)5dKBa35+-)aGU13SZ0aP0MYDUdh82`82!$f
6Lmme-D8mJq,YP$i1GNMXcZCV#kJ8blJfLbKUjpl-lCL83XmBQ604$@E#H,hl1Zm
4`8J(ciq5Q$N6GqK33mMHq%*JUf%5i$b$,deC#K-&3l@kh!QrIc8K91i3hhL9-cm
3PqF8GDUKqJcr(rdIS#qSNdk+$EUrk9GMPP%SlYUS`jNGX#5iQ0LaLq'd)D&6rFB
4m,jhK3XV'Nm8f0q+d(2M+qH#ma`1R"fIQ'L4!"C$RHi(31*03[4f"D+jpL*UVlm
E4RZ9$k"mEl6K'"2HrX)`b[Ylf-K+Yeh-C6#4h$c)!kbBGG9`F`4B,&RAEjFm'kZ
QRj1c8mF8%!HXh2G3C--UeriJ[m82aC,*UElX6&RXRN!iAh$!5-&IrcNmSLNV%JL
#l2``8f3ebBRmb[`0CUShj4h%NXU('ahbabiUH*L-MQfcG0#0YRk@41[T$*2+CZR
XAMCkeNHFmI$1Aj*G@4!9NZGmQjB11iC,!p!2)-3E-TK[HRrB+K3-"Sai,Em*(Xf
j0kQ0XIDNC5i+M%lIP&8A'+F0U!eZ35S+E[!j6(NZLM[1eG0M5ahHKmeA1#(NpdK
G1cCVLh$P*I80mR@Xq+c3Y9r2'kI'hcrMBSH5!!kZD8UYC[H*DHqYYUrU%"P#'#Y
jC19[mZPj%@fQJ2,[9`UCBCkaDqLPN!3"!!"+!"#hp#hiYr3Yq!!!daF!!2IA!!$
5`!!D&dF!!EX3!!!663#3"!m!F(0PG@4[3f&bBQpZ8h9`F'pbG#l2J#jiE@`!!1D
F9%9B9%0A588!!2q3"!#3#S!!N!G#`G6Z@rThq#(8#D"k6++U-,V$`FDj`@-#5@3
ZGNQUd+JLDeJ2q8I1#mH-Cll[9QQB$*F6"95X-R(6Hd01rUAV!dZ9mjF`AAI9@-!
hBLh#EhJkD&ePQU58[C'paVaF*P6T6Rf,8@4KHD0-ZR2ZLRar41qY-a-[T#mR(F4
*)H%h3E%1e2NpT#%1!5kr0a8CIm)"DCcG100,j4pJELlVFkVX)3CCYep""2ESZBN
daqB2aDk4I-"3T0PA%XSA`Si[U(QC+6U2e9MS+DrfZ!Mm#[9rG9-Fr5,FF4f(P1a
#Ai@crA*h"hYP,j4LQ$kU-("jS"k"V$B2(IbrSihj)[QF#IHU+RDj6A5plpV),rd
E#SLjY(mBH,S"9YZEF6m&IMQTVLhcG$I0KU,@8(SZeHS"0NQ`rKH[e8HhercPHEM
Pc3$CRXPYkRS%,mNL"HiYBka0LTpaLCmXC)-JkppYTcdKqd-PMpGDYff`5BjXNBD
H$JldXVLFaDIBPhURQ-aja""5J`e-NQk$eN$BV0XI&$cJ'p(VbJDkATEFcr%Y,V!
Rj9PJi&9CN3Q8SU!BiZQpSHBl6CcR-G'i"&bl&%jr4"(fh[`T0[5e2[II@3Up-KM
aik6iJ41ICiAm@D@6CY'c'J#f4-L[+p1jU365ML,lFXQRbIRK8UjiE#2QU,biU'L
EAm3EPdqN*&R3KMS-rjBVjBT1lR@(kRQ8'$Up8Y!e4Ii'PEGLebL0pRD`8N$mDX*
e4#H0[0Lb`N[P'GfLKdC[S9A0IQ&q*prc-%$"QZ#IL%fY`9!KUQ$c$T1dVrFk62V
cr9NK1dVeVf#[G,f+"@*kmTIIQehPAQV+bD"Yd1,aE3[*4FDU)!PSXV%fa9PL(ZD
ii4FGiAd0+Ta"'M3-6Ykmr`Pa81(Xi68R5I-8)cr,+0lX28Fq58EN@'-Zm&-EQ1@
JXpE*@lK4Vk#k-NHSe@fNQIDD$S'd1KZMTSJ%'B,GN!"UAT5db8p*f*2B9R&`5RN
#0q4[%!CBNfmE(%i,`HpQVkA%JMfXCIX@*[L'@`V5MN(d+lJeD@f105XFX,R"VfF
"efjAIE`(*qJTYZ[)+M9YR2#!iNjH9A!aC82(UGJhb3,!8QP(#FT95diDFUK8HH6
Sk"T9PZGR",cD[5dV#S(U0K4jT(8+N!#5&!V`Vr32!ekYQa5+!IPam6*Mlpc5pFa
fk3h(LiZZhPPQ5VHq'kqkG9Ib6H+)rM5dlZ9[XUcrF&ci-N31bRG*VaVI)p,,--R
,a)X9M4r'Yh43d[ZH"93$VC(J&(,id2lmrD44'1`E"95!V`!38G1dR[Xc4XLXb*2
`Ipa4!0E[%aV%,lMDiNd[eGbpC0bhZ#ErD9qBY#*c''XCeaiYcDPUeLEY5PE*T[R
kSc**rhM-rYBZ8+5Q"'0A0[S#8Pp20%H5K93LL@epTGBMaTS3r&EANDBD[k"0'%,
QSqMC*$M9PpdX[BJ(T5M0#DrM%M8ZdF(CaI9hT&m1BULeFGfQR*5SLMek@G2DHS)
mIX`HiFI3"GE(qGT4@fGQ*k6J@L5q$Sj6p8*%rp`Ll'GG$r4'RY+dHc)i4rRN5-4
m2,fAl`N9l"*b+,AI+$TmY34S9b6-H`Db)1RJb!+G)SKh2jP8f1J1TMZEj&ND*(i
(Y@*IKb+"e8VLm-HS@*(S#ZKmmq@TdfHX8`'LJJK-Fb"NXZIpjiU5T$VSY-hPp63
XF@LGhR-XYpAdh14V1!Y3Yh-hDiYca,##!IUjJEBETC9jiR"E6Ic2lc1&YmAak@h
Tp6JHfpT4A1Q!-aBp'P[Y2r+)T#2Kfqd-l@Mjq4XQ3'IU%2Q[4&b6KD%R2S63T'q
$LU'ALEP-XSfUb6Lj[f81+YU`ZqZA(pjj&m3r@`lEdKSj4eEaN!!pUqDcHV5N5E2
[`FQdL0iYp6K4$Uj8dfJVj8`,ZU(iPP"4l5C!G,,kM*j$qhEaDpR2$k&8G1S5B3+
NU&!lY5fc+aX1p8P,GSh$+[9iB-Z1p$[(X'Xf5dQGH"S@Z*p+0(ck!jFK8l[l%0J
'BG1,SA2,HGN'I9$6qpCI)VNH1E2jYF&m@Npra0ke$NFQS*9+4%"XM#q0(X05QA&
G5L92CMK0MX*aH#bkXAk)c1R[(jd0'TVPMQK0[!&CZkFp54Y0Bp!FiM3Ufr%'$lk
BDiMjj6qcAqE"liSf,,)K)4Z!('IBkjFE`'*T)D3A4T+Aak$AH'qapAC8%2T[`rJ
j%)pTUeJ-imhrDD%(5"$BYESHQ)kmi[R)0TpHGLb25Y`4VZGL1IVlSmQ,@J@CCj!
!BYSQA&Z3!+bM42DSQV`PjU#GKjK(8TM-a+JadQ3U6H1Z-bAmJ&@arCl%c5XNi6K
!,IMk@&dHeaDVM&QfQarUdAiUc'rVFmF9`F6&cH0HkS%"89F3e*H)J1*$D*2qGDp
KQMqLCfD&!#86%f2DZ!qLdbY+QV9@)4Br2fLJU,0)NB,42#`D8b6eeaHUABXN('@
%lTU6c5ci5VS$I@bfi0"J#U'$9-QAAK0YApq5lmEm6)X'2(C2!(8#pleRT`fTkZr
rhjpm*r'3!1*5*U-Kbp#bq+Xd(P1CiTLcFqKS4k0%a*6Xr#[Q,XMkHR%#d()NThc
DcA!a0'ID)'jka99ZL%RZV1-5"T2!U&S3S+a(+CQi'([He2LRf-cM#6V#J3LqD#&
0@YkCN!"k8DdjmFq,qEpe$k(#p6+Y,GZq%jrQ1$[E)j&1dUiNJfhiJCfXVLr6IjK
i6@[F'lM,BGIDkj81JI-hR-p6HL4f0qIM65-8PqM9@hIGZe9f%(@4'1iU0#r*,ZX
1IQr8j&UH6aF[,k*If-@Qe(0P+`A`Z`GJpdN%kFR8F$"PdY(!S*FAY$R'#&1mb4`
a)pcp)-rlFSD4833XJJV0qMR%(2P8G1SIae`*a'5kP9CB43aGQl`ad&!9`ajrH2b
aYaRR#aE&8e%bjLP@c04`JX[cd"&e@8J)IJ1dRmVa33lhaX,d&HfYNK3jN5'DLCS
5M6E#I%bb%S5jelRLerF2$R9*Icr-#IIpc!D9eqpYH)N`[++Z)J5$A)rRp#kmF82
MpbTm06@@BfVdGjdU%V8`RFIU5r3*0HDTrT`U0BZI'q,YjL6H#Np&#IYB0pkH-bP
AUG8A4M%fG!*-j(A5mE&,ip#14ZJPUSEYpNN-$di81LP8fC)rXa,F#CX+%M0i0[0
iH$lj(6fF5LdHA`YVfp22j2RZ"kGB22Rk5T'@ALR-C!*U,Y2U&TC6I+I-5QEUC`)
@q#0LNI%,S`,PjKQdDZ&f-MfCKE0VBiEpVR6593lF6SKZ-G)3eU+CPSP,m3#JGZ9
261N8[B,QpPPRhX3dfa@bC8(p)3J5imAp"PDC9A1XYNX&+)cM51BdMYc(Um,&#qC
+E6N'FAmR)HY)lCLc[85)bCB`0lpk4VZqS,XYj""Al9`GDCL#'1kJaFI9h3dkkXm
L-(#eJLM5#Lah&RQhkHbjKS`d$!!JIN[%lVRdZEMUm&,-m(540#m,4a1)Y5("*Q"
T6H#Bc2bATNZ[lHY6a8X%V$e"TC,3TE2brHRI!kq'ara,(qX[)l($A5M1r@-U#YD
Nd!m3-kIVYQ9f!JNdcNhP(q9dM5`HTkaJ[("%Q[0Y2`(i$Vb'GL@*8fJZdQcFJl5
F$eY-pRH4pAG3[-SiP[$*M%ILcJfS)jj40-RBfh1ddfJILJqFpb@TDLFRR1kb6#A
K`V#8i(LVc$m)JjhfL#BZT2D!k6qDbda!c+I13@`"KiH+G)P-I[S-h1%)jZ4V4E`
`AS#Q44pA0NVDUK&@KfpSPE$TB#Ca+3Hr-EUJ8H'KeU9!`c6KLMVreCV)e'#cIbS
JL%TJd)b*%B'fiB3p-b#m-HUF'q@pjUZDakm[1h#J5Q9+bV`V`!2()9$HEDfFFhJ
c[ZM9Hm2M+G9&Cdk%G&pF`R"V3)(KEAB9rrTIda$MCa%$6%5rV1!hHi+%Q@3IEN%
YHXJ5B[YHH#dG&dQXe`,M39JH(UrFZe)M0Q54F6FeH5X$jD$(*Mr!!qh69qcL1GT
Tjqj@mrLNr98YBRA"*dG53-[S5U2XrlMa*c!U9ID#r9ZZK,!D$q8M@i,(c1*E,e,
5eUjR-(ICJ$bp0J0U5GpBpNT8i+GC5U+$@!IkJZch*1l39-P(H&"1[4f$ma0PQk0
HC)YXAZ5`hk6%b-RH3KkU`Y$6,`T[!r0-J4LPE1fAYikr0#iC+VYGi8c8b$mUd1U
JVM3YHiYUj9HQ3%8Kf8c#(jCePLcU[6&qr!X)48UYC+l[*f%EfHIEBpBQ1A$ZmSP
[$CVE[N()IP(em6LIE"rrB+k6EF#N)4C$MR306UbL-+HGG"B40I$[VELb9YehLZ(
3MlDhqN0iJCM4Z5``U3I-`9U@)ZG*HXjI&bVeQM"&QJr-SX,fE`9FNZ52DIdYr,Z
lUN'q$$&@4@VLakH!5X185`EB8c$q09LlcDR[9,H6D41&fS6ZCbM,%`Pfjd4V-H!
(a!P[5BHXT*dcNr)(HAl"HSFEBb"2*0D9#$DQ'(bj'B0h19)8)'BJSb'ASKii)T&
TC(VeYX!jQ%(I36K(DBd'HAHYrNq[JMfZ,E9qS[#CHQ'PC9aUC8RGmheZqaSb0$A
[6k'K,,'ZGR%HH&k#Bb"+2KNNQ(%US+*DV(TSG'J%8#m#6paXQ,H%X4U*TI24hMJ
iImqA*h4HHDXie`VX+1289e'ZJ'b4-49)kZGKX35iXr4EXNITQ("pR*!!NqqN)ZQ
(K*3J,C8MSq`IiGbD$S%9+2Lci6kPIm)01mJVXNm#PU&8E!"-iLM@5)@d[-YqdH8
#e-`fX5"-c5#r8bZTc9f(ET!!a++d2d'GRFAN$(GHYidR"2FJPIl,M-FS03I5G6p
Gh4qTkmDqcbc$C&*YKL1Pk2-V9"d!Vb#5XZ'H63f*`@e(Kl%Am6,BpMBfr[P"YlS
I()ibQJU[LmP)9IZGrUri%G26CfP![l0Q9ULfl!JiE"(QM!Y8K2'B5-4F#H-aS!k
2d5&YEc$d,4c)C3Ch(GB@daL!2Z6Bf5VGkMGjiqiC%#Q!Jk1@X4[Y6%%amKLMPiN
!9Eq#2cECK2+aTBi(&11k4hk![,-69Kbl2hCPVZJ#5LpiJ-(EC8AcSApHbkei#SK
AcEVfZ10*NZjc1LFX#jHSr!-JI8J,,8BeMJ9C%Shb0ZKeY6%lq,JqUTb(G!adMRJ
XjYh'D`apB!0`p6ml6p9ENfMhNk@kAJb[[Uq%"HQ3!*4NVl&cYHUmNHp!-3E+j!M
CGk*PleTCDl6GIJGIiLklQY()h[`L6Lk-%Ci)!(Mr*h-Y9"$4rM*mPEm0#E1$pP'
iU#p"4HA$Yr"NjZD5[cE[230,6MiI%R@RPZYrYIh!!5Q20Rm!%R1Vd#N0Af6i"S,
pNX1@E2a9qdDK(CbbfXaSU"YkV04NSmF,&"`d@@Y'E`'3!2-KQ4E$5BeIN!#-1YV
"$bD-Yj!!H8GVJXp81pB8U1mLD##rYa@UfhRH8%plc9&#@pDr)5,k16`b`&Bqim$
I`QGRMm-d$($6)qX()2MG,q$$&&$IJ0E*$2[e`C!!+&I3eT%JG141Uh33hkUS[ie
q[R3ld0GH2RakHbA`p`6-GXdDA*i'JmGk"[r(R&1mmrk+c4Z9eCdZ'AQ!p2-hE!I
GIr,S4VVEQmPiN!#E#iFQVLd,jQU*HbR'@XBhiNb&Qq`@++U!%LQ1m""LYr-l)Y8
cZ3bL4NViT$kZCE9!RQpYMI8EZfUGH1Br$*pCqM3i1aU&Q`haGFXl)JfR"b)$$cc
BhL+iiBr4S8qQpbAiM*BM',BQ3mLlpAE0ECN@iTQ((1,`-fQj'YJ!0kJm[2bDHdb
Vf9XP9P6l5aUd9"*[l,68F0m6rVXB+h$e&,,r,a$p"0XX+R"NF0UHJXX[H-q'1r3
`6XRClf!X3fZ$kqSrUJPHaq$I)+@Z*Di[KEAU4BGl9$%@q4f0C`RAT*-EV!9k9Lf
bpHGK-abS!A2J"4CRP%UUK1b*hD,k@h`brjiS8J4SrR+h0eLjfY5'Q(TA-RUbpCa
VBr"3NDLSc,E9GKf)C-iAF")@R-GldVKi,e,4T1-5k2'+F@Vm5'U+(XFZ@`lkCBV
`jaCQhIH@F0Tc$5ZXbK[m9e8Lj!da*N"hXIrQBGEV%6Vq)[2c[@N1FGBG1!JQ8+p
Ph'Abh"4&GC*3m+eeAh5cam@TCh0k%LFZi9#a+-h6-X-`Pc5YrcfSERjY$PMpfkm
&ZkfbVjfkNTX2M4d%jdYP$)Uj9Jek-X%5a%lITr3#Ar`00bS@IfNFkZ)C2KAFH"4
Z0PD4kjkVK$f[a$G[SU#XTdhI6&V-$'Y$9j6XlE!K`2i9FBFU4qUE1,f(Sl"XQcT
YXIj9B@!hEfI9P84h3keIja@qrbRPUM*D5FkR16"`16p8fb!fE5ca9Y&*344N2#B
pI&2hHU@B,T9C)FGr8-,M9bSbaKp@M@,[Hd6DXT6Hr8b3!$MTkDHk!,4PTdp@Y69
jpEqXe("lCrFqU$hK9imhapp+Ta61*&3SCV!DMV`f(ZH4h6-i8k%(qM589TX$CT0
($G@T25`3(N9mrU'Q2([kE1ESCZAX`d0-Hi'$h8-CD,dUP+L@e#p3D%JY(5%$YXA
Y059LPfaHmb-hl4Fh2a"p(3C5K0hc6ifAXeAq$(P2)[1mTC!%!3!!-!"!!*!+j"`
!N!E5`!!!bXhrN!3!N!UPN!3"!!!b!%#d(A&fYr3`NJ!!dX!!!2L0!!#f33!#J,B
!!2KG!*!(-!!!G'X!!0[F!0%!0!)$!H8"`!!2!!m$$[rmrqA,4!!!J!#3"k@3"!%
!!$!!3!#3#[J(!*!'q!F!!"aSrj!%!*!+TC!%!3!!-!"!!*!+q!F!N!Df33!!Zj,
rN!3!N!UPN!3"!!""!"#hmlTeYr1kG3!!YN%!!2S"!*!$FJ!4c8X!N!j#G@PXC'P
ZCb"0B@08Bfa8D`!"9%K849K83eG*4B%!!-!#!3#3#S!!N!N#E!#3!p%!N!32!%,
"e-LrjBXf6IE@[*RS$)-CAAA,2Y8F3TQGqX3NQYV)0bB949kiRNI64C-l'V%JT*X
MZj0B'X5U@EraKkiC5cL$Ll9F*85hjEX2am@l$ScA'#+e,GZcA48`X94piY@jmbH
em`Q`QCa83VVQic3#XRcXB'(XC+k-Y%KqY&S,N!#R#pE&XCTMCaI9!l3+'ef#[a2
GRjF*'6`4kN(KMF4B2L!m5-)rE4,*h[YGFrKr"lKTmQp6UhXU!c9rDY43!m,YdUL
+3Bf[E1aAaJ8H'L8'QhaNJ+@3"!%!!$-!3,EbmJ'fm[)"!!$i[3!!r*`!N!0b!!2
"KJ!!qPJ!!!(2!!!#4!!%3eC6!!#h1J#3#%!!N!q!!*!(TC!%!3!!0`!3Y[,b!EI
d'KS!!2S"!!$kaJ!!qJ%!"qdX!*!$%`#3!a0J+3#3"%9ZG(*TCA-!!!DZ9%9B9%0
A588!!,(JXH!!N!U!!*!(4#pdBf`[N!304#pdDbq3"!fPN!3"!!!k!"#fm[)"Y[,
b!3!!qPJ!!2Xa!!$k!3!+2,N!N!-0!*!$$428!*!%8Q9`Eh0TG'pbH3!!"Uj849K
83eG*43!!XH#ai!#3#S!!N!F[BhCcFQp[G#pdBf`0TC!%!3!!0!!3Y[,b!EId&53
!!2V'!!$m&!!!qJ%!"%C2!*!$1!#3!cM)d`#3"&*[Eh3!!I[59%9B9%0A588!!,(
JXH!!N!U!!*!*!AB!N!0&!*!%$`"#`G8Ep4`AQq592-3bcZM@CbG92I*QDdSG[fY
5)3Kf)+"""P$T[qre*2iD3K[55`2'+[A`C"&#k"lJ25cq`FL3!(S#+63J1R"cCA*
fCA)kB@j[ERPYEh9c3'0fFbjdBf`ZFfpeFQ0PCQpbCf8ZEQ9d1LpMGR0bEfpd,h4
ME!fPN!3"!!!c!"#fm[)"Y[,b!3!!qc%!!2aX!!$k!3!$5T8!N!-"!*!$!FA"!*!
%9'&R!!!'VP4&@&4$9dP&!!#ai,(J!*!+J!#3"`fPN!3"!!!`!%!!N!Vm&!#3"[S
"!!#HE2q3"!#3#U@3"!%!!%)!!,5LBc1hTj!!6`!!qJ%!!31f!*!$FJ!5d1N!N!j
%FQ&R)#BJ4(*[F#"8BfaPG(-!!38rB@4bF&G*FdL&!*!$!J%!N!U!!*!*&EX!!!D
Q!*!%$`"#`G8FbAc[V%eQ@VrZ`'%)mhd&e-&hq6)Ze-Nj)$Qk80hEEfSLGPC8""h
+#Ar,Sa8*"U2a1"(Xk&&TA8Gd,@VhY%`TH[lr`T!!&JCaYiJ`R*Yq('G6EbDi-*a
ADm`pNSHA#P4)mYNk@jXcCQF[0i*4L9m"@h(2@"ETY0chQ'H%!FPLmbkaPS+P2E8
iX4dA-K'iA%LU84E5ViYj%53JBZYi%m6+hPNH,Fk40RbhGX[jIa1!AI'YQUc$[0c
NV[8DIqh!j"6KGE1-mf1U"KbB1jA%KdQHQe6'%h9+kNi4L`6KbDdY+M!)P[e(`9e
DCSq-Pr#!F01ThJl[1Vqr@$I-0,EGPb+mFcLdRm(3`JY@D8ZLb)lqGYaUKqJXqKp
6k[6HbmC*'LMk)rVb+dlZKf`Bp)$FGlRf4@'JN!#b5ecc(a!@HpBZ"2lXJYGqX[L
EKCkUp845Ea4Ah)FcDFVSkcCR5!Y6pGK&[%!c)Jkm`hB`BA5)IlIqkcT,Eq6+q0A
%"qb"ah%GGU(mi@[2BZ(jKl@9C69BMq%+b6llhC+M`13A82AV6e91KA&E!QqQ(MU
IK-kJ3R&hI*P[2[42(Vc6l'q%F[j%PIa`#IIQNmHKA,$QBa++IJq**PThdI`[-pe
U0$J3dF1[6K'iMm"Q@Lj"iN1$0)qbaMa["8'9KmDb*hh(aaBHp$8lf1-8-R,pD),
S(BUSNF*X4Z$-FZrk2K-,!pT"VH'mhPbQ!&bCbY!P+0P$HVI'(!"@8KDJYeV!#QI
mI8HASRZK@h+MkIdUcbX+PC!!4f4jUkX4%LdlbH8U4dC!R-i&0Z#b)m9@S!Gf@U+
(!HDAXaFHRXPHIc%D%RN!2YRGrjEPpXRbZAbJNUCJDV6[JJillTlY+MEk%XhcRUr
f3KH5XJ6DRhD$#JECkqUCZ32UqU"[#*h$CAC1A&a%rN(SK0KPi-lmA&#UDdVeVA8
iYYfj@6Vr5r-KLbaGCm93l)AU3T)M+@0k*$0Ya*Cp9ZDH8$R)MDf(qqZ&1#kjZq3
YTje6IkX5K$kbcLLdbA-H,2fbc$VPk$"BE#c%CBKVZH6@P&`'q#%clX@0(Uc$Lkb
1peQM5rjE*d)c!"NC@+UP"-a3ZK[Nf!"&p0%hd,2cpB-&r0YFbMqH''NM4NUKHlc
1UhA[l4XSF`c38["q8Bj#TV-a**HhV41hmCGb,PHlYQD"aH[2l1*jqcP`rKX"qkp
4fh`d@AE*NaABVX3[Q-%@1`5dqVd#8c!3MLZCkd3"ATDPZ6UP-8`+[BQTKPqD3RV
brrE!1MZLG8J1*F,rmQS)"hKI4Tc-VP3A'ENI8V9'&i+ZBZDCVa6N+X%039'-p,#
VpMIjFPa&Y0c)Xq`00R!PRV$bNbl2(aV3XV+CcT@U1ah+R99LqLh(GK1"%9aGTbf
j!i1D`4+!,dX"eYZ,IJV3'ZRr!0mjSf8bf6T9Zr!j#Fqdj2e0L(2#(CdJf&$jL,'
2kic-"4cbY%KDAB3MfGQ*I9G'bABdFZ3iNpm@$IQ`TkIN)ah'0iP,CA5f@,#dYNV
GpCZATC8h'heJR`ZG05Fd[EEJe"8bB`VG$!MFX,H1ZJDI'9UXr53k%YHaFi"`(f@
d+EV'Z@l0iDTE$H1SUdm+b+#B3GYi!KK2-HdF0(`LQlVYe$m5rb+2ja!RKl!lBR'
G&'8F5(YUE2+P,NbaQSE`+R-cJNNGrKE#b&3M-XPRJ32&i-ep3B83`-"-6f3J--P
-GYKhUJ4C`4XR[H3e*N*JPZRm10`A%@62+kFmSpkTNhJ+8Z4$VBm4X@RR"dFHL$'
D-HL5G!DC9RMjc[)YF@r%(LTm1ZYEa)q(lZm!(8'kGhY1qMAY[Di+86Z)6(`Z2ap
*Ee$@HE3hH1-DIb-ISB5e0E"i!b4P$P5RY9[PhI3NUqPFZlD3!!IC-$Fr!a-Z-Pl
Z4eQq4P+Q@f@`BNXlMKSc#e+0T!!D'`,8(!Vl4`N[XDLrphReU-G+8!V8[rCLHBU
[FZKYN!!Ppp@"+RbM&)ZX+h3j,r91U2%,FX-%IX(j(aV`Yeqeq$8qjEUT@lBb$DU
bP&+I@DPDZ%cJ&KQc3M20$SNilKH*k['Yl-pUBNIVHS,SQKidB`BIl,1*%4qcQbI
pSk9B6&1!FZ"SNaV-'Np`NA!R046,Q!e"dXEBHiELGQq!%#aX-CK[VD*LN!!da*1
+c$l"1SfIR'D+P6#D-2)lTb8"JV+CJ%U*HBcJ6jXrI2h"DM'jX%,YPSGHFMj(CcV
AaE@eD$ekQj[YNkSB0[6H"j3H"cQh-`DA`h,P&U&-qe9!TC!%!3!!33!3Y[MDbEI
d00B!!2bF!!%`R!#3!h)!%8q(!!!q(J!!&@%!N!32!%eKBb"8Bf`[9'XJ8Q9KC'e
P!!(b"e4&@&4dG(Kd!3!!3!'"!*!+J!#3#4Ti!!!A%J#3"!m!3X(8bB[h(GV-JLD
k(6JISY6VFH9RLj+dRjdEN@jaqi3Ar'Ek&JN5Ga#FeV"8aFB[IN8'`q3l3I"2cY2
#5!H!H[r*-IAN$jjrYcDXDiC(69AdE5SY[mIe8,!eJY+TM+RJpDYG&R"4deR`lj4
NZk&BjX&j*RTYh2r[Q3eHlJUX@HPL$Pm'RK#6RJhGii"&q(A#'*LZhQVY1(kFCLQ
ha!4a,J#)p[VECESrkT!!2a2Q3AKEbQZAUbM,2J$LC"DXK2+lCjJ,Ll*AfrA0GZ9
p+C*#D[%+i`LZY&`TrMl[CDIiG`X6e`*SZXG*RcM9D4`HdKM*,jP!(Fbhi8eI+mc
+-SE,3r6Y9MU*2AaZ3@$m`6KLqq!62ebVr!DXem8EZCe"%HZ[`NG4[+`R&0@M)Km
2,##DJ9"j*0S)R#RLN`$m9cG12,Z4i5@L+1qa*h6)``MMe98NG'GCCXYdRS$Q"iN
+!Pc)P#'Xr'PE!Ha0PmRrSEA*4eAf1C8,%H*SpcYcCSD8&cJ',)qMXh%l9eH!9i9
@FFjmM2[R!'b-fGB6MSbh)AD13DG+0!d%R0ieEcr0)p6dNPVJmM#k1+cle(M-rpL
JFVHH!6A9Da)8-Yj`*!TK3mTc0N-lTGh`-FeQ%e#qJj05VPh!*hU5`+)-"'8Xe*-
EIC&h$,ZH6%YBd(j[AL(I)8(,b`)!Ja1XCE8pY6AY!K3YPr-MIj3l-YI,bAEG*HF
NLblp`bl'`Tb0)ZSQ3XLVb9jJI96C*0SeGj-[i1!LH"qk+(dkqMV3deHV9"S!QkD
aJPX,K!SHMX3ABEUmLc,pqiJQ'QEVRD8LAbC9YBFhQfpbZ[q9P6ND3'hrQ+K#lN&
!HbJJm1Q+Dr4qfr*5dZMjl8Aa5R%I(a26GJm-2TLC48V$iL6-(PSr#4M55&'N0TH
E%SlD"NEl0L[P!Yj,5I'#F)SPCp0$cVJk1Sm%,KBq)0r2bE2M2b$*5lc)XPDaYU[
ZU%1pa`lQKmf1BI(JJ8(#qJ@-jLB)E+Y*T-SdRTA!eea***3(3QMYUNmU6mAq2di
GN8q,X,(B3RVA%qF+UmmF1EGFU*A'DjJp&T)icmBF*fK)2r$5T1Kq#ICF-CFMR"j
HG6M)L-1E0'reQAU-fM66S!-4"E5K00f)dbbRU&ILk6CjIEIkNEYcF,#"kbaFT[8
LLiQVBr-SfMM"!bELcDJb&&kdM8#jHSQQ!D$D+eTMGI#R5)[C'$IYhjJU$Q&1jq%
hA*3ffJ35MbdpDiV@4Kf4LZZKm48#ra#"4UiYkrk1Qm1U2QT%HS)I2r8ipBhE%fl
A%[p$R9*eS*KI!46h"i6`!H8-!YfXH&aFAe06cYFf4'*G`MNi3S9@hV@F*qVAh1i
$8A85'rq51dHiS!,0&UB1-bPHi!B,Jq*BUNHh-2@GrII)C6SMM2B*@(Me#(iCfEf
ZCX(q[C&Ca8mdik5r0bcP*MPNVZlBcbE@0GiC9GbR8X9T3l#+KMHHIYi!b$X3!94
efh!a&mfcSHa&G')P!Ma[add1,VXl[J9FVF41%[rhSKbrbL#[U$TmLpR-BNif83G
+Y2Id(88if4MQ(qe#CE6aa!ead-Ka4-iKGIa&m"lU)D0PV24UiGEBlQm`DI,Pi#T
$%2J4F2RG'b4j8%MqNYhDAZb2qKmLm5)crqMHr)-[U2hhb"Pp!9M%LCmiIlDqVeD
i"Nd#f&",S#@fJ)hGbdS$`jic0Dr00rbr3[8f341UCj2NNI@ZiD)1UcNcCPE"V$-
+k14'cTJ6qr6R'PB+lXp$p--@0l[k52CNM!NDKcd$E'A8GITDCSa)Sf2V9)Z1H#Y
XKN`P`Aa3ZQ+XAkZS@bKklfKjHq'YUU-DS55$"KF)%fdLj!*REfLU,[a-CNUJLQ*
eE9[S$UlT*TDMAlLBMGZ1KEri5C)NKr+4RN5k8IbbT!@%ASR*Q5e-8ZX)NTMir&V
%eJeh36Qa,mA-FJX!Ac"cGVFHdAk3!1(`,I1dS52+NpFa&cXXB3)k1Z*m%IRLjpE
rrHQ$#hkDJ*b"I'mXChUNH[Tib9kD+IeT[&TI!f-,r@3hj`E&)X69HC@*aa`2Ja4
V1kL!q)!QkP+r3[Te65323AUUma5ik5i6!@YTE!M*JpbjKp-VhTa8LH0["P3C9)H
#5MeaN!#4P"IUD*p,T6(6BE[FCQ`91AcLmAE#GF!fI"0N[22*f3N6PMl+5&*`i"J
3Q+ZSN!$kqCV(K$N)YZaR(i#lP$piKkCNqjr)%81AS$&XRq9-QEi83K(4Jk$HcbG
,3UGNV,)NEEG0SUl[p6dcT#lQC2GhXdqj[%a9`!2Pl6prl@GbJNMi%FE0NEDUD+0
6)k9R(Y3qpU[F2'J)fC!!!j(NU%&`D4U0Hl#UEk,C!fcJBD*+0ej'Ha1eGT)-FiA
'*@LPd9laA!#[`()#RmTr'fdLT+S56U2bS1RHI--cK*eQP"ZQS0$#CXRel[%X"5$
42Hq&jCK!(jFJ1S&PdMMNA[Bdf@VVLDCMj`9GS*m@C,lcdC@+`4#LhGN`Tl(Sb#e
E8)YS8$&[h,$UVG,2CM2e0ba94jcJDKK,'SV'c8!FaG[Plq`1iTD20N,X)3RFri'
C@Q`-eD!GU9Gp,j[CaQE#if'5Ki2J2TcdA[rp)A1jP&c2#@+N(4'QU@9UB5rI6Gc
20,IZj(Uhb#B([[0XhaH2lE$MLZj23h+K0q`02RcGm4K*8TQ(XPmj[&'3!1r)ipK
kPqI)d*NrpEXR8G3LA'q!0TJ&"((1L$9IZ@5)q$qf'k8+,*,mlJ,h#R5-3hT!kEj
XE2CKPedhLX3JCY)0-`J8XG"(0dJc"6ke8I!%fp1iYJCbTASEhPKr)B*VkpAK3kJ
b&9USBPpeV'6fP8@!e2LcqPK9lCJ3hejl0,%h(cc1jric*m1UjSrZmKHp(5ELCV#
8$m3i#'qcJ2p1"-(V#UJ8mIF%&X26Ml864aai6imHi2p3%Y%+SA`cT(4LPjQHb8d
Hfb@@(AUeRGm0!mG,mIB$Vm1cYphXk`fbq(+e`FhiQAk15eZh"kLmQiAha9"E0R-
,Xrb$GZG(lEAjB9"LfXP8D4GQp@9T3TPLq*&!H*BL+i3k&)f0p)Y9aN4&RIfQ2%F
U3GV*lF&I!R*'5q%42f'ChdZ'm$jIFKFBDH[k8mIZ-qmB1fE6LKR[,*+BP,-04'Q
@A#UTNQ-m$ZA"9I4#a)L,['a&NNaU)5!`5'pGEj!!jMBU*R@iTG1kJPIFHZEjM`I
hCF'PXeY%E[le"Nj+1"%N)-@YMhJ%TrE"U)XDhpGA#"53!&"S*pei#fq$J,3qXk)
hQp`U%&)1*kkeRVCUCUd3@1a*j[,eBdC*F$!(Sf4S&#G-dRpiBcR4S"$lIGRHN!$
FKl["S)PikmLj%&6!`2-90,&k-98CPH!h5@AcQGD*P4LMId9qmNXH%GPH*08%r"!
q)$ANa'C-*'-JYB0LYUFqFpQU5!*F0CqFc4chh8aeXIj'c,adG)pb0KMVP6$K#il
kZ)YC+NcMQT+D&@"2#5b2KaSCmGJ9)&I35kr09jCGT1HfplZGJl5FBZ"jD)*ECPp
5&8"T6MdDDZG(&f##8%p(@5pbPGB,G-)Ma2QhdBci*00C@`ZYa"HVE1i[QE3rXkk
DciE!!#(chJemK6pqEpXGRbZ@#!KE`EL+LcZMJj`-#D`4DR4cc8D"JKX+dU8"!Ka
)*XT-1$d1&(B9*(B09(aM,X[)8#BV0[UiAGMGM6jqeQr#DU#DiZIZp1dVDD30'F2
@h6MhmX9S$-aAe46VI4c3!XY236(H"SmHp$jfdIYUriPNd'e2Q)2q'a!'$['+A(i
68l4VDI'9ZcrdKYpI9$)H*TCe(llFH+-eJm`l"l6B0J2BEa%aX4#XcF)c`%$2+L8
qTCV@amI9L,-HF8cQZpe@!e1pqMYGP%McBmKjUfMPX6UC&PY&%SVLQ'2k`SS%Qj)
YfZmF8e8ZNi6-dX8EpTflBVV#Z0&5D%4f5LKqp*UdLi@ZKiM%pM38B+UMJY[0VV4
RX@5YN@FmafBHAMpSc'5C`j%8jc&V&(qIj3kr6[%bC!dR9)hPY2iX898RMB-Llka
p09$IGbARkd08Uk0H)10!C8-i1JLS'-dbbiqU1&k,a#@l+,EqfV(k+*86ErCA9LF
ZRbf#LIJ+iiF8aZS$TC9B"Cle1b#YGER'9NPSA"H&f[2mdX6d-FJ6)ah`S35b&H)
f1m(Cc3I51hEZL@fYXS,Y%$D3!%aLUH9'cpi6&qjFaB!5455P&Zk*'DeK'3("[kk
R@HEARGcNXr#T55KR*#'TU09r,(eRQ)mP$9$E&($p#CZMY!*+dlHF)U,GkdY9+MU
'N!"%r!de"q*i(1*DZiNXpqeLS1R2S2c(XiTQ5b#PEVIfS[YqQG'3!+8V')`FTPK
KQ4r0`T)a-)bpZcQ`MPZF,33-MQH2$RemDKb#D+91)2C,%p3AZJ"iURe*lqIAHj)
B6rhDD"@$K5h+[bbIhl0iceSklXTHdR`Z0,&'"dmPAGabRR$V2A*bdE[RqBmk'`[
9G%r,pi4DK&R"DiN1HLi"DiaL0K60m#UHd&M$Gb$k*S"LD'rDCV`KAe-%"1l%rZR
+NaGEL69aEFm@)pl94qfJpE%BfGr4r8C5Fd-j2&MJBPlCBS%LZ6A*[a9[PK*&8EP
[5m#LPU6mJRj5UrUL65&IAK1")9h+#8Lb#aEl5,!b[46T&qRHTJ,IL!il+H##d@"
3d&H`9mG8##DE&P,G-[rfeF)S'EUS-0`dDPK6R1q"E@i6hZeYT[![4Ie1%med2K*
%TA4p4UJdh95pLk)Kfr`C#MqKSDVJq,P@R11K+qL@+J`&MGDBcIk6V"j`8TJaXhG
54eSF8L@@dB0S[b5pSFb6TKhQ'Fj)$89N`DZP0mT#*XTY0KG8q9&jTAa$H9mf$63
R(XQCiG3Nhb8'D1kT#jKa2bcVLMSDF2"U[`N$S"1Ei`)bl)83I!9pJ,3arehPZ*f
511N$kq8#TZ-*cHYa)G(6RCb1XkNXUJ8l`!KrGB&*,VV['T&jkHNA6N6UcEHHcAG
pM2eSDHPK'pYMbKj+B9qlHlqDmjq'Bq,698T2$cQU'kVcir$P58aielZR,QpJ%A5
a`'[qJQ(Ec3#K'"0MPjAa+dhi$#L[`8+BkfABcRdm(Y[Z&-QPQdLL93rPcEd%jbR
*5H@ah3m@U#CFdIPj0&G0b+`4CV(*%*Y**X`1NPf[b6N"MFiD%JTjje[K"kpjRfc
1c2#(4I55L3kGm,G'B*Se"E0&#55J%c)MSD8IcJm9Q0dUJqfh6pD)6H!ZB$NN[ja
IMbJ3ICBT!,l-TZRZBV+LU-[6)kmi&e+fT@Mc0h%rj@Xbpc#UjkEB!!G6YQhTUr8
C"Q41rli)1DaQd6!rP!XKf0F4`I%cZa3r[,1,U#!aV!8T9Tce,dB[H*'`K3!YY4Z
@!&,dP*+flqm)P-Y6mEKhLcc8U!Q2H#LifLL,+UDE-!&YBI*CLX61eICjJ-8q8eA
R2lUUN!!Qq%(!`d()pJr-F0M%%j5jZ+#b1)qSJ"lb*iki3c3HDI@i)9DbIPm@i+4
8GAHRBJK6bNP8%b@04DUNIr!(R"CLVeD*[#D[EkA#m4h#CC3[pFfFq-`LLi-Nj"d
kTX,jE42QDL'95Yraf'ciKc+#*C,jHhEq2MEkZ8rN1(E@#c*`V3D2ZiI*9'(l9I(
L!3-rZm3kAmZ2$bK(V'McKS&YXlVZ!lA2(j3%f`Ii!b+b9jc8#$qqF,YNLhk)"@C
eNSfpJkAa*qNTh@"Y#J"KL[K-kJ5Jdlk`IJpjkAiJ6c20B*MjPSakrGKdTP'T"e&
"AT)E299YVi#@2MiES$q0l9)P-*8h$Z8i&$i,pRf(Z3Dp2GZ1FQ09c[m*V"Qr[-q
8$BT'Qb'UmM1q[a`2R5IY3PdkCmjMmQKe,`IIMS$[5EX2X`c,9maR3N3,ZpbNdF3
X`G4ljpa8q$p6Ep34%[qXVf-H%Ip%If69LTpZUAHd4(K#bV-*k!6R$9f'5)K6eVJ
-9m#6rS`)ClmbL+&f5QY6eCpSf06h0I0M46dTbr*rT3!-ULQ&D,KQlfLE(D6J31c
MYpFK54Al52CY)F3PbUkiFk-fl-3H34MI(9,@!VrX`mP2KENDReq*``@@cc(3iLX
MFa4M@f91DTjJY',j&YfAZ8`e)@2ME1"E1LJGUb(@)3%hGdljIEG`VRI5kXH+daR
m-qSl!0ANH#1e@*0"LS`NYjSLiGZGFEf9Y`1(BR3fbrJ95Qa%pF@-IS+@Y22p4%R
b4QRNiMe4rC9[!eP%J@%P3djdmm*BL*i4RE$L4b&JhYC(#Ir!3Pp1ERC(Zql[5pj
9[V`jU)kjeXd1D3aX9+#(3Xl6$6lQj%eN1@BLZ!ZD65r48ZL-),LUNY+@faeP0-j
[,ppRbUKLYaF4J#MJh+Km,k*3[Hb8#8MAlKDVCd23Nb4ikIa)I3mm8iM,129`R9f
c(p`9L1G[c6"NB3RB#*DaCN`F9HI@D9FHq$9eS`"#4KR9k$RlpIGiJP()Qp@KQNq
2L%'QGFJ-lr`2rac9JGbhr2HHUTL#+cPm,KK2qQYiT-j8bqpUQU+PA))@I5'EXDe
H*"8XbR6(Ya"RcfA)cP%YJ9jSAq+0aHiJ3+ASIA(,BiMr%2Hl9%I44!dH0eYi,,b
b8(XB%3p@V3m[q9rXqT!!LcI$G6VQkDXKH'K8P458,PPC(mJD&5hbD+8)SEqHJcC
dR9%4VaNe0@D99eU)edYkGAA!eGM&BXR@pDF-FNA'2QCkSX4%HJ`qj30RS%mKpY9
&'Yf#cBN,*P1EJc[Q9A%@r`#A'"T%!e-DKZAe"c0EpRXP8Z5C$I'%@I'$8qc9klE
JlcrJDF[,pfGe8T44*qeb4UC6&&U[!cDA0ec[(j+QNSBYj#0Xa"TS%ZfEN9XY`a[
*",X2YF*BlCEj'dDIYRkm5XU*!e&"H-BaDU3DcV5dbFXkBiSlSLT8r6eC(k[QAKN
l*i(M`0M6[m1YI)!9&c1hL*Y"-GVXiXG8,a`e)PA"$1#LHj!!4TbJlH6IT-qe50,
SpZVAb--lV(h24+CcSbTdR!,-*%3!MDM"AMcd8Q8L5FmU2G!C8r,XPNJMDHR0`'Y
UlFi,G(`jqVV&TcU28S',,I@FUYmfd)bcYMUj8i8L&(S+m15%L10NT@X*[9r@`Kj
)!IN6ZL2EDPhZ&cc!K&$Bm)"J'HV9Jf6Z4YHKJq'#Fp*JM#K%#k`dS,PP1YrL(k)
Y!`Il[MmPTB+hEZaFJ5D`YY$idiiBPSAC(G0YcKRq85mbILU!mIUHAj,`erAiCZ#
cFf%iADA4$jXXBNYq2XijG5JYQHXk"Rc9j%I1PUBr6V`amQpc-A2PD('A3&("V(c
Ae0r&9KhU8$SS8#iR9U2CDP2UA(CH0$`Sk2H'%QrSY-,PlhKQQN9rS@'#pELq"95
HMK3"%HC$&&8[D80HqZ4lJihh0UR0+ia#'(I0#4PRLp4m&,4Nf+GZ,9)PCQ0YBrK
Khj!!!UT")bBaAB8+F`mT$fXE!eVD5)(Re%VrbYND(9Ij&`c5H$FC)iQpaVdhTfP
el'HjP6lhLJVF9MrbRN*)@*aBC0(amA0NZ+6+JUB)9hK!0q8G95hHYpmSre4K[Z*
crb'Yj@)dciXMaMdkAIfPl*efJ'6Fi'%FMEMlei%3+GIdl6f,f$Qf'BR$qp3kEXi
mja!bGAZ5GFSm4d&Ncf)4*DC%rf5mBp[prfpP+VK!3CHAe`AHZ0EMR&LqKLP41MJ
Rq%RE!1VQl"6*F(Hi"PR2@Al!,Ckr6ab1)M!+c`)!aBDF"e*Vm6(f(8%QZq,eG'E
pIR[+[L2R4-SHI%[@(hI)JVda$E5B6@HQfY3,)'GAhFY3'elm'UR++NID@H--*A@
,,(,339I1TD%TC)2"5lKlr`k'VHiBIM4X(0R5R*'[frGa)2PRA5RNB6THDmN`P`c
,!al[,Q,!3X(8IV,NSSl8*`9b[#fjk*f0,)1bR,CHS9PJ82VPV60Xf8`3kLVB0ea
T(#FY0HCS(Fa@JfSq#[&DTlh)5FN)cNK#J-[BUU*iB`YKET9FCcU@G&hD'NK4&9T
ie[G"&HLB,00pEG&LMCGUpXeh%kKQ9f@fX15BrPJ+DRZmBhJNim*PIfi!rj-EFi'
6IJE,hrIHd-`6*K,G@cNG0&IPSM$4C402rS$m6!5b'Q%LCKXS4TIY,GdC2a3j*T1
5$Y-4,3bIEqNZQ6N(G+C,0raAG,YQQ)rmr@%')VmG"j`H'BhF0[)Y!MG3B[m6`GI
jrP9iXFhRKIYr@U2%-GF'T5B06d6bEade*a#C"918cIZ[[-3jM)%YFl96@"VfrU3
!4Yf([3QA1cqi)B4UI1Q@8J5FMr$`JfH&kPQB`r,!mdR)&XQJHq1,VUQcl$-`$+!
'&,al!m@efE2Yc#rqQq!0!4VrEqF-Z,#D'bb&qh$D+K!rYjbJc"Aeh1A`ii4YPq#
VLEIL`@qpi!(BmL`j(@eS5)Y'Qp(JNGC&CR$6fUr8a&Qb46DX+lhS2)"DrR0CZ9a
'eXVFaIR2F5M68H#i%5LI2bl22EPH(MiYbRm%R"AbcIIFiQU[TkA+f@T"QPrJG,h
$(ZN*Kba#6k,33E[9SD1VHQ8YT2CB&0Br[dhkMJ`SL6U4)jf`H`IfC6-Q,&1q%9j
Cd&iF)!MdER+rKH#,m+dMp2M-BID,HP91i,@5,0XZTb*TM`1UVG-dRGm*ZF)8QJN
*cDT5USS#F1SZ('h$j)amaXZ(6Yc#JE5j(iVLDj0BjD-#q@e%Uim8+kbd23FEJL2
$!ji1I$AfQX`GSFmN9[++YVeH2pPDSqR3k&-06Z5aP1*3*iCeQDGLYpj0$MprfIr
VJSV@Q[ADVm5UAe'-hUH'Q5LMJU,6qIQ)c,,YLYe*kQI#+2S$6'2DZY4BZA2"8Y3
h$!Q*(GKPEmFRk1f29m9*(Frrq1VlD!GASUp@5IKPH`a52JNP$XSEp6#H,d",ZUH
V9CbL$[%NVf1Qhpq0pSbP`&TAEJr3cX*MhLeiE51l")lGi2-0[#HkR"LVY1-(13!
XemA5IF$Ua&imNi%9'pLSC[&)U$*FKa0[Hh'HmlDFAf$kGAH`C6qiBE5+-)6)$K&
LS`AL31$q%IE#B-j5,)YMa-rY-VTMpEm*qp8k$*@`Zq0+9*RRC"'%(Vq(82&ci%*
Vc'e5cLlFq830bVEAK%RhBejY8R'J#S)858KM3BHcaaVCF,*FFhQVeEkKJ5RLhDG
GT4J+MpHT[,5ZS4#kSMFY8rVLpe5A!cI[5%%JRUaPp-C2HL,`$8ZQS-Z)Gk[K+[C
4625*eRM'KH,i@!16@STT1$D3!&!&bbI`A*IUM[hH[rZ%'IXZ@&@FUb[R`0&@kdD
9U@Z1h#*)bZ5a"&&ki2ckD1l(N!"ejTN$TZRf`(r(4$T4mZhY*E0iieXkpl6*iAK
Y1ajf3f"lmD&23(S*K+TdGC5TCQ$Z[*'2kbM!3iR'2QZZUM8%&hSQMJ)rFP,9$X&
iJl+cmNE*d$br$pKB1ZNid!CcHaLLHNUb0HZ,HdSIrMj00`f`hGSp9IK(($MTe&#
+q2PSEFm`rckA0XRS9p$BlN+@Ti1kdQ"U`H4'Cd#(fC6(YFFf1#5[pj1V1K+(bLd
hc+#-0IZ64ICKBqPqdK)hXiA6VTpCRJITAj52TZV#bmSX$,EC9ACeMYD$ThmmYB!
Ee(q9ZhShbRA("11eE"b08-"YcqA-rcf%0"@[b9HMK*++lVJC@jLqj'"#GV(mVp9
!ii,)Z'5mq!%Z@hZjlja)M-[951aaQj4qHrCc(K`i#qNb@LfMqE&dKGl-fKR8!#M
B)2R5b!D(keA2jiEK$dG`*%@RLR"1[RFqacQQ@UKiBdb"(TmYSkVbI'"HaHf9BGj
-h,4S`+`f5EjU(GH')iZ%IQ3e5!D%AY-1$4TZ&aSe48aIU2Hf@GLi+))dUXakfI1
FU4F9I(A2cphA+hY%rc(@HYaITTE)QR`FfJRr5NjA[VRP`mA9Lj,KRpZJpDb6qM8
&Nc01Vh!k*PLa9"$3`R"(dp#cf0[3CS2TQ#0JIHJT[j-lZYRB'2[ZXEUhCC'rlAe
`16K8`3ar[8S[Z(ED5&--24hmA-Q8$2"#V4`e6Tm&YKDLc@+JZDha9YlrhXDeR6p
,'r`SZqNj56,&'pcB&0UKK@D[6!$Caa&**IUDpG1Y91S[$c2J)5kkXFNCGHq[2Uc
rEY`bAiVdcfHAbB3Q"-`2L*bY'#%h[KR"EPrJ)3ZirSiD1fdR+8@8NcV2&di0eb-
bqc860b@ecVm"4efpPT3MJ)RZ%hcr42b)$r)a9Zq6fM9,#U!Iai+pcDTY0dAPr!`
hhm6M#Pra0"##59dIk(NhG6DhF$,qfT8G1"SX!EUmP84(mr6UY4pjkN6'BKl$VR$
GaRbNMm0'i92-efZUNj-dZd`iVI6FS81YD0L'qd%3D+0e4!$LSq$*8Qf'lKmZq9f
63B"I+caAf@Y1d9TU5B1c4hSXj(&E3CVrH*T4QTLp$FGMpT!!"T!!)DMYaMir@M4
Mk+dIfhq8DB1B*"*AJrkmGV!"mM(qkN%4Pm,K`h6@BV9bjLjV%-`E2QZ5V,QjU6@
MGFiAImh$T`,Udc3ldlk5f%-%02RSJ&)Kkj+iJ-r+C4j&&[cJC&mFaZhSHM3#R)N
[Q+Z[iE[jI[)5Lj8L3"I@q,SG0cN(T[a+q,@0L*LX@aVH`9AFM01&'[NSebif$9p
bkbMj5*NH2qqL-N'i5dEBlEhVJf'R5emfXd(Al6('C42)$ipAbLr#rpf(#QM)#ba
b%04Kb#XB'QR-2&$'MRk%I1j8r'm!ND)CH`[4CA*T+c*!)dmCbc$B'Trr[mENYUj
6$X-Y+&KI$b5e1%0la9,V2UE3'i"3%"Y[[EMi6ML,!VrM#T&N)X6XUSVHhH0DMNc
30dl!YJKJ8HS[D699-ql%NmQ"QfU2q3Y(c!(i2J0"mE90p$Sj"BTF@`PqSm#ed%[
NqTmqR&me"q*M`E#bMlAMb$#ADhirEB`Zr",S$S%+KSjKbe0aKiq`["Kk`Y@8'6r
0[3f9*Up3&YG!Dl+dR5hH-3&ZbqqG&"A5*FhP!%[5r1*jKf(h&T()JYTim1AP58S
0DbUdK`NMX0T`28`QebcSaAb0$%DBX0-0e1qUBL*#HqiqMHC,!M)b1`*+&aR*L2R
m2&0G3(`VX*I90@A!CLe1G@cMMJqL!LV*V"'FNN%A9(!,p5Y3SAl4e*hLFE,+er!
cSRCZ)I'rPf#0!pTYqG[()9e91"r8(HPB22%Ffe1dMiJ@9aecjm'V+FVd%pDa%P'
X[B%(%l$*F@b%YiqrIC!!C)R(GmM%c)b(H6NH([h[**0b5qQfZB'pMFaGHc,C[5e
GLP2U%3JU5SAXPi$5BlqqQ,HHLXV`fFPJ4Cje3#)NF&2VJje8M[G&-1l2#rX!-Np
f&+l+FDHUHP3U3@85XXah"pj5f@i'h)!NX3&AkQkalJh-p0[dhk8%MFk4[ZJZkM5
5H3U*Sm5N3LYqd+4Gm!-QCkerQU`h9#KLi63kI#&(r"Ef`kRQcM(Hp0-eB"'*9`l
,06SDV3J4)Lef1A9VL%N4aQ`l0`AKB'4ZdIYKrFrKpED8X!$aL(QbSAh5RKppGif
%k+5l`8MZSTTBXih0Fda'8Ij*HA!3T4dVH8S)KMi`&acHl*%Cm9V*#X)2iA-r0b+
,bT)U6eEd"&)BJR-bk4SSh-1U$B%V6ij8S5d%L!m`QC&9De#,Dqj[@9SK-A$AKjL
',1D9MacaCI2REhqRZ)!+Td#5'Q#Ph&CFYQKi0M65qY5HqVGTRdGB"+!FAJ5GTb*
!H3F,f*q0l3Rbp)i0'Lk'4ip39DpCJXd1aTfq(iJ!A1Ya"XfZIJ6@r8@Ac,!h3XN
8`jdhbDm9)4Aa,)21&$(a&!-E3YFj-MHP`VD),HA'e"44%ZP!L4%IdpUh"a5EMeV
P,D)C9ijGX(j4d26%UlJIJ#2)EZZq)H'ielre+-jh*VU@,i*qdd,DXJ923d446FN
a6FharVQU[(-!HLZ#[4ZM3kB++*l(&)S$(QkhVUaD5MY+ITq9mM!ea`qNME%DSq%
JNdel5L,!JMh2r%+*UX3K,X'mBERX)Ke'%Cir56Ve-X@E4U54!d5UM0T+ZGG2MVl
BkUh2pS9eArER%Nq`RU0fRkFKa"[#r-JB!c!X#5)ic+C3C,bA'fj,6TK)6))2jNk
lX8qXVD2,5K1T$"#FE6SeP4Vmk9UK3)rdLAJ-4*mh`$hLrR#m-D"69B`Ybk$!TFN
ckH-Y`,E(QP##cV)%KVa)X5R@)(3CG*!!d3@mCRVkjEqFSDr,)ZC`c$H[I1%Z4$Y
%&iS+C$3TY!CQ'QT8Vp53!*3(MjaAYH2rm[*XeNJb*Q2lSlA#IJla@YkB%rH+Z@"
@$KNU2!"MB)SfF(DQ4)QPl,L$@lT&bD"aAeHar*Zh![2HF'D8bJ)YV@fa[4kTfm0
-q@-X[r!!36,p#pc@[4XFhIpVN`ilR63#YXX,f)2BAf)CZH8(R%cKM#IDj`pBZR9
Ji1G6e[%MRkaCZBTLI!E(b3A3QYI,dJN34A-jj!$h4LG)(Cd)K,8XeJ+U$[,hAk-
CBE9Ac96rTqak#S`p)i88Sb3'8[6VFHLpq#c(0p*j88V[F-rjMfEANZ#`qlCV1J#
NJ*G&&@q2DN[FdjEr"H5*`B3bA)rSiVmA`6+0hm$9X*9@VBc3l$5U-DbaZEFrFU@
ccYDmI$'`D06J&4FYacSjU52QEYf-1bDrP&$90pQ@DE'F0P8Rj-lEaMR+h+U,f3N
GFE@EmdXbNVLR4MUjZDPi6TM"elJkAe(8j&h3hKq'N!!BPB%'qkLr&UGG3ReQ0`p
F!URj"dV"*DGk5fX`S(e!Ap6fC#Y!1,i)ZVPSKXYph2S(!CCP!bViD&8e-M4NXU*
4kTqf@#6&I$MYlA`mJIb8'`q#l"6a#1p(Jqic1FSAm@Xd,rRI`FD%h-P'ePqS[qa
@4f&*3`-Sk6j3Bl$C1lacPJ[9#p$k)$DiR48Xr@*K2RV"mTJeG`aG#J9rXG!#E&P
#rKZQ'0BACCB*1MSAA+&eecDclCCKYPj4hm$+3JFr+[HZf(A4PSm'p"YAmfhbaUc
'bTK0,UB&,rCfQ!r0QK3aa45KDmC(XDYjf,$Ql9L)S#TpYafT6R9Q8p&@q&Yf,A@
A&H('FN(1lA-EFKL0V0i5cX-mQZ1bd-&!3fkVdLLIj&f@#dBQ`r(STBq+4Hqc3Q#
@,5SI6*H$IQ$N01KiA$(-iQb,k@1dK)4%N!"f+,iUTadK006E(Ii4RjGj3S8iG8!
bfNp#"MmI`+pH05Yp0PM1VfR1(AHlG0pNJDh`8-lU9qK5[k#CX&IpZIFjVYL!!4T
R+[X3MSX$$*J`er-+%Q3!qS1k0(I2Fl#3!"!GB$)*eMr@qPC)kEUfbeY5PJ$PpTk
*&+Jrq2$b`p(`BNB,MZA!LaD$EkpHI4@JXa9rLhSf*3i(*9VF(SkB2LY)-r+lrGh
SVlV&$+dLP4cS9LKUr2+lKClGEQJbRkek2VDjde8f0+abKe,mjSdqMN8S-BA4lch
I)#dXC%c9@c5ZG@MCjP'2`1aL%$60TcVjMZei2!9H9bU'2VmFXHBmVjdRB"ZDG`,
KErTIZ@JkU8if2QFMARTZQ%eUKZ*rAJZNIBHUQP(TBUILNRf)c[Mef4PC#F%I(M@
k4d0&8F+[K3T#kbHIUXR+%l90U#+%qMj'H3bE@85IF0I0kDeQa`c*UN2Q9bU9M81
B')SbVUiU5HU3!!p5jpa2Mh-CSSahm+aGE$,fPLiU8#*$*-2pN!$NYXSihZk&SPU
2j!k6KX%p`H)&P)U%G0XmjXHFNk2qZ6Ij(,3(5i9RF@3qKi#Xh3rY[@TR-*!!MK6
Dr(J,0![MHi'V4HjM86G6')mYV)k#2B+3!'10LcrXj!jI2%G`mb&Mlj2#iDkiGIq
I5D6[KSIe"Y93i(p`R'e&Cb%&lkiqFrB%A"4*U()"Z"Lr$p9I$E9pCJ9XZ)'U%-+
rA+fT31jUE[a16b%9Vk)#DF0hhlb%Z)G+a(#!'PYq*`!i*,FHB#AiXKPA5"-qlDV
6RmADP"F0h`ipmQ8)AjY1pD5-YkkFarP@91bL$NA$4"bE"XVh[$@9kGFE1"&hFGS
eI`8Mr@MBFZL@mZ9NYhKIXTL(ZJU1h*dR&9dUq[8'JVY3jGiA-U-#([l(`j53!"b
E9%FKFHXUDD(PE1ZrSQZ+P3Q9#h%8R"dlp+l%,U9G285fS(Vkl%'G*!IIHR54#$1
E+1`ZEh-Kl5*5S9)N02J3cK6CY(4+9+i4A+i'aQa)A#aI+$lIcN4iU[P$dMGL3A-
kh*iYEISGp,AN+3QSd3GPdpPP%SD4DSl$%91-L[&q,J@-T)`,#Fa8mYDc(5G1N8i
qV&BQb8@*-ZVT(548G9*,!FB41p10`aMS'ZR@Y&PG@,$l+Qc)*l*-J*+[pFE3I"i
8K&9@lj'0P8LP'i9T9R$$r,e-kQYE3&mD'[d*d@%IeE5rH#b$+4FG[i#R1Uk9Kfl
EUIphb(,@Y$eRq-ICPkm"`'$LpMUU'TpX!5JMCAbm!%Mb+0EPC-S"HJp01a(l5dB
eJq)(M%Y,Y#1@,qb",Q4h&da4Zpeh$hfJk!Y4-C0q9Ib!"PFIF#H8h5K-Q6EJrSE
5mi2(kZ'fC5LIEd`SYYq@JLT&-iV36[cHRIMf)Q+BYN*##(EG$R@'`qk@Qh1)&Ml
'EVQ'5(%8UUad2i%!2Ba%K,3hE42Ve9DC!bN$c-#ad-*@q)[Y@qmIaFSGY(f5P48
cbPP3DB$iY,ZL8PRB'Ej3K,3ddHCM20h*bLF4["eLkjc0[[[,GTf(cLMfajC1@X8
Mk2(PlA$eYY)9T1[llQrMUCFBZASMm)bj0LC[A5PMKH[ahCm+,L2&IP@,qMT16Ve
jX*I@2!Pe"E3A+5HqcS2%DCb&FrD9FDi'PP8`$h1RmJDBkKU+H3rF21blFZY&Kdk
aZ5HN3U61MAIjIFCREI-f%e(k+h(Nf%iCHT)2cTN#2&jK*fcQL1IrdPfYQkJJ5&f
Lmb6[SmACUbCm6&rDX4,Gkp,jIDiLTYT`8Ci!2CjXRAYXCZ&EB'kFd%1jfUTP*k-
VBk"INhXlE)1jhmN6*UM"BS#ZYNe6X,p$qU$D2Z!fdlaPC9$3T'Xpf&YA2aT%00(
AMiB!jK-LQVp*pVX80PI3MJB$ZrPBR)i2@cmq2XYU+@+022D@$1HZDT&%+*XUS"Z
)6BfYMd@FTl"d)ZLj"FDRLDm",ICE&Al1*0RlF4V%eV"4bbNPlGS`&UCL`ZA2[[A
K2-Zd,Xbh%M'XX,!RP3Q2"lF06SSB8+@3"!%!!$d!%,5L@2HdSPMh!!%$YJ!"-Jd
!N!0b!!dm"`#3$NeKBe4ME#"548&%688!!@Xa9%9B9%0A58@"!!#!!B%!N!U!!*!
*!QX!!!%#!*!%$`"#`G6Klm3F&9#AHcaI4ZNj)ck,mGLZP-K4adD5)jSYi+l3#iN
YM&TFJ,25UG+$3U1i2@VI$e)fIF#@e&cH,F)bqLS)JIrG8Mh#PlMqk6*0,c8dRDq
5UX*VB454,R0a2SrC''MPALCdcU8MK1a#ZZ3,*X&Z5fjKa"[$AYmLJk[8,M*djHJ
ejX+&S"XQh3F`96Ge2&ZJ*q#FHV#adc&3'4"Xj6E`+XJGkBb8JZX'#IIjr[,4feP
CU2ZBI+!JMQRM',!TK&(4kB4rC#%Mib(LSk*p856"bb,"p,p0a,U1&,R-q*he8[c
4ir6b"53-dB'm")T`8NM3jZMG4ZAHT3Y9YYqfN!!!TC!%!3!!2!!3Y+*C%V5L@4-
!!6#F!!%cHJ#3!h)!$-4D!*!16@&M9'XJ8N9"4%e&!!(Th94&@&4$9dP&J3!!J!)
"!*!+J!#3#3*V!*!$r`#3"!m!3X(9#B)c4Se[0J-"fCEFXLfeQ!@$TUU)bed4'jX
Z#XFfYLkl2@%X0Td40$r@p#3*[h(-A[rE`&dqI8aGGmXC+NkJ)+'r&(%Aep2M6fN
9K5$1-4I1FJX[9K8ID4m5lpeAbXc*ZU1R[$h#G@a`'@BAAdN(eX`dV'kEb&$V0XE
TFY86R&B9fXlNqNdrGNe4ZY+(p[%lQKL%4$dZLj!!qej2&J1,SD+*YMFD+YF+!$a
KBT(La`lK!j-[ekcr$VrC5dVVLa9U[JNm[3![+@6&,&IH"$2S!'6RQ8K8Um13!&i
[6eHXrISKTbKCMe!qQZCF*3a[Z,km&j%YjX0mr$N&N3kV!!#PN!3"!!!j!!#hmlT
HYr1kAJ!"-Jd!!65i!*!$FJ!*&R`!N!j0Eh*P4QPXCA-!!H9$CQ4bF%e"3e1"!!&
!!3%!N!U!!*!*!QJ!N!26!*!%$`"#`G6)[q@+cfY@eV3X998DId(R6X*JcZiNmAN
lIJ5a*Vi80iIim#``)*N5,&0+U0D-YbkPb1NVAk'lP&TT8Vk(5NJ5r@H*I4HXX5$
'iJ"L9VB3IjSIcarI%M-!8krX2mRrBP3k`'%q@1C6VDN5e#69J01Z2)a9P&,@RL%
142-IZJlT*AaaVZ2rk4bAf(!GjaF+TZmQMrpY-A!CBkBQaY,(mGmk)j1C@Dp&[@c
bHAZ!aLR,pKQPXmScla'K8Nec6P,r*Mfr,+rFD*T+!0G`1-FKp16!TC!%!3!!1J!
3Y+*BlV5L@1i!!60k!!%ek3#3!h)!#V)D!*!19'0X)&*&384043!"AQC849K83eG
*4B%!!)!!J3#3#S!!N!N#B3#3!m8!N!32!%,"e-Lrj@rM&,rpRB1ed3p3qG(kU8-
hh@9iG1@S@m(mQSfmaNkfic"+@ADmDlijT2hF,f*e29jbrV(rd*5MRL!H*m@Hl1q
IT-q[maTc('*%LI'Ik9,CXTMfq9$F%BS,+EZDTph'4FbHKhG98E-!V9`*@dAP*cU
-Tj!!q%L2e8pkIT42QUY6i'6qhN-IeQHVGZj1QdFTDPYIbpGSS&`kSH-+&'X,b'`
BAUXpk'@&[Uk29JGASf)(5FFUKqdImaKR,G)M*49Ak+@3"!%!!$X!!,B0PNDf-`r
5!!%dZ!!"0lN!N!0b!!Z0c3#3$P4ME%*2390SC@aX!!'3!'jKC(*`9'0X6)%!N!-
"J3#3#S!!N!N#F!!!!@-!N!32!%,"e1T!eI3iD5hjjh#)@MVZJjS4ZaXHlL6YHM6
JIcAB9!*3q*!!URr@fNF&MLY3Kr%8eJc4@#p6#F(ASmDH`591HHGp%F#qI3[(I-b
Pp0Yb8kSp03DC*rI%AR9li(lBX,hG$"1V[d%0A,mj@KQ419jl8j8qa@*6cEQ9%VP
k%#CF#qT!8')&4hR(2CUXCY`H%GJR`b!83N*H(1NY!I"[,96N"0N(&$J"5(Xqhf0
'+*L1Zc,AJ!(S55k682F8+L8SLS`mZr%kXZIkqL55mNk[9,DjMJ,`U&)IYG1qh#2
UD2aYlDR19GV469J(PbNMZ-'bLNkUq@p@a)KX39EcLA#%&HQp5eCI#'N8a2mfR*5
M%VSa-2'q-6)T9"V0Q4Ji6F)cjNJd-hmETf"Ie)rMFSfB9e`3V3"Ll'a&f6!%35N
-!bc[#*Q1X(q,Rb,lI!k2Y!2J+(bGcBq#Q[ErCPN[RAkFP*E$F)3!TC!%!3!!1!!
!Y+*BDEGHL'S!!6AT!!%j)!#3!h)!#)U&!*!19'0X8fKPE'`!!55VB@4bF&4ME%b
"!*!%J3#3#S!!N!N#D3#3!rd!N!32!%,"e,BMG3r`(XarHL6)EZ[G*,efQfCCK'9
C+r`b%`d&!C`G@UCY%&H`T)biYhpj)`dl08A#NEmHZQ*kYBH`RDb[Y-ZVp32Bq*f
p46#YZM(LU`5a2TGMYi$50hj2*HfQHM!&hZl'9qmfJB56r8[IaIqMTd&p&9`$Z56
Sr5DJGil'&``6XfZQ[VrR[0R)SNDJ56Ukb31%)+BTmJbHNKDb!Li!@39*0[LpfAP
#X9*m$U'e$H2B1(9qaTJkUQ9kG)+"@JI-)#j&l)Yc@jI89NQRBZK%CjMNmDlL2pQ
%Kcqbl2$a)p,X*[BGM)iEM1L)[H-h"UCE2#[#A6)EB%92#!#PN!3"!!!l!!#dSPM
&YXf[%J!"0lN!!6Uh!*!$FJ!,EJ#3$e4ME&0dG@)ZE'PL!!(ecNe36%C$9dP&J3!
"!!#"!*!+J!#3#3*`!!!"+J#3"!m!3X(8cjHR#M,dN!!k9*@&53H)A8P"l591&NM
iU6SalEf0FaMi`c(C5)q)QrIR$iU#1LiIfGGEkXk6@lH6k2G%DkX6*3m$kPrVhS"
K`LGBp0Q'f8KNY$Vi"aYDa363TVEMP['+m#$01@@)r$JqD5f9Ur15)(A0kB!cHRN
D#38DlG,Gi8fh$3Bm0LRK[m8V9)Rl[&)r-fS8(EP1i,J6G'LIh+d&Cel3*6fV(!U
@I2@BSl+)Kq4%(i,1U(BdMAZ-V+Ja8`AVBk'NJAI%Z$&*'RjPb6*(LK-bGiK)L%)
jA'6`rT[C@!Yb+rdCV8'8Tj'+(aA@aL5"-"HHlV@X41(b$aS`LLX6(GY1LZ2P60i
JHaT4P&"LiiMihV6[mSPKXZcVYBFT%T'R91`KP*CAK3#PN!3"!!""!!#dSPM'YXf
[%3!"15!!!6aH!*!$FJ!4YQX!N!j8Bfa6G(9L3dC00MK,,QaTBJ!"53j08%a'3eG
*4B%!!3!"J3#3#S!!N!N#I!!!!63!N!32!%,"e+,![h)qbU0mY'rPE4P%[M#VY9r
F-(L-*Jm@T%0[021C6,PVrIHFH8L&'klF`MQQr"ej-9j,Q2+-I(E@dbBF[rQTKI(
r"1!6I[QVNQr6C3EHX+e)dTQ6JViN9hmM*N8)43f[%C[2V-PFDSK#pDq'I99ZrfZ
reMhNF%i4q"BYSq(L&Sh`qJk&am#)aJ30r&Q3!,RqJa''mj@kdZFB`$E3BQ*-Q)N
056HYUCS#K),@rU4q`2)$e-M6rT'G`ZhA,ic`PLM8[$rSUT2HU2+!5iGh&f8NNQM
db0JHNRK6I#%DD,6T'QC8lY00L2(-YlA@q#FaFY%V%C%Gm&rbZ,GNU2H%&"9HIZR
qLGl5d(KY@5'Q([0Z!P+%,LAJJPVfJqb&5a3hHb4hMm$38j24eAPZE4p$jbM)f+@
3"!%!!$N!%,5L@3Uf"p-B!!%kY`!"2F!!N!0b!!P2+`#3$P4V)&*&384043!"EVj
849K83eG*4B%!!)!"!3#3#S!!N!N#A`#3!rF!N!32!%,"e1([a"a!90#m(aM@(JI
0'p4kS2QXP1Uad9h&Ih#`('`fMCC[F2`m-LaT3mTm#Xb-5F'@5TL%&3,'CI)pCXU
6eiLe)Xk*',"8j+(l%eR[R!"3ZVPNi(4&4%H#5K+NUhSq"UJ5cUH&)h!-&+b*@A1
1,#S*kal9'm@LldlQeUQ"L3ll[N0a@i6I,m41pa,)%,%'pmlTH[jSHi%IC$b-02S
F@i%'[@dbV%S01PM3GRE#pB&qKI1"2@9GLlLH1-SQep0(#+DI3kL$3!34ZChSrqa
RrfPq,GLm2!Nl&#@apL0SEV+p&XMRM!#aK44UU2li4',@!m@P+i#PN!3"!!!k!!#
dSPM)YJI6'!!"2&i!!6p0!*!$FJ!+`iS!N!j8De0dG@)ZE'PL!!&#'de36%C$9dP
&J3!"!!%"!*!+J!#3#3*Y!!!")3#3"!m!3X(8SX#rB"kE%iB!NH2C#%A*91[YrYe
aBEM(9i2YcJQi`8)--LLl@)Z"frH20B8I@+-Sb`Eqp!B(LA%#ZQ*'PY[h`paldeN
IiRI9Eqd(ji0)aHLX'3@HkNmjZITRUUS&Hpf6,*dDE4E*-D9jI(,ND@TV$PG#`(J
4jaZX61GiPM4m6*0j4)YEBbjU*c6-VR&VV,*@-"I`6RFVcT)H4N#ZF[2i&%eNDFY
SV*D*G[%af5mUT!dqA4BA2+"S[m(e`LalK*+fU,R%GdhEh"i+UIciPprY+`B2'+(
-Hp6UYYpC,"bT430M3jXF&lEBMr&H&F5i`c)MbI1)q"R2@LBU18$NSrjV#e1R[E,
9Y[m#5)p#Ycf%%*)B!lPL0dIGlZkDVA[eJ+@3"!%!!%!!!,5L@-Lf"p-B!!%p`!!
"3+i!N!0b!"#Z%`#3$P4V8h4eBN0'66Bi5bjXD@)!!F@d69"-4N0A58@"!!%!!J%
!N!U!!*!*!RN!N!2[!*!%$`"#`G5qG)Cm%1+GZYq#h8k9FmEV@)kHD4*Q+G"f@c!
j-4f(T$R@fC1(9LUG#RQpKRLZ2NTCjN2Q2hG-TV@3!2iE0CRB`E@`!ANIpi'@%'P
"LBSV+,QkQm"M-&ZR5IE'-A&35CkfQ%IR"32,EBFe)CZILl*QFb5phS"XqcGRVVI
2BRG,A#e+I*5E9c*%IL%cCD3qX84G&%NU-C!!rHD3!0jdd!F9Mk#029Nr)CbK2rR
G$!bP`C`rRTQA*608,J2a%lpf(Vb"q"lAp,mE8@ZTBS(`!YYD`Vj&rpH2I%C6'(5
EN!$rr85Ij6TIN!"Ke6*6pCAH2U@!TC!%!3!!43"!Y#NHZEFB,'X!!6p0!!&-P!#
3!h)!&3Jp!!&"&`!!&43!!!Yp!!G8EfpX)%0[E@eKEQ3J6'&ZCh9KCf8!!2aT!8-
!&J)G!BN"`!$!!C!$$J"m!&l,3!!!J!#3"k@3"!%!!$B!!,Ea4+5h'"-G!!&!VJ!
"3M)!!8#Z!!EZ0J#3$R4ME$JZ-`!"bhjQC(*`68&$8i!!XZ#bB3#3#S!!N!N#1!#
3!l-!N!32!%,"e)Te"KF)UhGHj!L6JRi($Q#AdRb!j6ei1jJ1"-iHX+K9iYPmV1J
dR"@!0%lcD2Hf3!B6URT@"(Zi(+d"8!NB32Z`4ci"8jEr)+-J%lTUja(I1Ra84I&
Hc4&jHEq*LbQA#@232"EU1RlaC%T0'0HFC"16#[M'4mfb[GP'KrmqYEp6JYL`UCj
aJcSG-VlSC&LJPLQpac4jkq(b-6JhVi9E05RI10LPTY86N8QJkK(8h6B!TC!%!3!
!1`!!Y+*C@EIcfj`!!8%A!!&%F3!"3+i!#lH1!*!19'0X1#ic,R0SE')!!4"jFfK
XBP4ME%b!!,*JXQ%!N!U!!*!*!di!!!(5!*!%$`"#`G5[3#BJNdpSre-mQL[62@M
PrN-SIN-EYjjEZ*YV6IBAaB!6i@FD@EmAm&feLYCD+(C%(@#-Y9K*F@j1e`lE0qL
`cmK$A6kSKmHb*ir-h8XY0I6FBQ5CUX1j6qHm*A+c'$6Tdr42hFUVPL&%(pEdlX9
ChYphV"5*Kr0L!D'+J$EDMei3f+S%F8pcR$NIPS6P#183YiqpRr,aZGlR'GE&HTQ
X!H)MRkD#-@hLY*!!j@eCb(mNRQhFaRQH1("G,UZ0@j+QiY&5"NMJ&34kj,5-&**
hBh&l`41FZX%0b-%(p4b"AqeADr"31j8B8@BFAVeYFPM''lkYj3*+"+bK"%*qp2(
D9q&0N5EYcYi$@BE"6p`S0)(U@VIMp-NH,)6KUjVm%-!i0KI95j%$6G642+jC44D
pD86dmN`'@&0%+3@!&mII'hqY1fZAmc4f[kB+0P[c5jY+h94JYB12PRqb'$K-9N`
c(qLZeZ+0XQR*SRl4UH1VBZMBfMV3+lrU&DfTYU,QMJ5#T$Z*Q,reI)milCQ5JX8
FZAXMM!p$DDRa(0MiPJ9pN!$YNFV6`YjP,$AMMAhjIVJB65)B&V9"+"-8Yj04$hk
(p$4q5@&EYC'UL028a0Q6-!#PN!3"!!""!!#f$CEIYr2ET3!"3M)!!8BJ!!&!VJ!
4l-3!N!j8Bf`i,M0$4Ndf1%XZFfKXBJ!"mrCcD'aL9'0X6)!!XU#bB3#3#S!!N!N
$@J!!!6`!N!32!%,"e,`&BLkT'Q4f,&Ir"DZRZTG-C'&Q@#XV2M$[mRcAq@U4k82
cV9mdTQ-(Q`*8k0i#2QqpaI*Ipe6Nc,8iT)aATPAEl*U)1UXi'Y'9cRAZYRjjUSL
jcZ"G[b60qh@lVk$r*X8RHpQ5BZH3!%%"`,ZSebhLZmQAhe!S9%J8M)0%ebq&S6B
JV3#'DU[C*%Ha,VZ`U3B`MjLP5T%J#"%-EKY3`2DUET9,V8kRj820j*j8QkN3Mef
NUEQSiMTbPhbG23#Q2Njdj3NY4IHM6lhb28rcP$-)P*0)h8l(2(VVF,$I"6bGRDD
#5`1'hYN8-bKpdrq*X'iM3D0@S4V$mkfE4*[Bd5U0i1[K3a`kec!qe,K2k[QN2EE
V)V@fkm@!m,%iHaPjqhVV"KGCCJPPRD&h#[[)+kYB4HKrehG9!i8!TC!%!3!!3`!
!YJf@dEIcfk-!!84a!!&(kJ!"3+i!%pk#!*!19'0XBA"`E'9cBh*TF(3ZFfKXBJ!
"0GYcD'aL9'0X6)!!XQ#cB3#3#S!!N!N$AJ!!!98!N!32!%,"e4h[%mI(UTDJjb`
`'aE1+l$RrD`,Ch5H60II2`+lI)3ME(b%hb,KHY)LY!Gk")!HJamC#9""T4IbELd
9k,-6%4dMUUr`DqTdNbH#`a+I)HcY2D,cNMiMT1YL,e2NDMK9B&BN#R58$K`5"86
bQB@CP3pR(bD`FKa"a#CphSp[-CKF%5Dh6eVk5RGYS%*Am$@8$p$L@h-J`*N*#`%
5pSjQ3CPXPq,5IV[6X6XrIfhTRQ0UmG0ZT,jd1(IS4++81k(pr&HZP#T*9D-+TpR
MSZKCerBR[ePH`0YM[JBc8qN'BkBc@eIqcHS6(*di$$G4,CX8i#pVe(-PE$LQGFH
QQf11@*p"BrXBmI2`r'*TZYc6I&AZpa3fdIkE6pcqjbV9mBV9N6Vcd&MjLN&c$V#
!P[dA8m$JN5V$e$8Z6P,F%Qj)i(9@l2d1LRCKF,C*AkF$YF[9A,`!TC!%!3!!03!
!Y[&%V,FB%bJ!!8BJ!!&*!`!"3+i!"I#Q!*!1G'Xi,M-!!De3CQ4bF%e"3e1!!,,
JXZ%!N!U!!*!*!M3!N!1b!*!%$`"#`G5+G3B@p3ZRAZ3)Ni*q"`jJLGTbDLGT"D%
2DN#TUTYm)5FM2&H-$@kMUk&V)pm!'b`hVf`qqZ4"hf*U990HckVl#h1GAlPMYd!
$!G!PXU!k'lP(p2S9Fpri9GA-Hp$YA)hi&XK+AF(B90)*I6X@$3bIQi#cYBB(Xd0
,Q2Mqf5H1"X&8EUJmLrYp+Xm$rGk'`Qa-qZ@a"PS1qXXV!@lU"ic)G%jmM,"c)%M
,43RE2+,!TC!%!3!!1J!!YJf@cEIcfk)!!8IU!!&+`!!"3+i!#ZD-!*!19'Xi,M-
ZFfKXBJ!"iYYcD'aL9'0X6)!!XQ#bi3#3#S!!N!N$5`!!!9%!N!32!%,"e-qAT`D
B68YMi99hNl&XmQ1!GRKm!0@ccSq[95G$TD*G)1TKYY"M"8hS61K[2pZ#@hpJ[+4
!3LDamKZ2cb,2"IN!dAe8a%AHUcCSG-%YK*IVXM%$rR4UL(VXJQca!V&p)I6miH&
)$GLp#IViLIJ`jEQdp@[VdTT@[efRRAKVMIfhUKD+E*bmIG5*([Lr*Ame@3Z`@dR
)f)LKDZXf9PIadD@F"+FA1V26GAdmD#d9[5E$jYZ4XeaNlkI!mNmRhCBD@(kd$Y2
DCBVc[Dej$HheSahPVebhIG))80!6N5ZZYH)PUFrl0GEShTP6(GjpD1U9pE'3!)B
J$eQD%k!Qm0fi9CkK1J@@JcmGIEJ[YilQAi[IjQXXdUCY'mQDSAYXVDr"5Q!qc(F
8h)h+$KlpGM+0+N#edV18"hFQlZG4hk1'&!i%a-cG5!X"*8!TFZVEBEi!TC!%!3!
!3!!!YJf@iEIcfkF!!8N$!!&-C!!"3+i!%&2#!*!19'Xi,M0$4Ndf1%XZFfKXBJ!
"D50cD'aL9'0X6)!!XU#bi3#3#S!!N!N$9`!!!6)!N!32!%,"e*AlJFE+`Z!2eN$
BTh@G'ZkK0*5qkYMlGMDQD"CNGBpr0cF6jZ-41rYB,V&Z+VI)1r)%Fm&G+(KUYiD
Q#ED6(AQmGK+5G'a%4H,b"Y8&9G2Cr,e[AEMN#)G9eHhal&V25LNKIJNKa1EliSK
kk4GIbEbcA%[5hiL"EH3r+T'$L(5544I)PK21Am'I-EHlYVI-Pq&Y,F`QP0IYX8$
,CPEr#'B&#DF#Sh$f6QHX)eCGS4*eFjc-(`A-Mh,DC2dCp#pPQe-2EIkS4@I`cZY
mj5H4K$HdQlBdpDi*pJ02)KEHIT4R%h45c`qGAB0J"6lb'+E4kDXr6Nj"9KG(I$5
J!$6Va58er'h(bd[ZhE@'UP5KN!$3bQ8CSLjMc9HQ9c@5V'#@QD54CMB!VCrFbS(
$[U)+ES#PN!3"!!!`!%!!N!N"5X!!N!8"3+i!!1D)rj!%!*!+TC!%!3!!2!!!YM-
[3EHRCc%!!8#Z!!&0d3#3!h)!$+r+!*!19fPNCf9d)%4PE@pc!!(VVf&NFR"A5A0
)J3!!3!)"!*!+J!#3#3*a!*!$c`#3"!m!3X(8b,rPG'Fi0r!LE[L+p)6`q*j![ME
(l%m2YUR@$RXU%9mHb1*hbdh$E0)1c0hNa)[Ndcp[!@CFm"ri@HpNdDFRqcN9%r-
c$9'lp`LMD22HKk1RN!$)U*T!qmiE43(bhGerLXMh'Z)`h+U'&eNq4&b8IF3KKl$
EQF46j!hph0LYFed*AB*!ILR3pa5mY)%j3pec@,r&U#!h!i[ZBemCJL8QGEX'd($
TC2HeT@Ap81"FZf)5M`j$'B-(6LcfdYDb%@*C"rGCiDDZ&*Uc0hqS!+@3"!%!!$3
!!,Bc$rZf-`rl!!&-P!!"6eF!N!0b!!6lfJ#3$PGTFfJ!!EqYB@4bF&G*FdL"!*!
$!3%!N!U!!*!*!cm!!!%J!*!%$`"#`G4bU+)k@J(Cc`,V9jKa0pR'Ld6)@a0ZjQL
0"H#YX4j2+RN3)*j&1$P006BmfiDBcRCl6qr1S)ja+rU#DrTaai(00EeN,&&KcrK
#f8+@4!F&!AccCXq@5*@8$rL88bEapr[I[23H&GeehG&'Ld8p9JYPd1rPRJHcTD&
9NK0i[*LLQea6,1V@[rj4fMEhDjKc#a-(LkGNHk+!BZLXM!DG3Z&3kX'RcaB6J8E
bb1((GIqikd*U`'M$k`+S0[&$S0Hr&J38eMGJaP"m[$DaJ1![1HD,Mfr!"bI2CRM
(S0,%PZY#5P-[)8ANh#TLl!8&C*V'4rHFiN,j9jB$8`Af8!FYPp9a0,je*4V$jYc
-ccdKeDi(aRpVhCrHVF-KaVH-Q!#PN!3"!!!`!%!!N!N"6G%!N!Gb!!!@FIq3"!#
3#N8l!!!"!!!"Pi!!!CD!!!!&5`#3m``!)!!)!+)"(!#!998!N!--!#J!+!#Z!8i
!Y999!*!$$!!J!!J!SJ%F!)*993#3!``!BJ#5!2!"Q!#&998!N!--!%B!TJ#k!GB
!KP99!*!$$!!S!#J!G3%m!)G993#3!`i!+!!S!-)"T!#)998S#J#3!``!+!!S!*3
"%J)!998!N!--!#J!+!#0!4F#!999!*!$$!!S!#J!YJ%F"!&993#3!eS!!3#3"9d
!F!"a!+`%!Np,!*!(5J"9!41)1P0[FR*j,L!J5@jcG'&XE'&dD@pZ)'0KEL"[EQa
j)'*P)("PFQC[FQePC#"[EL")4P-JGQpXG@ePFbi!N!0D!!%!N!9G!(!!F3#X"!*
25`#3"dS!93%6L$T8D'8JCQPXC5$5AM$6)'eKH5"LC5"NB@eKCf9N,L!J8'aPBA0
P)(9cC5"TG#"hDA4S)'0KGA4TEfiZ!*!$8J!"!*!&E3"Q!)%!SJ3#6dX!N!8%!%J
!C`%$L$*6Eh*bH5`JBR9d)'%JC'PcDb"bC@aKG'9N)'9bFQpb)#KH-#NJD'&c)'p
MBh9bFQ9N,J#3!he"4%05!`!!IJe6#T1%!D0Y!1`,FJ1dXM)V+q0E6GjElfVhTQi
Qei!a!%!$!*!$ZV8-J!!*D5Vqi!&9%Lcl5XKE$Z2PFlU&8Bkb2mq2rkiJ16HX'[J
4bSBeHBCLSfGVm+aH2`AZl![!X+N')MK-9ckpkmZYSaN$a4aC5aXi#`#3!d`!!J#
3"6%!C`"&!+d%"&&eDA3!N!8+!&!!(!%3L"T9EP0dG@CQD@jR)(GKFb"cG@0MCA0
cCR9X)3#3"3J!$J!S!#kJ!J!"!*!$e%&%3e)$!!%5$9-+Qb3!1iU)LKA2&Y"cV%4
X%28X2hmrl0HG[qIZcJbR@0KK*5TBK999BZ@rm35aUJ8,XQ8l6L$jN!!I!93NQ2S
e[)@RhFACh8h5b(U5[AdI,N2FaCI(T3X@qBdi9dq9p3XN2%U1NN'qk(5em(4U&CS
L2JAQ6XFXGBZPFi&Plh`8(,JebXbQG8"2"b%-6&H8@CbY`EYPFb)Ah(i-H"r`2%#
L6q-DV)Mdc!mhH5K3fic)FDZRR-9M@e'jc-h@kB'VP$IIbIX-kIp8rmPY!*!%EJ!
"!*!&D!"k!(`!YJ3#6dX!N!G)!&i"*BK18fpYC5"TG'9YFb"hCA*P)(0VDA"`C@3
JBQ9MBA9cC5"dD'9j)'&bC5"ZEh3JFh9`F'pbG'9N)'*j)(4SDA-JFf9XCLePH(4
bB@0dEh)Z!*!$U8&%3e)$!!#f$9-+S`)#lq3%RIe6X3r20R[6fe4df-HFLZM8#BT
kGR2ZaZNi%!m91faR93P@9C!$)GjY%k[k!3Z5$f#*[rQ3!!&qbQ3heb8D6Gbbc@3
d6L&F`k&$E$C0a1d64BTRk$3aJ6Tr03C62XCMTU55r6cp+&$rDmb$1ckA3(pH"Ej
QpH*A)Cjm5p[plRC3rBR6-dfULZ8aBdPB,[3#NbC"%QmI(D`#!*!$1J!"!*!&8!"
C!'3!N`3#6dX!N!8$!%3!5!$SL"P8D'Pc)'&bBfKTGQ8JDA-JC'&YB@GPC#iJ!*!
%5!!"!*!&4`"D!&X!P!3#6dX!N!8#!%8!-3$SL#GCEh8JD'&fC5"PER4PFQ9N)'&
Z)'PZBfpbFQ9MG#"`BA0cGfpbC#i!N!35!*!,RJ&H3!)$k!#3!h`!!3#3"@N!B`"
p!*m%!Np,!*!(23"J!21)A&4SCA*P)'Pc)'j[G#"PEQpeCfJJFQp[E5"[EL$5AM$
6)(4[)'0[ER4TER9P)&9Z8h4eCQCTEQFZ)#""EL"KC'4TG'P[EQ&X)&ia)'*jG'9
c)'&bC5"ZC@9NC@3Z!*!$(J"Z!)B!hJ(N!!8!N!J""3C6G'&dGA-!N!BB!$3!&!$
5!A)!!3%!!3#3"32S!*!$P!!!!4p"4%05!`!%jJe6#Z3L!0pf!ijaTdl&mUcH4,(
Q2,#(q+cH9#bRS)Kh8fIe-m%!(3BLcP*d9JmlV2,rhrHH(0lClA4B!JZJSh!C1CS
EIBc9-`eYXf"Ff#fYQQ'1,jP&KSEYjm6pGcSAFZkN#TXV,[2qG)1bS4Qe!@`Z(5a
UJ)P9k@!e1(J5!34(NB2(LB1,(03eclf$l3L`iF+X%J6F'S0JXl6il#@GkD58+,c
`852HDVRR[`kmdL4l)`0+SX-VH`PN#LR5[Prekb$B0H1"HRlSb-b0H$[Lm'Y,QFJ
8JNX+D&I&*,8a6r(j0cd$)jiaM1pda%d1,6c8J$XCIc6R(cVq1QXMZ3b5Gj+JfBF
@rQV*&dhfI-"IFkGepNBLP"U2&J!!"`T"4%05!`!-+!jG#kb#*$lU$0r[lMJ*S8U
(8"UT8H%%4d"jA`GQmk$CJS396f3i9T6&AQdmXj+5fTjY@'XlmI[U3fJYC+e#"@Y
1,T!!K!PlLpp[GI`qaIAlb-+J@E@NcZ`ZY40E&*)`,mQbT%Z&%0,h1lh[a1,DFq[
h"`hRjc3a!53d)c8I4Z31T3kNrfV)cfB)`E"CDAMH[$jm`EhR45H,`KpKrA+I2!T
f$"FqLC@*(Uk$BF5(K)QYSFSSU$L!H&mN#)-cK1H"L2N3'6Y3bQk`+kPpM0MZ-2d
6L91I[hfmJIfmqZj`[2rfCi2MVZ)rfm!hBF98HDNqhlQ5[@NNcfG2*mq%PCmZKV,
&30d!E*Nmi2Q&q#FhMHQ&iZQ(CmB$c0lDEFAR$E![5(&K*XlcR3X3E(iK'iRPNJX
TImKA*!1$VCElqHr0a$19pHPi+$+FZc'b1,MT+Rp6+f*P&2i&IAXASS&Qpm)&fid
25YMA+1a'aNrQF4)CK$q*5pXH#[M1AJ-[LK(UcI!caDX#EP'['B8h-8FL$H-6mEP
R95lQe8qIR"PbRq3q(YjYi"ZANZ1jBMC9PTiVG[LPV9qF6mUqf[2ET56hblPYb`4
m9-'[H#Ml5L@m(VN@JXa3(i0EGcYL"VkdEc`jqF2jd'TjlVNC61[pUBTqkSG4q!r
mV"@`ANGK&a)L9,bFRJ5"$N)bpqJ#(85Ld!fVi'+bQ1GP-EFSLrU2C"(RC#%S9*4
31)3++GbQkN@U9+AE!dqcj23V-9P'qjbm,*QrjKKC5UrRNV*FIVhRX5aVhSRZ-M!
rVM!`T6pd',c)l(!B")hq4$$i)$I9+Kr'#rIqa)0Dkr$Lb&p@l["+'bE$-%Q'b60
-ULlC"Vr"@f`@"MiYi[LiX![AZcA8ThZaI%12UYeN6B'P4p5ATP%rD,851XZ(kJU
Z6'pJ5@mji#J9,PpBZk!f(&dc)qPZH0'%I+L9f$k)`3lDeXb08lTE`%P!9MEJqaD
hPZkP#!kD[U)#mG$A3$*(lA!13(#D)QUEh4a$,E6LNG%-lKP!X'+-ELY"0'I'6Jr
KeNV6Ij-2N6!$$Ym4V`l4(1Rl9r5$CE9*V-L-L+3pUQA8MGSqf*T$B3djmSU(YIL
q*'jjFekp$jY9ElbKfi6qi85e!p9IHmc5Hi*F6*QNUPbr,TXUZAM43D@H"Q1[rmT
"2-Lq3$Id&S%1jP1LFc(Q9)HTSi+MrcmB(H,A`i*6CHpGqFI*(D23QV[h2p!+qJ1
1M5Z&rKV5e(CS&-LR+'aJe+Qqp2h-p+%2"4r1LL"8,9hPrV*2lH[lP(,eBX!TI)h
dhLRYc"ae)ZZGfR'!D"DIQp@1$DY!$J"aIi2HNGPT"3[D"S"RMc@E3FN%6JpTYpf
[1*'MS-AT*L-ZRqS9UAD4HJfRf(X@lFrZbj!!N@R,5i0fYq,UqmTRm%&Je0j#m`0
hM4-CbTc9()i0peQfHDbT636,Y%h%%Sb8NX1Np@B0ikJ*FG,aeNF1$2Q6b(,3[S)
kTm,G'GXSqML[d*a5S#"qId[pqdKV9eU)B94!(J2dAK-XV(!lp!IDJf%UKZ'Hj#)
"AZ)JPJJ"`)MrZD[R32$hlJfHEfbd9EfhqZ6T4*rrrHq1rjlpMQ[r6ApehT20I,2
TBQbp)Nj$mlikI0FRmGHdE-LBA&)hTFM)GZR0h()ifF)r+SDb+5D4N!#$ep8pZFA
e50ULL115&"&q*h(4j,I4&Yl1K"jP'-Xq8r"fAjf8U*3N[`lR!!pd5&`ZH4U#AbU
'fK9QGYi8h2DiVTC[l,(P8kYM6j2pUVmR%Zq9dTdGirkJje)TP+L1jKYS5KJ8fZ!
X6P-q`q*1kqi25[iC&%Ca(9$qfU+#mcc8'P@"3p@(V(AqKU)-M#ZarpR4bl13!'Q
i*Fl685e5iNaZTXl4J)NlYXZ6q@FZjNIjl40Y9ip8pq`XAliK6qbBEade`DPLBc!
BbSBh+iemhE[5V9NMeaJF-Fhbf-+2QJr+,aIp`@$Y0K&qFN[5IQlNr-%Kdj52,I)
C&LJE+Xl1dlJ*b9p*fB"TqVI'eF'VYL%T[qQDM3BEQ,D%p+aa1cFN"8aP!6lB51%
[a#Sb-!L%[ES5RTL%8r,q#l4F!%CXlE"%VqYXchi3AE6pX%a!J,M#G,NQdlBaJQ3
B-ZbK26DkBBC`biFRiYa(Mqp'SThr!iMKH#KMQL'*3Pq292plheIrM8Th)pLj5EB
VYED$YlQUc*k*pEIY*LU3!2h-Z$3ElGTaXkPpNaL9aCC+[ZGD+#5%XiC8RA'*JiY
I%B95k6m"PG0U3L[KP%aGST6#m)%)4bRZ"bf9LCar-F6S3P95kYKBpD[eb4&29fQ
b8$e''VK(eFIjY[abU#Qm(,-QcB&H"JQNM8!a'UT%(,Sffi%+Xm+#`8*DS4[UbYF
rIQXL&[Hp!!!"Y8&%3e)$!!,)$98,P+,%l'%%6fI9hG8KK#TVE3N-Q,3F5@6!j!5
S-MQC5!B")YqKT#8IN`iP0aaj4AiQbCRmE@$"0Yj1RfPhKB4*-K2C*!h)*pZcBqi
Y3rcNHikZZ@16JTYM[DbS%!2Y$2J5,dk3!$a4j*!!l(JkrRhpM1h!i,9"F,Lm2$i
Haj!!GR6dr"bSXeJ0,5klPS2N$lpFhZ"LfR*Tm$`jcj`A2'pjDdUD,e(Aq8A)h*D
S*"k!q[rmh[,1DD4iS8D0NMVk&2$A0@ikiqNk,I%ki0iRDDcZjklVJ@m@h+URcc)
PUA[Vqkk%$qUGTVa8%C85rTdiRP1pDFkU'96Icb!ZAZrKjD*NJ`BULMIeM*Jce!q
TH[Vf+*a56Y)@m!hC9X2,ic[H$YbNURj4`V3pV`E@q2qV0%8LmbGHhh#SUR[SES!
XCKB14DcA$CYUpi"+Lq)5-P*q8XR%"jaAG49Q3P`Qp*+$Y5N`1bZD36AC19qB#`E
$0U%8NP#CE2EU39RCCN@*i5`kKBi6MZS8p8203jaCI*lQ0B8#KVi@GBD`3LZ-'rr
!JQK"Jf8,44+h(j'i,rDm$mj(!!!"Y8&%3e)$!!,d$98,h,,!V3m%*bHdICbfbLe
Fk&A8ka+IfckUi[jp4HX1LJYe1mDP$K#Aip@ViEKIhECY(k!9)5rI5h+a8A(E"`[
V-3TF*'@dADrmPp,k3UpSbrd*p580Fl3r'j6@3[Dpm8'ZDT!!DSFB&c0GA*pH["p
!'VA"SZAkqZ&KZkeGYK%E0UH0,m)rRDH[hrc(M9,MjjVG*h0QI"2pDrb2NVYD"DC
J'h"8!5Nq!PJCG!"1*XSZ*NkCXT3`@L[8!U81Va#S"FF*Q"AT&F04!31&UCk2IN6
QaM)A#5YGV8,E(p2"`UFN3Y,fViVrHZYN5Xc*'J(T%PQrI(52,Uc)#(rVm5kV-5H
TCAGIiTXI6q*ci5*0e6mREq*bqr4l51GXmGFP(Ym5FXjhP9',lp"l4Uk8La0r'rV
VGrimaNGiSQKECSGIHqp3A1pp[,b(JQDCm%"S`FG)8QMGqf%ANc4F9(%66V8RYGi
[G3L+9!AQ$X@hk##B'RK$-QYRC'$DeC!!+1BT%&+HTh!4hC!!'KaQ-Ckl&Z'!TmL
DUB0j+4ENcMkMK+a))HmE(rH)EAH)@CQ3!2CFlI%8!J!!!BT"4%05!`!#Y!e9#j`
8aI94!0mNH8NDejTXll9CVF"r6Th+90rTHeCq&GJ+[!TX"3#q9SffYEQjEqk5GGF
+$"2C%3-j%-eA"ZIhc2'6(lNrGdrX5RCcE(mE+%ILk9RiqRhe!Z5,SM15ch`Grll
p(9GNV`dLYmqa@6)fpjiTl0-[c6Xd+Me[@V()DAEKh21Y#UNqU@Ra5mjF6fS8(U(
kIrlSqC5N-M`S9@U8K9kb[Y[U+J1ZCC&*ekblPqK8fl!X$ATFZ"DR@m`PY'PVbb3
IaC-8ZdQ%a#6r,Yc2&&Fa%c&!V3d!9MZ$9iYK#JXN"(GTV)9c8ZrPD-'j@)Pq9'r
N4@JI`"k$j%M3Z[)a8BYS%kSJLrD&$fq!LF&ZKA5UKXGB216r3mG1lL"BY8BUb#K
fN!!!M9A(4e4N#2B(25`c,4Qj6`M-LR[bN5S3,)YFLP13!*KeF(&!1ShC3+&i$`Y
SficAp!VDL6U1dX*Y(VB3#TMRDT8""j9(BGhq$aK8c4BFHKK5Z2k-a1[iY@Yf0!)
!!!3c384$8J-!"RF093e$)K)4jPjZ%'3Y'84UmN3N#a"CUkBQ*lFpLicJGZI)5EF
c8r+CIhHrlpZ+2"[Ic,He3*,9cZc*j%RB[MZ6%C,P9Z5*V-M[(j%rNjr*[0R@GK&
*&K1b0bh*)LK!iJIr6PQ'N94%1+J,1hML*hBK,0+!l9$&S4Cf%PiIcijT$+G2[eN
UFK-MbHfpC'm6p0EIcBDF5mJT4aqj[p)@X[AQGIR'*!P,+@RBhU3A&C159eN[%2c
JbH(#&ajm5X-QD0&L4-VGcEkQ`r)XP,P*,SMR)FNFrFAJLaU$lM`9cA8P820dQ"q
1j-RJ+KhQ[L68+ciKBT!!RHr$(BZ5%%MI@aB0YUmG+cH9Fc#*FlDI2+6+KXfGMlq
i[`EXLf[bq5DTS"GBJ&RSpE(k4UNSE)5VZ#(4a%4T(NC4T5D'+#Hca)G5#DG%eC'
a54-U)Z$aJ`C3q')!Y4*YQG#!*634DR+,6CR$@+QN(kF-V(@SLpVJf!+P0U0c9&M
$',E[r55!`Li$a$PLQ,KZKIc2X5Gal+,YACH#6FZ"UHV$eS-Ujc5-Gh6@aB"d'i-
,eVDeLc'L6-mKjM,F%r*FlYZBmf)r3FhBZqB8*mKFDkBmH&M*CEjpUU5NcqMUMHZ
l,G$)FrP&YX*lJ%6&V")5fb&&5#AJ#$hRCZLJ)NBKdc[fS@lc&8+41k84G`VH8bA
IPL!j2GVYU6-RjVbF3lRZ&DPJc0[DAFTb'rRhYdi*$'iYhrbA$q+6*eD"#2hXL3&
E#6aS*Xkh8XD5XZL!8d`D3&(YeTiH)j,QXMTfCIrBQ',QaYKL5NVMZKb[jqBq*1K
-Xm!cl6p*FZL0,qj368Vlrpap[%LPH%SI@AC!''TAaj91(AL#-@"3aPPimHVhYlZ
RfC3AeqX$cDJ8$@fJmqd&j*@%XYf`G)B2KUU3!"Si!i4'pV`UFE3TZ%Vi1,Y29L@
qKkdk$`8SRBhC9E-k+AX1V!#*JeYF)Z3(X`,GA!A9[Q0'IDaq[E"flB1d$rZ$9ep
p#4ZUUbq"F")bcdZiN!#&AS+9c([M)*1*kmMQF"*$DeK5eBS,0G(8$DlUGG,@)I*
P,r@PJf6iV!k3!+U,`iQMEf'*D&FHY3@1%H!C2CVf%Lk!`1`-EZQV3EfDc)k)alY
-h[lIZ!qhTr,*MDZ6TKGp,[+bNp-`jPQCpEJ64GUkaD!DXF'80&)2BbYeEc[GB!T
TEhMfk&f2mYQTP@l1bb2j`E4mDbafS5aG4rV(QBS,DAF-pIPCbZIRk[pq5'N+mhp
AIXl%CM(qp[IPf*a9Cbj2D@i@qUC8h'a@H[,JJMDNfrH5e-ha@AMdST,jr-qAljL
($06eY9h'+bI[Gal`F%%Abe@eJpQRlELVUi0e"4+H`Fl,5pZHa$lSC'#l'ZAeThN
#F3DQm&#m#9iTh-1AH$!(GljqYG"C`e[Aj!i!N!--#e9Z8h4eCQBJBA-k!*!$#!F
JCQpXC'9b!*!$2!!&"#"[CL!()'PdC@ec,J46G'p`'dPdC@ec)(*PE@&TEQPZCb"
dEb"9EP0dG@CQ1JY9EP0dG@CQD@jR1J#3!be"4%05!`!!-!e,!eYX#lGU!*!&U!&
ElEm'"J2`%G[bI`KB3XQ2"YBE-CF6!*!$"J#3"3d!N!-r"J'!!*!$"6BZ-#ia-MB
Z-#ia,#"$Eh"jFQPRD(3JU5!a16N`,6)`-$%J3@aKC'4TEL"6HA0dC@ec,#"*EQ-
Z!*!$)JB"J!#3!`8f,M!Z-496G(9QCNPd)%4PE(9iCDSJ0Li`,M%!N!--!#J!+!"
r!A!%Ve99!*!$)"qT)$%j16!Y16JJ3@aKC'4TEL"6HA0dC@ec,#"*EQ-Z!*!$0%&
9Fc)!N!-"5801)`!$!*!$J!!"!)%!!J##!!-!JdC548B!!`#3!i!!!3#"!!)!JJ!
$!)-!N!-FBA9cG!#3!`&*3diM!*!&K%C548B!N!@%!*!$&`#3"4!"5J!!!3!!C!!
!!4)!N!LG384$8J-!!+J0@`TD3!*hq"a@G@ITa$j8l""l8cGeGYLKMlFEHlVGQfq
(XapX@&9L959B9@)pKKe@"3QS+DEi#q$Kbe-!CQRmTQTq!Zi``mf2ZkL'Ld9k''%
[lENXFkBX&8b2crC)HHcSaD`df)"XN!"VQK,Q&'Q)A6F&@rG%"d@fP0"GLc#jbB*
P-N%ak6ATZem5+jHST,h!2bF2)QX!N!1I384$8J-!!+S08`UF!J,[eZ8-S,kJP[&
E'CpCQD@Y&Xr+1VFhGlAHVGZca@qF!B!"!'J!B'4c@4N!!`QS+DEi#a6T`jXZT(i
HTmIX+fkNG)fEVG@5Ne4'kQM[fe09jBc#*)clFhe!EKZmQ"@M#m+PF)ED5!k,d6C
0(9`f!!X9GM$5Aj03pe-%abL$LY'cdGq3!#CfI@,Tfflb+rVM'-Rl$J#3!d`!!J#
3"3J!0!!D!4Z)'e"XC@&cC5"TER0PFR3JC'PcDb"H-#"hDA4S1J#3"JX!#`!V!#Z
J!J4,!*!&(3!d!#d"')J#AM%!N!-k!!%!N!8f!)F!5J$""!*25`#3"3)!43![!6q
)'9i`)'&`F'9KFR-JG'mJBQ8JC'&YB@GPC#j,!*!$'!!m!%!!Y!'B!!%"!*!(!3F
!!#J+!*!$'!!m!%!!Y!'B!!%"!*!(!3J!!#J+!*!$&3"8!'3!L`''!!%"!*!("%X
!N!3(39"36!#3"JG6C@Fb!!%!N!3(8f9R-`!#I`#3!`G6C@G1!!2r!*!$"d&38%`
!N!8"!*!$J!!Ird!!)!)J!#)%N!!!*JR)!#)6j!!L)!)!)N!"!##(i)!K$r"!)K`
`)#3Cra!S'SS)-M++*#BbmM*10!Bj*QAd-K*P&#3)Cr`)"($!%!)ri#!"!B"!!)E
!J!"!!3!!)!)!!"2N!!!*b!!!"*!!!!!#)!!!!8!!N!1!!*!(J!!Irm!!2rrJ!$r
rm!!rrrJ!2rrm!$rrrJ!rrrm!2rrrJ$rrrm!rrrrJ2rrrm$rrrrJrrrrm2rrrrRr
rN!-rrrrq(rrrr!rrrrJ(rrr`!rrri!(rrm!!rrq!!(rr!!!rrJ!!(r`!!!ri!!!
(m!!!!q!!!!(!!*!$J!#3"`%!"rrq!!J!J`!*J3+!#N)#3!L%!L!*#!)3#p!$q!J
J!!J)3!!)#)!!#!N!!!J+!!!)$!!!#!J!!!J)!IJ)#!2m#!J($!J)"Rr)#!DJL!J
-S)J)$!')#!d"L!JCI3J)'8F)#"Rr#!JF-!J)$rJ)#!"J#!J"X!J)!!!)#!!!#!r
rrrJ(rri!$rrr!!rrri!2rrr!$rrri!rrrr!2rrri$rrrq!rrrrJ2rrri$rrrq!r
rrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!r
rrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!!!!3!(rri!#!#$!!Z
"!S!)3J*!#B3#)!K)!K!,N!!$q!JJ!!J)3!!)#)!!#!N!!!J+!!!)$!!!#!J!!!J
)!IJ)#!2m#!J($!J)"Rr)#!DJL!J-S)J)$!')#!d"L!JCI3J)'8F)#"Rr#!JF-!J
)$rJ)#!"J#!J"X!J)!!!)#!!!#!rrrrJ(rri!$rrr!!rrri!2rrr!$rrri!rrrr!
2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ
2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ
2rrri$rrrq!!!!3!(rri!#!#$!!Z"!S!+3J*!#N3#)!T)!K!+8!2i##!!#!K!!!J
)J!!)#3!!#!S!!!J-!!!)#!!!#!J"q!J)!r`)#!F-#!J'ImJ)"U#)#!bJL!J-!BJ
)$3')#"Pp#!JC4`J)'Im)#"``#!J2q!J)!'!)#!'`#!J!!!J)!!!)$rrrq!IrrJ!
2rrm!$rrrJ!rrrm!2rrrJ$rrrm!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ
2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ
2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri!!!"!*!$J!!!!8!!!!)J!!!%N!!
!!!R)!!!6j!!!)!)!!%!"!!#(i)!"$r"!!K``)!3Cra!)'SS)%M++*#BbmM*10!B
j*QAd-K*P&#3)Cr`)"($!%!)ri#!"!B"!!)E!J!"!!3!!)!)!!"2N!!!*b!!!"*!
!!!!#)!!!!8!!N!1!!*!(J!!!!F!!!!2J!!!(m!!!$rJ!!"rm!!!rrJ!!Irm!!2r
rJ!(rrm!$rrrJ"rrrm!rrrrJIrrrm2rrrrRrrN!-rrrrq(rrrr!rrrrJ(rrr`!rr
ri!(rrm!!rrq!!(rr!!!rrJ!!(r`!!!ri!!!(m!!!!q!!!!(!!*!$J!#3#(G"4%0
5!`!!J!e6#eXJ!`1QB-1UDV-`X!%LBQ!h5l(E@C@J)',$(ZVC`*K9-3YM+VVhTe1
X#JZ*BmLfiRI@!&)SrH'p`)*+Z-9!Tf0)-Sk[fIFQ)JkrkFEqqpLI1PG2++D4"4f
4ZS)CZ+2&'UkSDLHN6c)+ldA1"3#3!eG"4%05!`!"!3e6!Yc@"T2hdNE0440Y!,6
j0bkmfddECX*X[UX,hi6GX0[NhAE9eA9K!!NiTBMrG!Ak'M5Q0Klla*eVf8k#LE$
6%2V!XqJ!D*!!aElq",i'!*!'!5*"4%05!`!$LJe6#TXN!(q'4E$G16N6X-81A8Y
16ahE!48$fl(kf!a@pFiq++KBI@c"EUcUaX!rBhp8p,rrEircGPBCaZS!#jNe$9a
@MI6"MNEhVP-Dl!5cmbJ8h-AL-N+fe,NJbA-,N!$IEi*fJZR44(62+AQc%pfmbHi
VKB3cc%YDkTT5LKd,2KqEdhm%m(Vq1HV+dqTUrjpIEXHVRre$rrZ4PL8#Z$0USi*
Y9X&)*Va&Ufb-9E9H@cjLQlH&l@%9IG`AaY*D6+58Y!*a(daqM-2AVK[QKkBCkP2
EpNhG$lS3D&U!*`6)!*`!6,hk,3$qkJN$%Am!m+*bi3)3()+!!B*LB#diLj&"M0m
-3Z351Z,UBj,-[5Ka(dcIG2P&a#YXbaJ!N!-`!*!("!!!rj!'!!%!N!F#!*!(!`#
3"`6rN!B!N!-'!*!&$`!!"!#3%B%!N"k"!2m!N"b"!&3Vr`#3'S%!92p8+rm!N"L
"!&6rN!08+rm!N"D"!&6rN!98+rm!N"5"!2AfN!08pT!%+rm!N"+"!2AfN!6ipT!
&+rm!N"#"!2AfpS'3"PEhp[BVr`#3$S%!pIEfrIq3"[a@pT!$+rm!N!b"!2AfpPE
rIrH3")(rprD3"#[r!*!+J3$epT!$r2hh9Rq3"DZ3!hrfpL[r!*!)J3"8pT!%rhr
fIbTr!*!$9&4r9L[f9#[r!*!'J3"8rrD3!eErq2Gr+Rm!N!089+[h+rEr9#[r!*!
%J3"8rrrfN!2mrIG@9#T8N!9rUrIfp[rr9#[r!!#"!&6rN!08q2ErIrCr+T!&9&4
rIrIi92q3!e6ir`!!rbY8rrrfpPErprGr+S'3"+a8UeEfN!2rre6ir`#3"2mV92r
fp[cppPDV+S(fN!1"IrrhpT!$re6ir`#3"[mV92EfrIhh9UZVrj!'IrIfN!08q2m
!N!Mr+rEf9[jrpj!%ri(hN!6fN!2hq2m!N!Vr+rEf9[hrN!D"pT!&prMr!*!-rb[
fN!ErJIH3!rD3!rIir`#3$[mVpT!$rrrirrripT!$prMr!*!3rb[fN!2hprMhN!2
fprMr!*!5rb[fN!48pT!$prMr!*!8rbY8rj!&92Mr!*!@rbY8rj!$92Mr!*!BrbY
8re6ir`#3'[mV92Mr!*!FrrMr!*!Hr`#3-8k)384$8J-!T!!393e94`)!)Q6Z9rr
HZr1ij,,,c,R($&r%l",8Jmaeb8"2S10bp$U&%CE0!r81bXrh9S@-KlrQq(`MTjS
#BYZ@D4QcYY63M'PCPZf[XCCTfGQHeYLQBCUfFGLQB9Kb@CBK%r'q[prl[RH[)Tp
I1r[rm`!ECD8NbS%J$`)Jb!`!AE8rqq6+5c,5'3LqAm*"hi*MSZfHhBD+&i"+r2l
jEf)"3rdVrbHcB2"QBHVqEU,JLhr*,+#ZK"cNVMmMT,CB1[+!&,8H%BJFSLRk8RH
"mEdGKqDfYhdIb%j2@qEFGK3`-&iIfRVQ[ZN%NZU$r50q*p#p,qarj3HZiUH"XTc
lTN9lph0R5m@f$rE[X-iG32'rZGL2iQBZYY(M`B,!NFrZSmH$"F%q,Qi'8VMpXrX
krJ-JH$QpLSi#JGMQk0Nbda@`Z4!9k2,)aCGX(h6m"r")p8!b(k[B,!LrJqVlPDR
q"$'+,3TahCUIY[k9d2!*i"2X5a$5(hierV6eR$-)C*AE94ES&MmCqm9`Yk-l+cp
f!erhZXUiF#$5Dkhr3hfXMTH5UaL6@b2G3dr(e!N'&a"fiV%caV%I+30mjJb'SB!
kQP,AkhaIq$Tf!5%C%m9L91`@YV4Aah+04[lmBZ`A9$&6VRkKA$b*C38qfl*ITD[
)UhbG,9p(AP@R+JpD$V5)abVq*E)[[%m%-iA4)pfH0X8SJi-M49HQfK*%H-eIY&l
"jUpJmeG%F1#Ab5,@fIcr$"T[26a,-fK@YlAq$RI-Y1Bi6H9([Dk`mjHrXmlSj8G
PF[HqArlZe4NRT33i,L0Ll-iQNaKqcI&D4T0d+'eUS*@3!+CpKdBH'#NQ9BM42G)
cYeeC*+1J&NQGdNH)8RAb[Mp4(N4SZRQjEk6B[*L8Zra[J6$C!k31&-F'cU#bN6P
h`)%YfVdSpN2*@0cjJl8LH`SSB2b$@Uj!qNl(`HjRK$"mA*mV$0[,rGXk$S*N'SC
p-A[+q[[DfMeI#3mLK%IUQG[P+TCk$`!*hR%Tqk9SI[&YXRHL5r*3pR&-kiAb!b3
26BhGjCKF2prPPAUV8k5I96mUT8T4b9qp"fKr[j-Q,6(HdQDpFlE!CR*UTG5flrr
ME1%&fMR3jSq&hcc4!3ErX8)%SYqqHj&aL`0HLC3Nlhk1`bEe,(AqB0dkak6@i`T
8'(NEj"`A3T96M!hi`dr532BcB5$`K5mcl[`LjI$!DY[`TVd8Lj!!`f"Qka5mI,3
NBaAEK(MHc"Lf0J#(k9!H"P[d$2DPY[m@!F("JF6R[14pN5KYl*'h88+TRTX5#Pi
DL4mEfa'CZqp!Lp%i!J@%"!9%ak@,8hfCFrG*aIEV+,QY[hH+j%$(VMB4+ql8"+'
h`ad(qi69Y[MYIXhDr8hp(Ge@Qme@rhEG5I9KRLk$jLkDc@Def8FR80@cpVTmlVH
l-)Jc5!8TS%lUiSG@@lm@ppJG*qpd0je,peik&`RFr5rBZM+*#0bmR0"`)d&5+fT
1*(@,-FFY"VIj4A92GIcJcA1YJl2&Mk'kb+M-'8%5'BfNTUKSVR"@I!T9arqYM*i
5e414Fd!0Zc1h5Lf@Z)4iU'GbhfeS+jm3GJ-&4d$[ZPdq5f#TfqkRb&Ua+"EZ@!,
%qa*"K6[-+S6C)m%GQA-A0TV`UQRFhG'3!(m*+,f`l30d+iGM@(GabU)0![bZ[[4
dK['lM3qp$a#mX9pUX5G*NRbXSpIZY`6UJGD6PAT2pcEfK62ALFEqLrAl"*CV6`R
9F5Ge*jch"MM[KFEC32UhA,0BiN*$b5S$X!&e+JhU#Tc5RZjZm1$3M*5i&4kkA@T
*5NkajjQNPCJNG63m%h[ra(1LdF#[X[G2')f0cEE-4Xrl*d5iFEbMi9NR#"'e*JB
%#M&mDUf*#"!b[lS"RaNG5hjjJl19b!T9q"JH"GEq)!MPj2U2-I9cU$TPiQiG)G8
-!"P8@`T)M@V0I-Y8mCd49[H*iSUr*,@F+!Dl@k[IEh26!`5GIkPdc`%Sj*34kT-
322Jm3Yla%M`R`,FF"e"9,XqmHkdrFZi3AQ[pTGFk6rM*cI,9[4DEeR+[p4[P`HN
f8IYYqL[mpLchM101A2D*fPITVr$91p`c!-E01Zh8*X6C(F"Nr6-!b"cV0j+[YTc
q#X[V6Xp`6pXKI0Dh,lmcS09qKri+[h2Am4Q[,A$Ip8iAJVqkI9mJU2TLV`JiLkc
eGDHap#(id+("5Ed)d+"ckMk3!-0I8Gd(T4FF1NIeSrd4jlh@qRR%kSm@Z&Z+V0p
-pXaGD&dmV@GZ$BimG[Qd5D[pN[i+[jaqI-DaZ1,TaqF4Scmk5dcpmm,AV2mmVfG
ZYI9(k2)aZVa@NXf*Bl6PZY05C#EBa%YQp"fqmM&VKl)lTFJ"NfLZU1j*C49jEV@
$9%kN(V[e23"22Bd2Z8bQ#+Q'46%34$e[cfRG,BS2l"C3!300#b8N*@$9lIfT-90
rXc)a5"1PEQMALM&mRUN9remrN@&!ZMd%rN,T9d`-$AC'XNZ5LL+F&9jeT"R!k`c
*J3#Y'%kFZH0)N!#k`,&HdQHP)M&3FAULP3ja"[YE5jhmN@lb1kZBI&3hqEA9*aZ
h8(5[60*&qLfXVXd`jPGmKeiM,FCFBfjP"4beS!K@rP5p&!CKU'a#340Dj8rP`8M
e5%MC2SVm3-LLXY0XmF&4-eMmF03NH)8b8Sqia[pYMJMB$85H!ej#*4Y24DGL9be
"GJ#,-0R42b!#JA1NP,3m`0GiD1mD@Ar!Uc#C5ia@I)H5ABU'6F!f2qK#&9JBR-I
83A1l,0V&U4LV4m-H-h'm)d%`9fCG,(R$T23X1MVKI$qJ!QYA44KrlI5"-)Y"kYi
4ECbf!i"`ii38M,UPAPc-iiZc-90VZaJ#iFC4'+-+%`KB*Q8f19"K-)RX!q3-e52
"$BL'[l+h59kAj`Sf-Jaba-UXQBhcm*Q'54!E)A#jF@CrUkR9c#DBS%5K563C3B!
[T#JeN!#S$MXaT13%Uf-h[$jm,R1F3Dhe)f%-Zbhkk[!j1MjV$U+U2p4j9#,P-0$
QaHKFKJj&U!)f222jK+$)DCm`p$6-Mc-JN3`M23f,UAUSq5B%#$QkC`U%,5+eb*M
Gf4TDhTXldHS-3['M8d'hXS)E`N$&YfJRY2Ih0c6Yf0H`q2hZKUV"QaZRll!fI$C
iFm0bbh-e-6Mh3L``(hYK!-H#+9+0,hAdATabR9#ABK-)-CdA$Fp83qALT3XFIaF
c%lV)J$-2iMpMGI35!9`R)rY[!44Z2*&RfXFPZNh1DiA#)Ze!%A@p486fCdqKNp@
j$L"![Sjm[$%LAk*3f$3`QcD&cIdPf1aTb&H1Q+BFDEjUAZaXR43UXm5UdjYAM6m
UjLP%Y$@S"+XC@pE3X0MH[#5ci89lQ)*!)QM$mZTE4lc-HL8PPFY$"q'!3QHVrS&
pY[k!%BS!rSF3JD$`VB)S$k+6k*)FPSGUBMURC,dk%C(0301NfkXII@KB5($`i-A
+ERSS9I6GHJ+HVdFGi+%6PQX(Xm3N"QUMJITA'iSGf6&i&NpP+ac6pDl*8JBqaJ0
RL2[0!a1MbV#B2!$aMaId`e2%lT293I#-5#B+j$83[193GmIf%5@b'Np4d%rAKq1
cZXcA-9`(PHY*ml8$eele1LNd4"HZLj6Vd""VF1e6VN0$N!#+m&M)Da!!HHSQ-dL
9Lq*,(a")P3Y`QJ3PT*VBK$M3,FBB(%N'D(aejid8&1XpVH6S,Y`*jDkK1H+ZD6m
KE)h'-$l03+'0$aEZ["&$5jC4S#$k!!)+Lj-'GIQF`CJ)Y%MY1fY*e--Jl&$(ifS
!AA,4KEX$rH5dC4K(ZH0cZSjHS$mNSaY!DKq1qKbIKHK3`i(YPpKSrr@T1`XF'6X
,))Kj"de4KPf)i6i$ZUXH3hjTHD3QKL2H`-8a#U,8cMZ6VBND+M5QE(3S*d%Ze@'
"E*G@1A4pDNiZ&5YqkXM)b5A&$C!!K9N3efUaGHcVV(`!%h+Z*r'S-d"IDcNjQ8,
VZU)mKYVR$!6"8M(`#4E9!j'0*e"0`kX[fK-a(JYA8H33IV[Rd"`)lH`Qd1YhjA(
&XlkFjBBUHR2--iJ(K2K'j8Kq@$l,E4V%a[*"P-h'!L!C2U3MpdIflXI3"33b9#+
!PBTGbIf4JAXK*QBm"8'@53`I'b*JX1PKiE@(@DM,H,DVbarcTldDk9kk,f''!j0
Gr63F-ACJR6,3f)&e)%QlmCK#-J-4BNQMdHeUK[KEEeBB"jHh4EHrPJ+(+kh4@!!
NDMiZ0`0jPpq%i#T"''rMc3pJQ"-9,f!#+BA20'ANj#5)(&+1PBF1b!8SN!#6@l'
!K4maG29fCr[1JM`!6a"1$)+l!dS`"6$kVSP@AF6e$plmc*%GeNEEi-hjG5MX4f%
4#Jim-+(3JB)"K3J+(K5ZSZ"%i3)+NbMFKS+%`Y'1Cic'!QI(e5fh%'"YDp`eri`
i)4)e96J3b"BY8iKA#93ri+eml*6'SRi&*"V)$f-X&&K`)&KCeTFk8Sb*1GD-A#F
qA4@9i8B#fB`&pRj%RRH-1CPq&&ihjL3B`KP&qh&4KJ+kC2KB(0!,i-N4k3iGXE3
hS6Ub6f9P@5q)I-D'S"kNkIRUKT'HVfCB%jmc813PS!$)Y&k3!'P"+($+RR+a&r4
pBfYSc+**-e&9%EDeU+b)IHL3!)eJ[*)Hf#T&#P9P4RSDXdCkQKai8+d%E[icQL9
P4fpM9UN6`REK@k0F0I&3*Zej!#Gl@0J,BSUZ0EC(U#XQ6(H)RkQ9[PpGP&REl5J
#-[$,2928'4'l&e@KXSiPce8j@bdTja[H+YZ"LmBM2EeE2JY0)U!1D,NP1kIV0fX
A4FYe!f9Xq3b"B"`''bma,H0p2'Ldi*AFD!r$2cFQZmT3ZIXm*SSL&Z11hVI+%N@
rPiB+(`(iHF(H"[EcND3Jf$1#JPBX,R3XL@5IdBJ)m+",ckJ2N!!JH0!5lJ%!0cd
k&Am"MQK2ir5IZ3NSSDTmGf&Z9rG[K'Ea9VI$JhTcZmL*bqdD[2QYCQ[8pNJV)j!
!r(i))`kC(hP#MpB93X60H`@$NLFHcSj)"eS#'P8)D$*9!Zjq#iHfjhEGdVV3V4l
Ip%jd+X(lp(h-H*F+'Ybp+$V&3X3GqqmMY#`l!hiT-QS)q)6EiA1e[Br)mPAY$N5
@VfiLpX'k34f3!!)&E(S"L&c9XH6X(HVM,9AG[r%@KkC!+"-*6k+C@kUX'3Ac4eS
1i*rk3VG6eSaG5bN!TBHiD(33H,MEeDjFI23q*S#"M&h,`%$KVU9!I[J8*YTh[8&
(T%h&aT6T-3C`Ii8V%B63rVpf-*!!4"8+0mKCV'jk@Le9V*mcG)0K$$2jR)''84p
ZIeATiU8ZkkDVeimZ8kk,q2TPpGTd$'5jk5Z3!"114NBZNMcU'%6#%Y!*XY8f90N
b'jU``IPi(,CQ0Lc[@#*GY"LE%+%*hCL96D6IQfJC*[(Y[P4DGKc-h%r,INS)Ja3
a'DBhjSD(Mh9Qp(Tc)6#)LXI`Y#L*G6rd**%0KD04MZlp*R%9bH(@4e)([&j#&S,
LQVV'R"IVD#KhCiB3ZH(T8)$Xr!cAbqkKiJ9ie&k$3$@P&`LqF@8![l8qEBS%MIY
b30*a1-k[NSIZ&ICLpI#q'p+Qp)GP,(HFFiQ!B4QFcrLcN[F5#ThYG1#)8)RQXmQ
4Me%Qq&5m6XJN,iEllc3eq9!&%0URMVhf'*%9$Ya0F1KUUHV!MNfa[5h2JbArFjQ
ZpCjEqiJGaeUD4*1"PVN*#AFbVa1J(5&Lf6iJ4f5lMm#%,3YaCBK13C6DL`qf[KD
)QdHpH`YcXrI1%55i"$%RcHIBkr,CHZE[L68c+`$!1U,%r2`p84"N&j!!!UDP)&e
l,UTAZh*P8S-)'3991-)I1J)$S&,dE"f5ceXb)A$FQ(e)[eQ&f'N8,-G@4Kj6A[*
X5Fj,(TGI*A2Xb%MlcUD4pTbA5cNLLNlM4"*LV`4*3-VG)MV&PFeQ1IRle3JJFQi
BDGp5Jmp#6)@AI"5G1jDd,JNjb8!DaMPE1jCm-4mE,eqTip2,"aJF2VZ+E(bRBmN
r!(R,9@aG0FR$`,K&kar3I2ARA2l`J$!'Al-l,(iX$Ck"3'EB#b"S(Pj&pLimAKI
)FZff1-f6MpRA@,`dHAa!qkY`%*2,m#Ubdq0e'Kap4mrmL-,%mBiPK5pH9#[4[q)
%MkJ#e`#mZGS[!HhR$8M`00@[Xb)mh&((Pd(jmZ,8@EFUhN`+5e@C4FAU"PCRP8&
3-3c8*$E99KlVKh*U`YNbjfi),)ERIqlb16jh0FHfGKF)k4rVS++MD@j@[KY)m4j
pUD-1db1a`P2TF8N)H'1Ceq+2S*!!N[4idLN8bJN9M-*PZq8J91aLiAqP5&5BrI$
4&"5dS@[*@3qMB-[-T!PD5Ybe6#U8Ck&%"D(m`lC2YL8''LhHm'&a%"QTQX1(!kF
!hRSM[6'IB6,m[BZNNSj"$6QTA8$a+MQdfJJH#k-M2#QmfSKVdSr#qMCAPc5e"Fl
+rccLr'@l0GcEkR'0KhX2H&`'[#CGCELDK1#"L*AKf'*,)!B%$4%G3iP`iJ&Mi+1
-8E@LdmHNr$Vi`Aj@"SXAbqdqG"%a(`[KNEVj%m0NB!h)1YjQEIDi4-kXqF+qpIb
r5(imR"qmGhe!mkhc&[QIJq#YBc*`rZ(ajNPY&l*&24B'qXRZ4fD[Q`$@V-2dBpK
'3"[*(+HYK9m*id4A'+pJTRHi9f8`*kCRM#TJdU6QIl%F'BCH3R3DVha*DX@dHDY
@aN)C&SDD$@3`H+bpK[rR'%(@Xc+mI#l[abda3h9,,+`Z2fZ"UVDP'1bd)PV)N4!
9`NqNUCQ)--J!!M%!88`4*KX4jZkhBi(SfqU%Y64"QNN9B!mL9hMYhD,2GN6X"PM
BlY$XhZT!,&!G42GQHYa@#A'DfpVSL1+11me(K((%JjK8aY'c8Sc5T)X[PCMLd8e
TAfe+QI$`a0h-8R[e2M@+Ye%8*f*iS4Md`mNS4+4(CJ%3X,8G944NEK)'3maVQ#d
dU*-+E!CPHV6LKb#IYkhm3+r`X`)*(P!"R,D6k%&&0@h*pU$8kQSMTCA6!h&T[fY
mIZp4+2k("edqJqI1qYK@Jb(5@pdZHcB`r1P)%')d"Z10U(Cq@M-f)9#j$N0BI!C
R2S"L`8N%imU+,M'1M35[ca$MaJASh'am%DmbiiHS[Lfm(pf0[fA9Ic@'2'BCSUS
a$BC"hq2"21E"$"Xh@%haUSD#FbUZ*p'X"B6S3qAj4GiF$mG$`-ID65c+TJi*2f$
hp0""%#i9IJKVS4-rHJ!Ll&iF-J4%N!"(1DCCar!B-fcJ)m,'$hQc2RQc)0b,c1+
iQ88e-p5akkR6!Zld)KmCBZijLTM+p1*96KrFU1QfeDCrHMe0Q8(*EJR8a-aH5XQ
k`UJR9&ChfU'qBj6SDFZdq+6N1%&L5J8eP!%&L09L),ZD%B#0Rd,!'XLK$)+fblE
RiG$"8ABdI$@(UqJpAmdKa3#!KaN!3H'&,D*b`04U,qj[,*MGeeL`kC3QK5R6Ri1
b"*CMBJee!$Sehi'!fY9"L(39MBe(81pT*aM)0VM#rBLLIBh'r&0Dc$`0&BdeeLK
2c&BQ6Y00l#pPiQjPBR&S)ME8MJf&ECI"PXIf2,SfSeM@rdEfhV6X[MHLh@RCTc4
$-*3e"RPR3$3+kL`LI*+U"rC`q$JA+&[6Q["*kNUA+3P*erLbf((5lR-F4lBN64l
NbK5![6R`fSHbd`&U)#-63$@3!$*Q8dQ*$,48J@d42K%J3NUYGSrkL#T@H"!34HU
$Q%&pJ)b4Se)V$F,JqV6XaePmaB`3j)4DSb38#AFAU`2)hB-h5Ud8(5$%%N)KKV)
I$Fmc42BLik'@45V)PP2#X6HK+e(d$HrGBJe!N36J8P4a3V,+3DS52K6'8)$k%jP
c$02G31RXcIb%`*!!84e50q`Ke$djE)R#-pEPGHa,Z"VZ%Zf5X$[Q38(QC+9Ja0h
X6Y6ZfjbQaIUFqrVmphjY0*D,SCR)5eJNVU@(m6Tce1HGLBa3)[*kC"qFf!HRHDe
[chFRe)%"hl!YSiU1pMMPSmPC*fG3&Af+$,li)+YXKjcDm#$8YiE[qIQL@,f`E`X
PRU(RUpr)k%XD`NC!X9SS8JSq,Ka4Ml!)C2)Z9Kk9+BmkP)XSUG%)V349da%43B4
FS+VZ4"K9b-X!S[SY4G,2%9$N1Xq6-kN!8I$#jBHk)m2CJj&X)BBmhA(Tej,6TIL
%$2YKem'iDmQ3!$L8VLA0)h($R*&e0TIUeF8TUT!!hr**,'#lclR1@Sm"`qe`[LL
iHBF(R)UU'3E*LF2a6SZhp1-[BrUq[IX(ph4Qlcr8ZEGMm2[)P6SqGLJM16dZ)ce
CLXDPfp2MdM2Ldj0i`"(+P1"h!#Dr#V3+-Y+&(9QL`d@Uaik+"6BXE(KS5P@CHEf
lFfTilk(p8p'p(5`bZGRkqb"(4BX`)A[j5%Zm*B1b`'lZ@2,G#ij8qaJ)f4)&bT&
3KB-@beSi2Vpe,,Ilfe[F`Uh&6*K!5LNr9jS&4IjfC0A$8'-@Iq8!CA6G,@M`R[Z
%SI-(KRSGQEX9-K-Mq@"%F+,jf4YTkP!UJ80$1Gka"pTp'#b-S+AH61"ZQF#N6YC
i3m3iaVNXYEklTVhFp&ZEkqbbJ%6$Y!Xld"*5pSKI6EbF!V"F*Qm%cVDl[GAaMUY
iC!b!@DZ1HEI-2)j8H0FGkAFX*m')N6'JUChYVE&L,-+%RQT[4AC6$+@b6F-3fkF
2+9c,d5+-M1DMB!c&%B1CT1Z*%$fTU(JfUe&DBA)TAFS-R6r8[9UF8G4M6SM$N[+
ZM*bF8b*4R"'1qa,XSrH'IH)R4rd3mZU1()Y&X+a,k3GB'L#eb(2pBfkSFF)N"*C
p,,[lM$(QM,`D1CEpHRChM+B&HCVJD@@UX0M9BeGTSTmQARhpD[I5qc**@,PC1ZB
XbPYT@q0Xd6&e4N$dSbLbYfPrP[![p0`,*mEVCE3K+derFP6i%f@e+D$`-Qe8'p!
QYIeDYRC8XfLhD&pU#l4+EDQf@*ZPe@U&@QkJ11!*p!Hk!VC!0("E)#Y`*P!Hq$$
`F@"qS$i`+e!E+!cN"SZ$Sm'"i'4`Ic!lD!mQ"dm'P`GVJNh"Pi0e`4R"cGk!eq"
YmhCjphZc[AC[X[HNpj*hSAHZGiPhNIFHlfc[eL*rd9#4U@LLb&TdY5LP++l)AI4
4dAY&M8Ae4E1+VL[Dk[2laRdQhi4[RqqUliM[M1p,hd*INqpPAje[KQrc1YqkXA9
YkjcVcUlVA(GKhC&eTpBG@hGjAI@kqH[UehfblUCeFpCYp3ImCIiKIlprQ[qXhq'
rkMmkPL[q&TpMfHGLBTeG@El'bc4Pq3i[(FVbflaX8CERHGQZ,$rNTD3Xhq0PXl*
mPjGHC9P05pp@C9R$bpR+mQ0HhU8XAq$PTmVbMhRjPV,mJ*G0bV+#PcA+XT+Abj9
P&5p2+mZ[HCQS,"YiqD5bR-[,LmUbNCFGb[)VA[BUbeGi18eCISqAIFTb2Lr(PH@
,[23Vbk@d,#T3P[r1bdh+FJN[Ee5@rm(,1QAj[lam@9Qq`FXA8Cb"MjZ)HT@ZL!!
dUBNR,&H@61+LdmU5L9U8U#bCM%92kSDUiD(5P!NU`h)%q#d[@j5(6+#LGQA*59!
N+8-G-`p9TNaJ3K3*CFP*j0fL62qf[!9[VA,8DCi`5ePqcX[&b[4bI"Ebp2R+F*`
FhSpe`hh-%blVV[kBVpa+&ij-hMKPb3RK6G%GF*+R4h4AjrQU9hIe%Pm4!IkDL-H
$5,S*Ar-%Q3!F$Edb!6LaJd5!6f6L"Dp6Y[XC,qp4PXYiZ8MTq'YH,P'@l,'#Fj8
P4prJ3Kd,#iL&i*FSIS22CCj`LiiSj6`K5pIP0&pG8)CNca,X9*BF#B0RGC(P-jk
q@jR!(MZi4Q'F#4)d+-Yc[!`SbcqLC@!cLMq5'3[FS#bIjq9dh6(2dc'"Eh4AbrP
+l`(HikXDhG@ImG8PhGARI(@,lZS[q#T,BH[Iq1MEP!PrJXqV2+&6QF$%$ja9'1@
%#6L9kFFTd[0d)X!r825A)h8JV$[b2qK++p"G,H'Vf8Sh5XcMI(@2lSUMSlCBeqe
G[T)p!,1ZIDbE`%Q[AGCGXCI4h,UV*Vl+8,ChNJH*+FYAH4P4PXGjZ8pC[Xl,#@9
CcNZ6X[`1,iH8j8Hm$#[,PfJTFT6PPlcFTL`jfCNe@LlRj4d+#9iJiK1c3RB!1FU
)&jAP!PjqTLarbX[2PH9Im",LkQ+aiP#F31'I&#I'SL`SZ%T4L%N1ICVbJ"bH6Q9
"3r8U#cUb5qP!%F'N22Jc,%D9"6&L8"B8M(V(&NI149jAJC0-mDbG`CPc*)!86Y3
,`"%+'JVG!+P"[AB5Pf!!jQ8'B"ii+VbGCV'[8G4jXi0(JJZp0[8[1*m,3pjfG"`
3'RHYjUkYb#!hhGaeU9JSV#)U2N(Zh8mJ2TBXMSJ[4CAi'-ZMiQ8S$-kJq)R)%+I
&4E&)[)(&CG(%Pjq)cmGEa,Y%@"4U8$L*`JZa-hKp(%['kl0B"Pk9X50i9F51i[9
el#*HFf0AmASP&XAVaCJ$Vhq2lF2VIf0RmASM0SPAI@`DAQr(GZ2eFU`IVhq15AJ
YLJhKpH2B'&kjX6+mmQ0q[(iB!klB!''2)UYZdbUiGq#S#*M-i0jR@Kh!ZVRBFMQ
3!-qAY*[%jpU2YAZdcGS-EEC@'&JMUJ-qV5!!Mb8U!fZd5`$m`S&Qd44BJk9Ee)Y
P)-9d85GUYFr&E*%[YJ'%p'XHj$q3!$36*MQeAJ#69Le0LfV,Y'VYL"B$8*R)!l`
&CS('eKDJF*`m*`SR85!LNMFK)Kj$JFMi'JTa+*a'i8N8hN'"b&L1`J88[NfH%i9
A85!b[Sk#$39N0p6QSI!G&)L-(k%`J-*,+,5KF)Nm*`VR8@K'i6)+a5JmMd)!KH9
)c!)8rJL&,5KmL-)F&2k%2#F+8'D,Ze"!pPXa#i8&+2`BKCq5jd6K245@S2"R+-a
(B5%+95Mm&S8D&$iJ"5m+M5J3!Ej5)Y&E5L6k08HLIq*)p#P(S[r$NHJHMN6614,
pML24$4b*IXq4D$C(SYp`**V$NHM[14*YiNKd-dHL3Sj%rm#4k,mj%QhK523r()N
fbj%Sk)@LjK8Jjhf'&[&G&I%Hf+D,@*GGC53)bBZ(A'8a)Z-R204Ime!rPiF+,-&
3Pj@K&LY$IDBEkV5V$80CHI%J,rV`kFHR(4qS9Pe5c)NKYr)fRZ9Y2-2E+1"Yl1*
Yl16$FrK`SrR`XcLm3MRmreF1(m#P@lRm$q9bR&m3'i&+'mj0`$[H$(A9$#JcUf'
f!Ucqm(9Q13#eET!!@(8r$h'NJ@%b4$C`K9i6`k&ApKjkHBC$,bYGL8ZmF0*,I%R
Ga)blh6bjr@ih2r5V,bE'MbN,'"@$De`TA+M&e6(Zq,(D34a$pd4jJ8HGGl[rbZf
+i`(qcR@+#ajA1al0`k5cG2(!lc#C)RJp5&@Y403r9L*UP4*4'j5)fU4%e2P+42f
H%P'A+K(ehcLL,Z1)ZS3MkYpb42d44p4[1+,q#dI81SkSGh*%RF84p4mjSYl"%I8
2(&&ra8Pm&bIa6Cc%ImG*A-Y*2)16q'miLDp6N[JLNZNIl0'5L45'f2(FNklGA$M
Z@N1&&hlY+UC#6EA,(r0JN!"Y21`[H0JEHGJI+-2k101#d!PCjl+`@bjRUP348fY
Bh$CX*e5BAe(F1%N`@qfbmc5K)rX8G#3*ArBm#8A#jpFr#DA#Ha!qUj%F0HZ3!'e
%L%A)C,"[hS#`3Ddh)-kDh&aSlhH6'"j-Ql`(36dJc(HHKKMECf4Q)L#-95`b0jq
@AX(+JG29!3bA'-k`lXJ*f10@h4R(Y1Gi5BaJj`*NFS3`3rEaj1Gq9m'#FqBKA9k
)$rC$41'dYCk#%ZX1PrI8*l(QKc*f0JURUA(Rd[l'RI1*F"5!biK5bN6KNFLBB2@
S58"Ji4b%-rSbfN#iZi#q*M&p)QJ18"lh9b,c8Da-#[ja@jm9+XAJZbK)$PReU`!
$ULKm*4i93qM*B(Z%%6N3aa%NmJ%M@Adk3G)b[`F*j@L%UZPSQb*51ZSGmmDmc5p
6PMHS2B0YclhXYQmEm`(9qYUp*p1%TEAq0IYQ2(3L'kPA#[b`r*KE#PKlEEdS($V
dhfRLHjqQM%N[jreljG2d68!p@8,44'T*d'A33C)88bCH-NNRCiAT$iQ)&`2*[GA
9"B6feSTc3)9[aDF3Rbd`RGDRUZe9-FU+88G2J`H$C6De5dHdBQ6PD[LU!+LdRUm
++Rq1,J@1KUCf&dqS"P+pU4e#B`-3+*L,E"3eYTk[M"D40U86#Zl"&#EUlQed2#2
5Kf5$8M3-U`M[@%[U`ZNNbQ&'N6AN#e9d,FY+6,Pf1hUDeYVl5@hIY(B2)HHhN!"
+(f+d'5RT,)#8fE6@f5+DUj+FV@DKq!`DkYP&,0lPj)%'D#"ARkeReF-3Jd"*hm6
UT(a@,HA'*"*ES``Hq*!!)L8I"mbQU4&-CB-q(j!!b*3E`M()YKDDZ!d6Yj&)L&N
8Sq(CI(@,pVR-fPQ9SBUMK13NB42UT"IHN!#(#hAPT0N#mG@FLR5CV)JF-Q%rCF,
@p4`4Gf!$4m4d$'!5dr'j!jmkI$i0%6V"S(BdjP0(BkkS8pQLD`LehQ5Y2b$NEXU
'CNm35Km6PKi40p,Q+5X!'!T@a02ec'jaScQce(8UBa#3!2$I@5N@JpKV+ipbG22
dC,ieBEcZqXbhjV&CQcP93f4FXqT@+2!iNMJUaD*-U2cl(a@,2N6R6&8N'#D8IJL
c-++SBiRK*Q4ap00Pa8XmU)m(ZR8PabmUFA`,(pqldFG2+-IIYSVMYe%e3ik8m"4
HI#"3e854S+i2Kd!ik92c"'3&``IHPKi6#aZ8J*1V*b"l+18iA8*hILX5&TjIi12
0NjR)M0if!R'qlMhe3FiQbNK$(D()q9LGB*T"51L1*BreUD6,f9*aL9ldQ"`L98M
baKmE@S'J4X@d4),CFMBK`IERE+--2T4J1CZUELA2U!jEGJ,Q*A-qK+J[K*!!eN*
)9D*X$M),T#3jk6I@9[llC+[V+V*%DklSRLQS3kh@D1@ANkdXkX46+lpdYMCe*dc
lF&r-6jI$*[&abFFC0kKGj@YXEL)kT6#bRlBR2p*&MLd81H3X2$Qc+31(-Le&*G!
M,a-U(d0i&3)9-S%+ma,SlkS8!XdLK8pP-MQaP8NPL0@C-a[%LZCX`U4#*YCX-l&
`a!04Q,-SQ#aLNZf9fD$0eB'!%4)@b*NR&Q#aS&[AE6*%lJI+IU&QImb[-1QZaf(
qSF#B!m#!(eDqS(5GTL0+LNS8%PCM`K4@h8T'(-K)Tjcp4#%2!6rS"*&EbG),im*
B)#-AXYURqaimJC`aj#`M!e,iMK$"51bf*-PZ5S4!VNU``T83,-)%ZmS%fe+#B(5
%9!V"T"85M,VjP3@FLr8hVNB`ZVkK&)*4ei#1B&)*JQeKJKAU#5Bi+LQL1CpZ2i,
+XcF8i(kee@%5'DiK"J9Zj9FV[6U@p,HhLSV4Q%qp*#"d*34+-fi$J5jbaVqYl&K
ZUq+KD(Ji)Tk+4"@)i!Qh!R6kK"k"I8-&C5V)V8`b!fm!cG6M`kI*'!*P*EDkfBR
Te3,-#N!jihiZEPHkFD!V-qFJ-4m@L'b5BPi%kK)lE[Xj+0e+fd"J(U$!h0l2N`d
XP%rAkqJkeQqqm22&Z*PC8k`iY+"JemciV*%J(e1'*%,QqH+6P!%XB&()K5c!kS2
RYNld[$9!jPfRpEc9MUbVlK%)54YR8+$1bNf$QPMX[-pKjle3GYl0c[@DK!`F$U&
-i`c+r!,e)VVSR1Zli&cAkX%+"55CVNkRk)(2(&c2+MQe"""$$dfa#bS3TRE6!4V
cC$C+--#(b4e+(G+2+N+qM3a#8Q"k4!ZJ@VMNqK-GNR%V[cEcD`X)jk`D)r*9[NY
-+!IP*BFK#i69pX8ZU"j#mkTGP-bP&6)$6K"H!D&Qj3@K&*,9N@2bjK(Kdm6lH'%
k(9a$j'&[0ICqjPX$El8lJj(Hph[Pab5FV6+S2j5[APJabd$ll([+c,AVQ'1[L0H
Db[J3H"r10#!EIUD*)f@EBJbjSFQI2Nj4%P%lA*@NAPpdlqKY#QA`6)3#fTaCe&K
23)V8da5'#5%rK-lUPD%DMIAT)T!!3mXGU8eK2XCN2XD!Kc0+23L#eS&&*6f&EiD
HH+9k%!CkLCM[(p(%@`0%@[BLXpQ,E#V&L`#&)AXSaEMQE"fiBj(0!TAUJ6jGT3I
L!A&pa`Cj)+(YPJpFL9IK!8[[,,BThUr%*V)%1D,N9'KPqS5",2$m+e19dbR$8Z@
CplZ9U2Tr9G"1DklVMGXfUhY@lrZ$H)6NjX'C1DHQ4-)l9SZ%4*+k%L4C6*GUG&5
hT4Ac89Yam12ir&`qdPSIFF0-!3aa#2r-3DfC@,f0RI5e[9UC+Ri2)mL+Nb#c%kV
BQ*-YM#acfj5-FlPQca08f&km'YYhj'8483[!UmBLq+lHQGeS'm(+MXmDGQjZi0G
er*U"lMG9r6pbQK8(U-EX92Rii9JH)&F0H-KFJ%peY23CVPAJafX*9FC@ABfiBjX
+!RMRk8a,c&Hc`#,![FeBL`$h+-b5CVk9BV`,Lb2''kQUc8,5BqqZf@&YDJGkL*G
rc%ZZZ1)3I"EKmbNqGIMFJFpdL&CpE$2JPB+2K+B)VZ2JZSh-KiZ6&@r!p!bkElF
L#q3Kfa'Yf9DTP6%U`%&)"+!XIB3dJ&-`5P&[4bUK")!LJ+U4KY#+U2*V0&DF`+1
Yh+8XK$b!Nh!6YP&Xc!eR`"46VYfL#LVGRd*",5SML%!`1cj1MJ%CHlE@`lKIJIA
PjHlPafHF[0jQc$QlE(d99BqT!kBDV'phQH!`[Vcm1*Q4Yli0KfXqC@@%D0ca5bI
0"M-DMI-"Q19Q6qfCNSG!KecVfmQECTfFlmiDPariB!D2TJ*e0DB#*e5j2N#'1ak
TH*SG[aCbZPAR,$#QJ"Qc8!Ri,fZdP61d`5Q+8SDTLQ`3B3Y0XEQF,8&[e4&R+c,
4`CQRCL2B%3b-Y(Jl[*eiGATK-1YT$ac1!3,[A$DBZTU,a1aR*PS)P@'X`qF0DY`
!*ND8DcCAfY28cpFId8Y&b$`0FlXBSJC$Y#Q6Rm2MEr"CKXmLma$2BBK[d+Q0Vcp
5c4jT(qf`IPA)dFJNDQHHq1G*cFX[hdaN*0Imf9`*-NHMMbNU@B`3jS[KBijbE9B
'2aH6)`J`kJlCB5H8#Jf%5L53!$#K`%&m3i&MT&F"!!@"G9mC`GK5&8J-(#dG5+a
-NSUCD!0B&L)$CLTl1,"Z*h#fX1*R#[KF5m+B3b"0c#02FDP6dZ60QX(F*ihem'T
`DX$!$3cQeUYJEX@YjQVF$FT9Q`UJQT'i"@V%i83M),H!6@Tmafa'Sm4M!MQ8"'(
6'SKil8URMdVT9+!BY0LL'V3)169NES!pBjBHI&qDq9DFD`M)KM%f3A#8[#-Y+hq
!!#2ZiT4jbmN-f#HZ$YK6&`@SpkP!23dJ!r0Q*dZT-"(M#UY82GqN-`r#8G26U&C
F121[McIRCH5)h'fVBV3$hGM$M9fCBT&P)1F!C*49*81dPc*X&db3!%Ir@bGjj2T
,jr)D`CPelS"@q6`4Fj+Q,9DQ(5Xal4LQR9HUiLSlfmJ`L@b8*e'b$C06VfD!&r-
RhK!-SS#iaC9*3+j[YUN-EkiN-'0ECG,e&'$P8q-@e,3&MYeFpk3B)bF&CR5!NUI
UiC@TUNFCkASECiV2Pb+)R'dFp+"#lfUK"NEJ*4kSfSePZl*mM*H5&%%6)105&!J
DL4lCA26!(V!0,pfA&CL%bDQ4iUSG0,bpKSa%K)bCj#f3!+&0e3c#+3Kh1TYCX6-
,5Tj6q-4K'8&"5L8P8IAGD)i&J-dL1K#0@$aGLBbi%!FAfP)Bj!UmFM-&#eU9'Ye
NXbdNbRUSRTULf0*a5U-+NPDZQhj#RBiXJ`8m9*D*6,JF)a-Z0!4P8Y4J8!#C[YU
4cFXVRNBRUfVQLM`X&eAM5RkJ`,HaF58m)10+DZBZ(KE11K"T9"(0VGJpVh@bb,V
BSLecfiHZm)1+kb&3[-d"dif8RAQF63#5Pe+C&029#'laSSX63UEN&+"CR2&P$)k
S!mqZH-L'!!dIC!ppUlM5JSR,NGA5EJQL@`c,Mk#1+9BUVIr&PFem'S!0dQ4ae[0
LHaFr)&!)Q4NVMLMADcK$qZD+#e)V+83H'A+&94+S@m6J!pLQ%dT'"#4f!XRlT&4
QIP3P,`aM9BP!+#Qf,DDN-*M0VdMK3`A#CmV@'F,l8XkdlrKAb#qXYEIYQ5,cLAq
j$*&[A&hm&6,r3GhJ[cFA"f05U#+LGR)9+a2R1-f2k#*l$43bU%J,#Cp4I$`MLM%
F-pS3drDBi*52aXCe%hN52l6N08KL(VD-SLBYVja!&Al#&[Q#JKFI[r`f**9Y3--
RJ%m3(bmq4F@f+KppbKkLD(3GkZrDFC!!ba,JPjGI2hLEAVqQ9k!+!-Y2e%+185h
X0&)@",dTTG,CZR!6f+*-i%m+DJ6'5al)8B9+Y3pH`P!G#MLfbF)S$RJ(9Z2Be@i
U)X1lMVUUUKi4TNBJ%QL56Ch%C)64YL4*bH#aQ3J(Ch-r19R1&N1adMdX%c4l(aS
IkUE)R`I!$ClLT$68d"E-b4qJc"jbBZFX0l-DbFV'CJ)*(@$DClI#1G'DF1%kDf[
2@3iJ(aQ0FTD68["k*)Ha#GiKB&amIF4B"FAIFY9`L"e+2L#Y!c5e'jPdBGUNAFm
5K+@cG)X2GHMQP8HQ*6[,G42TBP(HLj`1hB@ZBdjL5-P'fim-UF%TH9)qc+!FjKP
4M@944iN6fN3%9Tf0N!##ePL*l)SQDa5[2QX8Je85Z&ma4e92'5XjDXqeX--Xa2T
pkACBa8RZZ*DCVJV9'maQXQb4@iG&i0D(iI'#L0CHI)UqH&Kd3Z98a5ChaLMLZ)l
ZQD*U*%"0MR$VI%V#1mJ8#N@3!-'r4h6a+e%MhpRLIdLCBP+M%MI#K!Hqjp3(DM"
PMVVG,MSDjJl$#LV"Q+Fj(M+'C9Nq5BhUh)jQ[j!!j4%[Epmj$#*)k$a`%GRGEip
DJG5m(@,bBAi!`QX59GBQdA#BR+9S3@TUI(*UkXaT`ipR(Nh)kNa)H2LJC9pd6rb
H,"&UZSN1PQj(pFV[JLIVZch0`3'QYqS#`06E!A`LFh(9&EQjTJp6N!0@(r58N!!
c!KM-JErDF)ZY&eRDETIHS'a-T'#e'f#!m2'NDb(&Uc0ShaeZT!`2H&a-Nc-R*Kq
1HIJb)&pDRV$%al`6b0c,iQG-1[HMpk8R$cqHP*bH14JAIq4`FRTmmX'ip&+fV'i
iCl-qia&-&iheXa''RZkFcG4%62JFClCDSj!!(XE2FMDcDD(qk03m3BBAd3$4Cq&
'BM"RXpd2Xa8'imlBH,L4f&1Z0&ajji&4*UVA2S"SJbLHXpQLMB!8D9C@G-'"b5(
%Y9CeJCTG`q#"Q)1-PMXZfA[hU)6h+Tk&'XSMFiK&jXPqcM$MLBeIQ3+j2520)ei
d8lA6)UUZ5+epEXTZS#Vih6Zk%c)b3*IXK-l$4q1Za6eH@Rc)RVNR+aU00fG$%HC
'LKMX"!PbqU*6kXD0qIBaH-@V*Q[ElDUjCMD#3CF4-V1N[jDE,(4[4d,YMl[QbNc
2B*pC'KI!j6l3FHh8B4GR-!+l%)!TFD'!PmbHCIQ%i'`bY6"@R+JL!R+ANTSD$Z1
fIU[*L[aDrRhZmqjpEJ3Qih40$&+J!K$3hh'*[#C-S`ZPmjDd+Fk`'9DpMj5DKQ`
P#cS'Vpkh0e[*@V,[d#!-0%j&X`p0G3`,-6S%"V%eaFRCGrKD9S*VbN,m*TP0XF[
00%+d`3$'ad"@bTBfDPRH3KYic%JE1+'#4VZf+KZB6@D3!2$*cl1*2Z94,MZP%U,
9HM)TamT"C8XY`ZNl+p6KFL9XD4ffe+Fc5crD8IFU0KAG`rPNJ2XXaLDL"j2h(mj
+AcQ"Xe3LlEVke!Qmkh*T"(i*c1`l0"a&MUc)hQMR&G(m'"MDGcM*NT!!P"j*Yf3
p,QI4mN`55aENH`C$&e@d4m%h#N1EqkcpH4PUTQZ6&9kT*$2SZ-ZR-11ARFTh`%M
Re1!q8E`1$(3QA%XTpH$EP)-lRYV""4q922ME1(K2"amGIJj(lmR)NJrI4+B(kA!
J`$CC$-a!KNV-Cck4%f)e"XES1X5!S4A0b'a#ScqEU0NlYAZ"2ff+QMHmAf@%RG,
cB!4TF293pplKlX'1b*i1-IBJ'"T1McYe'2RXZUpP4!jQQ"ej+@qcHbjZG-mQc%h
VGC,*lRA'#D%fl8G0%ABXU4mSfE4I[8GTfXq[Q#GJ-`9H-5hBT9PIEMUCiE@*@(Z
S%EjIcjD(N!#EkI[e2FS3jSBb!CccPVk6(AI0-RMUfZ'XDdF4YjPeY4(*UJYNl$U
EQSd-!d"$KB2*P#X6KES[ea&Nm1VJSFj"'hNA1G#8aF8mm-kM3&fGk5Z(!6e*p(j
"iL+Q,bJ$rm!AC%CJ0el0SKf[-H(%Dea-qb*EG(f4KIe1i189Nem-LhN!3`+L"5m
['XZV!QK5"F#l#L!,!"0bJ(d&NS--MSq+NLEq8!dfU5c3a-#CrLG&Rl3HSPGHQ1l
E$K1ii33r#8,N`cNJi5Zp'Ep3B!dQaTL*F@E#JjG2$0P3pFCR('CbICI`''CVKmK
NlU9K&$eIi,%Ba@YFV-(,)b5mKN3E"2YkfI$S'+ULEEqcBR)ELK)A*3#lARX'!dT
H"'S5#Q1b)4`b!BJS-!i6&[G2`"""kG1JJM"2BQ!+3f,EATJ''[p,Q$58+02J,lq
qR`[DerFEU,,J9`le+m10V[$3eDD9FUJIKrTAH'KB165m3BH'0q$3-!i0Vr"3Jh)
SQhYGjD'V65[P8!-10Dcmd"!BUc0JU5C(hj@5A3*Ihdr#1Ec`IRfrNR6q&8cfkbE
lPHf[E(*B0cQXX,fbb3EGC%2)@j!!+6m4lSQbX*!!Pc0,qf(ZT$FZJ!KGV+,4M-E
+5JD-Z,U6Ze6THJ-ebNcEhdfCV[GMN!"#(Q3,H`KjJ%,c!)ANBA-6+A)LDhXcH3a
AQ+)0M0a33K,++&p"jmf4b1a"dGIh-q)P,'r)P-SA"[0&+epijBX"pF)[Ar5R3UL
ebeL!e`43p%q+5@21a)"`8LGGefBQP9ri[ViIN@$#E(lm"X9JH"mE$,r"08T1-d9
E3YZcQ!"3Lq49+emJXe$'!L!kHDNUA)N9(81kBr4U@@N[+MAhXSG(a&50&94ZSQh
V0Vq5cY5PmJ8!)$pVLlBG4LApI,mI5L+khNU%dT&VK82!e2lZLMIk@h@G0i"eC*E
HTc!r+RmUIiRUl&C5lCIDj9k*%[J)M(9MmSK2hUlD",++#LF`J+,9kNPR)UFql"V
VcfB81D+60M6aCJ#'%Q,Y*$+-`"M#`XD#@@jHjY3G9p3jD$EM*mCi(j,HK#V9J"L
JK#6&9FKi-B%q"UiUp6f-BiTGC*!!F6ZVb*VHEA[%LNXm-%A*f1D")#0,8$A9`UU
C6L"amidjUfD#"),MI9eI%b0i$@5r'MP(JYpLHQC9AN2+DP!&CY[4Q'H9k)ZaiFl
1lQ`E@+mQ!lCU`!Gea2U+bc'rfT`N0p&K(NBeQ1!dG,DS5LfJXSmA(LGNpLahlI(
DihqE+rS`!3dcb&0J"2jNi8Nb!hq(ZrCNlFNIj3VI(B-mbEZbB@ECR*TCM4&dNXP
S[q4AYYeRV5G"C9QY"Q4fJ448e,epR5Fm9)!CHHZJE9"HSZQrA21Ne4rQq$*Zh@-
Xi&FZ[h*SSc!J8c!6kK%iX$SKCN3['d!"Mb+Fl@c9)AqJ2'JqS"M@*P1M"a5&!T(
bfH)q-TSm*18aTmjLfd-+%0,-3Vfber0hR,qS%f,QUFdbLNLC&1iiRfG#1)4#+JK
P,JZcL4!5aZUNTV9eIjI#Bk)ehZYj3l5D8R@*c#,qF9UX,%)98F1$VhK!UmKa-YX
"Naecp!,JC2a,*`$1MGd55"XJmh2!%Q@9%!4(0b@)3r4kJm"YU#)'B+K`Z+p5Y$e
d"$EJ['5)%HKbDM`X&pF'A)m*Vk`H[61L#f`+'6&8D$'1N!$DqemVAb+MeH6NBrQ
IS58('e$hi[TkZLDcMdCc3mi3bJUl&-+KfCZTQ#+#VcfC0Q@4P4@mAAh6%)5!KS%
iAE-2jNh@MR"$f3i"aE-kP%6'*,@aRK-C"l1b8$%pmIh"lQ&M,D($NJkl-VJ*rd4
#Pk""H%D'6E6DTc'b$%ILGG#53JqT%4+eHA*RbrSaQXBEh"4#M%&Td%KL$9c"*64
*,XaHE-G`6QjZi&%Dp&V@i54DMKJB[BpU`IG)XA#GI$42(F"Jr6cmjT'@([a6TrJ
-G"!rZ-jm,$@IiH0Zfp8Z#M!db-"4)M&Yqm$CmX![cCdhbjh04-Z@dEN`B3c6R-C
XcYlL)b3)+Q6CM,i&bPC"hM)L0i5qKGRRETKIf`h%Ek0a-4,%'*2`Z&CD&JK$2GE
83mlTBZj36"eSZKkpLapJ%#BP4DZ-U*f6&k%1lpNhL%C9(U[Y+kH-#VaiZDqF+`I
&K')h'ZAU`@TG2DZDcK0Q+B9PT4kmHm-2jNPY*EfcG"irD!,J'Piqi9X,"dEim8,
c!EK#i`KB0)YQ,-E&1&iHiAR`-+SL3hJp,Cl'ie%aLJH5N!#`D"0YN[p2liJ(q3L
mYS[YNVm8dqlK[ZHjNZAP5TE[SBIT-,a`'+j`'"Bi$)YaVSjjZ$U'`i"f(J9kIc6
N#%kE6NjbIqUICcYVH6XcH3YBV"&V9#,KUPrdif85*V`!*Z#e@qc'UefdBj*612(
U%PfiQK56@-`6ml!iLlB,[m8%9YPlN!$C`kX9@M)j1I[`%cG@b14-CK+,#6'KCa)
,0,q&ecka$bqVX1,9+6VrG#+(RZ'e-X0JG5fcQ[G3J"Iqe6cLQX'EklVkbL&kMmV
mVL2NL5j1jDhDjqh%`5P0MUPGfDLrAh*%TdVajKMqVa[0`eXhB[KHYHXUKdpjbX1
RV(Vi6h,PiAGk0Q"iQQK3Zh'$"ej#VUaNk02+d%X+jQc3d%Y%XpSYlk#$0crfXQV
5P**BEbJ-CMBI&9@ZmEC(a@H5GUP#e'`I&$@$[a&VYP[&`Y@B'X$`KVjbHX')9ap
q9XLBZ[@#E5YRN!!%BZ4-B3@cUE2+M$`-,A%FQ9IcVb9L$e%4)NJe5Z%c+Ma)2b@
PLSVSY%ETY*!!1j%+f+e1Ya,LX5(A6B)D*+#MA0C!SE%35-NK3SU5@)PZ-K1&KCe
Ue+-8YZISe,P9VQ*8Lf[XT$UViSXa+(mA4UV%`[ZM4Z0`&@IUAi"*3hD12!Aj",D
)baEk+3#E#DQMX*8V0fG$3"8'!8X6a&+Z-URFd8dQ!m2GaTqlV&6j4U*@`T5a(bU
16PC!3Xbb`'20h&@Y+)Sh)DTq(P@RC&ZM%+4X)Q"(Q8S0#+`KN!"0rG%2FY!0SfS
T8RTFA%+FG$K$fT[)+2K$'CD$bF2*H*JjEaj0-6dUa&Udec9[ARTLI$VV&YDZh4X
U(jV5VFc'eF`#46S8(kN9#EJUPCM6U1PL0!*8Xa46XVJKBb*[fqd%%L1c#&jhJY4
81+q5ZT**h3c"SrAX9B9LrRdj+Q()H%a'X-8a'NK(qJ*Cq!SSQ4$K#eC#q%eN4%`
Kr(iQr&BGi4NXeK(q3Kl#Ej8*,kNrim1r%5522h)YEQ#hP(6i6(TUmU-E4Ai#A9Q
3!*dm+cAS#35mD`eqVNQ9fNc@VRZ8$4P8GYNF+PKElC!!28RTFIUaK9`0lPHG4eA
G[Ki%51YRdVY'89%R"`*9%Xjb'`EbJK&k(6$r*J9ebZBFmd!d3,4I@)a,UAQ#hIG
h'ih+-")03ak%-h5D"aURD-c0418C-TI&cd)L!#'fU"S30"2%,a1NB)&+N!##Ea5
#M)8))LQ+r`dKLR+d2mp'U"Q"4")MAHhB2ZABk*r[f&"5N!#R8NJ'95bEcma$q[j
@H!5$NR'4b*e)KqQ4%UVCrc`9Bd1SBN`Gb6%2#8G6KPKURM!N-'d1'[VaFhkm%IH
))$3C)FiaEC3#"6Td*F&@L30N-*8$XJi(-L,EeF9SfY3`)G%49-B#jaG"kA4lAP@
#DS6F4$mSb#YjZ8)T(ZSQ"9-SFcJP#)NC8'@P9!#R53jXaG#U!eYdDNHRZ,jb)JX
UAPi5JS#jCKlLIeT@XA9jN!!K*LS&'0)'!bBFb"1l*8!5VRlPdm-i0B"9c'rkPFC
pLr@"[j+3!"FLEQjJS#(I40&5#D40)@5)'+!(*EZEJ91riHGfr2JBr3-TUPpDM"'
h`f-[#!N!K5*2k1HJ+*P12eh*KXYXPr0ZYL3cbKCp*3E-b(24N!$[e#2ML%M0PdS
A)JS0*4Y6KFL@)8jU1TlZKEK"'69pfICFmr4KYlfJE9!kP)F!4e4R95HXQ@[H%'A
BFIFSB!!GD)ikmb`DLG[!i9!mNZ+*QJ&NKENa`G(9[)jRC4'%$0AfA9Sjd5c"qNB
fpHZrH[bb@p,dK$%[-0a[bMPbm%'qVi!if!5Q#VCH&eVNHd+,lpkcQJI*cq0"%#b
U(Q6E#Td'"KK"P1rZTb(8b%c!(&#"#bNkQT1mS5#kUNKH-N&9P)S1)-dEH8eHEl%
E'c+Z(VhmTr5A)dM+R,+59cYc9lXbSd28CLAe!99",#6-+mb#3B6+hK8PjmrPMha
0`P'aAQl#450MTMPf4SD'HkC8G#"GLJ%'Ic`mLDm+J'KpGKN,BM3m@dp'-X`rhQN
fGH[RJp3-C$Pq)'4*#56aS1fUbPH-!T&IaZ$9NTd60"a&T[l8NUK)&D8`FLqQ9FS
4f`S%JabaGaiY2@,[R-F4ZjQ$M"eJCi!FT0a6(090H4U6dcR5GeV-&D*6'qjJ&Xa
3ZklZ)G#%Xd%R8+d+(P'cFXe,Mk8%qVf%M-bYkaIiB9RHTDqP6D9%L%LN#-5'JU(
Yj'ETYV0HhFbZ+R13!,KHRIC-')'5PaUHL8APa)RYArTD[-fdqT!!3lSK&I,X5M-
2U35aq8[N)I@QTq@IhD0XV8j@iV"STcrGKf!8*Xk85-@18UkKhabYqYI,8@0AS8Q
0'[ei3$q*KBqP#,CV0dHj-J!AY"aA)`J&dJlk19Dpe2`@19%&9JP0q`")CV#!%KV
*FERr-RFIBJE@Ub`mHbP2P,eGVi#491B4H'IV!QrCL`Q$'N3p8c2XeMp-+pmBaah
9M%0kK`-ES-'E+AK8[DXa2`p$31k[jL!FdjRBP@4P,-cVDSR#F6TKe+bJm(5FTmC
DA)&Acpec,R*XfHR-kb3)cAN6p6rVL)(N(8`f$p$JQdf#J,eq4-hSe&%d)hI2jDA
(i[0j5P!+AVV-(JP64AprmBG`1+il4p@M%&JR"8&fMcj,JCP0!%i$[Xjfj(S+!iJ
bS#S@r[`e)NY6SaK,+50!mm0'J)iq*j!!p4qq*MA[FCr4IYL`p,@MDqijaiTEXe+
PcBZI31!fDH4GiQFJHSEaXl%-qXh*e@U1MXJSU$TEB,`Y1R9+q`BUD%6cm)ab1"Y
K4#Q$P+F*@c1`emi9[Y0jMqmAU*,l99$F6Y@i,FLLm+3#F$r*eEKFA6@1+q+kDT`
p6c8Zeeb0#kU9jm'EleS$NqT1Y0%"-[f`iKbBMB,&CIKN#1-T'G`m6,8kbBlkRC5
HNC)N(Fa)6l4!#M)pK36+0Uj#V6Kr)!Ne'`9bp[,5d2NNCCiBi@"kf%e04)RL2-i
E)Lf5,jcLSb)DY'X2"HeQ*h@F$5-aZ*Y@1ZTQYQSXKk[)bp!X9&MaSN"*a(,b1$L
0DN$m9!jK"GbBI*4HLIHRFk"Z8h8EF`J%[,#X[k5[3T4f1AMc(hajd@eQ)1RQJ[c
3BTI32GLQGVh(YcUL6R@iRMfGGkKG(Ye#dLfFZS9"9Y'X[1UaUhj&35NlELB@e!q
A!,(PkRCP5A!m8XR0"UbH1'-JcA@+#QBP!6Ge(#E"C@TS`%r926,b9CU*QP+B@Dd
+)!aY8BVkJrmGcK0`4-XhGN"VjKr+GCZZ+h'3!'pP&hN$ij*9T)hBcP2HiQT(8Y9
SrmUVE"!"pdFDPU9*p$%(FUeQ&M5Ja8Mi8CZN3PkfS2$Na,k9%0[6J+6VXjHeUN*
Hdp"Prm8Tr+Ua0r'KTB'"h$i5m$9RVS#BUUK4R12G)35*'J%1*b5P(Vf@P#lC)9F
*K"SKdZ+cdUr&VHkSmSAFBGimT8GH4j@V+(pBPVF+[qfS#Q$qcCP9)Lm`IIE(0%4
TeHeYljAd&K$NQQCf0XK6iQHDi-GIq8qk$9TT$el@29!'H$0[KC)5T4A1RE%42l`
Q&cm&,!r5Ad'96eYKe$b#(fP6dTXk++-IJeCaM)6CID!&fL2jXL0YLRiJ#KUNkL8
$Hd$JD[CL"--"H)YPb*!!Y&,265)ir008H(01VB65b9`j9icpd%p9ZBHL'%eS*H)
YbER4)8)1,DSbc,+Y'BKNM98T!3*JcDcH`"'X`hcaM364BdEFUaG,'A"NYXfAmp@
+eaJbLJ+mq*)BN4rQ&L#`5-ac04YAG[e9cTMU1A+kQ(3HEK*@ITLP!USjD%*F[Ya
j(@p4RM+ZGYqjPGR`jUh%PDLk("&GHE`Y523c2@SV&*51KP"k&P%5qD)2$RG0Ae&
`U%EX`TUm%DUJXD6M8[!H!pEi%625SkJ)EJZ[MQlcE"5LEH1Qph+9$aPC3-*qlQJ
&iEP5LppGT"4&6%&VMC)AAd'!9"*&Z3(1r91Dc%k(589,'9lj0+@il9*DHGUhB6C
bUh6)T!IV`Vr6)@9#cFp)jXla[Zh5+jmH,G"h9!lhKacdM@*2*QjCkD3LJ'0A2J%
FZC*ZBG)Y2(Ud@pZP8SIIZ)3HCd9Ul`S![4be)JI%8F01+@T'Eqj-+qNdVi`9ik9
9+6@9i8fV(Ti&GXG8P4eA,Dp'Ta3$-VP+9rjK!$*LF#A"IdNdE'N%9E)eBJ-hb3'
'qCJPBL`k&6V%@&25LjFm[&4J1f3Qm)aZLlTMM)ejM[PdGE"ajq5+J"[ceZlqATh
1bFq9"E-S)&)k0HY)0Lp2eIlZ0J*%$kd`!)b@"JVQI&ckY[)5,mGH!NK@b*lcie+
f'ed*!FG+fGU!mR"5YlAa%J"FlqU$l5aF5@,FPSIYhP@aTbIqceC6PZ4"-SGAK'4
HcI%%bV&0CqCBZRYYTr#DcVHprXJK#)UQKT`V5jL-$H1J2!jGRX4Vq8N**+eN@((
N+5e5X+F-ki6TmeIhP#Z,,RN6IF8HTR52QYI,`545kB6fU)5')+HA4%9@5Zk08J&
3YNTp"aL)c[cHBQ3lb2`H'N6VDrMHiSG3,(RJb2Tq@I%c[*D&NL5mT1Geb&VI#$8
8KarB0-!0`")#V#d`kl8CappS'KAThMjNe"V3T+*,*k%kZ8%+$,6ZEY8R8"m"dBF
&'UYe)Xr1$mZa-"(+a541kY386%aeUZR"4R'[K`*'3be0[cV6254@TLDLKI[kT26
NS`IYUDPh6hX6eB5ZQDJL()j26@)P2$ej3RNdXiYdmDR*FGF1*bIK1R9rp)QX8'0
K'cKFI+R$aG0`mI*`ZXa8+B-hAhH""'aQEb14mRpE",6hE"&&BC`ZXDM'3K&I*!%
&8TF2h[`hXp!*`RRik3[05R9Q&!!1*ZfU[cK9QXLMQQMZre6c8kY-[[Q[+[Z%ZPS
a+8k9b[VIC'mSkcQe-ZXcrP4BAcRC5f%G2dKKaLe!YhZT!%E$EC'fm[i)r4b)mrq
%c!EcL!d`L`Z`kF'd0I4cDQdZZP+ChEPSijP08'2*aT'CQ2A4m96)`fbi",0K(E0
KCMEme*Npr"5Cr@&%*H`2)aY#f0VmEb9K0cB5e0DUK+fYh4$#-V2I-X*Z!,-bUfe
dZ+)'if-9),88N@EhQhN1r8)j0#&T)`qFXHE2Hq!'4"cj31G6F46iq(r9(lma6R&
T62c0R`S6UbB%)@ZYV-Kk,b8KpBR$+HNCmRL6mFQ2@p)a[AYr[$NcX*TG(Nc[Ja)
ad*mp[N0-m`6MLKBGGhMYdX31DQU#e"F5'@k3!0%eBAD%,k@9XK%jDlMlV,+90cI
+dCT)JSf&Z-GT2cSJCj5"(#*HT5aLi'jaT5GR*F3rK36VrPB-[p)YQ)G(%bpShcl
GKb3T3j2QlE!(JD%A)PNbVN'-liP5dZ8*aBK&$KYc#iGKYM+GQX8BijmZKjqH8HL
mhZ)AaKc+M+D+I0'!b3PC#8qNaj8fiLS'h,D5!3pD,#XB82eK4*695MAE"&$#-Ui
L(kQTiZ!LYm&,S22&+GR)ZGZ*F3mRP6+N'N&Q1Y8V3VGfC9j,H[L*%Pi+3Ih[E*`
4`kG6!T6LKIj%li2-"e'L8%2bF*VR5BDlhAGq"E3#-Q[md6lppCA3JffP6Ir`[G+
RriQe*,1cKcD%@IFMHQkR[CPkAhT'HKcL@Aa#5RVmU@4`$[H[&!F'4rcHpLdj)Ml
[%34midFK)T!!!T!!2%lHBD9#5i5'S#-H@PQ-MNIb4V[Mm6mq'UpcRPES$DKAI(a
Tl)aY%$[E9q,UKEJa-d14f%21j6'BK62#A"YPAD*-G`!ijMLTfJ!@)!K)CUp-Ur"
Xm6T(G88$rrd+"Ll0dqN(9T[CGTX`1r0DBQT@HSBVq8KUb"h+Nk5+-m50PRJi@rJ
B5'NJ%bGbmqrXF5[9LUql(F1ZDXK)pf'9KQ525-I5$R5qP[A%YFH68M-5d-cfU49
bTHrDMkjS"cXKjA#'Da9E)D%clY5$6JFcNSiFYLH[J0I$8D4d*+U,5Kk*IZSLIP3
Q#U2+B02)@FTBi6Lmi`K(('A%&3ci*JC-1*LmN51+NPNNIMqA2EGK3lhj3Vd[,hP
U5D+[+J)pXDS)4$qlXDNmLc)+jXHmP#96HR#9NHL*P8BLXD'4k)Q5N5L`!C(SLBf
24%qX*",TNfKfZCa%'qE8Vb5*RPM0qFf$r(&(93YSGlmjdrRpp13iFRNH6[V2P24
Nk#16Z[j6rJ@Gk5QTPQZ(ie)2CeVN-pkmPJAij9Tb3PcURUa8qXa-h8p%"`!!,G&
"4%05!`"42`p9"AC&)b"cjHj8hpflfDb)f0dD6G0J3dSDUQPU9&AMhVYl)dK9N!1
038J)dL50L(KqPHrZETk94+L'SUJaaULU'YA@D'+-d9E9FfXmAc`h9&&9e9LEhrI
Y*Z,jkhpRhR2qhh2Hmrbpja`DA!%%33!%3D*)8eDFRfjG8G%Yki9JrE(G1iXjA%)
XejmVNUPGc-K'dmMNQ8,1$+T&(cXd)hU'l+QGF9jDlC5PY@0P+E0*T['qZ!T*9Ak
RDRKUe80ZU9VL5qQIj(,qalLZNPjTVHE($kDIb32j9h%YT$SPLlmEplNd8[P8(49
[TmhP1@T9r%2d,r)cI%VF0#P8ZFkRamf8ELJce&[aDA5U2)E2LTXYr8(j3(dKILb
G+lG4[I'[d-QbKcH,DbATP+&U6[bE&I3hq5hq5pa`+9Xj`!I%25'pVMbVrMAq+"d
Q(q6ZZ%%5b&mp&&p*AA+NZMrq$GTIISdr'YG2fUH8m15i"G*,bVIUiIJLZNJHS4k
,Ij%1NCrM2m60NiiSbpADq)IT-RN&Raqh8$UMR10,iTC+CjA&DR5mMmE)&p99mE%
9Y+qmKMmIedPDUkcMRH2q,Ze3IUmQa'I5,R)6EaIhT25KmT5D&ep)1mKYe9haHqL
IjChmEh(YT3#PJIH1qdMDUVb[lShI6Mq@ZkRAiK2THr+Ar"pahD8l5Lqe1(iErBq
mKIm8edFU8h*jclLITGh+iqSAm3@dShbDqmIGqdhk4VQYrKKrR%E*GpAemEr5TqA
[q2Ga0kA0bJ0eBr`rk49j*AmjlVkd@YR%VmBp)[eEZD4q%Vq"eXZTDPMmHCSNRq#
"F5(5+H8N$iVcNlj@,UZ2a8I3B0R%RA(TNU#NU"IL`fQ'E&$&H$0eq'6&)F94bDF
i8103aEBUehJT(mK[m%-mN9HS&9T&DFA!LKX9KbUiACp[c,,8UD2+"fXM5`I+K[)
j)`9TJef3!"5%H(XiK@mS&D6$&N%D8bj)q3KT#-mJM!46Km5(C"q!UK$QM$)C4Xl
*0aP8QQ8b@1K)Nd%MF5!&Xj4%2B8+`M1b93)mN!$%8K*(XE0cmJ9*$mbU8I!C"DP
8%b40,dMfFN@0@d!(qhkIFMaKGd*Z@8+QlrH+iFILEEje'HH,I59VARV6pjVKpHH
bI6R10heb8k`[-fTRSHr(VEZ,%clFIF4h[R$0X51q!&qa9,$Ipf,d&XHa@!)8[,0
`ppEGar#QHj%K#cPIr1,JV&!qq%*6JUm``bG[fefmXe$mIi%fYC,5a-4V2TAU"DV
+2Y@RpkQ+3Fq4LF5E*6hhU5ckp,*$6clX*6#5AK@SA[ET-e41Z(TC8[A!6b#""e-
!SX9b25B)6JBPJ)Q2Kr9809[9L9626K"P)P906"@63(3!QbT$#p@E$AU'N!!b!C%
CJ+eD$@930FX8ek-eBJRT,01EJ$9&6r(bTTb+P-T1j&aR5[*4(5G-(jA*K*)!%!1
L6(@Q&!E!G961X!+D+69C%9#Gk#"XQIT-NSk++GEM1V-%9LS$)DIPG+C"*aZ`,MS
)L%`dQ&1C5U$hLG6(H#BR3`,G-L8Lm4Va8YJ%`#D$68*mT"r#T,IK%+R4CrFC63D
lNI[X#L9&$8YNLA"Nr$IBZ4([@jr4J3a-DM568`)jL21bckK)GU2X"!SlCmF04T,
*@#4Rl#)"TF!%#*&J8UMG6'Db`eL0A#&U`U[e@Y%!"1GSMAM9m!`,[%6dX!L8-K(
0TP%Q!P+Mb+"mGSG0-TL+G,j2)N%-CJE#NbN*JI""46#Ra%`+!#UC-XJkC45'cS*
TLIe8eXYQ(*!!dfd)b,SY*hdUCc#m3"%SF5X'2JjV'$5)56C`GYT*PXI*jE3GTT*
9Ui&)Pq46Uk8PNXS1Rl8cVG,Bm+1h9HbH"0NJNNB!-kYF%5A#8Hb%)emf3Kj-1##
iD"FGGJ)#Bq&0*j1hh6f&VGL#N8e`QUXQ+ST1KPkNSPQbS50k4!0Mf[3%LeEm6)m
SiA3'13@H$C!!X!c!,420STM1e,$hV!bm5G9(QIL-RFV1N`*%0Z"+`3aKI$k&j'J
p,1@+E2!K@LH`4K)5A#JJSSNT1P1'EBV@3F!8"jQ)UF$"@6$j&)C,0#KS'BT#I5b
+"+djRF&8miN+b+!MdN#CdkD%F4J1LB'LK"5Y5%d1FPj%bh3!P2!TNk0D*V09QcR
9bX&'8r3qEY4cZe'iEHFN!I%Ep6j-I'4#5P$5BdDpk##JT1N"6!jNbq`S#PB$MXJ
'(#&5BQ*'@dKPH!Jq-ikE(33R50P1M1C(0,(!i0&Ak6CdT%"R)!3E`@%94d5Ve+0
lp@`Z!Xm&*jZCR)aP0K!j(!3T'UbF!@3kVP0B)D9(5DMA+D`Ne)&1B!J8pBT1,iH
3!!@Z"eq2iNl2$K#,kf9Q3bb)6JBK*l%6*1K%9!XZ10R-"S3A"i%5E4kGT5GpB(D
b%`491P(28H6L#%0[1fk'D%`QFkT0%&i0N!!#0QG,'9B4mB*LQP('fb"&SNHQUNI
UY`p"3GZ1hPfFkG[[A"ZEZ6,@ef6)@a-Yqd8r&V[Qr0G#`jU%JQ)m6)L@Ricq$V@
iF4`Hh@JL0"5(lfa+1&pBX+hiaq,FK0J2jF"'-qk42VY[GK!B'AP2Xpm%i!5LV8M
(`2FfUjr&)fR9L+GqYKcX%16c2&),0,Q#A)rN9K$#%%l,8Qjl*+X3!JL!Pmk6THe
4XQmlI)EXr#+!l6!eS9TL50%L`Raj["e"KKBEc@U,6#4!hq+D)190Pfr[U4*Meqc
CNCZhV6!cBLHUTS8*ZA*+63V)YQBrH8e!mEE#(G9XJUXAF(9(dTT-e"Cc-,q,2!C
K'&!ljEm9KjTLLf0KLH+%h-DfQ*4&6'&@[cVRNEik5LEU9`VQqCKMrepY",icXP6
F68iT,MZGQlFM0m'hqpl%dGL10Z"B&%*R35TX,N[E3Z5RYqR'5I2eYZ*'r6MH&+H
QQHp0"!iVb8!pe#1edT1*fNU(H3r-Ua#130-Z@5SlKF!pc[lp@)GN01AYf,PQCB)
[9mTMTS6p@d8!IMA#,N(DFNefEUeMX#P0#B8lLJ-)X#'2'ALMfQSAi!f![BR3(["
![l910NcDfDekQ*-DGh5V0MJk$FPbK+'#Y2fq,1eYNKd6D3L'LBT+-$4,mcLE(@2
V`ARELPIQV9ZC'eZi)i%T8*[Y"iMSNCTY4JJ3T$XMj*5YGGAGFeXS5bJX2VLYF2I
1(B@i,QV++pa4#F60U0VX[KUjca`Njqj1+0bjT[U"RQph+[CYYNlZjH8b$+DGZ`Y
LLpF%-**VpUlD$-fN@4rND#E0qUQ4"4iTdKm"(4j*eFK85F6edL-*Z3QCM3PMI#*
TFp3m8H*T!mTT!hTVXiP-e$EV-2FK,d3`U*%ASD1paa(CNHM`)cVHPScDp"S0'EA
T!F6[)TP1*QUE4CMI4clF)dffU*%S'5*4-N61mI50E2j$EiG[`S*NI+NRlkmTG5D
I9#H(Xr*NmQDc1VN)b8D%!M9bD11ba#2ejq2+NXN&V#aaY%$SJp$$Fbqb(m(iYVZ
Eh(+FfURUj&NfY8ZJYKH543JZYEpZI,AZ$9#GBeAVBQUGY3Mj#&8)N!#U2qcG[m6
cF[qU56YSr(h2@UA1DM+VXdiL,dDJDRrSkArDFl[rKRI3aQGe9'Ge`rN(b&XLY&(
l3kcq)+Iq$Cl,rIY0S'fi1JXEJT,8S%C[$$jT1japC[af12Z!@CeGL55-606Ck*M
CSFM4-E-,e2iA5DXdfeTJbXkmh5[AaZj13'0F&lZcD9XZ-5r$%)bN#d*(38T"A5F
NPje)EmTE%iX(![ZGkf,A*"36k1EUl+R#C@I(#EBlHkJk'aY)9[Z$%[Vh%qN)NDi
A+E,ILI5+5&m@D3H4(K(TNb,p6+5eM0XC9h8LV4,T4b,Y+e+$5,H*G!'$rNkNkd5
k5k3C)[e#T&0&kQ3Blc,APmdE42U65,-CR#E5TD4U5cd-+DSK*T%kC()9D@CVD5)
GbY!"HSp)"l)ccc(@#b,GLbU$5!IJXSrKhFjd,"ET%*%'Xi88NCi3kGp&ZN5N@d3
D+G,HV1)qJXhMfAjH%XP9fJSQX9HN-8a6-j(H%@Q@5*0%qL9$e*@*'#I50dAkP%M
h-9%#42U-5-Y%ZP@NKd3k4D4rBU`$6$KSA91Y,jp0!TQJ12bd5"m4k3FLp42T$*%
1&qRc6+CJC[VAQ%`r-i%m)UeMZaAC2Y%CA88D*G*240UFU95B"*NLlF8k)&5NpdA
U%ZP+N9T%HP#N-V-)QL+U&29X`qM,'mcZlGRHfSMdSNK[Xq8K6&CBr`GQR4iLrCE
YB3(6FCEYqET)(aETVb+G,Y+V)[e+T)NLA5E5MjQb4Hcr!5C+#6-00V1D8Fa*CYB
JN@jJ[39PpjJFd2eq0BQFCaEFbMEj#`2p@U6(4IU!J@jKeLpLKJ0S+j&H%ZPM%*e
ecbVJBY5cMI96#`ENBkKrCIhaV%M2L25`5%0%qKlE!&!i4(T8T-2%LKFi9H*p&eI
&k2a2YmVT@$$8RKV@[+4p3(*9rBBjqhShp0-l69eVZf3Z(h0cmkbM[BU(j3G(Y$l
5VQPHfS108`pf[q-f'X3HjcUYAH+01YiQZfIZm+b3!&2[&VAGY5MdkUCTqcrH(QR
*#'pjT[1kK@2[VTplS%rCJ,UJNbf1G5JFFIhqkZQ9hDj9Z&4*MS[Z'l[BFqqECQm
qrX9[Sj,1IrV5hhBZH1M5*hpjlD1YMjDR#hpmq2F*brl`rAHcrrUIEFm1[[cBCmm
pqH%2YklmFmDVrrKbN!$Q-2rZl20VPVjbqmI*ErfmqjH4J5Fq2rcR2GmqmmLrTlc
arYlqT5NArV6Llc[Q[r$dVaqmrY1@*`EkIIh9LdrP$ERamXUCKpj,e&d@GaDr689
fbV'*[b#Ri)dr"@rm+C[*4*fb#[2Vb&&d6VQMZR(C5VZKm0jJ2Qjq+lYa'F3R+*!
!TV3GcEYa#UV'8q)p+90Q-54%DE)kT6GUq(EN-GCN"+$UN3c`5&1pkP3[+G4N+EJ
G`Nf%Li5"p`bUC@kI*peGBRe663eATdDSlRf6[TE`-[4h"da5)DR2bi@P(X[,6'M
LQa*bmll1c8c)CA1#lZC%UM!CHH-!ZTM9UHf3!,3N%h8UkP0688ZCLNVCe"'U'aY
`*b13!&FcT%pF)[XRGKSp`XZ6#$!M4jf"#XZ-XFLaPaQE9AIl5C!!qL9fQ[6N(A9
'X1U1UB'q$'KElCj9Z3K-1hA'aqSJqp-6e[SEA46-Q+l13(ei4J[Nd$M$V3kU1Y(
iUQ&kQMVpM$SS)-UkVI$BhFAr4@9[q['*'0K@-jk10rpd[2@RTj+*1[dQj[Z4ifd
q[D-kb&SR(-6UK%LSjfCNUKAAMdej@riE+BD19SUC@@Ce*QK[jKNb8@GQ3iSjb#(
*c*2U)(qV&29@+5jkr#*6alrJR&JpIQE'q"@)QAHKjVlRmXcfM5XHC%'GLHZ[QEM
qQYRF1PGR6J@V$02P(KUMU)-kbXkp66BPeC8,R)fT8Q23-FeYkZq#MASrqSfd`B0
V!Q*cMrMBNKqCV#c1MGeC[*XYq#UV4@k-VVVq%QA&P,IlIm+#8p[0DJbZDf)kNJR
H4I$GiG8BQ#qQ+m)F3ASkM#4HI)`JADNN%),ck@'0KFjlCd,EG0KY1ZcUBPbm,6k
!F%U3!1iq))QApT1G9dSBKN[Mff1,$D%9I94Mp0De'UYm2mi!lqLBc3b,1d'%Z69
Q@,b%Q'(a,U5S4#pf#G,h3dPL-i113!M1qXc'XZEp0l,@')0SXUY,F)f`C#e#'65
C5-+-m5#5)DQhDE!T@,YYhIpXk59he5A[#P,p,)rN+T'PfqKM&pi1VP@b&)+ZGD(
fld*jkd)Cl%)Cl%)AZdlMBVPjihjGKq,kRDPlek`ZVI0)5i&VDB3JhF66%aFDh##
8Dbk3!*B,"D),E`2A(+YHA&Djd&TFm6DpVYi-qb-6l[-GQR+T[lS8Zld%e)1'BVG
iEZ&#LH3Lc4h[(aGDK`YPN!!,jRDKkeai(lN+S0EAZ2ZUGrY1P@,2bl(RjH%)a`A
T0YN6pMXSaNX-5[31pG)5SYT,I9jDjD9%Gi(h[VhQmX*kFH($jj!!DjS5BR0jp!6
PN!![HV4A*,jSNfhahTVLV38*eF*9fLk&3KLhZQKB2YaD0%akSE)X5eeQC)5il$T
fK![KC5K'PqdAT!GYCHQ"k+Al[&6adM"CHQ5iPq,Teb1G[(5$,&fDkU@JTNI@HCd
"4Gc-9kKRM6Ria1JjHdR1`rEDLpQdePkl+PXjCkGUBU*K)Q)Y0)a@V)9AcBf2-%S
M9PmBa@4Gf-'X,ZcMF5kdNH[&P4I)Q`kGZ!C[eM9Pa9D+YEQGKFA9*81`&D"DK2R
jk[cVie$L!Feml(iqGRqPplpYCqT(Kj1FVckXcNGpE$l+L[NJZrPG"+N[DMpp49Q
k1"`"er)A$3L`iF[cC1I,I4MQ,T0)A80j%pF#&@M0medH+GN,#GGE*Eck0ZIPaN)
QHmeU-ZU-bAMQQ%`&kIN$APV[TEM`l45*d")K'1%)4%GeEZ&8YB*#iY9HQJT[m9*
r2"M)NDAll4(`U20qD$LjF"R$,P*0CLQ,IU0fAd3q4[4)h4GpV9E%H'QbP`j9&q!
c"0@,jIHYbqq2Yq`['S`k,(pXAIji[1@Ba0-9UP(6PeY+lD1b4ZB2VKZSmhKI'I1
(X5p8246k60UYkcGmdHI1eMjmCNA*5d@(Mcahl-@F0l2I1[VA!kr[Hfhr'`GIV6b
Na+jGNjQ`ENI!cPelQMiXc#[i!KIYfmUf0'cGrZq0rebpFYAS!IEHqI*DBNMVi-Y
"GkqqR*+D&"+)h-rrAY6YQprIIEVqdY9((Pbjrr,&[TfHlr,lcRp[rlHfIflhC,I
h1MlHmqGHrqRc8qq22Rkrqcqk[4FIeq0hAIrBmNr02hdh0I!4heFTVCUeQ6aVpY`
2I(-UTNfC1Q2kc*M&5jBZ6r*2ZHFAGI2lfdpI'PVri2k9C`FmdHr4b2lZ3Di+rRp
U!eNdQi6`#f(R6jf)H1cNekHr1IlMjZr@rlVKNemffB``@SK0c!K8-MLFk4Rc2ep
'@b0IX$"jd3rIcR11q'e)qQI$Krf5-Ei01M`e[Jdk20A)"TqhrXcABT`0rY,B"XX
@cNpHX1MEH6q-'$,dYq'r$"[2"T2mM$8rp4hmb#G!%rdT&EBXCb+rm@%[0[V4GrK
VM'"9Sjr5k&HKm0(rUNqV%f"@rZ[Iq,YTc)!**K6@2JQm-TUPF4*0HSL1"X'%CZT
8EDf*fFhk-e@3!$lAd*2Ph)+EPZam&-rL)hNq(mcVF!Z6MRX`91%9$)Ak!ar,Aq"
9r#%HbTrKDI`@[iiER(`mQTrMChNYIjLIi5Yi#Aq*&r($r!Kr$N-$AN4h[iPEjpl
#)*LrBQ$9kh`IIih[jfrJ4YKAH59ZMd*(aI+eI!hZVN[JkrJ1(X"hmPem$frL(r*
#RSG4BPr`A,kE&r0Y[)a[i3em+pr1rmdhmRrbeA`PH[eI3E#Ahq&ImQZi1bZ%9`6
cbcb)hq9AqFXmKDIb*(!$ZBhYarhj24l&Er1Er(X!2FhVq5@!2X)Im#[m2SjFj(e
j*rimlm*rcc[c[r2fr'qm,ImcEmHIj0hiHl`MIjchj$rcA[`r[!rrLIIQ(r'2qIZ
m1rm(!iM(285m"rmGlmVrb&[b2r(Qr&2q,Z3)K*D[m'[&Qr%fI$+Ia@IcZI`$2JH
rDA`+RmTRm1Pm*SrKLrN5[T3[Kq6qf-%p5"h&j,d0H5raSC!!q3&N[F+Ij32i%l`
IIj4(m[lFc3Ga&km3rqq6J)al"-cFa!8HcLr`-(kHRq)RH!4rM*rNAr26r"YqR2r
)0r2[q(Vq+pr!2q'EaL1"I`A"1",!L#'*'lL$1hNkcq$cqHGm'ELYZBfpJ#rNbA`
4ri&rbqF"D!6rM3m"k'Gm1"r'Im'4Yb1"$[bTYb8"!K$2+bC'!Tp$KXpi#r`Q*)'
ri$Ga%PJ'DHG$hJ@3!*M)q`2N(3)5q!h5rJ*j*dS#A$e*(j8GT4%RiHc(L4[9KlN
Pa'9P%$HbL,P@a1@A%$H`2A06LI-@%KFD60`c2ZD1%RGV2A1Cc$8`ejZj0Xc0*Hj
k+(-(Q9[0R*1jRX`e*qk'L6PrjUB4je1BDdYFG#ec$1MF*ZEZ%hG@4pb+GX59X!2
l@K"hN!#*mQSaFCAX3'8ZFA)NF@D41)&Y0Ga1h2P+jTU)qhS!FblL6PZ)fl',ZD[
%l3SLENm!Fqm5ej60A$ea(c)MIVL3!,K#TVL3!"dZC1)@XUd@ZSR,1m-F!mTMjXK
MKXZE6Pb"PlN`jTMS"FaBZ3q)+f2UbpJQbqB3Yi8CBXX"jNia0jbiKZl-XFjSB*f
pPBQlPCPJkfEQf,DhXZeYCHEHbT4YCm*YAmFFfm"fKQ)[kr+p8FaeBBi4dekQjXi
)iVimae`iFqc!08Bdeh+B'dTF)M0Z)J00C!Z*E-1*UjKMT'"JR@U`6CJb"fGZ$(1
-l"c-%!j'QSk,c$%#FM!e6QBb*f-jQHR6@@HRXmD3!-k1T6-#5QI'5QHGQR'-18D
b'3`dJjNMJj&8#N1A`NbFDQ51G@FUki"8YZ%N4PJKM("$#1(5%"pVK5'XYB8`HJP
KI4l)D#4`1h1GQ@1f$'68'Pc((1Zhi!,Qf,&J4ZQA@8Zpc'5m[)%jTZ!bkmR,V'H
#Q#a"$%83kr-JeZG"6)LJMjPMk)*B$`FaaAkXCrcBR[aB6rUaRIQaNX#2pBNI+b(
miTQEa4bcXAmqFfchrZb`2f[hrQA-X8hk-q(mBjKMEHiHSq*lejPMLZma@Vl(V(k
2YC*l(CPVb4aV+e'-&U*Bf4$&D#'+dA)8+hYZ%hU4ETGS20qSm8i)hBfD@QI8M#D
%6+1Q&5#!U3p"5$CUj4DM0JV!SqBDYF(AM9TGJe%l#k!c`3KGMGU+-3J+`LD%ZdD
Y")GHDS%3DG5+aL,X4pL!%)#3!)(`,X)`ShBBL!pMiI!k"(qMGX4Ye*ilKP#*F"a
K,8)ZJJ(K!B6MQQDFUQN@RkC9VGDd&EdelA",66XbA0-1YG-dmD5QQ8Sdl8+QTSA
0dE6cZCTfiJ##U'N4CCVff"L%D`Lp01eN*8)a3Mp0`jITD+G*Q+9TRf4VfZUfQVB
5L$,V0'eG,F*QK'#%C%hEX9$6![)4MQTD@T4HbmR3DfqBp0UVqrAD)55(fZNedfU
p*[MVY9mj!KCiIVR'3mXel4T#Lh*0ha["ADjCp!J4#'AP@QPNZ@B(N!#pCENfDQ'
j0RJ-3UYbVDkNA"Yi[ecc!ZL9VZAD#mCbV8T%Q&HZ2B6&KpU9Dk($bl9R'K#Z)M3
[ep*bbV9EU3LBA+p&f)53!)%`SPblF4TK!d)"3Me#4i3j#+jbcCH0!)&mK3Jh%B$
!"f'Ll3KBM$BJY%A!*Xj"N!"c3(lf'-,FFUd@`YHH3B#`+cBL1"%k)!a&k&HZPH"
`5CpblD9c#,N)$a#JZ#JF!4Xp[+KFHfjDZACX9VRf)K#qZEeFbbj#@)I`-F+l#02
,YEH#%(U8DdH[)a`[erk+MHpV8kkpCN&3%,UADrZ2)+a#Z)X!3lm"i$FJe"X``KZ
Gbl@$AJ3`$d*"*6Chb)H!6P(mbc8CJ1)T""K3K)$Q+J3Bk`)8AjKDVS@P)45ADbG
JQ)Kp#%hSh,%@M@GE3*d@VC4E0(X13M"#XN8EG4,K,X)5LjD&KDbf#2dXfXK`K(B
)Q15E%,TCY-&C#'k,9VI)SJh-4!!#h9b,jZPUdEb9&QeXJ%8,l@c4RLQdD'P3HZZ
D"4eUdFj&@E5c8&3,K#[Z),5aD%9fK&B@lA#$46X5Bp'1a9Zdl&d@lDep&ZhSIB[
fHLS#&*eBKB!N!NJMKPQdam"iV,9&1jQ'!+$6Ca#Z)N#`Eb$!0l-XfR%Sr"'(IJf
cD"XX#0KB,!l'3VLe-%"!(F)kK*i@V8PR`I"i9*!!595F2Q-iZ5QGPT*l&U@3!0k
QT&8jCrK$elQZ$X1a&@P`PSPk[)C@*#Ec9d`dV(T'GH&iJ*L5c+2YY6`IYdZ0iDA
!K1G"rI#`1CjQiHlJ,0`Ak%0elJ"63YEN91G"9!B$H2N"h-YV!dVYjjZ3!(FE[0M
+iabM-IC[jV9&r!8[[U5*PRUT'jmlaZ21FFLbeQ[S3@3DlM9-)`qXX)0,'da%cc#
m5!mfiRNDJq#daa[BJeH%d9NmbmY,ciL%CHK0N!"1p3EfjSG#k65HTH1PBfa,#mP
5M$G`)DrBC!KRKp*X5jhT+lLep+3hT$1[#$h($KddMcY8iJeCb"1V4,ELXkdN8fE
'i'3HHfirejeMq'5f0TfXCC+%fHSfE2@[@+&qeL4@)$a2Bj!!'LY%M'q&APBVp),
FC'QF&CMJdlb"bEaL)cUE(!Ue,A9K9NMcKR6K&@RM@@'je3V,rh8VK"!VC!A`V&T
H,YYiC&pfGS-,EQUUca5$mCL$"TrNVp+@I(q@I2XB2h15CfIaD"V%3irb9mEbk!J
6X4XqjBRdQ@Jq,#K,ZjDB'8d1N!!G9l1i$U11eK,DVQ&j'NpY"!+5Eqp0k[ff!Md
p6%bb!k6Xl841bRpE%#$TNim,`M(51VibRfqXjGrPmeZeI(mqIlf@jq4M!#-rQFp
2e(*62TGVqETmAP6,cqCchfUEI4p3MmIK'NDa,Fh#8R"e*'B5TZSQQFIVSfcDQQ4
B2%+QaXiN`c5-6FZXQIU!S@9Q`,6*QKRRHS0eI(%9"J6AiG+pTQqc[CH6qDUM*hP
S#EH(mZJajKUk04'!$+qM05GYID6(dFp(,(X9j!+M6mT2@XiVR&81I09A*HJ0Ga[
hRqG*'S3qVh)XapGrfATaRLFB[*J5'N@X@TT[Sm`BJU+M0b1'qp+8kM*SU*`5h!+
FFq-idZ80',16dkJN[,c"P1'VNqj`5kK0JpYc+C)-,0R2A`rP1D(mT9"q$JmJ3[N
BM"F6f6&mc0pH0,6RibE"M5B&M5DE'dhf0CUNe5!5R(8+,bF0M#P2KI,SfNemF*V
X1-lYDED&BEK08QFVF4R%Q1fmh,TQCHN#DPKZ6`KK53'dRYF"MiQ25V-Ce0A6KJK
T(b[8"QVJPZTeG&XNlM-h9Z)'mfS*'h!h[(85LE['p'6X!$'IVA`*,K#5UR6FRYq
B*XCi8r'bZ&l*GI[*f"CTC*UC,#iKdN@55a+1hJUVi35$ikZ+!$Nmi+AfkM))-#(
i!%%dR'QNEpF58hSXRX#8MkPjJ9c'#d5Vfmcc8HD%BT!!XFd%C*rj61Vq!DB3YHl
ik!(#*VS&QL`R9D90`2GjRdcQmjfV5[J41ep4aEHNmA0TI%dYaeIp9BAb@l3p2iA
fZjDrL9N12j*[CQ6FQZMM*1e&,KaCfTYF0V*dZFIKVQ+!VC!!fKQcqhpp*"j(pVf
M)diFU@Pjra9Jif8r,&IS6,cZ$"p&@r1kI&-eSHjM63fISGVPL9N@pBLcGCXDNIa
PE(@)G,f)ieYN28Hj,er*m*Mif&#1@rJ)95kd)8@kK&b#FaZP9K2b%YPT8"T9,eD
NKI("S@4)LMfdZS9B'`mMEp&3A%03%$*(`4GTHCA!2hMjb$4H4c[`XhEf!Ze)2ZK
YPS@2XkD6qK!T#UXQC!232jN[cYR!ahKj9K%8mh0fDbf+!H,f1hBkR+kHJ!NS@')
qhTAPqb#RG5RAQjl-Bl)hFTpAFGU2N!$4,!4GLfU!%#ZkY4-`!B8Al+UU)pbZUc%
h!(1m)8"BCH*CBp'dUPr)eT1R#*&R')q4TS'A8ddEar$GQYB@Y$MR00[G@$lif(L
lqq`8ENqebV0q!LDJ3SJmY6`VVE(LF(U!0HN$0H8[H8f(6pM%-f,(d15DmRL!*iQ
89'0TaaTH2fXj9GDS+b1(+NCTp4%PIVZ1Ep2aJY-m,))RMZ9KGIcpFccX+$GlH@8
@IbfI(pAa&lfmU)SrI)DiSrQ%@fRL6fcLHbVjYLScdG%99"22N8dP$me)eYEMk+m
M@4QD332*YJ2S)XQLb--dNYdR6p)i-88K4[[YCrE"l"TQiG@cMCK&9Fm`r-$BeNT
JaJiN)d6GM6aQBfRRDQ@&j,NFSrK1D*R0'lA-rbeeqImVkKa3jhQ(`"RZjYCK&e,
H'P%DH&#3!2CJX0UH6E)d-!$"K($k[$4`JhQ5'm--iihD`2RUJ4b6hVA4#-SAM4'
eBP,9Q!RU3&AHT15DJaJiKB(XZjE)3AZUb0P'+`-aEQ3A2RRIJa&@ZM5)KjX+GIV
cNLjrG#)'Mir#ZCL6YfmJa4HqT9AaV$THZV&4m`Ve1T0(Yira8@%VeKe2Z#$V(-C
X-V#-HY9`fN@82'0Nb4)Q5$RVCHQ&M5*0&U5GTaq60Sap6)V!c599-,1q!'0eFQ8
TV4Ik21!6aklf'28('`L126k5lYNNS"8KaC0RjTScjbBZl`acQjKc-YHEZHRND)&
A!!f`Y+FXjD-#p`@k0RmD4Qmp%$###j1ZXV-iP+,'iLJZSl&QCh%h'QX8RGY3jQ1
8h,B3iKeP('Z'XP28**8&#)Db"QTbP!86a'A0"6beTU[-dKDGJ1I8K0Q!,pM)lb"
,$GKFIVeXD$$JB-09`G$3RQ6GNE8"KSBP"(UV86"XhBa"b&ZEX,VeUZ$FfT15XH,
EM3$DlL9!f`m)KZhVU-QhAF$$DmCD!Y`@fE#h"%Ih(X64[HX&`elJS(YpK"G&BKF
5qj!!e6Db0(+j,0fT40*5GYjadP9k%51%"$cF*JLr$"HN,p&&)f'IDcj"ZSDE2%C
Haf5SB%Ld!%AL1@3j3*JB4Z)U`U1#)l%6IG(X5&a#ejJG0)a-D$FD$D,#G92@IYN
Kc52S$E@#C'J##bJ0rTLdNL9l+jNk`L@(JK`GlmJ8$)kKN!$I'@j`ZU%MR3c-6Uq
&S[4+`C!!(N'QUdJX*M'Ba!GNY4e@hbA6k5314m`J!QIi"%-'-8a'"$)FFQBmS$j
8pe-8$0V!Yk$BBBZ8RJ+UNd6%e$k#P)6hKcd0MlE$$5&%F3KZ!3Sj+8ZP'+m@NLX
i3KB5bJSF3`i%lK)-JGZK,6!%S)(Sh-$1C%UX(GJ5ddKN`A@#)6JEr'!6LCX*,e2
!Xfk#+*M3Vr0b#59$Ibp(#(MJc6JC0NjE`AQj$ci#&`fAB4BTb#iiJl)*R4U##++
J*M$UEBb2#D-&'*'%)IQKUr`1J1NA,MMp#Qe-Ic!*pIR&#`ErF'6qU`8m`#ClmBI
drM'%0d"`hMY&P%VhLJA$[CBJ`(ZX(8AC"6bCCZNq`A'l&HMGF61%Z1p0c!dPlZi
$iTi1BfiBf@4p*MP82dXJ&mC,cG,9YS)$!`SdXq0"@l,d)&*`A#%Gi,K#@UhKILM
NZ,pG-0`R`VjX%C`[cf-#A3`6((e[NM0p"`L1j`q3!26jqXHFSGeS"6Se,9p`T"e
"'j9ZQ36(,5HY-%[A0`M5GGc6T+ZAR@I2d-8``pN#c2I,dPRFaeQ,FNQA)cYV'qM
5%P%k%b`icJ`JH&H-%C`V&Y)+M-!Y55DFPeS)MU)-3Y9&lk,3I5!ELSC"2(cGLI0
`&HZ#`a[3[iIAN8LSmc"TliIp6p*3@4TXN4hD0CM%UE@JLc%U9Ym1Aeb#eT&I*N[
PS+jmh'TPd3Y15aPGL[95P2&f("b*,d5`Yk4RXEY4#p&bd)!(Ma'N`3Fak5il"VF
LSYAKRXkXHJL&XB4C31B&dP&i+Ec5&C5-d9`[i*Y4ALM#*%KfB"J)"MTAiIVpV0P
44CUPik%5ZX)X235*(TS&U!"m)%V+,mFc13!b2%-+Z@HZ-NjcF+5d(-'CYS(Z3(q
NSH0ZTC+e@k3XGPk[TDT40&cIK*eIca!FecZ3!-AV)iL80di,KK[%3MF+5+`(c)f
1JZ2'(!*c`dAkh8FDL3p0h1%V*'cI6FCZ6YJ,F5!Dp"HG6AHBT@J$8N)lMQM5LU4
cf1)jM&QcEmCRU,hTBV0dpKKD,)UkXh-&4qdCG*ZMpMjScr&`#CB0$pp&5I"`"eS
"FPK4+aK@S'9++cB+MK8G8)4*+iB+MT,M"(q*JH![3E&3-KdBHmU1PdK"DAJT&f+
qp!#$AD5AjJJB%519`VT&iH43N6mj9)6#VE4"PJlM9VE5il,d(0ifT5KXMX()THL
0&qFLXFM5QlKpcS)l!l1,"%2fIFL4rE(JH'XM`I4@%-(d9Jm`&K('dHZ%F46hPai
PTmTNaemE#1Y!(DDVm#Na*q5j,dG`l$14VYVA3A#mPNR5ehSKA8k!pam4('pN%(4
[G#D-0b#A"A@XJel"HA!A+fN1hS3B"r&5Y1b6T9Ia0V#FNCf9GVUU5R3HmY&9'&p
qU$IaNZ*2U&CfbK[T+T4@FR[")IFL,d(aP1!3Ha)e)ZYJFa@K-6-DA[N)@ES3*$J
Zp#%,&kB5&jC'PX1+X6a(PNiX&"`4G@3KBKm4-D,TT#'EVM'4FBRPX+Jk&3QUL"U
q#80[`1Irj,Y$*$ZfRC9$fRi@5KGF4L,0lbBi"fI4qAL"$hE6THMXZN@#Ff!bBqR
Q-TDRUb"jH`!98,lL3R*!P[k`RiaFPk@aH!YUZ1(a)DM9eXT5D'FNqh#23#(HF&)
DAZmDaNIH)R9A0,FEZ"h@1!F%'%9Sk#`DSK%$C'SaqX@)aVRL$ULV$9NU)5bm!B[
`RP(ab,@S&8&hQ'`0Y(%%JfP8[!L2a51j+6ZbGa'#I`YGSF*!4p(%eFfbp(UUi(K
p%8'h$m24TXQ1r6lbkYh2AX"[A+4$c0*"M%($ECb9'*698hBHkN'(M"'GXTG@M"@
GBLSG!Qq1S82XSP2JE$&m-eZmd)SYRMp'&U96'$1'Qd*2BDcH0GPaBK9T3bF@%4G
45)VbL''#if3D58p#TY1NR*!!6VX&acHcD*lCF6b+*TSG2l*DfBqGb1+2L`4T-`B
"9XU1llS3cRU-1#b4(HZl%b5rKTRa)B2a9(')ZaeqrR2Q+-HYBI1F15hGE[F`9k6
,0GcTR1ab$5!4q@b5peZ-1'4iBM'!h#jA2mBFRYJceH9bh36((G*[K-X9ZF49rHH
1G(mq`HSbka*CM)NN++C&-KrTLZc+XKNeM'A6hHjRh8b!!@""VLH@1jf46ZG`+m6
`+H22PlRG[q"!T2XhYrXhJm%``$f21-+DDFXBi*!!U3Ef0p6pK02P(Q"6-D`r-#a
bpV-#rI,P,LF3r1)Q8Sp`@pP2c(2fF`phZT`-k3)RX95NZeP)P-Zj("LGKK(-+)r
16I9I41E9M'6E'CZBbHbF63dl0TaJJI!,#2XhCU6)*iD3!0Qh5*qY1EQ8C-ZXdqA
@C0J#!K46VFjUV+'2YRCYAlpbFrVY%$qPNp*0qH("Ehd$2qVq+2[V%pAI,q4fIrq
N&1@I`HP"kFVQq6fIR(ITYhRcjbZEQ&Z6ARm[*#5UIe$Ii6m2[h*aq10"Iarq9(e
J8VZ3!"$&d2@pVPf9a%DKbi+ZF,2KP,XK,QI'4hl%i@X*#rEH(I6riGrHii5'hId
)+8GqqS'9h$p2(1XQh-6JH(IFTj(ZZ4R[$XY)[*Ma'CcrYCkZVeb*38jAiZ0I(T[
R@T,i+fJLm@HRkeUbSBGKQQ'a#cdEjh,0G,PDZ2jSq0`r1FVTDSJf'2!2A"cImQR
hIrJ0'+E3[c%ANY,hNAl$fUF%ikI-5%T5HV8EePRTK(il36U[l3$P!b9#1AicAIQ
*p-NP%Pmf+1F0P`hFp[H@3Z@k#iYApKja99Pf)L`Me5mee4QBN4UbqEZS9-@-F(,
Frjp61kEqP2TaUV)aYHG6bTAhP2@2bf19'3Uq&C'rS"3k3X6A1CkmCpa-[4d8NU+
B8T5)QdVLpeI`aD3C`B("4#%!!"bb384$8J-!-0B293e90K%3)@,Z8[pYRkT(HC'
I5khY+)VdA*IbTNKU``(4JJ*2VB3H4C(U5LBbUm9G4l3-PN4A`6UYMl8Vp2Q#!AY
Pl%P)eXGJaTYJJU$aC!RQ'%r0%XGRCh-bib@XPh8`pYMB`F6"R*F3KAjrrkqIRf6
)j2CbRcmETLF&3C!!"%%3")"Src[,1e`Z[(Mf'$0"fCKiZqKID`jV2UGp!Dqe5qR
2f9C%Q,-"PAaFIkHQU"efqXkJQZCmr+$+-9NZLl(MGl*UD(ba6Kpl24q[dR5ImJk
4-41CjcjMP5AMLjpEMJqljf1Gjf-,c')HmijXq%PEb0!8jFF5-paVq"%&5Lm8CH3
4YZbB2&VA-0@Rl36SrkUJr,3chdR'UI'(h[aN6lD+DhFCb[DSE,$kaqJ@2RQdI[q
0RSRIUYPP,DEc8%%l`LeD"CEbr,ap`Il,$52mk($M3CK8KNE*2"FBR,23F$3Rd&4
fGSI2'))BRIZ+H6+%jVje3ScLZia9G%bBCjD`bMjUY!TFl+CAEEjS%G`LlP%E`DX
UA)UAHYZ#epGqRbr"KF1+-adk,U3lQ[b[E"Hm)*Pf0c5`Dd5B13aJqIJ2"6@T'S-
4SE!N-q(X$%ZaliTTEJ[Ca$cr@NL*T+dajP"MeIaVU#UaZb,TbCl3#@031'SFDZk
Hq+elHr#B))rQE6FY((6DiZ+r&SUDB815bK42)eQR'Xl!&M)6a"3""PH$!FIC(E,
%rf,Pr"RR,L6Y1$p1a$*Qic)UVFR,a8PBjp-j#c88deFP(RHYLU,`fL"HEC0LBA(
Mqm0UV8aLJ33Mp+TcSEKa[Z,3LA1IRBY(6N30C8lapG&eUr,'MDD`&NMQS$ZY0Xk
rNd((9ahHNe1''ap[N65CEABdC"KLH!$'lX[BfQkM#@QV@55YcXpj+5NbT$MRG)4
X4Rr4(,IGXidVU%U8FM4YifSK0MGD)aU$51h&6#[QGTF+9UUq2b`L96GSG'G6AS9
(@c6!c$(8r+a%)b5NC2UX%Y*l4AEX2M)Hm#2HBb1TDFTNKm9m9a2-RJD)+90IPCJ
"BJ2fq4j50AkN,)b8d*l)0#pi%0Fi&+ihALj!TD%!BE2#PXPSH)pe$%JcQmcId6R
CFq[$KZa9-Aq0,V2a@NJaqU`M'kr9+S8qUe,X-ahpHHIYNcK1ClMS0d$`X-EDX4k
2Zf"qhViX-bk1FcQm$KXL[[drTDELC#Eff39Xaeq[kN)+4XbPiUN&KCaSrqAi-ec
-UA$N&a4Jl0qGEISM&%3,"h055(N0YC`GmM6(%@eda,"5c0DS4YklH!hVKJcRR,r
jrS0Bf%D))$9PP2FZ!'#8H1B32fc0R8NHYkf1bXNXSkqeU`2@iFqZPiLYR4MX3Ea
X8kK8-KN6MT8!UM+[)H2%FDU+Nm@ZZ8Xi8U2'RP+BX3Q)TZKF+LcRj844m$,-b#m
R$JJYF*Pc8T1F@JJi1TT@GBG8TV#je8)I#NqL8j16"i(8`43AClJR28#T"9p2RA)
$L3'@$&#)8&)Qr#m"`TQQe9fNC,%e&B%#R,2P8J5H5QjIJF4F)a6!Q*22MSEGaXM
Na0r%N5bUIUHaF0fTKba&'2XUddd1lXid-49`QLYYLE"Lhd*T4UdLpI6`#LH'('2
ECKi98TjK(X9#U3J-X)9ER!"*f(1X(*4akTRK&HC4Vj*jI44#"p*ch)DI8MU18HG
c3S(V10CIN!"%Ka%C+Q-YZAq0Lh$l+b$1Cq+eC)l%F)NMCFR6pPpL3$QfX1Ve8@+
Q#AECZPdPQ&S+8K([&&b,XNdJ2C3YfhAD9lFVK143fDi5I-DAbEM2MfcGQk@Bf)D
*fSmEhbbPLHE'A8HDdI%HeRI9'f9[PYi$4ccY43dK+k0'`dBNq)jPALXqbr03Zl'
eHlQ'T&+5$e[9SJQUi"5PGN69A`@c90l%k#!"kZdj455LjY6LjkmcTZ`1,E(P-&H
d(rdZ1Y+R2CBYfla85db9ECkRl9`8AG3pF8"68!!XFGZ*+"McfSr@(8E(q-1P2GS
2Yj4YRU2pD%rCjVHdZeEdV,L@6'rrN!$q6Rei4qHYRKZp@89,Y(BETPmM[!+[ITl
2pX&eMENXl&+ACLF-%d!5HhY1f@XXB9dpadN*)#5V'JqZKbK6YQYZ@**-P+M&"SZ
jXVZHDHVJYJdGE-Y,+58)8DpkfrR-DeBT%r-`TSM4F#$AC32j0Ua[rim-!5$*LPj
316[VI-0K)e[Q'rE9lAi[h'*[E2cC9MJEYidre2M&R2r$AU8HS'kRC0`@1A#")9e
1fG!hh2M048kGG9F$3HIUEeQGR+PJ&Gh1'*!!H"ES(!Y29+Dh1KTpKfFDGflYab+
RA0X2DidrSfALKqCC8Cb53PRMqb9#SM-d3-%&(R+aGZ3X*SGeVAmUcl8H5X4J)&`
2`r+kUUB$h0NA*M-A18S'q0JS"PpYMk"8YD2)!1#r3@$-(da!D""Te5S1#4L`9kc
Mk9dKmqKC,BZTR)V*ac"d)h8AVXFUDKETY0d3N@%fHarTbqr-Z&V((dTmSTQ*$%M
%D8LJJN-)p[P8TB@4lTl"9HaS,Vc&$LM+"l6bp)c-"R(!lZ4$SlMD(Ka(F&VN)pR
R`kLhIbK`'*!!5*pNkQQ!0T!!h&Z2F([E6E6@d#39H!$NCe[eYY1cSi',HJ8rVF,
PSNmN`Xq6XEkSj@`,[SGdIbGY"MCH4qTHK+2VZqJZG[h'@JQP-S*"-'%JNBfK#ka
)Bjk%+)p'b@[4d"mN*-`04G1e",Bk5mfTkS%ER&5ACqNmTAQrp3X'MY*`+4%RN!"
XGIL'V@k'R)jfaq+Z#S!Q"Y#3!2Pb292UUcHY(4T&Pap3j`m%1YS@G2N"95+pCSb
%cYEA3T8ri&(P#""+l()p%!MEF20L29-fj8iSQr#V6DRFCAC*+"eFr8lr63051Te
+H"e!J1RF51hYlch,0R%0IME&qB+AS'!0)S&VES+4G3e)l'T(3PCN+`La!phiQQj
5JICGVKAMTpCd3k4Ep#FFa2@Z[G`e$m@RHpid'PGdi4%%&0cR1C`D9*0&U%P,b0f
5G(e,6+%lXH#PKH5ND'$"irk+NcErN!$`k3D!XKYS[kj0S`(!e1+L4ccQ&RqKKVS
p#Qj#pj13!*bCQE&c(qbX0B5B&Qf*D&frd-XM*&aQ1hMHKd#+@JXah0lqaS8Ih2[
l$'2E3@ae9@!6XSGPYNPdQ*F5j4CLHr@1$akX96-4kI0-PhAH$qi0+@-AVE1C@"'
1m5paT6$cqAh'S9[4lGITEqAeeKI[MaVR2lkhS0lUh2iLrDemFIreqc[IMpB,f"*
+ALhTad$cU"8+6(X@(IKUeclT-Xa[-arI'eGqQRJ9TQ&ri5VE`*SDkU4HTpSAf4G
0k[9"TETK41@j-Pm)4%iLM#MK,qE!q5J+k)fI2Z6E%m,'Ic1Z*5!m`f9Up0f!@K%
N'$eNGF3I'%PTMdQ@aEh1'EE*5Pa0G'm"%@ATKK'"&LN(`4,2JRY4#GRVI'2f4Yp
9j`a$,@GPl)FlaarbVFKPTh#ap,Jmb&EVF5VNa2,PfK%GK'd6RJPe3hC+P)RDTN#
UaRV9f4mZHNP-,k9K"I`iRYBj#@-kRpH!jU(Kar4m@r,6,%3-!T[1TbdkZLM2YDG
03k1(!8cI,"$*jLH'ED*1R!K3NaV)[dP#TC*$+EYpBrAVrMC!CJ%-3bQS$bq)!L5
(GGp9-ecbm,Ve8TR[DVkAmbGGP0kXi1jp3hQ)MQ+jHf6I%-r1''!!`XbKJ6r'31X
XZ8T%fDA8FG%h9Ucc[CS&Hrp"#lFQS6k`8*L%%J@",NN836#-hfP"c"F0[K@PSC-
J0K86CebZm&p'&(&*QYFf'#P6&jM2I05YFV%,EA9AA5bA'QjF[[MlMElCXG%kRRq
VNY2aSI$b-RVN9dK3,5#`VYDfa@,TGk93h*CqCB"$C%-e53)4JSe5,RCd@r$S0S#
M!8ak5*5[16CUjIPmB-"cmS!RJ`1Hp)eCq[Ri9hVM$[!4"82hB[1bpI,Q9IdTAXp
GDjDaI@H@ZAel#l5&HqTjrcIqflB3TYJe%$@Jk--Pkk$@*`F2T,pHrT8jDRC38Kd
2*9CNIhf4D`QkfMQGVV'B(H*I`,S1TP,YKfpfR4@-kHBZ,8&T@*GV8G5U5+P&edM
Xl'#ZGk1VZZZ9YGeek`c&e%ZS9J$+&E3G2T@l!bJRY%'j25KS[@`LAm%Rqd12@AR
eGB$X62r"+Cl"aq$M'XrfRl`HqBqBhS6T[Ik#CDj[+i5#422TG0CH8!Q-pRL0JTr
mVcHkA$8`QY8JD@12UiS-iKU1#J-hBe!CJl"3"S%aZ"I+i'B-aN)C$-BJ,C4"BJc
CK6*N'F283KQQc(E4EUQZ3h%9lG0+I8h@R[5!i5V!F*@"i5Shf@QklPDbbGY*0&&
SX4TRA8b1ZYI5iGA,cahJ&Eb52dq"@UAbC%C(Gq8mhPX6%kB[*5JBlIeSf0dbVA@
*$TFV"*9QPE+1Z0&m[5,pa'DRif`94"-)@$N,e'aaE"6%4AbfNP)HZdM"0QJXAkM
EeGCd8m-T8,RLbIZk)0Ekh&Q0ApTji-P#D[',klYM@6HrG&H(m[3RacZIKh2lLqY
lC'I5mM3D3a9`RKE[IhYpVqb@qTiqGi+afXHem5#c%Q51,)[jY"[Z0Xa'UQ*Jm3)
KUd)JB)``J,AV0V,qB9S)LKA,#`I5Ad,RNA9)PdpF[iQ!Q3PqGmp%rZ35d5(`ZX9
3RMZPbe!3Qq0A@[Z420KNA#E$!ZXHZ,L(0`hP`j'l0p,(ME*%XkNZdAbcD`LGmSd
p3b6JEN++C41%X4)SNGj`0Z[S8%Qjr1RrIU+ieMMaJPU"JV!+@Fp`KLc4FQ8,[p&
REFJk'J)$mUjU$-Lc!GAY"lb3!+F"YmjjP`ap`UC`T"XNb#hh4k8+ML*VVQ3)!r@
JCh3d,Sj#`3K36eZqZRT+bZUTMp46Cf030@&Sh@-GT)5l#6`B%PUAV3GU9N%*Cr[
p&HpraC!!,G2DMi`qK3c365+pqT!!0&fFhCUh$(mEGK`%r2)Ua',9mMQQ'8T3h0d
VNY&Lrk4rG5HVS-L`kPU2QSBSBA*3-Z[ZhJ%HB'qVTX&qrIRTHm%qfd06ll'T2f+
+`U1aA4&r)V)cY$+iY22j$65ia!DN`r#9E2LrrA+(LdDI+BVTe0h4!8j*&IHH#Dl
eQKc%JU,'ee6!0(6Z,1HpibYGbb8eVRk3!$Kl*Z2mP3-QJj4*,e&q&AAMFeB[8HA
2BhU*+(q1k5@#r(P',iR)Rd0kL9[q[+UA$0$Ri*HiBCBAl+eE3"q$"d8ZL9D9&KQ
lB!T-hTQcE5#&`i6jEeG3!kq01SGTSC,h2j4)E%J"-a3Y#Z%Y*JZjeCqB,jSFSS2
2*99bqe&rFaB-"P-XaFA3m(Nb(SM1(Kbj9HTlZ6HZVSkLXU!iF42ALIaMPX[([XN
1BG,[rKi34T%"F0-$#ZC8C9$Fp!#&188C+$Fpi'&133E263qJQ$-L!qUQ"f6-kCC
"GY-$21BFk(q'J-G-L,e3j&IlVqcM8Tp9$&`@5M-`[C+PrccJfl6&!cjQQXJTKE0
NKShmPC&RDCKSZ#'Z*ik'hC5`UGK`hp%RcPf28U@S2('a&eehI-01jLMNRhMaD,5
B0XkLUA(8Z#3e-I9f*G"&0&!6C0$HM+59D)KcATIdrQrLc'qKL,Xc*NSYT-82(Vc
0djEaakIi"rHKi&8lYh(a,$dR-r(aJa5LN!"*FK(QhUqe`UJ[kFpc+I9kE`H5L*Q
qNlfhB!Eql2VJ&C8M*'cjaXp[Pflm#9H46"D5+9-2L4L6[DYlIrr)par%BKER6lJ
58P$JhM*-aJj+L48'Am*$-mD1MbQKGjL#Q1RmBC8ed+jEE9J@JeJ5B4"'5m8`ij8
IrJ"CS(K4Sqi1!BKAc-`SKLDDCi*-TqE4F!Z5Np@VHPiY4DKMe42R!E#UEYhk#&+
B%CEQ"0'#HI`ERQZ)D1i+rbQ"ibSK[ZEq!'SMqBI0+4lKiXm4BXDDa@Sf*LI,!L(
Ue2aQRFPH#RB1LcGfb!ER+!pR3@![8Vm)d'EAHp-*mfa)aF-q,J$L%CUFDqB#!6f
FJ'X9ABdT`4hBM,GDpHa@,U["49#%@EbQd)V5Z*Q23FmGJ8ic`dPr&9K[%HpQL4M
4@Ki[C4mKMq0U2-BqMRNqKMd-5cb1GI%@pR($-k$"`j!!mAc8$0%,#%P0lEpRKRd
fB@&(S81+@B'#e30Q!S"0bHDiQUL@$h"3d2M`8hK&kA@*95kaLT09R+abRPA14lh
G%kAYU*-f"U8MI-UB[#%J(ICZFH,[J#)3lP-'5dUQYSHP+6`k8'R*$%+KZC-8'Ud
NHX+@0bl10h(MM3Z6MPX68%$jq[IL6BRZF,&5U*KQc!1-139QjBf,Q49JREPe(Jf
&92eLQIJ)$bHR4JaH14dN+lammBf,%*-BbReRCQM83ekTIp3BI'@@6if[4!+-d'V
%U1G+!*N)86*RZC!!bI')!44"TS1,$19$TR`AS94mHQfdh'DNr[lkq1-U"f"6,dG
Ca5KU!+GE5l`H$FI`8`89Qp+L@S)"r+NXM"q'+PH-Q2`"mmi8#H,"J3*q@XKd%Ka
QDMm)bQ00)"!8+#eqjrqK6cCFVKh9P1TT-L4#F6'8JE+rc!lI+m(J"b(4JpaN[!c
G3GA$TkhlAq$V)XDdA&J#5*fDidAUe"G!DK0H[q$hT@2TeRaT[MDr-hm`r89+rTY
+,F(V3%BNNk(K+1")H03K6i8fTaS121KM'@k@84CQ"Cib%5Y5(!i81)YmaCSaTjc
QUeNS%GY`mp#S"p&jUP4H$S384LJI)%4NF[c6bqD2GiM5%NBBaUT,)'`X5H)#'4M
B*3Q"fNSK4558rImPiH`k'r[a6PS!MqEd$cG2GJf0PTrb&%)decY%Y[!5ri8P2HJ
-(LV$JdjE`*Rd1NZ$JhREjA%)kDYH3FL)p[#R$`r!k3#EMF$'!1%&IfN!%1P(&JD
k,f[i,pMQjCHjHGQ[FUR5GQ6PlI3F++d[#k6'%Zq&*#fiADABVYLR!'CE*X"NGFR
jpScijD%+Q6riqhi)DQYhb-,I4QJXJ+4l2cL&*(5&TcTNH&#21Y3-J!"&U5*YljD
%96qKp0Im#6jKYE%M+-0I$)db9CjK42C"SA@d8HLP1dj"+k'Sbi9B,VlSb(LeaFk
1r1deE4rY%*LJN@(*kH*jUm'kBSJ-XP)i($"I8iT5J$M8*AFKDk0e*jN*1j!!LVX
I(@8jkfJMCD0)F0(JSpBM8#ldD!#U,f@F8A6U&UTNGZCXib6)(0A-IT0CFMkj(N,
,rHac1heU8'&l&p"MU'c)N!!m*(11VNA"i95G(j'2+`ZPe(@43$DaQ#rRiX4L4**
,`rGi1RUQ'M1H%(P+ZAXfDe04hJDe(f%r43"qlV0mKLYi6A!9$h4'J+kd-4eFN9@
222#P0EK)a!m3*`+QF9cZ1!#THe6V,YGa#!i@qD)3&fCJqTf$%+VM#!K&#Xae*`Z
RZR)*!D+AN!"HPa!1"G2rb[(&H!"*0EEa+AVFNiB2L$H3!1Eb%c-'rUMA'H%@"FE
@1MFUBMJfUBGVm*1hUKj9,J5(Gp"`Db)c@jJa2N)a`QB1iN!iU-*RjNjb$@Jb-IF
m0eX9I*VpViJ,(FH&9%NY-lZZ$1*kk(l&$+jDYTG2!CN@GN8VVP8E2X1Z1)5+1@c
$p8ci@@+YS3H,M8P@E**maKrT3RCV3fj(`#dM#G+21aKS@GGGM""Mm*LaGXINVJ2
5C%ld$UMC""'2YYNfL1ijXieVmrI50Z1&EBB30#-+2-N@Gd1%&HC$V)4ESd"qe`N
m6LaB"HE!JaP8A"R$6-%-NKB2@YKNY$#2"K)*5k[jV2Ce22R"YDqlk*'lh3"+,4r
*RH@cA-GVM-rJ0F3e[+am)[FN1eV&-JH1"3EDGr-Cr'Mi#3i*KKDS6&R%F&@9P+P
F,$#&3J(8iq%)ALSPhPK4HQ"X&&[0%IB63I,mM`hkF#X9S6K[hXe&K$cKX`""m10
1)bSA,L2(aGEG2%+6U+LB&ZjT-phFEPSHM+)"HEH%5cNqJ,!4#&%3T)4EjfSYV8I
rZF[C'lBmF[3hAGC6B(#(Bm5!5@Ar88`T$eqd(U4'%L2E#813!0[lX"i9D5JIdGQ
-8#E0Z3$rlS$c4bXK8AIX3,&@D**3YJ`0%0HG,k#*q[d(6hBCJFB+9&Yhp%3[#BX
"arASm@l$jR@FLaUfeQK4Ir5DdHGeIa+pSfFY'Mk[L[3+kDX3(RPl5cap-8VKV#M
+be'8&DQA,N!0#2a`5Y,MCcQ3!()j8ed9p-L@4)JF-9f)kcp)S"PDLp!3)8`+96#
Z[G+2X+aGp2Jq("'Mkj8CVd$UhA+`L2@R@C!!+TQ"X#3MVp033ZMk"Nbim42"C%5
HT-4IcND1i)$h`$b!MUjl@C-SLJTqZ)`imhA'I)D@U"rjmXJ[Ji4NG5rN)N)Je)j
3LP"`(p!PEqFEV,CEefqp@+ZS#GldmVeSH!,YC-6`SQ$#$`94%4KkjVML!e+(,EF
&"*q3!%1&!q&JYAILSGZR%2,i&0"1*8BX+(kaQe!hV0BTa%iXE#N8)bS8IJL[dP)
UHPd%ilKS3Ti1'&A)Z"V+9bS`[Aq!*X0p5$1SBk1K+LH1fM33NY@A'id&%YB(KTZ
Y*`fRem$L@X`#Lf6$!a&SK@SV$A4p,m94AG-QL"(ZC2HRA2F'ZRcRIdEAqMZrcVD
DIAE3*h@fcc)4J$NVr$[E!%PfL9AH+URHB-UilYqX'flfUpVP+M0[0'kHNB'(Pm,
9`pVQ'3)J+3BBN!#J&+5cd%)jAM6klFfC#6469(S!(5D@TiS1-F,0S6fQ#q)1lJM
PfFFacdGPb'dih)+SF$05hiJ@m`i%'6aH4`dQCTam*Bar8),32c*K,2KIPm2XRi-
3Sa$cI6Hd6kcLVi5Z9(+VfdL9f'3K-PDPG@ThlBr'@rG(-fNm$IK+k*E4Eh3&PQ#
$0XN[Cb`8*$QiNUHY#d`A29HfB5KG()k@'0,c$LmV1iS0cQ-b!eL2HDFCZjQPp%f
KPV8l`TZYJM2P2D*-%K22")D`E8Hk1hk-`TN4SQF,fbMjRE*PY,(4`qGp*B&J[Z*
V'@p)@TQ[")Q#EIk)ih&ZEXHdYThMhRD12`3FFRL)(kRe`B#N4Pm*#b4LkJT"R8'
QG"@3!#eQ$8kbi&%[L@UDpJp3`)1BU84RbD'(&`6Fm43HQa92(d*#)FTB1YZU5Qd
[*IlrHHRG&2bBYk-C2MED0LMl)jT+Y`P%PRMDhq6H)2mc!5C%SRK(m'peLT)&reM
(b23$F4@T2f0*+QYlIjr2p%(%42K-ETUZAd@#$B)d)9!D#00+MA!@m,-N*#lUqXh
ralm1+8,d-Z"8i95F[H@VXjCf3EC"F4fK&c%X6J'%3[M9rTAi0*9A1de)+F6)**k
l$#1'*8GK*lrcUhcK9rR%Vq)ri+KIj3"3Q4k%c5B2mq,D(Xq4&+!B*CD59GcCb`i
9FrDKqhd@MpV-'+Pj$I2aEe#-mfqP!LE5`28$+4Z%pJS9[#AQ62*dZ"ESR3jI458
IVJ*kYf"EmMNXL"pMH28p"ql@HFSm#SC8L)T#2V3(riM)KLXCCFrb)N,#XA#Z$m%
UNI%V6!`6j@fqjc%)EF@+0&e482`[)b-$`Q`9qNFeqi'X9%LqPE$[j5hXXj9HDl!
Ee$A,#!)9mY'Icmjmp-,PEp[rI,(RSZ2IrrIP2jlAfh2a3`SLI$Rph*'la[r"X9C
(cS6VIri29r4rTcqM[p!pr[3,0H2[22jdkm-((hlLq!-22,$cq2Jr,IflJph[A1Y
DqZlRq[[2IALI(RpZYllLZ3pedi@,LhlqcSrIeIp*Iq(80lBIe)Hqp0Z$qMqmHq(
&TFd!!$fK384$8J-!D9`393ed4K%!-H0q4ArIYR`CbaT''(('02QFFehc[-ZNQP+
-bE+%-%B158HN%A0ejF#@BK*f)cFRjCG,Yc`[S&)24@TYVlFA14iEd+3KpP"1bZ&
%6*8Lp8CV-9"UU3FTaSMF5$'P)GrllqrlpVb*f1-p[qFr'k3R+FU&)!LH3$Ee0hK
3`6TcrSdZJ`,Sbap#%HrYcaRb(fjmXMhSb)#Je0pYmiVqI`cJ8a9p30M1&5GAr#"
Z&Brh[bjQLXF&9BqNa[)j@f'+k5"ecG4f*IAj@0$aD[IdqSKSR,9T4#X-0,jp,SZ
-R`K-'Fi9Md-"*J$$+M)&M'0iL13qB[f#a@hC'@PLH&mQf-iaCj8PhYc"9CY)+Vi
R2ZB4jc8BE$V&E9`@NaCrE"X3K1VKDX$Fp)G+BCTY1A85GfE`d&@E2hMF%rcCFS[
'kEFNd&e5(1D4YQdmFM)52'jZZUA5QQP1@qXU[JX[ajcSeT,mY0YaMXZ('lp@)Fl
DNB9XRj6Y3hB0brECF5`m41a9H*@ZUP"FT[-)'U`Fq&KCp@Ph)Qeq*45mM9qVMmp
#S4Ufrmhq0qPe[9NKGKJ65G8T$&BTcPUm0"c80Ahk9c6J2,bD12E4k##B%$bkLkZ
D69cpB835e0*kjCQBcSd$E4R@iVB-TjE-9E306JGH&jY&aMXh3BhFpL0NGL)Ke3`
lfV*&,i#LbV#`MXSBYcHfCA[5-p+)i0+56GLVp+3a(0'd0%pKbJ&(ZJ`%X5`(R4j
JR6C&GbUS-ARld'K1K(XErPfF[8REGSPP9KA)[1E-X3!G33ARKaSK#KL(`[Z`V4+
)*Nimj2[YY-Q"YKp"E,RQa!%X[U'"YJ-i3QGr0ad)QGQ@d`8!Vr-r$Jj4ffh'30P
JmTmK3[9hSrPf1`j#bPe$!S#HNDNi94NU6LhRCbTlHI4@52',a1A$!9(&ND)i5DV
AV00@ib-4qI"ASF*fiMr"ahN32-S5ERGfI00TZbf$Hiai2'lV`'-FMb-f%Bq6H2a
R@cXHUr"if*E%SaH2hEC)"T!!Br6"6-#5!)+!FU-DK$TLkFM3a)[EMJ523rR@!l5
Q%D[DAMJCL6YheBEA#TQfDJ,%q2pN5-*VkQL56)B-k32G0,&12f+GVXl3J2a(T#i
$Ier,rEC%mcRHC21YhmDp0RrFk8P'$I#-@'k46B0-&P"Q%jX[[2`@"!MZakf+Hlm
)TTmh66h-%a"hfSfMI,Zij[[cP&6MQR3H'ZEYBk0FqD4Ap&YGZjldYNY(mGR(T5'
A4U-lFhAH!E%i5HFfe@GT(qT3I82$N3Z('frea(PAYmAr4)rU`mXQpV,T85qEm,+
+[Dake-XUX8-!M!42-[#`MFFle$-@c9$Bd$JQ01j9cjL1U"5K!9-rF4m354%HQP!
j`qKi0EZGSdUXXXP1[,"i89dA15SpXMLU+"@h'N`1!$fUd%QjMFdjFRNI2Fc%Z"C
,YP$Ib%p'ALMGNKk[10rkNMfa,pZC$I%b($Lr`f@VMN8fj)MqI6P)6NhLr2kAl$H
%6eZT19cQ%L0ScPl491(69KSc'$f+SNN,F%NidX1[-4AEYH3`Rq@4VQkSdrrJiH%
13Rb8r1j*JHjlJQiF*Si%d2`p-1jMb5-pYB4@+F[U@UMc$[-X(V4iq6ES8,JUYep
0KVPSUF,0D%RLpTK&aZeCf`5DD290$0Nd%E#NbQC55eqYc,5&[''HCDYL'F0F4CC
-@@`)N6U`JpLd%%#Q)Kf)c,qK+d6mYXpiJ%38S9YA`FBPT$3,HD5'*DD'@M3d$[-
J'@%1+B33cPm6ASPiPEKDU)94XTdbZ)YPH*!!)CZelQfUl,f+SmPQ,hf!*+V3f#c
U-i6'#GDB5+ALddqI6hc'VkXqh-E8*Ya@Ue@iMDMYZ(@Tih#PN!$9,+$B2b0M@Mf
$@lpk'$H2DVhR-dJbTh$V98GaXkR6Z*e8YEJje6%dkP5Ai"CAGEKeU0I4@CT+a[*
4YQcR#N03-fp6lHcc-iI@VY9rjN24E2JSeMrUIZT`Re-Gl'1)(MfFVf3(Si(XE+"
1pET`!'Qi-3J'FBI@8AQ2PKd`TQU4e5&PfC%eU2BHTDedJ[K'@!k9SeTe$lVULhJ
X@Mc-48l5aL+jLDX4VK`kUShNXmkc,11-l&j-,ii8Hq5M+6`5+FCREZ3cXlNLj`P
YT%3JQ-@K*jP028-,)R5PRT+kQT3@K6Vl6(eIk%ap(jrI8$qPcLUf48iqS9ARRZJ
0&k+ENR!'ES&`1KRpp!MLcj)!ATA#BCEqVEe9@DiES)TC5'5T!56iFA[LCL4!CII
8!ZA1&D%a3M5b-HcK@DZFPf`DS4,r8k@1+R$CI!%[0N2S69A@)VRkDPTj%`6S(@c
brYAFaV1Z3B#Z"AK[%,SGf+-X)$@Qc*A5QmPJ[CJ%EKaP5`b#YZL(Q&lDPRR@*iC
[j%"B+Ne4@@H4e54D,e$HK'2$J[N2m`!59#$QrHKe6'r$X'aS$&Ak5D[5jYb&JC[
3p-hN#rq)2iYm!#K$6R81mc5,Gr9S"CaHj!8-62`366Ai5H!RL4pkI5YH9k$bEEI
BJ3cEN550P#3eGp+RZ3*(A$V%(3!*#1V$A#kXU(!2FE-4l*F22dd`#c#NUkP(dJh
Fr"NBp9rDFA23Mk'cE2VmIqMX6E`@`ClqNMTPar`6MYNK6)15C'Q*c-cr[p@mcId
!Lc3JaXqi9j9aNi%HFH-4!*Q2*G`QG4bh+TDXfeQb(NHb,P&f-1#Ci(j$"53)*P$
ScV1-$J#JP!Dcd[Bf$pKm"R6S#@&L!d[iFCE`1aJBkp46ACIR,TZEDPbIZ$cjH"&
JVq2X05UcSj5`qR%E8$mpbLEJ0U5qrjecDVrb0dXl,E#jUH++U1fT96eB,*hbYi8
k2(5SrB90&HkiGJdTl"I@[2l*kmN1m&kR6P#Lm+ZRR!"Y@p`Tf`*'1(3j+YXbLd-
%C!C!XR&rD3aJ"("CDS4E!k(PdT93`#c[llBd8CES&8HJR&Qq8$H'cc8IdL#Xf`#
kRB$4eR8kEjFV$&dL`BD4B![0DL#j!f,ad6P9C1bYH24PViV2!2X-d+FR)BldAEk
R#df%Kd"rcUHCS[m'PKk*1HJmT`BX8%%E1e5aBTXD4'D-I3E!-#,cEPGm#UD`[p5
iehciLCZpQN#LD3li,lBU1r"UBi[V,!(,8P5B4@!j0`*8Q[1eH'bqdDTXM'Y"`Mr
6pYCm+*EIHdkGB0X8XFe*CfC*RNf'0aNf5BYILF@ANQjTSQTq*4*2qcjbQ9V"EU9
dLpJp2()$'iBJ8iQU*-P%'TXANh!N5*j5e8@,PF`%@DkI(XmcU--`+)L9a+%AI!@
6J3U@+U85LC2L5%qeSSMKKETpPq-McUZ'*"j1BM[cE11XHS1aeC)3+SR#kmcaTG3
MQi2d3'KM,8Y#8,JXpFJ(eZ"`&@-3'j!!E#0)R"%S&TC5XNhXABY2UT!!$8N`dT!
!SCU,S#E!)""q3P,#3G9XNG`j)0jJTdGle%'!Y"r!V#0('rT(KJBCdiB-GP`1U$!
F'%jM5$,"L!Hh'+YN"L1jP&JLjbLa4$kMDLQ5MpZcNH,fMXJj#`QkehYU)iAB+JK
##515Ii+V58SDNAb`bj%(@`kqRCD"!IFN,B,C6m3a,B@kNCE#if-[PY*,%,ifI-h
XAkM$p'd2f[%0eV'SleM-dl&0kPM-dl')MUf2kPCQhDjQR6ET1fh+dfQ9e'R6ScY
PL$hN4$F@%T6EfH)Q$cFhVC58@rAh`X'*,3BB396a!D#%L0J4,Ubi3K8fa2E$PNQ
a)e*LU()p6G&0e$P#)A&b-39Sfh*K+e9Y'U#Y6ZBkJbU'2ZCA%R!!XEiAiULSPP0
9l$LRbK!"Pmm!E3f9ir%p#1j14f@F%r!YZ%KGiC!!l6E0HThbRUAT+*USR94P*b!
+8`,LbPQCM*GFJBTh1F6I,%S@4h[![')!X,mkC6QkFX$a$1b[c6Z8KFr9rGe#e5a
9abA+@LN*pKV6ST4hGj,bJ*M4JZ)"9!D,U1S'X8SXr9646`%!J8kTJZf)&&ZD*04
3p5V%INml)3`cKj!!G!i,4!iITI3K$'iJ+a*k+5P+K#A&)(-JqjcPM0#pkM&dVll
rB0fVrDEZeAj$pqSFd+JeErF&YYqVhhcBT&a3l#3i39(&h#V)B3MQC)e1ad-C#P3
ZXD'd'Iq3!(biqAp9a4eL14E*Cp%3bpPc0c'FJ4TL1+r$`!de)`m(iAED0,mbVX@
akILqVa2#M!1Cl)BMXC`"85@b'@VZ`LR"D(,!E-CaMl!$AK26+LlKm`THRQ+NJ8l
,V2kX%XZ`JS!)2cXbe+313XF0-$8kEX5$j+B&9$5*V-HN9mm@H!8NjFb%b'qZU#2
3a#"hdJFT6I&6MBahaFkf"RlQK"q$[)ZPD((3$l%f11M8GS'p+Gm@cFMJ!5EBmNp
!NY"3fT!!6mJS(4rMM+R45-*YFXK(kZ9P,iraZHj(*AQZhQN('`hNpHkA2rcVAR6
b+4*Z%%U5,#)mK0(B'%H#rC3P$P+D6))GUC8UBXlAS4S9m9$cD[H-(p2l$MH@YKP
RK@S9'lZ-C('Ce*pa"bQMaQElZQeD**M,CeI6&+LI9)"1X1)5+I9+5mCQE3'TUmY
$9j(ePl&C3d0d4GfA3"hEBl2GM1TEX9ZH`e!ka4ip91b($48ljP#D"ad+@mIfA&L
@,[b-i-H"RekS5ScLF9,G$Za6ZU#),-H%De"#1U!DE"G(f+XqC35[NY+VANCB(6d
S)rKai+H,b$cNQb99!J2b"I8-a'1SH)q[k#!e)cVVB'6A-22qkrJ3,5&mL1*P90[
PV1RM8Y2(34S4L@EbF2-$,e0b!4Vf#3Q)SERE5%e"LFq!H!4e'"N0F$`0U5VTCkL
$Rc3S+q$Yf!HNU@8X6"m$,Y'@T&H8YF$De4fYi')U"N*N8)'4HJ1)4#rm)bR#C+%
1CTKaLfFBUB2U-dj1UNU'q,f#!,V)&80&,rT0+TS%Yia3KJTA6YYUK[3,)RV&F(6
UJXXc('V%,#`Yh$KpLab9LebdFBpAH"deJ"HL4&@dd0I[[YZeb#f*A)4!T[&c'$m
H6k'8H(+N)jdf"aHjD"-2Af5EX,)+EB3KjR-N4#pbHDEc60,eChSkmQ51Qd8deH6
*pTZE&VR%F,3+PK4$edI9-A&qm!FmB96h66&P@NKiY#eph-i6"G9)@)+NafppbAT
&XprL$58XrPrk,5X6#BHV+Z*`Ap3DeCK*1C9QQJ3%R"!QlUZc*%1BV-(Np4&,0CZ
mhc#j`k"B@NM1Y"R+Upd6khh2K@EK%3k(Ek#ZKDc`!Gb*@$@`"Br2)(Z(fE[3XjT
E[$0Tcrl%jr&F"m*8JGDK6S1iJ1S15lH`iDCCrrkIq*j$SSc+4P,a0Bb2c3S[#C3
0,VI+*J2lc9#e`)#AdA3SfdU8-N*-df3-3,D(TcAVAeALeECT+1I6ALYB9A-IA$N
`B-8f6T9G+M(@IXj%fP3ac&MT9U85c,41UEb45G8KMPPkZ(PhK0LGQ)2%!J"'8P$
$6mpLf&i)!-Z9"8,P1!hdQhBpH@(Ir,l(809FM)mF8*0[&ijmqrp`(ek&p#aR%bR
LRQ"-*X482kRre3lmk2"c(3"A*4Q"%TjaFcX+"(MC,HP*BP,#m-P%XbU*jIB61NK
M"NFUS1(VLRm-pqi,Sl2N`Nr,*c$'4I%a,LaQXNG4`-"aGB-`3IaijiHfb!'ik'h
pL0cDpjdiD+'#&UbMAaM*e2%Dd!mU6J0bM-fH25MZZbFAL@j5h2G%&iSjj')c)E0
[2GJSC19b(jm`*pDlmPH$YCb892,bk8'p5Mk)rbEmYi1*ES*+-X)R2I53!)B(@FL
`r`h)#ZK[H`KUbXQjENr)IJj+Ph1F(YVaSm(2*%`+%h"GrlF(Iif(!-a2I+S@5"Z
NU,80MIlcm4-r%MC*@d6edS%YaJdE&'FaC%$F"m%`5#L&"aEUD"$H34T)qcQ9#SZ
-fJ[rkqX&#"9%*b+R!P1UUDX4J"Vq0&#4aDJ66)rM*mK)rBf$23@k)$6ILbl%k#i
`08K6DFSV"hq8Af"+1e8-"4V(UE%ccH,(J[jj4Ylk%F5NMq)M8!@G",JN(-@ITa,
)I,A'UIdk9"BKIL#4iLI`m8`DdkblfVr%15PkLdQCqmHcNZ!cMm-ik+@L)%"20IM
JN9j(mBi%Q$i01M[Pe(Ce!r#05iEjD6#$Tq2$r$Qm2)dK6p*`N8hdDAjC810!k&i
!TIR*MM#b-U('18QZ9T3i$@UFb1jTUTi#%'SfVmG8LhHDXC(URIUNC!8lYimPTMk
@Q1Bi+@$lN8K18L*jU1#`[Gq`*,5`8R+m6NN5l1@q`N5P'fUpdbM1NTakB-GK4aF
P)[S"`H'XE`[4+a"e3F%APQ5NJcr099,YH#E%NDl,TQ3LU$#3!(4'qLPl`YadlcD
HC-1*B'C(*49(8(U)S`KIXYm&KNR(UVFJ4(-G2UqcccLVl)*8fIhDd!dTV(A5p"M
F)b!UMB`D'4MfCGi52CMh&R5'RqY-DEV23ZVN53*q',hNSbmEJpBH'2U4!-LXeTC
6A"hh@c-G(ablNfCNRj5R5BN5If+AK+BQ#8da`bp95q5-b"CB*HIBpQKQDphQrQi
"N8YL@jNNYN(&!e-Yc0l'5e"YrGBNm+5H-3Jm'CZC10!(a1R!6qrAbBJqMHk3!"J
G*DPRU-+!N!!ib)i"iBJ*4)*JP%5$8p'#dC1MJQ"8d06Rq&@5R'eBBBZH"hE-NC2
X%SfBYUm1*KSG((Z48"+K3'5R1q*Qa6kH(HH1cmA)1TG3$14&1,X,c@eh,mNCq8R
#+&9eCDMUM'6XJbPRr![,8lJcadB'EUiqTDr@hU80V*j&X6SbLVq,Pfq!,&8@lhU
3!2KIZ@V@qH0qFI6X+k+)iNR,Rfm-A'%'kf[Q4#@41%8Fc5JZm(,DV,*ABq*SiEH
,Sem&$BAm8"8Z[h&$GLN+"dC+eU&DjfIPjXcm5$aY+#`i39"PZ(T@p2A"`1EFCBN
mP5RkF(aeV5YrXr-Y8SK1`Nh#jSaR'DD3!01%a@F`CKHFJNF46E0-R40UYNL9lQT
8Z[`6TfaTBZa4'F"NSZ'IQ+[%$da+mkJ+2hA!#Y@'%DUUd[@C*reJ@%f+Mr'KmL&
"&&Q!UP(m#'J*R5`Q0!L9Z"q,-+r!8+)de10I@1j*B,+IM)GJa(DciS``DKkl196
!B!%YQJ+!rDi!f+3b50C(J3&cp`(V6!jG#E$-9ArGqq82+H&KdHm5A"6*-IL!HVM
j*ak!(DTXCdp*#1cS*D$M1&`RQRrH&pJ6Z0,I$C6I6S)[TZie+&25[cF2,ULHmEa
Z!L'Hm&-6MFX)Pdf)1r0%Ei@,#R1)h[[*lDD-L[e"f#P$8F!H+U5*bN9J,f$-Q!9
EqI2RaLR*q*aT-*VkE95JXjcB#QA9iHE01q*3SP#'BG%"[JI%*'X!jrl0#f28)&Q
J`5PdeBlZkiI+84!!MJ92*XM"Q*4RV%KL+K94'j,*A83kb'EQUP`Y&65YTqV`Dq[
"U'd!LYN!TaBFLpqC$JF3a3hh)1ehV-Up"cM%aaUTJaS)TSZC+ZPH)#G16KEV3A"
Q#"B2U1NJpGN3($"Va-k%8F[EUSMmeVHX[HYlLUXa5!e$BbMJZVNG+U-dLbHG"iq
Mm0lLXdCRP5eSK(+G#S*GG)NU+Ki9JN9NS8k6bL[ail,fp29#4%GhDhY,+V#FrFD
HQ*FUTprPd)++Hi*G,1&SaH-"TdKUa$''A%R!EiGTN8!JU*r89@#56qb8*N&a!GE
55bUmhjPT8I#"U[Ph*q&fdIccfQK@%Q3%3%+&NcM##3aCT9Z%*)*#FTXh8-&6#19
&cYk55C!!KP!4Mr34!'kj#fa(P35#GN+@lBRj(iKK#3KpjZp9CK+,jjR)#iD86Be
S%Ta%Hq0HFSMY#0rrA6M`9H0R1pMh)NZ)1IeJd9"J$`cKPJfB@%6!4b"Ql#8#E1N
k"XLY0ID+M"d+(&qSbm$L1([26Srk(Hq+%,CAKafrDAEPam'-9YV%*"2bE#%X&*R
&99'q8EF24R(lq,jHD`pEU*le258l6%#mjTPM!(%[6)"*S9M,QSeN!U5-U!E"GQa
KrJH@X@4*&SS"@A3-F*-cK&UJCRM5YjS59C1Y(D4@'&Nf+DkE8kJaA!9A%6QJ(XL
d6HDGk05bLCcRH+b-D#-XdD`LmJb94b@DG9"Bk&J"L3e#*dJdE4fc&KJdE*eXb3d
$Zr8$Tm$GFc&EmY1BA(qiZHBTBFR"b!S!ji4"b%P1K`#jD3DQ2JDQ0eM46CSDSq@
PTDTj,FrN*&XL*kPL2C&d!QZQH+hC3H393,GQV3PdDlB4k2l1D24(#`9`PQ1&c3j
`9+EE)KHNkR5FYQhr'eAacpLA-,8DM,9q[1,aFj%,!*JQ,(dDlc[*XRNYXMUS1G6
pk!E-hcLF5EUHF%3Z#-ZiC&ESJ&FH8&28S3lQE*)H*r9"5Eb$Hcbj"N@'AJd6cLY
Xe&BX%C3`R55QS-%jeNfrF%#EN5C!rG%(j8`K9!LkC4l"e!KK'kaUdFD+eQ9[,R)
jHfhbfQe31,k"4a&$c8R(m8!3RR1Q3B!0#9Y"`Qa#9H86-G#+aqhB'"%['HAd0X'
USB+-*)jV4lHp3lk'QjK3*Af5Z%X-2$'8B!qc6H`N9IhMHSCbI[G8,T+lbm#f,*N
&FAA*AN9VL6dr(R1B`JSm5214&6GKDaSX2#VIV4F*[GrUSU9Jb&E2k*MFpj3,"M#
)hXVU(lD9F04@eU*U@!%hqpGZ2XIY#LPUf`E1m9kP$!,%"I2jKCk#@`faV8S&jJY
X!"ZG**G'8TP#E0#r("Vi[(EVf`b80AJK,*GjNKB@l2c@4S&4"jXPdqBmY-@r&Ma
8e)&m#cdcDE6pC!(R4DB)T'@[F'U4Z-M)eKNI+*Z,$C4jKUePFm-`[T4j"+%%U+1
CAhGUj`!U`ceif9[Q33L1iV)jQ2*Z-dI!I2[`)Km[c13QS9IhVa`+8aG58jp3,)%
%r2ec%"P@`Sf6M'#TKXi1%EUTTamd@3hPbbUB%e-"l*2XJ"01)!",qh"afFQbJlM
PPU82SjZbNaJmee6F'mQ*#UKjbC`*"+AjqpqH6,D&Q)THh[RE%k[-DZaMNdU8#'%
kj#%EQ!D3!#@a54`S1lRc)Qkj1lGa39@-&iFkQ6U8N56a%4e0V`kYCCh4*LRX`0f
NV'(+59A)LR$TS4N2YF*(Q)`rY950`!A,K5PBr)@k'EL55Ge3N5[40!39P#@&(CJ
"MG6N(,Q-#i`+brLc0%aIe$#ZG"49hB@Kd0fi*j'SD[Z5N40c2iq%P"l'ZK-$9hG
L3p6J`B4rVYY8)&C`e3Z"A3-`C*-E!@H&LNPeqI`%LHj!lS5`RAMTC`i'rUP5U$)
GK,D&#3YeMR3rA$lV3k5`"YJPi'ER)f3pH5AZ)+3fI,cY#N6Mf3+Zd6SU9-E*jI6
+iHE[@!d[B(Ul!N8L,3el0HQC)fI8+`8A&qJePiB-AU&(S2LU`ie+[@Kp,-@bkh&
SQHRak4qrr4)%G6aqe,bj#'`F(K2Aqc+i"SG+Q0Jm!AKCX4T[`@&)b+HZkd8#d[l
ZXj5im)P%l03[)&0E%QK#I%q1JL$QQAKIap9BfZl,ml$m4[PA*&"[UUKVG[fVh`V
h%l%29H@QHfm)LK9,KVM(HXRSYrB'qUlHi+&N,pID6KhJkAc2!U8bf%F&(8$Skd[
'bF%,T[6V5fik',TrDlD,CGradbXZ0a8"JH2pp9!SaaA2lRrGZUZr&q%q%LFU56d
UpN(Y3ZahI6U3!)fNcRNV5["EDf"%41Y!Pl)!0kJXB#LF%Df$LGe[l(8K1-L5r+4
44PL2*561HRcX)jdqN!!FLXY5+"N9V3,5A*V#!IjV)FL4Him[EX8'b-R`5rS0I#P
U!er5Ed$'"Vj%'i#DU&l-lQp9kP'%C@Pr*iT605P,6kc&9YD+9QNV1M+MN@MDe4f
M)5$bL,H0HJ@f'pf"AEM$&HU29BQpSR(8Zqk+m#U&MkVlAEQIGP5*ZqL&AH[3#Uq
3!(e+9bAZS@a6'!GN[ipM&29M+"c%Va5GZ"&&1,MS(`U4-bC%QZ4"4$+*33ekYFh
4lq#V)pCGMYr3Chpr2aq0p(9#l-4RERmZRikFfH0iMcl6qq([&1Q(+ad#L5"MA[m
mC*c5-[B[&F'#q08fEhm)QA0#CRedjR0#jLT6CTFp#40#-9Fbl-q+30QKP9&!'U*
M%T!!ka*a")lSL)(a4&!9-GcTUV`@#1qSbhB0I&qT[[XVX[Z@FqqN2q-@Xp,[f0i
3bhVkmK9A$GaZd,!Zi0q4LBEI!$(Ulpl+rE*lqhXr1l2C,FU&QUFD![,"*#eYI1U
@-V%F%c)$j6Ybf!5[8SB*AYNG&-frfq)@de)196F-TKhFIhrVCGIQed8CcA23r"T
VRP3Ud$`TZcrrZcXA,(+,i31qfSD1m-(fqa[IFQf"QEI6&5L[G!I5T!N*C6-Q*'6
hRe)1rD,',ISclYMG%2FrrISeek+k!PY%q#aP1aTVC2HH5qpfh2+j@(j%Xk""9ik
Mrq)0ec1CBKEED*Ddd4!+)QhP)GRGB1bmbMCkL'ed[l64pr3E[F3Q6#U9Q$!TZjG
eIN&P'r@aMEC(EI55IU1LXKI04GRp$GG(0E444[)`)rNe)MRETPpU(P4Ud$`SZer
[[I8AY%#-k&N#dH(1P,T'#Lh!0S`(LIJaC3-QaQ5hSVbrNfhj%0[bIVCPQT6&b*q
e!apXbU#b%P-'CIG,FlGXT'fc"C!!T3@i4!Y35D%CdU4Y'j90Q'#8hCrGf"mijJ*
FdLr!EFSm0,i0*2VSIlr`DqR)E#Yi%$B6QeVc35cC#6GT,%95@SSPbPfBZ%4f[rD
MRMIBpJqal4Z@BUqZ[215Q%@,%8cZb'D64T9eQ$3UZqIrd[[B-CDM(0Y1%RP4Y+K
HGLqGH1)d@iDED"NH&TC"CJZ@`aUYNYf9fKHeDciANi@hBrMN`I-dI'$Uef85#*q
AZPXTZq22RISq)hF9)hF6)rG,E&RK#)kMjVMFj$`JZqjEqpkfc5k3!$R*b+b4b(b
H%Him%3jGETIGLiB5ri14pbBLlm-#H3@!$G05S0N'f4hTeHclpHILHAE%mm)4LD4
Xf6+aBD($GE+lj[RGENE++NE+*QNcHfR*b(P-2&qCb3kj@AEpkYGIREI&"4)Q'3N
eM)3[L8PT1mR+DkaTMHakl+FrhNd#4!%bRQG!H9iLj&fbqi-[CLh+5dL'1+*3!CT
@b1j9IrMQ*GS3)q4jLC!!V`[*)iU3!(YPekj6QJH13FKb+G%*'jmRZlIqbheTr`N
Kbf4hkY2r9Nm,b)jBVPpU!b%0#e-TZbeR)fZ)N!!T95!1%9)J6PJLMLb4FC2XqQl
(b&Y%a[3NL%0NI&0)kRq(TM[G`M)VLrpSCdK[NT!!hRhIa5Cba,5rG`9NeQ5[l,l
d[jHkf4)IC8YF,K([0f,jled"2fX'!#cqrpm181+PDNiR1rEBpc$#C3A+Ah3&dPJ
c,-5bqjFN'6(1%c%1hRlrfb$(*6(m$b![Di5%mFl'fPj+2ZQ6G1clT!VKCkj!&QZ
b@ABIIqDrEfA%1XU)9Dj2&ZGam$"V"N)YrIea$a'+MM5BjHLdGc*#bB(c,aS1$J$
Hq!qEc)`!jaR5[pf!p29%`K,'rZq4GpQa*qRBpdQ)j[F')PA,lYVR[l@BJFe4"ME
P"[6q-m2Q!9Th2@fX-j!!+#!lTZa6l0M[LHIr`A"X*(RrPHqN-H4aRS(qlG,b#XF
@5&!MZpIF9I&(KMb)51(l,ZGCf%fbHrI[rRSr5fj(@A)V0e@9qX9&STaGQ&*2"fI
,GMl2XJP%!R#@[ARQ"%2-jaQShfi#G9HGG#J3BG82!Vf-610%TJIdJ1l+P)L!4HR
T8,l-PUkG,Cd['Pd%NYP)b#mb0E6XH[[#ihpl"JQZF$rE`+%#k1)mQLCCdqfb+r@
&&ApNb++FNHbS#9QiVTN)FZ,p6cpJ*"XRNMfJ4a5Z()NF@+*r5Zkpb0"%1d-6[QJ
d%5M(S(ifk!DB,*jHpGpqABN&hmm@r*!!#8fi,TP!Z5lRIpc,#&I1#(Id')4$!M[
EF+6lKa)1#e8dZ(YGAX)Cd!-MKd#i9E,Vhp3H$4%ZC6p$$iG-k%&2$S$dBHrqjeN
L+fHSiDL%'U)*JS4fkliMf5aaM&2LH%"!$M)l[MlKrphUdRX)K$,DFIcc10VEE!2
qU!d!K$TZZI[h4!T'-&NL@#BG(`3,'m$ki@ZrrJU4JLfPAeV+5lqlmI-'l[p*!rI
HdX#6%$30)R'PJCA)i1C$%2DVYVYhZ)aKD`qBJXV(h(kH'#mm91Pqc(8EYrBNHb#
XeU6c!bKI![&D*CFh8TSA(VVSZYZpki'b6EY+*e%-6hLFiq,9$9F+$ihj(4mFr1C
GQ@9ZkM4S(16h[jAM#QDE$k@8EmlFka+0qAc$P@"i,V[-EAMpdlIU,TS2kF*R,Yf
*"LPSF0"(A4JD11af1c8*K,Y`i0K8`$M*0l`8$&Zcbea5)lFjp00YGAmfca3H1RL
H*JHZh[G5GYXJhq%+ZJX2"F0p'$$J#$bEc`d[I[T5jN8dEf,0%Dh9m))3$Ed+KNr
4T'IhkPpKN!#YQ4IlkX$#pB)4K#KIY$f+i@"+&)&GjH1#3N@9*68"2[L9D%FML8'
r3f++8&4)G*Nb@''K'kB-&"H+qR4rC2Ti5"2h5a0[j$f#Z0r%6L8UaIdQPSXq$B`
C2Zi`C6qN#G+3!!QA5C%a5bS8''V,0X@[TUL"m-(C$9YhA"X-Eljff4e$8CB$DX#
2V,S1rjDkYpa(B*VGIJ9*EC+5QRM(cKcc6'A1e!-IMXD05@kH#IMA[E6$0IA!EdH
[Y8hbJ0mqjCLLM2HNM)-KG)D-hl#-@&VJMKGcU)1pb)MZB(QH$ZC*'F,dGiATmQ"
DKrpRGGBpb6f-JE1*D8pG#D3GR'8)lh04aUI-2Y`M2r'DA2q53q9%kMhBG1cir'U
B8Sl[h(Y5MUrjfGi6Lq-I4kR%(U4Ti(F&QbVT&$i`*J@b!f#P3c951C!!SMkqbk,
8$k5mp2D2RfDU23CbU8d)VP"rHiRb0DlLYTK(F2XU$q1@b[fi,H0TZ"9a'6H&Cf@
3!)1fca-,(SHV36,K4f'alqdFYdmbC1$0piFdYPUS4LNN&J+9GA8l0EDli""C)4f
NUEml+YKJ,6XU&#kX++5Nm-0'I94B[p6TC+B8Lfq@`L42`c4PJk+JbKaH#l-S&@b
(idSAR#`L!L$"b,SiUH8k'*3kH"0PUK`KmU3'#MNamRYJ3PkbL8F`8)30FTeehMY
(KLpb5dYe$M5'b2!l4+T&FNa00BkQ(GU@Dja0NU&kXFhS*,221!ZN#M+5!G*ZJ40
dqECAQ)(SSR1JY3C1@QrY``-bXM(a*NbmcLB'$41(4XhIIZ89-ZYJFK90TKGELc'
Pbbj-*C5DS5bfq2"`"Pe`hQcD'Y6GEjVjmi%iZF+@NL24d'MIVRj5,jCZA5E#r8)
T&C6lJSY4I,DJqc`l6TIJ2SYJ)r88dV6JiB`p-$aG04c2p2+9%rNRb(d03bh0FhJ
%4qjjS,@QjckBhf!-ZUQRYBBFBcdTf-)XM+S(fE"1((P"`F(3f3*dTYRf#VN%*e[
TL-U#r0#$N!"jN!!!CHXm6c!j`*A@QT2Y9T!!$%J-YbNFB(mV3"K+CD%C$3V(!F1
#,QB+f1+0XDhICEHBh@V[Nd$-EarLda+!(S3Uq8c48M,q&+8f(#4&Cm-V-1VaGJ`
$KaEH&MijEX8$+lK&+M1qIa2r4eJKm(Pk0ffH*JQZ)%8BYQLTDGL'jqNfK!2#&,2
91,#a`e(CjjT"f)+0Jil+Vq1ai38FP$IN80K32&b'5iAfhQ)d6)Ila'R@b8*m20B
!Jai1q!T6XKp%BAi@JS3&X#BAP1U'JbJ`(Sarc#UC+-2@eYF*c"Li6j049r@5J9&
4YUB%2iDCj48+!f`JQ5%*8#B@C$%TSl%B6@`a4YRdV),6pC2V*62PbUhI&6+aP29
$!kfG,2-02$V*PAlV9dKmS',EH)M!4,UE(Df$!F"L2CLNFf@U'LL#YVBG4lK+4`L
e+JplQQMK!b1Xi"Q(djp[DbB--V-X12)V3UGNmM'&k5jDC6#fY!mdhL%X-McpLpY
)64jM,NQQSJ[C3!m,kD8cTVjJXD2"Uj*TI%bBJ[#j'I5)3J,T23Z+9N'KAP+dLV)
FZHS&Z+-'K@8bUef%DTkM9kCZE*0`S8R#E4)KG*&BTqHkTHB`J%DZ-cF9,*mY)6V
Km--0Qr4d`N$eR#2pI)*!"-TEf8Q'+)dcE+&3*rfQ6Y3&KNadPL"3CFB!!#S9'QI
6'dZV$FF9Z[[DHZCD'"HfT9kJSH%bV%-5m1CTqJE#@*Qf1NjQ+pZmKdDBqj2-!6&
"@IZ4#08AdLRJb4JMKLS3Jac9pF3244%rD5!UQL3I1NN43[iKNM6eP`p'8[lbIdC
5%bK4`+$l$e$'Gh,jIbNF#["dJ64$C(T5KBN8,[[qYDc+DlF%@CHBdR1IHX(8F3%
b*I4E9+1hQ#J3-#3U!)GB-!!(!U4FGP4DG*m+EXY9RU"N321LZc-!8idKB`C0XE$
NbZ1,%Y@@6)mQYaMhL0lR*a$Xj!db"`q0GVebiL!C5VHZL-r'4j!!S(U#A4RU[Mh
&+5#BPebEYVXmrX6ir-T"IZ$3mQZ*-*QlfMNFKi*jQh5!!DQXqiLhPaQD`8NpM4p
kX+Bed8fpLE521@AYfj1I-cc5pXj8Y6U&JcC-98HbmI$Q)bQm[+eYQ-+++fdYb,k
)l,96eH&Iik&jUMT0JiH0D2E0YKh8V&aT+d0f%0RcTUVP%hMB1e@Gp4SH+Y#XUHd
ZDRC9D9Z%l,A)hM*9lEd9$mp-9IZ@i1%T0Z4ZDFMYb(BJZhUUZ[`P2+bFUNiZam-
UeUaHDVBiZT!!##'X''-GC&4JVC0`CKYS1`8$Y"E)mRE"-F*H[2-YMa8"4dijFmi
kihkUp"@TdPH8BHI12`rhl2`,QVhf5(&EdFk,pXDGef$U'fKEl5MHH3#'X5[8%B&
X9XbTKAZer)F22XSX@6XcX2-YC'SSdd*"CiS+K+@44&-+DKD8c+#LA8`%0&"il0r
TMVXTc(9JN!#$e3rmJ)20rGB8M'MlJeIrh4@%@,mc1`"$"&`EXbfqTplLfC5'2C'
RhN*K#Rm"%9JU$L-a8,TMQ[ZDb0"h,$-IN6!V4)H%Q5paJ"rNa'cd[8lGf"[m-Ri
LK6a`21!@9D[VF36B%08qH[#+kKPk5)TU2cdN42882@K%GBiH3L*#XZ*K%S+2f19
1ZJQG&+p2SFlf)rRHeXmVh(Hj)YNNeJ4H(16IFJpbDehc*A,Hlhr*HLejM8fj@h$
Ei3KR&&TR1[3K)L`c80("Ji2q5'c3,k-LM(KdeQbKf`k`Z$9eN4ck'$51m-IUm(0
Y%!a5a68+8dVXm)YhL&Rl,P%)U4rBrC%Ip2TPZ,1Z0!`%8&LP*fDB)GaFISTGiZ!
8h#(aQRdFGY+MMaS-jh,2cP@d'%-$Q0c-9a-bKcPImF6Lb+,Y$-A8*QSm&'1Z%VR
$fTfVZLLSJN+2BYJ8#*jFJZ0#U2DN*i('0b")hi,LHJV3l8GdK)e`*elEf*UE$`G
EkT5#YM#61#[XYULa09pU4S%9)24p"4r-KBG-f30YcX20bcpK6PB*GNLlU4["LB#
#`D$4MSV-VQj@2'dYLY!*A@U'I%+PaCUXS+klZJZ'1M+)%aP`'9,24'qD`YJ`PUC
C#3NN3UL*de6m#3Y'KDYb@2JEN8,S&*c)JX+mXdM,UZ*05GEF4Y1$F#!ISkT1bfd
4DmqMT`+"AmiE1'T-+0MT*@FC@iHcZ'ADNTJCD*QQB@kUH%6E!MF5C0Z4K!CD445
G*B%YUq&EcXB@"h1&"5%a35X@YcJ1hi$S&c''Ch"*#)N-62MNR*c@H(,VlH*Xd[A
+`C-f#USe)b9FE1FJ*[U0b-$8+ME0a`jB2Z5,P`L-)"ZqNae&LiUbk[XZfa*LI&L
"F46RS!CB3Kq+0f4"8)lPc3+l-0"LhhV%MLj`q&i,X4(P*,T5CFBfd#YX`-aRYH3
S%[rB)2$$H3%(YF3K-[VJM$I"MN%&GK#NKrY-(9-!XCh,$003k%K`D0Gm5KI2-'h
qP(0Jjc,,D'*JCa&96!lA',FMLj&@PCL49-DbICF9VLVH@E6e145KpHNr2aD%EJ-
"Lqj+c1,31XDUk25N6`JA'+!YdM6lYk)+0,3l"eSQ,+`$4h(,K&LmXrl`$8q6!C%
+'D`E,b-!5hCJT@l"0ALD)GG`jM6XT3Y0d,CErTPZVEG3N`,&&p29%D$IALUfJ*!
!4-5Nbia*Mf2a0",61NiA0C,8@6UkX)I!SN'%DrVhHVA,)JHY%'Xf&8aDdZ8['PX
1RiMM5$'%1a-Y#5'lF+$#2DaY1Ha*#KPc,[SdA"CN+!cJ'rdU1FjX&p`R'ccYXlB
PB[%[PZ*5)`I%,VK*4+!8bH8b'(f`'JJr8T3ISL,bH%c0Ei*EZUaX(m!%T6C$KH"
"EN6E)IM"q6E+V8N)C8DN)p6LJ-+$N!#PPX4**$FA5l6ALD&'a9f$KGP%$hRB-BK
b[)j%1B(!a[#FISLL'S1$(aA1MJZ&$UTB8FIa2'L-h)#BQcUFXUJiCqK4$FD&"Nb
JK@VJ5CepS+@2UX[5Jb6Z)MJV`TY3%A856iY`h(S[%"JUF2`!,6iC)"BQEBc3aTr
q3S8Z,9B+m"@0J*bZVQj$F)KaIY1ZPMk$!'pl50hlmH,*%IbX*Y('0N*&JS('SH+
JBRT$SkF2r%M%JEFBCeN`cL0-,(PSA4pKC1-UK2IkIP`X*TdBK(S2$35fCF)`&"*
3"%XGac"h5F1%qVTCXG,m4l5Yim2R)LGE#R(cY*3-qH`@pZUc'5i%""!H`TR53jh
d)Km2(e+alb&#H'%Uf"eHDYC5&P$mK%8H2KFqdP*#J!3Aj(+`bJ$ij!fJC5*$NKA
#T#0pK%))!kd6EHFLZCEVV2NJA1!I$8lCD0b,VGp'(F"&8"C!DbL0YN`KqjlXC%$
#e8R@$EcG",+`!Bp&M$X&BLa,#X436`R%8+e%$28`%B2!M,hm90LfqVj%KQcT)8G
kF3SAj'+K4($YNbqD5",CJ-)[d53jd&*#4f8&MRf'"B-$D3%bPCm$!j3@YC6()"H
#brd(b-A)4!6"&B&B%KqAMYTB5N8hI853!+qQpK&E(k&NG1X5*aIFD"&ijM8%1GL
'JLaPj)TUF%*&H!FGf-i,*#iD!U0%J(L868$9qh"i(+(P9BX1,V)GV#$+4NX!3cp
Z#AKe`*bE,114NL)&jVH5RHYJrU2E4SmXC"+C,,FK39l(M`k(V'H*1S$(STJ$blJ
H2lr%&T*X#kAN22kNRaAT5N-!,L&FQ!C(R*D1f'FiiX!jY9hCM0ZiXQkbD[kljXJ
Q3[(K65iSeh"K,36bX-+9L9eJ#aqGq&MAe8fE0cLlXZl(,%6'J+@$0QX,hYaEY'k
JTqJT*0RG$"fG'aTSkFFR1UQL!Z-*9&8'JZF+K98XlHJU#i%2QJ`JLTHlME051)3
$8#r'*&Ij'#%H#PYbS`&Zh&`3!hrV%X4!@aG8Jc'QMTc'3YQCUQd3RCe'm8``&dU
-"4!iVNc6"pcU")ImQ"4+S!ZEQm2Q"XfaK4l@r(%@+'i-#S1"(ppX)H%6PI#6NrL
aNX2lSYd&`j61%MYAKDTM%Lk(%`JG53*NJ"@*4dJhLrF4"-PZeD#U,fl931Ji!iA
GXqCNCBiYb4U"S8I5M6h5dhECN!#"BM`)[k''"'@)qS)JG%acFL)e"!"$%"%[(T`
3UbqMk*G-KIh"4U1iI)L+'HZ91l08-%bQ8#3H2i8lFA4"!"aS+648*b"$&mLSmI6
QlBDDc-DJ(XT9[r"3Zf%*dq[F`j3UY`R+#9Ed11hdQ,lS-9J`r1[Sjj(1PM0)eZ0
dD5NJN!"$B#N5AfPX+64fLPjkm&5a*SC2BPN[4ef1C3Y9U#!lA6+$"-qQG*kmbQI
reGqqLFqb)KB-'0PMfJa#3KakJ`&0&5RKjbp3YX$mSTSDCUK`iPfh#ql#U'55+$M
NKp[`ah$Kc@6+Qh9VA@GVVEe8N!!$NlD3!!$!AQc*Q2K%5iX$&Jh0%-M+rjdHA+k
$63*SVB0#'BAbS@5@-UdZbTjDk5ARh4'K%i4!kJhrLPeBDj!!-Zl9XD*8dX'E&V'
$qh!"%LXV*V@1$Q`'8M!"ic+l`H4,iS@1R(Vc91Ka,B,T38`J0f+SmA)0#M1%$*J
YbU9`P5KfJNHK'NQE3!,1*G'#UR%*)D-!F!`SK"$)-VZ!!TG94k1rCDX-k"-LKCF
3hl+P0[h&YjBp6%M4KZ*,bak1DTL8JP%"qU-Ded)Pae$BXXZ')HK)3eNX`(H%+GP
m&Tq!i#%8P$"%NN@03#)c&QMGf1`80JSA@!'&lbQ)`JRT,r8b"3Rh'kH`PE`)hBQ
$@Q4fD*N9rYb)V&UJ9KcU8DKe6e5"!!Smf#Td(9kN$r##d#I,8J@NYLce@%LYl%d
*UI8jdG4bf0jD9!ANfNj)VBK,51fkL1Q%e)60&994aN"AN8L)E9QUJ0L+JJ0lLV#
T)LiJ0NajR#l1pUH3!(3X,8$KfkY4JHGPG11F-3L[%KK3SI*`ZbGTB16ak5h!a1m
Z`-6R2JJ6RfYJiR9K%a[IA%&E*9+YbK%1&ARcf-ammp,rM*P[[NYJj[1bd((1`-a
4S(%$GBBPH"Q#4U+JF1RF4@L-"5V98XK!(3(Q*FEHAf,X[@lI,QcdS""ZQD%@Q*3
8-`#23VUNA%EbSL4'96(8fAFP,dQ"J8UFVe[)q9SQBISQE8XI'6VdJ!P`9FTZ6J%
+,!#F6qB,K&%[%0MU`-i3N!!Km$c#@#kc+q[DUqCrB)i`&Jf-QU%#,lpSUX$,V`N
9q$'"'`"JNAN*`R"XHR#`IR35L!EbdZA#%ANTLYV%EqjGpXl!RQ@[%@!LfEk$MK$
5GD&ZPV(*bpi"b6)J"MHfp&ZQ58#3!jRPUcN+d1k#3rriD0Vh1q%UlcdVGr@Xl5a
H[(CA[QcY@EZVH,(8Z-11U35f&"5XCFl5MJ%l-D!$$A$ae@8)!Zl6!(@Ih,HV!&M
Q#f!T$V6Q)b4I2LfHX'J`HQb+ANk!$aAG+LQiV+@1U'@0-H'4TkC'1B-8-EA-D(J
lZb6P52HH'Ac3C9)Yr@4-)m"(dQXXA8+&1"M5BNlcC'!MGRIiijE6NYQX#SBdHl3
KcED!6'$@(RhABHVBeT!!*cKh%KH4#`UXFf#JjE4-UX["&YG*9PcH#&8N-iaUQ,T
"SeGhe&24pe&Q+UJ(ZUc2KBJb#I(NPZ(LYXkf-ADlrNKR@a%8c3P55GZ,'c[`mik
pXG'1Rdh49EF&#Tlh+C!!iZLVG1ZPJ)0aL!M*BZj[Z`cNYqL)fK%@djkI30%8,`8
"HkS1KGVjpqVcDa'Xfpia5Kp(b#Kc,CE@R(Nf%JXlLKX[$2N05dR1#(lMVJFD,k#
+CJ@5$cFrhH#dPY62S#Mi5Ld$4FmR13LSITQ*fXpD*Xe`5EAiM!-YCab9&6QHL1J
IBL(UGVrEe8fUmKPj5!MI-S,1jTMb[$PYR%3%CbD*rr-VUd#3!+prhU[1raa"%q%
1iXbLN!#4-)H6Nd!Y+HDr9erX&Bl[LA5%K8lmLqM`ZV5K02ha"pVXB"60Rp3*NfL
3!'*[6*T)Qpf*"1Ar#bD1ahZMYMh30Sf*5cl*35(%CQFG66b,3Sm'3S!!U6-$MHp
J!p05BRb(N5$)5$!"%Y6T5B#!D@)@Ufa`Q2Yhk)Q3!#9Nq6ZG186BXajd2al9I3F
'AmHklmc6H8(bPV21FH$lEDacMXl,T5h88Y*KML#mD,P!TR#EX1e`!c(er'8NC$#
*YkkJiX[m$56hFe%9JZ`SrYS0r+6Mai@I+iFE&h[(CM(T((1"bB[-Bp5"X`GXNaf
!1YQT"C-l#HF@Pkf!!S`Cc(c(B#5[QC3iZ&"SBhhk)dJHV404330@'LkV5!ik3%Q
&*8c0V6U0%204!!AJAh'&a&m!ZI#C3f(-+521kB)T`GI*98@Ud'cL`-BQX)ReqA-
$a4ZEP05#kR('(L'XQN8$9G3D&-Y#CIl!L&NKPTAAj&'dcb0(IL#lqRX[8P&J'Z#
Xc,UY,p"Y24@T+[h,%N1PkUAQ9*8'AkG(ZZ3MEDBMcfBSD0-RG4ir2A`C'jpkFJQ
jQ58#+#6fF!ijDT48SAMT'J5P!T+YIJeU"X9cRB&1NS823),pPeiX9jMF"ajG$41
c,JLhTX*a12EBcJIDVU2!GA(EG3"9*al')!LQ-j%Tb94fC$iHXcDfM9'S0&24S*!
!-Dr5E5eE,MUmCmj1Yc2(*,T2)!m&B*+#CUdkeR&[[8(6PQ#D*$4P),4c+Li9P@S
5PMBfPEc-NSd'b5E6jKI$(Uq8G$,Mh2if6hi4*9N4ZQF3Pm)@[pA$Jd!b%DN$rjG
a3h(P'#2CUQ16M"(-C#SJ-`a8cEAAQ*%a,*L%Sib-IMKqLF-J61-[KhXDe`1a9i*
9665q5DJ,3d$*hGp0B&DlZbpD5FS-G&e[GEe&b%%+ZTp!XdTF-2VMk!Xb82J`0VM
H)*eRH0dH3M(l5P+KDNiJ0"!ZfidbkZ)6G%N%"!2LJrI3"4&#c!6SNJjcUUmlqS)
0821(E1--Y$5-[%f5NKe"NGBp"5*4&q1XbU[5NbA"3U4K)NcL4DB*4FZT!XaJE-9
3$jq3!&aaUJL)3'#%)ZE*Hi&8c)Q+aKBE&IH590T`,6l4mF-4%D[QE3Kf90rI29[
FHJ[#DNQUHN)Ml#,"G*RD*#'%XDX)GPK2C,CI%**[5q(C`S(LPN+PhR21!+Jc9dd
J#V6JRHRK5j!!p0q4!(APX3&9!&!d6e(@B-*"!Yba"UiG!r!DN!!'XGTrU,chJPk
%Pa"6F3iCMaMDm"dEEE"%AqAX"AT#`YrH1Y2,9`0"03N0@JV[[B#X*G'1@C`$"*X
DAhZ%!(%E2Rb0C3$&YLP8Eb3''aEkdFdHJEMmk)CQ(ZdbXH,aU!YlX%#+-'h)G"N
JX*P[H(V*c#-ieA@%Bq'4&#d&BZN8RHE1LVS935(-!)K,D[q3!,Pca!rSY%TX1i9
Ml&bSBk&APjK-(*,MK5RX@+F"$3f&)6L[![T2mJdV[NqS-j**PiYQ`6NS#,2--bN
#abdi(N$0'jhNb!!LGHdL"l)acJ6#qAdM-f5N@a(m'"ZVBLCF8YcL!MqP"qKblkB
35McU$`!!-BP"4%05!`"B)Jp9$@C'%4!KiqjKrffrPUVdjXpGhea2mrKFe98p99Z
pS(NQ1p50!EZb3+qEbH`XmZHaY6bNirTQEL'%F%Alq@8(R$)MSY-McSA$a*TN2-m
kQFFY4+pRB6e#1,f"%F,bV-0S`%#6EY,YI$-HkqrIhrrhG4dJ[lXNlb8[2`!9Gei
Nmb!b)K)Km3!4)JCIDj6*@!`rXUpC!#NQ"l"*#+,Cl%(J*,2SI$-R`5a&,*AJHr2
q['r##2kkXb$M29bpECBKMfMd5-[34iEHEQL9%rI$KBTBl%IIBF@$B+jGM6BrD`6
lfrd@hfH+T"&%q"T@$+410j!!4@%JAKK)i4`#k3*IHS**R#qRYL!J,1e[PD8i)MN
Q$TH4ekh21YlS(r!2!'ara"r(chPe@h-FbU)b'T3@haK-Y,,i(`'IKIP!,"N"+lJ
F*P`kQB3*Qc$Gr6!E409iQ6GlL[r4&Z&L'9UPe)!-6NmFm&&,I)b,MkK'r1Phc6L
3!%D,Vq@!5eRd5mPY!)MVa183L-VM8M@0d+mlFmVaj4C(GiTKcq$XFAAAAI'!pZ[
1M2*!Trk!0Peb`'9ka'9mR)bSmU3+fU1YXQG$KkpCR6!d@kYX4M$G$"!j40"a(8+
X1Pr'Q(rDj[!Eb@*YDNP'rBpiQY9D+[kSEHQ#E8#1@mCY-0`U)p6I"B!Jc-X3a2P
SHBJ%mT!!XA'`f`ZS-51J4KBV+Y$IJDAfE!q$%F2[XF'rBr'8'%'93-U8GA"Tk@*
')3Qm&''F(5'FeAQeX(aEpf53!&-A#,qrcGhGEhR"D5b(%QaajY8H)pR@$Y"iZI,
)FH@4+*B'GPmI$ICh'5'("E$ZbIXKpG$6lkTD3A[XqQ45@H!A#qlY-T)#eLF$V@%
$j6#bN!#6'Xc3EQY[E2IGCC0&!P%VLZckV6[5C&R`'6PTYTfPBXT*Hp[C3Riiam&
%0M)T-8dPTNNaR9cZ!T!!-"R!T6RXX$*S-JD$rG2VT1TZ'2N+JN3A-c+miZCd+(8
c&[-P$5TX3)YRNFVU!82kL,&a$kZQ'Qp1@JqG,5ajPaqb'%X%V$'mT4fb!$UT1bl
2Di#8V(caEe[8e0*6X6TreL9"IVUAG5r8ZV@'EKB@8MHD0iiL#KZLQhQaLC6cNJc
$J!+1EPjSCLA+36("r5bqG0#`p-$L3Uib[F"%!I%'-EA5Y'i(V*p9iQ3%8c-aR4$
65DNAeVVRPF+UbU'B[XhUNmP`&`PH22+))RJTEe-Kq9K!2[YSD-p[Xh'SHcNmcmA
`UNAG3C@)qY64%'m`Lk3(2I#HH-"YrRS0%L%NX"hc[*@'NeXYf(3,LaH'efhNFkE
(bjFKB2c8A%k'"5JiT8RCGTBhjTrhLF*m529RFY,`*)e8@`H,@`d*Z*!!#hi5&qp
$*EQi*dedD9DGBCiLP36"23c$!CJ%D'Ac3963QfDL9B!P$bcd#ebP$)TmppP%J9I
pYBSCRD(b,KHc8UMmB8`8UNH[b[&%TGfMbfqe`ZKaZDP,VS$8"J["'jL+S"Jf+8+
Z429EF!5UAmLV@&c)ImZU,dqV1+8e[RC)UITL1N5Y*`BBjVR$LJ*&!9%bp&bESHh
1R1McFp)8U[I3A'$mh6hY&2``-h3PJi5$%[K8'8Y)!@RFAI`G(Xf24*Xi!!YIp@V
-2$QAjZ)lJPaFrT-HqlA)fipi-YHLq+Qi&X525led%3Acm-E*%+N9L#[f"@cDRT&
Ulj'[UQmUVeBGqDTbKI,+12,9Ppc+Ua"Yl@R(L93(Ep%AEN)JpDmbjM@dS@UBP"G
$BABZE'%3fC`X(EFeGNbA&V3peidT!&ffECf&+lN2Be9M(mBUr9fSrSddCI-@K!C
6[M1r#"%1Ef6KXM)R`$K(i2%!UeA2L&TdNB@Q63D),,%i8kMU"Gjf3DV[lq[eZM[
+krbqARpTNr,DHm4V3,#E&j5A)@)hRQE')VhbTNMd13UZ`UJdZeUPIHB6%"$PF"*
#1C2,3AD%Nh4%q!b`(@"LJY!2I(`)NbbcbLRE%S2dRV"XKeE$5da!lifJRX)EG*H
JG*DVi$)q4!Hi$TJ+(F1BkKZI$%rD3DirP#d2QMlcR0K!`PPL"3LR#C1f#p2$BUd
SLZkFJmNZ-qE4M9CN2j3FrYY3L6"A"L%di#YT93L*QC(q$J#$8Hj3KN9&3S@QlIJ
aIhN&+N,l#1RjUEm,@jAJcdk*kaT1XMR[$4,HTFh4p4cB,ff1[)0*eFm2)UN&FiL
FqrP"Rjf1YG+a,8Dl@q+&$jfX"S"UVA'eGa`"YRe"4V*#aBNdNqKN9R1m3k3S1!(
N'2rH`I[#e2iA$['+9m8"Q&0TX8B'aUDeLXaXR%cZ!Sc2Tpi6c0"4*IA`*$2@PIr
c2SU0&8AhV"FKL'(q"*p6VC*cPC8,SEQRBYAU1$kBr1&qD+ibYNjGe)YLYU#eXX'
)`iZ6ZqY$qDebcJB'Y6UD$mC#qA,FUMV4"5[6`2!k&l(&@0l!i3BAY)@),E&+N4E
jrrPrNIr#Ip%MrJXUrfRi,i$rp)1b&U53!#c"eBCP-jb[(X%IJKCU&&BN`B,#S$8
fj$rEUaKbcCrYhDFKlq68,K[bIfI4bFLYi4BP59HA`Z&EjA3&6hi3@pMaCh[a`2&
K($-A5E9,@5kR$ClmA@c"'V,%BKPCR(bX[UdpK!91lJTe[90X00)#L%Xl(P&GI"Z
@G"Y9Ce,#62Jf#2B%S,PbUkQ&9+XQPGZ!DNferL-X,9DhS"d2UFRM88i6a0E&kLS
#B'&#&0"H0`C%0j4EfHbHXE(cL-G*R@X9G5iAG5iIGDlce,QN[!abe`M'rKpiQp"
Yrk2rUR'9`Zqk'NU0rTpqUD5E@ARN6G1#4m8MLHlL&Bmm`kRhPqmfa#kKV+9YHfe
9*EQ#6#k(B55MEk$(FQ)ec*fG#"XAb`39L%Q&%eHEj4Z)ak3k`C-)+hj-SV,`qE5
!Kj1`TVe9[XN1(0%V)FN3K"9NJa18I$2-,jBL%XIbi8Nk2+T'(A(aLTC%LYrF[Gk
AY"-`%mGV,bP`mb65TpE"P#q4L6##ZG5ee-mH+IZ2Abaa8TFUF-6@[h)q&T04&BR
(Vq3a#ENM2*Rl8%BA8B!E"MaH*4d2m1'V#'Z4c-G,CR+fR138p9Ic-J4fcr4af&G
j&&1q&35%Y[-+XaRR*!,+B1`9*RYC6JIpr#-'M9HJ81a'R'#2CA$K"2'*f3URf*A
#Nq+N(,YeiZ0"(2jcRia@`i(Pjb"R"T-hN!!d1`K8NSp6CA3h50h1bH"Me`(-f)`
V$bXX`THCL%q-5EKfEJ6irdJF4h"4!2,F[S1Bh+P)@0V(BXp`JEDG,)U3!")[i`!
,4riFIel*fP0jK&I-d*,6#M[$l!MqE)B&iV"FP!q(P0!k04b+,Ld+35hI[CiF"YG
6JBp5J9mLii'M(h8`+AG6Gj14&ZTm!#!!0,LcpZ)rEP`#HI4PlEhjiQVE%JKkf``
1CJM`H26&2a#$HYfimP@%im0f"ZF!j)@0'Ac3&KR)b1'3!!Nka*Ze1r,&%FZq$UN
DFNM9d%0NLEi4qAck4SSM3`kT'h*)h4'(V0%h)QqPEk3i1Z53!0SKKp31183GYJq
59Vc)`r9+id0B**kC43XRQrHXhANG-'D'$"0Z,fmM&(&(m409$4LH"J1a$M@GbQG
edf'4fB6)*RD[peKRPJTb5rZfkmiV(bc&USIYq+RXcbpD8Q0X`!LThiETP-#*p"4
-SjcG2I&R0IkX"#biQY0Ic%6'9S0pfmYK%X#@1DLVe6#UV6$PeEMCqK01NX'p%Z&
Z2GL(C3LE9aVSVV%9HelU2GR!F+"06DCZX!,cjFp*`(dVe"`VN!"H$P@f-l2@0`j
b9FBNV(H+1h[I9AbfZe2N$PU#cDcBJ+1RCH9qCHZA%2`CaARE5GrlZ2L+4RlGUhF
(2KbZI&'p3e!h!!1f#X@YG`-&ESLQ"T61N!!F$UjH3Y&Te!N3A(qTQ6X"LVMP)L9
-0cH0R"lXF1MkPR3B5+6LZ3S![-kFPi@T[U[1+CGIlFAPATd-&8+2A5G6[chBR5F
QZ$YR*%#$8e!+rjAJ1(3!&1'h[`V5#YM@MKGRI%N#X-jmG"0TfTY)%(8CmieG#lr
RPqKSBeKd&NA3J"X[#ZZXScf$j$#!X"emHccbiZp1i-MXF&DqZ'Pi1#mEPj!!N5$
ShH9I&@HBhh8e1lr$-YF0-pm1X1&XBFTe&6F(&bYNE"5`LGTF#$afR6FfPmh+$31
cfQ*`$""*%bkl-+'rp,ZcdVI0#+(!km8P39m(f,dTXh(2*K$U%LE8"1#A-fM-$q$
QqG'0DN8KF$Gbq(FL)B%N(G`6#`(k8-FIS*M$$(lJ-VH`!mN*"LSQLbRlZjZk&Qa
+!GG`pi0$&&qJKKjTM6d[TD0V'EBk,@2C3C&9EpAK@&E@[mKAPaA*Mkj8Pi`'ai,
RjFaBG4@49l-iD)-49pIL6`d(@-E9CdSN+r3"lrM4`p+%LET)3"!h$,UFb8#IEYU
k%CIaMB[0[!6UI3#LQr,-JVJB(KKmV(cTUHT+YfRmi-pA`edC*XG"$X+r*$UI5`4
aXA+!!JbVYZ5NTm!,f"AGp8GZdlZ9PaNK%!4HE"9ZNP@TNG-`a5N@$T1(E3dLpBP
Uhk[H2KPi@%i5L,Vm0KXKX*+akYeXfUKQZ3JP$4F!!kYpV,U-LFP8*+m"%0+fG+,
c$bM1E11rZ"Hl'XZ$Y4q(#b@-fQ-RQ#RLij!!-1@1'mrbjT!!%"aA!QN4eML)J)`
3iI!4'A%6m6K1T10Zm8BL+,F3ITld&"HrLCqLiL4pl#THcKp90aGjG49B`Dp,@9f
R2TIi%+82)iN2'RfB5R`)diH+a)F)IFL0"G3-6,UeZN3eaJ,Z+)YFEFBd3Y08MKQ
`(iPPU,DrZXc4EF*)I%9)mCB9(#$bcaQ",Cd`1YF[VdZT+01GA2J&djdR8lC3Z$[
r6XGNN!#C[VD15BQQ"9$"E@F!NXBI0$dqbfSf*hh04Tc6fdjQ$RIqK&eTYKjp!fU
dLp4SmhQT-aY`V`Rc4Mabh5EDN!#8Y4"&#bY(6j+frHrSbZ8L4"G#KE$,@0K6-Uq
jV5mReM5a$C!!f-C*E&0Tl(3[LDf2a(D"a&C-3R13!0!ZN!$39"*CVqT)#1Y"3N`
$#3'Y5SJQQa"+!8,a+N,T53M&6!JP*)6LT'lfY!d1l*P#S,pp``dipR9l@J`U)Zr
',Ipal+PBll&r-@A$'dIV83cc6SZrbcH4ZX(1X02LQ(r(*bRA'KXG&ZlfD+#MhC@
L+kZP$*f6mVl-R8K!D&!0c#k'(4dVEYarRJ+G5(A*r3N&FJ&%mE8DefNFB3ASTc'
4%blGF-L"faUVR-Fk'B$'&XHUDfkHY*fdY&EA1Le45k`f&X00RG-#FT2Ab3e[5E@
5bSM[UrX2"DE*KCJF`PLT8A"JKa0m(6["HlFbZk3S[M#k'`YhM)3E*V(1U1IK+)r
8!MQXNp-#9qLT"jQ,#J3hBPaPF#Ia3%S`)V*6JH`U$RJ!%*Bm*9iVKeMhGC%RpqX
AmF3rKmp8G2CIhSY9SISJKJ"9ZBMY$'JpDA'G*J")!)6I)cJ`,E9L%MRQ,ZG(5X)
cr!d@4mUP`kpJ"NKBJ*JQjm@'!9[a4k[4qk#KF&'0&Me%-0XJB-C"&*SDSBP*+8&
RTShKXGp*MQY,+HJi6Uq,p'!T0U,!YJD8XCS16q&R6'D+,@"KLLD4(Yki&TIHmD$
Tda(AD5J!UHf#5VR!ACPqV"lA@&#G+fcFFPeRQ!XQdSrC@553!$LK#c"i`0Pq22*
S0lZJb"f'bjq*V2&&qbmlEU""N[2MpZQILF!I#6Cm3(1IK`#1,F+jkT'Cem6&[pm
(dq6&V!C'd$6LN[cB5(SQm!!%q2e9,RE4AjKj$5T["'CGM)m&qRJIMia'@['KQ6l
-SRK'1D(QBp2)m2*U'hH(f-L*rI)KDY$c80pTIQR`B4PCqU$TaAYmqGJ)QcT[hM1
'Bc1bjd(6SNfmmPk52FDAm3"56IK*r[+Hc-PQr'3PJMmqrV0mNr`X[m"$k'$kCl[
di5FXlrPKp,k*a!B6,[ka,jlB(eN$XXf1IL2Z**(YPA3c36HV-hc6r%2a3*`q(Lc
`6HNcp('T4(k-Mfhd3$%p`1TrK-Mq9Ti5QeY1$rMSJHeLBD49X!Kii48X,pd8k+C
'HHJGaGPSa(e+0*+LQhYd!lJr'LDaPJUQTE&p`8l'CJU)S!m'JT5b%iYXIY-c!)C
L*E2"+*l94V`ihhD5#C!!!H!mGV$Y-QlX$jVfEe@)NBbX0Z`-aaTfN!#*9c*-P&l
jb@@`a9mNm5lRir#R$8GHBNG$K!YVXEL(&VYKqXY`iDfiX,-`(feRF)'")i!$GTj
%T5FPJ!N"01$KFNS'EDHMbaid(5jPX"HpZ)Y84c&A(BdR[+bdlXmbr)XLBmHPeBB
Vbmj"09N,#2%P1#$YG-F9&5QUhX+0UJ`l1Xd+1%'mdY"aY)%$#+9L"ebkC-f3!%X
2N!$K)%h[@A8hFP(M"BBT,D"F%S@@@#KFS$FABA&c6[jL),D-$[LH6m10LT3$3)E
B-Nq[XUN*8JKfJ$JVMMC`%M+fdXP9L[qNJ5S9[aXTU6pFMkhbJh'Ha,EMN6VPN5V
a%H)@%e04$5BZ*GIY&aI(P"H0q%I4Y9*)$SaberTJl3Ke,D@VTb$8"HkH(p`H1Bf
Eqi0GrB1lp'P@G2326S'pr%5SM3rH(cR0""@98MeK)UII8jX99S8Ujfr`#6*lL"4
DNK34c"AE$l%55R21bSVQ0H0lQXR0(iQZL5*M@I[X-*2-aLlIk'MmfDkQpZRSVIC
#B-Ye$UHJ!1)JCS((1MR)qbS+3RBkhT)J"pUPY-B-TZ)Q2F%0eMMC!0DT`Qdd@@E
R-[0EZiZ-&6MfeABQpK4%C'3R1khlV+,C'6&*l,+#&$8jHPK%3l4`@S-MdbLLj+q
crE0AD!2KY*Hd!DMLe*rm6QV2['(-&aQ0Z15I[)&$`S2T6DXe-qJJ%UF%d-6$'K*
A#[X3'fD'(3hV@(A0qXriKY(YULMKmKc)PmQ16&mra`m9T+m`-rpM0%D3!"(m!"M
$ccSC9$RGU(%APjcU6"DN[peRRC`rmP,9R"LGB"*SY4lK)"#Z'1-N2kGCREe)10N
,IRI,-lCc5!le@cK"2aVFr@p8F)qMZ'["J(B@!RZZ-a#4M6IHA,"cdV,ajR5+(UV
&3iqVX`J"JiGr4i9[0YkmAfTX2&c24Fkh#kB48)k@cplBr@mJKB12CrL`@AC$UP'
@d+IT#6#20p$8SBD@D(`C#1eaRiaG`k6@-fX%pZK#CE#Z,QVKePqHC&3"R08,f4!
RbEf"2@N0@&ke1([KdPP(*J'6+jK-NU2YY0MN!$jUi31SDBhp)d#52bU299&aeD(
#UGKR$'i))Y,j9@Q-'m(i1AEN"jX(m6Y4e*NL`$NC'*[-SZ1-b4bPdf[BaBIC3KB
@#%!P(-kDhC'pq3Xr(3L-Girr&%A1j0jd)%NMA,I)RDa5EaC%%'!,f15*[cm2+,f
f),TYXU!RJFr5*Er!aX8XQQMB)A-kZrDJDFpY5TY,RmT-,TM[(Q1H1lEAE$`*Cb%
Q2bdJ1i#Nqbpc4BqHSHd$fNDAckQ'BHqe0(BX-)(+pEE+(),ffYicUZj-PA5m`5!
(3[C9["9I36864jU2GI+abS96JaHH,5H'6AF@f-lQ1SE#4%(QcU-Jm@$'%)A*UIN
E+-VYp0PTX%-6LT-D($1l(&iUdHa-CU(bQeRPTlX'!C6dkX9,c3(+V*+"lbe+XKf
0Gkk`!mLYbp4)Lk!q'"NfcJQe3Mil,b"B1$Z&@('0SN'mcdP16(B5b#k%,,Z14a9
P@XMTBQQ+8c-3NphR$MJ@9FJ8iP5p(Ga-@'P%X4h059NjAQFhR!G0@`iTC2djlM"
(,k-JN!")b149*a@2fGEGH11q812I8FIji`mD9'ha"prXaLDVP%*[S8)c%`*2*B6
6$R(MTD0"20,B+P26XRVRN!!!T8j4)i@C+i[-$)pQffH#Q)bClEp!Q!b8-DbR%GL
"bq0!CCXj)F)!fE"`R)fdYA23+RX+HC-Kr#JFhd4Up8G)iPIjmG%M2Mb0$b9i+!K
"e@ARkB)@239#6U@PT$*-GYEbYe-$G6LCXAY9aAZqjN8dXjGHilUreh00%GacUS1
G`8kLUk+i8qGNU94GcUZp9eHpCmCaQEm9jX$'m1J00S%0&PpKX9Xjk)3R*`lbT-a
4'D'+@e6V$'"C0DiNJ+l$50#!'qk(pIjHA`&'D",EBAG(&bed%$8J%je@F91*$R&
1UPH-RaXbCU"-XZFPQGB+-[LF3HS$C,m&C,r&i1CRF+8[0Srq*ibqhXL$i@4JDj1
DT!#b(Rmf+@j$9LL3!%CX[3G9I4YEkb%(!XfGa4C8I2`,&-S1&$klUMPam#ZX`+K
l+Fhj5A(e#-8&aY8(mM1M'k`bm%!j15f-a6EK6lfHp!Ilm4GS`Y,))5'kR[fLU6M
#MZEJ-J(3SLEf0X$,VA"4h4iVKi2ZVPJCZqR'5[$bb9J0f+'N`SM*5*9KGeJDEm`
1i2JRm@FrrZcL)3qqaD9,KPakN5q0#QiPd[*N-lU6G5cfpJE00q%2`S`1EX"R6&E
1R2"V(ZX'c@-I$MK1L+B,B%qAIA8CR*8N6+R'-m`rM9MZb3$JMX4Uf)d+k-4(8"!
m'GZ"TF+*PTB#pJ6S9VClR"[EUXc8P[F#p-bDqhi3,Z*P-+DYG$'[FV%R2GCpE@K
'!+I,1&6KTU0m#BJ[9iMV6G$L,1$&`F!ppXVNFP*#jF3%!kMmp6dpG*!!c&lA3Fd
X&dT+(5$c-p'`S8`db)5+F#B8MXU[p3Z"'6B(UcCRqkCSiPIQfim0Y8!0@BR-'!N
9C%!&'8)&aDT!8$L-UN6cRKV(QB*p`ieTZHkG)BTS[Hj5CE`J@c,X[-*KcRSLe@Z
SZf`U%YfPRC4Mqr#(`UN3$p3,4JR&p)SaTA5A&I[S$XZS1mMJlk&8XNUAD&4Pm"e
UG00kAK),Y*+"GcB[dl`VV9*a'8&3SUXp&'1p8(Qa&B9m(1T05B$fL)DX"0m8#*S
E*9$ZMYT(4cm+JDj8,m`%S9SIaCq9UPpANm%(LXV[3PF!+CXZe9e6JMZ1H-8Q[P)
FU#E8DT!!@Ij(2G3P(&d36HZ[f5"Erq0HV&@i(A*"+DVhThKi*9L[PTPM)'+Y1K&
$#!`'#SQ,f`BFf-(dj[(k1dTcJ09`R$1IX5&pUk("`ZS0!`XYF!J+03j-fdF"fk#
431hHeYKk6J`d@3BEkmIfqU92mrIlIJBf'@ijUlLi)Nej6mJGEFVlhZFN$i`[5+Q
TJr34V&AXi'1FZ$d)-dMa9MKY*6iIE593`*Be5@dMKAJZQK9%C`NQhZDr"')MjHT
c'V0GR'bq'd5U1Fb0hlQTUAkNNb(9eH4JL5S*&mXYPUGY$2@#kFYM8HM[4f*Y[[#
G&VKPf&4Q8jI"#H#RU03KER!)GlebGBGcURGU93Z4QZqQN4U4p'"L%li6S!0f+16
NE)BKqMDSJ6DikjHU(p2f!pKqR$H(jN1Yjk,Sp!a$f2c(I!9Z+Z#aip-QrR3Z5Nc
Xpf*Ve"40(m*84P++@YLB8!Sc1ZJ00G!)aCNPY@!MY@"ld25M2X@GG3dFfk%J#G5
q,$S'Ta0P9VfTU)H0DFT"A23lI&(j+LQ)M8)pX&#J('`FmXXXQ-KXe[,0BkM!,N9
"',SCpeYH6P()c)riS"+SLlI888TDL'kpR6Vc8-D[$-0b@(@!KSqQcL%V15@kCQM
6HDZ99)G*UL1PJ(hI"YMR)l$[$b*drVUE)8b3!+-Q6QGk"LJm(L#ildiQU$S,QJ,
hmBCe`-qT-*9@X(rYMJi'pa#klY`hZ"IaXC0X8F6@lJNR#D5@pN&`MSH+iBfmL3'
!'2K$FZX&X-XZ3lJl@NQYq!RH2bk5qh)6UkU,(mVh&*HmP!*ifjP3BT!!#bG"3Q$
ef3!QNH6mP``6bJ`h"@MpbbbXbbX,LrlkbjM"r3F0#mH`m-jIEZ(ADT@&LVXT`G"
T!%CQh`#'*J!-Uc8G`!!8TM6eSX&(4NQGY(%43YKfGY!FIdU'BpY"'-jRr$b`aRR
*)A-Qf0qKML(J2ACr)K2SlaM9RZebG#0il8%bp,U5')df(TYYcJ8FAIakplrTVjC
e6$pU"!jhXVYfGVlaf))-hZD1hRKX@JBY"9DB5!5JJF3%+dbS#4NmaHU8"Ppk!!9
IVLJU$"@MaNRCPkYMrKF`M&L'e6!G@UXF@D)F@+FF@)F$GkTlSE$+8DQiIK5c4h3
48TA49dAAeGh,peLJ@VH#"E43qN5$kJ2$--F2"EGE9XRS#E6C$8B(d(SXS$3C`U%
Lk&%fQ[6hHf4d,@m3@k)'CFU@UV#PhH`qfML`m#`Q5C!!M80(E%a4i9'&i%)YKiG
Z,E+,YKDNVGQS-4%BB"*H*8L,$D)effiAmXGP,VMlp5(L#r9hj,6bENIAlYFK[Y$
Kk`QS!Z,MP$Urh[fkrUS*iLZ%lQS-D4")!J&'pK*-!J&'E(eq)hiU$2Cj*lEP'Rb
8B6'P5MZ9iSf,5Na9N!$(B!T9i88Y9*8S9@APd%+Z#%C[bTMrK)m01iNqB&I(Z,*
cU0k'%pM)$$B5Ecb"M5`+83Mb+3Be`3+Vr`DlrI#LTrr[FCRapdfTeM4M[,N3*X1
j14YfG"[aaZk&hI`$ai!5"Z*1*6Rp`R#jHSdr*#S85MHA)485MS849'G9BU[(Z-N
ZE49&*PmAa5'fULrQ$E[Y!TTAA1UH9Tq$Nd5E1l$"!JC"JpP`!pkY5+r&19@Q9[!
!BGNiJh&c&S3pd4r$S3b6)#C"6!+BD*L%-3PJmZD2fB8-$5N`fFK!)BCU%CFU(aU
LNF1k98P4TG"F3!06SqAXBr2,ERJQS*VKKQ9mM+'IE[LF+lVT%k!pBa-2"Z@,&aM
`Jm&LfdPhE)0PF1JQDaUFK-B$6400$"JCqBc,EIl3GKHZ!5D$A99J(JY'I[hRQ&P
fZT!!S2E(+RAi!qjejd@5SH"A&pP491iN+*)"b*XZ(YDV48NDNh[`Ljdmb)Clqe'
E%FE$pHl8-cD3!#D3!+pYr-J9(U![e3%4"+CA`"'d@8mB9QrQ`haf9S%`$B4`5&%
$B-9`9qATYp2M%%09`A(X4ANCM0dGGf51`ITDlhK4kV[[ZV-BN!!2iBKh[!m*8Ek
"Xb"H'd(a`ZLHb4X1*'X[Fd--$2Q&`pD2'UQdaK9eA&LV4%1XLE[55('"BXLr%fK
BXrC"dar[B["Z,X$$3KdqL5UlQ%die&PB!RZIp$d(0CRdIB'8CTAc"4"m31P'I-$
b%i[$!MDYbQ4SKd'CbSFjh3K"6mjM%,UhKIY20M"Z1fbKVESi"'rV,13r`F-bKI!
2akhh-mcJ%6HI3m*c`S%,'[`*#JeT#ff`+U)T!$YP[V!+'apcjRN),Kc[d)rQcAU
dI[c3YZe8K3Q`0LN"qbBhpje1Dl*BU82Ak-*a-%6-B,1E#9)&#)3P+J3JZITM!56
lHTM3dUXaUQ`cAUi9,aQD#kFeK"`Fj)T"TI6MF@-p&8F&-h"2UH6L0Xb-4HfCj)Z
f+%FM@9`pVPcfZ(*Cr585'p8jjHAlNl5Ga%Xd4+JfPCFck&33a#rk-KF63'I&0AH
aQl[D4REr-[&B#k@G3b`JG"H)&S-$eNRYXjb8$K2JQ("9&3RLp-SNLXMAGcUY82V
k6LG5a2XXBPV)P4a,,14U'BPEVNLFYppbUh"4f6D'8GZieh9kX+#4PQ,31)`QSF`
3TY4QJReF-rN2mY)k!a#(Jef)i22-[[5GeKY(Q)Z'-$PH,*K*%maN,mcM19BRIPD
6V03q9PkYFM[rbPXB0jEl8YmmI@G&e*Ll12iZ%ZLF@T!!mJQMheM'E#m5ZQ#eHTk
J0(2BZ*lTjp3c$b,8mc`PMLY&NTjGBGjEJ`%G`B$kCK#)e"V2m[qrBYH3!2IqA"R
bm6frFA&5kJ0![RH"EfGH`f&9BY"$A[M41+UYcH5)&34EZEQN$d-8'NQI!*UI9hZ
0T&!eh%%D1UI1Fc*2'TpMe`brG`SZ&LQS%E"`q)3Q0D)"d53DYlKEH-,*-R+r4,U
&(4SJPYYpR"VMLYj%BJb-0a,jQR&erDFX1U@k1D6GJPai`Vh!q,cVY*li%XC3*$q
j%RN(Ifkjj5Ijb*r1I"KCqbd%Zd-)PP,HT54H1#,JTSJ'EkS(Hqp(H[SKlZ"E,[5
GhSIBbeMX6)U`h5-&[re"8rJD0qSq32#28X2f4rr+QaNh8[X5IU6$k#AKVb@4Rb@
"B`"1ke-Nm#V4"Aqe3K(fV(&9(kV4ZpASr6)%(PP$!NHarHS,#B(cV8mAq+r#*2!
DJ1Bel[aIHEfpRil$85"mi)EJ)XlQf$X$p`)!SEe`)ZKK898GSX&&blM"Y@)B8Zl
P-0LC4kHkUkYm0&9*Q!J[Mr`H&B*C@3eb8#McpPij((QE6!Dh)&iTE#BIqGJ`H5,
h`Y@D8NMdqDfC6jbp6(EK%[(aC")NUa,,@bII&$IZiZrDF!14E@lM4(*"`Ua`X4r
AXPRj4T&i1a9T4GF#`jBHU2ir1#9pil4S9JLBFQHI-%+3!$4MLSb`5SMJarAl0N*
55!)@@qk*1rZ*Q$N-NjZ"E2b$4bYk5-dqD!V0JT!!TX!'1$KjpQ+Rd5X)$$FNiX%
r0cm"SqYIrbNRUVJ42"ZFIU'qY!Xa!i5$iS9HGT*(GF5&eY+&lQ!`f8VZVVJ3+KV
j25lN11*#0R6SINTUKia6XJG$#IIbC6-[FeN'8b80dN,ZF*5J!,&r5)A+#66!!!5
cpM%cDi-$M,BNKYKL"LUd8JaPk`X4Dl4,$%R,2qL#9SLdMKJTKKrVh$RKa*(TGer
kS8dG(JcTmF!9E+!E!`a33-p-QQ%H&Ua8VF*+h8k`869$fDLl%6@&SBQl25DcGBi
1-J5eX@0f[ckGc[1JVX3d0B"TQP1BTT*"0JNGEI#Qa"!-@)I#,$8NQ+ADI6&,A"K
&+!`Y`k`4ZJ%2FpXMP$JqEf!@8rQXdHGe)K52e8&&EJ,X!I0*kfb(8YhAlRhaA`(
3Gc-Tmi69&*TITZKR3Jd9FI+V&F-3b&0@#0!%Z#EJ&3XGm3aH0f3eKBfU'Q5Md2J
c5B-U6"'cFj0BY1TpX'M9cU[X3JK'VGV66!d@`h#rK@U+6!MPVV0Lk(T1BVpi'dP
Q`-4'$"TUfFJ*Kc8-QGhZXDEDN39q##RKP#H&ii5,h+MVY%))8"4f*cP9S("L9EK
YjLkC9Y3-*)'&MkjN044FS-&XNjjL+NSSpR@cSL!p+T2VP%8T3SY5K(iU3Sf,d$r
`3X@FTV##8#jY$B8m"me(-)2@4)'P-B4b2c1%,81',1"`L,Xf"U3p8h%4@h`Gh46
E8J+YQffA-hRA&!B66V%cX[Z2hh+XZZL1!@L&5RlT1iXAaaR`lR`im0+VqJII#)&
4205+bB0&&bcF'60#[2R%Bh03+[l*qCFZmbF-*4jp+BC2Rbe)SHVTS6LD,%"dAkp
LF!eUMp93E&RHScdFHZR9TTZB"&kkPAD!0TJbePhmr'pJN!$G-*D1iXmI*9JeN`G
ki!HqJH&FBqY`NHF,&d(Nf*eR(4LGkQpLQ&U,R+bB[R[YhX`RH1JirTahbrT2-EJ
YZC&3FZ%XdP,(Bqm!G,Ne``-fIK[1mUZJ-LiMGA8H#DlPRMRV2!CXZHVe!`T(Ji6
eBr`B'"V,fK351@J3pjY,cbh%eX1*YAAkh[fLf"SI3r3d0,)(ACd(Xe+GLFI-a'-
KIJa1#A3K$$'8104cL"D$`*LAh8m,TS+fZB-HRQ1AfeJ,(Ym"G@DJ@L!Z%CM'R"a
re`0ff4c4eDdB*PGAYhJe)iB5aS+cT-a$6%jB`5D'#ZDAlX4,*,DGRdmXkU-AB8&
S$PLf5Rrp5hEZdp)@'QN,``FXM!jCQ(C"@C+f-(AN3VPhb-+8-p%NMPj['[,D6$[
fFYUapJ11[6CNSAh`@"kkIIPkir2m)NTG82pNC2!K-IJ)Nl-#8Y$`qC`[`U#ifAJ
U(i'6Jm[[D0r3-9flS@0@-j,TJir``0"J$GmQCTM"JfCL&4X4Q15*"Ia3&$F0"Dh
!#H(&Zc&Pf')aI#T"ml([m`#bN@hI&%`(@"a6kI5,&ar@4"IR!F@C8!"d#0f0iI&
kN!#"%KSq"%2"$bq,C!@aQ0JU5!J0a(Y+QL0Sr!KQU-Vljher*0aBZ$-S#K3UFk)
-+K0+*hMTY5%X+&q3!,F[,SSZZXLXdlScF$R&*&*1l*jieHc1%L-ib`FPcGHmBKL
hPcY+lK,XjlTcI3SM'V`dH*cmf1dL`ZS#ZjFLjYKiE8KJG-#"Cm8!SQ#A8'&[2`+
1Qf[(-+am2jTb3RQa-b`IT)QYeElXeZC%',51f(X#4eaHLcY2@p%3U#`R&aj82eV
$J5e%FfXQVqBi-'%QZR+AAL&j@456I"p(a9D`iX6$2$`a&+@C(V3+Xh1ED!T655k
`P396l5'LNNC!0Vr9GlUrRFK0ZfphHK$$4NL-CVm6Jm4$9IYj'(LaS5q9%!`K[mA
$RbBHIL,pB@C35KI*T4QA6h@*B,2JiU(IrfRk0l-29dL,mXm4!!36*'R94ADCLY`
6l!-0iXfTe15SJ!MaMaY3f&(ei,G2G18Z'U(A5M2M3Jbme+-2Z$4'i3d--f8+3qB
$[5B2XS(K0UD-8,VaTM)MT`YRLj`rI0G)AE$FVE4eC2*`(GIFI6bXpJ@,VF1Cc`$
fE6[l59id8D)TrG-J0$8j,+@TRB"SRPSaYG1d"9-V63e-@fMUa05JD3C6*decQ'C
SQX8d4p-GQ'CTZSMT$TT@B,T)dcbQ&63G`$42dh&-"fJkKHNi69fB6Y'd&e-A6IX
`lDAT#*c2[*N!04H5Ik0P!J-GR`a)%hrXq'2&RaEm-Bc!%2+F*$(kLRmMa1Mm[-,
)hfDM`$p@F&PA0lS5VEk@'0+)QiP`GcNiZ9`hMb!RQ9)&X!PJb[8A-(kY0[f&6YC
AATZq5f4p,IkXBE,1SD@R',GY[#&h"-2$rID*eE`*ISAZhD8[rYF[h[r0JBYpXlb
PDQl`eiEZ(3A*A4X,N@Y!LJE%0G$8SpEpjPU9#De[$Km0*%*hl'ZC1lE[C9$Q3B6
U(8Ka&6Rc`TAr66FC+%-NE9j(XI1lraPR%(a3`GE5BedM""98@rJ5eEI4*1jeCLk
U'jCS'-cU,VjF05H$QrrqA[AYf!KGrReqM6"q!BI@Ld2AMJP@NBI"Kp0kJN#3!)*
"dP`R&%Uah6SRREe+!qUkd6J'0&VXBqI25Th"G&Q)H%bYG`k'q#"(%"BV+c#APk(
8'8,9X*Q43Q#U)XZMQpcFGXCl4DKB+%5&*Bp8L1&qI&(($H8cUmQR"MmM[C%dHKd
)LIJ5JmcNLTZH1&d`P8EN$ST#FGcMBUUq4Xb9V0l0VJ4$8m3AV@0Lb1Di'$B%LGc
Q`pFcpQdGK5ZX,Sf"(!m(eSa8#MXVBiJD5QIGim$$dFf20(90Pc9ecE)lFSr4VIU
-AKlJCeQ(Eh&8Fa[2@MJek$BaC0f8%G5,5YPQ*C--&0)*U9%+kSbiD!(-ebI(T2B
9A!B0@EP"5j)"+!TcHS`Z,JD$h*l6d``Ab@Q9ZqDe5l2&D3U@J8)id-*!hQ'bZ0i
[S,B#'!Li5(4-DaXklSX(h26!8%BHr`c)T$,%Z*C6%ZAML50-BK)Ffhk(NB-qP,1
0lA!!pK["`jh&PpT1kY99$SU$YESLCh@`-94-jPqRUi(3!Rhi@ciF"-fZ%c5'e'#
'+S,bfjNm"r!8l,P'f5fT%SN[N`02Bai32%6%N!$Kc*A[Aj&Kr%&5j[XS0ML$K$d
CFT0L`c)aZ&-&KfQFh&QhQ@'GM2`q"Zk(UAAi(Y#L#5a+(V#)i9eHp'MDSJNXkLN
bRhNA*)68S+-HKE'ar`Bc&V&6&m@!NDK`i'-+-rp@9$I31%+NrU8rT!qI*!BRe3A
j6d-&@D),-RU,S3)5C)NLb&#k)+2Ak)%M""PpR`3*d#Nk+`3CR8SFB8m)NK0D+9f
3!#pf&TY(#M,D6)*-k5#LpYC33@Uh%S)X8D!BNG+U53Jcr+)3TRQ!-1d```BRQm"
8i9RqRd`Y3m"[#SRE(JM(R-RM*dk#XXr"!$bM3`Ae6pIqjMFXU-V50%(C)5Mm3ef
dV*Q2aG,i2TD5@AbT,'eT-bh9D+P9@@SrB#R))5ep+ffTPCI+[E5d4eRD[)qPpfQ
T1feT$beYS+8YbP,VN3D*T@+lFfP,@l$d!LdXIIQ&ridZZENkE@%T&TB#6Qm9rm4
)`TM$ZM&AkmE-*[4%ZM&(bmLB5iBDXaLJT%"`R4&-$2-SS,eYUL(-!C!!6Xp@bcI
D`CCq"P[J)#JN(KNkq-M&43EpRZJNU'@8@H-RELYK8JZBhDLR'B!3$d!90TG"Na'
d$S+Ejdmc#*1IH%"J9i[E%%'+K`86T+"$Sq1XI46%b$2%iPIb2kBPk`([qPeAaq,
R1CbE9m+jUfM'IQ1kGYN0hrY`40!fh2#j4S1ph9$`JD,JRRUAC8L(+A,fIKB+RSG
-C#F&epAF4M8qFf@Zr5YAf(f3!*P01V*lHMmHkK32c5%BFebQp+-Q"NqKcDe"'"2
fQ*aLHMb1`'#!2qLK#!%kBAU*G"@'NkYJ)Z%CjDjPZ1"NE%q`l2SR-rd6IUB%+rp
i#S@K+E"YP3iNm#"MH"QL-"P!)$-RMiF8)8MjTb3'+Gm"N!"&MRN`i0XC1+j3B9X
H009QD+QG&rl,!#G$a19U4h&mdcmISYFTrI-rPp2R$K'8db),IEU6pQN'ar31U9V
[N!"U66%)c89-`jf*j'"5r%0-J'SNR1hpkrmhK`JdI#S[qKbPh-*'A!aPaR"-'V`
3*0MDfSb(H,"A!-&Mq&FP1%@(3pH2$Jl)aJm@IpefXVMRXASH-#GkN[eAVTPEAV*
J@'4TmJFd,iEV)p+5`Q8T03L-mcpqa!eAm2%)b$aU#FDN,$EjRc[CefZfNZ+H!eq
M+dVqjr#if9mXaNEbj'Fie'FJ0+-X4Y-NkGA5YJEa5qX4ar!`U5R4G3%0)%&'ELB
Q'SQJ!6$"&4-`jhDNQlMaBmPJBq$dBEJ!N!-K*N&%3e)$!%cN$e8,233NNQd5ri-
$,hMVA!PaU+AkNjcRK5"(-kR,@$B#%Md[p+#(Y@b@M5MFR4UHl`#KM1YNcS#@fQ`
AMFeN-Qifkf36Bi0,e,$d0TZaQ65668f@''1YY3lMd*3NDUd#-MiIq(brrrr[lRG
`S'RQIGppR`!EVFFNb!8J#!)J-YZ3!#r,b["(pFmP38UIAAN`ADVb1Bj9,0&*imf
V@1+`$6b4SK+J0"@14%1IVpZQl09!cRQ1jVe3jY3blhil4)N9,cYXAkX!#(46!6m
IBX$ZR+U@jNF2JrfpdCUFi1[$MaiHh&hai@#RkKlc)A12H[pUF(ICA$TBi+f`CDV
+L38Mk$"@K`G)#-56V2IZ(iG`e+lkAR53!1MSUVGJlfS%'a$FM)"[F&YPRRI)dEb
pK3A[#aiph1-2eq$(P1Pe0Qp*LfCk%p4$MZE@8C0Ama@13*!!Lfl)i*E#NGFrfT+
@fFH$*[4"CRe3c'%l["L$qM&)Ah5,BG&H`k)&@p,kCUPHBSYp`CBdKqdl-Fi-06K
k!C[ZBCDpJ*r&+0EE*f#L)I(VB[bFJXMl"IYb*&-FYXRh+)'IZ3lEpfN5r&6BF,!
C'cr&aNVHZ"NrpcKXSaj+d#5dV2EED3L&TbqTQ'1&(2#cKEc9CJU*+E-6JVFQbXV
%pMfL3*1r,!SBeVY5&1K"`k+!CeldL!*GBSXSd28q""0Hbd4I"1$H96(R`)6bCel
M`PaLERM5aCLY9kH3!+$MSC&`pbd``PlVIVM2X5*lT!r"1)"'JNjd1Q9KjP@DV1`
D-[3e,2Im!39!V%lCR&Q$B'8+-D-6T0M[2"RGj8a$adGZ98XEH2PGVZArjIQK%IP
`"Ue183$SfJ[&K3LXlaB"J2ihQQkG$",k'"AC$6RqG'*UeYDYJB5-3%iUfUc6Trq
3!"K)qYa99ZVF3eMS1ppH,FA0i32fFNGc9idPh46AjJ2m4LQ))`@`$0V,UE"h'jl
4l84MQ1ZMJeDYF%4c@UkEVVZ%FKibaV&3MX5B$(6l($Ceaa"!&J$Gh$8*d'rZQM)
TRYl5ifr`BeT2KX9Ed$8+NmSchL%5Zb0iGBM"A$PFB!i"mKj-QMK!6dIf#-DdIJ6
+`4SI25)a0HP5APM,b-e$mSZ-e0bNV9UHpSa@F$$KHZ+P8i%)M1'$r0c`TBcVJD5
Nh#6p+*!!&dipT*p*GT%)@"Ik'PJhCB)T3TXIlZjj0HTK0Kk``h",$"SD+B9GRIS
NPMPS'ZDU%#%H'(A'`2+3!!&C3!a[mTrp5)8bbqAdB%Hp$R*@8cB5!@K+Q#k)E-6
LU#8G$rG![BUC52!6SfA-FAX-3c`BN!"*bb!V@"$SX&F4qQ35285$-hHKFdV&#l3
S#&,&#)'Hi5!NK%5I&YH5[3@02p#2[6N$#XN*!TE-852i'"qZNi`&k!9E8V`&5cF
LNHaSAYSSTfledK-`k*r35"bLJ@6+(9chf-[6kCq"V5U%2ak3!1#+QbJk5ETTQ#@
p+20GJ$VU&KkE#8h5*CI8!mNc),i'X'YM30b$`#)*L-&U&b$+$A9T*%SNJb@-"Gd
!abQ6Q%S#G65E-j%Yk(-UX0KKI`["FLH3!%HicacrpZ24'Xd*T*A''30CcacABTc
eBT'cRVfDTkLcT!q0C$Srq(QdealUHj%(Alj0L+b+Pm["i)ZC8hh(a8%Q%[5X9iJ
iATRadR6bd@$0UCX8MKa-4%D3!0PSkpD$8)M$H9T1EU+@qd@UPK[9NJlQK30RR)Q
`khTZp$V[dM046P!R&f@RD6+CI+QP,UX'a4KF#paCV1`*-Z`6N3MN`14()+)mcfL
%,M"T$H,%RP)!HchB0#2)&K'`[3@2[@3&eK0D[!mG[T)"Q*QQQc5l!&!Xj#BR!Rl
8IMF`%9*EA!5Tl63!%beX)l#)GYmQB+b'mCX1Gr,&GR&K$Npi94C-UJ%%c+TCRGb
3!"EB"[,5m5bqaJHZE1K9mL*D'Kr'D$%)Z5-3@L)lM@NhSfRa!(!Pi9%VUMm-e&R
fUGYB-m-CVTZCK'cLbR#9rFbNPDi-9hR%`#6H8*G-5UjdG3#4E8YY8akGhC6KM[6
+)QI-6m@Q'qL`IcVN*NEP1#pdTiXBPFH+,(5M-@e-kB3"%1hL`)Ehk-%UD$B#RmQ
V)p@CqIEj1[#C*I"0)A#2[BDRZUY3E`*e%&c144GUG3-JJkBE`6V6D%0i'B"M&+!
ah`V0EN5`@MjlZQV9MEUMT+E+U3Eh$#JD@+MN*[f!!D-2`,,$0GNK"KE669d*@"!
[Db+9)lb-A6!LSL2,6i'mhZ(Mq88c5'E11Cp9AZ4CDiTGYVcSCI(`RDl!)4h)Ed)
iip5l)pEJR46)b6qB%5L+aljT4"Cj!@-fHRL+"KV#G0%JrV#%"[&YE[!JQR$BCKB
1VP[&MH0RAM9++23dK2)Hp+F-KF0kB9JT*aA3@G"%SPFN(#)4&`Q,5*Lp#5%`ZY8
X&KNVGM"TT4MTMA!I23ZZ@U03KL`B2SQ%@56'4'+5%ReKDUCQVP*c6Fe4a#BE(I9
H68FK#5VRT3Cr38h1D)-remZ03r2H,YNT8TXiJm20S$d(@6jI0XrFN!!R#H6E+$1
m8,FaY+X0#eq&`jd@[T!!mj+0TlE*U6X-8cI`e+fBqU+BZP@#Zh[U&UZT-E4V%8h
G-&GTZ3H+-m+C2$55Ujd+IVhC9'Z[*BD#A4ClP8LDcE8Ed8A43N$DE%bpP*Gb-2p
5PTBAq*jf*$mhiekY"*A@5XhAY`85,L@Q%PBhl#ep+cVKkpNj6VJf)+Xr5'UT4DU
P-I[VkJ#4cV*cD!51AFrJi"Pd@GD$)3qDAeGD5[#"lb)6[kkfSRXeK-j9Vf2&Q))
Lp3bFHe61VHQ0[lJ6#ZphPB19*B"C@4Qjh&5JU@mVT`4eNKHm,lT#G0b,SF[k&Y*
5$Y[CaUQU`K%JSEYX#iq!@"AlA-3+-KK8J,KlVdPL93!-+VTFa!TZ0K+,KZlE3m5
5NaprMG8dNbJ@QY6S6*Pb*Z2`Q0BGAkMGUmaI5[1TRZ6SRXaa-HapNi)S3F'*44N
(mEEbca(kI0q!kTjE9YCc'4[E[MpHTX49D["X1FNLAPL9cBL(%6XlY*VX%HR+"8H
KB'99U,CQZHqPk[QaIl2VMcaI+RqVqrk,IcVkXf8rkIhqeG[DkHR2,'G0ame[6,d
qYQ$'2[QeprrQh@mFq1m$rl,e1a2rpjPE`i0p*mFr2hc#HmAj8Ir[(50$[iMhA2M
$XGm@rVZ(rN[fIh[bHZE")aPCJ@Mid+9VpqBAj1AQr(&5BZSA+Gp,q*06rrAmRlr
bCrkMcbDRhEMjVI3IArlT1rra4rqqEXAL9aIqm,9rH2YIhrcR4IrKKIrdr(pHmSr
2rCqAAjcemGc[IYSmjrqhI,*Pami2'[jIrEGYrqZprr(KAqrr`4erHFr[l[UV1rr
Rh6pImqJ6rl[aX9@2VhakpDmhrQV6EcErFX2I0rhYqVrSq2)MAqpmi-'ReUlErG8
pApQhYkZpEA[V2ffE0hYT4CQ%hp`8B-`[mV5X,lM$Pf88i+Tc!VE,H@4+L[dmcLR
e,N#kPM1TlAiSf#Q+c+K"aFM$CPkNJbI810[H92-eC4QVGGiJd)8*BZ1b8))DlHf
jH4X0Y!"hL%$LFi&-Te5mraTQ1Z`mQMd5ME&*!GRQ$5JP-`KUbcRXG"k0HKDFB*6
5431QYJk03)"A@`rh`j4JCPim'DijrS,S+E8-#fQe26IJ#R(X2L`i-64LSJ@V$!Z
HG#hiaYe!0MaYG'k+FYk-UV)aJFK`jAe,4!(-12kb9#9e)HUmji'F$DVk[%Di#5E
B&caZ)J%8$MT`d!AddDehDPQe+-I4-KT1fIbX4T1LNdYSmJ#1kah0lC9832!C$1d
eE2D!9!M4aY[,KND`E5X1YQ,E6Q5A0JchdB%,lBbUSSI,k$"NICMd8Z04%jaN2+'
N`CDMC(L)AL3L*#@5ZkGeSc0[L3(Gc#&d-fq0`lClYN3hmpEJje-$ZTPM4$Fmp&P
'0qLLZB92(XH++l[RG9aC'r+CqY(j+$3mEp5aSXIrfrhMk[jKp5klb,SfGMY@3*a
#VKc'Bf`aNjJLC$M%*E'XaATL*p6Dm%)#F!6LH0jqKfh2BNS3B"`ABMBqAN4#Pr+
Y4&Ja!4B()c9V4TS8Nlfj+i%l`M0KBYMcKUEd3fEBH`lEZM@#B4!kcR[1d*6HEF8
`'KTRKM&)I(CH")MJ3S4))0-e@a3!FZ9hL3,!XA`CLAm"XYb3!1EPTQS(ml6"T-4
!hU8-68FGJ5`0+PhJB-'j%-M*q%NYie!Jipl%,`UdJNZ*"3G6-`jpKh6,(+LA@3G
6$fUA%MA4m*i6'E'kpjT3prka"(@[(NKVRa#qX0,RH`(Ue@95`+E668318Zp1bJ4
80Tm6TT5KNDLAa@mZaKr5PD1e&l`&b,K518)'VpB%ifm@9ikHfL3"eD$`qF3bhGb
&phjf#0kL-5S8MNKAd91"T&`Y0`QU5[KJkU@8J(ENLfJdN!$%@JFiSr9a1C!!G58
2,1YKVKYPGU8blFU)NB0@+UHCQ'**"j!!%!-eU9JZIe-SPY@4&%YfhQ6&%SM6Xci
G+,+l`ApN&-bH8M%j9GHUXpISLN33-`E3d,SdZp*`c!)9#2X%m(X)q(2+'1aMiG#
[jkTZ[F[YHUS6ap&bGY,b8i&-'MPPQGdp+'$5'0"ic114EUh'KlS9B%q#-N`bBCJ
N$L@ffjDFCG+UkQlB5F35ikk@e420kM9XiHkZ[#E!#YIdiVQaId"SBc*0A0'KK3M
CkZUR!0AR"+Kq8J+S0M'SKZa9,&Cc!fa0fZ#kahF*J'8acqPa!lLQ43$@DcU`2M$
,'PLAT`TJ[9`F@"qBL3bX4L$&`YdkX*V[%lL1F!k2!+m2!f!Ihe8FB'[pC`D`!%8
2JfYDf+b&kT,Y4'DI0DN"Z"j8MA#$Va8`-Q(+jK!ci1SIFL(d#1$UBe"l&Nr4!43
LD`,BSJmM!$Ac`c)dhYB[%*I9d`Ld-XeN+Z&"CLMbbp`$VF#aq--"I&X%%2jeC##
F"r-K&"Xi`jU%5-k8GNTC2ZU$'bLU-@9VYI"BJ`i%)9&V6K$LS9CUS!"!cHfl@2f
Z*J2dq[4[qc0VC0+Nb"f&Zh60l6iH&2UfG#TYAHph645Y4c@8f5T8H$Pq)hD$&LQ
ic!dV9"8iNRid01*bM*8#d0-JGLMNCMPR$BXj&0)UQp,K6"ZlmJ0cjBkdbM4#"ZE
*rY!RDDI(3b(cEIF@9*3a#d%UC6R,@#MN6!Y2$kj9)Fr2VZbIV[cND194fNj66Nr
fUKeqLqT*LkjrSimQ-Pqh*VGG#M"YXHMJJa$6JEAY%+BrRQ"*Tcm`NPV30HhZQi+
J`8NXYe`[d[%rA(3$e1[4-!24(h8@M[5&aH5f+Tm%qYJc!ZJMLqXVl&8NCJ)"bL6
BHKB"c3Ce0![%9dh1aa*PQYc-35-B#rG58aLqD,G#4ajf'k#U$3D`fLr!kY%5`'U
J+*[Q$l[CY'a`hFSDZ[E+QM0L8hr4$FbQADbZLDaSC*D[8$*VIRPTc&+Z+c(,h&I
10f4mbQ",@#6(KAD0KBjbi,KKS*&PB`C@25&BpCX5@&9RB&@e"+'9kCEdXfbddCb
&)a%BFP81NTG8HqL5f514VeJ-CF8-+%XmZYJ36h'NaXmLNQdkJfGYdTp9XlUdCpd
ZZ[!hm64T[(UkTQ6M&DX#M0U`)6E&kJ#fM3'eQ91SQUCQl"+DSBk3!1NJA(erfS#
+*cIF#$5CUdLS&$-fkjX&54mSJD404B!IUMSHLSbZ1BG+B"f&QAA0AIRR)LJEJPD
F[U4#+S615NKl+9`CAq'kXSH[l#fS[`c5jCPBT0eq5$ker8L$IfJNDe5DZGUcaI%
a#bUbX@+4J-T[,X&9HGq,IFGab)D`XJ3fX96ceL(HDP264DHL"SX%c$'Ii9%$%4i
e6Sm*l0+UiRkl2(U'KIZ8I0rL*4-I$!-DLIlEap#K*90l16XKk'4M&`5408f@p-)
4PkQdE$fH@L9"'1J3![If&lL+h6`5LEF[jZja,"a086!mY-P$FBRRiJ#$k!4%#30
X+U6J1b*idhf%3DL`eGaqbUP)"3Q(K%Kr26Xh9)9MlU'TfF+0JCraYZE-KN*P!)4
5c12Y,@GL(PIdN!#j,X#5&cF*m'YhX[()c"Q,$kDV&T1,$TYPfYmVP)C#@l#I9Bd
aekBXc@T)FhX$'4)Q&#1HYiQ"aSZ3!+'B'PJY&XjKSSfE&E)Cc'p`Q+MLSrFPS)A
Pa+8308lQ1REX32-F)e$Em!S9HCSl$'Jp*YM4lkVS*3"19SlMDJ-IV)N#E@8k5Ge
YI`r,IV4LMHCElfp+TrpVda[61bMM-h"6Yee0XCY3riUlL`r66UkB45M3D*+h3[r
0lCX-PAPBe'-@b!I9L![jiQZTN[ZU'eZ`k"'[C('*Mr*i%l0e"iiqlSL3!%Q`PJr
+I`0(#'kHPDU3!!5DlRre6ZdP`c3rl[$2F2CY(c!03GN-EEc"a5HFGC`"*)JmSAQ
J9U)bi*JbeG6Ic)#jY$ljb$DBJUYi`%S"rNe`G*dYTp0)UC[2)LCjV3%-mS`Yrr+
2VZ`pT,`A5*&$"AN163m0IZ83Qkkb&EU%)@pL60%9+Zk3!-[69QNBFbpe*`YIj'A
&**MJMmr$49%Y3iANN!"iH,,XH1N#0SNL8H8S0NfL5MmUiUmS61ra4eY,)0FM"Y6
qS%$Yfb1MpYQUH11cqKb0ckLlm5'&%jZQSA"HT8`4(Vhp2MRQ'!55!2RXN8#RV)T
C6%%Tf0)U(lHMYS6(HA5R$e5RLL9"-1Gm0SaQHrA9aTCH&4H+EIAA90#R@Ti02"*
CPGfH1VMZ0fPSLZDbNid(2lk5'bdHbXhppL1P09TiGSeirPXP2(r53"TNpVhjZJ,
J246#`ABdS*ZAb@jUb%-&+))qFH#,D&,E5X21'SDMi#-9-H3MG,,pX'aZfrH9VL+
k9*93c%@XffjPEfq+HqNUkXl*MTRKk6"GF8BV0iUNpLC*j'PJ8EGJdHN5@*4$bMd
ZFd%+"Y#B91J#!,NFQJRE,pYFbc0iYmS&eB@)6(UA*V5N-jTp8$&MI%S83e6m9AA
Tl*&6`IAc'J[D4JY(ELN8J*6hcCfml3iS%B#jIer,T,[*U*LP0e8)KNM44Y8M*3Z
ND*2Tkq3$#K@%d@945fEk`Qa8)1I9R6R"ZA&8j%F5#NTHaEDFbVRa!lI$r5M--JK
'XRA6eXBk-,MP9T8`EX&Y8[Z3!0d"D0LaiZDYMH8N(,Ne8l&0AQ'jJl[HZfL,hZ4
P(-`Mk@KZ6L"2Lel+Cr((B54J!XICI4"dr2jJ4R("4mAEhc4VE'l@f(*U+-Q1Z6E
la#hmNhrSSMNK0m2H0$$X2@CBJm2fkd`h`aUNbqAY(lNCCV0L')D[ANm-NdXa39S
-"(REX)#0&pL#"C4lJ5hi@B3&CY`,0&JYJ1'VRa8%DC%%UIf3!!Lbp*8)"-Q!b#N
e8)`Nm[6K%+9NFMrmbFR)CL!i,KKkJ38R+AS@#Re)@3MCjqd$Ym94RI-NK[4,Flf
E`3jG%2MdmcU$@4J$Yp,[2q&Qm&"aBH$6dm4JJI*Ma9QDRjY)&bD*IE'l8qKKARf
YIR98LI'8cBDB,JD4UkF"kN8q9fab)TQES,1LDLFM%c,UX0Url`@!@6afXZaAc)b
e"QE%G4H%P3[Gc#!6hQki60rKCXEKiQi)+bm5-dLBp4JH3JQG)D"dPR4CFI'!$Km
Q#cBE&(B2#f+8DR)QimmQEH,2m2Q%1Q+)2m1""fi`A2!HrB+2lq3,6T3G&9Gmd'(
l592Nl-3EhU8V%R0eYPBq@BbYcmR-bklQqS+cK'1HlI&a0d2T!c40@#l*[GbE9XY
Kq+UlM!aP-DXEa1"U,''+jFH5TGp,ZT3DH"JXj3N%RIjZTL3a[EY4Y38VfIf`Z!M
qX*le9TQX4I"Ih5G%m-2&XpeMRc*Vj+FbBNDh&HYmGQlAPD+#FkJ5dd+PX*HJ8Y5
jeH8j8QNSSL$X+PQjeIL$(beeaf"Q0DJa%e!fbJQBK1*adEJ"(f+Te!mQbIbpRjI
h'bDBp"E-6L!aX*bXl-NKmA!F$&-3$9h"MRk%aJfK)EN03Vb#(GNN)MF%-d@`%S9
m"'0$,PC-#PBmllSf6j-3**&JTDi@Ua`S5QdN[Q&A[SM+-!d3!VQ8FbM$1B)`Iei
#B9UX&204lJ6*VVZYYQP`h5qcK5"1#N`pN4p%`i54T1XF$hT&21LR*6aS[hYbFQ[
bN8-E%ZLZ#E0)h("F#C'Xc#Up#!f3!0Z!#)AFS3'%VKT#2RIS!N)K3mMM$Z@JXrJ
JNe''0(IS(B3D$D&KGfJ@3Jf5S"cbZd1S6&1aL%%iL%r903R6@JFRc+U6%Q$!ma&
BLdSc3N'qKa6NLXZL1)Z,jdAa(5lQL@)1&c0&m3)Aik)i`-9a8HcPiJ%@G*!!@A&
-U0q6%8Apqi64D8Te4N0SZ$[Fi["4%SI(5-4II33ZZ*2IUDaac%09*!he1`[9%A9
H[DCDe"V9'Da8&h2+m)Q[TNc`k5apR!UISH-T9A#!K8*2N!$E@(#-JjAZB#m(Yh$
3Na-88p5J1HPe2H+#R`,XGVB@S3($mebK93KGF)@'A+&kK(*FS542ie&hF"'#laL
#QL(S4h#@)6MX$QBKG)mV9%-XdKFXMY#(GB5qjTM"0G,J&%F+KM9#rrPQ3ZL53$S
U6rb6JL1jqB6-K3q&UrTXEY,[,acqI@j@)(rVeR!J9Cf"qi0,T!P%Sl'5')2+e%(
NekT3*@"+04P&FJ6+6S$fNdBd,Bb262L1P1$pp+('6SL'QQ*T"!$4'TJ61c)pA+b
-qV5U4MqDlSl9E1THQZiDLZA[P-2#qf(!kB5aXb1L#EmM5Sh&A0@NIh,+#J'p)a$
3[jD!J$B@U8jdKJd8'ME2D6CCh*HYELH(mKjr8["[2cil+)8KF()Ved)pD4!Up4S
-Y"!(0#D[pXX3&)11XbIC%5##%'I(Qq+U,dDqkP+$J!NSI+&ZF-'IE[Td(aQS5E6
ejA5l%Sk[2RHQad0+&YA3C-*d2NPA,bc&[%#IlHSh)fYiJ"aM-$$iTXN)%q`jLU[
(TMZK&(-KfZ85B*033RY$a4Sr9Tl2X%fl*)9`JhYL#J(2Bh88E[PBG@I-p(d-"4!
$TYp`6lY-H`XIZ%ShqAQ5IqBTj#+2Z%6FT"SAl0,&Hbd3`aB)F$+`H*CJm3FPX$L
6"S)KGdJa5N5`kUB"T3Rfh)Ba@mf'`A8E3U3DP'35Sl!`LGeCFN2-b!8#RECHYhQ
aZHfL0,5h94Z%2&$1fd,'CjG8F*N841-5Bl&UK@KFQYXmTCU4@mNF5Yd&mCLC)IU
iBU[S)Y$4Y*[YZZ'dZHf`lS!Ze38kPKh8YQI&*cHTN!##bMHb50I,S@kE#-e`D+d
)pE0KC66XC3-1(@@4S0J&m#cdk"6"`R0-e"ZYGlYPi[VC)bjhHIPFRF9Lb-Z'*cp
[pH3h$8X0@bf9AZ6*#dYjmSr1-C(9NpXV$%rQbT!!ZQLC0T,*V1eGpb4`[@JcmdH
'+(#H!jfbqH*!UbM%aB19HNmFAG1'2PN&0%D99@6hEVEB4)NRaHEClXhGU)!T$r5
Y[581MN9AXYZPr'cT(M)39&)hP5T&la%2f'*ihUHmc41p+JkH,2,d'"a[[FBUY6T
MR+q5UXEZZLl@G"PBXmI!QMf'DeSrH64-(cLClEi59f6bhNYLZ,EkSX1MUrTHrI`
T)'bR#PNZ4hSB,hYh$lR"b#Fd`K9QMk[#PAUS518h3m8Z@C9+21!HQ'M4-*`G)P6
%bMM%UfdIaPrP!L%+qULCTMmM(c8DYQkpP)H+cDR@Y@mH4P@eMAUe3klb8,""9-E
FAZ209b%K4'lHVNiJH4a9FNdr*C%#QHcDYM(V0`Z5G"'i``a,*0V)!hEcJ)f#`9d
'CUq@B"(Z%`HGZR'bEEdifPaNH(Gd95Bl!#lG,)bd68@U*9ES4-*&Z[8+N!$EDd5
&bJSSA0bY((a+A#[Q)VAfNH`BQUj(4-A#[%[9AVNU(S2f%*RfmVKV4aI'j2J`0"e
i*#QhPaXfa-@PbCcN%BF5(1G,SA"EIFrL)KY'Sih@5aLIL%Db365@IeP#BjNZ'mX
0-k8hPKYQcUba[2Xm"YG6*5HS8mG+D$+Rp%&39ikj+McG[I*FMRkpVLUP)GkbcD6
U8C8)eBE'p-R)&*elp96`J@DYeU"%(D2LDMppj"M69VQF118REI5*8mL*GDb[C8*
2K%6#*a)aNI#)4,G)M)T%le"b,*NGh4VB"+M8R9VS&hlq#+Q[hSq[k#c#8$1%qP3
T"T[L,6(P2JS@1DSXFP49j#K8j+Lfb&&0ND2PqY&3-J5aR3&9GUJK,@Zdk22B60q
*iQ4IA8S3cJZ6&0,qCQ*fBm[%l12iE+9C2hah3Z&3[H'IS)qemq(djpVA*N+0a-V
26rXRI'0ki$!#[NCLl@%%BM0ki!3#X8CLp3N%2!X`1Bc3&%*f4p$651brJQ!h"eY
&X"A"lNBL#39(1GJPJPd)MMB5Q5JSL+4D#r"4(dQZI"0[f#-fl-%'[Kj[!!X%86G
*SJE2ci4qm5e*d1!eBPN[')D++-6QbHPV!,I*E29C-V0l-Yk5VF5J),R"'!G1dd"
rEr'"P9V9K6-C@+99(6Z6J5'YU["-"YCU93qGbF!DV5Ulp)&96rTT-!C*8)Xi$+$
hVB#Uf*pTF3p@9Lbmk@*K2(QX#S#i@U-Jd+GT-JBCabNLL%1Vj5SmIDM#-md'!Y[
H#PDCJ#6DM`N&LirTdaLdQ&B6[iPP,'qe$-!AQ#Be6B,30faTJ5eDMG(9!-KcM8#
L[bS"LFkb4S+r5aKFprI(cSd%j5"V*2Lla[Z+"(rA9MS5r!XV*0MSMi3%jlQ4i0m
a!T5'MNEUc"%5R!FNf$+(2U,kEbFDR#I4)$ea@84%L&$JNIZ+#XdkDKYhSm*a3S9
@+&+L3N+4-5X8+9%KS8L2&BU8D2#%'`dD8@4a0'K%NC(4i!%V0'K%Qb@J`41lja'
bR$4*8*NmRS2[TSG%dUGm)KP6-C(d+)p)GR1P$NU1UP'4l&@p*ji#%1Y,2*H#$kB
6#4+imZJJPV02pL[TU,6G3JIaPRimLE)KNf@9U&l"cQrEVjS81aPbB8T4p3Zje9a
PUUf(b)J9aJfdk6a9c3*bq1SD#E!3H(P&P8"#+&4pMa(*9hCK5T!!J,0GmrC4RTB
A-#Y#*hLZj8XhI!*-D)'!k0Vap'QLbUS4X@`5L1AV*5#@qU,11dpI(PcAj,1NId0
qk+9%B4!0NLMPkI2R-!edLQHd'jrKA,"M(RHq2!LeiCT62i%)FFHm`K(jZ,)@J-k
IRZ`qQ6kqII!2Jhf$V`rrF2L"[RA$MZ(V`b['haLq-AaLf0Xh22c&m#FRAqYEdMF
fl&$L(`!!+mC"4%05!`"`AK"9$93f%J!aBZj%0lZEF"XA@8,)bGJJPl!X5iK*'Ua
03H"ZBR4Gr)[,*NV+XHcQqICZSRQqR56'`'Ya0FpR8,'*!4%+eP+(LSK(`1F,&QJ
U,H@)EmHae&U'8V%UBY9Ka12*d"chqrhrhl[2,aZ6L-cmcI[1qe`G4M8M)K-"%3!
"!4(`%#$Qrp'LHL`@I+Qjj44)mDYb5%@qm$ZiT$!4#j'"q$H%*ffX-eEV%4!daEc
M`CVNEXPhEl8*`F%G0fYUlGGUV$CPk&dT1DR+fidQ5"&[`iH5Y$Z)B,(&!QIJ(B[
P@bhX)P'L,E89DP251kTDq!3Z$I(,',[dJK438fDR`-hLNiUf59i@E%SkpkV9@T*
ZY6iir(PDHNP[CRDDYE3`6EFpRj16TE@lDe0Sk4p"L'SFUP!r[jp-5X2HHDT,$Ph
G,kM$hce[F#0-ZekYplFK@+h(TA4`QbA48k"Ur0!QNdI5LVB&Ri+$N!$RbDR-8KM
C"%+Djd9&*4TTZGkN@JSBjp&,mahfEFjGU0#@dYCrf95dcARbS`G8bCP#TJ2qX-@
,Jm3fYLJF'X12KKmAIJciDFG2%hikM&D6PGLGR*QEkB"G1rK9b+FK(U+4E&rp0ZM
4Sf%N9l!ZqA@aiXR$DR0Y-9riZReXFFZLLf-SC`JfTRjd9BfT-4-H"Q05Mkf+80k
Kd5)#leLYK@Ra964DE6Ua*rYFEVUZa*jHVMcrhRHYeScXXX)-R68cafrpRVcrmf&
VFQCZ%-m(fQMGEZZjX@4c0*fF5L6)Hh"aPeM[b9RFkhN*[ZiP6mkbDr#kRCT1[pB
1Fa&(KZIED*c&A35!Q2)URh**RR+2J0I*$UHmUNbjKdqj)ckP#Up6(%kjKdeCmMK
0@9*(8e*RX@8Y18a6HRm91@A*imU84rQ8+RN+,@[*'SG6(P@Q@2L8DI%T@&DPkR#
+KCZe$VkGCr[dl6a[3&6G%lSQc5&hG"CqVJ&*S)+bP&$(`5Z&a"4[TQ,YE12!9EP
MdK`[LXdFr%`&'D!*m`PaI-*ZQR$r-k%6YNkDX`#9`'6m,!2SdS6A#@emJU[rK2#
N165`2'r58&QZj"-+iK0m$LGiDh,QU"pke12+b`*kNA!4AUBf3PMLdhE,5C!!i$V
,5IMDUU3Hp*bN3@aLBd#C8X@Qcqh!GUGH3i@aN4qpMjU,(mh*ed-R)iqH+f,#cJS
0PIFGI!*[,$kKNbEmj`+c#G-`39q[(GaZ@FFR'+QTq)3fKa2@BS+V6MZi`h)ARk$
&*pcNF)*BNc1h3f''AUBa9-bGTU$L0&#4ae'4&dI&9+$L0+'#6eP,8f#i+8"&!6#
3!"kVXGGNJS`2aKp1G["`5[q(5`ilH,LQrm0+0IS3l(M)6#"ALipBV@9%)$q2)*!
!alH#E'jR4"*QPj4iCACh-X!D6Y`U6miF,bH-PEKF%,qXBTG8FH'9$Xj504bY*3d
U$lhmB5cLi3)($kY#(hTbjSV8(+eCZ*`@[ec,,YQ8Z4hpMjXVpKFpGjU$KfY$(a+
5U"+0V%#09J9K*AdK$+&A`pi@@'q"YMF&e8BA[#*i2%fAART1M"2Jlf"bCTP9c-c
3dI1c-L%qATC9@'j0,br-6%r$BqYfqpN-am+(aLUmc+(`-K*H*JZ[*3-0"(Ube!j
@)A24RXbFdR-k@I,alc(*DHRPZX+F)kpEVTL1XQU&(F1'5B([T,f8@hBX8Q8d+i+
H5X[+2TY6Q2[5X8SMB9#iX$"ajh*,G19L4[ECDb%1JiT'#Tr@lPB+RMjTm+MUkV&
BLVD*E8GaQ$2&H&A9%Mk$)D5idBHK'@[%CmjGbk1MM2K,#mZZLS@C'FFLlUbCZ+H
cmimG+fH[(AJ0$,P(!UqaJ-A!SK9dqXF1&(d+F`38*Kba'!S0BLcIiR3450J!%M$
'&%YM"iSaXc%'N!!B@&JQ(bk6qBi2PlNCqD,D0$J&KJ%26&IDI$M''@dl*PVbR,%
G%e9$a82C&68AeACTLp4C,XfrV)XpA1IF"G0B5Xf2LYFP"m5lDm,r!`2f2rcNljJ
+pm+3!,fcY30#flqDSMD9'1!#YGZ`SE@l3'ekb0N+4p&ALkT)39p[dU"HY@rc@bS
$39FbTYY'58MZae)RUVCHaR*"Q[pFHZkam'[[)DV)@'i+CGN&PMA(,1Z*j5hBT%Q
aJ9Mq`krq!)IP&CPPJED$B9I*,M#XJ@&UrSHFKMLMp33Q4GX)8),&TLffQDhGR0e
acQk,&*-0lB'R#p+#ZQ0N0ei&S)#kr"BSh@f#Dd0L8ERTV[Ucdij&,[[Jqb,0cc5
[-RZcrEVFR1`5h8"(Ak@MXdAa@)l1-$[Yqb5X*,2mL)Y`$0k5YV'DrLC@ckTH&5#
cV!03PfSlB5#T80Z*X1AfQMSAG2q'J2X'!QlZ3P"c2h8d#Z$8i1d*f(5dZrFKCc'
-R#'JhD[ZfqEDDE&%J2EQNB$f%BB52@H2!0TpXkXRGQ0J9Q1Z"GL0,HMq``fr83!
lbQiFZ&d%h'"@1fS'fNF"fP3Y%QJRc$`D#YUE4`,DBaSiM4bd"jClBi2f`%FI'fL
ISZU(KV6"'UU#lG9&eD4b@P00!'#r9(5*KDM`PFLr0Y,(F&-dHS&Miq,E(kbTTZP
'1`NBA!J9efIS!6('2N!9[iXjY1T8"''1)eb5b"k-Chb68jPJ1IAH`FS%HXcGK2N
Q$h3-TAL9f*%df+Vb!EQmTHAq(V@AK!1XDZ*9BTELXd3-G$-CqSj%jNC-5%D'[&8
(q&GE&(QVf[BEm[C`j1eKU&(9ajHE)BmATdMNIAI%b$Y#34SaU*SKl`"$ALMU)S(
ZGTZ#Z"Lp1%*F&'hrHd%YqmB#YA3+XqN*,+#f&Ck)Rf9UXeiE-S$mRYVa0p9YQNQ
K)bRCC)#bPPiG&Qd(Xp6M8*'JV`e"-Y'rcPaL1+c*p3CT1pq@`P9F6cP9GC'drCX
XGGMb6hkS9aAA@IlT5Z!p*6$5m!J#R$"25MembcaPbcbqa4IINLmP5hBXE,K1qmC
ZqHNhZCDI@KC$b@3aUICk9E&9fS%22[8hmqQIAJNJX$*ZZ#`P(l3MQ'AR`Kr'Y)F
YFa!8QBS(Re[QBR!(j3%qCHlQ!-,[5VJ&c92*`Vi`CAbX0NX*B08)SbKpVB&kq"D
JkYq"P*@NYK"YA&4F,rXY-)+qM-'ePl2rlmiK+B%@AU&*A9MLfmS5hmB5Zbc9@')
#Am`5,'8*+CP"b6LkM&P+m"R()3Lb`*M`c88`XPB4X[C+i2i`3Z6V9D2Ba$rDa$r
BG#83RU)1BlLBEVL-$ckhV1FIImBCAXmhIFBCKUSH'Vb!"TEK5EGZKSNcV`D&iYH
9l**#jNA9C"B16eSjh@1RjLMBC)2V!*9S#P$SFFR9VZReEMhEaKjJkmY&2%5*bbX
8`,`J8-!GQqD6+$!f(d$IF6!C4PjUTQ9+-hf"4Aj4hYPb'BSTViJ9@-5bTl284XY
mK,EQZhPS#fDDBQNRM%-%HM2MS,G&$Li&HX@-FfPC!j@J2YcCXC%2KH`q&b8IUjk
lPZ6M4L@ff6F@XEf0d%A))8IEFe&fXU2-[E`Hc1hPc1f9Q6YmdZ5"LD8qNKd-lqT
$55@CYlRailDSm3-%-aaRGAZ%%crff*0$&akGAEJbCRjc36-9UQ$GLkSbF$D8GAJ
+B"),'5cA`m(p1!"cN[[&CQqRk#j3[6'a'#a`me,Q6Lmjf1jmeHZ$qBT8SU(1(5[
JbrjqD!KUl+Z1QSlHDj404h93N!$MLphPEi*LC*hDe0)!FSL"RbN`p*ND!fPG'),
@TU6"#Jaqc3e+q8GJ9+q5XdZ-jMH$QC5iD,rI3)F&DlcSRKAXm)jQ0,%'lpRSa5&
LG1[fSGpadl1#R+X6[3%DVSF)-jUCe0S9XeS6$)'##32cGhHS'*Ll@2'fQJfKail
$%3bJSqC["G''5%5DC%5ZM#+b`XFE3r0H#"UmhENKcG$X1RmN*!YqbcXYK16ccGk
fB'MchH@U3rH(GM%'S8D1kJ2HlSa$%DJ1RE#"L,cDRJchRhlf")+5XkB!R3i+Q[&
"DlR'UjK$XZ1eTYUjUm$YM$C&+F5lAe4VBe*R$6G%a'BMr$&`d`dIUHRNL4GRNN[
(TK4YLj2T6$1(C1`0H@cZb!Dj5AQ9fBCLUETA!UP$`Eeie#lDiklM-!L[KKmhlqE
bFEbafT-'8@&qM#Ta(5Vk+L$$S!Kk"&9Z)dKp1hi-H"&`dF60a3+1#'23d!!$,a4
heE90lA"-MBGLRP(26cJSF00DcN)[LPP1l,c&@5ppVHU62e2e#1)BT+ZU%H%jSf%
86G[TG-&3cJe3BSCp@jeDIa--6SPB6)0)C!D'FN2-&K"h(X4KPZ[I)A!E*X!EA#T
TU05[PlB-&#,#0J0Yqlp!"E(8[0!f%f,D,GG!6,Y1YAMjPSN`*5UEi++lb#5!L[T
H$#8QIj1VhQTCM8P'bc*8iUXp!8m,'Ri9Cj)kUNAC41F4I(5E8k$U(4e(p-QE1,Y
0p!!'%D0YNfSXRQGC`BFX+q#q-mAQ96,VQ(iALB!#afe3"kC"ee+1JMBqCE8Ym*L
b0!bHD(P6L5Re9'3KTZi#5M(H%#h'-+8ER#95chX'VUE#LpU6QjPL2#RdFe@*)Bl
LAbeH(dIa$4c&[j*kMSML'q)ScV*eF`42KC!!GPf9JYkTE!-'Q$pR+!kDhUY6Ec9
EbLbqP&Pm+@emS2Pc-2TcAY8Bf%6HT5m'XidVAZ!H0`qRMlh%CDTb*FN86%bN%S5
QPRCcY"G4-4,e(04V+'M)(`m"@2N3AYF5VdE`XE0#+@La8YV@NEbH1K-Kd0K'(aL
k&3&3qH$KD"D-1G`[M$bLeBG@R,c)ld14em5pBkrLJlbJUl0$LCa5k'2+KDCFZ%K
iX#iZ$#&h+(jDhU)K!4-cNeJ&U+)E&`9ITGh1!L+BR$!48Ljb9"U'hQ@0rX`U%d*
c6NmNq1SG91AHFA6TH4H"-MjaU0UNFM2b,PP8Z*K%aCZ)S9JC0*ml0YKJJqBj$SK
V18Ge&NGe+8$kCh&N'mf4$D"H`)&k!4$132TR!1QI-E5lp@0"1k%348Uch"F0!B+
Jh%H)"N&EbC&kb$[2FKm4KrG8'EQN(!EdC[8M$KX9"-q*)KJ%Ck0P+S4Xc*D)-88
8GF998%lL10+E3MBSb'G(F8CA-L3e*m%T[GIbD`ibD[0KT@+18GGUNqBhc+m@YBm
Z3Nqc-6pQkikc2UdAjRh,,$JFYB3#X%N[(!fm%-f$5&lYU!(RaIk9c)[3K!LTC(E
*P3a(93VEA,+jD&Zp@N'&dQ8B"@*MPY1fEP*5fRSDaa1Lmp#aq,3D`eFH&,Hf-*,
JKG"JZGq`1+"V!##MUdPf#G!feE,-k3%B8TFD"9@-+"#bJN2mQ(&qc$@fEVc'`YI
dUP#2S)-5FF3er+"%(,5$-fQNDJ1)A+CViiH4J[,+1+Nlh-pd0N+!9P9bj+4-0-F
p&*jQB[XCpdBX9LDJV*J-AJpL%"M"m$Z'+8Pm'0JD-35N$ilb`E*A(R4PrBPFN!#
Jqp9E8'J'('",$m4*E'pC4RDDlPJ*`'EC$B3M2,['#dAP!C6N!-5NLX08mlJ#hKL
9mcC(Lf&idLm6Q&01cZm(A'93#@[UqB9H&ELL!Jh!KULM-K`3,F3CRDBiSkGPCj3
,LMUNTjP$5Sr4eG[F+@hL#lS[ZL"q'"a6TZ#L1+FpMYc`-DK&X%qqDpfqG8ZA1MB
AqqmDf(U-ZpL2b5lf8mjVi@)r1%BAHi3U'%GfXER5D3M`8aS!LfAIIRHaqe,aZ,&
GE(0'He8bZZdlXSYY$h@aYpEY9aIE2Q)AHlqBU1!LM-h&AMdQ&rY3L)Yp`"c*8,)
rk4)BQ[Xjf4[0R'alU*1Y)$Yd`[aq6RDGXa&1pY%)*e[[f,Lj*Q$QFMY(k()h(UN
TSbkhAM$0(+($[Er0Idp%$!Se8ZYaUMi[8'`,&R'AfaBIUKf2F,RI-R1jhiT`Z@9
4UTR6EBmlhABFmL!'9(-8ThYK,hHkUA[`IR'jlqBZGaYIL,Xa4U!PPR+AF#&hZT0
NTcZdkG'T)0HbX'mA2(65V!#jJiaKYb'"ZH66&*HmAR%DTcQDj-Ue@1)1qMhNS$q
0BUBik&1iSZMU%2GmbJ$Zq43cphc+!1ljP!(Gmcra!HqI&(6&k'"#Q1+Jhi0K2TE
AI)!af9cIEaKq5L%$6jLjk)LD5ce2dZ'R@&(Y8Z9LcKeMeL$AF4Fp5AE4qcA)GAd
ll!-eL"T)B#lm41l#UqM*aKTNSU0*j0+c4JNDd3A(CEE`fI'&KcVd$'QYE++S5AK
993Tb0)l)XHpE55iL23*cl0RK@94Fa8CHS#T3J(aqbk+!mZ%@Z@L%12JQrY&`h-9
R@f[fJ'"aP3[Zj$GfddZF)8Tki*26)Sc"eHp$JC!!9bb5iZVEJLp`"l4Sl%10S%*
Je(9MG[BE3jhpTj!!EiZVA-U#+,LMND)k+D13!+Ukmc`4DqB%m%dC(-&4KemkHL5
(Ir9!$[q1@8I0(2lY#55+SeXQ9cijQ8-I,RpICV*+4q6GIBNM2HVdhaj(Hif$5[N
qT9*Q3(mlJ2jf'IeZBBa1[jdlLAI%Uj)8N!#T1aV*j6r*d8SZrad4,Vq%SeFlG2P
A+5LZM($j9h'AIj@Cblp+4MU*FqcbEdpJ4e%"YUb@NG3XSV[GDXXkaHP2N!#GIT1
fm36p66baS(T90lT)c%)!S*X(!,BJ!1#1"J!Nhka!H*T'3B#li2MA+8'!Zd+$!%L
MXSj9JqUi-rID"`%D4q'Bif!@#Q#"!+f[3%!qGmk[1(0j)#",#34X#3d%l*M&"X!
m%,#G(c8HFY3e,"LJM53BX*`UQ4%%!rT8Eii-"S35pc%'"XDJZRhN`%!I6S-F',$
,J3&Pf#S("Z`h@Q#J,c)4%KMijIq"`-$+erS)$0MMJ3&ED'"!FD'R+5ldDGQ&hLq
"J3I((KMSdc`I%KKJB%2+h9$K9N+US8@mJ)Ti"BViHU@)SkJJh#`Am45jL*Y8[Fm
8drZS#PHU#FQ,J8#`#9e%MA))hdE9HdJP)S-(Y!4+[MGbINT[0"BS'(#!-p$DMi&
Sd(XXbami5K0IrS&HT-E8[*p@0SJTYNmVLll1U5bUE$!GV'b3!(EUlFBYNQmq!,l
N!&0DEC!!*0q+kKTlq(pTUXPM6*C58%K9Y5ADHGA)1UmDS)5cdXJ,5hM5LL&MYE6
6C$FrTKl(J$LhcBHETf[ej+bm6fUc"H!mXJk[C"jb-8)qqT68+4qXpjLfk*-P&ii
a*Dp9Bf*-fZ*d$ejISHQld)Q[Q(AH8d!ERC,fE32+BbCdkUie1'+#GI(YB)'Al9E
V14!,XE"-Pbjh1be,ImQ[SdDh@ZQ"H@K)`I%`LN9@0LK01ITrpN2[M"$'C`#p-dD
!hSrlSGH&F!N(RZ5(NED#S6EL#+"fa[r(82[rpdFYi"+qGPPq1Q!5bT3M`l!jLLH
%)'!#8$aK2k(iY6L+)ii!LLImTi6LXmH%BL68*"5$`#'4PF[[qMK3aJb!ee$b&!m
239-+9+46I"-r"Nq'UUqYMeFXVU6"*L4)SbiS&+J&#Aa'#6Uei8GcpR*K'mih)b(
Sk6#8j+%B1)!ckh3KM-)6dDCHArmMK&)EXNZJhRRDQ+%D@arbG(YZk%pqmbN`%L@
r"TRm`N5,*5%`NX+)+lRm&DUTXi)jKd4NGpP1f-BV'h+@me#C)BlNCmk@CkEVKSr
"KXZ5MNb4%i5G9r1EAe4G2SbQ%F$EbK&JZCN89qXd[iYF9'jH8aeA,2PMV&Md+P8
VTKJhQ,+QQfHE+AAD4JQGEijVP+*e5Ze0q,SC2a0VA4jrPZUjLQEm1Yk-KRl0D%,
cl9+DXGhC"-&lPHDC5-hME)04m,6PCQ)2kGD'H@9@CqT%QQN5E%cZTZf'aPk99#a
U9E-+,XAE,DlMSCQES`U490&pIS`9(D(G)4JR[NL!j*3"DEmLqT(@F3$4k++'R!f
%C+@SF$36qac4p$#bb24(GP0)N@QMX+Y6B1J&@Je!DaYB)"&M3'YZ&+d-R,p$D$d
@D#jPj#&44QaqX`,+[m)L%J('XAU0,[Q!Q&)qYj%*aicCGKTf([*4N!!5c,D$fH)
3`2)lFk&#NBl'5C3H3%+K[*)AH'(rpV8[l+bjP-'@kM3XJAMG`kj1$UjH5VJV&rG
cZ@PCQ@,kX4S9qj021D3bV4m",4i6!6dF!JiTcQF8F4[1Zq-Ne$d#%LVH5#58$E0
G#K&GdcJ#%MV`L$[cl"&)k'U&K&)b!EG#3Z9`4@`r%P'j!HF23%DRMB#-kY')"U8
a@jf(Z'Jc3[Sd&I9T#L'Yji5dN425LMi)+@X#$D4d!B)*dmC)52Y`Ga`38KNKHCb
8PZjR8LU,Aa-RTJq(%00T)bDQKb+'(biZAQ")jZ5dNC26LMl)D4bjZ6*bad*1M`$
Cri8JThf&BK+p"b[r)Zk8&35m,4`01CA2X9!,,[h86@2mX2``d41T2%"TCLVr![3
F#%r#&NTb9*C4Q%D,X%B-L'9$HL)a#ZI!i0Jjf,X6+@a5j!8P9#+jB#,Vf,BLi,I
B!YiQm@i68Ur6!h3ViC2fE1"U$hA-iIM@TXJP8MF)dhXXBFDM1B9AGGD"9bJRN!-
(b+5NQ`9KE$If,*jCSRqbQ+@&5DU@[)-he'JERk@rLFr1VPjeqGm#6@V#TEP,pfh
6VH1G6PJ`i@K*0RUd@FhphKlUqNVrQ,(dHihX%jkp)kF`l@V)8TJT["MKXPe,&TB
Cd3%G#m05A'`TV5U"6mZi9k@3!$Q@F)YZ&AGJf!+H`3,5bJTc(DpLJ12CiSjY%F(
qLhKFAN4ZG[V)9d&!Fe)*'&,#1F2F@dVd4iYG2FfU,YESFlEca(")Ch00ip0q6E@
F*'2+m3"IaMSHXQ3KYKSX)chlR0m29ma"HmJXMqf`L@-j$0(P)aq'0"58K)+$'8+
8l9mY,8Na0(N#`beI,G@GNVES1G!'2S5iXjNPZPb(F&4'rk)Q1`Dm4N9X+e35`%M
Vh+8P6HrjRM`%K3*'fSk$Y,A-A@VITPX@!UiIiDMF`[,bD&Lm(mL@fF[LKle(YcC
`%AT+iULCfYMBU+QNlN$+0b"dEAi0!iEY$VIjj'eNNQj5(@jU#ped#+5BM#P8JA6
%2!fHkeSDF%3c+V59"cSp&cbrPpTD,Z#4Qp4b$6&j-hp)DKT[16a%LLmhbH%'3ha
$c0rS,(#i53MCj(3Q'!kVbje*I@i9R"9m8f[N*Rk,KS#-3JJ,-&8QPD9*BK4-I-P
"-mQJ8-2$klpH@92p)BSZK3bAcHF[,P9l#+!")q8A--Hj3%L[8!IKS5pK0YR+`@!
i0"LYb#kMc[S$&0A524PQUCQ'k6KM0B`2VL#P)Q#"S%D%9P+#E5b-19"+SmL%J2(
63a+AK"E1eQ+UE11Ubj6!%9A$haV4RE%4R3+Ef`1fX41#-S*b+NmM1@a+hiFj)J6
p$MY!)@q$NC*VJa3-hK*Tq-0$DA!K3PUqGH2Re8AM*BEccDE195H`&,Ic-$fZmH,
f-J1QqZ$'3D4h"&JdS62R0!pG'QZU$@eB,"Y+I)l&CTq,ipimc0@chCE*5)#0[N%
(E+'NS0rbrFdYh8&DAKCE[&lE1*2q*XjF9leU[-*hAUf,hAEKVHi5erRQLTY-0iN
DBfA96-l+J'PD`MIh+Qa)-@E`$''&$FL(UG,026)RK(XE*jefF(3f&)"*SC)0,")
N!()e!ZeHqcB'RRm0,4[QSVG(&S3334RK5IHZ(B1JXNK"C#+USB3BEmk[bQLMUX)
CNe0XTHD!amaSm$%6ra`8I4F[qSH!,PDipD%R$hpZhD(,eC9M,$3!+rf&h6XdCQ%
4l#!YZj,-dcL2'rPLk#UGKaXbH6%BM%8NkF40G%`"U+R'R(818Pl1LTV5iPfLPbN
GXlebSXh!f3JLY[q6A0S(q#`L54fCY+(!b)RFh88e0JSr8$05fV3"LkUAM0i-6!)
2%Td2aQ(jZpq*pm,&!JF1PFLajm)-@PakGVQF4QK2KM+J8KEi1pR8qG2*XJN@+5[
[L),ZhSq"ATK39ccRX5[TXPbFR5DPJl'N,&@+J'KcY-3"5Kj1kPRbB!-5d0C,X4A
95YGaZ!0IHPAYbjeU6$pZLX'GdVcM!!R0Q&Td+EPE6)`1+N-cUAlHDlAQkmU)8hp
fLA92KVb3!-qM+-"6@SHYCiqFK!8Zc6l25q3L+)N*XjM,%8fK#HGS1KNGa$EZjNc
(JeH9PeIa-PPjQBbA9j5A9r$bX[,b-PlqVVcm(5q2+#q2i194jH94[+a4AYEJjDr
+beraXPaj@BkAAbJ[[iJRp5e!2a&b,er`0hmY9$iX2bKUT#fMKDACjHQ-8CKC(KD
2iZZ*l%2*q*)19Mka!Yh8heNXB4#,0,piQ,ZD+jR1`mZmB)U88cN[U@S),c+!&$@
3!0KaA8&QZKSAZji,A!q"kdPJC96JqYc9q(UILhUILhVrLp-NSX&U$4%LU`'3!+[
Pp`@kNEVAp4&8!(S6Gd$"BHKhj"6kPmhUCLBJ9AeY0VeLQqC2E#&9JIHe2#)Vp1%
2b6c8)9HpIaj#`em&+FT&B6PAPKjAD12J4cF5JBLe!-*d,BqkUd%PiMAM!rQ*ekA
UIBY(5`iBSA+#e`Q9h59Z[@rZ,5)"TBCYaaH2`VRa9Bf@fe'!A8Lea)rr9b25Ih'
4Af*K@&B+FijHZdK%Adk90)-Y+qeF+Eq+SN&fXHM392prr$Le#p@FreXrR[!4N[S
c`9fRY6a6FE"AkRNAD58ac,V+P4"FlpSS96!Z0H-*(&[-Pl2C@#frl%XJp9LNq$[
a,MEK"iG)YZZU&Up9YE,BPcdmq5C(fL@f[)c-A(PT5#1e@kp83Z@*Q`IplXZ$rYM
PVjT8YUJG@06E[a9MTLp8&bkdSG3KL%9bHK#k$c,j-['&5aG3E@AZc%afc,RFN!#
$H%9(MG)FJ0)jEK`DNbiMm9)lUS,Bj5TF0N%efhfj#UrcQk!Dq-(PTM`50L&C3@9
S5mY$%Kl3K!+jkhbLrU'PihjhblMX$TM8VTX,92r*&KJDFAXmRra"K9UVqQ-YilA
%qNdbd+'4N9",DUZk8+ZSF,dfQkI'eJGEN@ECa4*@I3$#p4'Kf)X(AMNi1#1qa$4
r4JMJZlL5(!I%@-X%FCqa!JhYEVQ#C-eH*a4cAYhX[qR(UIj%S(h#l#ZE!pfTq$K
96#P)[(l#ZL[[MR[bT#kMBFiPU%X1eA69E&)@FC'3!!ie,*F%d[R"&VUj'P3ED$Q
F,+6'Pj1M+`rUV%MJ(apBajVN'l+pQ,J`YHIQ)YcXbrKQbaA4KN9FQ6h+&Y4bq6*
E5ZaG0!+re!#SEcH4!QVX-Lj-#8[q@BcT2`0)h#@kKejh"!aEIYBN19T3VUiJ26V
`m(kkD$@5EH3X@Pe6*6hi`9BepL&H!"ciNTlpHZZLeFi8qUTjpX1Y,*R9H#M`lLD
'DT!!"[[Y@d4hkMm[QE4SY4LM#G+2JPT0+K0*b["$UG*@0QbSYNB#*S@Uk%DREGf
UD[JhGlF&@QDZEPJ3eC)fh'#SQ@i"b)Q`#@'X&%@eUUR@am#ND#'lf,H59qSZ13J
eJii!XfHYTC&NS*%13k2I1VYlFm$8l,F[$T5imqdF%@h%YP-*%IlJ)Y4E2-B(&0+
9"&9MV64qm!qI`8"UYafKQ+qpQ&32BKDE5qb[NkH(,,FiG*Tp@rK[8D@N9jAD%qE
[mZ`FDhiK9DrC'@Q4+53I2-%+%QlE%bI&IMFTBlGd)l"Ec%JehEB8J06pIN"1fdl
"9$EK"bBP8$T%T*)GrNU*VSrM$r!#MNiUVRI*RD91cHdVUVXQ,G[B"DF!C&%c&4G
eih&($@Hl-iEB+ab(!PAU6+CEY$DFrjFl4ZN&0fQlA&E8K3k-qK-BIX6dhPrIX$m
Zl6$8k$E4%C@"NYE3!fcMl,&ZL[i%,EcFaETiK#FY@JbeaKL'3ADJ&)42$[41f*j
C-"#Tkq!KRhb9Q(I'LLlCZLXRP#C+2M1a8'kJX,IHikd5phS+EPh1NEmJ""L5r-h
K+CDm#UfP5Nb4ZL3l9#Je*kpX,BN2"U$1IAS@L#-kQlN!0Jr4X)NeR4AU&+6UCNc
3BaK*D81KZ"H6UleA)TY5c#c3P83f*JpDZFaC)",j`d[p'G%c4V52J#4TTh3*5Kq
D+"N6%&bJ$Kf+f[-,$94!`0T8%+'G3eAbd2([jU$9Ed&bXHG)UI([A"`ShF@+MR1
Ad32(`k88T!Ad+RRPJYf3!--PQ`eZX+aRr-dlJ&JLPNKB&B&8*&e9$Q$,GXk#!Q1
+c%*4[%#-Lq8kACbdeDB!9GFd(QjZD3($8ce"C8V@Rd!B[#M`@laIUlZ#LV*-i40
Bp#(heC02iTB!9p8@S#dPQ),Jc+iJ%F!Y8SSi4hDF6Q!Fcc8l`8X8(EaT3JmdX!0
CGlZJ1pp#Kd,3(C*24JG%XAa,F9&FB4B9M0%JZC1[J!$8&,rTDPE[&0Z+2iDLG!T
H8X3BAZkd2FZfL,FT)5&!2AScT,-@!qN%#G@P(9&X#KGl*aGl*aHE%LRfMDMBp'`
cS9c"%iQ"951q*+L*kY("Ej0D2`L986aU3[J8)Tkh8JhUYm,1)ZV+cBDdZE),99E
UEkDdPG60(dVE%)H!Q!H&L#ikDSY4F4p1UJ)JZ"F(H%FQFX2d5,3I-j'K#%%8bHH
X)F-41S`diDER2V960-J#q"'l-2K8C9"jRRb[`T)"Pd9Q*bL@GjLdB0*(2DVHNFK
5FS,-PbR3-UAGY-L)aEA,LiXcV%B"GiB-"[*kj#,2Zf)3U`$%1d9A&,J89Br0-$)
JF$M&"E0P-p*!l2,hBR`@@ke41M64`$Ydh8N#q2EArEl&JC`k3baCrCZ'q`*[G&G
!hekl$"(d%8Gp)p$UHbb!F0f`pUE8l(b"E9,T0[)D5dk[X2!)6j!!!,F2LYGkd83
,%&h4)jd'0T8rFLQ,-*!!@5r8!)X1&CcJA,*DN5r85Ljk#2YbN!!H#AD*cGhpcB8
3QX&Caa#4dQ$%e9Mh%NXC%PM5meZHk11-1(R#ALl3+E%,Qqp[Zpdq'5%A+U*E#"R
hMfY[3K(F43PLj!8hR-[&JXXF,*EI8V(P1QUQ"q*0&i-jR$AC53*KNDI[bh%Ek""
0h1jhjrGH4`fh'q(!AJafZi2ScNiGqKLlmDk-k,j%+3(Mc%J)S#N!9E50L8Y@JqB
0ImRI4Q#a5YZM-[-hJ6D8ib94LMCSb6#K0,JVBR*5D)-Ca[2ED*QVGX0)l!l@3AQ
qcCm#K2FPKS0`+2V3h-L&'pVF4$j"!MlpC)T)0iH')il,1SBQh1D)dVkj[%)#JKa
qppI#*e1FaH(r5VIiqGT6q6kjpTp-b@mQXXS,GeQ@6KN$C-[GThNSKbXb"ZGj!r`
32Ge%K"(SfQ)+j["Mp%BB81G2N!#G(8+l-L#e@XR+(T8lN!$JMK"a"b,&bB(02eZ
YA"FPFT%X$IUIjFSPiN1C'+$k)2#fKj!!!KSU#R*9!k-[ND'G59@iVr9&UXb'*S"
iaC!!IQmE0c*db*8G3**ZE"6YrXd!@q5RK`cYP@2j!D@j!+I&!a#M06,a59C&"UJ
c'8LkF-pfR5Z8N!#`$rDSM)c(!6H&EF*N1lp0PR*!-KX1+pAhaCQNY0i(b#R%"k5
lL3&II2JKFNSEB[iC"L1E-h(39P5#5'1*,cH)fTIURHJir#&!Db)%eVGrL8@LZT5
q4&H&!h$5M1M3dP(cTATmGVA,$3BT*Bel6f"#3'TQ)4`aACF4FT-'(L#kD14K*q8
cXk4!KLK+#B@%CT!!0AN*DV-Q)dV8pf1r0B6pq"4e!5I+Z&'`JMUMA[d$A!'N*JF
4#STbJcfQ"PpMeBJVKS,GKLqIk+(d4e"JELT*`8f`MPGLBTR'd)SZL[L`DKb!eN&
$6A5E-U*kDkV#*VUY9'K61p[BUd,U"!`pHe&Y9e$&#38('J!8*k9bmQB)YMYJ`d#
NPprB5QP+Z3-#8%`pUD-S0[#!V)cU*aLUf4j(@c*kC50"3iiZ"cILL#TfFm!!3DH
EFL1"P&q#%d*Ne&IaSjfM#e(C6"k9YYUH0A3RMiUR8-'h5Mk2-#68q0+E9Raa*5$
jEUm1A'i)e-HQ3"AHfa!m,QdYHPEU([XA"#mprpl5mC9-3%Vmm5QrlrS!LQf+XS"
am46-R38+8B8k5`D#"$N++d3L,HY!)ZFT"!c"hXaX+mEddH!LQP,la3&P+*Vf8TT
9'Ch,!lcPlbR#kF13!1&eh"%(L1@dqGX@ddhpSG*%5Z)l*Rdb$6G*bc-Qqj[RYJ6
G3kRm)SA)#!G*+XkYp$Vd1aD-4E*6Ap+%d#(4+-,dDEVS3Sad)`VmMh$`3T)9*ha
$rNEdRqeFTR(PUNEmk*hehL[CZpakpIqTRDMm*EA6DI"HbA$&(aR8cKUhXkdFr`X
#j4C@A%G&dKb)(#U6qH'Ae3-D),Kajm*CS,[-$p8Ir2G$S@I0DL&KjKZA2VP`)Hb
lPri,jbjEYZ`'r)3,[r8YSEcVXd&KMG!`',lcc#H#"cp9&bB,[a##9F*kB82iPq%
AK2RKHF)2cP3Z&M,j`b&IH&6i+[aMrM"mm!RKf3h#maZkhVPdBIRk#d-rHAl)pqF
,Sk2#0L(if4pRHTiD'X4#61&2lVeAq-ZppqjBLY0H&6lpRm+k0dDlK4P#E[KRA8(
KD[MHVNAK0mkXq9MilCRPLi6Ii,HVXZZDX+mR9hM`-`&h#96r)44K`B80i9ZC,''
2i&Qf6-LKVh!c2PX5VKh+%-k'G`YV*JLMiGmrGd2iM3R##e@#AhLZ5[K[PBq%1mm
m,laaTP[)1r0(iDr#mNHH&Ci92MjcGBB3RLlmpRRKKBD[K(p9pMraMdI#hcjc9[M
X6%kirX`'i40K%rCI%RjraMP$m%iAIXlflj[qqT,TU6Mc+q'qbF+HkF*M`SlT3T,
`hbF,UC1&[G1&(`UHkB)G$pi5`KG5+i8ZBDJRCd2i"m*,3P(eCd,2M(r-r'1$X2j
8Z2M%Z1#jIId+3CJm,Lck+C+(A9MIm-U*6i8*Ahfa4LMmKe$kaU#`mqI#P[%0ccB
mHURbp8H%S@TKlaI6KIa"i5F!N!-B!!!I+!!!8q!!N!-)!*!$)!!!2c`!"kR`!*!
$#PM!!&h!!!"G`!#3!aTZ!*!$!AB!6R&+JfBL3Hd!)#!m2c`!!#)mUI!!!8T"CJ4
+3'F+5%")35#!)8%!"%+R3IVrcY$m!3![##mm!!!CELm$B3!#V&52Cd"#1!TH3UF
[2%4"9%%r2!69U"p`!4(!#Pj+RfFB6R%`2+P`TdC$qJ!U)SK"qJ!J-$bTF+C(5S0
R"(!"6R91l3!L6R&+JfB#UI4`!%jeB!B!N!8"6R%I1[rf5KpQ%NMRi1""q[rU80"
1ZJ@Z60m("bmkrpj1G@"b38a"4%4$69!!!`#30&"b3@e)jf$`G&#I`Lp)!#!J6b*
8-@N!&!!B)8!!*$&m!!%!,0+4)8%!,U!#hm*-h`m'6R9+1!THC``J+J!)C``J3#!
3C`B[1[q%6R9)jam'3IVrRR!-)LS!"-+i!aTKT'B!!6j)H[q16VS(EPK2X(Vr@QB
!!3kK'Li)##S!3!!%C`BJH!+QS"XX+J!%+LS!#"JU!!5Ae*A8)$Vr9U%H2cJ#)'B
!!1a86ba))$Vr4#)'`VJ$'PK"B3$r6#!krcc!Z!-D3IVr1##!5S9Q"+%LB!3J4D!
RCJ!!Y#T))!j3J%(kr`JJJ#!kr`T4J%(kr`!JJ%*R5(S![#m95(Vr!LmkrZ)[1[l
L,cVqbLmkrXS[1[l+B3!06M!ICb!r!%U&C`JJ6D!US#YJ"#"0S#-J6U!I)%HJ'c(
I!L"JB#"1S"mJ4k!EFJ!5"1F*iaRN%3!"!#!#!3$J)%fJD3)!!"q!!5"0S'V9e0I
83IVqGNU3!'F)F!'JQ(!$S*JJ659)!!K`!%cIB2K1G8cIB2KJ!2kq2`!J6U!I)%H
J'c(I!L$9e0I8-$J#)$(!#Q#4b#9)!!K-hf$i6R919J!!51F!1#KZ!!a(q[iU4IV
q+L!8X**Y"#!5+)"+J'm5)&-LEJ!)SLiJ&0'6NC*`!'!%-$crf8cI(!"1ANje6PE
rb%MR(MJQ,J!)+#i!$#KZ!"""q[fk,8Mre%)ZrmLK'Le)rma96kJF-"mk!!a&!!"
[A%KZrq``"90&2`#S$e92,blrl+J0-"mm!!a'!!"[h%)RUCYC6bmZrq``"P0'2`#
S$L!I,8$rm()"(`'TQb"Zrr"+N!"R%&92,`LTTM!I5-"b"-#"Cm3[,[r`UD0J["!
Z!"4R#PP2,VJ#TL"IS"Xr2+$m6VS%KP42,8$rd%U!C`!"RLm!6VS$ePK25J"R#R!
"(8!!&Nlk!KK)E[rN5'lri%KZrpK1ZJ9U6qm!$#!Zrq#K(Le)rp`J#'F!!@3J,[r
NS4iY52rS)!KR!!&8,blrj#m)6VS&Z&"2)!0Q!!#Q@8m[2%024%9#CkJI)"mY32r
`5S"R!!#1)%!L8()Bdm%[#8kk",4B6h)$X%&QGL!0)%"`+0(!,8Mrp#*Zrr!N8A!
BeF!Y5[ri,`T1ZJ5k@%mY32rm)'lrm+!T8%SQE[r8*dS!+&P2,blrm%kk&F`J(h,
Sd)&4J#G!!#a96dKkrM)[,[rd5'lrr#m-,`3[,[rF,blri#mZrqK1ZJV'9%m[,[r
`UD-NE[r8*@lrd!!-*@lrh!!3*@lri!!8*@lrk!!B2cbKQ%kk!eC86bC!2cbSRdk
k!dT86b)!)!Z`J@B%F!"J!R!")!!P3!!F*83!)#9-!#4)H[[-2cbJr$mmS2a1ZJ,
i9%mI!%kk&9)r2+'B6VS$$&425S"R"(!"S*JJI!!!!9S`%%M!i)"b"V#"CJa"qJ#
Z)R`!!!-m)SJGI!!"rmJJE[r-S"Y96kJF-"mk!!a&!!"[G%KZrq``"90&2`#S$e9
2,blrl+J0-"mm!!a'!!"[h%)RUCYC6bmZrq``"P0'2`#S$L!I,8$rm()"(`'TQe9
2,blrm+QQ-"p)`()%`)&R##mZrr#TSQ$#*'lrm%U5Ca"96bm+UDB`(dM!FJ6!J@H
U,`UTSf#N%#lrb"e!!"C-haai6PiJAdr[!!j1d%j@rra)j`!`3Llrr$mmS2a1ZJ)
X9%mN3%U!Ce`[!%kk!B"B6dS!Ce!J#LC!)%![+!!-2cbJr$mmS2a1ZJ(H9%mI!%k
k&$JJ5b"S!"#J(b",)'J!'+!I)(`!!!&D-"")`1#!FJD`J@B+F!!JI!!!!c`JJ"e
m!!(rr"!Zrra-h``!6Pj1G8j@rqK)jami@8qTG5!I+J")E[rSU(3J$5"!)""bKY#
",8$rr#"!A%K$l[rX)YJLf&P2,ca%394"2c`%eDQJ)"mS3#"!*&!b+J!)NQS!"$`
"0#S!"T4U!!)q!MBZrr*)`cJZrqj)a*D%1!&)a*D%DJ*5Jq+$282rpMBZrr")`cJ
Zrqa)a*D%1!*)a*D%DJ*5Jq+$282rp$BZrrE@36e$rrSb,[rddN)p3Iri@8p#TdK
Zrr4)HJ"QFJ%I!A)"2`&brbm"3LG#TkN6)"mQ3#m!U(-'K3#3!hJ[$#",F"$4`#m
)U2CC6kPe)"q`K@3#B2496kPd%"pQ!Q$fF2mr!%*R)"qJ-Lm,U43[$+QM,blrk+K
c60mFq%jH6R8!!J!!6PB!!%MR!$!NEJ!))!SQ3#"!)LJ!!Jb"38a"4'B@)LJ!"Jb
"4%008'B+-#J!#R)$X%&R"(!!B!*`!8cI$!"1ANje,`TC6cmmU'j`!4m!6VS5H#"
I*%KC6cmmUQj`!4m!6VS5CL*I)%Uab@B'-$`#!'!%-$`%!#4I6R919J!!,`-f,J!
)-!0)`!+!!!!)!%U!E`4`!@!#F!!Q(djH6R919[rm51FF!$BZ!!Jr!dkkrma86ae
!rrab!E!"CK!#3`Ir6VVrJ,"$EJ4`!'!S@8mr2+LIF!%I!%kk%I!J(bS!@8mr!am
Zrra1ZK(J)"mS!,#&CJ*`!%cI!$K1ANje6PB!!%MR'$!i,J!)*'i!#L"+)"!Q3#"
!-K!-38&%CLJb+!!#$%&$8QBH0J4brlC"CaSJ+!!%FKMLU!+!!*!$rc)$5-'`J@F
%F!"J!R!"(8!!$NcI$"K1AL"IA%p1d%j@!!"96dKZ!!K`rcm!6VVrNK!ICa)JEJ!
))#J!"()BiUJ#3!$rB!*`rdjH6R919J!!98p)EJ!)F2mr!%kkrf33(fF3)'i!##!
S!!3#J!$rN!0J!R$r6Pj1G8j@!!")jaJi*Qi!##KZ!!`J5c#m!`&`!#4-*)!Q2!!
!!56ANJD5!!!#5!D5!*!$)#Jm!*!$J0Q5fC)S2!!!"*!!fC,ANYQ5"T)!N!0m"T)
!!)!!F!!NEJ!3*)!'NJ#3!b3'NJ#3!b!'NJ#3!dJ'NJ#3!cj#3%cI("K1ANje6PE
rj%MR(cJQEJ!)+Li!$#!,+%!Y32rSF#6C`#e-rqa`)0R!,8crm(")fF!Y62rdF$l
C`#!-N!#,X)9M"R"P6[S!XN*!2J"#3$e!rq3f"h!NYN"N5(!%YN"N"(!!B!a`!$!
$@B"U!PD!j)"i!$J$,86rq0LZrqJN4"5!)#lrq0#!d+lrm#"!-+lrj(!"&"*b!")
#if$4E[rN8NGJX%*!2J"`!6`!0JG`(lC!C%4`!EC!C!4`!'!-F!!`!e1!DJ*5J1+
!H!!i!be%rrcBV[rX*%38J#!Zrrc3J0#Zrr3J3$#'F!%8%R)!%J,MB0a!8NGJY%*
!60mFq%jH6R919[r`51FI1#4Z!!JQEJ!-1Li!%#KZ!"*#3$`!-J9`!$!"d)!d"R)
!-J+`J@m83N!d"R)!-J,5JG+-)%%`J&*'B0T#3$`!F!)p32rb0JDf4@3!!,K#3$i
!3N!p32r`F!!`!q@!d)SJ3#!3,8$rp$)'F!!`!G#,)%!B%(B!&J5f4f-!!))`,[r
fFJ(!3G&Zrr"`!$!$8i!d"h)!-J+`J@mq1#lrm(B!0J3Y3rrmeS2@M#"$5P"Q%L!
Zrrc3J0#-)%!`V[rb9'lrmM)Zrr"`!$!"d)$3M#"!-"!p32r`B"B`"G"!d%Bd,[r
`FJ!b!Y+"dS`J36#!8NFJ,[rdiSJY32rdB!$rE&*'B!$r4%cI(2K1ANje6PErr%M
R($!NEJ!)0Li!$#CZ!!ib!h!!-!(QJ$J!-!0b"m""1J"`!#e!rr`d"()!-J,5LL"
"%K"`!"!"0!9b!$)#iU"b!F#"dDlrr#)ZrrcMLG+,)%%b%(!!-!%Y32rm8N8`"A)
)X%&Q"N*!1J"54$)Z!"*`!$!"d)#`V[rmB`*JUK!Zrrm5,J!6dJ'3!!&-h``i6Pj
1G8j@rra)jamJ*'i!#$JZ!!`k,J!1-J4`!$!"jS!m!$)%G!I#3Mi"GJ!f!0D+)%-
3%(3!&!!Y3[rmF!!`!63&FJ!b!Y#"jS"b!V#"C`ab!E#"Cb"+J'FdB$)d"R)!-J*
8JG++)%%5%(!!%!&b%11SJDlrr$3'FJ!b!P+"dSSJ34)3F!!3!H')JDlrr#!Zrr`
d"h)!-J,LU#e!rra`rh)J0J9d!$3$NS,LU-"Zrrj-h`6i6Pj1G8j@rpK)jami*Qi
!##KZ!!iJ2!!!!564VJ!5)$`!!!*)dDi!%L!Z!")Y32rXFL$6VJ!5)Li!%Le"rr!
N2!#3!i$9VJ!5*#i!%Le#rr3N5aJ5GJ!@"#e$rrMQJhS(aN953ce$rp`Q,[riiS0
k!mC&9%-p3rrQGJ%k,[rQkf-p3rrSIN$)"h`!(!3p4[rLH!(VC&0%286ri#SZrrK
q!FU(C`Kk!$S%8i9J!RVr28ArhRJ)286rj%T'CdB[,J!5,`!r!e*+,`T1Z[mk6qm
!$ZG!d@lrj#mZ!")[,[r`2`-[,[rX6VS,#%r[!!i[,[rd2`-[,[rX,blrm%kkr+a
2l`!13N!p32rB-#lrf,"Z!!aN!!%k-#lriQFk*%!r,[rS,blrp$mZrq3[#dkkrBj
2l`!-%J!J#R!!%!%p32rDG!!d!05Zrq`J3K!3FJ!5!00Zrq4J($mZrqBr,[rN,`Y
1Z[h`8%mp32rD-#lrjY&Zrq3`,[rDX'lrhQB@-Llrf&*ZrpK`!$!"d)`J3%)3B!$
rHM!ZrpU`E[rJCJ!!P$!Zrq*R1L4!2blrk#mZrr3r,[rN,`Y1Z[d'6qm!$")!)!T
`!"!"28$rfR3!0!$8V[rX)%)3%()!%J$6E[rNB"`r,[rQ2blrj#m,6VVpD&"228$
rfM!ZrqE4E[rN9QlrfM!ZrpT6E[rD5N"R!2m!1#lrf(B!0J3Y3rrm8i2@M#"$%"!
L,[rmdS`J34#!8Qlrf'$1%#lrhG!ZrpXd,[rB8Qlrf()!-J,5M#""%)"J!2kq-Ll
rj(!!-!&HJ1D!60mFq%jH6R919[q-51FI1#CZ!!JU,J!-+'i!%#`Z!"3Y5rr)F#6
A`#e,rq"`)0I!,8[rc(")em!Y5rrN,8crP#Bm!!!"*0HZrj3J2!!!!NM4V[q8F#$
4V[q8+$`!N!1!fDlrP0QZrj3YE[q8rl3S2!!!"*!!fDlrP#eZrj6rZ0HZrj3YE[q
8rlcCV[q8,@lrP2r8F(c4V[q8,@lrP2qN)$`!!)!!dDlrP#!Zrj53!)b`K@-+F'8
p3!!S6[S'HR!!,J"#3$e!ri`NE[qNeI`!!)!!,8VrU#eZrk6rN!!YI!!!J!$rk%K
ZrqJ[,[qN)'i!*%k3!&"2)#lrk'B+F'Fp3!!S6[S'0#4Zrj!!8NUel[qSBfJJE[q
3!&*)NHlrU#e)rr3JE[q3!*(Zrk3Y52r`)'lrU*(Zrj!!,8Mrl#!)C`iJE[q3!#*
Zrk3J,[rXSLiNE[qNeHlrl#e+rj!!5'lrm#mZrk3JEJ!N6T!!8%mJ,[r`X+lrp'3
+F'Fp3!!S6[S&`#"Zrj!!8UlrN!!3%"e!rk"b!")!dN&636e"rp!`,[r3d%!p32r
5)'i!(#!3d+i!)#e!rl!N3#m-,blrZ$mm!53[,[q3!%kkqr*2l`!1-J!J#R!!-!(
4V[q3!#m-,blrY$mm!53[,[qi6VS(ZNr[!!i[,[qm2c`"*#mZrlJ[,[qd6VVjA%r
[!!iN3#m-,blrZ$mZrp![,[q3!%kkqk"2l`!1-J!J#R!!-!(4V[q3!#m-,blrY$m
Zrp![,[qi6VS(D%r[!!i[,[r82blrd#mZrlJ[,[qd6VVj#Nr[!!j`!#i!3N!p32q
-,@i!)2qX)'lrV,(Zrl"N!!5S3N!p32qB$'i#52qBC!!!`M!ZriaQ!!#-*'lrN!"
55VAZrkKMD#"Zrj!!8NL4l[qS,8Mrp#"Zrj!!NHlrT#e)rr!JE[qSNHlrN!!Y52r
X)!KR$L"Zrj!!)QlrT#!ZrqbL,L4Zrk69l[rX,8VrN!")E[r`,blrT#"Z!#41N!"
36b!Zrr#`V[rdC!T`Cce!!#K1qJ4#)'lrN!"5V[q3!")3F!!3!5i!F!Jp32q--!G
b!F""d@lrQ$)ZrjK`!$!"d)$3V[qm)%!`%$e!rjJJ"q+),J"6E[q-B!$r1!4Z!NM
rQ!aZ!3$rQ'33)'lrV&+Zrk`3V[qCB!$r#!4Z!3$rQ$JZrjKf!$B%,82rq0D$eUl
rc#"$-"!p32qD)Llrq0+ZrmJJ34)3F!!3!6e!rja+3'F!!-)-EJ!BriaL!!#B*'l
rN!"55VAZrkKMD#"Zrj!!8NL4l[qS,8Mrp#"Zrj!!NHlrT#e)rr!JE[qSNHlrN!!
Y52rX)!KR$L"Zrj!!)QlrT#!ZrqbL,L4Zrk69l[rX,8VrN!")E[r`,blrT#"Z!#4
1N!"36b!Zrr#`V[rdC!T`Cce!!#K1qJ-S)'lrN!"5V[q3!")3F!!3!63Zriab!$)
#ikL1J&"ZriaJ!2pLF2pb)$JZrjaf!$B%NS2LU-"(d@lrQL!(jUJZ!*PZria#3$e
!rjJ`,[qBX'lrdQ3!!-)`,[q-CJ!!M#4Zrj!!8NUel[qSBfJJE[q3!&*)NHlrU#e
)rr3JE[q3!*(Zrk3Y52r`)'lrU*(Zrj!!,8Mrl#!)C`iJE[q3!#*Zrk3J,[rXSLi
NE[qNeHlrl#e+rj!!5'lrm#mZrk3JEJ!N6T!!8%mJ,[r`X+lrp'3+F'Fp3!!S6[S
#@#"Zrj!!8UlrN!!5%(!!%!%Z!(!)28$rM$!(FJ(!3G&ZrjJb,[qBF!!`!G#!d+l
re#"!-"!p32qB)!ILL#i!8flrM'!!rcB`,[r5N@lrQ$JZrjKf!$B%,82rr0D$eUl
rj#"$-"!p32qH)Llrr0+Zrq!J34)3F!!3!6e!rja+3'F!!-)-EJ!BriaL!!#B*'l
rN!"55VAZrkKMD#"Zrj!!8NL4l[qS,8Mrp#"Zrj!!NHlrT#e)rr!JE[qSNHlrN!!
Y52rX)!KR$L"Zrj!!)QlrT#!ZrqbL,L4Zrk69l[rX,8VrN!")E[r`,blrT#"Z!#4
1N!"36b!Zrr#`V[rdC!T`Cce!!#K1qJ&D)'lrN!"5V[q3!")3F!!3!63Zriab!$)
#ikL1J&"ZriaJ!2pLF2pb)$JZrjaf!$B%NS2LU-"(d@lrRL!(jUJZ!*PZri`JE[q
X-LlrRR!!-!'4`#e)rj5alJ!JC@!JE[q88UlrP"!3)'lrV&+Zrk`3J#"Zrj45V[q
8%"!JE[qX8UlrV"#!)'lrP&+Zrj33%#"Zrka5V[qX%)!`,[qD8flrQNT!C`$lhL"
Zrj45V[q8%"!JE[qX8UlrV"#!B0a@E[qD)'i!'0('-LlrRR!!-!%LE[qXNqi!)*!
!LC(!,8MrP$!ZrjTR*L"Z!"M4aV(Zrj4M'L"Zrj45V[q8%"!JE[qX8UlrV"#!8fl
rQQ$8,@i!)2q8-#lrQP0ZrjT+3'F!qfBJE[q88UlrP"!3)'lrV&+Zrk`3J'$F)'l
rV,(Zrl"R#("R28!!+'!8)'lrV*(Z!#!LEJ!F)SK#3$e!!#K-haci6PiJAdr[!#"
1d!"`2!!q)!!!H#!q-#!Q*L"i)$`p-c)!!$T$Efe`FQ9cFfP[EMT%C@0[EA"bCA0
cD@pZ-$-`-5jM!!!m!$iJ!!"i)$i`)#BQ)(JJ2$dc-J!!1N0[EA"bCA0cD@pZ1N4
PBfpYF(*PFh0TEfi`-c!a,Q-!!%j@rqK)jami2Li!##KZ!!`f,J!+F!!`!cJ(FJ!
b"*!!JA)"X)&[!!'d286rk$e$rqT5E[rS-#lrk,"Z!!TN(()!-J$5M#""%"!d"h)
!-J,5M#""%K#`!@3#B0C6E[rU-#lrkV"(Baab!$)!dS`J34!30!Gb!$)#dS`J34)
3X!&M!Q$B-#lrk,"ZrqTP!Q"b1#lrk(B!0J3Y3rr`eS`N3a)5F!!3!6e!rq`k,[r
UH!!i"5e%rr6BM#C%%"-8J"DZrqdJ,[r`d)$3VJ!3)%!`%$e!rq`L,[rddS(5VJ!
3)%%b%#3Zrr$8JY5Z!"!J3M#")Llrp0+"dUi!%#""-)"J!2mb-#lrkV"(CJC54f!
!r`3i"hB!0J3Y3rrieS`N3a)5F!!3!6e!rq`m,[rUHJ!k"Le&rrcDM#C&%"-8J"D
ZrqdJ,[rid)$3VJ!3)%!`%$e!rq`L,[rmdS(5VJ!3)%%b%#3ZrrM8JY5Z!"!J3M#
")Llrr0+"dUi!%#""-)!J,[rm)Llrq*!!J63Z!!Tb!$)#*#lrr&+#NS+`J@`H,bi
!%#m-2`Br"%kkrPa2l`!--#lrkP*!2J"J!2jF,bi!%#m-2bi!#M!ZrqT53$m!6VV
q0Nr[!!`pE[rU!!TJ!2ii60mFq%jH6R919[rN51FI1#4Z!!Jk,J!-*Qi!$LKZ!")
Y62r`)$`!!!%NfF!Y62rd3N!m!$B'YN9N,(J!1!-Y42rif)SJ4"!3)Llrq0+Zrr!
J34#!)#lrq0#!d+lrp#"!-)054Q$1,blrp#mZrr!r"8*R6VVpXNr[!!a#3$`!0JD
f4@35F!!`!p#Zrr!J3%S3CJ454Q$SF!!Y32rN0JDf4@3!!+K+3fFb)#lrj(J!1!-
Y42rmf+lrm#"%&""b!")#*Llrr&1$eUlrm#"$&K"d!"3$NS,MU#e!rq3d"R)!-J,
5V[r`)%%5%(!!%!%q!#eZrq6rl(!!,8$rk$!(8dG+3'FJ)#lrk11))Llrl(3"`S+
!J5e!rqJJ,[rXiSJY32rXB0Jd"R)!-J,5JG+Zrr3J36)3F!!`!H@!d)XJ3##ZrqK
54P+Zrq4J!2p860mFq%jH6R8LAb"IS#8ZJ'S#3TG1d5*I%Km`(dS"C`5R4Q!#SdB
ZL%l4)Pm5(c!I)&p+!@F%TNGJ!U*(6Y%!N!-+!$LJ!3!&!*!'!3!!!CH!!!'@J!!
!"8Y66e*8"eS!J!!F"()!&N&-8P3!#J#k399c-J!!!6j#6N4-!!%"5N019%`!!!&
L3dp%43!(!@j%394"!!!"cN4*9%`!$`(D4%a24`!%!TT'8N9'!!3#eNCPBA3!!!-
55801)`!%!aj*3dp1!!!$@P"*3e3!"!0Q8(0PG!!!!k*659T&!!!$VP088L!!!31
k8e45)`!!!p*KGA0d!!%$hQ0TBfi!!!2fC'0dBJ!""!*NE'Gi!!%%'QPME$J!!!3
bGQ9bF`!""$i!J2rr)!#3#)(rrb!!!"!!N!@#rrmJ!!!J!*!&KIrr*!!!-!%QHC3
!K[rr*!!!3!%q-iJ!Krrr)!!!8!#3"BMrrb!!!'!!N!3#!2rr)!!!FJ#3"!)"rrm
J!!##!*!%"!(rrb!!!*)!N!3%Vrrr!!!B3J#3"ai!!"K5!*!&J2rr!!!BGJ#3"!%
!rrm!!"LZ!*!%!3Mrrb!!'-i!N!ErrbJ"HpB!N!8"!*dF!#DC!6"rM!!#!+FF!+,
k!6"rY!!$!,%F!,q`!5N!j!!%!,XF!2e9!6"r`!!&!-8F!5lL!6"r[!!'!-mF!9!
-!6"rX!!(rrm!!A`!N!IrrbJ!G58!N!@!rrm!N!1L!*!&J[rr!!!"!*!'KIrr*!!
"AJ%T4F`!K[rr*!!"Y!%T!53!Krrr!!!#03#3"BMrr`!!!S8!N!@errmJ!!0G!*!
%!3Arrb!!!mm!N!3""rrr)!!Bk3#3"!%)rrmJ!"Q+!*!%!J$rr`!!"(`!N!3#!Ir
r!!!%ZJ#3"!2SrrmJ!!8'!*!%"!(rrb!!"4`!N!3%5`!Y"!!D,3%T4c!%Vrrr!!!
DI3#3"!%&!!!J!!@F!*!%!3F!15!!'VX!N!3"#!"+)!!De`#3"!2SrrmJ!!@q!*!
%"%X!CJ3!'[-"-(lX!)$rr`!!'``!N!@"rrm!!"XA!*!&J[rr!!!E)J#3"B2rr`!
!'bd!N!@%rrm!!"Xi!*!'rrm!!CCb!*!&J2rr!!!E3`#3"B(rr`!!(%F!N!@#rrm
!!"e,!*!&Jrrr!!!H6`#3"B6rr`!!(e-!N!3%5rrr"!!J9`%T!,J!J[rr!!!&fJ#
3"!2Srrm!!!Ep!*!%"%crr`!!$JX!N!3%6Irr!!!2a!#3"!41rrm!!"&p!*!&J2r
r!!!6#`#3"2q3"!!"Hr)!N!3#!!!()!!A3J#3"!)"!!iJ!"G5!*!&J2rr!!!AAJ#
3"h)!!#$5!*!&K2rr!!!K,3#3"!4,rrm%!#%a!6"rN!!""Irr!!!ARJ#3"!%)rrm
!!#*A!*!%!38!&`!!&mm!N!3"#!#"!!!LL`#3"B6rr`!!)T8!N!8"rrmJ!"IC!*!
&![rr)!!B(!#3"!C6G'&dGA-'F(*[EA"d#-3JFh9QCQPi"P0dBA4eF`j2GfjPFL"
bCA0[GA*MC3Y*ER0PFR3J4'PcDa"&H'PcG'PZCe"KFh0hEh*N'd9iDA0dD@jR8'&
cFhG[FQ3Y3A"`C@&bB@jMC3Y*ER0PFR3J4'PcD`j2GfjPFL"bCA0[GA*MC4Y&H'P
cG'PZCe"KFh0hEh*N,8&`F'9KFQ&ZBf8*8f9RE@9ZG#!a#90PCfePER3J-JP6C@G
YC@jd)$-*8f9RE@9ZG#!e#90PCfePER3J0JP6C@GYC@jd)$Cp2`:
Changes to tests/all.tcl.
1
2
3
4
5
6
7

8
9
10

11
12
13
14
15
16
17
1
2
3
4
5
6

7
8
9

10
11
12
13
14
15
16
17






-
+


-
+







# all.tcl --
#
# This file contains a top-level script to run all of the Tcl
# tests.  Execute it by invoking "source all.test" when running tcltest
# in this directory.
#
# Copyright (c) 1998-1999 by Scriptics Corporation.
# Copyright (c) 1998-2000 Ajuba Solutions.
# All rights reserved.
# 
# RCS: @(#) $Id: all.tcl,v 1.10 2000/04/10 17:18:56 ericm Exp $
# RCS: @(#) $Id: all.tcl,v 1.10.2.1 2000/07/27 01:39:20 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

set ::tcltest::testSingleFile false
Changes to tests/autoMkindex.tcl.
67
68
69
70
71
72
73









67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82







+
+
+
+
+
+
+
+
+
    ::proc $name $body $args
}
namespace eval ::buried {
    proc mycmd4 args {return "mycmd"}
    {my proc} mycmd5 args {return "mycmd"}
}
{::buried::my proc} mycmd6 args {return "another"}

# A correctly functioning [auto_import] won't choke when a child
# namespace [namespace import]s from its parent.
#
namespace eval ::parent::child {
    namespace import ::parent::*
}
proc ::parent::child::test {} {}

Changes to tests/autoMkindex.test.
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16
17
18
19











-
+







# Commands covered:  auto_mkindex auto_import
#
# This file contains tests related to autoloading and generating
# the autoloading index.
#
# Copyright (c) 1998  Lucent Technologies, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: autoMkindex.test,v 1.11 2000/04/10 17:18:57 ericm Exp $
# RCS: @(#) $Id: autoMkindex.test,v 1.11.2.1 2001/08/24 16:19:10 dgp Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

# temporarily copy the autoMkindex.tcl file from testsDirectory to
66
67
68
69
70
71
72
73

74
75
76
77
78
79
80
66
67
68
69
70
71
72

73
74
75
76
77
78
79
80







-
+







        set ::result ""
        foreach elem [lsort [array names auto_index]] {
            lappend ::result [list $elem $auto_index($elem)]
        }
    }
    namespace delete tcl_autoMkindex_tmp
    set ::result
} "{::buried::explicit $element} {::buried::inside $element} {{::buried::my proc} $element} {::buried::mycmd1 $element} {::buried::mycmd4 $element} {::buried::myproc $element} {::buried::pub_one $element} {::buried::pub_two $element} {::buried::relative $element} {::buried::under::neath $element} {::buried::within $element} {indented $element} {normal $element} {top $element}"
} "{::buried::explicit $element} {::buried::inside $element} {{::buried::my proc} $element} {::buried::mycmd1 $element} {::buried::mycmd4 $element} {::buried::myproc $element} {::buried::pub_one $element} {::buried::pub_two $element} {::buried::relative $element} {::buried::under::neath $element} {::buried::within $element} {::parent::child::test $element} {indented $element} {normal $element} {top $element}"


test autoMkindex-2.1 {commands on the autoload path can be imported} {
    file delete tclIndex
    auto_mkindex . autoMkindex.tcl
    set interp [interp create]
    set final [$interp eval {
134
135
136
137
138
139
140
141

142
143
144
145
146
147
148
134
135
136
137
138
139
140

141
142
143
144
145
146
147
148







-
+







    }
    namespace delete tcl_autoMkindex_tmp

    # Reset initCommands to avoid trashing other tests

    AutoMkindexTestReset
    set ::result
} "{::buried::explicit $element} {::buried::inside $element} {{::buried::my proc} $element} {::buried::mycmd1 $element} {::buried::mycmd2 $element} {::buried::mycmd4 $element} {::buried::myproc $element} {::buried::pub_one $element} {::buried::pub_two $element} {::buried::relative $element} {::buried::under::neath $element} {::buried::within $element} {indented $element} {mycmd3 $element} {normal $element} {top $element}"
} "{::buried::explicit $element} {::buried::inside $element} {{::buried::my proc} $element} {::buried::mycmd1 $element} {::buried::mycmd2 $element} {::buried::mycmd4 $element} {::buried::myproc $element} {::buried::pub_one $element} {::buried::pub_two $element} {::buried::relative $element} {::buried::under::neath $element} {::buried::within $element} {::parent::child::test $element} {indented $element} {mycmd3 $element} {normal $element} {top $element}"


test autoMkindex-3.3 {auto_mkindex_parser::command} {knownBug} {
    auto_mkindex_parser::command {buried::my proc} {name args} {
	variable index
	variable scriptFile
	puts "my proc $name"
Changes to tests/binary.test.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







# This file tests the tclBinary.c file and the "binary" Tcl command. 
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1997 by Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: binary.test,v 1.7 2000/04/10 17:18:57 ericm Exp $
# RCS: @(#) $Id: binary.test,v 1.7.2.1 2001/04/03 22:54:38 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

test binary-2.1 {DupByteArrayInternalRep} {
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
36
37
38
39
40
41
42

43
44
45
46
47
48
49







-








test binary-1.3 {Tcl_BinaryObjCmd: format error} {
    list [catch {binary f} msg] $msg
} {1 {wrong # args: should be "binary format formatString ?arg arg ...?"}}
test binary-1.4 {Tcl_BinaryObjCmd: format} {
    binary format ""
} {}



test binary-2.1 {Tcl_BinaryObjCmd: format} {
    list [catch {binary format a } msg] $msg
} {1 {not enough arguments for all format specifiers}}
test binary-2.2 {Tcl_BinaryObjCmd: format} {
    binary format a0 foo
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1459
1460
1461
1462
1463
1464
1465



















-
-
-
-
-
-
-
-
-
-
-
-
    catch {binary ""} result
    set result
} {bad option "": must be format or scan}

# cleanup
::tcltest::cleanupTests
return












Changes to tests/clock.test.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







# Commands covered:  clock
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1995-1998 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: clock.test,v 1.13 2000/04/10 17:18:57 ericm Exp $
# RCS: @(#) $Id: clock.test,v 1.13.2.4 2002/05/24 19:36:29 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

test clock-1.1 {clock tests} {
34
35
36
37
38
39
40
41

42
43
44
45

46
47
48
49
50


51
52
53
54
55
56
57
34
35
36
37
38
39
40

41
42
43
44

45
46
47
48


49
50
51
52
53
54
55
56
57







-
+



-
+



-
-
+
+







    after 10
    set end [clock clicks]
    expr "$end > $start"
} {1}
test clock-2.3 {clock clicks tests} {
    list [catch {clock clicks foo} msg] $msg
} {1 {bad switch "foo": must be -milliseconds}}
test clock-2.3 {clock clicks tests} {
test clock-2.4 {clock clicks tests} {
    expr [clock clicks -milliseconds]+1
    concat {}
} {}
test clock-2.2 {clock clicks tests, millisecond timing test} {
test clock-2.5 {clock clicks tests, millisecond timing test} {
    set start [clock clicks -milli]
    after 10
    set end [clock clicks -milli]
    # assume, even with slow interp'ing, the diff is less than 60 msecs
    expr {($end > $start) && (($end - $start) < 60)}
    # 60 msecs seems to be the max time slice under Windows 95/98
    expr {($end > $start) && (($end - $start) <= 60)}
} {1}

# clock format
test clock-3.1 {clock format tests} {unixOnly} {
    set clockval 657687766
    clock format $clockval -format {%a %b %d %I:%M:%S %p %Y} -gmt true
} {Sun Nov 04 03:02:46 AM 1990}
333
334
335
336
337
338
339





340
341
342
343
344
345
346
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351







+
+
+
+
+







    foreach i {91 92 93 94 95 96} {
      set dec1th [clock scan 12/1/$i -gmt 1]
      set monday [clock scan "monday 1 week ago" -base $dec1th -gmt 1]
      lappend res [clock format $monday -format %Y-%m-%d -gmt 1]
    }
    set res
} {1991-11-25 1992-11-30 1993-11-29 1994-11-28 1995-11-27 1996-11-25}
test clock-4.41 {ago with multiple relative units} {
    set base [clock scan "12/31/1999 00:00:00"]
    set res [clock scan "2 days 2 hours ago" -base $base]
    expr {$base - $res}
} 180000

# clock seconds
test clock-5.1 {clock seconds tests} {
    expr [clock seconds]+1
    concat {}
} {}
test clock-5.2 {clock seconds tests} {
409
410
411
412
413
414
415























416
417
418
419
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446








+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+



-
	    -format %m.%Y
} "07.2000"
test clock-7.3 {clock scan next monthname} {
    clock format [clock scan "next may" -base [clock scan "june 1, 2000"]] \
	    -format %m.%Y
} "05.2001"

# We use 5am PST, 31-12-1999 as the base for these scans because irrespective
# of your local timezone it should always give us times on December 31
set 5amPST 946645200
test clock-8.1 {clock scan midnight/gmt range bug 413397} {
    set fmt "%m/%d"
    list [clock format [clock scan year -base $5amPST -gmt 0] -format $fmt] \
	    [clock format [clock scan year -base $5amPST -gmt 1] -format $fmt]
} {12/31 12/31}

set ::tcltest::testConstraints(needPST) \
	[regexp {^(Pacific.*|P[DS]T)$} [clock format 1 -format %Z]]
test clock-9.1 {%s gmt testing} {needPST} {
    # We need PST to guarantee the difference value below.
    set s 100000
    set a [clock format $s -format %s -gmt 0]
    set b [clock format $s -format %s -gmt 1]
    # This should be the offset in seconds between current locale and GMT.
    # This didn't seem to be correctly on Windows until the fix for
    # Bug #559376, which fiddled with env(TZ) when -gmt 1 was used.
    # It's hard-coded to check P[SD]T now. (8 hours)
    set c [expr {$b-$a}]
} {28800}

# cleanup
::tcltest::cleanupTests
return

Changes to tests/cmdAH.test.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







# The file tests the tclCmdAH.c file.
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1996-1998 by Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: cmdAH.test,v 1.10 2000/04/10 17:18:57 ericm Exp $
# RCS: @(#) $Id: cmdAH.test,v 1.10.2.2 2001/10/17 19:29:25 das Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

global env
1170
1171
1172
1173
1174
1175
1176
1177

1178
1179
1180
1181
1182
1183
1184
1170
1171
1172
1173
1174
1175
1176

1177
1178
1179
1180
1181
1182
1183
1184







-
+







test cmdAH-20.3 {Tcl_FileObjCmd: atime} {
    string tolower [list [catch {file atime _bogus_} msg] \
	    $msg $errorCode]
} {1 {could not read "_bogus_": no such file or directory} {posix enoent {no such file or directory}}}
test cmdAH-20.4 {Tcl_FileObjCmd: atime} {
    list [catch {file atime $file notint} msg] $msg
} {1 {expected integer but got "notint"}}
test cmdAH-20.5 {Tcl_FileObjCmd: atime touch} {
test cmdAH-20.5 {Tcl_FileObjCmd: atime touch} {unixOrPc} {
    if {[string equal $tcl_platform(platform) "windows"]} {
	set old [pwd]
	cd $::tcltest::temporaryDirectory
	if {![string equal "NTFS" [testvolumetype]]} {
	    # Windows FAT doesn't understand atime, but NTFS does
	    # May also fail for Windows on NFS mounted disks
	    cd $old
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
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







+
+
+
+
+
+
+





+
-
-
-
+
+
+


-
-
-
-
+
+
+
+
+
+
+
+
-
-
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







    list [catch {file t x} msg] $msg
} {1 {ambiguous option "t": must be atime, attributes, channels, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, lstat, mtime, mkdir, nativename, owned, pathtype, readable, readlink, rename, rootname, size, split, stat, tail, type, volumes, or writable}}
test cmdAH-30.8 {Tcl_FileObjCmd: error conditions} {
    list [catch {file dirname ~woohgy} msg] $msg
} {1 {user "woohgy" doesn't exist}}

# channels
# In testing 'file channels', we need to make sure that a channel
# created in one interp isn't visible in another.

interp create simpleInterp
interp create -safe safeInterp
interp c
safeInterp expose file file

test cmdAH-31.1 {Tcl_FileObjCmd: channels, too many args} {
    list [catch {file channels a b} msg] $msg
} {1 {wrong # args: should be "file channels ?pattern?"}}
test cmdAH-31.2 {Tcl_FileObjCmd: channels, too many args} {
    # Normal interps start out with only the standard channels
    file chan
} {stderr stdout stdin}
test cmdAH-31.3 {Tcl_FileObjCmd: channels, too many args} {
    lsort [simpleInterp eval [list file chan]]
} [lsort {stderr stdout stdin}]
test cmdAH-31.3 {Tcl_FileObjCmd: channels, globbing} {
    string equal [file channels] [file channels *]
} {1}
test cmdAH-31.4 {Tcl_FileObjCmd: channels} {
    set old [file channels gorp.file]
    set f [open gorp.file w]
    set new [file channels file*]
test cmdAH-31.4 {Tcl_FileObjCmd: channels, globbing} {
    lsort [file channels std*]
} [lsort {stdout stderr stdin}]

set newFileId [open gorp.file w]

test cmdAH-31.5 {Tcl_FileObjCmd: channels} {
    set res [file channels $newFileId]
    close $f
    string equal $f $new
    string equal $newFileId $res
} {1}
test cmdAH-31.6 {Tcl_FileObjCmd: channels in other interp} {
    # Safe interps start out with no channels
    safeInterp eval [list file channels]
} {}
test cmdAH-31.7 {Tcl_FileObjCmd: channels in other interp} {
    list [catch {safeInterp eval [list puts $newFileId "hello"]} msg] $msg
} [list 1 "can not find channel named \"$newFileId\""]

interp share {} $newFileId safeInterp
interp share {} stdout safeInterp

test cmdAH-31.8 {Tcl_FileObjCmd: channels in other interp} {
    # $newFileId should now be visible in both interps
    list [file channels $newFileId] \
	    [safeInterp eval [list file channels $newFileId]]
} [list $newFileId $newFileId]
test cmdAH-31.9 {Tcl_FileObjCmd: channels in other interp} {
    lsort [safeInterp eval [list file channels]]
} [lsort [list stdout $newFileId]]
test cmdAH-31.10 {Tcl_FileObjCmd: channels in other interp} {
    # we can now write to $newFileId from slave
    safeInterp eval [list puts $newFileId "hello"]
} {}

interp transfer {} $newFileId safeInterp

test cmdAH-31.11 {Tcl_FileObjCmd: channels in other interp} {
    # $newFileId should now be visible only in safeInterp
    list [file channels $newFileId] \
	    [safeInterp eval [list file channels $newFileId]]
} [list {} $newFileId]
test cmdAH-31.12 {Tcl_FileObjCmd: channels in other interp} {
    lsort [safeInterp eval [list file channels]]
} [lsort [list stdout $newFileId]]
test cmdAH-31.13 {Tcl_FileObjCmd: channels in other interp} {
    safeInterp eval [list close $newFileId]
    safeInterp eval [list file channels]
} {stdout}

# This shouldn't work, but just in case a test above failed...
catch {close $newFileId}

interp delete safeInterp
interp delete simpleInterp

# cleanup
catch {testsetplatform $platform}
catch {unset platform}

# Tcl_ForObjCmd is tested in for.test

Changes to tests/cmdIL.test.
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10

11
12
13
14
15
16
17
18










-
+







# This file contains a collection of tests for the procedures in the
# file tclCmdIL.c.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: cmdIL.test,v 1.12 2000/04/10 17:18:57 ericm Exp $
# RCS: @(#) $Id: cmdIL.test,v 1.12.2.2 2001/10/08 15:50:24 dkf Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

test cmdIL-1.1 {Tcl_LsortObjCmd procedure} {
78
79
80
81
82
83
84






















85
86
87
88
89
90
91
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







test cmdIL-1.22 {Tcl_LsortObjCmd procedure, unique sort} {
    lsort -integer -unique {3 1 2 3 1 4 3}
} {1 2 3 4}
test cmdIL-1.23 {Tcl_LsortObjCmd procedure, unique sort with index} {
    # lsort -unique should return the last unique item
    lsort -unique -index 0 {{a b} {c b} {a c} {d a}}
} {{a c} {c b} {d a}}
test cmdIL-1.24 {Tcl_LsortObjCmd procedure, order of -index and -command} {
    catch {rename 1 ""}
    proc testcmp {a b} {return [string compare $a $b]}
    set l [list [list a b] [list c d]]
    set result [list [catch {lsort -command testcmp -index 1 $l} msg] $msg]
    rename testcmp ""
    set result
} [list 0 [list [list a b] [list c d]]]
test cmdIL-1.25 {Tcl_LsortObjCmd procedure, order of -index and -command} {
    catch {rename 1 ""}
    proc testcmp {a b} {return [string compare $a $b]}
    set l [list [list a b] [list c d]]
    set result [list [catch {lsort -index 1 -command testcmp $l} msg] $msg]
    rename testcmp ""
    set result
} [list 0 [list [list a b] [list c d]]]
# Note that the required order only exists in the end-1'th element;
# indexing using the end element or any fixed offset from the start
# will not work...
test cmdIL-1.26 {Tcl_LsortObjCmd procedure, offset indexing from end} {
    lsort -index end-1 {{a 1 e i} {b 2 3 f g} {c 4 5 6 d h}}
} {{c 4 5 6 d h} {a 1 e i} {b 2 3 f g}}

# Can't think of any good tests for the MergeSort and MergeLists
# procedures, except a bunch of random lists to sort.

test cmdIL-2.1 {MergeSort and MergeLists procedures} {
    set result {}
    set r 1435753299
Changes to tests/cmdMZ.test.
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
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













-
+





+
+












-
+
+
+
+







# The tests in this file cover the procedures in tclCmdMZ.c.
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1994 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: cmdMZ.test,v 1.7 2000/04/10 17:18:57 ericm Exp $
# RCS: @(#) $Id: cmdMZ.test,v 1.7.2.2 2001/10/17 19:29:25 das Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}
set tcltest::testConstraints(notLinux) \
	[expr {![string equal Linux $tcl_platform(os)]}]

# Tcl_PwdObjCmd

test cmdMZ-1.1 {Tcl_PwdObjCmd} {
    list [catch {pwd a} msg] $msg
} {1 {wrong # args: should be "pwd"}}
test cmdMZ-1.2 {Tcl_PwdObjCmd: simple pwd} {
    catch pwd
} 0
test cmdMZ-1.3 {Tcl_PwdObjCmd: simple pwd} {
    expr [string length pwd]>0
} 1
test cmdMZ-1.4 {Tcl_PwdObjCmd: failure} {unixOnly} {
test cmdMZ-1.4 {Tcl_PwdObjCmd: failure} {unixOnly notLinux} {
    # We don't want this test to run on Linux because they do a
    # permissions caching trick which causes this to fail.  The
    # caching is incorrect, but we have no control over that.
    file delete -force foo
    file mkdir foo
    set cwd [pwd]
    cd foo
    file attr . -permissions 000
    set result [list [catch {pwd} msg] $msg]
    cd $cwd
69
70
71
72
73
74
75
76

77
78
79
80
81
82
83
74
75
76
77
78
79
80

81
82
83
84
85
86
87
88







-
+







# Tcl_SourceObjCmd

test cmdMZ-3.1 {Tcl_SourceObjCmd: error conditions} {macOnly} {
    list [catch {source} msg] $msg
} {1 {wrong # args: should be "source fileName" or "source -rsrc name ?fileName?" or "source -rsrcid id ?fileName?"}}
test cmdMZ-3.2 {Tcl_SourceObjCmd: error conditions} {macOnly} {
    list [catch {source a b} msg] $msg
} {1 {wrong # args: should be "source fileName" or "source -rsrc name ?fileName?" or "source -rsrcid id ?fileName?"}}
} {1 {bad argument: should be "source fileName" or "source -rsrc name ?fileName?" or "source -rsrcid id ?fileName?"}}
test cmdMZ-3.3 {Tcl_SourceObjCmd: error conditions} {unixOrPc} {
    list [catch {source} msg] $msg
} {1 {wrong # args: should be "source fileName"}}
test cmdMZ-3.4 {Tcl_SourceObjCmd: error conditions} {unixOrPc} {
    list [catch {source a b} msg] $msg
} {1 {wrong # args: should be "source fileName"}}
test cmdMZ-3.5 {Tcl_SourceObjCmd: error in script} {
Changes to tests/compile.test.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







# This file contains tests for the file tclCompile.c.
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1997 by Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: compile.test,v 1.8 2000/04/10 17:18:58 ericm Exp $
# RCS: @(#) $Id: compile.test,v 1.8.2.1 2002/03/15 20:10:02 msofer Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

# The following tests are very incomplete, although the rest of the
186
187
188
189
190
191
192








193
194
195
196
197
198
199
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207







+
+
+
+
+
+
+
+







    set x {{0}}
    set y 0
    while {$y < 100} {
	if !$x {incr y}
    }
} {}

# Test to catch buffer overrun in TclCompileTokens from bug 530320
# Backported from Tcl8.4 - hence the non-sequential numbering.
test compile-12.3 {check for a buffer overrun} {
    proc crash {} {
	puts $array([expr {a+2}])
    }
    list [catch crash msg] $msg
} {1 {syntax error in expression "a+2"}}


# cleanup
catch {rename p ""}
catch {namespace delete test_ns_compile}
catch {unset x}
catch {unset y}
Changes to tests/encoding.test.
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10

11
12
13
14
15
16
17
18










-
+







# This file contains a collection of tests for tclEncoding.c
# Sourcing this file into Tcl runs the tests and generates output for
# errors.  No output means no errors were found.
#
# Copyright (c) 1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: encoding.test,v 1.8 2000/04/10 17:18:58 ericm Exp $
# RCS: @(#) $Id: encoding.test,v 1.8.2.1 2002/03/02 05:00:39 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

proc toutf {args} {
191
192
193
194
195
196
197












198
199
200
201
202
203
204
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







+
+
+
+
+
+
+
+
+
+
+
+







    set f [open dummy r]
    fconfigure $f -translation binary -encoding iso8859-1
    set x [read $f]
    close $f
    file delete dummy
    set x
} "ab\x8c\xc1g"

proc viewable {str} {
    set res ""
    foreach c [split $str {}] {
	if {[string is print $c]} {
	    append res $c
	} else {
	    append res "\\u[format %4.4x [scan $c %c]]"
	}
    }
    return "$str ($res)"
}

test encoding-11.1 {LoadEncodingFile: unknown encoding} {testencoding} {
    set system [encoding system]
    set path [testencoding path]
    encoding system iso8859-1
    testencoding path {}
    set x [list [catch {encoding convertto jis0208 \u4e4e} msg] $msg]
212
213
214
215
216
217
218
219
220





221
222
223
224
225
226
227
224
225
226
227
228
229
230


231
232
233
234
235
236
237
238
239
240
241
242







-
-
+
+
+
+
+







test encoding-11.3 {LoadEncodingFile: double-byte} {
    encoding convertfrom jis0208 8C
} "\u4e4e"
test encoding-11.4 {LoadEncodingFile: multi-byte} {
    encoding convertfrom shiftjis \x8c\xc1
} "\u4e4e"
test encoding-11.5 {LoadEncodingFile: escape file} {
    encoding convertto iso2022 \u4e4e
} "\x1b(B\x1b$@8C"
    viewable [encoding convertto iso2022 \u4e4e]
} [viewable "\x1b(B\x1b\$B8C"]
test encoding-11.5.1 {LoadEncodingFile: escape file} {
    viewable [encoding convertto iso2022-jp \u4e4e]
} [viewable "\x1b(B\x1b\$B8C"]
test encoding-11.6 {LoadEncodingFile: invalid file} {testencoding} {
    set system [encoding system]
    set path [testencoding path]
    encoding system identity
    testencoding path tmp
    file mkdir tmp/encoding
    set f [open tmp/encoding/splat.enc w]
258
259
260
261
262
263
264
265
266


267
268
269
270
271
272
273
273
274
275
276
277
278
279


280
281
282
283
284
285
286
287
288







-
-
+
+







test encoding-12.5 {LoadTableEncoding: symbol encoding} {
    set x [encoding convertto symbol \u3b3]
    append x [encoding convertto symbol \u67]
    append x [encoding convertfrom symbol \x67]
} "\x67\x67\u3b3"

test encoding-13.1 {LoadEscapeTable} {
    set x [encoding convertto iso2022 ab\u4e4e\u68d9g]
} "\x1b(Bab\x1b$@8C\x1b$\(DD%\x1b(Bg"
    viewable [set x [encoding convertto iso2022 ab\u4e4e\u68d9g]]
} [viewable "\x1b(Bab\x1b\$B8C\x1b\$\(DD%\x1b(Bg"]

test encoding-14.1 {BinaryProc} {
    encoding convertto identity \x12\x34\x56\xff\x69
} "\x12\x34\x56\xc3\xbf\x69"

test encoding-15.1 {UtfToUtfProc} {
    encoding convertto utf-8 \xa3
290
291
292
293
294
295
296





















































297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371





















+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







-
-
-
-
-
-
-
-
-
-
-
-
-
-
} {}

test encoding-21.1 {EscapeToUtfProc} {
} {}

test encoding-22.1 {EscapeFromUtfProc} {
} {}

set ::iso2022encData "\u001b\$B;d\$I\$b\$G\$O!\"%A%C%W\$49XF~;~\$K\$4EPO?\$\$\$?\$@\$\$\$?\$4=;=j\$r%-%c%C%7%e%\"%&%H\$N:]\$N\u001b(B
\u001b\$B>.@Z<jAwIU@h\$H\$7\$F;HMQ\$7\$F\$*\$j\$^\$9!#62\$lF~\$j\$^\$9\$,!\"@5\$7\$\$=;=j\$r\$4EPO?\$7\$J\$*\u001b(B
\u001b\$B\$*4j\$\$\$\$\$?\$7\$^\$9!#\$^\$?!\"BgJQ62=L\$G\$9\$,!\"=;=jJQ99\$N\$\"\$H!\"F|K\\8l%5!<%S%9It!J\u001b(B
casino_japanese@___.com \u001b\$B!K\$^\$G\$4=;=jJQ99:Q\$NO\"Mm\$r\$\$\$?\$@\$1\$J\$\$\$G\u001b(B
\u001b\$B\$7\$g\$&\$+!)\u001b(B"

set ::iso2022uniData [encoding convertfrom iso2022-jp $::iso2022encData]
set ::iso2022uniData2 "\u79c1\u3069\u3082\u3067\u306f\u3001\u30c1\u30c3\u30d7\u3054\u8cfc\u5165\u6642\u306b\u3054\u767b\u9332\u3044\u305f\u3060\u3044\u305f\u3054\u4f4f\u6240\u3092\u30ad\u30e3\u30c3\u30b7\u30e5\u30a2\u30a6\u30c8\u306e\u969b\u306e
\u5c0f\u5207\u624b\u9001\u4ed8\u5148\u3068\u3057\u3066\u4f7f\u7528\u3057\u3066\u304a\u308a\u307e\u3059\u3002\u6050\u308c\u5165\u308a\u307e\u3059\u304c\u3001\u6b63\u3057\u3044\u4f4f\u6240\u3092\u3054\u767b\u9332\u3057\u306a\u304a
\u304a\u9858\u3044\u3044\u305f\u3057\u307e\u3059\u3002\u307e\u305f\u3001\u5927\u5909\u6050\u7e2e\u3067\u3059\u304c\u3001\u4f4f\u6240\u5909\u66f4\u306e\u3042\u3068\u3001\u65e5\u672c\u8a9e\u30b5\u30fc\u30d3\u30b9\u90e8\uff08
\u0063\u0061\u0073\u0069\u006e\u006f\u005f\u006a\u0061\u0070\u0061\u006e\u0065\u0073\u0065\u0040\u005f\u005f\u005f\u002e\u0063\u006f\u006d\u0020\uff09\u307e\u3067\u3054\u4f4f\u6240\u5909\u66f4\u6e08\u306e\u9023\u7d61\u3092\u3044\u305f\u3060\u3051\u306a\u3044\u3067
\u3057\u3087\u3046\u304b\uff1f"

set fid [open iso2022.txt w]
fconfigure $fid -encoding binary
puts -nonewline $fid $::iso2022encData
close $fid

test encoding-23.2 {iso2022-jp escape encoding test} {
    string equal $::iso2022uniData $::iso2022uniData2
} 1
test encoding-23.2 {iso2022-jp escape encoding test} {
    # This checks that 'gets' isn't resetting the encoding inappropriately.
    # [Bug #523988]
    set fid [open iso2022.txt r]
    fconfigure $fid -encoding iso2022-jp
    set out ""
    set count 0
    while {[set num [gets $fid line]] >= 0} {
	if {$count} {
	    incr count 1 ; # account for newline
	    append out \n
	}
	append out $line
	incr count $num
    }
    close $fid
    if {[string compare $::iso2022uniData $out]} {
	return -code error "iso2022-jp read in doesn't match original"
    }
    list $count $out
} [list [string length $::iso2022uniData] $::iso2022uniData]
test encoding-23.3 {iso2022-jp escape encoding test} {
    # read $fis <size> reads size in chars, not raw bytes.
    set fid [open iso2022.txt r]
    fconfigure $fid -encoding iso2022-jp
    set data [read $fid 50]
    close $fid
    set data
} [string range $::iso2022uniData 0 49] ; # 0 .. 49 inclusive == 50

::tcltest::removeFile iso2022.txt

# EscapeFreeProc, GetTableEncoding, unilen
# are fully tested by the rest of this file

# cleanup
::tcltest::cleanupTests
return














Changes to tests/exec.test.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







# Commands covered:  exec
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1991-1994 The Regents of the University of California.
# Copyright (c) 1994-1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: exec.test,v 1.8 2000/04/10 17:18:58 ericm Exp $
# RCS: @(#) $Id: exec.test,v 1.8.2.1 2001/10/17 19:29:25 das Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

# All tests require the "exec" command.
224
225
226
227
228
229
230

231

232
233
234
235
236
237
238
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240







+

+







    puts $f "Line 3"
    close $f
    exec $::tcltest::tcltest cat gorp.file
} "Line 1\nfoo bar\nxyzzy\nLine 3"

# I/O redirection: input from file.

if { [set ::tcltest::testConstraints(execCommandExists)] } {
exec $::tcltest::tcltest echo "Just a few thoughts" > gorp.file
}
test exec-5.1 {redirecting input from file} {execCommandExists stdio} {
    exec $::tcltest::tcltest cat < gorp.file
} {Just a few thoughts}
test exec-5.2 {redirecting input from file} {execCommandExists stdio} {
    exec $::tcltest::tcltest cat | $::tcltest::tcltest cat < gorp.file
} {Just a few thoughts}
test exec-5.3 {redirecting input from file} {execCommandExists stdio} {
428
429
430
431
432
433
434

435

436
437
438
439
440
441
442
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446







+

+







    close $f
    string compare "foo" [exec $::tcltest::tcltest gorp.file]
} 0

# Make sure that background commands are properly reaped when
# they eventually die.

if { [set ::tcltest::testConstraints(execCommandExists)] } {
exec $::tcltest::tcltest sleep 3
}
test exec-12.1 {reaping background processes} \
	{execCommandExists stdio unixOnly nonPortable} {
    for {set i 0} {$i < 20} {incr i} {
	exec echo foo > /dev/null &
    }
    exec sleep 1
    catch {exec ps | fgrep "echo foo" | fgrep -v fgrep | wc} msg
Changes to tests/execute.test.
10
11
12
13
14
15
16
17

18
19
20
21
22
23
24
10
11
12
13
14
15
16

17
18
19
20
21
22
23
24







-
+







#
# Copyright (c) 1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: execute.test,v 1.8 2000/04/10 17:18:58 ericm Exp $
# RCS: @(#) $Id: execute.test,v 1.8.2.1 2001/04/03 22:54:38 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

catch {eval namespace delete [namespace children :: test_ns_*]}
578
579
580
581
582
583
584






585
586
587
588
589
590
591
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597







+
+
+
+
+
+







        set x {}
        $x
        append x { }
        $x
    }
    p
} {}

test execute-6.2 {Evaluate an expression in a variable; compile the first time, do not the second} {
    set w {3*5}
    proc a {obj} {expr $obj}
    set res "[a $w]:[a $w]"
} {15:15}

# cleanup
catch {eval namespace delete [namespace children :: test_ns_*]}
catch {rename foo ""}
catch {rename p ""}
catch {rename {} ""}
catch {rename { } ""}
Changes to tests/expr-old.test.
9
10
11
12
13
14
15
16

17
18
19
20
21
22
23
9
10
11
12
13
14
15

16
17
18
19
20
21
22
23







-
+







# Copyright (c) 1991-1994 The Regents of the University of California.
# Copyright (c) 1994-1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: expr-old.test,v 1.8 2000/04/10 17:18:58 ericm Exp $
# RCS: @(#) $Id: expr-old.test,v 1.8.2.1 2002/04/18 13:10:27 msofer Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

if {([catch {expr T1()} msg] == 1) && ($msg == {unknown math function "T1"})} {
900
901
902
903
904
905
906







907
908
909
910
911
912
913
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920







+
+
+
+
+
+
+







test expr-old-36.9 {ExprLooksLikeInt procedure} {
    list [catch {expr 24E1} msg] $msg
} {0 240.0}
test expr-old-36.10 {ExprLooksLikeInt procedure} {nonPortable unixOnly} {
    list [catch {expr 78e} msg] $msg
} {1 {syntax error in expression "78e"}}

# test for [Bug #542588]
test expr-old-36.11 {ExprLooksLikeInt procedure} {
    # define a "too large integer"; this one works also for 64bit arith
    set x 665802003400000000000000
    list [catch {expr {$x+1}} msg] $msg
} {1 {can't use integer value too large to represent as operand of "+"}}

if {[info commands testexprlong] == {}} {
    puts "This application hasn't been compiled with the \"testexprlong\""
    puts "command, so I can't test Tcl_ExprLong etc."
} else {
test expr-old-37.1 {Check that Tcl_ExprLong doesn't modify interpreter result if no error} {
    testexprlong
} {This is a result: 5}
Changes to tests/fCmd.test.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







# This file tests the tclFCmd.c file.
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1996-1997 Sun Microsystems, Inc.
# Copyright (c) 1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: fCmd.test,v 1.8 2000/04/10 17:18:59 ericm Exp $
# RCS: @(#) $Id: fCmd.test,v 1.8.2.1 2001/04/03 22:54:38 hobbs Exp $
#

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

505
506
507
508
509
510
511
512

513
514
515
516
517


518
519
520
521
522
523
524
505
506
507
508
509
510
511

512
513
514
515

516
517
518
519
520
521
522
523
524
525







-
+



-

+
+







    file rename tf1 /tmp
    glob tf* /tmp/tf1
} {/tmp/tf1}
test fCmd-6.20 {CopyRenameOneFile: errno == EXDEV} {pcOnly} {
    catch {file delete -force c:/tcl8975@ d:/tcl8975@}
    file mkdir c:/tcl8975@
    if [catch {file rename c:/tcl8975@ d:/}] {
	list d:/tcl8975@
	set msg d:/tcl8975@
    } else {
	set msg [glob c:/tcl8975@ d:/tcl8975@]
	file delete -force d:/tcl8975@
	set msg
    }
    file delete -force c:/tcl8975@
    set msg
} {d:/tcl8975@}
test fCmd-6.21 {CopyRenameOneFile: copy/rename: S_ISDIR(source)} \
	{unixOnly notRoot} {
    cleanup /tmp
    file mkdir td1
    file rename td1 /tmp
    glob td* /tmp/td*
Changes to tests/fileName.test.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







# This file tests the filename manipulation routines.
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1995-1996 Sun Microsystems, Inc.
# Copyright (c) 1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: fileName.test,v 1.8 2000/04/10 17:18:59 ericm Exp $
# RCS: @(#) $Id: fileName.test,v 1.8.2.1 2001/10/17 19:29:25 das Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

if {[info commands testsetplatform] == {}} {
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
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







-
+


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+





-
+


+
+
+
+
+
+
+
+
+
+





-
+



+

















-
+


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+





-
-
+
+
+






-
+



+







test filename-11.16 {Tcl_GlobCmd} {
    list [catch {glob globTest} msg] $msg
} {0 globTest}

set globname "globTest"
set horribleglobname "glob\[\{Test"

test filename-11.17 {Tcl_GlobCmd} {
test filename-11.17 {Tcl_GlobCmd} {unixOrPc} {
    list [catch {lsort [glob -directory $globname *]} msg] $msg
} [list 0 [lsort [list [file join $globname a1] [file join $globname a2]\
	[file join $globname a3]\
	[file join $globname "weird name.c"]\
	[file join $globname x,z1.c]\
	[file join $globname x1.c]\
	[file join $globname y1.c] [file join $globname z1.c]]]]
test filename-11.17.1 {Tcl_GlobCmd} {macOnly} {
    list [catch {lsort [glob -directory $globname *]} msg] $msg
} [list 0 [lsort [list [file join $globname a1] [file join $globname a2]\
        [file join $globname .1]\
	[file join $globname a3]\
	[file join $globname "weird name.c"]\
	[file join $globname x,z1.c]\
	[file join $globname x1.c]\
	[file join $globname y1.c] [file join $globname z1.c]]]]
test filename-11.18 {Tcl_GlobCmd}        [file join $globname .1]\
 {
    list [catch {lsort [glob -path $globname/ *]} msg] $msg
} [list 0 [lsort [list [file join $globname a1] [file join $globname a2]\
	[file join $globname a3]\
	[file join $globname "weird name.c"]\
	[file join $globname x,z1.c]\
	[file join $globname x1.c]\
	[file join $globname y1.c] [file join $globname z1.c]]]]
test filename-11.18 {Tcl_GlobCmd} {
test filename-11.18.1 {Tcl_GlobCmd} {macOnly} {
    list [catch {lsort [glob -path $globname/ *]} msg] $msg
} [list 0 [lsort [list [file join $globname a1] [file join $globname a2]\
        [file join $globname .1]\
	[file join $globname a3]\
	[file join $globname "weird name.c"]\
	[file join $globname x,z1.c]\
	[file join $globname x1.c]\
	[file join $globname y1.c] [file join $globname z1.c]]]]
test filename-11.19 {Tcl_GlobCmd} {unixOrPc} {
    list [catch {lsort [glob -join -path \
	    [string range $globname 0 5] * *]} msg] $msg
} [list 0 [lsort [list [file join $globname a1] [file join $globname a2]\
	[file join $globname a3]\
	[file join $globname "weird name.c"]\
	[file join $globname x,z1.c]\
	[file join $globname x1.c]\
	[file join $globname y1.c] [file join $globname z1.c]]]]
test filename-11.19 {Tcl_GlobCmd} {
test filename-11.19.1 {Tcl_GlobCmd} {macOnly} {
    list [catch {lsort [glob -join -path \
	    [string range $globname 0 5] * *]} msg] $msg
} [list 0 [lsort [list [file join $globname a1] [file join $globname a2]\
        [file join $globname .1]\
	[file join $globname a3]\
	[file join $globname "weird name.c"]\
	[file join $globname x,z1.c]\
	[file join $globname x1.c]\
	[file join $globname y1.c] [file join $globname z1.c]]]]
test filename-11.20 {Tcl_GlobCmd} {
    list [catch {lsort [glob -type d -dir $globname *]} msg] $msg
} [list 0 [lsort [list [file join $globname a1]\
	[file join $globname a2]\
	[file join $globname a3]]]]
test filename-11.21 {Tcl_GlobCmd} {
    list [catch {lsort [glob -type d -path $globname *]} msg] $msg
} [list 0 [lsort [list $globname]]]

file rename globTest $horribleglobname
set globname $horribleglobname

test filename-11.22 {Tcl_GlobCmd} {
test filename-11.22 {Tcl_GlobCmd} {unixOrPc} {
    list [catch {lsort [glob -dir $globname *]} msg] $msg
} [list 0 [lsort [list [file join $globname a1] [file join $globname a2]\
	[file join $globname a3]\
	[file join $globname "weird name.c"]\
	[file join $globname x,z1.c]\
	[file join $globname x1.c]\
	[file join $globname y1.c] [file join $globname z1.c]]]]
test filename-11.22.1 {Tcl_GlobCmd} {macOnly} {
    list [catch {lsort [glob -dir $globname *]} msg] $msg
} [list 0 [lsort [list [file join $globname a1] [file join $globname a2]\
        [file join $globname .1]\
	[file join $globname a3]\
	[file join $globname "weird name.c"]\
	[file join $globname x,z1.c]\
	[file join $globname x1.c]\
	[file join $globname y1.c] [file join $globname z1.c]]]]
test filename-11.23 {Tcl_GlobCmd} {unixOrPc} {
    list [catch {lsort [glob -path $globname/ *]} msg] $msg
} [list 0 [lsort [list [file join $globname a1] [file join $globname a2]\
	[file join $globname a3]\
	[file join $globname "weird name.c"]\
	[file join $globname x,z1.c]\
	[file join $globname x1.c]\
	[file join $globname y1.c] [file join $globname z1.c]]]]
test filename-11.23.1 {Tcl_GlobCmd} {macOnly} {
    list [catch {lsort [glob -path $globname/ *]} msg] $msg
} [list 0 [lsort [list [file join $globname a1] [file join $globname a2]\
        [file join $globname .1]\
	[file join $globname a3]\
	[file join $globname "weird name.c"]\
	[file join $globname x,z1.c]\
	[file join $globname x1.c]\
	[file join $globname y1.c] [file join $globname z1.c]]]]
test filename-11.23 {Tcl_GlobCmd} {
    list [catch {lsort [glob -path $globname/ *]} msg] $msg
test filename-11.24 {Tcl_GlobCmd} {unixOrPc} {
    list [catch {lsort [glob -join -path \
	    [string range $globname 0 5] * *]} msg] $msg
} [list 0 [lsort [list [file join $globname a1] [file join $globname a2]\
	[file join $globname a3]\
	[file join $globname "weird name.c"]\
	[file join $globname x,z1.c]\
	[file join $globname x1.c]\
	[file join $globname y1.c] [file join $globname z1.c]]]]
test filename-11.24 {Tcl_GlobCmd} {
test filename-11.24.1 {Tcl_GlobCmd} {macOnly} {
    list [catch {lsort [glob -join -path \
	    [string range $globname 0 5] * *]} msg] $msg
} [list 0 [lsort [list [file join $globname a1] [file join $globname a2]\
        [file join $globname .1]\
	[file join $globname a3]\
	[file join $globname "weird name.c"]\
	[file join $globname x,z1.c]\
	[file join $globname x1.c]\
	[file join $globname y1.c] [file join $globname z1.c]]]]
test filename-11.25 {Tcl_GlobCmd} {
    list [catch {lsort [glob -type d -dir $globname *]} msg] $msg
1394
1395
1396
1397
1398
1399
1400
1401

1402
1403








1404
1405
1406
1407
1408
1409
1410
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







-
+


+
+
+
+
+
+
+
+







} {1 {no files matched glob patterns "goo/* x*z foo?q"}}
test filename-14.23 {slash globbing} {unixOrPc} {
    glob /
} /
test filename-14.24 {slash globbing} {pcOnly} {
    glob {\\}
} /
test filename-14.25 {type specific globbing} {
test filename-14.25 {type specific globbing} {unixOrPc} {
    list [catch {lsort [glob -dir globTest -types f *]} msg] $msg
} [list 0 [lsort [list \
	[file join $globname "weird name.c"]\
	[file join $globname x,z1.c]\
	[file join $globname x1.c]\
	[file join $globname y1.c] [file join $globname z1.c]]]]
test filename-14.25.1 {type specific globbing} {macOnly} {
    list [catch {lsort [glob -dir globTest -types f *]} msg] $msg
} [list 0 [lsort [list \
        [file join $globname .1]\
	[file join $globname "weird name.c"]\
	[file join $globname x,z1.c]\
	[file join $globname x1.c]\
	[file join $globname y1.c] [file join $globname z1.c]]]]
test filename-14.26 {type specific globbing} {
    list [catch {glob -nocomplain -dir globTest -types {readonly} *} msg] $msg
} [list 0 {}]
1522
1523
1524
1525
1526
1527
1528
1529

1530
1531
1532
1533
1534
1535
1536
1587
1588
1589
1590
1591
1592
1593

1594
1595
1596
1597
1598
1599
1600
1601







-
+







    close [open globTest/x1.BAT w]
    close [open globTest/y1.Bat w]
    close [open globTest/z1.bat w]
    glob "\\\\\\\\[info hostname]\\\\c\\\\*Test"
} //[info hostname]/c/globTest

# cleanup
file delete -force //[info hostname]/c/globTest
catch {file delete -force //[info hostname]/c/globTest}
cd $temp
file delete -force globTest
set env(HOME) $oldhome
testsetplatform $platform
catch {unset oldhome platform temp result}
::tcltest::cleanupTests
return
Changes to tests/foreach.test.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







# Commands covered:  foreach, continue, break
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1994-1997 Sun Microsystems, Inc.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: foreach.test,v 1.6 2000/04/10 17:18:59 ericm Exp $
# RCS: @(#) $Id: foreach.test,v 1.6.2.1 2001/08/07 15:41:20 msofer Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

catch {unset a}
206
207
208
209
210
211
212









213
214
215
216
217
218
219
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228







+
+
+
+
+
+
+
+
+







    set a
} {a b}
test foreach-5.3 {break tests} {catch {break foo} msg} 1
test foreach-5.4 {break tests} {
    catch {break foo} msg
    set msg
} {wrong # args: should be "break"}
# Check for bug #406709 
test foreach-5.5 {break tests} {
    proc a {} {
	set a 1
	foreach b b {list [concat a; break]; incr a}
	incr a
    }
    a
} {2}

# Test for incorrect "double evaluation" semantics

test foreach-6.1 {delayed substitution of body} {knownBug} {
    proc foo {} {
       set a 0
       foreach a [list 1 2 3] "
Changes to tests/http.test.
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
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








-
+





-
+





-
-







# Commands covered:  http::config, http::geturl, http::wait, http::reset
#
# This file contains a collection of tests for the http script library.
# Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1994-1996 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
# Copyright (c) 1998-2000 by Ajuba Solutions.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
#
# RCS: @(#) $Id: http.test,v 1.19 2000/04/22 07:07:59 sandeep Exp $
# RCS: @(#) $Id: http.test,v 1.19.2.3 2001/09/07 00:10:57 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}
set tcltest::testConstraints(notLinux) \
	[expr ![string equal Linux $tcl_platform(os)]]

if {[catch {package require http 2} version]} {
    if {[info exist http2]} {
	catch {puts "Cannot load http 2.* package"}
	return
    } else {
	catch {puts "Running http 2.* tests in slave interp"}
97
98
99
100
101
102
103
104
105



106
107
108
109
110
111
112
113



114
115
116
117
118
119
120
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







-
-
+
+
+






-
-
+
+
+







    http::config -proxyhost nowhere.come -proxyport 8080 -proxyfilter myFilter -useragent "Tcl Test Suite"
    set x [http::config]
    eval http::config $savedconf
    set x
} {-accept */* -proxyfilter myFilter -proxyhost nowhere.come -proxyport 8080 -useragent {Tcl Test Suite}}

test http-1.5 {http::config} {
    catch {http::config -proxyhost {} -junk 8080}
} 1
    list [catch {http::config -proxyhost {} -junk 8080} msg] $msg
} {1 {Unknown option -junk, must be: -accept, -proxyfilter, -proxyhost, -proxyport, -useragent}}


test http-2.1 {http::reset} {
    catch {http::reset http#1}
} 0

test http-3.1 {http::geturl} {
    catch {http::geturl -bogus flag}
} 1
    list [catch {http::geturl -bogus flag} msg] $msg
} {1 {Unknown option flag, can be: -binary, -blocksize, -channel, -command, -handler, -headers, -progress, -query, -queryblocksize, -querychannel, -queryprogress, -validate, -timeout, -type}}

test http-3.2 {http::geturl} {
    catch {http::geturl http:junk} err
    set err
} {Unsupported URL: http:junk}

set url [info hostname]:$port
set badurl www.scriptics.com:6666
286
287
288
289
290
291
292









293
294
295
296
297
298
299
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308







+
+
+
+
+
+
+
+
+







	puts $errorInfo
	error $err
    }

    list [http::status $t] [http::code $t]
} {ok {HTTP/1.0 200 Data follows}}

test http-3.13 {http::geturl socket leak test} {
    set chanCount [llength [file channels]]
    for {set i 0} {$i < 3} {incr i} {
	catch {http::geturl $badurl -timeout 5000} 
    }

    # No extra channels should be taken
    expr {[llength [file channels]] == $chanCount}
} 1

test http-4.1 {http::Event} {
    set token [http::geturl $url]
    upvar #0 $token data
    array set meta $data(meta)
    expr ($data(totalsize) == $meta(Content-Length))
} 1
414
415
416
417
418
419
420
421

422
423
424
425
426
427
428
423
424
425
426
427
428
429

430
431
432
433
434
435
436
437







-
+







	if {[string length $token] == 0} {
	    error "bogus return from http::geturl"
	}
	http::wait $token
	http::status $token
    } err]
    # error code varies among platforms.
    list $code [string match "connect failed*" $err]
    list $code [regexp {(connect failed|couldn't open socket)} $err]
} {1 1}

# Bogus host

test http-4.15 {http::Event} {
    set code [catch {
	set token [http::geturl not_a_host.scriptics.com -timeout 1000 -command {#}]
453
454
455
456
457
458
459




460
461
462
463
464
465
466
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479







+
+
+
+







    upvar #0 $token data
    set data(body)
} "<html><head><title>HTTP/1.0 TEST</title></head><body>
<h1>Hello, World!</h1>
<h2>GET http://$url</h2>
</body></html>"

test http-7.1 {http::mapReply} {
    http::mapReply "abc\$\[\]\"\\()\}\{"
} {abc%24%5b%5d%22%5c%28%29%7d%7b}

# cleanup
catch {unset url}
catch {unset badurl}
catch {unset port}
catch {unset data}
if {[info exists httpthread]} {
    testthread send -async $httpthread {
Changes to tests/httpd.
179
180
181
182
183
184
185



186
187
188
189
190
191
192
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195







+
+
+







<h1>Hello, World!</h1>
<h2>$data(proto) $data(url)</h2>
"
	    if {[info exists data(query)] && [string length $data(query)]} {
		append html "<h2>Query</h2>\n<dl>\n"
		foreach {key value} [split $data(query) &=] {
		    append html "<dt>$key<dd>$value\n"
		    if {$key == "timeout"} {
			after $value    ;# pause
		    }
		}
		append html </dl>\n
	    }
	    append html </body></html>
	}
    }
    
Changes to tests/info.test.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







# Commands covered:  info
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1991-1994 The Regents of the University of California.
# Copyright (c) 1994-1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: info.test,v 1.15 2000/04/10 17:19:00 ericm Exp $
# RCS: @(#) $Id: info.test,v 1.15.2.2 2002/04/19 08:12:39 dkf Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

# Set up namespaces needed to test operation of "info args", "info body",
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
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







-
-
-
-
-
+
+
+
+
+










+
+
+
+
+
+
+
+







test info-2.4 {info body option} {
    catch {namespace delete test_ns_info2}
    namespace eval test_ns_info2 {
        namespace import ::test_ns_info1::*
        list [info body p] [info body q]
    }
} {{return "x=$x"} {return "y=$y"}}
test info-2.5 {info body option, returning bytecompiled bodies} {
    # Prior to 8.3.0 this would cause a crash because [info body]
    # would return the bytecompiled version of foo, which the catch
    # would then try and eval out of the foo context, accessing
    # compiled local indices
# Prior to 8.3.0 this would cause a crash because [info body]
# would return the bytecompiled version of foo, which the catch
# would then try and eval out of the foo context, accessing
# compiled local indices
test info-2.5 {info body option, returning bytecompiled bodies} {
    catch {unset args}
    proc foo {args} {
	foreach v $args {
	    upvar $v var
	    return "variable $v existence: [info exists var]"
	}
    }
    foo a
    list [catch [info body foo] msg] $msg
} {1 {can't read "args": no such variable}}
# Fix for problem tested for in info-2.5 caused problems when
# procedure body had no string rep (i.e. was not yet bytecode)
# causing an empty string to be returned [Bug #545644]
test info-2.6 {info body option, returning list bodies} {
    proc foo args [list subst bar]
    list [string bytelength [info body foo]] \
	    [foo; string bytelength [info body foo]]
} {9 9}

# "info cmdcount" is no longer accurate for compiled commands!
# The expected result for info-3.1 used to be "3" and is now "1"
# since the "set"s have been compiled away.  info-3.2 was corrected
# in 8.3 because the eval'ed body won't be compiled.
proc testinfocmdcount {} {
    set x [info cmdcount]
326
327
328
329
330
331
332





333
334
335
336
337
338
339
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352







+
+
+
+
+







    proc t1 {} {info level -1}
    list [catch {t1} msg] $msg
} {1 {bad level "-1"}}
test info-9.9 {info level option} {
    proc t1 {x} {info level $x}
    list [catch {t1 -3} msg] $msg
} {1 {bad level "-3"}}
test info-9.10 {info level option, namespaces} {
    set msg [namespace eval t {info level 0}]
    namespace delete t
    set msg
} {namespace eval t {info level 0}}

set savedLibrary $tcl_library
test info-10.1 {info library option} {
    list [catch {info library x} msg] $msg
} {1 {wrong # args: should be "info library"}}
test info-10.2 {info library option} {
    set tcl_library 12345
Changes to tests/interp.test.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







# This file tests the multiple interpreter facility of Tcl
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1995-1996 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: interp.test,v 1.11 2000/04/10 17:19:00 ericm Exp $
# RCS: @(#) $Id: interp.test,v 1.11.2.1 2001/04/03 22:54:38 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

# The set of hidden commands is platform dependent:
631
632
633
634
635
636
637
638




639
640
641
642
643
644
645
631
632
633
634
635
636
637

638
639
640
641
642
643
644
645
646
647
648







-
+
+
+
+








#
# Test robustness of Tcl_DeleteInterp when applied to a slave interpreter.
# If there are bugs in the implementation these tests are likely to expose
# the bugs as a core dump.
#

if {[info commands testinterpdelete] != ""} {
if {[info commands testinterpdelete] == ""} {
    puts "This application hasn't been compiled with the \"testinterpdelete\""
    puts "command, so I can't test slave delete calls"
} else {
    test interp-18.1 {testing Tcl_DeleteInterp vs slaves} {
	list [catch {testinterpdelete} msg] $msg
    } {1 {wrong # args: should be "testinterpdelete path"}}
    test interp-18.2 {testing Tcl_DeleteInterp vs slaves} {
	catch {interp delete a}
	interp create a
	testinterpdelete a
2348
2349
2350
2351
2352
2353
2354


















2355
2356
2357
2358
2359
2360
2361
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







    catch {unset a}
    set result [testMyNewSet "ok"]
    rename testMyNewSet {}
    rename mySet {}
    rename myNewSet {}
    set result
} ok

test interp-32.1 { parent's working directory should
                   be inherited by a child interp } {
    set parent [pwd]
    set i [interp create]
    set child [$i eval pwd]
    interp delete $i
    file mkdir cwd_test
    cd cwd_test
    lappend parent [pwd]
    set i [interp create]
    lappend child [$i eval pwd]
    cd ..
    file delete cwd_test
    interp delete $i
    expr {[string equal $parent $child] ? 1 :
             "\{$parent\} != \{$child\}"}
} 1

# cleanup
foreach i [interp slaves] {
  interp delete $i
}
::tcltest::cleanupTests
return
Changes to tests/io.test.
8
9
10
11
12
13
14
15

16
17
18
19
20
21
22
8
9
10
11
12
13
14

15
16
17
18
19
20
21
22







-
+







# Copyright (c) 1991-1994 The Regents of the University of California.
# Copyright (c) 1994-1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: io.test,v 1.14 2000/04/10 17:19:00 ericm Exp $
# RCS: @(#) $Id: io.test,v 1.14.2.5 2002/03/02 05:00:39 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

if {"[info commands testchannel]" != "testchannel"} {
85
86
87
88
89
90
91













92
93
94
95
96
97
98
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







+
+
+
+
+
+
+
+
+
+
+
+
+







test io-1.7 {Tcl_WriteChars: WriteChars} {
    set f [open test1 w]
    fconfigure $f -encoding shiftjis
    puts -nonewline $f "a\u4e4d\0"
    close $f
    contents test1
} "a\x93\xe1\x00"
test io-1.8 {Tcl_WriteChars: WriteChars} {
    # This test written for SF bug #506297.
    #
    # Executing this test without the fix for the referenced bug
    # applied to tcl will cause tcl, more specifically WriteChars, to
    # go into an infinite loop.

    set f [open test2 w] 
    fconfigure      $f -encoding iso2022-jp 
    puts -nonewline $f [format %s%c [string repeat " " 4] 12399] 
    close           $f 
    contents test2
} "\x1b(B    \x1b\$B\$O"

test io-2.1 {WriteBytes} {
    # loop until all bytes are written
    
    set f [open test1 w]
    fconfigure $f  -encoding binary -buffersize 16 -translation crlf
    puts $f "abcdefghijklmnopqrstuvwxyz"
3792
3793
3794
3795
3796
3797
3798
3799
3800


3801
3802
3803
3804

3805
3806
3807
3808
3809
3810
3811
3805
3806
3807
3808
3809
3810
3811


3812
3813
3814
3815
3816

3817
3818
3819
3820
3821
3822
3823
3824







-
-
+
+



-
+







} ok
test io-32.8 {Tcl_Read, nonblocking, file} {nonBlockFiles} {
    set f1 [open longfile r]
    fconfigure $f1 -blocking off
    set z [read $f1 1000000]
    close $f1
    set x ok
    set l [string length $z]]
    set z [file size longfile]]
    set l [string length $z]
    set z [file size longfile]
    if {$z != $l} {
	set x broken
    }
  set x
    set x
} ok
test io-32.9 {Tcl_Read, read to end of file} {
    set f1 [open longfile r]
    set z [read $f1]
    close $f1
    set l [string length $z]
    set x ok
4998
4999
5000
5001
5002
5003
5004













































5005
5006
5007
5008
5009
5010
5011
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







    update
    fconfigure $s2 -translation {auto auto}
    set modes [fconfigure $s2 -translation]
    close $s1
    close $s2
    set modes
} {auto crlf}

test io-39.22 {Tcl_SetChannelOption, invariance} {unixOnly} {
    removeFile test1
    set f1 [open test1 w+]
    set l ""
    lappend l [fconfigure $f1 -eofchar]
    fconfigure $f1 -eofchar {ON GO}
    lappend l [fconfigure $f1 -eofchar]
    fconfigure $f1 -eofchar D
    lappend l [fconfigure $f1 -eofchar]
    close $f1
    set l
} {{{} {}} {O G} {D D}}

test io-39.22a {Tcl_SetChannelOption, invariance} {
    removeFile test1
    set f1 [open test1 w+]
    set l [list]
    fconfigure $f1 -eofchar {ON GO}
    lappend l [fconfigure $f1 -eofchar]
    fconfigure $f1 -eofchar D
    lappend l [fconfigure $f1 -eofchar]
    lappend l [list [catch {fconfigure $f1 -eofchar {1 2 3}} msg] $msg]
    close $f1
    set l
} {{O G} {D D} {1 {bad value for -eofchar: should be a list of zero, one, or two elements}}}


test io-39.23 {Tcl_GetChannelOption, server socket is not readable or
        writeable, it should still have valid -eofchar and -translation options } {
    set l [list]
    set sock [socket -server accept 0]
    lappend l [fconfigure $sock -eofchar] [fconfigure $sock -translation]
    close $sock
    set l
} {{{}} auto}
test io-39.24 {Tcl_SetChannelOption, server socket is not readable or
        writable so we can't change -eofchar or -translation } {
    set l [list]
    set sock [socket -server accept 0]
    fconfigure $sock -eofchar D -translation lf
    lappend l [fconfigure $sock -eofchar] [fconfigure $sock -translation]
    close $sock
    set l
} {{{}} auto}

test io-40.1 {POSIX open access modes: RDWR} {
    removeFile test3
    set f [open test3 w]
    puts $f xyzzy
    close $f
    set f [open test3 RDWR]
Changes to tests/ioCmd.test.
8
9
10
11
12
13
14
15

16
17
18
19
20
21
22
8
9
10
11
12
13
14

15
16
17
18
19
20
21
22







-
+







# Copyright (c) 1991-1994 The Regents of the University of California.
# Copyright (c) 1994-1996 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: ioCmd.test,v 1.8 2000/04/10 17:19:01 ericm Exp $
# RCS: @(#) $Id: ioCmd.test,v 1.8.2.1 2001/09/13 19:10:51 andreas_kupries Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

removeFile test1
233
234
235
236
237
238
239



240

241



242

243

244



245

246

247



248



249
250
251
252
253
254
255
233
234
235
236
237
238
239
240
241
242
243
244

245
246
247
248
249
250
251

252
253
254
255
256
257
258

259
260
261
262
263
264
265
266
267
268
269
270
271
272







+
+
+

+
-
+
+
+

+

+
-
+
+
+

+

+
-
+
+
+

+
+
+







    set x [fconfigure $f1]
    close $f1
    set x
} {-blocking 1 -buffering none -buffersize 4040 -encoding binary -eofchar {} -translation lf}
test iocmd-8.10 {fconfigure command} {
    list [catch {fconfigure a b} msg] $msg
} {1 {can not find channel named "a"}}

makeFile {} fconfigure.dummy

test iocmd-8.11 {fconfigure command} {
    set chan [open fconfigure.dummy r]
    list [catch {fconfigure stdout -froboz blarfo} msg] $msg
    set res [list [catch {fconfigure $chan -froboz blarfo} msg] $msg]
    close $chan
    set res
} {1 {bad option "-froboz": should be one of -blocking, -buffering, -buffersize, -encoding, -eofchar, or -translation}}

test iocmd-8.12 {fconfigure command} {
    set chan [open fconfigure.dummy r]
    list [catch {fconfigure stdout -b blarfo} msg] $msg
    set res [list [catch {fconfigure $chan -b blarfo} msg] $msg]
    close $chan
    set res
} {1 {bad option "-b": should be one of -blocking, -buffering, -buffersize, -encoding, -eofchar, or -translation}}

test iocmd-8.13 {fconfigure command} {
    set chan [open fconfigure.dummy r]
    list [catch {fconfigure stdout -buffer blarfo} msg] $msg
    set res [list [catch {fconfigure $chan -buffer blarfo} msg] $msg]
    close $chan
    set res
} {1 {bad option "-buffer": should be one of -blocking, -buffering, -buffersize, -encoding, -eofchar, or -translation}}

removeFile fconfigure.dummy

test iocmd-8.14 {fconfigure command} {
    fconfigure stdin -buffers
} 4096
proc iocmdSSETUP {} {
  uplevel {
	set srv [socket -server iocmdSRV 0];
	set port [lindex [fconfigure $srv -sockname] 2];
Changes to tests/ioUtil.test.
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10

11
12
13
14
15
16
17
18










-
+







# This file (ioUtil.test) tests the hookable TclStat(), TclAccess(),
# and Tcl_OpenFileChannel, routines in the file generic/tclIOUtils.c.
# Sourcing this file into Tcl runs the tests and generates output for
# errors. No output means no errors were found. 
# 
# Copyright (c) 1998-1999 by Scriptics Corporation. 
# 
# See the file "license.terms" for information on usage and redistribution 
# of this file, and for a DISCLAIMER OF ALL WARRANTIES. 
# 
# RCS: @(#) $Id: ioUtil.test,v 1.8 2000/04/10 17:19:01 ericm Exp $
# RCS: @(#) $Id: ioUtil.test,v 1.8.2.1 2001/08/24 16:19:10 dgp Exp $
 
if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

set unsetScript {
188
189
190
191
192
193
194
195
196
197



198
199
200
201
202
203
204
188
189
190
191
192
193
194



195
196
197
198
199
200
201
202
203
204







-
-
-
+
+
+







    catch {testaccessproc delete TestAccessProc3} err11

    list $err9 $err10 $err11
} {{"TestAccessProc1": could not be deleteed} {"TestAccessProc2": could not be deleteed} {"TestAccessProc3": could not be deleteed}}
}

test ioUtil-3.1 {TclOpenFileChannel: Check that none of the test procs are there.} {
    catch {file exists __testOpenFileChannel1%__.fil} err1
    catch {file exists __testOpenFileChannel2%__.fil} err2
    catch {file exists __testOpenFileChannel3%__.fil} err3
    catch {file exists testOpenFileChannel1%.fil} err1
    catch {file exists testOpenFileChannel2%.fil} err2
    catch {file exists testOpenFileChannel3%.fil} err3
    catch {file exists __testOpenFileChannel1%__.fil} err4
    catch {file exists __testOpenFileChannel2%__.fil} err5
    catch {file exists __testOpenFileChannel3%__.fil} err6
    list $err1 $err2 $err3 $err4 $err5 $err6
} {0 0 0 0 0 0}

if {[info commands testopenfilechannelproc] == {}} {
243
244
245
246
247
248
249
250

251
252
253
254
255
256
257
258


259
260
261
262
263
264
265
266
267
268
269
270


271
272
273
274
275
276
277



278
279
280
281
282
283
284
285
286
287



288
289
290
291




292
293
294
295
296
297
298
243
244
245
246
247
248
249

250
251
252
253
254
255
256


257
258
259
260
261
262
263
264
265
266
267
268


269
270
271
272
273
274
275


276
277
278
279
280
281
282
283
284
285



286
287
288
289
290


291
292
293
294
295
296
297
298
299
300
301







-
+






-
-
+
+










-
-
+
+





-
-
+
+
+







-
-
-
+
+
+


-
-
+
+
+
+







    testopenfilechannelproc delete TestOpenFileChannelProc2

	close [open __testOpenFileChannel1%__.fil w]
	close [open __testOpenFileChannel3%__.fil w]

	catch {
		close [open testOpenFileChannel1%.fil r]
		catch {close [open testOpenFileChannel2%.fil r]}
		catch {close [open testOpenFileChannel2%.fil r]} msg1
		close [open testOpenFileChannel3%.fil r]
	} err3

	file delete __testOpenFileChannel1%__.fil
	file delete __testOpenFileChannel3%__.fil

    set err3
} {}
    list $err3 $msg1
} [list {} {couldn't open "testOpenFileChannel2%.fil": no such file or directory}]

test ioUtil-3.6 {TclOpenFileChannelDeleteProc: Delete the 1st TclOpenFileChannel procedure.} {
    # Next delete the 1st procedure and test that only the 3rd procedure
    #   is the only one that exists.

    testopenfilechannelproc delete TestOpenFileChannelProc1

	close [open __testOpenFileChannel3%__.fil w]

	catch {
		catch {close [open testOpenFileChannel1%.fil r]}
		catch {close [open testOpenFileChannel2%.fil r]}
		catch {close [open testOpenFileChannel1%.fil r]} msg2
		catch {close [open testOpenFileChannel2%.fil r]} msg3
		close [open testOpenFileChannel3%.fil r]
	} err4

	file delete __testOpenFileChannel3%__.fil

    set err4
} {}
    list $err4 $msg2 $msg3
} [list {} {couldn't open "testOpenFileChannel1%.fil": no such file or directory} \
	{couldn't open "testOpenFileChannel2%.fil": no such file or directory}]

test ioUtil-3.7 {TclOpenFileChannelDeleteProc: Delete the 3rd procedure & verify all are gone.} {
    # Finally delete the 3rd procedure and check that none of the
    #   procedures exist.

    testopenfilechannelproc delete TestOpenFileChannelProc3
	catch {
		catch [open testOpenFileChannel1%.fil r]
		catch [open testOpenFileChannel2%.fil r]
		catch [open testOpenFileChannel3%.fil r]
		catch {close [open testOpenFileChannel1%.fil r]} msg4
		catch {close [open testOpenFileChannel2%.fil r]} msg5
		catch {close [open testOpenFileChannel3%.fil r]} msg6
	} err5

    set err5
} {1}
    list $err5 $msg4 $msg5 $msg6
} [list 1 {couldn't open "testOpenFileChannel1%.fil": no such file or directory} \
	{couldn't open "testOpenFileChannel2%.fil": no such file or directory} \
	{couldn't open "testOpenFileChannel3%.fil": no such file or directory}]

test ioUtil-3.8 {TclOpenFileChannelDeleteProc: Verify that all procs have been deleted.} {
    # Attempt to delete all the OpenFileChannel procs. again to ensure they no longer
    #   exist and an error is returned.

    catch {testopenfilechannelproc delete TestOpenFileChannelProc1} err9
    catch {testopenfilechannelproc delete TestOpenFileChannelProc2} err10
Added tests/iogt.test.












































































































































































































































































































































































































































































































































































































































































































































































































































































































































































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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# -*- tcl -*-
# Commands covered:  transform, and stacking in general
#
# This file contains a collection of tests for Giot
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
# 
# Copyright (c) 2000 Ajuba Solutions.
# Copyright (c) 2000 Andreas Kupries.
# All rights reserved.
# 
# RCS: @(#) $Id: iogt.test,v 1.1.4.1 2000/07/27 01:39:20 hobbs Exp $


if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

if {[info commands testchannel] == ""} {
    puts "Skipping io tests. This application does not seem to have the"
    puts "testchannel command that is needed to run these tests."
    return
}

::tcltest::saveState

#::tcltest::makeFile contents name

::tcltest::makeFile {abcdefghijklmnopqrstuvwxyz0123456789,./?><;'\|":[]\}\{`~!@#$%^&*()_+-=} dummy

# " capture coloring of quotes

::tcltest::makeFile {} dummyout

::tcltest::makeFile {
#!/usr/local/bin/tclsh
# -*- tcl -*-
# echo server
#
# arguments, options: port to listen on for connections.
#                     delay till echo of first block
#                     delay between blocks
#                     blocksize ...

set port   [lindex $argv 0]
set fdelay [lindex $argv 1]
set idelay [lindex $argv 2]
set bsizes [lrange $argv 3 end]
set c      0

proc newconn {sock rhost rport} {
    global c fdelay
    incr   c

    #puts stdout "C $sock $rhost $rport / $fdelay" ; flush stdout

    upvar #0 c$c conn
    set conn(after) {}
    set conn(state) 0
    set conn(size)  0
    set conn(data)  ""
    set conn(delay) $fdelay

    fileevent  $sock readable [list echoGet $c $sock]
    fconfigure $sock -translation binary -buffering none -blocking 0
}

proc echoGet {c sock} {
    global fdelay
    upvar #0 c$c conn

    if {[eof $sock]} {
	# one-shot echo
	exit
    }

    append conn(data) [read $sock]

    #puts stdout "G $c $sock $conn(data) <<$conn(data)>>" ; flush stdout

    if {$conn(after) == {}} {
	set conn(after) [after $conn(delay) [list echoPut $c $sock]]
    }
}

proc echoPut {c sock} {
    global idelay fdelay bsizes
    upvar #0 c$c conn

    if {[string length $conn(data)] == 0} {
	#puts stdout "C $c $sock" ; flush stdout
	# auto terminate
	close $sock
	exit
	#set conn(delay) $fdelay
	return
    }


    set conn(delay) $idelay

    set n [lindex $bsizes $conn(size)]

    #puts stdout "P $c $sock $n >>" ; flush stdout

    #puts __________________________________________
    #parray conn
    #puts n=<$n>


    if {[string length $conn(data)] >= $n} {
	puts -nonewline $sock [string range $conn(data) 0 $n]
	set conn(data) [string range $conn(data) [incr n] end]
    }

    incr conn(size)
    if {$conn(size) >= [llength $bsizes]} {
	set conn(size) [expr {[llength $bsizes]-1}]
    }

    set conn(after) [after $conn(delay) [list echoPut $c $sock]]
}

#fileevent stdin readable {exit ;#cut}

# main
socket -server newconn $port
vwait forever
} __echo_srv__.tcl


########################################################################

proc fevent {fdelay idelay blocks script data} {
    # start and initialize an echo server, prepare data
    # transmission, then hand over to the test script.
    # this has to start real transmission via 'flush'.
    # The server is stopped after completion of the test.

    # fixed port, not so good. lets hope for the best, for now.
    set port 4000

    eval exec tclsh __echo_srv__.tcl \
	    $port $fdelay $idelay $blocks >@stdout &

    after 500

    #puts stdout "> $port" ; flush stdout

    set         sk [socket localhost $port]
    fconfigure $sk           \
	    -blocking   0    \
	    -buffering  full \
	    -buffersize [expr {10+[llength $data]}]

    puts -nonewline $sk $data

    # The channel is prepared to go off.

    #puts stdout ">>>>>" ; flush stdout

    uplevel #0 set sock $sk
    set res [uplevel #0 $script]

    catch {close $sk}
    return $res
}

# --------------------------------------------------------------
# utility transformations ...

proc id {op data} {
    switch -- $op {
	create/write -
	create/read  -
	delete/write -
	delete/read  -
	clear_read   {;#ignore}
	flush/write -
	flush/read  -
	write       -
	read        {
	    return $data
	}
	query/maxRead {return -1}
    }
}

proc id_optrail {var op data} {
    upvar #0 $var trail

    lappend trail $op

    switch -- $op {
	create/write	-	create/read	-
	delete/write	-	delete/read	-
	flush/read	-
	clear/read	{ #ignore }
	flush/write	-
	write		-
	read		{
	    return $data
	}
	query/maxRead	{
	    return -1
	}
	default		{
	    lappend trail "error $op"
	    error $op
	}
    }
}


proc id_fulltrail {var op data} {
    upvar #0 $var trail

    #puts stdout ">> $var $op $data" ; flush stdout

    switch -- $op {
	create/write -	create/read  -
	delete/write -	delete/read  -
	clear_read   {
	    set res *ignored*
	}
	flush/write -	flush/read  -
	write       -
	read        {
	    set res $data
	}
	query/maxRead {
	    set res -1
	}
    }

    #catch {puts stdout "\t>* $res" ; flush stdout}
    #catch {puts stdout "x$res"} msg

    lappend trail [list $op $data $res]
    return $res
}

proc counter {var op data} {
    upvar #0 $var n

    switch -- $op {
	create/write -	create/read  -
	delete/write -	delete/read  -
	clear_read   {;#ignore}
	flush/write  -	flush/read   {return {}}
	write {
	    return $data
	}
	read  {
	    if {$n > 0} {
		incr n -[string length $data]
		if {$n < 0} {
		    set n 0
		}
	    }
	    return $data
	}
	query/maxRead {
	    return $n
	}
    }
}


proc counter_audit {var vtrail op data} {
    upvar #0 $var n $vtrail trail

    switch -- $op {
	create/write -	create/read  -
	delete/write -	delete/read  -
	clear_read   {
	    set res {}
	}
	flush/write  -	flush/read   {
	    set res {}
	}
	write {
	    set res $data
	}
	read  {
	    if {$n > 0} {
		incr n -[string length $data]
		if {$n < 0} {
		    set n 0
		}
	    }
	    set res $data
	}
	query/maxRead {
	    set res $n
	}
    }

    lappend trail [list counter:$op $data $res]
    return $res
}


proc rblocks {var vtrail n op data} {
    upvar #0 $var buf $vtrail trail

    set res {}

    switch -- $op {
	create/write -	create/read  -
	delete/write -	delete/read  -
	clear_read   {
	    set buf {}
	}
	flush/write {
	}
	flush/read  {
	    set res $buf
	    set buf {}
	}
	write       {
	    set data
	}
	read        {
	    append buf $data

	    set b [expr {$n * ([string length $buf] / $n)}]

	    append op " $n [string length $buf] :- $b"

	    set res [string range $buf 0 [incr b -1]]
	    set buf [string range $buf [incr b] end]
	    #return $res
	}
	query/maxRead {
	    set res -1
	}
    }

    lappend trail [list rblock | $op $data $res | $buf]
    return $res
}


# --------------------------------------------------------------
# ... and convenience procedures to stack them

proc identity {-attach channel} {
    testchannel transform $channel -command id
}

proc audit_ops {var -attach channel} {
    testchannel transform $channel -command [list id_optrail $var]
}

proc audit_flow {var -attach channel} {
    testchannel transform $channel -command [list id_fulltrail $var]
}

proc stopafter {var n -attach channel} {
    upvar #0 $var vn
    set vn $n
    testchannel transform $channel -command [list counter $var]
}

proc stopafter_audit {var trail n -attach channel} {
    upvar #0 $var vn
    set vn $n
    testchannel transform $channel -command [list counter_audit $var $trail]
}

proc rblocks_t {var trail n -attach channel} {
    testchannel transform $channel -command [list rblocks $var $trail $n]
}

# --------------------------------------------------------------
# serialize an array, with keys in sorted order.

proc array_sget {v} {
    upvar $v a

    set res [list]
    foreach n [lsort [array names a]] {
	lappend res $n $a($n)
    }
    set res
}

proc asort {alist} {
    # sort a list of key/value pairs by key, removes duplicates too.

    array set  a $alist
    array_sget a
}

########################################################################


test iogt-1.1 {stack/unstack} {
    set fh [open dummy r]
    identity -attach $fh
    testchannel unstack $fh
    close   $fh
} {}

test iogt-1.2 {stack/close} {
    set fh [open dummy r]
    identity -attach $fh
    close   $fh
} {}

test iogt-1.3 {stack/unstack, configuration, options} {
    set fh [open dummy r]
    set ca [asort [fconfigure $fh]]
    identity -attach $fh
    set cb [asort [fconfigure $fh]]
    testchannel unstack $fh
    set cc [asort [fconfigure $fh]]
    close $fh

    # With this system none of the buffering, translation and
    # encoding option may change their values with channels
    # stacked upon each other or not.

    # cb == ca == cc

    list [string equal $ca $cb] [string equal $cb $cc] [string equal $ca $cc]
} {1 1 1}

test iogt-1.4 {stack/unstack, configuration} {
    set fh [open dummy r]
    set ca [asort [fconfigure $fh]]
    identity -attach $fh
    fconfigure $fh \
	    -buffering   line \
	    -translation cr   \
	    -encoding    shiftjis
    testchannel unstack $fh
    set cc [asort [fconfigure $fh]]

    set res [list \
	    [string equal $ca $cc]   \
	    [fconfigure $fh -buffering]  \
	    [fconfigure $fh -translation] \
	    [fconfigure $fh -encoding]    \
	    ]

    close $fh
    set res
} {0 line cr shiftjis}

test iogt-2.0 {basic I/O going through transform} {
    set fin  [open dummy    r]
    set fout [open dummyout w]

    identity -attach $fin
    identity -attach $fout

    fcopy $fin $fout

    close $fin
    close $fout

    set fin  [open dummy    r]
    set fout [open dummyout r]

    set res     [string equal [set in [read $fin]] [set out [read $fout]]]
    lappend res [string length $in] [string length $out]

    close $fin
    close $fout

    set res
} {1 71 71}


test iogt-2.1 {basic I/O, operation trail} {unixOnly} {
    set fin  [open dummy    r]
    set fout [open dummyout w]

    set ain [list] ; set aout [list]
    audit_ops ain  -attach $fin
    audit_ops aout -attach $fout

    fconfigure $fin  -buffersize 10
    fconfigure $fout -buffersize 5

    fcopy $fin $fout

    close $fin
    close $fout

    set res "[join $ain \n]\n--------\n[join $aout \n]"
} {create/read
query/maxRead
read
query/maxRead
read
query/maxRead
read
query/maxRead
read
query/maxRead
read
query/maxRead
read
query/maxRead
read
query/maxRead
read
query/maxRead
flush/read
query/maxRead
delete/read
--------
create/write
write
write
write
write
write
write
write
write
flush/write
delete/write}

test iogt-2.2 {basic I/O, data trail} {unixOnly} {
    set fin  [open dummy    r]
    set fout [open dummyout w]

    set ain [list] ; set aout [list]
    audit_flow ain  -attach $fin
    audit_flow aout -attach $fout

    fconfigure $fin  -buffersize 10
    fconfigure $fout -buffersize 5

    fcopy $fin $fout

    close $fin
    close $fout

    set res "[join $ain \n]\n--------\n[join $aout \n]"
} {create/read {} *ignored*
query/maxRead {} -1
read abcdefghij abcdefghij
query/maxRead {} -1
read klmnopqrst klmnopqrst
query/maxRead {} -1
read uvwxyz0123 uvwxyz0123
query/maxRead {} -1
read 456789,./? 456789,./?
query/maxRead {} -1
read {><;'\|":[]} {><;'\|":[]}
query/maxRead {} -1
read {\}\{`~!@#$} {\}\{`~!@#$}
query/maxRead {} -1
read %^&*()_+-= %^&*()_+-=
query/maxRead {} -1
read {
} {
}
query/maxRead {} -1
flush/read {} {}
query/maxRead {} -1
delete/read {} *ignored*
--------
create/write {} *ignored*
write abcdefghij abcdefghij
write klmnopqrst klmnopqrst
write uvwxyz0123 uvwxyz0123
write 456789,./? 456789,./?
write {><;'\|":[]} {><;'\|":[]}
write {\}\{`~!@#$} {\}\{`~!@#$}
write %^&*()_+-= %^&*()_+-=
write {
} {
}
flush/write {} {}
delete/write {} *ignored*}


test iogt-2.3 {basic I/O, mixed trail} {unixOnly} {
    set fin  [open dummy    r]
    set fout [open dummyout w]

    set trail [list]
    audit_flow trail -attach $fin
    audit_flow trail -attach $fout

    fconfigure $fin  -buffersize 20
    fconfigure $fout -buffersize 10

    fcopy $fin $fout

    close $fin
    close $fout

    join $trail \n
} {create/read {} *ignored*
create/write {} *ignored*
query/maxRead {} -1
read abcdefghijklmnopqrst abcdefghijklmnopqrst
write abcdefghij abcdefghij
write klmnopqrst klmnopqrst
query/maxRead {} -1
read uvwxyz0123456789,./? uvwxyz0123456789,./?
write uvwxyz0123 uvwxyz0123
write 456789,./? 456789,./?
query/maxRead {} -1
read {><;'\|":[]\}\{`~!@#$} {><;'\|":[]\}\{`~!@#$}
write {><;'\|":[]} {><;'\|":[]}
write {\}\{`~!@#$} {\}\{`~!@#$}
query/maxRead {} -1
read {%^&*()_+-=
} {%^&*()_+-=
}
query/maxRead {} -1
flush/read {} {}
write %^&*()_+-= %^&*()_+-=
write {
} {
}
query/maxRead {} -1
delete/read {} *ignored*
flush/write {} {}
delete/write {} *ignored*}


test iogt-3.0 {Tcl_Channel valid after stack/unstack, fevent handling} \
	{unknownFailure} {
    # This test to check the validity of aquired Tcl_Channel references is
    # not possible because even a backgrounded fcopy will immediately start
    # to copy data, without waiting for the event loop. This is done only in
    # case of an underflow on the read size!. So stacking transforms after the
    # fcopy will miss information, or are not used at all.
    #
    # I was able to circumvent this by using the echo.tcl server with a big
    # delay, causing the fcopy to underflow immediately.

    proc DoneCopy {n {err {}}} {
	global copy ; set copy 1
    }

    set fin  [open dummy    r]

    fevent 1000 500 {20 20 20 10 1 1} {
	close $fin

	set          fout [open dummyout w]

	flush $sock ; # now, or fcopy will error us out
	# But the 1 second delay should be enough to
	# initialize everything else here.

	fcopy $sock $fout -command DoneCopy

	# transform after fcopy got its handles !
	# They should be still valid for fcopy.

	set trail [list]
	audit_ops trail -attach $fout

	vwait copy
    } [read $fin] ; # {}

    close $fout

    rename DoneCopy {}

    # Check result of copy.

    set fin  [open dummy    r]
    set fout [open dummyout r]

    set res [string equal [read $fin] [read $fout]]

    close $fin
    close $fout

    list $res $trail
} {1 {create/write create/read write flush/write flush/read delete/write delete/read}}


test iogt-4.0 {fileevent readable, after transform} {unknownFailure} {
    set fin  [open dummy    r]
    set data [read $fin]
    close $fin

    set trail [list]
    set got   [list]

    proc Done {args} {
	global stop
	set    stop 1
    }

    proc Get {sock} {
	global trail got
	if {[eof $sock]} {
	    Done
	    lappend trail "xxxxxxxxxxxxx"
	    close $sock
	    return
	}
	lappend trail "vvvvvvvvvvvvv"
	lappend trail "\tgot: [lappend got "\[\[[read $sock]\]\]"]"
	lappend trail "============="
	#puts stdout $__ ; flush stdout
	#read $sock
    }

    fevent 1000 500 {20 20 20 10 1} {
	audit_flow trail   -attach $sock
	rblocks_t  rbuf trail 23 -attach $sock

	fileevent $sock readable [list Get $sock]

	flush $sock ; # now, or fcopy will error us out
	# But the 1 second delay should be enough to
	# initialize everything else here.

	vwait stop
    } $data


    rename Done {}
    rename Get {}

    join [list [join $got \n] ~~~~~~~~ [join $trail \n]] \n
} {[[]]
[[abcdefghijklmnopqrstuvw]]
[[xyz0123456789,./?><;'\|]]
[[]]
[[]]
[[":[]\}\{`~!@#$%^&*()]]
[[]]
~~~~~~~~
create/write {} *ignored*
create/read {} *ignored*
rblock | create/write {} {} | {}
rblock | create/read {} {} | {}
vvvvvvvvvvvvv
rblock | query/maxRead {} -1 | {}
query/maxRead {} -1
read abcdefghijklmnopqrstu abcdefghijklmnopqrstu
query/maxRead {} -1
rblock | {read 23 21 :- 0} abcdefghijklmnopqrstu {} | abcdefghijklmnopqrstu
rblock | query/maxRead {} -1 | abcdefghijklmnopqrstu
query/maxRead {} -1
	got: {[[]]}
=============
vvvvvvvvvvvvv
rblock | query/maxRead {} -1 | abcdefghijklmnopqrstu
query/maxRead {} -1
read vwxyz0123456789,./?>< vwxyz0123456789,./?><
query/maxRead {} -1
rblock | {read 23 42 :- 23} vwxyz0123456789,./?>< abcdefghijklmnopqrstuvw | xyz0123456789,./?><
rblock | query/maxRead {} -1 | xyz0123456789,./?><
query/maxRead {} -1
	got: {[[]]} {[[abcdefghijklmnopqrstuvw]]}
=============
vvvvvvvvvvvvv
rblock | query/maxRead {} -1 | xyz0123456789,./?><
query/maxRead {} -1
read {;'\|":[]\}\{`~!@#$%^&} {;'\|":[]\}\{`~!@#$%^&}
query/maxRead {} -1
rblock | {read 23 40 :- 23} {;'\|":[]\}\{`~!@#$%^&} {xyz0123456789,./?><;'\|} | {":[]\}\{`~!@#$%^&}
rblock | query/maxRead {} -1 | {":[]\}\{`~!@#$%^&}
query/maxRead {} -1
	got: {[[]]} {[[abcdefghijklmnopqrstuvw]]} {[[xyz0123456789,./?><;'\|]]}
=============
vvvvvvvvvvvvv
rblock | query/maxRead {} -1 | {":[]\}\{`~!@#$%^&}
query/maxRead {} -1
read *( *(
query/maxRead {} -1
rblock | {read 23 19 :- 0} *( {} | {":[]\}\{`~!@#$%^&*(}
rblock | query/maxRead {} -1 | {":[]\}\{`~!@#$%^&*(}
query/maxRead {} -1
	got: {[[]]} {[[abcdefghijklmnopqrstuvw]]} {[[xyz0123456789,./?><;'\|]]} {[[]]}
=============
vvvvvvvvvvvvv
rblock | query/maxRead {} -1 | {":[]\}\{`~!@#$%^&*(}
query/maxRead {} -1
read ) )
query/maxRead {} -1
rblock | {read 23 20 :- 0} ) {} | {":[]\}\{`~!@#$%^&*()}
rblock | query/maxRead {} -1 | {":[]\}\{`~!@#$%^&*()}
query/maxRead {} -1
	got: {[[]]} {[[abcdefghijklmnopqrstuvw]]} {[[xyz0123456789,./?><;'\|]]} {[[]]} {[[]]}
=============
vvvvvvvvvvvvv
rblock | query/maxRead {} -1 | {":[]\}\{`~!@#$%^&*()}
query/maxRead {} -1
flush/read {} {}
rblock | flush/read {} {":[]\}\{`~!@#$%^&*()} | {}
rblock | query/maxRead {} -1 | {}
query/maxRead {} -1
	got: {[[]]} {[[abcdefghijklmnopqrstuvw]]} {[[xyz0123456789,./?><;'\|]]} {[[]]} {[[]]} {[[":[]\}\{`~!@#$%^&*()]]}
=============
vvvvvvvvvvvvv
rblock | query/maxRead {} -1 | {}
query/maxRead {} -1
	got: {[[]]} {[[abcdefghijklmnopqrstuvw]]} {[[xyz0123456789,./?><;'\|]]} {[[]]} {[[]]} {[[":[]\}\{`~!@#$%^&*()]]} {[[]]}
xxxxxxxxxxxxx
rblock | flush/write {} {} | {}
rblock | delete/write {} {} | {}
rblock | delete/read {} {} | {}
flush/write {} {}
delete/write {} *ignored*
delete/read {} *ignored*}  ; # catch unescaped quote "


test iogt-5.0 {EOF simulation} {unknownFailure} {
    set fin  [open dummy    r]
    set fout [open dummyout w]

    set trail [list]

    audit_flow trail -attach $fin
    stopafter_audit d trail 20 -attach   $fin
    audit_flow trail -attach $fout

    fconfigure $fin  -buffersize 20
    fconfigure $fout -buffersize 10

    fcopy   $fin $fout
    testchannel unstack $fin

    # now copy the rest in the channel
    lappend trail {**after unstack**}

    fcopy $fin $fout

    close $fin
    close $fout

    join $trail \n
} {create/read {} *ignored*
counter:create/read {} {}
create/write {} *ignored*
counter:query/maxRead {} 20
query/maxRead {} -1
read {abcdefghijklmnopqrstuvwxyz0123456789,./?><;'\|":[]\}\{`~!@#$%^&*()_+-=
} {abcdefghijklmnopqrstuvwxyz0123456789,./?><;'\|":[]\}\{`~!@#$%^&*()_+-=
}
query/maxRead {} -1
flush/read {} {}
counter:read abcdefghijklmnopqrst abcdefghijklmnopqrst
write abcdefghij abcdefghij
write klmnopqrst klmnopqrst
counter:query/maxRead {} 0
counter:flush/read {} {}
counter:delete/read {} {}
**after unstack**
query/maxRead {} -1
write uvwxyz0123 uvwxyz0123
write 456789,./? 456789,./?
write {><;'\|":[]} {><;'\|":[]}
write {\}\{`~!@#$} {\}\{`~!@#$}
write %^&*()_+-= %^&*()_+-=
write {
} {
}
query/maxRead {} -1
delete/read {} *ignored*
flush/write {} {}
delete/write {} *ignored*}





proc constX {op data} {
    # replace anything coming in with a same-length string of x'es.
    switch -- $op {
	create/write -	create/read  -
	delete/write -	delete/read  -
	clear_read   {;#ignore}
	flush/write -	flush/read  -
	write       -
	read        {
	    return [string repeat x [string length $data]]
	}
	query/maxRead {return -1}
    }
}

proc constx {-attach channel} {
    testchannel transform $channel -command constX
}

test iogt-6.0 {Push back} {
    set f [open dummy r]

    # contents of dummy = "abcdefghi..."
    read $f 3 ; # skip behind "abc"

    constx -attach $f

    # expect to get "xxx" from the transform because
    # of unread "def" input to transform which returns "xxx".
    #
    # Actually the IO layer pre-read the whole file and will
    # read "def" directly from the buffer without bothering
    # to consult the newly stacked transformation. This is
    # wrong.

    set res [read $f 3]
    close $f
    set res
} {xxx}

test iogt-6.1 {Push back and up} {knownBug} {
    set f [open dummy r]

    # contents of dummy = "abcdefghi..."
    read $f 3 ; # skip behind "abc"

    constx -attach $f
    set res [read $f 3]

    testchannel unstack $f
    append res [read $f 3]
    close $f
    set res
} {xxxghi}


# cleanup
foreach file [list dummy dummyout __echo_srv__.tcl] {
    ::tcltest::removeFile $file
}
::tcltest::restoreState
::tcltest::cleanupTests
return
Changes to tests/msgcat.test.
8
9
10
11
12
13
14
15

16
17
18
19
20
21
22
8
9
10
11
12
13
14

15
16
17
18
19
20
21
22







-
+







#
# Copyright (c) 1998 Mark Harrison.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: msgcat.test,v 1.8 2000/04/11 21:16:18 ericm Exp $
# RCS: @(#) $Id: msgcat.test,v 1.8.2.1 2000/08/03 21:40:55 ericm Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

if {[catch {package require msgcat 1.0}]} {
397
398
399
400
401
402
403



404
405
406
407
408
409
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412







+
+
+






} "this is a test"
test msgcat-7.2 {::msgcat::mc, extra args go through to format} {
    ::msgcat::mc format2 "good test"
} "this is a good test"
test msgcat-7.3 {::msgcat::mc, errors from format are propagated} {
    catch {::msgcat::mc format3 "good test"}
} 1
test msgcat-7.4 {::msgcat::mc, extra args are given to unknown} {
    ::msgcat::mc "this is a %s" "good test"
} "this is a good test"

# Reset the locale
::msgcat::mclocale $oldlocale

::tcltest::cleanupTests
return
Changes to tests/namespace.test.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







# Functionality covered: this file contains a collection of tests for the
# procedures in tclNamesp.c that implement Tcl's basic support for
# namespaces. Other namespace-related tests appear in variable.test.
#
# Sourcing this file into Tcl runs the tests and generates output for
# errors. No output means no errors were found.
#
# Copyright (c) 1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: namespace.test,v 1.12 2000/04/10 17:19:02 ericm Exp $
# RCS: @(#) $Id: namespace.test,v 1.12.2.1 2001/11/29 20:08:33 msofer Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

# Clear out any namespaces called test_ns_*
1090
1091
1092
1093
1094
1095
1096


















































1097
1098
1099
1100
1101
1102
1103
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







test namespace-38.1 {UpdateStringOfNsName} {
    catch {eval namespace delete [namespace children :: test_ns_*]}
    ;# Tcl_NamespaceObjCmd calls UpdateStringOfNsName to get subcmd name
    list [namespace eval {} {namespace current}] \
         [namespace eval {} {namespace current}]
} {:: ::}


test namespace-41.1 {Shadowing byte-compiled commands, Bug: 231259} {
    set res {}
    namespace eval ns {
	set res {}
	proc test {} {
	    set ::g 0
	}  
	lappend ::res [test]
	proc set {a b} {
	    ::set a [incr b]
	}
	lappend ::res [test]
    }
    namespace delete ns
    set res
} {0 1}

# These tests were back-ported with the patch to [Bug 231259]
test namespace-41.2 {Shadowing byte-compiled commands, Bug: 231259} {
    set res {}
    namespace eval ns {}
    proc ns::a {i} {
	variable b
	proc set args {return "New proc is called"}
	return [set b $i]
    }
    ns::a 1
    set res [ns::a 2]
    namespace delete ns
    set res
} {New proc is called}

test namespace-41.3 {Shadowing byte-compiled commands, Bug: 231259} {knownbug} {
    set res {}
    namespace eval ns {
	variable b 0
    }

    proc ns::a {i} {
	variable b
	proc set args {return "New proc is called"}
	return [set b $i]
    }
    
    set res [list [ns::a 1] $ns::b]
    namespace delete ns
    set res
} {{New proc is called} 0}

# cleanup
catch {rename cmd1 {}}
catch {unset l}
catch {unset msg}
catch {unset trigger}
eval namespace delete [namespace children :: test_ns_*]
::tcltest::cleanupTests
Changes to tests/obj.test.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







# Functionality covered: this file contains a collection of tests for the
# procedures in tclObj.c that implement Tcl's basic type support and the
# type managers for the types boolean, double, and integer.
#
# Sourcing this file into Tcl runs the tests and generates output for
# errors. No output means no errors were found.
#
# Copyright (c) 1995-1996 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: obj.test,v 1.5 2000/04/10 17:19:02 ericm Exp $
# RCS: @(#) $Id: obj.test,v 1.5.2.1 2002/04/26 08:44:09 dkf Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

if {[info commands testobj] == {}} {
180
181
182
183
184
185
186












187
188
189
190
191
192
193
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







+
+
+
+
+
+
+
+
+
+
+
+







} {abc 1 {expected boolean value but got "abc"}}
test obj-11.4 {Tcl_GetBooleanFromObj, error converting from "empty string"} {
    set result ""
    lappend result [testobj newobj 1]
    lappend result [catch {testbooleanobj not 1} msg]
    lappend result $msg
} {{} 1 {expected boolean value but got ""}}
test obj-11.5 {Tcl_GetBooleanFromObj, convert hex to boolean} {
    set result ""
    lappend result [teststringobj set 1 0xac]
    lappend result [testbooleanobj not 1]
    lappend result [testobj type 1]
} {0xac 0 boolean}
test obj-11.6 {Tcl_GetBooleanFromObj, convert float to boolean} {
    set result ""
    lappend result [teststringobj set 1 5.42]
    lappend result [testbooleanobj not 1]
    lappend result [testobj type 1]
} {5.42 0 boolean}

test obj-12.1 {DupBooleanInternalRep} {
    set result ""
    lappend result [testbooleanobj set 1 1]
    lappend result [testobj duplicate 1 2]   ;# uses DupBooleanInternalRep
    lappend result [testbooleanobj get 2]
} {1 1 1}
Changes to tests/opt.test.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







# Package covered:  opt1.0/optparse.tcl
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1994-1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: opt.test,v 1.6 2000/04/10 17:19:02 ericm Exp $
# RCS: @(#) $Id: opt.test,v 1.6.2.1 2000/08/07 21:32:11 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

# the package we are going to test
29
30
31
32
33
34
35
36
37
38





39
40
41
42
43
44
45
29
30
31
32
33
34
35



36
37
38
39
40
41
42
43
44
45
46
47







-
-
-
+
+
+
+
+







set n $::tcl::OptDescN

test opt-1.1 {OptKeyRegister / check that auto allocation is skipping existing keys} {
    list [::tcl::OptKeyRegister {} $n] [::tcl::OptKeyRegister {} [expr $n+1]] [::tcl::OptKeyRegister {}]
} "$n [expr $n+1] [expr $n+2]"

test opt-2.1 {OptKeyDelete} {
    list [::tcl::OptKeyRegister {} testkey] [::tcl::OptKeyDelete testkey] \
	    [catch {::tcl::OptKeyDelete testkey} msg] $msg;
} {testkey {} 1 {can't unset "OptDesc(testkey)": no such element in array}}
    list [::tcl::OptKeyRegister {} testkey] \
	    [info exists ::tcl::OptDesc(testkey)] \
	    [::tcl::OptKeyDelete testkey] \
	    [info exists ::tcl::OptDesc(testkey)]
} {testkey 1 {} 0}


test opt-3.1 {OptParse / temp key is removed} {
    set n $::tcl::OptDescN
    set prev [array names ::tcl::OptDesc]
    ::tcl::OptKeyRegister {} $n
    list [info exists ::tcl::OptDesc($n)]\
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
133
134
135
136
137
138
139











140
141
142
143
144
145
146







-
-
-
-
-
-
-
-
-
-
-








test opt-8.7 {List utilities} {
    set l {a {b c 7 e} f}
    ::tcl::Lvarincr l {1 2} -9
    set l
} {a {b c -2 e} f}

test opt-8.8 {List utilities} {
    set l {{b c 7 e} f}
    ::tcl::Lfirst $l
} {b c 7 e}


test opt-8.9 {List utilities} {
    set l {a {b c 7 e} f}
    ::tcl::Lrest $l
} {{b c 7 e} f}

test opt-8.10 {List utilities} {
    set l {a {b c 7 e} f}
    ::tcl::Lvarpop l
    set l
} {{b c 7 e} f}

test opt-8.11 {List utilities} {
Changes to tests/pkg.test.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







# Commands covered:  pkg
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1995-1996 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: pkg.test,v 1.8 2000/04/10 17:19:03 ericm Exp $
# RCS: @(#) $Id: pkg.test,v 1.8.2.1 2001/08/24 16:19:10 dgp Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

# Do all this in a slave interp to avoid garbaging the
297
298
299
300
301
302
303








304
305
306
307
308
309
310
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318







+
+
+
+
+
+
+
+







    package ifneeded b 2.3 {second script}
    package ifneeded c 1.4 {third script}
    package forget
    set result [list [lsort [package names]]]
    package forget a c
    lappend result [lsort [package names]]
} {{a b c} b}
test pkg-3.5.1 {Tcl_PackageCmd procedure, "forget" option} {
    # Test for Bug 415273
    package ifneeded a 1 "I should have been forgotten"
    package forget no-such-package a
    set x [package ifneeded a 1]
    package forget a
    set x
} {}
test pkg-3.6 {Tcl_PackageCmd procedure, "ifneeded" option} {
    list [catch {package ifneeded a} msg] $msg
} {1 {wrong # args: should be "package ifneeded package version ?script?"}}
test pkg-3.7 {Tcl_PackageCmd procedure, "ifneeded" option} {
    list [catch {package ifneeded a b c d} msg] $msg
} {1 {wrong # args: should be "package ifneeded package version ?script?"}}
test pkg-3.8 {Tcl_PackageCmd procedure, "ifneeded" option} {
Changes to tests/pkgMkIndex.test.
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10

11
12
13
14
15
16
17
18










-
+







# This file contains tests for the pkg_mkIndex command.
# Note that the tests are limited to Tcl scripts only, there are no shared
# libraries against which to test.
#
# Sourcing this file into Tcl runs the tests and generates output for
# errors.  No output means no errors were found.
#
# Copyright (c) 1998-1999 by Scriptics Corporation.
# All rights reserved.
#
# RCS: @(#) $Id: pkgMkIndex.test,v 1.16 2000/04/10 17:19:03 ericm Exp $
# RCS: @(#) $Id: pkgMkIndex.test,v 1.16.2.1 2001/04/03 22:54:38 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

set origDir [pwd]
161
162
163
164
165
166
167
168

169
170
171
172
173
174
175
161
162
163
164
165
166
167

168
169
170
171
172
173
174
175







-
+







    set dirPath [lindex $parsed 1]
    set patternList [lindex $parsed 2]

    file mkdir $dirPath
 
    if {[catch {
	file delete [file join $dirPath pkgIndex.tcl]
	eval pkg_mkIndex $options $dirPath $patternList
	eval pkg_mkIndex $options [list $dirPath] $patternList
    } err]} {
	return [list 1 $err]
    }

    return [list 0 {}]
}

357
358
359
360
361
362
363




















364
365
366
367
368
369
370
371
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+








} {0 {{football:1.0 {tclPkgSetup {samename.tcl source {::college::team ::pro::team}}}}}}

# Proc names with embedded spaces are properly listed (ie, correct number of
# braces) in result
test pkgMkIndex-13.1 {proc names with embedded spaces} {
    pkgtest::runIndex -lazy $fullPkgPath spacename.tcl
} {0 {{spacename:1.0 {tclPkgSetup {spacename.tcl source {{a b} {c d}}}}}}}

# Test the pkg_compareExtension helper function
test pkgMkIndex-14.1 {pkg_compareExtension} {unixOnly} {
    pkg_compareExtension foo.so .so
} 1
test pkgMkIndex-14.2 {pkg_compareExtension} {unixOnly} {
    pkg_compareExtension foo.so.bar .so
} 0
test pkgMkIndex-14.3 {pkg_compareExtension} {unixOnly} {
    pkg_compareExtension foo.so.1 .so
} 1
test pkgMkIndex-14.4 {pkg_compareExtension} {unixOnly} {
    pkg_compareExtension foo.so.1.2 .so
} 1
test pkgMkIndex-14.5 {pkg_compareExtension} {unixOnly} {
    pkg_compareExtension foo .so
} 0
test pkgMkIndex-14.6 {pkg_compareExtension} {unixOnly} {
    pkg_compareExtension foo.so.1.2.bar .so
} 0

# cleanup

namespace delete pkgtest
cd $origDir
::tcltest::cleanupTests
return

Changes to tests/regexp.test.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







# Commands covered:  regexp, regsub
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1998 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: regexp.test,v 1.13 2000/04/10 21:08:27 ericm Exp $
# RCS: @(#) $Id: regexp.test,v 1.13.2.1 2001/04/03 22:54:38 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

catch {unset foo}
522
523
524
525
526
527
528








529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540





















+
+
+
+
+
+
+
+




-
-
-
-
-
-
-
-
-
-
-
-
-
-
    # Go to index 1; a* matches the lambda (or {}) there then stops.   Recall
    #   that a* matches zero or more "a"'s; thus it matches the string "b", as
    #   there are zero or more "a"'s there.
    # Go to index 2; a* matches the "a" there then stops.
    # Go to index 3; this is past the end of the string, so stop.
    regexp -all -inline {a*} aba
} {a {} a}
test regexp-18.11 {regexp -all} {
    regexp -all -inline {^a} aaaa
} {a}

test regexp-19.1 {regsub null replacement} {
    regsub -all {@} {@hel@lo@} "\0a\0" result
    list $result [string length $result]
} "\0a\0hel\0a\0lo\0a\0 14"

# cleanup
::tcltest::cleanupTests
return














Changes to tests/rename.test.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







# Commands covered:  rename
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1994 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: rename.test,v 1.8 2000/04/10 17:19:03 ericm Exp $
# RCS: @(#) $Id: rename.test,v 1.8.2.1 2001/09/12 20:34:59 dgp Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

# Must eliminate the "unknown" command while the test is running,
170
171
172
173
174
175
176


177
178
170
171
172
173
174
175
176
177
178
179
180







+
+


    set msg
} {called "incr" with too many arguments}

if {[info commands incr.old] != {}} {
    catch {rename incr {}}
    catch {rename incr.old incr}
}
catch {rename x {}}
catch {rename kill {}}
::tcltest::cleanupTests
return
Changes to tests/scan.test.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







# Commands covered:  scan
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1991-1994 The Regents of the University of California.
# Copyright (c) 1994-1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: scan.test,v 1.10 2000/04/10 17:19:04 ericm Exp $
# RCS: @(#) $Id: scan.test,v 1.10.2.2 2002/02/07 01:54:04 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

test scan-1.1 {BuildCharSet, CharInSet} {
227
228
229
230
231
232
233



234
235
236









237
238
239
240
241
242
243
227
228
229
230
231
232
233
234
235
236
237
238

239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254







+
+
+


-
+
+
+
+
+
+
+
+
+







    list [scan {+1238 -1239 123a} {%o%*s%o%*s%o} x y z] $x $y $z
} {3 83 -83 83}
test scan-4.39 {Tcl_ScanObjCmd, base-16 integer scanning} {
    set x {}
    list [scan {+1238 -123a 0123} {%x%x%x} x y z] $x $y $z
} {3 4664 -4666 291}
test scan-4.40 {Tcl_ScanObjCmd, base-16 integer scanning} {
    # The behavior changed in 8.4a4/8.3.4cvs (6 Feb) to correctly
    # return '1' for 0x1 scanned via %x, to comply with 8.0 and C scanf.
    # Bug #495213
    set x {}
    list [scan {aBcDeF AbCdEf 0x1} {%x%x%x} x y z] $x $y $z
} {3 11259375 11259375 0}
} {3 11259375 11259375 1}
test scan-4.40.1 {Tcl_ScanObjCmd, base-16 integer scanning} {
    set x {}
    list [scan {0xF 0x00A0B 0X0XF} {%x %x %x} x y z] $x $y $z
} {3 15 2571 0}
test scan-4.40.2 {Tcl_ScanObjCmd, base-16 integer scanning} {
    catch {unset x}
    list [scan {xF} {%x} x] [info exists x]
} {0 0}
test scan-4.41 {Tcl_ScanObjCmd, base-unknown integer scanning} {
    set x {}
    list [scan {10 010 0x10} {%i%i%i} x y z] $x $y $z
} {3 10 8 16}
test scan-4.42 {Tcl_ScanObjCmd, base-unknown integer scanning} {
    set x {}
    list [scan {10 010 0X10} {%i%i%i} x y z] $x $y $z
319
320
321
322
323
324
325





























326
327
328
329
330
331
332
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







    catch {unset z}; array set z {}
    set result [list [catch {scan {abc def ghi} {%s%s%s} x z y} msg] \
	    $msg $x]
    unset y
    unset z
    set result
} {1 {couldn't set variable "z"couldn't set variable "y"} abc}

# procedure that returns the range of integers

proc int_range {} {
    for { set MIN_INT 1 } { $MIN_INT > 0 } {} {
	set MIN_INT [expr { $MIN_INT << 1 }]
    }
    set MAX_INT [expr { ~ $MIN_INT }]
    return [list $MIN_INT $MAX_INT]
}

test scan-4.62 {scanning of large and negative octal integers} {
    foreach { MIN_INT MAX_INT } [int_range] {}
    set scanstring [format {%o %o %o} -1 $MIN_INT $MAX_INT]
    list [scan $scanstring {%o %o %o} a b c] \
	[expr { $a == -1 }] [expr { $b == $MIN_INT }] [expr { $c == $MAX_INT }]
} {3 1 1 1}
test scan-4.63 {scanning of large and negative hex integers} {
    foreach { MIN_INT MAX_INT } [int_range] {}
    set scanstring [format {%x %x %x} -1 $MIN_INT $MAX_INT]
    list [scan $scanstring {%x %x %x} a b c] \
	[expr { $a == -1 }] [expr { $b == $MIN_INT }] [expr { $c == $MAX_INT }]
} {3 1 1 1}

# clean up from last two tests

catch {
    rename int_range {}
}

test scan-5.1 {integer scanning} {
    set a {}; set b {}; set c {}; set d {}
    list [scan "-20 1476 \n33 0" "%d %d %d %d" a b c d] $a $b $c $d
} {4 -20 1476 33 0}
test scan-5.2 {integer scanning} {
    set a {}; set b {}; set c {}
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
666
667
668
669
670
671
672





















-
-
-
-
-
-
-
-
-
-
-
-
-
-
    set msg [scan "10 20 30" {%100$d %5$d %200$d}]
    list [llength $msg] [lindex $msg 99] [lindex $msg 4] [lindex $msg 199]
} {200 10 20 30}

# cleanup
::tcltest::cleanupTests
return














Changes to tests/socket.test.
1
2
3
4
5
6
7
8

9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7

8
9
10
11
12

13
14
15
16
17
18
19
20







-
+




-
+







# Commands tested in this file: socket.
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1994-1996 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
# Copyright (c) 1998-2000 Ajuba Solutions.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: socket.test,v 1.14 2000/04/10 17:19:04 ericm Exp $
# RCS: @(#) $Id: socket.test,v 1.14.2.2 2002/01/26 00:30:31 mdejong Exp $

# Running socket tests with a remote server:
# ------------------------------------------
# 
# Some tests in socket.test depend on the existence of a remote server to
# which they connect. The remote server must be an instance of tcltest and it
# must run the script found in the file "remote.tcl" in this directory. You
63
64
65
66
67
68
69
70

71
72
73

74
75
76
77
78
79
80
63
64
65
66
67
68
69

70
71
72
73
74
75
76
77
78
79
80
81







-
+



+







# using the remote server are not performed.

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

# Some tests require the testthread command
# Some tests require the testthread and exec commands

set ::tcltest::testConstraints(testthread) \
	[expr {[info commands testthread] != {}}]
set ::tcltest::testConstraints(exec) [expr {[info commands exec] != {}}]

#
# If remoteServerIP or remoteServerPort are not set, check in the
# environment variables for externally set values.
#

if {![info exists remoteServerIP]} {
547
548
549
550
551
552
553
554
555


556
557
558
559
560

561
562
563
564
565
566

567
568
569
570
571
572
573
548
549
550
551
552
553
554


555
556
557
558
559
560

561
562
563
564
565
566

567
568
569
570
571
572
573
574







-
-
+
+




-
+





-
+







    set sock ""
    set s2 [socket 127.0.0.1 2400]
    vwait sock
    puts $s2 one
    flush $s2
    after 500
    fconfigure $sock -blocking 0
    set result [gets $sock]
    lappend result [gets $sock]
    set result a:[gets $sock]
    lappend result b:[gets $sock]
    fconfigure $sock -blocking 1
    puts $s2 two
    flush $s2
    fconfigure $sock -blocking 0
    lappend result [gets $sock]
    lappend result c:[gets $sock]
    fconfigure $sock -blocking 1
    close $s2
    close $s
    close $sock
    set result
} {one {} two}
} {a:one b: c:two}


test socket-3.1 {socket conflict} {socket stdio} {
    removeFile script
    set f [open script w]
    puts $f {
	set f [socket -server accept 2828]
820
821
822
823
824
825
826
827

828
829
830
831
832
833
834
821
822
823
824
825
826
827

828
829
830
831
832
833
834
835







-
+







} {3 127.0.0.1 0}
test socket-7.3 {testing socket specific options} {socket} {
    set s [socket -server accept 2822]
    set l [fconfigure $s]
    close $s
    update
    llength $l
} 12
} 14
test socket-7.4 {testing socket specific options} {socket} {
    set s [socket -server accept 2823]
    proc accept {s a p} {
	global x
	set x [fconfigure $s -sockname]
	close $s
    }
1272
1273
1274
1275
1276
1277
1278

1279
1280
1281
1282
1283
1284
1285
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287







+







    fileevent $c readable "readlittle $c"
    set timer [after 10000 "set done timed_out"]
    vwait done
    after cancel $timer
    sendCommand {close $socket10_13_test_server}
    list $spurious $len
} {0 2690}

test socket-11.12 {testing EOF stickyness} {socket doTestsWithRemoteServer} {
    set counter 0
    set done 0
    proc count_up {s} {
	global counter done after_id
	set l [gets $s]
	if {[eof $s]} {
1299
1300
1301
1302
1303
1304
1305
1306

1307
1308
1309
1310
1311

1312
1313
1314
1315
1316
1317
1318
1301
1302
1303
1304
1305
1306
1307

1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321







-
+





+







    sendCommand {
	set socket10_14_test_server [socket -server accept 2836]
	proc accept {s a p} {
	    after 100 close $s
	}
    }
    set c [socket $remoteServerIP 2836]
    fileevent $c readable "count_up $c"
    fileevent $c readable [list count_up $c]
    set after_id [after 1000 timed_out]
    vwait done
    sendCommand {close $socket10_14_test_server}
    set done
} {EOF is sticky}

test socket-11.13 {testing async write, async flush, async close} \
	{socket doTestsWithRemoteServer} {
    proc readit {s} {
	global count done
	set l [read $s]
	incr count [string length $l]
	if {[eof $s]} {
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
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







-
+
-


















-
+

-




-
+







    set timer [after 10000 "set done timed_out"]
    vwait done
    after cancel $timer
    sendCommand {close $l}
    set count
} 65566

test socket-12.1 {testing inheritance of server sockets} \
test socket-12.1 {testing inheritance of server sockets} {socket exec} {
	{socket doTestsWithRemoteServer} {
    removeFile script1
    removeFile script2

    # Script1 is just a 10 second delay.  If the server socket
    # is inherited, it will be held open for 10 seconds

    set f [open script1 w]
    puts $f {
	after 10000 exit
	vwait forever
    }
    close $f

    # Script2 creates the server socket, launches script1,
    # waits a second, and exits.  The server socket will now
    # be closed unless script1 inherited it.

    set f [open script2 w]
    puts $f [list set tcltest $::tcltest::tcltest]
    puts $f [list set tclsh $::tcltest::tcltest]
    puts $f {
	package require tcltest
	set f [socket -server accept 2828]
	proc accept { file addr port } {
	    close $file
	}
	exec $::tcltest::tcltest script1 &
	exec $tclsh script1 &
	close $f
	after 1000 exit
	vwait forever
    }
    close $f
	
    # Launch script2 and wait 5 seconds
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
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







-
+
-


















-
+


-
+











-








-







	set x {server socket was inherited}
    }

    removeFile script1
    removeFile script2
    set x
} {server socket was not inherited}
test socket-12.2 {testing inheritance of client sockets} \
test socket-12.2 {testing inheritance of client sockets} {socket exec} {
	{socket doTestsWithRemoteServer} {
    removeFile script1
    removeFile script2

    # Script1 is just a 10 second delay.  If the server socket
    # is inherited, it will be held open for 10 seconds

    set f [open script1 w]
    puts $f {
	after 10000 exit
	vwait forever
    }
    close $f

    # Script2 opens the client socket and writes to it.  It then
    # launches script1 and exits.  If the child process inherited the
    # client socket, the socket will still be open.

    set f [open script2 w]
    puts $f [list set tcltest $::tcltest::tcltest]
    puts $f [list set tclsh $::tcltest::tcltest]
    puts $f {
	set f [socket 127.0.0.1 2829]
	exec $::tcltest::tcltest script1 &
	exec $tclsh script1 &
	puts $f testing
	flush $f
	after 1000 exit
	vwait forever
    }
    close $f

    # Create the server socket

    set server [socket -server accept 2829]
    proc accept { file host port } {

	# When the client connects, establish the read handler
	global server
	close $server
	fileevent $file readable [list getdata $file]
	fconfigure $file -buffering line -blocking 0
	return
    }
    proc getdata { file } {

	# Read handler on the accepted socket.
	global x
	global failed
	set status [catch {read $file} data]
	if {$status != 0} {
	    set x {read failed, error was $data}
	    catch { close $file }
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
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







-
+
-











-
+

-
+

-
+

-
+














-
+










-







    if {!$failed} {
	vwait failed
    }
    removeFile script1
    removeFile script2
    set x
} {client socket was not inherited}
test socket-12.3 {testing inheritance of accepted sockets} \
test socket-12.3 {testing inheritance of accepted sockets} {socket exec} {
	{socket doTestsWithRemoteServer} {
    removeFile script1
    removeFile script2

    set f [open script1 w]
    puts $f {
	after 10000 exit
	vwait forever
    }
    close $f

    set f [open script2 w]
    puts $f [list set tcltest $::tcltest::tcltest]
    puts $f [list set tclsh $::tcltest::tcltest]
    puts $f {
	set server [socket -server accept 2930]
	set server [socket -server accept 2931]
	proc accept { file host port } {
	    global tcltest
	    global tclsh
	    puts $file {test data on socket}
	    exec $::tcltest::tcltest script1 &
	    exec $tclsh script1 &
	    after 1000 exit
	}
	vwait forever
    }
    close $f

    # Launch the script2 process and connect to it.  See how long
    # the socket stays open

    exec $::tcltest::tcltest script2 &

    after 1000 set ok_to_proceed 1
    vwait ok_to_proceed

    set f [socket 127.0.0.1 2930]
    set f [socket 127.0.0.1 2931]
    fconfigure $f -buffering full -blocking 0
    fileevent $f readable [list getdata $f]

    # If the socket is still open after 5 seconds, the script1 process
    # must have inherited the accepted socket.

    set failed 0
    after 5000 set failed 1

    proc getdata { file } {

	# Read handler on the client socket.
	global x
	global failed
	set status [catch {read $file} data]
	if {$status != 0} {
	    set x {read failed, error was $data}
	    catch { close $file }
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1634
1635
1636
1637
1638
1639
1640


















-
-
-
-
-
-
-
-
-
-
-
   flush $commandSocket
}
catch {close $commandSocket}
catch {close $remoteProcChan}
::tcltest::cleanupTests
flush stdout
return











Changes to tests/split.test.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







# Commands covered:  split
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1994-1996 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: split.test,v 1.6 2000/04/10 17:19:04 ericm Exp $
# RCS: @(#) $Id: split.test,v 1.6.2.1 2001/09/12 20:34:59 dgp Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

test split-1.1 {basic split commands} {
65
66
67
68
69
70
71

72
73
74
75
76
77
78
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79







+







    list [catch split msg] $msg $errorCode
} {1 {wrong # args: should be "split string ?splitChars?"} NONE}
test split-2.2 {split errors} {
    list [catch {split a b c} msg] $msg $errorCode
} {1 {wrong # args: should be "split string ?splitChars?"} NONE}

# cleanup
catch {rename foo {}}
::tcltest::cleanupTests
return





Changes to tests/stack.test.
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
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






-
+




-
+







+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+





+
+
+
+
+
+
+
+
+
+




# Tests that the stack size is big enough for the application.
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1998-1999 by Scriptics Corporation.
# Copyright (c) 1998-2000 Ajuba Solutions.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: stack.test,v 1.8 2000/04/10 17:19:04 ericm Exp $
# RCS: @(#) $Id: stack.test,v 1.8.2.3 2001/09/11 18:23:45 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

# Note that a failure in this test results in a crash of the executable.
# In order to avoid that, we do a basic check of the current stacksize.
# This size can be changed with ulimit (ksh/bash/sh) or limit (csh/tcsh).

# This doesn't catch all cases, for example threads of lower stacksize
# can still squeak through.  A core check is really needed. -- JH

if {[string equal $::tcl_platform(platform) "unix"]} {
    set stackSize [exec /bin/sh -c "ulimit -s"]
    if {[string is integer $stackSize] && ($stackSize < 2400)} {
        puts stderr "WARNING: the default application stacksize of $stackSize\
                may cause Tcl to\ncrash due to stack overflow before the\
                recursion limit is reached.\nA minimum stacksize of 2400\
                kbytes is recommended.\nSkipping inifite recursion test."
        set ::tcltest::testConstraints(minStack2400) 0
    } else {
        set ::tcltest::testConstraints(minStack2400) 1
    }
} else {
    set ::tcltest::testConstraints(minStack2400) 1
}

test stack-1.1 {maxNestingDepth reached on infinite recursion} {
test stack-1.1 {maxNestingDepth reached on infinite recursion} {minStack2400} {
    proc recurse {} { return [recurse] }
    catch {recurse} rv
    rename recurse {}
    set rv
} {too many nested calls to Tcl_EvalObj (infinite loop?)}

test stack-2.1 {maxNestingDepth reached on infinite recursion} {minStack2400} {
    # do this in a slave to not mess with parent
    set slave stack-2.1
    interp create $slave
    $slave eval { interp alias {} unknown {} notaknownproc }
    set msg [$slave eval { catch {foo} msg ; set msg }]
    interp delete $slave
    set msg
} {too many nested calls to AliasObjCmd (infinite loop using alias?)}

# cleanup
::tcltest::cleanupTests
return
Changes to tests/string.test.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







# Commands covered:  string
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1994 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: string.test,v 1.23 2000/04/10 17:19:04 ericm Exp $
# RCS: @(#) $Id: string.test,v 1.23.2.1 2001/04/03 22:54:38 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

# Some tests require the testobj command
251
252
253
254
255
256
257






258
259
260
261
262
263
264
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270







+
+
+
+
+
+







} 0
test string-5.17 {string index, bad integer} {
    list [catch {string index "abc" 08} msg] $msg
} {1 {bad index "08": must be integer or end?-integer? (looks like invalid octal number)}}
test string-5.18 {string index, bad integer} {
    list [catch {string index "abc" end-00289} msg] $msg
} {1 {expected integer but got "-00289" (looks like invalid octal number)}}
test string-5.19 {string index, bytearray object out of bounds} {
    string index [binary format I* {0x50515253 0x52}] -1
} {}
test string-5.20 {string index, bytearray object out of bounds} {
    string index [binary format I* {0x50515253 0x52}] 20
} {}


proc largest_int {} {
    # This will give us what the largest valid int on this machine is,
    # so we can test for overflow properly below on >32 bit systems
    set int 1
    set exp 7; # assume we get at least 8 bits
676
677
678
679
680
681
682









683
684
685
686
687
688
689
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704







+
+
+
+
+
+
+
+
+







} aueue\334\0EU
test string-10.13 {string map, -nocase unicode} {
    string map -nocase [list \374 ue UE \334] "a\374ueUE\000EU"
} aue\334\334\0EU
test string-10.14 {string map, -nocase null arguments} {
    string map -nocase {{} abc} foo
} foo
test string-10.15 {string map, one pair case} {
    string map -nocase {abc 32} aAbCaBaAbAbcAb
} {a32aBaAb32Ab}
test string-10.16 {string map, one pair case} {
    string map -nocase {ab 4321} aAbCaBaAbAbcAb
} {a4321C4321a43214321c4321}
test string-10.17 {string map, one pair case} {
    string map {Ab 4321} aAbCaBaAbAbcAb
} {a4321CaBa43214321c4321}

test string-11.1 {string match, too few args} {
    list [catch {string match a} msg] $msg
} {1 {wrong # args: should be "string match ?-nocase? pattern string"}}
test string-11.2 {string match, too many args} {
    list [catch {string match a b c d} msg] $msg
} {1 {wrong # args: should be "string match ?-nocase? pattern string"}}
794
795
796
797
798
799
800





































801
802
803
804
805
806
807
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







} 0
test string-11.37 {string match nocase} {
    string match -nocase {[A-fh-Z]} g
} 0
test string-11.38 {string match case, reverse range} {
    string match {[A-fh-Z]} g
} 1
test string-11.39 {string match, *\ case} {
    string match {*\abc} abc
} 1
test string-11.40 {string match, *special case} {
    string match {*[ab]} abc
} 0
test string-11.41 {string match, *special case} {
    string match {*[ab]*} abc
} 1
test string-11.42 {string match, *special case} {
    string match "*\\" "\\"
} 0
test string-11.43 {string match, *special case} {
    string match "*\\\\" "\\"
} 1
test string-11.44 {string match, *special case} {
    string match "*???" "12345"
} 1
test string-11.45 {string match, *special case} {
    string match "*???" "12"
} 0
test string-11.46 {string match, *special case} {
    string match "*\\*" "abc*"
} 1
test string-11.47 {string match, *special case} {
    string match "*\\*" "*"
} 1
test string-11.48 {string match, *special case} {
    string match "*\\*" "*abc"
} 0
test string-11.49 {string match, *special case} {
    string match "?\\*" "a*"
} 1
test string-11.50 {string match, *special case} {
    string match "\\" "\\"
} 0


test string-12.1 {string range} {
    list [catch {string range} msg] $msg
} {1 {wrong # args: should be "string range string first last"}}
test string-12.2 {string range} {
    list [catch {string range a 1} msg] $msg
} {1 {wrong # args: should be "string range string first last"}}
880
881
882
883
884
885
886






















887
888
889
890
891
892
893
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







} {abcabcabc}
test string-13.6 {string repeat} {
    string repeat abc -1
} {}
test string-13.7 {string repeat} {
    list [catch {string repeat abc end} msg] $msg
} {1 {expected integer but got "end"}}
test string-13.8 {string repeat} {
    string repeat {} -1000
} {}
test string-13.9 {string repeat} {
    string repeat {} 0
} {}
test string-13.10 {string repeat} {
    string repeat def 0
} {}
test string-13.11 {string repeat} {
    string repeat def 1
} def
test string-13.12 {string repeat} {
    string repeat ab\u7266cd 3
} ab\u7266cdab\u7266cdab\u7266cd
test string-13.13 {string repeat} {
    string repeat \x00 3
} \x00\x00\x00
test string-13.14 {string repeat} {
    # The string range will ensure us that string repeat gets a unicode string
    string repeat [string range ab\u7266cd 2 3] 3
} \u7266c\u7266c\u7266c

test string-14.1 {string replace} {
    list [catch {string replace} msg] $msg
} {1 {wrong # args: should be "string replace string first last ?string?"}}
test string-14.2 {string replace} {
    list [catch {string replace a 1} msg] $msg
} {1 {wrong # args: should be "string replace string first last ?string?"}}
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1233
1234
1235
1236
1237
1238
1239













-
-
-
-
-
-
test string-22.13 {string wordstart, unicode} {
    string wordstart "\uc700\uc700 abc" 8
} 3

# cleanup
::tcltest::cleanupTests
return






Changes to tests/stringObj.test.
8
9
10
11
12
13
14
15

16
17
18
19
20
21
22
8
9
10
11
12
13
14

15
16
17
18
19
20
21
22







-
+







#
# Copyright (c) 1995-1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: stringObj.test,v 1.10 2000/04/10 17:19:04 ericm Exp $
# RCS: @(#) $Id: stringObj.test,v 1.10.2.2 2001/04/03 22:54:38 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

if {[info commands testobj] == {}} {
317
318
319
320
321
322
323
324

325





326
327
328
329

330
331




332
333
334
335

336
337




338
339
340
341
342
343




344

345
346
347
348
349
350
351
317
318
319
320
321
322
323

324
325
326
327
328
329
330
331
332
333

334
335

336
337
338
339
340
341
342

343
344

345
346
347
348
349
350
351
352
353
354
355
356
357
358

359
360
361
362
363
364
365
366







-
+

+
+
+
+
+



-
+

-
+
+
+
+



-
+

-
+
+
+
+






+
+
+
+
-
+







    set q
} {a b c d e f a ü b å c ï}

test stringObj-10.1 {Tcl_GetRange with all byte-size chars} {
    set x "abcdef"
    list [testobj objtype $x] [set y [string range $x 1 end-1]] \
	    [testobj objtype $x] [testobj objtype $y]
} {none bcde string string}
} [list none bcde string string]
test stringObj-10.2 {Tcl_GetRange with some mixed width chars} {
    # Because this test does not use \uXXXX notation below instead of
    # hardcoding the values, it may fail in multibyte locales.  However,
    # we need to test that the parser produces untyped objects even when there
    # are high-ASCII characters in the input (like "ï").  I don't know what
    # else to do but inline those characters here.
    set x "abcïïdef"
    list [testobj objtype $x] [set y [string range $x 1 end-1]] \
	    [testobj objtype $x] [testobj objtype $y]
} {none bcïïde string string}
} [list none "bc\u00EF\u00EFde" string string]
test stringObj-10.3 {Tcl_GetRange with some mixed width chars} {
    set x "abcïïdef"
    # set x "abcïïdef"
    # Use \uXXXX notation below instead of hardcoding the values, otherwise
    # the test will fail in multibyte locales.
    set x "abc\u00EF\u00EFdef"
    string length $x
    list [testobj objtype $x] [set y [string range $x 1 end-1]] \
	    [testobj objtype $x] [testobj objtype $y]
} {string bcïïde string string}
} [list string "bc\u00EF\u00EFde" string string]
test stringObj-10.4 {Tcl_GetRange with some mixed width chars} {
    set a "ïa¿b®cï¿d®"
    # set a "ïa¿b®cï¿d®"
    # Use \uXXXX notation below instead of hardcoding the values, otherwise
    # the test will fail in multibyte locales.
    set a "\u00EFa\u00BFb\u00AEc\u00EF\u00BFd\u00AE"
    set result [list]
    while {[string length $a] > 0} {
	set a [string range $a 1 end-1]
	lappend result $a
    }
    set result
} [list a\u00BFb\u00AEc\u00EF\u00BFd	\
	\u00BFb\u00AEc\u00EF\u00BF	\
	b\u00AEc\u00EF			\
	\u00AEc				\
} {a¿b®cï¿d ¿b®cï¿ b®cï ®c {}}
	{}]

test stringObj-11.1 {UpdateStringOfString} {
    set x 2345
    list [string index $x end] [testobj objtype $x] [incr x] \
	    [testobj objtype $x]
} {5 string 2346 int}

383
384
385
386
387
388
389
390




391
392
393




394
395
396
397
398
399
400
398
399
400
401
402
403
404

405
406
407
408
409
410

411
412
413
414
415
416
417
418
419
420
421







-
+
+
+
+


-
+
+
+
+







    set a "abcdef"
    list [string length $a] [string length $a]
} {6 6}
test stringObj-13.4 {Tcl_GetCharLength with mixed width chars} {
    string length "®" 
} 1
test stringObj-13.5 {Tcl_GetCharLength with mixed width chars} {
    string length "○○" 
    # string length "○○" 
    # Use \uXXXX notation below instead of hardcoding the values, otherwise
    # the test will fail in multibyte locales.
    string length "\u00EF\u00BF\u00AE\u00EF\u00BF\u00AE"
} 6
test stringObj-13.6 {Tcl_GetCharLength with mixed width chars} {
    set a "ïa¿b®cï¿d®"
    # set a "ïa¿b®cï¿d®"
    # Use \uXXXX notation below instead of hardcoding the values, otherwise
    # the test will fail in multibyte locales.
    set a "\u00EFa\u00BFb\u00AEc\u00EF\u00BFd\u00AE"
    list [string length $a] [string length $a]
} {10 10}

testobj freeallvars

# cleanup
::tcltest::cleanupTests
Changes to tests/subst.test.
1
2
3
4
5
6
7
8
9

10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8

9
10
11
12
13

14
15
16
17
18
19
20
21








-
+




-
+







# Commands covered:  subst
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1994 The Regents of the University of California.
# Copyright (c) 1994 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
# Copyright (c) 1998-2000 Ajuba Solutions.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: subst.test,v 1.6 2000/04/10 17:19:05 ericm Exp $
# RCS: @(#) $Id: subst.test,v 1.6.2.1 2001/04/03 22:54:38 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

test subst-1.1 {basics} {
105
106
107
108
109
110
111











112
113
114
115
116
117
118
119
120
121
122













123






124















125















126



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







+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
    subst -novariables {abc $x [expr 1+2] \\\x41}
} {abc $x 3 \A}
test subst-7.7 {switches} {
    set x 123
    subst -nov -nob -noc {abc $x [expr 1+2] \\\x41}
} {abc $x [expr 1+2] \\\x41}

test subst-8.1 {return in a subst} {
    subst {foo [return {x}; bogus code] bar}
} {foo x bar}
test subst-8.2 {return in a subst} {
    subst {foo [return x ; bogus code] bar}
} {foo x bar}
test subst-8.3 {return in a subst} {
    subst {foo [if 1 { return {x}; bogus code }] bar}
} {foo x bar}
test subst-8.4 {return in a subst} {
    subst {[eval {return hi}] there}
# cleanup
::tcltest::cleanupTests
return








} {hi there}
test subst-8.5 {return in a subst} {
    subst {foo [return {]}; bogus code] bar}
} {foo ] bar}
test subst-8.6 {return in a subst} {
    subst {foo [return {x}; bogus code bar}
} {foo x}
test subst-8.7 {return in a subst, parse error} {
    subst {foo [return {x} ; set a {}" ; stuff] bar}
} {foo xset a {}" ; stuff] bar}
test subst-8.8 {return in a subst, parse error} {
    subst {foo [return {x} ; set bar baz ; set a {}" ; stuff] bar}
} {foo xset bar baz ; set a {}" ; stuff] bar}

test subst-9.1 {error in a subst} {
    list [catch {subst {[error foo; bogus code]bar}} msg] $msg
} {1 foo}
test subst-9.2 {error in a subst} {
    list [catch {subst {[if 1 { error foo; bogus code}]bar}} msg] $msg
} {1 foo}

test subst-10.1 {break in a subst} {
    subst {foo [break; bogus code] bar}
} {foo  bar}
test subst-10.2 {break in a subst} {
    subst {foo [break; return x; bogus code] bar}
} {foo  bar}
test subst-10.3 {break in a subst} {
    subst {foo [if 1 { break; bogus code}] bar}
} {foo  bar}
test subst-10.4 {break in a subst, parse error} {
    subst {foo [break ; set a {}{} ; stuff] bar}
} {foo set a {}{} ; stuff] bar}
test subst-10.5 {break in a subst, parse error} {
    subst {foo [break ;set bar baz ;set a {}{} ; stuff] bar}
} {foo set bar baz ;set a {}{} ; stuff] bar}

test subst-11.1 {continue in a subst} {
    subst {foo [continue; bogus code] bar}
} {foo  bar}
test subst-11.2 {continue in a subst} {
    subst {foo [continue; return x; bogus code] bar}
} {foo  bar}
test subst-11.3 {continue in a subst} {
    subst {foo [if 1 { continue; bogus code}] bar}
} {foo  bar}
test subst-11.4 {continue in a subst, parse error} {
    subst {foo [continue ; set a {}{} ; stuff] bar}
} {foo set a {}{} ; stuff] bar}
test subst-11.5 {continue in a subst, parse error} {
    subst {foo [continue ;set bar baz ;set a {}{} ; stuff] bar}
} {foo set bar baz ;set a {}{} ; stuff] bar}

# cleanup
::tcltest::cleanupTests
return
Changes to tests/timer.test.
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
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







-
+














-
+














-
+







#
# Copyright (c) 1997 by Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: timer.test,v 1.7 2000/04/10 17:19:05 ericm Exp $
# RCS: @(#) $Id: timer.test,v 1.7.2.1 2001/10/13 01:14:19 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

test timer-1.1 {Tcl_CreateTimerHandler procedure} {
    foreach i [after info] {
	after cancel $i
    }
    set x ""
    foreach i {100 200 1000 50 150} {
	after $i lappend x $i
    }
    after 200
    after 210
    update
    set x
} {50 100 150 200}

test timer-2.1 {Tcl_DeleteTimerHandler procedure} {
    foreach i [after info] {
	after cancel $i
    }
    set x ""
    foreach i {100 200 300 50 150} {
	after $i lappend x $i
    }
    after cancel lappend x 150
    after cancel lappend x 50
    after 200
    after 210
    update
    set x
} {100 200}

# No tests for Tcl_ServiceTimer or ResetTimer, since it is already tested
# above.

63
64
65
66
67
68
69
70

71
72
73
74
75
76
77
63
64
65
66
67
68
69

70
71
72
73
74
75
76
77







-
+







test timer-3.2 {TimerHandlerEventProc procedure: multiple timers} {
    foreach i [after info] {
	after cancel $i
    }
    foreach i {200 600 1000} {
	after $i lappend x $i
    }
    after 200
    after 210
    set result ""
    set x ""
    update
    lappend result $x
    after 400
    update
    lappend result $x
95
96
97
98
99
100
101
102

103
104
105
106
107
108
109
95
96
97
98
99
100
101

102
103
104
105
106
107
108
109







-
+







    foreach i [after info] {
	after cancel $i
    }
    set x {}
    after 100 lappend x a
    after 200 lappend x b
    after 300 lappend x c
    after 300
    after 310
    vwait x
    set x
} {a b c}
test timer-3.5 {TimerHandlerEventProc procedure: reentrantly added timers don't fire} {
    foreach i [after info] {
	after cancel $i
    }
Changes to tests/trace.test.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







# Commands covered:  trace
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1994 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: trace.test,v 1.6 2000/04/10 17:19:05 ericm Exp $
# RCS: @(#) $Id: trace.test,v 1.6.2.2 2002/03/29 22:42:50 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

proc traceScalar {name1 name2 op} {
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
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



















+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+










-
-
-
-
-
-
-
-
-
-
-
-
test trace-17.1 {unset traces on procedure returns} {
    proc p1 {x y} {set a 44; p2 14}
    proc p2 {z} {trace var z u {traceCheck {lsort [uplevel {info vars}]}}}
    set info {}
    p1 foo bar
    set info
} {0 {a x y}}

test trace-18.1 {test for Tcl Bug 219393} {
    # This test demonstrates the memory corruption error described
    # in Tcl Bug 219393.  On some platforms it may cause a segfault.
    # On others it may apparently succeed, but the memory problems
    # should be detectable when evaluating the test suite with a
    # tool like Purify.
    proc p1 args {
	trace vdelete x r p1
	trace variable x r p1
	error "This causes memory error"
    }
    set x 123
    trace variable x r p1
    catch {set x}
} 1
test trace-18.2 {namespace delete / trace vdelete combo} {
    namespace eval ::foo {
	variable x 123
    }
    proc p1 args {
	trace vdelete ::foo::x u p1
    }
    trace variable ::foo::x u p1
    namespace delete ::foo
    info exists ::foo::x
} 0

# Delete arrays when done, so they can be re-used as scalars
# elsewhere.

catch {unset x}
catch {unset y}

# cleanup
::tcltest::cleanupTests
return












Changes to tests/unixInit.test.
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
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












-
+






+
+










-
+


-
+







# The file tests the functions in the tclUnixInit.c file.
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1997 by Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: unixInit.test,v 1.13 2000/04/10 17:19:05 ericm Exp $
# RCS: @(#) $Id: unixInit.test,v 1.13.2.4 2001/10/10 20:05:46 dgp Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

set ::tcltest::testConstraints(notInstalledInTmp) \
	[string match /tmp/lib/* [info library]]
if {[info exists env(TCL_LIBRARY)]} {
    set oldlibrary $env(TCL_LIBRARY)
    unset env(TCL_LIBRARY)
}
catch {set oldlang $env(LANG)}
set env(LANG) C

# Some tests will fail if they are run on a machine that doesn't have
# this Tcl version installed (as opposed to built) on it.
if {[catch {
    set f [open "|[list $::tcltest::tcltest exit]" w+]
    set f [open "|[list $::tcltest::tcltest]" w+]
    exec kill -PIPE [pid $f]
    close $f
}]} {
} msg]} {
    set ::tcltest::testConstraints(installedTcl) 0
} else {
    set ::tcltest::testConstraints(installedTcl) 1
}

test unixInit-1.1 {TclpInitPlatform: ignore SIGPIPE} {unixOnly installedTcl} {
    set x {}
146
147
148
149
150
151
152





































































153
154
155
156
157
158
159
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







    set x
} [list /tmp/sparkly/lib/tcl[info tclversion] /tmp/lib/tcl[info tclversion]]
test unixInit-2.7 {TclpInitLibraryPath: compiled-in library path} \
	{emptyTest unixOnly} {
    # would need test command to get defaultLibDir and compare it to
    # [lindex $auto_path end]
} {}
test unixInit-2.8 {TclpInitLibraryPath: all absolute pathtype} {unixOnly notInstalledInTmp} {
    # Checking for Bug 219416
    # When a program that embeds the Tcl library, like tcltest, is
    # installed near the "root" of the file system, there was a problem
    # constructing directories relative to the executable.  When a 
    # relative ".." went past the root, relative path names were created
    # rather than absolute pathnames.  In some cases, accessing past the
    # root caused memory access violations too.
    #
    # The bug is now fixed, but here we check for it by making sure that
    # the directories constructed relative to the executable are all
    # absolute pathnames, even when the executable is installed near
    # the root of the filesystem.
    #
    # The only directory near the root we are likely to have write access
    # to is /tmp.
    file delete -force /tmp/sparkly
    file delete -force /tmp/lib/tcl[info tclversion]
    file mkdir /tmp/sparkly
    file copy $::tcltest::tcltest /tmp/sparkly/tcltest

    # Keep any existing /tmp/lib directory
    set deletelib 1
    if {[file exists /tmp/lib]} {
	if {[file isdirectory /tmp/lib]} {
	    set deletelib 0
	} else {
	    file delete -force /tmp/lib
	}
    }

    # For a successful Tcl_Init, we need a [source]-able init.tcl in
    # ../lib/tcl$version relative to the executable.
    file mkdir /tmp/lib/tcl[info tclversion]
    close [open /tmp/lib/tcl[info tclversion]/init.tcl w]

    # Check that all directories in the library path are absolute pathnames
    set allAbsolute 1
    foreach dir [getlibpath /tmp/sparkly/tcltest] {
	set allAbsolute [expr {$allAbsolute \
		&& [string equal absolute [file pathtype $dir]]}]
    }

    # Clean up temporary installation
    file delete -force /tmp/sparkly
    file delete -force /tmp/lib/tcl[info tclversion]
    if {$deletelib} {file delete -force /tmp/lib}
    set allAbsolute
} 1
test unixInit-2.9 {TclpInitLibraryPath: paths relative to executable} {
	unixOnly} {
    # Checking for Bug 438014
    file delete -force /tmp/sparkly
    file delete -force /tmp/library
    file mkdir /tmp/sparkly
    file copy $::tcltest::tcltest /tmp/sparkly/tcltest

    file mkdir /tmp/library/
    close [open /tmp/library/init.tcl w]

    set x [lrange [getlibpath /tmp/sparkly/tcltest] 0 4]

    file delete -force /tmp/sparkly
    file delete -force /tmp/library
    set x
} [list /tmp/lib/tcl[info tclversion] /lib/tcl[info tclversion] \
	/tmp/library /library [format /tcl%s/library \
	[expr {[regexp {[ab]} [info patchlevel]] ? 
	[info patchleve] : [info tclversion]}]]]
test unixInit-3.1 {TclpSetInitialEncodings} {unixOnly installedTcl} {
    set env(LANG) C

    set f [open "|[list $::tcltest::tcltest]" w+]
    fconfigure $f -buffering none
    puts $f {puts [encoding system]; exit}
    set enc [gets $f]
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
243
244
245
246
247
248
249
250



251
252
253
254
255
256

257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273

274
275
276
277
278

279
280
281
282
283







+
-
-
-
+
+
+
+
+

-
+
















-
+




-
+
+



    puts $f {puts [encoding system]; exit}
    set enc [gets $f]
    close $f
    unset env(LANG)
    unset env(LC_ALL)
    catch {set env(LC_ALL) $oldlc_all}

    set validEncodings [list euc-jp]
    switch $tcl_platform(os) {
	HP-UX {set expectedEncoding shiftjis}
	default {set expectedEncoding euc-jp}
    if {[string match HP-UX $tcl_platform(os)]} {
	# Some older HP-UX systems need us to accept this as valid
	# Bug 453883 reports that newer HP-UX systems report euc-jp
	# like everybody else.
	lappend validEncodings shiftjis
    }
    string compare $enc $expectedEncoding
    expr {[lsearch -exact $validEncodings $enc] < 0}
} 0
    
test unixInit-4.1 {TclpSetVariables} {unixOnly} {
    # just make sure they exist

    set a [list $tcl_library $tcl_pkgPath $tcl_platform(os)]
    set a [list $tcl_platform(osVersion) $tcl_platform(machine)]
    set tcl_platform(platform)
} "unix"

test unixInit-5.1 {Tcl_Init} {emptyTest unixOnly} {
    # test initScript
} {}

test unixInit-6.1 {Tcl_SourceRCFile} {emptyTest unixOnly} {
} {}
    

# cleanup
if {[info exists oldlibrary]} {
    set env(TCL_LIBRARY) $oldlibrary
}
catch {unset env(LANG); set env(LANG) $oldlang}
catch {unset env(LANG)}
catch {set env(LANG) $oldlang}
::tcltest::cleanupTests
return

Changes to tests/util.test.
1
2
3
4
5
6
7
8
9
10

11
12
13
14
15
16
17
1
2
3
4
5
6
7
8
9

10
11
12
13
14
15
16
17









-
+







# This file is a Tcl script to test the code in the file tclUtil.c.
# This file is organized in the standard fashion for Tcl tests.
#
# Copyright (c) 1995-1998 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: util.test,v 1.7 2000/04/10 17:19:06 ericm Exp $
# RCS: @(#) $Id: util.test,v 1.7.2.1 2001/07/16 23:14:13 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

if {[info commands testobj] == {}} {
58
59
60
61
62
63
64




65
66
67
68
69
70
71
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75







+
+
+
+







} {a b\\  c}
test util-4.4 {Tcl_ConcatObj - backslash-space at end of argument} {
    concat a {b } c
} {a b c}
test util-4.5 {Tcl_ConcatObj - backslash-space at end of argument} {
    concat a { } c
} {a c}
test util-4.6 {Tcl_ConcatObj - utf-8 sequence with "whitespace" char} {
    # Check for Bug #227512.  If this violates C isspace, then it returns \xc3.
    concat \xe0
} \xe0

test util-5.1 {Tcl_StringMatch} {
    string match ab*c abc
} 1
test util-5.2 {Tcl_StringMatch} {
    string match ab**c abc
} 1
Changes to tests/var.test.
10
11
12
13
14
15
16
17

18
19
20
21
22
23
24
10
11
12
13
14
15
16

17
18
19
20
21
22
23
24







-
+







#
# Copyright (c) 1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: var.test,v 1.15 2000/04/10 17:19:06 ericm Exp $
# RCS: @(#) $Id: var.test,v 1.15.2.1 2001/11/09 23:09:09 dgp Exp $
#

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

320
321
322
323
324
325
326










327
328
329
330
331
332
333
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343







+
+
+
+
+
+
+
+
+
+







    set ::test_ns_var::test_ns_nested:: 24
    proc p {} {
        global ::test_ns_var::test_ns_nested::
        set {}
    }
    p
} {24}
test var-6.4 {Tcl_GlobalObjCmd, variable name matching :*} {
    # Test for Tcl Bug 480176
    set :v broken
    proc p {} {
	global :v
	set :v fixed
    }
    p
    set :v
} {fixed}

test var-7.1 {Tcl_VariableObjCmd, create and initialize one new ns variable} {
    catch {namespace delete test_ns_var}
    namespace eval test_ns_var {
        variable one 1
    }
    list [info vars test_ns_var::*] [set test_ns_var::one]
Changes to tests/winFCmd.test.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







# This file tests the tclWinFCmd.c file.
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1996-1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: winFCmd.test,v 1.9 2000/04/10 17:19:06 ericm Exp $
# RCS: @(#) $Id: winFCmd.test,v 1.9.2.1 2001/10/12 23:43:10 hobbs Exp $
#

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

39
40
41
42
43
44
45














46
47
48
49
50
51
52
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+







	    set x [glob [file join $p tf*] [file join $p td*]]
	}
	if {$x != ""} {
	    catch {eval file delete -force -- $x}
	}
    }
}

if {[string equal $tcl_platform(platform) "windows"]} {
    if {[string equal $tcl_platform(os) "Windows NT"] \
      && [string equal [string index $tcl_platform(osVersion) 0] "5"]} {
	set tcltest::testConstraints(win2000) 1
	set tcltest::testConstraints(notWin2000) 0
    } else {
	set tcltest::testConstraints(win2000) 0
	set tcltest::testConstraints(notWin2000) 1
    }
} else {
    set tcltest::testConstraints(win2000) 0
    set tcltest::testConstraints(notWin2000) 0
}

set ::tcltest::testConstraints(cdrom) 0
set ::tcltest::testConstraints(exdev) 0

# find a CD-ROM so we can test read-only filesystems.

set cdrom {}
184
185
186
187
188
189
190
191





192
193
194
195
196
197
198
198
199
200
201
202
203
204

205
206
207
208
209
210
211
212
213
214
215
216







-
+
+
+
+
+







    cleanup
    createfile tf1
    set fd [open tf2 w]
    set msg [list [catch {testfile mv tf1 tf2} msg] $msg]
    close $fd
    set msg
} {1 EACCES}
test winFCmd-1.13 {TclpRenameFile: errno: EACCES} {pcOnly} {
test winFCmd-1.13 {TclpRenameFile: errno: EACCES} {win2000} {
    cleanup
    list [catch {testfile mv nul tf1} msg] $msg
} {1 EINVAL}
test winFCmd-1.13.1 {TclpRenameFile: errno: EACCES} {notWin2000} {
    cleanup
    list [catch {testfile mv nul tf1} msg] $msg
} {1 EACCES}
test winFCmd-1.14 {TclpRenameFile: errno: EACCES} {95} {
    cleanup
    createfile tf1
    list [catch {testfile mv tf1 nul} msg] $msg
212
213
214
215
216
217
218
219





220
221
222
223
224
225
226
230
231
232
233
234
235
236

237
238
239
240
241
242
243
244
245
246
247
248







-
+
+
+
+
+







    cleanup
    list [catch {testfile mv tf1 tf2} msg] $msg
} {1 ENOENT} 
test winFCmd-1.18 {TclpRenameFile: srcAttr == -1} {pcOnly} {
    cleanup
    list [catch {testfile mv tf1 tf2} msg] $msg
} {1 ENOENT} 
test winFCmd-1.19 {TclpRenameFile: errno == EACCES} {pcOnly} {
test winFCmd-1.19 {TclpRenameFile: errno == EACCES} {win2000} {
    cleanup
    list [catch {testfile mv nul tf1} msg] $msg
} {1 EINVAL}
test winFCmd-1.19.1 {TclpRenameFile: errno == EACCES} {notWin2000} {
    cleanup
    list [catch {testfile mv nul tf1} msg] $msg
} {1 EACCES}
test winFCmd-1.20 {TclpRenameFile: src is dir} {nt} {
    # under 95, this would actually succeed and move the current dir out from 
    # under the current process!
    cleanup
357
358
359
360
361
362
363
364





365
366
367
368
369
370
371
379
380
381
382
383
384
385

386
387
388
389
390
391
392
393
394
395
396
397







-
+
+
+
+
+







    cleanup
    createfile tf1
    set fd [open tf2 w]
    set msg [list [catch {testfile cp tf1 tf2} msg] $msg]
    close $fd
    set msg
} {1 EACCES}
test winFCmd-2.8 {TclpCopyFile: errno: EACCES} {nt} {
test winFCmd-2.8 {TclpCopyFile: errno: EACCES} {win2000} {
    cleanup
    list [catch {testfile cp nul tf1} msg] $msg
} {1 EINVAL}
test winFCmd-2.8.1 {TclpCopyFile: errno: EACCES} {nt notWin2000} {
    cleanup
    list [catch {testfile cp nul tf1} msg] $msg
} {1 EACCES}
test winFCmd-2.9 {TclpCopyFile: errno: ENOENT} {95} {
    cleanup
    list [catch {testfile cp nul tf1} msg] $msg
} {1 ENOENT}
Changes to tests/winPipe.test.
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
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







-
+







-



-







#
# Copyright (c) 1996 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: winPipe.test,v 1.12 2000/04/10 17:19:06 ericm Exp $
# RCS: @(#) $Id: winPipe.test,v 1.12.2.1 2001/10/13 01:14:34 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

set bindir [file join [pwd] [file dirname [info nameofexecutable]]]
set cat16 [file join  $bindir cat16.exe]
set cat32 [file join $bindir cat32.exe]

set ::tcltest::testConstraints(cat32) [file exists $cat32]
set ::tcltest::testConstraints(cat16) [file exists $cat16]

if {[catch {puts console1 ""}]} {
    set ::tcltest::testConstraints(AllocConsole) 1
} else {
    set ::tcltest::testConstraints(.console) 1
}

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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280

281
282
283
284
285
286
287
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







-
+














-
+
-




-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-


-
+







    exec $cat32 < little >@$f1 2>@$f2
    close $f1
    close $f2
    list [contents stdout] [contents stderr]
} {little stderr32}
test winpipe-1.20 {32 bit comprehensive tests: write to application} \
	{pcOnly stdio cat32} {
    set f [open "|$cat32 > stdout" w]
    set f [open |[list $cat32 >stdout] w]
    puts -nonewline $f "foo"
    catch {close $f} msg
    list [contents stdout] $msg
} {foo stderr32}
test winpipe-1.21 {32 bit comprehensive tests: read/write application} \
	{pcOnly stdio cat32} {
    set f [open "|$cat32" r+]
    puts $f $big
    puts $f \032
    flush $f
    set r [read $f 64]
    catch {close $f}
    set r
} "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
test winpipe-1.22 {Checking command.com for Win95/98 hanging} \
test winpipe-1.22 {Checking command.com for Win95/98 hanging} {95 stdio} {
	{pcOnly stdio} {
    exec command.com /c dir /b
    set result 1
} 1

test winpipe-2.1 {16 bit comprehensive tests: from little file} {pcOnly stdio cat16} {
    exec $cat16 < little > stdout 2> stderr
    list [contents stdout] [contents stderr]
} "little stderr16"
test winpipe-2.2 {16 bit comprehensive tests: from big file} {pcOnly stdio cat16} {
    exec $cat16 < big > stdout 2> stderr
    list [contents stdout] [contents stderr] 
} "{$big} stderr16"
test winpipe-2.3 {16 bit comprehensive tests: a little from pipe} {pcOnly stdio cat16} {
    exec $::tcltest::tcltest more < little | $cat16 > stdout 2> stderr
    list [contents stdout] [contents stderr]
} {little stderr16}
test winpipe-2.4 {16 bit comprehensive tests: a lot from pipe} {nt stdio cat16} {
    exec $cat16 < big | $cat16 > stdout 2> stderr
    list [contents stdout] [contents stderr] 
} "{$big} stderr16stderr16"
test winpipe-2.5 {16 bit comprehensive tests: a lot from pipe} {95 stdio cat16} {
    exec $::tcltest::tcltest more < big | $cat16 > stdout 2> stderr
    list [contents stdout] [contents stderr] 
} "{$big} stderr16"
test winpipe-2.6 {16 bit comprehensive tests: from console} \
	{pcOnly stdio cat16 AllocConsole} {
    # would block waiting for human input
} {}		     
test winpipe-2.7 {16 bit comprehensive tests: from NUL} {nt stdio cat16} {
    exec $cat16 < nul > stdout 2> stderr
    list [contents stdout] [contents stderr]
} "{} stderr16"
test winpipe-2.8 {16 bit comprehensive tests: from socket} {pcOnly stdio cat16} {
    # doesn't work
} {}
test winpipe-2.9 {16 bit comprehensive tests: from nowhere} {pcOnly stdio cat16 .console} {
    exec $cat16 > stdout 2> stderr
    list [contents stdout] [contents stderr]
} "{} stderr16"
test winpipe-2.10 {16 bit comprehensive tests: from file handle} {pcOnly stdio cat16} {
    set f [open "little" r]
    exec $cat16 <@$f > stdout 2> stderr
    close $f
    list [contents stdout] [contents stderr]
} "little stderr16"
test winpipe-2.11 {16 bit comprehensive tests: read from application} {pcOnly stdio cat16} {
    set f [open "|$cat16 < little" r]
    gets $f line
    catch {close $f} msg
    list $line $msg
} "little stderr16"
test winpipe-2.12 {16 bit comprehensive tests: a little to file} {pcOnly stdio cat16} {
    exec $cat16 < little > stdout 2> stderr
    list [contents stdout] [contents stderr]
} "little stderr16"
test winpipe-2.13 {16 bit comprehensive tests: a lot to file} {pcOnly stdio cat16} {
    exec $cat16 < big > stdout 2> stderr
    list [contents stdout] [contents stderr]
} "{$big} stderr16"
test winpipe-2.14 {16 bit comprehensive tests: a little to pipe} {pcOnly stdio cat16} {
    exec $cat16 < little | $::tcltest::tcltest more > stdout 2> stderr
    list [contents stdout] [contents stderr]
} {little stderr16}
test winpipe-2.15 {16 bit comprehensive tests: a lot to pipe} {pcOnly stdio cat16} {
    exec $cat16 < big | $::tcltest::tcltest more > stdout 2> stderr
    list [contents stdout] [contents stderr]
} "{$big} stderr16"
test winpipe-2.16 {16 bit comprehensive tests: to console} {pcOnly stdio cat16} {
    catch {exec $cat16 << "You should see this\n" >@stdout} msg
    set msg
} [lindex stderr16 0]
test winpipe-2.17 {16 bit comprehensive tests: to NUL} {nt stdio cat16} {
    # some apps hang when sending a large amount to NUL.  cat16 isn't one.
    catch {exec $cat16 < big > nul} msg
    set msg
} stderr16
test winpipe-2.18 {16 bit comprehensive tests: to nowhere} {pcOnly stdio cat16 .console} {
    exec $cat16 < big >&@stdout 
} {}
test winpipe-2.19 {16 bit comprehensive tests: to file handle} {pcOnly stdio cat16} {
    set f1 [open "stdout" w]
    set f2 [open "stderr" w]
    exec $cat16 < little >@$f1 2>@$f2
    close $f1
    close $f2
    list [contents stdout] [contents stderr]
} "little stderr16"
test winpipe-2.20 {16 bit comprehensive tests: write to application} {pcOnly stdio cat16} {
    set f [open "|$cat16 > stdout" w]
    puts -nonewline $f "foo"
    catch {close $f} msg
    list [contents stdout] $msg
} "foo stderr16"
test winpipe-2.21 {16 bit comprehensive tests: read/write application} {nt stdio cat16} {
    set f [open "|$cat16" r+]
    puts $f $big
    puts $f \032
    flush $f
    set r [read $f 64]
    catch {close $f}
    set r
} "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
file delete more

test winpipe-4.1 {Tcl_WaitPid} {nt stdio} {
test winpipe-4.1 {Tcl_WaitPid} {nt stdio cat32} {
    proc readResults {f} {
	global x result
	if { [eof $f] } {
	    close $f
	    set x 1
	} else {
	    set line [read $f ]
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
300
301
302
303
304
305
306


















-
-
-
-
-
-
-
-
-
-
-
    unset env(TEMP)
}

# cleanup
file delete big little stdout stderr nothing echoArgs.tcl
::tcltest::cleanupTests
return











Added tools/configure.

















































































































































































































































































































































































































































































































































































































































































































































































































































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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#! /bin/sh

# Guess values for system-dependent variables and create Makefiles.
# Generated automatically using autoconf version 2.13 
# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
#
# This configure script is free software; the Free Software Foundation
# gives unlimited permission to copy, distribute and modify it.

# Defaults:
ac_help=
ac_default_prefix=/usr/local
# Any additions from configure.in:
ac_help="$ac_help
  --with-tcl=DIR          use Tcl 8.3 binaries from DIR"

# Initialize some variables set by options.
# The variables have the same names as the options, with
# dashes changed to underlines.
build=NONE
cache_file=./config.cache
exec_prefix=NONE
host=NONE
no_create=
nonopt=NONE
no_recursion=
prefix=NONE
program_prefix=NONE
program_suffix=NONE
program_transform_name=s,x,x,
silent=
site=
srcdir=
target=NONE
verbose=
x_includes=NONE
x_libraries=NONE
bindir='${exec_prefix}/bin'
sbindir='${exec_prefix}/sbin'
libexecdir='${exec_prefix}/libexec'
datadir='${prefix}/share'
sysconfdir='${prefix}/etc'
sharedstatedir='${prefix}/com'
localstatedir='${prefix}/var'
libdir='${exec_prefix}/lib'
includedir='${prefix}/include'
oldincludedir='/usr/include'
infodir='${prefix}/info'
mandir='${prefix}/man'

# Initialize some other variables.
subdirs=
MFLAGS= MAKEFLAGS=
SHELL=${CONFIG_SHELL-/bin/sh}
# Maximum number of lines to put in a shell here document.
ac_max_here_lines=12

ac_prev=
for ac_option
do

  # If the previous option needs an argument, assign it.
  if test -n "$ac_prev"; then
    eval "$ac_prev=\$ac_option"
    ac_prev=
    continue
  fi

  case "$ac_option" in
  -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
  *) ac_optarg= ;;
  esac

  # Accept the important Cygnus configure options, so we can diagnose typos.

  case "$ac_option" in

  -bindir | --bindir | --bindi | --bind | --bin | --bi)
    ac_prev=bindir ;;
  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
    bindir="$ac_optarg" ;;

  -build | --build | --buil | --bui | --bu)
    ac_prev=build ;;
  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
    build="$ac_optarg" ;;

  -cache-file | --cache-file | --cache-fil | --cache-fi \
  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
    ac_prev=cache_file ;;
  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
    cache_file="$ac_optarg" ;;

  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
    ac_prev=datadir ;;
  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
  | --da=*)
    datadir="$ac_optarg" ;;

  -disable-* | --disable-*)
    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
    fi
    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
    eval "enable_${ac_feature}=no" ;;

  -enable-* | --enable-*)
    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
    fi
    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
    case "$ac_option" in
      *=*) ;;
      *) ac_optarg=yes ;;
    esac
    eval "enable_${ac_feature}='$ac_optarg'" ;;

  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
  | --exec | --exe | --ex)
    ac_prev=exec_prefix ;;
  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
  | --exec=* | --exe=* | --ex=*)
    exec_prefix="$ac_optarg" ;;

  -gas | --gas | --ga | --g)
    # Obsolete; use --with-gas.
    with_gas=yes ;;

  -help | --help | --hel | --he)
    # Omit some internal or obsolete options to make the list less imposing.
    # This message is too long to be a string in the A/UX 3.1 sh.
    cat << EOF
Usage: configure [options] [host]
Options: [defaults in brackets after descriptions]
Configuration:
  --cache-file=FILE       cache test results in FILE
  --help                  print this message
  --no-create             do not create output files
  --quiet, --silent       do not print \`checking...' messages
  --version               print the version of autoconf that created configure
Directory and file names:
  --prefix=PREFIX         install architecture-independent files in PREFIX
                          [$ac_default_prefix]
  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                          [same as prefix]
  --bindir=DIR            user executables in DIR [EPREFIX/bin]
  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
  --datadir=DIR           read-only architecture-independent data in DIR
                          [PREFIX/share]
  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
  --sharedstatedir=DIR    modifiable architecture-independent data in DIR
                          [PREFIX/com]
  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
  --includedir=DIR        C header files in DIR [PREFIX/include]
  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
  --infodir=DIR           info documentation in DIR [PREFIX/info]
  --mandir=DIR            man documentation in DIR [PREFIX/man]
  --srcdir=DIR            find the sources in DIR [configure dir or ..]
  --program-prefix=PREFIX prepend PREFIX to installed program names
  --program-suffix=SUFFIX append SUFFIX to installed program names
  --program-transform-name=PROGRAM
                          run sed PROGRAM on installed program names
EOF
    cat << EOF
Host type:
  --build=BUILD           configure for building on BUILD [BUILD=HOST]
  --host=HOST             configure for HOST [guessed]
  --target=TARGET         configure for TARGET [TARGET=HOST]
Features and packages:
  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
  --x-includes=DIR        X include files are in DIR
  --x-libraries=DIR       X library files are in DIR
EOF
    if test -n "$ac_help"; then
      echo "--enable and --with options recognized:$ac_help"
    fi
    exit 0 ;;

  -host | --host | --hos | --ho)
    ac_prev=host ;;
  -host=* | --host=* | --hos=* | --ho=*)
    host="$ac_optarg" ;;

  -includedir | --includedir | --includedi | --included | --include \
  | --includ | --inclu | --incl | --inc)
    ac_prev=includedir ;;
  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
  | --includ=* | --inclu=* | --incl=* | --inc=*)
    includedir="$ac_optarg" ;;

  -infodir | --infodir | --infodi | --infod | --info | --inf)
    ac_prev=infodir ;;
  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
    infodir="$ac_optarg" ;;

  -libdir | --libdir | --libdi | --libd)
    ac_prev=libdir ;;
  -libdir=* | --libdir=* | --libdi=* | --libd=*)
    libdir="$ac_optarg" ;;

  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
  | --libexe | --libex | --libe)
    ac_prev=libexecdir ;;
  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
  | --libexe=* | --libex=* | --libe=*)
    libexecdir="$ac_optarg" ;;

  -localstatedir | --localstatedir | --localstatedi | --localstated \
  | --localstate | --localstat | --localsta | --localst \
  | --locals | --local | --loca | --loc | --lo)
    ac_prev=localstatedir ;;
  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
    localstatedir="$ac_optarg" ;;

  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
    ac_prev=mandir ;;
  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
    mandir="$ac_optarg" ;;

  -nfp | --nfp | --nf)
    # Obsolete; use --without-fp.
    with_fp=no ;;

  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
  | --no-cr | --no-c)
    no_create=yes ;;

  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
    no_recursion=yes ;;

  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
  | --oldin | --oldi | --old | --ol | --o)
    ac_prev=oldincludedir ;;
  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
    oldincludedir="$ac_optarg" ;;

  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
    ac_prev=prefix ;;
  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
    prefix="$ac_optarg" ;;

  -program-prefix | --program-prefix | --program-prefi | --program-pref \
  | --program-pre | --program-pr | --program-p)
    ac_prev=program_prefix ;;
  -program-prefix=* | --program-prefix=* | --program-prefi=* \
  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
    program_prefix="$ac_optarg" ;;

  -program-suffix | --program-suffix | --program-suffi | --program-suff \
  | --program-suf | --program-su | --program-s)
    ac_prev=program_suffix ;;
  -program-suffix=* | --program-suffix=* | --program-suffi=* \
  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
    program_suffix="$ac_optarg" ;;

  -program-transform-name | --program-transform-name \
  | --program-transform-nam | --program-transform-na \
  | --program-transform-n | --program-transform- \
  | --program-transform | --program-transfor \
  | --program-transfo | --program-transf \
  | --program-trans | --program-tran \
  | --progr-tra | --program-tr | --program-t)
    ac_prev=program_transform_name ;;
  -program-transform-name=* | --program-transform-name=* \
  | --program-transform-nam=* | --program-transform-na=* \
  | --program-transform-n=* | --program-transform-=* \
  | --program-transform=* | --program-transfor=* \
  | --program-transfo=* | --program-transf=* \
  | --program-trans=* | --program-tran=* \
  | --progr-tra=* | --program-tr=* | --program-t=*)
    program_transform_name="$ac_optarg" ;;

  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
  | -silent | --silent | --silen | --sile | --sil)
    silent=yes ;;

  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
    ac_prev=sbindir ;;
  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
  | --sbi=* | --sb=*)
    sbindir="$ac_optarg" ;;

  -sharedstatedir | --sharedstatedir | --sharedstatedi \
  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
  | --sharedst | --shareds | --shared | --share | --shar \
  | --sha | --sh)
    ac_prev=sharedstatedir ;;
  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
  | --sha=* | --sh=*)
    sharedstatedir="$ac_optarg" ;;

  -site | --site | --sit)
    ac_prev=site ;;
  -site=* | --site=* | --sit=*)
    site="$ac_optarg" ;;

  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
    ac_prev=srcdir ;;
  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
    srcdir="$ac_optarg" ;;

  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
  | --syscon | --sysco | --sysc | --sys | --sy)
    ac_prev=sysconfdir ;;
  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
    sysconfdir="$ac_optarg" ;;

  -target | --target | --targe | --targ | --tar | --ta | --t)
    ac_prev=target ;;
  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
    target="$ac_optarg" ;;

  -v | -verbose | --verbose | --verbos | --verbo | --verb)
    verbose=yes ;;

  -version | --version | --versio | --versi | --vers)
    echo "configure generated by autoconf version 2.13"
    exit 0 ;;

  -with-* | --with-*)
    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
    fi
    ac_package=`echo $ac_package| sed 's/-/_/g'`
    case "$ac_option" in
      *=*) ;;
      *) ac_optarg=yes ;;
    esac
    eval "with_${ac_package}='$ac_optarg'" ;;

  -without-* | --without-*)
    ac_package=`echo $ac_option|sed -e 's/-*without-//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
    fi
    ac_package=`echo $ac_package| sed 's/-/_/g'`
    eval "with_${ac_package}=no" ;;

  --x)
    # Obsolete; use --with-x.
    with_x=yes ;;

  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
  | --x-incl | --x-inc | --x-in | --x-i)
    ac_prev=x_includes ;;
  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
    x_includes="$ac_optarg" ;;

  -x-libraries | --x-libraries | --x-librarie | --x-librari \
  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
    ac_prev=x_libraries ;;
  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
    x_libraries="$ac_optarg" ;;

  -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
    ;;

  *)
    if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
      echo "configure: warning: $ac_option: invalid host type" 1>&2
    fi
    if test "x$nonopt" != xNONE; then
      { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
    fi
    nonopt="$ac_option"
    ;;

  esac
done

if test -n "$ac_prev"; then
  { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
fi

trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15

# File descriptor usage:
# 0 standard input
# 1 file creation
# 2 errors and warnings
# 3 some systems may open it to /dev/tty
# 4 used on the Kubota Titan
# 6 checking for... messages and results
# 5 compiler messages saved in config.log
if test "$silent" = yes; then
  exec 6>/dev/null
else
  exec 6>&1
fi
exec 5>./config.log

echo "\
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
" 1>&5

# Strip out --no-create and --no-recursion so they do not pile up.
# Also quote any args containing shell metacharacters.
ac_configure_args=
for ac_arg
do
  case "$ac_arg" in
  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
  | --no-cr | --no-c) ;;
  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
  *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
  ac_configure_args="$ac_configure_args '$ac_arg'" ;;
  *) ac_configure_args="$ac_configure_args $ac_arg" ;;
  esac
done

# NLS nuisances.
# Only set these to C if already set.  These must not be set unconditionally
# because not all systems understand e.g. LANG=C (notably SCO).
# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
# Non-C LC_CTYPE values break the ctype check.
if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi

# confdefs.h avoids OS command line length limits that DEFS can exceed.
rm -rf conftest* confdefs.h
# AIX cpp loses on an empty file, so make sure it contains at least a newline.
echo > confdefs.h

# A filename unique to this package, relative to the directory that
# configure is in, which we can look for to find out if srcdir is correct.
ac_unique_file=man2tcl.c

# Find the source files, if location was not specified.
if test -z "$srcdir"; then
  ac_srcdir_defaulted=yes
  # Try the directory containing this script, then its parent.
  ac_prog=$0
  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
  srcdir=$ac_confdir
  if test ! -r $srcdir/$ac_unique_file; then
    srcdir=..
  fi
else
  ac_srcdir_defaulted=no
fi
if test ! -r $srcdir/$ac_unique_file; then
  if test "$ac_srcdir_defaulted" = yes; then
    { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
  else
    { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
  fi
fi
srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`

# Prefer explicitly selected file to automatically selected ones.
if test -z "$CONFIG_SITE"; then
  if test "x$prefix" != xNONE; then
    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
  else
    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
  fi
fi
for ac_site_file in $CONFIG_SITE; do
  if test -r "$ac_site_file"; then
    echo "loading site script $ac_site_file"
    . "$ac_site_file"
  fi
done

if test -r "$cache_file"; then
  echo "loading cache $cache_file"
  . $cache_file
else
  echo "creating cache $cache_file"
  > $cache_file
fi

ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

ac_exeext=
ac_objext=o
if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
  # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
    ac_n= ac_c='
' ac_t='	'
  else
    ac_n=-n ac_c= ac_t=
  fi
else
  ac_n= ac_c='\c' ac_t=
fi


# RCS: @(#) $Id: configure,v 1.1.2.1 2001/04/03 22:10:13 hobbs Exp $

# Recover information that Tcl computed with its configure script.

#--------------------------------------------------------------------
#       See if there was a command-line option for where Tcl is;  if
#       not, assume that its top-level directory is a sibling of ours.
#--------------------------------------------------------------------

# Check whether --with-tcl or --without-tcl was given.
if test "${with_tcl+set}" = set; then
  withval="$with_tcl"
  TCL_BIN_DIR=$withval
else
  TCL_BIN_DIR=`cd ../../tcl8.3$TCL_PATCH_LEVEL/unix; pwd`
fi

if test ! -d $TCL_BIN_DIR; then
    { echo "configure: error: Tcl directory $TCL_BIN_DIR doesn't exist" 1>&2; exit 1; }
fi
if test ! -f $TCL_BIN_DIR/tclConfig.sh; then
    { echo "configure: error: There's no tclConfig.sh in $TCL_BIN_DIR;  perhaps you didn't specify the Tcl *build* directory (not the toplevel Tcl directory) or you forgot to configure Tcl?" 1>&2; exit 1; }
fi

. $TCL_BIN_DIR/tclConfig.sh

TCL_WIN_VERSION=$TCL_MAJOR_VERSION$TCL_MINOR_VERSION

CC=$TCL_CC






trap '' 1 2 15
cat > confcache <<\EOF
# This file is a shell script that caches the results of configure
# tests run on this system so they can be shared between configure
# scripts and configure runs.  It is not useful on other systems.
# If it contains results you don't want to keep, you may remove or edit it.
#
# By default, configure uses ./config.cache as the cache file,
# creating it if it does not exist already.  You can give configure
# the --cache-file=FILE option to use a different cache file; that is
# what configure does when it calls configure scripts in
# subdirectories, so they share the cache.
# Giving --cache-file=/dev/null disables caching, for debugging configure.
# config.status only pays attention to the cache file if you give it the
# --recheck option to rerun configure.
#
EOF
# The following way of writing the cache mishandles newlines in values,
# but we know of no workaround that is simple, portable, and efficient.
# So, don't put newlines in cache variables' values.
# Ultrix sh set writes to stderr and can't be redirected directly,
# and sets the high bit in the cache file unless we assign to the vars.
(set) 2>&1 |
  case `(ac_space=' '; set | grep ac_space) 2>&1` in
  *ac_space=\ *)
    # `set' does not quote correctly, so add quotes (double-quote substitution
    # turns \\\\ into \\, and sed turns \\ into \).
    sed -n \
      -e "s/'/'\\\\''/g" \
      -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
    ;;
  *)
    # `set' quotes correctly as required by POSIX, so do not add quotes.
    sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
    ;;
  esac >> confcache
if cmp -s $cache_file confcache; then
  :
else
  if test -w $cache_file; then
    echo "updating cache $cache_file"
    cat confcache > $cache_file
  else
    echo "not updating unwritable cache $cache_file"
  fi
fi
rm -f confcache

trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15

test "x$prefix" = xNONE && prefix=$ac_default_prefix
# Let make expand exec_prefix.
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'

# Any assignment to VPATH causes Sun make to only execute
# the first set of double-colon rules, so remove it if not needed.
# If there is a colon in the path, we need to keep it.
if test "x$srcdir" = x.; then
  ac_vpsub='/^[ 	]*VPATH[ 	]*=[^:]*$/d'
fi

trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15

# Transform confdefs.h into DEFS.
# Protect against shell expansion while executing Makefile rules.
# Protect against Makefile macro expansion.
cat > conftest.defs <<\EOF
s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
s%[ 	`~#$^&*(){}\\|;'"<>?]%\\&%g
s%\[%\\&%g
s%\]%\\&%g
s%\$%$$%g
EOF
DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
rm -f conftest.defs


# Without the "./", some shells look in PATH for config.status.
: ${CONFIG_STATUS=./config.status}

echo creating $CONFIG_STATUS
rm -f $CONFIG_STATUS
cat > $CONFIG_STATUS <<EOF
#! /bin/sh
# Generated automatically by configure.
# Run this file to recreate the current configuration.
# This directory was configured as follows,
# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
#
# $0 $ac_configure_args
#
# Compiler output produced by configure, useful for debugging
# configure, is in ./config.log if it exists.

ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
for ac_option
do
  case "\$ac_option" in
  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
    echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
    exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
  -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
    echo "$CONFIG_STATUS generated by autoconf version 2.13"
    exit 0 ;;
  -help | --help | --hel | --he | --h)
    echo "\$ac_cs_usage"; exit 0 ;;
  *) echo "\$ac_cs_usage"; exit 1 ;;
  esac
done

ac_given_srcdir=$srcdir

trap 'rm -fr `echo "Makefile tcl.hpj" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
EOF
cat >> $CONFIG_STATUS <<EOF

# Protect against being on the right side of a sed subst in config.status.
sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
 s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
$ac_vpsub
$extrasub
s%@SHELL@%$SHELL%g
s%@CFLAGS@%$CFLAGS%g
s%@CPPFLAGS@%$CPPFLAGS%g
s%@CXXFLAGS@%$CXXFLAGS%g
s%@FFLAGS@%$FFLAGS%g
s%@DEFS@%$DEFS%g
s%@LDFLAGS@%$LDFLAGS%g
s%@LIBS@%$LIBS%g
s%@exec_prefix@%$exec_prefix%g
s%@prefix@%$prefix%g
s%@program_transform_name@%$program_transform_name%g
s%@bindir@%$bindir%g
s%@sbindir@%$sbindir%g
s%@libexecdir@%$libexecdir%g
s%@datadir@%$datadir%g
s%@sysconfdir@%$sysconfdir%g
s%@sharedstatedir@%$sharedstatedir%g
s%@localstatedir@%$localstatedir%g
s%@libdir@%$libdir%g
s%@includedir@%$includedir%g
s%@oldincludedir@%$oldincludedir%g
s%@infodir@%$infodir%g
s%@mandir@%$mandir%g
s%@TCL_WIN_VERSION@%$TCL_WIN_VERSION%g
s%@CC@%$CC%g
s%@TCL_VERSION@%$TCL_VERSION%g
s%@TCL_PATCH_LEVEL@%$TCL_PATCH_LEVEL%g
s%@TCL_SRC_DIR@%$TCL_SRC_DIR%g
s%@TCL_BIN_DIR@%$TCL_BIN_DIR%g

CEOF
EOF

cat >> $CONFIG_STATUS <<\EOF

# Split the substitutions into bite-sized pieces for seds with
# small command number limits, like on Digital OSF/1 and HP-UX.
ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
ac_file=1 # Number of current file.
ac_beg=1 # First line for current file.
ac_end=$ac_max_sed_cmds # Line after last line for current file.
ac_more_lines=:
ac_sed_cmds=""
while $ac_more_lines; do
  if test $ac_beg -gt 1; then
    sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
  else
    sed "${ac_end}q" conftest.subs > conftest.s$ac_file
  fi
  if test ! -s conftest.s$ac_file; then
    ac_more_lines=false
    rm -f conftest.s$ac_file
  else
    if test -z "$ac_sed_cmds"; then
      ac_sed_cmds="sed -f conftest.s$ac_file"
    else
      ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
    fi
    ac_file=`expr $ac_file + 1`
    ac_beg=$ac_end
    ac_end=`expr $ac_end + $ac_max_sed_cmds`
  fi
done
if test -z "$ac_sed_cmds"; then
  ac_sed_cmds=cat
fi
EOF

cat >> $CONFIG_STATUS <<EOF

CONFIG_FILES=\${CONFIG_FILES-"Makefile tcl.hpj"}
EOF
cat >> $CONFIG_STATUS <<\EOF
for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
  case "$ac_file" in
  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
  *) ac_file_in="${ac_file}.in" ;;
  esac

  # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.

  # Remove last slash and all that follows it.  Not all systems have dirname.
  ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
    # The file is in a subdirectory.
    test ! -d "$ac_dir" && mkdir "$ac_dir"
    ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
    # A "../" for each directory in $ac_dir_suffix.
    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
  else
    ac_dir_suffix= ac_dots=
  fi

  case "$ac_given_srcdir" in
  .)  srcdir=.
      if test -z "$ac_dots"; then top_srcdir=.
      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
  /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
  *) # Relative path.
    srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
    top_srcdir="$ac_dots$ac_given_srcdir" ;;
  esac


  echo creating "$ac_file"
  rm -f "$ac_file"
  configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
  case "$ac_file" in
  *Makefile*) ac_comsub="1i\\
# $configure_input" ;;
  *) ac_comsub= ;;
  esac

  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
  sed -e "$ac_comsub
s%@configure_input@%$configure_input%g
s%@srcdir@%$srcdir%g
s%@top_srcdir@%$top_srcdir%g
" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
fi; done
rm -f conftest.s*

EOF
cat >> $CONFIG_STATUS <<EOF

EOF
cat >> $CONFIG_STATUS <<\EOF

exit 0
EOF
chmod +x $CONFIG_STATUS
rm -fr confdefs* $ac_clean_files
test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1

Changes to tools/encoding/cp1250.txt.
1
2

3
4

5
6
7



8

9
10
11
12

13
14
15
16

17
18
19
20
21
22
23
1

2
3

4
5


6
7
8

9
10
11
12

13
14
15
16

17
18
19
20
21
22
23
24

-
+

-
+

-
-
+
+
+
-
+



-
+



-
+







#
#    Name:     cp1250_WinLatin2 to Unicode table
#    Name:     cp1250 to Unicode table
#    Unicode version: 2.0
#    Table version: 2.00
#    Table version: 2.01
#    Table format:  Format A
#    Date:          04/24/96
#    Authors:       Lori Brownell <loribr@microsoft.com>
#    Date:          04/15/98
#
#    Contact:       cpxlate@microsoft.com
#                   K.D. Chang    <a-kchang@microsoft.com>
#
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp1250_WinLatin2 code (in hex)
#        Column #1 is the cp1250 code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp1250_WinLatin2 order
#    The entries are in cp1250 order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
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
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







-
-
+
+

-
+




-
+







-
+







-
+



















-
+







0x79	0x0079	#LATIN SMALL LETTER Y
0x7A	0x007A	#LATIN SMALL LETTER Z
0x7B	0x007B	#LEFT CURLY BRACKET
0x7C	0x007C	#VERTICAL LINE
0x7D	0x007D	#RIGHT CURLY BRACKET
0x7E	0x007E	#TILDE
0x7F	0x007F	#DELETE
0x80		#UNDEFINED
0x81		#UNDEFINED
0x80	0x20AC	#EURO SIGN
0x81	      	#UNDEFINED
0x82	0x201A	#SINGLE LOW-9 QUOTATION MARK
0x83		#UNDEFINED
0x83	      	#UNDEFINED
0x84	0x201E	#DOUBLE LOW-9 QUOTATION MARK
0x85	0x2026	#HORIZONTAL ELLIPSIS
0x86	0x2020	#DAGGER
0x87	0x2021	#DOUBLE DAGGER
0x88		#UNDEFINED
0x88	      	#UNDEFINED
0x89	0x2030	#PER MILLE SIGN
0x8A	0x0160	#LATIN CAPITAL LETTER S WITH CARON
0x8B	0x2039	#SINGLE LEFT-POINTING ANGLE QUOTATION MARK
0x8C	0x015A	#LATIN CAPITAL LETTER S WITH ACUTE
0x8D	0x0164	#LATIN CAPITAL LETTER T WITH CARON
0x8E	0x017D	#LATIN CAPITAL LETTER Z WITH CARON
0x8F	0x0179	#LATIN CAPITAL LETTER Z WITH ACUTE
0x90		#UNDEFINED
0x90	      	#UNDEFINED
0x91	0x2018	#LEFT SINGLE QUOTATION MARK
0x92	0x2019	#RIGHT SINGLE QUOTATION MARK
0x93	0x201C	#LEFT DOUBLE QUOTATION MARK
0x94	0x201D	#RIGHT DOUBLE QUOTATION MARK
0x95	0x2022	#BULLET
0x96	0x2013	#EN DASH
0x97	0x2014	#EM DASH
0x98		#UNDEFINED
0x98	      	#UNDEFINED
0x99	0x2122	#TRADE MARK SIGN
0x9A	0x0161	#LATIN SMALL LETTER S WITH CARON
0x9B	0x203A	#SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
0x9C	0x015B	#LATIN SMALL LETTER S WITH ACUTE
0x9D	0x0165	#LATIN SMALL LETTER T WITH CARON
0x9E	0x017E	#LATIN SMALL LETTER Z WITH CARON
0x9F	0x017A	#LATIN SMALL LETTER Z WITH ACUTE
0xA0	0x00A0	#NO-BREAK SPACE
0xA1	0x02C7	#CARON
0xA2	0x02D8	#BREVE
0xA3	0x0141	#LATIN CAPITAL LETTER L WITH STROKE
0xA4	0x00A4	#CURRENCY SIGN
0xA5	0x0104	#LATIN CAPITAL LETTER A WITH OGONEK
0xA6	0x00A6	#BROKEN BAR
0xA7	0x00A7	#SECTION SIGN
0xA8	0x00A8	#DIAERESIS
0xA9	0x00A9	#COPYRIGHT SIGN
0xAA	0x015E	#LATIN CAPITAL LETTER S WITH CEDILLA
0xAB	0x00AB	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xAC		#UNDEFINED
0xAC	0x00AC	#NOT SIGN
0xAD	0x00AD	#SOFT HYPHEN
0xAE	0x00AE	#REGISTERED SIGN
0xAF	0x017B	#LATIN CAPITAL LETTER Z WITH DOT ABOVE
0xB0	0x00B0	#DEGREE SIGN
0xB1	0x00B1	#PLUS-MINUS SIGN
0xB2	0x02DB	#OGONEK
0xB3	0x0142	#LATIN SMALL LETTER L WITH STROKE
267
268
269
270
271
272
273
274
275
268
269
270
271
272
273
274









-
-
0xF9	0x016F	#LATIN SMALL LETTER U WITH RING ABOVE
0xFA	0x00FA	#LATIN SMALL LETTER U WITH ACUTE
0xFB	0x0171	#LATIN SMALL LETTER U WITH DOUBLE ACUTE
0xFC	0x00FC	#LATIN SMALL LETTER U WITH DIAERESIS
0xFD	0x00FD	#LATIN SMALL LETTER Y WITH ACUTE
0xFE	0x0163	#LATIN SMALL LETTER T WITH CEDILLA
0xFF	0x02D9	#DOT ABOVE


Changes to tools/encoding/cp1251.txt.
1
2

3
4

5
6
7



8

9
10
11
12

13
14
15
16

17
18
19
20
21
22
23
1

2
3

4
5


6
7
8

9
10
11
12

13
14
15
16

17
18
19
20
21
22
23
24

-
+

-
+

-
-
+
+
+
-
+



-
+



-
+







#
#    Name:     cp1251_WinCyrillic to Unicode table
#    Name:     cp1251 to Unicode table
#    Unicode version: 2.0
#    Table version: 2.00
#    Table version: 2.01
#    Table format:  Format A
#    Date:          04/24/96
#    Authors:       Lori Brownell <loribr@microsoft.com>
#    Date:          04/15/98
#
#    Contact:       cpxlate@microsoft.com
#                   K.D. Chang    <a-kchang@microsoft.com>
#
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp1251_WinCyrillic code (in hex)
#        Column #1 is the cp1251 code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp1251_WinCyrillic order
#    The entries are in cp1251 order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
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
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







-
+















-
+







0x81	0x0403	#CYRILLIC CAPITAL LETTER GJE
0x82	0x201A	#SINGLE LOW-9 QUOTATION MARK
0x83	0x0453	#CYRILLIC SMALL LETTER GJE
0x84	0x201E	#DOUBLE LOW-9 QUOTATION MARK
0x85	0x2026	#HORIZONTAL ELLIPSIS
0x86	0x2020	#DAGGER
0x87	0x2021	#DOUBLE DAGGER
0x88		#UNDEFINED
0x88	0x20AC	#EURO SIGN
0x89	0x2030	#PER MILLE SIGN
0x8A	0x0409	#CYRILLIC CAPITAL LETTER LJE
0x8B	0x2039	#SINGLE LEFT-POINTING ANGLE QUOTATION MARK
0x8C	0x040A	#CYRILLIC CAPITAL LETTER NJE
0x8D	0x040C	#CYRILLIC CAPITAL LETTER KJE
0x8E	0x040B	#CYRILLIC CAPITAL LETTER TSHE
0x8F	0x040F	#CYRILLIC CAPITAL LETTER DZHE
0x90	0x0452	#CYRILLIC SMALL LETTER DJE
0x91	0x2018	#LEFT SINGLE QUOTATION MARK
0x92	0x2019	#RIGHT SINGLE QUOTATION MARK
0x93	0x201C	#LEFT DOUBLE QUOTATION MARK
0x94	0x201D	#RIGHT DOUBLE QUOTATION MARK
0x95	0x2022	#BULLET
0x96	0x2013	#EN DASH
0x97	0x2014	#EM DASH
0x98		#UNDEFINED
0x98	      	#UNDEFINED
0x99	0x2122	#TRADE MARK SIGN
0x9A	0x0459	#CYRILLIC SMALL LETTER LJE
0x9B	0x203A	#SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
0x9C	0x045A	#CYRILLIC SMALL LETTER NJE
0x9D	0x045C	#CYRILLIC SMALL LETTER KJE
0x9E	0x045B	#CYRILLIC SMALL LETTER TSHE
0x9F	0x045F	#CYRILLIC SMALL LETTER DZHE
267
268
269
270
271
272
273
274
275
268
269
270
271
272
273
274









-
-
0xF9	0x0449	#CYRILLIC SMALL LETTER SHCHA
0xFA	0x044A	#CYRILLIC SMALL LETTER HARD SIGN
0xFB	0x044B	#CYRILLIC SMALL LETTER YERU
0xFC	0x044C	#CYRILLIC SMALL LETTER SOFT SIGN
0xFD	0x044D	#CYRILLIC SMALL LETTER E
0xFE	0x044E	#CYRILLIC SMALL LETTER YU
0xFF	0x044F	#CYRILLIC SMALL LETTER YA


Changes to tools/encoding/cp1252.txt.
1
2

3
4

5
6
7



8

9
10
11
12

13
14
15
16

17
18
19
20
21
22
23
1

2
3

4
5


6
7
8

9
10
11
12

13
14
15
16

17
18
19
20
21
22
23
24

-
+

-
+

-
-
+
+
+
-
+



-
+



-
+







#
#    Name:     cp1252_WinLatin1 to Unicode table
#    Name:     cp1252 to Unicode table
#    Unicode version: 2.0
#    Table version: 2.00
#    Table version: 2.01
#    Table format:  Format A
#    Date:          04/24/96
#    Authors:       Lori Brownell <loribr@microsoft.com>
#    Date:          04/15/98
#
#    Contact:       cpxlate@microsoft.com
#                   K.D. Chang    <a-kchang@microsoft.com>
#
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp1252_WinLatin1 code (in hex)
#        Column #1 is the cp1252 code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp1252_WinLatin1 order
#    The entries are in cp1252 order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
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
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







-
-
+
+











-
-
-
-
+
+
+
+












-
-
+
+







0x79	0x0079	#LATIN SMALL LETTER Y
0x7A	0x007A	#LATIN SMALL LETTER Z
0x7B	0x007B	#LEFT CURLY BRACKET
0x7C	0x007C	#VERTICAL LINE
0x7D	0x007D	#RIGHT CURLY BRACKET
0x7E	0x007E	#TILDE
0x7F	0x007F	#DELETE
0x80		#UNDEFINED
0x81		#UNDEFINED
0x80	0x20AC	#EURO SIGN
0x81	      	#UNDEFINED
0x82	0x201A	#SINGLE LOW-9 QUOTATION MARK
0x83	0x0192	#LATIN SMALL LETTER F WITH HOOK
0x84	0x201E	#DOUBLE LOW-9 QUOTATION MARK
0x85	0x2026	#HORIZONTAL ELLIPSIS
0x86	0x2020	#DAGGER
0x87	0x2021	#DOUBLE DAGGER
0x88	0x02C6	#MODIFIER LETTER CIRCUMFLEX ACCENT
0x89	0x2030	#PER MILLE SIGN
0x8A	0x0160	#LATIN CAPITAL LETTER S WITH CARON
0x8B	0x2039	#SINGLE LEFT-POINTING ANGLE QUOTATION MARK
0x8C	0x0152	#LATIN CAPITAL LIGATURE OE
0x8D		#UNDEFINED
0x8E		#UNDEFINED
0x8F		#UNDEFINED
0x90		#UNDEFINED
0x8D	      	#UNDEFINED
0x8E	0x017D	#LATIN CAPITAL LETTER Z WITH CARON
0x8F	      	#UNDEFINED
0x90	      	#UNDEFINED
0x91	0x2018	#LEFT SINGLE QUOTATION MARK
0x92	0x2019	#RIGHT SINGLE QUOTATION MARK
0x93	0x201C	#LEFT DOUBLE QUOTATION MARK
0x94	0x201D	#RIGHT DOUBLE QUOTATION MARK
0x95	0x2022	#BULLET
0x96	0x2013	#EN DASH
0x97	0x2014	#EM DASH
0x98	0x02DC	#SMALL TILDE
0x99	0x2122	#TRADE MARK SIGN
0x9A	0x0161	#LATIN SMALL LETTER S WITH CARON
0x9B	0x203A	#SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
0x9C	0x0153	#LATIN SMALL LIGATURE OE
0x9D		#UNDEFINED
0x9E		#UNDEFINED
0x9D	      	#UNDEFINED
0x9E	0x017E	#LATIN SMALL LETTER Z WITH CARON
0x9F	0x0178	#LATIN CAPITAL LETTER Y WITH DIAERESIS
0xA0	0x00A0	#NO-BREAK SPACE
0xA1	0x00A1	#INVERTED EXCLAMATION MARK
0xA2	0x00A2	#CENT SIGN
0xA3	0x00A3	#POUND SIGN
0xA4	0x00A4	#CURRENCY SIGN
0xA5	0x00A5	#YEN SIGN
209
210
211
212
213
214
215
216

217
218
219
220
221
222
223
210
211
212
213
214
215
216

217
218
219
220
221
222
223
224







-
+







0xBF	0x00BF	#INVERTED QUESTION MARK
0xC0	0x00C0	#LATIN CAPITAL LETTER A WITH GRAVE
0xC1	0x00C1	#LATIN CAPITAL LETTER A WITH ACUTE
0xC2	0x00C2	#LATIN CAPITAL LETTER A WITH CIRCUMFLEX
0xC3	0x00C3	#LATIN CAPITAL LETTER A WITH TILDE
0xC4	0x00C4	#LATIN CAPITAL LETTER A WITH DIAERESIS
0xC5	0x00C5	#LATIN CAPITAL LETTER A WITH RING ABOVE
0xC6	0x00C6	#LATIN CAPITAL LIGATURE AE
0xC6	0x00C6	#LATIN CAPITAL LETTER AE
0xC7	0x00C7	#LATIN CAPITAL LETTER C WITH CEDILLA
0xC8	0x00C8	#LATIN CAPITAL LETTER E WITH GRAVE
0xC9	0x00C9	#LATIN CAPITAL LETTER E WITH ACUTE
0xCA	0x00CA	#LATIN CAPITAL LETTER E WITH CIRCUMFLEX
0xCB	0x00CB	#LATIN CAPITAL LETTER E WITH DIAERESIS
0xCC	0x00CC	#LATIN CAPITAL LETTER I WITH GRAVE
0xCD	0x00CD	#LATIN CAPITAL LETTER I WITH ACUTE
241
242
243
244
245
246
247
248

249
250
251
252
253
254
255
242
243
244
245
246
247
248

249
250
251
252
253
254
255
256







-
+







0xDF	0x00DF	#LATIN SMALL LETTER SHARP S
0xE0	0x00E0	#LATIN SMALL LETTER A WITH GRAVE
0xE1	0x00E1	#LATIN SMALL LETTER A WITH ACUTE
0xE2	0x00E2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
0xE3	0x00E3	#LATIN SMALL LETTER A WITH TILDE
0xE4	0x00E4	#LATIN SMALL LETTER A WITH DIAERESIS
0xE5	0x00E5	#LATIN SMALL LETTER A WITH RING ABOVE
0xE6	0x00E6	#LATIN SMALL LIGATURE AE
0xE6	0x00E6	#LATIN SMALL LETTER AE
0xE7	0x00E7	#LATIN SMALL LETTER C WITH CEDILLA
0xE8	0x00E8	#LATIN SMALL LETTER E WITH GRAVE
0xE9	0x00E9	#LATIN SMALL LETTER E WITH ACUTE
0xEA	0x00EA	#LATIN SMALL LETTER E WITH CIRCUMFLEX
0xEB	0x00EB	#LATIN SMALL LETTER E WITH DIAERESIS
0xEC	0x00EC	#LATIN SMALL LETTER I WITH GRAVE
0xED	0x00ED	#LATIN SMALL LETTER I WITH ACUTE
267
268
269
270
271
272
273
274
275
268
269
270
271
272
273
274









-
-
0xF9	0x00F9	#LATIN SMALL LETTER U WITH GRAVE
0xFA	0x00FA	#LATIN SMALL LETTER U WITH ACUTE
0xFB	0x00FB	#LATIN SMALL LETTER U WITH CIRCUMFLEX
0xFC	0x00FC	#LATIN SMALL LETTER U WITH DIAERESIS
0xFD	0x00FD	#LATIN SMALL LETTER Y WITH ACUTE
0xFE	0x00FE	#LATIN SMALL LETTER THORN
0xFF	0x00FF	#LATIN SMALL LETTER Y WITH DIAERESIS


Changes to tools/encoding/cp1253.txt.
1
2

3
4

5
6
7



8

9
10
11
12

13
14
15
16

17
18
19
20
21
22
23
1

2
3

4
5


6
7
8

9
10
11
12

13
14
15
16

17
18
19
20
21
22
23
24

-
+

-
+

-
-
+
+
+
-
+



-
+



-
+







#
#    Name:     cp1253_WinGreek to Unicode table
#    Name:     cp1253 to Unicode table
#    Unicode version: 2.0
#    Table version: 2.00
#    Table version: 2.01
#    Table format:  Format A
#    Date:          04/24/96
#    Authors:       Lori Brownell <loribr@microsoft.com>
#    Date:          04/15/98
#
#    Contact:       cpxlate@microsoft.com
#                   K.D. Chang    <a-kchang@microsoft.com>
#
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp1253_WinGreek code (in hex)
#        Column #1 is the cp1253 code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp1253_WinGreek order
#    The entries are in cp1253 order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
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
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







-
-
+
+






-
+

-
+

-
-
-
-
-
+
+
+
+
+







-
+

-
+

-
-
-
-
+
+
+
+










-
+







0x79	0x0079	#LATIN SMALL LETTER Y
0x7A	0x007A	#LATIN SMALL LETTER Z
0x7B	0x007B	#LEFT CURLY BRACKET
0x7C	0x007C	#VERTICAL LINE
0x7D	0x007D	#RIGHT CURLY BRACKET
0x7E	0x007E	#TILDE
0x7F	0x007F	#DELETE
0x80		#UNDEFINED
0x81		#UNDEFINED
0x80	0x20AC	#EURO SIGN
0x81	      	#UNDEFINED
0x82	0x201A	#SINGLE LOW-9 QUOTATION MARK
0x83	0x0192	#LATIN SMALL LETTER F WITH HOOK
0x84	0x201E	#DOUBLE LOW-9 QUOTATION MARK
0x85	0x2026	#HORIZONTAL ELLIPSIS
0x86	0x2020	#DAGGER
0x87	0x2021	#DOUBLE DAGGER
0x88		#UNDEFINED
0x88	      	#UNDEFINED
0x89	0x2030	#PER MILLE SIGN
0x8A		#UNDEFINED
0x8A	      	#UNDEFINED
0x8B	0x2039	#SINGLE LEFT-POINTING ANGLE QUOTATION MARK
0x8C		#UNDEFINED
0x8D		#UNDEFINED
0x8E		#UNDEFINED
0x8F		#UNDEFINED
0x90		#UNDEFINED
0x8C	      	#UNDEFINED
0x8D	      	#UNDEFINED
0x8E	      	#UNDEFINED
0x8F	      	#UNDEFINED
0x90	      	#UNDEFINED
0x91	0x2018	#LEFT SINGLE QUOTATION MARK
0x92	0x2019	#RIGHT SINGLE QUOTATION MARK
0x93	0x201C	#LEFT DOUBLE QUOTATION MARK
0x94	0x201D	#RIGHT DOUBLE QUOTATION MARK
0x95	0x2022	#BULLET
0x96	0x2013	#EN DASH
0x97	0x2014	#EM DASH
0x98		#UNDEFINED
0x98	      	#UNDEFINED
0x99	0x2122	#TRADE MARK SIGN
0x9A		#UNDEFINED
0x9A	      	#UNDEFINED
0x9B	0x203A	#SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
0x9C		#UNDEFINED
0x9D		#UNDEFINED
0x9E		#UNDEFINED
0x9F		#UNDEFINED
0x9C	      	#UNDEFINED
0x9D	      	#UNDEFINED
0x9E	      	#UNDEFINED
0x9F	      	#UNDEFINED
0xA0	0x00A0	#NO-BREAK SPACE
0xA1	0x0385	#GREEK DIALYTIKA TONOS
0xA2	0x0386	#GREEK CAPITAL LETTER ALPHA WITH TONOS
0xA3	0x00A3	#POUND SIGN
0xA4	0x00A4	#CURRENCY SIGN
0xA5	0x00A5	#YEN SIGN
0xA6	0x00A6	#BROKEN BAR
0xA7	0x00A7	#SECTION SIGN
0xA8	0x00A8	#DIAERESIS
0xA9	0x00A9	#COPYRIGHT SIGN
0xAA		#UNDEFINED
0xAA	      	#UNDEFINED
0xAB	0x00AB	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xAC	0x00AC	#NOT SIGN
0xAD	0x00AD	#SOFT HYPHEN
0xAE	0x00AE	#REGISTERED SIGN
0xAF	0x2015	#HORIZONTAL BAR
0xB0	0x00B0	#DEGREE SIGN
0xB1	0x00B1	#PLUS-MINUS SIGN
221
222
223
224
225
226
227
228

229
230
231
232
233
234
235
222
223
224
225
226
227
228

229
230
231
232
233
234
235
236







-
+







0xCB	0x039B	#GREEK CAPITAL LETTER LAMDA
0xCC	0x039C	#GREEK CAPITAL LETTER MU
0xCD	0x039D	#GREEK CAPITAL LETTER NU
0xCE	0x039E	#GREEK CAPITAL LETTER XI
0xCF	0x039F	#GREEK CAPITAL LETTER OMICRON
0xD0	0x03A0	#GREEK CAPITAL LETTER PI
0xD1	0x03A1	#GREEK CAPITAL LETTER RHO
0xD2		#UNDEFINED
0xD2	      	#UNDEFINED
0xD3	0x03A3	#GREEK CAPITAL LETTER SIGMA
0xD4	0x03A4	#GREEK CAPITAL LETTER TAU
0xD5	0x03A5	#GREEK CAPITAL LETTER UPSILON
0xD6	0x03A6	#GREEK CAPITAL LETTER PHI
0xD7	0x03A7	#GREEK CAPITAL LETTER CHI
0xD8	0x03A8	#GREEK CAPITAL LETTER PSI
0xD9	0x03A9	#GREEK CAPITAL LETTER OMEGA
266
267
268
269
270
271
272
273

274
275
267
268
269
270
271
272
273

274









-
+
-
-
0xF8	0x03C8	#GREEK SMALL LETTER PSI
0xF9	0x03C9	#GREEK SMALL LETTER OMEGA
0xFA	0x03CA	#GREEK SMALL LETTER IOTA WITH DIALYTIKA
0xFB	0x03CB	#GREEK SMALL LETTER UPSILON WITH DIALYTIKA
0xFC	0x03CC	#GREEK SMALL LETTER OMICRON WITH TONOS
0xFD	0x03CD	#GREEK SMALL LETTER UPSILON WITH TONOS
0xFE	0x03CE	#GREEK SMALL LETTER OMEGA WITH TONOS
0xFF		#UNDEFINED
0xFF	      	#UNDEFINED


Changes to tools/encoding/cp1254.txt.
1
2

3
4

5
6
7



8

9
10
11
12

13
14
15
16

17
18
19
20
21
22
23
1

2
3

4
5


6
7
8

9
10
11
12

13
14
15
16

17
18
19
20
21
22
23
24

-
+

-
+

-
-
+
+
+
-
+



-
+



-
+







#
#    Name:     cp1254_WinTurkish to Unicode table
#    Name:     cp1254 to Unicode table
#    Unicode version: 2.0
#    Table version: 2.00
#    Table version: 2.01
#    Table format:  Format A
#    Date:          04/24/96
#    Authors:       Lori Brownell <loribr@microsoft.com>
#    Date:          04/15/98
#
#    Contact:       cpxlate@microsoft.com
#                   K.D. Chang    <a-kchang@microsoft.com>
#
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp1254_WinTurkish code (in hex)
#        Column #1 is the cp1254 code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp1254_WinTurkish order
#    The entries are in cp1254 order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
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
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







-
-
+
+











-
-
-
-
+
+
+
+












-
-
+
+







0x79	0x0079	#LATIN SMALL LETTER Y
0x7A	0x007A	#LATIN SMALL LETTER Z
0x7B	0x007B	#LEFT CURLY BRACKET
0x7C	0x007C	#VERTICAL LINE
0x7D	0x007D	#RIGHT CURLY BRACKET
0x7E	0x007E	#TILDE
0x7F	0x007F	#DELETE
0x80		#UNDEFINED
0x81		#UNDEFINED
0x80	0x20AC	#EURO SIGN
0x81	      	#UNDEFINED
0x82	0x201A	#SINGLE LOW-9 QUOTATION MARK
0x83	0x0192	#LATIN SMALL LETTER F WITH HOOK
0x84	0x201E	#DOUBLE LOW-9 QUOTATION MARK
0x85	0x2026	#HORIZONTAL ELLIPSIS
0x86	0x2020	#DAGGER
0x87	0x2021	#DOUBLE DAGGER
0x88	0x02C6	#MODIFIER LETTER CIRCUMFLEX ACCENT
0x89	0x2030	#PER MILLE SIGN
0x8A	0x0160	#LATIN CAPITAL LETTER S WITH CARON
0x8B	0x2039	#SINGLE LEFT-POINTING ANGLE QUOTATION MARK
0x8C	0x0152	#LATIN CAPITAL LIGATURE OE
0x8D		#UNDEFINED
0x8E		#UNDEFINED
0x8F		#UNDEFINED
0x90		#UNDEFINED
0x8D	      	#UNDEFINED
0x8E	      	#UNDEFINED
0x8F	      	#UNDEFINED
0x90	      	#UNDEFINED
0x91	0x2018	#LEFT SINGLE QUOTATION MARK
0x92	0x2019	#RIGHT SINGLE QUOTATION MARK
0x93	0x201C	#LEFT DOUBLE QUOTATION MARK
0x94	0x201D	#RIGHT DOUBLE QUOTATION MARK
0x95	0x2022	#BULLET
0x96	0x2013	#EN DASH
0x97	0x2014	#EM DASH
0x98	0x02DC	#SMALL TILDE
0x99	0x2122	#TRADE MARK SIGN
0x9A	0x0161	#LATIN SMALL LETTER S WITH CARON
0x9B	0x203A	#SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
0x9C	0x0153	#LATIN SMALL LIGATURE OE
0x9D		#UNDEFINED
0x9E		#UNDEFINED
0x9D	      	#UNDEFINED
0x9E	      	#UNDEFINED
0x9F	0x0178	#LATIN CAPITAL LETTER Y WITH DIAERESIS
0xA0	0x00A0	#NO-BREAK SPACE
0xA1	0x00A1	#INVERTED EXCLAMATION MARK
0xA2	0x00A2	#CENT SIGN
0xA3	0x00A3	#POUND SIGN
0xA4	0x00A4	#CURRENCY SIGN
0xA5	0x00A5	#YEN SIGN
209
210
211
212
213
214
215
216

217
218
219
220
221
222
223
210
211
212
213
214
215
216

217
218
219
220
221
222
223
224







-
+







0xBF	0x00BF	#INVERTED QUESTION MARK
0xC0	0x00C0	#LATIN CAPITAL LETTER A WITH GRAVE
0xC1	0x00C1	#LATIN CAPITAL LETTER A WITH ACUTE
0xC2	0x00C2	#LATIN CAPITAL LETTER A WITH CIRCUMFLEX
0xC3	0x00C3	#LATIN CAPITAL LETTER A WITH TILDE
0xC4	0x00C4	#LATIN CAPITAL LETTER A WITH DIAERESIS
0xC5	0x00C5	#LATIN CAPITAL LETTER A WITH RING ABOVE
0xC6	0x00C6	#LATIN CAPITAL LIGATURE AE
0xC6	0x00C6	#LATIN CAPITAL LETTER AE
0xC7	0x00C7	#LATIN CAPITAL LETTER C WITH CEDILLA
0xC8	0x00C8	#LATIN CAPITAL LETTER E WITH GRAVE
0xC9	0x00C9	#LATIN CAPITAL LETTER E WITH ACUTE
0xCA	0x00CA	#LATIN CAPITAL LETTER E WITH CIRCUMFLEX
0xCB	0x00CB	#LATIN CAPITAL LETTER E WITH DIAERESIS
0xCC	0x00CC	#LATIN CAPITAL LETTER I WITH GRAVE
0xCD	0x00CD	#LATIN CAPITAL LETTER I WITH ACUTE
241
242
243
244
245
246
247
248

249
250
251
252
253
254
255
242
243
244
245
246
247
248

249
250
251
252
253
254
255
256







-
+







0xDF	0x00DF	#LATIN SMALL LETTER SHARP S
0xE0	0x00E0	#LATIN SMALL LETTER A WITH GRAVE
0xE1	0x00E1	#LATIN SMALL LETTER A WITH ACUTE
0xE2	0x00E2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
0xE3	0x00E3	#LATIN SMALL LETTER A WITH TILDE
0xE4	0x00E4	#LATIN SMALL LETTER A WITH DIAERESIS
0xE5	0x00E5	#LATIN SMALL LETTER A WITH RING ABOVE
0xE6	0x00E6	#LATIN SMALL LIGATURE AE
0xE6	0x00E6	#LATIN SMALL LETTER AE
0xE7	0x00E7	#LATIN SMALL LETTER C WITH CEDILLA
0xE8	0x00E8	#LATIN SMALL LETTER E WITH GRAVE
0xE9	0x00E9	#LATIN SMALL LETTER E WITH ACUTE
0xEA	0x00EA	#LATIN SMALL LETTER E WITH CIRCUMFLEX
0xEB	0x00EB	#LATIN SMALL LETTER E WITH DIAERESIS
0xEC	0x00EC	#LATIN SMALL LETTER I WITH GRAVE
0xED	0x00ED	#LATIN SMALL LETTER I WITH ACUTE
267
268
269
270
271
272
273
274
275
268
269
270
271
272
273
274









-
-
0xF9	0x00F9	#LATIN SMALL LETTER U WITH GRAVE
0xFA	0x00FA	#LATIN SMALL LETTER U WITH ACUTE
0xFB	0x00FB	#LATIN SMALL LETTER U WITH CIRCUMFLEX
0xFC	0x00FC	#LATIN SMALL LETTER U WITH DIAERESIS
0xFD	0x0131	#LATIN SMALL LETTER DOTLESS I
0xFE	0x015F	#LATIN SMALL LETTER S WITH CEDILLA
0xFF	0x00FF	#LATIN SMALL LETTER Y WITH DIAERESIS


Changes to tools/encoding/cp1255.txt.
1
2

3
4

5
6
7



8

9
10
11
12

13
14
15
16

17
18
19
20
21
22
23
1

2
3

4
5


6
7
8

9
10
11
12

13
14
15
16

17
18
19
20
21
22
23
24

-
+

-
+

-
-
+
+
+
-
+



-
+



-
+







#
#    Name:     cp1255_WinHebrew to Unicode table
#    Name:     cp1255 to Unicode table
#    Unicode version: 2.0
#    Table version: 2.00
#    Table version: 2.01
#    Table format:  Format A
#    Date:          04/24/96
#    Authors:       Lori Brownell <loribr@microsoft.com>
#    Date:          1/7/2000
#
#    Contact:       cpxlate@microsoft.com
#                   K.D. Chang    <a-kchang@microsoft.com>
#
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp1255_WinHebrew code (in hex)
#        Column #1 is the cp1255 code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp1255_WinHebrew order
#    The entries are in cp1255 order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
50
51
52
53
54
55
56
57
58
59



60
61
62
63
64
65


66
67
68
69
70
71
72
51
52
53
54
55
56
57



58
59
60
61
62
63
64


65
66
67
68
69
70
71
72
73







-
-
-
+
+
+




-
-
+
+







0x20	0x0020	#SPACE
0x21	0x0021	#EXCLAMATION MARK
0x22	0x0022	#QUOTATION MARK
0x23	0x0023	#NUMBER SIGN
0x24	0x0024	#DOLLAR SIGN
0x25	0x0025	#PERCENT SIGN
0x26	0x0026	#AMPERSAND
0x27	0x0027	#APOSTROPHE-QUOTE
0x28	0x0028	#OPENING PARENTHESIS
0x29	0x0029	#CLOSING PARENTHESIS
0x27	0x0027	#APOSTROPHE
0x28	0x0028	#LEFT PARENTHESIS
0x29	0x0029	#RIGHT PARENTHESIS
0x2A	0x002A	#ASTERISK
0x2B	0x002B	#PLUS SIGN
0x2C	0x002C	#COMMA
0x2D	0x002D	#HYPHEN-MINUS
0x2E	0x002E	#PERIOD
0x2F	0x002F	#SLASH
0x2E	0x002E	#FULL STOP
0x2F	0x002F	#SOLIDUS
0x30	0x0030	#DIGIT ZERO
0x31	0x0031	#DIGIT ONE
0x32	0x0032	#DIGIT TWO
0x33	0x0033	#DIGIT THREE
0x34	0x0034	#DIGIT FOUR
0x35	0x0035	#DIGIT FIVE
0x36	0x0036	#DIGIT SIX
102
103
104
105
106
107
108
109
110
111
112
113
114






115
116
117
118
119
120
121
103
104
105
106
107
108
109






110
111
112
113
114
115
116
117
118
119
120
121
122







-
-
-
-
-
-
+
+
+
+
+
+







0x54	0x0054	#LATIN CAPITAL LETTER T
0x55	0x0055	#LATIN CAPITAL LETTER U
0x56	0x0056	#LATIN CAPITAL LETTER V
0x57	0x0057	#LATIN CAPITAL LETTER W
0x58	0x0058	#LATIN CAPITAL LETTER X
0x59	0x0059	#LATIN CAPITAL LETTER Y
0x5A	0x005A	#LATIN CAPITAL LETTER Z
0x5B	0x005B	#OPENING SQUARE BRACKET
0x5C	0x005C	#BACKSLASH
0x5D	0x005D	#CLOSING SQUARE BRACKET
0x5E	0x005E	#SPACING CIRCUMFLEX
0x5F	0x005F	#SPACING UNDERSCORE
0x60	0x0060	#SPACING GRAVE
0x5B	0x005B	#LEFT SQUARE BRACKET
0x5C	0x005C	#REVERSE SOLIDUS
0x5D	0x005D	#RIGHT SQUARE BRACKET
0x5E	0x005E	#CIRCUMFLEX ACCENT
0x5F	0x005F	#LOW LINE
0x60	0x0060	#GRAVE ACCENT
0x61	0x0061	#LATIN SMALL LETTER A
0x62	0x0062	#LATIN SMALL LETTER B
0x63	0x0063	#LATIN SMALL LETTER C
0x64	0x0064	#LATIN SMALL LETTER D
0x65	0x0065	#LATIN SMALL LETTER E
0x66	0x0066	#LATIN SMALL LETTER F
0x67	0x0067	#LATIN SMALL LETTER G
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
244
245
246
247
248
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
244
245
246
247
248
249







-
-
-
+
+
+


-
-
-
-
-
+
+
+
+
+



-
+

-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+



-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+




-
+

-
+

-
-
+
+


-
-
+
+

-
-
-
-
+
+
+
+

-
+

-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+










-
+

-
+



-
+



-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+







0x74	0x0074	#LATIN SMALL LETTER T
0x75	0x0075	#LATIN SMALL LETTER U
0x76	0x0076	#LATIN SMALL LETTER V
0x77	0x0077	#LATIN SMALL LETTER W
0x78	0x0078	#LATIN SMALL LETTER X
0x79	0x0079	#LATIN SMALL LETTER Y
0x7A	0x007A	#LATIN SMALL LETTER Z
0x7B	0x007B	#OPENING CURLY BRACKET
0x7C	0x007C	#VERTICAL BAR
0x7D	0x007D	#CLOSING CURLY BRACKET
0x7B	0x007B	#LEFT CURLY BRACKET
0x7C	0x007C	#VERTICAL LINE
0x7D	0x007D	#RIGHT CURLY BRACKET
0x7E	0x007E	#TILDE
0x7F	0x007F	#DELETE
0x80		#UNDEFINED
0x81		#UNDEFINED
0x82	0x201A	#LOW SINGLE COMMA QUOTATION MARK
0x83	0x0192	#LATIN SMALL LETTER SCRIPT F
0x84	0x201E	#LOW DOUBLE COMMA QUOTATION MARK
0x80	0x20AC	#EURO SIGN
0x81	      	#UNDEFINED
0x82	0x201A	#SINGLE LOW-9 QUOTATION MARK
0x83	0x0192	#LATIN SMALL LETTER F WITH HOOK
0x84	0x201E	#DOUBLE LOW-9 QUOTATION MARK
0x85	0x2026	#HORIZONTAL ELLIPSIS
0x86	0x2020	#DAGGER
0x87	0x2021	#DOUBLE DAGGER
0x88	0x02C6	#MODIFIER LETTER CIRCUMFLEX
0x88	0x02C6	#MODIFIER LETTER CIRCUMFLEX ACCENT
0x89	0x2030	#PER MILLE SIGN
0x8A		#UNDEFINED
0x8B	0x2039	#LEFT POINTING SINGLE GUILLEMET
0x8C		#UNDEFINED
0x8D		#UNDEFINED
0x8E		#UNDEFINED
0x8F		#UNDEFINED
0x90		#UNDEFINED
0x91	0x2018	#SINGLE TURNED COMMA QUOTATION MARK
0x92	0x2019	#SINGLE COMMA QUOTATION MARK
0x93	0x201C	#DOUBLE TURNED COMMA QUOTATION MARK
0x94	0x201D	#DOUBLE COMMA QUOTATION MARK
0x8A	      	#UNDEFINED
0x8B	0x2039	#SINGLE LEFT-POINTING ANGLE QUOTATION MARK
0x8C	      	#UNDEFINED
0x8D	      	#UNDEFINED
0x8E	      	#UNDEFINED
0x8F	      	#UNDEFINED
0x90	      	#UNDEFINED
0x91	0x2018	#LEFT SINGLE QUOTATION MARK
0x92	0x2019	#RIGHT SINGLE QUOTATION MARK
0x93	0x201C	#LEFT DOUBLE QUOTATION MARK
0x94	0x201D	#RIGHT DOUBLE QUOTATION MARK
0x95	0x2022	#BULLET
0x96	0x2013	#EN DASH
0x97	0x2014	#EM DASH
0x98	0x02DC	#SPACING TILDE
0x99	0x2122	#TRADEMARK
0x9A		#UNDEFINED
0x9B	0x203A	#RIGHT POINTING SINGLE GUILLEMET
0x9C		#UNDEFINED
0x9D		#UNDEFINED
0x9E		#UNDEFINED
0x9F		#UNDEFINED
0xA0	0x00A0	#NON-BREAKING SPACE
0xA1		#UNDEFINED
0x98	0x02DC	#SMALL TILDE
0x99	0x2122	#TRADE MARK SIGN
0x9A	      	#UNDEFINED
0x9B	0x203A	#SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
0x9C	      	#UNDEFINED
0x9D	      	#UNDEFINED
0x9E	      	#UNDEFINED
0x9F	      	#UNDEFINED
0xA0	0x00A0	#NO-BREAK SPACE
0xA1	0x00A1	#INVERTED EXCLAMATION MARK
0xA2	0x00A2	#CENT SIGN
0xA3	0x00A3	#POUND SIGN
0xA4	0x20AA	#NEW SHEQEL SIGN
0xA5	0x00A5	#YEN SIGN
0xA6	0x00A6	#BROKEN VERTICAL BAR
0xA6	0x00A6	#BROKEN BAR
0xA7	0x00A7	#SECTION SIGN
0xA8	0x00A8	#SPACING DIAERESIS
0xA8	0x00A8	#DIAERESIS
0xA9	0x00A9	#COPYRIGHT SIGN
0xAA		#UNDEFINED
0xAB	0x00AB	#LEFT POINTING GUILLEMET
0xAA	0x00D7	#MULTIPLICATION SIGN
0xAB	0x00AB	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xAC	0x00AC	#NOT SIGN
0xAD	0x00AD	#SOFT HYPHEN
0xAE	0x00AE	#REGISTERED TRADE MARK SIGN
0xAF	0x00AF	#SPACING MACRON
0xAE	0x00AE	#REGISTERED SIGN
0xAF	0x00AF	#MACRON
0xB0	0x00B0	#DEGREE SIGN
0xB1	0x00B1	#PLUS-OR-MINUS SIGN
0xB2	0x00B2	#SUPERSCRIPT DIGIT TWO
0xB3	0x00B3	#SUPERSCRIPT DIGIT THREE
0xB4	0x00B4	#SPACING ACUTE
0xB1	0x00B1	#PLUS-MINUS SIGN
0xB2	0x00B2	#SUPERSCRIPT TWO
0xB3	0x00B3	#SUPERSCRIPT THREE
0xB4	0x00B4	#ACUTE ACCENT
0xB5	0x00B5	#MICRO SIGN
0xB6	0x00B6	#PARAGRAPH SIGN
0xB6	0x00B6	#PILCROW SIGN
0xB7	0x00B7	#MIDDLE DOT
0xB8		#UNDEFINED
0xB9	0x00B9	#SUPERSCRIPT DIGIT ONE
0xBA		#UNDEFINED
0xBB	0x00BB	#RIGHT POINTING GUILLEMET
0xBC	0x00BC	#FRACTION ONE QUARTER
0xBD	0x00BD	#FRACTION ONE HALF
0xBE	0x00BE	#FRACTION THREE QUARTERS
0xBF		#UNDEFINED
0xB8	0x00B8	#CEDILLA
0xB9	0x00B9	#SUPERSCRIPT ONE
0xBA	0x00F7	#DIVISION SIGN
0xBB	0x00BB	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xBC	0x00BC	#VULGAR FRACTION ONE QUARTER
0xBD	0x00BD	#VULGAR FRACTION ONE HALF
0xBE	0x00BE	#VULGAR FRACTION THREE QUARTERS
0xBF	0x00BF	#INVERTED QUESTION MARK
0xC0	0x05B0	#HEBREW POINT SHEVA
0xC1	0x05B1	#HEBREW POINT HATAF SEGOL
0xC2	0x05B2	#HEBREW POINT HATAF PATAH
0xC3	0x05B3	#HEBREW POINT HATAF QAMATS
0xC4	0x05B4	#HEBREW POINT HIRIQ
0xC5	0x05B5	#HEBREW POINT TSERE
0xC6	0x05B6	#HEBREW POINT SEGOL
0xC7	0x05B7	#HEBREW POINT PATAH
0xC8	0x05B8	#HEBREW POINT QAMATS
0xC9	0x05B9	#HEBREW POINT HOLAM
0xCA	0x05BA	#HEBREW POINT
0xCA		#UNDEFINED
0xCB	0x05BB	#HEBREW POINT QUBUTS
0xCC	0x05BC	#HEBREW POINT DAGESH
0xCC	0x05BC	#HEBREW POINT DAGESH OR MAPIQ
0xCD	0x05BD	#HEBREW POINT METEG
0xCE	0x05BE	#HEBREW PUNCTUATION MAQAF
0xCF	0x05BF	#HEBREW POINT RAFE
0xD0	0x05C0	#HEBREW POINT PASEQ
0xD0	0x05C0	#HEBREW PUNCTUATION PASEQ
0xD1	0x05C1	#HEBREW POINT SHIN DOT
0xD2	0x05C2	#HEBREW POINT SIN DOT
0xD3	0x05C3	#HEBREW PUNCTUATION SOF PASUQ
0xD4	0x05F0	#HEBREW LETTER DOUBLE VAV
0xD5	0x05F1	#HEBREW LETTER VAV YOD
0xD6	0x05F2	#HEBREW LETTER DOUBLE YOD
0xD7		#UNDEFINED
0xD8		#UNDEFINED
0xD9		#UNDEFINED
0xDA		#UNDEFINED
0xDB		#UNDEFINED
0xDC		#UNDEFINED
0xDD		#UNDEFINED
0xDE		#UNDEFINED
0xDF		#UNDEFINED
0xD4	0x05F0	#HEBREW LIGATURE YIDDISH DOUBLE VAV
0xD5	0x05F1	#HEBREW LIGATURE YIDDISH VAV YOD
0xD6	0x05F2	#HEBREW LIGATURE YIDDISH DOUBLE YOD
0xD7	0x05F3	#HEBREW PUNCTUATION GERESH
0xD8	0x05F4	#HEBREW PUNCTUATION GERSHAYIM
0xD9	      	#UNDEFINED
0xDA	      	#UNDEFINED
0xDB	      	#UNDEFINED
0xDC	      	#UNDEFINED
0xDD	      	#UNDEFINED
0xDE	      	#UNDEFINED
0xDF	      	#UNDEFINED
0xE0	0x05D0	#HEBREW LETTER ALEF
0xE1	0x05D1	#HEBREW LETTER BET
0xE2	0x05D2	#HEBREW LETTER GIMEL
0xE3	0x05D3	#HEBREW LETTER DALET
0xE4	0x05D4	#HEBREW LETTER HE
0xE5	0x05D5	#HEBREW LETTER VAV
0xE6	0x05D6	#HEBREW LETTER ZAYIN
262
263
264
265
266
267
268
269
270


271
272
273

274
275
263
264
265
266
267
268
269


270
271
272
273

274









-
-
+
+


-
+
-
-
0xF4	0x05E4	#HEBREW LETTER PE
0xF5	0x05E5	#HEBREW LETTER FINAL TSADI
0xF6	0x05E6	#HEBREW LETTER TSADI
0xF7	0x05E7	#HEBREW LETTER QOF
0xF8	0x05E8	#HEBREW LETTER RESH
0xF9	0x05E9	#HEBREW LETTER SHIN
0xFA	0x05EA	#HEBREW LETTER TAV
0xFB		#UNDEFINED
0xFC		#UNDEFINED
0xFB	      	#UNDEFINED
0xFC	      	#UNDEFINED
0xFD	0x200E	#LEFT-TO-RIGHT MARK
0xFE	0x200F	#RIGHT-TO-LEFT MARK
0xFF		#UNDEFINED
0xFF	      	#UNDEFINED


Changes to tools/encoding/cp1256.txt.
1
2
3
4



5
6
7



8

9
10
11
12

13
14
15
16

17
18
19
20
21
22
23
1



2
3
4
5


6
7
8

9
10
11
12

13
14
15
16

17
18
19
20
21
22
23
24

-
-
-
+
+
+

-
-
+
+
+
-
+



-
+



-
+







#
#    Name:     cp1256_WinArabic to Unicode table
#    Unicode version: 2.0
#    Table version: 2.00
#    Name:     cp1256 to Unicode table
#    Unicode version: 2.1
#    Table version: 2.01
#    Table format:  Format A
#    Date:          04/24/96
#    Authors:       Lori Brownell <loribr@microsoft.com>
#    Date:          01/5/99
#
#    Contact:       cpxlate@microsoft.com
#                   K.D. Chang    <a-kchang@microsoft.com>
#
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp1256_WinArabic code (in hex)
#        Column #1 is the cp1256 code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp1256_WinArabic order
#    The entries are in cp1256 order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
50
51
52
53
54
55
56
57
58
59



60
61
62
63
64
65


66
67
68
69
70
71
72
51
52
53
54
55
56
57



58
59
60
61
62
63
64


65
66
67
68
69
70
71
72
73







-
-
-
+
+
+




-
-
+
+







0x20	0x0020	#SPACE
0x21	0x0021	#EXCLAMATION MARK
0x22	0x0022	#QUOTATION MARK
0x23	0x0023	#NUMBER SIGN
0x24	0x0024	#DOLLAR SIGN
0x25	0x0025	#PERCENT SIGN
0x26	0x0026	#AMPERSAND
0x27	0x0027	#APOSTROPHE-QUOTE
0x28	0x0028	#OPENING PARENTHESIS
0x29	0x0029	#CLOSING PARENTHESIS
0x27	0x0027	#APOSTROPHE
0x28	0x0028	#LEFT PARENTHESIS
0x29	0x0029	#RIGHT PARENTHESIS
0x2A	0x002A	#ASTERISK
0x2B	0x002B	#PLUS SIGN
0x2C	0x002C	#COMMA
0x2D	0x002D	#HYPHEN-MINUS
0x2E	0x002E	#PERIOD
0x2F	0x002F	#SLASH
0x2E	0x002E	#FULL STOP
0x2F	0x002F	#SOLIDUS
0x30	0x0030	#DIGIT ZERO
0x31	0x0031	#DIGIT ONE
0x32	0x0032	#DIGIT TWO
0x33	0x0033	#DIGIT THREE
0x34	0x0034	#DIGIT FOUR
0x35	0x0035	#DIGIT FIVE
0x36	0x0036	#DIGIT SIX
102
103
104
105
106
107
108
109
110
111
112
113
114






115
116
117
118
119
120
121
103
104
105
106
107
108
109






110
111
112
113
114
115
116
117
118
119
120
121
122







-
-
-
-
-
-
+
+
+
+
+
+







0x54	0x0054	#LATIN CAPITAL LETTER T
0x55	0x0055	#LATIN CAPITAL LETTER U
0x56	0x0056	#LATIN CAPITAL LETTER V
0x57	0x0057	#LATIN CAPITAL LETTER W
0x58	0x0058	#LATIN CAPITAL LETTER X
0x59	0x0059	#LATIN CAPITAL LETTER Y
0x5A	0x005A	#LATIN CAPITAL LETTER Z
0x5B	0x005B	#OPENING SQUARE BRACKET
0x5C	0x005C	#BACKSLASH
0x5D	0x005D	#CLOSING SQUARE BRACKET
0x5E	0x005E	#SPACING CIRCUMFLEX
0x5F	0x005F	#SPACING UNDERSCORE
0x60	0x0060	#SPACING GRAVE
0x5B	0x005B	#LEFT SQUARE BRACKET
0x5C	0x005C	#REVERSE SOLIDUS
0x5D	0x005D	#RIGHT SQUARE BRACKET
0x5E	0x005E	#CIRCUMFLEX ACCENT
0x5F	0x005F	#LOW LINE
0x60	0x0060	#GRAVE ACCENT
0x61	0x0061	#LATIN SMALL LETTER A
0x62	0x0062	#LATIN SMALL LETTER B
0x63	0x0063	#LATIN SMALL LETTER C
0x64	0x0064	#LATIN SMALL LETTER D
0x65	0x0065	#LATIN SMALL LETTER E
0x66	0x0066	#LATIN SMALL LETTER F
0x67	0x0067	#LATIN SMALL LETTER G
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
244

245
246
247

248
249
250
251
252
253
254
255
256
257









258
259
260
261
262
263
264




265
266
267


268
269
270


271
272
273
274

275
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
244

245
246
247

248
249









250
251
252
253
254
255
256
257
258
259
260
261




262
263
264
265
266


267
268
269


270
271
272
273


274








-
-
-
+
+
+


-
-
-
-
-
+
+
+
+
+



-
+

-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+



-
-
-
-
-
+
+
+
+
+


-
-
+
+





-
+

-
+

-
-
+
+


-
-
+
+

-
-
-
-
+
+
+
+

-
+

-
-
+
+

-
-
-
-
+
+
+
+

-
-
-
-
-
-
-
+
+
+
+
+
+
+

-
-
-
-
+
+
+
+

-
-
+
+


-
+







-
+



-
+

-
-
+
+

-
+


-
+

-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+



-
-
-
-
+
+
+
+

-
-
+
+

-
-
+
+


-
-
+
-
0x74	0x0074	#LATIN SMALL LETTER T
0x75	0x0075	#LATIN SMALL LETTER U
0x76	0x0076	#LATIN SMALL LETTER V
0x77	0x0077	#LATIN SMALL LETTER W
0x78	0x0078	#LATIN SMALL LETTER X
0x79	0x0079	#LATIN SMALL LETTER Y
0x7A	0x007A	#LATIN SMALL LETTER Z
0x7B	0x007B	#OPENING CURLY BRACKET
0x7C	0x007C	#VERTICAL BAR
0x7D	0x007D	#CLOSING CURLY BRACKET
0x7B	0x007B	#LEFT CURLY BRACKET
0x7C	0x007C	#VERTICAL LINE
0x7D	0x007D	#RIGHT CURLY BRACKET
0x7E	0x007E	#TILDE
0x7F	0x007F	#DELETE
0x80		#UNDEFINED
0x81	0x067E	#ARABIC TAA WITH THREE DOTS BELOW
0x82	0x201A	#LOW SINGLE COMMA QUOTATION MARK
0x83	0x0192	#LATIN SMALL LETTER SCRIPT F
0x84	0x201E	#LOW DOUBLE COMMA QUOTATION MARK
0x80	0x20AC	#EURO SIGN
0x81	0x067E	#ARABIC LETTER PEH
0x82	0x201A	#SINGLE LOW-9 QUOTATION MARK
0x83	0x0192	#LATIN SMALL LETTER F WITH HOOK
0x84	0x201E	#DOUBLE LOW-9 QUOTATION MARK
0x85	0x2026	#HORIZONTAL ELLIPSIS
0x86	0x2020	#DAGGER
0x87	0x2021	#DOUBLE DAGGER
0x88	0x02C6	#MODIFIER LETTER CIRCUMFLEX
0x88	0x02C6	#MODIFIER LETTER CIRCUMFLEX ACCENT
0x89	0x2030	#PER MILLE SIGN
0x8A		#UNDEFINED
0x8B	0x2039	#LEFT POINTING SINGLE GUILLEMET
0x8C	0x0152	#LATIN CAPITAL LETTER O E
0x8D	0x0686	#ARABIC HAA WITH MIDDLE THREE DOTS DOWNWARD
0x8E	0x0698	#ARABIC RA WITH THREE DOTS ABOVE
0x8F		#UNDEFINED
0x90	0x06AF	#ARABIC GAF
0x91	0x2018	#SINGLE TURNED COMMA QUOTATION MARK
0x92	0x2019	#SINGLE COMMA QUOTATION MARK
0x93	0x201C	#DOUBLE TURNED COMMA QUOTATION MARK
0x94	0x201D	#DOUBLE COMMA QUOTATION MARK
0x8A	0x0679	#ARABIC LETTER TTEH
0x8B	0x2039	#SINGLE LEFT-POINTING ANGLE QUOTATION MARK
0x8C	0x0152	#LATIN CAPITAL LIGATURE OE
0x8D	0x0686	#ARABIC LETTER TCHEH
0x8E	0x0698	#ARABIC LETTER JEH
0x8F	0x0688	#ARABIC LETTER DDAL
0x90	0x06AF	#ARABIC LETTER GAF
0x91	0x2018	#LEFT SINGLE QUOTATION MARK
0x92	0x2019	#RIGHT SINGLE QUOTATION MARK
0x93	0x201C	#LEFT DOUBLE QUOTATION MARK
0x94	0x201D	#RIGHT DOUBLE QUOTATION MARK
0x95	0x2022	#BULLET
0x96	0x2013	#EN DASH
0x97	0x2014	#EM DASH
0x98		#UNDEFINED
0x99	0x2122	#TRADEMARK
0x9A		#UNDEFINED
0x9B	0x203A	#RIGHT POINTING SINGLE GUILLEMET
0x9C	0x0153	#LATIN SMALL LETTER O E
0x98	0x06A9	#ARABIC LETTER KEHEH
0x99	0x2122	#TRADE MARK SIGN
0x9A	0x0691	#ARABIC LETTER RREH
0x9B	0x203A	#SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
0x9C	0x0153	#LATIN SMALL LIGATURE OE
0x9D	0x200C	#ZERO WIDTH NON-JOINER
0x9E	0x200D	#ZERO WIDTH JOINER
0x9F		#UNDEFINED
0xA0	0x00A0	#NON-BREAKING SPACE
0x9F	0x06BA	#ARABIC LETTER NOON GHUNNA
0xA0	0x00A0	#NO-BREAK SPACE
0xA1	0x060C	#ARABIC COMMA
0xA2	0x00A2	#CENT SIGN
0xA3	0x00A3	#POUND SIGN
0xA4	0x00A4	#CURRENCY SIGN
0xA5	0x00A5	#YEN SIGN
0xA6	0x00A6	#BROKEN VERTICAL BAR
0xA6	0x00A6	#BROKEN BAR
0xA7	0x00A7	#SECTION SIGN
0xA8	0x00A8	#SPACING DIAERESIS
0xA8	0x00A8	#DIAERESIS
0xA9	0x00A9	#COPYRIGHT SIGN
0xAA		#UNDEFINED
0xAB	0x00AB	#LEFT POINTING GUILLEMET
0xAA	0x06BE	#ARABIC LETTER HEH DOACHASHMEE
0xAB	0x00AB	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xAC	0x00AC	#NOT SIGN
0xAD	0x00AD	#SOFT HYPHEN
0xAE	0x00AE	#REGISTERED TRADE MARK SIGN
0xAF	0x00AF	#SPACING MACRON
0xAE	0x00AE	#REGISTERED SIGN
0xAF	0x00AF	#MACRON
0xB0	0x00B0	#DEGREE SIGN
0xB1	0x00B1	#PLUS-OR-MINUS SIGN
0xB2	0x00B2	#SUPERSCRIPT DIGIT TWO
0xB3	0x00B3	#SUPERSCRIPT DIGIT THREE
0xB4	0x00B4	#SPACING ACUTE
0xB1	0x00B1	#PLUS-MINUS SIGN
0xB2	0x00B2	#SUPERSCRIPT TWO
0xB3	0x00B3	#SUPERSCRIPT THREE
0xB4	0x00B4	#ACUTE ACCENT
0xB5	0x00B5	#MICRO SIGN
0xB6	0x00B6	#PARAGRAPH SIGN
0xB6	0x00B6	#PILCROW SIGN
0xB7	0x00B7	#MIDDLE DOT
0xB8	0x00B8	#SPACING CEDILLA
0xB9	0x00B9	#SUPERSCRIPT DIGIT ONE
0xB8	0x00B8	#CEDILLA
0xB9	0x00B9	#SUPERSCRIPT ONE
0xBA	0x061B	#ARABIC SEMICOLON
0xBB	0x00BB	#RIGHT POINTING GUILLEMET
0xBC	0x00BC	#FRACTION ONE QUARTER
0xBD	0x00BD	#FRACTION ONE HALF
0xBE	0x00BE	#FRACTION THREE QUARTERS
0xBB	0x00BB	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xBC	0x00BC	#VULGAR FRACTION ONE QUARTER
0xBD	0x00BD	#VULGAR FRACTION ONE HALF
0xBE	0x00BE	#VULGAR FRACTION THREE QUARTERS
0xBF	0x061F	#ARABIC QUESTION MARK
0xC0		#UNDEFINED
0xC1	0x0621	#ARABIC LETTER HAMZAH
0xC2	0x0622	#ARABIC LETTER MADDAH ON ALEF
0xC3	0x0623	#ARABIC LETTER HAMZAH ON ALEF
0xC4	0x0624	#ARABIC LETTER HAMZAH ON WAW
0xC5	0x0625	#ARABIC LETTER HAMZAH UNDER ALEF
0xC6	0x0626	#ARABIC LETTER HAMZAH ON YA
0xC0	0x06C1	#ARABIC LETTER HEH GOAL
0xC1	0x0621	#ARABIC LETTER HAMZA
0xC2	0x0622	#ARABIC LETTER ALEF WITH MADDA ABOVE
0xC3	0x0623	#ARABIC LETTER ALEF WITH HAMZA ABOVE
0xC4	0x0624	#ARABIC LETTER WAW WITH HAMZA ABOVE
0xC5	0x0625	#ARABIC LETTER ALEF WITH HAMZA BELOW
0xC6	0x0626	#ARABIC LETTER YEH WITH HAMZA ABOVE
0xC7	0x0627	#ARABIC LETTER ALEF
0xC8	0x0628	#ARABIC LETTER BAA
0xC9	0x0629	#ARABIC LETTER TAA MARBUTAH
0xCA	0x062A	#ARABIC LETTER TAA
0xCB	0x062B	#ARABIC LETTER THAA
0xC8	0x0628	#ARABIC LETTER BEH
0xC9	0x0629	#ARABIC LETTER TEH MARBUTA
0xCA	0x062A	#ARABIC LETTER TEH
0xCB	0x062B	#ARABIC LETTER THEH
0xCC	0x062C	#ARABIC LETTER JEEM
0xCD	0x062D	#ARABIC LETTER HAA
0xCE	0x062E	#ARABIC LETTER KHAA
0xCD	0x062D	#ARABIC LETTER HAH
0xCE	0x062E	#ARABIC LETTER KHAH
0xCF	0x062F	#ARABIC LETTER DAL
0xD0	0x0630	#ARABIC LETTER THAL
0xD1	0x0631	#ARABIC LETTER RA
0xD1	0x0631	#ARABIC LETTER REH
0xD2	0x0632	#ARABIC LETTER ZAIN
0xD3	0x0633	#ARABIC LETTER SEEN
0xD4	0x0634	#ARABIC LETTER SHEEN
0xD5	0x0635	#ARABIC LETTER SAD
0xD6	0x0636	#ARABIC LETTER DAD
0xD7	0x00D7	#MULTIPLICATION SIGN
0xD8	0x0637	#ARABIC LETTER TAH
0xD9	0x0638	#ARABIC LETTER DHAH
0xD9	0x0638	#ARABIC LETTER ZAH
0xDA	0x0639	#ARABIC LETTER AIN
0xDB	0x063A	#ARABIC LETTER GHAIN
0xDC	0x0640	#ARABIC TATWEEL
0xDD	0x0641	#ARABIC LETTER FA
0xDD	0x0641	#ARABIC LETTER FEH
0xDE	0x0642	#ARABIC LETTER QAF
0xDF	0x0643	#ARABIC LETTER CAF
0xE0	0x00E0	#LATIN SMALL LETTER A GRAVE
0xDF	0x0643	#ARABIC LETTER KAF
0xE0	0x00E0	#LATIN SMALL LETTER A WITH GRAVE
0xE1	0x0644	#ARABIC LETTER LAM
0xE2	0x00E2	#LATIN SMALL LETTER A CIRCUMFLEX
0xE2	0x00E2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
0xE3	0x0645	#ARABIC LETTER MEEM
0xE4	0x0646	#ARABIC LETTER NOON
0xE5	0x0647	#ARABIC LETTER HA
0xE5	0x0647	#ARABIC LETTER HEH
0xE6	0x0648	#ARABIC LETTER WAW
0xE7	0x00E7	#LATIN SMALL LETTER C CEDILLA
0xE8	0x00E8	#LATIN SMALL LETTER E GRAVE
0xE9	0x00E9	#LATIN SMALL LETTER E ACUTE
0xEA	0x00EA	#LATIN SMALL LETTER E CIRCUMFLEX
0xEB	0x00EB	#LATIN SMALL LETTER E DIAERESIS
0xEC	0x0649	#ARABIC LETTER ALEF MAQSURAH
0xED	0x064A	#ARABIC LETTER YA
0xEE	0x00EE	#LATIN SMALL LETTER I CIRCUMFLEX
0xEF	0x00EF	#LATIN SMALL LETTER I DIAERESIS
0xE7	0x00E7	#LATIN SMALL LETTER C WITH CEDILLA
0xE8	0x00E8	#LATIN SMALL LETTER E WITH GRAVE
0xE9	0x00E9	#LATIN SMALL LETTER E WITH ACUTE
0xEA	0x00EA	#LATIN SMALL LETTER E WITH CIRCUMFLEX
0xEB	0x00EB	#LATIN SMALL LETTER E WITH DIAERESIS
0xEC	0x0649	#ARABIC LETTER ALEF MAKSURA
0xED	0x064A	#ARABIC LETTER YEH
0xEE	0x00EE	#LATIN SMALL LETTER I WITH CIRCUMFLEX
0xEF	0x00EF	#LATIN SMALL LETTER I WITH DIAERESIS
0xF0	0x064B	#ARABIC FATHATAN
0xF1	0x064C	#ARABIC DAMMATAN
0xF2	0x064D	#ARABIC KASRATAN
0xF3	0x064E	#ARABIC FATHAH
0xF4	0x00F4	#LATIN SMALL LETTER O CIRCUMFLEX
0xF5	0x064F	#ARABIC DAMMAH
0xF6	0x0650	#ARABIC KASRAH
0xF3	0x064E	#ARABIC FATHA
0xF4	0x00F4	#LATIN SMALL LETTER O WITH CIRCUMFLEX
0xF5	0x064F	#ARABIC DAMMA
0xF6	0x0650	#ARABIC KASRA
0xF7	0x00F7	#DIVISION SIGN
0xF8	0x0651	#ARABIC SHADDAH
0xF9	0x00F9	#LATIN SMALL LETTER U GRAVE
0xF8	0x0651	#ARABIC SHADDA
0xF9	0x00F9	#LATIN SMALL LETTER U WITH GRAVE
0xFA	0x0652	#ARABIC SUKUN
0xFB	0x00FB	#LATIN SMALL LETTER U CIRCUMFLEX
0xFC	0x00FC	#LATIN SMALL LETTER U DIAERESIS
0xFB	0x00FB	#LATIN SMALL LETTER U WITH CIRCUMFLEX
0xFC	0x00FC	#LATIN SMALL LETTER U WITH DIAERESIS
0xFD	0x200E	#LEFT-TO-RIGHT MARK
0xFE	0x200F	#RIGHT-TO-LEFT MARK
0xFF		#UNDEFINED

0xFF	0x06D2	#ARABIC LETTER YEH BARREE

Changes to tools/encoding/cp1257.txt.
1
2

3
4

5
6
7



8

9
10
11
12

13
14
15
16

17
18
19
20
21
22
23
1

2
3

4
5


6
7
8

9
10
11
12

13
14
15
16

17
18
19
20
21
22
23
24

-
+

-
+

-
-
+
+
+
-
+



-
+



-
+







#
#    Name:     cp1257_WinBaltic to Unicode table
#    Name:     cp1257 to Unicode table
#    Unicode version: 2.0
#    Table version: 2.00
#    Table version: 2.01
#    Table format:  Format A
#    Date:          04/24/96
#    Authors:       Lori Brownell <loribr@microsoft.com>
#    Date:          04/15/98
#
#    Contact:       cpxlate@microsoft.com
#                   K.D. Chang    <a-kchang@microsoft.com>
#
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp1257_WinBaltic code (in hex)
#        Column #1 is the cp1257 code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp1257_WinBaltic order
#    The entries are in cp1257 order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264































265
266
267
268
269
270
271
272







273
274
275
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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266







267
268
269
270
271
272
273
274









-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+







-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

-
+

-
+

-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+





-
-
-
-
-
+
+
+
+
+



-
+

-
-
-
+
+
+

-
+

-
+







-
+

-
-
-
+
+
+


-
+

-
+



-
+


-
+

-
-
+
+



-
+


-
-
-
+
+
+



-
+

-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

-
-
-
-
-
-
-
+
+
+
+
+
+
+

-
-
0x29	0x0029	#RIGHT PARENTHESIS
0x2A	0x002A	#ASTERISK
0x2B	0x002B	#PLUS SIGN
0x2C	0x002C	#COMMA
0x2D	0x002D	#HYPHEN-MINUS
0x2E	0x002E	#FULL STOP
0x2F	0x002F	#SOLIDUS
0x30	0x0030	#DIGIT 0
0x31	0x0031	#DIGIT 1
0x32	0x0032	#DIGIT 2
0x33	0x0033	#DIGIT 3
0x34	0x0034	#DIGIT 4
0x35	0x0035	#DIGIT 5
0x36	0x0036	#DIGIT 6
0x37	0x0037	#DIGIT 7
0x38	0x0038	#DIGIT 8
0x39	0x0039	#DIGIT 9
0x30	0x0030	#DIGIT ZERO
0x31	0x0031	#DIGIT ONE
0x32	0x0032	#DIGIT TWO
0x33	0x0033	#DIGIT THREE
0x34	0x0034	#DIGIT FOUR
0x35	0x0035	#DIGIT FIVE
0x36	0x0036	#DIGIT SIX
0x37	0x0037	#DIGIT SEVEN
0x38	0x0038	#DIGIT EIGHT
0x39	0x0039	#DIGIT NINE
0x3A	0x003A	#COLON
0x3B	0x003B	#SEMICOLON
0x3C	0x003C	#LESS-THAN SIGN
0x3D	0x003D	#EQUALS SIGN
0x3E	0x003E	#GREATER-THAN SIGN
0x3F	0x003F	#QUESTION MARK
0x40	0x0040	#COMMERCIAL AT
0x41	0x0041	#LATIN CAPITAL A
0x42	0x0042	#LATIN CAPITAL B
0x43	0x0043	#LATIN CAPITAL C
0x44	0x0044	#LATIN CAPITAL D
0x45	0x0045	#LATIN CAPITAL E
0x46	0x0046	#LATIN CAPITAL F
0x47	0x0047	#LATIN CAPITAL G
0x48	0x0048	#LATIN CAPITAL H
0x49	0x0049	#LATIN CAPITAL I
0x4A	0x004A	#LATIN CAPITAL J
0x4B	0x004B	#LATIN CAPITAL K
0x4C	0x004C	#LATIN CAPITAL L
0x4D	0x004D	#LATIN CAPITAL M
0x4E	0x004E	#LATIN CAPITAL N
0x4F	0x004F	#LATIN CAPITAL O
0x50	0x0050	#LATIN CAPITAL P
0x51	0x0051	#LATIN CAPITAL Q
0x52	0x0052	#LATIN CAPITAL R
0x53	0x0053	#LATIN CAPITAL S
0x54	0x0054	#LATIN CAPITAL T
0x55	0x0055	#LATIN CAPITAL U
0x56	0x0056	#LATIN CAPITAL V
0x57	0x0057	#LATIN CAPITAL W
0x58	0x0058	#LATIN CAPITAL X
0x59	0x0059	#LATIN CAPITAL Y
0x5A	0x005A	#LATIN CAPITAL Z
0x41	0x0041	#LATIN CAPITAL LETTER A
0x42	0x0042	#LATIN CAPITAL LETTER B
0x43	0x0043	#LATIN CAPITAL LETTER C
0x44	0x0044	#LATIN CAPITAL LETTER D
0x45	0x0045	#LATIN CAPITAL LETTER E
0x46	0x0046	#LATIN CAPITAL LETTER F
0x47	0x0047	#LATIN CAPITAL LETTER G
0x48	0x0048	#LATIN CAPITAL LETTER H
0x49	0x0049	#LATIN CAPITAL LETTER I
0x4A	0x004A	#LATIN CAPITAL LETTER J
0x4B	0x004B	#LATIN CAPITAL LETTER K
0x4C	0x004C	#LATIN CAPITAL LETTER L
0x4D	0x004D	#LATIN CAPITAL LETTER M
0x4E	0x004E	#LATIN CAPITAL LETTER N
0x4F	0x004F	#LATIN CAPITAL LETTER O
0x50	0x0050	#LATIN CAPITAL LETTER P
0x51	0x0051	#LATIN CAPITAL LETTER Q
0x52	0x0052	#LATIN CAPITAL LETTER R
0x53	0x0053	#LATIN CAPITAL LETTER S
0x54	0x0054	#LATIN CAPITAL LETTER T
0x55	0x0055	#LATIN CAPITAL LETTER U
0x56	0x0056	#LATIN CAPITAL LETTER V
0x57	0x0057	#LATIN CAPITAL LETTER W
0x58	0x0058	#LATIN CAPITAL LETTER X
0x59	0x0059	#LATIN CAPITAL LETTER Y
0x5A	0x005A	#LATIN CAPITAL LETTER Z
0x5B	0x005B	#LEFT SQUARE BRACKET
0x5C	0x005C	#BACKSLASH
0x5C	0x005C	#REVERSE SOLIDUS
0x5D	0x005D	#RIGHT SQUARE BRACKET
0x5E	0x005E	#CIRCUMFLEX
0x5E	0x005E	#CIRCUMFLEX ACCENT
0x5F	0x005F	#LOW LINE
0x60	0x0060	#GRAVE
0x61	0x0061	#LATIN SMALL A
0x62	0x0062	#LATIN SMALL B
0x63	0x0063	#LATIN SMALL C
0x64	0x0064	#LATIN SMALL D
0x65	0x0065	#LATIN SMALL E
0x66	0x0066	#LATIN SMALL F
0x67	0x0067	#LATIN SMALL G
0x68	0x0068	#LATIN SMALL H
0x69	0x0069	#LATIN SMALL I
0x6A	0x006A	#LATIN SMALL J
0x6B	0x006B	#LATIN SMALL K
0x6C	0x006C	#LATIN SMALL L
0x6D	0x006D	#LATIN SMALL M
0x6E	0x006E	#LATIN SMALL N
0x6F	0x006F	#LATIN SMALL O
0x70	0x0070	#LATIN SMALL P
0x71	0x0071	#LATIN SMALL Q
0x72	0x0072	#LATIN SMALL R
0x73	0x0073	#LATIN SMALL S
0x74	0x0074	#LATIN SMALL T
0x75	0x0075	#LATIN SMALL U
0x76	0x0076	#LATIN SMALL V
0x77	0x0077	#LATIN SMALL W
0x78	0x0078	#LATIN SMALL X
0x79	0x0079	#LATIN SMALL Y
0x7A	0x007A	#LATIN SMALL Z
0x60	0x0060	#GRAVE ACCENT
0x61	0x0061	#LATIN SMALL LETTER A
0x62	0x0062	#LATIN SMALL LETTER B
0x63	0x0063	#LATIN SMALL LETTER C
0x64	0x0064	#LATIN SMALL LETTER D
0x65	0x0065	#LATIN SMALL LETTER E
0x66	0x0066	#LATIN SMALL LETTER F
0x67	0x0067	#LATIN SMALL LETTER G
0x68	0x0068	#LATIN SMALL LETTER H
0x69	0x0069	#LATIN SMALL LETTER I
0x6A	0x006A	#LATIN SMALL LETTER J
0x6B	0x006B	#LATIN SMALL LETTER K
0x6C	0x006C	#LATIN SMALL LETTER L
0x6D	0x006D	#LATIN SMALL LETTER M
0x6E	0x006E	#LATIN SMALL LETTER N
0x6F	0x006F	#LATIN SMALL LETTER O
0x70	0x0070	#LATIN SMALL LETTER P
0x71	0x0071	#LATIN SMALL LETTER Q
0x72	0x0072	#LATIN SMALL LETTER R
0x73	0x0073	#LATIN SMALL LETTER S
0x74	0x0074	#LATIN SMALL LETTER T
0x75	0x0075	#LATIN SMALL LETTER U
0x76	0x0076	#LATIN SMALL LETTER V
0x77	0x0077	#LATIN SMALL LETTER W
0x78	0x0078	#LATIN SMALL LETTER X
0x79	0x0079	#LATIN SMALL LETTER Y
0x7A	0x007A	#LATIN SMALL LETTER Z
0x7B	0x007B	#LEFT CURLY BRACKET
0x7C	0x007C	#VERTICAL LINE
0x7D	0x007D	#RIGHT CURLY BRACKET
0x7E	0x007E	#TILDE
0x7F	0x007F	#DELETE
0x80		#UNDEFINED
0x81		#UNDEFINED
0x82	0x201A	#LOW SINGLE COMMA QUOTATION MARK
0x83		#UNDEFINED
0x84	0x201E	#LOW DOUBLE COMMA QUOTATION MARK
0x80	0x20AC	#EURO SIGN
0x81	      	#UNDEFINED
0x82	0x201A	#SINGLE LOW-9 QUOTATION MARK
0x83	      	#UNDEFINED
0x84	0x201E	#DOUBLE LOW-9 QUOTATION MARK
0x85	0x2026	#HORIZONTAL ELLIPSIS
0x86	0x2020	#DAGGER
0x87	0x2021	#DOUBLE DAGGER
0x88		#UNDEFINED
0x88	      	#UNDEFINED
0x89	0x2030	#PER MILLE SIGN
0x8A		#UNDEFINED
0x8B	0x2039	#LEFT POINTING SINGLE GUILLEMENT
0x8C		#UNDEFINED
0x8A	      	#UNDEFINED
0x8B	0x2039	#SINGLE LEFT-POINTING ANGLE QUOTATION MARK
0x8C	      	#UNDEFINED
0x8D	0x00A8	#DIAERESIS
0x8E	0x02C7	#HACEK
0x8E	0x02C7	#CARON
0x8F	0x00B8	#CEDILLA
0x90		#UNDEFINED
0x90	      	#UNDEFINED
0x91	0x2018	#LEFT SINGLE QUOTATION MARK
0x92	0x2019	#RIGHT SINGLE QUOTATION MARK
0x93	0x201C	#LEFT DOUBLE QUOTATION MARK
0x94	0x201D	#RIGHT DOUBLE QUOTATION MARK
0x95	0x2022	#BULLET
0x96	0x2013	#EN DASH
0x97	0x2014	#EM DASH
0x98		#UNDEFINED
0x98	      	#UNDEFINED
0x99	0x2122	#TRADE MARK SIGN
0x9A		#UNDEFINED
0x9B	0x203A	#RIGHT POINTING SINGLE GUILLEMENT
0x9C		#UNDEFINED
0x9A	      	#UNDEFINED
0x9B	0x203A	#SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
0x9C	      	#UNDEFINED
0x9D	0x00AF	#MACRON
0x9E	0x02DB	#OGONEK
0x9F		#UNDEFINED
0x9F	      	#UNDEFINED
0xA0	0x00A0	#NO-BREAK SPACE
0xA1		#UNDEFINED
0xA1	      	#UNDEFINED
0xA2	0x00A2	#CENT SIGN
0xA3	0x00A3	#POUND SIGN
0xA4	0x00A4	#CURRENCY SIGN
0xA5		#UNDEFINED
0xA5	      	#UNDEFINED
0xA6	0x00A6	#BROKEN BAR
0xA7	0x00A7	#SECTION SIGN
0xA8	0x00D8	#LATIN CAPITAL O STROKE
0xA8	0x00D8	#LATIN CAPITAL LETTER O WITH STROKE
0xA9	0x00A9	#COPYRIGHT SIGN
0xAA	0x0156	#LATIN CAPITAL R CEDILLA
0xAB	0x00AB	#LEFT POINTING GUILLEMENT
0xAA	0x0156	#LATIN CAPITAL LETTER R WITH CEDILLA
0xAB	0x00AB	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xAC	0x00AC	#NOT SIGN
0xAD	0x00AD	#SOFT HYPHEN
0xAE	0x00AE	#REGISTERED SIGN
0xAF	0x00C6	#LATIN CAPITAL AE LIGATURE
0xAF	0x00C6	#LATIN CAPITAL LETTER AE
0xB0	0x00B0	#DEGREE SIGN
0xB1	0x00B1	#PLUS-MINUS SIGN
0xB2	0x00B2	#SUPERSCRIPT 2
0xB3	0x00B3	#SUPERSCRIPT 3
0xB4	0x00B4	#ACUTE
0xB2	0x00B2	#SUPERSCRIPT TWO
0xB3	0x00B3	#SUPERSCRIPT THREE
0xB4	0x00B4	#ACUTE ACCENT
0xB5	0x00B5	#MICRO SIGN
0xB6	0x00B6	#PILCROW SIGN
0xB7	0x00B7	#MIDDLE DOT
0xB8	0x00F8	#LATIN SAMLL O STROKE
0xB8	0x00F8	#LATIN SMALL LETTER O WITH STROKE
0xB9	0x00B9	#SUPERSCRIPT ONE
0xBA	0x0157	#LATIN SMALL R CEDILLA
0xBB	0x00BB	#RIGHT POINTING GUILLEMENT
0xBC	0x00BC	#FRACTION 1/4
0xBD	0x00BD	#FRACTION 1/2
0xBE	0x00BE	#FRACTION 3/4
0xBF	0x00E6	#LATIN SMALL AE LIGATURE
0xC0	0x0104	#LATIN CAPITAL A OGONEK
0xC1	0x012E	#LATIN CAPITAL I OGONEK
0xC2	0x0100	#LATIN CAPITAL A MACRON
0xC3	0x0106	#LATIN CAPITAL C ACUTE
0xC4	0x00C4	#LATIN CAPITAL A DIAERESIS
0xC5	0x00C5	#LATIN CAPITAL A RING ABOVE
0xC6	0x0118	#LATIN CAPITAL E OGONEK
0xC7	0x0112	#LATIN CAPITAL E MACRON
0xC8	0x010C	#LATIN CAPITAL C HACEK
0xC9	0x00C9	#LATIN CAPITAL E ACUTE
0xCA	0x0179	#LATIN CAPITAL Z ACUTE
0xCB	0x0116	#LATIN CAPITAL E DOT ABOVE
0xCC	0x0122	#LATIN CAPITAL G CEDILLA
0xCD	0x0136	#LATIN CAPITAL K CEDILLA
0xCE	0x012A	#LATIN CAPITAL I MACRON
0xCF	0x013B	#LATIN CAPITAL L CEDILLA
0xD0	0x0160	#LATIN CAPITAL S HACEK
0xD1	0x0143	#LATIN CAPITAL N ACUTE
0xD2	0x0145	#LATIN CAPITAL N CEDILLA
0xD3	0x00D3	#LATIN CAPITAL O ACUTE
0xD4	0x014C	#LATIN CAPITAL O MACRON
0xD5	0x00D5	#LATIN CAPITAL O TILDE
0xD6	0x00D6	#LATIN CAPITAL O DIAERESIS
0xBA	0x0157	#LATIN SMALL LETTER R WITH CEDILLA
0xBB	0x00BB	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xBC	0x00BC	#VULGAR FRACTION ONE QUARTER
0xBD	0x00BD	#VULGAR FRACTION ONE HALF
0xBE	0x00BE	#VULGAR FRACTION THREE QUARTERS
0xBF	0x00E6	#LATIN SMALL LETTER AE
0xC0	0x0104	#LATIN CAPITAL LETTER A WITH OGONEK
0xC1	0x012E	#LATIN CAPITAL LETTER I WITH OGONEK
0xC2	0x0100	#LATIN CAPITAL LETTER A WITH MACRON
0xC3	0x0106	#LATIN CAPITAL LETTER C WITH ACUTE
0xC4	0x00C4	#LATIN CAPITAL LETTER A WITH DIAERESIS
0xC5	0x00C5	#LATIN CAPITAL LETTER A WITH RING ABOVE
0xC6	0x0118	#LATIN CAPITAL LETTER E WITH OGONEK
0xC7	0x0112	#LATIN CAPITAL LETTER E WITH MACRON
0xC8	0x010C	#LATIN CAPITAL LETTER C WITH CARON
0xC9	0x00C9	#LATIN CAPITAL LETTER E WITH ACUTE
0xCA	0x0179	#LATIN CAPITAL LETTER Z WITH ACUTE
0xCB	0x0116	#LATIN CAPITAL LETTER E WITH DOT ABOVE
0xCC	0x0122	#LATIN CAPITAL LETTER G WITH CEDILLA
0xCD	0x0136	#LATIN CAPITAL LETTER K WITH CEDILLA
0xCE	0x012A	#LATIN CAPITAL LETTER I WITH MACRON
0xCF	0x013B	#LATIN CAPITAL LETTER L WITH CEDILLA
0xD0	0x0160	#LATIN CAPITAL LETTER S WITH CARON
0xD1	0x0143	#LATIN CAPITAL LETTER N WITH ACUTE
0xD2	0x0145	#LATIN CAPITAL LETTER N WITH CEDILLA
0xD3	0x00D3	#LATIN CAPITAL LETTER O WITH ACUTE
0xD4	0x014C	#LATIN CAPITAL LETTER O WITH MACRON
0xD5	0x00D5	#LATIN CAPITAL LETTER O WITH TILDE
0xD6	0x00D6	#LATIN CAPITAL LETTER O WITH DIAERESIS
0xD7	0x00D7	#MULTIPLICATION SIGN
0xD8	0x0172	#LATIN CAPITAL U OGONEK
0xD9	0x0141	#LATIN CAPITAL L STROKE
0xDA	0x015A	#LATIN CAPITAL S ACUTE
0xDB	0x016A	#LATIN CAPITAL U MACRON
0xDC	0x00DC	#LATIN CAPITAL U DIAERESIS
0xDD	0x017B	#LATIN CAPITAL Z DOT ABOVE
0xDE	0x017D	#LATIN CAPITAL Z HACEK
0xDF	0x00DF	#LATIN SMALL SHARP SS
0xE0	0x0105	#LATIN SMALL A OGONEK
0xE1	0x012F	#LATIN SMALL I OGONEK
0xE2	0x0101	#LATIN SMALL A MACRON
0xE3	0x0107	#LATIN SMALL C ACUTE
0xE4	0x00E4	#LATIN SMALL A DIAERESIS
0xE5	0x00E5	#LATIN SMALL A RING ABOVE
0xE6	0x0119	#LATIN SMALL E OGONEK
0xE7	0x0113	#LATIN SMALL E MACRON
0xE8	0x010D	#LATIN SMALL C HACEK
0xE9	0x00E9	#LATIN SMALL E ACUTE
0xEA	0x017A	#LATIN SMALL Z ACUTE
0xEB	0x0117	#LATIN SMALL E DOT ABOVE
0xEC	0x0123	#LATIN SMALL G CEDILLA
0xED	0x0137	#LATIN SMALL K CEDILLA
0xEE	0x012B	#LATIN SMALL I MACRON
0xEF	0x013C	#LATIN SMALL L CEDILLA
0xF0	0x0161	#LATIN SMALL S HACEK
0xF1	0x0144	#LATIN SMALL N ACUTE
0xF2	0x0146	#LATIN SMALL N CEDILLA
0xF3	0x00F3	#LATIN SMALL O ACUTE
0xF4	0x014D	#LATIN SMALL O MACRON
0xF5	0x00F5	#LATIN SMALL O TILDE
0xF6	0x00F6	#LATIN SMALL O DIAERESIS
0xD8	0x0172	#LATIN CAPITAL LETTER U WITH OGONEK
0xD9	0x0141	#LATIN CAPITAL LETTER L WITH STROKE
0xDA	0x015A	#LATIN CAPITAL LETTER S WITH ACUTE
0xDB	0x016A	#LATIN CAPITAL LETTER U WITH MACRON
0xDC	0x00DC	#LATIN CAPITAL LETTER U WITH DIAERESIS
0xDD	0x017B	#LATIN CAPITAL LETTER Z WITH DOT ABOVE
0xDE	0x017D	#LATIN CAPITAL LETTER Z WITH CARON
0xDF	0x00DF	#LATIN SMALL LETTER SHARP S
0xE0	0x0105	#LATIN SMALL LETTER A WITH OGONEK
0xE1	0x012F	#LATIN SMALL LETTER I WITH OGONEK
0xE2	0x0101	#LATIN SMALL LETTER A WITH MACRON
0xE3	0x0107	#LATIN SMALL LETTER C WITH ACUTE
0xE4	0x00E4	#LATIN SMALL LETTER A WITH DIAERESIS
0xE5	0x00E5	#LATIN SMALL LETTER A WITH RING ABOVE
0xE6	0x0119	#LATIN SMALL LETTER E WITH OGONEK
0xE7	0x0113	#LATIN SMALL LETTER E WITH MACRON
0xE8	0x010D	#LATIN SMALL LETTER C WITH CARON
0xE9	0x00E9	#LATIN SMALL LETTER E WITH ACUTE
0xEA	0x017A	#LATIN SMALL LETTER Z WITH ACUTE
0xEB	0x0117	#LATIN SMALL LETTER E WITH DOT ABOVE
0xEC	0x0123	#LATIN SMALL LETTER G WITH CEDILLA
0xED	0x0137	#LATIN SMALL LETTER K WITH CEDILLA
0xEE	0x012B	#LATIN SMALL LETTER I WITH MACRON
0xEF	0x013C	#LATIN SMALL LETTER L WITH CEDILLA
0xF0	0x0161	#LATIN SMALL LETTER S WITH CARON
0xF1	0x0144	#LATIN SMALL LETTER N WITH ACUTE
0xF2	0x0146	#LATIN SMALL LETTER N WITH CEDILLA
0xF3	0x00F3	#LATIN SMALL LETTER O WITH ACUTE
0xF4	0x014D	#LATIN SMALL LETTER O WITH MACRON
0xF5	0x00F5	#LATIN SMALL LETTER O WITH TILDE
0xF6	0x00F6	#LATIN SMALL LETTER O WITH DIAERESIS
0xF7	0x00F7	#DIVISION SIGN
0xF8	0x0173	#LATIN SMALL U OGONEK
0xF9	0x0142	#LATIN SMALL L STROKE
0xFA	0x015B	#LATIN SMALL S ACUTE
0xFB	0x016B	#LATIN SMALL U MACRON
0xFC	0x00FC	#LATIN SMALL U DIAERESIS
0xFD	0x017C	#LATIN SMALL Z DOT ABOVE
0xFE	0x017E	#LATIN SMALL Z HACEK
0xF8	0x0173	#LATIN SMALL LETTER U WITH OGONEK
0xF9	0x0142	#LATIN SMALL LETTER L WITH STROKE
0xFA	0x015B	#LATIN SMALL LETTER S WITH ACUTE
0xFB	0x016B	#LATIN SMALL LETTER U WITH MACRON
0xFC	0x00FC	#LATIN SMALL LETTER U WITH DIAERESIS
0xFD	0x017C	#LATIN SMALL LETTER Z WITH DOT ABOVE
0xFE	0x017E	#LATIN SMALL LETTER Z WITH CARON
0xFF	0x02D9	#DOT ABOVE


Changes to tools/encoding/cp1258.txt.
1
2

3
4

5
6
7



8

9
10
11
12

13
14
15
16

17
18
19
20
21
22
23
1

2
3

4
5


6
7
8

9
10
11
12

13
14
15
16

17
18
19
20
21
22
23
24

-
+

-
+

-
-
+
+
+
-
+



-
+



-
+







#
#    Name:     cp1258_WinVietnamese to Unicode table
#    Name:     cp1258 to Unicode table
#    Unicode version: 2.0
#    Table version: 2.00
#    Table version: 2.01
#    Table format:  Format A
#    Date:          04/24/96
#    Authors:       Lori Brownell <loribr@microsoft.com>
#    Date:          04/15/98
#
#    Contact:       cpxlate@microsoft.com
#                   K.D. Chang    <a-kchang@microsoft.com>
#
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp1258_WinVietnamese code (in hex)
#        Column #1 is the cp1258 code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp1258_WinVietnamese order
#    The entries are in cp1258 order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
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
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







-
-
+
+








-
+


-
-
-
-
+
+
+
+









-
+


-
-
+
+







0x79	0x0079	#LATIN SMALL LETTER Y
0x7A	0x007A	#LATIN SMALL LETTER Z
0x7B	0x007B	#LEFT CURLY BRACKET
0x7C	0x007C	#VERTICAL LINE
0x7D	0x007D	#RIGHT CURLY BRACKET
0x7E	0x007E	#TILDE
0x7F	0x007F	#DELETE
0x80		#UNDEFINED
0x81		#UNDEFINED
0x80	0x20AC	#EURO SIGN
0x81	      	#UNDEFINED
0x82	0x201A	#SINGLE LOW-9 QUOTATION MARK
0x83	0x0192	#LATIN SMALL LETTER F WITH HOOK
0x84	0x201E	#DOUBLE LOW-9 QUOTATION MARK
0x85	0x2026	#HORIZONTAL ELLIPSIS
0x86	0x2020	#DAGGER
0x87	0x2021	#DOUBLE DAGGER
0x88	0x02C6	#MODIFIER LETTER CIRCUMFLEX ACCENT
0x89	0x2030	#PER MILLE SIGN
0x8A		#UNDEFINED
0x8A	      	#UNDEFINED
0x8B	0x2039	#SINGLE LEFT-POINTING ANGLE QUOTATION MARK
0x8C	0x0152	#LATIN CAPITAL LIGATURE OE
0x8D		#UNDEFINED
0x8E		#UNDEFINED
0x8F		#UNDEFINED
0x90		#UNDEFINED
0x8D	      	#UNDEFINED
0x8E	      	#UNDEFINED
0x8F	      	#UNDEFINED
0x90	      	#UNDEFINED
0x91	0x2018	#LEFT SINGLE QUOTATION MARK
0x92	0x2019	#RIGHT SINGLE QUOTATION MARK
0x93	0x201C	#LEFT DOUBLE QUOTATION MARK
0x94	0x201D	#RIGHT DOUBLE QUOTATION MARK
0x95	0x2022	#BULLET
0x96	0x2013	#EN DASH
0x97	0x2014	#EM DASH
0x98	0x02DC	#SMALL TILDE
0x99	0x2122	#TRADE MARK SIGN
0x9A		#UNDEFINED
0x9A	      	#UNDEFINED
0x9B	0x203A	#SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
0x9C	0x0153	#LATIN SMALL LIGATURE OE
0x9D		#UNDEFINED
0x9E		#UNDEFINED
0x9D	      	#UNDEFINED
0x9E	      	#UNDEFINED
0x9F	0x0178	#LATIN CAPITAL LETTER Y WITH DIAERESIS
0xA0	0x00A0	#NO-BREAK SPACE
0xA1	0x00A1	#INVERTED EXCLAMATION MARK
0xA2	0x00A2	#CENT SIGN
0xA3	0x00A3	#POUND SIGN
0xA4	0x00A4	#CURRENCY SIGN
0xA5	0x00A5	#YEN SIGN
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
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







-
+





-
+



-
+







0xBF	0x00BF	#INVERTED QUESTION MARK
0xC0	0x00C0	#LATIN CAPITAL LETTER A WITH GRAVE
0xC1	0x00C1	#LATIN CAPITAL LETTER A WITH ACUTE
0xC2	0x00C2	#LATIN CAPITAL LETTER A WITH CIRCUMFLEX
0xC3	0x0102	#LATIN CAPITAL LETTER A WITH BREVE
0xC4	0x00C4	#LATIN CAPITAL LETTER A WITH DIAERESIS
0xC5	0x00C5	#LATIN CAPITAL LETTER A WITH RING ABOVE
0xC6	0x00C6	#LATIN CAPITAL LIGATURE AE
0xC6	0x00C6	#LATIN CAPITAL LETTER AE
0xC7	0x00C7	#LATIN CAPITAL LETTER C WITH CEDILLA
0xC8	0x00C8	#LATIN CAPITAL LETTER E WITH GRAVE
0xC9	0x00C9	#LATIN CAPITAL LETTER E WITH ACUTE
0xCA	0x00CA	#LATIN CAPITAL LETTER E WITH CIRCUMFLEX
0xCB	0x00CB	#LATIN CAPITAL LETTER E WITH DIAERESIS
0xCC	0x0340	#NON-SPACING GRAVE TONE MARK
0xCC	0x0300	#COMBINING GRAVE ACCENT
0xCD	0x00CD	#LATIN CAPITAL LETTER I WITH ACUTE
0xCE	0x00CE	#LATIN CAPITAL LETTER I WITH CIRCUMFLEX
0xCF	0x00CF	#LATIN CAPITAL LETTER I WITH DIAERESIS
0xD0	0x0110	#LATIN CAPITAL LETTER D BAR
0xD0	0x0110	#LATIN CAPITAL LETTER D WITH STROKE
0xD1	0x00D1	#LATIN CAPITAL LETTER N WITH TILDE
0xD2	0x0309	#COMBINING HOOK ABOVE
0xD3	0x00D3	#LATIN CAPITAL LETTER O WITH ACUTE
0xD4	0x00D4	#LATIN CAPITAL LETTER O WITH CIRCUMFLEX
0xD5	0x01A0	#LATIN CAPITAL LETTER O WITH HORN
0xD6	0x00D6	#LATIN CAPITAL LETTER O WITH DIAERESIS
0xD7	0x00D7	#MULTIPLICATION SIGN
241
242
243
244
245
246
247
248

249
250
251
252
253
254

255
256
257
258

259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
242
243
244
245
246
247
248

249
250
251
252
253
254

255
256
257
258

259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274









-
+





-
+



-
+















-
-
0xDF	0x00DF	#LATIN SMALL LETTER SHARP S
0xE0	0x00E0	#LATIN SMALL LETTER A WITH GRAVE
0xE1	0x00E1	#LATIN SMALL LETTER A WITH ACUTE
0xE2	0x00E2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
0xE3	0x0103	#LATIN SMALL LETTER A WITH BREVE
0xE4	0x00E4	#LATIN SMALL LETTER A WITH DIAERESIS
0xE5	0x00E5	#LATIN SMALL LETTER A WITH RING ABOVE
0xE6	0x00E6	#LATIN SMALL LIGATURE AE
0xE6	0x00E6	#LATIN SMALL LETTER AE
0xE7	0x00E7	#LATIN SMALL LETTER C WITH CEDILLA
0xE8	0x00E8	#LATIN SMALL LETTER E WITH GRAVE
0xE9	0x00E9	#LATIN SMALL LETTER E WITH ACUTE
0xEA	0x00EA	#LATIN SMALL LETTER E WITH CIRCUMFLEX
0xEB	0x00EB	#LATIN SMALL LETTER E WITH DIAERESIS
0xEC	0x0341	#NON-SPACING ACUTE TONE MARK
0xEC	0x0301	#COMBINING ACUTE ACCENT
0xED	0x00ED	#LATIN SMALL LETTER I WITH ACUTE
0xEE	0x00EE	#LATIN SMALL LETTER I WITH CIRCUMFLEX
0xEF	0x00EF	#LATIN SMALL LETTER I WITH DIAERESIS
0xF0	0x0111	#LATIN SMALL LETTER D BAR
0xF0	0x0111	#LATIN SMALL LETTER D WITH STROKE
0xF1	0x00F1	#LATIN SMALL LETTER N WITH TILDE
0xF2	0x0323	#COMBINING DOT BELOW
0xF3	0x00F3	#LATIN SMALL LETTER O WITH ACUTE
0xF4	0x00F4	#LATIN SMALL LETTER O WITH CIRCUMFLEX
0xF5	0x01A1	#LATIN SMALL LETTER O WITH HORN
0xF6	0x00F6	#LATIN SMALL LETTER O WITH DIAERESIS
0xF7	0x00F7	#DIVISION SIGN
0xF8	0x00F8	#LATIN SMALL LETTER O WITH STROKE
0xF9	0x00F9	#LATIN SMALL LETTER U WITH GRAVE
0xFA	0x00FA	#LATIN SMALL LETTER U WITH ACUTE
0xFB	0x00FB	#LATIN SMALL LETTER U WITH CIRCUMFLEX
0xFC	0x00FC	#LATIN SMALL LETTER U WITH DIAERESIS
0xFD	0x01B0	#LATIN SMALL LETTER U WITH HORN
0xFE	0x20AB	#DONG SIGN
0xFF	0x00FF	#LATIN SMALL LETTER Y WITH DIAERESIS


Changes to tools/encoding/cp874.txt.
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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273




















































274
275
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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274



-
+

-
+

-
-
+
+
+
-
+



-
+



-
+











-
-
-
-
-
-
+
+
+
+
+
+










-
-
-
-
-
-
+
+
+
+
+
+










-
-
-
-
-
-
+
+
+
+
+
+










-
-
-
-
-
-
+
+
+
+
+
+










-
-
-
-
-
-
+
+
+
+
+
+










-
-
-
-
-
-
+
+
+
+
+
+










-
-
-
-
-
-
+
+
+
+
+
+










-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+

-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+



-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
#
#    Name:     cp874_DOSThai to Unicode table
#    Name:     cp874 to Unicode table
#    Unicode version: 2.0
#    Table version: 2.00
#    Table version: 2.01
#    Table format:  Format A
#    Date:          04/24/96
#    Authors:       Lori Brownell <loribr@microsoft.com>
#    Date:          02/28/98
#
#    Contact:       cpxlate@microsoft.com
#                   K.D. Chang    <a-kchang@microsoft.com>
#
#    General notes: none
#
#    Format: Three tab-separated columns
#        Column #1 is the cp874_DOSThai code (in hex)
#        Column #1 is the cp874 code (in hex)
#        Column #2 is the Unicode (in hex as 0xXXXX)
#        Column #3 is the Unicode name (follows a comment sign, '#')
#
#    The entries are in cp874_DOSThai order
#    The entries are in cp874 order
#
0x00	0x0000	#NULL
0x01	0x0001	#START OF HEADING
0x02	0x0002	#START OF TEXT
0x03	0x0003	#END OF TEXT
0x04	0x0004	#END OF TRANSMISSION
0x05	0x0005	#ENQUIRY
0x06	0x0006	#ACKNOWLEDGE
0x07	0x0007	#BELL
0x08	0x0008	#BACKSPACE
0x09	0x0009	#HORIZONTAL TABULATION
0x0a	0x000a	#LINE FEED
0x0b	0x000b	#VERTICAL TABULATION
0x0c	0x000c	#FORM FEED
0x0d	0x000d	#CARRIAGE RETURN
0x0e	0x000e	#SHIFT OUT
0x0f	0x000f	#SHIFT IN
0x0A	0x000A	#LINE FEED
0x0B	0x000B	#VERTICAL TABULATION
0x0C	0x000C	#FORM FEED
0x0D	0x000D	#CARRIAGE RETURN
0x0E	0x000E	#SHIFT OUT
0x0F	0x000F	#SHIFT IN
0x10	0x0010	#DATA LINK ESCAPE
0x11	0x0011	#DEVICE CONTROL ONE
0x12	0x0012	#DEVICE CONTROL TWO
0x13	0x0013	#DEVICE CONTROL THREE
0x14	0x0014	#DEVICE CONTROL FOUR
0x15	0x0015	#NEGATIVE ACKNOWLEDGE
0x16	0x0016	#SYNCHRONOUS IDLE
0x17	0x0017	#END OF TRANSMISSION BLOCK
0x18	0x0018	#CANCEL
0x19	0x0019	#END OF MEDIUM
0x1a	0x001a	#SUBSTITUTE
0x1b	0x001b	#ESCAPE
0x1c	0x001c	#FILE SEPARATOR
0x1d	0x001d	#GROUP SEPARATOR
0x1e	0x001e	#RECORD SEPARATOR
0x1f	0x001f	#UNIT SEPARATOR
0x1A	0x001A	#SUBSTITUTE
0x1B	0x001B	#ESCAPE
0x1C	0x001C	#FILE SEPARATOR
0x1D	0x001D	#GROUP SEPARATOR
0x1E	0x001E	#RECORD SEPARATOR
0x1F	0x001F	#UNIT SEPARATOR
0x20	0x0020	#SPACE
0x21	0x0021	#EXCLAMATION MARK
0x22	0x0022	#QUOTATION MARK
0x23	0x0023	#NUMBER SIGN
0x24	0x0024	#DOLLAR SIGN
0x25	0x0025	#PERCENT SIGN
0x26	0x0026	#AMPERSAND
0x27	0x0027	#APOSTROPHE
0x28	0x0028	#LEFT PARENTHESIS
0x29	0x0029	#RIGHT PARENTHESIS
0x2a	0x002a	#ASTERISK
0x2b	0x002b	#PLUS SIGN
0x2c	0x002c	#COMMA
0x2d	0x002d	#HYPHEN-MINUS
0x2e	0x002e	#FULL STOP
0x2f	0x002f	#SOLIDUS
0x2A	0x002A	#ASTERISK
0x2B	0x002B	#PLUS SIGN
0x2C	0x002C	#COMMA
0x2D	0x002D	#HYPHEN-MINUS
0x2E	0x002E	#FULL STOP
0x2F	0x002F	#SOLIDUS
0x30	0x0030	#DIGIT ZERO
0x31	0x0031	#DIGIT ONE
0x32	0x0032	#DIGIT TWO
0x33	0x0033	#DIGIT THREE
0x34	0x0034	#DIGIT FOUR
0x35	0x0035	#DIGIT FIVE
0x36	0x0036	#DIGIT SIX
0x37	0x0037	#DIGIT SEVEN
0x38	0x0038	#DIGIT EIGHT
0x39	0x0039	#DIGIT NINE
0x3a	0x003a	#COLON
0x3b	0x003b	#SEMICOLON
0x3c	0x003c	#LESS-THAN SIGN
0x3d	0x003d	#EQUALS SIGN
0x3e	0x003e	#GREATER-THAN SIGN
0x3f	0x003f	#QUESTION MARK
0x3A	0x003A	#COLON
0x3B	0x003B	#SEMICOLON
0x3C	0x003C	#LESS-THAN SIGN
0x3D	0x003D	#EQUALS SIGN
0x3E	0x003E	#GREATER-THAN SIGN
0x3F	0x003F	#QUESTION MARK
0x40	0x0040	#COMMERCIAL AT
0x41	0x0041	#LATIN CAPITAL LETTER A
0x42	0x0042	#LATIN CAPITAL LETTER B
0x43	0x0043	#LATIN CAPITAL LETTER C
0x44	0x0044	#LATIN CAPITAL LETTER D
0x45	0x0045	#LATIN CAPITAL LETTER E
0x46	0x0046	#LATIN CAPITAL LETTER F
0x47	0x0047	#LATIN CAPITAL LETTER G
0x48	0x0048	#LATIN CAPITAL LETTER H
0x49	0x0049	#LATIN CAPITAL LETTER I
0x4a	0x004a	#LATIN CAPITAL LETTER J
0x4b	0x004b	#LATIN CAPITAL LETTER K
0x4c	0x004c	#LATIN CAPITAL LETTER L
0x4d	0x004d	#LATIN CAPITAL LETTER M
0x4e	0x004e	#LATIN CAPITAL LETTER N
0x4f	0x004f	#LATIN CAPITAL LETTER O
0x4A	0x004A	#LATIN CAPITAL LETTER J
0x4B	0x004B	#LATIN CAPITAL LETTER K
0x4C	0x004C	#LATIN CAPITAL LETTER L
0x4D	0x004D	#LATIN CAPITAL LETTER M
0x4E	0x004E	#LATIN CAPITAL LETTER N
0x4F	0x004F	#LATIN CAPITAL LETTER O
0x50	0x0050	#LATIN CAPITAL LETTER P
0x51	0x0051	#LATIN CAPITAL LETTER Q
0x52	0x0052	#LATIN CAPITAL LETTER R
0x53	0x0053	#LATIN CAPITAL LETTER S
0x54	0x0054	#LATIN CAPITAL LETTER T
0x55	0x0055	#LATIN CAPITAL LETTER U
0x56	0x0056	#LATIN CAPITAL LETTER V
0x57	0x0057	#LATIN CAPITAL LETTER W
0x58	0x0058	#LATIN CAPITAL LETTER X
0x59	0x0059	#LATIN CAPITAL LETTER Y
0x5a	0x005a	#LATIN CAPITAL LETTER Z
0x5b	0x005b	#LEFT SQUARE BRACKET
0x5c	0x005c	#REVERSE SOLIDUS
0x5d	0x005d	#RIGHT SQUARE BRACKET
0x5e	0x005e	#CIRCUMFLEX ACCENT
0x5f	0x005f	#LOW LINE
0x5A	0x005A	#LATIN CAPITAL LETTER Z
0x5B	0x005B	#LEFT SQUARE BRACKET
0x5C	0x005C	#REVERSE SOLIDUS
0x5D	0x005D	#RIGHT SQUARE BRACKET
0x5E	0x005E	#CIRCUMFLEX ACCENT
0x5F	0x005F	#LOW LINE
0x60	0x0060	#GRAVE ACCENT
0x61	0x0061	#LATIN SMALL LETTER A
0x62	0x0062	#LATIN SMALL LETTER B
0x63	0x0063	#LATIN SMALL LETTER C
0x64	0x0064	#LATIN SMALL LETTER D
0x65	0x0065	#LATIN SMALL LETTER E
0x66	0x0066	#LATIN SMALL LETTER F
0x67	0x0067	#LATIN SMALL LETTER G
0x68	0x0068	#LATIN SMALL LETTER H
0x69	0x0069	#LATIN SMALL LETTER I
0x6a	0x006a	#LATIN SMALL LETTER J
0x6b	0x006b	#LATIN SMALL LETTER K
0x6c	0x006c	#LATIN SMALL LETTER L
0x6d	0x006d	#LATIN SMALL LETTER M
0x6e	0x006e	#LATIN SMALL LETTER N
0x6f	0x006f	#LATIN SMALL LETTER O
0x6A	0x006A	#LATIN SMALL LETTER J
0x6B	0x006B	#LATIN SMALL LETTER K
0x6C	0x006C	#LATIN SMALL LETTER L
0x6D	0x006D	#LATIN SMALL LETTER M
0x6E	0x006E	#LATIN SMALL LETTER N
0x6F	0x006F	#LATIN SMALL LETTER O
0x70	0x0070	#LATIN SMALL LETTER P
0x71	0x0071	#LATIN SMALL LETTER Q
0x72	0x0072	#LATIN SMALL LETTER R
0x73	0x0073	#LATIN SMALL LETTER S
0x74	0x0074	#LATIN SMALL LETTER T
0x75	0x0075	#LATIN SMALL LETTER U
0x76	0x0076	#LATIN SMALL LETTER V
0x77	0x0077	#LATIN SMALL LETTER W
0x78	0x0078	#LATIN SMALL LETTER X
0x79	0x0079	#LATIN SMALL LETTER Y
0x7a	0x007a	#LATIN SMALL LETTER Z
0x7b	0x007b	#LEFT CURLY BRACKET
0x7c	0x007c	#VERTICAL LINE
0x7d	0x007d	#RIGHT CURLY BRACKET
0x7e	0x007e	#TILDE
0x7f	0x007f	#DELETE
0x80		#UNDEFINED
0x81		#UNDEFINED
0x82		#UNDEFINED
0x83		#UNDEFINED
0x84		#UNDEFINED
0x7A	0x007A	#LATIN SMALL LETTER Z
0x7B	0x007B	#LEFT CURLY BRACKET
0x7C	0x007C	#VERTICAL LINE
0x7D	0x007D	#RIGHT CURLY BRACKET
0x7E	0x007E	#TILDE
0x7F	0x007F	#DELETE
0x80	0x20AC	#EURO SIGN
0x81	      	#UNDEFINED
0x82	      	#UNDEFINED
0x83	      	#UNDEFINED
0x84	      	#UNDEFINED
0x85	0x2026	#HORIZONTAL ELLIPSIS
0x86		#UNDEFINED
0x87		#UNDEFINED
0x88		#UNDEFINED
0x89		#UNDEFINED
0x8a		#UNDEFINED
0x8b		#UNDEFINED
0x8c		#UNDEFINED
0x8d		#UNDEFINED
0x8e		#UNDEFINED
0x8f		#UNDEFINED
0x90		#UNDEFINED
0x91	0x2018	#SINGLE TURNED COMMA QUOTATION MARK
0x92	0x2019	#SINGLE COMMA QUOTATION MARK
0x93	0x201c	#DOUBLE TURNED COMMA QUOTATION MARK
0x94	0x201d	#DOUBLE COMMA QUOTATION MARK
0x86	      	#UNDEFINED
0x87	      	#UNDEFINED
0x88	      	#UNDEFINED
0x89	      	#UNDEFINED
0x8A	      	#UNDEFINED
0x8B	      	#UNDEFINED
0x8C	      	#UNDEFINED
0x8D	      	#UNDEFINED
0x8E	      	#UNDEFINED
0x8F	      	#UNDEFINED
0x90	      	#UNDEFINED
0x91	0x2018	#LEFT SINGLE QUOTATION MARK
0x92	0x2019	#RIGHT SINGLE QUOTATION MARK
0x93	0x201C	#LEFT DOUBLE QUOTATION MARK
0x94	0x201D	#RIGHT DOUBLE QUOTATION MARK
0x95	0x2022	#BULLET
0x96	0x2013	#EN DASH
0x97	0x2014	#EM DASH
0x98		#UNDEFINED
0x99		#UNDEFINED
0x9a		#UNDEFINED
0x9b		#UNDEFINED
0x9c		#UNDEFINED
0x9d		#UNDEFINED
0x9e		#UNDEFINED
0x9f		#UNDEFINED
0xa0	0x00a0	#NON-BREAKING SPACE
0xa1	0x0e01	#THAI LETTER KO KAI
0xa2	0x0e02	#THAI LETTER KHO KHAI
0xa3	0x0e03	#THAI LETTER KHO KHUAT
0xa4	0x0e04	#THAI LETTER KHO KHWAI
0xa5	0x0e05	#THAI LETTER KHO KHON
0xa6	0x0e06	#THAI LETTER KHO RAKHANG
0xa7	0x0e07	#THAI LETTER NGO NGU
0xa8	0x0e08	#THAI LETTER CHO CHAN
0xa9	0x0e09	#THAI LETTER CHO CHING
0xaa	0x0e0a	#THAI LETTER CHO CHANG
0xab	0x0e0b	#THAI LETTER SO SO
0xac	0x0e0c	#THAI LETTER CHO CHOE
0xad	0x0e0d	#THAI LETTER YO YING
0xae	0x0e0e	#THAI LETTER DO CHADA
0xaf	0x0e0f	#THAI LETTER TO PATAK
0xb0	0x0e10	#THAI LETTER THO THAN
0xb1	0x0e11	#THAI LETTER THO NANGMONTHO
0xb2	0x0e12	#THAI LETTER THO PHUTHAO
0xb3	0x0e13	#THAI LETTER NO NEN
0xb4	0x0e14	#THAI LETTER DO DEK
0xb5	0x0e15	#THAI LETTER TO TAO
0xb6	0x0e16	#THAI LETTER THO THUNG
0xb7	0x0e17	#THAI LETTER THO THAHAN
0xb8	0x0e18	#THAI LETTER THO THONG
0xb9	0x0e19	#THAI LETTER NO NU
0xba	0x0e1a	#THAI LETTER BO BAIMAI
0xbb	0x0e1b	#THAI LETTER PO PLA
0xbc	0x0e1c	#THAI LETTER PHO PHUNG
0xbd	0x0e1d	#THAI LETTER FO FA
0xbe	0x0e1e	#THAI LETTER PHO PHAN
0xbf	0x0e1f	#THAI LETTER FO FAN
0xc0	0x0e20	#THAI LETTER PHO SAMPHAO
0xc1	0x0e21	#THAI LETTER MO MA
0xc2	0x0e22	#THAI LETTER YO YAK
0xc3	0x0e23	#THAI LETTER RO RUA
0xc4	0x0e24	#THAI LETTER RU
0xc5	0x0e25	#THAI LETTER LO LING
0xc6	0x0e26	#THAI LETTER LU
0xc7	0x0e27	#THAI LETTER WO WAEN
0xc8	0x0e28	#THAI LETTER SO SALA
0xc9	0x0e29	#THAI LETTER SO RUSI
0xca	0x0e2a	#THAI LETTER SO SUA
0xcb	0x0e2b	#THAI LETTER HO HIP
0x98	      	#UNDEFINED
0x99	      	#UNDEFINED
0x9A	      	#UNDEFINED
0x9B	      	#UNDEFINED
0x9C	      	#UNDEFINED
0x9D	      	#UNDEFINED
0x9E	      	#UNDEFINED
0x9F	      	#UNDEFINED
0xA0	0x00A0	#NO-BREAK SPACE
0xA1	0x0E01	#THAI CHARACTER KO KAI
0xA2	0x0E02	#THAI CHARACTER KHO KHAI
0xA3	0x0E03	#THAI CHARACTER KHO KHUAT
0xA4	0x0E04	#THAI CHARACTER KHO KHWAI
0xA5	0x0E05	#THAI CHARACTER KHO KHON
0xA6	0x0E06	#THAI CHARACTER KHO RAKHANG
0xA7	0x0E07	#THAI CHARACTER NGO NGU
0xA8	0x0E08	#THAI CHARACTER CHO CHAN
0xA9	0x0E09	#THAI CHARACTER CHO CHING
0xAA	0x0E0A	#THAI CHARACTER CHO CHANG
0xAB	0x0E0B	#THAI CHARACTER SO SO
0xAC	0x0E0C	#THAI CHARACTER CHO CHOE
0xAD	0x0E0D	#THAI CHARACTER YO YING
0xAE	0x0E0E	#THAI CHARACTER DO CHADA
0xAF	0x0E0F	#THAI CHARACTER TO PATAK
0xB0	0x0E10	#THAI CHARACTER THO THAN
0xB1	0x0E11	#THAI CHARACTER THO NANGMONTHO
0xB2	0x0E12	#THAI CHARACTER THO PHUTHAO
0xB3	0x0E13	#THAI CHARACTER NO NEN
0xB4	0x0E14	#THAI CHARACTER DO DEK
0xB5	0x0E15	#THAI CHARACTER TO TAO
0xB6	0x0E16	#THAI CHARACTER THO THUNG
0xB7	0x0E17	#THAI CHARACTER THO THAHAN
0xB8	0x0E18	#THAI CHARACTER THO THONG
0xB9	0x0E19	#THAI CHARACTER NO NU
0xBA	0x0E1A	#THAI CHARACTER BO BAIMAI
0xBB	0x0E1B	#THAI CHARACTER PO PLA
0xBC	0x0E1C	#THAI CHARACTER PHO PHUNG
0xBD	0x0E1D	#THAI CHARACTER FO FA
0xBE	0x0E1E	#THAI CHARACTER PHO PHAN
0xBF	0x0E1F	#THAI CHARACTER FO FAN
0xC0	0x0E20	#THAI CHARACTER PHO SAMPHAO
0xC1	0x0E21	#THAI CHARACTER MO MA
0xC2	0x0E22	#THAI CHARACTER YO YAK
0xC3	0x0E23	#THAI CHARACTER RO RUA
0xC4	0x0E24	#THAI CHARACTER RU
0xC5	0x0E25	#THAI CHARACTER LO LING
0xC6	0x0E26	#THAI CHARACTER LU
0xC7	0x0E27	#THAI CHARACTER WO WAEN
0xC8	0x0E28	#THAI CHARACTER SO SALA
0xC9	0x0E29	#THAI CHARACTER SO RUSI
0xCA	0x0E2A	#THAI CHARACTER SO SUA
0xCB	0x0E2B	#THAI CHARACTER HO HIP
0xcc	0x0e2c	#THAI LETTER LO CHULA
0xcd	0x0e2d	#THAI LETTER O ANG
0xce	0x0e2e	#THAI LETTER HO NOK HUK
0xcf	0x0e2f	#THAI PAI YAN NOI
0xd0	0x0e30	#THAI VOWEL SIGN SARA A
0xd1	0x0e31	#THAI VOWEL SIGN MAI HAN-AKAT
0xd2	0x0e32	#THAI VOWEL SIGN SARA AA
0xd3	0x0e33	#THAI VOWEL SIGN SARA AM
0xd4	0x0e34	#THAI VOWEL SIGN SARA I
0xd5	0x0e35	#THAI VOWEL SIGN SARA II
0xd6	0x0e36	#THAI VOWEL SIGN SARA UE
0xd7	0x0e37	#THAI VOWEL SIGN SARA UEE
0xd8	0x0e38	#THAI VOWEL SIGN SARA U
0xd9	0x0e39	#THAI VOWEL SIGN SARA UU
0xda	0x0e3a	#THAI VOWEL SIGN PHINTHU
0xdb		#UNDEFINED
0xdc		#UNDEFINED
0xdd		#UNDEFINED
0xde		#UNDEFINED
0xdf	0x0e3f	#THAI BAHT SIGN
0xe0	0x0e40	#THAI VOWEL SIGN SARA E
0xe1	0x0e41	#THAI VOWEL SIGN SARA AE
0xe2	0x0e42	#THAI VOWEL SIGN SARA O
0xe3	0x0e43	#THAI VOWEL SIGN SARA MAI MUAN
0xe4	0x0e44	#THAI VOWEL SIGN SARA MAI MALAI
0xe5	0x0e45	#THAI LAK KHANG YAO
0xe6	0x0e46	#THAI MAI YAMOK
0xe7	0x0e47	#THAI VOWEL SIGN MAI TAI KHU
0xe8	0x0e48	#THAI TONE MAI EK
0xe9	0x0e49	#THAI TONE MAI THO
0xea	0x0e4a	#THAI TONE MAI TRI
0xeb	0x0e4b	#THAI TONE MAI CHATTAWA
0xec	0x0e4c	#THAI THANTHAKHAT
0xed	0x0e4d	#THAI NIKKHAHIT
0xee	0x0e4e	#THAI YAMAKKAN
0xef	0x0e4f	#THAI FONGMAN
0xf0	0x0e50	#THAI DIGIT 0
0xf1	0x0e51	#THAI DIGIT 1
0xf2	0x0e52	#THAI DIGIT 2
0xf3	0x0e53	#THAI DIGIT 3
0xf4	0x0e54	#THAI DIGIT 4
0xf5	0x0e55	#THAI DIGIT 5
0xf6	0x0e56	#THAI DIGIT 6
0xf7	0x0e57	#THAI DIGIT 7
0xf8	0x0e58	#THAI DIGIT 8
0xf9	0x0e59	#THAI DIGIT 9
0xfa	0x0e5a	#THAI ANGKHANKHU
0xfb	0x0e5b	#THAI KHOMUT
0xfc		#UNDEFINED
0xfd		#UNDEFINED
0xfe		#UNDEFINED
0xff		#UNDEFINED
0xCC	0x0E2C	#THAI CHARACTER LO CHULA
0xCD	0x0E2D	#THAI CHARACTER O ANG
0xCE	0x0E2E	#THAI CHARACTER HO NOKHUK
0xCF	0x0E2F	#THAI CHARACTER PAIYANNOI
0xD0	0x0E30	#THAI CHARACTER SARA A
0xD1	0x0E31	#THAI CHARACTER MAI HAN-AKAT
0xD2	0x0E32	#THAI CHARACTER SARA AA
0xD3	0x0E33	#THAI CHARACTER SARA AM
0xD4	0x0E34	#THAI CHARACTER SARA I
0xD5	0x0E35	#THAI CHARACTER SARA II
0xD6	0x0E36	#THAI CHARACTER SARA UE
0xD7	0x0E37	#THAI CHARACTER SARA UEE
0xD8	0x0E38	#THAI CHARACTER SARA U
0xD9	0x0E39	#THAI CHARACTER SARA UU
0xDA	0x0E3A	#THAI CHARACTER PHINTHU
0xDB	      	#UNDEFINED
0xDC	      	#UNDEFINED
0xDD	      	#UNDEFINED
0xDE	      	#UNDEFINED
0xDF	0x0E3F	#THAI CURRENCY SYMBOL BAHT
0xE0	0x0E40	#THAI CHARACTER SARA E
0xE1	0x0E41	#THAI CHARACTER SARA AE
0xE2	0x0E42	#THAI CHARACTER SARA O
0xE3	0x0E43	#THAI CHARACTER SARA AI MAIMUAN
0xE4	0x0E44	#THAI CHARACTER SARA AI MAIMALAI
0xE5	0x0E45	#THAI CHARACTER LAKKHANGYAO
0xE6	0x0E46	#THAI CHARACTER MAIYAMOK
0xE7	0x0E47	#THAI CHARACTER MAITAIKHU
0xE8	0x0E48	#THAI CHARACTER MAI EK
0xE9	0x0E49	#THAI CHARACTER MAI THO
0xEA	0x0E4A	#THAI CHARACTER MAI TRI
0xEB	0x0E4B	#THAI CHARACTER MAI CHATTAWA
0xEC	0x0E4C	#THAI CHARACTER THANTHAKHAT
0xED	0x0E4D	#THAI CHARACTER NIKHAHIT
0xEE	0x0E4E	#THAI CHARACTER YAMAKKAN
0xEF	0x0E4F	#THAI CHARACTER FONGMAN
0xF0	0x0E50	#THAI DIGIT ZERO
0xF1	0x0E51	#THAI DIGIT ONE
0xF2	0x0E52	#THAI DIGIT TWO
0xF3	0x0E53	#THAI DIGIT THREE
0xF4	0x0E54	#THAI DIGIT FOUR
0xF5	0x0E55	#THAI DIGIT FIVE
0xF6	0x0E56	#THAI DIGIT SIX
0xF7	0x0E57	#THAI DIGIT SEVEN
0xF8	0x0E58	#THAI DIGIT EIGHT
0xF9	0x0E59	#THAI DIGIT NINE
0xFA	0x0E5A	#THAI CHARACTER ANGKHANKHU
0xFB	0x0E5B	#THAI CHARACTER KHOMUT
0xFC	      	#UNDEFINED
0xFD	      	#UNDEFINED
0xFE	      	#UNDEFINED
0xFF	      	#UNDEFINED


Changes to tools/encoding/cp932.txt.

more than 10,000 changes

Changes to tools/encoding/cp936.txt.

more than 10,000 changes

Changes to tools/encoding/cp949.txt.

more than 10,000 changes

Changes to tools/encoding/cp950.txt.

more than 10,000 changes

Added tools/encoding/ebcdic.txt.

































































































































































































































































































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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#
#	Name:             EBCDIC (EDF04) to Unicode
#	Unicode version:  1.1
#	Table version:    0.1
#	Table format:     Format A
#	Date:             1 February 2000
#	Author:           Jan Nijtmans <j.nijtmans@chello.nl>
#
#	Copyright (c) 1999-2000 Jan Nijtmans.  All Rights reserved.
#
#	This file is provided as-is.
#	No claims are made as to fitness for any particular purpose.  No
#	warranties of any kind are expressed or implied.  The recipient
#	agrees to determine applicability of information provided.
#
#	Recipient is granted the right to make copies in any form for
#	redistribution and to freely use the information supplied
#	in the creation of products.
#
#	General notes:
#
#	Format:  Three tab-separated columns
#		 Column #1 is the EBCDIC code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in EBCDIC order
#
#	source: <file:ebcdic.c> from openssl distribution
#
#	Any comments or problems, contact <j.nijtmans@chello.nl>
#
0x00	0x0000	#	NUL
0x01	0x0001	#	SOH
0x02	0x0002	#	STX
0x03	0x0003	#	ETX
0x04	0x0085	#
0x05	0x0009	#	HT
0x06	0x0086	#
0x07	0x007F	#	DEL
0x08	0x0087	#
0x09	0x008D	#
0x0A	0x008E	#
0x0B	0x000B	#	VT
0x0C	0x000C	#	FF
0x0D	0x000D	#	CR
0x0E	0x000E	#	SO
0x0F	0x000F	#	SI
0x10	0x0010	#	DLE
0x11	0x0011	#	DC1
0x12	0x0012	#	DC2
0x13	0x0013	#	DC3
0x14	0x008F	#
0x15	0x000A	#	LF
0x16	0x0008	#	BS
0x17	0x0097	#
0x18	0x0018	#	CAN
0x19	0x0019	#	EM
0x1A	0x009C	#
0x1B	0x009D	#
0x1C	0x001C	#	IFS
0x1D	0x001D	#	IGS
0x1E	0x001E	#	IRS
0x1F	0x001F	#	IUS
0x20	0x0080	#
0x21	0x0081	#
0x22	0x0082	#
0x23	0x0083	#
0x24	0x0084	#
0x25	0x0092	#
0x26	0x0017	#	ETB
0x27	0x001B	#	ESC
0x28	0x0088	#
0x29	0x0089	#
0x2A	0x008A	#
0x2B	0x008B	#
0x2C	0x008C	#
0x2D	0x0005	#	ENQ
0x2E	0x0006	#	ACK
0x2F	0x0007	#	BEL
0x30	0x0090	#
0x31	0x0091	#
0x32	0x0016	#	SYN
0x33	0x0093	#
0x34	0x0094	#
0x35	0x0095	#
0x36	0x0096	#
0x37	0x0004	#	EOT
0x38	0x0098	#
0x39	0x0099	#
0x3A	0x009A	#
0x3B	0x009B	#
0x3C	0x0014	#	DC4
0x3D	0x0015	#	NAK
0x3E	0x009E	#
0x3F	0x001A	#	SUB
0x40	0x0020	#	SPACE
0x41	0x00A0	#
0x42	0x00E2	#
0x43	0x00E4	#
0x44	0x00E0	#
0x45	0x00E1	#
0x46	0x00E3	#
0x47	0x00E5	#
0x48	0x00E7	#
0x49	0x00F1	#
0x4A	0x0060	#	GRAVE ACCENT
0x4B	0x002E	#	FULL STOP
0x4C	0x003C	#	LESS-THAN SIGN
0x4D	0x0028	#	LEFT PARENTHESIS
0x4E	0x002B	#	PLUS SIGN
0x4F	0x007C	#	VERTICAL LINE
0x50	0x0026	#	AMPERSAND
0x51	0x00E9	#
0x52	0x00EA	#
0x53	0x00EB	#
0x54	0x00E8	#
0x55	0x00ED	#
0x56	0x00EE	#
0x57	0x00EF	#
0x58	0x00EC	#
0x59	0x00DF	#
0x5A	0x0021	#	EXCLAMATION MARK
0x5B	0x0024	#	DOLLAR SIGN
0x5C	0x002A	#	ASTERISK
0x5D	0x0029	#	RIGHT PARENTHESIS
0x5E	0x003B	#	SEMICOLON
0x5F	0x009F	#
0x60	0x002D	#	HYPHEN-MINUS
0x61	0x002F	#	SOLIDUS
0x62	0x00C2	#
0x63	0x00C4	#
0x64	0x00C0	#
0x65	0x00C1	#
0x66	0x00C3	#
0x67	0x00C5	#
0x68	0x00C7	#
0x69	0x00D1	#
0x6A	0x005E	#	CIRCUMFLEX ACCENT
0x6B	0x002C	#	COMMA
0x6C	0x0025	#	PERCENT SIGN
0x6D	0x005F	#	LOW LINE
0x6E	0x003E	#	GREATER-THAN SIGN
0x6F	0x003F	#	QUESTION MARK
0x70	0x00F8	#
0x71	0x00C9	#
0x72	0x00CA	#
0x73	0x00CB	#
0x74	0x00C8	#
0x75	0x00CD	#
0x76	0x00CE	#
0x77	0x00CF	#
0x78	0x00CC	#
0x79	0x00A8	#
0x7A	0x003A	#	COLON
0x7B	0x0023	#	NUMBER SIGN
0x7C	0x0040	#	COMMERCIAL AT
0x7D	0x0027	#	APOSTROPHE
0x7E	0x003D	#	EQUALS SIGN
0x7F	0x0022	#	QUOTATION MARK
0x80	0x00D8	#
0x81	0x0061	#	LATIN SMALL LETTER A
0x82	0x0062	#	LATIN SMALL LETTER B
0x83	0x0063	#	LATIN SMALL LETTER C
0x84	0x0064	#	LATIN SMALL LETTER D
0x85	0x0065	#	LATIN SMALL LETTER E
0x86	0x0066	#	LATIN SMALL LETTER F
0x87	0x0067	#	LATIN SMALL LETTER G
0x88	0x0068	#	LATIN SMALL LETTER H
0x89	0x0069	#	LATIN SMALL LETTER I
0x8A	0x00AB	#
0x8B	0x00BB	#
0x8C	0x00F0	#
0x8D	0x00FD	#
0x8E	0x00FE	#
0x8F	0x00B1	#
0x90	0x00B0	#
0x91	0x006A	#	LATIN SMALL LETTER J
0x92	0x006B	#	LATIN SMALL LETTER K
0x93	0x006C	#	LATIN SMALL LETTER L
0x94	0x006D	#	LATIN SMALL LETTER M
0x95	0x006E	#	LATIN SMALL LETTER N
0x96	0x006F	#	LATIN SMALL LETTER O
0x97	0x0070	#	LATIN SMALL LETTER P
0x98	0x0071	#	LATIN SMALL LETTER Q
0x99	0x0072	#	LATIN SMALL LETTER R
0x9A	0x00AA	#
0x9B	0x00BA	#
0x9C	0x00E6	#
0x9D	0x00B8	#
0x9E	0x00C6	#
0x9F	0x00A4	#
0xA0	0x00B5	#
0xA1	0x00AF	#
0xA2	0x0073	#	LATIN SMALL LETTER S
0xA3	0x0074	#	LATIN SMALL LETTER T
0xA4	0x0075	#	LATIN SMALL LETTER U
0xA5	0x0076	#	LATIN SMALL LETTER V
0xA6	0x0077	#	LATIN SMALL LETTER W
0xA7	0x0078	#	LATIN SMALL LETTER X
0xA8	0x0079	#	LATIN SMALL LETTER Y
0xA9	0x007A	#	LATIN SMALL LETTER Z
0xAA	0x00A1	#
0xAB	0x00BF	#
0xAC	0x00D0	#
0xAD	0x00DD	#
0xAE	0x00DE	#
0xAF	0x00AE	#
0xB0	0x00A2	#
0xB1	0x00A3	#
0xB2	0x00A5	#
0xB3	0x00B7	#
0xB4	0x00A9	#
0xB5	0x00A7	#
0xB6	0x00B6	#
0xB7	0x00BC	#
0xB8	0x00BD	#
0xB9	0x00BE	#
0xBA	0x00AC	#
0xBB	0x005B	#	LEFT SQUARE BRACKET
0xBC	0x005C	#	REVERSE SOLIDUS
0xBD	0x005D	#	RIGHT SQUARE BRACKET
0xBE	0x00B4	#
0xBF	0x00D7	#
0xC0	0x00F9	#
0xC1	0x0041	#	LATIN CAPITAL LETTER A
0xC2	0x0042	#	LATIN CAPITAL LETTER B
0xC3	0x0043	#	LATIN CAPITAL LETTER C
0xC4	0x0044	#	LATIN CAPITAL LETTER D
0xC5	0x0045	#	LATIN CAPITAL LETTER E
0xC6	0x0046	#	LATIN CAPITAL LETTER F
0xC7	0x0047	#	LATIN CAPITAL LETTER G
0xC8	0x0048	#	LATIN CAPITAL LETTER H
0xC9	0x0049	#	LATIN CAPITAL LETTER I
0xCA	0x00AD	#
0xCB	0x00F4	#
0xCC	0x00F6	#
0xCD	0x00F2	#
0xCE	0x00F3	#
0xCF	0x00F5	#
0xD0	0x00A6	#
0xD1	0x004A	#	LATIN CAPITAL LETTER J
0xD2	0x004B	#	LATIN CAPITAL LETTER K
0xD3	0x004C	#	LATIN CAPITAL LETTER L
0xD4	0x004D	#	LATIN CAPITAL LETTER M
0xD5	0x004E	#	LATIN CAPITAL LETTER N
0xD6	0x004F	#	LATIN CAPITAL LETTER O
0xD7	0x0050	#	LATIN CAPITAL LETTER P
0xD8	0x0051	#	LATIN CAPITAL LETTER Q
0xD9	0x0052	#	LATIN CAPITAL LETTER R
0xDA	0x00B9	#
0xDB	0x00FB	#
0xDC	0x00FC	#
0xDD	0x00DB	#
0xDE	0x00FA	#
0xDF	0x00FF	#
0xE0	0x00D9	#
0xE1	0x00F7	#
0xE2	0x0053	#	LATIN CAPITAL LETTER S
0xE3	0x0054	#	LATIN CAPITAL LETTER T
0xE4	0x0055	#	LATIN CAPITAL LETTER U
0xE5	0x0056	#	LATIN CAPITAL LETTER V
0xE6	0x0057	#	LATIN CAPITAL LETTER W
0xE7	0x0058	#	LATIN CAPITAL LETTER X
0xE8	0x0059	#	LATIN CAPITAL LETTER Y
0xE9	0x005A	#	LATIN CAPITAL LETTER Z
0xEA	0x00B2	#
0xEB	0x00D4	#
0xEC	0x00D6	#
0xED	0x00D2	#
0xEE	0x00D3	#
0xEF	0x00D5	#
0xF0	0x0030	#	DIGIT ZERO
0xF1	0x0031	#	DIGIT ONE
0xF2	0x0032	#	DIGIT TWO
0xF3	0x0033	#	DIGIT THREE
0xF4	0x0034	#	DIGIT FOUR
0xF5	0x0035	#	DIGIT FIVE
0xF6	0x0036	#	DIGIT SIX
0xF7	0x0037	#	DIGIT SEVEN
0xF8	0x0038	#	DIGIT EIGHT
0xF9	0x0039	#	DIGIT NINE
0xFA	0x00B3	#
0xFB	0x007B	#	LEFT CURLY BRACKET
0xFC	0x00DC	#
0xFD	0x007D	#	RIGHT CURLY BRACKET
0xFE	0x00DA	#
0xFF	0x007E	#	TILDE

Changes to tools/encoding/iso2022-jp.esc.
1
2
3
4
5
6
7


8
9
10
1
2
3
4
5


6
7
8
9
10





-
-
+
+



name		iso2022-jp
init		{}
final		{}
iso8859-1	\x1b(B
jis0201		\x1b(J
jis0208		\x1b$@
jis0208		\x1b$B
jis0208		\x1b$B
jis0208		\x1b$@
jis0212		\x1b$(D
gb2312		\x1b$A
ksc5601		\x1b$(C
Changes to tools/encoding/iso2022.esc.
1
2
3
4
5
6
7
8


9
10
11
12
13
14
1
2
3
4
5
6


7
8
9
10
11
12








-
-
+
+




-
-
name		iso2022
init		{}
final		{}
iso8859-1	\x1b(B
jis0201		\x1b(J
gb1988		\x1b(T
jis0208		\x1b$@
jis0208		\x1b$B
jis0208		\x1b$B
jis0208		\x1b$@
jis0212		\x1b$(D
gb2312		\x1b$A
ksc5601		\x1b$(C
jis0208		\x1b&@\x1b$B


Changes to tools/encoding/iso8859-1.txt.
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
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

-
-
-
+
+
+

-
-
+
+
-

-
+





-
+



-
-
-
-
-
+
+
+
+
+




-
+


-
+



-
+

+
+
+
+
+
+
+
-
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







#
#	Name:             ISO 8859-1 (1987) to Unicode
#	Unicode version:  1.1
#	Table version:    0.1
#	Name:             ISO/IEC 8859-1:1998 to Unicode
#	Unicode version:  3.0
#	Table version:    1.0
#	Table format:     Format A
#	Date:             16 January 1995
#	Authors:          Tim Greenwood <greenwood@r2me2.enet.dec.com>
#	Date:             1999 July 27
#	Authors:          Ken Whistler <kenw@sybase.com>
#                     John H. Jenkins <John_Jenkins@taligent.com>
#
#	Copyright (c) 1991-1995 Unicode, Inc.  All Rights reserved.
#	Copyright (c) 1991-1999 Unicode, Inc.  All Rights reserved.
#
#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
#	No claims are made as to fitness for any particular purpose.  No
#	warranties of any kind are expressed or implied.  The recipient
#	agrees to determine applicability of information provided.  If this
#	file has been provided on magnetic media by Unicode, Inc., the sole
#	file has been provided on optical media by Unicode, Inc., the sole
#	remedy for any claim will be exchange of defective media within 90
#	days of receipt.
#
#	Recipient is granted the right to make copies in any form for
#	internal distribution and to freely use the information supplied
#	in the creation of products supporting Unicode.  Unicode, Inc.
#	specifically excludes the right to re-distribute this file directly
#	to third parties or other organizations whether for profit or not.
#	Unicode, Inc. hereby grants the right to freely use the information
#	supplied in this file in the creation of products supporting the
#	Unicode Standard, and to make copies of this file in any form for
#	internal or external distribution as long as this notice remains
#	attached.
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       ISO 8859-1 (1987) characters map into Unicode.
#       ISO/IEC 8859-1:1998 characters map into Unicode.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the ISO 8859-1 code (in hex as 0xXX)
#		 Column #1 is the ISO/IEC 8859-1 code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in ISO 8859-1 order
#	The entries are in ISO/IEC 8859-1 order.
#
#	Version history
#	1.0 version updates 0.1 version by adding mappings for all
#	control characters.
#
#	Updated versions of this file may be found in:
#		<ftp://ftp.unicode.org/Public/MAPPINGS/>
#
#	Any comments or problems, contact <John_Jenkins@taligent.com>
#	Any comments or problems, contact <errata@unicode.org>
#	Please note that <errata@unicode.org> is an archival address;
#	notices will be checked, but do not expect an immediate response.
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
128
129
130
131
132
133
134

































135
136
137
138
139
140
141
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x0080	#	<control>
0x81	0x0081	#	<control>
0x82	0x0082	#	<control>
0x83	0x0083	#	<control>
0x84	0x0084	#	<control>
0x85	0x0085	#	<control>
0x86	0x0086	#	<control>
0x87	0x0087	#	<control>
0x88	0x0088	#	<control>
0x89	0x0089	#	<control>
0x8A	0x008A	#	<control>
0x8B	0x008B	#	<control>
0x8C	0x008C	#	<control>
0x8D	0x008D	#	<control>
0x8E	0x008E	#	<control>
0x8F	0x008F	#	<control>
0x90	0x0090	#	<control>
0x91	0x0091	#	<control>
0x92	0x0092	#	<control>
0x93	0x0093	#	<control>
0x94	0x0094	#	<control>
0x95	0x0095	#	<control>
0x96	0x0096	#	<control>
0x97	0x0097	#	<control>
0x98	0x0098	#	<control>
0x99	0x0099	#	<control>
0x9A	0x009A	#	<control>
0x9B	0x009B	#	<control>
0x9C	0x009C	#	<control>
0x9D	0x009D	#	<control>
0x9E	0x009E	#	<control>
0x9F	0x009F	#	<control>
0xA0	0x00A0	#	NO-BREAK SPACE
0xA1	0x00A1	#	INVERTED EXCLAMATION MARK
0xA2	0x00A2	#	CENT SIGN
0xA3	0x00A3	#	POUND SIGN
0xA4	0x00A4	#	CURRENCY SIGN
0xA5	0x00A5	#	YEN SIGN
0xA6	0x00A6	#	BROKEN BAR
Added tools/encoding/iso8859-10.txt.















































































































































































































































































































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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#
#	Name:             ISO/IEC 8859-10:1998 to Unicode
#	Unicode version:  3.0
#	Table version:    1.1
#	Table format:     Format A
#	Date:             1999 October 11
#	Authors:          Ken Whistler <kenw@sybase.com>
#
#	Copyright (c) 1999 Unicode, Inc.  All Rights reserved.
#
#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
#	No claims are made as to fitness for any particular purpose.  No
#	warranties of any kind are expressed or implied.  The recipient
#	agrees to determine applicability of information provided.  If this
#	file has been provided on optical media by Unicode, Inc., the sole
#	remedy for any claim will be exchange of defective media within 90
#	days of receipt.
#
#	Unicode, Inc. hereby grants the right to freely use the information
#	supplied in this file in the creation of products supporting the
#	Unicode Standard, and to make copies of this file in any form for
#	internal or external distribution as long as this notice remains
#	attached.
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       ISO/IEC 8859-10:1998 characters map into Unicode.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the ISO/IEC 8859-10 code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in ISO/IEC 8859-10 order.
#
#	Version history
#	1.0 version new.
#       1.1 corrected mistake in mapping of 0xA4
#
#	Updated versions of this file may be found in:
#		<ftp://ftp.unicode.org/Public/MAPPINGS/>
#
#	Any comments or problems, contact <errata@unicode.org>
#	Please note that <errata@unicode.org> is an archival address;
#	notices will be checked, but do not expect an immediate response.
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
0x27	0x0027	#	APOSTROPHE
0x28	0x0028	#	LEFT PARENTHESIS
0x29	0x0029	#	RIGHT PARENTHESIS
0x2A	0x002A	#	ASTERISK
0x2B	0x002B	#	PLUS SIGN
0x2C	0x002C	#	COMMA
0x2D	0x002D	#	HYPHEN-MINUS
0x2E	0x002E	#	FULL STOP
0x2F	0x002F	#	SOLIDUS
0x30	0x0030	#	DIGIT ZERO
0x31	0x0031	#	DIGIT ONE
0x32	0x0032	#	DIGIT TWO
0x33	0x0033	#	DIGIT THREE
0x34	0x0034	#	DIGIT FOUR
0x35	0x0035	#	DIGIT FIVE
0x36	0x0036	#	DIGIT SIX
0x37	0x0037	#	DIGIT SEVEN
0x38	0x0038	#	DIGIT EIGHT
0x39	0x0039	#	DIGIT NINE
0x3A	0x003A	#	COLON
0x3B	0x003B	#	SEMICOLON
0x3C	0x003C	#	LESS-THAN SIGN
0x3D	0x003D	#	EQUALS SIGN
0x3E	0x003E	#	GREATER-THAN SIGN
0x3F	0x003F	#	QUESTION MARK
0x40	0x0040	#	COMMERCIAL AT
0x41	0x0041	#	LATIN CAPITAL LETTER A
0x42	0x0042	#	LATIN CAPITAL LETTER B
0x43	0x0043	#	LATIN CAPITAL LETTER C
0x44	0x0044	#	LATIN CAPITAL LETTER D
0x45	0x0045	#	LATIN CAPITAL LETTER E
0x46	0x0046	#	LATIN CAPITAL LETTER F
0x47	0x0047	#	LATIN CAPITAL LETTER G
0x48	0x0048	#	LATIN CAPITAL LETTER H
0x49	0x0049	#	LATIN CAPITAL LETTER I
0x4A	0x004A	#	LATIN CAPITAL LETTER J
0x4B	0x004B	#	LATIN CAPITAL LETTER K
0x4C	0x004C	#	LATIN CAPITAL LETTER L
0x4D	0x004D	#	LATIN CAPITAL LETTER M
0x4E	0x004E	#	LATIN CAPITAL LETTER N
0x4F	0x004F	#	LATIN CAPITAL LETTER O
0x50	0x0050	#	LATIN CAPITAL LETTER P
0x51	0x0051	#	LATIN CAPITAL LETTER Q
0x52	0x0052	#	LATIN CAPITAL LETTER R
0x53	0x0053	#	LATIN CAPITAL LETTER S
0x54	0x0054	#	LATIN CAPITAL LETTER T
0x55	0x0055	#	LATIN CAPITAL LETTER U
0x56	0x0056	#	LATIN CAPITAL LETTER V
0x57	0x0057	#	LATIN CAPITAL LETTER W
0x58	0x0058	#	LATIN CAPITAL LETTER X
0x59	0x0059	#	LATIN CAPITAL LETTER Y
0x5A	0x005A	#	LATIN CAPITAL LETTER Z
0x5B	0x005B	#	LEFT SQUARE BRACKET
0x5C	0x005C	#	REVERSE SOLIDUS
0x5D	0x005D	#	RIGHT SQUARE BRACKET
0x5E	0x005E	#	CIRCUMFLEX ACCENT
0x5F	0x005F	#	LOW LINE
0x60	0x0060	#	GRAVE ACCENT
0x61	0x0061	#	LATIN SMALL LETTER A
0x62	0x0062	#	LATIN SMALL LETTER B
0x63	0x0063	#	LATIN SMALL LETTER C
0x64	0x0064	#	LATIN SMALL LETTER D
0x65	0x0065	#	LATIN SMALL LETTER E
0x66	0x0066	#	LATIN SMALL LETTER F
0x67	0x0067	#	LATIN SMALL LETTER G
0x68	0x0068	#	LATIN SMALL LETTER H
0x69	0x0069	#	LATIN SMALL LETTER I
0x6A	0x006A	#	LATIN SMALL LETTER J
0x6B	0x006B	#	LATIN SMALL LETTER K
0x6C	0x006C	#	LATIN SMALL LETTER L
0x6D	0x006D	#	LATIN SMALL LETTER M
0x6E	0x006E	#	LATIN SMALL LETTER N
0x6F	0x006F	#	LATIN SMALL LETTER O
0x70	0x0070	#	LATIN SMALL LETTER P
0x71	0x0071	#	LATIN SMALL LETTER Q
0x72	0x0072	#	LATIN SMALL LETTER R
0x73	0x0073	#	LATIN SMALL LETTER S
0x74	0x0074	#	LATIN SMALL LETTER T
0x75	0x0075	#	LATIN SMALL LETTER U
0x76	0x0076	#	LATIN SMALL LETTER V
0x77	0x0077	#	LATIN SMALL LETTER W
0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x0080	#	<control>
0x81	0x0081	#	<control>
0x82	0x0082	#	<control>
0x83	0x0083	#	<control>
0x84	0x0084	#	<control>
0x85	0x0085	#	<control>
0x86	0x0086	#	<control>
0x87	0x0087	#	<control>
0x88	0x0088	#	<control>
0x89	0x0089	#	<control>
0x8A	0x008A	#	<control>
0x8B	0x008B	#	<control>
0x8C	0x008C	#	<control>
0x8D	0x008D	#	<control>
0x8E	0x008E	#	<control>
0x8F	0x008F	#	<control>
0x90	0x0090	#	<control>
0x91	0x0091	#	<control>
0x92	0x0092	#	<control>
0x93	0x0093	#	<control>
0x94	0x0094	#	<control>
0x95	0x0095	#	<control>
0x96	0x0096	#	<control>
0x97	0x0097	#	<control>
0x98	0x0098	#	<control>
0x99	0x0099	#	<control>
0x9A	0x009A	#	<control>
0x9B	0x009B	#	<control>
0x9C	0x009C	#	<control>
0x9D	0x009D	#	<control>
0x9E	0x009E	#	<control>
0x9F	0x009F	#	<control>
0xA0	0x00A0	#	NO-BREAK SPACE
0xA1	0x0104	#	LATIN CAPITAL LETTER A WITH OGONEK
0xA2	0x0112	#	LATIN CAPITAL LETTER E WITH MACRON
0xA3	0x0122	#	LATIN CAPITAL LETTER G WITH CEDILLA
0xA4	0x012A	#	LATIN CAPITAL LETTER I WITH MACRON
0xA5	0x0128	#	LATIN CAPITAL LETTER I WITH TILDE
0xA6	0x0136	#	LATIN CAPITAL LETTER K WITH CEDILLA
0xA7	0x00A7	#	SECTION SIGN
0xA8	0x013B	#	LATIN CAPITAL LETTER L WITH CEDILLA
0xA9	0x0110	#	LATIN CAPITAL LETTER D WITH STROKE
0xAA	0x0160	#	LATIN CAPITAL LETTER S WITH CARON
0xAB	0x0166	#	LATIN CAPITAL LETTER T WITH STROKE
0xAC	0x017D	#	LATIN CAPITAL LETTER Z WITH CARON
0xAD	0x00AD	#	SOFT HYPHEN
0xAE	0x016A	#	LATIN CAPITAL LETTER U WITH MACRON
0xAF	0x014A	#	LATIN CAPITAL LETTER ENG
0xB0	0x00B0	#	DEGREE SIGN
0xB1	0x0105	#	LATIN SMALL LETTER A WITH OGONEK
0xB2	0x0113	#	LATIN SMALL LETTER E WITH MACRON
0xB3	0x0123	#	LATIN SMALL LETTER G WITH CEDILLA
0xB4	0x012B	#	LATIN SMALL LETTER I WITH MACRON
0xB5	0x0129	#	LATIN SMALL LETTER I WITH TILDE
0xB6	0x0137	#	LATIN SMALL LETTER K WITH CEDILLA
0xB7	0x00B7	#	MIDDLE DOT
0xB8	0x013C	#	LATIN SMALL LETTER L WITH CEDILLA
0xB9	0x0111	#	LATIN SMALL LETTER D WITH STROKE
0xBA	0x0161	#	LATIN SMALL LETTER S WITH CARON
0xBB	0x0167	#	LATIN SMALL LETTER T WITH STROKE
0xBC	0x017E	#	LATIN SMALL LETTER Z WITH CARON
0xBD	0x2015	#	HORIZONTAL BAR
0xBE	0x016B	#	LATIN SMALL LETTER U WITH MACRON
0xBF	0x014B	#	LATIN SMALL LETTER ENG
0xC0	0x0100	#	LATIN CAPITAL LETTER A WITH MACRON
0xC1	0x00C1	#	LATIN CAPITAL LETTER A WITH ACUTE
0xC2	0x00C2	#	LATIN CAPITAL LETTER A WITH CIRCUMFLEX
0xC3	0x00C3	#	LATIN CAPITAL LETTER A WITH TILDE
0xC4	0x00C4	#	LATIN CAPITAL LETTER A WITH DIAERESIS
0xC5	0x00C5	#	LATIN CAPITAL LETTER A WITH RING ABOVE
0xC6	0x00C6	#	LATIN CAPITAL LETTER AE
0xC7	0x012E	#	LATIN CAPITAL LETTER I WITH OGONEK
0xC8	0x010C	#	LATIN CAPITAL LETTER C WITH CARON
0xC9	0x00C9	#	LATIN CAPITAL LETTER E WITH ACUTE
0xCA	0x0118	#	LATIN CAPITAL LETTER E WITH OGONEK
0xCB	0x00CB	#	LATIN CAPITAL LETTER E WITH DIAERESIS
0xCC	0x0116	#	LATIN CAPITAL LETTER E WITH DOT ABOVE
0xCD	0x00CD	#	LATIN CAPITAL LETTER I WITH ACUTE
0xCE	0x00CE	#	LATIN CAPITAL LETTER I WITH CIRCUMFLEX
0xCF	0x00CF	#	LATIN CAPITAL LETTER I WITH DIAERESIS
0xD0	0x00D0	#	LATIN CAPITAL LETTER ETH (Icelandic)
0xD1	0x0145	#	LATIN CAPITAL LETTER N WITH CEDILLA
0xD2	0x014C	#	LATIN CAPITAL LETTER O WITH MACRON
0xD3	0x00D3	#	LATIN CAPITAL LETTER O WITH ACUTE
0xD4	0x00D4	#	LATIN CAPITAL LETTER O WITH CIRCUMFLEX
0xD5	0x00D5	#	LATIN CAPITAL LETTER O WITH TILDE
0xD6	0x00D6	#	LATIN CAPITAL LETTER O WITH DIAERESIS
0xD7	0x0168	#	LATIN CAPITAL LETTER U WITH TILDE
0xD8	0x00D8	#	LATIN CAPITAL LETTER O WITH STROKE
0xD9	0x0172	#	LATIN CAPITAL LETTER U WITH OGONEK
0xDA	0x00DA	#	LATIN CAPITAL LETTER U WITH ACUTE
0xDB	0x00DB	#	LATIN CAPITAL LETTER U WITH CIRCUMFLEX
0xDC	0x00DC	#	LATIN CAPITAL LETTER U WITH DIAERESIS
0xDD	0x00DD	#	LATIN CAPITAL LETTER Y WITH ACUTE
0xDE	0x00DE	#	LATIN CAPITAL LETTER THORN (Icelandic)
0xDF	0x00DF	#	LATIN SMALL LETTER SHARP S (German)
0xE0	0x0101	#	LATIN SMALL LETTER A WITH MACRON
0xE1	0x00E1	#	LATIN SMALL LETTER A WITH ACUTE
0xE2	0x00E2	#	LATIN SMALL LETTER A WITH CIRCUMFLEX
0xE3	0x00E3	#	LATIN SMALL LETTER A WITH TILDE
0xE4	0x00E4	#	LATIN SMALL LETTER A WITH DIAERESIS
0xE5	0x00E5	#	LATIN SMALL LETTER A WITH RING ABOVE
0xE6	0x00E6	#	LATIN SMALL LETTER AE
0xE7	0x012F	#	LATIN SMALL LETTER I WITH OGONEK
0xE8	0x010D	#	LATIN SMALL LETTER C WITH CARON
0xE9	0x00E9	#	LATIN SMALL LETTER E WITH ACUTE
0xEA	0x0119	#	LATIN SMALL LETTER E WITH OGONEK
0xEB	0x00EB	#	LATIN SMALL LETTER E WITH DIAERESIS
0xEC	0x0117	#	LATIN SMALL LETTER E WITH DOT ABOVE
0xED	0x00ED	#	LATIN SMALL LETTER I WITH ACUTE
0xEE	0x00EE	#	LATIN SMALL LETTER I WITH CIRCUMFLEX
0xEF	0x00EF	#	LATIN SMALL LETTER I WITH DIAERESIS
0xF0	0x00F0	#	LATIN SMALL LETTER ETH (Icelandic)
0xF1	0x0146	#	LATIN SMALL LETTER N WITH CEDILLA
0xF2	0x014D	#	LATIN SMALL LETTER O WITH MACRON
0xF3	0x00F3	#	LATIN SMALL LETTER O WITH ACUTE
0xF4	0x00F4	#	LATIN SMALL LETTER O WITH CIRCUMFLEX
0xF5	0x00F5	#	LATIN SMALL LETTER O WITH TILDE
0xF6	0x00F6	#	LATIN SMALL LETTER O WITH DIAERESIS
0xF7	0x0169	#	LATIN SMALL LETTER U WITH TILDE
0xF8	0x00F8	#	LATIN SMALL LETTER O WITH STROKE
0xF9	0x0173	#	LATIN SMALL LETTER U WITH OGONEK
0xFA	0x00FA	#	LATIN SMALL LETTER U WITH ACUTE
0xFB	0x00FB	#	LATIN SMALL LETTER U WITH CIRCUMFLEX
0xFC	0x00FC	#	LATIN SMALL LETTER U WITH DIAERESIS
0xFD	0x00FD	#	LATIN SMALL LETTER Y WITH ACUTE
0xFE	0x00FE	#	LATIN SMALL LETTER THORN (Icelandic)
0xFF	0x0138	#	LATIN SMALL LETTER KRA
Added tools/encoding/iso8859-13.txt.











































































































































































































































































































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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#
#	Name:             ISO/IEC 8859-13:1998  to Unicode
#	Unicode version:  3.0
#	Table version:    1.0
#	Table format:     Format A
#	Date:             1999 July 27
#	Authors:          Ken Whistler <kenw@sybase.com>
#
#	Copyright (c) 1998 - 1999 Unicode, Inc.  All Rights reserved.
#
#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
#	No claims are made as to fitness for any particular purpose.  No
#	warranties of any kind are expressed or implied.  The recipient
#	agrees to determine applicability of information provided.  If this
#	file has been provided on optical media by Unicode, Inc., the sole
#	remedy for any claim will be exchange of defective media within 90
#	days of receipt.
#
#	Unicode, Inc. hereby grants the right to freely use the information
#	supplied in this file in the creation of products supporting the
#	Unicode Standard, and to make copies of this file in any form for
#	internal or external distribution as long as this notice remains
#	attached.
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       ISO/IEC 8859-13:1998 characters map into Unicode.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the ISO/IEC 8859-13 code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in ISO/IEC 8859-13 order.
#
#	Updated versions of this file may be found in:
#		<ftp://ftp.unicode.org/Public/MAPPINGS/>
#
#	Any comments or problems, contact <errata@unicode.org>
#	Please note that <errata@unicode.org> is an archival address;
#	notices will be checked, but do not expect an immediate response.
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
0x27	0x0027	#	APOSTROPHE
0x28	0x0028	#	LEFT PARENTHESIS
0x29	0x0029	#	RIGHT PARENTHESIS
0x2A	0x002A	#	ASTERISK
0x2B	0x002B	#	PLUS SIGN
0x2C	0x002C	#	COMMA
0x2D	0x002D	#	HYPHEN-MINUS
0x2E	0x002E	#	FULL STOP
0x2F	0x002F	#	SOLIDUS
0x30	0x0030	#	DIGIT ZERO
0x31	0x0031	#	DIGIT ONE
0x32	0x0032	#	DIGIT TWO
0x33	0x0033	#	DIGIT THREE
0x34	0x0034	#	DIGIT FOUR
0x35	0x0035	#	DIGIT FIVE
0x36	0x0036	#	DIGIT SIX
0x37	0x0037	#	DIGIT SEVEN
0x38	0x0038	#	DIGIT EIGHT
0x39	0x0039	#	DIGIT NINE
0x3A	0x003A	#	COLON
0x3B	0x003B	#	SEMICOLON
0x3C	0x003C	#	LESS-THAN SIGN
0x3D	0x003D	#	EQUALS SIGN
0x3E	0x003E	#	GREATER-THAN SIGN
0x3F	0x003F	#	QUESTION MARK
0x40	0x0040	#	COMMERCIAL AT
0x41	0x0041	#	LATIN CAPITAL LETTER A
0x42	0x0042	#	LATIN CAPITAL LETTER B
0x43	0x0043	#	LATIN CAPITAL LETTER C
0x44	0x0044	#	LATIN CAPITAL LETTER D
0x45	0x0045	#	LATIN CAPITAL LETTER E
0x46	0x0046	#	LATIN CAPITAL LETTER F
0x47	0x0047	#	LATIN CAPITAL LETTER G
0x48	0x0048	#	LATIN CAPITAL LETTER H
0x49	0x0049	#	LATIN CAPITAL LETTER I
0x4A	0x004A	#	LATIN CAPITAL LETTER J
0x4B	0x004B	#	LATIN CAPITAL LETTER K
0x4C	0x004C	#	LATIN CAPITAL LETTER L
0x4D	0x004D	#	LATIN CAPITAL LETTER M
0x4E	0x004E	#	LATIN CAPITAL LETTER N
0x4F	0x004F	#	LATIN CAPITAL LETTER O
0x50	0x0050	#	LATIN CAPITAL LETTER P
0x51	0x0051	#	LATIN CAPITAL LETTER Q
0x52	0x0052	#	LATIN CAPITAL LETTER R
0x53	0x0053	#	LATIN CAPITAL LETTER S
0x54	0x0054	#	LATIN CAPITAL LETTER T
0x55	0x0055	#	LATIN CAPITAL LETTER U
0x56	0x0056	#	LATIN CAPITAL LETTER V
0x57	0x0057	#	LATIN CAPITAL LETTER W
0x58	0x0058	#	LATIN CAPITAL LETTER X
0x59	0x0059	#	LATIN CAPITAL LETTER Y
0x5A	0x005A	#	LATIN CAPITAL LETTER Z
0x5B	0x005B	#	LEFT SQUARE BRACKET
0x5C	0x005C	#	REVERSE SOLIDUS
0x5D	0x005D	#	RIGHT SQUARE BRACKET
0x5E	0x005E	#	CIRCUMFLEX ACCENT
0x5F	0x005F	#	LOW LINE
0x60	0x0060	#	GRAVE ACCENT
0x61	0x0061	#	LATIN SMALL LETTER A
0x62	0x0062	#	LATIN SMALL LETTER B
0x63	0x0063	#	LATIN SMALL LETTER C
0x64	0x0064	#	LATIN SMALL LETTER D
0x65	0x0065	#	LATIN SMALL LETTER E
0x66	0x0066	#	LATIN SMALL LETTER F
0x67	0x0067	#	LATIN SMALL LETTER G
0x68	0x0068	#	LATIN SMALL LETTER H
0x69	0x0069	#	LATIN SMALL LETTER I
0x6A	0x006A	#	LATIN SMALL LETTER J
0x6B	0x006B	#	LATIN SMALL LETTER K
0x6C	0x006C	#	LATIN SMALL LETTER L
0x6D	0x006D	#	LATIN SMALL LETTER M
0x6E	0x006E	#	LATIN SMALL LETTER N
0x6F	0x006F	#	LATIN SMALL LETTER O
0x70	0x0070	#	LATIN SMALL LETTER P
0x71	0x0071	#	LATIN SMALL LETTER Q
0x72	0x0072	#	LATIN SMALL LETTER R
0x73	0x0073	#	LATIN SMALL LETTER S
0x74	0x0074	#	LATIN SMALL LETTER T
0x75	0x0075	#	LATIN SMALL LETTER U
0x76	0x0076	#	LATIN SMALL LETTER V
0x77	0x0077	#	LATIN SMALL LETTER W
0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x0080	#	<control>
0x81	0x0081	#	<control>
0x82	0x0082	#	<control>
0x83	0x0083	#	<control>
0x84	0x0084	#	<control>
0x85	0x0085	#	<control>
0x86	0x0086	#	<control>
0x87	0x0087	#	<control>
0x88	0x0088	#	<control>
0x89	0x0089	#	<control>
0x8A	0x008A	#	<control>
0x8B	0x008B	#	<control>
0x8C	0x008C	#	<control>
0x8D	0x008D	#	<control>
0x8E	0x008E	#	<control>
0x8F	0x008F	#	<control>
0x90	0x0090	#	<control>
0x91	0x0091	#	<control>
0x92	0x0092	#	<control>
0x93	0x0093	#	<control>
0x94	0x0094	#	<control>
0x95	0x0095	#	<control>
0x96	0x0096	#	<control>
0x97	0x0097	#	<control>
0x98	0x0098	#	<control>
0x99	0x0099	#	<control>
0x9A	0x009A	#	<control>
0x9B	0x009B	#	<control>
0x9C	0x009C	#	<control>
0x9D	0x009D	#	<control>
0x9E	0x009E	#	<control>
0x9F	0x009F	#	<control>
0xA0	0x00A0	#	NO-BREAK SPACE
0xA1	0x201D	#	RIGHT DOUBLE QUOTATION MARK
0xA2	0x00A2	#	CENT SIGN
0xA3	0x00A3	#	POUND SIGN
0xA4	0x00A4	#	CURRENCY SIGN
0xA5	0x201E	#	DOUBLE LOW-9 QUOTATION MARK
0xA6	0x00A6	#	BROKEN BAR
0xA7	0x00A7	#	SECTION SIGN
0xA8	0x00D8	#	LATIN CAPITAL LETTER O WITH STROKE
0xA9	0x00A9	#	COPYRIGHT SIGN
0xAA	0x0156	#	LATIN CAPITAL LETTER R WITH CEDILLA
0xAB	0x00AB	#	LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xAC	0x00AC	#	NOT SIGN
0xAD	0x00AD	#	SOFT HYPHEN
0xAE	0x00AE	#	REGISTERED SIGN
0xAF	0x00C6	#	LATIN CAPITAL LETTER AE
0xB0	0x00B0	#	DEGREE SIGN
0xB1	0x00B1	#	PLUS-MINUS SIGN
0xB2	0x00B2	#	SUPERSCRIPT TWO
0xB3	0x00B3	#	SUPERSCRIPT THREE
0xB4	0x201C	#	LEFT DOUBLE QUOTATION MARK
0xB5	0x00B5	#	MICRO SIGN
0xB6	0x00B6	#	PILCROW SIGN
0xB7	0x00B7	#	MIDDLE DOT
0xB8	0x00F8	#	LATIN SMALL LETTER O WITH STROKE
0xB9	0x00B9	#	SUPERSCRIPT ONE
0xBA	0x0157	#	LATIN SMALL LETTER R WITH CEDILLA
0xBB	0x00BB	#	RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xBC	0x00BC	#	VULGAR FRACTION ONE QUARTER
0xBD	0x00BD	#	VULGAR FRACTION ONE HALF
0xBE	0x00BE	#	VULGAR FRACTION THREE QUARTERS
0xBF	0x00E6	#	LATIN SMALL LETTER AE
0xC0	0x0104	#	LATIN CAPITAL LETTER A WITH OGONEK
0xC1	0x012E	#	LATIN CAPITAL LETTER I WITH OGONEK
0xC2	0x0100	#	LATIN CAPITAL LETTER A WITH MACRON
0xC3	0x0106	#	LATIN CAPITAL LETTER C WITH ACUTE
0xC4	0x00C4	#	LATIN CAPITAL LETTER A WITH DIAERESIS
0xC5	0x00C5	#	LATIN CAPITAL LETTER A WITH RING ABOVE
0xC6	0x0118	#	LATIN CAPITAL LETTER E WITH OGONEK
0xC7	0x0112	#	LATIN CAPITAL LETTER E WITH MACRON
0xC8	0x010C	#	LATIN CAPITAL LETTER C WITH CARON
0xC9	0x00C9	#	LATIN CAPITAL LETTER E WITH ACUTE
0xCA	0x0179	#	LATIN CAPITAL LETTER Z WITH ACUTE
0xCB	0x0116	#	LATIN CAPITAL LETTER E WITH DOT ABOVE
0xCC	0x0122	#	LATIN CAPITAL LETTER G WITH CEDILLA
0xCD	0x0136	#	LATIN CAPITAL LETTER K WITH CEDILLA
0xCE	0x012A	#	LATIN CAPITAL LETTER I WITH MACRON
0xCF	0x013B	#	LATIN CAPITAL LETTER L WITH CEDILLA
0xD0	0x0160	#	LATIN CAPITAL LETTER S WITH CARON
0xD1	0x0143	#	LATIN CAPITAL LETTER N WITH ACUTE
0xD2	0x0145	#	LATIN CAPITAL LETTER N WITH CEDILLA
0xD3	0x00D3	#	LATIN CAPITAL LETTER O WITH ACUTE
0xD4	0x014C	#	LATIN CAPITAL LETTER O WITH MACRON
0xD5	0x00D5	#	LATIN CAPITAL LETTER O WITH TILDE
0xD6	0x00D6	#	LATIN CAPITAL LETTER O WITH DIAERESIS
0xD7	0x00D7	#	MULTIPLICATION SIGN
0xD8	0x0172	#	LATIN CAPITAL LETTER U WITH OGONEK
0xD9	0x0141	#	LATIN CAPITAL LETTER L WITH STROKE
0xDA	0x015A	#	LATIN CAPITAL LETTER S WITH ACUTE
0xDB	0x016A	#	LATIN CAPITAL LETTER U WITH MACRON
0xDC	0x00DC	#	LATIN CAPITAL LETTER U WITH DIAERESIS
0xDD	0x017B	#	LATIN CAPITAL LETTER Z WITH DOT ABOVE
0xDE	0x017D	#	LATIN CAPITAL LETTER Z WITH CARON
0xDF	0x00DF	#	LATIN SMALL LETTER SHARP S (German)
0xE0	0x0105	#	LATIN SMALL LETTER A WITH OGONEK
0xE1	0x012F	#	LATIN SMALL LETTER I WITH OGONEK
0xE2	0x0101	#	LATIN SMALL LETTER A WITH MACRON
0xE3	0x0107	#	LATIN SMALL LETTER C WITH ACUTE
0xE4	0x00E4	#	LATIN SMALL LETTER A WITH DIAERESIS
0xE5	0x00E5	#	LATIN SMALL LETTER A WITH RING ABOVE
0xE6	0x0119	#	LATIN SMALL LETTER E WITH OGONEK
0xE7	0x0113	#	LATIN SMALL LETTER E WITH MACRON
0xE8	0x010D	#	LATIN SMALL LETTER C WITH CARON
0xE9	0x00E9	#	LATIN SMALL LETTER E WITH ACUTE
0xEA	0x017A	#	LATIN SMALL LETTER Z WITH ACUTE
0xEB	0x0117	#	LATIN SMALL LETTER E WITH DOT ABOVE
0xEC	0x0123	#	LATIN SMALL LETTER G WITH CEDILLA
0xED	0x0137	#	LATIN SMALL LETTER K WITH CEDILLA
0xEE	0x012B	#	LATIN SMALL LETTER I WITH MACRON
0xEF	0x013C	#	LATIN SMALL LETTER L WITH CEDILLA
0xF0	0x0161	#	LATIN SMALL LETTER S WITH CARON
0xF1	0x0144	#	LATIN SMALL LETTER N WITH ACUTE
0xF2	0x0146	#	LATIN SMALL LETTER N WITH CEDILLA
0xF3	0x00F3	#	LATIN SMALL LETTER O WITH ACUTE
0xF4	0x014D	#	LATIN SMALL LETTER O WITH MACRON
0xF5	0x00F5	#	LATIN SMALL LETTER O WITH TILDE
0xF6	0x00F6	#	LATIN SMALL LETTER O WITH DIAERESIS
0xF7	0x00F7	#	DIVISION SIGN
0xF8	0x0173	#	LATIN SMALL LETTER U WITH OGONEK
0xF9	0x0142	#	LATIN SMALL LETTER L WITH STROKE
0xFA	0x015B	#	LATIN SMALL LETTER S WITH ACUTE
0xFB	0x016B	#	LATIN SMALL LETTER U WITH MACRON
0xFC	0x00FC	#	LATIN SMALL LETTER U WITH DIAERESIS
0xFD	0x017C	#	LATIN SMALL LETTER Z WITH DOT ABOVE
0xFE	0x017E	#	LATIN SMALL LETTER Z WITH CARON
0xFF	0x2019	#	RIGHT SINGLE QUOTATION MARK
Added tools/encoding/iso8859-14.txt.













































































































































































































































































































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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#
#	Name:             ISO/IEC 8859-14:1998 to Unicode
#	Unicode version:  3.0
#	Table version:    1.0
#	Table format:     Format A
#	Date:             1999 July 27
#	Authors:          Markus Kuhn <mkuhn@acm.org>
#			  Ken Whistler <kenw@sybase.com>
#
#	Copyright (c) 1998 - 1999 Unicode, Inc.  All Rights reserved.
#
#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
#	No claims are made as to fitness for any particular purpose.  No
#	warranties of any kind are expressed or implied.  The recipient
#	agrees to determine applicability of information provided.  If this
#	file has been provided on optical media by Unicode, Inc., the sole
#	remedy for any claim will be exchange of defective media within 90
#	days of receipt.
#
#	Unicode, Inc. hereby grants the right to freely use the information
#	supplied in this file in the creation of products supporting the
#	Unicode Standard, and to make copies of this file in any form for
#	internal or external distribution as long as this notice remains
#	attached.
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       ISO/IEC 8859-14:1998 characters map into Unicode.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the ISO/IEC 8859-14 code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in ISO/IEC 8859-14 order.
#
#	Updated versions of this file may be found in:
#		<ftp://ftp.unicode.org/Public/MAPPINGS/>
#
#	Any comments or problems, contact <errata@unicode.org>
#	Please note that <errata@unicode.org> is an archival address;
#	notices will be checked, but do not expect an immediate response.
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
0x27	0x0027	#	APOSTROPHE
0x28	0x0028	#	LEFT PARENTHESIS
0x29	0x0029	#	RIGHT PARENTHESIS
0x2A	0x002A	#	ASTERISK
0x2B	0x002B	#	PLUS SIGN
0x2C	0x002C	#	COMMA
0x2D	0x002D	#	HYPHEN-MINUS
0x2E	0x002E	#	FULL STOP
0x2F	0x002F	#	SOLIDUS
0x30	0x0030	#	DIGIT ZERO
0x31	0x0031	#	DIGIT ONE
0x32	0x0032	#	DIGIT TWO
0x33	0x0033	#	DIGIT THREE
0x34	0x0034	#	DIGIT FOUR
0x35	0x0035	#	DIGIT FIVE
0x36	0x0036	#	DIGIT SIX
0x37	0x0037	#	DIGIT SEVEN
0x38	0x0038	#	DIGIT EIGHT
0x39	0x0039	#	DIGIT NINE
0x3A	0x003A	#	COLON
0x3B	0x003B	#	SEMICOLON
0x3C	0x003C	#	LESS-THAN SIGN
0x3D	0x003D	#	EQUALS SIGN
0x3E	0x003E	#	GREATER-THAN SIGN
0x3F	0x003F	#	QUESTION MARK
0x40	0x0040	#	COMMERCIAL AT
0x41	0x0041	#	LATIN CAPITAL LETTER A
0x42	0x0042	#	LATIN CAPITAL LETTER B
0x43	0x0043	#	LATIN CAPITAL LETTER C
0x44	0x0044	#	LATIN CAPITAL LETTER D
0x45	0x0045	#	LATIN CAPITAL LETTER E
0x46	0x0046	#	LATIN CAPITAL LETTER F
0x47	0x0047	#	LATIN CAPITAL LETTER G
0x48	0x0048	#	LATIN CAPITAL LETTER H
0x49	0x0049	#	LATIN CAPITAL LETTER I
0x4A	0x004A	#	LATIN CAPITAL LETTER J
0x4B	0x004B	#	LATIN CAPITAL LETTER K
0x4C	0x004C	#	LATIN CAPITAL LETTER L
0x4D	0x004D	#	LATIN CAPITAL LETTER M
0x4E	0x004E	#	LATIN CAPITAL LETTER N
0x4F	0x004F	#	LATIN CAPITAL LETTER O
0x50	0x0050	#	LATIN CAPITAL LETTER P
0x51	0x0051	#	LATIN CAPITAL LETTER Q
0x52	0x0052	#	LATIN CAPITAL LETTER R
0x53	0x0053	#	LATIN CAPITAL LETTER S
0x54	0x0054	#	LATIN CAPITAL LETTER T
0x55	0x0055	#	LATIN CAPITAL LETTER U
0x56	0x0056	#	LATIN CAPITAL LETTER V
0x57	0x0057	#	LATIN CAPITAL LETTER W
0x58	0x0058	#	LATIN CAPITAL LETTER X
0x59	0x0059	#	LATIN CAPITAL LETTER Y
0x5A	0x005A	#	LATIN CAPITAL LETTER Z
0x5B	0x005B	#	LEFT SQUARE BRACKET
0x5C	0x005C	#	REVERSE SOLIDUS
0x5D	0x005D	#	RIGHT SQUARE BRACKET
0x5E	0x005E	#	CIRCUMFLEX ACCENT
0x5F	0x005F	#	LOW LINE
0x60	0x0060	#	GRAVE ACCENT
0x61	0x0061	#	LATIN SMALL LETTER A
0x62	0x0062	#	LATIN SMALL LETTER B
0x63	0x0063	#	LATIN SMALL LETTER C
0x64	0x0064	#	LATIN SMALL LETTER D
0x65	0x0065	#	LATIN SMALL LETTER E
0x66	0x0066	#	LATIN SMALL LETTER F
0x67	0x0067	#	LATIN SMALL LETTER G
0x68	0x0068	#	LATIN SMALL LETTER H
0x69	0x0069	#	LATIN SMALL LETTER I
0x6A	0x006A	#	LATIN SMALL LETTER J
0x6B	0x006B	#	LATIN SMALL LETTER K
0x6C	0x006C	#	LATIN SMALL LETTER L
0x6D	0x006D	#	LATIN SMALL LETTER M
0x6E	0x006E	#	LATIN SMALL LETTER N
0x6F	0x006F	#	LATIN SMALL LETTER O
0x70	0x0070	#	LATIN SMALL LETTER P
0x71	0x0071	#	LATIN SMALL LETTER Q
0x72	0x0072	#	LATIN SMALL LETTER R
0x73	0x0073	#	LATIN SMALL LETTER S
0x74	0x0074	#	LATIN SMALL LETTER T
0x75	0x0075	#	LATIN SMALL LETTER U
0x76	0x0076	#	LATIN SMALL LETTER V
0x77	0x0077	#	LATIN SMALL LETTER W
0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x0080	#	<control>
0x81	0x0081	#	<control>
0x82	0x0082	#	<control>
0x83	0x0083	#	<control>
0x84	0x0084	#	<control>
0x85	0x0085	#	<control>
0x86	0x0086	#	<control>
0x87	0x0087	#	<control>
0x88	0x0088	#	<control>
0x89	0x0089	#	<control>
0x8A	0x008A	#	<control>
0x8B	0x008B	#	<control>
0x8C	0x008C	#	<control>
0x8D	0x008D	#	<control>
0x8E	0x008E	#	<control>
0x8F	0x008F	#	<control>
0x90	0x0090	#	<control>
0x91	0x0091	#	<control>
0x92	0x0092	#	<control>
0x93	0x0093	#	<control>
0x94	0x0094	#	<control>
0x95	0x0095	#	<control>
0x96	0x0096	#	<control>
0x97	0x0097	#	<control>
0x98	0x0098	#	<control>
0x99	0x0099	#	<control>
0x9A	0x009A	#	<control>
0x9B	0x009B	#	<control>
0x9C	0x009C	#	<control>
0x9D	0x009D	#	<control>
0x9E	0x009E	#	<control>
0x9F	0x009F	#	<control>
0xA0	0x00A0	#	NO-BREAK SPACE
0xA1	0x1E02	#	LATIN CAPITAL LETTER B WITH DOT ABOVE
0xA2	0x1E03	#	LATIN SMALL LETTER B WITH DOT ABOVE
0xA3	0x00A3	#	POUND SIGN
0xA4	0x010A	#	LATIN CAPITAL LETTER C WITH DOT ABOVE
0xA5	0x010B	#	LATIN SMALL LETTER C WITH DOT ABOVE
0xA6	0x1E0A	#	LATIN CAPITAL LETTER D WITH DOT ABOVE
0xA7	0x00A7	#	SECTION SIGN
0xA8	0x1E80	#	LATIN CAPITAL LETTER W WITH GRAVE
0xA9	0x00A9	#	COPYRIGHT SIGN
0xAA	0x1E82	#	LATIN CAPITAL LETTER W WITH ACUTE
0xAB	0x1E0B	#	LATIN SMALL LETTER D WITH DOT ABOVE
0xAC	0x1EF2	#	LATIN CAPITAL LETTER Y WITH GRAVE
0xAD	0x00AD	#	SOFT HYPHEN
0xAE	0x00AE	#	REGISTERED SIGN
0xAF	0x0178	#	LATIN CAPITAL LETTER Y WITH DIAERESIS
0xB0	0x1E1E	#	LATIN CAPITAL LETTER F WITH DOT ABOVE
0xB1	0x1E1F	#	LATIN SMALL LETTER F WITH DOT ABOVE
0xB2	0x0120	#	LATIN CAPITAL LETTER G WITH DOT ABOVE
0xB3	0x0121	#	LATIN SMALL LETTER G WITH DOT ABOVE
0xB4	0x1E40	#	LATIN CAPITAL LETTER M WITH DOT ABOVE
0xB5	0x1E41	#	LATIN SMALL LETTER M WITH DOT ABOVE
0xB6	0x00B6	#	PILCROW SIGN
0xB7	0x1E56	#	LATIN CAPITAL LETTER P WITH DOT ABOVE
0xB8	0x1E81	#	LATIN SMALL LETTER W WITH GRAVE
0xB9	0x1E57	#	LATIN SMALL LETTER P WITH DOT ABOVE
0xBA	0x1E83	#	LATIN SMALL LETTER W WITH ACUTE
0xBB	0x1E60	#	LATIN CAPITAL LETTER S WITH DOT ABOVE
0xBC	0x1EF3	#	LATIN SMALL LETTER Y WITH GRAVE
0xBD	0x1E84	#	LATIN CAPITAL LETTER W WITH DIAERESIS
0xBE	0x1E85	#	LATIN SMALL LETTER W WITH DIAERESIS
0xBF	0x1E61	#	LATIN SMALL LETTER S WITH DOT ABOVE
0xC0	0x00C0	#	LATIN CAPITAL LETTER A WITH GRAVE
0xC1	0x00C1	#	LATIN CAPITAL LETTER A WITH ACUTE
0xC2	0x00C2	#	LATIN CAPITAL LETTER A WITH CIRCUMFLEX
0xC3	0x00C3	#	LATIN CAPITAL LETTER A WITH TILDE
0xC4	0x00C4	#	LATIN CAPITAL LETTER A WITH DIAERESIS
0xC5	0x00C5	#	LATIN CAPITAL LETTER A WITH RING ABOVE
0xC6	0x00C6	#	LATIN CAPITAL LETTER AE
0xC7	0x00C7	#	LATIN CAPITAL LETTER C WITH CEDILLA
0xC8	0x00C8	#	LATIN CAPITAL LETTER E WITH GRAVE
0xC9	0x00C9	#	LATIN CAPITAL LETTER E WITH ACUTE
0xCA	0x00CA	#	LATIN CAPITAL LETTER E WITH CIRCUMFLEX
0xCB	0x00CB	#	LATIN CAPITAL LETTER E WITH DIAERESIS
0xCC	0x00CC	#	LATIN CAPITAL LETTER I WITH GRAVE
0xCD	0x00CD	#	LATIN CAPITAL LETTER I WITH ACUTE
0xCE	0x00CE	#	LATIN CAPITAL LETTER I WITH CIRCUMFLEX
0xCF	0x00CF	#	LATIN CAPITAL LETTER I WITH DIAERESIS
0xD0	0x0174	#	LATIN CAPITAL LETTER W WITH CIRCUMFLEX
0xD1	0x00D1	#	LATIN CAPITAL LETTER N WITH TILDE
0xD2	0x00D2	#	LATIN CAPITAL LETTER O WITH GRAVE
0xD3	0x00D3	#	LATIN CAPITAL LETTER O WITH ACUTE
0xD4	0x00D4	#	LATIN CAPITAL LETTER O WITH CIRCUMFLEX
0xD5	0x00D5	#	LATIN CAPITAL LETTER O WITH TILDE
0xD6	0x00D6	#	LATIN CAPITAL LETTER O WITH DIAERESIS
0xD7	0x1E6A	#	LATIN CAPITAL LETTER T WITH DOT ABOVE
0xD8	0x00D8	#	LATIN CAPITAL LETTER O WITH STROKE
0xD9	0x00D9	#	LATIN CAPITAL LETTER U WITH GRAVE
0xDA	0x00DA	#	LATIN CAPITAL LETTER U WITH ACUTE
0xDB	0x00DB	#	LATIN CAPITAL LETTER U WITH CIRCUMFLEX
0xDC	0x00DC	#	LATIN CAPITAL LETTER U WITH DIAERESIS
0xDD	0x00DD	#	LATIN CAPITAL LETTER Y WITH ACUTE
0xDE	0x0176	#	LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
0xDF	0x00DF	#	LATIN SMALL LETTER SHARP S
0xE0	0x00E0	#	LATIN SMALL LETTER A WITH GRAVE
0xE1	0x00E1	#	LATIN SMALL LETTER A WITH ACUTE
0xE2	0x00E2	#	LATIN SMALL LETTER A WITH CIRCUMFLEX
0xE3	0x00E3	#	LATIN SMALL LETTER A WITH TILDE
0xE4	0x00E4	#	LATIN SMALL LETTER A WITH DIAERESIS
0xE5	0x00E5	#	LATIN SMALL LETTER A WITH RING ABOVE
0xE6	0x00E6	#	LATIN SMALL LETTER AE
0xE7	0x00E7	#	LATIN SMALL LETTER C WITH CEDILLA
0xE8	0x00E8	#	LATIN SMALL LETTER E WITH GRAVE
0xE9	0x00E9	#	LATIN SMALL LETTER E WITH ACUTE
0xEA	0x00EA	#	LATIN SMALL LETTER E WITH CIRCUMFLEX
0xEB	0x00EB	#	LATIN SMALL LETTER E WITH DIAERESIS
0xEC	0x00EC	#	LATIN SMALL LETTER I WITH GRAVE
0xED	0x00ED	#	LATIN SMALL LETTER I WITH ACUTE
0xEE	0x00EE	#	LATIN SMALL LETTER I WITH CIRCUMFLEX
0xEF	0x00EF	#	LATIN SMALL LETTER I WITH DIAERESIS
0xF0	0x0175	#	LATIN SMALL LETTER W WITH CIRCUMFLEX
0xF1	0x00F1	#	LATIN SMALL LETTER N WITH TILDE
0xF2	0x00F2	#	LATIN SMALL LETTER O WITH GRAVE
0xF3	0x00F3	#	LATIN SMALL LETTER O WITH ACUTE
0xF4	0x00F4	#	LATIN SMALL LETTER O WITH CIRCUMFLEX
0xF5	0x00F5	#	LATIN SMALL LETTER O WITH TILDE
0xF6	0x00F6	#	LATIN SMALL LETTER O WITH DIAERESIS
0xF7	0x1E6B	#	LATIN SMALL LETTER T WITH DOT ABOVE
0xF8	0x00F8	#	LATIN SMALL LETTER O WITH STROKE
0xF9	0x00F9	#	LATIN SMALL LETTER U WITH GRAVE
0xFA	0x00FA	#	LATIN SMALL LETTER U WITH ACUTE
0xFB	0x00FB	#	LATIN SMALL LETTER U WITH CIRCUMFLEX
0xFC	0x00FC	#	LATIN SMALL LETTER U WITH DIAERESIS
0xFD	0x00FD	#	LATIN SMALL LETTER Y WITH ACUTE
0xFE	0x0177	#	LATIN SMALL LETTER Y WITH CIRCUMFLEX
0xFF	0x00FF	#	LATIN SMALL LETTER Y WITH DIAERESIS

Added tools/encoding/iso8859-15.txt.















































































































































































































































































































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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#
#	Name:             ISO/IEC 8859-15:1999 to Unicode
#	Unicode version:  3.0
#	Table version:    1.0
#	Table format:     Format A
#	Date:             1999 July 27
#	Authors:          Markus Kuhn <mkuhn@acm.org>
#			  Ken Whistler <kenw@sybase.com>
#
#	Copyright (c) 1998 - 1999 Unicode, Inc.  All Rights reserved.
#
#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
#	No claims are made as to fitness for any particular purpose.  No
#	warranties of any kind are expressed or implied.  The recipient
#	agrees to determine applicability of information provided.  If this
#	file has been provided on optical media by Unicode, Inc., the sole
#	remedy for any claim will be exchange of defective media within 90
#	days of receipt.
#
#	Unicode, Inc. hereby grants the right to freely use the information
#	supplied in this file in the creation of products supporting the
#	Unicode Standard, and to make copies of this file in any form for
#	internal or external distribution as long as this notice remains
#	attached.
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       ISO/IEC 8859-15:1999 characters map into Unicode.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the ISO/IEC 8859-15 code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in ISO/IEC 8859-15 order.
#
#	Version history
#
#	Updated versions of this file may be found in:
#		<ftp://ftp.unicode.org/Public/MAPPINGS/>
#
#	Any comments or problems, contact <errata@unicode.org>
#	Please note that <errata@unicode.org> is an archival address;
#	notices will be checked, but do not expect an immediate response.
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
0x27	0x0027	#	APOSTROPHE
0x28	0x0028	#	LEFT PARENTHESIS
0x29	0x0029	#	RIGHT PARENTHESIS
0x2A	0x002A	#	ASTERISK
0x2B	0x002B	#	PLUS SIGN
0x2C	0x002C	#	COMMA
0x2D	0x002D	#	HYPHEN-MINUS
0x2E	0x002E	#	FULL STOP
0x2F	0x002F	#	SOLIDUS
0x30	0x0030	#	DIGIT ZERO
0x31	0x0031	#	DIGIT ONE
0x32	0x0032	#	DIGIT TWO
0x33	0x0033	#	DIGIT THREE
0x34	0x0034	#	DIGIT FOUR
0x35	0x0035	#	DIGIT FIVE
0x36	0x0036	#	DIGIT SIX
0x37	0x0037	#	DIGIT SEVEN
0x38	0x0038	#	DIGIT EIGHT
0x39	0x0039	#	DIGIT NINE
0x3A	0x003A	#	COLON
0x3B	0x003B	#	SEMICOLON
0x3C	0x003C	#	LESS-THAN SIGN
0x3D	0x003D	#	EQUALS SIGN
0x3E	0x003E	#	GREATER-THAN SIGN
0x3F	0x003F	#	QUESTION MARK
0x40	0x0040	#	COMMERCIAL AT
0x41	0x0041	#	LATIN CAPITAL LETTER A
0x42	0x0042	#	LATIN CAPITAL LETTER B
0x43	0x0043	#	LATIN CAPITAL LETTER C
0x44	0x0044	#	LATIN CAPITAL LETTER D
0x45	0x0045	#	LATIN CAPITAL LETTER E
0x46	0x0046	#	LATIN CAPITAL LETTER F
0x47	0x0047	#	LATIN CAPITAL LETTER G
0x48	0x0048	#	LATIN CAPITAL LETTER H
0x49	0x0049	#	LATIN CAPITAL LETTER I
0x4A	0x004A	#	LATIN CAPITAL LETTER J
0x4B	0x004B	#	LATIN CAPITAL LETTER K
0x4C	0x004C	#	LATIN CAPITAL LETTER L
0x4D	0x004D	#	LATIN CAPITAL LETTER M
0x4E	0x004E	#	LATIN CAPITAL LETTER N
0x4F	0x004F	#	LATIN CAPITAL LETTER O
0x50	0x0050	#	LATIN CAPITAL LETTER P
0x51	0x0051	#	LATIN CAPITAL LETTER Q
0x52	0x0052	#	LATIN CAPITAL LETTER R
0x53	0x0053	#	LATIN CAPITAL LETTER S
0x54	0x0054	#	LATIN CAPITAL LETTER T
0x55	0x0055	#	LATIN CAPITAL LETTER U
0x56	0x0056	#	LATIN CAPITAL LETTER V
0x57	0x0057	#	LATIN CAPITAL LETTER W
0x58	0x0058	#	LATIN CAPITAL LETTER X
0x59	0x0059	#	LATIN CAPITAL LETTER Y
0x5A	0x005A	#	LATIN CAPITAL LETTER Z
0x5B	0x005B	#	LEFT SQUARE BRACKET
0x5C	0x005C	#	REVERSE SOLIDUS
0x5D	0x005D	#	RIGHT SQUARE BRACKET
0x5E	0x005E	#	CIRCUMFLEX ACCENT
0x5F	0x005F	#	LOW LINE
0x60	0x0060	#	GRAVE ACCENT
0x61	0x0061	#	LATIN SMALL LETTER A
0x62	0x0062	#	LATIN SMALL LETTER B
0x63	0x0063	#	LATIN SMALL LETTER C
0x64	0x0064	#	LATIN SMALL LETTER D
0x65	0x0065	#	LATIN SMALL LETTER E
0x66	0x0066	#	LATIN SMALL LETTER F
0x67	0x0067	#	LATIN SMALL LETTER G
0x68	0x0068	#	LATIN SMALL LETTER H
0x69	0x0069	#	LATIN SMALL LETTER I
0x6A	0x006A	#	LATIN SMALL LETTER J
0x6B	0x006B	#	LATIN SMALL LETTER K
0x6C	0x006C	#	LATIN SMALL LETTER L
0x6D	0x006D	#	LATIN SMALL LETTER M
0x6E	0x006E	#	LATIN SMALL LETTER N
0x6F	0x006F	#	LATIN SMALL LETTER O
0x70	0x0070	#	LATIN SMALL LETTER P
0x71	0x0071	#	LATIN SMALL LETTER Q
0x72	0x0072	#	LATIN SMALL LETTER R
0x73	0x0073	#	LATIN SMALL LETTER S
0x74	0x0074	#	LATIN SMALL LETTER T
0x75	0x0075	#	LATIN SMALL LETTER U
0x76	0x0076	#	LATIN SMALL LETTER V
0x77	0x0077	#	LATIN SMALL LETTER W
0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x0080	#	<control>
0x81	0x0081	#	<control>
0x82	0x0082	#	<control>
0x83	0x0083	#	<control>
0x84	0x0084	#	<control>
0x85	0x0085	#	<control>
0x86	0x0086	#	<control>
0x87	0x0087	#	<control>
0x88	0x0088	#	<control>
0x89	0x0089	#	<control>
0x8A	0x008A	#	<control>
0x8B	0x008B	#	<control>
0x8C	0x008C	#	<control>
0x8D	0x008D	#	<control>
0x8E	0x008E	#	<control>
0x8F	0x008F	#	<control>
0x90	0x0090	#	<control>
0x91	0x0091	#	<control>
0x92	0x0092	#	<control>
0x93	0x0093	#	<control>
0x94	0x0094	#	<control>
0x95	0x0095	#	<control>
0x96	0x0096	#	<control>
0x97	0x0097	#	<control>
0x98	0x0098	#	<control>
0x99	0x0099	#	<control>
0x9A	0x009A	#	<control>
0x9B	0x009B	#	<control>
0x9C	0x009C	#	<control>
0x9D	0x009D	#	<control>
0x9E	0x009E	#	<control>
0x9F	0x009F	#	<control>
0xA0	0x00A0	#	NO-BREAK SPACE
0xA1	0x00A1	#	INVERTED EXCLAMATION MARK
0xA2	0x00A2	#	CENT SIGN
0xA3	0x00A3	#	POUND SIGN
0xA4	0x20AC	#	EURO SIGN
0xA5	0x00A5	#	YEN SIGN
0xA6	0x0160	#	LATIN CAPITAL LETTER S WITH CARON
0xA7	0x00A7	#	SECTION SIGN
0xA8	0x0161	#	LATIN SMALL LETTER S WITH CARON
0xA9	0x00A9	#	COPYRIGHT SIGN
0xAA	0x00AA	#	FEMININE ORDINAL INDICATOR
0xAB	0x00AB	#	LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xAC	0x00AC	#	NOT SIGN
0xAD	0x00AD	#	SOFT HYPHEN
0xAE	0x00AE	#	REGISTERED SIGN
0xAF	0x00AF	#	MACRON
0xB0	0x00B0	#	DEGREE SIGN
0xB1	0x00B1	#	PLUS-MINUS SIGN
0xB2	0x00B2	#	SUPERSCRIPT TWO
0xB3	0x00B3	#	SUPERSCRIPT THREE
0xB4	0x017D	#	LATIN CAPITAL LETTER Z WITH CARON
0xB5	0x00B5	#	MICRO SIGN
0xB6	0x00B6	#	PILCROW SIGN
0xB7	0x00B7	#	MIDDLE DOT
0xB8	0x017E	#	LATIN SMALL LETTER Z WITH CARON
0xB9	0x00B9	#	SUPERSCRIPT ONE
0xBA	0x00BA	#	MASCULINE ORDINAL INDICATOR
0xBB	0x00BB	#	RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xBC	0x0152	#	LATIN CAPITAL LIGATURE OE
0xBD	0x0153	#	LATIN SMALL LIGATURE OE
0xBE	0x0178	#	LATIN CAPITAL LETTER Y WITH DIAERESIS
0xBF	0x00BF	#	INVERTED QUESTION MARK
0xC0	0x00C0	#	LATIN CAPITAL LETTER A WITH GRAVE
0xC1	0x00C1	#	LATIN CAPITAL LETTER A WITH ACUTE
0xC2	0x00C2	#	LATIN CAPITAL LETTER A WITH CIRCUMFLEX
0xC3	0x00C3	#	LATIN CAPITAL LETTER A WITH TILDE
0xC4	0x00C4	#	LATIN CAPITAL LETTER A WITH DIAERESIS
0xC5	0x00C5	#	LATIN CAPITAL LETTER A WITH RING ABOVE
0xC6	0x00C6	#	LATIN CAPITAL LETTER AE
0xC7	0x00C7	#	LATIN CAPITAL LETTER C WITH CEDILLA
0xC8	0x00C8	#	LATIN CAPITAL LETTER E WITH GRAVE
0xC9	0x00C9	#	LATIN CAPITAL LETTER E WITH ACUTE
0xCA	0x00CA	#	LATIN CAPITAL LETTER E WITH CIRCUMFLEX
0xCB	0x00CB	#	LATIN CAPITAL LETTER E WITH DIAERESIS
0xCC	0x00CC	#	LATIN CAPITAL LETTER I WITH GRAVE
0xCD	0x00CD	#	LATIN CAPITAL LETTER I WITH ACUTE
0xCE	0x00CE	#	LATIN CAPITAL LETTER I WITH CIRCUMFLEX
0xCF	0x00CF	#	LATIN CAPITAL LETTER I WITH DIAERESIS
0xD0	0x00D0	#	LATIN CAPITAL LETTER ETH
0xD1	0x00D1	#	LATIN CAPITAL LETTER N WITH TILDE
0xD2	0x00D2	#	LATIN CAPITAL LETTER O WITH GRAVE
0xD3	0x00D3	#	LATIN CAPITAL LETTER O WITH ACUTE
0xD4	0x00D4	#	LATIN CAPITAL LETTER O WITH CIRCUMFLEX
0xD5	0x00D5	#	LATIN CAPITAL LETTER O WITH TILDE
0xD6	0x00D6	#	LATIN CAPITAL LETTER O WITH DIAERESIS
0xD7	0x00D7	#	MULTIPLICATION SIGN
0xD8	0x00D8	#	LATIN CAPITAL LETTER O WITH STROKE
0xD9	0x00D9	#	LATIN CAPITAL LETTER U WITH GRAVE
0xDA	0x00DA	#	LATIN CAPITAL LETTER U WITH ACUTE
0xDB	0x00DB	#	LATIN CAPITAL LETTER U WITH CIRCUMFLEX
0xDC	0x00DC	#	LATIN CAPITAL LETTER U WITH DIAERESIS
0xDD	0x00DD	#	LATIN CAPITAL LETTER Y WITH ACUTE
0xDE	0x00DE	#	LATIN CAPITAL LETTER THORN
0xDF	0x00DF	#	LATIN SMALL LETTER SHARP S
0xE0	0x00E0	#	LATIN SMALL LETTER A WITH GRAVE
0xE1	0x00E1	#	LATIN SMALL LETTER A WITH ACUTE
0xE2	0x00E2	#	LATIN SMALL LETTER A WITH CIRCUMFLEX
0xE3	0x00E3	#	LATIN SMALL LETTER A WITH TILDE
0xE4	0x00E4	#	LATIN SMALL LETTER A WITH DIAERESIS
0xE5	0x00E5	#	LATIN SMALL LETTER A WITH RING ABOVE
0xE6	0x00E6	#	LATIN SMALL LETTER AE
0xE7	0x00E7	#	LATIN SMALL LETTER C WITH CEDILLA
0xE8	0x00E8	#	LATIN SMALL LETTER E WITH GRAVE
0xE9	0x00E9	#	LATIN SMALL LETTER E WITH ACUTE
0xEA	0x00EA	#	LATIN SMALL LETTER E WITH CIRCUMFLEX
0xEB	0x00EB	#	LATIN SMALL LETTER E WITH DIAERESIS
0xEC	0x00EC	#	LATIN SMALL LETTER I WITH GRAVE
0xED	0x00ED	#	LATIN SMALL LETTER I WITH ACUTE
0xEE	0x00EE	#	LATIN SMALL LETTER I WITH CIRCUMFLEX
0xEF	0x00EF	#	LATIN SMALL LETTER I WITH DIAERESIS
0xF0	0x00F0	#	LATIN SMALL LETTER ETH
0xF1	0x00F1	#	LATIN SMALL LETTER N WITH TILDE
0xF2	0x00F2	#	LATIN SMALL LETTER O WITH GRAVE
0xF3	0x00F3	#	LATIN SMALL LETTER O WITH ACUTE
0xF4	0x00F4	#	LATIN SMALL LETTER O WITH CIRCUMFLEX
0xF5	0x00F5	#	LATIN SMALL LETTER O WITH TILDE
0xF6	0x00F6	#	LATIN SMALL LETTER O WITH DIAERESIS
0xF7	0x00F7	#	DIVISION SIGN
0xF8	0x00F8	#	LATIN SMALL LETTER O WITH STROKE
0xF9	0x00F9	#	LATIN SMALL LETTER U WITH GRAVE
0xFA	0x00FA	#	LATIN SMALL LETTER U WITH ACUTE
0xFB	0x00FB	#	LATIN SMALL LETTER U WITH CIRCUMFLEX
0xFC	0x00FC	#	LATIN SMALL LETTER U WITH DIAERESIS
0xFD	0x00FD	#	LATIN SMALL LETTER Y WITH ACUTE
0xFE	0x00FE	#	LATIN SMALL LETTER THORN
0xFF	0x00FF	#	LATIN SMALL LETTER Y WITH DIAERESIS

Added tools/encoding/iso8859-16.txt.











































































































































































































































































































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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#
#	Name:             ISO/IEC 8859-16:2001 to Unicode
#	Unicode version:  3.0
#	Table version:    1.0
#	Table format:     Format A
#	Date:             2001 July 26
#	Authors:          Markus Kuhn <mkuhn@acm.org>
#
#	Copyright (c) 1999-2001 Unicode, Inc.  All Rights reserved.
#
#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
#	No claims are made as to fitness for any particular purpose.  No
#	warranties of any kind are expressed or implied.  The recipient
#	agrees to determine applicability of information provided.  If this
#	file has been provided on optical media by Unicode, Inc., the sole
#	remedy for any claim will be exchange of defective media within 90
#	days of receipt.
#
#	Unicode, Inc. hereby grants the right to freely use the information
#	supplied in this file in the creation of products supporting the
#	Unicode Standard, and to make copies of this file in any form for
#	internal or external distribution as long as this notice remains
#	attached.
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       ISO/IEC 8859-16:2001 characters map into Unicode.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the ISO/IEC 8859-16 code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in ISO/IEC 8859-16 order.
#
#	Updated versions of this file may be found in:
#		<ftp://ftp.unicode.org/Public/MAPPINGS/>
#
#	Any comments or problems, contact <errata@unicode.org>
#	Please note that <errata@unicode.org> is an archival address;
#	notices will be checked, but do not expect an immediate response.
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
0x27	0x0027	#	APOSTROPHE
0x28	0x0028	#	LEFT PARENTHESIS
0x29	0x0029	#	RIGHT PARENTHESIS
0x2A	0x002A	#	ASTERISK
0x2B	0x002B	#	PLUS SIGN
0x2C	0x002C	#	COMMA
0x2D	0x002D	#	HYPHEN-MINUS
0x2E	0x002E	#	FULL STOP
0x2F	0x002F	#	SOLIDUS
0x30	0x0030	#	DIGIT ZERO
0x31	0x0031	#	DIGIT ONE
0x32	0x0032	#	DIGIT TWO
0x33	0x0033	#	DIGIT THREE
0x34	0x0034	#	DIGIT FOUR
0x35	0x0035	#	DIGIT FIVE
0x36	0x0036	#	DIGIT SIX
0x37	0x0037	#	DIGIT SEVEN
0x38	0x0038	#	DIGIT EIGHT
0x39	0x0039	#	DIGIT NINE
0x3A	0x003A	#	COLON
0x3B	0x003B	#	SEMICOLON
0x3C	0x003C	#	LESS-THAN SIGN
0x3D	0x003D	#	EQUALS SIGN
0x3E	0x003E	#	GREATER-THAN SIGN
0x3F	0x003F	#	QUESTION MARK
0x40	0x0040	#	COMMERCIAL AT
0x41	0x0041	#	LATIN CAPITAL LETTER A
0x42	0x0042	#	LATIN CAPITAL LETTER B
0x43	0x0043	#	LATIN CAPITAL LETTER C
0x44	0x0044	#	LATIN CAPITAL LETTER D
0x45	0x0045	#	LATIN CAPITAL LETTER E
0x46	0x0046	#	LATIN CAPITAL LETTER F
0x47	0x0047	#	LATIN CAPITAL LETTER G
0x48	0x0048	#	LATIN CAPITAL LETTER H
0x49	0x0049	#	LATIN CAPITAL LETTER I
0x4A	0x004A	#	LATIN CAPITAL LETTER J
0x4B	0x004B	#	LATIN CAPITAL LETTER K
0x4C	0x004C	#	LATIN CAPITAL LETTER L
0x4D	0x004D	#	LATIN CAPITAL LETTER M
0x4E	0x004E	#	LATIN CAPITAL LETTER N
0x4F	0x004F	#	LATIN CAPITAL LETTER O
0x50	0x0050	#	LATIN CAPITAL LETTER P
0x51	0x0051	#	LATIN CAPITAL LETTER Q
0x52	0x0052	#	LATIN CAPITAL LETTER R
0x53	0x0053	#	LATIN CAPITAL LETTER S
0x54	0x0054	#	LATIN CAPITAL LETTER T
0x55	0x0055	#	LATIN CAPITAL LETTER U
0x56	0x0056	#	LATIN CAPITAL LETTER V
0x57	0x0057	#	LATIN CAPITAL LETTER W
0x58	0x0058	#	LATIN CAPITAL LETTER X
0x59	0x0059	#	LATIN CAPITAL LETTER Y
0x5A	0x005A	#	LATIN CAPITAL LETTER Z
0x5B	0x005B	#	LEFT SQUARE BRACKET
0x5C	0x005C	#	REVERSE SOLIDUS
0x5D	0x005D	#	RIGHT SQUARE BRACKET
0x5E	0x005E	#	CIRCUMFLEX ACCENT
0x5F	0x005F	#	LOW LINE
0x60	0x0060	#	GRAVE ACCENT
0x61	0x0061	#	LATIN SMALL LETTER A
0x62	0x0062	#	LATIN SMALL LETTER B
0x63	0x0063	#	LATIN SMALL LETTER C
0x64	0x0064	#	LATIN SMALL LETTER D
0x65	0x0065	#	LATIN SMALL LETTER E
0x66	0x0066	#	LATIN SMALL LETTER F
0x67	0x0067	#	LATIN SMALL LETTER G
0x68	0x0068	#	LATIN SMALL LETTER H
0x69	0x0069	#	LATIN SMALL LETTER I
0x6A	0x006A	#	LATIN SMALL LETTER J
0x6B	0x006B	#	LATIN SMALL LETTER K
0x6C	0x006C	#	LATIN SMALL LETTER L
0x6D	0x006D	#	LATIN SMALL LETTER M
0x6E	0x006E	#	LATIN SMALL LETTER N
0x6F	0x006F	#	LATIN SMALL LETTER O
0x70	0x0070	#	LATIN SMALL LETTER P
0x71	0x0071	#	LATIN SMALL LETTER Q
0x72	0x0072	#	LATIN SMALL LETTER R
0x73	0x0073	#	LATIN SMALL LETTER S
0x74	0x0074	#	LATIN SMALL LETTER T
0x75	0x0075	#	LATIN SMALL LETTER U
0x76	0x0076	#	LATIN SMALL LETTER V
0x77	0x0077	#	LATIN SMALL LETTER W
0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x0080	#	<control>
0x81	0x0081	#	<control>
0x82	0x0082	#	<control>
0x83	0x0083	#	<control>
0x84	0x0084	#	<control>
0x85	0x0085	#	<control>
0x86	0x0086	#	<control>
0x87	0x0087	#	<control>
0x88	0x0088	#	<control>
0x89	0x0089	#	<control>
0x8A	0x008A	#	<control>
0x8B	0x008B	#	<control>
0x8C	0x008C	#	<control>
0x8D	0x008D	#	<control>
0x8E	0x008E	#	<control>
0x8F	0x008F	#	<control>
0x90	0x0090	#	<control>
0x91	0x0091	#	<control>
0x92	0x0092	#	<control>
0x93	0x0093	#	<control>
0x94	0x0094	#	<control>
0x95	0x0095	#	<control>
0x96	0x0096	#	<control>
0x97	0x0097	#	<control>
0x98	0x0098	#	<control>
0x99	0x0099	#	<control>
0x9A	0x009A	#	<control>
0x9B	0x009B	#	<control>
0x9C	0x009C	#	<control>
0x9D	0x009D	#	<control>
0x9E	0x009E	#	<control>
0x9F	0x009F	#	<control>
0xA0	0x00A0	#	NO-BREAK SPACE
0xA1	0x0104	#	LATIN CAPITAL LETTER A WITH OGONEK
0xA2	0x0105	#	LATIN SMALL LETTER A WITH OGONEK
0xA3	0x0141	#	LATIN CAPITAL LETTER L WITH STROKE
0xA4	0x20AC	#	EURO SIGN
0xA5	0x201E	#	DOUBLE LOW-9 QUOTATION MARK
0xA6	0x0160	#	LATIN CAPITAL LETTER S WITH CARON
0xA7	0x00A7	#	SECTION SIGN
0xA8	0x0161	#	LATIN SMALL LETTER S WITH CARON
0xA9	0x00A9	#	COPYRIGHT SIGN
0xAA	0x0218	#	LATIN CAPITAL LETTER S WITH COMMA BELOW
0xAB	0x00AB	#	LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xAC	0x0179	#	LATIN CAPITAL LETTER Z WITH ACUTE
0xAD	0x00AD	#	SOFT HYPHEN
0xAE	0x017A	#	LATIN SMALL LETTER Z WITH ACUTE
0xAF	0x017B	#	LATIN CAPITAL LETTER Z WITH DOT ABOVE
0xB0	0x00B0	#	DEGREE SIGN
0xB1	0x00B1	#	PLUS-MINUS SIGN
0xB2	0x010C	#	LATIN CAPITAL LETTER C WITH CARON
0xB3	0x0142	#	LATIN SMALL LETTER L WITH STROKE
0xB4	0x017D	#	LATIN CAPITAL LETTER Z WITH CARON
0xB5	0x201D	#	RIGHT DOUBLE QUOTATION MARK
0xB6	0x00B6	#	PILCROW SIGN
0xB7	0x00B7	#	MIDDLE DOT
0xB8	0x017E	#	LATIN SMALL LETTER Z WITH CARON
0xB9	0x010D	#	LATIN SMALL LETTER C WITH CARON
0xBA	0x0219	#	LATIN SMALL LETTER S WITH COMMA BELOW
0xBB	0x00BB	#	RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xBC	0x0152	#	LATIN CAPITAL LIGATURE OE
0xBD	0x0153	#	LATIN SMALL LIGATURE OE
0xBE	0x0178	#	LATIN CAPITAL LETTER Y WITH DIAERESIS
0xBF	0x017C	#	LATIN SMALL LETTER Z WITH DOT ABOVE
0xC0	0x00C0	#	LATIN CAPITAL LETTER A WITH GRAVE
0xC1	0x00C1	#	LATIN CAPITAL LETTER A WITH ACUTE
0xC2	0x00C2	#	LATIN CAPITAL LETTER A WITH CIRCUMFLEX
0xC3	0x0102	#	LATIN CAPITAL LETTER A WITH BREVE
0xC4	0x00C4	#	LATIN CAPITAL LETTER A WITH DIAERESIS
0xC5	0x0106	#	LATIN CAPITAL LETTER C WITH ACUTE
0xC6	0x00C6	#	LATIN CAPITAL LETTER AE
0xC7	0x00C7	#	LATIN CAPITAL LETTER C WITH CEDILLA
0xC8	0x00C8	#	LATIN CAPITAL LETTER E WITH GRAVE
0xC9	0x00C9	#	LATIN CAPITAL LETTER E WITH ACUTE
0xCA	0x00CA	#	LATIN CAPITAL LETTER E WITH CIRCUMFLEX
0xCB	0x00CB	#	LATIN CAPITAL LETTER E WITH DIAERESIS
0xCC	0x00CC	#	LATIN CAPITAL LETTER I WITH GRAVE
0xCD	0x00CD	#	LATIN CAPITAL LETTER I WITH ACUTE
0xCE	0x00CE	#	LATIN CAPITAL LETTER I WITH CIRCUMFLEX
0xCF	0x00CF	#	LATIN CAPITAL LETTER I WITH DIAERESIS
0xD0	0x0110	#	LATIN CAPITAL LETTER D WITH STROKE
0xD1	0x0143	#	LATIN CAPITAL LETTER N WITH ACUTE
0xD2	0x00D2	#	LATIN CAPITAL LETTER O WITH GRAVE
0xD3	0x00D3	#	LATIN CAPITAL LETTER O WITH ACUTE
0xD4	0x00D4	#	LATIN CAPITAL LETTER O WITH CIRCUMFLEX
0xD5	0x0150	#	LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
0xD6	0x00D6	#	LATIN CAPITAL LETTER O WITH DIAERESIS
0xD7	0x015A	#	LATIN CAPITAL LETTER S WITH ACUTE
0xD8	0x0170	#	LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
0xD9	0x00D9	#	LATIN CAPITAL LETTER U WITH GRAVE
0xDA	0x00DA	#	LATIN CAPITAL LETTER U WITH ACUTE
0xDB	0x00DB	#	LATIN CAPITAL LETTER U WITH CIRCUMFLEX
0xDC	0x00DC	#	LATIN CAPITAL LETTER U WITH DIAERESIS
0xDD	0x0118	#	LATIN CAPITAL LETTER E WITH OGONEK
0xDE	0x021A	#	LATIN CAPITAL LETTER T WITH COMMA BELOW
0xDF	0x00DF	#	LATIN SMALL LETTER SHARP S
0xE0	0x00E0	#	LATIN SMALL LETTER A WITH GRAVE
0xE1	0x00E1	#	LATIN SMALL LETTER A WITH ACUTE
0xE2	0x00E2	#	LATIN SMALL LETTER A WITH CIRCUMFLEX
0xE3	0x0103	#	LATIN SMALL LETTER A WITH BREVE
0xE4	0x00E4	#	LATIN SMALL LETTER A WITH DIAERESIS
0xE5	0x0107	#	LATIN SMALL LETTER C WITH ACUTE
0xE6	0x00E6	#	LATIN SMALL LETTER AE
0xE7	0x00E7	#	LATIN SMALL LETTER C WITH CEDILLA
0xE8	0x00E8	#	LATIN SMALL LETTER E WITH GRAVE
0xE9	0x00E9	#	LATIN SMALL LETTER E WITH ACUTE
0xEA	0x00EA	#	LATIN SMALL LETTER E WITH CIRCUMFLEX
0xEB	0x00EB	#	LATIN SMALL LETTER E WITH DIAERESIS
0xEC	0x00EC	#	LATIN SMALL LETTER I WITH GRAVE
0xED	0x00ED	#	LATIN SMALL LETTER I WITH ACUTE
0xEE	0x00EE	#	LATIN SMALL LETTER I WITH CIRCUMFLEX
0xEF	0x00EF	#	LATIN SMALL LETTER I WITH DIAERESIS
0xF0	0x0111	#	LATIN SMALL LETTER D WITH STROKE
0xF1	0x0144	#	LATIN SMALL LETTER N WITH ACUTE
0xF2	0x00F2	#	LATIN SMALL LETTER O WITH GRAVE
0xF3	0x00F3	#	LATIN SMALL LETTER O WITH ACUTE
0xF4	0x00F4	#	LATIN SMALL LETTER O WITH CIRCUMFLEX
0xF5	0x0151	#	LATIN SMALL LETTER O WITH DOUBLE ACUTE
0xF6	0x00F6	#	LATIN SMALL LETTER O WITH DIAERESIS
0xF7	0x015B	#	LATIN SMALL LETTER S WITH ACUTE
0xF8	0x0171	#	LATIN SMALL LETTER U WITH DOUBLE ACUTE
0xF9	0x00F9	#	LATIN SMALL LETTER U WITH GRAVE
0xFA	0x00FA	#	LATIN SMALL LETTER U WITH ACUTE
0xFB	0x00FB	#	LATIN SMALL LETTER U WITH CIRCUMFLEX
0xFC	0x00FC	#	LATIN SMALL LETTER U WITH DIAERESIS
0xFD	0x0119	#	LATIN SMALL LETTER E WITH OGONEK
0xFE	0x021B	#	LATIN SMALL LETTER T WITH COMMA BELOW
0xFF	0x00FF	#	LATIN SMALL LETTER Y WITH DIAERESIS
Changes to tools/encoding/iso8859-2.txt.
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
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

-
-
-
+
+
+

-
-
+
+
-

-
+





-
+



-
-
-
-
-
+
+
+
+
+




-
+


-
+



-
+

+
+
+
+
+
+
+
-
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







#
#	Name:             ISO 8859-2 (1987) to Unicode
#	Unicode version:  1.1
#	Table version:    0.1
#	Name:             ISO 8859-2:1999 to Unicode
#	Unicode version:  3.0
#	Table version:    1.0
#	Table format:     Format A
#	Date:             16 January 1995
#	Authors:          Tim Greenwood <greenwood@r2me2.enet.dec.com>
#	Date:             1999 July 27
#	Authors:          Ken Whistler <kenw@sybase.com>
#                     John H. Jenkins <John_Jenkins@taligent.com>
#
#	Copyright (c) 1991-1995 Unicode, Inc.  All Rights reserved.
#	Copyright (c) 1991-1999 Unicode, Inc.  All Rights reserved.
#
#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
#	No claims are made as to fitness for any particular purpose.  No
#	warranties of any kind are expressed or implied.  The recipient
#	agrees to determine applicability of information provided.  If this
#	file has been provided on magnetic media by Unicode, Inc., the sole
#	file has been provided on optical media by Unicode, Inc., the sole
#	remedy for any claim will be exchange of defective media within 90
#	days of receipt.
#
#	Recipient is granted the right to make copies in any form for
#	internal distribution and to freely use the information supplied
#	in the creation of products supporting Unicode.  Unicode, Inc.
#	specifically excludes the right to re-distribute this file directly
#	to third parties or other organizations whether for profit or not.
#	Unicode, Inc. hereby grants the right to freely use the information
#	supplied in this file in the creation of products supporting the
#	Unicode Standard, and to make copies of this file in any form for
#	internal or external distribution as long as this notice remains
#	attached.
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       ISO 8859-2 (1987) characters map into Unicode.
#       ISO/IEC 8859-2:1999 characters map into Unicode.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the ISO 8859-2 code (in hex as 0xXX)
#		 Column #1 is the ISO/IEC 8859-2 code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in ISO 8859-2 order
#	The entries are in ISO/IEC 8859-2 order.
#
#	Version history
#	1.0 version updates 0.1 version by adding mappings for all
#	control characters.
#
#	Updated versions of this file may be found in:
#		<ftp://ftp.unicode.org/Public/MAPPINGS/>
#
#	Any comments or problems, contact <John_Jenkins@taligent.com>
#	Any comments or problems, contact <errata@unicode.org>
#	Please note that <errata@unicode.org> is an archival address;
#	notices will be checked, but do not expect an immediate response.
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
128
129
130
131
132
133
134

































135
136
137
138
139
140
141
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x0080	#	<control>
0x81	0x0081	#	<control>
0x82	0x0082	#	<control>
0x83	0x0083	#	<control>
0x84	0x0084	#	<control>
0x85	0x0085	#	<control>
0x86	0x0086	#	<control>
0x87	0x0087	#	<control>
0x88	0x0088	#	<control>
0x89	0x0089	#	<control>
0x8A	0x008A	#	<control>
0x8B	0x008B	#	<control>
0x8C	0x008C	#	<control>
0x8D	0x008D	#	<control>
0x8E	0x008E	#	<control>
0x8F	0x008F	#	<control>
0x90	0x0090	#	<control>
0x91	0x0091	#	<control>
0x92	0x0092	#	<control>
0x93	0x0093	#	<control>
0x94	0x0094	#	<control>
0x95	0x0095	#	<control>
0x96	0x0096	#	<control>
0x97	0x0097	#	<control>
0x98	0x0098	#	<control>
0x99	0x0099	#	<control>
0x9A	0x009A	#	<control>
0x9B	0x009B	#	<control>
0x9C	0x009C	#	<control>
0x9D	0x009D	#	<control>
0x9E	0x009E	#	<control>
0x9F	0x009F	#	<control>
0xA0	0x00A0	#	NO-BREAK SPACE
0xA1	0x0104	#	LATIN CAPITAL LETTER A WITH OGONEK
0xA2	0x02D8	#	BREVE
0xA3	0x0141	#	LATIN CAPITAL LETTER L WITH STROKE
0xA4	0x00A4	#	CURRENCY SIGN
0xA5	0x013D	#	LATIN CAPITAL LETTER L WITH CARON
0xA6	0x015A	#	LATIN CAPITAL LETTER S WITH ACUTE
Changes to tools/encoding/iso8859-3.txt.
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
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

-
-
-
+
+
+

-
-
+
+
-

-
+





-
+



-
-
-
-
-
+
+
+
+
+




-
+


-
+



-
+

+
+
+
+
+
+
+
-
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







#
#	Name:             ISO 8859-3 (1988) to Unicode
#	Unicode version:  1.1
#	Table version:    0.1
#	Name:             ISO/IEC 8859-3:1999 to Unicode
#	Unicode version:  3.0
#	Table version:    1.0
#	Table format:     Format A
#	Date:             16 January 1995
#	Authors:          Tim Greenwood <greenwood@r2me2.enet.dec.com>
#	Date:             1999 July 27
#	Authors:          Ken Whistler <kenw@sybase.com>
#                     John H. Jenkins <John_Jenkins@taligent.com>
#
#	Copyright (c) 1991-1995 Unicode, Inc.  All Rights reserved.
#	Copyright (c) 1991-1999 Unicode, Inc.  All Rights reserved.
#
#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
#	No claims are made as to fitness for any particular purpose.  No
#	warranties of any kind are expressed or implied.  The recipient
#	agrees to determine applicability of information provided.  If this
#	file has been provided on magnetic media by Unicode, Inc., the sole
#	file has been provided on optical media by Unicode, Inc., the sole
#	remedy for any claim will be exchange of defective media within 90
#	days of receipt.
#
#	Recipient is granted the right to make copies in any form for
#	internal distribution and to freely use the information supplied
#	in the creation of products supporting Unicode.  Unicode, Inc.
#	specifically excludes the right to re-distribute this file directly
#	to third parties or other organizations whether for profit or not.
#	Unicode, Inc. hereby grants the right to freely use the information
#	supplied in this file in the creation of products supporting the
#	Unicode Standard, and to make copies of this file in any form for
#	internal or external distribution as long as this notice remains
#	attached.
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       ISO 8859-3 (1988) characters map into Unicode.
#       ISO/IEC 8859-3:1999 characters map into Unicode.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the ISO 8859-3 code (in hex as 0xXX)
#		 Column #1 is the ISO/IEC 8859-3 code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in ISO 8859-3 order
#	The entries are in ISO/IEC 8859-3 order.
#
#	Version history
#	1.0 version updates 0.1 version by adding mappings for all
#	control characters.
#
#	Updated versions of this file may be found in:
#		<ftp://ftp.unicode.org/Public/MAPPINGS/>
#
#	Any comments or problems, contact <John_Jenkins@taligent.com>
#	Any comments or problems, contact <errata@unicode.org>
#	Please note that <errata@unicode.org> is an archival address;
#	notices will be checked, but do not expect an immediate response.
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
128
129
130
131
132
133
134

































135
136
137
138
139
140
141
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x0080	#	<control>
0x81	0x0081	#	<control>
0x82	0x0082	#	<control>
0x83	0x0083	#	<control>
0x84	0x0084	#	<control>
0x85	0x0085	#	<control>
0x86	0x0086	#	<control>
0x87	0x0087	#	<control>
0x88	0x0088	#	<control>
0x89	0x0089	#	<control>
0x8A	0x008A	#	<control>
0x8B	0x008B	#	<control>
0x8C	0x008C	#	<control>
0x8D	0x008D	#	<control>
0x8E	0x008E	#	<control>
0x8F	0x008F	#	<control>
0x90	0x0090	#	<control>
0x91	0x0091	#	<control>
0x92	0x0092	#	<control>
0x93	0x0093	#	<control>
0x94	0x0094	#	<control>
0x95	0x0095	#	<control>
0x96	0x0096	#	<control>
0x97	0x0097	#	<control>
0x98	0x0098	#	<control>
0x99	0x0099	#	<control>
0x9A	0x009A	#	<control>
0x9B	0x009B	#	<control>
0x9C	0x009C	#	<control>
0x9D	0x009D	#	<control>
0x9E	0x009E	#	<control>
0x9F	0x009F	#	<control>
0xA0	0x00A0	#	NO-BREAK SPACE
0xA1	0x0126	#	LATIN CAPITAL LETTER H WITH STROKE
0xA2	0x02D8	#	BREVE
0xA3	0x00A3	#	POUND SIGN
0xA4	0x00A4	#	CURRENCY SIGN
0xA6	0x0124	#	LATIN CAPITAL LETTER H WITH CIRCUMFLEX
0xA7	0x00A7	#	SECTION SIGN
Changes to tools/encoding/iso8859-4.txt.
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
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

-
-
-
+
+
+

-
-
+
+
-

-
+





-
+



-
-
-
-
-
+
+
+
+
+




-
+


-
+



-
+

+
+
+
+
+
+
+
-
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







#
#	Name:             ISO 8859-4 (1988) to Unicode
#	Unicode version:  1.1
#	Table version:    0.1
#	Name:             ISO/IEC 8859-4:1998 to Unicode
#	Unicode version:  3.0
#	Table version:    1.0
#	Table format:     Format A
#	Date:             16 January 1995
#	Authors:          Tim Greenwood <greenwood@r2me2.enet.dec.com>
#	Date:             1999 July 27
#	Authors:          Ken Whistler <kenw@sybase.com>
#                     John H. Jenkins <John_Jenkins@taligent.com>
#
#	Copyright (c) 1991-1995 Unicode, Inc.  All Rights reserved.
#	Copyright (c) 1991-1999 Unicode, Inc.  All Rights reserved.
#
#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
#	No claims are made as to fitness for any particular purpose.  No
#	warranties of any kind are expressed or implied.  The recipient
#	agrees to determine applicability of information provided.  If this
#	file has been provided on magnetic media by Unicode, Inc., the sole
#	file has been provided on optical media by Unicode, Inc., the sole
#	remedy for any claim will be exchange of defective media within 90
#	days of receipt.
#
#	Recipient is granted the right to make copies in any form for
#	internal distribution and to freely use the information supplied
#	in the creation of products supporting Unicode.  Unicode, Inc.
#	specifically excludes the right to re-distribute this file directly
#	to third parties or other organizations whether for profit or not.
#	Unicode, Inc. hereby grants the right to freely use the information
#	supplied in this file in the creation of products supporting the
#	Unicode Standard, and to make copies of this file in any form for
#	internal or external distribution as long as this notice remains
#	attached.
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       ISO 8859-4 (1988) characters map into Unicode.
#       ISO/IEC 8859-4:1998 characters map into Unicode.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the ISO 8859-4 code (in hex as 0xXX)
#		 Column #1 is the ISO/IEC 8859-4 code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in ISO 8859-4 order
#	The entries are in ISO/IEC 8859-4 order.
#
#	Version history
#	1.0 version updates 0.1 version by adding mappings for all
#	control characters.
#
#	Updated versions of this file may be found in:
#		<ftp://ftp.unicode.org/Public/MAPPINGS/>
#
#	Any comments or problems, contact <John_Jenkins@taligent.com>
#	Any comments or problems, contact <errata@unicode.org>
#	Please note that <errata@unicode.org> is an archival address;
#	notices will be checked, but do not expect an immediate response.
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
128
129
130
131
132
133
134

































135
136
137
138
139
140
141
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x0080	#	<control>
0x81	0x0081	#	<control>
0x82	0x0082	#	<control>
0x83	0x0083	#	<control>
0x84	0x0084	#	<control>
0x85	0x0085	#	<control>
0x86	0x0086	#	<control>
0x87	0x0087	#	<control>
0x88	0x0088	#	<control>
0x89	0x0089	#	<control>
0x8A	0x008A	#	<control>
0x8B	0x008B	#	<control>
0x8C	0x008C	#	<control>
0x8D	0x008D	#	<control>
0x8E	0x008E	#	<control>
0x8F	0x008F	#	<control>
0x90	0x0090	#	<control>
0x91	0x0091	#	<control>
0x92	0x0092	#	<control>
0x93	0x0093	#	<control>
0x94	0x0094	#	<control>
0x95	0x0095	#	<control>
0x96	0x0096	#	<control>
0x97	0x0097	#	<control>
0x98	0x0098	#	<control>
0x99	0x0099	#	<control>
0x9A	0x009A	#	<control>
0x9B	0x009B	#	<control>
0x9C	0x009C	#	<control>
0x9D	0x009D	#	<control>
0x9E	0x009E	#	<control>
0x9F	0x009F	#	<control>
0xA0	0x00A0	#	NO-BREAK SPACE
0xA1	0x0104	#	LATIN CAPITAL LETTER A WITH OGONEK
0xA2	0x0138	#	LATIN SMALL LETTER KRA
0xA3	0x0156	#	LATIN CAPITAL LETTER R WITH CEDILLA
0xA4	0x00A4	#	CURRENCY SIGN
0xA5	0x0128	#	LATIN CAPITAL LETTER I WITH TILDE
0xA6	0x013B	#	LATIN CAPITAL LETTER L WITH CEDILLA
Changes to tools/encoding/iso8859-5.txt.
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
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

-
-
-
+
+
+

-
-
+
+
-

-
+





-
+



-
-
-
-
-
+
+
+
+
+




-
+


-
+



-
+

+
+
+
+
+
+
+
-
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







#
#	Name:             ISO 8859-5 (1988) to Unicode
#	Unicode version:  1.1
#	Table version:    0.1
#	Name:             ISO 8859-5:1999 to Unicode
#	Unicode version:  3.0
#	Table version:    1.0
#	Table format:     Format A
#	Date:             16 January 1995
#	Authors:          Tim Greenwood <greenwood@r2me2.enet.dec.com>
#	Date:             1999 July 27
#	Authors:          Ken Whistler <kenw@sybase.com>
#                     John H. Jenkins <John_Jenkins@taligent.com>
#
#	Copyright (c) 1991-1995 Unicode, Inc.  All Rights reserved.
#	Copyright (c) 1991-1999 Unicode, Inc.  All Rights reserved.
#
#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
#	No claims are made as to fitness for any particular purpose.  No
#	warranties of any kind are expressed or implied.  The recipient
#	agrees to determine applicability of information provided.  If this
#	file has been provided on magnetic media by Unicode, Inc., the sole
#	file has been provided on optical media by Unicode, Inc., the sole
#	remedy for any claim will be exchange of defective media within 90
#	days of receipt.
#
#	Recipient is granted the right to make copies in any form for
#	internal distribution and to freely use the information supplied
#	in the creation of products supporting Unicode.  Unicode, Inc.
#	specifically excludes the right to re-distribute this file directly
#	to third parties or other organizations whether for profit or not.
#	Unicode, Inc. hereby grants the right to freely use the information
#	supplied in this file in the creation of products supporting the
#	Unicode Standard, and to make copies of this file in any form for
#	internal or external distribution as long as this notice remains
#	attached.
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       ISO 8859-5 (1988) characters map into Unicode.
#       ISO/IEC 8859-5:1999 characters map into Unicode.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the ISO 8859-5 code (in hex as 0xXX)
#		 Column #1 is the ISO/IEC 8859-5 code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in ISO 8859-5 order
#	The entries are in ISO/IEC 8859-5 order.
#
#	Version history
#	1.0 version updates 0.1 version by adding mappings for all
#	control characters.
#
#	Updated versions of this file may be found in:
#		<ftp://ftp.unicode.org/Public/MAPPINGS/>
#
#	Any comments or problems, contact <John_Jenkins@taligent.com>
#	Any comments or problems, contact <errata@unicode.org>
#	Please note that <errata@unicode.org> is an archival address;
#	notices will be checked, but do not expect an immediate response.
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
128
129
130
131
132
133
134

































135
136
137
138
139
140
141
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x0080	#	<control>
0x81	0x0081	#	<control>
0x82	0x0082	#	<control>
0x83	0x0083	#	<control>
0x84	0x0084	#	<control>
0x85	0x0085	#	<control>
0x86	0x0086	#	<control>
0x87	0x0087	#	<control>
0x88	0x0088	#	<control>
0x89	0x0089	#	<control>
0x8A	0x008A	#	<control>
0x8B	0x008B	#	<control>
0x8C	0x008C	#	<control>
0x8D	0x008D	#	<control>
0x8E	0x008E	#	<control>
0x8F	0x008F	#	<control>
0x90	0x0090	#	<control>
0x91	0x0091	#	<control>
0x92	0x0092	#	<control>
0x93	0x0093	#	<control>
0x94	0x0094	#	<control>
0x95	0x0095	#	<control>
0x96	0x0096	#	<control>
0x97	0x0097	#	<control>
0x98	0x0098	#	<control>
0x99	0x0099	#	<control>
0x9A	0x009A	#	<control>
0x9B	0x009B	#	<control>
0x9C	0x009C	#	<control>
0x9D	0x009D	#	<control>
0x9E	0x009E	#	<control>
0x9F	0x009F	#	<control>
0xA0	0x00A0	#	NO-BREAK SPACE
0xA1	0x0401	#	CYRILLIC CAPITAL LETTER IO
0xA2	0x0402	#	CYRILLIC CAPITAL LETTER DJE
0xA3	0x0403	#	CYRILLIC CAPITAL LETTER GJE
0xA4	0x0404	#	CYRILLIC CAPITAL LETTER UKRAINIAN IE
0xA5	0x0405	#	CYRILLIC CAPITAL LETTER DZE
0xA6	0x0406	#	CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
Changes to tools/encoding/iso8859-6.txt.
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
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

-
-
-
+
+
+

-
-
+
+
-

-
+





-
+



-
-
-
-
-
+
+
+
+
+




-
+


-
+



-
+

+
+
+
+
+
+
+
+
+
-
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
















-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+







#
#	Name:             ISO 8859-6 (1987) to Unicode
#	Unicode version:  1.1
#	Table version:    0.1
#	Name:             ISO 8859-6:1999 to Unicode
#	Unicode version:  3.0
#	Table version:    1.0
#	Table format:     Format A
#	Date:             16 January 1995
#	Authors:          Tim Greenwood <greenwood@r2me2.enet.dec.com>
#	Date:             1999 July 27
#	Authors:          Ken Whistler <kenw@sybase.com>
#                     John H. Jenkins <John_Jenkins@taligent.com>
#
#	Copyright (c) 1991-1995 Unicode, Inc.  All Rights reserved.
#	Copyright (c) 1991-1999 Unicode, Inc.  All Rights reserved.
#
#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
#	No claims are made as to fitness for any particular purpose.  No
#	warranties of any kind are expressed or implied.  The recipient
#	agrees to determine applicability of information provided.  If this
#	file has been provided on magnetic media by Unicode, Inc., the sole
#	file has been provided on optical media by Unicode, Inc., the sole
#	remedy for any claim will be exchange of defective media within 90
#	days of receipt.
#
#	Recipient is granted the right to make copies in any form for
#	internal distribution and to freely use the information supplied
#	in the creation of products supporting Unicode.  Unicode, Inc.
#	specifically excludes the right to re-distribute this file directly
#	to third parties or other organizations whether for profit or not.
#	Unicode, Inc. hereby grants the right to freely use the information
#	supplied in this file in the creation of products supporting the
#	Unicode Standard, and to make copies of this file in any form for
#	internal or external distribution as long as this notice remains
#	attached.
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       ISO 8859-6 (1987) characters map into Unicode.
#       ISO/IEC 8859-6:1999 characters map into Unicode.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the ISO 8859-6 code (in hex as 0xXX)
#		 Column #1 is the ISO/IEC 8859-6 code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in ISO 8859-6 order
#	The entries are in ISO/IEC 8859-6 order.
#
#	Version history
#	1.0 version updates 0.1 version by adding mappings for all
#	control characters.
#	0x30..0x39 remapped to the ASCII digits (U+0030..U+0039) instead
#	of the Arabic digits (U+0660..U+0669).
#
#	Updated versions of this file may be found in:
#		<ftp://ftp.unicode.org/Public/MAPPINGS/>
#
#	Any comments or problems, contact <John_Jenkins@taligent.com>
#	Any comments or problems, contact <errata@unicode.org>
#	Please note that <errata@unicode.org> is an archival address;
#	notices will be checked, but do not expect an immediate response.
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
0x27	0x0027	#	APOSTROPHE
0x28	0x0028	#	LEFT PARENTHESIS
0x29	0x0029	#	RIGHT PARENTHESIS
0x2A	0x002A	#	ASTERISK
0x2B	0x002B	#	PLUS SIGN
0x2C	0x002C	#	COMMA
0x2D	0x002D	#	HYPHEN-MINUS
0x2E	0x002E	#	FULL STOP
0x2F	0x002F	#	SOLIDUS
0x30	0x0660	#	ARABIC-INDIC DIGIT ZERO
0x31	0x0661	#	ARABIC-INDIC DIGIT ONE
0x32	0x0662	#	ARABIC-INDIC DIGIT TWO
0x33	0x0663	#	ARABIC-INDIC DIGIT THREE
0x34	0x0664	#	ARABIC-INDIC DIGIT FOUR
0x35	0x0665	#	ARABIC-INDIC DIGIT FIVE
0x36	0x0666	#	ARABIC-INDIC DIGIT SIX
0x37	0x0667	#	ARABIC-INDIC DIGIT SEVEN
0x38	0x0668	#	ARABIC-INDIC DIGIT EIGHT
0x39	0x0669	#	ARABIC-INDIC DIGIT NINE
0x30	0x0030	#	DIGIT ZERO
0x31	0x0031	#	DIGIT ONE
0x32	0x0032	#	DIGIT TWO
0x33	0x0033	#	DIGIT THREE
0x34	0x0034	#	DIGIT FOUR
0x35	0x0035	#	DIGIT FIVE
0x36	0x0036	#	DIGIT SIX
0x37	0x0037	#	DIGIT SEVEN
0x38	0x0038	#	DIGIT EIGHT
0x39	0x0039	#	DIGIT NINE
0x3A	0x003A	#	COLON
0x3B	0x003B	#	SEMICOLON
0x3C	0x003C	#	LESS-THAN SIGN
0x3D	0x003D	#	EQUALS SIGN
0x3E	0x003E	#	GREATER-THAN SIGN
0x3F	0x003F	#	QUESTION MARK
0x40	0x0040	#	COMMERCIAL AT
128
129
130
131
132
133
134

































135
136
137
138
139
140
141
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x0080	#	<control>
0x81	0x0081	#	<control>
0x82	0x0082	#	<control>
0x83	0x0083	#	<control>
0x84	0x0084	#	<control>
0x85	0x0085	#	<control>
0x86	0x0086	#	<control>
0x87	0x0087	#	<control>
0x88	0x0088	#	<control>
0x89	0x0089	#	<control>
0x8A	0x008A	#	<control>
0x8B	0x008B	#	<control>
0x8C	0x008C	#	<control>
0x8D	0x008D	#	<control>
0x8E	0x008E	#	<control>
0x8F	0x008F	#	<control>
0x90	0x0090	#	<control>
0x91	0x0091	#	<control>
0x92	0x0092	#	<control>
0x93	0x0093	#	<control>
0x94	0x0094	#	<control>
0x95	0x0095	#	<control>
0x96	0x0096	#	<control>
0x97	0x0097	#	<control>
0x98	0x0098	#	<control>
0x99	0x0099	#	<control>
0x9A	0x009A	#	<control>
0x9B	0x009B	#	<control>
0x9C	0x009C	#	<control>
0x9D	0x009D	#	<control>
0x9E	0x009E	#	<control>
0x9F	0x009F	#	<control>
0xA0	0x00A0	#	NO-BREAK SPACE
0xA4	0x00A4	#	CURRENCY SIGN
0xAC	0x060C	#	ARABIC COMMA
0xAD	0x00AD	#	SOFT HYPHEN
0xBB	0x061B	#	ARABIC SEMICOLON
0xBF	0x061F	#	ARABIC QUESTION MARK
0xC1	0x0621	#	ARABIC LETTER HAMZA
Changes to tools/encoding/iso8859-7.txt.
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
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

-
-
-
+
+
+

-
-
+
+
-

-
+





-
+



-
-
-
-
-
+
+
+
+
+




-
+
+
+
+






-
+

+
+
+
+
+
+
+
+
+
-
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







#
#	Name:             ISO 8859-7 (1987) to Unicode
#	Unicode version:  1.1
#	Table version:    0.1
#	Name:             ISO 8859-7:1987 to Unicode
#	Unicode version:  3.0
#	Table version:    1.0
#	Table format:     Format A
#	Date:             16 January 1995
#	Authors:          Tim Greenwood <greenwood@r2me2.enet.dec.com>
#	Date:             1999 July 27
#	Authors:          Ken Whistler <kenw@sybase.com>
#                     John H. Jenkins <John_Jenkins@taligent.com>
#
#	Copyright (c) 1991-1995 Unicode, Inc.  All Rights reserved.
#	Copyright (c) 1991-1999 Unicode, Inc.  All Rights reserved.
#
#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
#	No claims are made as to fitness for any particular purpose.  No
#	warranties of any kind are expressed or implied.  The recipient
#	agrees to determine applicability of information provided.  If this
#	file has been provided on magnetic media by Unicode, Inc., the sole
#	file has been provided on optical media by Unicode, Inc., the sole
#	remedy for any claim will be exchange of defective media within 90
#	days of receipt.
#
#	Recipient is granted the right to make copies in any form for
#	internal distribution and to freely use the information supplied
#	in the creation of products supporting Unicode.  Unicode, Inc.
#	specifically excludes the right to re-distribute this file directly
#	to third parties or other organizations whether for profit or not.
#	Unicode, Inc. hereby grants the right to freely use the information
#	supplied in this file in the creation of products supporting the
#	Unicode Standard, and to make copies of this file in any form for
#	internal or external distribution as long as this notice remains
#	attached.
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       ISO 8859-7 (1987) characters map into Unicode.
#       ISO 8859-7:1987 characters map into Unicode.
#
#	ISO 8859-7:1987 is equivalent to ISO-IR-126, ELOT 928,
#	and ECMA 118.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the ISO 8859-7 code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in ISO 8859-7 order
#	The entries are in ISO 8859-7 order.
#
#	Version history
#	1.0 version updates 0.1 version by adding mappings for all
#	control characters.
#	Remap 0xA1 to U+2018 (instead of 0x02BD) to match text of 8859-7
#	Remap 0xA2 to U+2019 (instead of 0x02BC) to match text of 8859-7
#
#	Updated versions of this file may be found in:
#		<ftp://ftp.unicode.org/Public/MAPPINGS/>
#
#	Any comments or problems, contact <John_Jenkins@taligent.com>
#	Any comments or problems, contact <errata@unicode.org>
#	Please note that <errata@unicode.org> is an archival address;
#	notices will be checked, but do not expect an immediate response.
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
128
129
130
131
132
133
134

































135
136
137


138
139
140
141
142
143
144
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

-
-
+
+







0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x0080	#	<control>
0x81	0x0081	#	<control>
0x82	0x0082	#	<control>
0x83	0x0083	#	<control>
0x84	0x0084	#	<control>
0x85	0x0085	#	<control>
0x86	0x0086	#	<control>
0x87	0x0087	#	<control>
0x88	0x0088	#	<control>
0x89	0x0089	#	<control>
0x8A	0x008A	#	<control>
0x8B	0x008B	#	<control>
0x8C	0x008C	#	<control>
0x8D	0x008D	#	<control>
0x8E	0x008E	#	<control>
0x8F	0x008F	#	<control>
0x90	0x0090	#	<control>
0x91	0x0091	#	<control>
0x92	0x0092	#	<control>
0x93	0x0093	#	<control>
0x94	0x0094	#	<control>
0x95	0x0095	#	<control>
0x96	0x0096	#	<control>
0x97	0x0097	#	<control>
0x98	0x0098	#	<control>
0x99	0x0099	#	<control>
0x9A	0x009A	#	<control>
0x9B	0x009B	#	<control>
0x9C	0x009C	#	<control>
0x9D	0x009D	#	<control>
0x9E	0x009E	#	<control>
0x9F	0x009F	#	<control>
0xA0	0x00A0	#	NO-BREAK SPACE
0xA1	0x02BD	#	MODIFIER LETTER REVERSED COMMA
0xA2	0x02BC	#	MODIFIER LETTER APOSTROPHE
0xA1	0x2018	#	LEFT SINGLE QUOTATION MARK
0xA2	0x2019	#	RIGHT SINGLE QUOTATION MARK
0xA3	0x00A3	#	POUND SIGN
0xA6	0x00A6	#	BROKEN BAR
0xA7	0x00A7	#	SECTION SIGN
0xA8	0x00A8	#	DIAERESIS
0xA9	0x00A9	#	COPYRIGHT SIGN
0xAB	0x00AB	#	LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xAC	0x00AC	#	NOT SIGN
Changes to tools/encoding/iso8859-8.txt.
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
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

-
-
-
+
+
+

-
-
+
+
-

-
+





-
+



-
-
-
-
-
+
+
+
+
+




-
+


-
+



-
+

+
+
+
+
+
+
+
+
+
-
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







#
#	Name:             ISO 8859-8 (1988) to Unicode
#	Unicode version:  1.1
#	Table version:    0.1
#	Name:             ISO/IEC 8859-8:1999 to Unicode
#	Unicode version:  3.0
#	Table version:    1.1
#	Table format:     Format A
#	Date:             16 January 1995
#	Authors:          Tim Greenwood <greenwood@r2me2.enet.dec.com>
#	Date:             2000-Jan-03
#	Authors:          Ken Whistler <kenw@sybase.com>
#                     John H. Jenkins <John_Jenkins@taligent.com>
#
#	Copyright (c) 1991-1995 Unicode, Inc.  All Rights reserved.
#	Copyright (c) 1991-1999 Unicode, Inc.  All Rights reserved.
#
#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
#	No claims are made as to fitness for any particular purpose.  No
#	warranties of any kind are expressed or implied.  The recipient
#	agrees to determine applicability of information provided.  If this
#	file has been provided on magnetic media by Unicode, Inc., the sole
#	file has been provided on optical media by Unicode, Inc., the sole
#	remedy for any claim will be exchange of defective media within 90
#	days of receipt.
#
#	Recipient is granted the right to make copies in any form for
#	internal distribution and to freely use the information supplied
#	in the creation of products supporting Unicode.  Unicode, Inc.
#	specifically excludes the right to re-distribute this file directly
#	to third parties or other organizations whether for profit or not.
#	Unicode, Inc. hereby grants the right to freely use the information
#	supplied in this file in the creation of products supporting the
#	Unicode Standard, and to make copies of this file in any form for
#	internal or external distribution as long as this notice remains
#	attached.
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       ISO 8859-8 (1988) characters map into Unicode.
#       ISO/IEC 8859-8:1999 characters map into Unicode.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the ISO 8859-8 code (in hex as 0xXX)
#		 Column #1 is the ISO/IEC 8859-8 code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in ISO 8859-8 order
#	The entries are in ISO/IEC 8859-8 order.
#
#	Version history
#	1.0 version updates 0.1 version by adding mappings for all
#	control characters.
#       1.1 version updates to the published 8859-8:1999, correcting
#          the mapping of 0xAF and adding mappings for LRM and RLM.
#
#	Updated versions of this file may be found in:
#		<ftp://ftp.unicode.org/Public/MAPPINGS/>
#
#	Any comments or problems, contact <John_Jenkins@taligent.com>
#	Any comments or problems, contact <errata@unicode.org>
#	Please note that <errata@unicode.org> is an archival address;
#	notices will be checked, but do not expect an immediate response.
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
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
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+














-
+







0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x0080	#	<control>
0x81	0x0081	#	<control>
0x82	0x0082	#	<control>
0x83	0x0083	#	<control>
0x84	0x0084	#	<control>
0x85	0x0085	#	<control>
0x86	0x0086	#	<control>
0x87	0x0087	#	<control>
0x88	0x0088	#	<control>
0x89	0x0089	#	<control>
0x8A	0x008A	#	<control>
0x8B	0x008B	#	<control>
0x8C	0x008C	#	<control>
0x8D	0x008D	#	<control>
0x8E	0x008E	#	<control>
0x8F	0x008F	#	<control>
0x90	0x0090	#	<control>
0x91	0x0091	#	<control>
0x92	0x0092	#	<control>
0x93	0x0093	#	<control>
0x94	0x0094	#	<control>
0x95	0x0095	#	<control>
0x96	0x0096	#	<control>
0x97	0x0097	#	<control>
0x98	0x0098	#	<control>
0x99	0x0099	#	<control>
0x9A	0x009A	#	<control>
0x9B	0x009B	#	<control>
0x9C	0x009C	#	<control>
0x9D	0x009D	#	<control>
0x9E	0x009E	#	<control>
0x9F	0x009F	#	<control>
0xA0	0x00A0	#	NO-BREAK SPACE
0xA2	0x00A2	#	CENT SIGN
0xA3	0x00A3	#	POUND SIGN
0xA4	0x00A4	#	CURRENCY SIGN
0xA5	0x00A5	#	YEN SIGN
0xA6	0x00A6	#	BROKEN BAR
0xA7	0x00A7	#	SECTION SIGN
0xA8	0x00A8	#	DIAERESIS
0xA9	0x00A9	#	COPYRIGHT SIGN
0xAA	0x00D7	#	MULTIPLICATION SIGN
0xAB	0x00AB	#	LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0xAC	0x00AC	#	NOT SIGN
0xAD	0x00AD	#	SOFT HYPHEN
0xAE	0x00AE	#	REGISTERED SIGN
0xAF	0x203E	#	OVERLINE
0xAF	0x00AF	#	MACRON
0xB0	0x00B0	#	DEGREE SIGN
0xB1	0x00B1	#	PLUS-MINUS SIGN
0xB2	0x00B2	#	SUPERSCRIPT TWO
0xB3	0x00B3	#	SUPERSCRIPT THREE
0xB4	0x00B4	#	ACUTE ACCENT
0xB5	0x00B5	#	MICRO SIGN
0xB6	0x00B6	#	PILCROW SIGN
186
187
188
189
190
191
192



261
262
263
264
265
266
267
268
269
270







+
+
+
0xF4	0x05E4	#	HEBREW LETTER PE
0xF5	0x05E5	#	HEBREW LETTER FINAL TSADI
0xF6	0x05E6	#	HEBREW LETTER TSADI
0xF7	0x05E7	#	HEBREW LETTER QOF
0xF8	0x05E8	#	HEBREW LETTER RESH
0xF9	0x05E9	#	HEBREW LETTER SHIN
0xFA	0x05EA	#	HEBREW LETTER TAV
0xFD	0x200E	#	LEFT-TO-RIGHT MARK
0xFE	0x200F	#	RIGHT-TO-LEFT MARK

Changes to tools/encoding/iso8859-9.txt.
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
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

-
-
-
+
+
+

-
-
+
+
-

-
+









-
-
-
-
-
+
+
+
+
+




-
+


-
+



-
+

+
+
+
+
+
+
+
+
+
-
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







#
#	Name:             ISO 8859-9 (1989) to Unicode
#	Unicode version:  1.1
#	Table version:    0.1
#	Name:             ISO/IEC 8859-9:1999 to Unicode
#	Unicode version:  3.0
#	Table version:    1.0
#	Table format:     Format A
#	Date:             16 January 1995
#	Authors:          Tim Greenwood <greenwood@r2me2.enet.dec.com>
#	Date:             1999 July 27
#	Authors:          Ken Whistler <kenw@sybase.com>
#                     John H. Jenkins <John_Jenkins@taligent.com>
#
#	Copyright (c) 1991-1995 Unicode, Inc.  All Rights reserved.
#	Copyright (c) 1991-1999 Unicode, Inc.  All Rights reserved.
#
#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
#	No claims are made as to fitness for any particular purpose.  No
#	warranties of any kind are expressed or implied.  The recipient
#	agrees to determine applicability of information provided.  If this
#	file has been provided on magnetic media by Unicode, Inc., the sole
#	remedy for any claim will be exchange of defective media within 90
#	days of receipt.
#
#	Recipient is granted the right to make copies in any form for
#	internal distribution and to freely use the information supplied
#	in the creation of products supporting Unicode.  Unicode, Inc.
#	specifically excludes the right to re-distribute this file directly
#	to third parties or other organizations whether for profit or not.
#	Unicode, Inc. hereby grants the right to freely use the information
#	supplied in this file in the creation of products supporting the
#	Unicode Standard, and to make copies of this file in any form for
#	internal or external distribution as long as this notice remains
#	attached.
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       ISO 8859-9 (1989) characters map into Unicode.
#       ISO/IEC 8859-9:1999 characters map into Unicode.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the ISO 8859-9 code (in hex as 0xXX)
#		 Column #1 is the ISO/IEC 8859-9 code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
#	The entries are in ISO 8859-9 order
#	The entries are in ISO/IEC 8859-9 order.
#
#	ISO/IEC 8859-9 is also equivalent to ISO-IR-148.
#
#	Version history
#	1.0 version updates 0.1 version by adding mappings for all
#	control characters.
#
#	Updated versions of this file may be found in:
#		<ftp://ftp.unicode.org/Public/MAPPINGS/>
#
#	Any comments or problems, contact <John_Jenkins@taligent.com>
#	Any comments or problems, contact <errata@unicode.org>
#	Please note that <errata@unicode.org> is an archival address;
#	notices will be checked, but do not expect an immediate response.
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
128
129
130
131
132
133
134

































135
136
137
138
139
140
141
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x0080	#	<control>
0x81	0x0081	#	<control>
0x82	0x0082	#	<control>
0x83	0x0083	#	<control>
0x84	0x0084	#	<control>
0x85	0x0085	#	<control>
0x86	0x0086	#	<control>
0x87	0x0087	#	<control>
0x88	0x0088	#	<control>
0x89	0x0089	#	<control>
0x8A	0x008A	#	<control>
0x8B	0x008B	#	<control>
0x8C	0x008C	#	<control>
0x8D	0x008D	#	<control>
0x8E	0x008E	#	<control>
0x8F	0x008F	#	<control>
0x90	0x0090	#	<control>
0x91	0x0091	#	<control>
0x92	0x0092	#	<control>
0x93	0x0093	#	<control>
0x94	0x0094	#	<control>
0x95	0x0095	#	<control>
0x96	0x0096	#	<control>
0x97	0x0097	#	<control>
0x98	0x0098	#	<control>
0x99	0x0099	#	<control>
0x9A	0x009A	#	<control>
0x9B	0x009B	#	<control>
0x9C	0x009C	#	<control>
0x9D	0x009D	#	<control>
0x9E	0x009E	#	<control>
0x9F	0x009F	#	<control>
0xA0	0x00A0	#	NO-BREAK SPACE
0xA1	0x00A1	#	INVERTED EXCLAMATION MARK
0xA2	0x00A2	#	CENT SIGN
0xA3	0x00A3	#	POUND SIGN
0xA4	0x00A4	#	CURRENCY SIGN
0xA5	0x00A5	#	YEN SIGN
0xA6	0x00A6	#	BROKEN BAR
Changes to tools/encoding/koi8-r.txt.

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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268





































































































































































































































































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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
+
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+

-
+

+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#
# KOI8-R
#	Name:             KOI8-R (RFC1489) to Unicode
#  source: RFC1489 via Gabor Kiss <kissg@sztaki.hu>
#  and Andrey A. Chernov <ache@astral.msk.su>
#	Unicode version:  3.0
#	Table version:    1.0
#	Table format:     Format A
#	Date:             18 August 1999
#	Authors:          Helmut Richter <richter@lrz.de>
#
#	Copyright (c) 1991-1999 Unicode, Inc.  All Rights reserved.
#
#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
#	No claims are made as to fitness for any particular purpose.  No
#	warranties of any kind are expressed or implied.  The recipient
#	agrees to determine applicability of information provided.  If this
#	file has been provided on optical media by Unicode, Inc., the sole
#	remedy for any claim will be exchange of defective media within 90
#	days of receipt.
#
#	Unicode, Inc. hereby grants the right to freely use the information
#	supplied in this file in the creation of products supporting the
#	Unicode Standard, and to make copies of this file in any form for
#	internal or external distribution as long as this notice remains
#	attached.
#
#	General notes:
#
#	This table contains the data the Unicode Consortium has on how
#       KOI8-R characters map into Unicode. The underlying document is the
#	mapping described in RFC 1489. No statements are made as to whether
#	this mapping is the same as the mapping defined as "Code Page 878"
#	with some vendors.
#
# Format:  Three tab-separated columns
#   Column #1 is the KOI8-R code (in hex as 0xXX)
#   Column #2 is the Unicode (in hex as 0xXXXX)
#   Column #3 the Unicode name (follows a comment sign, '#')
#	Format:  Three tab-separated columns
#		 Column #1 is the KOI8-R code (in hex as 0xXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#
# The entries are in KOI8-R order
#	The entries are in KOI8-R order.
#
#	Version history
#	1.0 version: created.

0x00 0x0000 # NULL
0x01 0x0001 # START OF HEADING
0x02 0x0002 # START OF TEXT
0x03 0x0003 # END OF TEXT
0x04 0x0004 # END OF TRANSMISSION
0x05 0x0005 # ENQUIRY
0x06 0x0006 # ACKNOWLEDGE
0x07 0x0007 # BELL
0x08 0x0008 # BACKSPACE
0x09 0x0009 # HORIZONTAL TABULATION
0x0A 0x000A # LINE FEED
0x0B 0x000B # VERTICAL TABULATION
0x0C 0x000C # FORM FEED
0x0D 0x000D # CARRIAGE RETURN
0x0E 0x000E # SHIFT OUT
0x0F 0x000F # SHIFT IN
0x10 0x0010 # DATA LINK ESCAPE
0x11 0x0011 # DEVICE CONTROL ONE
0x12 0x0012 # DEVICE CONTROL TWO
0x13 0x0013 # DEVICE CONTROL THREE
0x14 0x0014 # DEVICE CONTROL FOUR
0x15 0x0015 # NEGATIVE ACKNOWLEDGE
0x16 0x0016 # SYNCHRONOUS IDLE
0x17 0x0017 # END OF TRANSMISSION BLOCK
0x18 0x0018 # CANCEL
0x19 0x0019 # END OF MEDIUM
0x1A 0x001A # SUBSTITUTE
0x1B 0x001B # ESCAPE
0x1C 0x001C # FILE SEPARATOR
0x1D 0x001D # GROUP SEPARATOR
0x1E 0x001E # RECORD SEPARATOR
0x1F 0x001F # UNIT SEPARATOR
0x20 0x0020 # SPACE
0x21 0x0021 # EXCLAMATION MARK
0x22 0x0022 # QUOTATION MARK
0x23 0x0023 # NUMBER SIGN
0x24 0x0024 # DOLLAR SIGN
0x25 0x0025 # PERCENT SIGN
0x26 0x0026 # AMPERSAND
0x27 0x0027 # APOSTROPHE
0x28 0x0028 # LEFT PARENTHESIS
0x29 0x0029 # RIGHT PARENTHESIS
0x2A 0x002A # ASTERISK
0x2B 0x002B # PLUS SIGN
0x2C 0x002C # COMMA
0x2D 0x002D # HYPHEN-MINUS
0x2E 0x002E # FULL STOP
0x2F 0x002F # SOLIDUS
0x30 0x0030 # DIGIT ZERO
0x31 0x0031 # DIGIT ONE
0x32 0x0032 # DIGIT TWO
0x33 0x0033 # DIGIT THREE
0x34 0x0034 # DIGIT FOUR
0x35 0x0035 # DIGIT FIVE
0x36 0x0036 # DIGIT SIX
0x37 0x0037 # DIGIT SEVEN
0x38 0x0038 # DIGIT EIGHT
0x39 0x0039 # DIGIT NINE
0x3A 0x003A # COLON
0x3B 0x003B # SEMICOLON
0x3C 0x003C # LESS-THAN SIGN
0x3D 0x003D # EQUALS SIGN
0x3E 0x003E # GREATER-THAN SIGN
0x3F 0x003F # QUESTION MARK
0x40 0x0040 # COMMERCIAL AT
0x41 0x0041 # LATIN CAPITAL LETTER A
0x42 0x0042 # LATIN CAPITAL LETTER B
0x43 0x0043 # LATIN CAPITAL LETTER C
0x44 0x0044 # LATIN CAPITAL LETTER D
0x45 0x0045 # LATIN CAPITAL LETTER E
0x46 0x0046 # LATIN CAPITAL LETTER F
0x47 0x0047 # LATIN CAPITAL LETTER G
0x48 0x0048 # LATIN CAPITAL LETTER H
0x49 0x0049 # LATIN CAPITAL LETTER I
0x4A 0x004A # LATIN CAPITAL LETTER J
0x4B 0x004B # LATIN CAPITAL LETTER K
0x4C 0x004C # LATIN CAPITAL LETTER L
0x4D 0x004D # LATIN CAPITAL LETTER M
0x4E 0x004E # LATIN CAPITAL LETTER N
0x4F 0x004F # LATIN CAPITAL LETTER O
0x50 0x0050 # LATIN CAPITAL LETTER P
0x51 0x0051 # LATIN CAPITAL LETTER Q
0x52 0x0052 # LATIN CAPITAL LETTER R
0x53 0x0053 # LATIN CAPITAL LETTER S
0x54 0x0054 # LATIN CAPITAL LETTER T
0x55 0x0055 # LATIN CAPITAL LETTER U
0x56 0x0056 # LATIN CAPITAL LETTER V
0x57 0x0057 # LATIN CAPITAL LETTER W
0x58 0x0058 # LATIN CAPITAL LETTER X
0x59 0x0059 # LATIN CAPITAL LETTER Y
0x5A 0x005A # LATIN CAPITAL LETTER Z
0x5B 0x005B # LEFT SQUARE BRACKET
0x5C 0x005C # REVERSE SOLIDUS
0x5D 0x005D # RIGHT SQUARE BRACKET
0x5E 0x005E # CIRCUMFLEX ACCENT
0x5F 0x005F # LOW LINE
0x60 0x0060 # GRAVE ACCENT
0x61 0x0061 # LATIN SMALL LETTER A
0x62 0x0062 # LATIN SMALL LETTER B
0x63 0x0063 # LATIN SMALL LETTER C
0x64 0x0064 # LATIN SMALL LETTER D
0x65 0x0065 # LATIN SMALL LETTER E
0x66 0x0066 # LATIN SMALL LETTER F
0x67 0x0067 # LATIN SMALL LETTER G
0x68 0x0068 # LATIN SMALL LETTER H
0x69 0x0069 # LATIN SMALL LETTER I
0x6A 0x006A # LATIN SMALL LETTER J
0x6B 0x006B # LATIN SMALL LETTER K
0x6C 0x006C # LATIN SMALL LETTER L
0x6D 0x006D # LATIN SMALL LETTER M
0x6E 0x006E # LATIN SMALL LETTER N
0x6F 0x006F # LATIN SMALL LETTER O
0x70 0x0070 # LATIN SMALL LETTER P
0x71 0x0071 # LATIN SMALL LETTER Q
0x72 0x0072 # LATIN SMALL LETTER R
0x73 0x0073 # LATIN SMALL LETTER S
0x74 0x0074 # LATIN SMALL LETTER T
0x75 0x0075 # LATIN SMALL LETTER U
0x76 0x0076 # LATIN SMALL LETTER V
0x77 0x0077 # LATIN SMALL LETTER W
0x78 0x0078 # LATIN SMALL LETTER X
0x79 0x0079 # LATIN SMALL LETTER Y
0x7A 0x007A # LATIN SMALL LETTER Z
0x7B 0x007B # LEFT CURLY BRACKET
0x7C 0x007C # VERTICAL LINE
0x7D 0x007D # RIGHT CURLY BRACKET
0x7E 0x007E # TILDE
0x7F 0x007F # DELETE
0x80 0x2500 # BOX DRAWINGS LIGHT HORIZONTAL
0x81 0x2502 # BOX DRAWINGS LIGHT VERTICAL
0x82 0x250C # BOX DRAWINGS LIGHT DOWN AND RIGHT
0x83 0x2510 # BOX DRAWINGS LIGHT DOWN AND LEFT
0x84 0x2514 # BOX DRAWINGS LIGHT UP AND RIGHT
0x85 0x2518 # BOX DRAWINGS LIGHT UP AND LEFT
0x86 0x251C # BOX DRAWINGS LIGHT VERTICAL AND RIGHT
0x87 0x2524 # BOX DRAWINGS LIGHT VERTICAL AND LEFT
0x88 0x252C # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
0x89 0x2534 # BOX DRAWINGS LIGHT UP AND HORIZONTAL
0x8A 0x253C # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
0x8B 0x2580 # UPPER HALF BLOCK
0x8C 0x2584 # LOWER HALF BLOCK
0x8D 0x2588 # FULL BLOCK
0x8E 0x258C # LEFT HALF BLOCK
0x8F 0x2590 # RIGHT HALF BLOCK
0x90 0x2591 # LIGHT SHADE
0x91 0x2592 # MEDIUM SHADE
0x92 0x2593 # DARK SHADE
0x93 0x2320 # TOP HALF INTEGRAL
0x94 0x25A0 # BLACK SQUARE
0x95 0x2219 # BULLET OPERATOR
0x96 0x221A # SQUARE ROOT
0x97 0x2248 # ALMOST EQUAL TO
0x98 0x2264 # LESS-THAN OR EQUAL TO
0x99 0x2265 # GREATER-THAN OR EQUAL TO
0x9A 0x00A0 # NO-BREAK SPACE
0x9B 0x2321 # BOTTOM HALF INTEGRAL
0x9C 0x00B0 # DEGREE SIGN
0x9D 0x00B2 # SUPERSCRIPT TWO
0x9E 0x00B7 # MIDDLE DOT
0x9F 0x00F7 # DIVISION SIGN
0xA0 0x2550 # BOX DRAWINGS DOUBLE HORIZONTAL
0xA1 0x2551 # BOX DRAWINGS DOUBLE VERTICAL
0xA2 0x2552 # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
0xA3 0x0451 # CYRILLIC SMALL LETTER IO
0xA4 0x2553 # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
0xA5 0x2554 # BOX DRAWINGS DOUBLE DOWN AND RIGHT
0xA6 0x2555 # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
0xA7 0x2556 # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
0xA8 0x2557 # BOX DRAWINGS DOUBLE DOWN AND LEFT
0xA9 0x2558 # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
0xAA 0x2559 # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
0xAB 0x255A # BOX DRAWINGS DOUBLE UP AND RIGHT
0xAC 0x255B # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
0xAD 0x255C # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
0xAE 0x255D # BOX DRAWINGS DOUBLE UP AND LEFT
0xAF 0x255E # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
0xB0 0x255F # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
0xB1 0x2560 # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
0xB2 0x2561 # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
0xB3 0x0401 # CYRILLIC CAPITAL LETTER IO
0xB4 0x2562 # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
0xB5 0x2563 # BOX DRAWINGS DOUBLE VERTICAL AND LEFT
0xB6 0x2564 # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
0xB7 0x2565 # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
0xB8 0x2566 # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
0xB9 0x2567 # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
0xBA 0x2568 # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
0xBB 0x2569 # BOX DRAWINGS DOUBLE UP AND HORIZONTAL
0xBC 0x256A # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
0xBD 0x256B # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
0xBE 0x256C # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
0xBF 0x00A9 # COPYRIGHT SIGN
0xC0 0x044E # CYRILLIC SMALL LETTER YU
0xC1 0x0430 # CYRILLIC SMALL LETTER A
0xC2 0x0431 # CYRILLIC SMALL LETTER BE
0xC3 0x0446 # CYRILLIC SMALL LETTER TSE
0xC4 0x0434 # CYRILLIC SMALL LETTER DE
0xC5 0x0435 # CYRILLIC SMALL LETTER IE
0xC6 0x0444 # CYRILLIC SMALL LETTER EF
0xC7 0x0433 # CYRILLIC SMALL LETTER GHE
0xC8 0x0445 # CYRILLIC SMALL LETTER HA
0xC9 0x0438 # CYRILLIC SMALL LETTER I
0xCA 0x0439 # CYRILLIC SMALL LETTER SHORT I
0xCB 0x043A # CYRILLIC SMALL LETTER KA
0xCC 0x043B # CYRILLIC SMALL LETTER EL
0xCD 0x043C # CYRILLIC SMALL LETTER EM
0xCE 0x043D # CYRILLIC SMALL LETTER EN
0xCF 0x043E # CYRILLIC SMALL LETTER O
0xD0 0x043F # CYRILLIC SMALL LETTER PE
0xD1 0x044F # CYRILLIC SMALL LETTER YA
0xD2 0x0440 # CYRILLIC SMALL LETTER ER
0xD3 0x0441 # CYRILLIC SMALL LETTER ES
0xD4 0x0442 # CYRILLIC SMALL LETTER TE
0xD5 0x0443 # CYRILLIC SMALL LETTER U
0xD6 0x0436 # CYRILLIC SMALL LETTER ZHE
0xD7 0x0432 # CYRILLIC SMALL LETTER VE
0xD8 0x044C # CYRILLIC SMALL LETTER SOFT SIGN
0xD9 0x044B # CYRILLIC SMALL LETTER YERU
0xDA 0x0437 # CYRILLIC SMALL LETTER ZE
0xDB 0x0448 # CYRILLIC SMALL LETTER SHA
0xDC 0x044D # CYRILLIC SMALL LETTER E
0xDD 0x0449 # CYRILLIC SMALL LETTER SHCHA
0xDE 0x0447 # CYRILLIC SMALL LETTER CHE
0xDF 0x044A # CYRILLIC SMALL LETTER HARD SIGN
0xE0 0x042E # CYRILLIC CAPITAL LETTER YU
0xE1 0x0410 # CYRILLIC CAPITAL LETTER A
0xE2 0x0411 # CYRILLIC CAPITAL LETTER BE
0xE3 0x0426 # CYRILLIC CAPITAL LETTER TSE
0xE4 0x0414 # CYRILLIC CAPITAL LETTER DE
0xE5 0x0415 # CYRILLIC CAPITAL LETTER IE
0xE6 0x0424 # CYRILLIC CAPITAL LETTER EF
0xE7 0x0413 # CYRILLIC CAPITAL LETTER GHE
0xE8 0x0425 # CYRILLIC CAPITAL LETTER HA
0xE9 0x0418 # CYRILLIC CAPITAL LETTER I
0xEA 0x0419 # CYRILLIC CAPITAL LETTER SHORT I
0xEB 0x041A # CYRILLIC CAPITAL LETTER KA
0xEC 0x041B # CYRILLIC CAPITAL LETTER EL
0xED 0x041C # CYRILLIC CAPITAL LETTER EM
0xEE 0x041D # CYRILLIC CAPITAL LETTER EN
0xEF 0x041E # CYRILLIC CAPITAL LETTER O
0xF0 0x041F # CYRILLIC CAPITAL LETTER PE
0xF1 0x042F # CYRILLIC CAPITAL LETTER YA
0xF2 0x0420 # CYRILLIC CAPITAL LETTER ER
0xF3 0x0421 # CYRILLIC CAPITAL LETTER ES
0xF4 0x0422 # CYRILLIC CAPITAL LETTER TE
0xF5 0x0423 # CYRILLIC CAPITAL LETTER U
0xF6 0x0416 # CYRILLIC CAPITAL LETTER ZHE
0xF7 0x0412 # CYRILLIC CAPITAL LETTER VE
0xF8 0x042C # CYRILLIC CAPITAL LETTER SOFT SIGN
0xF9 0x042B # CYRILLIC CAPITAL LETTER YERU
0xFA 0x0417 # CYRILLIC CAPITAL LETTER ZE
0xFB 0x0428 # CYRILLIC CAPITAL LETTER SHA
0xFC 0x042D # CYRILLIC CAPITAL LETTER E
0xFD 0x0429 # CYRILLIC CAPITAL LETTER SHCHA
0xFE 0x0427 # CYRILLIC CAPITAL LETTER CHE
0xFF 0x042A # CYRILLIC CAPITAL LETTER HARD SIGN
#
#	Any comments or problems, contact <errata@unicode.org>
#	Please note that <errata@unicode.org> is an archival address;
#	notices will be checked, but do not expect an immediate response.
#
0x00	0x0000	#	NULL
0x01	0x0001	#	START OF HEADING
0x02	0x0002	#	START OF TEXT
0x03	0x0003	#	END OF TEXT
0x04	0x0004	#	END OF TRANSMISSION
0x05	0x0005	#	ENQUIRY
0x06	0x0006	#	ACKNOWLEDGE
0x07	0x0007	#	BELL
0x08	0x0008	#	BACKSPACE
0x09	0x0009	#	HORIZONTAL TABULATION
0x0A	0x000A	#	LINE FEED
0x0B	0x000B	#	VERTICAL TABULATION
0x0C	0x000C	#	FORM FEED
0x0D	0x000D	#	CARRIAGE RETURN
0x0E	0x000E	#	SHIFT OUT
0x0F	0x000F	#	SHIFT IN
0x10	0x0010	#	DATA LINK ESCAPE
0x11	0x0011	#	DEVICE CONTROL ONE
0x12	0x0012	#	DEVICE CONTROL TWO
0x13	0x0013	#	DEVICE CONTROL THREE
0x14	0x0014	#	DEVICE CONTROL FOUR
0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
0x16	0x0016	#	SYNCHRONOUS IDLE
0x17	0x0017	#	END OF TRANSMISSION BLOCK
0x18	0x0018	#	CANCEL
0x19	0x0019	#	END OF MEDIUM
0x1A	0x001A	#	SUBSTITUTE
0x1B	0x001B	#	ESCAPE
0x1C	0x001C	#	FILE SEPARATOR
0x1D	0x001D	#	GROUP SEPARATOR
0x1E	0x001E	#	RECORD SEPARATOR
0x1F	0x001F	#	UNIT SEPARATOR
0x20	0x0020	#	SPACE
0x21	0x0021	#	EXCLAMATION MARK
0x22	0x0022	#	QUOTATION MARK
0x23	0x0023	#	NUMBER SIGN
0x24	0x0024	#	DOLLAR SIGN
0x25	0x0025	#	PERCENT SIGN
0x26	0x0026	#	AMPERSAND
0x27	0x0027	#	APOSTROPHE
0x28	0x0028	#	LEFT PARENTHESIS
0x29	0x0029	#	RIGHT PARENTHESIS
0x2A	0x002A	#	ASTERISK
0x2B	0x002B	#	PLUS SIGN
0x2C	0x002C	#	COMMA
0x2D	0x002D	#	HYPHEN-MINUS
0x2E	0x002E	#	FULL STOP
0x2F	0x002F	#	SOLIDUS
0x30	0x0030	#	DIGIT ZERO
0x31	0x0031	#	DIGIT ONE
0x32	0x0032	#	DIGIT TWO
0x33	0x0033	#	DIGIT THREE
0x34	0x0034	#	DIGIT FOUR
0x35	0x0035	#	DIGIT FIVE
0x36	0x0036	#	DIGIT SIX
0x37	0x0037	#	DIGIT SEVEN
0x38	0x0038	#	DIGIT EIGHT
0x39	0x0039	#	DIGIT NINE
0x3A	0x003A	#	COLON
0x3B	0x003B	#	SEMICOLON
0x3C	0x003C	#	LESS-THAN SIGN
0x3D	0x003D	#	EQUALS SIGN
0x3E	0x003E	#	GREATER-THAN SIGN
0x3F	0x003F	#	QUESTION MARK
0x40	0x0040	#	COMMERCIAL AT
0x41	0x0041	#	LATIN CAPITAL LETTER A
0x42	0x0042	#	LATIN CAPITAL LETTER B
0x43	0x0043	#	LATIN CAPITAL LETTER C
0x44	0x0044	#	LATIN CAPITAL LETTER D
0x45	0x0045	#	LATIN CAPITAL LETTER E
0x46	0x0046	#	LATIN CAPITAL LETTER F
0x47	0x0047	#	LATIN CAPITAL LETTER G
0x48	0x0048	#	LATIN CAPITAL LETTER H
0x49	0x0049	#	LATIN CAPITAL LETTER I
0x4A	0x004A	#	LATIN CAPITAL LETTER J
0x4B	0x004B	#	LATIN CAPITAL LETTER K
0x4C	0x004C	#	LATIN CAPITAL LETTER L
0x4D	0x004D	#	LATIN CAPITAL LETTER M
0x4E	0x004E	#	LATIN CAPITAL LETTER N
0x4F	0x004F	#	LATIN CAPITAL LETTER O
0x50	0x0050	#	LATIN CAPITAL LETTER P
0x51	0x0051	#	LATIN CAPITAL LETTER Q
0x52	0x0052	#	LATIN CAPITAL LETTER R
0x53	0x0053	#	LATIN CAPITAL LETTER S
0x54	0x0054	#	LATIN CAPITAL LETTER T
0x55	0x0055	#	LATIN CAPITAL LETTER U
0x56	0x0056	#	LATIN CAPITAL LETTER V
0x57	0x0057	#	LATIN CAPITAL LETTER W
0x58	0x0058	#	LATIN CAPITAL LETTER X
0x59	0x0059	#	LATIN CAPITAL LETTER Y
0x5A	0x005A	#	LATIN CAPITAL LETTER Z
0x5B	0x005B	#	LEFT SQUARE BRACKET
0x5C	0x005C	#	REVERSE SOLIDUS
0x5D	0x005D	#	RIGHT SQUARE BRACKET
0x5E	0x005E	#	CIRCUMFLEX ACCENT
0x5F	0x005F	#	LOW LINE
0x60	0x0060	#	GRAVE ACCENT
0x61	0x0061	#	LATIN SMALL LETTER A
0x62	0x0062	#	LATIN SMALL LETTER B
0x63	0x0063	#	LATIN SMALL LETTER C
0x64	0x0064	#	LATIN SMALL LETTER D
0x65	0x0065	#	LATIN SMALL LETTER E
0x66	0x0066	#	LATIN SMALL LETTER F
0x67	0x0067	#	LATIN SMALL LETTER G
0x68	0x0068	#	LATIN SMALL LETTER H
0x69	0x0069	#	LATIN SMALL LETTER I
0x6A	0x006A	#	LATIN SMALL LETTER J
0x6B	0x006B	#	LATIN SMALL LETTER K
0x6C	0x006C	#	LATIN SMALL LETTER L
0x6D	0x006D	#	LATIN SMALL LETTER M
0x6E	0x006E	#	LATIN SMALL LETTER N
0x6F	0x006F	#	LATIN SMALL LETTER O
0x70	0x0070	#	LATIN SMALL LETTER P
0x71	0x0071	#	LATIN SMALL LETTER Q
0x72	0x0072	#	LATIN SMALL LETTER R
0x73	0x0073	#	LATIN SMALL LETTER S
0x74	0x0074	#	LATIN SMALL LETTER T
0x75	0x0075	#	LATIN SMALL LETTER U
0x76	0x0076	#	LATIN SMALL LETTER V
0x77	0x0077	#	LATIN SMALL LETTER W
0x78	0x0078	#	LATIN SMALL LETTER X
0x79	0x0079	#	LATIN SMALL LETTER Y
0x7A	0x007A	#	LATIN SMALL LETTER Z
0x7B	0x007B	#	LEFT CURLY BRACKET
0x7C	0x007C	#	VERTICAL LINE
0x7D	0x007D	#	RIGHT CURLY BRACKET
0x7E	0x007E	#	TILDE
0x7F	0x007F	#	DELETE
0x80	0x2500	#	BOX DRAWINGS LIGHT HORIZONTAL
0x81	0x2502	#	BOX DRAWINGS LIGHT VERTICAL
0x82	0x250C	#	BOX DRAWINGS LIGHT DOWN AND RIGHT
0x83	0x2510	#	BOX DRAWINGS LIGHT DOWN AND LEFT
0x84	0x2514	#	BOX DRAWINGS LIGHT UP AND RIGHT
0x85	0x2518	#	BOX DRAWINGS LIGHT UP AND LEFT
0x86	0x251C	#	BOX DRAWINGS LIGHT VERTICAL AND RIGHT
0x87	0x2524	#	BOX DRAWINGS LIGHT VERTICAL AND LEFT
0x88	0x252C	#	BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
0x89	0x2534	#	BOX DRAWINGS LIGHT UP AND HORIZONTAL
0x8A	0x253C	#	BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
0x8B	0x2580	#	UPPER HALF BLOCK
0x8C	0x2584	#	LOWER HALF BLOCK
0x8D	0x2588	#	FULL BLOCK
0x8E	0x258C	#	LEFT HALF BLOCK
0x8F	0x2590	#	RIGHT HALF BLOCK
0x90	0x2591	#	LIGHT SHADE
0x91	0x2592	#	MEDIUM SHADE
0x92	0x2593	#	DARK SHADE
0x93	0x2320	#	TOP HALF INTEGRAL
0x94	0x25A0	#	BLACK SQUARE
0x95	0x2219	#	BULLET OPERATOR
0x96	0x221A	#	SQUARE ROOT
0x97	0x2248	#	ALMOST EQUAL TO
0x98	0x2264	#	LESS-THAN OR EQUAL TO
0x99	0x2265	#	GREATER-THAN OR EQUAL TO
0x9A	0x00A0	#	NO-BREAK SPACE
0x9B	0x2321	#	BOTTOM HALF INTEGRAL
0x9C	0x00B0	#	DEGREE SIGN
0x9D	0x00B2	#	SUPERSCRIPT TWO
0x9E	0x00B7	#	MIDDLE DOT
0x9F	0x00F7	#	DIVISION SIGN
0xA0	0x2550	#	BOX DRAWINGS DOUBLE HORIZONTAL
0xA1	0x2551	#	BOX DRAWINGS DOUBLE VERTICAL
0xA2	0x2552	#	BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
0xA3	0x0451	#	CYRILLIC SMALL LETTER IO
0xA4	0x2553	#	BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
0xA5	0x2554	#	BOX DRAWINGS DOUBLE DOWN AND RIGHT
0xA6	0x2555	#	BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
0xA7	0x2556	#	BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
0xA8	0x2557	#	BOX DRAWINGS DOUBLE DOWN AND LEFT
0xA9	0x2558	#	BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
0xAA	0x2559	#	BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
0xAB	0x255A	#	BOX DRAWINGS DOUBLE UP AND RIGHT
0xAC	0x255B	#	BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
0xAD	0x255C	#	BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
0xAE	0x255D	#	BOX DRAWINGS DOUBLE UP AND LEFT
0xAF	0x255E	#	BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
0xB0	0x255F	#	BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
0xB1	0x2560	#	BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
0xB2	0x2561	#	BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
0xB3	0x0401	#	CYRILLIC CAPITAL LETTER IO
0xB4	0x2562	#	BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
0xB5	0x2563	#	BOX DRAWINGS DOUBLE VERTICAL AND LEFT
0xB6	0x2564	#	BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
0xB7	0x2565	#	BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
0xB8	0x2566	#	BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
0xB9	0x2567	#	BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
0xBA	0x2568	#	BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
0xBB	0x2569	#	BOX DRAWINGS DOUBLE UP AND HORIZONTAL
0xBC	0x256A	#	BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
0xBD	0x256B	#	BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
0xBE	0x256C	#	BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
0xBF	0x00A9	#	COPYRIGHT SIGN
0xC0	0x044E	#	CYRILLIC SMALL LETTER YU
0xC1	0x0430	#	CYRILLIC SMALL LETTER A
0xC2	0x0431	#	CYRILLIC SMALL LETTER BE
0xC3	0x0446	#	CYRILLIC SMALL LETTER TSE
0xC4	0x0434	#	CYRILLIC SMALL LETTER DE
0xC5	0x0435	#	CYRILLIC SMALL LETTER IE
0xC6	0x0444	#	CYRILLIC SMALL LETTER EF
0xC7	0x0433	#	CYRILLIC SMALL LETTER GHE
0xC8	0x0445	#	CYRILLIC SMALL LETTER HA
0xC9	0x0438	#	CYRILLIC SMALL LETTER I
0xCA	0x0439	#	CYRILLIC SMALL LETTER SHORT I
0xCB	0x043A	#	CYRILLIC SMALL LETTER KA
0xCC	0x043B	#	CYRILLIC SMALL LETTER EL
0xCD	0x043C	#	CYRILLIC SMALL LETTER EM
0xCE	0x043D	#	CYRILLIC SMALL LETTER EN
0xCF	0x043E	#	CYRILLIC SMALL LETTER O
0xD0	0x043F	#	CYRILLIC SMALL LETTER PE
0xD1	0x044F	#	CYRILLIC SMALL LETTER YA
0xD2	0x0440	#	CYRILLIC SMALL LETTER ER
0xD3	0x0441	#	CYRILLIC SMALL LETTER ES
0xD4	0x0442	#	CYRILLIC SMALL LETTER TE
0xD5	0x0443	#	CYRILLIC SMALL LETTER U
0xD6	0x0436	#	CYRILLIC SMALL LETTER ZHE
0xD7	0x0432	#	CYRILLIC SMALL LETTER VE
0xD8	0x044C	#	CYRILLIC SMALL LETTER SOFT SIGN
0xD9	0x044B	#	CYRILLIC SMALL LETTER YERU
0xDA	0x0437	#	CYRILLIC SMALL LETTER ZE
0xDB	0x0448	#	CYRILLIC SMALL LETTER SHA
0xDC	0x044D	#	CYRILLIC SMALL LETTER E
0xDD	0x0449	#	CYRILLIC SMALL LETTER SHCHA
0xDE	0x0447	#	CYRILLIC SMALL LETTER CHE
0xDF	0x044A	#	CYRILLIC SMALL LETTER HARD SIGN
0xE0	0x042E	#	CYRILLIC CAPITAL LETTER YU
0xE1	0x0410	#	CYRILLIC CAPITAL LETTER A
0xE2	0x0411	#	CYRILLIC CAPITAL LETTER BE
0xE3	0x0426	#	CYRILLIC CAPITAL LETTER TSE
0xE4	0x0414	#	CYRILLIC CAPITAL LETTER DE
0xE5	0x0415	#	CYRILLIC CAPITAL LETTER IE
0xE6	0x0424	#	CYRILLIC CAPITAL LETTER EF
0xE7	0x0413	#	CYRILLIC CAPITAL LETTER GHE
0xE8	0x0425	#	CYRILLIC CAPITAL LETTER HA
0xE9	0x0418	#	CYRILLIC CAPITAL LETTER I
0xEA	0x0419	#	CYRILLIC CAPITAL LETTER SHORT I
0xEB	0x041A	#	CYRILLIC CAPITAL LETTER KA
0xEC	0x041B	#	CYRILLIC CAPITAL LETTER EL
0xED	0x041C	#	CYRILLIC CAPITAL LETTER EM
0xEE	0x041D	#	CYRILLIC CAPITAL LETTER EN
0xEF	0x041E	#	CYRILLIC CAPITAL LETTER O
0xF0	0x041F	#	CYRILLIC CAPITAL LETTER PE
0xF1	0x042F	#	CYRILLIC CAPITAL LETTER YA
0xF2	0x0420	#	CYRILLIC CAPITAL LETTER ER
0xF3	0x0421	#	CYRILLIC CAPITAL LETTER ES
0xF4	0x0422	#	CYRILLIC CAPITAL LETTER TE
0xF5	0x0423	#	CYRILLIC CAPITAL LETTER U
0xF6	0x0416	#	CYRILLIC CAPITAL LETTER ZHE
0xF7	0x0412	#	CYRILLIC CAPITAL LETTER VE
0xF8	0x042C	#	CYRILLIC CAPITAL LETTER SOFT SIGN
0xF9	0x042B	#	CYRILLIC CAPITAL LETTER YERU
0xFA	0x0417	#	CYRILLIC CAPITAL LETTER ZE
0xFB	0x0428	#	CYRILLIC CAPITAL LETTER SHA
0xFC	0x042D	#	CYRILLIC CAPITAL LETTER E
0xFD	0x0429	#	CYRILLIC CAPITAL LETTER SHCHA
0xFE	0x0427	#	CYRILLIC CAPITAL LETTER CHE
0xFF	0x042A	#	CYRILLIC CAPITAL LETTER HARD SIGN
Changes to tools/encoding/macCentEuro.txt.


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
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
+
+

+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

-
+
+











-
+



-
-
-
-
+
+
+
+
+
-
-

+
+
+
-
-
+
+



-
-
-
+
+
+

-
+

+
+
+
+
+
-
-
+
+

-
+
-
-
-
-
-
-
-
+
+
-

+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-

-
-
+
+
+
+
+
+
+
+
+







#=======================================================================
#   FTP file name:  CENTEURO.TXT
#
#   Contents:       Map (external version) from Mac OS Central European
#                   character set to Unicode 2.1
#
#   Copyright:      (c) 1995-1999 by Apple Computer, Inc., all rights
#   Name:             MacOS_CentralEurope [to Unicode]
#   Unicode versions: 1.1, 2.0
#   Table version:    0.2 (from internal ufrm version <5>)
#   Date:             15 April 1995
#   Author:           Peter Edberg <edberg1@applelink.apple.com>
#                   reserved.
#
#   Contact:        charsets@apple.com
#
#   Changes:
#
#       b02  1999-Sep-22    Update contact e-mail address. Matches
#                           internal utom<b1>, ufrm<b1>, and Text
#                           Encoding Converter version 1.5.
#       n05  1998-Feb-05    Update header comments to new format; no
#                           mapping changes.  Matches internal utom<n3>,
#                           ufrm<n13>, and Text Encoding Converter
#                           version 1.3.
#       n03  1995-Apr-15    First version (after fixing some typos).
#                           Matches internal ufrm<n5>.
#
#   Copyright (c) 1995 Apple Computer, Inc.  All Rights reserved.
# Standard header:
# ----------------
#
#   Apple, the Apple logo, and Macintosh are trademarks of Apple
#   Computer, Inc., registered in the United States and other countries.
#   Unicode is a trademark of Unicode Inc. For the sake of brevity,
#   throughout this document, "Macintosh" can be used to refer to
#   Macintosh computers and "Unicode" can be used to refer to the
#   Unicode standard.
#
#   Apple makes no warranty or representation, either express or
#   implied, with respect to these tables, their quality, accuracy, or
#   fitness for a particular purpose. In no event will Apple be liable
#   for direct, indirect, special, incidental, or consequential damages
#   for direct, indirect, special, incidental, or consequential damages 
#   resulting from any defect or inaccuracy in this document or the
#   accompanying tables.
#
#   These mapping tables and character lists are preliminary and
#   subject to change. Updated tables will be available from the
#   Unicode Inc. ftp site (unicode.org), the Apple Computer ftp site
#   (ftp.info.apple.com), the Apple Computer World-Wide Web pages
#   These mapping tables and character lists are subject to change.
#   The latest tables should be available from the following:
#
#   <ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/APPLE/>
#   <ftp://dev.apple.com/devworld/Technical_Documentation/Misc._Standards/>
#   (http://www.info.apple.com), and possibly on diskette from APDA
#   (Apple's mail-order distribution service for developers).
#
#   For general information about Mac OS encodings and these mapping
#   tables, see the file "README.TXT".
#
#   Format:
#   -------
# Format:
# -------
#
#   Three tab-separated columns;
#   '#' begins a comment which continues to the end of the line.
#     Column #1 is the MacOS CentralEurope code (in hex as 0xNN)
#     Column #2 is the Unicode (in hex as 0xNNNN)
#     Column #3 is the Unicode name (follows a comment sign, '#')
#     Column #1 is the Mac OS Central European code (in hex as 0xNN)
#     Column #2 is the corresponding Unicode (in hex as 0xNNNN)
#     Column #3 is a comment containing the Unicode name
#
#   The entries are in MacOS CentralEurope code order.
#   The entries are in Mac OS Central European code order.
#
#   Control character mappings are not shown in this table, following
#   the conventions of the standard UTC mapping tables. However, the
#   Mac OS Central European character set uses the standard control
#   characters at 0x00-0x1F and 0x7F.
#
#   Notes on MacOS CentralEurope:
#   -----------------------------
# Notes on Mac OS Central European:
# ---------------------------------
#
#   This character set is intended to cover the following languages,
#   This character set is intended to cover the following languages:
#   which are written in Roman script but using a different set of
#   accented characters which are not in the standard MacOS Roman
#   set (MacOS CentralEurope also contains fewer punctuation and
#   math characters than standard MacOS Roman):
#   - several Slavic languages (Czech, Polish, Slovak, Slovenian)
#   - Hungarian
#   - the languages of the Baltic republics (Estonian, Latvian,
#
#   Polish, Czech, Slovak, Hungarian, Estonian, Latvian, Lithuanian
#     Lithuanian)
#
#   These are written in Latin script, but using a different set of
#   of accented characters than Mac OS Roman. The Mac OS Central
#    The MacOS CentralEurope encoding also includes a number of
#    characters needed for the Mac OS user interface (e.g. ellipsis),
#    Mac OS localization (bullet for echoing passwords, copyright
#    sign, etc.), several typographic punctuation symbols, math
#    symbols, etc. All of the characters in MacOS CentralEurope that
#    are also in the MacOS Roman encoding are at the same code point
#    as in MacOS Roman. This improves application compatibility (since
#   European character set also includes a number of characters
#   needed for the Mac OS user interface and localization (e.g.
#   ellipsis, bullet, copyright sign), several typographic
#   punctuation symbols, math symbols, etc. However, it has a
#   smaller set of punctuation and symbols than Mac OS Roman. All of
#   the characters in Mac OS Central European that are also in the
#   Mac OS Roman character set are at the same code point in both
#   character sets; this improves application compatibility.
#    some naughty applications hard-code the MacOS Roman code points
#    of certain characters).
#
#    The MacOS CentralEurope encoding is currently used for the
#    following MacOS localizations: Czech, Polish, and Hungarian.
#   Note: This does not have the same letter repertoire as ISO
#   8859-2 (Latin-2); each has some accented letters that the other
#   does not have.
#
# Unicode mapping issues and notes:
# ---------------------------------
#
# Details of mapping changes in each version:
# -------------------------------------------
#
##################

0x20	0x0020	# SPACE
0x21	0x0021	# EXCLAMATION MARK
0x22	0x0022	# QUOTATION MARK
0x23	0x0023	# NUMBER SIGN
Changes to tools/encoding/macCroatian.txt.


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
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
+
+

+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

-
+
+











-
+



-
-
-
-
+
+
+
+
+
-
-

+
+
+
-
-
+
+



-
-
-
+
+
+

-
+

-
-
-
-
+
+
+
+
+
+
+
-

-
-
+
+

+
+
-
-
+
+




-
+


-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







#=======================================================================
#   FTP file name:  CROATIAN.TXT
#
#   Contents:       Map (external version) from Mac OS Croatian
#                   character set to Unicode 2.1
#
#   Copyright:      (c) 1995-1999 by Apple Computer, Inc., all rights
#   Name:             MacOS_Croatian [to Unicode]
#   Unicode versions: 1.1, 2.0
#   Table version:    0.2 (from internal ufrm version <6>)
#   Date:             15 April 1995
#   Author:           Peter Edberg <edberg1@applelink.apple.com>
#                   reserved.
#
#   Contact:        charsets@apple.com
#
#   Changes:
#
#       b02  1999-Sep-22    Encoding changed for Mac OS 8.5; change
#                           mapping of 0xDB from CURRENCY SIGN to EURO
#                           SIGN. Update contact e-mail address. Matches
#                           internal utom<b2>, ufrm<b2>, and Text
#                           Encoding Converter version 1.5.
#       n07  1998-Feb-05    Minor update to header comments
#       n05  1997-Dec-14    Update to match internal utom<5>, ufrm<16>:
#                           Change standard mapping for 0xBD from U+2126
#                           to its canonical decomposition, U+03A9.
#       n03  1995-Apr-15    First version (after fixing some typos).
#                           Matches internal ufrm<6>.
#
#   Copyright (c) 1995 Apple Computer, Inc.  All Rights reserved.
# Standard header:
# ----------------
#
#   Apple, the Apple logo, and Macintosh are trademarks of Apple
#   Computer, Inc., registered in the United States and other countries.
#   Unicode is a trademark of Unicode Inc. For the sake of brevity,
#   throughout this document, "Macintosh" can be used to refer to
#   Macintosh computers and "Unicode" can be used to refer to the
#   Unicode standard.
#
#   Apple makes no warranty or representation, either express or
#   implied, with respect to these tables, their quality, accuracy, or
#   fitness for a particular purpose. In no event will Apple be liable
#   for direct, indirect, special, incidental, or consequential damages
#   for direct, indirect, special, incidental, or consequential damages 
#   resulting from any defect or inaccuracy in this document or the
#   accompanying tables.
#
#   These mapping tables and character lists are preliminary and
#   subject to change. Updated tables will be available from the
#   Unicode Inc. ftp site (unicode.org), the Apple Computer ftp site
#   (ftp.info.apple.com), the Apple Computer World-Wide Web pages
#   These mapping tables and character lists are subject to change.
#   The latest tables should be available from the following:
#
#   <ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/APPLE/>
#   <ftp://dev.apple.com/devworld/Technical_Documentation/Misc._Standards/>
#   (http://www.info.apple.com), and possibly on diskette from APDA
#   (Apple's mail-order distribution service for developers).
#
#   For general information about Mac OS encodings and these mapping
#   tables, see the file "README.TXT".
#
#   Format:
#   -------
# Format:
# -------
#
#   Three tab-separated columns;
#   '#' begins a comment which continues to the end of the line.
#     Column #1 is the MacOS Croatian code (in hex as 0xNN)
#     Column #2 is the Unicode (in hex as 0xNNNN)
#     Column #3 is the Unicode name (follows a comment sign, '#')
#     Column #1 is the Mac OS Croatian code (in hex as 0xNN)
#     Column #2 is the corresponding Unicode (in hex as 0xNNNN)
#     Column #3 is a comment containing the Unicode name
#
#   The entries are in MacOS Croatian code order.
#   The entries are in Mac OS Croatian code order.
#
#   One of these mappings requires the use of a corporate character
#   (for the Apple logo character). See the file "MacOS-CorpCharList".
#   NOTE: The graphic image associated with the Apple logo character
#   is not authorized for use without permission of Apple, and
#   One of these mappings requires the use of a corporate character.
#   See the file "CORPCHAR.TXT" and notes below.
#
#   Control character mappings are not shown in this table, following
#   the conventions of the standard UTC mapping tables. However, the
#   Mac OS Roman character set uses the standard control characters at
#   0x00-0x1F and 0x7F.
#   unauthorized use might constitute trademark infringement.
#
#   Notes on MacOS Croatian:
#   ------------------------
# Notes on Mac OS Croatian:
# -------------------------
#
#	Mac OS Croatian is used for Croatian and Slovene.
#
#   The MacOS Croatian encoding shares the script code smRoman
#   (0) with the standard MacOS Roman encoding. To determine if
#   The Mac OS Croatian encoding shares the script code smRoman
#   (0) with the standard Mac OS Roman encoding. To determine if
#   the Croatian encoding is being used, you must check if the
#   system region code is 68, verCroatia (or 25, verYugoCroatian,
#   only used in older systems).
#
#   This character set is a variant of standard MacOS Roman
#   This character set is a variant of standard Mac OS Roman
#   encoding, adding five accented letter case pairs to handle
#   Croatian. It has 20 code point differences from standard
#   MacOS Roman, but only 10 differences in repertoire.
#   Mac OS Roman, but only 10 differences in repertoire.
#
#   Before Mac OS 8.5, code point 0xDB was CURRENCY SIGN, and was
#   mapped to U+00A4. In Mac OS 8.5 and later versions, code point
#   0xDB is changed to EURO SIGN and maps to U+20AC; the standard
#   Apple fonts are updated for Mac OS 8.5 to reflect this. There is
#   a "currency sign" variant of the Mac OS Croatian encoding that
#   still maps 0xDB to U+00A4; this can be used for older fonts.
#   Note: U+20AC is new with Unicode 2.1; for earlier Unicode
#   versions, Mac OS Croatian 0xDB may be mapped to private-use
#   character U+F8A0.
#
# Unicode mapping issues and notes:
# ---------------------------------
#
#   The following corporate zone Unicode character is used in this
#   mapping:
#
#     0xF8FF  Apple logo
#
#   NOTE: The graphic image associated with the Apple logo character
#   is not authorized for use without permission of Apple, and
#   unauthorized use might constitute trademark infringement.
#
# Details of mapping changes in each version:
# -------------------------------------------
#
#   Changes from version n07 to version b02:
#
#   - Encoding changed for Mac OS 8.5; change mapping of 0xDB from
#   CURRENCY SIGN (U+00A4) to  EURO SIGN (U+20AC).
#
#   Changes from version n03 to version n05:
#
#   - Change mapping of 0xBD from U+2126 to its canonical
#     decomposition, U+03A9.
#
##################

0x20	0x0020	# SPACE
0x21	0x0021	# EXCLAMATION MARK
0x22	0x0022	# QUOTATION MARK
0x23	0x0023	# NUMBER SIGN
214
215
216
217
218
219
220
221

222
223
224
225
226
227
228
274
275
276
277
278
279
280

281
282
283
284
285
286
287
288







-
+







0xB6	0x2202	# PARTIAL DIFFERENTIAL
0xB7	0x2211	# N-ARY SUMMATION
0xB8	0x220F	# N-ARY PRODUCT
0xB9	0x0161	# LATIN SMALL LETTER S WITH CARON
0xBA	0x222B	# INTEGRAL
0xBB	0x00AA	# FEMININE ORDINAL INDICATOR
0xBC	0x00BA	# MASCULINE ORDINAL INDICATOR
0xBD	0x2126	# OHM SIGN
0xBD	0x03A9	# GREEK CAPITAL LETTER OMEGA
0xBE	0x017E	# LATIN SMALL LETTER Z WITH CARON
0xBF	0x00F8	# LATIN SMALL LETTER O WITH STROKE
0xC0	0x00BF	# INVERTED QUESTION MARK
0xC1	0x00A1	# INVERTED EXCLAMATION MARK
0xC2	0x00AC	# NOT SIGN
0xC3	0x221A	# SQUARE ROOT
0xC4	0x0192	# LATIN SMALL LETTER F WITH HOOK
244
245
246
247
248
249
250
251

252
253
254

255
256
257
258
259
260
261
304
305
306
307
308
309
310

311
312
313

314
315
316
317
318
319
320
321







-
+


-
+







0xD4	0x2018	# LEFT SINGLE QUOTATION MARK
0xD5	0x2019	# RIGHT SINGLE QUOTATION MARK
0xD6	0x00F7	# DIVISION SIGN
0xD7	0x25CA	# LOZENGE
0xD8	0xF8FF	# Apple logo
0xD9	0x00A9	# COPYRIGHT SIGN
0xDA	0x2044	# FRACTION SLASH
0xDB	0x00A4	# CURRENCY SIGN
0xDB	0x20AC	# EURO SIGN
0xDC	0x2039	# SINGLE LEFT-POINTING ANGLE QUOTATION MARK
0xDD	0x203A	# SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
0xDE	0x00C6	# LATIN CAPITAL LIGATURE AE
0xDE	0x00C6	# LATIN CAPITAL LETTER AE
0xDF	0x00BB	# RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0xE0	0x2013	# EN DASH
0xE1	0x00B7	# MIDDLE DOT
0xE2	0x201A	# SINGLE LOW-9 QUOTATION MARK
0xE3	0x201E	# DOUBLE LOW-9 QUOTATION MARK
0xE4	0x2030	# PER MILLE SIGN
0xE5	0x00C2	# LATIN CAPITAL LETTER A WITH CIRCUMFLEX
279
280
281
282
283
284
285
286

287
339
340
341
342
343
344
345

346
347







-
+

0xF7	0x02DC	# SMALL TILDE
0xF8	0x00AF	# MACRON
0xF9	0x03C0	# GREEK SMALL LETTER PI
0xFA	0x00CB	# LATIN CAPITAL LETTER E WITH DIAERESIS
0xFB	0x02DA	# RING ABOVE
0xFC	0x00B8	# CEDILLA
0xFD	0x00CA	# LATIN CAPITAL LETTER E WITH CIRCUMFLEX
0xFE	0x00E6	# LATIN SMALL LIGATURE AE
0xFE	0x00E6	# LATIN SMALL LETTER AE
0xFF	0x02C7	# CARON
Changes to tools/encoding/macCyrillic.txt.


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
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
+
+

+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

-
+
+











-
+



-
-
-
-
+
+
+
+
+
-
-

+
+
+
-
-
+
+



-
-
-
+
+
+

-
+

+
+
+
+
+
-
-
+
+

+
+
+
-
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
-
-
+
+
-
-
-
-
-
+
+
+
+
+
+
+

-
-
+
+
+
+
+
+
+
+
+
+
+







#=======================================================================
#   FTP file name:  CYRILLIC.TXT
#
#   Contents:       Map (external version) from Mac OS Cyrillic
#                   character set to Unicode 2.1
#
#   Copyright:      (c) 1995-1999 by Apple Computer, Inc., all rights
#   Name:             MacOS_Cyrillic [to Unicode]
#   Unicode versions: 1.1, 2.0
#   Table version:    0.2 (from internal ufrm version <5>)
#   Date:             15 April 1995
#   Authors:          Peter Edberg <edberg1@applelink.apple.com>
#                     Judy Kettenhofen
#                   reserved.
#
#   Contact:        charsets@apple.com
#
#   Changes:
#
#       b02  1999-Sep-22    Encoding changed for Mac OS 9.0 to merge
#                           with Mac OS Ukrainian and support EURO SIGN;
#                           Change mappings for 0xA2, 0xB6, and 0xFF.
#                           Update contact e-mail address. Matches
#                           internal utom<b2>, ufrm<b2>, and Text
#                           Encoding Converter version 1.5.
#       n05  1998-Feb-05    Update header comments to new format; no
#                           mapping changes.  Matches internal utom<n3>,
#                           ufrm<n13>, and Text Encoding Converter
#                           version 1.3.
#       n03  1995-Apr-15    First version (after fixing some typos).
#                           Matches internal ufrm<n5>.
#
#   Copyright (c) 1995 Apple Computer, Inc.  All Rights reserved.
# Standard header:
# ----------------
#
#   Apple, the Apple logo, and Macintosh are trademarks of Apple
#   Computer, Inc., registered in the United States and other countries.
#   Unicode is a trademark of Unicode Inc. For the sake of brevity,
#   throughout this document, "Macintosh" can be used to refer to
#   Macintosh computers and "Unicode" can be used to refer to the
#   Unicode standard.
#
#   Apple makes no warranty or representation, either express or
#   implied, with respect to these tables, their quality, accuracy, or
#   fitness for a particular purpose. In no event will Apple be liable
#   for direct, indirect, special, incidental, or consequential damages
#   for direct, indirect, special, incidental, or consequential damages 
#   resulting from any defect or inaccuracy in this document or the
#   accompanying tables.
#
#   These mapping tables and character lists are preliminary and
#   subject to change. Updated tables will be available from the
#   Unicode Inc. ftp site (unicode.org), the Apple Computer ftp site
#   (ftp.info.apple.com), the Apple Computer World-Wide Web pages
#   These mapping tables and character lists are subject to change.
#   The latest tables should be available from the following:
#
#   <ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/APPLE/>
#   <ftp://dev.apple.com/devworld/Technical_Documentation/Misc._Standards/>
#   (http://www.info.apple.com), and possibly on diskette from APDA
#   (Apple's mail-order distribution service for developers).
#
#   For general information about Mac OS encodings and these mapping
#   tables, see the file "README.TXT".
#
#   Format:
#   -------
# Format:
# -------
#
#   Three tab-separated columns;
#   '#' begins a comment which continues to the end of the line.
#     Column #1 is the MacOS Cyrillic code (in hex as 0xNN)
#     Column #2 is the Unicode (in hex as 0xNNNN)
#     Column #3 is the Unicode name (follows a comment sign, '#')
#     Column #1 is the Mac OS Cyrillic code (in hex as 0xNN)
#     Column #2 is the corresponding Unicode (in hex as 0xNNNN)
#     Column #3 is a comment containing the Unicode name
#
#   The entries are in MacOS Cyrillic code order.
#   The entries are in Mac OS Cyrillic code order.
#
#   Control character mappings are not shown in this table, following
#   the conventions of the standard UTC mapping tables. However, the
#   Mac OS Cyrillic character set uses the standard control characters
#   at 0x00-0x1F and 0x7F.
#
#   Notes on MacOS Cyrillic:
#   ------------------------
# Notes on Mac OS Cyrillic:
# -------------------------
#
#   For Mac OS 9.0 and later, this Mac Cyrillic encoding is used for
#   all Slavic Cyrillic localized system software and for the Cyrillic
#   Language Kit. Before Mac OS 9.0, there were two separate Slavic
#   The MacOS Cyrillic encoding includes the full Cyrillic letter
#	Cyrillic encodings:
#   repertoire of ISO 8859-5 (although not at the same code points).
#   This covers most of the Slavic languages written in Cyrillic
#   script.
#
#   1. The Cyrillic currency sign variant (used for localized Russian
#      and Bulgarian systems), which had the following:
#	    0xA2  U+00A2 CENT SIGN
#	    0xB6  U+2202 PARTIAL DIFFERENTIAL
#	    0xFF  U+00A4 CURRENCY SIGN
#
#   2. The Ukrainian currency sign variant (used for localized Ukrainian
#      systems and the pre-9.0 Cyrillic Language Kit), which had the
#      following:
#	    0xA2  U+0490 CYRILLIC CAPITAL LETTER GHE WITH UPTURN
#	    0xB6  U+0491 CYRILLIC SMALL LETTER GHE WITH UPTURN
#	    0xFF  U+00A4 CURRENCY SIGN
#
#   This new Cyrillic Euro sign version is based on the old Ukrainian
#   currency sign variant, with 0xFF changed to be EURO SIGN.
#
#   The Mac OS Cyrillic encoding includes the Cyrillic letter repertoire
#   of ISO 8859-5 (although not at the same code points). This covers
#   most of the Slavic languages written in Cyrillic script.
#
#   The MacOS Cyrillic encoding also includes a number of characters
#   needed for the MacOS user interface (e.g. ellipsis), MacOS
#   The Mac OS Cyrillic encoding also includes a number of characters
#   needed for the Mac OS user interface and localization (e.g.
#   localization (bullet for echoing passwords, copyright sign, etc.
#   All of the characters in MacOS Cyrillic that are also in the MacOS
#   Roman encoding are at the same code point as MacOS Roman. This
#   improves application compatibility (since some naughty applications
#   hard-code the MacOS Roman code points of certain characters).
#   ellipsis, bullet, copyright sign). All of the characters in Mac OS
#   Cyrillic that are also in the Mac OS Roman encoding are at the
#   same code point in both; this improves application compatibility.
#
#   Note: There is a common Ukrainian glyph variation in which the glyph
#   for CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I may or may not
#   have a dot above.
#
#   A variant of MacOS Cyrillic is used for Ukrainian. A separate
#   mapping table is available for Ukrainian.
# Unicode mapping issues and notes:
# ---------------------------------
#
# Details of mapping changes in each version:
# -------------------------------------------
#
#   Changes from version n05 to version b02:
#
#   - Encoding changed for Mac OS 9.0 to merge with Mac OS Ukrainian and
#   support EURO SIGN. 0xA2 changed from U+00A2 to U+0490; 0xB6 changed
#   from U+2202 to U+0491; 0xFF changed from U+00A4 to U+20AC.
#
##################

0x20	0x0020	# SPACE
0x21	0x0021	# EXCLAMATION MARK
0x22	0x0022	# QUOTATION MARK
0x23	0x0023	# NUMBER SIGN
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
244
245
246
247
248
249
250

251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270

271
272
273
274
275
276
277
278







-
+



















-
+







0x9B	0x042B	# CYRILLIC CAPITAL LETTER YERU
0x9C	0x042C	# CYRILLIC CAPITAL LETTER SOFT SIGN
0x9D	0x042D	# CYRILLIC CAPITAL LETTER E
0x9E	0x042E	# CYRILLIC CAPITAL LETTER YU
0x9F	0x042F	# CYRILLIC CAPITAL LETTER YA
0xA0	0x2020	# DAGGER
0xA1	0x00B0	# DEGREE SIGN
0xA2	0x00A2	# CENT SIGN
0xA2	0x0490	# CYRILLIC CAPITAL LETTER GHE WITH UPTURN
0xA3	0x00A3	# POUND SIGN
0xA4	0x00A7	# SECTION SIGN
0xA5	0x2022	# BULLET
0xA6	0x00B6	# PILCROW SIGN
0xA7	0x0406	# CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
0xA8	0x00AE	# REGISTERED SIGN
0xA9	0x00A9	# COPYRIGHT SIGN
0xAA	0x2122	# TRADE MARK SIGN
0xAB	0x0402	# CYRILLIC CAPITAL LETTER DJE
0xAC	0x0452	# CYRILLIC SMALL LETTER DJE
0xAD	0x2260	# NOT EQUAL TO
0xAE	0x0403	# CYRILLIC CAPITAL LETTER GJE
0xAF	0x0453	# CYRILLIC SMALL LETTER GJE
0xB0	0x221E	# INFINITY
0xB1	0x00B1	# PLUS-MINUS SIGN
0xB2	0x2264	# LESS-THAN OR EQUAL TO
0xB3	0x2265	# GREATER-THAN OR EQUAL TO
0xB4	0x0456	# CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
0xB5	0x00B5	# MICRO SIGN
0xB6	0x2202	# PARTIAL DIFFERENTIAL
0xB6	0x0491	# CYRILLIC SMALL LETTER GHE WITH UPTURN
0xB7	0x0408	# CYRILLIC CAPITAL LETTER JE
0xB8	0x0404	# CYRILLIC CAPITAL LETTER UKRAINIAN IE
0xB9	0x0454	# CYRILLIC SMALL LETTER UKRAINIAN IE
0xBA	0x0407	# CYRILLIC CAPITAL LETTER YI
0xBB	0x0457	# CYRILLIC SMALL LETTER YI
0xBC	0x0409	# CYRILLIC CAPITAL LETTER LJE
0xBD	0x0459	# CYRILLIC SMALL LETTER LJE
280
281
282
283
284
285
286
287

337
338
339
340
341
342
343

344







-
+
0xF8	0x0448	# CYRILLIC SMALL LETTER SHA
0xF9	0x0449	# CYRILLIC SMALL LETTER SHCHA
0xFA	0x044A	# CYRILLIC SMALL LETTER HARD SIGN
0xFB	0x044B	# CYRILLIC SMALL LETTER YERU
0xFC	0x044C	# CYRILLIC SMALL LETTER SOFT SIGN
0xFD	0x044D	# CYRILLIC SMALL LETTER E
0xFE	0x044E	# CYRILLIC SMALL LETTER YU
0xFF	0x00A4	# CURRENCY SIGN
0xFF	0x20AC	# EURO SIGN
Changes to tools/encoding/macGreek.txt.


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
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
+
+

+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

-
+
+











-
+



-
-
-
-
+
+
+
+
+
-
-

+
+
+
-
-
+
+



-
-
-
+
+
+

-
+

-
-
+
+

+
+
+
+
+
-
-
+
+

-
+

-
+



-
-
+
+
+
+
+
+
+

-
+




-
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







#=======================================================================
#   FTP file name:  GREEK.TXT
#
#   Contents:       Map (external version) from Mac OS Greek
#                   character set to Unicode 2.1
#
#   Copyright:      (c) 1995-1999 by Apple Computer, Inc., all rights
#   Name:             MacOS_Greek [to Unicode]
#   Unicode versions: 1.1, 2.0
#   Table version:    0.2 (from internal ufrm version <7>)
#   Date:             15 April 1995
#   Author:           Peter Edberg <edberg1@applelink.apple.com>
#                   reserved.
#
#   Contact:        charsets@apple.com
#
#   Changes:
#
#       b02  1999-Sep-22    Update contact e-mail address. Matches
#                           internal utom<b1>, ufrm<b1>, and Text
#                           Encoding Converter version 1.5.
#       n06  1998-Feb-05    Update to match internal utom<n4>, ufrm<n17>,
#                           and Text Encoding Converter versions 1.3:
#                           Change mapping for 0xAF from U+0387 to its
#                           canonical decomposition, U+00B7. Also
#                           update header comments to new format.
#       n04  1995-Apr-15    First version (after fixing some typos).
#                           Matches internal ufrm<n7>.
#
#   Copyright (c) 1995 Apple Computer, Inc.  All Rights reserved.
# Standard header:
# ----------------
#
#   Apple, the Apple logo, and Macintosh are trademarks of Apple
#   Computer, Inc., registered in the United States and other countries.
#   Unicode is a trademark of Unicode Inc. For the sake of brevity,
#   throughout this document, "Macintosh" can be used to refer to
#   Macintosh computers and "Unicode" can be used to refer to the
#   Unicode standard.
#
#   Apple makes no warranty or representation, either express or
#   implied, with respect to these tables, their quality, accuracy, or
#   fitness for a particular purpose. In no event will Apple be liable
#   for direct, indirect, special, incidental, or consequential damages
#   for direct, indirect, special, incidental, or consequential damages 
#   resulting from any defect or inaccuracy in this document or the
#   accompanying tables.
#
#   These mapping tables and character lists are preliminary and
#   subject to change. Updated tables will be available from the
#   Unicode Inc. ftp site (unicode.org), the Apple Computer ftp site
#   (ftp.info.apple.com), the Apple Computer World-Wide Web pages
#   These mapping tables and character lists are subject to change.
#   The latest tables should be available from the following:
#
#   <ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/APPLE/>
#   <ftp://dev.apple.com/devworld/Technical_Documentation/Misc._Standards/>
#   (http://www.info.apple.com), and possibly on diskette from APDA
#   (Apple's mail-order distribution service for developers).
#
#   For general information about Mac OS encodings and these mapping
#   tables, see the file "README.TXT".
#
#   Format:
#   -------
# Format:
# -------
#
#   Three tab-separated columns;
#   '#' begins a comment which continues to the end of the line.
#     Column #1 is the MacOS Greek code (in hex as 0xNN)
#     Column #2 is the Unicode (in hex as 0xNNNN)
#     Column #3 is the Unicode name (follows a comment sign, '#')
#     Column #1 is the Mac OS Greek code (in hex as 0xNN)
#     Column #2 is the corresponding Unicode (in hex as 0xNNNN)
#     Column #3 is a comment containing the Unicode name
#
#   The entries are in MacOS Greek code order.
#   The entries are in Mac OS Greek code order.
#
#   One of these mappings requires the use of a corporate character
#   (for an undefined code point). See the file "MacOS-CorpCharList".
#   One of these mappings requires the use of a corporate character.
#   See the file "CORPCHAR.TXT" and notes below.
#
#   Control character mappings are not shown in this table, following
#   the conventions of the standard UTC mapping tables. However, the
#   Mac OS Greek character set uses the standard control characters at
#   0x00-0x1F and 0x7F.
#
#   Notes on MacOS Greek:
#   ---------------------
# Notes on Mac OS Greek:
# ----------------------
#
#   Although a MacOS script code is defined for Greek (smGreek = 6),
#   Although a Mac OS script code is defined for Greek (smGreek = 6),
#   the Greek localized system does not currently use it (the font
#   family IDs are in the MacOS Roman range). To determine if the
#   family IDs are in the Mac OS Roman range). To determine if the
#   Greek encoding is being used when the script code is smRoman (0),
#   you must check if the system region code is 20, verGreece.
#
#   The MacOS Greek encoding is a superset of the repertoire of
#   ISO 8859-5 (although characters are not at the same code points).
#   The Mac OS Greek encoding is a superset of the repertoire of
#   ISO 8859-7 (although characters are not at the same code points),
#   except that LEFT & RIGHT SINGLE QUOTATION MARK replace the
#   MODIFIER LETTER REVERSED COMMA & APOSTROPHE (spacing versions of
#   Greek rough & smooth breathing marks) that are in ISO 8859-7.
#   The added characters in Mac OS Greek include more punctuation and
#   symbols and several accented Latin letters.
#
#   This character set was used by all MacOS Greek systems 6.x and
#   This character set was used by all Mac OS Greek systems 6.x and
#   7.x except for system 6.0.7, which used a variant character set
#   but was quickly replaced with Greek system 6.0.7.1 using the
#   standard character set documented here. Greek system 4.1 used a
#   variant Greek set that had ISO 8859-7 in 0xA0-0xFF (with some
#   holes filled in with DTP characters), and MacOS Roman accented
#   holes filled in with DTP characters), and Mac OS Roman accented
#   Roman letters in 0x80-0x9F.
#
# Unicode mapping issues and notes:
# ---------------------------------
#
#   The following corporate zone Unicode character is used in this
#   mapping:
#
#     0xF8A0  undefined1, used to map the single undefined code point
#             in Mac OS Greek and Turkish (to obtain roundtrip
#             fidelity for all code points).
#
# Details of mapping changes in each version:
# -------------------------------------------
#
#   Changes from version n04 to version n06:
#
#   - Change mapping of 0xAF from U+0387 to its canonical
#     decomposition, U+00B7.
#
##################

0x20	0x0020	# SPACE
0x21	0x0021	# EXCLAMATION MARK
0x22	0x0022	# QUOTATION MARK
0x23	0x0023	# NUMBER SIGN
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
240
241
242
243
244
245
246

247
248
249
250
251
252
253
254
255
256
257

258
259
260
261
262
263
264
265







-
+










-
+







0x9D	0x00F9	# LATIN SMALL LETTER U WITH GRAVE
0x9E	0x00FB	# LATIN SMALL LETTER U WITH CIRCUMFLEX
0x9F	0x00FC	# LATIN SMALL LETTER U WITH DIAERESIS
0xA0	0x2020	# DAGGER
0xA1	0x0393	# GREEK CAPITAL LETTER GAMMA
0xA2	0x0394	# GREEK CAPITAL LETTER DELTA
0xA3	0x0398	# GREEK CAPITAL LETTER THETA
0xA4	0x039B	# GREEK CAPITAL LETTER LAMBDA
0xA4	0x039B	# GREEK CAPITAL LETTER LAMDA
0xA5	0x039E	# GREEK CAPITAL LETTER XI
0xA6	0x03A0	# GREEK CAPITAL LETTER PI
0xA7	0x00DF	# LATIN SMALL LETTER SHARP S
0xA8	0x00AE	# REGISTERED SIGN
0xA9	0x00A9	# COPYRIGHT SIGN
0xAA	0x03A3	# GREEK CAPITAL LETTER SIGMA
0xAB	0x03AA	# GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
0xAC	0x00A7	# SECTION SIGN
0xAD	0x2260	# NOT EQUAL TO
0xAE	0x00B0	# DEGREE SIGN
0xAF	0x0387	# GREEK ANO TELEIA
0xAF	0x00B7	# MIDDLE DOT
0xB0	0x0391	# GREEK CAPITAL LETTER ALPHA
0xB1	0x00B1	# PLUS-MINUS SIGN
0xB2	0x2264	# LESS-THAN OR EQUAL TO
0xB3	0x2265	# GREATER-THAN OR EQUAL TO
0xB4	0x00A5	# YEN SIGN
0xB5	0x0392	# GREEK CAPITAL LETTER BETA
0xB6	0x0395	# GREEK CAPITAL LETTER EPSILON
264
265
266
267
268
269
270
271

272
273
274
275
276
277
278
312
313
314
315
316
317
318

319
320
321
322
323
324
325
326







-
+







0xE5	0x03B5	# GREEK SMALL LETTER EPSILON
0xE6	0x03C6	# GREEK SMALL LETTER PHI
0xE7	0x03B3	# GREEK SMALL LETTER GAMMA
0xE8	0x03B7	# GREEK SMALL LETTER ETA
0xE9	0x03B9	# GREEK SMALL LETTER IOTA
0xEA	0x03BE	# GREEK SMALL LETTER XI
0xEB	0x03BA	# GREEK SMALL LETTER KAPPA
0xEC	0x03BB	# GREEK SMALL LETTER LAMBDA
0xEC	0x03BB	# GREEK SMALL LETTER LAMDA
0xED	0x03BC	# GREEK SMALL LETTER MU
0xEE	0x03BD	# GREEK SMALL LETTER NU
0xEF	0x03BF	# GREEK SMALL LETTER OMICRON
0xF0	0x03C0	# GREEK SMALL LETTER PI
0xF1	0x03CE	# GREEK SMALL LETTER OMEGA WITH TONOS
0xF2	0x03C1	# GREEK SMALL LETTER RHO
0xF3	0x03C3	# GREEK SMALL LETTER SIGMA
Changes to tools/encoding/macIceland.txt.


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
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
+
+

+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

-
+
+











-
+



-
-
-
-
+
+
+
+
+
-
-

+
+
+
-
-
+
+



-
-
-
+
+
+

-
+

-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+




-
-
+
+

-
+
-
-
-
+
+
+

-
+
-
-
+
+
+







#=======================================================================
#   FTP file name:  ICELAND.TXT
#
#   Contents:       Map (external version) from Mac OS Icelandic
#                   character set to Unicode 2.1
#
#   Copyright:      (c) 1995-1999 by Apple Computer, Inc., all rights
#   Name:             MacOS_Icelandic [to Unicode]
#   Unicode versions: 1.1, 2.0
#   Table version:    0.2 (from internal ufrm version <5>)
#   Date:             15 April 1995
#   Author:           Peter Edberg <edberg1@applelink.apple.com>
#                   reserved.
#
#   Contact:        charsets@apple.com
#
#   Changes:
#
#       b02  1999-Sep-22    Encoding changed for Mac OS 8.5; change
#                           mapping of 0xDB from CURRENCY SIGN to EURO
#                           SIGN. Update contact e-mail address. Matches
#                           internal utom<b2>, ufrm<b2>, and Text
#                           Encoding Converter version 1.5.
#       n06  1998-Feb-05    Minor update to header comments, add
#                           information on font variants
#       n03  1997-Dec-14    Update to match internal utom<n4>, ufrm<n16>:
#                           Change standard mapping for 0xBD from U+2126
#                           to its canonical decomposition, U+03A9.
#       n02  1995-Apr-15    First version (after fixing some typos).
#                           Matches internal ufrm<n5>.
#
#   Copyright (c) 1995 Apple Computer, Inc.  All Rights reserved.
# Standard header:
# ----------------
#
#   Apple, the Apple logo, and Macintosh are trademarks of Apple
#   Computer, Inc., registered in the United States and other countries.
#   Unicode is a trademark of Unicode Inc. For the sake of brevity,
#   throughout this document, "Macintosh" can be used to refer to
#   Macintosh computers and "Unicode" can be used to refer to the
#   Unicode standard.
#
#   Apple makes no warranty or representation, either express or
#   implied, with respect to these tables, their quality, accuracy, or
#   fitness for a particular purpose. In no event will Apple be liable
#   for direct, indirect, special, incidental, or consequential damages
#   for direct, indirect, special, incidental, or consequential damages 
#   resulting from any defect or inaccuracy in this document or the
#   accompanying tables.
#
#   These mapping tables and character lists are preliminary and
#   subject to change. Updated tables will be available from the
#   Unicode Inc. ftp site (unicode.org), the Apple Computer ftp site
#   (ftp.info.apple.com), the Apple Computer World-Wide Web pages
#   These mapping tables and character lists are subject to change.
#   The latest tables should be available from the following:
#
#   <ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/APPLE/>
#   <ftp://dev.apple.com/devworld/Technical_Documentation/Misc._Standards/>
#   (http://www.info.apple.com), and possibly on diskette from APDA
#   (Apple's mail-order distribution service for developers).
#
#   For general information about Mac OS encodings and these mapping
#   tables, see the file "README.TXT".
#
#   Format:
#   -------
# Format:
# -------
#
#   Three tab-separated columns;
#   '#' begins a comment which continues to the end of the line.
#     Column #1 is the MacOS Icelandic code (in hex as 0xNN)
#     Column #2 is the Unicode (in hex as 0xNNNN)
#     Column #3 is the Unicode name (follows a comment sign, '#')
#     Column #1 is the Mac OS Icelandic code (in hex as 0xNN)
#     Column #2 is the corresponding Unicode (in hex as 0xNNNN)
#     Column #3 is a comment containing the Unicode name
#
#   The entries are in MacOS Icelandic code order.
#   The entries are in Mac OS Icelandic code order.
#
#   One of these mappings requires the use of a corporate character
#   (for the Apple logo character). See the file "MacOS-CorpCharList".
#   One of these mappings requires the use of a corporate character.
#   See the file "CORPCHAR.TXT" and notes below.
#
#   Control character mappings are not shown in this table, following
#   the conventions of the standard UTC mapping tables. However, the
#   Mac OS Roman character set uses the standard control characters at
#   0x00-0x1F and 0x7F.
#
# Notes on Mac OS Icelandic:
# --------------------------
#
#   1. General
#
#	Mac OS Icelandic is used for Icelandic and Faroese.
#
#   The Mac OS Icelandic encoding shares the script code smRoman
#   (0) with the standard Mac OS Roman encoding. To determine if
#   the Icelandic encoding is being used, you must also check if
#   the system region code is 21, verIceland.
#
#   This character set is a variant of standard Mac OS Roman,
#   adding upper and lower eth, thorn, and Y acute. It has 6 code
#   point differences from standard Mac OS Roman.
#
#   Before Mac OS 8.5, code point 0xDB was CURRENCY SIGN, and was
#   mapped to U+00A4. In Mac OS 8.5 and later versions, code point
#   0xDB is changed to EURO SIGN and maps to U+20AC; the standard
#   Apple fonts are updated for Mac OS 8.5 to reflect this. There are
#   "currency sign" variants of the Mac OS Icelandic encoding that
#   still map 0xDB to U+00A4; these can be used for older fonts.
#   Note: U+20AC is new with Unicode 2.1; for earlier Unicode
#   versions, Mac OS Icelandic 0xDB may be mapped to private-use
#   character U+F8A0.
#
#   2. Font variants
#
#   The table in this file gives the Unicode mappings for the standard
#   Mac OS Icelandic encoding. This encoding is supported by the
#   Icelandic versions of the fonts Chicago, Geneva, Monaco, and New
#   York, and is the encoding supported by the text processing
#   utilities. However, other TrueType fonts implement a slightly
#   different encoding; the difference is only in two code points.
#   For the standard variant, these are:
#     0xBB -> 0x00AA  FEMININE ORDINAL INDICATOR
#     0xBC -> 0x00BA  MASCULINE ORDINAL INDICATOR
#
#   For the TrueType variant (used by the Icelandic versions of the
#   fonts Courier, Helvetica, Palatino, and Times), these are:
#     0xBB -> 0xFB01  LATIN SMALL LIGATURE FI
#     0xBC -> 0xFB02  LATIN SMALL LIGATURE FL
#
# Unicode mapping issues and notes:
# ---------------------------------
#
#   The following corporate zone Unicode character is used in this
#   mapping:
#
#     0xF8FF  Apple logo
#
#   NOTE: The graphic image associated with the Apple logo character
#   is not authorized for use without permission of Apple, and
#   unauthorized use might constitute trademark infringement.
#
#   Notes on MacOS Icelandic:
#   -------------------------
# Details of mapping changes in each version:
# -------------------------------------------
#
#   The MacOS Icelandic encoding shares the script code smRoman
#   Changes from version n06 to version b02:
#   (0) with the standard MacOS Roman encoding. To determine if
#   the Icelandic encoding is being used, you must also check if
#   the system region code is 21, verIceland.
#
#   - Encoding changed for Mac OS 8.5; change mapping of 0xDB from
#   CURRENCY SIGN (U+00A4) to EURO SIGN (U+20AC).
#
#   This character set is a variant of standard MacOS Roman,
#   Changes from version n02 to version n03:
#   adding upper and lower eth, thorn, and Y acute. It has 6 code
#   point differences from standard MacOS Roman.
#
#   - Change mapping of 0xBD from U+2126 to its canonical
#     decomposition, U+03A9.
#
##################

0x20	0x0020	# SPACE
0x21	0x0021	# EXCLAMATION MARK
0x22	0x0022	# QUOTATION MARK
0x23	0x0023	# NUMBER SIGN
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
277
278
279
280
281
282
283

284
285
286
287
288
289
290
291
292
293
294
295
296
297
298


299
300
301
302
303
304
305
306
307







-
+














-
-
+
+







0xA7	0x00DF	# LATIN SMALL LETTER SHARP S
0xA8	0x00AE	# REGISTERED SIGN
0xA9	0x00A9	# COPYRIGHT SIGN
0xAA	0x2122	# TRADE MARK SIGN
0xAB	0x00B4	# ACUTE ACCENT
0xAC	0x00A8	# DIAERESIS
0xAD	0x2260	# NOT EQUAL TO
0xAE	0x00C6	# LATIN CAPITAL LIGATURE AE
0xAE	0x00C6	# LATIN CAPITAL LETTER AE
0xAF	0x00D8	# LATIN CAPITAL LETTER O WITH STROKE
0xB0	0x221E	# INFINITY
0xB1	0x00B1	# PLUS-MINUS SIGN
0xB2	0x2264	# LESS-THAN OR EQUAL TO
0xB3	0x2265	# GREATER-THAN OR EQUAL TO
0xB4	0x00A5	# YEN SIGN
0xB5	0x00B5	# MICRO SIGN
0xB6	0x2202	# PARTIAL DIFFERENTIAL
0xB7	0x2211	# N-ARY SUMMATION
0xB8	0x220F	# N-ARY PRODUCT
0xB9	0x03C0	# GREEK SMALL LETTER PI
0xBA	0x222B	# INTEGRAL
0xBB	0x00AA	# FEMININE ORDINAL INDICATOR
0xBC	0x00BA	# MASCULINE ORDINAL INDICATOR
0xBD	0x2126	# OHM SIGN
0xBE	0x00E6	# LATIN SMALL LIGATURE AE
0xBD	0x03A9	# GREEK CAPITAL LETTER OMEGA
0xBE	0x00E6	# LATIN SMALL LETTER AE
0xBF	0x00F8	# LATIN SMALL LETTER O WITH STROKE
0xC0	0x00BF	# INVERTED QUESTION MARK
0xC1	0x00A1	# INVERTED EXCLAMATION MARK
0xC2	0x00AC	# NOT SIGN
0xC3	0x221A	# SQUARE ROOT
0xC4	0x0192	# LATIN SMALL LETTER F WITH HOOK
0xC5	0x2248	# ALMOST EQUAL TO
242
243
244
245
246
247
248
249

250
251
252
253
254
255
256
322
323
324
325
326
327
328

329
330
331
332
333
334
335
336







-
+







0xD4	0x2018	# LEFT SINGLE QUOTATION MARK
0xD5	0x2019	# RIGHT SINGLE QUOTATION MARK
0xD6	0x00F7	# DIVISION SIGN
0xD7	0x25CA	# LOZENGE
0xD8	0x00FF	# LATIN SMALL LETTER Y WITH DIAERESIS
0xD9	0x0178	# LATIN CAPITAL LETTER Y WITH DIAERESIS
0xDA	0x2044	# FRACTION SLASH
0xDB	0x00A4	# CURRENCY SIGN
0xDB	0x20AC	# EURO SIGN
0xDC	0x00D0	# LATIN CAPITAL LETTER ETH
0xDD	0x00F0	# LATIN SMALL LETTER ETH
0xDE	0x00DE	# LATIN CAPITAL LETTER THORN
0xDF	0x00FE	# LATIN SMALL LETTER THORN
0xE0	0x00FD	# LATIN SMALL LETTER Y WITH ACUTE
0xE1	0x00B7	# MIDDLE DOT
0xE2	0x201A	# SINGLE LOW-9 QUOTATION MARK
Changes to tools/encoding/macRoman.txt.


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
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
+
+

+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

-
+
+











-
+



-
-
-
-
+
+
+
+
+
-
-

+
+
+
-
-
+
+



-
-
-
+
+
+

-
+

-
-
-
-
+
+
+
+
+
+
+
-

-
-
+
+

-
+





-
-
-
+
+
+

+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+

-
+






+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







#=======================================================================
#   FTP file name:  ROMAN.TXT
#
#   Contents:       Map (external version) from Mac OS Roman
#                   character set to Unicode 2.1
#
#   Copyright:      (c) 1994-1999 by Apple Computer, Inc., all rights
#   Name:             MacOS_Roman [to Unicode]
#   Unicode versions: 1.1, 2.0
#   Table version:    0.2 (from internal ufrm version <9>)
#   Date:             15 April 1995
#   Author:           Peter Edberg <edberg1@applelink.apple.com>
#                   reserved.
#
#   Contact:        charsets@apple.com
#
#   Changes:
#
#       b03  1999-Sep-22    Update contact e-mail address. Matches
#                           internal utom<b4>, ufrm<b3>, and Text
#                           Encoding Converter version 1.5.
#       b02  1998-Aug-18    Encoding changed for Mac OS 8.5; change
#                           mapping of 0xDB from CURRENCY SIGN to
#                           EURO SIGN. Matches internal utom<b3>,
#                           ufrm<b3>.
#       n08  1998-Feb-05    Minor update to header comments
#       n06  1997-Dec-14    Add warning about future changes to 0xDB
#                           from CURRENCY SIGN to EURO SIGN. Clarify
#                           some header information
#       n04  1997-Dec-01    Update to match internal utom<n3>, ufrm<n22>:
#                           Change standard mapping for 0xBD from U+2126
#                           to its canonical decomposition, U+03A9.
#       n03  1995-Apr-15    First version (after fixing some typos).
#                           Matches internal ufrm<n9>.
#
#   Copyright (c) 1995 Apple Computer, Inc.  All Rights reserved.
# Standard header:
# ----------------
#
#   Apple, the Apple logo, and Macintosh are trademarks of Apple
#   Computer, Inc., registered in the United States and other countries.
#   Unicode is a trademark of Unicode Inc. For the sake of brevity,
#   throughout this document, "Macintosh" can be used to refer to
#   Macintosh computers and "Unicode" can be used to refer to the
#   Unicode standard.
#
#   Apple makes no warranty or representation, either express or
#   implied, with respect to these tables, their quality, accuracy, or
#   fitness for a particular purpose. In no event will Apple be liable
#   for direct, indirect, special, incidental, or consequential damages
#   for direct, indirect, special, incidental, or consequential damages 
#   resulting from any defect or inaccuracy in this document or the
#   accompanying tables.
#
#   These mapping tables and character lists are preliminary and
#   subject to change. Updated tables will be available from the
#   Unicode Inc. ftp site (unicode.org), the Apple Computer ftp site
#   (ftp.info.apple.com), the Apple Computer World-Wide Web pages
#   These mapping tables and character lists are subject to change.
#   The latest tables should be available from the following:
#
#   <ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/APPLE/>
#   <ftp://dev.apple.com/devworld/Technical_Documentation/Misc._Standards/>
#   (http://www.info.apple.com), and possibly on diskette from APDA
#   (Apple's mail-order distribution service for developers).
#
#   For general information about Mac OS encodings and these mapping
#   tables, see the file "README.TXT".
#
#   Format:
#   -------
# Format:
# -------
#
#   Three tab-separated columns;
#   '#' begins a comment which continues to the end of the line.
#     Column #1 is the MacOS Roman code (in hex as 0xNN)
#     Column #2 is the Unicode (in hex as 0xNNNN)
#     Column #3 is the Unicode name (follows a comment sign, '#')
#     Column #1 is the Mac OS Roman code (in hex as 0xNN)
#     Column #2 is the corresponding Unicode (in hex as 0xNNNN)
#     Column #3 is a comment containing the Unicode name
#
#   The entries are in MacOS Roman code order.
#   The entries are in Mac OS Roman code order.
#
#   One of these mappings requires the use of a corporate character
#   (for the Apple logo character). See the file "MacOS-CorpCharList".
#   NOTE: The graphic image associated with the Apple logo character
#   is not authorized for use without permission of Apple, and
#   One of these mappings requires the use of a corporate character.
#   See the file "CORPCHAR.TXT" and notes below.
#
#   Control character mappings are not shown in this table, following
#   the conventions of the standard UTC mapping tables. However, the
#   Mac OS Roman character set uses the standard control characters at
#   0x00-0x1F and 0x7F.
#   unauthorized use might constitute trademark infringement.
#
#   Notes on MacOS Roman:
#   ---------------------
# Notes on Mac OS Roman:
# ----------------------
#
#   This character set is used for at least the following MacOS
#   This character set is used for at least the following Mac OS
#   localizations: U.S., British, Canadian French, French, Swiss
#   French, German, Swiss German, Italian, Swiss Italian, Dutch,
#   Swedish, Norwegian, Danish, Finnish, Spanish, Catalan,
#   Portuguese, Brazilian, and the default International system.
#
#   Variants of MacRoman are used for Croatian, Icelandic,
#   Turkish, and Romanian. Separate mapping tables are available
#   for these encodings.
#   Variants of Mac OS Roman are used for Croatian, Icelandic,
#   Turkish, Romanian, and other encodings. Separate mapping tables
#   are available for these encodings.
#
#   Before Mac OS 8.5, code point 0xDB was CURRENCY SIGN, and was
#   mapped to U+00A4. In Mac OS 8.5 and later versions, code point
#   0xDB is changed to EURO SIGN and maps to U+20AC; the standard
#   Apple fonts are updated for Mac OS 8.5 to reflect this. There is
#   a "currency sign" variant of the Mac OS Roman encoding that still
#   maps 0xDB to U+00A4; this can be used for older fonts.
#   Note: U+20AC is new with Unicode 2.1; for earlier Unicode
#   versions, Mac OS Roman 0xDB may be mapped to private-use character
#   U+F8A0.
#
#   At least through System 7.5, the bitmap versions of the fonts
#   Chicago, New York, Geneva, and Monaco do not implement the
#   full Roman character set; they only support MacOS Roman character
#   codes up to 0xD8. The TrueType versions of these fonts do
#   implement the full character set, as do both the bitmap and
#   TrueType versions of the other standard Roman fonts.
#   Before Mac OS 8.5, the ROM bitmap versions of the fonts Chicago,
#   New York, Geneva, and Monaco did not implement the full Mac OS
#   Roman character set; they only supported character codes up to
#   0xD8. The TrueType versions of these fonts have always implemented
#   the full character set, as with the bitmap and TrueType versions
#   of the other standard Roman fonts.
#
#   In all MacOS encodings, fonts such as Chicago which are used
#   In all Mac OS encodings, fonts such as Chicago which are used
#   as "system" fonts (for menus, dialogs, etc.) have four glyphs
#   at code points 0x11-0x14 for transient use by the Menu Manager.
#   These glyphs are not intended as characters for use in normal
#   text, and the associated code points are not generally
#   interpreted as associated with these glyphs; they are usually
#   interpreted (if at all) as the control codes DC1-DC4.
#
# Unicode mapping issues and notes:
# ---------------------------------
#
#   The following corporate zone Unicode character is used in this
#   mapping:
#
#     0xF8FF  Apple logo
#
#   NOTE: The graphic image associated with the Apple logo character
#   is not authorized for use without permission of Apple, and
#   unauthorized use might constitute trademark infringement.
#
# Details of mapping changes in each version:
# -------------------------------------------
#
#   Changes from version n08 to version b02:
#
#   - Encoding changed for Mac OS 8.5; change mapping of 0xDB from
#   CURRENCY SIGN (U+00A4) to EURO SIGN (U+20AC).
#
#   Changes from version n03 to version n04:
#
#   - Change mapping of 0xBD from U+2126 to its canonical
#     decomposition, U+03A9.
#
##################

0x20	0x0020	# SPACE
0x21	0x0021	# EXCLAMATION MARK
0x22	0x0022	# QUOTATION MARK
0x23	0x0023	# NUMBER SIGN
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
276
277
278
279
280
281
282

283
284
285
286
287
288
289
290
291
292
293
294
295
296
297


298
299
300
301
302
303
304
305
306







-
+














-
-
+
+







0xA7	0x00DF	# LATIN SMALL LETTER SHARP S
0xA8	0x00AE	# REGISTERED SIGN
0xA9	0x00A9	# COPYRIGHT SIGN
0xAA	0x2122	# TRADE MARK SIGN
0xAB	0x00B4	# ACUTE ACCENT
0xAC	0x00A8	# DIAERESIS
0xAD	0x2260	# NOT EQUAL TO
0xAE	0x00C6	# LATIN CAPITAL LIGATURE AE
0xAE	0x00C6	# LATIN CAPITAL LETTER AE
0xAF	0x00D8	# LATIN CAPITAL LETTER O WITH STROKE
0xB0	0x221E	# INFINITY
0xB1	0x00B1	# PLUS-MINUS SIGN
0xB2	0x2264	# LESS-THAN OR EQUAL TO
0xB3	0x2265	# GREATER-THAN OR EQUAL TO
0xB4	0x00A5	# YEN SIGN
0xB5	0x00B5	# MICRO SIGN
0xB6	0x2202	# PARTIAL DIFFERENTIAL
0xB7	0x2211	# N-ARY SUMMATION
0xB8	0x220F	# N-ARY PRODUCT
0xB9	0x03C0	# GREEK SMALL LETTER PI
0xBA	0x222B	# INTEGRAL
0xBB	0x00AA	# FEMININE ORDINAL INDICATOR
0xBC	0x00BA	# MASCULINE ORDINAL INDICATOR
0xBD	0x2126	# OHM SIGN
0xBE	0x00E6	# LATIN SMALL LIGATURE AE
0xBD	0x03A9	# GREEK CAPITAL LETTER OMEGA
0xBE	0x00E6	# LATIN SMALL LETTER AE
0xBF	0x00F8	# LATIN SMALL LETTER O WITH STROKE
0xC0	0x00BF	# INVERTED QUESTION MARK
0xC1	0x00A1	# INVERTED EXCLAMATION MARK
0xC2	0x00AC	# NOT SIGN
0xC3	0x221A	# SQUARE ROOT
0xC4	0x0192	# LATIN SMALL LETTER F WITH HOOK
0xC5	0x2248	# ALMOST EQUAL TO
258
259
260
261
262
263
264
265

266
267
268
269
270
271
272
321
322
323
324
325
326
327

328
329
330
331
332
333
334
335







-
+







0xD4	0x2018	# LEFT SINGLE QUOTATION MARK
0xD5	0x2019	# RIGHT SINGLE QUOTATION MARK
0xD6	0x00F7	# DIVISION SIGN
0xD7	0x25CA	# LOZENGE
0xD8	0x00FF	# LATIN SMALL LETTER Y WITH DIAERESIS
0xD9	0x0178	# LATIN CAPITAL LETTER Y WITH DIAERESIS
0xDA	0x2044	# FRACTION SLASH
0xDB	0x00A4	# CURRENCY SIGN
0xDB	0x20AC	# EURO SIGN
0xDC	0x2039	# SINGLE LEFT-POINTING ANGLE QUOTATION MARK
0xDD	0x203A	# SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
0xDE	0xFB01	# LATIN SMALL LIGATURE FI
0xDF	0xFB02	# LATIN SMALL LIGATURE FL
0xE0	0x2021	# DOUBLE DAGGER
0xE1	0x00B7	# MIDDLE DOT
0xE2	0x201A	# SINGLE LOW-9 QUOTATION MARK
Changes to tools/encoding/macTurkish.txt.


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
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
+
+

+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

-
+
+











-
+



-
-
-
-
+
+
+
+
+
-
-

+
+
+
-
-
+
+



-
-
-
+
+
+

-
+

-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+




-
-
+
+

-
-
-
-
+

-
-
-
-
+
+
-
-







#=======================================================================
#   FTP file name:  TURKISH.TXT
#
#   Contents:       Map (external version) from Mac OS Turkish
#                   character set to Unicode 2.1
#
#   Copyright:      (c) 1995-1999 by Apple Computer, Inc., all rights
#   Name:             MacOS_Turkish [to Unicode]
#   Unicode versions: 1.1, 2.0
#   Table version:    0.2 (from internal ufrm version <4>)
#   Date:             15 April 1995
#   Author:           Peter Edberg <edberg1@applelink.apple.com>
#                   reserved.
#
#   Contact:        charsets@apple.com
#
#   Changes:
#
#       b02  1999-Sep-22    Update contact e-mail address. Matches
#                           internal utom<b1>, ufrm<b1>, and Text
#                           Encoding Converter version 1.5.
#       n05  1998-Feb-05    Minor update to header comments
#       n03  1997-Dec-14    Update to match internal utom<n5>, ufrm<n15>:
#                           Change standard mapping for 0xBD from U+2126
#                           to its canonical decomposition, U+03A9.
#       n02  1995-Apr-15    First version (after fixing some typos).
#                           Matches internal ufrm<n4>.
#
#   Copyright (c) 1995 Apple Computer, Inc.  All Rights reserved.
# Standard header:
# ----------------
#
#   Apple, the Apple logo, and Macintosh are trademarks of Apple
#   Computer, Inc., registered in the United States and other countries.
#   Unicode is a trademark of Unicode Inc. For the sake of brevity,
#   throughout this document, "Macintosh" can be used to refer to
#   Macintosh computers and "Unicode" can be used to refer to the
#   Unicode standard.
#
#   Apple makes no warranty or representation, either express or
#   implied, with respect to these tables, their quality, accuracy, or
#   fitness for a particular purpose. In no event will Apple be liable
#   for direct, indirect, special, incidental, or consequential damages
#   for direct, indirect, special, incidental, or consequential damages 
#   resulting from any defect or inaccuracy in this document or the
#   accompanying tables.
#
#   These mapping tables and character lists are preliminary and
#   subject to change. Updated tables will be available from the
#   Unicode Inc. ftp site (unicode.org), the Apple Computer ftp site
#   (ftp.info.apple.com), the Apple Computer World-Wide Web pages
#   These mapping tables and character lists are subject to change.
#   The latest tables should be available from the following:
#
#   <ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/APPLE/>
#   <ftp://dev.apple.com/devworld/Technical_Documentation/Misc._Standards/>
#   (http://www.info.apple.com), and possibly on diskette from APDA
#   (Apple's mail-order distribution service for developers).
#
#   For general information about Mac OS encodings and these mapping
#   tables, see the file "README.TXT".
#
#   Format:
#   -------
# Format:
# -------
#
#   Three tab-separated columns;
#   '#' begins a comment which continues to the end of the line.
#     Column #1 is the MacOS Turkish code (in hex as 0xNN)
#     Column #2 is the Unicode (in hex as 0xNNNN)
#     Column #3 is the Unicode name (follows a comment sign, '#')
#     Column #1 is the Mac OS Turkish code (in hex as 0xNN)
#     Column #2 is the corresponding Unicode (in hex as 0xNNNN)
#     Column #3 is a comment containing the Unicode name
#
#   The entries are in MacOS Turkish code order.
#   The entries are in Mac OS Turkish code order.
#
#   Two of these mappings requires the use of a corporate character:
#   Two of these mappings requires the use of a corporate character.
#   for the Apple logo character, and for the one undefined code
#   point. See the file "MacOS-CorpCharList".
#   See the file "CORPCHAR.TXT" and notes below.
#
#   Control character mappings are not shown in this table, following
#   the conventions of the standard UTC mapping tables. However, the
#   Mac OS Roman character set uses the standard control characters at
#   0x00-0x1F and 0x7F.
#
# Notes on Mac OS Turkish:
# ------------------------
#
#	Mac OS Turkish is used for Turkish.
#
#   The Mac OS Turkish encoding shares the script code smRoman
#   (0) with the Mac OS Roman encoding. To determine if the Turkish
#   encoding is being used, you must also check if the system region
#   code is 24, verTurkey.
#
#   This character set is a variant of standard Mac OS Roman. It adds
#   upper & lower G with breve, upper & lower S with cedilla, upper I
#   with dot, and moves the dotless lower i from its position at 0xF5
#   in standard Mac OS Roman to a position at 0xDD here (leaving the
#   0xF5 code point undefined in Mac OS Turkish). This gives a total
#   of 7 code point differences from standard Mac OS Roman.
#
# Unicode mapping issues and notes:
# ---------------------------------
#
#   The following corporate zone Unicode characters are used in this
#   mapping:
#
#     0xF8A0  undefined1, used to map the single undefined code point
#             in Mac OS Turkish and Greek (to obtain roundtrip
#             fidelity for all code points).
#     0xF8FF  Apple logo
#
#   NOTE: The graphic image associated with the Apple logo character
#   is not authorized for use without permission of Apple, and
#   unauthorized use might constitute trademark infringement.
#
#   Notes on MacOS Turkish:
#   -----------------------
# Details of mapping changes in each version:
# -------------------------------------------
#
#   The MacOS Turkish encoding shares the script code smRoman
#   (0) with the standard MacOS Roman encoding. To determine if
#   the Turkish encoding is being used, you must also check if the
#   system region code is 24, verTurkey.
#   Changes from version n02 to version n03:
#
#   This character set is a variant of standard MacOS Roman. It adds
#   upper & lower G with breve, upper & lower S with cedilla, upper I
#   with dot, and moves the dotless lower i from its position at 0xF5
#   in standard MacOS Roman to a position at 0xDD here (leaving the
#   - Change mapping of 0xBD from U+2126 to its canonical
#     decomposition, U+03A9.
#   0xF5 code point undefined in MacTurkish). This gives a total of 7
#   code point differences from standard MacOS Roman.
#
##################

0x20	0x0020	# SPACE
0x21	0x0021	# EXCLAMATION MARK
0x22	0x0022	# QUOTATION MARK
0x23	0x0023	# NUMBER SIGN
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
246
247
248
249
250
251
252

253
254
255
256
257
258
259
260
261
262
263
264
265
266
267


268
269
270
271
272
273
274
275
276







-
+














-
-
+
+







0xA7	0x00DF	# LATIN SMALL LETTER SHARP S
0xA8	0x00AE	# REGISTERED SIGN
0xA9	0x00A9	# COPYRIGHT SIGN
0xAA	0x2122	# TRADE MARK SIGN
0xAB	0x00B4	# ACUTE ACCENT
0xAC	0x00A8	# DIAERESIS
0xAD	0x2260	# NOT EQUAL TO
0xAE	0x00C6	# LATIN CAPITAL LIGATURE AE
0xAE	0x00C6	# LATIN CAPITAL LETTER AE
0xAF	0x00D8	# LATIN CAPITAL LETTER O WITH STROKE
0xB0	0x221E	# INFINITY
0xB1	0x00B1	# PLUS-MINUS SIGN
0xB2	0x2264	# LESS-THAN OR EQUAL TO
0xB3	0x2265	# GREATER-THAN OR EQUAL TO
0xB4	0x00A5	# YEN SIGN
0xB5	0x00B5	# MICRO SIGN
0xB6	0x2202	# PARTIAL DIFFERENTIAL
0xB7	0x2211	# N-ARY SUMMATION
0xB8	0x220F	# N-ARY PRODUCT
0xB9	0x03C0	# GREEK SMALL LETTER PI
0xBA	0x222B	# INTEGRAL
0xBB	0x00AA	# FEMININE ORDINAL INDICATOR
0xBC	0x00BA	# MASCULINE ORDINAL INDICATOR
0xBD	0x2126	# OHM SIGN
0xBE	0x00E6	# LATIN SMALL LIGATURE AE
0xBD	0x03A9	# GREEK CAPITAL LETTER OMEGA
0xBE	0x00E6	# LATIN SMALL LETTER AE
0xBF	0x00F8	# LATIN SMALL LETTER O WITH STROKE
0xC0	0x00BF	# INVERTED QUESTION MARK
0xC1	0x00A1	# INVERTED EXCLAMATION MARK
0xC2	0x00AC	# NOT SIGN
0xC3	0x221A	# SQUARE ROOT
0xC4	0x0192	# LATIN SMALL LETTER F WITH HOOK
0xC5	0x2248	# ALMOST EQUAL TO
Added tools/encoding/tis-620.txt.







































































































































































































































































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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# version: 1.0
# repertoiremap: mnemonic,th
#  sources: Thai Industrial Standards Institute, ECMA registry, IANA
# alias TIS620
# alias TIS620-0
# alias TIS620.2529-1
# alias TIS620.2533-0
# alias ISO-IR-1660x00	0x0000 #NULL (NUL)
0x01	0x0001 #START OF HEADING (SOH)
0x02	0x0002 #START OF TEXT (STX)
0x03	0x0003 #END OF TEXT (ETX)
0x04	0x0004 #END OF TRANSMISSION (EOT)
0x05	0x0005 #ENQUIRY (ENQ)
0x06	0x0006 #ACKNOWLEDGE (ACK)
0x07	0x0007 #BELL (BEL)
0x08	0x0008 #BACKSPACE (BS)
0x09	0x0009 #CHARACTER TABULATION (HT)
0x0A	0x000A #LINE FEED (LF)
0x0B	0x000B #LINE TABULATION (VT)
0x0C	0x000C #FORM FEED (FF)
0x0D	0x000D #CARRIAGE RETURN (CR)
0x0E	0x000E #SHIFT OUT (SO)
0x0F	0x000F #SHIFT IN (SI)
0x10	0x0010 #DATALINK ESCAPE (DLE)
0x11	0x0011 #DEVICE CONTROL ONE (DC1)
0x12	0x0012 #DEVICE CONTROL TWO (DC2)
0x13	0x0013 #DEVICE CONTROL THREE (DC3)
0x14	0x0014 #DEVICE CONTROL FOUR (DC4)
0x15	0x0015 #NEGATIVE ACKNOWLEDGE (NAK)
0x16	0x0016 #SYNCHRONOUS IDLE (SYN)
0x17	0x0017 #END OF TRANSMISSION BLOCK (ETB)
0x18	0x0018 #CANCEL (CAN)
0x19	0x0019 #END OF MEDIUM (EM)
0x1A	0x001A #SUBSTITUTE (SUB)
0x1B	0x001B #ESCAPE (ESC)
0x1C	0x001C #FILE SEPARATOR (IS4)
0x1D	0x001D #GROUP SEPARATOR (IS3)
0x1E	0x001E #RECORD SEPARATOR (IS2)
0x1F	0x001F #UNIT SEPARATOR (IS1)
0x20	0x0020 #SPACE
0x21	0x0021 #EXCLAMATION MARK
0x22	0x0022 #QUOTATION MARK
0x23	0x0023 #NUMBER SIGN
0x24	0x0024 #DOLLAR SIGN
0x25	0x0025 #PERCENT SIGN
0x26	0x0026 #AMPERSAND
0x27	0x0027 #APOSTROPHE
0x28	0x0028 #LEFT PARENTHESIS
0x29	0x0029 #RIGHT PARENTHESIS
0x2A	0x002A #ASTERISK
0x2B	0x002B #PLUS SIGN
0x2C	0x002C #COMMA
0x2D	0x002D #HYPHEN-MINUS
0x2E	0x002E #FULL STOP
0x2F	0x002F #SOLIDUS
0x30	0x0030 #DIGIT ZERO
0x31	0x0031 #DIGIT ONE
0x32	0x0032 #DIGIT TWO
0x33	0x0033 #DIGIT THREE
0x34	0x0034 #DIGIT FOUR
0x35	0x0035 #DIGIT FIVE
0x36	0x0036 #DIGIT SIX
0x37	0x0037 #DIGIT SEVEN
0x38	0x0038 #DIGIT EIGHT
0x39	0x0039 #DIGIT NINE
0x3A	0x003A #COLON
0x3B	0x003B #SEMICOLON
0x3C	0x003C #LESS-THAN SIGN
0x3D	0x003D #EQUALS SIGN
0x3E	0x003E #GREATER-THAN SIGN
0x3F	0x003F #QUESTION MARK
0x40	0x0040 #COMMERCIAL AT
0x41	0x0041 #LATIN CAPITAL LETTER A
0x42	0x0042 #LATIN CAPITAL LETTER B
0x43	0x0043 #LATIN CAPITAL LETTER C
0x44	0x0044 #LATIN CAPITAL LETTER D
0x45	0x0045 #LATIN CAPITAL LETTER E
0x46	0x0046 #LATIN CAPITAL LETTER F
0x47	0x0047 #LATIN CAPITAL LETTER G
0x48	0x0048 #LATIN CAPITAL LETTER H
0x49	0x0049 #LATIN CAPITAL LETTER I
0x4A	0x004A #LATIN CAPITAL LETTER J
0x4B	0x004B #LATIN CAPITAL LETTER K
0x4C	0x004C #LATIN CAPITAL LETTER L
0x4D	0x004D #LATIN CAPITAL LETTER M
0x4E	0x004E #LATIN CAPITAL LETTER N
0x4F	0x004F #LATIN CAPITAL LETTER O
0x50	0x0050 #LATIN CAPITAL LETTER P
0x51	0x0051 #LATIN CAPITAL LETTER Q
0x52	0x0052 #LATIN CAPITAL LETTER R
0x53	0x0053 #LATIN CAPITAL LETTER S
0x54	0x0054 #LATIN CAPITAL LETTER T
0x55	0x0055 #LATIN CAPITAL LETTER U
0x56	0x0056 #LATIN CAPITAL LETTER V
0x57	0x0057 #LATIN CAPITAL LETTER W
0x58	0x0058 #LATIN CAPITAL LETTER X
0x59	0x0059 #LATIN CAPITAL LETTER Y
0x5A	0x005A #LATIN CAPITAL LETTER Z
0x5B	0x005B #LEFT SQUARE BRACKET
0x5C	0x005C #REVERSE SOLIDUS
0x5D	0x005D #RIGHT SQUARE BRACKET
0x5E	0x005E #CIRCUMFLEX ACCENT
0x5F	0x005F #LOW LINE
0x60	0x0060 #GRAVE ACCENT
0x61	0x0061 #LATIN SMALL LETTER A
0x62	0x0062 #LATIN SMALL LETTER B
0x63	0x0063 #LATIN SMALL LETTER C
0x64	0x0064 #LATIN SMALL LETTER D
0x65	0x0065 #LATIN SMALL LETTER E
0x66	0x0066 #LATIN SMALL LETTER F
0x67	0x0067 #LATIN SMALL LETTER G
0x68	0x0068 #LATIN SMALL LETTER H
0x69	0x0069 #LATIN SMALL LETTER I
0x6A	0x006A #LATIN SMALL LETTER J
0x6B	0x006B #LATIN SMALL LETTER K
0x6C	0x006C #LATIN SMALL LETTER L
0x6D	0x006D #LATIN SMALL LETTER M
0x6E	0x006E #LATIN SMALL LETTER N
0x6F	0x006F #LATIN SMALL LETTER O
0x70	0x0070 #LATIN SMALL LETTER P
0x71	0x0071 #LATIN SMALL LETTER Q
0x72	0x0072 #LATIN SMALL LETTER R
0x73	0x0073 #LATIN SMALL LETTER S
0x74	0x0074 #LATIN SMALL LETTER T
0x75	0x0075 #LATIN SMALL LETTER U
0x76	0x0076 #LATIN SMALL LETTER V
0x77	0x0077 #LATIN SMALL LETTER W
0x78	0x0078 #LATIN SMALL LETTER X
0x79	0x0079 #LATIN SMALL LETTER Y
0x7A	0x007A #LATIN SMALL LETTER Z
0x7B	0x007B #LEFT CURLY BRACKET
0x7C	0x007C #VERTICAL LINE
0x7D	0x007D #RIGHT CURLY BRACKET
0x7E	0x007E #TILDE
0x7F	0x007F #DELETE (DEL)
0x80		#UNDEFINED
0x81	      	#UNDEFINED
0x82	      	#UNDEFINED
0x83	      	#UNDEFINED
0x84	      	#UNDEFINED
0x85		#UNDEFINED
0x86	      	#UNDEFINED
0x87	      	#UNDEFINED
0x88	      	#UNDEFINED
0x89	      	#UNDEFINED
0x8A	      	#UNDEFINED
0x8B	      	#UNDEFINED
0x8C	      	#UNDEFINED
0x8D	      	#UNDEFINED
0x8E	      	#UNDEFINED
0x8F	      	#UNDEFINED
0x90	      	#UNDEFINED
0x91		#UNDEFINED
0x92		#UNDEFINED
0x93		#UNDEFINED
0x94		#UNDEFINED
0x95		#UNDEFINED
0x96		#UNDEFINED
0x97		#UNDEFINED
0x98	      	#UNDEFINED
0x99	      	#UNDEFINED
0x9A	      	#UNDEFINED
0x9B	      	#UNDEFINED
0x9C	      	#UNDEFINED
0x9D	      	#UNDEFINED
0x9E	      	#UNDEFINED
0x9F	      	#UNDEFINED
0xA0		#UNDEFINED
0xA1	0x0E01 #THAI CHARACTER KO KAI
0xA2	0x0E02 #THAI CHARACTER KHO KHAI
0xA3	0x0E03 #THAI CHARACTER KHO KHUAT
0xA4	0x0E04 #THAI CHARACTER KHO KHWAI
0xA5	0x0E05 #THAI CHARACTER KHO KHON
0xA6	0x0E06 #THAI CHARACTER KHO RAKHANG
0xA7	0x0E07 #THAI CHARACTER NGO NGU
0xA8	0x0E08 #THAI CHARACTER CHO CHAN
0xA9	0x0E09 #THAI CHARACTER CHO CHING
0xAA	0x0E0A #THAI CHARACTER CHO CHANG
0xAB	0x0E0B #THAI CHARACTER SO SO 
0xAC	0x0E0C #THAI CHARACTER CHO CHOE
0xAD	0x0E0D #THAI CHARACTER YO YING
0xAE	0x0E0E #THAI CHARACTER DO CHADA
0xAF	0x0E0F #THAI CHARACTER TO PATAK
0xB0	0x0E10 #THAI CHARACTER THO THAN
0xB1	0x0E11 #THAI CHARACTER THO NANGMONTHO
0xB2	0x0E12 #THAI CHARACTER THO PHUTHAO
0xB3	0x0E13 #THAI CHARACTER NO NEN
0xB4	0x0E14 #THAI CHARACTER DO DEK
0xB5	0x0E15 #THAI CHARACTER TO TAO
0xB6	0x0E16 #THAI CHARACTER THO THUNG
0xB7	0x0E17 #THAI CHARACTER THO THAHAN
0xB8	0x0E18 #THAI CHARACTER THO THONG
0xB9	0x0E19 #THAI CHARACTER NO NU
0xBA	0x0E1A #THAI CHARACTER BO BAIMAI
0xBB	0x0E1B #THAI CHARACTER PO PLA
0xBC	0x0E1C #THAI CHARACTER PHO PHUNG
0xBD	0x0E1D #THAI CHARACTER FO FA
0xBE	0x0E1E #THAI CHARACTER PHO PHAN
0xBF	0x0E1F #THAI CHARACTER FO FAN
0xC0	0x0E20 #THAI CHARACTER PHO SAMPHAO
0xC1	0x0E21 #THAI CHARACTER MO MA
0xC2	0x0E22 #THAI CHARACTER YO YAK
0xC3	0x0E23 #THAI CHARACTER RO RUA
0xC4	0x0E24 #THAI CHARACTER RU
0xC5	0x0E25 #THAI CHARACTER LO LING
0xC6	0x0E26 #THAI CHARACTER LU
0xC7	0x0E27 #THAI CHARACTER WO WAEN
0xC8	0x0E28 #THAI CHARACTER SO SALA
0xC9	0x0E29 #THAI CHARACTER SO RUSI
0xCA	0x0E2A #THAI CHARACTER SO SUA
0xCB	0x0E2B #THAI CHARACTER HO HIP
0xCC	0x0E2C #THAI CHARACTER LO CHULA
0xCD	0x0E2D #THAI CHARACTER O ANG
0xCE	0x0E2E #THAI CHARACTER HO NOKHUK
0xCF	0x0E2F #THAI CHARACTER PAIYANNOI
0xD0	0x0E30 #THAI CHARACTER SARA A
0xD1	0x0E31 #THAI CHARACTER MAI HAN-AKAT
0xD2	0x0E32 #THAI CHARACTER SARA AA
0xD3	0x0E33 #THAI CHARACTER SARA AM
0xD4	0x0E34 #THAI CHARACTER SARA I
0xD5	0x0E35 #THAI CHARACTER SARA II
0xD6	0x0E36 #THAI CHARACTER SARA UE
0xD7	0x0E37 #THAI CHARACTER SARA UEE
0xD8	0x0E38 #THAI CHARACTER SARA U
0xD9	0x0E39 #THAI CHARACTER SARA UU
0xDA	0x0E3A #THAI CHARACTER PHINTHU
0xDB	      	#UNDEFINED
0xDC	      	#UNDEFINED
0xDD	      	#UNDEFINED
0xDE	      	#UNDEFINED
0xDF	0x0E3F #THAI CHARACTER SYMBOL BAHT
0xE0	0x0E40 #THAI CHARACTER SARA E
0xE1	0x0E41 #THAI CHARACTER SARA AE
0xE2	0x0E42 #THAI CHARACTER SARA O
0xE3	0x0E43 #THAI CHARACTER SARA AI MAIMUAN
0xE4	0x0E44 #THAI CHARACTER SARA AI MAIMALAI
0xE5	0x0E45 #THAI CHARACTER LAKKHANGYAO
0xE6	0x0E46 #THAI CHARACTER MAIYAMOK
0xE7	0x0E47 #THAI CHARACTER MAITAIKHU
0xE8	0x0E48 #THAI CHARACTER MAI EK
0xE9	0x0E49 #THAI CHARACTER MAI THO
0xEA	0x0E4A #THAI CHARACTER MAI TRI
0xEB	0x0E4B #THAI CHARACTER MAI CHATTAWA
0xEC	0x0E4C #THAI CHARACTER THANTHAKHAT
0xED	0x0E4D #THAI CHARACTER NIKHAHIT
0xEE	0x0E4E #THAI CHARACTER YAMAKKAN
0xEF	0x0E4F #THAI CHARACTER FONGMAN
0xF0	0x0E50 #THAI DIGIT ZERO
0xF1	0x0E51 #THAI DIGIT ONE
0xF2	0x0E52 #THAI DIGIT TWO
0xF3	0x0E53 #THAI DIGIT THREE
0xF4	0x0E54 #THAI DIGIT FOUR
0xF5	0x0E55 #THAI DIGIT FIVE
0xF6	0x0E56 #THAI DIGIT SIX
0xF7	0x0E57 #THAI DIGIT SEVEN
0xF8	0x0E58 #THAI DIGIT EIGHT
0xF9	0x0E59 #THAI DIGIT NINE
0xFA	0x0E5A #THAI CHARACTER ANGKHANKHU
0xFB	0x0E5B #THAI CHARACTER KHOMUT
0xFC	      	#UNDEFINED
0xFD	      	#UNDEFINED
0xFE	      	#UNDEFINED
0xFF	      	#UNDEFINED
Changes to tools/genStubs.tcl.
1
2
3
4
5
6
7
8
9
10
11



12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10

11
12
13
14
15
16
17
18
19
20










-
+
+
+







# genStubs.tcl --
#
#	This script generates a set of stub files for a given
#	interface.  
#	
#
# Copyright (c) 1998-1999 by Scriptics Corporation.
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
# 
# RCS: @(#) $Id: genStubs.tcl,v 1.7 1999/06/10 04:29:01 stanton Exp $
# RCS: @(#) $Id: genStubs.tcl,v 1.7.10.1 2001/08/24 16:19:10 dgp Exp $

package require Tcl 8

namespace eval genStubs {
    # libraryName --
    #
    #	The name of the entire library.  This value is used to compute
    #	the USE_*_STUB_PROCS macro and the name of the init file.

Changes to tools/man2help.tcl.
1
2
3
4
5
6
7
8
9

10
11
12
13
14
15
16
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
16








-
+







# man2help.tcl --
#
# This file defines procedures that work in conjunction with the
# man2tcl program to generate a Windows help file from Tcl manual
# entries.
#
# Copyright (c) 1996 by Sun Microsystems, Inc.
#
# RCS: @(#) $Id: man2help.tcl,v 1.6 1999/12/22 22:59:59 hobbs Exp $
# RCS: @(#) $Id: man2help.tcl,v 1.6.2.1 2001/04/03 22:54:38 hobbs Exp $
# 

#
# PASS 1
#

proc generateContents {basename version files} {
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
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







-
+

















-
+











# that directory.
#
# Arguments:
# dir -			Name of the directory.

proc doDir dir {
    puts "Generating man pages for $dir..."
    foreach f [lsort [glob [file join $dir *.\[13n\]]]] {
    foreach f [lsort [glob -directory $dir "*.\[13n\]"]] {
	do $f
    }
}

# process command line arguments

if {$argc < 3} {
    puts stderr "usage: $argv0 projectName version manFiles..."
    exit 1
}

set baseName [lindex $argv 0]
set version [lindex $argv 1]
set files {}
foreach i [lrange $argv 2 end] {
    set i [file join $i]
    if {[file isdir $i]} {
	foreach f [lsort [glob [file join $i *.\[13n\]]]] {
	foreach f [lsort [glob -directory $i "*.\[13n\]"]] {
	    lappend files $f
	}
    } elseif {[file exists $i]} {
	lappend files $i
    }
}

source [file join [file dir $argv0] index.tcl]
generateContents $baseName $version $files
source [file join [file dir $argv0] man2help2.tcl]
generateHelp $baseName $files
Changes to tools/man2html.tcl.
71
72
73
74
75
76
77
78

79
80
81
82
83
84
85
71
72
73
74
75
76
77

78
79
80
81
82
83
84
85







-
+







# Given a directory as argument, translate all the man pages in
# that directory.
#
# Arguments:
# dir -			Name of the directory.

proc doDir dir {
    foreach f [lsort [glob $dir/*.\[13n\]]] {
    foreach f [lsort [glob -directory $dir "*.\[13n\]"]] {
	do $f	;# defined in man2html1.tcl & man2html2.tcl
    }
}


if {$argc < 2} {
    puts stderr "usage: $argv0 html_dir tcl_dir packages..."
Changes to tools/tcl.hpj.in.
1
2
3
4
5
6
7
8
9

10
11
12
13
14
15
16
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
16








-
+







; This file is maintained by HCW. Do not modify this file directly.

[OPTIONS]
HCW=0
LCID=0x409 0x0 0x0 ;English (United States)
REPORT=Yes
TITLE=Tcl/Tk Reference Manual
CNT=tcl83.cnt
COPYRIGHT=Copyright © 1999 Scriptics Corporation
COPYRIGHT=Copyright © 2001 ActiveState Corporation
HLP=tcl83.hlp

[FILES]
tcl.rtf

[WINDOWS]
main="Tcl/Tk Reference Manual",,0
Changes to tools/tcl.wse.in.
8
9
10
11
12
13
14
15

16
17
18
19
20
21
22
8
9
10
11
12
13
14

15
16
17
18
19
20
21
22







-
+







  Japanese Font Size=10
  Start Gradient=0 0 255
  End Gradient=0 0 0
  Windows Flags=00000000000000010010110000001000
  Log Pathname=%MAINDIR%\INSTALL.LOG
  Message Font=MS Sans Serif
  Font Size=8
  Disk Label=tcl8.3.1
  Disk Label=tcl8.3.4
  Disk Filename=setup
  Patch Flags=0000000000000001
  Patch Threshold=85
  Patch Memory=4000
  Variable Name1=_SYS_
  Variable Default1=C:\WINDOWS\SYSTEM
  Variable Flags1=00001000
50
51
52
53
54
55
56
57

58
59
60
61
62
63
64
50
51
52
53
54
55
56

57
58
59
60
61
62
63
64







-
+







end
item: Set Variable
  Variable=APPTITLE
  Value=Tcl/Tk %PATCHLEVEL% for Windows
end
item: Set Variable
  Variable=URL
  Value=http://dev.scriptics.com/registration/%PATCHLEVEL%.html
  Value=http://www.tcl-tk.net/
end
item: Set Variable
  Variable=GROUP
  Value=Tcl
end
item: Set Variable
  Variable=DISABLED
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
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







+
+
+
+
+















+
+
+
+
+








-
-
+
+



-
-
+
+







  Flags=0000000000000010
end
item: Install File
  Source=${__TKBASEDIR__}\generic\tkDecls.h
  Destination=%MAINDIR%\include\tkDecls.h
  Flags=0000000000000010
end
item: Install File
  Source=${__TKBASEDIR__}\generic\tkPlatDecls.h
  Destination=%MAINDIR%\include\tkPlatDecls.h
  Flags=0000000000000010
end
item: Install File
  Source=${__TKBASEDIR__}\generic\tkIntXlibDecls.h
  Destination=%MAINDIR%\include\tkIntXlibDecls.h
  Flags=0000000000000010
end
item: Install File
  Source=${__TCLBASEDIR__}\generic\tcl.h
  Destination=%MAINDIR%\include\tcl.h
  Flags=0000000000000010
end
item: Install File
  Source=${__TCLBASEDIR__}\generic\tclDecls.h
  Destination=%MAINDIR%\include\tclDecls.h
  Flags=0000000000000010
end
item: Install File
  Source=${__TCLBASEDIR__}\generic\tclPlatDecls.h
  Destination=%MAINDIR%\include\tclPlatDecls.h
  Flags=0000000000000010
end
item: End Block
end
item: If/While Statement
  Variable=COMPONENTS
  Value=A
  Flags=00001010
end
item: Install File
  Source=${__TCLBASEDIR__}\library\msgcat1.0\pkgIndex.tcl
  Destination=%MAINDIR%\lib\tcl%VER%\msgcat1.0\pkgIndex.tcl
  Source=${__TCLBASEDIR__}\library\msgcat\pkgIndex.tcl
  Destination=%MAINDIR%\lib\tcl%VER%\msgcat1.1\pkgIndex.tcl
  Flags=0000000010000010
end
item: Install File
  Source=${__TCLBASEDIR__}\library\msgcat1.0\msgcat.tcl
  Destination=%MAINDIR%\lib\tcl%VER%\msgcat1.0\msgcat.tcl
  Source=${__TCLBASEDIR__}\library\msgcat\msgcat.tcl
  Destination=%MAINDIR%\lib\tcl%VER%\msgcat1.1\msgcat.tcl
  Flags=0000000010000010
end
item: Install File
  Source=${__TCLBASEDIR__}\library\tcltest1.0\pkgIndex.tcl
  Destination=%MAINDIR%\lib\tcl%VER%\tcltest1.0\pkgIndex.tcl
  Flags=0000000000000010
end
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
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







-
+




-
+




-
-
+
+



-
-
+
+







end
item: Install File
  Source=${__TCLBASEDIR__}\library\encoding\big5.enc
  Destination=%MAINDIR%\lib\tcl%VER%\encoding\big5.enc
  Flags=0000000000000010
end
item: Install File
  Source=${__TCLBASEDIR__}\library\opt0.4\pkgIndex.tcl
  Source=${__TCLBASEDIR__}\library\opt\pkgIndex.tcl
  Destination=%MAINDIR%\lib\tcl%VER%\opt0.4\pkgIndex.tcl
  Flags=0000000000000010
end
item: Install File
  Source=${__TCLBASEDIR__}\library\opt0.4\optparse.tcl
  Source=${__TCLBASEDIR__}\library\opt\optparse.tcl
  Destination=%MAINDIR%\lib\tcl%VER%\opt0.4\optparse.tcl
  Flags=0000000000000010
end
item: Install File
  Source=${__TCLBASEDIR__}\library\http2.3\pkgIndex.tcl
  Destination=%MAINDIR%\lib\tcl%VER%\http2.3\pkgIndex.tcl
  Source=${__TCLBASEDIR__}\library\http\pkgIndex.tcl
  Destination=%MAINDIR%\lib\tcl%VER%\http2.4\pkgIndex.tcl
  Flags=0000000000000010
end
item: Install File
  Source=${__TCLBASEDIR__}\library\http2.3\http.tcl
  Destination=%MAINDIR%\lib\tcl%VER%\http2.3\http.tcl
  Source=${__TCLBASEDIR__}\library\http\http.tcl
  Destination=%MAINDIR%\lib\tcl%VER%\http2.4\http.tcl
  Flags=0000000000000010
end
item: Install File
  Source=${__TKBASEDIR__}\library\msgbox.tcl
  Destination=%MAINDIR%\lib\tk%VER%\msgbox.tcl
  Flags=0000000000000010
end
2024
2025
2026
2027
2028
2029
2030
2031

2032
2033
2034
2035
2036
2037
2038
2034
2035
2036
2037
2038
2039
2040

2041
2042
2043
2044
2045
2046
2047
2048







-
+







end
item: Set Variable
  Variable=MAINDIR
  Value=%MAINDIR%
  Flags=00010100
end
item: Include Script
  Pathname=\\pop\tools\1.2\win32-ix86\wise\INCLUDE\uninstal.wse
  Pathname=D:\win32-ix86\wise\INCLUDE\uninstal.wse
end
item: Check Configuration
  Flags=10111011
end
item: Get Registry Key Value
  Variable=GROUPDIR
  Key=Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2216
2217
2218
2219
2220
2221
2222









2223
2224
2225
2226
2227
2228
2229







-
-
-
-
-
-
-
-
-







end
item: Add Directory to Path
  Directory=%MAINDIR%\bin
end
item: Check Configuration
  Flags=10111011
end
item: Set Variable
  Variable=TO_SCRIPTICS
  Value=A
end
item: Else Statement
end
item: Set Variable
  Variable=TO_SCRIPTICS
end
item: End Block
end
item: Wizard Block
  Direction Variable=DIRECTION
  Display Variable=DISPLAY
  Bitmap Pathname=%_WISE_%\DIALOGS\TEMPLATE\WIZARD.BMP
  X Position=9
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2314
2315
2316
2317
2318
2319
2320














2321
2322
2323
2324
2325
2326
2327










2328
2329
2330
2331
2332
2333







-
-
-
-
-
-
-
-
-
-
-
-
-
-







-
-
-
-
-
-
-
-
-
-






      Text Spanish=%APPTITLE% se ha instalado con éxito.
      Text Spanish=
      Text Spanish=Presione el botón Terminar para salir de esta instalación.
      Text Italian=L'installazione %APPTITLE% è stata portata a termine con successo.
      Text Italian=
      Text Italian=Premere il pulsante Fine per uscire dall'installazione.
    end
    item: Checkbox
      Rectangle=88 143 245 157
      Variable=TO_SCRIPTICS
      Enabled Color=00000000000000001111111111111111
      Create Flags=01010000000000010000000000000011
      Text=Show me important information about
      Text=
    end
    item: Static
      Rectangle=99 156 245 170
      Enabled Color=00000000000000001111111111111111
      Create Flags=01010000000000000000000000000000
      Text=Tcl/Tk %VER% and TclPro
    end
  end
end
item: End Block
end
item: Check Configuration
  Flags=10111011
end
item: If/While Statement
  Variable=TO_SCRIPTICS
  Value=A
  Flags=00000010
end
item: Execute Program
  Command Line=%URL%
end
item: End Block
end
item: Execute Program
  Pathname=explorer
  Command Line=%GROUP%
end
item: End Block
end
Changes to tools/tclSplash.bmp.

cannot compute difference between binary files

Changes to tools/tclmin.wse.
32
33
34
35
36
37
38
39
40


41
42
43
44
45


46
47
48
49
50
51
52
32
33
34
35
36
37
38


39
40
41
42
43


44
45
46
47
48
49
50
51
52







-
-
+
+



-
-
+
+







end
item: Install File
  Source=n:\dist\tcl8.0\library\opt0.4\optparse.tcl
  Destination=%MAINDIR%\lib\tcl%VER%\opt0.4\optparse.tcl
  Flags=0000000000000010
end
item: Install File
  Source=n:\dist\tcl8.0\library\http2.1\pkgIndex.tcl
  Destination=%MAINDIR%\lib\tcl%VER%\http2.1\pkgIndex.tcl
  Source=n:\dist\tcl8.0\library\http\pkgIndex.tcl
  Destination=%MAINDIR%\lib\tcl%VER%\http2.4\pkgIndex.tcl
  Flags=0000000000000010
end
item: Install File
  Source=n:\dist\tcl8.0\library\http2.1\http.tcl
  Destination=%MAINDIR%\lib\tcl%VER%\http2.1\http.tcl
  Source=n:\dist\tcl8.0\library\http\http.tcl
  Destination=%MAINDIR%\lib\tcl%VER%\http2.4\http.tcl
  Flags=0000000000000010
end
item: Install File
  Source=n:\dist\tcl8.0\library\safe.tcl
  Destination=%MAINDIR%\lib\tcl%VER%\safe.tcl
  Flags=0000000000000010
end
Changes to unix/Makefile.in.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







#
# This file is a Makefile for Tcl.  If it has the name "Makefile.in"
# then it is a template for a Makefile;  to generate the actual Makefile,
# run "./configure", which is a configuration script generated by the
# "autoconf" program (constructs like "@foo@" will get replaced in the
# actual Makefile.
#
# RCS: @(#) $Id: Makefile.in,v 1.63 2000/04/25 20:58:48 hobbs Exp $
# RCS: @(#) $Id: Makefile.in,v 1.63.2.10 2002/03/26 02:27:27 hobbs Exp $

VERSION 		= @TCL_VERSION@

#----------------------------------------------------------------
# Things you can change to personalize the Makefile for your own
# site (you can make these changes in either Makefile.in or
# Makefile, but changes to Makefile will get lost if you re-run
83
84
85
86
87
88
89
90






91
92
93
94
95
96
97
83
84
85
86
87
88
89

90
91
92
93
94
95
96
97
98
99
100
101
102







-
+
+
+
+
+
+







CFLAGS_OPTIMIZE		= @CFLAGS_OPTIMIZE@

# To change the compiler switches, for example to change from optimization to
# debugging symbols, change the following line:
#CFLAGS			= $(CFLAGS_DEBUG)
#CFLAGS			= $(CFLAGS_OPTIMIZE)
#CFLAGS			= $(CFLAGS_DEBUG) $(CFLAGS_OPTIMIZE)
CFLAGS			= @CFLAGS@
CFLAGS			= @CFLAGS@ @CFLAGS_DEFAULT@

# Flags to pass to the linker
LDFLAGS_DEBUG		= @LDFLAGS_DEBUG@
LDFLAGS_OPTIMIZE	= @LDFLAGS_OPTIMIZE@
LDFLAGS			= @LDFLAGS@ @LDFLAGS_DEFAULT@

# To disable ANSI-C procedure prototypes reverse the comment characters
# on the following lines:
PROTO_FLAGS		=
#PROTO_FLAGS		= -DNO_PROTOTYPE

# Mathematical functions like sin and atan2 are enabled for expressions
129
130
131
132
133
134
135
136

137
138
139
140
141
142
143
134
135
136
137
138
139
140

141
142
143
144
145
146
147
148







-
+







# lines.  Warning:  if you enable memory debugging, you must do it
# *everywhere*, including all the code that calls Tcl, and you must use
# ckalloc and ckfree everywhere instead of malloc and free.
MEM_DEBUG_FLAGS		=
#MEM_DEBUG_FLAGS	= -DTCL_MEM_DEBUG

# To enable support for stubs in Tcl.
STUB_LIB_FILE		= @STUB_LIB_FILE@
STUB_LIB_FILE		= @TCL_STUB_LIB_FILE@

TCL_STUB_LIB_FILE	= @TCL_STUB_LIB_FILE@
#TCL_STUB_LIB_FILE	= libtclstub.a

TCL_STUB_LIB_FLAG	= @TCL_STUB_LIB_FLAG@
#TCL_STUB_LIB_FLAG	= -ltclstub

157
158
159
160
161
162
163



164
165

166
167
168
169
170
171
172
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181







+
+
+


+







SHELL			= /bin/sh

# Tcl used to let the configure script choose which program to use
# for installing, but there are just too many different versions of
# "install" around;  better to use the install-sh script that comes
# with the distribution, which is slower but guaranteed to work.

INSTALL_STRIP_PROGRAM   = -s
INSTALL_STRIP_LIBRARY  = -S -S

INSTALL			= @srcdir@/install-sh -c
INSTALL_PROGRAM		= ${INSTALL}
INSTALL_LIBRARY		= ${INSTALL}
INSTALL_DATA		= ${INSTALL} -m 644

# The following specifies which Tcl executable to use for make targets
# below.  This can generally be 'tclsh', meaning all targets will work
# once we have created the initial executable, but in some cases you
# may want to use a target without having made tclsh on these sources
# (like for make genstubs)
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
244
245
246
247
248
249

250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270


271
272
273
274
275
276
277
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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258

259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278


279
280
281
282
283
284
285
286
287







+












-

+



















-
+



















-
-
+
+







# Makefile is generated from Makefile.in.  You shouldn't normally
# modify any of this stuff by hand.
#----------------------------------------------------------------

COMPAT_OBJS		= @LIBOBJS@

AC_FLAGS		= @EXTRA_CFLAGS@ @DEFS@
AR			= @AR@
RANLIB			= @RANLIB@
SRC_DIR			= @srcdir@
TOP_DIR			= @srcdir@/..
GENERIC_DIR		= $(TOP_DIR)/generic
COMPAT_DIR		= $(TOP_DIR)/compat
TOOL_DIR		= $(TOP_DIR)/tools
UNIX_DIR		= $(TOP_DIR)/unix
# Must be absolute because of the cd dltest $(DLTEST_DIR)/configure below.
DLTEST_DIR		= @TCL_SRC_DIR@/unix/dltest
# Must be absolute to so the corresponding tcltest's tcl_library is absolute.
TCL_BUILDTIME_LIBRARY	= @TCL_SRC_DIR@/library

#CC			= purify -best-effort @CC@
CC			= @CC@
#CC			= purify -best-effort @CC@ -DPURIFY

#----------------------------------------------------------------
# The information below should be usable as is.  The configure
# script won't modify it and you shouldn't need to modify it
# either.
#----------------------------------------------------------------


CC_SWITCHES = ${CFLAGS} ${CFLAGS_WARNING} ${SHLIB_CFLAGS} \
-I${GENERIC_DIR} -I${SRC_DIR} \
${AC_FLAGS} ${MATH_FLAGS} ${GENERIC_FLAGS} ${PROTO_FLAGS} ${MEM_DEBUG_FLAGS} \
${COMPILE_DEBUG_FLAGS} ${NO_DEPRECATED_FLAGS} ${ENV_FLAGS} \
-DTCL_SHLIB_EXT=\"${SHLIB_SUFFIX}\"

STUB_CC_SWITCHES = ${CFLAGS} ${CFLAGS_WARNING} ${SHLIB_CFLAGS} \
-I${GENERIC_DIR} -I${SRC_DIR} \
${AC_FLAGS} ${MATH_FLAGS} ${GENERIC_FLAGS} ${PROTO_FLAGS} ${MEM_DEBUG_FLAGS} \
${COMPILE_DEBUG_FLAGS} ${ENV_FLAGS} -DTCL_SHLIB_EXT=\"${SHLIB_SUFFIX}\"

LIBS		= @DL_LIBS@ @LIBS@ $(MATH_LIBS) -lc
LIBS		= @DL_LIBS@ @LIBS@ $(MATH_LIBS)

DEPEND_SWITCHES	= ${CFLAGS} -I${GENERIC_DIR} -I${SRC_DIR} \
${AC_FLAGS} ${MATH_FLAGS} \
${GENERIC_FLAGS} ${PROTO_FLAGS} ${MEM_DEBUG_FLAGS} \
-DTCL_SHLIB_EXT=\"${SHLIB_SUFFIX}\"

TCLSH_OBJS = tclAppInit.o

TCLTEST_OBJS = tclTestInit.o tclTest.o tclTestObj.o tclTestProcBodyObj.o \
	tclThreadTest.o	tclUnixTest.o

XTTEST_OBJS = xtTestInit.o tclTest.o tclTestObj.o tclTestProcBodyObj.o \
	tclThreadTest.o	tclUnixTest.o tclXtNotify.o tclXtTest.o 

GENERIC_OBJS = regcomp.o regexec.o regfree.o regerror.o tclAlloc.o \
	tclAsync.o tclBasic.o tclBinary.o \
	tclCkalloc.o tclClock.o tclCmdAH.o tclCmdIL.o tclCmdMZ.o \
	tclCompCmds.o tclCompExpr.o tclCompile.o tclDate.o tclEncoding.o \
	tclEnv.o tclEvent.o tclExecute.o tclFCmd.o tclFileName.o tclGet.o \
	tclHash.o tclHistory.o tclIndexObj.o tclInterp.o tclIO.o \
	tclIOCmd.o tclIOSock.o tclIOUtil.o tclLink.o tclListObj.o \
	tclHash.o tclHistory.o tclIndexObj.o tclInterp.o tclIO.o tclIOCmd.o \
	tclIOGT.o tclIOSock.o tclIOUtil.o tclLink.o tclListObj.o \
	tclLiteral.o tclLoad.o tclMain.o tclNamesp.o tclNotify.o \
	tclObj.o tclPanic.o tclParse.o tclParseExpr.o tclPipe.o \
	tclPkg.o tclPosixStr.o tclPreserve.o tclProc.o tclRegexp.o \
	tclResolve.o tclResult.o tclScan.o tclStringObj.o tclThread.o \
	tclStubInit.o tclStubLib.o tclTimer.o tclUtf.o tclUtil.o tclVar.o

STUB_LIB_OBJS = tclStubLib.o ${COMPAT_OBJS}
320
321
322
323
324
325
326

327
328
329
330
331
332
333
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344







+







	$(GENERIC_DIR)/tclGet.c \
	$(GENERIC_DIR)/tclHash.c \
	$(GENERIC_DIR)/tclHistory.c \
	$(GENERIC_DIR)/tclIndexObj.c \
	$(GENERIC_DIR)/tclInterp.c \
	$(GENERIC_DIR)/tclIO.c \
	$(GENERIC_DIR)/tclIOCmd.c \
	$(GENERIC_DIR)/tclIOGT.c \
	$(GENERIC_DIR)/tclIOSock.c \
	$(GENERIC_DIR)/tclIOUtil.c \
	$(GENERIC_DIR)/tclLink.c \
	$(GENERIC_DIR)/tclListObj.c \
	$(GENERIC_DIR)/tclLiteral.c \
	$(GENERIC_DIR)/tclLoad.c \
	$(GENERIC_DIR)/tclMain.c \
403
404
405
406
407
408
409

410


411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430

431
432
433
434

435
436
437
438
439
440



441
442
443
444
445
446
447

448
449
450
451
452
453
454
455


















456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476

477
478
479
480
481
482
483
414
415
416
417
418
419
420
421

422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442

443
444
445
446

447
448

449
450
451
452
453
454
455
456
457
458
459
460
461

462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508

509
510
511
512
513
514
515
516







+
-
+
+



















-
+



-
+

-




+
+
+






-
+








+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+




















-
+







doc:

# The following target is configured by autoconf to generate either
# a shared library or non-shared library for Tcl.
${TCL_LIB_FILE}: ${OBJS} ${STUB_LIB_FILE}
	rm -f ${TCL_LIB_FILE}
	@MAKE_LIB@
	if test "x@DL_OBJS@" = "xtclLoadAout.o"; then \
	$(RANLIB) ${TCL_LIB_FILE}
		$(RANLIB) ${TCL_LIB_FILE}; \
	fi

${STUB_LIB_FILE}: ${STUB_LIB_OBJS}
	rm -f ${STUB_LIB_FILE}
	@MAKE_STUB_LIB@
	$(RANLIB) ${STUB_LIB_FILE}

# Make target which outputs the list of the .o contained in the Tcl lib
# usefull to build a single big shared library containing Tcl and other
# extensions.  used for the Tcl Plugin.  -- dl
# The dependency on OBJS is not there because we just want the list
# of objects here, not actually building them
tclLibObjs:
	@echo ${OBJS}
# This targets actually build the objects needed for the lib in the above
# case
objs: ${OBJS}


tclsh: ${TCLSH_OBJS} ${TCL_LIB_FILE}
	${CC} @LDFLAGS@ ${TCLSH_OBJS} @TCL_BUILD_LIB_SPEC@ ${LIBS} \
	${CC} ${LDFLAGS} ${TCLSH_OBJS} @TCL_BUILD_LIB_SPEC@ ${LIBS} \
		@TCL_LD_SEARCH_FLAGS@ -o tclsh

tcltest: ${TCLTEST_OBJS} ${TCL_LIB_FILE} ${BUILD_DLTEST}
	${CC} @LDFLAGS@ ${TCLTEST_OBJS} @TCL_BUILD_LIB_SPEC@ ${LIBS} \
	${CC} ${LDFLAGS} ${TCLTEST_OBJS} @TCL_BUILD_LIB_SPEC@ ${LIBS} \
		@TCL_LD_SEARCH_FLAGS@ -o tcltest


# Note, in the target below TCL_LIBRARY needs to be set or else
# "make test" won't work in the case where the compilation directory
# isn't the same as the source directory.
# Specifying TESTFLAGS on the command line is the standard way to pass
# args to tcltest, ie:
#	% make test TESTFLAGS="-verbose bps -file fileName.test"

test: tcltest
	LD_LIBRARY_PATH=`pwd`:${LD_LIBRARY_PATH}; export LD_LIBRARY_PATH; \
	LIBPATH=`pwd`:${LIBPATH}; export LIBPATH; \
	SHLIB_PATH=`pwd`:${SHLIB_PATH}; export SHLIB_PATH; \
	TCL_LIBRARY="${TCL_BUILDTIME_LIBRARY}"; export TCL_LIBRARY; \
	./tcltest $(TOP_DIR)/tests/all.tcl $(TCLTESTARGS)
	./tcltest $(TOP_DIR)/tests/all.tcl $(TESTFLAGS) $(TCLTESTARGS)

# Useful target to launch a built tcltest with the proper path,...
runtest: tcltest
	LD_LIBRARY_PATH=`pwd`:${LD_LIBRARY_PATH}; export LD_LIBRARY_PATH; \
	LIBPATH=`pwd`:${LIBPATH}; export LIBPATH; \
	SHLIB_PATH=`pwd`:${SHLIB_PATH}; export SHLIB_PATH; \
	TCL_LIBRARY="${TCL_BUILDTIME_LIBRARY}"; export TCL_LIBRARY; \
	./tcltest

# This target can be used to run tclsh from the build directory
# via `make shell SCRIPT=/tmp/foo.tcl`
shell: tclsh
	@LD_LIBRARY_PATH=`pwd`:${LD_LIBRARY_PATH}; export LD_LIBRARY_PATH; \
	LIBPATH=`pwd`:${LIBPATH}; export LIBPATH; \
	SHLIB_PATH=`pwd`:${SHLIB_PATH}; export SHLIB_PATH; \
	TCL_LIBRARY="${TCL_BUILDTIME_LIBRARY}"; export TCL_LIBRARY; \
	./tclsh $(SCRIPT)

# This target can be used to run tclsh inside either gdb or insight
gdb: tclsh
	@echo "set env LD_LIBRARY_PATH=`pwd`:${LD_LIBRARY_PATH}" > gdb.run
	@echo "set env LIBPATH=`pwd`:${LIBPATH}" >> gdb.run
	@echo "set env SHLIB_PATH=`pwd`:${SHLIB_PATH}" >> gdb.run
	@echo "set env TCL_LIBRARY=${TCL_BUILDTIME_LIBRARY}" >> gdb.run
	gdb ./tclsh --command=gdb.run
	rm gdb.run

# The following target outputs the name of the top-level source directory
# for Tcl (it is used by Tk's configure script, for example).  The
# .NO_PARALLEL line is needed to avoid problems under Sun's "pmake".
# Note: this target is now obsolete (use the autoconf variable
# TCL_SRC_DIR from tclConfig.sh instead).

.NO_PARALLEL: topDirName
topDirName:
	@cd $(TOP_DIR); pwd

# The following target generates the file generic/tclDate.c 
# from the yacc grammar found in generic/tclGetDate.y.  This is
# only run by hand as yacc is not available in all environments.
# The name of the .c file is different than the name of the .y file
# so that make doesn't try to automatically regenerate the .c file.

gendate:
	yacc -l $(GENERIC_DIR)/tclGetDate.y
	sed -e 's/yy/TclDate/g' -e '/^#include <values.h>/d' \
	    -e 's?SCCSID?RCS: @(#) $$Id: Makefile.in,v 1.63 2000/04/25 20:58:48 hobbs Exp $$?' \
	    -e 's?SCCSID?RCS: @(#) $$Id: Makefile.in,v 1.63.2.10 2002/03/26 02:27:27 hobbs Exp $$?' \
	    -e '/#ifdef __STDC__/,/#endif/d' -e '/TclDateerrlab:/d' \
	    -e '/TclDatenewstate:/d' -e '/#pragma/d' \
	    -e '/#include <inttypes.h>/d' -e 's/const /CONST /g' \
	    <y.tab.c >$(GENERIC_DIR)/tclDate.c
	rm y.tab.c

# The following targets generate the shared libraries in dltest that
497
498
499
500
501
502
503
504



505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525




526
527
528
529
530
531
532
533
534
535
536
537
538

539
540
541
542
543
544
545
546
547
548
549
550
551
552

553
554
555
556
557
558
559
560
561
562
563
564
565


566
567
568
569
570
571
572
573

574

575


576
577
578
579
580



















581
582
583
584
585
586
587
530
531
532
533
534
535
536

537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558


559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574

575
576
577
578
579
580
581
582
583
584
585
586
587
588

589
590
591
592
593
594
595
596
597
598
599
600
601

602
603
604
605
606
607
608
609
610
611
612

613
614
615
616





617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642







-
+
+
+



















-
-
+
+
+
+












-
+













-
+












-
+
+








+
-
+

+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







	if test ! -d dltest; then mkdir dltest; else true; fi
	cd dltest; if test -f configure; then ./configure; else \
	    $(DLTEST_DIR)/configure; fi

install: install-binaries install-libraries install-doc

install-strip:
	$(MAKE) install INSTALL_PROGRAM="$(INSTALL_PROGRAM) -s"
	$(MAKE) install \
		INSTALL_PROGRAM="$(INSTALL_PROGRAM) ${INSTALL_STRIP_PROGRAM}" \
		INSTALL_LIBRARY="$(INSTALL_LIBRARY) ${INSTALL_STRIP_LIBRARY}"

# Note: before running ranlib below, must cd to target directory because
# some ranlibs write to current directory, and this might not always be
# possible (e.g. if installing as root).

install-binaries: binaries
	@for i in $(LIB_INSTALL_DIR) $(BIN_INSTALL_DIR) ; \
	    do \
	    if [ ! -d $$i ] ; then \
		echo "Making directory $$i"; \
		mkdir -p $$i; \
		chmod 755 $$i; \
		else true; \
		fi; \
	    done;
	@if test ! -x $(SRC_DIR)/install-sh; then \
	    chmod +x $(SRC_DIR)/install-sh; \
	    fi
	@echo "Installing $(TCL_LIB_FILE) to $(LIB_INSTALL_DIR)/"
	@$(INSTALL_DATA) $(TCL_LIB_FILE) $(LIB_INSTALL_DIR)/$(TCL_LIB_FILE)
	@(cd $(LIB_INSTALL_DIR); $(RANLIB) $(TCL_LIB_FILE))
	@$(INSTALL_LIBRARY) $(TCL_LIB_FILE) $(LIB_INSTALL_DIR)/$(TCL_LIB_FILE)
	@if test "x@DL_OBJS@" = "xtclLoadAout.o"; then \
	    (cd $(LIB_INSTALL_DIR); $(RANLIB) $(TCL_LIB_FILE)); \
	    fi
	@chmod 555 $(LIB_INSTALL_DIR)/$(TCL_LIB_FILE)
	@if test "$(TCL_BUILD_EXP_FILE)" != ""; then \
	    echo "Installing $(TCL_EXP_FILE) to $(LIB_INSTALL_DIR)/"; \
	    $(INSTALL_DATA) $(TCL_BUILD_EXP_FILE) \
			$(LIB_INSTALL_DIR)/$(TCL_EXP_FILE); \
	    fi
	@echo "Installing tclsh as $(BIN_INSTALL_DIR)/tclsh$(VERSION)"
	@$(INSTALL_PROGRAM) tclsh $(BIN_INSTALL_DIR)/tclsh$(VERSION)
	@echo "Installing tclConfig.sh to $(LIB_INSTALL_DIR)/"
	@$(INSTALL_DATA) tclConfig.sh $(LIB_INSTALL_DIR)/tclConfig.sh
	@if test "$(TCL_STUB_LIB_FILE)" != "" ; then \
	    echo "Installing $(TCL_STUB_LIB_FILE) to $(LIB_INSTALL_DIR)/"; \
	    $(INSTALL_DATA) $(STUB_LIB_FILE) \
	    $(INSTALL_LIBRARY) $(STUB_LIB_FILE) \
			 $(LIB_INSTALL_DIR)/$(TCL_STUB_LIB_FILE); \
	    fi

install-libraries: libraries
	@for i in $(INCLUDE_INSTALL_DIR) $(SCRIPT_INSTALL_DIR); \
	    do \
	    if [ ! -d $$i ] ; then \
		echo "Making directory $$i"; \
		mkdir -p $$i; \
		chmod 755 $$i; \
		else true; \
		fi; \
	    done;
	@for i in http2.3 http1.0 opt0.4 encoding msgcat1.0 tcltest1.0; \
	@for i in http2.4 http1.0 opt0.4 encoding msgcat1.1 tcltest1.0; \
	    do \
	    if [ ! -d $(SCRIPT_INSTALL_DIR)/$$i ] ; then \
		echo "Making directory $(SCRIPT_INSTALL_DIR)/$$i"; \
		mkdir -p $(SCRIPT_INSTALL_DIR)/$$i; \
		chmod 755 $(SCRIPT_INSTALL_DIR)/$$i; \
		else true; \
		fi; \
	    done;
	@if test ! -x $(SRC_DIR)/install-sh; then \
	    chmod +x $(SRC_DIR)/install-sh; \
	    fi
	@echo "Installing header files";
	@for i in $(GENERIC_DIR)/tcl.h $(GENERIC_DIR)/tclDecls.h ; \
	@for i in $(GENERIC_DIR)/tcl.h $(GENERIC_DIR)/tclDecls.h \
		$(GENERIC_DIR)/tclPlatDecls.h ; \
	    do \
	    $(INSTALL_DATA) $$i $(INCLUDE_INSTALL_DIR); \
	    done;
	@echo "Installing library files to $(SCRIPT_INSTALL_DIR)";
	@for i in $(TOP_DIR)/library/*.tcl $(TOP_DIR)/library/tclIndex $(UNIX_DIR)/tclAppInit.c $(UNIX_DIR)/ldAix; \
	    do \
	    $(INSTALL_DATA) $$i $(SCRIPT_INSTALL_DIR); \
	    done;
	@echo "Installing library http1.0 directory";
	@for i in http2.3 http1.0 opt0.4 msgcat1.0 tcltest1.0; \
	@for j in $(TOP_DIR)/library/http1.0/*.tcl ; \
	    do \
	    $(INSTALL_DATA) $$j $(SCRIPT_INSTALL_DIR)/http1.0; \
	    done;
	    echo "Installing library $$i directory"; \
	    for j in $(TOP_DIR)/library/$$i/*.tcl ; \
		do \
		$(INSTALL_DATA) $$j $(SCRIPT_INSTALL_DIR)/$$i; \
		done; \
	@echo "Installing library http2.4 directory";
	@for j in $(TOP_DIR)/library/http/*.tcl ; \
	    do \
	    $(INSTALL_DATA) $$j $(SCRIPT_INSTALL_DIR)/http2.4; \
	    done;
	@echo "Installing library opt0.4 directory";
	@for j in $(TOP_DIR)/library/opt/*.tcl ; \
	    do \
	    $(INSTALL_DATA) $$j $(SCRIPT_INSTALL_DIR)/opt0.4; \
	    done;
	@echo "Installing library msgcat1.1 directory";
	@for j in $(TOP_DIR)/library/msgcat/*.tcl ; \
	    do \
	    $(INSTALL_DATA) $$j $(SCRIPT_INSTALL_DIR)/msgcat1.1; \
	    done;
	@echo "Installing library tcltest1.0 directory";
	@for j in $(TOP_DIR)/library/tcltest1.0/*.tcl ; \
	    do \
	    $(INSTALL_DATA) $$j $(SCRIPT_INSTALL_DIR)/tcltest1.0; \
	    done;
	@echo "Installing library encoding directory";
	@for i in $(TOP_DIR)/library/encoding/*.enc ; do \
		$(INSTALL_DATA) $$i $(SCRIPT_INSTALL_DIR)/encoding; \
	done;

install-doc: doc
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
695
696
697
698
699
700
701



702
703
704
705
706
707
708







-
-
-







	rm -rf Makefile config.status config.cache config.log tclConfig.sh \
		$(PACKAGE).* prototype
	if test -f dltest/Makefile; then cd dltest; $(MAKE) distclean; fi

depend:
	makedepend -- $(DEPEND_SWITCHES) -- $(SRCS)

bp: $(UNIX_DIR)/bp.c
	$(CC) $(CC_SWITCHES) $(UNIX_DIR)/bp.c -o bp

# Test binaries.  The rules for tclTestInit.o and xtTestInit.o are
# complicated because they are compiled from tclAppInit.c.  Can't use
# the "-o" option because this doesn't work on some strange compilers
# (e.g. UnixWare).

tclTestInit.o: $(UNIX_DIR)/tclAppInit.c
	@if test -f tclAppInit.o ; then \
778
779
780
781
782
783
784



785
786
787
788
789
790
791
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846







+
+
+








tclIO.o: $(GENERIC_DIR)/tclIO.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclIO.c

tclIOCmd.o: $(GENERIC_DIR)/tclIOCmd.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclIOCmd.c

tclIOGT.o: $(GENERIC_DIR)/tclIOGT.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclIOGT.c

tclIOSock.o: $(GENERIC_DIR)/tclIOSock.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclIOSock.c

tclIOUtil.o: $(GENERIC_DIR)/tclIOUtil.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclIOUtil.c

tclLink.o: $(GENERIC_DIR)/tclLink.c
883
884
885
886
887
888
889
890

891
892
893
894
895
896
897
938
939
940
941
942
943
944

945
946
947
948
949
950
951
952







-
+








tclStubInit.o: $(GENERIC_DIR)/tclStubInit.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclStubInit.c

tclUtil.o: $(GENERIC_DIR)/tclUtil.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclUtil.c

tclUtf.o: $(GENERIC_DIR)/tclUtf.c
tclUtf.o: $(GENERIC_DIR)/tclUtf.c $(GENERIC_DIR)/tclUniData.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclUtf.c

tclVar.o: $(GENERIC_DIR)/tclVar.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclVar.c

tclTest.o: $(GENERIC_DIR)/tclTest.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclTest.c
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
1023
1024
1025
1026
1027
1028
1029



1030
1031
1032
1033
1034
1035
1036







-
-
-







# even though they may be placed in a static executable or library.  Since
# they are included in both the tcl library and the stub library, they
# need to be relocatable.

fixstrtod.o: $(COMPAT_DIR)/fixstrtod.c
	$(CC) -c $(STUB_CC_SWITCHES) $(COMPAT_DIR)/fixstrtod.c

getcwd.o: $(COMPAT_DIR)/getcwd.c
	$(CC) -c $(STUB_CC_SWITCHES) $(COMPAT_DIR)/getcwd.c

opendir.o: $(COMPAT_DIR)/opendir.c
	$(CC) -c $(STUB_CC_SWITCHES) $(COMPAT_DIR)/opendir.c

memcmp.o: $(COMPAT_DIR)/memcmp.c
	$(CC) -c $(STUB_CC_SWITCHES) $(COMPAT_DIR)/memcmp.c

strncasecmp.o: $(COMPAT_DIR)/strncasecmp.c
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
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







+
+
+
+
+












+
-
+

-
-
+

-





-
+
+




-
-
-
-










-
+







	echo "%define _rpmdir `pwd`/RPMS" >> THIS.TCL.SPEC
	cat tcl.spec >> THIS.TCL.SPEC
	mkdir -p RPMS/i386
	rpm -bb THIS.TCL.SPEC
	mv RPMS/i386/*.rpm .
	rm -rf RPMS THIS.TCL.SPEC

mklinks:
	$(TCL_EXE) $(UNIX_DIR)/mkLinks.tcl \
		$(UNIX_DIR)/../doc/*.[13n] > $(UNIX_DIR)/mkLinks
	chmod +x $(UNIX_DIR)/mkLinks

#
# Target to create a proper Tcl distribution from information in the
# master source directory.  DISTDIR must be defined to indicate where
# to put the distribution.
#

DISTROOT =	/tmp/dist
DISTNAME =	tcl@TCL_VERSION@@TCL_PATCH_LEVEL@
ZIPNAME =	tcl@TCL_MAJOR_VERSION@@TCL_MINOR_VERSION@@TCL_PATCH_LEVEL@.zip
DISTDIR =	$(DISTROOT)/$(DISTNAME)
$(UNIX_DIR)/configure: $(UNIX_DIR)/configure.in
	autoconf $(UNIX_DIR)/configure.in > $(UNIX_DIR)/configure

dist: $(UNIX_DIR)/configure
dist: $(UNIX_DIR)/configure mklinks
	rm -rf $(DISTDIR)
	mkdir $(DISTDIR)
	mkdir $(DISTDIR)/unix
	mkdir -p $(DISTDIR)/unix
	cp -p $(UNIX_DIR)/*.c $(UNIX_DIR)/*.h $(DISTDIR)/unix
	rm -f $(DISTDIR)/unix/bp.c
	cp $(UNIX_DIR)/Makefile.in $(DISTDIR)/unix
	chmod 664 $(DISTDIR)/unix/Makefile.in
	cp $(UNIX_DIR)/configure $(UNIX_DIR)/configure.in \
		$(UNIX_DIR)/tcl.m4 $(UNIX_DIR)/aclocal.m4 \
		$(UNIX_DIR)/tclConfig.sh.in $(UNIX_DIR)/install-sh \
		$(UNIX_DIR)/README $(UNIX_DIR)/ldAix \
		$(UNIX_DIR)/README $(UNIX_DIR)/ldAix $(UNIX_DIR)/tcl.spec \
		$(UNIX_DIR)/mkLinks \
		$(DISTDIR)/unix
	chmod 775 $(DISTDIR)/unix/configure $(DISTDIR)/unix/configure.in
	chmod 775 $(DISTDIR)/unix/ldAix
	chmod +x $(DISTDIR)/unix/install-sh

	$(TCL_EXE) $(UNIX_DIR)/mkLinks.tcl \
		$(UNIX_DIR)/../doc/*.[13n] > $(DISTDIR)/unix/mkLinks
	chmod +x $(DISTDIR)/unix/mkLinks
	mkdir $(DISTDIR)/generic
	cp -p $(GENERIC_DIR)/*.c $(GENERIC_DIR)/*.h $(DISTDIR)/generic
	cp -p $(GENERIC_DIR)/*.decls $(DISTDIR)/generic
	cp -p $(GENERIC_DIR)/README $(DISTDIR)/generic
	cp -p $(GENERIC_DIR)/tclGetDate.y $(DISTDIR)/generic
	cp -p $(TOP_DIR)/changes $(TOP_DIR)/ChangeLog $(TOP_DIR)/README* \
		$(TOP_DIR)/license.terms $(DISTDIR)
	mkdir $(DISTDIR)/library
	cp -p $(TOP_DIR)/license.terms $(TOP_DIR)/library/*.tcl \
		$(TOP_DIR)/library/tclIndex $(DISTDIR)/library
	for i in http2.3 http1.0 opt0.4 msgcat1.0 reg1.0 dde1.1 tcltest1.0; \
	for i in http http1.0 opt msgcat reg1.0 dde1.1 tcltest1.0; \
	    do \
		mkdir $(DISTDIR)/library/$$i ;\
		cp -p $(TOP_DIR)/library/$$i/*.tcl $(DISTDIR)/library/$$i; \
	    done;
	mkdir $(DISTDIR)/library/encoding
	cp -p $(TOP_DIR)/library/encoding/*.enc $(DISTDIR)/library/encoding
	mkdir $(DISTDIR)/doc
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
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







-
+
-



-
+
+



+



-
-
+
+


-
-
+
+
-







-
+
-
-
-
+
+
-
-
+
-
-
+







		$(TOP_DIR)/tests/httpd $(TOP_DIR)/tests/*.tcl \
		$(DISTDIR)/tests
	mkdir $(DISTDIR)/tests/pkg
	cp -p $(TOP_DIR)/license.terms $(DISTDIR)/tests/pkg
	cp -p $(TOP_DIR)/tests/pkg/*.tcl $(DISTDIR)/tests/pkg
	mkdir $(DISTDIR)/win
	cp $(TOP_DIR)/win/Makefile.in $(DISTDIR)/win
	cp $(TOP_DIR)/win/configure.in \
	cp $(TOP_DIR)/win/configure.in $(TOP_DIR)/win/configure \
		$(TOP_DIR)/win/configure \
		$(TOP_DIR)/win/tclConfig.sh.in \
		$(TOP_DIR)/win/tcl.m4 $(TOP_DIR)/win/aclocal.m4 \
		$(DISTDIR)/win
	cp -p $(TOP_DIR)/win/*.c $(TOP_DIR)/win/*.h $(TOP_DIR)/win/*.rc \
	cp -p $(TOP_DIR)/win/*.c $(TOP_DIR)/win/*.h \
		$(TOP_DIR)/win/*.ico $(TOP_DIR)/win/*.rc \
		$(DISTDIR)/win
	cp -p $(TOP_DIR)/win/*.bat $(DISTDIR)/win
	cp -p $(TOP_DIR)/win/makefile.* $(DISTDIR)/win
	cp -p $(TOP_DIR)/win/tcl.hpj.in $(DISTDIR)/win
	cp -p $(TOP_DIR)/win/README $(DISTDIR)/win
	cp -p $(TOP_DIR)/license.terms $(DISTDIR)/win
	mkdir $(DISTDIR)/mac
	cp -p $(TOP_DIR)/mac/tclMacProjects.sea.hqx $(DISTDIR)/mac
	cp -p $(TOP_DIR)/mac/*.c $(TOP_DIR)/mac/*.h $(TOP_DIR)/mac/*.r \
	cp -p $(TOP_DIR)/mac/tclMacProjects.sea.hqx \
		$(TOP_DIR)/mac/*.c $(TOP_DIR)/mac/*.h $(TOP_DIR)/mac/*.r \
		$(DISTDIR)/mac
	cp -p $(TOP_DIR)/mac/porting.notes $(TOP_DIR)/mac/README $(DISTDIR)/mac
	cp -p $(TOP_DIR)/mac/*.exp $(TOP_DIR)/mac/*.pch $(DISTDIR)/mac
	cp -p $(TOP_DIR)/mac/*.doc $(DISTDIR)/mac
	cp -p $(TOP_DIR)/mac/*.pch $(DISTDIR)/mac
	cp -p $(TOP_DIR)/mac/*.doc $(TOP_DIR)/mac/*.html $(DISTDIR)/mac
	cp -p $(TOP_DIR)/mac/*.html $(DISTDIR)/mac
	cp -p $(TOP_DIR)/license.terms $(DISTDIR)/mac
	mkdir $(DISTDIR)/unix/dltest
	cp -p $(UNIX_DIR)/dltest/*.c $(UNIX_DIR)/dltest/Makefile.in \
		$(DISTDIR)/unix/dltest
	cp -p $(UNIX_DIR)/dltest/configure.in $(UNIX_DIR)/dltest/configure \
		$(UNIX_DIR)/dltest/README $(DISTDIR)/unix/dltest
	mkdir $(DISTDIR)/tools
	cp -p $(TOP_DIR)/tools/Makefile.in \
	cp -p $(TOP_DIR)/tools/Makefile.in $(TOP_DIR)/tools/README \
	    $(TOP_DIR)/tools/README \
	    $(TOP_DIR)/tools/configure.in \
	    $(TOP_DIR)/tools/*.tcl \
		$(TOP_DIR)/tools/configure $(TOP_DIR)/tools/configure.in \
		$(TOP_DIR)/tools/*.tcl $(TOP_DIR)/tools/man2tcl.c \
	    $(TOP_DIR)/tools/man2tcl.c \
	    $(TOP_DIR)/tools/tcl.wse.in \
		$(TOP_DIR)/tools/tcl.wse.in $(TOP_DIR)/tools/*.bmp \
	    $(TOP_DIR)/tools/*.bmp \
	    $(TOP_DIR)/tools/tcl.hpj.in \
		$(TOP_DIR)/tools/tcl.hpj.in \
		$(DISTDIR)/tools

#
# The following target can only be used for non-patch releases.  Use
# the "allpatch" target below for patch releases.
#

Changes to unix/README.
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
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










+
-
+



+
-
+









-
+







Tcl UNIX README
---------------

This is the directory where you configure, compile, test, and install
UNIX versions of Tcl.  This directory also contains source files for Tcl
that are specific to UNIX.  Some of the files in this directory are
used on the PC or Mac platform too, but they all depend on UNIX
(POSIX/ANSI C) interfaces and some of them only make sense under UNIX.

Updated forms of the information found in this file is available at:

	http://dev.scriptics.com/doc/howto/compile.html#unix
	http://www.tcl-tk.net/doc/howto/compile.html#unix

For information on platforms where Tcl is known to compile, along
with any porting notes for getting it to work on those platforms, see:

	http://dev.scriptics.com/software/tcltk/platforms.html
	http://www.tcl-tk.net/software/tcltk/platforms.html

The rest of this file contains instructions on how to do this.  The
release should compile and run either "out of the box" or with trivial
changes on any UNIX-like system that approximates POSIX, BSD, or System
V.  We know that it runs on workstations from Sun, H-P, DEC, IBM, and
SGI, as well as PCs running Linux, BSDI, and SCO UNIX.  To compile for
a PC running Windows, see the README file in the directory ../win.  To
compile for a Macintosh, see the README file in the directory ../mac.

RCS: @(#) $Id: README,v 1.11 2000/04/26 17:31:21 hobbs Exp $
RCS: @(#) $Id: README,v 1.11.2.2 2001/10/03 20:26:09 hobbs Exp $

How To Compile And Install Tcl:
-------------------------------

(a) Check for patches as described in ../README.

(b) If you have already compiled Tcl once in this directory and are now
119
120
121
122
123
124
125
126


127
128
129
130
131
132
121
122
123
124
125
126
127

128
129
130
131
132
133
134
135







-
+
+






directory.  You should then see a printout of the test files processed.
If any errors occur, you'll see a much more substantial printout for
each error.  See the README file in the "tests" directory for more
information on the test suite.  Note: don't run the tests as superuser:
this will cause several of them to fail.  If a test is failing
consistently, please send us a bug report with as much detail as you
can manage.  Please use the online database at
	http://dev.scriptics.com/ticket/

	http://tcl.sourceforge.net/

The Tcl test suite is very sensitive to proper implementation of
ANSI C library procedures such as sprintf and sscanf.  If the test
suite generates errors, most likely they are due to non-conformance
of your system's ANSI C library;  such problems are unlikely to
affect any real applications so it's probably safe to ignore them.
Added unix/configure.























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
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
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233
5234
5235
5236
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292
5293
5294
5295
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
5325
5326
5327
5328
5329
5330
5331
5332
5333
5334
5335
5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442
5443
5444
5445
5446
5447
5448
5449
5450
5451
5452
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
5468
5469
5470
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
5522
5523
5524
5525
5526
5527
5528
5529
5530
5531
5532
5533
5534
5535
5536
5537
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
5548
5549
5550
5551
5552
5553
5554
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
5589
5590
5591
5592
5593
5594
5595
5596
5597
5598
5599
5600
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610
5611
5612
5613
5614
5615
5616
5617
5618
5619
5620
5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653
5654
5655
5656
5657
5658
5659
5660
5661
5662
5663
5664
5665
5666
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688
5689
5690
5691
5692
5693
5694
5695
5696
5697
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709
5710
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
5735
5736
5737
5738
5739
5740
5741
5742
5743
5744
5745
5746
5747
5748
5749
5750
5751
5752
5753
5754
5755
5756
5757
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
5768
5769
5770
5771
5772
5773
5774
5775
5776
5777
5778
5779
5780
5781
5782
5783
5784
5785
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
5798
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834
5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
5888
5889
5890
5891
5892
5893
5894
5895
5896
5897
5898
5899
5900
5901
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911
5912
5913
5914
5915
5916
5917
5918
5919
5920
5921
5922
5923
5924
5925
5926
5927
5928
5929
5930
5931
5932
5933
5934
5935
5936
5937
5938
5939
5940
5941
5942
5943
5944
5945
5946
5947
5948
5949
5950
5951
5952
5953
5954
5955
5956
5957
5958
5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
5999
6000
6001
6002
6003
6004
6005
6006
6007
6008
6009
6010
6011
6012
6013
6014
6015
6016
6017
6018
6019
6020
6021
6022
6023
6024
6025
6026
6027
6028
6029
6030
6031
6032
6033
6034
6035
6036
6037
6038
6039
6040
6041
6042
6043
6044
6045
6046
6047
6048
6049
6050
6051
6052
6053
6054
6055
6056
6057
6058
6059
6060
6061
6062
6063
6064
6065
6066
6067
6068
6069
6070
6071
6072
6073
6074
6075
6076
6077
6078
6079
6080
6081
6082
6083
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
6103
6104
6105
6106
6107
6108
6109
6110
6111
6112
6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134
6135
6136
6137
6138
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
6234
6235
6236
6237
6238
6239
6240
6241
6242
6243
6244
6245
6246
6247
6248
6249
6250
6251
6252
6253
6254
6255
6256
6257
6258
6259
6260
6261
6262
6263
6264
6265
6266
6267
6268
6269
6270
6271
6272
6273
6274
6275
6276
6277
6278
6279
6280
6281
6282
6283
6284
6285
6286
6287
6288
6289
6290
6291
6292
6293
6294
6295
6296
6297
6298
6299
6300
6301
6302
6303
6304
6305
6306
6307
6308
6309
6310
6311
6312
6313
6314
6315
6316
6317
6318
6319
6320
6321
6322
6323
6324
6325
6326
6327
6328
6329
6330
6331
6332
6333
6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
6370
6371
6372
6373
6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
6398
6399
6400
6401
6402
6403
6404
6405
6406
6407
6408
6409
6410
6411
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455
6456
6457
6458
6459
6460
6461
6462
6463
6464
6465
6466
6467
6468
6469
6470
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
6490
6491
6492
6493
6494
6495
6496
6497
6498
6499
6500
6501
6502
6503
6504
6505
6506
6507
6508
6509
6510
6511
6512
6513
6514
6515
6516
6517
6518
6519
6520
6521
6522
6523
6524
6525
6526
6527
6528
6529
6530
6531
6532
6533
6534
6535
6536
6537
6538
6539
6540
6541
6542
6543
6544
6545
6546
6547
6548
6549
6550
6551
6552
6553
6554
6555
6556
6557
6558
6559
6560
6561
6562
6563
6564
6565
6566
6567
6568
6569
6570
6571
6572
6573
6574
6575
6576
6577
6578
6579
6580
6581
6582
6583
6584
6585
6586
6587
6588
6589
6590
6591
6592
6593
6594
6595
6596
6597
6598
6599
6600
6601
6602
6603
6604
6605
6606
6607
6608
6609
6610
6611
6612
6613
6614
6615
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#! /bin/sh

# Guess values for system-dependent variables and create Makefiles.
# Generated automatically using autoconf version 2.13 
# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
#
# This configure script is free software; the Free Software Foundation
# gives unlimited permission to copy, distribute and modify it.

# Defaults:
ac_help=
ac_default_prefix=/usr/local
# Any additions from configure.in:
ac_help="$ac_help
  --enable-gcc            allow use of gcc if available [--disable-gcc]"
ac_help="$ac_help
  --enable-threads        build with threads"
ac_help="$ac_help
  --enable-64bit          enable 64bit support (where applicable)"
ac_help="$ac_help
  --enable-64bit-vis      enable 64bit Sparc VIS support"
ac_help="$ac_help
  --disable-load          disallow dynamic loading and "load" command"
ac_help="$ac_help
  --enable-symbols        build with debugging symbols [--disable-symbols]"
ac_help="$ac_help
  --enable-shared         build and link with shared libraries [--enable-shared]"

# Initialize some variables set by options.
# The variables have the same names as the options, with
# dashes changed to underlines.
build=NONE
cache_file=./config.cache
exec_prefix=NONE
host=NONE
no_create=
nonopt=NONE
no_recursion=
prefix=NONE
program_prefix=NONE
program_suffix=NONE
program_transform_name=s,x,x,
silent=
site=
srcdir=
target=NONE
verbose=
x_includes=NONE
x_libraries=NONE
bindir='${exec_prefix}/bin'
sbindir='${exec_prefix}/sbin'
libexecdir='${exec_prefix}/libexec'
datadir='${prefix}/share'
sysconfdir='${prefix}/etc'
sharedstatedir='${prefix}/com'
localstatedir='${prefix}/var'
libdir='${exec_prefix}/lib'
includedir='${prefix}/include'
oldincludedir='/usr/include'
infodir='${prefix}/info'
mandir='${prefix}/man'

# Initialize some other variables.
subdirs=
MFLAGS= MAKEFLAGS=
SHELL=${CONFIG_SHELL-/bin/sh}
# Maximum number of lines to put in a shell here document.
ac_max_here_lines=12

ac_prev=
for ac_option
do

  # If the previous option needs an argument, assign it.
  if test -n "$ac_prev"; then
    eval "$ac_prev=\$ac_option"
    ac_prev=
    continue
  fi

  case "$ac_option" in
  -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
  *) ac_optarg= ;;
  esac

  # Accept the important Cygnus configure options, so we can diagnose typos.

  case "$ac_option" in

  -bindir | --bindir | --bindi | --bind | --bin | --bi)
    ac_prev=bindir ;;
  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
    bindir="$ac_optarg" ;;

  -build | --build | --buil | --bui | --bu)
    ac_prev=build ;;
  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
    build="$ac_optarg" ;;

  -cache-file | --cache-file | --cache-fil | --cache-fi \
  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
    ac_prev=cache_file ;;
  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
    cache_file="$ac_optarg" ;;

  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
    ac_prev=datadir ;;
  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
  | --da=*)
    datadir="$ac_optarg" ;;

  -disable-* | --disable-*)
    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
    fi
    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
    eval "enable_${ac_feature}=no" ;;

  -enable-* | --enable-*)
    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
    fi
    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
    case "$ac_option" in
      *=*) ;;
      *) ac_optarg=yes ;;
    esac
    eval "enable_${ac_feature}='$ac_optarg'" ;;

  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
  | --exec | --exe | --ex)
    ac_prev=exec_prefix ;;
  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
  | --exec=* | --exe=* | --ex=*)
    exec_prefix="$ac_optarg" ;;

  -gas | --gas | --ga | --g)
    # Obsolete; use --with-gas.
    with_gas=yes ;;

  -help | --help | --hel | --he)
    # Omit some internal or obsolete options to make the list less imposing.
    # This message is too long to be a string in the A/UX 3.1 sh.
    cat << EOF
Usage: configure [options] [host]
Options: [defaults in brackets after descriptions]
Configuration:
  --cache-file=FILE       cache test results in FILE
  --help                  print this message
  --no-create             do not create output files
  --quiet, --silent       do not print \`checking...' messages
  --version               print the version of autoconf that created configure
Directory and file names:
  --prefix=PREFIX         install architecture-independent files in PREFIX
                          [$ac_default_prefix]
  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                          [same as prefix]
  --bindir=DIR            user executables in DIR [EPREFIX/bin]
  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
  --datadir=DIR           read-only architecture-independent data in DIR
                          [PREFIX/share]
  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
  --sharedstatedir=DIR    modifiable architecture-independent data in DIR
                          [PREFIX/com]
  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
  --includedir=DIR        C header files in DIR [PREFIX/include]
  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
  --infodir=DIR           info documentation in DIR [PREFIX/info]
  --mandir=DIR            man documentation in DIR [PREFIX/man]
  --srcdir=DIR            find the sources in DIR [configure dir or ..]
  --program-prefix=PREFIX prepend PREFIX to installed program names
  --program-suffix=SUFFIX append SUFFIX to installed program names
  --program-transform-name=PROGRAM
                          run sed PROGRAM on installed program names
EOF
    cat << EOF
Host type:
  --build=BUILD           configure for building on BUILD [BUILD=HOST]
  --host=HOST             configure for HOST [guessed]
  --target=TARGET         configure for TARGET [TARGET=HOST]
Features and packages:
  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
  --x-includes=DIR        X include files are in DIR
  --x-libraries=DIR       X library files are in DIR
EOF
    if test -n "$ac_help"; then
      echo "--enable and --with options recognized:$ac_help"
    fi
    exit 0 ;;

  -host | --host | --hos | --ho)
    ac_prev=host ;;
  -host=* | --host=* | --hos=* | --ho=*)
    host="$ac_optarg" ;;

  -includedir | --includedir | --includedi | --included | --include \
  | --includ | --inclu | --incl | --inc)
    ac_prev=includedir ;;
  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
  | --includ=* | --inclu=* | --incl=* | --inc=*)
    includedir="$ac_optarg" ;;

  -infodir | --infodir | --infodi | --infod | --info | --inf)
    ac_prev=infodir ;;
  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
    infodir="$ac_optarg" ;;

  -libdir | --libdir | --libdi | --libd)
    ac_prev=libdir ;;
  -libdir=* | --libdir=* | --libdi=* | --libd=*)
    libdir="$ac_optarg" ;;

  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
  | --libexe | --libex | --libe)
    ac_prev=libexecdir ;;
  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
  | --libexe=* | --libex=* | --libe=*)
    libexecdir="$ac_optarg" ;;

  -localstatedir | --localstatedir | --localstatedi | --localstated \
  | --localstate | --localstat | --localsta | --localst \
  | --locals | --local | --loca | --loc | --lo)
    ac_prev=localstatedir ;;
  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
    localstatedir="$ac_optarg" ;;

  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
    ac_prev=mandir ;;
  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
    mandir="$ac_optarg" ;;

  -nfp | --nfp | --nf)
    # Obsolete; use --without-fp.
    with_fp=no ;;

  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
  | --no-cr | --no-c)
    no_create=yes ;;

  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
    no_recursion=yes ;;

  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
  | --oldin | --oldi | --old | --ol | --o)
    ac_prev=oldincludedir ;;
  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
    oldincludedir="$ac_optarg" ;;

  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
    ac_prev=prefix ;;
  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
    prefix="$ac_optarg" ;;

  -program-prefix | --program-prefix | --program-prefi | --program-pref \
  | --program-pre | --program-pr | --program-p)
    ac_prev=program_prefix ;;
  -program-prefix=* | --program-prefix=* | --program-prefi=* \
  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
    program_prefix="$ac_optarg" ;;

  -program-suffix | --program-suffix | --program-suffi | --program-suff \
  | --program-suf | --program-su | --program-s)
    ac_prev=program_suffix ;;
  -program-suffix=* | --program-suffix=* | --program-suffi=* \
  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
    program_suffix="$ac_optarg" ;;

  -program-transform-name | --program-transform-name \
  | --program-transform-nam | --program-transform-na \
  | --program-transform-n | --program-transform- \
  | --program-transform | --program-transfor \
  | --program-transfo | --program-transf \
  | --program-trans | --program-tran \
  | --progr-tra | --program-tr | --program-t)
    ac_prev=program_transform_name ;;
  -program-transform-name=* | --program-transform-name=* \
  | --program-transform-nam=* | --program-transform-na=* \
  | --program-transform-n=* | --program-transform-=* \
  | --program-transform=* | --program-transfor=* \
  | --program-transfo=* | --program-transf=* \
  | --program-trans=* | --program-tran=* \
  | --progr-tra=* | --program-tr=* | --program-t=*)
    program_transform_name="$ac_optarg" ;;

  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
  | -silent | --silent | --silen | --sile | --sil)
    silent=yes ;;

  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
    ac_prev=sbindir ;;
  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
  | --sbi=* | --sb=*)
    sbindir="$ac_optarg" ;;

  -sharedstatedir | --sharedstatedir | --sharedstatedi \
  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
  | --sharedst | --shareds | --shared | --share | --shar \
  | --sha | --sh)
    ac_prev=sharedstatedir ;;
  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
  | --sha=* | --sh=*)
    sharedstatedir="$ac_optarg" ;;

  -site | --site | --sit)
    ac_prev=site ;;
  -site=* | --site=* | --sit=*)
    site="$ac_optarg" ;;

  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
    ac_prev=srcdir ;;
  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
    srcdir="$ac_optarg" ;;

  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
  | --syscon | --sysco | --sysc | --sys | --sy)
    ac_prev=sysconfdir ;;
  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
    sysconfdir="$ac_optarg" ;;

  -target | --target | --targe | --targ | --tar | --ta | --t)
    ac_prev=target ;;
  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
    target="$ac_optarg" ;;

  -v | -verbose | --verbose | --verbos | --verbo | --verb)
    verbose=yes ;;

  -version | --version | --versio | --versi | --vers)
    echo "configure generated by autoconf version 2.13"
    exit 0 ;;

  -with-* | --with-*)
    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
    fi
    ac_package=`echo $ac_package| sed 's/-/_/g'`
    case "$ac_option" in
      *=*) ;;
      *) ac_optarg=yes ;;
    esac
    eval "with_${ac_package}='$ac_optarg'" ;;

  -without-* | --without-*)
    ac_package=`echo $ac_option|sed -e 's/-*without-//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
    fi
    ac_package=`echo $ac_package| sed 's/-/_/g'`
    eval "with_${ac_package}=no" ;;

  --x)
    # Obsolete; use --with-x.
    with_x=yes ;;

  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
  | --x-incl | --x-inc | --x-in | --x-i)
    ac_prev=x_includes ;;
  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
    x_includes="$ac_optarg" ;;

  -x-libraries | --x-libraries | --x-librarie | --x-librari \
  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
    ac_prev=x_libraries ;;
  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
    x_libraries="$ac_optarg" ;;

  -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
    ;;

  *)
    if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
      echo "configure: warning: $ac_option: invalid host type" 1>&2
    fi
    if test "x$nonopt" != xNONE; then
      { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
    fi
    nonopt="$ac_option"
    ;;

  esac
done

if test -n "$ac_prev"; then
  { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
fi

trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15

# File descriptor usage:
# 0 standard input
# 1 file creation
# 2 errors and warnings
# 3 some systems may open it to /dev/tty
# 4 used on the Kubota Titan
# 6 checking for... messages and results
# 5 compiler messages saved in config.log
if test "$silent" = yes; then
  exec 6>/dev/null
else
  exec 6>&1
fi
exec 5>./config.log

echo "\
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
" 1>&5

# Strip out --no-create and --no-recursion so they do not pile up.
# Also quote any args containing shell metacharacters.
ac_configure_args=
for ac_arg
do
  case "$ac_arg" in
  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
  | --no-cr | --no-c) ;;
  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
  *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
  ac_configure_args="$ac_configure_args '$ac_arg'" ;;
  *) ac_configure_args="$ac_configure_args $ac_arg" ;;
  esac
done

# NLS nuisances.
# Only set these to C if already set.  These must not be set unconditionally
# because not all systems understand e.g. LANG=C (notably SCO).
# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
# Non-C LC_CTYPE values break the ctype check.
if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi

# confdefs.h avoids OS command line length limits that DEFS can exceed.
rm -rf conftest* confdefs.h
# AIX cpp loses on an empty file, so make sure it contains at least a newline.
echo > confdefs.h

# A filename unique to this package, relative to the directory that
# configure is in, which we can look for to find out if srcdir is correct.
ac_unique_file=../generic/tcl.h

# Find the source files, if location was not specified.
if test -z "$srcdir"; then
  ac_srcdir_defaulted=yes
  # Try the directory containing this script, then its parent.
  ac_prog=$0
  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
  srcdir=$ac_confdir
  if test ! -r $srcdir/$ac_unique_file; then
    srcdir=..
  fi
else
  ac_srcdir_defaulted=no
fi
if test ! -r $srcdir/$ac_unique_file; then
  if test "$ac_srcdir_defaulted" = yes; then
    { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
  else
    { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
  fi
fi
srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`

# Prefer explicitly selected file to automatically selected ones.
if test -z "$CONFIG_SITE"; then
  if test "x$prefix" != xNONE; then
    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
  else
    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
  fi
fi
for ac_site_file in $CONFIG_SITE; do
  if test -r "$ac_site_file"; then
    echo "loading site script $ac_site_file"
    . "$ac_site_file"
  fi
done

if test -r "$cache_file"; then
  echo "loading cache $cache_file"
  . $cache_file
else
  echo "creating cache $cache_file"
  > $cache_file
fi

ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

ac_exeext=
ac_objext=o
if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
  # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
    ac_n= ac_c='
' ac_t='	'
  else
    ac_n=-n ac_c= ac_t=
  fi
else
  ac_n= ac_c='\c' ac_t=
fi



TCL_VERSION=8.3
TCL_MAJOR_VERSION=8
TCL_MINOR_VERSION=3
TCL_PATCH_LEVEL=".4"
VERSION=${TCL_VERSION}

#------------------------------------------------------------------------
# Handle the --prefix=... option
#------------------------------------------------------------------------

if test "${prefix}" = "NONE"; then
    prefix=/usr/local
fi
if test "${exec_prefix}" = "NONE"; then
    exec_prefix=$prefix
fi
# libdir must be a fully qualified path and (not ${exec_prefix}/lib)
eval libdir="$libdir"
TCL_SRC_DIR=`cd $srcdir/..; pwd`

#------------------------------------------------------------------------
# Standard compiler checks
#------------------------------------------------------------------------

# If the user did not set CFLAGS, set it now to keep
# the AC_PROG_CC macro from adding "-g -O2".
if test "${CFLAGS+set}" != "set" ; then
    CFLAGS=""
fi

# Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:573: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$RANLIB"; then
  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_RANLIB="ranlib"
      break
    fi
  done
  IFS="$ac_save_ifs"
  test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
fi
fi
RANLIB="$ac_cv_prog_RANLIB"
if test -n "$RANLIB"; then
  echo "$ac_t""$RANLIB" 1>&6
else
  echo "$ac_t""no" 1>&6
fi


    # Check whether --enable-gcc or --disable-gcc was given.
if test "${enable_gcc+set}" = set; then
  enableval="$enable_gcc"
  ok=$enableval
else
  ok=no
fi

    if test "$ok" = "yes"; then
	CC=gcc
	# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:614: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_CC="gcc"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
CC="$ac_cv_prog_CC"
if test -n "$CC"; then
  echo "$ac_t""$CC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

if test -z "$CC"; then
  # Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:644: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_prog_rejected=no
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
        ac_prog_rejected=yes
	continue
      fi
      ac_cv_prog_CC="cc"
      break
    fi
  done
  IFS="$ac_save_ifs"
if test $ac_prog_rejected = yes; then
  # We found a bogon in the path, so make sure we never use it.
  set dummy $ac_cv_prog_CC
  shift
  if test $# -gt 0; then
    # We chose a different compiler from the bogus one.
    # However, it has the same basename, so the bogon will be chosen
    # first if we set CC to just the basename; use the full file name.
    shift
    set dummy "$ac_dir/$ac_word" "$@"
    shift
    ac_cv_prog_CC="$@"
  fi
fi
fi
fi
CC="$ac_cv_prog_CC"
if test -n "$CC"; then
  echo "$ac_t""$CC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

  if test -z "$CC"; then
    case "`uname -s`" in
    *win32* | *WIN32*)
      # Extract the first word of "cl", so it can be a program name with args.
set dummy cl; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:695: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_CC="cl"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
CC="$ac_cv_prog_CC"
if test -n "$CC"; then
  echo "$ac_t""$CC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi
 ;;
    esac
  fi
  test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
fi

echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
echo "configure:727: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5

ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

cat > conftest.$ac_ext << EOF

#line 738 "configure"
#include "confdefs.h"

main(){return(0);}
EOF
if { (eval echo configure:743: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  ac_cv_prog_cc_works=yes
  # If we can't run a trivial program, we are probably using a cross compiler.
  if (./conftest; exit) 2>/dev/null; then
    ac_cv_prog_cc_cross=no
  else
    ac_cv_prog_cc_cross=yes
  fi
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  ac_cv_prog_cc_works=no
fi
rm -fr conftest*
ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
if test $ac_cv_prog_cc_works = no; then
  { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
echo "configure:769: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
cross_compiling=$ac_cv_prog_cc_cross

echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
echo "configure:774: checking whether we are using GNU C" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.c <<EOF
#ifdef __GNUC__
  yes;
#endif
EOF
if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:783: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
  ac_cv_prog_gcc=yes
else
  ac_cv_prog_gcc=no
fi
fi

echo "$ac_t""$ac_cv_prog_gcc" 1>&6

if test $ac_cv_prog_gcc = yes; then
  GCC=yes
else
  GCC=
fi

ac_test_CFLAGS="${CFLAGS+set}"
ac_save_CFLAGS="$CFLAGS"
CFLAGS=
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
echo "configure:802: checking whether ${CC-cc} accepts -g" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  echo 'void f(){}' > conftest.c
if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
  ac_cv_prog_cc_g=yes
else
  ac_cv_prog_cc_g=no
fi
rm -f conftest*

fi

echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
if test "$ac_test_CFLAGS" = set; then
  CFLAGS="$ac_save_CFLAGS"
elif test $ac_cv_prog_cc_g = yes; then
  if test "$GCC" = yes; then
    CFLAGS="-g -O2"
  else
    CFLAGS="-g"
  fi
else
  if test "$GCC" = yes; then
    CFLAGS="-O2"
  else
    CFLAGS=
  fi
fi

    else
	CC=${CC-cc}
    fi
    # Extra check to ensure that we double-check if we are running
    # gcc, even though it may not be clear.
    if test "$GCC" != "yes" -a `$CC -v 2>&1 | grep -c gcc` != "0" ; then
	GCC=yes
    fi

echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
echo "configure:843: checking how to run the C preprocessor" >&5
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
  CPP=
fi
if test -z "$CPP"; then
if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
    # This must be in double quotes, not single quotes, because CPP may get
  # substituted into the Makefile and "${CC-cc}" will confuse make.
  CPP="${CC-cc} -E"
  # On the NeXT, cc -E runs the code through the compiler's parser,
  # not just through cpp.
  cat > conftest.$ac_ext <<EOF
#line 858 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:864: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  :
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  CPP="${CC-cc} -E -traditional-cpp"
  cat > conftest.$ac_ext <<EOF
#line 875 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:881: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  :
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  CPP="${CC-cc} -nologo -E"
  cat > conftest.$ac_ext <<EOF
#line 892 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:898: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  :
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  CPP=/lib/cpp
fi
rm -f conftest*
fi
rm -f conftest*
fi
rm -f conftest*
  ac_cv_prog_CPP="$CPP"
fi
  CPP="$ac_cv_prog_CPP"
else
  ac_cv_prog_CPP="$CPP"
fi
echo "$ac_t""$CPP" 1>&6

for ac_hdr in unistd.h limits.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
echo "configure:926: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 931 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:936: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
  cat >> confdefs.h <<EOF
#define $ac_tr_hdr 1
EOF
 
else
  echo "$ac_t""no" 1>&6
fi
done


#------------------------------------------------------------------------
# Threads support
#------------------------------------------------------------------------


    echo $ac_n "checking for building with threads""... $ac_c" 1>&6
echo "configure:969: checking for building with threads" >&5
    # Check whether --enable-threads or --disable-threads was given.
if test "${enable_threads+set}" = set; then
  enableval="$enable_threads"
  tcl_ok=$enableval
else
  tcl_ok=no
fi


    if test "$tcl_ok" = "yes"; then
	echo "$ac_t""yes" 1>&6
	TCL_THREADS=1
	cat >> confdefs.h <<\EOF
#define TCL_THREADS 1
EOF

	cat >> confdefs.h <<\EOF
#define _REENTRANT 1
EOF

	cat >> confdefs.h <<\EOF
#define _THREAD_SAFE 1
EOF

	echo $ac_n "checking for pthread_mutex_init in -lpthread""... $ac_c" 1>&6
echo "configure:995: checking for pthread_mutex_init in -lpthread" >&5
ac_lib_var=`echo pthread'_'pthread_mutex_init | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lpthread  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 1003 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char pthread_mutex_init();

int main() {
pthread_mutex_init()
; return 0; }
EOF
if { (eval echo configure:1014: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  tcl_ok=yes
else
  echo "$ac_t""no" 1>&6
tcl_ok=no
fi

	if test "$tcl_ok" = "no"; then
	    # Check a little harder for __pthread_mutex_init in the same
	    # library, as some systems hide it there until pthread.h is
	    # defined.  We could alternatively do an AC_TRY_COMPILE with
	    # pthread.h, but that will work with libpthread really doesn't
	    # exist, like AIX 4.2.  [Bug: 4359]
	    echo $ac_n "checking for __pthread_mutex_init in -lpthread""... $ac_c" 1>&6
echo "configure:1042: checking for __pthread_mutex_init in -lpthread" >&5
ac_lib_var=`echo pthread'_'__pthread_mutex_init | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lpthread  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 1050 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char __pthread_mutex_init();

int main() {
__pthread_mutex_init()
; return 0; }
EOF
if { (eval echo configure:1061: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  tcl_ok=yes
else
  echo "$ac_t""no" 1>&6
tcl_ok=no
fi

	fi

	if test "$tcl_ok" = "yes"; then
	    # The space is needed
	    THREADS_LIBS=" -lpthread"
	else
	    echo $ac_n "checking for pthread_mutex_init in -lpthreads""... $ac_c" 1>&6
echo "configure:1089: checking for pthread_mutex_init in -lpthreads" >&5
ac_lib_var=`echo pthreads'_'pthread_mutex_init | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lpthreads  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 1097 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char pthread_mutex_init();

int main() {
pthread_mutex_init()
; return 0; }
EOF
if { (eval echo configure:1108: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  tcl_ok=yes
else
  echo "$ac_t""no" 1>&6
tcl_ok=no
fi

	    if test "$tcl_ok" = "yes"; then
		# The space is needed
		THREADS_LIBS=" -lpthreads"
	    else
		echo $ac_n "checking for pthread_mutex_init in -lc""... $ac_c" 1>&6
echo "configure:1134: checking for pthread_mutex_init in -lc" >&5
ac_lib_var=`echo c'_'pthread_mutex_init | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lc  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 1142 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char pthread_mutex_init();

int main() {
pthread_mutex_init()
; return 0; }
EOF
if { (eval echo configure:1153: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  tcl_ok=yes
else
  echo "$ac_t""no" 1>&6
tcl_ok=no
fi

	    	if test "$tcl_ok" = "no"; then
	    	    TCL_THREADS=0
		    echo "configure: warning: "Don t know how to find pthread lib on your system - you must disable thread support or edit the LIBS in the Makefile..."" 1>&2
	    	fi
	    fi
	fi

	# Does the pthread-implementation provide
	# 'pthread_attr_setstacksize' ?

	for ac_func in pthread_attr_setstacksize
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:1187: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1192 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char $ac_func(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char $ac_func();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
$ac_func();
#endif

; return 0; }
EOF
if { (eval echo configure:1215: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_$ac_func=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_$ac_func=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
  cat >> confdefs.h <<EOF
#define $ac_tr_func 1
EOF
 
else
  echo "$ac_t""no" 1>&6
fi
done

    else
	TCL_THREADS=0
	echo "$ac_t""no (default)" 1>&6
    fi
    


#------------------------------------------------------------------------
# If we're using GCC, see if the compiler understands -pipe.  If so, use it.
# It makes compiling go faster.  (This is only a performance feature.)
#------------------------------------------------------------------------

if test -z "$no_pipe"; then
if test -n "$GCC"; then
  echo $ac_n "checking if the compiler understands -pipe""... $ac_c" 1>&6
echo "configure:1254: checking if the compiler understands -pipe" >&5
  OLDCC="$CC"  
  CC="$CC -pipe"
  cat > conftest.$ac_ext <<EOF
#line 1258 "configure"
#include "confdefs.h"

int main() {

; return 0; }
EOF
if { (eval echo configure:1265: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  echo "$ac_t""yes" 1>&6
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  CC="$OLDCC"
    echo "$ac_t""no" 1>&6
fi
rm -f conftest*
fi  
fi

#--------------------------------------------------------------------
#	Supply substitutes for missing POSIX library procedures, or
#	set flags so Tcl uses alternate procedures.
#--------------------------------------------------------------------

# Check if Posix compliant getcwd exists, if not we'll use getwd.
for ac_func in getcwd
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:1288: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1293 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char $ac_func(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char $ac_func();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
$ac_func();
#endif

; return 0; }
EOF
if { (eval echo configure:1316: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_$ac_func=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_$ac_func=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
  cat >> confdefs.h <<EOF
#define $ac_tr_func 1
EOF
 
else
  echo "$ac_t""no" 1>&6
cat >> confdefs.h <<\EOF
#define USEGETWD 1
EOF

fi
done

# Nb: if getcwd uses popen and pwd(1) (like SunOS 4) we should really
# define USEGETWD even if the posix getcwd exists. Add a test ?

for ac_func in opendir strstr
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:1350: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1355 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char $ac_func(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char $ac_func();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
$ac_func();
#endif

; return 0; }
EOF
if { (eval echo configure:1378: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_$ac_func=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_$ac_func=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
  cat >> confdefs.h <<EOF
#define $ac_tr_func 1
EOF
 
else
  echo "$ac_t""no" 1>&6
LIBOBJS="$LIBOBJS ${ac_func}.${ac_objext}"
fi
done



for ac_func in strtol tmpnam waitpid
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:1408: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1413 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char $ac_func(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char $ac_func();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
$ac_func();
#endif

; return 0; }
EOF
if { (eval echo configure:1436: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_$ac_func=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_$ac_func=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
  cat >> confdefs.h <<EOF
#define $ac_tr_func 1
EOF
 
else
  echo "$ac_t""no" 1>&6
LIBOBJS="$LIBOBJS ${ac_func}.${ac_objext}"
fi
done


echo $ac_n "checking for strerror""... $ac_c" 1>&6
echo "configure:1463: checking for strerror" >&5
if eval "test \"`echo '$''{'ac_cv_func_strerror'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1468 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char strerror(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char strerror();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_strerror) || defined (__stub___strerror)
choke me
#else
strerror();
#endif

; return 0; }
EOF
if { (eval echo configure:1491: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_strerror=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_strerror=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'strerror`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
cat >> confdefs.h <<\EOF
#define NO_STRERROR 1
EOF

fi

echo $ac_n "checking for getwd""... $ac_c" 1>&6
echo "configure:1515: checking for getwd" >&5
if eval "test \"`echo '$''{'ac_cv_func_getwd'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1520 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char getwd(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char getwd();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_getwd) || defined (__stub___getwd)
choke me
#else
getwd();
#endif

; return 0; }
EOF
if { (eval echo configure:1543: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_getwd=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_getwd=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'getwd`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
cat >> confdefs.h <<\EOF
#define NO_GETWD 1
EOF

fi

echo $ac_n "checking for wait3""... $ac_c" 1>&6
echo "configure:1567: checking for wait3" >&5
if eval "test \"`echo '$''{'ac_cv_func_wait3'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1572 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char wait3(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char wait3();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_wait3) || defined (__stub___wait3)
choke me
#else
wait3();
#endif

; return 0; }
EOF
if { (eval echo configure:1595: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_wait3=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_wait3=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'wait3`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
cat >> confdefs.h <<\EOF
#define NO_WAIT3 1
EOF

fi

echo $ac_n "checking for uname""... $ac_c" 1>&6
echo "configure:1619: checking for uname" >&5
if eval "test \"`echo '$''{'ac_cv_func_uname'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1624 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char uname(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char uname();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_uname) || defined (__stub___uname)
choke me
#else
uname();
#endif

; return 0; }
EOF
if { (eval echo configure:1647: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_uname=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_uname=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'uname`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
cat >> confdefs.h <<\EOF
#define NO_UNAME 1
EOF

fi

echo $ac_n "checking for realpath""... $ac_c" 1>&6
echo "configure:1671: checking for realpath" >&5
if eval "test \"`echo '$''{'ac_cv_func_realpath'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1676 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char realpath(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char realpath();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_realpath) || defined (__stub___realpath)
choke me
#else
realpath();
#endif

; return 0; }
EOF
if { (eval echo configure:1699: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_realpath=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_realpath=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'realpath`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
cat >> confdefs.h <<\EOF
#define NO_REALPATH 1
EOF

fi


#--------------------------------------------------------------------
#	Supply substitutes for missing POSIX header files.  Special
#	notes:
#	    - stdlib.h doesn't define strtol, strtoul, or
#	      strtod insome versions of SunOS
#	    - some versions of string.h don't declare procedures such
#	      as strstr
#--------------------------------------------------------------------



    echo $ac_n "checking dirent.h""... $ac_c" 1>&6
echo "configure:1735: checking dirent.h" >&5
    cat > conftest.$ac_ext <<EOF
#line 1737 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <dirent.h>
int main() {

#ifndef _POSIX_SOURCE
#   ifdef __Lynx__
	/*
	 * Generate compilation error to make the test fail:  Lynx headers
	 * are only valid if really in the POSIX environment.
	 */

	missing_procedure();
#   endif
#endif
DIR *d;
struct dirent *entryPtr;
char *p;
d = opendir("foobar");
entryPtr = readdir(d);
p = entryPtr->d_name;
closedir(d);

; return 0; }
EOF
if { (eval echo configure:1763: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  tcl_ok=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  tcl_ok=no
fi
rm -f conftest*

    if test $tcl_ok = no; then
	cat >> confdefs.h <<\EOF
#define NO_DIRENT_H 1
EOF

    fi

    echo "$ac_t""$tcl_ok" 1>&6
    ac_safe=`echo "errno.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for errno.h""... $ac_c" 1>&6
echo "configure:1784: checking for errno.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1789 "configure"
#include "confdefs.h"
#include <errno.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1794: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
cat >> confdefs.h <<\EOF
#define NO_ERRNO_H 1
EOF

fi

    ac_safe=`echo "float.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for float.h""... $ac_c" 1>&6
echo "configure:1821: checking for float.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1826 "configure"
#include "confdefs.h"
#include <float.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1831: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
cat >> confdefs.h <<\EOF
#define NO_FLOAT_H 1
EOF

fi

    ac_safe=`echo "values.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for values.h""... $ac_c" 1>&6
echo "configure:1858: checking for values.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1863 "configure"
#include "confdefs.h"
#include <values.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1868: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
cat >> confdefs.h <<\EOF
#define NO_VALUES_H 1
EOF

fi

    ac_safe=`echo "limits.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for limits.h""... $ac_c" 1>&6
echo "configure:1895: checking for limits.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1900 "configure"
#include "confdefs.h"
#include <limits.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1905: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
cat >> confdefs.h <<\EOF
#define NO_LIMITS_H 1
EOF

fi

    ac_safe=`echo "stdlib.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for stdlib.h""... $ac_c" 1>&6
echo "configure:1932: checking for stdlib.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1937 "configure"
#include "confdefs.h"
#include <stdlib.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1942: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  tcl_ok=1
else
  echo "$ac_t""no" 1>&6
tcl_ok=0
fi

    cat > conftest.$ac_ext <<EOF
#line 1965 "configure"
#include "confdefs.h"
#include <stdlib.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "strtol" >/dev/null 2>&1; then
  :
else
  rm -rf conftest*
  tcl_ok=0
fi
rm -f conftest*

    cat > conftest.$ac_ext <<EOF
#line 1979 "configure"
#include "confdefs.h"
#include <stdlib.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "strtoul" >/dev/null 2>&1; then
  :
else
  rm -rf conftest*
  tcl_ok=0
fi
rm -f conftest*

    cat > conftest.$ac_ext <<EOF
#line 1993 "configure"
#include "confdefs.h"
#include <stdlib.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "strtod" >/dev/null 2>&1; then
  :
else
  rm -rf conftest*
  tcl_ok=0
fi
rm -f conftest*

    if test $tcl_ok = 0; then
	cat >> confdefs.h <<\EOF
#define NO_STDLIB_H 1
EOF

    fi
    ac_safe=`echo "string.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for string.h""... $ac_c" 1>&6
echo "configure:2014: checking for string.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 2019 "configure"
#include "confdefs.h"
#include <string.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:2024: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  tcl_ok=1
else
  echo "$ac_t""no" 1>&6
tcl_ok=0
fi

    cat > conftest.$ac_ext <<EOF
#line 2047 "configure"
#include "confdefs.h"
#include <string.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "strstr" >/dev/null 2>&1; then
  :
else
  rm -rf conftest*
  tcl_ok=0
fi
rm -f conftest*

    cat > conftest.$ac_ext <<EOF
#line 2061 "configure"
#include "confdefs.h"
#include <string.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "strerror" >/dev/null 2>&1; then
  :
else
  rm -rf conftest*
  tcl_ok=0
fi
rm -f conftest*


    # See also memmove check below for a place where NO_STRING_H can be
    # set and why.

    if test $tcl_ok = 0; then
	cat >> confdefs.h <<\EOF
#define NO_STRING_H 1
EOF

    fi

    ac_safe=`echo "sys/wait.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for sys/wait.h""... $ac_c" 1>&6
echo "configure:2087: checking for sys/wait.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 2092 "configure"
#include "confdefs.h"
#include <sys/wait.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:2097: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
cat >> confdefs.h <<\EOF
#define NO_SYS_WAIT_H 1
EOF

fi

    ac_safe=`echo "dlfcn.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for dlfcn.h""... $ac_c" 1>&6
echo "configure:2124: checking for dlfcn.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 2129 "configure"
#include "confdefs.h"
#include <dlfcn.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:2134: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
cat >> confdefs.h <<\EOF
#define NO_DLFCN_H 1
EOF

fi


    # OS/390 lacks sys/param.h (and doesn't need it, by chance).

    for ac_hdr in unistd.h sys/param.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
echo "configure:2166: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 2171 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:2176: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
  cat >> confdefs.h <<EOF
#define $ac_tr_hdr 1
EOF
 
else
  echo "$ac_t""no" 1>&6
fi
done




#---------------------------------------------------------------------------
#	Determine which interface to use to talk to the serial port.
#	Note that #include lines must begin in leftmost column for
#	some compilers to recognize them as preprocessor directives.
#---------------------------------------------------------------------------


    echo $ac_n "checking termios vs. termio vs. sgtty""... $ac_c" 1>&6
echo "configure:2213: checking termios vs. termio vs. sgtty" >&5

    if test "$cross_compiling" = yes; then
  tk_ok=no
else
  cat > conftest.$ac_ext <<EOF
#line 2219 "configure"
#include "confdefs.h"

#include <termios.h>

main()
{
    struct termios t;
    if (tcgetattr(0, &t) == 0) {
	cfsetospeed(&t, 0);
	t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB;
	return 0;
    }
    return 1;
}
EOF
if { (eval echo configure:2235: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
  tk_ok=termios
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -fr conftest*
  tk_ok=no
fi
rm -fr conftest*
fi


    if test $tk_ok = termios; then
	cat >> confdefs.h <<\EOF
#define USE_TERMIOS 1
EOF

    else
	if test "$cross_compiling" = yes; then
  tk_ok=no
else
  cat > conftest.$ac_ext <<EOF
#line 2258 "configure"
#include "confdefs.h"

#include <termio.h>

main()
{
    struct termio t;
    if (ioctl(0, TCGETA, &t) == 0) {
	t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB;
	return 0;
    }
    return 1;
    }
EOF
if { (eval echo configure:2273: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
  tk_ok=termio
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -fr conftest*
  tk_ok=no
fi
rm -fr conftest*
fi


    if test $tk_ok = termio; then
	cat >> confdefs.h <<\EOF
#define USE_TERMIO 1
EOF

    else
	if test "$cross_compiling" = yes; then
  tk_ok=none
else
  cat > conftest.$ac_ext <<EOF
#line 2296 "configure"
#include "confdefs.h"

#include <sgtty.h>

main()
{
    struct sgttyb t;
    if (ioctl(0, TIOCGETP, &t) == 0) {
	t.sg_ospeed = 0;
	t.sg_flags |= ODDP | EVENP | RAW;
	return 0;
    }
    return 1;
}
EOF
if { (eval echo configure:2312: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
  tk_ok=sgtty
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -fr conftest*
  tk_ok=none
fi
rm -fr conftest*
fi


    if test $tk_ok = sgtty; then
	cat >> confdefs.h <<\EOF
#define USE_SGTTY 1
EOF

    else
	if test "$cross_compiling" = yes; then
  tk_ok=no
else
  cat > conftest.$ac_ext <<EOF
#line 2335 "configure"
#include "confdefs.h"

#include <termios.h>
#include <errno.h>

main()
{
    struct termios t;
    if (tcgetattr(0, &t) == 0
	|| errno == ENOTTY || errno == ENXIO || errno == EINVAL) {
	cfsetospeed(&t, 0);
	t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB;
	return 0;
    }
    return 1;
}
EOF
if { (eval echo configure:2353: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
  tk_ok=termios
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -fr conftest*
  tk_ok=no
fi
rm -fr conftest*
fi


    if test $tk_ok = termios; then
	cat >> confdefs.h <<\EOF
#define USE_TERMIOS 1
EOF

    else
	if test "$cross_compiling" = yes; then
  tk_ok=no
else
  cat > conftest.$ac_ext <<EOF
#line 2376 "configure"
#include "confdefs.h"

#include <termio.h>
#include <errno.h>

main()
{
    struct termio t;
    if (ioctl(0, TCGETA, &t) == 0
	|| errno == ENOTTY || errno == ENXIO || errno == EINVAL) {
	t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB;
	return 0;
    }
    return 1;
    }
EOF
if { (eval echo configure:2393: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
  tk_ok=termio
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -fr conftest*
  tk_ok=no
fi
rm -fr conftest*
fi


    if test $tk_ok = termio; then
	cat >> confdefs.h <<\EOF
#define USE_TERMIO 1
EOF

    else
	if test "$cross_compiling" = yes; then
  tk_ok=none
else
  cat > conftest.$ac_ext <<EOF
#line 2416 "configure"
#include "confdefs.h"

#include <sgtty.h>
#include <errno.h>

main()
{
    struct sgttyb t;
    if (ioctl(0, TIOCGETP, &t) == 0
	|| errno == ENOTTY || errno == ENXIO || errno == EINVAL) {
	t.sg_ospeed = 0;
	t.sg_flags |= ODDP | EVENP | RAW;
	return 0;
    }
    return 1;
}
EOF
if { (eval echo configure:2434: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
  tk_ok=sgtty
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -fr conftest*
  tk_ok=none
fi
rm -fr conftest*
fi


    if test $tk_ok = sgtty; then
	cat >> confdefs.h <<\EOF
#define USE_SGTTY 1
EOF

    fi
    fi
    fi
    fi
    fi
    fi
    echo "$ac_t""$tk_ok" 1>&6


#--------------------------------------------------------------------
#	Include sys/select.h if it exists and if it supplies things
#	that appear to be useful and aren't already in sys/types.h.
#	This appears to be true only on the RS/6000 under AIX.  Some
#	systems like OSF/1 have a sys/select.h that's of no use, and
#	other systems like SCO UNIX have a sys/select.h that's
#	pernicious.  If "fd_set" isn't defined anywhere then set a
#	special flag.
#--------------------------------------------------------------------

echo $ac_n "checking fd_set and sys/select""... $ac_c" 1>&6
echo "configure:2472: checking fd_set and sys/select" >&5
cat > conftest.$ac_ext <<EOF
#line 2474 "configure"
#include "confdefs.h"
#include <sys/types.h>
int main() {
fd_set readMask, writeMask;
; return 0; }
EOF
if { (eval echo configure:2481: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  tk_ok=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  tk_ok=no
fi
rm -f conftest*
if test $tk_ok = no; then
    cat > conftest.$ac_ext <<EOF
#line 2493 "configure"
#include "confdefs.h"
#include <sys/select.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "fd_mask" >/dev/null 2>&1; then
  rm -rf conftest*
  tk_ok=yes
fi
rm -f conftest*

    if test $tk_ok = yes; then
	cat >> confdefs.h <<\EOF
#define HAVE_SYS_SELECT_H 1
EOF

    fi
fi
echo "$ac_t""$tk_ok" 1>&6
if test $tk_ok = no; then
    cat >> confdefs.h <<\EOF
#define NO_FD_SET 1
EOF

fi

#------------------------------------------------------------------------------
#       Find out all about time handling differences.
#------------------------------------------------------------------------------

echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6
echo "configure:2524: checking whether struct tm is in sys/time.h or time.h" >&5
if eval "test \"`echo '$''{'ac_cv_struct_tm'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 2529 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <time.h>
int main() {
struct tm *tp; tp->tm_sec;
; return 0; }
EOF
if { (eval echo configure:2537: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cv_struct_tm=time.h
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_struct_tm=sys/time.h
fi
rm -f conftest*
fi

echo "$ac_t""$ac_cv_struct_tm" 1>&6
if test $ac_cv_struct_tm = sys/time.h; then
  cat >> confdefs.h <<\EOF
#define TM_IN_SYS_TIME 1
EOF

fi


    for ac_hdr in sys/time.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
echo "configure:2562: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 2567 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:2572: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
  cat >> confdefs.h <<EOF
#define $ac_tr_hdr 1
EOF
 
else
  echo "$ac_t""no" 1>&6
fi
done

    echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6
echo "configure:2599: checking whether time.h and sys/time.h may both be included" >&5
if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 2604 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <sys/time.h>
#include <time.h>
int main() {
struct tm *tp;
; return 0; }
EOF
if { (eval echo configure:2613: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cv_header_time=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_header_time=no
fi
rm -f conftest*
fi

echo "$ac_t""$ac_cv_header_time" 1>&6
if test $ac_cv_header_time = yes; then
  cat >> confdefs.h <<\EOF
#define TIME_WITH_SYS_TIME 1
EOF

fi

    echo $ac_n "checking for tm_zone in struct tm""... $ac_c" 1>&6
echo "configure:2634: checking for tm_zone in struct tm" >&5
if eval "test \"`echo '$''{'ac_cv_struct_tm_zone'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 2639 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <$ac_cv_struct_tm>
int main() {
struct tm tm; tm.tm_zone;
; return 0; }
EOF
if { (eval echo configure:2647: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cv_struct_tm_zone=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_struct_tm_zone=no
fi
rm -f conftest*
fi

echo "$ac_t""$ac_cv_struct_tm_zone" 1>&6
if test "$ac_cv_struct_tm_zone" = yes; then
  cat >> confdefs.h <<\EOF
#define HAVE_TM_ZONE 1
EOF

else
  echo $ac_n "checking for tzname""... $ac_c" 1>&6
echo "configure:2667: checking for tzname" >&5
if eval "test \"`echo '$''{'ac_cv_var_tzname'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 2672 "configure"
#include "confdefs.h"
#include <time.h>
#ifndef tzname /* For SGI.  */
extern char *tzname[]; /* RS6000 and others reject char **tzname.  */
#endif
int main() {
atoi(*tzname);
; return 0; }
EOF
if { (eval echo configure:2682: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  ac_cv_var_tzname=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_var_tzname=no
fi
rm -f conftest*
fi

echo "$ac_t""$ac_cv_var_tzname" 1>&6
  if test $ac_cv_var_tzname = yes; then
    cat >> confdefs.h <<\EOF
#define HAVE_TZNAME 1
EOF

  fi
fi


    for ac_func in gmtime_r localtime_r
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:2707: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 2712 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char $ac_func(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char $ac_func();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
$ac_func();
#endif

; return 0; }
EOF
if { (eval echo configure:2735: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_$ac_func=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_$ac_func=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
  cat >> confdefs.h <<EOF
#define $ac_tr_func 1
EOF
 
else
  echo "$ac_t""no" 1>&6
fi
done


    echo $ac_n "checking tm_tzadj in struct tm""... $ac_c" 1>&6
echo "configure:2761: checking tm_tzadj in struct tm" >&5
    cat > conftest.$ac_ext <<EOF
#line 2763 "configure"
#include "confdefs.h"
#include <time.h>
int main() {
struct tm tm; tm.tm_tzadj;
; return 0; }
EOF
if { (eval echo configure:2770: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  cat >> confdefs.h <<\EOF
#define HAVE_TM_TZADJ 1
EOF

	    echo "$ac_t""yes" 1>&6
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  echo "$ac_t""no" 1>&6
fi
rm -f conftest*

    echo $ac_n "checking tm_gmtoff in struct tm""... $ac_c" 1>&6
echo "configure:2786: checking tm_gmtoff in struct tm" >&5
    cat > conftest.$ac_ext <<EOF
#line 2788 "configure"
#include "confdefs.h"
#include <time.h>
int main() {
struct tm tm; tm.tm_gmtoff;
; return 0; }
EOF
if { (eval echo configure:2795: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  cat >> confdefs.h <<\EOF
#define HAVE_TM_GMTOFF 1
EOF

	    echo "$ac_t""yes" 1>&6
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  echo "$ac_t""no" 1>&6
fi
rm -f conftest*

    #
    # Its important to include time.h in this check, as some systems
    # (like convex) have timezone functions, etc.
    #
    have_timezone=no
    echo $ac_n "checking long timezone variable""... $ac_c" 1>&6
echo "configure:2816: checking long timezone variable" >&5
    cat > conftest.$ac_ext <<EOF
#line 2818 "configure"
#include "confdefs.h"
#include <time.h>
int main() {
extern long timezone;
	    timezone += 1;
	    exit (0);
; return 0; }
EOF
if { (eval echo configure:2827: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  have_timezone=yes
	    cat >> confdefs.h <<\EOF
#define HAVE_TIMEZONE_VAR 1
EOF

	    echo "$ac_t""yes" 1>&6
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  echo "$ac_t""no" 1>&6
fi
rm -f conftest*

    #
    # On some systems (eg IRIX 6.2), timezone is a time_t and not a long.
    #
    if test "$have_timezone" = no; then
    echo $ac_n "checking time_t timezone variable""... $ac_c" 1>&6
echo "configure:2848: checking time_t timezone variable" >&5
    cat > conftest.$ac_ext <<EOF
#line 2850 "configure"
#include "confdefs.h"
#include <time.h>
int main() {
extern time_t timezone;
	    timezone += 1;
	    exit (0);
; return 0; }
EOF
if { (eval echo configure:2859: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  cat >> confdefs.h <<\EOF
#define HAVE_TIMEZONE_VAR 1
EOF

	    echo "$ac_t""yes" 1>&6
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  echo "$ac_t""no" 1>&6
fi
rm -f conftest*
    fi



#--------------------------------------------------------------------
#	Some systems (e.g., IRIX 4.0.5) lack the st_blksize field
#	in struct stat.  But we might be able to use fstatfs instead.
#--------------------------------------------------------------------
echo $ac_n "checking for st_blksize in struct stat""... $ac_c" 1>&6
echo "configure:2882: checking for st_blksize in struct stat" >&5
if eval "test \"`echo '$''{'ac_cv_struct_st_blksize'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 2887 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <sys/stat.h>
int main() {
struct stat s; s.st_blksize;
; return 0; }
EOF
if { (eval echo configure:2895: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cv_struct_st_blksize=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_struct_st_blksize=no
fi
rm -f conftest*
fi

echo "$ac_t""$ac_cv_struct_st_blksize" 1>&6
if test $ac_cv_struct_st_blksize = yes; then
  cat >> confdefs.h <<\EOF
#define HAVE_ST_BLKSIZE 1
EOF

fi

echo $ac_n "checking for fstatfs""... $ac_c" 1>&6
echo "configure:2916: checking for fstatfs" >&5
if eval "test \"`echo '$''{'ac_cv_func_fstatfs'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 2921 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char fstatfs(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char fstatfs();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_fstatfs) || defined (__stub___fstatfs)
choke me
#else
fstatfs();
#endif

; return 0; }
EOF
if { (eval echo configure:2944: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_fstatfs=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_fstatfs=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'fstatfs`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
cat >> confdefs.h <<\EOF
#define NO_FSTATFS 1
EOF

fi


#--------------------------------------------------------------------
#       Some system have no memcmp or it does not work with 8 bit
#       data, this checks it and add memcmp.o to LIBOBJS if needed
#--------------------------------------------------------------------
echo $ac_n "checking for 8-bit clean memcmp""... $ac_c" 1>&6
echo "configure:2973: checking for 8-bit clean memcmp" >&5
if eval "test \"`echo '$''{'ac_cv_func_memcmp_clean'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test "$cross_compiling" = yes; then
  ac_cv_func_memcmp_clean=no
else
  cat > conftest.$ac_ext <<EOF
#line 2981 "configure"
#include "confdefs.h"

main()
{
  char c0 = 0x40, c1 = 0x80, c2 = 0x81;
  exit(memcmp(&c0, &c2, 1) < 0 && memcmp(&c1, &c2, 1) < 0 ? 0 : 1);
}

EOF
if { (eval echo configure:2991: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
  ac_cv_func_memcmp_clean=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -fr conftest*
  ac_cv_func_memcmp_clean=no
fi
rm -fr conftest*
fi

fi

echo "$ac_t""$ac_cv_func_memcmp_clean" 1>&6
test $ac_cv_func_memcmp_clean = no && LIBOBJS="$LIBOBJS memcmp.${ac_objext}"


#--------------------------------------------------------------------
#       Some system like SunOS 4 and other BSD like systems
#       have no memmove (we assume they have bcopy instead).
#       {The replacement define is in compat/string.h}
#--------------------------------------------------------------------
echo $ac_n "checking for memmove""... $ac_c" 1>&6
echo "configure:3015: checking for memmove" >&5
if eval "test \"`echo '$''{'ac_cv_func_memmove'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 3020 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char memmove(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char memmove();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_memmove) || defined (__stub___memmove)
choke me
#else
memmove();
#endif

; return 0; }
EOF
if { (eval echo configure:3043: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_memmove=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_memmove=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'memmove`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
cat >> confdefs.h <<\EOF
#define NO_MEMMOVE 1
EOF
 cat >> confdefs.h <<\EOF
#define NO_STRING_H 1
EOF

fi


#--------------------------------------------------------------------
#	On some systems strstr is broken: it returns a pointer even
#	even if the original string is empty.
#--------------------------------------------------------------------

echo $ac_n "checking proper strstr implementation""... $ac_c" 1>&6
echo "configure:3076: checking proper strstr implementation" >&5
if test "$cross_compiling" = yes; then
  tcl_ok=no
else
  cat > conftest.$ac_ext <<EOF
#line 3081 "configure"
#include "confdefs.h"

extern int strstr();
int main()
{
    exit(strstr("\0test", "test") ? 1 : 0);
}

EOF
if { (eval echo configure:3091: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
  tcl_ok=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -fr conftest*
  tcl_ok=no
fi
rm -fr conftest*
fi

if test $tcl_ok = yes; then
    echo "$ac_t""yes" 1>&6
else
    echo "$ac_t""broken, using substitute" 1>&6
    LIBOBJS="$LIBOBJS strstr.o"
fi

#--------------------------------------------------------------------
#	Check for strtoul function.  This is tricky because under some
#	versions of AIX strtoul returns an incorrect terminator
#	pointer for the string "0".
#--------------------------------------------------------------------

echo $ac_n "checking for strtoul""... $ac_c" 1>&6
echo "configure:3117: checking for strtoul" >&5
if eval "test \"`echo '$''{'ac_cv_func_strtoul'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 3122 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char strtoul(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char strtoul();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_strtoul) || defined (__stub___strtoul)
choke me
#else
strtoul();
#endif

; return 0; }
EOF
if { (eval echo configure:3145: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_strtoul=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_strtoul=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'strtoul`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  tcl_ok=1
else
  echo "$ac_t""no" 1>&6
tcl_ok=0
fi

if test "$cross_compiling" = yes; then
  tcl_ok=0
else
  cat > conftest.$ac_ext <<EOF
#line 3169 "configure"
#include "confdefs.h"

extern int strtoul();
int main()
{
    char *string = "0";
    char *term;
    int value;
    value = strtoul(string, &term, 0);
    if ((value != 0) || (term != (string+1))) {
        exit(1);
    }
    exit(0);
}
EOF
if { (eval echo configure:3185: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
  :
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -fr conftest*
  tcl_ok=0
fi
rm -fr conftest*
fi

if test "$tcl_ok" = 0; then
    test -n "$verbose" && echo "	Adding strtoul.o."
    LIBOBJS="$LIBOBJS strtoul.o"
fi

#--------------------------------------------------------------------
#	Check for the strtod function.  This is tricky because in some
#	versions of Linux strtod mis-parses strings starting with "+".
#--------------------------------------------------------------------

echo $ac_n "checking for strtod""... $ac_c" 1>&6
echo "configure:3208: checking for strtod" >&5
if eval "test \"`echo '$''{'ac_cv_func_strtod'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 3213 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char strtod(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char strtod();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_strtod) || defined (__stub___strtod)
choke me
#else
strtod();
#endif

; return 0; }
EOF
if { (eval echo configure:3236: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_strtod=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_strtod=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'strtod`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  tcl_ok=1
else
  echo "$ac_t""no" 1>&6
tcl_ok=0
fi

if test "$cross_compiling" = yes; then
  tcl_ok=0
else
  cat > conftest.$ac_ext <<EOF
#line 3260 "configure"
#include "confdefs.h"

extern double strtod();
int main()
{
    char *string = " +69";
    char *term;
    double value;
    value = strtod(string, &term);
    if ((value != 69) || (term != (string+4))) {
	exit(1);
    }
    exit(0);
}
EOF
if { (eval echo configure:3276: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
  :
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -fr conftest*
  tcl_ok=0
fi
rm -fr conftest*
fi

if test "$tcl_ok" = 0; then
    test -n "$verbose" && echo "	Adding strtod.o."
    LIBOBJS="$LIBOBJS strtod.o"
fi

#--------------------------------------------------------------------
#	Under Solaris 2.4, strtod returns the wrong value for the
#	terminating character under some conditions.  Check for this
#	and if the problem exists use a substitute procedure
#	"fixstrtod" that corrects the error.
#--------------------------------------------------------------------


    echo $ac_n "checking for strtod""... $ac_c" 1>&6
echo "configure:3302: checking for strtod" >&5
if eval "test \"`echo '$''{'ac_cv_func_strtod'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 3307 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char strtod(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char strtod();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_strtod) || defined (__stub___strtod)
choke me
#else
strtod();
#endif

; return 0; }
EOF
if { (eval echo configure:3330: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_strtod=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_strtod=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'strtod`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  tcl_strtod=1
else
  echo "$ac_t""no" 1>&6
tcl_strtod=0
fi

    if test "$tcl_strtod" = 1; then
	echo $ac_n "checking for Solaris2.4/Tru64 strtod bugs""... $ac_c" 1>&6
echo "configure:3352: checking for Solaris2.4/Tru64 strtod bugs" >&5
	if test "$cross_compiling" = yes; then
  tcl_ok=0
else
  cat > conftest.$ac_ext <<EOF
#line 3357 "configure"
#include "confdefs.h"

	    extern double strtod();
	    int main()
	    {
		char *string = "NaN", *spaceString = " ";
		char *term;
		double value;
		value = strtod(string, &term);
		if ((term != string) && (term[-1] == 0)) {
		    exit(1);
		}
		value = strtod(spaceString, &term);
		if (term == (spaceString+1)) {
		    exit(1);
		}
		exit(0);
	    }
EOF
if { (eval echo configure:3377: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
  tcl_ok=1
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -fr conftest*
  tcl_ok=0
fi
rm -fr conftest*
fi

	if test "$tcl_ok" = 1; then
	    echo "$ac_t""ok" 1>&6
	else
	    echo "$ac_t""buggy" 1>&6
	    LIBOBJS="$LIBOBJS fixstrtod.o"
	    cat >> confdefs.h <<\EOF
#define strtod fixstrtod
EOF

	fi
    fi


#--------------------------------------------------------------------
#	Check for various typedefs and provide substitutes if
#	they don't exist.
#--------------------------------------------------------------------

echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
echo "configure:3408: checking for ANSI C header files" >&5
if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 3413 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <float.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:3421: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  ac_cv_header_stdc=yes
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_header_stdc=no
fi
rm -f conftest*

if test $ac_cv_header_stdc = yes; then
  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
cat > conftest.$ac_ext <<EOF
#line 3438 "configure"
#include "confdefs.h"
#include <string.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "memchr" >/dev/null 2>&1; then
  :
else
  rm -rf conftest*
  ac_cv_header_stdc=no
fi
rm -f conftest*

fi

if test $ac_cv_header_stdc = yes; then
  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
cat > conftest.$ac_ext <<EOF
#line 3456 "configure"
#include "confdefs.h"
#include <stdlib.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "free" >/dev/null 2>&1; then
  :
else
  rm -rf conftest*
  ac_cv_header_stdc=no
fi
rm -f conftest*

fi

if test $ac_cv_header_stdc = yes; then
  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
if test "$cross_compiling" = yes; then
  :
else
  cat > conftest.$ac_ext <<EOF
#line 3477 "configure"
#include "confdefs.h"
#include <ctype.h>
#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
int main () { int i; for (i = 0; i < 256; i++)
if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
exit (0); }

EOF
if { (eval echo configure:3488: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
  :
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -fr conftest*
  ac_cv_header_stdc=no
fi
rm -fr conftest*
fi

fi
fi

echo "$ac_t""$ac_cv_header_stdc" 1>&6
if test $ac_cv_header_stdc = yes; then
  cat >> confdefs.h <<\EOF
#define STDC_HEADERS 1
EOF

fi

echo $ac_n "checking for mode_t""... $ac_c" 1>&6
echo "configure:3512: checking for mode_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_mode_t'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 3517 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
#include <stdlib.h>
#include <stddef.h>
#endif
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "(^|[^a-zA-Z_0-9])mode_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
  rm -rf conftest*
  ac_cv_type_mode_t=yes
else
  rm -rf conftest*
  ac_cv_type_mode_t=no
fi
rm -f conftest*

fi
echo "$ac_t""$ac_cv_type_mode_t" 1>&6
if test $ac_cv_type_mode_t = no; then
  cat >> confdefs.h <<\EOF
#define mode_t int
EOF

fi

echo $ac_n "checking for pid_t""... $ac_c" 1>&6
echo "configure:3545: checking for pid_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_pid_t'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 3550 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
#include <stdlib.h>
#include <stddef.h>
#endif
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "(^|[^a-zA-Z_0-9])pid_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
  rm -rf conftest*
  ac_cv_type_pid_t=yes
else
  rm -rf conftest*
  ac_cv_type_pid_t=no
fi
rm -f conftest*

fi
echo "$ac_t""$ac_cv_type_pid_t" 1>&6
if test $ac_cv_type_pid_t = no; then
  cat >> confdefs.h <<\EOF
#define pid_t int
EOF

fi

echo $ac_n "checking for size_t""... $ac_c" 1>&6
echo "configure:3578: checking for size_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 3583 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
#include <stdlib.h>
#include <stddef.h>
#endif
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
  rm -rf conftest*
  ac_cv_type_size_t=yes
else
  rm -rf conftest*
  ac_cv_type_size_t=no
fi
rm -f conftest*

fi
echo "$ac_t""$ac_cv_type_size_t" 1>&6
if test $ac_cv_type_size_t = no; then
  cat >> confdefs.h <<\EOF
#define size_t unsigned
EOF

fi

echo $ac_n "checking for uid_t in sys/types.h""... $ac_c" 1>&6
echo "configure:3611: checking for uid_t in sys/types.h" >&5
if eval "test \"`echo '$''{'ac_cv_type_uid_t'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 3616 "configure"
#include "confdefs.h"
#include <sys/types.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "uid_t" >/dev/null 2>&1; then
  rm -rf conftest*
  ac_cv_type_uid_t=yes
else
  rm -rf conftest*
  ac_cv_type_uid_t=no
fi
rm -f conftest*

fi

echo "$ac_t""$ac_cv_type_uid_t" 1>&6
if test $ac_cv_type_uid_t = no; then
  cat >> confdefs.h <<\EOF
#define uid_t int
EOF

  cat >> confdefs.h <<\EOF
#define gid_t int
EOF

fi


#--------------------------------------------------------------------
#	If a system doesn't have an opendir function (man, that's old!)
#	then we have to supply a different version of dirent.h which
#	is compatible with the substitute version of opendir that's
#	provided.  This version only works with V7-style directories.
#--------------------------------------------------------------------

echo $ac_n "checking for opendir""... $ac_c" 1>&6
echo "configure:3653: checking for opendir" >&5
if eval "test \"`echo '$''{'ac_cv_func_opendir'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 3658 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char opendir(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char opendir();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_opendir) || defined (__stub___opendir)
choke me
#else
opendir();
#endif

; return 0; }
EOF
if { (eval echo configure:3681: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_opendir=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_opendir=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'opendir`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
cat >> confdefs.h <<\EOF
#define USE_DIRENT2_H 1
EOF

fi


#--------------------------------------------------------------------
#	The check below checks whether <sys/wait.h> defines the type
#	"union wait" correctly.  It's needed because of weirdness in
#	HP-UX where "union wait" is defined in both the BSD and SYS-V
#	environments.  Checking the usability of WIFEXITED seems to do
#	the trick.
#--------------------------------------------------------------------

echo $ac_n "checking union wait""... $ac_c" 1>&6
echo "configure:3714: checking union wait" >&5
cat > conftest.$ac_ext <<EOF
#line 3716 "configure"
#include "confdefs.h"
#include <sys/types.h> 
#include <sys/wait.h>
int main() {

union wait x;
WIFEXITED(x);		/* Generates compiler error if WIFEXITED
			 * uses an int. */

; return 0; }
EOF
if { (eval echo configure:3728: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  tcl_ok=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  tcl_ok=no
fi
rm -f conftest*
echo "$ac_t""$tcl_ok" 1>&6
if test $tcl_ok = no; then
    cat >> confdefs.h <<\EOF
#define NO_UNION_WAIT 1
EOF

fi

#--------------------------------------------------------------------
#	Check to see whether the system supports the matherr function
#	and its associated type "struct exception".
#--------------------------------------------------------------------

echo $ac_n "checking matherr support""... $ac_c" 1>&6
echo "configure:3752: checking matherr support" >&5
cat > conftest.$ac_ext <<EOF
#line 3754 "configure"
#include "confdefs.h"
#include <math.h>
int main() {

struct exception x;
x.type = DOMAIN;
x.type = SING;

; return 0; }
EOF
if { (eval echo configure:3765: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  tcl_ok=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  tcl_ok=no
fi
rm -f conftest*
echo "$ac_t""$tcl_ok" 1>&6
if test $tcl_ok = yes; then
    cat >> confdefs.h <<\EOF
#define NEED_MATHERR 1
EOF

fi

#--------------------------------------------------------------------
#	Check whether there is an strncasecmp function on this system.
#	This is a bit tricky because under SCO it's in -lsocket and
#	under Sequent Dynix it's in -linet.
#--------------------------------------------------------------------

echo $ac_n "checking for strncasecmp""... $ac_c" 1>&6
echo "configure:3790: checking for strncasecmp" >&5
if eval "test \"`echo '$''{'ac_cv_func_strncasecmp'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 3795 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char strncasecmp(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char strncasecmp();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_strncasecmp) || defined (__stub___strncasecmp)
choke me
#else
strncasecmp();
#endif

; return 0; }
EOF
if { (eval echo configure:3818: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_strncasecmp=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_strncasecmp=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'strncasecmp`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  tcl_ok=1
else
  echo "$ac_t""no" 1>&6
tcl_ok=0
fi

if test "$tcl_ok" = 0; then
    echo $ac_n "checking for strncasecmp in -lsocket""... $ac_c" 1>&6
echo "configure:3840: checking for strncasecmp in -lsocket" >&5
ac_lib_var=`echo socket'_'strncasecmp | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lsocket  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 3848 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char strncasecmp();

int main() {
strncasecmp()
; return 0; }
EOF
if { (eval echo configure:3859: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  tcl_ok=1
else
  echo "$ac_t""no" 1>&6
tcl_ok=0
fi

fi
if test "$tcl_ok" = 0; then
    echo $ac_n "checking for strncasecmp in -linet""... $ac_c" 1>&6
echo "configure:3883: checking for strncasecmp in -linet" >&5
ac_lib_var=`echo inet'_'strncasecmp | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-linet  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 3891 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char strncasecmp();

int main() {
strncasecmp()
; return 0; }
EOF
if { (eval echo configure:3902: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  tcl_ok=1
else
  echo "$ac_t""no" 1>&6
tcl_ok=0
fi

fi
if test "$tcl_ok" = 0; then
    LIBOBJS="$LIBOBJS strncasecmp.o"
fi

#--------------------------------------------------------------------
#	The code below deals with several issues related to gettimeofday:
#	1. Some systems don't provide a gettimeofday function at all
#	   (set NO_GETTOD if this is the case).
#	2. SGI systems don't use the BSD form of the gettimeofday function,
#	   but they have a BSDgettimeofday function that can be used instead.
#	3. See if gettimeofday is declared in the <sys/time.h> header file.
#	   if not, set the GETTOD_NOT_DECLARED flag so that tclPort.h can
#	   declare it.
#--------------------------------------------------------------------

echo $ac_n "checking for BSDgettimeofday""... $ac_c" 1>&6
echo "configure:3940: checking for BSDgettimeofday" >&5
if eval "test \"`echo '$''{'ac_cv_func_BSDgettimeofday'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 3945 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char BSDgettimeofday(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char BSDgettimeofday();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_BSDgettimeofday) || defined (__stub___BSDgettimeofday)
choke me
#else
BSDgettimeofday();
#endif

; return 0; }
EOF
if { (eval echo configure:3968: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_BSDgettimeofday=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_BSDgettimeofday=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'BSDgettimeofday`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  cat >> confdefs.h <<\EOF
#define HAVE_BSDGETTIMEOFDAY 1
EOF

else
  echo "$ac_t""no" 1>&6

    echo $ac_n "checking for gettimeofday""... $ac_c" 1>&6
echo "configure:3990: checking for gettimeofday" >&5
if eval "test \"`echo '$''{'ac_cv_func_gettimeofday'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 3995 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char gettimeofday(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char gettimeofday();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_gettimeofday) || defined (__stub___gettimeofday)
choke me
#else
gettimeofday();
#endif

; return 0; }
EOF
if { (eval echo configure:4018: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_gettimeofday=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_gettimeofday=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'gettimeofday`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
cat >> confdefs.h <<\EOF
#define NO_GETTOD 1
EOF

fi


fi

echo $ac_n "checking for gettimeofday declaration""... $ac_c" 1>&6
echo "configure:4045: checking for gettimeofday declaration" >&5
cat > conftest.$ac_ext <<EOF
#line 4047 "configure"
#include "confdefs.h"
#include <sys/time.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "gettimeofday" >/dev/null 2>&1; then
  rm -rf conftest*
  echo "$ac_t""present" 1>&6
else
  rm -rf conftest*
  
    echo "$ac_t""missing" 1>&6
    cat >> confdefs.h <<\EOF
#define GETTOD_NOT_DECLARED 1
EOF


fi
rm -f conftest*


#--------------------------------------------------------------------
#	The following code checks to see whether it is possible to get
#	signed chars on this platform.  This is needed in order to
#	properly generate sign-extended ints from character values.
#--------------------------------------------------------------------

echo $ac_n "checking whether char is unsigned""... $ac_c" 1>&6
echo "configure:4075: checking whether char is unsigned" >&5
if eval "test \"`echo '$''{'ac_cv_c_char_unsigned'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test "$GCC" = yes; then
  # GCC predefines this symbol on systems where it applies.
cat > conftest.$ac_ext <<EOF
#line 4082 "configure"
#include "confdefs.h"
#ifdef __CHAR_UNSIGNED__
  yes
#endif

EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "yes" >/dev/null 2>&1; then
  rm -rf conftest*
  ac_cv_c_char_unsigned=yes
else
  rm -rf conftest*
  ac_cv_c_char_unsigned=no
fi
rm -f conftest*

else
if test "$cross_compiling" = yes; then
    { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
else
  cat > conftest.$ac_ext <<EOF
#line 4104 "configure"
#include "confdefs.h"
/* volatile prevents gcc2 from optimizing the test away on sparcs.  */
#if !defined(__STDC__) || __STDC__ != 1
#define volatile
#endif
main() {
  volatile char c = 255; exit(c < 0);
}
EOF
if { (eval echo configure:4114: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
  ac_cv_c_char_unsigned=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -fr conftest*
  ac_cv_c_char_unsigned=no
fi
rm -fr conftest*
fi

fi
fi

echo "$ac_t""$ac_cv_c_char_unsigned" 1>&6
if test $ac_cv_c_char_unsigned = yes && test "$GCC" != yes; then
  cat >> confdefs.h <<\EOF
#define __CHAR_UNSIGNED__ 1
EOF

fi

echo $ac_n "checking signed char declarations""... $ac_c" 1>&6
echo "configure:4138: checking signed char declarations" >&5
cat > conftest.$ac_ext <<EOF
#line 4140 "configure"
#include "confdefs.h"

int main() {

signed char *p;
p = 0;

; return 0; }
EOF
if { (eval echo configure:4150: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  tcl_ok=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  tcl_ok=no
fi
rm -f conftest*
echo "$ac_t""$tcl_ok" 1>&6
if test $tcl_ok = yes; then
    cat >> confdefs.h <<\EOF
#define HAVE_SIGNED_CHAR 1
EOF

fi

#--------------------------------------------------------------------
# Look for libraries that we will need when compiling the Tcl shell
#--------------------------------------------------------------------


    #--------------------------------------------------------------------
    # On a few very rare systems, all of the libm.a stuff is
    # already in libc.a.  Set compiler flags accordingly.
    # Also, Linux requires the "ieee" library for math to work
    # right (and it must appear before "-lm").
    #--------------------------------------------------------------------

    echo $ac_n "checking for sin""... $ac_c" 1>&6
echo "configure:4181: checking for sin" >&5
if eval "test \"`echo '$''{'ac_cv_func_sin'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 4186 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char sin(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char sin();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_sin) || defined (__stub___sin)
choke me
#else
sin();
#endif

; return 0; }
EOF
if { (eval echo configure:4209: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_sin=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_sin=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'sin`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  MATH_LIBS=""
else
  echo "$ac_t""no" 1>&6
MATH_LIBS="-lm"
fi

    echo $ac_n "checking for main in -lieee""... $ac_c" 1>&6
echo "configure:4230: checking for main in -lieee" >&5
ac_lib_var=`echo ieee'_'main | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lieee  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 4238 "configure"
#include "confdefs.h"

int main() {
main()
; return 0; }
EOF
if { (eval echo configure:4245: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  MATH_LIBS="-lieee $MATH_LIBS"
else
  echo "$ac_t""no" 1>&6
fi


    #--------------------------------------------------------------------
    # Interactive UNIX requires -linet instead of -lsocket, plus it
    # needs net/errno.h to define the socket-related error codes.
    #--------------------------------------------------------------------

    echo $ac_n "checking for main in -linet""... $ac_c" 1>&6
echo "configure:4272: checking for main in -linet" >&5
ac_lib_var=`echo inet'_'main | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-linet  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 4280 "configure"
#include "confdefs.h"

int main() {
main()
; return 0; }
EOF
if { (eval echo configure:4287: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  LIBS="$LIBS -linet"
else
  echo "$ac_t""no" 1>&6
fi

    ac_safe=`echo "net/errno.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for net/errno.h""... $ac_c" 1>&6
echo "configure:4309: checking for net/errno.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 4314 "configure"
#include "confdefs.h"
#include <net/errno.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:4319: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  cat >> confdefs.h <<\EOF
#define HAVE_NET_ERRNO_H 1
EOF

else
  echo "$ac_t""no" 1>&6
fi


    #--------------------------------------------------------------------
    #	Check for the existence of the -lsocket and -lnsl libraries.
    #	The order here is important, so that they end up in the right
    #	order in the command line generated by make.  Here are some
    #	special considerations:
    #	1. Use "connect" and "accept" to check for -lsocket, and
    #	   "gethostbyname" to check for -lnsl.
    #	2. Use each function name only once:  can't redo a check because
    #	   autoconf caches the results of the last check and won't redo it.
    #	3. Use -lnsl and -lsocket only if they supply procedures that
    #	   aren't already present in the normal libraries.  This is because
    #	   IRIX 5.2 has libraries, but they aren't needed and they're
    #	   bogus:  they goof up name resolution if used.
    #	4. On some SVR4 systems, can't use -lsocket without -lnsl too.
    #	   To get around this problem, check for both libraries together
    #	   if -lsocket doesn't work by itself.
    #--------------------------------------------------------------------

    tcl_checkBoth=0
    echo $ac_n "checking for connect""... $ac_c" 1>&6
echo "configure:4364: checking for connect" >&5
if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 4369 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char connect(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char connect();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_connect) || defined (__stub___connect)
choke me
#else
connect();
#endif

; return 0; }
EOF
if { (eval echo configure:4392: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_connect=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_connect=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'connect`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  tcl_checkSocket=0
else
  echo "$ac_t""no" 1>&6
tcl_checkSocket=1
fi

    if test "$tcl_checkSocket" = 1; then
	echo $ac_n "checking for setsockopt""... $ac_c" 1>&6
echo "configure:4414: checking for setsockopt" >&5
if eval "test \"`echo '$''{'ac_cv_func_setsockopt'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 4419 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char setsockopt(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char setsockopt();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_setsockopt) || defined (__stub___setsockopt)
choke me
#else
setsockopt();
#endif

; return 0; }
EOF
if { (eval echo configure:4442: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_setsockopt=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_setsockopt=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'setsockopt`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
echo $ac_n "checking for setsockopt in -lsocket""... $ac_c" 1>&6
echo "configure:4460: checking for setsockopt in -lsocket" >&5
ac_lib_var=`echo socket'_'setsockopt | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lsocket  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 4468 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char setsockopt();

int main() {
setsockopt()
; return 0; }
EOF
if { (eval echo configure:4479: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  LIBS="$LIBS -lsocket"
else
  echo "$ac_t""no" 1>&6
tcl_checkBoth=1
fi

fi

    fi
    if test "$tcl_checkBoth" = 1; then
	tk_oldLibs=$LIBS
	LIBS="$LIBS -lsocket -lnsl"
	echo $ac_n "checking for accept""... $ac_c" 1>&6
echo "configure:4507: checking for accept" >&5
if eval "test \"`echo '$''{'ac_cv_func_accept'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 4512 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char accept(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char accept();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_accept) || defined (__stub___accept)
choke me
#else
accept();
#endif

; return 0; }
EOF
if { (eval echo configure:4535: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_accept=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_accept=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'accept`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  tcl_checkNsl=0
else
  echo "$ac_t""no" 1>&6
LIBS=$tk_oldLibs
fi

    fi
    echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6
echo "configure:4557: checking for gethostbyname" >&5
if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 4562 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char gethostbyname(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char gethostbyname();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_gethostbyname) || defined (__stub___gethostbyname)
choke me
#else
gethostbyname();
#endif

; return 0; }
EOF
if { (eval echo configure:4585: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_gethostbyname=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_gethostbyname=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'gethostbyname`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6
echo "configure:4603: checking for gethostbyname in -lnsl" >&5
ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lnsl  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 4611 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char gethostbyname();

int main() {
gethostbyname()
; return 0; }
EOF
if { (eval echo configure:4622: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  LIBS="$LIBS -lnsl"
else
  echo "$ac_t""no" 1>&6
fi

fi

    
    # Don't perform the eval of the libraries here because DL_LIBS
    # won't be set until we call SC_CONFIG_CFLAGS

    TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}'
    
    


# Add the threads support libraries

LIBS="$LIBS$THREADS_LIBS"

#--------------------------------------------------------------------
# The statements below define a collection of compile flags.  This
# macro depends on the value of SHARED_BUILD, and should be called
# after SC_ENABLE_SHARED checks the configure switches.
#--------------------------------------------------------------------



    # Step 0.a: Enable 64 bit support?

    echo $ac_n "checking if 64bit support is requested""... $ac_c" 1>&6
echo "configure:4668: checking if 64bit support is requested" >&5
    # Check whether --enable-64bit or --disable-64bit was given.
if test "${enable_64bit+set}" = set; then
  enableval="$enable_64bit"
  :
else
  enableval="no"
fi


    if test "$enableval" = "yes"; then
	do64bit=yes
    else
	do64bit=no
    fi
    echo "$ac_t""$do64bit" 1>&6

    # Step 0.b: Enable Solaris 64 bit VIS support?

    echo $ac_n "checking if 64bit Sparc VIS support is requested""... $ac_c" 1>&6
echo "configure:4688: checking if 64bit Sparc VIS support is requested" >&5
    # Check whether --enable-64bit-vis or --disable-64bit-vis was given.
if test "${enable_64bit_vis+set}" = set; then
  enableval="$enable_64bit_vis"
  :
else
  enableval="no"
fi


    if test "$enableval" = "yes"; then
	# Force 64bit on with VIS
	do64bit=yes
	do64bitVIS=yes
    else
	do64bitVIS=no
    fi
    echo "$ac_t""$do64bitVIS" 1>&6

    # Step 1: set the variable "system" to hold the name and version number
    # for the system.  This can usually be done via the "uname" command, but
    # there are a few systems, like Next, where this doesn't work.

    echo $ac_n "checking system version (for dynamic loading)""... $ac_c" 1>&6
echo "configure:4712: checking system version (for dynamic loading)" >&5
    if test -f /usr/lib/NextStep/software_version; then
	system=NEXTSTEP-`awk '/3/,/3/' /usr/lib/NextStep/software_version`
    else
	system=`uname -s`-`uname -r`
	if test "$?" -ne 0 ; then
	    echo "$ac_t""unknown (can't find uname command)" 1>&6
	    system=unknown
	else
	    # Special check for weird MP-RAS system (uname returns weird
	    # results, and the version is kept in special file).
	
	    if test -r /etc/.relid -a "X`uname -n`" = "X`uname -s`" ; then
		system=MP-RAS-`awk '{print }' /etc/.relid'`
	    fi
	    if test "`uname -s`" = "AIX" ; then
		system=AIX-`uname -v`.`uname -r`
	    fi
	    echo "$ac_t""$system" 1>&6
	fi
    fi

    # Step 2: check for existence of -ldl library.  This is needed because
    # Linux can use either -ldl or -ldld for dynamic loading.

    echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6
echo "configure:4738: checking for dlopen in -ldl" >&5
ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-ldl  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 4746 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char dlopen();

int main() {
dlopen()
; return 0; }
EOF
if { (eval echo configure:4757: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  have_dl=yes
else
  echo "$ac_t""no" 1>&6
have_dl=no
fi


    # Step 3: set configuration options based on system name and version.

    do64bit_ok=no
    EXTRA_CFLAGS=""
    TCL_EXPORT_FILE_SUFFIX=""
    UNSHARED_LIB_SUFFIX=""
    TCL_TRIM_DOTS='`echo ${VERSION} | tr -d .`'
    ECHO_VERSION='`echo ${VERSION}`'
    TCL_LIB_VERSIONS_OK=ok
    CFLAGS_DEBUG=-g
    CFLAGS_OPTIMIZE=-O
    if test "$GCC" = "yes" ; then
	CFLAGS_WARNING="-Wall -Wconversion -Wno-implicit-int"
    else
	CFLAGS_WARNING=""
    fi
    TCL_NEEDS_EXP_FILE=0
    TCL_BUILD_EXP_FILE=""
    TCL_EXP_FILE=""
    # Extract the first word of "ar", so it can be a program name with args.
set dummy ar; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:4801: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$AR"; then
  ac_cv_prog_AR="$AR" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_AR="ar"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
AR="$ac_cv_prog_AR"
if test -n "$AR"; then
  echo "$ac_t""$AR" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

    STLIB_LD='${AR} cr'
    case $system in
	AIX-5.*)
	    if test "${TCL_THREADS}" = "1" -a "$GCC" != "yes" ; then
		# AIX requires the _r compiler when gcc isn't being used
		if test "${CC}" != "cc_r" ; then
		    CC=${CC}_r
		fi
		echo "$ac_t""Using $CC for compiling with threads" 1>&6
	    fi
	    LIBS="$LIBS -lc"
	    # AIX-5 uses ELF style dynamic libraries
	    SHLIB_CFLAGS=""
	    SHLIB_LD="/usr/ccs/bin/ld -G -z text"

	    # Note: need the LIBS below, otherwise Tk won't find Tcl's
	    # symbols when dynamically loaded into tclsh.

	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    # AIX-5 has dl* in libc.so
	    DL_LIBS=""
	    LDFLAGS=""
	    if test "$GCC" = "yes" ; then
		LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
	    else
		LD_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}'
	    fi

	    # Check to enable 64-bit flags for compiler/linker
	    if test "$do64bit" = "yes" ; then
		if test "$GCC" = "yes" ; then
		    echo "configure: warning: "64bit mode not supported with GCC on $system"" 1>&2
		else
		    do64bit_ok=yes
		    EXTRA_CFLAGS="-q64"
		    LDFLAGS="-q64"
		fi
	    fi
	    ;;
	AIX-*)
	    if test "${TCL_THREADS}" = "1" -a "$GCC" != "yes" ; then
		# AIX requires the _r compiler when gcc isn't being used
		if test "${CC}" != "cc_r" ; then
		    CC=${CC}_r
		fi
		echo "$ac_t""Using $CC for compiling with threads" 1>&6
	    fi
	    LIBS="$LIBS -lc"
	    SHLIB_CFLAGS=""
	    SHLIB_LD="${TCL_SRC_DIR}/unix/ldAix /bin/ld -bhalt:4 -bM:SRE -bE:lib.exp -H512 -T512 -bnoentry"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS="-ldl"
	    LDFLAGS=""
	    LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
	    TCL_NEEDS_EXP_FILE=1
	    TCL_EXPORT_FILE_SUFFIX='${VERSION}\$\{DBGX\}.exp'

	    # AIX v<=4.1 has some different flags than 4.2+
	    if test "$system" = "AIX-4.1" -o "`uname -v`" -lt "4" ; then
		LIBOBJS="$LIBOBJS tclLoadAix.o"
		DL_LIBS="-lld"
	    fi

	    # On AIX <=v4 systems, libbsd.a has to be linked in to support
	    # non-blocking file IO.  This library has to be linked in after
	    # the MATH_LIBS or it breaks the pow() function.  The way to
	    # insure proper sequencing, is to add it to the tail of MATH_LIBS.
	    # This library also supplies gettimeofday.
	    #
	    # AIX does not have a timezone field in struct tm. When the AIX
	    # bsd library is used, the timezone global and the gettimeofday
	    # methods are to be avoided for timezone deduction instead, we
	    # deduce the timezone by comparing the localtime result on a
	    # known GMT value.

	    echo $ac_n "checking for gettimeofday in -lbsd""... $ac_c" 1>&6
echo "configure:4907: checking for gettimeofday in -lbsd" >&5
ac_lib_var=`echo bsd'_'gettimeofday | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lbsd  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 4915 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char gettimeofday();

int main() {
gettimeofday()
; return 0; }
EOF
if { (eval echo configure:4926: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  libbsd=yes
else
  echo "$ac_t""no" 1>&6
libbsd=no
fi

	    if test $libbsd = yes; then
	    	MATH_LIBS="$MATH_LIBS -lbsd"
	    	cat >> confdefs.h <<\EOF
#define USE_DELTA_FOR_TZ 1
EOF

	    fi

	    # Check to enable 64-bit flags for compiler/linker
	    if test "$do64bit" = "yes" ; then
		if test "$GCC" = "yes" ; then
		    echo "configure: warning: "64bit mode not supported with GCC on $system"" 1>&2
		else 
		    do64bit_ok=yes
		    EXTRA_CFLAGS="-q64"
		    LDFLAGS="-q64"
		fi
	    fi
	    ;;
	BSD/OS-2.1*|BSD/OS-3*)
	    SHLIB_CFLAGS=""
	    SHLIB_LD="shlicc -r"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS="-ldl"
	    LDFLAGS=""
	    LD_SEARCH_FLAGS=""
	    ;;
	BSD/OS-4.*)
	    SHLIB_CFLAGS="-export-dynamic -fPIC"
	    SHLIB_LD="cc -shared"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS="-ldl"
	    LDFLAGS="-export-dynamic"
	    LD_SEARCH_FLAGS=""
	    ;;
	dgux*)
	    SHLIB_CFLAGS="-K PIC"
	    SHLIB_LD="cc -G"
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS="-ldl"
	    LDFLAGS=""
	    LD_SEARCH_FLAGS=""
	    ;;
	HP-UX-*.11.*)
	    # Use updated header definitions where possible
	    cat >> confdefs.h <<\EOF
#define _XOPEN_SOURCE_EXTENDED 1
EOF


	    SHLIB_SUFFIX=".sl"
	    echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6
echo "configure:5005: checking for shl_load in -ldld" >&5
ac_lib_var=`echo dld'_'shl_load | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-ldld  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 5013 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char shl_load();

int main() {
shl_load()
; return 0; }
EOF
if { (eval echo configure:5024: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  tcl_ok=yes
else
  echo "$ac_t""no" 1>&6
tcl_ok=no
fi

	    if test "$tcl_ok" = yes; then
		SHLIB_CFLAGS="+z"
		SHLIB_LD="ld -b"
		SHLIB_LD_LIBS='${LIBS}'
		DL_OBJS="tclLoadShl.o"
		DL_LIBS="-ldld"
		LDFLAGS="-Wl,-E"
		LD_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.'
	    fi

	    # Check to enable 64-bit flags for compiler/linker
	    if test "$do64bit" = "yes" ; then
		if test "$GCC" = "yes" ; then
		    echo "configure: warning: "64bit mode not supported with GCC on $system"" 1>&2
		else 
		    do64bit_ok=yes
		    EXTRA_CFLAGS="+DA2.0W"
		    LDFLAGS="+DA2.0W $LDFLAGS"
		fi
	    fi
	    ;;
	HP-UX-*.08.*|HP-UX-*.09.*|HP-UX-*.10.*)
	    SHLIB_SUFFIX=".sl"
	    echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6
echo "configure:5069: checking for shl_load in -ldld" >&5
ac_lib_var=`echo dld'_'shl_load | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-ldld  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 5077 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char shl_load();

int main() {
shl_load()
; return 0; }
EOF
if { (eval echo configure:5088: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  tcl_ok=yes
else
  echo "$ac_t""no" 1>&6
tcl_ok=no
fi

	    if test "$tcl_ok" = yes; then
		SHLIB_CFLAGS="+z"
		SHLIB_LD="ld -b"
		SHLIB_LD_LIBS=""
		DL_OBJS="tclLoadShl.o"
		DL_LIBS="-ldld"
		LDFLAGS="-Wl,-E"
		LD_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.'
	    fi
	    ;;
	IRIX-4.*)
	    SHLIB_CFLAGS="-G 0"
	    SHLIB_SUFFIX=".a"
	    SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r -G 0"
	    SHLIB_LD_LIBS='${LIBS}'
	    DL_OBJS="tclLoadAout.o"
	    DL_LIBS=""
	    LDFLAGS="-Wl,-D,08000000"
	    LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
	    SHARED_LIB_SUFFIX='${VERSION}\$\{DBGX\}.a'
	    ;;
	IRIX-5.*)
	    SHLIB_CFLAGS=""
	    SHLIB_LD="ld -shared -rdata_shared"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS=""
	    LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
	    EXTRA_CFLAGS=""
	    LDFLAGS=""
	    ;;
	IRIX-6.*|IRIX64-6.5*)
	    SHLIB_CFLAGS=""
	    SHLIB_LD="ld -n32 -shared -rdata_shared"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS=""
	    LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
	    if test "$GCC" = "yes" ; then
		EXTRA_CFLAGS="-mabi=n32"
		LDFLAGS="-mabi=n32"
	    else
		case $system in
		    IRIX-6.3)
			# Use to build 6.2 compatible binaries on 6.3.
			EXTRA_CFLAGS="-n32 -D_OLD_TERMIOS"
			;;
		    *)
			EXTRA_CFLAGS="-n32"
			;;
		esac
		LDFLAGS="-n32"
	    fi
	    ;;
	IRIX64-6.*)
	    SHLIB_CFLAGS=""
	    SHLIB_LD="ld -n32 -shared -rdata_shared"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS=""
	    LDFLAGS=""
	    LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
	    ;;
	Linux*)
	    SHLIB_CFLAGS="-fPIC"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"

	    # egcs-2.91.66 on Redhat Linux 6.0 generates lots of warnings 
	    # when you inline the string and math operations.  Turn this off to
	    # get rid of the warnings.

	    CFLAGS_OPTIMIZE="${CFLAGS_OPTIMIZE} -D__NO_STRING_INLINES -D__NO_MATH_INLINES"

	    if test "$have_dl" = yes; then
		SHLIB_LD="${CC} -shared"
		DL_OBJS="tclLoadDl.o"
		DL_LIBS="-ldl"
		LDFLAGS="-rdynamic"
		LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
	    else
		ac_safe=`echo "dld.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for dld.h""... $ac_c" 1>&6
echo "configure:5195: checking for dld.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 5200 "configure"
#include "confdefs.h"
#include <dld.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:5205: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  
		    SHLIB_LD="ld -shared"
		    DL_OBJS="tclLoadDld.o"
		    DL_LIBS="-ldld"
		    LDFLAGS=""
		    LD_SEARCH_FLAGS=""
else
  echo "$ac_t""no" 1>&6
fi

	    fi
	    if test "`uname -m`" = "alpha" ; then
		EXTRA_CFLAGS="-mieee"
	    fi

            # The combo of gcc + glibc has a bug related
            # to inlining of functions like strtod(). The
            # -fno-builtin flag should address this problem
            # but it does not work. The -fno-inline flag
            # is kind of overkill but it works.
            # Disable inlining only when one of the
            # files in compat/*.c is being linked in.
            if test x"${LIBOBJS}" != x ; then
                EXTRA_CFLAGS="${EXTRA_CFLAGS} -fno-inline"
            fi

	    ;;
	GNU*)
	    SHLIB_CFLAGS="-fPIC"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"

	    if test "$have_dl" = yes; then
		SHLIB_LD="${CC} -shared"
		DL_OBJS=""
		DL_LIBS="-ldl"
		LDFLAGS="-rdynamic"
		LD_SEARCH_FLAGS=""
	    else
		ac_safe=`echo "dld.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for dld.h""... $ac_c" 1>&6
echo "configure:5262: checking for dld.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 5267 "configure"
#include "confdefs.h"
#include <dld.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:5272: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  
		    SHLIB_LD="ld -shared"
		    DL_OBJS=""
		    DL_LIBS="-ldld"
		    LDFLAGS=""
		    LD_SEARCH_FLAGS=""
else
  echo "$ac_t""no" 1>&6
fi

	    fi
	    if test "`uname -m`" = "alpha" ; then
		EXTRA_CFLAGS="-mieee"
	    fi
	    ;;
	MP-RAS-02*)
	    SHLIB_CFLAGS="-K PIC"
	    SHLIB_LD="cc -G"
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS="-ldl"
	    LDFLAGS=""
	    LD_SEARCH_FLAGS=""
	    ;;
	MP-RAS-*)
	    SHLIB_CFLAGS="-K PIC"
	    SHLIB_LD="cc -G"
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS="-ldl"
	    LDFLAGS="-Wl,-Bexport"
	    LD_SEARCH_FLAGS=""
	    ;;
	NetBSD-*|FreeBSD-[1-2].*|OpenBSD-*)
	    # Not available on all versions:  check for include file.
	    ac_safe=`echo "dlfcn.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for dlfcn.h""... $ac_c" 1>&6
echo "configure:5327: checking for dlfcn.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 5332 "configure"
#include "confdefs.h"
#include <dlfcn.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:5337: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  
		# NetBSD/SPARC needs -fPIC, -fpic will not do.
		SHLIB_CFLAGS="-fPIC"
		SHLIB_LD="ld -Bshareable -x"
		SHLIB_LD_LIBS=""
		SHLIB_SUFFIX=".so"
		DL_OBJS="tclLoadDl.o"
		DL_LIBS=""
		LDFLAGS=""
		LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
		echo $ac_n "checking for ELF""... $ac_c" 1>&6
echo "configure:5364: checking for ELF" >&5
		cat > conftest.$ac_ext <<EOF
#line 5366 "configure"
#include "confdefs.h"

#ifdef __ELF__
	yes
#endif
		
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "yes" >/dev/null 2>&1; then
  rm -rf conftest*
  echo "$ac_t""yes" 1>&6
		    SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so'
else
  rm -rf conftest*
  echo "$ac_t""no" 1>&6
		    SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so.1.0'
		
fi
rm -f conftest*

	    
else
  echo "$ac_t""no" 1>&6

		SHLIB_CFLAGS=""
		SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r"
		SHLIB_LD_LIBS='${LIBS}'
		SHLIB_SUFFIX=".a"
		DL_OBJS="tclLoadAout.o"
		DL_LIBS=""
		LDFLAGS=""
		LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
		SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.a'
	    
fi


	    # FreeBSD doesn't handle version numbers with dots.

	    UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.a'
	    TCL_LIB_VERSIONS_OK=nodots
	    ;;
	FreeBSD-*)
	    # FreeBSD 3.* and greater have ELF.
	    SHLIB_CFLAGS="-fPIC"
	    SHLIB_LD="ld -Bshareable -x"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS=""
	    LDFLAGS="-export-dynamic"
	    LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
	    if test "${TCL_THREADS}" = "1" ; then
		EXTRA_CFLAGS="-pthread"
	    	LDFLAGS="$LDFLAGS -pthread"
	    fi
	    case $system in
	    FreeBSD-3.*)
	    	# FreeBSD-3 doesn't handle version numbers with dots.
	    	UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.a'
	    	SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so'
	    	TCL_LIB_VERSIONS_OK=nodots
		;;
	    esac
	    ;;
	Rhapsody-*|Darwin-*)
	    SHLIB_CFLAGS="-fno-common"
	    SHLIB_LD="cc -dynamiclib \${LDFLAGS}"
	    TCL_SHLIB_LD_EXTRAS="-compatibility_version ${TCL_MAJOR_VERSION} -current_version \${VERSION} -install_name \${LIB_RUNTIME_DIR}/\${TCL_LIB_FILE} -prebind -seg1addr a000000"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".dylib"
	    DL_OBJS="tclLoadDyld.o"
	    DL_LIBS=""
	    LDFLAGS="-prebind"
	    LD_SEARCH_FLAGS=""
	    CFLAGS_OPTIMIZE="-O3"
	    EXTRA_CFLAGS="-arch ppc -pipe"
	    ;;
	NEXTSTEP-*)
	    SHLIB_CFLAGS=""
	    SHLIB_LD="cc -nostdlib -r"
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadNext.o"
	    DL_LIBS=""
	    LDFLAGS=""
	    LD_SEARCH_FLAGS=""
	    ;;
	OS/390-*)
	    CFLAGS_OPTIMIZE=""      # Optimizer is buggy
	    cat >> confdefs.h <<\EOF
#define _OE_SOCKETS 1
EOF
  # needed in sys/socket.h
	    ;;      
	OSF1-1.0|OSF1-1.1|OSF1-1.2)
	    # OSF/1 1.[012] from OSF, and derivatives, including Paragon OSF/1
	    SHLIB_CFLAGS=""
	    # Hack: make package name same as library name
	    SHLIB_LD='ld -R -export :'
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadOSF.o"
	    DL_LIBS=""
	    LDFLAGS=""
	    LD_SEARCH_FLAGS=""
	    ;;
	OSF1-1.*)
	    # OSF/1 1.3 from OSF using ELF, and derivatives, including AD2
	    SHLIB_CFLAGS="-fPIC"
	    SHLIB_LD="ld -shared"
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS=""
	    LDFLAGS=""
	    LD_SEARCH_FLAGS=""
	    ;;
	OSF1-V*)
	    # Digital OSF/1
	    SHLIB_CFLAGS=""
	    SHLIB_LD='ld -shared -expect_unresolved "*"'
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS=""
	    LDFLAGS=""
	    LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
	    if test "$GCC" != "yes" ; then
		EXTRA_CFLAGS="-DHAVE_TZSET -std1"
	    fi
	    # see pthread_intro(3) for pthread support on osf1, k.furukawa
	    if test "${TCL_THREADS}" = "1" ; then
		EXTRA_CFLAGS="${EXTRA_CFLAGS} -DHAVE_PTHREAD_ATTR_SETSTACKSIZE"
		EXTRA_CFLAGS="${EXTRA_CFLAGS} -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64"
		LIBS=`echo $LIBS | sed s/-lpthreads//`
		if test "$GCC" = "yes" ; then
		    LIBS="$LIBS -lpthread -lmach -lexc"
		else
		    EXTRA_CFLAGS="${EXTRA_CFLAGS} -pthread"
		    LDFLAGS="-pthread"
		fi
	    fi

	    ;;
	QNX-6*)
	    # QNX RTP
	    # This may work for all QNX, but it was only reported for v6.
	    SHLIB_CFLAGS="-fPIC"
	    SHLIB_LD="ld -Bshareable -x"
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    # dlopen is in -lc on QNX
	    DL_LIBS=""
	    LDFLAGS=""
	    LD_SEARCH_FLAGS=""
	    ;;
	RISCos-*)
	    SHLIB_CFLAGS="-G 0"
	    SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r -G 0"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".a"
	    DL_OBJS="tclLoadAout.o"
	    DL_LIBS=""
	    LDFLAGS="-Wl,-D,08000000"
	    LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
	    ;;
	SCO_SV-3.2*)
	    # Note, dlopen is available only on SCO 3.2.5 and greater. However,
	    # this test works, since "uname -s" was non-standard in 3.2.4 and
	    # below.
	    if test "$GCC" = "yes" ; then
	    	SHLIB_CFLAGS="-fPIC -melf"
	    	LDFLAGS="-melf -Wl,-Bexport"
	    else
	    	SHLIB_CFLAGS="-Kpic -belf"
	    	LDFLAGS="-belf -Wl,-Bexport"
	    fi
	    SHLIB_LD="ld -G"
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS=""
	    LD_SEARCH_FLAGS=""
	    ;;
	SINIX*5.4*)
	    SHLIB_CFLAGS="-K PIC"
	    SHLIB_LD="cc -G"
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS="-ldl"
	    LDFLAGS=""
	    LD_SEARCH_FLAGS=""
	    ;;
	SunOS-4*)
	    SHLIB_CFLAGS="-PIC"
	    SHLIB_LD="ld"
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS="-ldl"
	    LDFLAGS=""
	    LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'

	    # SunOS can't handle version numbers with dots in them in library
	    # specs, like -ltcl7.5, so use -ltcl75 instead.  Also, it
	    # requires an extra version number at the end of .so file names.
	    # So, the library has to have a name like libtcl75.so.1.0

	    SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so.1.0'
	    UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.a'
	    TCL_LIB_VERSIONS_OK=nodots
	    ;;
	SunOS-5.[0-6]*)

	    # Note: If _REENTRANT isn't defined, then Solaris
	    # won't define thread-safe library routines.

	    cat >> confdefs.h <<\EOF
#define _REENTRANT 1
EOF

	    cat >> confdefs.h <<\EOF
#define _POSIX_PTHREAD_SEMANTICS 1
EOF


	    SHLIB_CFLAGS="-KPIC"
	    SHLIB_LD="/usr/ccs/bin/ld -G -z text"

	    # Note: need the LIBS below, otherwise Tk won't find Tcl's
	    # symbols when dynamically loaded into tclsh.

	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS="-ldl"
	    LDFLAGS=""
	    if test "$GCC" = "yes" ; then
		LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
	    else
		LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}'
	    fi
	    ;;
	SunOS-5*)

	    # Note: If _REENTRANT isn't defined, then Solaris
	    # won't define thread-safe library routines.

	    cat >> confdefs.h <<\EOF
#define _REENTRANT 1
EOF

	    cat >> confdefs.h <<\EOF
#define _POSIX_PTHREAD_SEMANTICS 1
EOF


	    SHLIB_CFLAGS="-KPIC"
	    SHLIB_LD="/usr/ccs/bin/ld -G -z text"
	    LDFLAGS=""
    
	    # Check to enable 64-bit flags for compiler/linker
	    if test "$do64bit" = "yes" ; then
		arch=`isainfo`
		if test "$arch" = "sparcv9 sparc" ; then
			if test "$GCC" = "yes" ; then
			    echo "configure: warning: "64bit mode not supported with GCC on $system"" 1>&2
			else
			    do64bit_ok=yes
			    if test "$do64bitVIS" = "yes" ; then
				EXTRA_CFLAGS="-xarch=v9a"
			    	LDFLAGS="-xarch=v9a"
			    else
				EXTRA_CFLAGS="-xarch=v9"
			    	LDFLAGS="-xarch=v9"
			    fi
			fi
		else
		    echo "configure: warning: "64bit mode only supported sparcv9 system"" 1>&2
		fi
	    fi
	    
	    # Note: need the LIBS below, otherwise Tk won't find Tcl's
	    # symbols when dynamically loaded into tclsh.

	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS="-ldl"
	    if test "$GCC" = "yes" ; then
		LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
	    else
		LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}'
	    fi
	    ;;
	ULTRIX-4.*)
	    SHLIB_CFLAGS="-G 0"
	    SHLIB_SUFFIX=".a"
	    SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r -G 0"
	    SHLIB_LD_LIBS='${LIBS}'
	    DL_OBJS="tclLoadAout.o"
	    DL_LIBS=""
	    LDFLAGS="-Wl,-D,08000000"
	    LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
	    if test "$GCC" != "yes" ; then
		EXTRA_CFLAGS="-DHAVE_TZSET -std1"
	    fi
	    ;;
	UNIX_SV* | UnixWare-5*)
	    SHLIB_CFLAGS="-KPIC"
	    SHLIB_LD="cc -G"
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS="-ldl"
	    # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers
	    # that don't grok the -Bexport option.  Test that it does.
	    hold_ldflags=$LDFLAGS
	    echo $ac_n "checking for ld accepts -Bexport flag""... $ac_c" 1>&6
echo "configure:5689: checking for ld accepts -Bexport flag" >&5
	    LDFLAGS="${LDFLAGS} -Wl,-Bexport"
	    cat > conftest.$ac_ext <<EOF
#line 5692 "configure"
#include "confdefs.h"

int main() {
int i;
; return 0; }
EOF
if { (eval echo configure:5699: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  found=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  found=no
fi
rm -f conftest*
	    LDFLAGS=$hold_ldflags
	    echo "$ac_t""$found" 1>&6
	    if test $found = yes; then
	    LDFLAGS="-Wl,-Bexport"
	    else
	    LDFLAGS=""
	    fi
	    LD_SEARCH_FLAGS=""
	    ;;
    esac

    if test "$do64bit" = "yes" -a "$do64bit_ok" = "no" ; then
    echo "configure: warning: "64bit support being disabled -- don\'t know magic for this platform"" 1>&2
    fi

    # Step 4: If pseudo-static linking is in use (see K. B. Kenny, "Dynamic
    # Loading for Tcl -- What Became of It?".  Proc. 2nd Tcl/Tk Workshop,
    # New Orleans, LA, Computerized Processes Unlimited, 1994), then we need
    # to determine which of several header files defines the a.out file
    # format (a.out.h, sys/exec.h, or sys/exec_aout.h).  At present, we
    # support only a file format that is more or less version-7-compatible. 
    # In particular,
    #	- a.out files must begin with `struct exec'.
    #	- the N_TXTOFF on the `struct exec' must compute the seek address
    #	  of the text segment
    #	- The `struct exec' must contain a_magic, a_text, a_data, a_bss
    #	  and a_entry fields.
    # The following compilation should succeed if and only if either sys/exec.h
    # or a.out.h is usable for the purpose.
    #
    # Note that the modified COFF format used on MIPS Ultrix 4.x is usable; the
    # `struct exec' includes a second header that contains information that
    # duplicates the v7 fields that are needed.

    if test "x$DL_OBJS" = "xtclLoadAout.o" ; then
	echo $ac_n "checking sys/exec.h""... $ac_c" 1>&6
echo "configure:5745: checking sys/exec.h" >&5
	cat > conftest.$ac_ext <<EOF
#line 5747 "configure"
#include "confdefs.h"
#include <sys/exec.h>
int main() {

	    struct exec foo;
	    unsigned long seek;
	    int flag;
#if defined(__mips) || defined(mips)
	    seek = N_TXTOFF (foo.ex_f, foo.ex_o);
#else
	    seek = N_TXTOFF (foo);
#endif
	    flag = (foo.a_magic == OMAGIC);
	    return foo.a_text + foo.a_data + foo.a_bss + foo.a_entry;
    
; return 0; }
EOF
if { (eval echo configure:5765: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  tcl_ok=usable
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  tcl_ok=unusable
fi
rm -f conftest*
	echo "$ac_t""$tcl_ok" 1>&6
	if test $tcl_ok = usable; then
	    cat >> confdefs.h <<\EOF
#define USE_SYS_EXEC_H 1
EOF

	else
	    echo $ac_n "checking a.out.h""... $ac_c" 1>&6
echo "configure:5783: checking a.out.h" >&5
	    cat > conftest.$ac_ext <<EOF
#line 5785 "configure"
#include "confdefs.h"
#include <a.out.h>
int main() {

		struct exec foo;
		unsigned long seek;
		int flag;
#if defined(__mips) || defined(mips)
		seek = N_TXTOFF (foo.ex_f, foo.ex_o);
#else
		seek = N_TXTOFF (foo);
#endif
		flag = (foo.a_magic == OMAGIC);
		return foo.a_text + foo.a_data + foo.a_bss + foo.a_entry;
	    
; return 0; }
EOF
if { (eval echo configure:5803: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  tcl_ok=usable
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  tcl_ok=unusable
fi
rm -f conftest*
	    echo "$ac_t""$tcl_ok" 1>&6
	    if test $tcl_ok = usable; then
		cat >> confdefs.h <<\EOF
#define USE_A_OUT_H 1
EOF

	    else
		echo $ac_n "checking sys/exec_aout.h""... $ac_c" 1>&6
echo "configure:5821: checking sys/exec_aout.h" >&5
		cat > conftest.$ac_ext <<EOF
#line 5823 "configure"
#include "confdefs.h"
#include <sys/exec_aout.h>
int main() {

		    struct exec foo;
		    unsigned long seek;
		    int flag;
#if defined(__mips) || defined(mips)
		    seek = N_TXTOFF (foo.ex_f, foo.ex_o);
#else
		    seek = N_TXTOFF (foo);
#endif
		    flag = (foo.a_midmag == OMAGIC);
		    return foo.a_text + foo.a_data + foo.a_bss + foo.a_entry;
		
; return 0; }
EOF
if { (eval echo configure:5841: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  tcl_ok=usable
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  tcl_ok=unusable
fi
rm -f conftest*
		echo "$ac_t""$tcl_ok" 1>&6
		if test $tcl_ok = usable; then
		    cat >> confdefs.h <<\EOF
#define USE_SYS_EXEC_AOUT_H 1
EOF

		else
		    DL_OBJS=""
		fi
	    fi
	fi
    fi

    # Step 5: disable dynamic loading if requested via a command-line switch.

    # Check whether --enable-load or --disable-load was given.
if test "${enable_load+set}" = set; then
  enableval="$enable_load"
  tcl_ok=$enableval
else
  tcl_ok=yes
fi

    if test "$tcl_ok" = "no"; then
	DL_OBJS=""
    fi

    if test "x$DL_OBJS" != "x" ; then
	BUILD_DLTEST="\$(DLTEST_TARGETS)"
    else
	echo "Can't figure out how to do dynamic loading or shared libraries"
	echo "on this system."
	SHLIB_CFLAGS=""
	SHLIB_LD=""
	SHLIB_SUFFIX=""
	DL_OBJS="tclLoadNone.o"
	DL_LIBS=""
	LDFLAGS=""
	LD_SEARCH_FLAGS=""
	BUILD_DLTEST=""
    fi

    # If we're running gcc, then change the C flags for compiling shared
    # libraries to the right flags for gcc, instead of those for the
    # standard manufacturer compiler.

    if test "$DL_OBJS" != "tclLoadNone.o" ; then
	if test "$GCC" = "yes" ; then
	    case $system in
		AIX-*)
		    ;;
		BSD/OS*)
		    ;;
		IRIX*)
		    ;;
		NetBSD-*|FreeBSD-*|OpenBSD-*)
		    ;;
		Rhapsody-*|Darwin-*)
		    ;;
		RISCos-*)
		    ;;
		SCO_SV-3.2*)
		    ;;
		ULTRIX-4.*)
		    ;;
		*)
		    SHLIB_CFLAGS="-fPIC"
		    ;;
	    esac
	fi
    fi

    if test "$SHARED_LIB_SUFFIX" = "" ; then
	SHARED_LIB_SUFFIX='${VERSION}\$\{DBGX\}${SHLIB_SUFFIX}'
    fi
    if test "$UNSHARED_LIB_SUFFIX" = "" ; then
	UNSHARED_LIB_SUFFIX='${VERSION}\$\{DBGX\}.a'
    fi

    
    
    
    



    echo $ac_n "checking for build with symbols""... $ac_c" 1>&6
echo "configure:5938: checking for build with symbols" >&5
    # Check whether --enable-symbols or --disable-symbols was given.
if test "${enable_symbols+set}" = set; then
  enableval="$enable_symbols"
  tcl_ok=$enableval
else
  tcl_ok=no
fi

# FIXME: Currently, LDFLAGS_DEFAULT is not used, it should work like CFLAGS_DEFAULT.
    if test "$tcl_ok" = "yes"; then
	CFLAGS_DEFAULT='$(CFLAGS_DEBUG)'
	LDFLAGS_DEFAULT='$(LDFLAGS_DEBUG)'
	DBGX=g
	echo "$ac_t""yes" 1>&6
    else
	CFLAGS_DEFAULT='$(CFLAGS_OPTIMIZE)'
	LDFLAGS_DEFAULT='$(LDFLAGS_OPTIMIZE)'
	DBGX=""
	echo "$ac_t""no" 1>&6
    fi


TCL_DBGX=${DBGX}

#--------------------------------------------------------------------
#	The statements below check for systems where POSIX-style
#	non-blocking I/O (O_NONBLOCK) doesn't work or is unimplemented. 
#	On these systems (mostly older ones), use the old BSD-style
#	FIONBIO approach instead.
#--------------------------------------------------------------------


    for ac_hdr in sys/ioctl.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
echo "configure:5975: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 5980 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:5985: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
  cat >> confdefs.h <<EOF
#define $ac_tr_hdr 1
EOF
 
else
  echo "$ac_t""no" 1>&6
fi
done

    for ac_hdr in sys/filio.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
echo "configure:6015: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 6020 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:6025: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
  cat >> confdefs.h <<EOF
#define $ac_tr_hdr 1
EOF
 
else
  echo "$ac_t""no" 1>&6
fi
done

    echo $ac_n "checking FIONBIO vs. O_NONBLOCK for nonblocking I/O""... $ac_c" 1>&6
echo "configure:6052: checking FIONBIO vs. O_NONBLOCK for nonblocking I/O" >&5
    if test -f /usr/lib/NextStep/software_version; then
	system=NEXTSTEP-`awk '/3/,/3/' /usr/lib/NextStep/software_version`
    else
	system=`uname -s`-`uname -r`
	if test "$?" -ne 0 ; then
	    system=unknown
	else
	    # Special check for weird MP-RAS system (uname returns weird
	    # results, and the version is kept in special file).
	
	    if test -r /etc/.relid -a "X`uname -n`" = "X`uname -s`" ; then
		system=MP-RAS-`awk '{print }' /etc/.relid'`
	    fi
	    if test "`uname -s`" = "AIX" ; then
		system=AIX-`uname -v`.`uname -r`
	    fi
	fi
    fi
    case $system in
	# There used to be code here to use FIONBIO under AIX.  However, it
	# was reported that FIONBIO doesn't work under AIX 3.2.5.  Since
	# using O_NONBLOCK seems fine under AIX 4.*, I removed the FIONBIO
	# code (JO, 5/31/97).

	OSF*)
	    cat >> confdefs.h <<\EOF
#define USE_FIONBIO 1
EOF

	    echo "$ac_t""FIONBIO" 1>&6
	    ;;
	SunOS-4*)
	    cat >> confdefs.h <<\EOF
#define USE_FIONBIO 1
EOF

	    echo "$ac_t""FIONBIO" 1>&6
	    ;;
	ULTRIX-4.*)
	    cat >> confdefs.h <<\EOF
#define USE_FIONBIO 1
EOF

	    echo "$ac_t""FIONBIO" 1>&6
	    ;;
	*)
	    echo "$ac_t""O_NONBLOCK" 1>&6
	    ;;
    esac


#--------------------------------------------------------------------
#	The statements below define a collection of symbols related to
#	building libtcl as a shared library instead of a static library.
#--------------------------------------------------------------------

TCL_UNSHARED_LIB_SUFFIX=${UNSHARED_LIB_SUFFIX}
TCL_SHARED_LIB_SUFFIX=${SHARED_LIB_SUFFIX}


    echo $ac_n "checking how to build libraries""... $ac_c" 1>&6
echo "configure:6114: checking how to build libraries" >&5
    # Check whether --enable-shared or --disable-shared was given.
if test "${enable_shared+set}" = set; then
  enableval="$enable_shared"
  tcl_ok=$enableval
else
  tcl_ok=yes
fi


    if test "${enable_shared+set}" = set; then
	enableval="$enable_shared"
	tcl_ok=$enableval
    else
	tcl_ok=yes
    fi

    if test "$tcl_ok" = "yes" ; then
	echo "$ac_t""shared" 1>&6
	SHARED_BUILD=1
    else
	echo "$ac_t""static" 1>&6
	SHARED_BUILD=0
	cat >> confdefs.h <<\EOF
#define STATIC_BUILD 1
EOF

    fi


TCL_LD_SEARCH_FLAGS="${LD_SEARCH_FLAGS}"
if test "${SHARED_BUILD}" = "1" -a "${SHLIB_SUFFIX}" != "" ; then
    TCL_SHLIB_CFLAGS="${SHLIB_CFLAGS}"
    eval "TCL_LIB_FILE=libtcl${TCL_SHARED_LIB_SUFFIX}"
    if test "x$DL_OBJS" = "xtclLoadAout.o"; then
	MAKE_LIB="\${STLIB_LD} \$@ \${OBJS}"
    else
	MAKE_LIB="\${SHLIB_LD} ${TCL_SHLIB_LD_EXTRAS} -o \$@ \${OBJS} ${SHLIB_LD_LIBS}"
    fi
else
    case $system in
        BSD/OS*)
	    ;;

	AIX-[1-4].*)
            ;;

        *)
	    SHLIB_LD_LIBS=""
	    ;;
    esac
    TCL_SHLIB_CFLAGS=""
    eval "TCL_LIB_FILE=libtcl${TCL_UNSHARED_LIB_SUFFIX}"
    MAKE_LIB="\${STLIB_LD} \$@ \${OBJS}"
fi

# tclConfig.sh needs a version of the _LIB_SUFFIX that has been eval'ed
# so that the backslashes quoting the DBX braces are dropped.

# Trick to replace DBGX with TCL_DBGX
DBGX='${TCL_DBGX}'
eval "TCL_LIB_FILE=${TCL_LIB_FILE}"

# Note:  in the following variable, it's important to use the absolute
# path name of the Tcl directory rather than "..":  this is because
# AIX remembers this path and will attempt to use it at run-time to look
# up the Tcl library.

if test "$SHARED_BUILD" = "0" -o $TCL_NEEDS_EXP_FILE = 0; then
    if test "${TCL_LIB_VERSIONS_OK}" = "ok"; then
        TCL_LIB_FLAG="-ltcl${TCL_VERSION}\${TCL_DBGX}"
    else
        TCL_LIB_FLAG="-ltcl`echo ${TCL_VERSION} | tr -d .`\${TCL_DBGX}"
    fi
    TCL_BUILD_LIB_SPEC="-L`pwd` ${TCL_LIB_FLAG}"
    TCL_LIB_SPEC="-L${libdir} ${TCL_LIB_FLAG}"
else
    TCL_BUILD_EXP_FILE="lib.exp"
    eval "TCL_EXP_FILE=libtcl${TCL_EXPORT_FILE_SUFFIX}"

    # Replace DBGX with TCL_DBGX
    eval "TCL_EXP_FILE=\"${TCL_EXP_FILE}\""
    
    if test "$GCC" = "yes" ; then
	TCL_BUILD_LIB_SPEC="-Wl,-bI:`pwd`/${TCL_BUILD_EXP_FILE} -L`pwd`"
	TCL_LIB_SPEC="-Wl,-bI:${libdir}/${TCL_EXP_FILE} -L`pwd`"
    else
	TCL_BUILD_LIB_SPEC="-bI:`pwd`/${TCL_BUILD_EXP_FILE}"
	TCL_LIB_SPEC="-bI:${libdir}/${TCL_EXP_FILE}"
    fi
fi
VERSION='${VERSION}'
eval "CFG_TCL_SHARED_LIB_SUFFIX=${TCL_SHARED_LIB_SUFFIX}"
eval "CFG_TCL_UNSHARED_LIB_SUFFIX=${TCL_UNSHARED_LIB_SUFFIX}"
eval "CFG_TCL_EXPORT_FILE_SUFFIX=${TCL_EXPORT_FILE_SUFFIX}"
VERSION=${TCL_VERSION}

#--------------------------------------------------------------------
#	The statements below define the symbol TCL_PACKAGE_PATH, which
#	gives a list of directories that may contain packages.  The list
#	consists of one directory for machine-dependent binaries and
#	another for platform-independent scripts.
#--------------------------------------------------------------------

if test "$prefix" != "$exec_prefix"; then
    TCL_PACKAGE_PATH="${libdir} ${prefix}/lib"
else
    TCL_PACKAGE_PATH="${prefix}/lib"
fi

#--------------------------------------------------------------------
#       The statements below define various symbols relating to Tcl
#       stub support.
#--------------------------------------------------------------------

# Replace ${VERSION} with contents of ${TCL_VERSION}
eval "TCL_STUB_LIB_FILE=libtclstub${TCL_UNSHARED_LIB_SUFFIX}"
# Replace DBGX with TCL_DBGX
eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\""

MAKE_STUB_LIB="\${STLIB_LD} \$@ \${STUB_LIB_OBJS}"

if test "${TCL_LIB_VERSIONS_OK}" = "ok"; then
    TCL_STUB_LIB_FLAG="-ltclstub${TCL_VERSION}\${TCL_DBGX}"
else
    TCL_STUB_LIB_FLAG="-ltclstub`echo ${TCL_VERSION} | tr -d .`\${TCL_DBGX}"
fi

TCL_BUILD_STUB_LIB_SPEC="-L`pwd` ${TCL_STUB_LIB_FLAG}"
TCL_STUB_LIB_SPEC="-L${libdir} ${TCL_STUB_LIB_FLAG}"
TCL_BUILD_STUB_LIB_PATH="`pwd`/${TCL_STUB_LIB_FILE}"
TCL_STUB_LIB_PATH="${libdir}/${TCL_STUB_LIB_FILE}"

#------------------------------------------------------------------------
# tclConfig.sh refers to this by a different name
#------------------------------------------------------------------------

TCL_SHARED_BUILD=${SHARED_BUILD}


























































trap '' 1 2 15
cat > confcache <<\EOF
# This file is a shell script that caches the results of configure
# tests run on this system so they can be shared between configure
# scripts and configure runs.  It is not useful on other systems.
# If it contains results you don't want to keep, you may remove or edit it.
#
# By default, configure uses ./config.cache as the cache file,
# creating it if it does not exist already.  You can give configure
# the --cache-file=FILE option to use a different cache file; that is
# what configure does when it calls configure scripts in
# subdirectories, so they share the cache.
# Giving --cache-file=/dev/null disables caching, for debugging configure.
# config.status only pays attention to the cache file if you give it the
# --recheck option to rerun configure.
#
EOF
# The following way of writing the cache mishandles newlines in values,
# but we know of no workaround that is simple, portable, and efficient.
# So, don't put newlines in cache variables' values.
# Ultrix sh set writes to stderr and can't be redirected directly,
# and sets the high bit in the cache file unless we assign to the vars.
(set) 2>&1 |
  case `(ac_space=' '; set | grep ac_space) 2>&1` in
  *ac_space=\ *)
    # `set' does not quote correctly, so add quotes (double-quote substitution
    # turns \\\\ into \\, and sed turns \\ into \).
    sed -n \
      -e "s/'/'\\\\''/g" \
      -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
    ;;
  *)
    # `set' quotes correctly as required by POSIX, so do not add quotes.
    sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
    ;;
  esac >> confcache
if cmp -s $cache_file confcache; then
  :
else
  if test -w $cache_file; then
    echo "updating cache $cache_file"
    cat confcache > $cache_file
  else
    echo "not updating unwritable cache $cache_file"
  fi
fi
rm -f confcache

trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15

test "x$prefix" = xNONE && prefix=$ac_default_prefix
# Let make expand exec_prefix.
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'

# Any assignment to VPATH causes Sun make to only execute
# the first set of double-colon rules, so remove it if not needed.
# If there is a colon in the path, we need to keep it.
if test "x$srcdir" = x.; then
  ac_vpsub='/^[ 	]*VPATH[ 	]*=[^:]*$/d'
fi

trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15

# Transform confdefs.h into DEFS.
# Protect against shell expansion while executing Makefile rules.
# Protect against Makefile macro expansion.
cat > conftest.defs <<\EOF
s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
s%[ 	`~#$^&*(){}\\|;'"<>?]%\\&%g
s%\[%\\&%g
s%\]%\\&%g
s%\$%$$%g
EOF
DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
rm -f conftest.defs


# Without the "./", some shells look in PATH for config.status.
: ${CONFIG_STATUS=./config.status}

echo creating $CONFIG_STATUS
rm -f $CONFIG_STATUS
cat > $CONFIG_STATUS <<EOF
#! /bin/sh
# Generated automatically by configure.
# Run this file to recreate the current configuration.
# This directory was configured as follows,
# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
#
# $0 $ac_configure_args
#
# Compiler output produced by configure, useful for debugging
# configure, is in ./config.log if it exists.

ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
for ac_option
do
  case "\$ac_option" in
  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
    echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
    exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
  -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
    echo "$CONFIG_STATUS generated by autoconf version 2.13"
    exit 0 ;;
  -help | --help | --hel | --he | --h)
    echo "\$ac_cs_usage"; exit 0 ;;
  *) echo "\$ac_cs_usage"; exit 1 ;;
  esac
done

ac_given_srcdir=$srcdir

trap 'rm -fr `echo "Makefile tclConfig.sh" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
EOF
cat >> $CONFIG_STATUS <<EOF

# Protect against being on the right side of a sed subst in config.status.
sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
 s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
$ac_vpsub
$extrasub
s%@SHELL@%$SHELL%g
s%@CFLAGS@%$CFLAGS%g
s%@CPPFLAGS@%$CPPFLAGS%g
s%@CXXFLAGS@%$CXXFLAGS%g
s%@FFLAGS@%$FFLAGS%g
s%@DEFS@%$DEFS%g
s%@LDFLAGS@%$LDFLAGS%g
s%@LIBS@%$LIBS%g
s%@exec_prefix@%$exec_prefix%g
s%@prefix@%$prefix%g
s%@program_transform_name@%$program_transform_name%g
s%@bindir@%$bindir%g
s%@sbindir@%$sbindir%g
s%@libexecdir@%$libexecdir%g
s%@datadir@%$datadir%g
s%@sysconfdir@%$sysconfdir%g
s%@sharedstatedir@%$sharedstatedir%g
s%@localstatedir@%$localstatedir%g
s%@libdir@%$libdir%g
s%@includedir@%$includedir%g
s%@oldincludedir@%$oldincludedir%g
s%@infodir@%$infodir%g
s%@mandir@%$mandir%g
s%@RANLIB@%$RANLIB%g
s%@CC@%$CC%g
s%@CPP@%$CPP%g
s%@TCL_THREADS@%$TCL_THREADS%g
s%@LIBOBJS@%$LIBOBJS%g
s%@TCL_LIBS@%$TCL_LIBS%g
s%@MATH_LIBS@%$MATH_LIBS%g
s%@AR@%$AR%g
s%@DL_LIBS@%$DL_LIBS%g
s%@CFLAGS_DEBUG@%$CFLAGS_DEBUG%g
s%@CFLAGS_OPTIMIZE@%$CFLAGS_OPTIMIZE%g
s%@CFLAGS_WARNING@%$CFLAGS_WARNING%g
s%@TCL_VERSION@%$TCL_VERSION%g
s%@TCL_MAJOR_VERSION@%$TCL_MAJOR_VERSION%g
s%@TCL_MINOR_VERSION@%$TCL_MINOR_VERSION%g
s%@TCL_PATCH_LEVEL@%$TCL_PATCH_LEVEL%g
s%@TCL_LIB_FILE@%$TCL_LIB_FILE%g
s%@TCL_LIB_FLAG@%$TCL_LIB_FLAG%g
s%@TCL_LIB_SPEC@%$TCL_LIB_SPEC%g
s%@TCL_STUB_LIB_FILE@%$TCL_STUB_LIB_FILE%g
s%@TCL_STUB_LIB_FLAG@%$TCL_STUB_LIB_FLAG%g
s%@TCL_STUB_LIB_SPEC@%$TCL_STUB_LIB_SPEC%g
s%@TCL_STUB_LIB_PATH@%$TCL_STUB_LIB_PATH%g
s%@TCL_BUILD_STUB_LIB_SPEC@%$TCL_BUILD_STUB_LIB_SPEC%g
s%@TCL_BUILD_STUB_LIB_PATH@%$TCL_BUILD_STUB_LIB_PATH%g
s%@TCL_SRC_DIR@%$TCL_SRC_DIR%g
s%@TCL_BIN_DIR@%$TCL_BIN_DIR%g
s%@TCL_DBGX@%$TCL_DBGX%g
s%@CFG_TCL_SHARED_LIB_SUFFIX@%$CFG_TCL_SHARED_LIB_SUFFIX%g
s%@CFG_TCL_UNSHARED_LIB_SUFFIX@%$CFG_TCL_UNSHARED_LIB_SUFFIX%g
s%@CFG_TCL_EXPORT_FILE_SUFFIX@%$CFG_TCL_EXPORT_FILE_SUFFIX%g
s%@CFLAGS_DEFAULT@%$CFLAGS_DEFAULT%g
s%@EXTRA_CFLAGS@%$EXTRA_CFLAGS%g
s%@DL_OBJS@%$DL_OBJS%g
s%@LDFLAGS_DEFAULT@%$LDFLAGS_DEFAULT%g
s%@LDFLAGS_DEBUG@%$LDFLAGS_DEBUG%g
s%@LDFLAGS_OPTIMIZE@%$LDFLAGS_OPTIMIZE%g
s%@STLIB_LD@%$STLIB_LD%g
s%@SHLIB_LD@%$SHLIB_LD%g
s%@SHLIB_LD_LIBS@%$SHLIB_LD_LIBS%g
s%@SHLIB_CFLAGS@%$SHLIB_CFLAGS%g
s%@SHLIB_SUFFIX@%$SHLIB_SUFFIX%g
s%@TCL_SHARED_BUILD@%$TCL_SHARED_BUILD%g
s%@TCL_BUILD_LIB_SPEC@%$TCL_BUILD_LIB_SPEC%g
s%@TCL_LD_SEARCH_FLAGS@%$TCL_LD_SEARCH_FLAGS%g
s%@TCL_NEEDS_EXP_FILE@%$TCL_NEEDS_EXP_FILE%g
s%@TCL_BUILD_EXP_FILE@%$TCL_BUILD_EXP_FILE%g
s%@TCL_EXP_FILE@%$TCL_EXP_FILE%g
s%@TCL_LIB_VERSIONS_OK@%$TCL_LIB_VERSIONS_OK%g
s%@TCL_SHARED_LIB_SUFFIX@%$TCL_SHARED_LIB_SUFFIX%g
s%@TCL_SHLIB_CFLAGS@%$TCL_SHLIB_CFLAGS%g
s%@TCL_UNSHARED_LIB_SUFFIX@%$TCL_UNSHARED_LIB_SUFFIX%g
s%@MAKE_LIB@%$MAKE_LIB%g
s%@MAKE_STUB_LIB@%$MAKE_STUB_LIB%g
s%@BUILD_DLTEST@%$BUILD_DLTEST%g
s%@TCL_PACKAGE_PATH@%$TCL_PACKAGE_PATH%g

CEOF
EOF

cat >> $CONFIG_STATUS <<\EOF

# Split the substitutions into bite-sized pieces for seds with
# small command number limits, like on Digital OSF/1 and HP-UX.
ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
ac_file=1 # Number of current file.
ac_beg=1 # First line for current file.
ac_end=$ac_max_sed_cmds # Line after last line for current file.
ac_more_lines=:
ac_sed_cmds=""
while $ac_more_lines; do
  if test $ac_beg -gt 1; then
    sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
  else
    sed "${ac_end}q" conftest.subs > conftest.s$ac_file
  fi
  if test ! -s conftest.s$ac_file; then
    ac_more_lines=false
    rm -f conftest.s$ac_file
  else
    if test -z "$ac_sed_cmds"; then
      ac_sed_cmds="sed -f conftest.s$ac_file"
    else
      ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
    fi
    ac_file=`expr $ac_file + 1`
    ac_beg=$ac_end
    ac_end=`expr $ac_end + $ac_max_sed_cmds`
  fi
done
if test -z "$ac_sed_cmds"; then
  ac_sed_cmds=cat
fi
EOF

cat >> $CONFIG_STATUS <<EOF

CONFIG_FILES=\${CONFIG_FILES-"Makefile tclConfig.sh"}
EOF
cat >> $CONFIG_STATUS <<\EOF
for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
  case "$ac_file" in
  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
  *) ac_file_in="${ac_file}.in" ;;
  esac

  # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.

  # Remove last slash and all that follows it.  Not all systems have dirname.
  ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
    # The file is in a subdirectory.
    test ! -d "$ac_dir" && mkdir "$ac_dir"
    ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
    # A "../" for each directory in $ac_dir_suffix.
    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
  else
    ac_dir_suffix= ac_dots=
  fi

  case "$ac_given_srcdir" in
  .)  srcdir=.
      if test -z "$ac_dots"; then top_srcdir=.
      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
  /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
  *) # Relative path.
    srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
    top_srcdir="$ac_dots$ac_given_srcdir" ;;
  esac


  echo creating "$ac_file"
  rm -f "$ac_file"
  configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
  case "$ac_file" in
  *Makefile*) ac_comsub="1i\\
# $configure_input" ;;
  *) ac_comsub= ;;
  esac

  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
  sed -e "$ac_comsub
s%@configure_input@%$configure_input%g
s%@srcdir@%$srcdir%g
s%@top_srcdir@%$top_srcdir%g
" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
fi; done
rm -f conftest.s*

EOF
cat >> $CONFIG_STATUS <<EOF

EOF
cat >> $CONFIG_STATUS <<\EOF

exit 0
EOF
chmod +x $CONFIG_STATUS
rm -fr confdefs* $ac_clean_files
test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1

Changes to unix/configure.in.
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
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




+
+
+

-




-
+












+
+





+
+
+
+
+
+







#! /bin/bash -norc
dnl	This file is an input file used by the GNU "autoconf" program to
dnl	generate the file "configure", which is run during Tcl installation
dnl	to configure the system for the local environment.
#
# RCS: @(#) $Id: configure.in,v 1.57.2.10 2002/03/26 02:27:58 hobbs Exp $

AC_INIT(../generic/tcl.h)
# RCS: @(#) $Id: configure.in,v 1.57 2000/04/19 08:32:45 hobbs Exp $

TCL_VERSION=8.3
TCL_MAJOR_VERSION=8
TCL_MINOR_VERSION=3
TCL_PATCH_LEVEL=".1"
TCL_PATCH_LEVEL=".4"
VERSION=${TCL_VERSION}

#------------------------------------------------------------------------
# Handle the --prefix=... option
#------------------------------------------------------------------------

if test "${prefix}" = "NONE"; then
    prefix=/usr/local
fi
if test "${exec_prefix}" = "NONE"; then
    exec_prefix=$prefix
fi
# libdir must be a fully qualified path and (not ${exec_prefix}/lib)
eval libdir="$libdir"
TCL_SRC_DIR=`cd $srcdir/..; pwd`

#------------------------------------------------------------------------
# Standard compiler checks
#------------------------------------------------------------------------

# If the user did not set CFLAGS, set it now to keep
# the AC_PROG_CC macro from adding "-g -O2".
if test "${CFLAGS+set}" != "set" ; then
    CFLAGS=""
fi

AC_PROG_RANLIB
SC_ENABLE_GCC
AC_HAVE_HEADERS(unistd.h limits.h)

#------------------------------------------------------------------------
# Threads support
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
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







-
+






-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-








#--------------------------------------------------------------------
#	Supply substitutes for missing POSIX library procedures, or
#	set flags so Tcl uses alternate procedures.
#--------------------------------------------------------------------

# Check if Posix compliant getcwd exists, if not we'll use getwd.
AC_CHECK_FUNCS(getcwd, , AC_DEFINE(USEGETWD))
AC_CHECK_FUNCS(getcwd, , [AC_DEFINE(USEGETWD)])
# Nb: if getcwd uses popen and pwd(1) (like SunOS 4) we should really
# define USEGETWD even if the posix getcwd exists. Add a test ?

AC_REPLACE_FUNCS(opendir strstr)

AC_REPLACE_FUNCS(strtol tmpnam waitpid)
AC_CHECK_FUNC(strerror, , AC_DEFINE(NO_STRERROR))
AC_CHECK_FUNC(getwd, , AC_DEFINE(NO_GETWD))
AC_CHECK_FUNC(wait3, , AC_DEFINE(NO_WAIT3))
AC_CHECK_FUNC(uname, , AC_DEFINE(NO_UNAME))
AC_CHECK_FUNC(realpath, , AC_DEFINE(NO_REALPATH))
AC_CHECK_FUNC(strerror, , [AC_DEFINE(NO_STRERROR)])
AC_CHECK_FUNC(getwd, , [AC_DEFINE(NO_GETWD)])
AC_CHECK_FUNC(wait3, , [AC_DEFINE(NO_WAIT3)])
AC_CHECK_FUNC(uname, , [AC_DEFINE(NO_UNAME)])
AC_CHECK_FUNC(realpath, , [AC_DEFINE(NO_REALPATH)])

#--------------------------------------------------------------------
#	On a few very rare systems, all of the libm.a stuff is
#	already in libc.a.  Set compiler flags accordingly.
#	Also, Linux requires the "ieee" library for math to work
#	right (and it must appear before "-lm").
#--------------------------------------------------------------------

#AC_CHECK_FUNC(sin, MATH_LIBS="", MATH_LIBS="-lm")
#AC_CHECK_LIB(ieee, main, [MATH_LIBS="-lieee $MATH_LIBS"])

#--------------------------------------------------------------------
#       On AIX systems, libbsd.a has to be linked in to support
#       non-blocking file IO.  This library has to be linked in after
#       the MATH_LIBS or it breaks the pow() function.  The way to
#       insure proper sequencing, is to add it to the tail of MATH_LIBS.
#        This library also supplies gettimeofday.
#--------------------------------------------------------------------
#libbsd=no
#if test "`uname -s`" = "AIX" ; then
#    AC_CHECK_LIB(bsd, gettimeofday, libbsd=yes)
#    if test $libbsd = yes; then
#	MATH_LIBS="$MATH_LIBS -lbsd"
#    fi
#fi

#--------------------------------------------------------------------
#	Supply substitutes for missing POSIX header files.  Special
#	notes:
#	    - stdlib.h doesn't define strtol, strtoul, or
#	      strtod insome versions of SunOS
#	    - some versions of string.h don't declare procedures such
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
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







-
+












-
+







SC_TIME_HANDLER

#--------------------------------------------------------------------
#	Some systems (e.g., IRIX 4.0.5) lack the st_blksize field
#	in struct stat.  But we might be able to use fstatfs instead.
#--------------------------------------------------------------------
AC_STRUCT_ST_BLKSIZE
AC_CHECK_FUNC(fstatfs, , AC_DEFINE(NO_FSTATFS))
AC_CHECK_FUNC(fstatfs, , [AC_DEFINE(NO_FSTATFS)])

#--------------------------------------------------------------------
#       Some system have no memcmp or it does not work with 8 bit
#       data, this checks it and add memcmp.o to LIBOBJS if needed
#--------------------------------------------------------------------
AC_FUNC_MEMCMP

#--------------------------------------------------------------------
#       Some system like SunOS 4 and other BSD like systems
#       have no memmove (we assume they have bcopy instead).
#       {The replacement define is in compat/string.h}
#--------------------------------------------------------------------
AC_CHECK_FUNC(memmove, , AC_DEFINE(NO_MEMMOVE) AC_DEFINE(NO_STRING_H))
AC_CHECK_FUNC(memmove, , [AC_DEFINE(NO_MEMMOVE) AC_DEFINE(NO_STRING_H)])

#--------------------------------------------------------------------
#	On some systems strstr is broken: it returns a pointer even
#	even if the original string is empty.
#--------------------------------------------------------------------

AC_MSG_CHECKING([proper strstr implementation])
258
259
260
261
262
263
264
265

266
267
268
269
270
271
272
243
244
245
246
247
248
249

250
251
252
253
254
255
256
257







-
+







#--------------------------------------------------------------------
#	If a system doesn't have an opendir function (man, that's old!)
#	then we have to supply a different version of dirent.h which
#	is compatible with the substitute version of opendir that's
#	provided.  This version only works with V7-style directories.
#--------------------------------------------------------------------

AC_CHECK_FUNC(opendir, , AC_DEFINE(USE_DIRENT2_H))
AC_CHECK_FUNC(opendir, , [AC_DEFINE(USE_DIRENT2_H)])

#--------------------------------------------------------------------
#	The check below checks whether <sys/wait.h> defines the type
#	"union wait" correctly.  It's needed because of weirdness in
#	HP-UX where "union wait" is defined in both the BSD and SYS-V
#	environments.  Checking the usability of WIFEXITED seems to do
#	the trick.
324
325
326
327
328
329
330
331
332




333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
309
310
311
312
313
314
315


316
317
318
319
320
321
322
323
324
325








326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342






























343
344
345
346
347
348
349







-
-
+
+
+
+






-
-
-
-
-
-
-
-

















-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-







#	2. SGI systems don't use the BSD form of the gettimeofday function,
#	   but they have a BSDgettimeofday function that can be used instead.
#	3. See if gettimeofday is declared in the <sys/time.h> header file.
#	   if not, set the GETTOD_NOT_DECLARED flag so that tclPort.h can
#	   declare it.
#--------------------------------------------------------------------

AC_CHECK_FUNC(BSDgettimeofday, AC_DEFINE(HAVE_BSDGETTIMEOFDAY),
	AC_CHECK_FUNC(gettimeofday, , AC_DEFINE(NO_GETTOD)))
AC_CHECK_FUNC(BSDgettimeofday,
    [AC_DEFINE(HAVE_BSDGETTIMEOFDAY)], [
    AC_CHECK_FUNC(gettimeofday, , [AC_DEFINE(NO_GETTOD)])
])
AC_MSG_CHECKING([for gettimeofday declaration])
AC_EGREP_HEADER(gettimeofday, sys/time.h, AC_MSG_RESULT(present), [
    AC_MSG_RESULT(missing)
    AC_DEFINE(GETTOD_NOT_DECLARED)
])

#--------------------------------------------------------------------
#	Interactive UNIX requires -linet instead of -lsocket, plus it
#	needs net/errno.h to define the socket-related error codes.
#--------------------------------------------------------------------

#AC_CHECK_LIB(inet, main, [LIBS="$LIBS -linet"])
#AC_CHECK_HEADER(net/errno.h, AC_DEFINE(HAVE_NET_ERRNO_H))

#--------------------------------------------------------------------
#	The following code checks to see whether it is possible to get
#	signed chars on this platform.  This is needed in order to
#	properly generate sign-extended ints from character values.
#--------------------------------------------------------------------

AC_C_CHAR_UNSIGNED
AC_MSG_CHECKING([signed char declarations])
AC_TRY_COMPILE(, [
signed char *p;
p = 0;
], tcl_ok=yes, tcl_ok=no)
AC_MSG_RESULT($tcl_ok)
if test $tcl_ok = yes; then
    AC_DEFINE(HAVE_SIGNED_CHAR)
fi

#--------------------------------------------------------------------
#	Check for the existence of the -lsocket and -lnsl libraries.
#	The order here is important, so that they end up in the right
#	order in the command line generated by make.  Here are some
#	special considerations:
#	1. Use "connect" and "accept" to check for -lsocket, and
#	   "gethostbyname" to check for -lnsl.
#	2. Use each function name only once:  can't redo a check because
#	   autoconf caches the results of the last check and won't redo it.
#	3. Use -lnsl and -lsocket only if they supply procedures that
#	   aren't already present in the normal libraries.  This is because
#	   IRIX 5.2 has libraries, but they aren't needed and they're
#	   bogus:  they goof up name resolution if used.
#	4. On some SVR4 systems, can't use -lsocket without -lnsl too.
#	   To get around this problem, check for both libraries together
#	   if -lsocket doesn't work by itself.
#--------------------------------------------------------------------

#tcl_checkBoth=0
#AC_CHECK_FUNC(connect, tcl_checkSocket=0, tcl_checkSocket=1)
#if test "$tcl_checkSocket" = 1; then
#    AC_CHECK_LIB(socket, main, LIBS="$LIBS -lsocket", tcl_checkBoth=1)
#fi
#if test "$tcl_checkBoth" = 1; then
#    tk_oldLibs=$LIBS
#    LIBS="$LIBS -lsocket -lnsl"
#    AC_CHECK_FUNC(accept, tcl_checkNsl=0, [LIBS=$tk_oldLibs])
#fi
#AC_CHECK_FUNC(gethostbyname, , AC_CHECK_LIB(nsl, main, [LIBS="$LIBS -lnsl"]))

#--------------------------------------------------------------------
# Look for libraries that we will need when compiling the Tcl shell
#--------------------------------------------------------------------

SC_TCL_LINK_LIBS

# Add the threads support libraries
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435

436
437
438
439
440
441

442
443

444
445
446
447
448
449
450
451

452
453
454
455
456
457
458
459
460
461

462
463
464
465
466
467
468
357
358
359
360
361
362
363

364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386

387
388

389
390

391

392
393
394
395
396
397

398
399
400
401
402
403
404
405

406

407
408
409
410
411
412
413
414







-




















+


-


-
+

-
+
-






-
+







-

-
+







#--------------------------------------------------------------------

SC_CONFIG_CFLAGS

SC_ENABLE_SYMBOLS

TCL_DBGX=${DBGX}
CFLAGS=${CFLAGS_DEFAULT}

#--------------------------------------------------------------------
#	The statements below check for systems where POSIX-style
#	non-blocking I/O (O_NONBLOCK) doesn't work or is unimplemented. 
#	On these systems (mostly older ones), use the old BSD-style
#	FIONBIO approach instead.
#--------------------------------------------------------------------

SC_BLOCKING_STYLE

#--------------------------------------------------------------------
#	The statements below define a collection of symbols related to
#	building libtcl as a shared library instead of a static library.
#--------------------------------------------------------------------

TCL_UNSHARED_LIB_SUFFIX=${UNSHARED_LIB_SUFFIX}
TCL_SHARED_LIB_SUFFIX=${SHARED_LIB_SUFFIX}

SC_ENABLE_SHARED

TCL_LD_SEARCH_FLAGS="${LD_SEARCH_FLAGS}"
if test "${SHARED_BUILD}" = "1" -a "${SHLIB_SUFFIX}" != "" ; then
    TCL_SHLIB_CFLAGS="${SHLIB_CFLAGS}"
    TCL_LD_SEARCH_FLAGS="${LD_SEARCH_FLAGS}"
    eval "TCL_LIB_FILE=libtcl${TCL_SHARED_LIB_SUFFIX}"
    if test "x$DL_OBJS" = "xtclLoadAout.o"; then
	MAKE_LIB="ar cr \${TCL_LIB_FILE} \${OBJS}"
	MAKE_LIB="\${STLIB_LD} \[$]@ \${OBJS}"
    else
	MAKE_LIB="\${SHLIB_LD} -o \${TCL_LIB_FILE} \${OBJS} ${SHLIB_LD_LIBS}"
	MAKE_LIB="\${SHLIB_LD} ${TCL_SHLIB_LD_EXTRAS} -o \[$]@ \${OBJS} ${SHLIB_LD_LIBS}"
	RANLIB=":"
    fi
else
    case $system in
        BSD/OS*)
	    ;;

	AIX-*)
	AIX-[[1-4]].*)
            ;;

        *)
	    SHLIB_LD_LIBS=""
	    ;;
    esac
    TCL_SHLIB_CFLAGS=""
    TCL_LD_SEARCH_FLAGS="${LD_SEARCH_FLAGS}"
    eval "TCL_LIB_FILE=libtcl${TCL_UNSHARED_LIB_SUFFIX}"
    MAKE_LIB="ar cr \${TCL_LIB_FILE} \${OBJS}"
    MAKE_LIB="\${STLIB_LD} \[$]@ \${OBJS}"
fi

# tclConfig.sh needs a version of the _LIB_SUFFIX that has been eval'ed
# so that the backslashes quoting the DBX braces are dropped.

# Trick to replace DBGX with TCL_DBGX
DBGX='${TCL_DBGX}'
476
477
478
479
480
481
482
483

484
485
486
487
488
489
490
491

492
493

494
495
496

497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513

514
515
516
517
518
519
520
521
522
523
524

525
526

527
528
529

530
531
532
533
534
535
536
537
538
539

540
541

542
543
544
545
546
547
548
549




550
551
552
553
554
555






556
557


558
559
560



561
562
563

564
565


566


567



568
569
570




571
572
573


574
575
576
577
578
579
580




581
582
583
584

585
586
587
588
589
590
591
592
593
594
595






596
597
422
423
424
425
426
427
428

429
430
431
432
433
434
435
436

437
438

439
440
441

442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458

459
460
461
462
463
464
465
466
467
468
469

470
471

472
473


474

475
476
477
478
479
480
481
482

483
484

485
486
487
488
489
490
491
492

493
494
495
496
497





498
499
500
501
502
503
504

505
506
507


508
509
510
511
512
513
514


515
516
517
518
519
520
521
522
523



524
525
526
527
528


529
530
531






532
533
534
535
536
537
538

539
540




541
542




543
544
545
546
547
548
549
550







-
+







-
+

-
+


-
+
















-
+










-
+

-
+

-
-
+
-








-
+

-
+







-
+
+
+
+

-
-
-
-
-
+
+
+
+
+
+

-
+
+

-
-
+
+
+



+
-
-
+
+

+
+

+
+
+
-
-
-
+
+
+
+

-
-
+
+

-
-
-
-
-
-
+
+
+
+



-
+

-
-
-
-


-
-
-
-
+
+
+
+
+
+


if test "$SHARED_BUILD" = "0" -o $TCL_NEEDS_EXP_FILE = 0; then
    if test "${TCL_LIB_VERSIONS_OK}" = "ok"; then
        TCL_LIB_FLAG="-ltcl${TCL_VERSION}\${TCL_DBGX}"
    else
        TCL_LIB_FLAG="-ltcl`echo ${TCL_VERSION} | tr -d .`\${TCL_DBGX}"
    fi
    TCL_BUILD_LIB_SPEC="-L`pwd` ${TCL_LIB_FLAG}"
    TCL_LIB_SPEC="-L${exec_prefix}/lib ${TCL_LIB_FLAG}"
    TCL_LIB_SPEC="-L${libdir} ${TCL_LIB_FLAG}"
else
    TCL_BUILD_EXP_FILE="lib.exp"
    eval "TCL_EXP_FILE=libtcl${TCL_EXPORT_FILE_SUFFIX}"

    # Replace DBGX with TCL_DBGX
    eval "TCL_EXP_FILE=\"${TCL_EXP_FILE}\""
    
    if test "$using_gcc" = "yes" ; then
    if test "$GCC" = "yes" ; then
	TCL_BUILD_LIB_SPEC="-Wl,-bI:`pwd`/${TCL_BUILD_EXP_FILE} -L`pwd`"
	TCL_LIB_SPEC="-Wl,-bI:${exec_prefix}/lib/${TCL_EXP_FILE} -L`pwd`"    
	TCL_LIB_SPEC="-Wl,-bI:${libdir}/${TCL_EXP_FILE} -L`pwd`"
    else
	TCL_BUILD_LIB_SPEC="-bI:`pwd`/${TCL_BUILD_EXP_FILE}"
	TCL_LIB_SPEC="-bI:${exec_prefix}/lib/${TCL_EXP_FILE}"    
	TCL_LIB_SPEC="-bI:${libdir}/${TCL_EXP_FILE}"
    fi
fi
VERSION='${VERSION}'
eval "CFG_TCL_SHARED_LIB_SUFFIX=${TCL_SHARED_LIB_SUFFIX}"
eval "CFG_TCL_UNSHARED_LIB_SUFFIX=${TCL_UNSHARED_LIB_SUFFIX}"
eval "CFG_TCL_EXPORT_FILE_SUFFIX=${TCL_EXPORT_FILE_SUFFIX}"
VERSION=${TCL_VERSION}

#--------------------------------------------------------------------
#	The statements below define the symbol TCL_PACKAGE_PATH, which
#	gives a list of directories that may contain packages.  The list
#	consists of one directory for machine-dependent binaries and
#	another for platform-independent scripts.
#--------------------------------------------------------------------

if test "$prefix" != "$exec_prefix"; then
    TCL_PACKAGE_PATH="${exec_prefix}/lib ${prefix}/lib"
    TCL_PACKAGE_PATH="${libdir} ${prefix}/lib"
else
    TCL_PACKAGE_PATH="${prefix}/lib"
fi

#--------------------------------------------------------------------
#       The statements below define various symbols relating to Tcl
#       stub support.
#--------------------------------------------------------------------

# Replace ${VERSION} with contents of ${TCL_VERSION}
eval "STUB_LIB_FILE=libtclstub${TCL_UNSHARED_LIB_SUFFIX}"
eval "TCL_STUB_LIB_FILE=libtclstub${TCL_UNSHARED_LIB_SUFFIX}"
# Replace DBGX with TCL_DBGX
eval "STUB_LIB_FILE=\"${STUB_LIB_FILE}\""
eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\""

MAKE_STUB_LIB="ar cr \${STUB_LIB_FILE} \${STUB_LIB_OBJS}"

MAKE_STUB_LIB="\${STLIB_LD} \[$]@ \${STUB_LIB_OBJS}"
TCL_STUB_LIB_FILE=${STUB_LIB_FILE}

if test "${TCL_LIB_VERSIONS_OK}" = "ok"; then
    TCL_STUB_LIB_FLAG="-ltclstub${TCL_VERSION}\${TCL_DBGX}"
else
    TCL_STUB_LIB_FLAG="-ltclstub`echo ${TCL_VERSION} | tr -d .`\${TCL_DBGX}"
fi

TCL_BUILD_STUB_LIB_SPEC="-L`pwd` ${TCL_STUB_LIB_FLAG}"
TCL_STUB_LIB_SPEC="-L${exec_prefix}/lib ${TCL_STUB_LIB_FLAG}"
TCL_STUB_LIB_SPEC="-L${libdir} ${TCL_STUB_LIB_FLAG}"
TCL_BUILD_STUB_LIB_PATH="`pwd`/${TCL_STUB_LIB_FILE}"
TCL_STUB_LIB_PATH="${exec_prefix}/lib/${TCL_STUB_LIB_FILE}"
TCL_STUB_LIB_PATH="${libdir}/${TCL_STUB_LIB_FILE}"

#------------------------------------------------------------------------
# tclConfig.sh refers to this by a different name
#------------------------------------------------------------------------

TCL_SHARED_BUILD=${SHARED_BUILD}

AC_SUBST(STUB_LIB_FILE)
AC_SUBST(TCL_VERSION)
AC_SUBST(TCL_MAJOR_VERSION)
AC_SUBST(TCL_MINOR_VERSION)
AC_SUBST(TCL_PATCH_LEVEL)

AC_SUBST(TCL_STUB_LIB_FILE)
AC_SUBST(TCL_STUB_LIB_FLAG)
AC_SUBST(TCL_BUILD_STUB_LIB_SPEC)
AC_SUBST(TCL_STUB_LIB_SPEC)
AC_SUBST(TCL_BUILD_STUB_LIB_PATH)
AC_SUBST(TCL_LIB_FILE)
AC_SUBST(TCL_LIB_FLAG)
AC_SUBST(TCL_LIB_SPEC)
AC_SUBST(TCL_STUB_LIB_FILE)
AC_SUBST(TCL_STUB_LIB_FLAG)
AC_SUBST(TCL_STUB_LIB_SPEC)
AC_SUBST(TCL_STUB_LIB_PATH)
AC_SUBST(MAKE_STUB_LIB)
AC_SUBST(TCL_BUILD_STUB_LIB_SPEC)
AC_SUBST(TCL_BUILD_STUB_LIB_PATH)

AC_SUBST(BUILD_DLTEST)
AC_SUBST(CFLAGS)
AC_SUBST(TCL_SRC_DIR)
AC_SUBST(TCL_BIN_DIR)
AC_SUBST(TCL_DBGX)
AC_SUBST(CFG_TCL_SHARED_LIB_SUFFIX)
AC_SUBST(CFG_TCL_UNSHARED_LIB_SUFFIX)
AC_SUBST(CFG_TCL_EXPORT_FILE_SUFFIX)

AC_SUBST(TCL_DBGX)
AC_SUBST(DL_OBJS)
AC_SUBST(CFLAGS)
AC_SUBST(CFLAGS_DEFAULT)
AC_SUBST(EXTRA_CFLAGS)
AC_SUBST(DL_OBJS)

AC_SUBST(LDFLAGS)
AC_SUBST(LDFLAGS_DEFAULT)
AC_SUBST(LDFLAGS_DEBUG)
AC_SUBST(LDFLAGS_OPTIMIZE)
AC_SUBST(MAKE_LIB)
AC_SUBST(TCL_SHARED_BUILD)
AC_SUBST(SHLIB_CFLAGS)
AC_SUBST(AR)
AC_SUBST(RANLIB)

AC_SUBST(STLIB_LD)
AC_SUBST(SHLIB_LD)
AC_SUBST(STLIB_LD)
AC_SUBST(SHLIB_LD_LIBS)
AC_SUBST(SHLIB_LD_LIBS)
AC_SUBST(SHLIB_CFLAGS)
AC_SUBST(SHLIB_SUFFIX)
AC_SUBST(TCL_BUILD_LIB_SPEC)
AC_SUBST(TCL_LD_SEARCH_FLAGS)
AC_SUBST(TCL_LDFLAGS_DEBUG)
AC_SUBST(TCL_LDFLAGS_OPTIMIZE)
AC_SUBST(TCL_LIB_FILE)
AC_SUBST(TCL_LIB_FLAG)
AC_SUBST(TCL_SHARED_BUILD)

AC_SUBST(TCL_BUILD_LIB_SPEC)
AC_SUBST(TCL_LD_SEARCH_FLAGS)
AC_SUBST(TCL_NEEDS_EXP_FILE)
AC_SUBST(TCL_BUILD_EXP_FILE)
AC_SUBST(TCL_EXP_FILE)
AC_SUBST(TCL_LIB_SPEC)

AC_SUBST(TCL_LIB_VERSIONS_OK)
AC_SUBST(TCL_MAJOR_VERSION)
AC_SUBST(TCL_MINOR_VERSION)
AC_SUBST(TCL_PACKAGE_PATH)
AC_SUBST(TCL_PATCH_LEVEL)
AC_SUBST(TCL_SHARED_LIB_SUFFIX)
AC_SUBST(TCL_SHLIB_CFLAGS)
AC_SUBST(TCL_SRC_DIR)
AC_SUBST(TCL_BIN_DIR)
AC_SUBST(TCL_UNSHARED_LIB_SUFFIX)
AC_SUBST(TCL_VERSION)
AC_SUBST(TCL_UNSHARED_LIB_SUFFIX)

AC_SUBST(MAKE_LIB)
AC_SUBST(MAKE_STUB_LIB)
AC_SUBST(BUILD_DLTEST)
AC_SUBST(TCL_PACKAGE_PATH)

AC_OUTPUT(Makefile tclConfig.sh)
Added unix/dltest/configure.













































































































































































































































































































































































































































































































































































































































































































































































































































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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#! /bin/sh

# Guess values for system-dependent variables and create Makefiles.
# Generated automatically using autoconf version 2.13 
# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
#
# This configure script is free software; the Free Software Foundation
# gives unlimited permission to copy, distribute and modify it.

# Defaults:
ac_help=
ac_default_prefix=/usr/local
# Any additions from configure.in:

# Initialize some variables set by options.
# The variables have the same names as the options, with
# dashes changed to underlines.
build=NONE
cache_file=./config.cache
exec_prefix=NONE
host=NONE
no_create=
nonopt=NONE
no_recursion=
prefix=NONE
program_prefix=NONE
program_suffix=NONE
program_transform_name=s,x,x,
silent=
site=
srcdir=
target=NONE
verbose=
x_includes=NONE
x_libraries=NONE
bindir='${exec_prefix}/bin'
sbindir='${exec_prefix}/sbin'
libexecdir='${exec_prefix}/libexec'
datadir='${prefix}/share'
sysconfdir='${prefix}/etc'
sharedstatedir='${prefix}/com'
localstatedir='${prefix}/var'
libdir='${exec_prefix}/lib'
includedir='${prefix}/include'
oldincludedir='/usr/include'
infodir='${prefix}/info'
mandir='${prefix}/man'

# Initialize some other variables.
subdirs=
MFLAGS= MAKEFLAGS=
SHELL=${CONFIG_SHELL-/bin/sh}
# Maximum number of lines to put in a shell here document.
ac_max_here_lines=12

ac_prev=
for ac_option
do

  # If the previous option needs an argument, assign it.
  if test -n "$ac_prev"; then
    eval "$ac_prev=\$ac_option"
    ac_prev=
    continue
  fi

  case "$ac_option" in
  -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
  *) ac_optarg= ;;
  esac

  # Accept the important Cygnus configure options, so we can diagnose typos.

  case "$ac_option" in

  -bindir | --bindir | --bindi | --bind | --bin | --bi)
    ac_prev=bindir ;;
  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
    bindir="$ac_optarg" ;;

  -build | --build | --buil | --bui | --bu)
    ac_prev=build ;;
  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
    build="$ac_optarg" ;;

  -cache-file | --cache-file | --cache-fil | --cache-fi \
  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
    ac_prev=cache_file ;;
  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
    cache_file="$ac_optarg" ;;

  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
    ac_prev=datadir ;;
  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
  | --da=*)
    datadir="$ac_optarg" ;;

  -disable-* | --disable-*)
    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
    fi
    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
    eval "enable_${ac_feature}=no" ;;

  -enable-* | --enable-*)
    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
    fi
    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
    case "$ac_option" in
      *=*) ;;
      *) ac_optarg=yes ;;
    esac
    eval "enable_${ac_feature}='$ac_optarg'" ;;

  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
  | --exec | --exe | --ex)
    ac_prev=exec_prefix ;;
  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
  | --exec=* | --exe=* | --ex=*)
    exec_prefix="$ac_optarg" ;;

  -gas | --gas | --ga | --g)
    # Obsolete; use --with-gas.
    with_gas=yes ;;

  -help | --help | --hel | --he)
    # Omit some internal or obsolete options to make the list less imposing.
    # This message is too long to be a string in the A/UX 3.1 sh.
    cat << EOF
Usage: configure [options] [host]
Options: [defaults in brackets after descriptions]
Configuration:
  --cache-file=FILE       cache test results in FILE
  --help                  print this message
  --no-create             do not create output files
  --quiet, --silent       do not print \`checking...' messages
  --version               print the version of autoconf that created configure
Directory and file names:
  --prefix=PREFIX         install architecture-independent files in PREFIX
                          [$ac_default_prefix]
  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                          [same as prefix]
  --bindir=DIR            user executables in DIR [EPREFIX/bin]
  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
  --datadir=DIR           read-only architecture-independent data in DIR
                          [PREFIX/share]
  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
  --sharedstatedir=DIR    modifiable architecture-independent data in DIR
                          [PREFIX/com]
  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
  --includedir=DIR        C header files in DIR [PREFIX/include]
  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
  --infodir=DIR           info documentation in DIR [PREFIX/info]
  --mandir=DIR            man documentation in DIR [PREFIX/man]
  --srcdir=DIR            find the sources in DIR [configure dir or ..]
  --program-prefix=PREFIX prepend PREFIX to installed program names
  --program-suffix=SUFFIX append SUFFIX to installed program names
  --program-transform-name=PROGRAM
                          run sed PROGRAM on installed program names
EOF
    cat << EOF
Host type:
  --build=BUILD           configure for building on BUILD [BUILD=HOST]
  --host=HOST             configure for HOST [guessed]
  --target=TARGET         configure for TARGET [TARGET=HOST]
Features and packages:
  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
  --x-includes=DIR        X include files are in DIR
  --x-libraries=DIR       X library files are in DIR
EOF
    if test -n "$ac_help"; then
      echo "--enable and --with options recognized:$ac_help"
    fi
    exit 0 ;;

  -host | --host | --hos | --ho)
    ac_prev=host ;;
  -host=* | --host=* | --hos=* | --ho=*)
    host="$ac_optarg" ;;

  -includedir | --includedir | --includedi | --included | --include \
  | --includ | --inclu | --incl | --inc)
    ac_prev=includedir ;;
  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
  | --includ=* | --inclu=* | --incl=* | --inc=*)
    includedir="$ac_optarg" ;;

  -infodir | --infodir | --infodi | --infod | --info | --inf)
    ac_prev=infodir ;;
  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
    infodir="$ac_optarg" ;;

  -libdir | --libdir | --libdi | --libd)
    ac_prev=libdir ;;
  -libdir=* | --libdir=* | --libdi=* | --libd=*)
    libdir="$ac_optarg" ;;

  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
  | --libexe | --libex | --libe)
    ac_prev=libexecdir ;;
  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
  | --libexe=* | --libex=* | --libe=*)
    libexecdir="$ac_optarg" ;;

  -localstatedir | --localstatedir | --localstatedi | --localstated \
  | --localstate | --localstat | --localsta | --localst \
  | --locals | --local | --loca | --loc | --lo)
    ac_prev=localstatedir ;;
  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
    localstatedir="$ac_optarg" ;;

  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
    ac_prev=mandir ;;
  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
    mandir="$ac_optarg" ;;

  -nfp | --nfp | --nf)
    # Obsolete; use --without-fp.
    with_fp=no ;;

  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
  | --no-cr | --no-c)
    no_create=yes ;;

  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
    no_recursion=yes ;;

  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
  | --oldin | --oldi | --old | --ol | --o)
    ac_prev=oldincludedir ;;
  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
    oldincludedir="$ac_optarg" ;;

  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
    ac_prev=prefix ;;
  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
    prefix="$ac_optarg" ;;

  -program-prefix | --program-prefix | --program-prefi | --program-pref \
  | --program-pre | --program-pr | --program-p)
    ac_prev=program_prefix ;;
  -program-prefix=* | --program-prefix=* | --program-prefi=* \
  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
    program_prefix="$ac_optarg" ;;

  -program-suffix | --program-suffix | --program-suffi | --program-suff \
  | --program-suf | --program-su | --program-s)
    ac_prev=program_suffix ;;
  -program-suffix=* | --program-suffix=* | --program-suffi=* \
  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
    program_suffix="$ac_optarg" ;;

  -program-transform-name | --program-transform-name \
  | --program-transform-nam | --program-transform-na \
  | --program-transform-n | --program-transform- \
  | --program-transform | --program-transfor \
  | --program-transfo | --program-transf \
  | --program-trans | --program-tran \
  | --progr-tra | --program-tr | --program-t)
    ac_prev=program_transform_name ;;
  -program-transform-name=* | --program-transform-name=* \
  | --program-transform-nam=* | --program-transform-na=* \
  | --program-transform-n=* | --program-transform-=* \
  | --program-transform=* | --program-transfor=* \
  | --program-transfo=* | --program-transf=* \
  | --program-trans=* | --program-tran=* \
  | --progr-tra=* | --program-tr=* | --program-t=*)
    program_transform_name="$ac_optarg" ;;

  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
  | -silent | --silent | --silen | --sile | --sil)
    silent=yes ;;

  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
    ac_prev=sbindir ;;
  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
  | --sbi=* | --sb=*)
    sbindir="$ac_optarg" ;;

  -sharedstatedir | --sharedstatedir | --sharedstatedi \
  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
  | --sharedst | --shareds | --shared | --share | --shar \
  | --sha | --sh)
    ac_prev=sharedstatedir ;;
  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
  | --sha=* | --sh=*)
    sharedstatedir="$ac_optarg" ;;

  -site | --site | --sit)
    ac_prev=site ;;
  -site=* | --site=* | --sit=*)
    site="$ac_optarg" ;;

  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
    ac_prev=srcdir ;;
  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
    srcdir="$ac_optarg" ;;

  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
  | --syscon | --sysco | --sysc | --sys | --sy)
    ac_prev=sysconfdir ;;
  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
    sysconfdir="$ac_optarg" ;;

  -target | --target | --targe | --targ | --tar | --ta | --t)
    ac_prev=target ;;
  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
    target="$ac_optarg" ;;

  -v | -verbose | --verbose | --verbos | --verbo | --verb)
    verbose=yes ;;

  -version | --version | --versio | --versi | --vers)
    echo "configure generated by autoconf version 2.13"
    exit 0 ;;

  -with-* | --with-*)
    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
    fi
    ac_package=`echo $ac_package| sed 's/-/_/g'`
    case "$ac_option" in
      *=*) ;;
      *) ac_optarg=yes ;;
    esac
    eval "with_${ac_package}='$ac_optarg'" ;;

  -without-* | --without-*)
    ac_package=`echo $ac_option|sed -e 's/-*without-//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
    fi
    ac_package=`echo $ac_package| sed 's/-/_/g'`
    eval "with_${ac_package}=no" ;;

  --x)
    # Obsolete; use --with-x.
    with_x=yes ;;

  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
  | --x-incl | --x-inc | --x-in | --x-i)
    ac_prev=x_includes ;;
  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
    x_includes="$ac_optarg" ;;

  -x-libraries | --x-libraries | --x-librarie | --x-librari \
  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
    ac_prev=x_libraries ;;
  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
    x_libraries="$ac_optarg" ;;

  -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
    ;;

  *)
    if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
      echo "configure: warning: $ac_option: invalid host type" 1>&2
    fi
    if test "x$nonopt" != xNONE; then
      { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
    fi
    nonopt="$ac_option"
    ;;

  esac
done

if test -n "$ac_prev"; then
  { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
fi

trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15

# File descriptor usage:
# 0 standard input
# 1 file creation
# 2 errors and warnings
# 3 some systems may open it to /dev/tty
# 4 used on the Kubota Titan
# 6 checking for... messages and results
# 5 compiler messages saved in config.log
if test "$silent" = yes; then
  exec 6>/dev/null
else
  exec 6>&1
fi
exec 5>./config.log

echo "\
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
" 1>&5

# Strip out --no-create and --no-recursion so they do not pile up.
# Also quote any args containing shell metacharacters.
ac_configure_args=
for ac_arg
do
  case "$ac_arg" in
  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
  | --no-cr | --no-c) ;;
  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
  *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
  ac_configure_args="$ac_configure_args '$ac_arg'" ;;
  *) ac_configure_args="$ac_configure_args $ac_arg" ;;
  esac
done

# NLS nuisances.
# Only set these to C if already set.  These must not be set unconditionally
# because not all systems understand e.g. LANG=C (notably SCO).
# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
# Non-C LC_CTYPE values break the ctype check.
if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi

# confdefs.h avoids OS command line length limits that DEFS can exceed.
rm -rf conftest* confdefs.h
# AIX cpp loses on an empty file, so make sure it contains at least a newline.
echo > confdefs.h

# A filename unique to this package, relative to the directory that
# configure is in, which we can look for to find out if srcdir is correct.
ac_unique_file=pkga.c

# Find the source files, if location was not specified.
if test -z "$srcdir"; then
  ac_srcdir_defaulted=yes
  # Try the directory containing this script, then its parent.
  ac_prog=$0
  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
  srcdir=$ac_confdir
  if test ! -r $srcdir/$ac_unique_file; then
    srcdir=..
  fi
else
  ac_srcdir_defaulted=no
fi
if test ! -r $srcdir/$ac_unique_file; then
  if test "$ac_srcdir_defaulted" = yes; then
    { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
  else
    { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
  fi
fi
srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`

# Prefer explicitly selected file to automatically selected ones.
if test -z "$CONFIG_SITE"; then
  if test "x$prefix" != xNONE; then
    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
  else
    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
  fi
fi
for ac_site_file in $CONFIG_SITE; do
  if test -r "$ac_site_file"; then
    echo "loading site script $ac_site_file"
    . "$ac_site_file"
  fi
done

if test -r "$cache_file"; then
  echo "loading cache $cache_file"
  . $cache_file
else
  echo "creating cache $cache_file"
  > $cache_file
fi

ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

ac_exeext=
ac_objext=o
if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
  # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
    ac_n= ac_c='
' ac_t='	'
  else
    ac_n=-n ac_c= ac_t=
  fi
else
  ac_n= ac_c='\c' ac_t=
fi


# RCS: @(#) $Id: configure,v 1.1.2.1 2001/04/03 22:10:14 hobbs Exp $

# Recover information that Tcl computed with its configure script.

. ../tclConfig.sh

CC=$TCL_CC

SHLIB_CFLAGS=$TCL_SHLIB_CFLAGS

EXTRA_CFLAGS=$TCL_EXTRA_CFLAGS

SHLIB_LD=$TCL_SHLIB_LD

SHLIB_LD_LIBS=$TCL_SHLIB_LD_LIBS

SHLIB_SUFFIX=$TCL_SHLIB_SUFFIX

SHLIB_VERSION=$TCL_SHLIB_VERSION


TCL_LIBS=$TCL_LIBS

TCL_VERSION=$TCL_VERSION

TCL_DBGX=$TCL_DBGX


trap '' 1 2 15
cat > confcache <<\EOF
# This file is a shell script that caches the results of configure
# tests run on this system so they can be shared between configure
# scripts and configure runs.  It is not useful on other systems.
# If it contains results you don't want to keep, you may remove or edit it.
#
# By default, configure uses ./config.cache as the cache file,
# creating it if it does not exist already.  You can give configure
# the --cache-file=FILE option to use a different cache file; that is
# what configure does when it calls configure scripts in
# subdirectories, so they share the cache.
# Giving --cache-file=/dev/null disables caching, for debugging configure.
# config.status only pays attention to the cache file if you give it the
# --recheck option to rerun configure.
#
EOF
# The following way of writing the cache mishandles newlines in values,
# but we know of no workaround that is simple, portable, and efficient.
# So, don't put newlines in cache variables' values.
# Ultrix sh set writes to stderr and can't be redirected directly,
# and sets the high bit in the cache file unless we assign to the vars.
(set) 2>&1 |
  case `(ac_space=' '; set | grep ac_space) 2>&1` in
  *ac_space=\ *)
    # `set' does not quote correctly, so add quotes (double-quote substitution
    # turns \\\\ into \\, and sed turns \\ into \).
    sed -n \
      -e "s/'/'\\\\''/g" \
      -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
    ;;
  *)
    # `set' quotes correctly as required by POSIX, so do not add quotes.
    sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
    ;;
  esac >> confcache
if cmp -s $cache_file confcache; then
  :
else
  if test -w $cache_file; then
    echo "updating cache $cache_file"
    cat confcache > $cache_file
  else
    echo "not updating unwritable cache $cache_file"
  fi
fi
rm -f confcache

trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15

test "x$prefix" = xNONE && prefix=$ac_default_prefix
# Let make expand exec_prefix.
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'

# Any assignment to VPATH causes Sun make to only execute
# the first set of double-colon rules, so remove it if not needed.
# If there is a colon in the path, we need to keep it.
if test "x$srcdir" = x.; then
  ac_vpsub='/^[ 	]*VPATH[ 	]*=[^:]*$/d'
fi

trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15

# Transform confdefs.h into DEFS.
# Protect against shell expansion while executing Makefile rules.
# Protect against Makefile macro expansion.
cat > conftest.defs <<\EOF
s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
s%[ 	`~#$^&*(){}\\|;'"<>?]%\\&%g
s%\[%\\&%g
s%\]%\\&%g
s%\$%$$%g
EOF
DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
rm -f conftest.defs


# Without the "./", some shells look in PATH for config.status.
: ${CONFIG_STATUS=./config.status}

echo creating $CONFIG_STATUS
rm -f $CONFIG_STATUS
cat > $CONFIG_STATUS <<EOF
#! /bin/sh
# Generated automatically by configure.
# Run this file to recreate the current configuration.
# This directory was configured as follows,
# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
#
# $0 $ac_configure_args
#
# Compiler output produced by configure, useful for debugging
# configure, is in ./config.log if it exists.

ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
for ac_option
do
  case "\$ac_option" in
  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
    echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
    exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
  -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
    echo "$CONFIG_STATUS generated by autoconf version 2.13"
    exit 0 ;;
  -help | --help | --hel | --he | --h)
    echo "\$ac_cs_usage"; exit 0 ;;
  *) echo "\$ac_cs_usage"; exit 1 ;;
  esac
done

ac_given_srcdir=$srcdir

trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
EOF
cat >> $CONFIG_STATUS <<EOF

# Protect against being on the right side of a sed subst in config.status.
sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
 s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
$ac_vpsub
$extrasub
s%@SHELL@%$SHELL%g
s%@CFLAGS@%$CFLAGS%g
s%@CPPFLAGS@%$CPPFLAGS%g
s%@CXXFLAGS@%$CXXFLAGS%g
s%@FFLAGS@%$FFLAGS%g
s%@DEFS@%$DEFS%g
s%@LDFLAGS@%$LDFLAGS%g
s%@LIBS@%$LIBS%g
s%@exec_prefix@%$exec_prefix%g
s%@prefix@%$prefix%g
s%@program_transform_name@%$program_transform_name%g
s%@bindir@%$bindir%g
s%@sbindir@%$sbindir%g
s%@libexecdir@%$libexecdir%g
s%@datadir@%$datadir%g
s%@sysconfdir@%$sysconfdir%g
s%@sharedstatedir@%$sharedstatedir%g
s%@localstatedir@%$localstatedir%g
s%@libdir@%$libdir%g
s%@includedir@%$includedir%g
s%@oldincludedir@%$oldincludedir%g
s%@infodir@%$infodir%g
s%@mandir@%$mandir%g
s%@CC@%$CC%g
s%@SHLIB_CFLAGS@%$SHLIB_CFLAGS%g
s%@EXTRA_CFLAGS@%$EXTRA_CFLAGS%g
s%@SHLIB_LD@%$SHLIB_LD%g
s%@SHLIB_LD_LIBS@%$SHLIB_LD_LIBS%g
s%@SHLIB_SUFFIX@%$SHLIB_SUFFIX%g
s%@SHLIB_VERSION@%$SHLIB_VERSION%g
s%@TCL_BUILD_STUB_LIB_SPEC@%$TCL_BUILD_STUB_LIB_SPEC%g
s%@TCL_LIBS@%$TCL_LIBS%g
s%@TCL_VERSION@%$TCL_VERSION%g
s%@TCL_DBGX@%$TCL_DBGX%g

CEOF
EOF

cat >> $CONFIG_STATUS <<\EOF

# Split the substitutions into bite-sized pieces for seds with
# small command number limits, like on Digital OSF/1 and HP-UX.
ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
ac_file=1 # Number of current file.
ac_beg=1 # First line for current file.
ac_end=$ac_max_sed_cmds # Line after last line for current file.
ac_more_lines=:
ac_sed_cmds=""
while $ac_more_lines; do
  if test $ac_beg -gt 1; then
    sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
  else
    sed "${ac_end}q" conftest.subs > conftest.s$ac_file
  fi
  if test ! -s conftest.s$ac_file; then
    ac_more_lines=false
    rm -f conftest.s$ac_file
  else
    if test -z "$ac_sed_cmds"; then
      ac_sed_cmds="sed -f conftest.s$ac_file"
    else
      ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
    fi
    ac_file=`expr $ac_file + 1`
    ac_beg=$ac_end
    ac_end=`expr $ac_end + $ac_max_sed_cmds`
  fi
done
if test -z "$ac_sed_cmds"; then
  ac_sed_cmds=cat
fi
EOF

cat >> $CONFIG_STATUS <<EOF

CONFIG_FILES=\${CONFIG_FILES-"Makefile"}
EOF
cat >> $CONFIG_STATUS <<\EOF
for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
  case "$ac_file" in
  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
  *) ac_file_in="${ac_file}.in" ;;
  esac

  # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.

  # Remove last slash and all that follows it.  Not all systems have dirname.
  ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
    # The file is in a subdirectory.
    test ! -d "$ac_dir" && mkdir "$ac_dir"
    ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
    # A "../" for each directory in $ac_dir_suffix.
    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
  else
    ac_dir_suffix= ac_dots=
  fi

  case "$ac_given_srcdir" in
  .)  srcdir=.
      if test -z "$ac_dots"; then top_srcdir=.
      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
  /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
  *) # Relative path.
    srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
    top_srcdir="$ac_dots$ac_given_srcdir" ;;
  esac


  echo creating "$ac_file"
  rm -f "$ac_file"
  configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
  case "$ac_file" in
  *Makefile*) ac_comsub="1i\\
# $configure_input" ;;
  *) ac_comsub= ;;
  esac

  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
  sed -e "$ac_comsub
s%@configure_input@%$configure_input%g
s%@srcdir@%$srcdir%g
s%@top_srcdir@%$top_srcdir%g
" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
fi; done
rm -f conftest.s*

EOF
cat >> $CONFIG_STATUS <<EOF

EOF
cat >> $CONFIG_STATUS <<\EOF

exit 0
EOF
chmod +x $CONFIG_STATUS
rm -fr confdefs* $ac_clean_files
test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1

Changes to unix/install-sh.
55
56
57
58
59
60
61





62
63
64
65
66
67
68
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73







+
+
+
+
+








	-g) chgrpcmd="$chgrpprog $2"
	    shift
	    shift
	    continue;;

	-s) stripcmd="$stripprog"
	    shift
	    continue;;

	-S) stripcmd="$stripprog $2"
	    shift
	    shift
	    continue;;

	*)  if [ x"$src" = x ]
	    then
		src=$1
	    else
Changes to unix/mkLinks.
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
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







+
+



+
+
+











+






+







    echo "Usage: mkLinks dir"
    exit 1
fi

cd $1
echo foo > xyzzyTestingAVeryLongFileName.foo
x=`echo xyzzyTe*`
echo foo > xyzzyTestingaverylongfilename.foo
y=`echo xyzzyTestingav*`
rm xyzzyTe*
if test "$x" != "xyzzyTestingAVeryLongFileName.foo"; then
    exit
fi
if test "$y" != "xyzzyTestingaverylongfilename.foo"; then
    CASEINSENSITIVEFS=1
fi

if test -r Access.3; then
    rm -f Tcl_Access.3
    rm -f Tcl_Stat.3
    ln Access.3 Tcl_Access.3
    ln Access.3 Tcl_Stat.3
fi
if test -r AddErrInfo.3; then
    rm -f Tcl_AddObjErrorInfo.3
    rm -f Tcl_AddErrorInfo.3
    rm -f Tcl_SetObjErrorCode.3
    rm -f Tcl_SetErrorCode.3
    rm -f Tcl_SetErrorCodeVA.3
    rm -f Tcl_PosixError.3
    rm -f Tcl_LogCommandInfo.3
    ln AddErrInfo.3 Tcl_AddObjErrorInfo.3
    ln AddErrInfo.3 Tcl_AddErrorInfo.3
    ln AddErrInfo.3 Tcl_SetObjErrorCode.3
    ln AddErrInfo.3 Tcl_SetErrorCode.3
    ln AddErrInfo.3 Tcl_SetErrorCodeVA.3
    ln AddErrInfo.3 Tcl_PosixError.3
    ln AddErrInfo.3 Tcl_LogCommandInfo.3
fi
if test -r Alloc.3; then
    rm -f Tcl_Alloc.3
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
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







+


+




















+
+
+
+
+
+
+
+
+
+
+
+
+
+










+
+
+
+
+
+
+
+
+
+
+
+
+
+







    rm -f Tcl_DontCallWhenDeleted.3
    ln CallDel.3 Tcl_CallWhenDeleted.3
    ln CallDel.3 Tcl_DontCallWhenDeleted.3
fi
if test -r ChnlStack.3; then
    rm -f Tcl_StackChannel.3
    rm -f Tcl_UnstackChannel.3
    rm -f Tcl_GetStackedChannel.3
    ln ChnlStack.3 Tcl_StackChannel.3
    ln ChnlStack.3 Tcl_UnstackChannel.3
    ln ChnlStack.3 Tcl_GetStackedChannel.3
fi
if test -r CmdCmplt.3; then
    rm -f Tcl_CommandComplete.3
    ln CmdCmplt.3 Tcl_CommandComplete.3
fi
if test -r Concat.3; then
    rm -f Tcl_Concat.3
    ln Concat.3 Tcl_Concat.3
fi
if test -r CrtChannel.3; then
    rm -f Tcl_CreateChannel.3
    rm -f Tcl_GetChannelInstanceData.3
    rm -f Tcl_GetChannelType.3
    rm -f Tcl_GetChannelName.3
    rm -f Tcl_GetChannelHandle.3
    rm -f Tcl_GetChannelMode.3
    rm -f Tcl_GetChannelBufferSize.3
    rm -f Tcl_SetChannelBufferSize.3
    rm -f Tcl_NotifyChannel.3
    rm -f Tcl_BadChannelOption.3
    rm -f Tcl_ChannelName.3
    rm -f Tcl_ChannelVersion.3
    rm -f Tcl_ChannelBlockModeProc.3
    rm -f Tcl_ChannelCloseProc.3
    rm -f Tcl_ChannelClose2Proc.3
    rm -f Tcl_ChannelInputProc.3
    rm -f Tcl_ChannelOutputProc.3
    rm -f Tcl_ChannelSeekProc.3
    rm -f Tcl_ChannelSetOptionProc.3
    rm -f Tcl_ChannelGetOptionProc.3
    rm -f Tcl_ChannelWatchProc.3
    rm -f Tcl_ChannelGetHandleProc.3
    rm -f Tcl_ChannelFlushProc.3
    rm -f Tcl_ChannelHandlerProc.3
    ln CrtChannel.3 Tcl_CreateChannel.3
    ln CrtChannel.3 Tcl_GetChannelInstanceData.3
    ln CrtChannel.3 Tcl_GetChannelType.3
    ln CrtChannel.3 Tcl_GetChannelName.3
    ln CrtChannel.3 Tcl_GetChannelHandle.3
    ln CrtChannel.3 Tcl_GetChannelMode.3
    ln CrtChannel.3 Tcl_GetChannelBufferSize.3
    ln CrtChannel.3 Tcl_SetChannelBufferSize.3
    ln CrtChannel.3 Tcl_NotifyChannel.3
    ln CrtChannel.3 Tcl_BadChannelOption.3
    ln CrtChannel.3 Tcl_ChannelName.3
    ln CrtChannel.3 Tcl_ChannelVersion.3
    ln CrtChannel.3 Tcl_ChannelBlockModeProc.3
    ln CrtChannel.3 Tcl_ChannelCloseProc.3
    ln CrtChannel.3 Tcl_ChannelClose2Proc.3
    ln CrtChannel.3 Tcl_ChannelInputProc.3
    ln CrtChannel.3 Tcl_ChannelOutputProc.3
    ln CrtChannel.3 Tcl_ChannelSeekProc.3
    ln CrtChannel.3 Tcl_ChannelSetOptionProc.3
    ln CrtChannel.3 Tcl_ChannelGetOptionProc.3
    ln CrtChannel.3 Tcl_ChannelWatchProc.3
    ln CrtChannel.3 Tcl_ChannelGetHandleProc.3
    ln CrtChannel.3 Tcl_ChannelFlushProc.3
    ln CrtChannel.3 Tcl_ChannelHandlerProc.3
fi
if test -r CrtChnlHdlr.3; then
    rm -f Tcl_CreateChannelHandler.3
    rm -f Tcl_DeleteChannelHandler.3
    ln CrtChnlHdlr.3 Tcl_CreateChannelHandler.3
    ln CrtChnlHdlr.3 Tcl_DeleteChannelHandler.3
fi
243
244
245
246
247
248
249

250
251
252
253
254
255
256
257
258
259
260

261
262
263
264
265
266
267

268
269

270
271
272
273
274
275
276
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317







+











+







+


+







    rm -f Tcl_DStringAppend.3
    rm -f Tcl_DStringAppendElement.3
    rm -f Tcl_DStringStartSublist.3
    rm -f Tcl_DStringEndSublist.3
    rm -f Tcl_DStringLength.3
    rm -f Tcl_DStringValue.3
    rm -f Tcl_DStringSetLength.3
    rm -f Tcl_DStringTrunc.3
    rm -f Tcl_DStringFree.3
    rm -f Tcl_DStringResult.3
    rm -f Tcl_DStringGetResult.3
    ln DString.3 Tcl_DStringInit.3
    ln DString.3 Tcl_DStringAppend.3
    ln DString.3 Tcl_DStringAppendElement.3
    ln DString.3 Tcl_DStringStartSublist.3
    ln DString.3 Tcl_DStringEndSublist.3
    ln DString.3 Tcl_DStringLength.3
    ln DString.3 Tcl_DStringValue.3
    ln DString.3 Tcl_DStringSetLength.3
    ln DString.3 Tcl_DStringTrunc.3
    ln DString.3 Tcl_DStringFree.3
    ln DString.3 Tcl_DStringResult.3
    ln DString.3 Tcl_DStringGetResult.3
fi
if test -r DetachPids.3; then
    rm -f Tcl_DetachPids.3
    rm -f Tcl_ReapDetachedProcs.3
    rm -f Tcl_WaitPid.3
    ln DetachPids.3 Tcl_DetachPids.3
    ln DetachPids.3 Tcl_ReapDetachedProcs.3
    ln DetachPids.3 Tcl_WaitPid.3
fi
if test -r DoOneEvent.3; then
    rm -f Tcl_DoOneEvent.3
    ln DoOneEvent.3 Tcl_DoOneEvent.3
fi
if test -r DoWhenIdle.3; then
    rm -f Tcl_DoWhenIdle.3
343
344
345
346
347
348
349
350
351
352


353
354
355
356
357
358
359


360
361
362
363
364
365
366
384
385
386
387
388
389
390

391
392
393
394
395
396
397
398

399
400
401
402
403
404
405
406
407
408
409







-


+
+




-


+
+







    ln Eval.3 Tcl_GlobalEvalObj.3
    ln Eval.3 Tcl_VarEval.3
    ln Eval.3 Tcl_VarEvalVA.3
fi
if test -r Exit.3; then
    rm -f Tcl_Exit.3
    rm -f Tcl_Finalize.3
    rm -f Tcl_FinalizeThread.3
    rm -f Tcl_CreateExitHandler.3
    rm -f Tcl_DeleteExitHandler.3
    rm -f Tcl_ExitThread.3
    rm -f Tcl_FinalizeThread.3
    rm -f Tcl_CreateThreadExitHandler.3
    rm -f Tcl_DeleteThreadExitHandler.3
    ln Exit.3 Tcl_Exit.3
    ln Exit.3 Tcl_Finalize.3
    ln Exit.3 Tcl_FinalizeThread.3
    ln Exit.3 Tcl_CreateExitHandler.3
    ln Exit.3 Tcl_DeleteExitHandler.3
    ln Exit.3 Tcl_ExitThread.3
    ln Exit.3 Tcl_FinalizeThread.3
    ln Exit.3 Tcl_CreateThreadExitHandler.3
    ln Exit.3 Tcl_DeleteThreadExitHandler.3
fi
if test -r ExprLong.3; then
    rm -f Tcl_ExprLong.3
    rm -f Tcl_ExprDouble.3
    rm -f Tcl_ExprBoolean.3
394
395
396
397
398
399
400

401

402
403
404
405
406
407
408
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453







+

+







fi
if test -r GetHostName.3; then
    rm -f Tcl_GetHostName.3
    ln GetHostName.3 Tcl_GetHostName.3
fi
if test -r GetIndex.3; then
    rm -f Tcl_GetIndexFromObj.3
    rm -f Tcl_GetIndexFromObjStruct.3
    ln GetIndex.3 Tcl_GetIndexFromObj.3
    ln GetIndex.3 Tcl_GetIndexFromObjStruct.3
fi
if test -r GetInt.3; then
    rm -f Tcl_GetInt.3
    rm -f Tcl_GetDouble.3
    rm -f Tcl_GetBoolean.3
    ln GetInt.3 Tcl_GetInt.3
    ln GetInt.3 Tcl_GetDouble.3
536
537
538
539
540
541
542

543
544
545
546
547

548
549
550
551
552
553
554
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601







+





+







fi
if test -r Object.3; then
    rm -f Tcl_NewObj.3
    rm -f Tcl_DuplicateObj.3
    rm -f Tcl_IncrRefCount.3
    rm -f Tcl_DecrRefCount.3
    rm -f Tcl_IsShared.3
    rm -f Tcl_InvalidateStringRep.3
    ln Object.3 Tcl_NewObj.3
    ln Object.3 Tcl_DuplicateObj.3
    ln Object.3 Tcl_IncrRefCount.3
    ln Object.3 Tcl_DecrRefCount.3
    ln Object.3 Tcl_IsShared.3
    ln Object.3 Tcl_InvalidateStringRep.3
fi
if test -r ObjectType.3; then
    rm -f Tcl_RegisterObjType.3
    rm -f Tcl_GetObjType.3
    rm -f Tcl_AppendAllObjTypes.3
    rm -f Tcl_ConvertToType.3
    ln ObjectType.3 Tcl_RegisterObjType.3
671
672
673
674
675
676
677
678


679
680
681
682
683
684
685


686
687
688
689
690
691
692
718
719
720
721
722
723
724

725
726
727
728
729
730
731
732

733
734
735
736
737
738
739
740
741







-
+
+






-
+
+







if test -r RegExp.3; then
    rm -f Tcl_RegExpMatch.3
    rm -f Tcl_RegExpCompile.3
    rm -f Tcl_RegExpExec.3
    rm -f Tcl_RegExpRange.3
    rm -f Tcl_GetRegExpFromObj.3
    rm -f Tcl_RegExpMatchObj.3
    rm -f Tcl_GetRegExpInfo.3
    rm -f Tcl_RegExpExecObj.3
    rm -f Tcl_RegExpGetInfo.3
    ln RegExp.3 Tcl_RegExpMatch.3
    ln RegExp.3 Tcl_RegExpCompile.3
    ln RegExp.3 Tcl_RegExpExec.3
    ln RegExp.3 Tcl_RegExpRange.3
    ln RegExp.3 Tcl_GetRegExpFromObj.3
    ln RegExp.3 Tcl_RegExpMatchObj.3
    ln RegExp.3 Tcl_GetRegExpInfo.3
    ln RegExp.3 Tcl_RegExpExecObj.3
    ln RegExp.3 Tcl_RegExpGetInfo.3
fi
if test -r SaveResult.3; then
    rm -f Tcl_SaveResult.3
    rm -f Tcl_RestoreResult.3
    rm -f Tcl_DiscardResult.3
    ln SaveResult.3 Tcl_SaveResult.3
    ln SaveResult.3 Tcl_RestoreResult.3
711
712
713
714
715
716
717

718
719
720
721
722
723
724
725

726
727
728
729
730
731
732
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783







+








+







    rm -f Tcl_GetObjResult.3
    rm -f Tcl_SetResult.3
    rm -f Tcl_GetStringResult.3
    rm -f Tcl_AppendResult.3
    rm -f Tcl_AppendResultVA.3
    rm -f Tcl_AppendElement.3
    rm -f Tcl_ResetResult.3
    rm -f Tcl_FreeResult.3
    ln SetResult.3 Tcl_SetObjResult.3
    ln SetResult.3 Tcl_GetObjResult.3
    ln SetResult.3 Tcl_SetResult.3
    ln SetResult.3 Tcl_GetStringResult.3
    ln SetResult.3 Tcl_AppendResult.3
    ln SetResult.3 Tcl_AppendResultVA.3
    ln SetResult.3 Tcl_AppendElement.3
    ln SetResult.3 Tcl_ResetResult.3
    ln SetResult.3 Tcl_FreeResult.3
fi
if test -r SetVar.3; then
    rm -f Tcl_SetVar2Ex.3
    rm -f Tcl_SetVar.3
    rm -f Tcl_SetVar2.3
    rm -f Tcl_ObjSetVar2.3
    rm -f Tcl_GetVar2Ex.3
755
756
757
758
759
760
761


762
763
764
765


766
767
768
769
770
771
772
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827







+
+




+
+







    ln SourceRCFile.3 Tcl_SourceRCFile.3
fi
if test -r SplitList.3; then
    rm -f Tcl_SplitList.3
    rm -f Tcl_Merge.3
    rm -f Tcl_ScanElement.3
    rm -f Tcl_ConvertElement.3
    rm -f Tcl_ScanCountedElement.3
    rm -f Tcl_ConvertCountedElement.3
    ln SplitList.3 Tcl_SplitList.3
    ln SplitList.3 Tcl_Merge.3
    ln SplitList.3 Tcl_ScanElement.3
    ln SplitList.3 Tcl_ConvertElement.3
    ln SplitList.3 Tcl_ScanCountedElement.3
    ln SplitList.3 Tcl_ConvertCountedElement.3
fi
if test -r SplitPath.3; then
    rm -f Tcl_SplitPath.3
    rm -f Tcl_JoinPath.3
    rm -f Tcl_GetPathType.3
    ln SplitPath.3 Tcl_SplitPath.3
    ln SplitPath.3 Tcl_JoinPath.3
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
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







+
+
+
+








+







+







    ln StringObj.3 Tcl_AppendUnicodeToObj.3
    ln StringObj.3 Tcl_AppendStringsToObj.3
    ln StringObj.3 Tcl_AppendStringsToObjVA.3
    ln StringObj.3 Tcl_AppendObjToObj.3
    ln StringObj.3 Tcl_SetObjLength.3
    ln StringObj.3 Tcl_ConcatObj.3
fi
if test -r Tcl_Main.3; then
    rm -f Tcl_SetMainLoop.3
    ln Tcl_Main.3 Tcl_SetMainLoop.3
fi
if test -r Thread.3; then
    rm -f Tcl_ConditionNotify.3
    rm -f Tcl_ConditionWait.3
    rm -f Tcl_ConditionFinalize.3
    rm -f Tcl_GetThreadData.3
    rm -f Tcl_MutexLock.3
    rm -f Tcl_MutexUnlock.3
    rm -f Tcl_MutexFinalize.3
    rm -f Tcl_CreateThread.3
    ln Thread.3 Tcl_ConditionNotify.3
    ln Thread.3 Tcl_ConditionWait.3
    ln Thread.3 Tcl_ConditionFinalize.3
    ln Thread.3 Tcl_GetThreadData.3
    ln Thread.3 Tcl_MutexLock.3
    ln Thread.3 Tcl_MutexUnlock.3
    ln Thread.3 Tcl_MutexFinalize.3
    ln Thread.3 Tcl_CreateThread.3
fi
if test -r ToUpper.3; then
    rm -f Tcl_UniCharToUpper.3
    rm -f Tcl_UniCharToLower.3
    rm -f Tcl_UniCharToTitle.3
    rm -f Tcl_UtfToUpper.3
    rm -f Tcl_UtfToLower.3
907
908
909
910
911
912
913
914
915


916
917
918
919
920
921
922
968
969
970
971
972
973
974


975
976
977
978
979
980
981
982
983







-
-
+
+







    ln Utf.3 Tcl_UtfBackslash.3
fi
if test -r WrongNumArgs.3; then
    rm -f Tcl_WrongNumArgs.3
    ln WrongNumArgs.3 Tcl_WrongNumArgs.3
fi
if test -r http.n; then
    rm -f Http.n
    ln http.n Http.n
    if test "${CASEINSENSITIVEFS:-}" != "1"; then rm -f Http.n; fi
    if test "${CASEINSENSITIVEFS:-}" != "1"; then ln http.n Http.n; fi
fi
if test -r library.n; then
    rm -f auto_execok.n
    rm -f auto_import.n
    rm -f auto_load.n
    rm -f auto_mkindex.n
    rm -f auto_mkindex_old.n
953
954
955
956
957
958
959
960
961


962
963
1014
1015
1016
1017
1018
1019
1020


1021
1022
1023
1024







-
-
+
+


    ln pkgMkIndex.n pkg_mkIndex.n
fi
if test -r safe.n; then
    rm -f SafeBase.n
    ln safe.n SafeBase.n
fi
if test -r tcltest.n; then
    rm -f Tcltest.n
    ln tcltest.n Tcltest.n
    if test "${CASEINSENSITIVEFS:-}" != "1"; then rm -f Tcltest.n; fi
    if test "${CASEINSENSITIVEFS:-}" != "1"; then ln tcltest.n Tcltest.n; fi
fi
exit 0
Changes to unix/mkLinks.tcl.
26
27
28
29
30
31
32


33
34
35
36



37



38
39
40
41
42
43
44
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







+
+




+
+
+

+
+
+







    echo "Usage: mkLinks dir"
    exit 1
fi

cd $1
echo foo > xyzzyTestingAVeryLongFileName.foo
x=`echo xyzzyTe*`
echo foo > xyzzyTestingaverylongfilename.foo
y=`echo xyzzyTestingav*`
rm xyzzyTe*
if test "$x" != "xyzzyTestingAVeryLongFileName.foo"; then
    exit
fi
if test "$y" != "xyzzyTestingaverylongfilename.foo"; then
    CASEINSENSITIVEFS=1
fi
}

set case_insensitive_test { if test "${CASEINSENSITIVEFS:-}" != "1"; then} 
set case_insensitive_test_fi {; fi} 

foreach file $argv {
    set in [open $file]
    set tail [file tail $file]
    set ext [file extension $file]
    set state begin
    while {[gets $in line] >= 0} {
52
53
54
55
56
57
58







59
60
61


62
63
64
65
66
67
68
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74


75
76
77
78
79
80
81
82
83







+
+
+
+
+
+
+

-
-
+
+







		regsub {\\-.*} $line {} line
		set rmOutput ""
		set lnOutput ""
		set namelist {}
		foreach name [split $line ,] {
		    regsub -all {(\\)? } $name "" name
		    if {![string match $name*$ext $tail]} {
		    	if {[string match -nocase $name*$ext $tail]} {
			   set tst $case_insensitive_test 
			   set tstfi $case_insensitive_test_fi 
		    	} else {
			   set tst ""
			   set tstfi ""
		    	}
			lappend namelist $name$ext
			append rmOutput "    rm -f $name$ext\n"
			append lnOutput "    ln $tail $name$ext\n"
			append rmOutput "   $tst rm -f $name$ext$tstfi\n"
			append lnOutput "   $tst ln $tail $name$ext$tstfi\n"
		    }
		}
		if { [llength $namelist] } {
		    puts "if test -r $tail; then"
		    puts -nonewline $rmOutput
		    puts -nonewline $lnOutput
		    puts "fi"
Changes to unix/tcl.m4.
27
28
29
30
31
32
33
34

35
36
37
38
39
40
41
27
28
29
30
31
32
33

34
35
36
37
38
39
40
41







-
+







    if test x"${no_tcl}" = x ; then
	# we reset no_tcl in case something fails here
	no_tcl=true
	AC_ARG_WITH(tcl, [  --with-tcl              directory containing tcl configuration (tclConfig.sh)], with_tclconfig=${withval})
	AC_MSG_CHECKING([for Tcl configuration])
	AC_CACHE_VAL(ac_cv_c_tclconfig,[

	    # First check to see if --with-tclconfig was specified.
	    # First check to see if --with-tcl was specified.
	    if test x"${with_tclconfig}" != x ; then
		if test -f "${with_tclconfig}/tclConfig.sh" ; then
		    ac_cv_c_tclconfig=`(cd ${with_tclconfig}; pwd)`
		else
		    AC_MSG_ERROR([${with_tclconfig} directory doesn't contain tclConfig.sh])
		fi
	    fi
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
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







-
-
+
+
+
+
+








-
+







			break
		    fi
		done
	    fi

	    # check in a few common install locations
	    if test x"${ac_cv_c_tclconfig}" = x ; then
		for i in `ls -d ${prefix}/lib 2>/dev/null` \
			`ls -d /usr/local/lib 2>/dev/null` ; do
		for i in `ls -d ${exec_prefix}/lib 2>/dev/null` \
			`ls -d /usr/local/lib 2>/dev/null` \
			`ls -d /usr/contrib/lib 2>/dev/null` \
			`ls -d /usr/lib 2>/dev/null` \
			; do
		    if test -f "$i/tclConfig.sh" ; then
			ac_cv_c_tclconfig=`(cd $i; pwd)`
			break
		    fi
		done
	    fi

	    # check in a few other private locations
	    if test x"${ac_cv_c_tcliconfig}" = x ; then
	    if test x"${ac_cv_c_tclconfig}" = x ; then
		for i in \
			${srcdir}/../tcl \
			`ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do
		    if test -f "$i/unix/tclConfig.sh" ; then
		    ac_cv_c_tclconfig=`(cd $i/unix; pwd)`
		    break
		fi
146
147
148
149
150
151
152
153
154





155
156
157
158
159
160
161
149
150
151
152
153
154
155


156
157
158
159
160
161
162
163
164
165
166
167







-
-
+
+
+
+
+







			ac_cv_c_tkconfig=`(cd $i/unix; pwd)`
			break
		    fi
		done
	    fi
	    # check in a few common install locations
	    if test x"${ac_cv_c_tkconfig}" = x ; then
		for i in `ls -d ${prefix}/lib 2>/dev/null` \
			`ls -d /usr/local/lib 2>/dev/null` ; do
		for i in `ls -d ${exec_prefix}/lib 2>/dev/null` \
			`ls -d /usr/local/lib 2>/dev/null` \
			`ls -d /usr/contrib/lib 2>/dev/null` \
			`ls -d /usr/lib 2>/dev/null` \
			; do
		    if test -f "$i/tkConfig.sh" ; then
			ac_cv_c_tkconfig=`(cd $i; pwd)`
			break
		    fi
		done
	    fi
	    # check in a few other private locations
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
244
245

246
247
248

249
250
251
252
253
254
255
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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277

278
279
280

281
282
283
284
285
286
287
288







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-


-
-
+
+
+

+
+
+
+
+


+

+
+
+
+
+
+



















-
+


-
+







        AC_MSG_RESULT([loading])
	. $TCL_BIN_DIR/tclConfig.sh
    else
        AC_MSG_RESULT([file not found])
    fi

    #
    # If the TCL_BIN_DIR is the build directory (not the install directory),
    # then set the common variable name to the value of the build variables.
    # For example, the variable TCL_LIB_SPEC will be set to the value
    # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC
    # instead of TCL_BUILD_LIB_SPEC since it will work with both an
    # installed and uninstalled version of Tcl.
    #

    if test -f $TCL_BIN_DIR/Makefile ; then
        TCL_LIB_SPEC=${TCL_BUILD_LIB_SPEC}
        TCL_STUB_LIB_SPEC=${TCL_BUILD_STUB_LIB_SPEC}
        TCL_STUB_LIB_PATH=${TCL_BUILD_STUB_LIB_PATH}
    fi

    #
    # The eval is required to do the TCL_DBGX substitution in the
    # eval is required to do the TCL_DBGX substitution
    # TCL_LIB_FILE variable
    #

    eval TCL_LIB_FILE=${TCL_LIB_FILE}
    eval TCL_LIB_FLAG=${TCL_LIB_FLAG}
    eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\""
    eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\""
    eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\""

    eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\""
    eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\""
    eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\""

    AC_SUBST(TCL_VERSION)
    AC_SUBST(TCL_BIN_DIR)
    AC_SUBST(TCL_SRC_DIR)

    AC_SUBST(TCL_LIB_FILE)
    AC_SUBST(TCL_LIB_FLAG)
    AC_SUBST(TCL_LIB_SPEC)

    AC_SUBST(TCL_STUB_LIB_FILE)
    AC_SUBST(TCL_STUB_LIB_FLAG)
    AC_SUBST(TCL_STUB_LIB_SPEC)
])

#------------------------------------------------------------------------
# SC_LOAD_TKCONFIG --
#
#	Load the tkConfig.sh file
#
# Arguments:
#	
#	Requires the following vars to be set:
#		TK_BIN_DIR
#
# Results:
#
#	Sets the following vars that should be in tkConfig.sh:
#		TK_BIN_DIR
#------------------------------------------------------------------------

AC_DEFUN(SC_LOAD_TKCONFIG, [
    AC_MSG_CHECKING([for existence of $TCLCONFIG])
    AC_MSG_CHECKING([for existence of $TK_BIN_DIR/tkConfig.sh])

    if test -f "$TK_BIN_DIR/tkConfig.sh" ; then
        AC_MSG_CHECKING([loading $TK_BIN_DIR/tkConfig.sh])
	AC_MSG_RESULT([loading])
	. $TK_BIN_DIR/tkConfig.sh
    else
        AC_MSG_RESULT([could not find $TK_BIN_DIR/tkConfig.sh])
    fi

    AC_SUBST(TK_BIN_DIR)
    AC_SUBST(TK_SRC_DIR)
277
278
279
280
281
282
283





284
285
286
287
288
289
290
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328







+
+
+
+
+







    AC_ARG_ENABLE(gcc, [  --enable-gcc            allow use of gcc if available [--disable-gcc]],
	[ok=$enableval], [ok=no])
    if test "$ok" = "yes"; then
	CC=gcc
	AC_PROG_CC
    else
	CC=${CC-cc}
    fi
    # Extra check to ensure that we double-check if we are running
    # gcc, even though it may not be clear.
    if test "$GCC" != "yes" -a `$CC -v 2>&1 | grep -c gcc` != "0" ; then
	GCC=yes
    fi
])

#------------------------------------------------------------------------
# SC_ENABLE_SHARED --
#
#	Allows the building of shared libraries
343
344
345
346
347
348
349

350
351
352
353
354
355
356
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395







+







#
#	Sets the following vars:
#		THREADS_LIBS	Thread library(s)
#
#	Defines the following vars:
#		TCL_THREADS
#		_REENTRANT
#		_THREAD_SAFE
#
#------------------------------------------------------------------------

AC_DEFUN(SC_ENABLE_THREADS, [
    AC_MSG_CHECKING(for building with threads)
    AC_ARG_ENABLE(threads, [  --enable-threads        build with threads],
	[tcl_ok=$enableval], [tcl_ok=no])
390
391
392
393
394
395
396
397

398

399
400
401
402
403
404
405
406
407
408
409

410
411
412
413
414
415
416
417
418
419
420
421
422
423
424




425
426
427
428
429
430
431

432
433
434


435
436
437
438
439


440
441
442
443
444
445
446
429
430
431
432
433
434
435

436
437
438
439
440
441
442
443
444
445
446
447
448

449
450
451
452
453
454
455
456
457
458
459
460




461
462
463
464
465
466
467
468
469
470
471
472
473


474
475
476
477
478


479
480
481
482
483
484
485
486
487







-
+

+










-
+











-
-
-
-
+
+
+
+







+

-
-
+
+



-
-
+
+








	# Does the pthread-implementation provide
	# 'pthread_attr_setstacksize' ?

	AC_CHECK_FUNCS(pthread_attr_setstacksize)
    else
	TCL_THREADS=0
	AC_MSG_RESULT(no (default))
	AC_MSG_RESULT([no (default)])
    fi
    AC_SUBST(TCL_THREADS)
])

#------------------------------------------------------------------------
# SC_ENABLE_SYMBOLS --
#
#	Specify if debugging symbols should be used
#
# Arguments:
#	none
#	
#	Requires the following vars to be set:
#	Requires the following vars to be set in the Makefile:
#		CFLAGS_DEBUG
#		CFLAGS_OPTIMIZE
#		LDFLAGS_DEBUG
#		LDFLAGS_OPTIMIZE
#	
# Results:
#
#	Adds the following arguments to configure:
#		--enable-symbols
#
#	Defines the following vars:
#		CFLAGS_DEFAULT	Sets to CFLAGS_DEBUG if true
#				Sets to CFLAGS_OPTIMIZE if false
#		LDFLAGS_DEFAULT	Sets to LDFLAGS_DEBUG if true
#				Sets to LDFLAGS_OPTIMIZE if false
#		CFLAGS_DEFAULT	Sets to $(CFLAGS_DEBUG) if true
#				Sets to $(CFLAGS_OPTIMIZE) if false
#		LDFLAGS_DEFAULT Sets to $(LDFLAGS_DEBUG) if true
#				Sets to $(LDFLAGS_OPTIMIZE) if false
#		DBGX		Debug library extension
#
#------------------------------------------------------------------------

AC_DEFUN(SC_ENABLE_SYMBOLS, [
    AC_MSG_CHECKING([for build with symbols])
    AC_ARG_ENABLE(symbols, [  --enable-symbols        build with debugging symbols [--disable-symbols]],    [tcl_ok=$enableval], [tcl_ok=no])
# FIXME: Currently, LDFLAGS_DEFAULT is not used, it should work like CFLAGS_DEFAULT.
    if test "$tcl_ok" = "yes"; then
	CFLAGS_DEFAULT="${CFLAGS_DEBUG}"
	LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}"
	CFLAGS_DEFAULT='$(CFLAGS_DEBUG)'
	LDFLAGS_DEFAULT='$(LDFLAGS_DEBUG)'
	DBGX=g
	AC_MSG_RESULT([yes])
    else
	CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE}"
	LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}"
	CFLAGS_DEFAULT='$(CFLAGS_OPTIMIZE)'
	LDFLAGS_DEFAULT='$(LDFLAGS_OPTIMIZE)'
	DBGX=""
	AC_MSG_RESULT([no])
    fi
])

#--------------------------------------------------------------------
# SC_CONFIG_CFLAGS
465
466
467
468
469
470
471


472
473
474
475
476
477
478
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521







+
+







#       LD_SEARCH_FLAGS-Flags to pass to ld, such as "-R /usr/local/tcl/lib",
#                       that tell the run-time dynamic linker where to look
#                       for shared libraries such as libtcl.so.  Depends on
#                       the variable LIB_RUNTIME_DIR in the Makefile.
#       MAKE_LIB -      Command to execute to build the Tcl library;
#                       differs depending on whether or not Tcl is being
#                       compiled as a shared library.
#	STLIB_LD -	Base command to use for combining object files
#			into a static library.
#       SHLIB_CFLAGS -  Flags to pass to cc when compiling the components
#                       of a shared library (may request position-independent
#                       code, among other things).
#       SHLIB_LD -      Base command to use for combining object files
#                       into a shared library.
#       SHLIB_LD_LIBS - Dependent libraries for the linker to scan when
#                       creating shared libraries.  This symbol typically
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
553
554
555
556
557
558
559

560
561
562
563
564
565
566







-







#                       The name of the built export / import file which
#                       should be used to link to the Tcl shared library.
#                       Empty if Tcl is unshared.
#	CFLAGS_DEBUG -
#			Flags used when running the compiler in debug mode
#	CFLAGS_OPTIMIZE -
#			Flags used when running the compiler in optimize mode
#
#	EXTRA_CFLAGS
#
#	Subst's the following vars:
#		DL_LIBS
#		CFLAGS_DEBUG
#		CFLAGS_OPTIMIZE
#--------------------------------------------------------------------
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606

607
608
609
610
611
612
613



614

615







































616
617


618
619
620
621
622
623

624
625

626
627
628
629
630
631
632
633
634
635
636
637
638





639
640
641


















642
643

644
645
646
647
648
649
650








651
652
653


654
655
656
657
658
659
660
615
616
617
618
619
620
621









622
623
624
625
626
627
628
629

630
631
632
633
634
635
636
637

638
639
640
641
642
643
644
645
646
647
648

649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689


690
691
692
693
694
695
696
697
698
699

700
701
702
703
704
705
706
707
708





709
710
711
712
713



714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732

733







734
735
736
737
738
739
740
741



742
743
744
745
746
747
748
749
750







-
-
-
-
-
-
-
-
-








-








-
+







+
+
+
-
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+






+

-
+








-
-
-
-
-
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
+
+







	    if test "`uname -s`" = "AIX" ; then
		system=AIX-`uname -v`.`uname -r`
	    fi
	    AC_MSG_RESULT($system)
	fi
    fi

    AC_MSG_CHECKING([if gcc is being used])
    if test "$CC" = "gcc" -o `$CC -v 2>&1 | grep -c gcc` != "0" ; then
	using_gcc="yes"
    else
	using_gcc="no"
    fi

    AC_MSG_RESULT([$using_gcc ($CC)])

    # Step 2: check for existence of -ldl library.  This is needed because
    # Linux can use either -ldl or -ldld for dynamic loading.

    AC_CHECK_LIB(dl, dlopen, have_dl=yes, have_dl=no)

    # Step 3: set configuration options based on system name and version.

    do64bit_ok=no
    fullSrcDir=`cd $srcdir; pwd`
    EXTRA_CFLAGS=""
    TCL_EXPORT_FILE_SUFFIX=""
    UNSHARED_LIB_SUFFIX=""
    TCL_TRIM_DOTS='`echo ${VERSION} | tr -d .`'
    ECHO_VERSION='`echo ${VERSION}`'
    TCL_LIB_VERSIONS_OK=ok
    CFLAGS_DEBUG=-g
    CFLAGS_OPTIMIZE=-O
    if test "$using_gcc" = "yes" ; then
    if test "$GCC" = "yes" ; then
	CFLAGS_WARNING="-Wall -Wconversion -Wno-implicit-int"
    else
	CFLAGS_WARNING=""
    fi
    TCL_NEEDS_EXP_FILE=0
    TCL_BUILD_EXP_FILE=""
    TCL_EXP_FILE=""
dnl FIXME: Replace AC_CHECK_PROG with AC_CHECK_TOOL once cross compiling is fixed.
dnl AC_CHECK_TOOL(AR, ar, :)
    AC_CHECK_PROG(AR, ar, ar)
    STLIB_LD="ar cr"
    STLIB_LD='${AR} cr'
    case $system in
	AIX-5.*)
	    if test "${TCL_THREADS}" = "1" -a "$GCC" != "yes" ; then
		# AIX requires the _r compiler when gcc isn't being used
		if test "${CC}" != "cc_r" ; then
		    CC=${CC}_r
		fi
		AC_MSG_RESULT(Using $CC for compiling with threads)
	    fi
	    LIBS="$LIBS -lc"
	    # AIX-5 uses ELF style dynamic libraries
	    SHLIB_CFLAGS=""
	    SHLIB_LD="/usr/ccs/bin/ld -G -z text"

	    # Note: need the LIBS below, otherwise Tk won't find Tcl's
	    # symbols when dynamically loaded into tclsh.

	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    # AIX-5 has dl* in libc.so
	    DL_LIBS=""
	    LDFLAGS=""
	    if test "$GCC" = "yes" ; then
		LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
	    else
		LD_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}'
	    fi

	    # Check to enable 64-bit flags for compiler/linker
	    if test "$do64bit" = "yes" ; then
		if test "$GCC" = "yes" ; then
		    AC_MSG_WARN("64bit mode not supported with GCC on $system")
		else
		    do64bit_ok=yes
		    EXTRA_CFLAGS="-q64"
		    LDFLAGS="-q64"
		fi
	    fi
	    ;;
	AIX-4.[[2-9]])
	    if test "${TCL_THREADS}" = "1" -a "$using_gcc" = "no" ; then
	AIX-*)
	    if test "${TCL_THREADS}" = "1" -a "$GCC" != "yes" ; then
		# AIX requires the _r compiler when gcc isn't being used
		if test "${CC}" != "cc_r" ; then
		    CC=${CC}_r
		fi
		AC_MSG_RESULT(Using $CC for compiling with threads)
	    fi
	    LIBS="$LIBS -lc"
	    SHLIB_CFLAGS=""
	    SHLIB_LD="$fullSrcDir/ldAix /bin/ld -bhalt:4 -bM:SRE -bE:lib.exp -H512 -T512 -bnoentry"
	    SHLIB_LD="${TCL_SRC_DIR}/unix/ldAix /bin/ld -bhalt:4 -bM:SRE -bE:lib.exp -H512 -T512 -bnoentry"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS="-ldl"
	    LDFLAGS=""
	    LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
	    TCL_NEEDS_EXP_FILE=1
	    TCL_EXPORT_FILE_SUFFIX='${VERSION}\$\{DBGX\}.exp'
	    ;;
	AIX-*)
	    if test "${TCL_THREADS}" = "1" -a "$using_gcc" = "no" ; then
		# AIX requires the _r compiler when gcc isn't being used
		if test "${CC}" != "cc_r" ; then

	    # AIX v<=4.1 has some different flags than 4.2+
	    if test "$system" = "AIX-4.1" -o "`uname -v`" -lt "4" ; then
		LIBOBJS="$LIBOBJS tclLoadAix.o"
		DL_LIBS="-lld"
		    CC=${CC}_r
		fi
		AC_MSG_RESULT(Using $CC for compiling with threads)
	    fi

	    # On AIX <=v4 systems, libbsd.a has to be linked in to support
	    # non-blocking file IO.  This library has to be linked in after
	    # the MATH_LIBS or it breaks the pow() function.  The way to
	    # insure proper sequencing, is to add it to the tail of MATH_LIBS.
	    # This library also supplies gettimeofday.
	    #
	    # AIX does not have a timezone field in struct tm. When the AIX
	    # bsd library is used, the timezone global and the gettimeofday
	    # methods are to be avoided for timezone deduction instead, we
	    # deduce the timezone by comparing the localtime result on a
	    # known GMT value.

	    AC_CHECK_LIB(bsd, gettimeofday, libbsd=yes, libbsd=no)
	    if test $libbsd = yes; then
	    	MATH_LIBS="$MATH_LIBS -lbsd"
	    	AC_DEFINE(USE_DELTA_FOR_TZ)
	    fi
	    SHLIB_CFLAGS=""

	    SHLIB_LD="$fullSrcDir/ldAix /bin/ld -bhalt:4 -bM:SRE -bE:lib.exp -H512 -T512 -bnoentry"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    LIBOBJS="$LIBOBJS tclLoadAix.o"
	    DL_LIBS="-lld"
	    LDFLAGS=""
	    # Check to enable 64-bit flags for compiler/linker
	    if test "$do64bit" = "yes" ; then
		if test "$GCC" = "yes" ; then
		    AC_MSG_WARN("64bit mode not supported with GCC on $system")
		else 
		    do64bit_ok=yes
		    EXTRA_CFLAGS="-q64"
		    LDFLAGS="-q64"
	    LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
	    TCL_NEEDS_EXP_FILE=1
	    TCL_EXPORT_FILE_SUFFIX='${VERSION}\$\{DBGX\}.exp'
		fi
	    fi
	    ;;
	BSD/OS-2.1*|BSD/OS-3*)
	    SHLIB_CFLAGS=""
	    SHLIB_LD="shlicc -r"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
678
679
680
681
682
683
684



























685

686
687
688
689
690
691
692
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+







	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS="-ldl"
	    LDFLAGS=""
	    LD_SEARCH_FLAGS=""
	    ;;
	HP-UX-*.11.*)
	    # Use updated header definitions where possible
	    AC_DEFINE(_XOPEN_SOURCE_EXTENDED)

	    SHLIB_SUFFIX=".sl"
	    AC_CHECK_LIB(dld, shl_load, tcl_ok=yes, tcl_ok=no)
	    if test "$tcl_ok" = yes; then
		SHLIB_CFLAGS="+z"
		SHLIB_LD="ld -b"
		SHLIB_LD_LIBS='${LIBS}'
		DL_OBJS="tclLoadShl.o"
		DL_LIBS="-ldld"
		LDFLAGS="-Wl,-E"
		LD_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.'
	    fi

	    # Check to enable 64-bit flags for compiler/linker
	    if test "$do64bit" = "yes" ; then
		if test "$GCC" = "yes" ; then
		    AC_MSG_WARN("64bit mode not supported with GCC on $system")
		else 
		    do64bit_ok=yes
		    EXTRA_CFLAGS="+DA2.0W"
		    LDFLAGS="+DA2.0W $LDFLAGS"
		fi
	    fi
	    ;;
	HP-UX-*.08.*|HP-UX-*.09.*|HP-UX-*.10.*|HP-UX-*.11.*)
	HP-UX-*.08.*|HP-UX-*.09.*|HP-UX-*.10.*)
	    SHLIB_SUFFIX=".sl"
	    AC_CHECK_LIB(dld, shl_load, tcl_ok=yes, tcl_ok=no)
	    if test "$tcl_ok" = yes; then
		SHLIB_CFLAGS="+z"
		SHLIB_LD="ld -b"
		SHLIB_LD_LIBS=""
		DL_OBJS="tclLoadShl.o"
702
703
704
705
706
707
708











709

710
711
712
713
714
715
716
717

718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735

736
737
738
739
740
741
742
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







+
+
+
+
+
+
+
+
+
+
+
-
+







-
+

















-
+







	    SHLIB_LD_LIBS='${LIBS}'
	    DL_OBJS="tclLoadAout.o"
	    DL_LIBS=""
	    LDFLAGS="-Wl,-D,08000000"
	    LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
	    SHARED_LIB_SUFFIX='${VERSION}\$\{DBGX\}.a'
	    ;;
	IRIX-5.*)
	    SHLIB_CFLAGS=""
	    SHLIB_LD="ld -shared -rdata_shared"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS=""
	    LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
	    EXTRA_CFLAGS=""
	    LDFLAGS=""
	    ;;
	IRIX-5.*|IRIX-6.*|IRIX64-6.5*)
	IRIX-6.*|IRIX64-6.5*)
	    SHLIB_CFLAGS=""
	    SHLIB_LD="ld -n32 -shared -rdata_shared"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS=""
	    LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
	    if test "$using_gcc" = "yes" ; then
	    if test "$GCC" = "yes" ; then
		EXTRA_CFLAGS="-mabi=n32"
		LDFLAGS="-mabi=n32"
	    else
		case $system in
		    IRIX-6.3)
			# Use to build 6.2 compatible binaries on 6.3.
			EXTRA_CFLAGS="-n32 -D_OLD_TERMIOS"
			;;
		    *)
			EXTRA_CFLAGS="-n32"
			;;
		esac
		LDFLAGS="-n32"
	    fi
	    ;;
	IRIX64-6.*)
	    SHLIB_CFLAGS=""
	    SHLIB_LD="ld -32 -shared -rdata_shared"
	    SHLIB_LD="ld -n32 -shared -rdata_shared"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS=""
	    LDFLAGS=""
	    LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
	    ;;
757
758
759
760
761
762
763



































764
765
766
767
768
769
770
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







		DL_LIBS="-ldl"
		LDFLAGS="-rdynamic"
		LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
	    else
		AC_CHECK_HEADER(dld.h, [
		    SHLIB_LD="ld -shared"
		    DL_OBJS="tclLoadDld.o"
		    DL_LIBS="-ldld"
		    LDFLAGS=""
		    LD_SEARCH_FLAGS=""])
	    fi
	    if test "`uname -m`" = "alpha" ; then
		EXTRA_CFLAGS="-mieee"
	    fi

            # The combo of gcc + glibc has a bug related
            # to inlining of functions like strtod(). The
            # -fno-builtin flag should address this problem
            # but it does not work. The -fno-inline flag
            # is kind of overkill but it works.
            # Disable inlining only when one of the
            # files in compat/*.c is being linked in.
            if test x"${LIBOBJS}" != x ; then
                EXTRA_CFLAGS="${EXTRA_CFLAGS} -fno-inline"
            fi

	    ;;
	GNU*)
	    SHLIB_CFLAGS="-fPIC"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"

	    if test "$have_dl" = yes; then
		SHLIB_LD="${CC} -shared"
		DL_OBJS=""
		DL_LIBS="-ldl"
		LDFLAGS="-rdynamic"
		LD_SEARCH_FLAGS=""
	    else
		AC_CHECK_HEADER(dld.h, [
		    SHLIB_LD="ld -shared"
		    DL_OBJS=""
		    DL_LIBS="-ldld"
		    LDFLAGS=""
		    LD_SEARCH_FLAGS=""])
	    fi
	    if test "`uname -m`" = "alpha" ; then
		EXTRA_CFLAGS="-mieee"
	    fi
829
830
831
832
833
834
835
836

837
838
839
840























841


842
843
844
845
846
847
848
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







-
+




+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+







	    UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.a'
	    TCL_LIB_VERSIONS_OK=nodots
	    ;;
	FreeBSD-*)
	    # FreeBSD 3.* and greater have ELF.
	    SHLIB_CFLAGS="-fPIC"
	    SHLIB_LD="ld -Bshareable -x"
	    SHLIB_LD_LIBS=""
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS=""
	    LDFLAGS="-export-dynamic"
	    LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
	    if test "${TCL_THREADS}" = "1" ; then
		EXTRA_CFLAGS="-pthread"
	    	LDFLAGS="$LDFLAGS -pthread"
	    fi
	    case $system in
	    FreeBSD-3.*)
	    	# FreeBSD-3 doesn't handle version numbers with dots.
	    	UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.a'
	    	SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so'
	    	TCL_LIB_VERSIONS_OK=nodots
		;;
	    esac
	    ;;
	Rhapsody-*|Darwin-*)
	    SHLIB_CFLAGS="-fno-common"
	    SHLIB_LD="cc -dynamiclib \${LDFLAGS}"
	    TCL_SHLIB_LD_EXTRAS="-compatibility_version ${TCL_MAJOR_VERSION} -current_version \${VERSION} -install_name \${LIB_RUNTIME_DIR}/\${TCL_LIB_FILE} -prebind -seg1addr a000000"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".dylib"
	    DL_OBJS="tclLoadDyld.o"
	    DL_LIBS=""
	    LDFLAGS="-prebind"
	    LD_SEARCH_FLAGS=""
	    CFLAGS_OPTIMIZE="-O3"
	    EXTRA_CFLAGS="-arch ppc -pipe"
	    ;;
	NEXTSTEP-*)
	    SHLIB_CFLAGS=""
	    SHLIB_LD="cc -nostdlib -r"
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadNext.o"
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
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







-
+




-
+
-
-
+
-
-
-
+
+

+
+
+




+
+
+
+
+
+
+
+
+
+
+
+
+














-
+







	    SHLIB_LD='ld -shared -expect_unresolved "*"'
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS=""
	    LDFLAGS=""
	    LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
	    if test "$using_gcc" = "no" ; then
	    if test "$GCC" != "yes" ; then
		EXTRA_CFLAGS="-DHAVE_TZSET -std1"
	    fi
	    # see pthread_intro(3) for pthread support on osf1, k.furukawa
	    if test "${TCL_THREADS}" = "1" ; then
		EXTRA_CFLAGS="${EXTRA_CFLAGS} -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64"
		EXTRA_CFLAGS="${EXTRA_CFLAGS} -DHAVE_PTHREAD_ATTR_SETSTACKSIZE"
		if test "$using_gcc" = "no" ; then
		    EXTRA_CFLAGS="${EXTRA_CFLAGS} -pthread"
		EXTRA_CFLAGS="${EXTRA_CFLAGS} -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64"
		    LDFLAGS="-pthread"
		else
		    LIBS=`echo $LIBS | sed s/-lpthreads//`
		LIBS=`echo $LIBS | sed s/-lpthreads//`
		if test "$GCC" = "yes" ; then
		    LIBS="$LIBS -lpthread -lmach -lexc"
		else
		    EXTRA_CFLAGS="${EXTRA_CFLAGS} -pthread"
		    LDFLAGS="-pthread"
		fi
	    fi

	    ;;
	QNX-6*)
	    # QNX RTP
	    # This may work for all QNX, but it was only reported for v6.
	    SHLIB_CFLAGS="-fPIC"
	    SHLIB_LD="ld -Bshareable -x"
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    # dlopen is in -lc on QNX
	    DL_LIBS=""
	    LDFLAGS=""
	    LD_SEARCH_FLAGS=""
	    ;;
	RISCos-*)
	    SHLIB_CFLAGS="-G 0"
	    SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r -G 0"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".a"
	    DL_OBJS="tclLoadAout.o"
	    DL_LIBS=""
	    LDFLAGS="-Wl,-D,08000000"
	    LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
	    ;;
	SCO_SV-3.2*)
	    # Note, dlopen is available only on SCO 3.2.5 and greater. However,
	    # this test works, since "uname -s" was non-standard in 3.2.4 and
	    # below.
	    if test "$using_gcc" = "yes" ; then
	    if test "$GCC" = "yes" ; then
	    	SHLIB_CFLAGS="-fPIC -melf"
	    	LDFLAGS="-melf -Wl,-Bexport"
	    else
	    	SHLIB_CFLAGS="-Kpic -belf"
	    	LDFLAGS="-belf -Wl,-Bexport"
	    fi
	    SHLIB_LD="ld -G"
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
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







+
+
+
+
+
+
+











+
-
+
+
+
+


+
+
+
+
+
+
+




-
+



-
+
+
+








-
-













-
+














-
+







	    # So, the library has to have a name like libtcl75.so.1.0

	    SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so.1.0'
	    UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.a'
	    TCL_LIB_VERSIONS_OK=nodots
	    ;;
	SunOS-5.[[0-6]]*)

	    # Note: If _REENTRANT isn't defined, then Solaris
	    # won't define thread-safe library routines.

	    AC_DEFINE(_REENTRANT)
	    AC_DEFINE(_POSIX_PTHREAD_SEMANTICS)

	    SHLIB_CFLAGS="-KPIC"
	    SHLIB_LD="/usr/ccs/bin/ld -G -z text"

	    # Note: need the LIBS below, otherwise Tk won't find Tcl's
	    # symbols when dynamically loaded into tclsh.

	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS="-ldl"
	    LDFLAGS=""
	    if test "$GCC" = "yes" ; then
	    LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
		LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
	    else
		LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}'
	    fi
	    ;;
	SunOS-5*)

	    # Note: If _REENTRANT isn't defined, then Solaris
	    # won't define thread-safe library routines.

	    AC_DEFINE(_REENTRANT)
	    AC_DEFINE(_POSIX_PTHREAD_SEMANTICS)

	    SHLIB_CFLAGS="-KPIC"
	    SHLIB_LD="/usr/ccs/bin/ld -G -z text"
	    LDFLAGS=""
    
	    do64bit_ok=no
	    # Check to enable 64-bit flags for compiler/linker
	    if test "$do64bit" = "yes" ; then
		arch=`isainfo`
		if test "$arch" = "sparcv9 sparc" ; then
			if test "$using_gcc" = "no" ; then
			if test "$GCC" = "yes" ; then
			    AC_MSG_WARN("64bit mode not supported with GCC on $system")
			else
			    do64bit_ok=yes
			    if test "$do64bitVIS" = "yes" ; then
				EXTRA_CFLAGS="-xarch=v9a"
			    	LDFLAGS="-xarch=v9a"
			    else
				EXTRA_CFLAGS="-xarch=v9"
			    	LDFLAGS="-xarch=v9"
			    fi
			else 
			    AC_MSG_WARN("64bit mode not supported with GCC on $system")
			fi
		else
		    AC_MSG_WARN("64bit mode only supported sparcv9 system")
		fi
	    fi
	    
	    # Note: need the LIBS below, otherwise Tk won't find Tcl's
	    # symbols when dynamically loaded into tclsh.

	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS="-ldl"
	    if test "$using_gcc" = "yes" ; then
	    if test "$GCC" = "yes" ; then
		LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
	    else
		LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}'
	    fi
	    ;;
	ULTRIX-4.*)
	    SHLIB_CFLAGS="-G 0"
	    SHLIB_SUFFIX=".a"
	    SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r -G 0"
	    SHLIB_LD_LIBS='${LIBS}'
	    DL_OBJS="tclLoadAout.o"
	    DL_LIBS=""
	    LDFLAGS="-Wl,-D,08000000"
	    LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
	    if test "$using_gcc" = "no" ; then
	    if test "$GCC" != "yes" ; then
		EXTRA_CFLAGS="-DHAVE_TZSET -std1"
	    fi
	    ;;
	UNIX_SV* | UnixWare-5*)
	    SHLIB_CFLAGS="-KPIC"
	    SHLIB_LD="cc -G"
	    SHLIB_LD_LIBS=""
1155
1156
1157
1158
1159
1160
1161
1162

1163
1164
1165
1166
1167
1168
1169
1170


1171
1172
1173
1174
1175
1176
1177
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







-
+








+
+







    fi

    # If we're running gcc, then change the C flags for compiling shared
    # libraries to the right flags for gcc, instead of those for the
    # standard manufacturer compiler.

    if test "$DL_OBJS" != "tclLoadNone.o" ; then
	if test "$using_gcc" = "yes" ; then
	if test "$GCC" = "yes" ; then
	    case $system in
		AIX-*)
		    ;;
		BSD/OS*)
		    ;;
		IRIX*)
		    ;;
		NetBSD-*|FreeBSD-*|OpenBSD-*)
		    ;;
		Rhapsody-*|Darwin-*)
		    ;;
		RISCos-*)
		    ;;
		SCO_SV-3.2*)
		    ;;
		ULTRIX-4.*)
		    ;;
1259
1260
1261
1262
1263
1264
1265

1266
1267



























































1268
1269
1270
1271
1272
1273
1274
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







+


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







    if (ioctl(0, TIOCGETP, &t) == 0) {
	t.sg_ospeed = 0;
	t.sg_flags |= ODDP | EVENP | RAW;
	return 0;
    }
    return 1;
}], tk_ok=sgtty, tk_ok=none, tk_ok=none)

    if test $tk_ok = sgtty; then
	AC_DEFINE(USE_SGTTY)
    else
	AC_TRY_RUN([
#include <termios.h>
#include <errno.h>

main()
{
    struct termios t;
    if (tcgetattr(0, &t) == 0
	|| errno == ENOTTY || errno == ENXIO || errno == EINVAL) {
	cfsetospeed(&t, 0);
	t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB;
	return 0;
    }
    return 1;
}], tk_ok=termios, tk_ok=no, tk_ok=no)

    if test $tk_ok = termios; then
	AC_DEFINE(USE_TERMIOS)
    else
	AC_TRY_RUN([
#include <termio.h>
#include <errno.h>

main()
{
    struct termio t;
    if (ioctl(0, TCGETA, &t) == 0
	|| errno == ENOTTY || errno == ENXIO || errno == EINVAL) {
	t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB;
	return 0;
    }
    return 1;
    }], tk_ok=termio, tk_ok=no, tk_ok=no)

    if test $tk_ok = termio; then
	AC_DEFINE(USE_TERMIO)
    else
	AC_TRY_RUN([
#include <sgtty.h>
#include <errno.h>

main()
{
    struct sgttyb t;
    if (ioctl(0, TIOCGETP, &t) == 0
	|| errno == ENOTTY || errno == ENXIO || errno == EINVAL) {
	t.sg_ospeed = 0;
	t.sg_flags |= ODDP | EVENP | RAW;
	return 0;
    }
    return 1;
}], tk_ok=sgtty, tk_ok=none, tk_ok=none)

    if test $tk_ok = sgtty; then
	AC_DEFINE(USE_SGTTY)
    fi
    fi
    fi
    fi
    fi
    fi
    AC_MSG_RESULT($tk_ok)
])

#--------------------------------------------------------------------
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
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







-
-
-
-
+
+
+
+


















-
-
+
+







], tcl_ok=yes, tcl_ok=no)

    if test $tcl_ok = no; then
	AC_DEFINE(NO_DIRENT_H)
    fi

    AC_MSG_RESULT($tcl_ok)
    AC_CHECK_HEADER(errno.h, , AC_DEFINE(NO_ERRNO_H))
    AC_CHECK_HEADER(float.h, , AC_DEFINE(NO_FLOAT_H))
    AC_CHECK_HEADER(values.h, , AC_DEFINE(NO_VALUES_H))
    AC_CHECK_HEADER(limits.h, , AC_DEFINE(NO_LIMITS_H))
    AC_CHECK_HEADER(errno.h, , [AC_DEFINE(NO_ERRNO_H)])
    AC_CHECK_HEADER(float.h, , [AC_DEFINE(NO_FLOAT_H)])
    AC_CHECK_HEADER(values.h, , [AC_DEFINE(NO_VALUES_H)])
    AC_CHECK_HEADER(limits.h, , [AC_DEFINE(NO_LIMITS_H)])
    AC_CHECK_HEADER(stdlib.h, tcl_ok=1, tcl_ok=0)
    AC_EGREP_HEADER(strtol, stdlib.h, , tcl_ok=0)
    AC_EGREP_HEADER(strtoul, stdlib.h, , tcl_ok=0)
    AC_EGREP_HEADER(strtod, stdlib.h, , tcl_ok=0)
    if test $tcl_ok = 0; then
	AC_DEFINE(NO_STDLIB_H)
    fi
    AC_CHECK_HEADER(string.h, tcl_ok=1, tcl_ok=0)
    AC_EGREP_HEADER(strstr, string.h, , tcl_ok=0)
    AC_EGREP_HEADER(strerror, string.h, , tcl_ok=0)

    # See also memmove check below for a place where NO_STRING_H can be
    # set and why.

    if test $tcl_ok = 0; then
	AC_DEFINE(NO_STRING_H)
    fi

    AC_CHECK_HEADER(sys/wait.h, , AC_DEFINE(NO_SYS_WAIT_H))
    AC_CHECK_HEADER(dlfcn.h, , AC_DEFINE(NO_DLFCN_H))
    AC_CHECK_HEADER(sys/wait.h, , [AC_DEFINE(NO_SYS_WAIT_H)])
    AC_CHECK_HEADER(dlfcn.h, , [AC_DEFINE(NO_DLFCN_H)])

    # OS/390 lacks sys/param.h (and doesn't need it, by chance).

    AC_HAVE_HEADERS(unistd.h sys/param.h)

])

1534
1535
1536
1537
1538
1539
1540


1541
1542
1543
1544
1545
1546
1547
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831







+
+







#
#--------------------------------------------------------------------

AC_DEFUN(SC_TIME_HANDLER, [
    AC_CHECK_HEADERS(sys/time.h)
    AC_HEADER_TIME
    AC_STRUCT_TIMEZONE

    AC_CHECK_FUNCS(gmtime_r localtime_r)

    AC_MSG_CHECKING([tm_tzadj in struct tm])
    AC_TRY_COMPILE([#include <time.h>], [struct tm tm; tm.tm_tzadj;],
	    [AC_DEFINE(HAVE_TM_TZADJ)
	    AC_MSG_RESULT(yes)],
	    AC_MSG_RESULT(no))

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
1860
1861
1862
1863
1864
1865
1866













1867
1868
1869
1870
1871
1872
1873







-
-
-
-
-
-
-
-
-
-
-
-
-







	    timezone += 1;
	    exit (0);],
	    [AC_DEFINE(HAVE_TIMEZONE_VAR)
	    AC_MSG_RESULT(yes)],
	    AC_MSG_RESULT(no))
    fi

    #
    # AIX does not have a timezone field in struct tm. When the AIX bsd
    # library is used, the timezone global and the gettimeofday methods are
    # to be avoided for timezone deduction instead, we deduce the timezone
    # by comparing the localtime result on a known GMT value.
    #

    if test "`uname -s`" = "AIX" ; then
	AC_CHECK_LIB(bsd, gettimeofday, libbsd=yes)
	if test $libbsd = yes; then
	    AC_DEFINE(USE_DELTA_FOR_TZ)
	fi
    fi
])

#--------------------------------------------------------------------
# SC_BUGGY_STRTOD
#
#	Under Solaris 2.4, strtod returns the wrong value for the
#	terminating character under some conditions.  Check for this
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
1950
1951
1952
1953
1954
1955
1956

















1957
1958
1959
1960
1961
1962
1963

1964
1965
1966
1967
1968
1969
1970
1971







-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-







-
+







    # already in libc.a.  Set compiler flags accordingly.
    # Also, Linux requires the "ieee" library for math to work
    # right (and it must appear before "-lm").
    #--------------------------------------------------------------------

    AC_CHECK_FUNC(sin, MATH_LIBS="", MATH_LIBS="-lm")
    AC_CHECK_LIB(ieee, main, [MATH_LIBS="-lieee $MATH_LIBS"])

    #--------------------------------------------------------------------
    # On AIX systems, libbsd.a has to be linked in to support
    # non-blocking file IO.  This library has to be linked in after
    # the MATH_LIBS or it breaks the pow() function.  The way to
    # insure proper sequencing, is to add it to the tail of MATH_LIBS.
    # This library also supplies gettimeofday.
    #--------------------------------------------------------------------

    libbsd=no
    if test "`uname -s`" = "AIX" ; then
	AC_CHECK_LIB(bsd, gettimeofday, libbsd=yes)
	if test $libbsd = yes; then
	    MATH_LIBS="$MATH_LIBS -lbsd"
	fi
    fi


    #--------------------------------------------------------------------
    # Interactive UNIX requires -linet instead of -lsocket, plus it
    # needs net/errno.h to define the socket-related error codes.
    #--------------------------------------------------------------------

    AC_CHECK_LIB(inet, main, [LIBS="$LIBS -linet"])
    AC_CHECK_HEADER(net/errno.h, AC_DEFINE(HAVE_NET_ERRNO_H))
    AC_CHECK_HEADER(net/errno.h, [AC_DEFINE(HAVE_NET_ERRNO_H)])

    #--------------------------------------------------------------------
    #	Check for the existence of the -lsocket and -lnsl libraries.
    #	The order here is important, so that they end up in the right
    #	order in the command line generated by make.  Here are some
    #	special considerations:
    #	1. Use "connect" and "accept" to check for -lsocket, and
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
1980
1981
1982
1983
1984
1985
1986


1987
1988
1989
1990
1991
1992
1993
1994


1995
1996
1997
1998
1999
2000
2001
2002
2003
2004







-
-
+
+






-
-
+
+








    #	   To get around this problem, check for both libraries together
    #	   if -lsocket doesn't work by itself.
    #--------------------------------------------------------------------

    tcl_checkBoth=0
    AC_CHECK_FUNC(connect, tcl_checkSocket=0, tcl_checkSocket=1)
    if test "$tcl_checkSocket" = 1; then
	AC_CHECK_FUNC(setsockopt, , AC_CHECK_LIB(socket, setsockopt,
	    LIBS="$LIBS -lsocket", tcl_checkBoth=1))
	AC_CHECK_FUNC(setsockopt, , [AC_CHECK_LIB(socket, setsockopt,
	    LIBS="$LIBS -lsocket", tcl_checkBoth=1)])
    fi
    if test "$tcl_checkBoth" = 1; then
	tk_oldLibs=$LIBS
	LIBS="$LIBS -lsocket -lnsl"
	AC_CHECK_FUNC(accept, tcl_checkNsl=0, [LIBS=$tk_oldLibs])
    fi
    AC_CHECK_FUNC(gethostbyname, , AC_CHECK_LIB(nsl, gethostbyname,
	    [LIBS="$LIBS -lnsl"]))
    AC_CHECK_FUNC(gethostbyname, , [AC_CHECK_LIB(nsl, gethostbyname,
	    [LIBS="$LIBS -lnsl"])])
    
    # Don't perform the eval of the libraries here because DL_LIBS
    # won't be set until we call SC_CONFIG_CFLAGS

    TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}'
    AC_SUBST(TCL_LIBS)
    AC_SUBST(MATH_LIBS)
])
Changes to unix/tcl.spec.
1

2
3
4

5
6
7
8
9
10
11
12
13
14
15


16
17
18
19
20
21
22

1
2
3

4
5
6
7
8
9
10
11
12
13


14
15
16
17
18
19
20
21
22
-
+


-
+









-
-
+
+







# $Id: tcl.spec,v 1.4 2000/04/26 17:31:21 hobbs Exp $
# $Id: tcl.spec,v 1.4.2.4 2001/10/03 20:26:10 hobbs Exp $
# This file is the basis for a binary Tcl RPM for Linux.

%define version 8.3.1
%define version 8.3.4
%define directory /usr/local

Summary: Tcl scripting language development environment
Name: tcl
Version: %{version}
Release: 1
Copyright: BSD
Group: Development/Languages
Source: ftp://ftp.scriptics.com/pub/tcl/tcl8_3/tcl%{version}.tar.gz
URL: http://dev.scriptics.com/
Packager: Scriptics Corporation
URL: http://www.tcl-tk.net/
Packager: ActiveState Corporation
Buildroot: /var/tmp/%{name}%{version}

%description
The Tcl (Tool Command Language) provides a powerful platform for
creating integration applications that tie together diverse
applications, protocols, devices, and frameworks.  When paired with
the Tk toolkit, Tcl provides the fastest and most powerful way to
Changes to unix/tclConfig.sh.in.
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16
17
18
19











-
+







# tclConfig.sh --
# 
# This shell script (for sh) is generated automatically by Tcl's
# configure script.  It will create shell variables for most of
# the configuration options discovered by the configure script.
# This script is intended to be included by the configure scripts
# for Tcl extensions so that they don't have to figure this all
# out for themselves.
#
# The information in this file is specific to a single platform.
#
# RCS: @(#) $Id: tclConfig.sh.in,v 1.13 1999/07/29 19:21:32 wart Exp $
# RCS: @(#) $Id: tclConfig.sh.in,v 1.13.10.1 2001/04/03 22:54:39 hobbs Exp $

# Tcl's version number.
TCL_VERSION='@TCL_VERSION@'
TCL_MAJOR_VERSION='@TCL_MAJOR_VERSION@'
TCL_MINOR_VERSION='@TCL_MINOR_VERSION@'
TCL_PATCH_LEVEL='@TCL_PATCH_LEVEL@'

69
70
71
72
73
74
75
76

77
78
79
80
81
82
83
69
70
71
72
73
74
75

76
77
78
79
80
81
82
83







-
+








# Extra flags to pass to cc:
TCL_EXTRA_CFLAGS='@EXTRA_CFLAGS@'

# Base command to use for combining object files into a shared library:
TCL_SHLIB_LD='@SHLIB_LD@'

# Base command to use for combining object files into a shared library:
# Base command to use for combining object files into a static library:
TCL_STLIB_LD='@STLIB_LD@'

# Either '$LIBS' (if dependent libraries should be included when linking
# shared libraries) or an empty string.  See Tcl's configure.in for more
# explanation.
TCL_SHLIB_LD_LIBS='@SHLIB_LD_LIBS@'

Changes to unix/tclLoadAout.c.
10
11
12
13
14
15
16
17

18
19
20
21
22
23
24





25
26
27
28
29
30
31
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







-
+







+
+
+
+
+







 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * This work was supported in part by the ARPA Manufacturing Automation
 * and Design Engineering (MADE) Initiative through ARPA contract
 * F33615-94-C-4400.
 *
 * RCS: @(#) $Id: tclLoadAout.c,v 1.4 2000/03/27 18:34:32 ericm Exp $
 * RCS: @(#) $Id: tclLoadAout.c,v 1.4.2.1 2001/10/16 21:13:36 hobbs Exp $
 */

#include "tclInt.h"
#include <fcntl.h>
#ifdef HAVE_EXEC_AOUT_H
#   include <sys/exec_aout.h>
#endif
#ifdef HAVE_UNISTD_H
#   include <unistd.h>
#else
#   include "../compat/unistd.h"
#endif

/*
 * Some systems describe the a.out header in sys/exec.h, and some in
 * a.out.h.
 */

#ifdef USE_SYS_EXEC_H
327
328
329
330
331
332
333
334

335
336
337
338
339
340
341
332
333
334
335
336
337
338

339
340
341
342
343
344
345
346







-
+







static int
FindLibraries (interp, fileName, buf)
     Tcl_Interp * interp;	/* Used for error reporting */
     char * fileName;		/* Name of the load module */
     Tcl_DString * buf;		/* Buffer where the -l an -L flags */
{
  FILE * f;			/* The load module */
  int c;			/* Byte from the load module */
  int c = 0;			/* Byte from the load module */
  char * p;
  Tcl_DString ds;
  CONST char *native;

  /* Open the load module */

  native = Tcl_UtfToExternalDString(NULL, fileName, -1, &ds);
466
467
468
469
470
471
472
473
474
475

476
477
478
479
480
481
482
471
472
473
474
475
476
477

478

479
480
481
482
483
484
485
486







-

-
+







TclGuessPackageName(fileName, bufPtr)
    char *fileName;		/* Name of file containing package (already
				 * translated to local form if needed). */
    Tcl_DString *bufPtr;	/* Initialized empty dstring.  Append
				 * package name to this if possible. */
{
    char *p, *q, *r;
    int srcOff, dstOff;

    if (q = strrchr(fileName,'/')) {
    if ((q = strrchr(fileName,'/'))) {
	q++;
    } else {
	q = fileName;
    }
    if (!strncmp(q,"lib",3)) {
	q+=3;
    }
Changes to unix/tclLoadDyld.c.
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
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




-
+

-
+
-






-
+



+







/* 
 * tclLoadDyld.c --
 *
 *     This procedure provides a version of the TclLoadFile that
 *     works with NeXT/Apple's dyld dynamic loading.  This file
 *     works with Apple's dyld dynamic loading.  This file
 *     provided by Wilfredo Sanchez (wsanchez@apple.com).
 *     The works on Mac OS X and Mac OS X Server.
 *     This works on Mac OS X.
 *     It should work with OpenStep, but it's not been tried.
 *
 * Copyright (c) 1995 Apple Computer, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclLoadDyld.c,v 1.2 2000/04/25 17:55:45 hobbs Exp $
 * RCS: @(#) $Id: tclLoadDyld.c,v 1.2.2.3 2002/02/25 15:20:36 das Exp $
 */

#include "tclInt.h"
#include "tclPort.h"
#include <mach-o/dyld.h>

/*
 *----------------------------------------------------------------------
 *
 * TclpLoadFile --
 *
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
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







-
-
-
-
-
+
+
+
+

+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
+
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+

-
+
-
-
-
-
+
-

+
-
-
-
+
+
+
+
-
-
-
+
+
+
+
+
+
+
-
-
+
+
+







    Tcl_PackageInitProc **proc1Ptr, **proc2Ptr;
				/* Where to return the addresses corresponding
				 * to sym1 and sym2. */
    ClientData *clientDataPtr;	/* Filled with token for dynamically loaded
				 * file which will be passed back to 
				 * TclpUnloadFile() to unload the file. */
{
    NSObjectFileImageReturnCode	err;
    NSObjectFileImage		image;
    NSModule			module;
    NSSymbol			symbol;
    char			*name;
    NSSymbol symbol;
    const struct mach_header *dyld_lib;
    Tcl_DString newName, ds;
    char *native;

    native = Tcl_UtfToExternalDString(NULL, fileName, -1, &ds);
    err = NSCreateObjectFileImageFromFile(fileName, &image);
    if (err != NSObjectFileImageSuccess) {
	switch (err) {
	    case NSObjectFileImageFailure:
		Tcl_SetResult(interp, "dyld: general failure", TCL_STATIC);
		break;
	    case NSObjectFileImageInappropriateFile:
		Tcl_SetResult(interp, "dyld: inappropriate Mach-O file",
			TCL_STATIC);
    dyld_lib = NSAddImage(native, 
        NSADDIMAGE_OPTION_WITH_SEARCHING | 
        NSADDIMAGE_OPTION_RETURN_ON_ERROR);
    Tcl_DStringFree(&ds);
    
    if (!dyld_lib) {
        NSLinkEditErrors editError;
        char *name, *msg;
        NSLinkEditError(&editError, &errno, &name, &msg);
		break;
	    case NSObjectFileImageArch:
		Tcl_SetResult(interp,
        Tcl_AppendResult(interp, msg, (char *) NULL);
			"dyld: inappropriate Mach-O architecture", TCL_STATIC);
		break;
	    case NSObjectFileImageFormat:
		Tcl_SetResult(interp, "dyld: invalid Mach-O file format",
			TCL_STATIC);
        return TCL_ERROR;
		break;
	    case NSObjectFileImageAccess:
		Tcl_SetResult(interp, "dyld: permission denied", TCL_STATIC);
		break;
	    default:
		Tcl_SetResult(interp, "dyld: unknown failure", TCL_STATIC);
		break;
	}
	return TCL_ERROR;
    }

    module = NSLinkModule(image, fileName, TRUE);

    if (module == NULL) {
    }

    /* 
     * dyld adds an underscore to the beginning of symbol names.
     */

    native = Tcl_UtfToExternalDString(NULL, sym1, -1, &ds);
    Tcl_DStringInit(&newName);
    Tcl_DStringAppend(&newName, "_", 1);
    native = Tcl_DStringAppend(&newName, native, -1);
    symbol = NSLookupSymbolInImage(dyld_lib, native, 
        NSLOOKUPSYMBOLINIMAGE_OPTION_BIND_NOW | 
        NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR);
    if(symbol) {
        *proc1Ptr = NSAddressOfSymbol(symbol);
        *clientDataPtr = NSModuleForSymbol(symbol);
    } else {
        *proc1Ptr=NULL;
	Tcl_SetResult(interp, "dyld: falied to link module", TCL_STATIC);
	return TCL_ERROR;
        *clientDataPtr=NULL;
    }

    Tcl_DStringFree(&newName);
    name = (char*)malloc(sizeof(char)*(strlen(sym1)+2));
    sprintf(name, "_%s", sym1);
    symbol = NSLookupAndBindSymbol(name);
    free(name);
    Tcl_DStringFree(&ds);
    *proc1Ptr = NSAddressOfSymbol(symbol);

    native = Tcl_UtfToExternalDString(NULL, sym2, -1, &ds);
    name = (char*)malloc(sizeof(char)*(strlen(sym2)+2));
    sprintf(name, "_%s", sym2);
    symbol = NSLookupAndBindSymbol(name);
    Tcl_DStringInit(&newName);
    Tcl_DStringAppend(&newName, "_", 1);
    native = Tcl_DStringAppend(&newName, native, -1);
    symbol = NSLookupSymbolInImage(dyld_lib, native, 
    free(name);
    *proc2Ptr = NSAddressOfSymbol(symbol);

        NSLOOKUPSYMBOLINIMAGE_OPTION_BIND_NOW | 
        NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR);
    if(symbol) {
        *proc2Ptr = NSAddressOfSymbol(symbol);
    } else {
        *proc2Ptr=NULL;
    }
    *clientDataPtr = module;

    Tcl_DStringFree(&newName);
    Tcl_DStringFree(&ds);
    
    return TCL_OK;
}

/*
 *----------------------------------------------------------------------
 *
 * TclpUnloadFile --
Changes to unix/tclLoadShl.c.
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
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












-
+












-
+







/* 
 * tclLoadShl.c --
 *
 *	This procedure provides a version of the TclLoadFile that works
 *	with the "shl_load" and "shl_findsym" library procedures for
 *	dynamic loading (e.g. for HP machines).
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclLoadShl.c,v 1.3 1999/04/16 00:48:04 stanton Exp $
 * RCS: @(#) $Id: tclLoadShl.c,v 1.3.12.1 2001/09/12 21:26:36 dgp Exp $
 */

#include <dl.h>

/*
 * On some HP machines, dl.h defines EXTERN; remove that definition.
 */

#ifdef EXTERN
#   undef EXTERN
#endif

#include "tcl.h"
#include "tclInt.h"

/*
 *----------------------------------------------------------------------
 *
 * TclpLoadFile --
 *
 *	Dynamically loads a binary code file into memory and returns
Changes to unix/tclMtherr.c.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







/* 
 * tclMatherr.c --
 *
 *	This function provides a default implementation of the
 *	"matherr" function, for SYS-V systems where it's needed.
 *
 * Copyright (c) 1993-1994 The Regents of the University of California.
 * Copyright (c) 1994 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMtherr.c,v 1.3 1999/04/16 00:48:04 stanton Exp $
 * RCS: @(#) $Id: tclMtherr.c,v 1.3.12.1 2001/04/06 18:42:39 hobbs Exp $
 */

#include "tclInt.h"
#include <math.h>

#ifndef TCL_GENERIC_ONLY
#include "tclPort.h"
57
58
59
60
61
62
63



64
65
66
67
68
69
70
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73







+
+
+







 *
 * Side effects:
 *	Sets errno based on what's in xPtr.
 *
 *----------------------------------------------------------------------
 */

#ifdef __APPLE_CC__
__private_extern__
#endif
int
matherr(xPtr)
    struct exception *xPtr;	/* Describes error that occurred. */
{
    if (TclMathInProgress()) {
	return 0;
    }
Changes to unix/tclUnixChan.c.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







/* 
 * tclUnixChan.c
 *
 *	Common channel driver for Unix channels based on files, command
 *	pipes and TCP sockets.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclUnixChan.c,v 1.17 2000/04/19 09:17:03 hobbs Exp $
 * RCS: @(#) $Id: tclUnixChan.c,v 1.17.2.3 2002/02/27 18:51:40 andreas_kupries Exp $
 */

#include	"tclInt.h"	/* Internal definitions for Tcl. */
#include	"tclPort.h"	/* Portability features for Tcl. */

/*
 * sys/ioctl.h has already been included by tclPort.h.  Including termios.h
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243














244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262














263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281














282
283
284
285
286
287
288
227
228
229
230
231
232
233










234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256










257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279










280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300







-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+









-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+









-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+







		            int *errorCodePtr));

/*
 * This structure describes the channel type structure for file based IO:
 */

static Tcl_ChannelType fileChannelType = {
    "file",				/* Type name. */
    FileBlockModeProc,			/* Set blocking/nonblocking mode.*/
    FileCloseProc,			/* Close proc. */
    FileInputProc,			/* Input proc. */
    FileOutputProc,			/* Output proc. */
    FileSeekProc,			/* Seek proc. */
    NULL,				/* Set option proc. */
    NULL,				/* Get option proc. */
    FileWatchProc,			/* Initialize notifier. */
    FileGetHandleProc,			/* Get OS handles out of channel. */
    "file",			/* Type name. */
    TCL_CHANNEL_VERSION_2,	/* v2 channel */
    FileCloseProc,		/* Close proc. */
    FileInputProc,		/* Input proc. */
    FileOutputProc,		/* Output proc. */
    FileSeekProc,		/* Seek proc. */
    NULL,			/* Set option proc. */
    NULL,			/* Get option proc. */
    FileWatchProc,		/* Initialize notifier. */
    FileGetHandleProc,		/* Get OS handles out of channel. */
    NULL,			/* close2proc. */
    FileBlockModeProc,		/* Set blocking or non-blocking mode.*/
    NULL,			/* flush proc. */
    NULL,			/* handler proc. */
};

#ifdef SUPPORTS_TTY
/*
 * This structure describes the channel type structure for serial IO.
 * Note that this type is a subclass of the "file" type.
 */

static Tcl_ChannelType ttyChannelType = {
    "tty",				/* Type name. */
    FileBlockModeProc,			/* Set blocking/nonblocking mode.*/
    TtyCloseProc,			/* Close proc. */
    FileInputProc,			/* Input proc. */
    FileOutputProc,			/* Output proc. */
    NULL,				/* Seek proc. */
    TtySetOptionProc,			/* Set option proc. */
    TtyGetOptionProc,			/* Get option proc. */
    FileWatchProc,			/* Initialize notifier. */
    FileGetHandleProc,			/* Get OS handles out of channel. */
    "tty",			/* Type name. */
    TCL_CHANNEL_VERSION_2,	/* v2 channel */
    TtyCloseProc,		/* Close proc. */
    FileInputProc,		/* Input proc. */
    FileOutputProc,		/* Output proc. */
    NULL,			/* Seek proc. */
    TtySetOptionProc,		/* Set option proc. */
    TtyGetOptionProc,		/* Get option proc. */
    FileWatchProc,		/* Initialize notifier. */
    FileGetHandleProc,		/* Get OS handles out of channel. */
    NULL,			/* close2proc. */
    FileBlockModeProc,		/* Set blocking or non-blocking mode.*/
    NULL,			/* flush proc. */
    NULL,			/* handler proc. */
};
#endif	/* SUPPORTS_TTY */

/*
 * This structure describes the channel type structure for TCP socket
 * based IO:
 */

static Tcl_ChannelType tcpChannelType = {
    "tcp",				/* Type name. */
    TcpBlockModeProc,			/* Set blocking/nonblocking mode.*/
    TcpCloseProc,			/* Close proc. */
    TcpInputProc,			/* Input proc. */
    TcpOutputProc,			/* Output proc. */
    NULL,				/* Seek proc. */
    NULL,				/* Set option proc. */
    TcpGetOptionProc,			/* Get option proc. */
    TcpWatchProc,			/* Initialize notifier. */
    TcpGetHandleProc,			/* Get OS handles out of channel. */
    "tcp",			/* Type name. */
    TCL_CHANNEL_VERSION_2,	/* v2 channel */
    TcpCloseProc,		/* Close proc. */
    TcpInputProc,		/* Input proc. */
    TcpOutputProc,		/* Output proc. */
    NULL,			/* Seek proc. */
    NULL,			/* Set option proc. */
    TcpGetOptionProc,		/* Get option proc. */
    TcpWatchProc,		/* Initialize notifier. */
    TcpGetHandleProc,		/* Get OS handles out of channel. */
    NULL,			/* close2proc. */
    TcpBlockModeProc,		/* Set blocking or non-blocking mode.*/
    NULL,			/* flush proc. */
    NULL,			/* handler proc. */
};


/*
 *----------------------------------------------------------------------
 *
 * FileBlockModeProc --
407
408
409
410
411
412
413









414
415
416
417
418
419
420
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441







+
+
+
+
+
+
+
+
+







    int toWrite;			/* How many bytes to write? */
    int *errorCodePtr;			/* Where to store error code. */
{
    FileState *fsPtr = (FileState *) instanceData;
    int written;

    *errorCodePtr = 0;
    if (toWrite == 0) {
      /* SF Tcl Bug 465765.
       * Do not try to write nothing into a file. STREAM based
       * implementations will considers this as EOF (if there is a
       * pipe behind the file).
       */

      return 0;
    }
    written = write(fsPtr->fd, buf, (size_t) toWrite);
    if (written > -1) {
        return written;
    }
    *errorCodePtr = errno;
    return -1;
}
1265
1266
1267
1268
1269
1270
1271



1272
1273
1274
1275
1276
1277
1278
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302







+
+
+







{
    int fd, seekFlag, mode, channelPermissions;
    FileState *fsPtr;
    char *native, *translation;
    char channelName[16 + TCL_INTEGER_SPACE];
    Tcl_DString ds, buffer;
    Tcl_ChannelType *channelTypePtr;
#ifdef SUPPORTS_TTY
    int ctl_tty;
#endif
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);

    mode = TclGetOpenMode(interp, modeString, &seekFlag);
    if (mode == -1) {
        return NULL;
    }
    switch (mode & (O_RDONLY | O_WRONLY | O_RDWR)) {
1295
1296
1297
1298
1299
1300
1301



1302
1303
1304
1305
1306
1307
1308
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335







+
+
+








    native = Tcl_TranslateFileName(interp, fileName, &buffer);
    if (native == NULL) {
	return NULL;
    }
    native = Tcl_UtfToExternalDString(NULL, native, -1, &ds);
    fd = open(native, mode, permissions);		/* INTL: Native. */
#ifdef SUPPORTS_TTY
    ctl_tty = (strcmp (native, "/dev/tty") == 0);
#endif
    Tcl_DStringFree(&ds);    
    Tcl_DStringFree(&buffer);

    if (fd < 0) {
        if (interp != (Tcl_Interp *) NULL) {
            Tcl_AppendResult(interp, "couldn't open \"", fileName, "\": ",
                    Tcl_PosixError(interp), (char *) NULL);
1316
1317
1318
1319
1320
1321
1322
1323

1324
1325
1326
1327
1328
1329
1330
1343
1344
1345
1346
1347
1348
1349

1350
1351
1352
1353
1354
1355
1356
1357







-
+







     */
  
    fcntl(fd, F_SETFD, FD_CLOEXEC);
    
    sprintf(channelName, "file%d", fd);
    
#ifdef SUPPORTS_TTY
    if (isatty(fd)) {
    if (!ctl_tty && isatty(fd)) {
	/*
	 * Initialize the serial port to a set of sane parameters.
	 * Especially important if the remote device is set to echo and
	 * the serial port driver was also set to echo -- as soon as a char
	 * were sent to the serial port, the remote device would echo it,
	 * then the serial driver would echo it back to the device, etc.
	 */
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
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







-
+








+


-








    sprintf(channelName, "file%d", fd);

    /*
     * Look to see if a channel with this fd and the same mode already exists.
     * If the fd is used, but the mode doesn't match, return NULL.
     */
    

    for (fsPtr = tsdPtr->firstFilePtr; fsPtr != NULL; fsPtr = fsPtr->nextPtr) {
	if (fsPtr->fd == fd) {
	    return ((mode|TCL_EXCEPTION) == fsPtr->validMask) ?
		    fsPtr->channel : NULL;
	}
    }

    fsPtr = (FileState *) ckalloc((unsigned) sizeof(FileState));

    fsPtr->nextPtr = tsdPtr->firstFilePtr;
    tsdPtr->firstFilePtr = fsPtr;

    fsPtr->fd = fd;
    fsPtr->validMask = mode | TCL_EXCEPTION;
    fsPtr->channel = Tcl_CreateChannel(&fileChannelType, channelName,
            (ClientData) fsPtr, mode);
    
    return fsPtr->channel;
}
Changes to unix/tclUnixFCmd.c.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







/*
 * tclUnixFCmd.c
 *
 *      This file implements the unix specific portion of file manipulation 
 *      subcommands of the "file" command.  All filename arguments should
 *	already be translated to native format.
 *
 * Copyright (c) 1996-1998 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclUnixFCmd.c,v 1.6 2000/04/04 08:05:57 hobbs Exp $
 * RCS: @(#) $Id: tclUnixFCmd.c,v 1.6.2.1 2001/10/17 19:12:26 hobbs Exp $
 *
 * Portions of this code were derived from NetBSD source code which has
 * the following copyright notice:
 *
 * Copyright (c) 1988, 1993, 1994
 *      The Regents of the University of California.  All rights reserved.
 *
1086
1087
1088
1089
1090
1091
1092
1093

1094
1095
1096
1097
1098
1099
1100
1086
1087
1088
1089
1090
1091
1092

1093
1094
1095
1096
1097
1098
1099
1100







-
+







	Tcl_AppendResult(interp, "could not read \"", fileName, "\": ",
		Tcl_PosixError(interp), (char *) NULL);
	return TCL_ERROR;
    }

    groupPtr = getgrgid(statBuf.st_gid);		/* INTL: Native. */
    if (groupPtr == NULL) {
	*attributePtrPtr = Tcl_NewIntObj(statBuf.st_gid);
	*attributePtrPtr = Tcl_NewIntObj((int) statBuf.st_gid);
    } else {
	Tcl_DString ds;
	CONST char *utf;

	utf = Tcl_ExternalToUtfDString(NULL, groupPtr->gr_name, -1, &ds); 
	*attributePtrPtr = Tcl_NewStringObj(utf, -1);
	Tcl_DStringFree(&ds);
1137
1138
1139
1140
1141
1142
1143
1144

1145
1146
1147
1148
1149
1150
1151
1137
1138
1139
1140
1141
1142
1143

1144
1145
1146
1147
1148
1149
1150
1151







-
+







	Tcl_AppendResult(interp, "could not read \"", fileName, "\": ",
		Tcl_PosixError(interp), (char *) NULL);
	return TCL_ERROR;
    }

    pwPtr = getpwuid(statBuf.st_uid);			/* INTL: Native. */
    if (pwPtr == NULL) {
	*attributePtrPtr = Tcl_NewIntObj(statBuf.st_uid);
	*attributePtrPtr = Tcl_NewIntObj((int) statBuf.st_uid);
    } else {
	Tcl_DString ds;
	CONST char *utf;

	utf = Tcl_ExternalToUtfDString(NULL, pwPtr->pw_name, -1, &ds); 
	*attributePtrPtr = Tcl_NewStringObj(utf, Tcl_DStringLength(&ds));
	Tcl_DStringFree(&ds);
Changes to unix/tclUnixInit.c.
1
2
3
4
5
6
7
8
9
10

11
12
13
14
15
16
17
1
2
3
4
5
6
7
8
9

10
11
12
13
14
15
16
17









-
+







/* 
 * tclUnixInit.c --
 *
 *	Contains the Unix-specific interpreter initialization functions.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 * Copyright (c) 1999 by Scriptics Corporation.
 * All rights reserved.
 *
 * RCS: @(#) $Id: tclUnixInit.c,v 1.18 1999/10/13 00:32:49 hobbs Exp $
 * RCS: @(#) $Id: tclUnixInit.c,v 1.18.2.3 2001/08/24 16:19:10 dgp Exp $
 */

#include "tclInt.h"
#include "tclPort.h"
#include <locale.h>
#if defined(__FreeBSD__)
#   include <floatingpoint.h>
54
55
56
57
58
59
60

61
62
63
64
65
66
67
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68







+







    CONST char *lang;
    CONST char *encoding;
} LocaleTable;

static CONST LocaleTable localeTable[] = {
    {"ja_JP.SJIS",	"shiftjis"},
    {"ja_JP.EUC",	"euc-jp"},
    {"ja_JP.eucJP",     "euc-jp"},
    {"ja_JP.JIS",	"iso2022-jp"},
    {"ja_JP.mscode",	"shiftjis"},
    {"ja_JP.ujis",	"euc-jp"},
    {"ja_JP",		"euc-jp"},
    {"Ja_JP",		"shiftjis"},
    {"Jp_JP",		"shiftjis"},
    {"japan",		"euc-jp"},
276
277
278
279
280
281
282






283
284
285


286
287

288
289
290
291
292


293
294
295
296
297
298
299
300

301
302
303
304
305
306










307
308

309
310
311
312
313


314
315

316
317
318
319
320


321
322

323
324
325
326
327
328
329
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291

292
293
294
295
296
297
298
299
300

301
302
303
304






305

306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327

328
329
330
331
332
333
334
335
336

337
338
339
340
341
342
343
344
345
346
347
348







+
+
+
+
+
+


-
+
+


+




-
+
+


-
-
-
-
-
-
+
-





+
+
+
+
+
+
+
+
+
+


+




-
+
+


+




-
+
+


+







     *		(e.g. /usr/src/tcl8.2/unix/solaris-sparc/../../library)
     *	<bindir>/../../<developLib>
     *		(e.g. /usr/src/tcl8.2/unix/../../tcl8.2/library)
     *	<bindir>/../../../<devlopLib>
     *		(e.g. /usr/src/tcl8.2/unix/solaris-sparc/../../../tcl8.2/library)
     */
     

     /*
      * The variable path holds an absolute path.  Take care not to
      * overwrite pathv[0] since that might produce a relative path.
      */

    if (path != NULL) {
	Tcl_SplitPath(path, &pathc, &pathv);
	if (pathc > 1) {
	if (pathc > 2) {
	    str = pathv[pathc - 2];
	    pathv[pathc - 2] = installLib;
	    path = Tcl_JoinPath(pathc - 1, pathv, &ds);
	    pathv[pathc - 2] = str;
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	if (pathc > 2) {
	if (pathc > 3) {
	    str = pathv[pathc - 3];
	    pathv[pathc - 3] = installLib;
	    path = Tcl_JoinPath(pathc - 2, pathv, &ds);
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	if (pathc > 1) {
	    pathv[pathc - 2] = "library";
	    pathv[pathc - 3] = str;
	    path = Tcl_JoinPath(pathc - 1, pathv, &ds);
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	if (pathc > 2) {
	    str = pathv[pathc - 2];
	    pathv[pathc - 2] = "library";
	    path = Tcl_JoinPath(pathc - 1, pathv, &ds);
	    pathv[pathc - 2] = str;
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	if (pathc > 3) {
	    str = pathv[pathc - 3];
	    pathv[pathc - 3] = "library";
	    path = Tcl_JoinPath(pathc - 2, pathv, &ds);
	    pathv[pathc - 3] = str;
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	if (pathc > 1) {
	if (pathc > 3) {
	    str = pathv[pathc - 3];
	    pathv[pathc - 3] = developLib;
	    path = Tcl_JoinPath(pathc - 2, pathv, &ds);
	    pathv[pathc - 3] = str;
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	if (pathc > 3) {
	if (pathc > 4) {
	    str = pathv[pathc - 4];
	    pathv[pathc - 4] = developLib;
	    path = Tcl_JoinPath(pathc - 3, pathv, &ds);
	    pathv[pathc - 4] = str;
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	ckfree((char *) pathv);
    }

365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
384
385
386
387
388
389
390

391
392
393
394
395
396
397







-







void
TclpSetInitialEncodings()
{
    CONST char *encoding;
    int i;
    Tcl_Obj *pathPtr;
    char *langEnv;
    Tcl_DString ds;

    /*
     * Determine the current encoding from the LC_* or LANG environment
     * variables.  We previously used setlocale() to determine the locale,
     * but this does not work on some systems (e.g. Linux/i386 RH 5.0).
     */

428
429
430
431
432
433
434

435
436
437

438
439
440




441
442

443
444
445

446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
446
447
448
449
450
451
452
453
454
455

456



457
458
459
460
461

462



463


464
465
466
467
468
469
470
471
472

473
474
475
476
477
478
479







+


-
+
-
-
-
+
+
+
+

-
+
-
-
-
+
-
-









-







    }
    if (encoding == NULL) {
	encoding = "iso8859-1";
    }

    Tcl_SetSystemEncoding(NULL, encoding);

    resetPath:
    /*
     * Initialize the C library's locale subsystem.  This is required
     * for input methods to work properly on X11. Note that we need to
     * for input methods to work properly on X11.  We only do this for
     * retore the initial "C" locale so that Tcl can parse numbers
     * properly.  The side effect of setting the default locale should be to
     * load any locale specific modules that are needed by X.
     * LC_CTYPE because that's the necessary one, and we don't want to
     * affect LC_TIME here.  The side effect of setting the default locale
     * should be to load any locale specific modules that are needed by X.
     * [BUG: 5422 3345 4236 2522 2521].
     */
 

    Tcl_DStringInit(&ds);
    Tcl_DStringAppend(&ds, setlocale(LC_ALL, NULL), -1);
    setlocale(LC_ALL, "");
    setlocale(LC_CTYPE, "");
    setlocale(LC_ALL, Tcl_DStringValue(&ds));
    Tcl_DStringFree(&ds);

    /*
     * In case the initial locale is not "C", ensure that the numeric
     * processing is done in "C" locale regardless.  This is needed because
     * Tcl relies on routines like strtod, but should not have locale
     * dependent behavior.
     */

    setlocale(LC_NUMERIC, "C");
 

    /*
     * Until the system encoding was actually set, the library path was
     * actually in the native multi-byte encoding, and not really UTF-8
     * as advertised.  We cheated as follows:
     *
     * 1. It was safe to allow the Tcl_SetSystemEncoding() call to 
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495

496
497
498
499
500
501
502







-







     * Now that the system encoding was actually successfully set,
     * translate all the names in the library path to UTF-8.  That way,
     * next time we search the library path, we'll translate the names 
     * from UTF-8 to the system encoding which will be the native 
     * encoding.
     */

    resetPath:
    pathPtr = TclGetLibraryPath();
    if (pathPtr != NULL) {
	int objc;
	Tcl_Obj **objv;
	
	objc = 0;
	Tcl_ListObjGetElements(NULL, pathPtr, &objc, &objv);
Changes to unix/tclUnixPipe.c.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







/* 
 * tclUnixPipe.c --
 *
 *	This file implements the UNIX-specific exec pipeline functions,
 *	the "pipe" channel driver, and the "pid" Tcl command.
 *
 * Copyright (c) 1991-1994 The Regents of the University of California.
 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclUnixPipe.c,v 1.9 2000/03/31 19:39:42 ericm Exp $
 * RCS: @(#) $Id: tclUnixPipe.c,v 1.9.2.2 2001/10/18 01:02:02 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

/*
 * The following macros convert between TclFile's and fd's.  The conversion
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79














80
81
82
83
84
85
86
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







-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+








/*
 * This structure describes the channel type structure for command pipe
 * based IO:
 */

static Tcl_ChannelType pipeChannelType = {
    "pipe",				/* Type name. */
    PipeBlockModeProc,			/* Set blocking/nonblocking mode.*/
    PipeCloseProc,			/* Close proc. */
    PipeInputProc,			/* Input proc. */
    PipeOutputProc,			/* Output proc. */
    NULL,				/* Seek proc. */
    NULL,				/* Set option proc. */
    NULL,				/* Get option proc. */
    PipeWatchProc,			/* Initialize notifier. */
    PipeGetHandleProc,			/* Get OS handles out of channel. */
    "pipe",			/* Type name. */
    TCL_CHANNEL_VERSION_2,	/* v2 channel */
    PipeCloseProc,		/* Close proc. */
    PipeInputProc,		/* Input proc. */
    PipeOutputProc,		/* Output proc. */
    NULL,			/* Seek proc. */
    NULL,			/* Set option proc. */
    NULL,			/* Get option proc. */
    PipeWatchProc,		/* Initialize notifier. */
    PipeGetHandleProc,		/* Get OS handles out of channel. */
    NULL,			/* close2proc. */
    PipeBlockModeProc,		/* Set blocking or non-blocking mode.*/
    NULL,			/* flush proc. */
    NULL,			/* handler proc. */
};

/*
 *----------------------------------------------------------------------
 *
 * TclpMakeFile --
 *
182
183
184
185
186
187
188





189
190
191
192

193
194
195
196
197
198
199
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200

201
202
203
204
205
206
207
208







+
+
+
+
+



-
+







TclpCreateTempFile(contents)
    CONST char *contents;	/* String to write into temp file, or NULL. */
{
    char fileName[L_tmpnam], *native;
    Tcl_DString dstring;
    int fd;

    /*
     * Linux says we should use mkstemp, but Solaris prefers tmpnam.
     * We should also check against making more then TMP_MAX of these.
     */

    if (tmpnam(fileName) == NULL) {			/* INTL: Native. */
	return NULL;
    }
    fd = open(fileName, O_RDWR|O_CREAT|O_TRUNC, 0666);	/* INTL: Native. */
    fd = open(fileName, O_RDWR|O_CREAT|O_EXCL, 0666);	/* INTL: Native. */
    if (fd == -1) {
	return NULL;
    }
    fcntl(fd, F_SETFD, FD_CLOEXEC);
    unlink(fileName);					/* INTL: Native. */

    if (contents != NULL) {
440
441
442
443
444
445
446
447



448
449
450

451
452
453
454
455
456
457
449
450
451
452
453
454
455

456
457
458
459
460

461
462
463
464
465
466
467
468







-
+
+
+


-
+







    *pidPtr = (Tcl_Pid) pid;
    return TCL_OK;

    error:
    if (pid != -1) {
	/*
	 * Reap the child process now if an error occurred during its
	 * startup.
	 * startup.  We don't call this with WNOHANG because that can lead to
	 * defunct processes on an MP system.   We shouldn't have to worry
	 * about hanging here, since this is the error case.  [Bug: 6148]
	 */

	Tcl_WaitPid((Tcl_Pid) pid, &status, WNOHANG);
	Tcl_WaitPid((Tcl_Pid) pid, &status, 0);
    }
    
    if (errPipeIn) {
	TclpCloseFile(errPipeIn);
    }
    if (errPipeOut) {
	TclpCloseFile(errPipeOut);
943
944
945
946
947
948
949


950
951

952
953


954
955
956
957







958
959
960
961
962
963
964
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







+
+


+
-
-
+
+
-
-
-
-
+
+
+
+
+
+
+







    *errorCodePtr = 0;
    
    /*
     * Assume there is always enough input available. This will block
     * appropriately, and read will unblock as soon as a short read is
     * possible, if the channel is in blocking mode. If the channel is
     * nonblocking, the read will never block.
     * Some OSes can throw an interrupt error, for which we should
     * immediately retry. [Bug #415131]
     */

    do {
    bytesRead = read(GetFd(psPtr->inFile), buf, (size_t) toRead);
    if (bytesRead > -1) {
	bytesRead = read (GetFd(psPtr->inFile), buf, (size_t) toRead);
    } while ((bytesRead < 0) && (errno == EINTR));
        return bytesRead;
    }
    *errorCodePtr = errno;
    return -1;

    if (bytesRead < 0) {
	*errorCodePtr = errno;
	return -1;
    } else {
	return bytesRead;
    }
}

/*
 *----------------------------------------------------------------------
 *
 * PipeOutputProc--
 *
983
984
985
986
987
988
989







990
991


992
993
994
995







996
997
998
999
1000
1001
1002
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







+
+
+
+
+
+
+
-
-
+
+
-
-
-
-
+
+
+
+
+
+
+







    int toWrite;			/* How many bytes to write? */
    int *errorCodePtr;			/* Where to store error code. */
{
    PipeState *psPtr = (PipeState *) instanceData;
    int written;

    *errorCodePtr = 0;

    /*
     * Some OSes can throw an interrupt error, for which we should
     * immediately retry. [Bug #415131]
     */

    do {
    written = write(GetFd(psPtr->outFile), buf, (size_t) toWrite);
    if (written > -1) {
	written = write(GetFd(psPtr->outFile), buf, (size_t) toWrite);
    } while ((written < 0) && (errno == EINTR));
        return written;
    }
    *errorCodePtr = errno;
    return -1;

    if (written < 0) {
	*errorCodePtr = errno;
	return -1;
    } else {
	return written;
    }
}

/*
 *----------------------------------------------------------------------
 *
 * PipeWatchProc --
 *
Changes to unix/tclUnixPort.h.
15
16
17
18
19
20
21
22

23
24
25
26
27
28
29
15
16
17
18
19
20
21

22
23
24
25
26
27
28
29







-
+







 *
 * Copyright (c) 1991-1994 The Regents of the University of California.
 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclUnixPort.h,v 1.15 2000/04/21 04:04:12 hobbs Exp $
 * RCS: @(#) $Id: tclUnixPort.h,v 1.15.2.1 2001/09/01 22:53:45 davygrvy Exp $
 */

#ifndef _TCLUNIXPORT
#define _TCLUNIXPORT

#ifndef _TCLINT
#   include "tclInt.h"
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
453
454
455
456
457
458
459

460
461
462
463
464
465
466







-







#define	TCL_PLATFORM_TRANSLATION	TCL_TRANSLATE_LF

/*
 * The following macros have trivial definitions, allowing generic code to 
 * address platform-specific issues.
 */

#define TclpAsyncMark(async)
#define TclpGetPid(pid)		((unsigned long) (pid))
#define TclpReleaseFile(file)	/* Nothing. */

/*
 * The following defines wrap the system memory allocation routines for
 * use by tclAlloc.c.  By default off unused on Unix.
 */
Changes to unix/tclUnixThrd.c.
645
646
647
648
649
650
651








652
653



654
655
656
657
658
659
660
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659


660
661
662
663
664
665
666
667
668
669







+
+
+
+
+
+
+
+
-
-
+
+
+







	MASTER_UNLOCK;
    }
    pmutexPtr = *((pthread_mutex_t **)mutexPtr);
    pcondPtr = *((pthread_cond_t **)condPtr);
    if (timePtr == NULL) {
	pthread_cond_wait(pcondPtr, pmutexPtr);
    } else {
	Tcl_Time now;

	/*
	 * Make sure to take into account the microsecond component of the
	 * current time, including possible overflow situations. [Bug #411603]
	 */

	TclpGetTime(&now);
	ptime.tv_sec = timePtr->sec + TclpGetSeconds();
	ptime.tv_nsec = 1000 * timePtr->usec;
	ptime.tv_sec = timePtr->sec + now.sec +
	    (timePtr->usec + now.usec) / 1000000;
	ptime.tv_nsec = 1000 * ((timePtr->usec + now.usec) % 1000000);
	pthread_cond_timedwait(pcondPtr, pmutexPtr, &ptime);
    }
}

/*
 *----------------------------------------------------------------------
 *
Changes to unix/tclUnixTime.c.
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16
17
18
19











-
+







/* 
 * tclUnixTime.c --
 *
 *	Contains Unix specific versions of Tcl functions that
 *	obtain time values from the operating system.
 *
 * Copyright (c) 1995 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclUnixTime.c,v 1.7 2000/01/14 22:15:52 ericm Exp $
 * RCS: @(#) $Id: tclUnixTime.c,v 1.7.2.1 2002/05/24 19:36:29 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"
#define TM_YEAR_BASE 1900
#define IsLeapYear(x)   ((x % 4 == 0) && (x % 100 != 0 || x % 400 == 0))

275
276
277
278
279
280
281
282


283
284
285
286
287
288
289
290
291
292
293
294

295
296
297
298

299
300
301
302
303
304
305
306
307
308
309
310
275
276
277
278
279
280
281

282
283
284
285
286
287
288
289
290
291
292
293
294

295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312







-
+
+











-
+




+












}

/*
 *----------------------------------------------------------------------
 *
 * TclpStrftime --
 *
 *	On Unix, we can safely call the native strftime implementation.
 *	On Unix, we can safely call the native strftime implementation,
 *	and also ignore the useGMT parameter.
 *
 * Results:
 *	The normal strftime result.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

size_t
TclpStrftime(s, maxsize, format, t)
TclpStrftime(s, maxsize, format, t, useGMT)
    char *s;
    size_t maxsize;
    CONST char *format;
    CONST struct tm *t;
    int useGMT;
{
    if (format[0] == '%' && format[1] == 'Q') {
	/* Format as a stardate */
	sprintf(s, "Stardate %2d%03d.%01d",
		(((t->tm_year + TM_YEAR_BASE) + 377) - 2323),
		(((t->tm_yday + 1) * 1000) /
			(365 + IsLeapYear((t->tm_year + TM_YEAR_BASE)))),
		(((t->tm_hour * 60) + t->tm_min)/144));
	return(strlen(s));
    }
    return strftime(s, maxsize, format, t);
}
Changes to win/Makefile.in.
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







#
# This file is a Makefile for Tcl.  If it has the name "Makefile.in"
# then it is a template for a Makefile;  to generate the actual Makefile,
# run "./configure", which is a configuration script generated by the
# "autoconf" program (constructs like "@foo@" will get replaced in the
# actual Makefile.
#
# RCS: @(#) $Id: Makefile.in,v 1.33 2000/04/25 20:58:48 hobbs Exp $
# RCS: @(#) $Id: Makefile.in,v 1.33.2.8 2002/04/18 22:23:45 hobbs Exp $

VERSION = @TCL_VERSION@

#----------------------------------------------------------------
# Things you can change to personalize the Makefile for your own
# site (you can make these changes in either Makefile.in or
# Makefile, but changes to Makefile will get lost if you re-run
43
44
45
46
47
48
49
50

51
52
53
54
55
56
57
43
44
45
46
47
48
49

50
51
52
53
54
55
56
57







-
+








# Path to use at runtime to refer to LIB_INSTALL_DIR:
LIB_RUNTIME_DIR		= $(libdir)

# Directory in which to install the program tclsh:
BIN_INSTALL_DIR		= $(INSTALL_ROOT)$(bindir)

# Directory in which to install libtcl.so or libtcl.a:
# Directory in which to install the .a or .so binary for the Tcl library:
LIB_INSTALL_DIR		= $(INSTALL_ROOT)$(libdir)

# Path name to use when installing library scripts.
SCRIPT_INSTALL_DIR	= $(INSTALL_ROOT)$(TCL_LIBRARY)

# Directory in which to install the include file tcl.h:
INCLUDE_INSTALL_DIR	= $(INSTALL_ROOT)$(includedir)
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
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







+
+
+
+
+
+
+







-
-
-
-
-
-
-
-
-
-
-









-
-
-
-
+
-


-
-
-
+
+
+














-
+



-
+








-
-
-
-
-


-
+
-

-
+


+


+


+
+
-
+






-
+








+








# warning flags
CFLAGS_WARNING = @CFLAGS_WARNING@

# The default switches for optimization or debugging
CFLAGS_DEBUG    = @CFLAGS_DEBUG@
CFLAGS_OPTIMIZE	= @CFLAGS_OPTIMIZE@

# To change the compiler switches, for example to change from optimization to
# debugging symbols, change the following line:
#CFLAGS = 		$(CFLAGS_DEBUG)
#CFLAGS = 		$(CFLAGS_OPTIMIZE)
#CFLAGS = 		$(CFLAGS_DEBUG) $(CFLAGS_OPTIMIZE)
CFLAGS =		@CFLAGS@ @CFLAGS_DEFAULT@

# To enable compilation debugging reverse the comment characters on
# one of the following lines.
COMPILE_DEBUG_FLAGS =
#COMPILE_DEBUG_FLAGS = -DTCL_COMPILE_DEBUG
#COMPILE_DEBUG_FLAGS = -DTCL_COMPILE_DEBUG -DTCL_COMPILE_STATS

# The default switches for optimization or debugging
LDFLAGS_DEBUG    = @LDFLAGS_DEBUG@
LDFLAGS_OPTIMIZE = @LDFLAGS_OPTIMIZE@

# To change the compiler switches, for example to change from optimization to
# debugging symbols, change the following line:
#CFLAGS = 		$(CFLAGS_DEBUG)
#CFLAGS = 		$(CFLAGS_OPTIMIZE)
#CFLAGS = 		$(CFLAGS_DEBUG) $(CFLAGS_OPTIMIZE)
CFLAGS = 		@CFLAGS@

# Special compiler flags to use when building man2tcl on Windows.
MAN2TCLFLAGS =		@MAN2TCLFLAGS@

SRC_DIR			= @srcdir@
ROOT_DIR		= @srcdir@/..
GENERIC_DIR		= @srcdir@/../generic
WIN_DIR			= @srcdir@
COMPAT_DIR		= @srcdir@/../compat

# This is a switch passed to a Cygwin script that generates file
# names based on the platform.
PATHTYPE		= @PATHTYPE@

# Converts a POSIX path to a Windows native path.
# This program converts between Windows native and Cygwin POSIX pathnames.
CYGPATH			= @CYGPATH@

GENERIC_DIR_NATIVE	= $(shell $(CYGPATH) $(PATHTYPE) '$(GENERIC_DIR)')
WIN_DIR_NATIVE		= $(shell $(CYGPATH) $(PATHTYPE) '$(WIN_DIR)')
ROOT_DIR_NATIVE		= $(shell $(CYGPATH) $(PATHTYPE) '$(ROOT_DIR)')
GENERIC_DIR_NATIVE	= $(shell $(CYGPATH) '$(GENERIC_DIR)')
WIN_DIR_NATIVE		= $(shell $(CYGPATH) '$(WIN_DIR)')
ROOT_DIR_NATIVE		= $(shell $(CYGPATH) '$(ROOT_DIR)')

LIBRARY_DIR   = $(shell echo '$(ROOT_DIR_NATIVE)/library' | sed 's/\\/\//g' )

DLLSUFFIX		= @DLLSUFFIX@
LIBSUFFIX		= @LIBSUFFIX@
EXESUFFIX		= @EXESUFFIX@

TCL_STUB_LIB_FILE	= @TCL_STUB_LIB_FILE@
TCL_DLL_FILE		= @TCL_DLL_FILE@
TCL_LIB_FILE		= @TCL_LIB_FILE@
DDE_DLL_FILE		= tcldde$(VER)${DLLSUFFIX}
DDE_LIB_FILE		= tcldde$(VER)${LIBSUFFIX}
REG_DLL_FILE		= tclreg$(VER)${DLLSUFFIX}
REG_LIB_FILE		= tclreg$(VER)${LIBSUFFIX}
PIPE_DLL_FILE		= tclpip$(VER).dll
PIPE_DLL_FILE		= tclpip$(VER)${DLLSUFFIX}

SHARED_LIBRARIES 	= $(TCL_DLL_FILE) $(TCL_STUB_LIB_FILE) \
			  $(DDE_DLL_FILE) $(REG_DLL_FILE) $(PIPE_DLL_FILE)
STATIC_LIBRARIES	= $(TCL_LIB_FILE)
STATIC_LIBRARIES	= $(TCL_LIB_FILE) $(REG_LIB_FILE) $(DDE_LIB_FILE)

TCLSH			= tclsh$(VER)${EXESUFFIX}
TCLTEST			= tcltest${EXEEXT}
CAT32			= cat32$(EXEEXT)
MAN2TCL			= man2tcl$(EXEEXT)

@SET_MAKE@

# Macro that expands to the first dependency argument with the appropriate
# path type already resolved.

DEPARG = "$(shell $(CYGPATH) $(PATHTYPE) $<)"

# Setting the VPATH variable to a list of paths will cause the 
# makefile to look into these paths when resolving .c to .obj
# dependencies. Note the ':' to avoid autoconf's habit of deleting
# dependencies.
# all VPATH lines without an explicit ':' in it. 

VPATH = $(GENERIC_DIR)@VPSEP@$(WIN_DIR)@VPSEP@$(COMPAT_DIR) # : 
VPATH = $(GENERIC_DIR):$(WIN_DIR):$(COMPAT_DIR)

AR		= @AR@
RANLIB		= @RANLIB@
CC		= @CC@
RC		= @RC@
RES		= @RES@
AC_FLAGS	= @EXTRA_CFLAGS@ @DEFS@
CPPFLAGS	= @CPPFLAGS@
LDFLAGS_DEBUG	= @LDFLAGS_DEBUG@
LDFLAGS_OPTIMIZE = @LDFLAGS_OPTIMIZE@
LDFLAGS		= @LDFLAGS@
LDFLAGS		= @LDFLAGS@ @LDFLAGS_DEFAULT@
LDFLAGS_CONSOLE	= @LDFLAGS_CONSOLE@
LDFLAGS_WINDOW	= @LDFLAGS_WINDOW@
EXEEXT		= @EXEEXT@
OBJEXT		= @OBJEXT@
STLIB_LD	= @STLIB_LD@
SHLIB_LD	= @SHLIB_LD@
SHLIB_LD_LIBS	= @SHLIB_LD_LIBS@
SHLIB_LD_LIBS	= @SHLIB_LD_LIBS@ $(LIBS)
SHLIB_CFLAGS	= @SHLIB_CFLAGS@
SHLIB_SUFFIX	= @SHLIB_SUFFIX@
VER		= @TCL_MAJOR_VERSION@@TCL_MINOR_VERSION@
DOTVER		= @TCL_MAJOR_VERSION@.@TCL_MINOR_VERSION@
LIBS		= @LIBS@

RMDIR		= rm -rf
MKDIR		= mkdir -p
SHELL		= @SHELL@
RM		= rm -f
COPY		= cp

CC_SWITCHES = ${CFLAGS} ${CFLAGS_WARNING} ${TCL_SHLIB_CFLAGS} \
-I"${GENERIC_DIR_NATIVE}" -I"${WIN_DIR_NATIVE}" ${AC_FLAGS} \
${COMPILE_DEBUG_FLAGS}

225
226
227
228
229
230
231

232
233
234
235
236
237
238
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230







+







	tclGet.$(OBJEXT) \
	tclHash.$(OBJEXT) \
	tclHistory.$(OBJEXT) \
	tclIndexObj.$(OBJEXT) \
	tclInterp.$(OBJEXT) \
	tclIO.$(OBJEXT) \
	tclIOCmd.$(OBJEXT) \
	tclIOGT.$(OBJEXT) \
	tclIOSock.$(OBJEXT) \
	tclIOUtil.$(OBJEXT) \
	tclLink.$(OBJEXT) \
	tclLiteral.$(OBJEXT) \
	tclListObj.$(OBJEXT) \
	tclLoad.$(OBJEXT) \
	tclMain.$(OBJEXT) \
294
295
296
297
298
299
300
301

302
303
304
305
306
307
308
309
310
311
312
313
314
315

316
317

318
319

320
321

322
323
324


325
326
327


328
329
330
331
332
333
334

335
336

337
338

339
340
341
342

343
344
345
346





347
348
349
350





351
352
353
354
355
356
357

358
359
360
361
362
363

364
365
366
367
368
369

370
371
372

373
374
375

376
377
378

379
380
381

382
383
384

385
386
387
388
389

390
391
392

393
394
395
396
397
398

399
400
401
402
403
404

405
406

407
408

409
410
411
412
413
414






415




416
417
418
419
420
421
422
423
424
425
426
427

428
429
430
431

432
433
434

435
436
437
438
439
440
441
286
287
288
289
290
291
292

293
294
295
296
297
298
299
300
301
302
303
304
305
306

307
308

309
310

311
312

313
314


315
316
317


318
319
320
321
322
323
324
325
326
327
328

329
330

331
332
333
334
335
336
337
338
339

340
341
342
343
344
345
346
347

348
349
350
351
352
353
354
355
356
357
358

359
360
361
362
363
364

365
366
367
368
369
370

371
372
373

374
375
376

377
378
379

380
381
382

383
384
385

386
387
388
389
390

391
392
393

394
395
396
397
398
399

400
401
402
403
404
405

406
407

408


409
410
411
412



413
414
415
416
417
418

419
420
421
422
423
424
425
426
427
428
429
430
431
432
433

434
435
436
437

438
439
440

441
442
443
444
445
446
447
448







-
+













-
+

-
+

-
+

-
+

-
-
+
+

-
-
+
+







+

-
+

-
+




+



-
+
+
+
+
+



-
+
+
+
+
+






-
+





-
+





-
+


-
+


-
+


-
+


-
+


-
+




-
+


-
+





-
+





-
+

-
+
-
-
+



-
-
-
+
+
+
+
+
+
-
+
+
+
+











-
+



-
+


-
+








TCL_DOCS = "$(ROOT_DIR_NATIVE)"/doc/*.[13n]

all: binaries libraries doc

tcltest: $(TCLTEST)

binaries: @LIBRARIES@ $(STATIC_LIBRARIES) $(TCLSH)
binaries: @LIBRARIES@ $(TCLSH)

libraries:

doc:

winhelp: $(ROOT_DIR)/tools/man2help.tcl $(MAN2TCL)
	TCL_LIBRARY="$(LIBRARY_DIR)"; export TCL_LIBRARY; \
	./$(TCLSH) "$(ROOT_DIR_NATIVE)"/tools/man2help.tcl tcl "$(VER)" $(TCL_DOCS)
	hcw /c /e tcl.hpj

$(MAN2TCL): $(ROOT_DIR)/tools/man2tcl.c
	$(CC) $(CFLAGS_OPTIMIZE) $(MAN2TCLFLAGS) -o $(MAN2TCL) "$(ROOT_DIR_NATIVE)"/tools/man2tcl.c

$(TCLSH): $(TCL_LIB_FILE) $(TCLSH_OBJS) tclsh.res
$(TCLSH): $(TCL_LIB_FILE) $(TCL_STUB_LIB_FILE) $(TCLSH_OBJS) tclsh.$(RES)
	$(CC) $(CFLAGS) $(TCLSH_OBJS) $(TCL_LIB_FILE) $(LIBS) \
        tclsh.res $(CC_EXENAME) 
        tclsh.$(RES) $(CC_EXENAME) $(LDFLAGS_CONSOLE)

$(TCLTEST): $(TCL_LIB_FILE) $(TCLTEST_OBJS) $(CAT32) tclsh.res
$(TCLTEST): $(TCL_LIB_FILE) $(TCLTEST_OBJS) $(CAT32) tclsh.$(RES)
	$(CC) $(CFLAGS) $(TCLTEST_OBJS) $(TCL_LIB_FILE) $(LIBS) \
        tclsh.res $(CC_EXENAME) 
        tclsh.$(RES) $(CC_EXENAME) $(LDFLAGS_CONSOLE)

cat32.${OBJEXT}: cat.c
	$(CC) -c $(CC_SWITCHES) $(DEPARG) $(CC_OBJNAME)
cat32.$(OBJEXT): cat.c
	$(CC) -c $(CC_SWITCHES) @DEPARG@ $(CC_OBJNAME)

$(CAT32): cat32.${OBJEXT}
	$(CC) $(CFLAGS) cat32.obj $(CC_EXENAME) -link $(LDFLAGS_CONSOLE)
$(CAT32): cat32.$(OBJEXT)
	$(CC) $(CFLAGS) cat32.$(OBJEXT) $(CC_EXENAME) $(LDFLAGS_CONSOLE)

# The following targets are configured by autoconf to generate either
# a shared library or static library

${TCL_STUB_LIB_FILE}: ${STUB_OBJS}
	@$(RM) ${TCL_STUB_LIB_FILE}
	@MAKE_LIB@ ${STUB_OBJS}
	@POST_MAKE_LIB@

${TCL_DLL_FILE}: ${TCL_OBJS} tcl.res
${TCL_DLL_FILE}: ${TCL_OBJS} tcl.$(RES)
	@$(RM) ${TCL_DLL_FILE}
	@MAKE_DLL@ ${TCL_OBJS} tcl.res
	@MAKE_DLL@ ${TCL_OBJS} tcl.$(RES) $(SHLIB_LD_LIBS)

${TCL_LIB_FILE}: ${TCL_OBJS}
	@$(RM) ${TCL_LIB_FILE}
	@MAKE_LIB@ ${TCL_OBJS}
	@POST_MAKE_LIB@

${DDE_DLL_FILE}: ${DDE_OBJS} ${TCL_STUB_LIB_FILE}
	@$(RM) ${DDE_DLL_FILE}
	@MAKE_DLL@ ${DDE_OBJS} ${TCL_STUB_LIB_FILE}
	@MAKE_DLL@ ${DDE_OBJS} $(TCL_STUB_LIB_FILE) $(SHLIB_LD_LIBS)

${DDE_LIB_FILE}: ${DDE_OBJS} ${TCL_LIB_FILE}
	@$(RM) ${DDE_LIB_FILE}
	@MAKE_LIB@ ${DDE_OBJS} ${TCL_LIB_FILE}

${REG_DLL_FILE}: ${REG_OBJS} ${TCL_STUB_LIB_FILE}
	@$(RM) ${REG_DLL_FILE}
	@MAKE_DLL@ ${REG_OBJS} ${TCL_STUB_LIB_FILE}
	@MAKE_DLL@ ${REG_OBJS} $(TCL_STUB_LIB_FILE) $(SHLIB_LD_LIBS)

${REG_LIB_FILE}: ${REG_OBJS} ${TCL_LIB_FILE}
	@$(RM) ${REG_LIB_FILE}
	@MAKE_LIB@ ${REG_OBJS} ${TCL_LIB_FILE}

# PIPE_DLL_FILE is actually an executable, don't build it
# like a DLL.

${PIPE_DLL_FILE}: ${PIPE_OBJS}
	@$(RM) ${PIPE_DLL_FILE}
	$(CC) $(CFLAGS) ${PIPE_OBJS} $(LIBS) -Fe$(PIPE_DLL_FILE) 
	@MAKE_EXE@ $(CFLAGS) ${PIPE_OBJS} $(LIBS) $(LDFLAGS_CONSOLE)

# Add the object extension to the implicit rules.  By default .obj is not
# automatically added.

.SUFFIXES: .${OBJEXT}
.SUFFIXES: .res
.SUFFIXES: .$(RES)
.SUFFIXES: .rc

# Special case object targets

tclWinInit.${OBJEXT}: tclWinInit.c
	$(CC) -c $(CC_SWITCHES) -DBUILD_tcl $(EXTFLAGS) $(DEPARG) $(CC_OBJNAME)
	$(CC) -c $(CC_SWITCHES) -DBUILD_tcl $(EXTFLAGS) @DEPARG@ $(CC_OBJNAME)

testMain.${OBJEXT}: tclAppInit.c
	$(CC) -c $(CC_SWITCHES) -DTCL_TEST $(DEPARG) $(CC_OBJNAME)
	$(CC) -c $(CC_SWITCHES) -DTCL_TEST @DEPARG@ $(CC_OBJNAME)

tclTest.${OBJEXT}: tclTest.c
	$(CC) -c $(CC_SWITCHES) $(DEPARG) $(CC_OBJNAME)
	$(CC) -c $(CC_SWITCHES) @DEPARG@ $(CC_OBJNAME)

tclTestObj.${OBJEXT}: tclTestObj.c
	$(CC) -c $(CC_SWITCHES) $(DEPARG) $(CC_OBJNAME)
	$(CC) -c $(CC_SWITCHES) @DEPARG@ $(CC_OBJNAME)

tclWinTest.${OBJEXT}: tclWinTest.c
	$(CC) -c $(CC_SWITCHES) $(DEPARG) $(CC_OBJNAME)
	$(CC) -c $(CC_SWITCHES) @DEPARG@ $(CC_OBJNAME)

tclAppInit.${OBJEXT} : tclAppInit.c
	$(CC) -c $(CC_SWITCHES) $(DEPARG) $(CC_OBJNAME)
	$(CC) -c $(CC_SWITCHES) @DEPARG@ $(CC_OBJNAME)

# The following objects should be built using the stub interfaces

tclWinReg.${OBJEXT} : tclWinReg.c
	$(CC) -c $(CC_SWITCHES) -DUSE_TCL_STUBS $(DEPARG) $(CC_OBJNAME)
	$(CC) -c $(CC_SWITCHES) -DUSE_TCL_STUBS @DEPARG@ $(CC_OBJNAME)

tclWinDde.${OBJEXT} : tclWinDde.c
	$(CC) -c $(CC_SWITCHES) -DUSE_TCL_STUBS $(DEPARG) $(CC_OBJNAME)
	$(CC) -c $(CC_SWITCHES) -DUSE_TCL_STUBS @DEPARG@ $(CC_OBJNAME)

# The following objects are part of the stub library and should not
# be built as DLL objects but none of the symbols should be exported

tclStubLib.${OBJEXT}: tclStubLib.c
	$(CC) -c $(CC_SWITCHES) -DSTATIC_BUILD $(DEPARG) $(CC_OBJNAME)
	$(CC) -c $(CC_SWITCHES) -DSTATIC_BUILD @DEPARG@ $(CC_OBJNAME)


# Implicit rule for all object files that will end up in the Tcl library

.c.${OBJEXT}:
	$(CC) -c $(CC_SWITCHES) -DBUILD_tcl ${DEPARG} $(CC_OBJNAME)
	$(CC) -c $(CC_SWITCHES) -DBUILD_tcl @DEPARG@ $(CC_OBJNAME)

.rc.res:
.rc.$(RES):
	$(RC) -fo $@ -r -i "$(GENERIC_DIR_NATIVE)" $(DEPARG)

	$(RC) @RC_OUT@ $@ @RC_TYPE@ @RC_DEFINES@ @RC_INCLUDE@ "$(GENERIC_DIR_NATIVE)" @RC_INCLUDE@ "$(WIN_DIR_NATIVE)" @DEPARG@

install: all install-binaries install-libraries install-doc

install-binaries:
	@$(MKDIR) -p "$(BIN_INSTALL_DIR)"
	@$(MKDIR) -p "$(LIB_INSTALL_DIR)"
install-binaries: binaries
	@for i in "$(LIB_INSTALL_DIR)" "$(BIN_INSTALL_DIR)" ; \
	    do \
	    if [ ! -d $$i ] ; then \
		echo "Making directory $$i"; \
		$(MKDIR) $$i; \
	$(COPY) tclConfig.sh $(LIB_INSTALL_DIR)/tclConfig.sh
		chmod 755 $$i; \
		else true; \
		fi; \
	    done;
	@for i in dde1.1 reg1.0; \
	    do \
	    if [ ! -d $(LIB_INSTALL_DIR)/$$i ] ; then \
		echo "Making directory $(LIB_INSTALL_DIR)/$$i"; \
		$(MKDIR) $(LIB_INSTALL_DIR)/$$i; \
		else true; \
		fi; \
	    done;
	@for i in $(TCL_DLL_FILE) $(TCLSH) $(PIPE_DLL_FILE); \
	    do \
	    if [ -f $$i ]; then \
		echo "Installing $$i"; \
		echo "Installing $$i to $(BIN_INSTALL_DIR)/"; \
		$(COPY) $$i "$(BIN_INSTALL_DIR)"; \
	    fi; \
	    done
	@for i in $(TCL_LIB_FILE) $(TCL_STUB_LIB_FILE); \
	@for i in tclConfig.sh $(TCL_LIB_FILE) $(TCL_STUB_LIB_FILE); \
	    do \
	    if [ -f $$i ]; then \
		echo "Installing $$i"; \
		echo "Installing $$i to $(LIB_INSTALL_DIR)/"; \
		$(COPY) $$i "$(LIB_INSTALL_DIR)"; \
	    fi; \
	    done
	@if [ -f $(DDE_DLL_FILE) ]; then \
	    echo installing $(DDE_DLL_FILE); \
	    $(COPY) $(DDE_DLL_FILE) $(LIB_INSTALL_DIR)/dde1.1; \
	    $(COPY) $(ROOT_DIR)/library/dde1.1/pkgIndex.tcl $(LIB_INSTALL_DIR)/dde1.1; \
450
451
452
453
454
455
456
457

458
459
460
461
462
463
464
465
466
467

468
469
470
471
472
473
474
475
476


477
478
479
480
481
482
483
484

485

486


487
488
489
490
491














492





493

494
495
496
497
498





499
500
501
502
503
504
505
506

507

508












509
510
511
512

513
514
515
516
517
518
519

520
521
522
523
524
525
526
457
458
459
460
461
462
463

464
465
466
467
468
469
470
471
472
473

474
475
476
477
478
479
480
481
482

483
484
485
486
487
488
489
490
491
492
493

494
495
496
497





498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517

518
519
520
521
522

523
524
525
526
527
528
529
530
531
532
533
534

535
536
537

538
539
540
541
542
543
544
545
546
547
548
549
550
551
552

553
554
555
556
557
558
559

560
561
562
563
564
565
566
567







-
+









-
+








-
+
+








+
-
+

+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
-
+




-
+
+
+
+
+







-
+

+
-
+
+
+
+
+
+
+
+
+
+
+
+



-
+






-
+







	    $(COPY) $(ROOT_DIR)/library/reg1.0/pkgIndex.tcl $(LIB_INSTALL_DIR)/reg1.0; \
	    fi
	@if [ -f $(REG_LIB_FILE) ]; then \
	    echo installing $(REG_LIB_FILE); \
	    $(COPY) $(REG_LIB_FILE) $(LIB_INSTALL_DIR)/reg1.0; \
	    fi

install-libraries:
install-libraries: libraries
	@for i in $(prefix)/lib $(INCLUDE_INSTALL_DIR) \
		$(SCRIPT_INSTALL_DIR); \
	    do \
	    if [ ! -d $$i ] ; then \
		echo "Making directory $$i"; \
		$(MKDIR) $$i; \
		else true; \
		fi; \
	    done;
	@for i in http1.0 http2.3 opt0.4 encoding msgcat1.0 tcltest1.0; \
	@for i in http1.0 http2.4 opt0.4 encoding msgcat1.1 tcltest1.0; \
	    do \
	    if [ ! -d $(SCRIPT_INSTALL_DIR)/$$i ] ; then \
		echo "Making directory $(SCRIPT_INSTALL_DIR)/$$i"; \
		$(MKDIR) $(SCRIPT_INSTALL_DIR)/$$i; \
		else true; \
		fi; \
	    done;
	@echo "Installing header files";
	@for i in "$(GENERIC_DIR)/tcl.h" "$(GENERIC_DIR)/tclDecls.h" ; \
	@for i in "$(GENERIC_DIR)/tcl.h" "$(GENERIC_DIR)/tclDecls.h" \
		"$(GENERIC_DIR)/tclPlatDecls.h" ; \
	    do \
	    $(COPY) "$$i" "$(INCLUDE_INSTALL_DIR)"; \
	    done;
	@echo "Installing library files to $(SCRIPT_INSTALL_DIR)";
	@for i in $(ROOT_DIR)/library/*.tcl $(ROOT_DIR)/library/tclIndex; \
	    do \
	    $(COPY) "$$i" "$(SCRIPT_INSTALL_DIR)"; \
	    done;
	@echo "Installing library http1.0 directory";
	@for i in http2.3 http1.0 opt0.4 msgcat1.0 tcltest1.0; \
	@for j in $(ROOT_DIR)/library/http1.0/*.tcl; \
	    do \
	    $(COPY) "$$j" "$(SCRIPT_INSTALL_DIR)/http1.0"; \
	    done;
	    echo "Installing library $$i directory"; \
	    for j in $(ROOT_DIR)/library/$$i/*.tcl; \
		do \
		$(COPY) "$$j" "$(SCRIPT_INSTALL_DIR)/$$i"; \
		done; \
	@echo "Installing library http2.4 directory";
	@for j in $(ROOT_DIR)/library/http/*.tcl; \
	    do \
	    $(COPY) "$$j" "$(SCRIPT_INSTALL_DIR)/http2.4"; \
	    done;
	@echo "Installing library opt0.4 directory";
	@for j in $(ROOT_DIR)/library/opt/*.tcl; \
	    do \
	    $(COPY) "$$j" "$(SCRIPT_INSTALL_DIR)/opt0.4"; \
	    done;
	@echo "Installing library msgcat1.1 directory";
	@for j in $(ROOT_DIR)/library/msgcat/*.tcl; \
	    do \
	    $(COPY) "$$j" "$(SCRIPT_INSTALL_DIR)/msgcat1.1"; \
	    done;
	@echo "Installing library tcltest1.0 directory";
	@for j in $(ROOT_DIR)/library/tcltest1.0/*.tcl; \
	    do \
	    $(COPY) "$$j" "$(SCRIPT_INSTALL_DIR)/tcltest1.0"; \
	    done;
	@echo "Installing encodings"
	@echo "Installing encodings";
	@for i in $(ROOT_DIR)/library/encoding/*.enc ; do \
		$(COPY) "$$i" "$(SCRIPT_INSTALL_DIR)/encoding"; \
	done;

install-doc:
install-doc: doc

# Specifying TESTFLAGS on the command line is the standard way to pass
# args to tcltest, ie:
#	% make test TESTFLAGS="-verbose bps -file fileName.test"

test: binaries $(TCLTEST)
	TCL_LIBRARY="$(LIBRARY_DIR)"; export TCL_LIBRARY; \
	./$(TCLTEST) "$(ROOT_DIR_NATIVE)/tests/all.tcl" $(TESTFLAGS) \
	| ./$(CAT32)

# Useful target to launch a built tcltest with the proper path,...
runtest: tcltest
runtest: binaries $(TCLTEST)
	@TCL_LIBRARY="$(LIBRARY_DIR)"; export TCL_LIBRARY; \
	./$(TCLTEST) $(TESTFLAGS) $(SCRIPT)
	    ./tcltest

# This target can be used to run tclsh from the build directory
# via `make shell SCRIPT=foo.tcl`
shell: binaries
	@TCL_LIBRARY="$(LIBRARY_DIR)"; export TCL_LIBRARY; \
	./$(TCLSH) $(SCRIPT)

# This target can be used to run tclsh inside either gdb or insight
gdb: binaries
	@echo "set env TCL_LIBRARY=$(LIBRARY_DIR)" > gdb.run
	gdb ./tclsh --command=gdb.run
	rm gdb.run

depend:

Makefile: Makefile.in
Makefile: $(SRC_DIR)/Makefile.in
	./config.status

cleanhelp:
	$(RM) *.hlp *.cnt *.GID *.rtf man2tcl.exe

clean: cleanhelp
	$(RM) *.lib *.exp *.dll *.res *.${OBJEXT} *~ \#* TAGS a.out
	$(RM) *.lib *.a *.exp *.dll *.$(RES) *.${OBJEXT} *~ \#* TAGS a.out
	$(RM) $(TCLSH) $(TCLTEST) $(CAT32)
	$(RM) *.pch *.ilk *.pdb

distclean: clean
	$(RM) Makefile config.status config.cache config.log tclConfig.sh \
		tcl.hpj

Changes to win/README.
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
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


-
-
-
-
-
+









+
-
+








-
+

-
+













-
-
-
-
-
-
-
-
+
+
+







-
-
-







-
+
+




Tcl 8.3 for Windows

by Scott Stanton
Scriptics Corporation
scott.stanton@scriptics.com

RCS: @(#) $Id: README,v 1.16 2000/04/26 17:31:22 hobbs Exp $
RCS: @(#) $Id: README,v 1.16.2.3 2001/10/03 20:26:10 hobbs Exp $

1. Introduction
---------------

This is the directory where you configure and compile the Windows
version of Tcl.  This directory also contains source files for Tcl
that are specific to Microsoft Windows.

The information in this file is maintained on the web at:

	http://dev.scriptics.com/doc/howto/compile.html#win
	http://www.tcl-tk.net/doc/howto/compile.html#win

2. Compiling Tcl
----------------

In order to compile Tcl for Windows, you need the following items:

	Tcl 8.3 Source Distribution (plus any patches)

	Visual C++ 2.x/4.x/5.x
	Visual C++ 5+

In practice, this release is built with Visual C++ 5.0
In practice, this release is built with Visual C++ 6.0.

In the "win" subdirectory of the source release, you will find
"makefile.vc".  This is the makefile Visual C++ compiler.  You should
update the paths at the top of the file to reflect your system
configuration.  Now you can use "make" (or "nmake" for VC++) to build
the tcl libraries and the tclsh executable.

In order to use the binaries generated by these makefiles, you will
need to place the Tcl script library files someplace where Tcl can
find them.  Tcl looks in one of following places for the library files:

	1) The path specified in the environment variable "TCL_LIBRARY".

	2) In the lib\tcl8.3 directory under the installation directory
	   as specified in the registry:

		HKEY_LOCAL_MACHINE\SOFTWARE\Scriptics\Tcl\8.3

	3) Relative to the directory containing the current .exe.
	    Tcl will look for a directory "..\lib\tcl8.3" relative to the
	    directory containing the currently running .exe.
	2) Relative to the directory containing the current .exe.
	   Tcl will look for a directory "..\lib\tcl8.3" relative to the
	   directory containing the currently running .exe.

Note that in order to run tclsh83.exe, you must ensure that tcl83.dll
and tclpip83.dll are on your path, in the system directory, or in the 
directory containing tclsh83.exe.

Note: Tcl no longer provides support for Win32s.

This page includes a lengthy discussion of compiler macros necessary
when compiling Tcl extensions that will be dynamically loaded.

3. Test suite
-------------

This distribution contains an extensive test suite for Tcl.  Some of
the tests are timing dependent and will fail from time to time.  If a
test is failing consistently, please send us a bug report with as much
detail as you can manage.  Please use the online database at
	http://dev.scriptics.com/ticket/

	http://tcl.sourceforge.net/

In order to run the test suite, you build the "test" target using the
appropriate makefile for your compiler.

Changes to win/README.binary.
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
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


-
+




-
+










-
+
-




-
-
+
+

-
-
+
+

-
-
+
+

-
-
+
+


-
+


-
+





-
+







Tcl/Tk 8.3 for Windows, Binary Distribution

RCS: @(#) $Id: README.binary,v 1.19 2000/04/26 17:31:22 hobbs Exp $ 
RCS: @(#) $Id: README.binary,v 1.19.2.4 2001/10/03 20:26:10 hobbs Exp $ 

1. Introduction
--------------- 

This directory contains the binary distribution of Tcl/Tk 8.3.1 for
This directory contains the binary distribution of Tcl/Tk 8.3.4 for
Windows.  It was compiled with Microsoft Visual C++ 5.0 using Win32
API, so that it will run under Windows NT, 95, 98 and 2000.

Tcl provides a powerful platform for creating integration applications
that tie together diverse applications, protocols, devices, and
frameworks.  When paired with the Tk toolkit, Tcl provides the fastest
and most powerful way to create GUI applications that run on PCs, Unix,
and the Macintosh.  Tcl can also be used for a variety of web-related
tasks and for creating powerful command languages for applications.

Tcl is maintained, enhanced, and distributed freely as a service to the
Tcl is maintained, enhanced, and distributed freely by the Tcl community.
Tcl community by Scriptics Corporation.

2. Documentation
----------------

The official home for Tcl and Tk on the Web is at:
	http://dev.scriptics.com
The home of Tcl and Tk sources and bug database on the Web is at:
	http://tcl.sourceforge.net/

The home page for the Tcl/Tk 8.3 release is
	http://dev.scriptics.com/software/tcltk/8.3.html
The home page for the Tcl Developer Xchange is at:
	http://www.tcl-tk.net/

Detailed release notes can be found at
	http://dev.scriptics.com/software/tcltk/relnotes/tcl8.3.1.txt
The home page for the Tcl/Tk release is
	http://www.tcl-tk.net/software/tcltk/

Information about Tcl itself can be found at
	http://dev.scriptics.com/scripting/
Detailed release notes can be found at
	http://sourceforge.net/project/showfiles.php?group_id=10894

There are many Tcl books on the market.  Most are listed at
	http://dev.scriptics.com/resource/doc/books/
	http://www.tcl-tk.net/resource/doc/books/

There are notes about compiling Tcl at
	http://dev.scriptics.com/doc/howto/compile.html
	http://www.tcl-tk.net/doc/howto/compile.html

3. Installation
---------------

The binary release is distributed as a self-extracting archive called
tcl83.exe.  The setup program which will prompt you for an
tcl<version>.exe.  The setup program which will prompt you for an
installation directory.  It will create the installation heirarchy
under the specified directory, and install a wish application icon
under the program manager group of your choice.

We are no longer supporting use of Tcl with 16-bit versions of
Windows.  Microsoft has completely dropped support of the Win32s
subsystem.
77
78
79
80
81
82
83
84

85
86
87
88
89
90
91
76
77
78
79
80
81
82

83
84
85
86
87
88
89
90







-
+







systems.

6. Reporting Bugs
-----------------
If you have comments or bug reports for the Windows version of Tcl,
please use our online database at:

	http://dev.scriptics.com/ticket/
	http://tcl.sourceforge.net/

or post them to the newsgroup comp.lang.tcl.

7. Tcl newsgroup
-----------------

There is a network news group "comp.lang.tcl" intended for the exchange
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
119
120
121
122
123
124
125




126



127




128
129





130

131



132











-
-
-
-
+
-
-
-
+
-
-
-
-
+
+
-
-
-
-
-
+
-

-
-
-
+
-
-
-
-
releases, and patches.  You can contribute patches by sending them
to <patches@scriptics.com>.  You can also recommend more URLs for the
resource center using the forms labeled "Add a Resource".

10. Mailing lists
----------------

A couple of mailing lists have been set up to discuss Macintosh or
Windows related Tcl issues.  In order to use these Mailing Lists you
must have access to the internet.  To subscribe send a message to:
	
Several mailing lists are hosted at SourceForge to discuss development or
	wintcl-request@scriptics.com
	mactcl-request@scriptics.com

use issues (like Macintosh and Windows topics).  For more information and
In the body of the message (the subject will be ignored) put:
	
	subscribe mactcl Joe Blow
	
to subscribe, visit:

Replacing Joe Blow with your real name, of course.  (Use wintcl
instead of mactcl if you're interested in the Windows list.)  If you
would just like to receive more information about the list without
subscribing put the line:

	http://sourceforge.net/projects/tcl/
	information mactcl

in the body instead (or wintcl).  There are also Special Interest
Groups (SIGs) setup for these topics and more at:

and go to the Mailing Lists page.
       http://dev.scriptics.com/



Added win/configure.





























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
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
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#! /bin/sh

# Guess values for system-dependent variables and create Makefiles.
# Generated automatically using autoconf version 2.13 
# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
#
# This configure script is free software; the Free Software Foundation
# gives unlimited permission to copy, distribute and modify it.

# Defaults:
ac_help=
ac_default_prefix=/usr/local
# Any additions from configure.in:
ac_help="$ac_help
  --enable-gcc            allow use of gcc if available [--disable-gcc]"
ac_help="$ac_help
  --enable-threads        build with threads"
ac_help="$ac_help
  --enable-shared         build and link with shared libraries [--enable-shared]"
ac_help="$ac_help
  --enable-64bit          enable 64bit support (where applicable)"
ac_help="$ac_help
  --enable-symbols        build with debugging symbols [--disable-symbols]"

# Initialize some variables set by options.
# The variables have the same names as the options, with
# dashes changed to underlines.
build=NONE
cache_file=./config.cache
exec_prefix=NONE
host=NONE
no_create=
nonopt=NONE
no_recursion=
prefix=NONE
program_prefix=NONE
program_suffix=NONE
program_transform_name=s,x,x,
silent=
site=
srcdir=
target=NONE
verbose=
x_includes=NONE
x_libraries=NONE
bindir='${exec_prefix}/bin'
sbindir='${exec_prefix}/sbin'
libexecdir='${exec_prefix}/libexec'
datadir='${prefix}/share'
sysconfdir='${prefix}/etc'
sharedstatedir='${prefix}/com'
localstatedir='${prefix}/var'
libdir='${exec_prefix}/lib'
includedir='${prefix}/include'
oldincludedir='/usr/include'
infodir='${prefix}/info'
mandir='${prefix}/man'

# Initialize some other variables.
subdirs=
MFLAGS= MAKEFLAGS=
SHELL=${CONFIG_SHELL-/bin/sh}
# Maximum number of lines to put in a shell here document.
ac_max_here_lines=12

ac_prev=
for ac_option
do

  # If the previous option needs an argument, assign it.
  if test -n "$ac_prev"; then
    eval "$ac_prev=\$ac_option"
    ac_prev=
    continue
  fi

  case "$ac_option" in
  -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
  *) ac_optarg= ;;
  esac

  # Accept the important Cygnus configure options, so we can diagnose typos.

  case "$ac_option" in

  -bindir | --bindir | --bindi | --bind | --bin | --bi)
    ac_prev=bindir ;;
  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
    bindir="$ac_optarg" ;;

  -build | --build | --buil | --bui | --bu)
    ac_prev=build ;;
  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
    build="$ac_optarg" ;;

  -cache-file | --cache-file | --cache-fil | --cache-fi \
  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
    ac_prev=cache_file ;;
  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
    cache_file="$ac_optarg" ;;

  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
    ac_prev=datadir ;;
  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
  | --da=*)
    datadir="$ac_optarg" ;;

  -disable-* | --disable-*)
    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
    fi
    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
    eval "enable_${ac_feature}=no" ;;

  -enable-* | --enable-*)
    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
    fi
    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
    case "$ac_option" in
      *=*) ;;
      *) ac_optarg=yes ;;
    esac
    eval "enable_${ac_feature}='$ac_optarg'" ;;

  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
  | --exec | --exe | --ex)
    ac_prev=exec_prefix ;;
  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
  | --exec=* | --exe=* | --ex=*)
    exec_prefix="$ac_optarg" ;;

  -gas | --gas | --ga | --g)
    # Obsolete; use --with-gas.
    with_gas=yes ;;

  -help | --help | --hel | --he)
    # Omit some internal or obsolete options to make the list less imposing.
    # This message is too long to be a string in the A/UX 3.1 sh.
    cat << EOF
Usage: configure [options] [host]
Options: [defaults in brackets after descriptions]
Configuration:
  --cache-file=FILE       cache test results in FILE
  --help                  print this message
  --no-create             do not create output files
  --quiet, --silent       do not print \`checking...' messages
  --version               print the version of autoconf that created configure
Directory and file names:
  --prefix=PREFIX         install architecture-independent files in PREFIX
                          [$ac_default_prefix]
  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                          [same as prefix]
  --bindir=DIR            user executables in DIR [EPREFIX/bin]
  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
  --datadir=DIR           read-only architecture-independent data in DIR
                          [PREFIX/share]
  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
  --sharedstatedir=DIR    modifiable architecture-independent data in DIR
                          [PREFIX/com]
  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
  --includedir=DIR        C header files in DIR [PREFIX/include]
  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
  --infodir=DIR           info documentation in DIR [PREFIX/info]
  --mandir=DIR            man documentation in DIR [PREFIX/man]
  --srcdir=DIR            find the sources in DIR [configure dir or ..]
  --program-prefix=PREFIX prepend PREFIX to installed program names
  --program-suffix=SUFFIX append SUFFIX to installed program names
  --program-transform-name=PROGRAM
                          run sed PROGRAM on installed program names
EOF
    cat << EOF
Host type:
  --build=BUILD           configure for building on BUILD [BUILD=HOST]
  --host=HOST             configure for HOST [guessed]
  --target=TARGET         configure for TARGET [TARGET=HOST]
Features and packages:
  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
  --x-includes=DIR        X include files are in DIR
  --x-libraries=DIR       X library files are in DIR
EOF
    if test -n "$ac_help"; then
      echo "--enable and --with options recognized:$ac_help"
    fi
    exit 0 ;;

  -host | --host | --hos | --ho)
    ac_prev=host ;;
  -host=* | --host=* | --hos=* | --ho=*)
    host="$ac_optarg" ;;

  -includedir | --includedir | --includedi | --included | --include \
  | --includ | --inclu | --incl | --inc)
    ac_prev=includedir ;;
  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
  | --includ=* | --inclu=* | --incl=* | --inc=*)
    includedir="$ac_optarg" ;;

  -infodir | --infodir | --infodi | --infod | --info | --inf)
    ac_prev=infodir ;;
  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
    infodir="$ac_optarg" ;;

  -libdir | --libdir | --libdi | --libd)
    ac_prev=libdir ;;
  -libdir=* | --libdir=* | --libdi=* | --libd=*)
    libdir="$ac_optarg" ;;

  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
  | --libexe | --libex | --libe)
    ac_prev=libexecdir ;;
  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
  | --libexe=* | --libex=* | --libe=*)
    libexecdir="$ac_optarg" ;;

  -localstatedir | --localstatedir | --localstatedi | --localstated \
  | --localstate | --localstat | --localsta | --localst \
  | --locals | --local | --loca | --loc | --lo)
    ac_prev=localstatedir ;;
  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
    localstatedir="$ac_optarg" ;;

  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
    ac_prev=mandir ;;
  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
    mandir="$ac_optarg" ;;

  -nfp | --nfp | --nf)
    # Obsolete; use --without-fp.
    with_fp=no ;;

  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
  | --no-cr | --no-c)
    no_create=yes ;;

  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
    no_recursion=yes ;;

  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
  | --oldin | --oldi | --old | --ol | --o)
    ac_prev=oldincludedir ;;
  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
    oldincludedir="$ac_optarg" ;;

  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
    ac_prev=prefix ;;
  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
    prefix="$ac_optarg" ;;

  -program-prefix | --program-prefix | --program-prefi | --program-pref \
  | --program-pre | --program-pr | --program-p)
    ac_prev=program_prefix ;;
  -program-prefix=* | --program-prefix=* | --program-prefi=* \
  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
    program_prefix="$ac_optarg" ;;

  -program-suffix | --program-suffix | --program-suffi | --program-suff \
  | --program-suf | --program-su | --program-s)
    ac_prev=program_suffix ;;
  -program-suffix=* | --program-suffix=* | --program-suffi=* \
  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
    program_suffix="$ac_optarg" ;;

  -program-transform-name | --program-transform-name \
  | --program-transform-nam | --program-transform-na \
  | --program-transform-n | --program-transform- \
  | --program-transform | --program-transfor \
  | --program-transfo | --program-transf \
  | --program-trans | --program-tran \
  | --progr-tra | --program-tr | --program-t)
    ac_prev=program_transform_name ;;
  -program-transform-name=* | --program-transform-name=* \
  | --program-transform-nam=* | --program-transform-na=* \
  | --program-transform-n=* | --program-transform-=* \
  | --program-transform=* | --program-transfor=* \
  | --program-transfo=* | --program-transf=* \
  | --program-trans=* | --program-tran=* \
  | --progr-tra=* | --program-tr=* | --program-t=*)
    program_transform_name="$ac_optarg" ;;

  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
  | -silent | --silent | --silen | --sile | --sil)
    silent=yes ;;

  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
    ac_prev=sbindir ;;
  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
  | --sbi=* | --sb=*)
    sbindir="$ac_optarg" ;;

  -sharedstatedir | --sharedstatedir | --sharedstatedi \
  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
  | --sharedst | --shareds | --shared | --share | --shar \
  | --sha | --sh)
    ac_prev=sharedstatedir ;;
  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
  | --sha=* | --sh=*)
    sharedstatedir="$ac_optarg" ;;

  -site | --site | --sit)
    ac_prev=site ;;
  -site=* | --site=* | --sit=*)
    site="$ac_optarg" ;;

  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
    ac_prev=srcdir ;;
  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
    srcdir="$ac_optarg" ;;

  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
  | --syscon | --sysco | --sysc | --sys | --sy)
    ac_prev=sysconfdir ;;
  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
    sysconfdir="$ac_optarg" ;;

  -target | --target | --targe | --targ | --tar | --ta | --t)
    ac_prev=target ;;
  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
    target="$ac_optarg" ;;

  -v | -verbose | --verbose | --verbos | --verbo | --verb)
    verbose=yes ;;

  -version | --version | --versio | --versi | --vers)
    echo "configure generated by autoconf version 2.13"
    exit 0 ;;

  -with-* | --with-*)
    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
    fi
    ac_package=`echo $ac_package| sed 's/-/_/g'`
    case "$ac_option" in
      *=*) ;;
      *) ac_optarg=yes ;;
    esac
    eval "with_${ac_package}='$ac_optarg'" ;;

  -without-* | --without-*)
    ac_package=`echo $ac_option|sed -e 's/-*without-//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
    fi
    ac_package=`echo $ac_package| sed 's/-/_/g'`
    eval "with_${ac_package}=no" ;;

  --x)
    # Obsolete; use --with-x.
    with_x=yes ;;

  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
  | --x-incl | --x-inc | --x-in | --x-i)
    ac_prev=x_includes ;;
  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
    x_includes="$ac_optarg" ;;

  -x-libraries | --x-libraries | --x-librarie | --x-librari \
  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
    ac_prev=x_libraries ;;
  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
    x_libraries="$ac_optarg" ;;

  -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
    ;;

  *)
    if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
      echo "configure: warning: $ac_option: invalid host type" 1>&2
    fi
    if test "x$nonopt" != xNONE; then
      { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
    fi
    nonopt="$ac_option"
    ;;

  esac
done

if test -n "$ac_prev"; then
  { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
fi

trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15

# File descriptor usage:
# 0 standard input
# 1 file creation
# 2 errors and warnings
# 3 some systems may open it to /dev/tty
# 4 used on the Kubota Titan
# 6 checking for... messages and results
# 5 compiler messages saved in config.log
if test "$silent" = yes; then
  exec 6>/dev/null
else
  exec 6>&1
fi
exec 5>./config.log

echo "\
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
" 1>&5

# Strip out --no-create and --no-recursion so they do not pile up.
# Also quote any args containing shell metacharacters.
ac_configure_args=
for ac_arg
do
  case "$ac_arg" in
  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
  | --no-cr | --no-c) ;;
  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
  *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
  ac_configure_args="$ac_configure_args '$ac_arg'" ;;
  *) ac_configure_args="$ac_configure_args $ac_arg" ;;
  esac
done

# NLS nuisances.
# Only set these to C if already set.  These must not be set unconditionally
# because not all systems understand e.g. LANG=C (notably SCO).
# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
# Non-C LC_CTYPE values break the ctype check.
if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi

# confdefs.h avoids OS command line length limits that DEFS can exceed.
rm -rf conftest* confdefs.h
# AIX cpp loses on an empty file, so make sure it contains at least a newline.
echo > confdefs.h

# A filename unique to this package, relative to the directory that
# configure is in, which we can look for to find out if srcdir is correct.
ac_unique_file=../generic/tcl.h

# Find the source files, if location was not specified.
if test -z "$srcdir"; then
  ac_srcdir_defaulted=yes
  # Try the directory containing this script, then its parent.
  ac_prog=$0
  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
  srcdir=$ac_confdir
  if test ! -r $srcdir/$ac_unique_file; then
    srcdir=..
  fi
else
  ac_srcdir_defaulted=no
fi
if test ! -r $srcdir/$ac_unique_file; then
  if test "$ac_srcdir_defaulted" = yes; then
    { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
  else
    { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
  fi
fi
srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`

# Prefer explicitly selected file to automatically selected ones.
if test -z "$CONFIG_SITE"; then
  if test "x$prefix" != xNONE; then
    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
  else
    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
  fi
fi
for ac_site_file in $CONFIG_SITE; do
  if test -r "$ac_site_file"; then
    echo "loading site script $ac_site_file"
    . "$ac_site_file"
  fi
done

if test -r "$cache_file"; then
  echo "loading cache $cache_file"
  . $cache_file
else
  echo "creating cache $cache_file"
  > $cache_file
fi

ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

ac_exeext=
ac_objext=o
if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
  # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
    ac_n= ac_c='
' ac_t='	'
  else
    ac_n=-n ac_c= ac_t=
  fi
else
  ac_n= ac_c='\c' ac_t=
fi



TCL_VERSION=8.3
TCL_MAJOR_VERSION=8
TCL_MINOR_VERSION=3
TCL_PATCH_LEVEL=".4"
VER=$TCL_MAJOR_VERSION$TCL_MINOR_VERSION

#------------------------------------------------------------------------
# Handle the --prefix=... option
#------------------------------------------------------------------------

if test "${prefix}" = "NONE"; then
    prefix=/usr/local
fi
if test "${exec_prefix}" = "NONE"; then
    exec_prefix=$prefix
fi

#--------------------------------------------------------------------
# Check whether --enable-gcc or --disable-gcc was given.  Do this 
# before AC_PROG_CC and AC_CYGWIN are called so the compiler can 
# be fully tested by built-in autoconf tools.
#--------------------------------------------------------------------
 

    # Check whether --enable-gcc or --disable-gcc was given.
if test "${enable_gcc+set}" = set; then
  enableval="$enable_gcc"
  ok=$enableval
else
  ok=no
fi

    if test "$ok" = "yes"; then
	# Quick hack to simulate a real cross check
	# The right way to do this is to use AC_CHECK_TOOL
	# correctly, but this is the minimal change
	# we need until the real fix is ready.
	if test "$host" != "$build" ; then
	    if test -z "$CC"; then
		CC=${host}-gcc
	    fi
	    # Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:580: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_CC="gcc"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
CC="$ac_cv_prog_CC"
if test -n "$CC"; then
  echo "$ac_t""$CC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

if test -z "$CC"; then
  # Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:610: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_prog_rejected=no
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
        ac_prog_rejected=yes
	continue
      fi
      ac_cv_prog_CC="cc"
      break
    fi
  done
  IFS="$ac_save_ifs"
if test $ac_prog_rejected = yes; then
  # We found a bogon in the path, so make sure we never use it.
  set dummy $ac_cv_prog_CC
  shift
  if test $# -gt 0; then
    # We chose a different compiler from the bogus one.
    # However, it has the same basename, so the bogon will be chosen
    # first if we set CC to just the basename; use the full file name.
    shift
    set dummy "$ac_dir/$ac_word" "$@"
    shift
    ac_cv_prog_CC="$@"
  fi
fi
fi
fi
CC="$ac_cv_prog_CC"
if test -n "$CC"; then
  echo "$ac_t""$CC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

  if test -z "$CC"; then
    case "`uname -s`" in
    *win32* | *WIN32*)
      # Extract the first word of "cl", so it can be a program name with args.
set dummy cl; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:661: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_CC="cl"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
CC="$ac_cv_prog_CC"
if test -n "$CC"; then
  echo "$ac_t""$CC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi
 ;;
    esac
  fi
  test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
fi

echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
echo "configure:693: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5

ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

cat > conftest.$ac_ext << EOF

#line 704 "configure"
#include "confdefs.h"

main(){return(0);}
EOF
if { (eval echo configure:709: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  ac_cv_prog_cc_works=yes
  # If we can't run a trivial program, we are probably using a cross compiler.
  if (./conftest; exit) 2>/dev/null; then
    ac_cv_prog_cc_cross=no
  else
    ac_cv_prog_cc_cross=yes
  fi
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  ac_cv_prog_cc_works=no
fi
rm -fr conftest*
ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
if test $ac_cv_prog_cc_works = no; then
  { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
echo "configure:735: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
cross_compiling=$ac_cv_prog_cc_cross

echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
echo "configure:740: checking whether we are using GNU C" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.c <<EOF
#ifdef __GNUC__
  yes;
#endif
EOF
if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:749: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
  ac_cv_prog_gcc=yes
else
  ac_cv_prog_gcc=no
fi
fi

echo "$ac_t""$ac_cv_prog_gcc" 1>&6

if test $ac_cv_prog_gcc = yes; then
  GCC=yes
else
  GCC=
fi

ac_test_CFLAGS="${CFLAGS+set}"
ac_save_CFLAGS="$CFLAGS"
CFLAGS=
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
echo "configure:768: checking whether ${CC-cc} accepts -g" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  echo 'void f(){}' > conftest.c
if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
  ac_cv_prog_cc_g=yes
else
  ac_cv_prog_cc_g=no
fi
rm -f conftest*

fi

echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
if test "$ac_test_CFLAGS" = set; then
  CFLAGS="$ac_save_CFLAGS"
elif test $ac_cv_prog_cc_g = yes; then
  if test "$GCC" = yes; then
    CFLAGS="-g -O2"
  else
    CFLAGS="-g"
  fi
else
  if test "$GCC" = yes; then
    CFLAGS="-O2"
  else
    CFLAGS=
  fi
fi

	    # Extract the first word of "${host}-ar", so it can be a program name with args.
set dummy ${host}-ar; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:802: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$AR"; then
  ac_cv_prog_AR="$AR" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_AR="${host}-ar"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
AR="$ac_cv_prog_AR"
if test -n "$AR"; then
  echo "$ac_t""$AR" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

	    # Extract the first word of "${host}-ranlib", so it can be a program name with args.
set dummy ${host}-ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:831: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$RANLIB"; then
  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_RANLIB="${host}-ranlib"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
RANLIB="$ac_cv_prog_RANLIB"
if test -n "$RANLIB"; then
  echo "$ac_t""$RANLIB" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

	    # Extract the first word of "${host}-windres", so it can be a program name with args.
set dummy ${host}-windres; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:860: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$RC"; then
  ac_cv_prog_RC="$RC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_RC="${host}-windres"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
RC="$ac_cv_prog_RC"
if test -n "$RC"; then
  echo "$ac_t""$RC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

	else
	    if test -z "$CC"; then
		CC=gcc
	    fi
	    # Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:893: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_CC="gcc"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
CC="$ac_cv_prog_CC"
if test -n "$CC"; then
  echo "$ac_t""$CC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

if test -z "$CC"; then
  # Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:923: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_prog_rejected=no
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
        ac_prog_rejected=yes
	continue
      fi
      ac_cv_prog_CC="cc"
      break
    fi
  done
  IFS="$ac_save_ifs"
if test $ac_prog_rejected = yes; then
  # We found a bogon in the path, so make sure we never use it.
  set dummy $ac_cv_prog_CC
  shift
  if test $# -gt 0; then
    # We chose a different compiler from the bogus one.
    # However, it has the same basename, so the bogon will be chosen
    # first if we set CC to just the basename; use the full file name.
    shift
    set dummy "$ac_dir/$ac_word" "$@"
    shift
    ac_cv_prog_CC="$@"
  fi
fi
fi
fi
CC="$ac_cv_prog_CC"
if test -n "$CC"; then
  echo "$ac_t""$CC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

  if test -z "$CC"; then
    case "`uname -s`" in
    *win32* | *WIN32*)
      # Extract the first word of "cl", so it can be a program name with args.
set dummy cl; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:974: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_CC="cl"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
CC="$ac_cv_prog_CC"
if test -n "$CC"; then
  echo "$ac_t""$CC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi
 ;;
    esac
  fi
  test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
fi

echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
echo "configure:1006: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5

ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

cat > conftest.$ac_ext << EOF

#line 1017 "configure"
#include "confdefs.h"

main(){return(0);}
EOF
if { (eval echo configure:1022: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  ac_cv_prog_cc_works=yes
  # If we can't run a trivial program, we are probably using a cross compiler.
  if (./conftest; exit) 2>/dev/null; then
    ac_cv_prog_cc_cross=no
  else
    ac_cv_prog_cc_cross=yes
  fi
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  ac_cv_prog_cc_works=no
fi
rm -fr conftest*
ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
if test $ac_cv_prog_cc_works = no; then
  { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
echo "configure:1048: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
cross_compiling=$ac_cv_prog_cc_cross

echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
echo "configure:1053: checking whether we are using GNU C" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.c <<EOF
#ifdef __GNUC__
  yes;
#endif
EOF
if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1062: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
  ac_cv_prog_gcc=yes
else
  ac_cv_prog_gcc=no
fi
fi

echo "$ac_t""$ac_cv_prog_gcc" 1>&6

if test $ac_cv_prog_gcc = yes; then
  GCC=yes
else
  GCC=
fi

ac_test_CFLAGS="${CFLAGS+set}"
ac_save_CFLAGS="$CFLAGS"
CFLAGS=
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
echo "configure:1081: checking whether ${CC-cc} accepts -g" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  echo 'void f(){}' > conftest.c
if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
  ac_cv_prog_cc_g=yes
else
  ac_cv_prog_cc_g=no
fi
rm -f conftest*

fi

echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
if test "$ac_test_CFLAGS" = set; then
  CFLAGS="$ac_save_CFLAGS"
elif test $ac_cv_prog_cc_g = yes; then
  if test "$GCC" = yes; then
    CFLAGS="-g -O2"
  else
    CFLAGS="-g"
  fi
else
  if test "$GCC" = yes; then
    CFLAGS="-O2"
  else
    CFLAGS=
  fi
fi

	    # Extract the first word of "ar", so it can be a program name with args.
set dummy ar; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1115: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$AR"; then
  ac_cv_prog_AR="$AR" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_AR="ar"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
AR="$ac_cv_prog_AR"
if test -n "$AR"; then
  echo "$ac_t""$AR" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

	    # Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1144: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$RANLIB"; then
  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_RANLIB="ranlib"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
RANLIB="$ac_cv_prog_RANLIB"
if test -n "$RANLIB"; then
  echo "$ac_t""$RANLIB" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

	    # Extract the first word of "windres", so it can be a program name with args.
set dummy windres; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1173: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$RC"; then
  ac_cv_prog_RC="$RC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_RC="windres"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
RC="$ac_cv_prog_RC"
if test -n "$RC"; then
  echo "$ac_t""$RC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

    	fi
    else
	# Allow user to override
	if test -z "$CC"; then
	    CC=cl
	fi
    fi

#AC_PROG_CC

# To properly support cross-compilation, one would
# need to use these tool checks instead of
# the ones below and reconfigure with
# autoconf 2.50. You can also just set
# the CC, AR, RANLIB, and RC environment
# variables if you want to cross compile.

if test "${GCC}" = "yes" ; then
    # Extract the first word of "ar", so it can be a program name with args.
set dummy ar; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1220: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$AR"; then
  ac_cv_prog_AR="$AR" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_AR="ar"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
AR="$ac_cv_prog_AR"
if test -n "$AR"; then
  echo "$ac_t""$AR" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

    # Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1249: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$RANLIB"; then
  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_RANLIB="ranlib"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
RANLIB="$ac_cv_prog_RANLIB"
if test -n "$RANLIB"; then
  echo "$ac_t""$RANLIB" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

    # Extract the first word of "windres", so it can be a program name with args.
set dummy windres; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1278: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$RC"; then
  ac_cv_prog_RC="$RC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_RC="windres"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
RC="$ac_cv_prog_RC"
if test -n "$RC"; then
  echo "$ac_t""$RC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

fi

#--------------------------------------------------------------------
# Checks to see if the make progeam sets the $MAKE variable.
#--------------------------------------------------------------------

echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
echo "configure:1311: checking whether ${MAKE-make} sets \${MAKE}" >&5
set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftestmake <<\EOF
all:
	@echo 'ac_maketemp="${MAKE}"'
EOF
# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
if test -n "$ac_maketemp"; then
  eval ac_cv_prog_make_${ac_make}_set=yes
else
  eval ac_cv_prog_make_${ac_make}_set=no
fi
rm -f conftestmake
fi
if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  SET_MAKE=
else
  echo "$ac_t""no" 1>&6
  SET_MAKE="MAKE=${MAKE-make}"
fi


#--------------------------------------------------------------------
# These two macros perform additinal compiler test.
#--------------------------------------------------------------------

echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6
echo "configure:1343: checking for Cygwin environment" >&5
if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1348 "configure"
#include "confdefs.h"

int main() {

#ifndef __CYGWIN__
#define __CYGWIN__ __CYGWIN32__
#endif
return __CYGWIN__;
; return 0; }
EOF
if { (eval echo configure:1359: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cv_cygwin=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_cygwin=no
fi
rm -f conftest*
rm -f conftest*
fi

echo "$ac_t""$ac_cv_cygwin" 1>&6
CYGWIN=
test "$ac_cv_cygwin" = yes && CYGWIN=yes

#--------------------------------------------------------------------
# Determines the correct binary file extension (.o, .obj, .exe etc.)
#--------------------------------------------------------------------

echo $ac_n "checking for object suffix""... $ac_c" 1>&6
echo "configure:1381: checking for object suffix" >&5
if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  rm -f conftest*
echo 'int i = 1;' > conftest.$ac_ext
if { (eval echo configure:1387: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  for ac_file in conftest.*; do
    case $ac_file in
    *.c) ;;
    *) ac_cv_objext=`echo $ac_file | sed -e s/conftest.//` ;;
    esac
  done
else
  { echo "configure: error: installation or configuration problem; compiler does not work" 1>&2; exit 1; }
fi
rm -f conftest*
fi

echo "$ac_t""$ac_cv_objext" 1>&6
OBJEXT=$ac_cv_objext
ac_objext=$ac_cv_objext

echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6
echo "configure:1405: checking for mingw32 environment" >&5
if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1410 "configure"
#include "confdefs.h"

int main() {
return __MINGW32__;
; return 0; }
EOF
if { (eval echo configure:1417: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cv_mingw32=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_mingw32=no
fi
rm -f conftest*
rm -f conftest*
fi

echo "$ac_t""$ac_cv_mingw32" 1>&6
MINGW32=
test "$ac_cv_mingw32" = yes && MINGW32=yes


echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
echo "configure:1436: checking for executable suffix" >&5
if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test "$CYGWIN" = yes || test "$MINGW32" = yes; then
  ac_cv_exeext=.exe
else
  rm -f conftest*
  echo 'int main () { return 0; }' > conftest.$ac_ext
  ac_cv_exeext=
  if { (eval echo configure:1446: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
    for file in conftest.*; do
      case $file in
      *.c | *.o | *.obj) ;;
      *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;;
      esac
    done
  else
    { echo "configure: error: installation or configuration problem: compiler cannot create executables." 1>&2; exit 1; }
  fi
  rm -f conftest*
  test x"${ac_cv_exeext}" = x && ac_cv_exeext=no
fi
fi

EXEEXT=""
test x"${ac_cv_exeext}" != xno && EXEEXT=${ac_cv_exeext}
echo "$ac_t""${ac_cv_exeext}" 1>&6
ac_exeext=$EXEEXT


#--------------------------------------------------------------------
# Check whether --enable-threads or --disable-threads was given.
#--------------------------------------------------------------------


    echo $ac_n "checking for building with threads""... $ac_c" 1>&6
echo "configure:1473: checking for building with threads" >&5
    # Check whether --enable-threads or --disable-threads was given.
if test "${enable_threads+set}" = set; then
  enableval="$enable_threads"
  tcl_ok=$enableval
else
  tcl_ok=no
fi


    if test "$tcl_ok" = "yes"; then
	echo "$ac_t""yes" 1>&6
	TCL_THREADS=1
	cat >> confdefs.h <<\EOF
#define TCL_THREADS 1
EOF

    else
	TCL_THREADS=0
	echo "$ac_t""no (default)" 1>&6
    fi
    


#--------------------------------------------------------------------
# The statements below define a collection of symbols related to
# building libtcl as a shared library instead of a static library.
#--------------------------------------------------------------------


    echo $ac_n "checking how to build libraries""... $ac_c" 1>&6
echo "configure:1504: checking how to build libraries" >&5
    # Check whether --enable-shared or --disable-shared was given.
if test "${enable_shared+set}" = set; then
  enableval="$enable_shared"
  tcl_ok=$enableval
else
  tcl_ok=yes
fi


    if test "${enable_shared+set}" = set; then
	enableval="$enable_shared"
	tcl_ok=$enableval
    else
	tcl_ok=yes
    fi

    if test "$tcl_ok" = "yes" ; then
	echo "$ac_t""shared" 1>&6
	SHARED_BUILD=1
    else
	echo "$ac_t""static" 1>&6
	SHARED_BUILD=0
	cat >> confdefs.h <<\EOF
#define STATIC_BUILD 1
EOF

    fi


#--------------------------------------------------------------------
# The statements below define a collection of compile flags.  This 
# macro depends on the value of SHARED_BUILD, and should be called
# after SC_ENABLE_SHARED checks the configure switches.
#--------------------------------------------------------------------



    # Step 0: Enable 64 bit support?

    echo $ac_n "checking if 64bit support is requested""... $ac_c" 1>&6
echo "configure:1545: checking if 64bit support is requested" >&5
    # Check whether --enable-64bit or --disable-64bit was given.
if test "${enable_64bit+set}" = set; then
  enableval="$enable_64bit"
  do64bit=$enableval
else
  do64bit=no
fi

    echo "$ac_t""$do64bit" 1>&6

    # Set some defaults (may get changed below)
    EXTRA_CFLAGS=""

    # Extract the first word of "cygpath", so it can be a program name with args.
set dummy cygpath; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1562: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CYGPATH'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$CYGPATH"; then
  ac_cv_prog_CYGPATH="$CYGPATH" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_CYGPATH="cygpath -w"
      break
    fi
  done
  IFS="$ac_save_ifs"
  test -z "$ac_cv_prog_CYGPATH" && ac_cv_prog_CYGPATH="echo"
fi
fi
CYGPATH="$ac_cv_prog_CYGPATH"
if test -n "$CYGPATH"; then
  echo "$ac_t""$CYGPATH" 1>&6
else
  echo "$ac_t""no" 1>&6
fi


    if test "$CYGPATH" = "echo" || test "$ac_cv_cygwin" = "yes"; then
	DEPARG='"$<"'
    else
	DEPARG='"$(shell $(CYGPATH) $<)"'
    fi

    # set various compiler flags depending on whether we are using gcc or cl
    
    echo $ac_n "checking compiler flags""... $ac_c" 1>&6
echo "configure:1599: checking compiler flags" >&5
    if test "${GCC}" = "yes" ; then
	if test "$do64bit" = "yes" ; then
	    echo "configure: warning: "64bit mode not supported with GCC on Windows"" 1>&2
	fi
	SHLIB_LD=""
	SHLIB_LD_LIBS=""
	LIBS=""
	LIBS_GUI="-lgdi32 -lcomdlg32 -limm32"
	STLIB_LD='${AR} cr'
	RC_OUT=-o
	RC_TYPE=
	RC_INCLUDE=--include
	RC_DEFINE=--define
	RES=res.o
	MAKE_LIB="\${STLIB_LD} \$@"
	POST_MAKE_LIB="\${RANLIB} \$@"
	MAKE_EXE="\${CC} -o \$@"
	LIBPREFIX="lib"

	if test "$ac_cv_cygwin" = "yes"; then
	    extra_cflags="-mno-cygwin"
	    extra_ldflags="-mno-cygwin"
	else
	    extra_cflags=""
	    extra_ldflags=""
	fi

	if test "${SHARED_BUILD}" = "0" ; then
	    # static
            echo "$ac_t""using static flags" 1>&6
	    runtime=
	    MAKE_DLL="echo "
	    LIBSUFFIX="s\${DBGX}.a"
	    LIBRARIES="\${STATIC_LIBRARIES}"
	    EXESUFFIX="s\${DBGX}.exe"
	else
	    # dynamic
            echo "$ac_t""using shared flags" 1>&6

	    # ad-hoc check to see if CC supports -shared.
	    if "${CC}" -shared 2>&1 | egrep ': -shared not supported' >/dev/null; then
		{ echo "configure: error: ${CC} does not support the -shared option.
		 You will need to upgrade to a newer version of the toolchain." 1>&2; exit 1; }
	    fi

	    runtime=
	    # Link with gcc since ld does not link to default libs like
	    # -luser32 and -lmsvcrt by default. Make sure CFLAGS is
	    # included so -mno-cygwin passed the correct libs to the linker.
	    SHLIB_LD='${CC} -shared ${CFLAGS}'
	    # Add SHLIB_LD_LIBS to the Make rule, not here.
	    MAKE_DLL="\${SHLIB_LD} \$(LDFLAGS) -o \$@ ${extra_ldflags} \
		-Wl,--out-implib,\$(patsubst %.dll,lib%.a,\$@)"

	    LIBSUFFIX="\${DBGX}.a"
	    EXESUFFIX="\${DBGX}.exe"
	    LIBRARIES="\${SHARED_LIBRARIES}"
	fi
	# DLLSUFFIX is separate because it is the building block for
	# users of tclConfig.sh that may build shared or static.
	DLLSUFFIX="\${DBGX}.dll"

	EXTRA_CFLAGS="${extra_cflags}"

	CFLAGS_DEBUG=-g
	CFLAGS_OPTIMIZE=-O
	CFLAGS_WARNING="-Wall -Wconversion"
	LDFLAGS_DEBUG=
	LDFLAGS_OPTIMIZE=

	# Specify the CC output file names based on the target name
	CC_OBJNAME="-o \$@"
	CC_EXENAME="-o \$@"

	# Specify linker flags depending on the type of app being 
	# built -- Console vs. Window.
	#
	# We need to pass -e _WinMain@16 so that ld will use
	# WinMain() instead of main() as the entry point. We can't
	# use autoconf to check for this case since it would need
	# to run an executable and that does not work when
	# cross compiling. Remove this -e workaround once we
	# require a gcc that does not have this bug.
	LDFLAGS_CONSOLE="-mconsole ${extra_ldflags}"
	LDFLAGS_WINDOW="-mwindows -e _WinMain@16 ${extra_ldflags}"
    else
	if test "${SHARED_BUILD}" = "0" ; then
	    # static
            echo "$ac_t""using static flags" 1>&6
	    runtime=-MT
	    MAKE_DLL="echo "
	    LIBSUFFIX="s\${DBGX}.lib"
	    LIBRARIES="\${STATIC_LIBRARIES}"
	    EXESUFFIX="s\${DBGX}.exe"
	else
	    # dynamic
            echo "$ac_t""using shared flags" 1>&6
	    runtime=-MD
	    # Add SHLIB_LD_LIBS to the Make rule, not here.
	    MAKE_DLL="\${SHLIB_LD} \$(LDFLAGS) -out:\$@"
	    LIBSUFFIX="\${DBGX}.lib"
	    EXESUFFIX="\${DBGX}.exe"
	    LIBRARIES="\${SHARED_LIBRARIES}"
	fi
	# DLLSUFFIX is separate because it is the building block for
	# users of tclConfig.sh that may build shared or static.
	DLLSUFFIX="\${DBGX}.dll"

	# This is a 2-stage check to make sure we have the 64-bit SDK
	# We have to know where the SDK is installed.
	if test "$do64bit" = "yes" ; then
	    if test "x${MSSDK}x" = "xx" ; then
		MSSDK="C:/Progra~1/Microsoft SDK"
	    fi
	    # In order to work in the tortured autoconf environment,
	    # we need to ensure that this path has no spaces
	    MSSDK=$(cygpath -w -s "$MSSDK" | sed -e 's!\\!/!g')
	    if test ! -d "${MSSDK}/bin/win64" ; then
		echo "configure: warning: "could not find 64-bit SDK to enable 64bit mode"" 1>&2
		do64bit="no"
	    fi
	fi

	if test "$do64bit" = "yes" ; then
	    # All this magic is necessary for the Win64 SDK RC1 - hobbs
	    CC="${MSSDK}/Bin/Win64/cl.exe \
	-I${MSSDK}/Include/prerelease \
	-I${MSSDK}/Include/Win64/crt \
	-I${MSSDK}/Include/Win64/crt/sys \
	-I${MSSDK}/Include"
	    RC="${MSSDK}/bin/rc.exe"
	    CFLAGS_DEBUG="-nologo -Zi -Od ${runtime}d"
	    CFLAGS_OPTIMIZE="-nologo -O2 -Gs ${runtime}"
	    lflags="-MACHINE:IA64 -LIBPATH:${MSSDK}/Lib/IA64 \
	-LIBPATH:${MSSDK}/Lib/Prerelease/IA64"
	    STLIB_LD="${MSSDK}/bin/win64/lib.exe -nologo ${lflags}"
	    LINKBIN="${MSSDK}/bin/win64/link.exe ${lflags}"
	else
	    RC="rc"
	    CFLAGS_DEBUG="-nologo -Z7 -Od -WX ${runtime}d"
	    CFLAGS_OPTIMIZE="-nologo -Oti -Gs -GD ${runtime}"
	    STLIB_LD="lib -nologo"
	    LINKBIN="link -link50compat"
	fi

	SHLIB_LD="${LINKBIN} -dll -nologo -incremental:no"
	SHLIB_LD_LIBS="user32.lib advapi32.lib"
	LIBS="user32.lib advapi32.lib"
	LIBS_GUI="gdi32.lib comdlg32.lib imm32.lib"
	RC_OUT=-fo
	RC_TYPE=-r
	RC_INCLUDE=-i
	RC_DEFINE=-d
	RES=res
	MAKE_LIB="\${STLIB_LD} -out:\$@"
	POST_MAKE_LIB=
	MAKE_EXE="\${CC} -Fe\$@"
	LIBPREFIX=""

	EXTRA_CFLAGS="-YX"
	CFLAGS_WARNING="-W3"
	LDFLAGS_DEBUG="-debug:full -debugtype:both"
	LDFLAGS_OPTIMIZE="-release"

	# Specify the CC output file names based on the target name
	CC_OBJNAME="-Fo\$@"
	CC_EXENAME="-Fe\"\$(shell \$(CYGPATH) '\$@')\""

	# Specify linker flags depending on the type of app being 
	# built -- Console vs. Window.
	LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}"
	LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}"
    fi

    # DL_LIBS is empty, but then we match the Unix version
    
    
    
    


#--------------------------------------------------------------------
# Set the default compiler switches based on the --enable-symbols 
# option.  This macro depends on C flags, and should be called
# after SC_CONFIG_CFLAGS macro is called.
#--------------------------------------------------------------------


    echo $ac_n "checking for build with symbols""... $ac_c" 1>&6
echo "configure:1789: checking for build with symbols" >&5
    # Check whether --enable-symbols or --disable-symbols was given.
if test "${enable_symbols+set}" = set; then
  enableval="$enable_symbols"
  tcl_ok=$enableval
else
  tcl_ok=no
fi


    if test "$tcl_ok" = "yes"; then
	CFLAGS_DEFAULT='$(CFLAGS_DEBUG)'
	LDFLAGS_DEFAULT='$(LDFLAGS_DEBUG)'
	DBGX=d
	echo "$ac_t""yes" 1>&6
    else
	CFLAGS_DEFAULT='$(CFLAGS_OPTIMIZE)'
	LDFLAGS_DEFAULT='$(LDFLAGS_OPTIMIZE)'
	DBGX=""
	echo "$ac_t""no" 1>&6
    fi


TCL_DBGX=${DBGX}

#--------------------------------------------------------------------
# man2tcl needs this so that it can use errno.h
#--------------------------------------------------------------------

echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
echo "configure:1819: checking how to run the C preprocessor" >&5
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
  CPP=
fi
if test -z "$CPP"; then
if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
    # This must be in double quotes, not single quotes, because CPP may get
  # substituted into the Makefile and "${CC-cc}" will confuse make.
  CPP="${CC-cc} -E"
  # On the NeXT, cc -E runs the code through the compiler's parser,
  # not just through cpp.
  cat > conftest.$ac_ext <<EOF
#line 1834 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1840: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  :
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  CPP="${CC-cc} -E -traditional-cpp"
  cat > conftest.$ac_ext <<EOF
#line 1851 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1857: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  :
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  CPP="${CC-cc} -nologo -E"
  cat > conftest.$ac_ext <<EOF
#line 1868 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1874: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  :
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  CPP=/lib/cpp
fi
rm -f conftest*
fi
rm -f conftest*
fi
rm -f conftest*
  ac_cv_prog_CPP="$CPP"
fi
  CPP="$ac_cv_prog_CPP"
else
  ac_cv_prog_CPP="$CPP"
fi
echo "$ac_t""$CPP" 1>&6

ac_safe=`echo "errno.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for errno.h""... $ac_c" 1>&6
echo "configure:1900: checking for errno.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1905 "configure"
#include "confdefs.h"
#include <errno.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1910: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
MAN2TCLFLAGS="-DNO_ERRNO_H"
fi



#------------------------------------------------------------------------
# tclConfig.sh refers to this by a different name
#------------------------------------------------------------------------

TCL_SHARED_BUILD=${SHARED_BUILD}

#--------------------------------------------------------------------
# Perform final evaluations of variables with possible substitutions.
#--------------------------------------------------------------------

TCL_SHARED_LIB_SUFFIX="\${NODOT_VERSION}${DLLSUFFIX}"
TCL_UNSHARED_LIB_SUFFIX="\${NODOT_VERSION}${LIBSUFFIX}"
TCL_EXPORT_FILE_SUFFIX="\${NODOT_VERSION}${LIBSUFFIX}"

eval "TCL_SRC_DIR=\"`cd $srcdir/..; pwd`\""

eval "TCL_DLL_FILE=tcl${VER}${DLLSUFFIX}"

eval "TCL_LIB_FILE=${LIBPREFIX}tcl$VER${LIBSUFFIX}"
# FIMXE: These variables decls are missing
#TCL_LIB_FLAG
#TCL_BUILD_LIB_SPEC
#TCL_LIB_SPEC

eval "TCL_STUB_LIB_FILE=\"${LIBPREFIX}tclstub${VER}${LIBSUFFIX}\""
eval "TCL_STUB_LIB_FLAG=\"-ltclstub${VER}${TCL_DBGX}\""
eval "TCL_BUILD_STUB_LIB_SPEC=\"-L`pwd` ${TCL_STUB_LIB_FLAG}\""
eval "TCL_STUB_LIB_SPEC=\"-L${exec_prefix}/lib ${TCL_STUB_LIB_FLAG}\""
eval "TCL_BUILD_STUB_LIB_PATH=\"`pwd`/${TCL_STUB_LIB_FILE}\""
eval "TCL_STUB_LIB_PATH=\"${exec_prefix}/lib/${TCL_STUB_LIB_FILE}\""

eval "DLLSUFFIX=${DLLSUFFIX}"
eval "LIBPREFIX=${LIBPREFIX}"
eval "LIBSUFFIX=${LIBSUFFIX}"
eval "EXESUFFIX=${EXESUFFIX}"

CFG_TCL_SHARED_LIB_SUFFIX=${TCL_SHARED_LIB_SUFFIX}
CFG_TCL_UNSHARED_LIB_SUFFIX=${TCL_UNSHARED_LIB_SUFFIX}
CFG_TCL_EXPORT_FILE_SUFFIX=${TCL_EXPORT_FILE_SUFFIX}

#--------------------------------------------------------------------
# Adjust the defines for how the resources are built depending
# on symbols and static vs. shared.
#--------------------------------------------------------------------

if test ${SHARED_BUILD} = 0 ; then
    if test "${DBGX}" = "d"; then
	RC_DEFINES="${RC_DEFINE} STATIC_BUILD ${RC_DEFINE} DEBUG"
    else
        RC_DEFINES="${RC_DEFINE} STATIC_BUILD"
    fi
else
    if test "${DBGX}" = "d"; then
        RC_DEFINES="${RC_DEFINE} DEBUG"
    else
        RC_DEFINES=""
    fi
fi








# empty on win
















# win/tcl.m4 doesn't set (CFLAGS)







# win/tcl.m4 doesn't set (LDFLAGS)



























# empty on win, but needs sub'ing










# win only








trap '' 1 2 15
cat > confcache <<\EOF
# This file is a shell script that caches the results of configure
# tests run on this system so they can be shared between configure
# scripts and configure runs.  It is not useful on other systems.
# If it contains results you don't want to keep, you may remove or edit it.
#
# By default, configure uses ./config.cache as the cache file,
# creating it if it does not exist already.  You can give configure
# the --cache-file=FILE option to use a different cache file; that is
# what configure does when it calls configure scripts in
# subdirectories, so they share the cache.
# Giving --cache-file=/dev/null disables caching, for debugging configure.
# config.status only pays attention to the cache file if you give it the
# --recheck option to rerun configure.
#
EOF
# The following way of writing the cache mishandles newlines in values,
# but we know of no workaround that is simple, portable, and efficient.
# So, don't put newlines in cache variables' values.
# Ultrix sh set writes to stderr and can't be redirected directly,
# and sets the high bit in the cache file unless we assign to the vars.
(set) 2>&1 |
  case `(ac_space=' '; set | grep ac_space) 2>&1` in
  *ac_space=\ *)
    # `set' does not quote correctly, so add quotes (double-quote substitution
    # turns \\\\ into \\, and sed turns \\ into \).
    sed -n \
      -e "s/'/'\\\\''/g" \
      -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
    ;;
  *)
    # `set' quotes correctly as required by POSIX, so do not add quotes.
    sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
    ;;
  esac >> confcache
if cmp -s $cache_file confcache; then
  :
else
  if test -w $cache_file; then
    echo "updating cache $cache_file"
    cat confcache > $cache_file
  else
    echo "not updating unwritable cache $cache_file"
  fi
fi
rm -f confcache

trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15

test "x$prefix" = xNONE && prefix=$ac_default_prefix
# Let make expand exec_prefix.
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'

# Any assignment to VPATH causes Sun make to only execute
# the first set of double-colon rules, so remove it if not needed.
# If there is a colon in the path, we need to keep it.
if test "x$srcdir" = x.; then
  ac_vpsub='/^[ 	]*VPATH[ 	]*=[^:]*$/d'
fi

trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15

# Transform confdefs.h into DEFS.
# Protect against shell expansion while executing Makefile rules.
# Protect against Makefile macro expansion.
cat > conftest.defs <<\EOF
s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
s%[ 	`~#$^&*(){}\\|;'"<>?]%\\&%g
s%\[%\\&%g
s%\]%\\&%g
s%\$%$$%g
EOF
DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
rm -f conftest.defs


# Without the "./", some shells look in PATH for config.status.
: ${CONFIG_STATUS=./config.status}

echo creating $CONFIG_STATUS
rm -f $CONFIG_STATUS
cat > $CONFIG_STATUS <<EOF
#! /bin/sh
# Generated automatically by configure.
# Run this file to recreate the current configuration.
# This directory was configured as follows,
# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
#
# $0 $ac_configure_args
#
# Compiler output produced by configure, useful for debugging
# configure, is in ./config.log if it exists.

ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
for ac_option
do
  case "\$ac_option" in
  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
    echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
    exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
  -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
    echo "$CONFIG_STATUS generated by autoconf version 2.13"
    exit 0 ;;
  -help | --help | --hel | --he | --h)
    echo "\$ac_cs_usage"; exit 0 ;;
  *) echo "\$ac_cs_usage"; exit 1 ;;
  esac
done

ac_given_srcdir=$srcdir

trap 'rm -fr `echo "Makefile tclConfig.sh tcl.hpj" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
EOF
cat >> $CONFIG_STATUS <<EOF

# Protect against being on the right side of a sed subst in config.status.
sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
 s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
$ac_vpsub
$extrasub
s%@SHELL@%$SHELL%g
s%@CFLAGS@%$CFLAGS%g
s%@CPPFLAGS@%$CPPFLAGS%g
s%@CXXFLAGS@%$CXXFLAGS%g
s%@FFLAGS@%$FFLAGS%g
s%@DEFS@%$DEFS%g
s%@LDFLAGS@%$LDFLAGS%g
s%@LIBS@%$LIBS%g
s%@exec_prefix@%$exec_prefix%g
s%@prefix@%$prefix%g
s%@program_transform_name@%$program_transform_name%g
s%@bindir@%$bindir%g
s%@sbindir@%$sbindir%g
s%@libexecdir@%$libexecdir%g
s%@datadir@%$datadir%g
s%@sysconfdir@%$sysconfdir%g
s%@sharedstatedir@%$sharedstatedir%g
s%@localstatedir@%$localstatedir%g
s%@libdir@%$libdir%g
s%@includedir@%$includedir%g
s%@oldincludedir@%$oldincludedir%g
s%@infodir@%$infodir%g
s%@mandir@%$mandir%g
s%@CC@%$CC%g
s%@AR@%$AR%g
s%@RANLIB@%$RANLIB%g
s%@RC@%$RC%g
s%@SET_MAKE@%$SET_MAKE%g
s%@OBJEXT@%$OBJEXT%g
s%@EXEEXT@%$EXEEXT%g
s%@TCL_THREADS@%$TCL_THREADS%g
s%@CYGPATH@%$CYGPATH%g
s%@DL_LIBS@%$DL_LIBS%g
s%@CFLAGS_DEBUG@%$CFLAGS_DEBUG%g
s%@CFLAGS_OPTIMIZE@%$CFLAGS_OPTIMIZE%g
s%@CFLAGS_WARNING@%$CFLAGS_WARNING%g
s%@CPP@%$CPP%g
s%@MAN2TCLFLAGS@%$MAN2TCLFLAGS%g
s%@TCL_VERSION@%$TCL_VERSION%g
s%@TCL_MAJOR_VERSION@%$TCL_MAJOR_VERSION%g
s%@TCL_MINOR_VERSION@%$TCL_MINOR_VERSION%g
s%@TCL_PATCH_LEVEL@%$TCL_PATCH_LEVEL%g
s%@TCL_LIB_FILE@%$TCL_LIB_FILE%g
s%@TCL_LIB_FLAG@%$TCL_LIB_FLAG%g
s%@TCL_LIB_SPEC@%$TCL_LIB_SPEC%g
s%@TCL_STUB_LIB_FILE@%$TCL_STUB_LIB_FILE%g
s%@TCL_STUB_LIB_FLAG@%$TCL_STUB_LIB_FLAG%g
s%@TCL_STUB_LIB_SPEC@%$TCL_STUB_LIB_SPEC%g
s%@TCL_STUB_LIB_PATH@%$TCL_STUB_LIB_PATH%g
s%@TCL_BUILD_STUB_LIB_SPEC@%$TCL_BUILD_STUB_LIB_SPEC%g
s%@TCL_BUILD_STUB_LIB_PATH@%$TCL_BUILD_STUB_LIB_PATH%g
s%@TCL_DLL_FILE@%$TCL_DLL_FILE%g
s%@TCL_SRC_DIR@%$TCL_SRC_DIR%g
s%@TCL_BIN_DIR@%$TCL_BIN_DIR%g
s%@TCL_DBGX@%$TCL_DBGX%g
s%@CFG_TCL_SHARED_LIB_SUFFIX@%$CFG_TCL_SHARED_LIB_SUFFIX%g
s%@CFG_TCL_UNSHARED_LIB_SUFFIX@%$CFG_TCL_UNSHARED_LIB_SUFFIX%g
s%@CFG_TCL_EXPORT_FILE_SUFFIX@%$CFG_TCL_EXPORT_FILE_SUFFIX%g
s%@CFLAGS_DEFAULT@%$CFLAGS_DEFAULT%g
s%@EXTRA_CFLAGS@%$EXTRA_CFLAGS%g
s%@DEPARG@%$DEPARG%g
s%@CC_OBJNAME@%$CC_OBJNAME%g
s%@CC_EXENAME@%$CC_EXENAME%g
s%@LDFLAGS_DEFAULT@%$LDFLAGS_DEFAULT%g
s%@LDFLAGS_DEBUG@%$LDFLAGS_DEBUG%g
s%@LDFLAGS_OPTIMIZE@%$LDFLAGS_OPTIMIZE%g
s%@LDFLAGS_CONSOLE@%$LDFLAGS_CONSOLE%g
s%@LDFLAGS_WINDOW@%$LDFLAGS_WINDOW%g
s%@STLIB_LD@%$STLIB_LD%g
s%@SHLIB_LD@%$SHLIB_LD%g
s%@SHLIB_LD_LIBS@%$SHLIB_LD_LIBS%g
s%@SHLIB_CFLAGS@%$SHLIB_CFLAGS%g
s%@SHLIB_SUFFIX@%$SHLIB_SUFFIX%g
s%@TCL_SHARED_BUILD@%$TCL_SHARED_BUILD%g
s%@LIBS_GUI@%$LIBS_GUI%g
s%@DLLSUFFIX@%$DLLSUFFIX%g
s%@LIBPREFIX@%$LIBPREFIX%g
s%@LIBSUFFIX@%$LIBSUFFIX%g
s%@EXESUFFIX@%$EXESUFFIX%g
s%@LIBRARIES@%$LIBRARIES%g
s%@MAKE_LIB@%$MAKE_LIB%g
s%@POST_MAKE_LIB@%$POST_MAKE_LIB%g
s%@MAKE_DLL@%$MAKE_DLL%g
s%@MAKE_EXE@%$MAKE_EXE%g
s%@TCL_BUILD_LIB_SPEC@%$TCL_BUILD_LIB_SPEC%g
s%@TCL_LD_SEARCH_FLAGS@%$TCL_LD_SEARCH_FLAGS%g
s%@TCL_NEEDS_EXP_FILE@%$TCL_NEEDS_EXP_FILE%g
s%@TCL_BUILD_EXP_FILE@%$TCL_BUILD_EXP_FILE%g
s%@TCL_EXP_FILE@%$TCL_EXP_FILE%g
s%@LIBOBJS@%$LIBOBJS%g
s%@TCL_LIB_VERSIONS_OK@%$TCL_LIB_VERSIONS_OK%g
s%@TCL_PACKAGE_PATH@%$TCL_PACKAGE_PATH%g
s%@RC_OUT@%$RC_OUT%g
s%@RC_TYPE@%$RC_TYPE%g
s%@RC_INCLUDE@%$RC_INCLUDE%g
s%@RC_DEFINE@%$RC_DEFINE%g
s%@RC_DEFINES@%$RC_DEFINES%g
s%@RES@%$RES%g

CEOF
EOF

cat >> $CONFIG_STATUS <<\EOF

# Split the substitutions into bite-sized pieces for seds with
# small command number limits, like on Digital OSF/1 and HP-UX.
ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
ac_file=1 # Number of current file.
ac_beg=1 # First line for current file.
ac_end=$ac_max_sed_cmds # Line after last line for current file.
ac_more_lines=:
ac_sed_cmds=""
while $ac_more_lines; do
  if test $ac_beg -gt 1; then
    sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
  else
    sed "${ac_end}q" conftest.subs > conftest.s$ac_file
  fi
  if test ! -s conftest.s$ac_file; then
    ac_more_lines=false
    rm -f conftest.s$ac_file
  else
    if test -z "$ac_sed_cmds"; then
      ac_sed_cmds="sed -f conftest.s$ac_file"
    else
      ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
    fi
    ac_file=`expr $ac_file + 1`
    ac_beg=$ac_end
    ac_end=`expr $ac_end + $ac_max_sed_cmds`
  fi
done
if test -z "$ac_sed_cmds"; then
  ac_sed_cmds=cat
fi
EOF

cat >> $CONFIG_STATUS <<EOF

CONFIG_FILES=\${CONFIG_FILES-"Makefile tclConfig.sh tcl.hpj"}
EOF
cat >> $CONFIG_STATUS <<\EOF
for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
  case "$ac_file" in
  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
  *) ac_file_in="${ac_file}.in" ;;
  esac

  # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.

  # Remove last slash and all that follows it.  Not all systems have dirname.
  ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
    # The file is in a subdirectory.
    test ! -d "$ac_dir" && mkdir "$ac_dir"
    ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
    # A "../" for each directory in $ac_dir_suffix.
    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
  else
    ac_dir_suffix= ac_dots=
  fi

  case "$ac_given_srcdir" in
  .)  srcdir=.
      if test -z "$ac_dots"; then top_srcdir=.
      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
  /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
  *) # Relative path.
    srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
    top_srcdir="$ac_dots$ac_given_srcdir" ;;
  esac


  echo creating "$ac_file"
  rm -f "$ac_file"
  configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
  case "$ac_file" in
  *Makefile*) ac_comsub="1i\\
# $configure_input" ;;
  *) ac_comsub= ;;
  esac

  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
  sed -e "$ac_comsub
s%@configure_input@%$configure_input%g
s%@srcdir@%$srcdir%g
s%@top_srcdir@%$top_srcdir%g
" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
fi; done
rm -f conftest.s*

EOF
cat >> $CONFIG_STATUS <<EOF

EOF
cat >> $CONFIG_STATUS <<\EOF

exit 0
EOF
chmod +x $CONFIG_STATUS
rm -fr confdefs* $ac_clean_files
test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1

Changes to win/configure.in.

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
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
+




-
+






-
+

+
+
+
+
+
+
+
+
+
+
+








+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







#! /bin/bash -norc
# This file is an input file used by the GNU "autoconf" program to
# generate the file "configure", which is run during Tcl installation
# to configure the system for the local environment.
#
# RCS: @(#) $Id: configure.in,v 1.20 2000/04/19 08:32:46 hobbs Exp $
# RCS: @(#) $Id: configure.in,v 1.20.2.7 2001/10/15 21:54:20 hobbs Exp $

AC_INIT(../generic/tcl.h)

TCL_VERSION=8.3
TCL_MAJOR_VERSION=8
TCL_MINOR_VERSION=3
TCL_PATCH_LEVEL=".1"
TCL_PATCH_LEVEL=".4"
VER=$TCL_MAJOR_VERSION$TCL_MINOR_VERSION

#------------------------------------------------------------------------
# Handle the --prefix=... option
#------------------------------------------------------------------------

if test "${prefix}" = "NONE"; then
    prefix=/usr/local
fi
if test "${exec_prefix}" = "NONE"; then
    exec_prefix=$prefix
fi

#--------------------------------------------------------------------
# Check whether --enable-gcc or --disable-gcc was given.  Do this 
# before AC_PROG_CC and AC_CYGWIN are called so the compiler can 
# be fully tested by built-in autoconf tools.
#--------------------------------------------------------------------
 
SC_ENABLE_GCC
#AC_PROG_CC

# To properly support cross-compilation, one would
# need to use these tool checks instead of
# the ones below and reconfigure with
# autoconf 2.50. You can also just set
# the CC, AR, RANLIB, and RC environment
# variables if you want to cross compile.
dnl AC_CHECK_TOOL(AR, ar, :)
dnl AC_CHECK_TOOL(RANLIB, ranlib, :)
dnl AC_CHECK_TOOL(RC, windres, :)

if test "${GCC}" = "yes" ; then
    AC_CHECK_PROG(AR, ar, ar)
    AC_CHECK_PROG(RANLIB, ranlib, ranlib)
    AC_CHECK_PROG(RC, windres, windres)
fi

#--------------------------------------------------------------------
# Checks to see if the make progeam sets the $MAKE variable.
#--------------------------------------------------------------------

AC_PROG_MAKE_SET

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
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
244
245
246
247
248







-
-








+
+
+
+
+
+









-
-
-
+
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+








+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+





+

-
+
+
+

+
+
+
+
+
+
+







+
+
-
+

-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+





-
-
-
-
+
+
-
-
-
-
-
+
+






+

+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

# Set the default compiler switches based on the --enable-symbols 
# option.  This macro depends on C flags, and should be called
# after SC_CONFIG_CFLAGS macro is called.
#--------------------------------------------------------------------

SC_ENABLE_SYMBOLS

CFLAGS=${CFLAGS_DEFAULT}
LDFLAGS=${LDFLAGS_DEFAULT}
TCL_DBGX=${DBGX}

#--------------------------------------------------------------------
# man2tcl needs this so that it can use errno.h
#--------------------------------------------------------------------

AC_CHECK_HEADER(errno.h, , MAN2TCLFLAGS="-DNO_ERRNO_H")
AC_SUBST(MAN2TCLFLAGS)

#------------------------------------------------------------------------
# tclConfig.sh refers to this by a different name
#------------------------------------------------------------------------

TCL_SHARED_BUILD=${SHARED_BUILD}

#--------------------------------------------------------------------
# Perform final evaluations of variables with possible substitutions.
#--------------------------------------------------------------------

TCL_SHARED_LIB_SUFFIX="\${NODOT_VERSION}${DLLSUFFIX}"
TCL_UNSHARED_LIB_SUFFIX="\${NODOT_VERSION}${LIBSUFFIX}"
TCL_EXPORT_FILE_SUFFIX="\${NODOT_VERSION}${LIBSUFFIX}"

eval "TCL_SRC_DIR=`cd $srcdir; pwd`"
eval "TCL_STUB_LIB_FILE=${LIBPREFIX}tclstub$VER${LIBSUFFIX}"
eval "TCL_DLL_FILE=tcl$VER${DLLSUFFIX}"
eval "TCL_SRC_DIR=\"`cd $srcdir/..; pwd`\""

eval "TCL_DLL_FILE=tcl${VER}${DLLSUFFIX}"

eval "TCL_LIB_FILE=${LIBPREFIX}tcl$VER${LIBSUFFIX}"
# FIMXE: These variables decls are missing
#TCL_LIB_FLAG
#TCL_BUILD_LIB_SPEC
#TCL_LIB_SPEC

eval "TCL_STUB_LIB_FILE=\"${LIBPREFIX}tclstub${VER}${LIBSUFFIX}\""
eval "TCL_STUB_LIB_FLAG=\"-ltclstub${VER}${TCL_DBGX}\""
eval "TCL_BUILD_STUB_LIB_SPEC=\"-L`pwd` ${TCL_STUB_LIB_FLAG}\""
eval "TCL_STUB_LIB_SPEC=\"-L${exec_prefix}/lib ${TCL_STUB_LIB_FLAG}\""
eval "TCL_BUILD_STUB_LIB_PATH=\"`pwd`/${TCL_STUB_LIB_FILE}\""
eval "TCL_STUB_LIB_PATH=\"${exec_prefix}/lib/${TCL_STUB_LIB_FILE}\""

eval "DLLSUFFIX=${DLLSUFFIX}"
eval "LIBPREFIX=${LIBPREFIX}"
eval "LIBSUFFIX=${LIBSUFFIX}"
eval "EXESUFFIX=${EXESUFFIX}"

CFG_TCL_SHARED_LIB_SUFFIX=${TCL_SHARED_LIB_SUFFIX}
CFG_TCL_UNSHARED_LIB_SUFFIX=${TCL_UNSHARED_LIB_SUFFIX}
CFG_TCL_EXPORT_FILE_SUFFIX=${TCL_EXPORT_FILE_SUFFIX}

#--------------------------------------------------------------------
# Adjust the defines for how the resources are built depending
# on symbols and static vs. shared.
#--------------------------------------------------------------------

if test ${SHARED_BUILD} = 0 ; then
    if test "${DBGX}" = "d"; then
	RC_DEFINES="${RC_DEFINE} STATIC_BUILD ${RC_DEFINE} DEBUG"
    else
        RC_DEFINES="${RC_DEFINE} STATIC_BUILD"
    fi
else
    if test "${DBGX}" = "d"; then
        RC_DEFINES="${RC_DEFINE} DEBUG"
    else
        RC_DEFINES=""
    fi
fi

AC_SUBST(TCL_VERSION)
AC_SUBST(TCL_MAJOR_VERSION)
AC_SUBST(TCL_MINOR_VERSION)
AC_SUBST(TCL_PATCH_LEVEL)

AC_SUBST(TCL_LIB_FILE)
AC_SUBST(TCL_DLL_FILE)
AC_SUBST(TCL_LIB_FLAG)
# empty on win
AC_SUBST(TCL_LIB_SPEC)
AC_SUBST(TCL_STUB_LIB_FILE)
AC_SUBST(TCL_STUB_LIB_FLAG)
AC_SUBST(TCL_STUB_LIB_SPEC)
AC_SUBST(TCL_STUB_LIB_PATH)
AC_SUBST(TCL_BUILD_STUB_LIB_SPEC)
AC_SUBST(TCL_BUILD_STUB_LIB_PATH)
AC_SUBST(TCL_DLL_FILE)

AC_SUBST(TCL_SRC_DIR)
AC_SUBST(TCL_BIN_DIR)
AC_SUBST(TCL_DBGX)
AC_SUBST(CFG_TCL_SHARED_LIB_SUFFIX)
AC_SUBST(CFG_TCL_UNSHARED_LIB_SUFFIX)
AC_SUBST(CFG_TCL_EXPORT_FILE_SUFFIX)

# win/tcl.m4 doesn't set (CFLAGS)
AC_SUBST(CFLAGS_DEFAULT)
AC_SUBST(PATHTYPE)
AC_SUBST(EXTRA_CFLAGS)
AC_SUBST(CYGPATH)
AC_SUBST(VPSEP)
AC_SUBST(CFLAGS_DEBUG)
AC_SUBST(CFLAGS_OPTIMIZE)
AC_SUBST(CFLAGS_WARNING)
AC_SUBST(EXTRA_CFLAGS)
AC_SUBST(DEPARG)
AC_SUBST(CC_OBJNAME)
AC_SUBST(CC_EXENAME)

# win/tcl.m4 doesn't set (LDFLAGS)
AC_SUBST(LDFLAGS_DEFAULT)
AC_SUBST(LDFLAGS_DEBUG)
AC_SUBST(LDFLAGS_OPTIMIZE)
AC_SUBST(LDFLAGS_CONSOLE)
AC_SUBST(LDFLAGS_WINDOW)
AC_SUBST(AR)
AC_SUBST(RANLIB)

AC_SUBST(STLIB_LD)
AC_SUBST(SHLIB_LD)
AC_SUBST(SHLIB_LD_LIBS)
AC_SUBST(SHLIB_CFLAGS)
AC_SUBST(SHLIB_SUFFIX)
AC_SUBST(CC_OBJNAME)
AC_SUBST(CC_EXENAME)
AC_SUBST(LDFLAGS)
AC_SUBST(LDFLAGS_DEBUG)
AC_SUBST(TCL_SHARED_BUILD)

AC_SUBST(LDFLAGS_OPTIMIZE)
AC_SUBST(LDFLAGS_CONSOLE)
AC_SUBST(LDFLAGS_WINDOW)
AC_SUBST(AR)
AC_SUBST(RC)
AC_SUBST(LIBS)
AC_SUBST(LIBS_GUI)
AC_SUBST(DLLSUFFIX)
AC_SUBST(LIBPREFIX)
AC_SUBST(LIBSUFFIX)
AC_SUBST(EXESUFFIX)
AC_SUBST(LIBRARIES)
AC_SUBST(MAKE_LIB)
AC_SUBST(POST_MAKE_LIB)
AC_SUBST(MAKE_DLL)
AC_SUBST(MAKE_EXE)

# empty on win, but needs sub'ing
AC_SUBST(TCL_BUILD_LIB_SPEC)
AC_SUBST(TCL_LD_SEARCH_FLAGS)
AC_SUBST(TCL_NEEDS_EXP_FILE)
AC_SUBST(TCL_BUILD_EXP_FILE)
AC_SUBST(TCL_EXP_FILE)
AC_SUBST(DL_LIBS)
AC_SUBST(LIBOBJS)
AC_SUBST(TCL_LIB_VERSIONS_OK)
AC_SUBST(TCL_PACKAGE_PATH)

# win only
AC_SUBST(RC)
AC_SUBST(RC_OUT)
AC_SUBST(RC_TYPE)
AC_SUBST(RC_INCLUDE)
AC_SUBST(RC_DEFINE)
AC_SUBST(RC_DEFINES)
AC_SUBST(RES)

AC_OUTPUT(Makefile tclConfig.sh tcl.hpj)
Changes to win/makefile.vc.
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

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
-
+





-
+

-
+




















+



-
+


+
+
+
+
-
-
+
+
+
+
+
+
+
+

+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+













-
-
-


-







# Visual C++ 2.x and 4.0 makefile
# Visual C++ makefile
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
# 
# Copyright (c) 1995-1996 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
# Copyright (c) 1998-2000 Ajuba Solutions.
#
# RCS: @(#) $Id: makefile.vc,v 1.50 2000/04/25 20:58:48 hobbs Exp $
# RCS: @(#) $Id: makefile.vc,v 1.50.2.4 2001/09/20 18:50:24 hobbs Exp $

# Does not depend on the presence of any environment variables in
# order to compile tcl; all needed information is derived from 
# location of the compiler directories.

#
# Project directories
#
# ROOT	  = top of source tree
#
# TOOLS32 = location of VC++ 32-bit development tools. Note that the
#	    VC++ 2.0 header files are broken, so you need to use the
#	    ones that come with the developer network CD's, or later
#	    versions of VC++.
#
# INSTALLDIR = where the install- targets should copy the binaries and
#	    support files
#

# Set this to the appropriate value of /MACHINE: for your platform
# Choices: IX86, IA64, ALPHA
MACHINE		= IX86

ROOT		= ..
INSTALLDIR	= c:\Progra~1\Tcl
INSTALLDIR	= C:\Progra~1\Tcl

!IF "$(MACHINE)" == "IA64"

# IA64 support is based on the standard setup with v2 of the
# Microsoft SDK for XP, RC1

TOOLS32		= c:\ia64sdk17
TOOLS32_rc	= c:\ia64sdk17
TOOLS32		= C:\Progra~1\Microsoft SDK
TOOLS32_rc	= C:\Progra~1\Microsoft SDK

cc32		= "$(TOOLS32)\bin\Win64\cl.exe"
link32		= "$(TOOLS32)\bin\Win64\link.exe"
libpath32	= /LIBPATH:"$(TOOLS32)\lib\IA64"
lib32		= "$(TOOLS32)\bin\Win64\lib.exe"

!ELSE

# Visual Studio 5 default
TOOLS32		= c:\Progra~1\devstudio\vc
TOOLS32_rc	= c:\Progra~1\devstudio\sharedide
#TOOLS32		= C:\Progra~1\devstudio\vc
#TOOLS32_rc	= C:\Progra~1\devstudio\sharedide

# Visual Studio 6 default
TOOLS32		= C:\Progra~1\Microsoft Visual Studio\VC98
TOOLS32_rc	= C:\Progra~1\Microsoft Visual Studio\common\MSDev98

cc32		= "$(TOOLS32)\bin\cl.exe"
link32		= "$(TOOLS32)\bin\link.exe"
libpath32	= /LIBPATH:"$(TOOLS32)\lib"
lib32		= "$(TOOLS32)\bin\lib.exe"

!ENDIF

rc32		= "$(TOOLS32_rc)\bin\rc.exe"
include32	= -I"$(TOOLS32)\include"

# Uncomment the following line to compile with thread support
#THREADDEFINES = -DTCL_THREADS=1

# Set NODEBUG to 0 to compile with symbols
NODEBUG = 1

# The following defines can be used to control the amount of debugging
# code that is added to the compilation.
#
#	-DTCL_MEM_DEBUG		Enables the debugging memory allocator.
#	-DTCL_COMPILE_DEBUG	Enables byte compilation logging.
#	-DTCL_COMPILE_STATS	Enables byte compilation statistics gathering.
#	-DUSE_TCLALLOC=0	Disables the Tcl memory allocator in favor
#				of the native malloc implementation.  This is
#				needed when using Purify.
#
#DEBUGDEFINES = -DTCL_MEM_DEBUG -DTCL_COMPILE_DEBUG -DTCL_COMPILE_STATS
#DEBUGDEFINES = -DUSE_TCLALLOC=0

######################################################################
# Do not modify below this line
######################################################################

NAMEPREFIX = tcl
STUBPREFIX = $(NAMEPREFIX)stub
148
149
150
151
152
153
154

155
156
157
158
159
160
161
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184







+







	$(TMPDIR)\tclGet.obj \
	$(TMPDIR)\tclHash.obj \
	$(TMPDIR)\tclHistory.obj \
	$(TMPDIR)\tclIndexObj.obj \
	$(TMPDIR)\tclInterp.obj \
	$(TMPDIR)\tclIO.obj \
	$(TMPDIR)\tclIOCmd.obj \
	$(TMPDIR)\tclIOGT.obj \
	$(TMPDIR)\tclIOSock.obj \
	$(TMPDIR)\tclIOUtil.obj \
	$(TMPDIR)\tclLink.obj \
	$(TMPDIR)\tclLiteral.obj \
	$(TMPDIR)\tclListObj.obj \
	$(TMPDIR)\tclLoad.obj \
	$(TMPDIR)\tclMain.obj \
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
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
244
245
246

247
248
249
250
251
252
253







-
-
-
-
-
-
-












+
-
+

+
+
-
+



-







	$(TMPDIR)\tclWinPipe.obj \
	$(TMPDIR)\tclWinSock.obj \
	$(TMPDIR)\tclWinThrd.obj \
	$(TMPDIR)\tclWinTime.obj 

TCLSTUBOBJS = $(TMPDIR)\tclStubLib.obj \

cc32		= "$(TOOLS32)\bin\cl.exe"
link32		= "$(TOOLS32)\bin\link.exe"
rc32		= "$(TOOLS32_rc)\bin\rc.exe"
include32	= -I"$(TOOLS32)\include"
libpath32	= /LIBPATH:"$(TOOLS32)\lib"
lib32		= "$(TOOLS32)\bin\lib.exe"

WINDIR		= $(ROOT)\win
GENERICDIR	= $(ROOT)\generic

TCL_INCLUDES	= -I"$(WINDIR)" -I"$(GENERICDIR)"
TCL_DEFINES	= $(DEBUGDEFINES) $(THREADDEFINES)

######################################################################
# Compile flags
######################################################################

!IF "$(NODEBUG)" == "1"
# This cranks the optimization level to maximize speed
!IF "$(MACHINE)" == "IA64"
cdebug = -O2 -Gs -GD
cdebug = -O2 -Gs
!ELSE
cdebug = -O2 -Gs -GD
!ENDIF
!IF "$(MACHINE)" == "IA64"
!ELSE IF "$(MACHINE)" == "IA64"
cdebug = -Od -Zi
!ELSE
cdebug = -Z7 -Od -WX
!ENDIF
!ENDIF

# declarations common to all compiler options
cflags = -c -W3 -nologo -Fp$(TMPDIR)\ -YX
cvarsdll = -MD$(DBGX)

TCL_CFLAGS	= $(cdebug) $(cflags) $(cvarsdll) $(include32) \
249
250
251
252
253
254
255
256
257

258
259
260
261
262
263
264
265
266
267
268
269
267
268
269
270
271
272
273


274
275
276
277
278

279
280
281
282
283
284
285







-
-
+




-







# declarations common to all linker options
lflags	= /NODEFAULTLIB /NOLOGO /MACHINE:$(MACHINE) $(libpath32)

# declarations for use on Intel i386, i486, and Pentium systems
!IF "$(MACHINE)" == "IX86"
DLLENTRY = @12
dlllflags = $(lflags) -entry:_DllMainCRTStartup$(DLLENTRY) -dll
!ELSE
!IF "$(MACHINE)" == "IA64"
!ELSE IF "$(MACHINE)" == "IA64"
DLLENTRY = @12
dlllflags = $(lflags) -dll
!ELSE
dlllflags = $(lflags) -entry:_DllMainCRTStartup$(DLLENTRY) -dll
!ENDIF
!ENDIF

conlflags = $(lflags) -subsystem:console -entry:mainCRTStartup
guilflags = $(lflags) -subsystem:windows -entry:WinMainCRTStartup

!IF "$(MACHINE)" == "PPC"
libc = libc$(DBGX).lib
363
364
365
366
367
368
369
370
371
372
373




374
375
376
377
378
379
380
381






382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404












405
406
407
408
409
410
411
379
380
381
382
383
384
385




386
387
388
389
390
391






392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409











410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428







-
-
-
-
+
+
+
+


-
-
-
-
-
-
+
+
+
+
+
+












-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+







	-@$(MKDIR) "$(LIB_INSTALL_DIR)"
	-@$(MKDIR) "$(INCLUDE_INSTALL_DIR)"
	-@$(MKDIR) "$(SCRIPT_INSTALL_DIR)"
	@echo installing http1.0
	-@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\http1.0"
	-@copy "$(ROOT)\library\http1.0\http.tcl"     "$(SCRIPT_INSTALL_DIR)\http1.0"
	-@copy "$(ROOT)\library\http1.0\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\http1.0"
	@echo installing http2.3
	-@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\http2.3"
	-@copy "$(ROOT)\library\http2.3\http.tcl"     "$(SCRIPT_INSTALL_DIR)\http2.3"
	-@copy "$(ROOT)\library\http2.3\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\http2.3"
	@echo installing http2.4
	-@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\http2.4"
	-@copy "$(ROOT)\library\http\http.tcl"     "$(SCRIPT_INSTALL_DIR)\http2.4"
	-@copy "$(ROOT)\library\http\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\http2.4"
	@echo installing opt0.4
	-@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\opt0.4"
	-@copy "$(ROOT)\library\opt0.4\optparse.tcl" "$(SCRIPT_INSTALL_DIR)\opt0.4"
	-@copy "$(ROOT)\library\opt0.4\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\opt0.4"
	@echo installing msgcat1.0
	-@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\msgcat1.0"
	-@copy "$(ROOT)\library\msgcat1.0\msgcat.tcl"   "$(SCRIPT_INSTALL_DIR)\msgcat1.0"
	-@copy "$(ROOT)\library\msgcat1.0\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\msgcat1.0"
	-@copy "$(ROOT)\library\opt\optparse.tcl" "$(SCRIPT_INSTALL_DIR)\opt0.4"
	-@copy "$(ROOT)\library\opt\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\opt0.4"
	@echo installing msgcat1.1
	-@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\msgcat1.1"
	-@copy "$(ROOT)\library\msgcat\msgcat.tcl"   "$(SCRIPT_INSTALL_DIR)\msgcat1.1"
	-@copy "$(ROOT)\library\msgcat\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\msgcat1.1"
	@echo installing $(TCLDDEDLLNAME)
	-@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\dde1.1"
	-@copy "$(TCLDDEDLL)" "$(SCRIPT_INSTALL_DIR)\dde1.1"
	-@copy "$(ROOT)\library\dde1.1\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\dde1.1"
	@echo installing $(TCLREGDLLNAME)
	-@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\reg1.0"
	-@copy "$(TCLREGDLL)" "$(SCRIPT_INSTALL_DIR)\reg1.0"
	-@copy "$(ROOT)\library\reg1.0\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\reg1.0"
	@echo installing encoding files
	-@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\encoding"
	-@copy "$(ROOT)\library\encoding\*.enc" "$(SCRIPT_INSTALL_DIR)\encoding"
	@echo installing library files
	-@copy "$(GENERICDIR)\tcl.h"         "$(INCLUDE_INSTALL_DIR)"
	-@copy "$(GENERICDIR)\tclDecls.h"    "$(INCLUDE_INSTALL_DIR)"
	-@copy "$(ROOT)\library\history.tcl" "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(ROOT)\library\init.tcl"    "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(ROOT)\library\ldAout.tcl"  "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(ROOT)\library\parray.tcl"  "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(ROOT)\library\safe.tcl"    "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(ROOT)\library\tclIndex"    "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(ROOT)\library\package.tcl" "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(ROOT)\library\word.tcl"    "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(ROOT)\library\auto.tcl"    "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(GENERICDIR)\tcl.h"          "$(INCLUDE_INSTALL_DIR)"
	-@copy "$(GENERICDIR)\tclDecls.h"     "$(INCLUDE_INSTALL_DIR)"
	-@copy "$(GENERICDIR)\tclPlatDecls.h" "$(INCLUDE_INSTALL_DIR)"
	-@copy "$(ROOT)\library\history.tcl"  "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(ROOT)\library\init.tcl"     "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(ROOT)\library\ldAout.tcl"   "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(ROOT)\library\parray.tcl"   "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(ROOT)\library\safe.tcl"     "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(ROOT)\library\tclIndex"     "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(ROOT)\library\package.tcl"  "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(ROOT)\library\word.tcl"     "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(ROOT)\library\auto.tcl"     "$(SCRIPT_INSTALL_DIR)"

#
# Regenerate the stubs files.
#

genstubs:
	tclsh$(VERSION) $(ROOT)\tools\genStubs.tcl $(GENERICDIR) \
503
504
505
506
507
508
509
510





511
512
513
514
515
516
517
518
519
520
521
522
523
520
521
522
523
524
525
526

527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544







-
+
+
+
+
+













    $(cc32) -DBUILD_tcl $(TCL_CFLAGS) -Fo$(TMPDIR)\ $<

{$(ROOT)\compat}.c{$(TMPDIR)}.obj:
    $(cc32) -DBUILD_tcl $(TCL_CFLAGS) -Fo$(TMPDIR)\ $<

{$(WINDIR)}.rc{$(TMPDIR)}.res:
	$(rc32) -fo $@ -r -i $(GENERICDIR) -i $(WINDIR) -D__WIN32__ \
		$(TCL_DEFINES) $<
		$(TCL_DEFINES) \
!if "$(NODEBUG)" == "0"
		-d DEBUG \
!endif
		$<

clean:
	-@$(RM) $(OUTDIR)\*.exp 
	-@$(RM) $(OUTDIR)\*.lib 
	-@$(RM) $(OUTDIR)\*.dll 
	-@$(RM) $(OUTDIR)\*.exe
	-@$(RM) $(OUTDIR)\*.pdb
	-@$(RM) $(TMPDIR)\*.pch
	-@$(RM) $(TMPDIR)\*.obj
	-@$(RM) $(TMPDIR)\*.res
	-@$(RM) $(TMPDIR)\*.exe
	-@$(RMDIR) $(OUTDIR)
	-@$(RMDIR) $(TMPDIR)
Changes to win/tcl.m4.
69
70
71
72
73
74
75
76

77
78
79
80
81
82
83
69
70
71
72
73
74
75

76
77
78
79
80
81
82
83







-
+







    if test ! -d $TK_BIN_DIR; then
	AC_MSG_ERROR(Tk directory $TK_BIN_DIR does not exist)
    fi
    if test ! -f $TK_BIN_DIR/tkConfig.sh; then
	AC_MSG_ERROR(There is no tkConfig.sh in $TK_BIN_DIR:  perhaps you did not specify the Tk *build* directory (not the toplevel Tk directory) or you forgot to configure Tk?)
    fi

    AC_MSG_RESULT($TK_BIN_DIR/tkConfig.sh)
    AC_MSG_RESULT([$TK_BIN_DIR/tkConfig.sh])
])

#------------------------------------------------------------------------
# SC_LOAD_TCLCONFIG --
#
#	Load the tclConfig.sh file
#	Currently a no-op for Windows
131
132
133
134
135
136
137
138

139
140
141

142
143
144
145
146
147
148
131
132
133
134
135
136
137

138
139
140

141
142
143
144
145
146
147
148







-
+


-
+







# Results:
#
#	Sets the following vars that should be in tkConfig.sh:
#		TK_BIN_DIR
#------------------------------------------------------------------------

AC_DEFUN(SC_LOAD_TKCONFIG, [
    AC_MSG_CHECKING([for existence of $TCLCONFIG])
    AC_MSG_CHECKING([for existence of $TK_BIN_DIR/tkConfig.sh])

    if test -f "$TK_BIN_DIR/tkConfig.sh" ; then
        AC_MSG_CHECKING([loading $TK_BIN_DIR/tkConfig.sh])
        AC_MSG_RESULT([loading])
	. $TK_BIN_DIR/tkConfig.sh
    else
        AC_MSG_RESULT([could not find $TK_BIN_DIR/tkConfig.sh])
    fi


    AC_SUBST(TK_BIN_DIR)
161
162
163
164
165
166
167




168
169
170
171
172
173














174
175







176
177
178
179
180
181
182
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







+
+
+
+






+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+







# Results:
#
#	Adds the following arguments to configure:
#		--enable-gcc
#
#	Sets the following vars:
#		CC	Command to use for the compiler
#		AR	Comman for the archive tool
#		RANLIB	Command for the archive indexing tool
#		RC	Command for the resource compiler
#
#------------------------------------------------------------------------

AC_DEFUN(SC_ENABLE_GCC, [
    AC_ARG_ENABLE(gcc, [  --enable-gcc            allow use of gcc if available [--disable-gcc]],
	[ok=$enableval], [ok=no])
    if test "$ok" = "yes"; then
	# Quick hack to simulate a real cross check
	# The right way to do this is to use AC_CHECK_TOOL
	# correctly, but this is the minimal change
	# we need until the real fix is ready.
	if test "$host" != "$build" ; then
	    if test -z "$CC"; then
		CC=${host}-gcc
	    fi
	    AC_PROG_CC
	    AC_CHECK_PROG(AR, ${host}-ar, ${host}-ar)
	    AC_CHECK_PROG(RANLIB, ${host}-ranlib, ${host}-ranlib)
	    AC_CHECK_PROG(RC, ${host}-windres, ${host}-windres)
	else
	    if test -z "$CC"; then
	CC=gcc
	AC_PROG_CC
		CC=gcc
	    fi
	    AC_PROG_CC
	    AC_CHECK_PROG(AR, ar, ar)
	    AC_CHECK_PROG(RANLIB, ranlib, ranlib)
	    AC_CHECK_PROG(RC, windres, windres)
    	fi
    else
	# Allow user to override
	if test -z "$CC"; then
	    CC=cl
	fi
    fi
])
249
250
251
252
253
254
255
256

257

258
259
260
261
262
263
264
265
266
267
268

269
270
271
272
273
274
275
276
277
278
279
280
281




282
283
284
285
286
287
288
289
290
291
292


293
294
295
296
297


298
299
300
301
302
303
304
272
273
274
275
276
277
278

279
280
281
282
283
284
285
286
287
288
289
290
291

292
293
294
295
296
297
298
299
300
301




302
303
304
305
306
307
308
309
310
311
312
313
314


315
316
317
318
319


320
321
322
323
324
325
326
327
328







-
+

+










-
+









-
-
-
-
+
+
+
+









-
-
+
+



-
-
+
+








    if test "$tcl_ok" = "yes"; then
	AC_MSG_RESULT(yes)
	TCL_THREADS=1
	AC_DEFINE(TCL_THREADS)
    else
	TCL_THREADS=0
	AC_MSG_RESULT(no (default))
	AC_MSG_RESULT([no (default)])
    fi
    AC_SUBST(TCL_THREADS)
])

#------------------------------------------------------------------------
# SC_ENABLE_SYMBOLS --
#
#	Specify if debugging symbols should be used
#
# Arguments:
#	none
#	
#	Requires the following vars to be set:
#	Requires the following vars to be set in the Makefile:
#		CFLAGS_DEBUG
#		CFLAGS_OPTIMIZE
#	
# Results:
#
#	Adds the following arguments to configure:
#		--enable-symbols
#
#	Defines the following vars:
#		CFLAGS_DEFAULT	Sets to CFLAGS_DEBUG if true
#				Sets to CFLAGS_OPTIMIZE if false
#		LDFLAGS_DEFAULT	Sets to LDFLAGS_DEBUG if true
#				Sets to LDFLAGS_OPTIMIZE if false
#		CFLAGS_DEFAULT	Sets to $(CFLAGS_DEBUG) if true
#				Sets to $(CFLAGS_OPTIMIZE) if false
#		LDFLAGS_DEFAULT Sets to $(LDFLAGS_DEBUG) if true
#				Sets to $(LDFLAGS_OPTIMIZE) if false
#		DBGX		Debug library extension
#
#------------------------------------------------------------------------

AC_DEFUN(SC_ENABLE_SYMBOLS, [
    AC_MSG_CHECKING([for build with symbols])
    AC_ARG_ENABLE(symbols, [  --enable-symbols        build with debugging symbols [--disable-symbols]],    [tcl_ok=$enableval], [tcl_ok=no])

    if test "$tcl_ok" = "yes"; then
	CFLAGS_DEFAULT="${CFLAGS_DEBUG}"
	LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}"
	CFLAGS_DEFAULT='$(CFLAGS_DEBUG)'
	LDFLAGS_DEFAULT='$(LDFLAGS_DEBUG)'
	DBGX=d
	AC_MSG_RESULT([yes])
    else
	CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE}"
	LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}"
	CFLAGS_DEFAULT='$(CFLAGS_OPTIMIZE)'
	LDFLAGS_DEFAULT='$(LDFLAGS_OPTIMIZE)'
	DBGX=""
	AC_MSG_RESULT([no])
    fi
])


#--------------------------------------------------------------------
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329











330
331
332
333


334
335
336
337
338
339
340
341










342
343
344
345
346
347





348
349
350
351



352



353
354
355
356
357
358








359
360
361

362



363
364
365
366

367
368
369
370








371
372
373
374
375

376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420



421
422
423
424

425
426
427
428




429
430

431
432
433


434
435
436
437
438
439
440



441
442
443
444
445
446
447
448


449
450
451
452
453
454
455







456
457

458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482

483

484
485
486
487
488



489














490
491
492
493






































494
495

496
497

498
499
500

501
502
503
504
505


506






507
508
509
510
511
512
513
336
337
338
339
340
341
342











343
344
345
346
347
348
349
350
351
352
353




354
355








356
357
358
359
360
361
362
363
364
365
366





367
368
369
370
371
372
373
374
375
376
377
378

379
380
381
382
383
384



385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403

404




405
406
407
408
409
410
411
412
413
414
415


416
417
418
419

420
421
422
423






424
425
426
427
428
429
430
431

432
433
434
435


















436
437
438




439
440

441
442
443
444
445
446
447

448



449
450


451

452
453
454
455
456
457
458
459
460
461
462
463


464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480

481
482











483
484
485
486
487
488
489
490

491
492
493
494
495

496
497

498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518




519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557

558
559

560
561
562

563
564
565
566


567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582







-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+

-
-
-
-
-
+
+
+
+
+




+
+
+
-
+
+
+



-
-
-
+
+
+
+
+
+
+
+



+

+
+
+



-
+
-
-
-
-
+
+
+
+
+
+
+
+



-
-
+



-




-
-
-
-
-
-








-




-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
-
-
-
-
+

-


+
+
+
+

-
+
-
-
-
+
+
-
-

-



+
+
+






-
-
+
+







+
+
+
+
+
+
+

-
+

-
-
-
-
-
-
-
-
-
-
-








-




+
-
+

-



+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

-
+

-
+


-
+



-
-
+
+

+
+
+
+
+
+







#	in the final configure script.
#
# Arguments:
#	none
#
# Results:
#
#	Defines the following vars for all compilers:
#    		EXTRA_CFLAGS
#    		CFLAGS_DEBUG
#    		CFLAGS_OPTIMIZE
#    		CFLAGS_WARNING
#    		LDFLAGS_DEBUG
#    		LDFLAGS_OPTIMIZE
#    		LDFLAGS_CONSOLE
#    		LDFLAGS_WINDOW
#    		CC_OBJNAME
#    		CC_EXENAME
#	Can the following vars:
#		EXTRA_CFLAGS
#		CFLAGS_DEBUG
#		CFLAGS_OPTIMIZE
#		CFLAGS_WARNING
#		LDFLAGS_DEBUG
#		LDFLAGS_OPTIMIZE
#		LDFLAGS_CONSOLE
#		LDFLAGS_WINDOW
#		CC_OBJNAME
#		CC_EXENAME
#    		PATHTYPE
#    		VPSEP
#    		CYGPATH
#
#		CYGPATH
#		STLIB_LD
#	Defines the following vars for non-gcc compilers
#    		SHLIB_LD
#    		SHLIB_LD_LIBS
#    		LIBS
#    		AR
#    		MAKE_LIB
#    		MAKE_EXE
#    		MAKE_DLL
#		SHLIB_LD
#		SHLIB_LD_LIBS
#		LIBS
#		AR
#		RC
#		RES
#
#		MAKE_LIB
#		MAKE_EXE
#		MAKE_DLL
#
#    		LIBSUFFIX
#    		LIBPREFIX
#    		LIBRARIES
#    		EXESUFFIX
#    		DLLSUFFIX
#		LIBSUFFIX
#		LIBPREFIX
#		LIBRARIES
#		EXESUFFIX
#		DLLSUFFIX
#
#--------------------------------------------------------------------

AC_DEFUN(SC_CONFIG_CFLAGS, [

    # Step 0: Enable 64 bit support?

    AC_MSG_CHECKING([compiler flags])
    AC_MSG_CHECKING([if 64bit support is requested])
    AC_ARG_ENABLE(64bit,[  --enable-64bit          enable 64bit support (where applicable)], [do64bit=$enableval], [do64bit=no])
    AC_MSG_RESULT($do64bit)

    # Set some defaults (may get changed below)
    EXTRA_CFLAGS=""
    PATHTYPE='-w'
    CYGPATH='cygpath'
    VPSEP=';'

    AC_CHECK_PROG(CYGPATH, cygpath, cygpath -w, echo)

    if test "$CYGPATH" = "echo" || test "$ac_cv_cygwin" = "yes"; then
	DEPARG='"$<"'
    else
	DEPARG='"$(shell $(CYGPATH) $<)"'
    fi

    # set various compiler flags depending on whether we are using gcc or cl
    
    AC_MSG_CHECKING([compiler flags])
    if test "${GCC}" = "yes" ; then
	if test "$do64bit" = "yes" ; then
	    AC_MSG_WARN("64bit mode not supported with GCC on Windows")
	fi
	SHLIB_LD=""
	SHLIB_LD_LIBS=""
	LIBS=""
	LIBS_GUI="-lgdi32 -lcomdlg32"
	LIBS_GUI="-lgdi32 -lcomdlg32 -limm32"
	AR="${AR-ar}"
	STLIB_LD="${AR-ar}"
	RC="${WINDRES-windres}"
	MAKE_LIB="\${AR} crv \[$]@"
	STLIB_LD='${AR} cr'
	RC_OUT=-o
	RC_TYPE=
	RC_INCLUDE=--include
	RC_DEFINE=--define
	RES=res.o
	MAKE_LIB="\${STLIB_LD} \[$]@"
	POST_MAKE_LIB="\${RANLIB} \[$]@"
	MAKE_EXE="\${CC} -o \[$]@"
	LIBPREFIX="lib"

	if "$CC" -v 2>&1 | egrep '\/gcc-lib\/i[[3-6]]86[[^\/]]*-cygwin' >/dev/null; then
	    mno_cygwin="yes"
	if test "$ac_cv_cygwin" = "yes"; then
	    extra_cflags="-mno-cygwin"
	    extra_ldflags="-mno-cygwin"
	else
	    mno_cygwin="no"
	    extra_cflags=""
	    extra_ldflags=""
	fi

	if test "$cross_compiling" = "yes" -o "$mno_cygwin" = "yes"; then
	    PATHTYPE=''
	    CYGPATH='echo '
	    VPSEP=':'
	fi

	if test "${SHARED_BUILD}" = "0" ; then
	    # static
            AC_MSG_RESULT([using static flags])
	    runtime=
	    MAKE_DLL="echo "
	    LIBSUFFIX="s\${DBGX}.a"
	    LIBRARIES="\${STATIC_LIBRARIES}"
	    EXESUFFIX="s\${DBGX}.exe"
	    DLLSUFFIX=""
	else
	    # dynamic
            AC_MSG_RESULT([using shared flags])

	    # check to see if ld supports --shared. Libtool does a much
	    # more extensive test, but not really needed in this case.
	    if test -z "$LD"; then
		ld_prog="`(${CC} -print-prog-name=ld) 2>/dev/null`"
		if test -z "$ld_prog"; then
		  ld_prog=ld
		else
		  # get rid of the potential '\r' from ld_prog.
		  ld_prog="`(echo $ld_prog | tr -d '\015' | sed 's,\\\\,\\/,g')`"
		fi
		LD="$ld_prog"
	    fi

	    AC_MSG_CHECKING([whether $ld_prog supports -shared option])

	    # now the ad-hoc check to see if GNU ld supports --shared.
	    if "$LD" --shared 2>&1 | egrep ': -shared not supported' >/dev/null; then
		ld_supports_shared="no"
	    # ad-hoc check to see if CC supports -shared.
	    if "${CC}" -shared 2>&1 | egrep ': -shared not supported' >/dev/null; then
		AC_MSG_ERROR([${CC} does not support the -shared option.
		SHLIB_LD="${DLLWRAP-dllwrap}"
	    else
		ld_supports_shared="yes"
		SHLIB_LD="${CC} -shared"
		 You will need to upgrade to a newer version of the toolchain.])
	    fi
	    AC_MSG_RESULT([$ld_supports_shared])

	    runtime=
	    # Link with gcc since ld does not link to default libs like
	    # -luser32 and -lmsvcrt by default. Make sure CFLAGS is
	    # included so -mno-cygwin passed the correct libs to the linker.
	    SHLIB_LD='${CC} -shared ${CFLAGS}'
	    # Add SHLIB_LD_LIBS to the Make rule, not here.
	    MAKE_DLL="\${SHLIB_LD} \$(LDFLAGS) -o \[$]@ ${extra_ldflags}"
	    MAKE_DLL="\${SHLIB_LD} \$(LDFLAGS) -o \[$]@ ${extra_ldflags} \
	    if test "${ld_supports_shared}" = "yes"; then
	        MAKE_DLL="${MAKE_DLL} -Wl,--out-implib,\$(patsubst %.dll,lib%.a,\[$]@)"
	    else
		-Wl,--out-implib,\$(patsubst %.dll,lib%.a,\[$]@)"

	        MAKE_DLL="${MAKE_DLL} --output-lib \$(patsubst %.dll,lib%.a,\[$]@)"
	    fi
	    LIBSUFFIX="\${DBGX}.a"
	    DLLSUFFIX="\${DBGX}.dll"
	    EXESUFFIX="\${DBGX}.exe"
	    LIBRARIES="\${SHARED_LIBRARIES}"
	fi
	# DLLSUFFIX is separate because it is the building block for
	# users of tclConfig.sh that may build shared or static.
	DLLSUFFIX="\${DBGX}.dll"

	EXTRA_CFLAGS="${extra_cflags}"

	CFLAGS_DEBUG=-g
	CFLAGS_OPTIMIZE=-O
	CFLAGS_WARNING="-Wall -Wconversion"
	LDFLAGS_DEBUG=-g
	LDFLAGS_OPTIMIZE=-O
	LDFLAGS_DEBUG=
	LDFLAGS_OPTIMIZE=

	# Specify the CC output file names based on the target name
	CC_OBJNAME="-o \[$]@"
	CC_EXENAME="-o \[$]@"

	# Specify linker flags depending on the type of app being 
	# built -- Console vs. Window.
	#
	# We need to pass -e _WinMain@16 so that ld will use
	# WinMain() instead of main() as the entry point. We can't
	# use autoconf to check for this case since it would need
	# to run an executable and that does not work when
	# cross compiling. Remove this -e workaround once we
	# require a gcc that does not have this bug.
	LDFLAGS_CONSOLE="-mconsole ${extra_ldflags}"
	LDFLAGS_WINDOW="-mwindows ${extra_ldflags}"
	LDFLAGS_WINDOW="-mwindows -e _WinMain@16 ${extra_ldflags}"
    else
	SHLIB_LD="link -dll -nologo"
	SHLIB_LD_LIBS="user32.lib advapi32.lib"
	LIBS="user32.lib advapi32.lib"
	LIBS_GUI="gdi32.lib comdlg32.lib"
	AR="lib -nologo"
	STLIB_LD="lib -nologo"
	RC="rc"
	MAKE_LIB="\${AR} -out:\[$]@"
	MAKE_EXE="\${CC} -Fe\[$]@"
	LIBPREFIX=""

	if test "${SHARED_BUILD}" = "0" ; then
	    # static
            AC_MSG_RESULT([using static flags])
	    runtime=-MT
	    MAKE_DLL="echo "
	    LIBSUFFIX="s\${DBGX}.lib"
	    LIBRARIES="\${STATIC_LIBRARIES}"
	    EXESUFFIX="s\${DBGX}.exe"
	    DLLSUFFIX=""
	else
	    # dynamic
            AC_MSG_RESULT([using shared flags])
	    runtime=-MD
	    # Add SHLIB_LD_LIBS to the Make rule, not here.
	    MAKE_DLL="\${SHLIB_LD} \${SHLIB_LD_LIBS} \$(LDFLAGS) -out:\[$]@"
	    MAKE_DLL="\${SHLIB_LD} \$(LDFLAGS) -out:\[$]@"
	    LIBSUFFIX="\${DBGX}.lib"
	    DLLSUFFIX="\${DBGX}.dll"
	    EXESUFFIX="\${DBGX}.exe"
	    LIBRARIES="\${SHARED_LIBRARIES}"
	fi
	# DLLSUFFIX is separate because it is the building block for
	# users of tclConfig.sh that may build shared or static.
	DLLSUFFIX="\${DBGX}.dll"

	# This is a 2-stage check to make sure we have the 64-bit SDK
	# We have to know where the SDK is installed.
	if test "$do64bit" = "yes" ; then
	    if test "x${MSSDK}x" = "xx" ; then
		MSSDK="C:/Progra~1/Microsoft SDK"
	    fi
	    # In order to work in the tortured autoconf environment,
	    # we need to ensure that this path has no spaces
	    MSSDK=$(cygpath -w -s "$MSSDK" | sed -e 's!\\!/!g')
	    if test ! -d "${MSSDK}/bin/win64" ; then
		AC_MSG_WARN("could not find 64-bit SDK to enable 64bit mode")
		do64bit="no"
	    fi
	fi
	EXTRA_CFLAGS="-YX"
	CFLAGS_DEBUG="-nologo -Z7 -Od -WX ${runtime}d"
#	CFLAGS_OPTIMIZE="-nologo -O2 -Gs -GD ${runtime}"
	CFLAGS_OPTIMIZE="-nologo -Oti -Gs -GD ${runtime}"

	if test "$do64bit" = "yes" ; then
	    # All this magic is necessary for the Win64 SDK RC1 - hobbs
	    CC="${MSSDK}/Bin/Win64/cl.exe \
	-I${MSSDK}/Include/prerelease \
	-I${MSSDK}/Include/Win64/crt \
	-I${MSSDK}/Include/Win64/crt/sys \
	-I${MSSDK}/Include"
	    RC="${MSSDK}/bin/rc.exe"
	    CFLAGS_DEBUG="-nologo -Zi -Od ${runtime}d"
	    CFLAGS_OPTIMIZE="-nologo -O2 -Gs ${runtime}"
	    lflags="-MACHINE:IA64 -LIBPATH:${MSSDK}/Lib/IA64 \
	-LIBPATH:${MSSDK}/Lib/Prerelease/IA64"
	    STLIB_LD="${MSSDK}/bin/win64/lib.exe -nologo ${lflags}"
	    LINKBIN="${MSSDK}/bin/win64/link.exe ${lflags}"
	else
	    RC="rc"
	    CFLAGS_DEBUG="-nologo -Z7 -Od -WX ${runtime}d"
	    CFLAGS_OPTIMIZE="-nologo -Oti -Gs -GD ${runtime}"
	    STLIB_LD="lib -nologo"
	    LINKBIN="link -link50compat"
	fi

	SHLIB_LD="${LINKBIN} -dll -nologo -incremental:no"
	SHLIB_LD_LIBS="user32.lib advapi32.lib"
	LIBS="user32.lib advapi32.lib"
	LIBS_GUI="gdi32.lib comdlg32.lib imm32.lib"
	RC_OUT=-fo
	RC_TYPE=-r
	RC_INCLUDE=-i
	RC_DEFINE=-d
	RES=res
	MAKE_LIB="\${STLIB_LD} -out:\[$]@"
	POST_MAKE_LIB=
	MAKE_EXE="\${CC} -Fe\[$]@"
	LIBPREFIX=""

	EXTRA_CFLAGS="-YX"
	CFLAGS_WARNING="-W3"
	LDFLAGS_DEBUG="-debug:full -debugtype:cv"
	LDFLAGS_DEBUG="-debug:full -debugtype:both"
	LDFLAGS_OPTIMIZE="-release"
	

	# Specify the CC output file names based on the target name
	CC_OBJNAME="-Fo\[$]@"
	CC_EXENAME="-Fe\"\$(shell \$(CYGPATH) \$(PATHTYPE) '\[$]@')\""
	CC_EXENAME="-Fe\"\$(shell \$(CYGPATH) '\[$]@')\""

	# Specify linker flags depending on the type of app being 
	# built -- Console vs. Window.
	LDFLAGS_CONSOLE="-subsystem:console"
	LDFLAGS_WINDOW="-subsystem:windows"
	LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}"
	LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}"
    fi

    # DL_LIBS is empty, but then we match the Unix version
    AC_SUBST(DL_LIBS)
    AC_SUBST(CFLAGS_DEBUG)
    AC_SUBST(CFLAGS_OPTIMIZE)
    AC_SUBST(CFLAGS_WARNING)
])

#------------------------------------------------------------------------
# SC_WITH_TCL --
#
#	Location of the Tcl build directory.
#
539
540
541
542
543
544
545















































608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
	AC_MSG_ERROR(There is no Makefile in $TCL_BIN_DIR:  perhaps you did not specify the Tcl *build* directory (not the toplevel Tcl directory) or you forgot to configure Tcl?)
    else
	echo "building against Tcl binaries in: $TCL_BIN_DIR"
    fi
    AC_SUBST(TCL_BIN_DIR)
])

# FIXME : SC_PROG_TCLSH should really look for the installed tclsh and
# not the build version. If we want to use the build version in the
# tk script, it is better to hardcode that!

#------------------------------------------------------------------------
# SC_PROG_TCLSH
#	Locate a tclsh shell in the following directories:
#		${exec_prefix}/bin
#		${prefix}/bin
#		${TCL_BIN_DIR}
#		${TCL_BIN_DIR}/../bin
#		${PATH}
#
# Arguments
#	none
#
# Results
#	Subst's the following values:
#		TCLSH_PROG
#------------------------------------------------------------------------

AC_DEFUN(SC_PROG_TCLSH, [
    AC_MSG_CHECKING([for tclsh])

    AC_CACHE_VAL(ac_cv_path_tclsh, [
	search_path=`echo ${exec_prefix}/bin:${prefix}/bin:${TCL_BIN_DIR}:${TCL_BIN_DIR}/../bin:${PATH} | sed -e 's/:/ /g'`
	for dir in $search_path ; do
	    for j in `ls -r $dir/tclsh[[8-9]]*.exe 2> /dev/null` \
		    `ls -r $dir/tclsh* 2> /dev/null` ; do
		if test x"$ac_cv_path_tclsh" = x ; then
		    if test -f "$j" ; then
			ac_cv_path_tclsh=$j
			break
		    fi
		fi
	    done
	done
    ])

    if test -f "$ac_cv_path_tclsh" ; then
	TCLSH_PROG=$ac_cv_path_tclsh
	AC_MSG_RESULT($TCLSH_PROG)
    else
	AC_MSG_ERROR(No tclsh found in PATH:  $search_path)
    fi
    AC_SUBST(TCLSH_PROG)
])
Changes to win/tcl.rc.
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

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







-
+

-
+


-
+



+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







+
+
+

+
-
-
+
+







-
-
+
+

-
+









-
-
-
-
-
-
-
// RCS: @(#) $Id: tcl.rc,v 1.5 2000/04/18 23:26:45 redman Exp $
// RCS: @(#) $Id: tcl.rc,v 1.5.2.2 2001/10/03 20:24:59 hobbs Exp $
//
// Version
// Version Resource Script
//

#define VS_VERSION_INFO 1
#include <winver.h>

#define RESOURCE_INCLUDED
#include <tcl.h>

//
// build-up the name suffix that defines the type of build this is.
//
#ifdef TCL_THREADS
#define SUFFIX_THREADS	    "t"
#else
#define SUFFIX_THREADS	    ""
#endif

#ifdef DEBUG
#define SUFFIX_DEBUG	    "d"
#else
#define SUFFIX_DEBUG	    ""
#endif

#define SUFFIX		    SUFFIX_THREADS SUFFIX_DEBUG


LANGUAGE 0x9, 0x1	/* LANG_ENGLISH, SUBLANG_DEFAULT */

VS_VERSION_INFO VERSIONINFO
 FILEVERSION 	TCL_MAJOR_VERSION,TCL_MINOR_VERSION,TCL_RELEASE_LEVEL,TCL_RELEASE_SERIAL
 PRODUCTVERSION TCL_MAJOR_VERSION,TCL_MINOR_VERSION,TCL_RELEASE_LEVEL,TCL_RELEASE_SERIAL
 FILEFLAGSMASK 	0x3fL
#ifdef DEBUG
 FILEFLAGS 	VS_FF_DEBUG
#else
 FILEFLAGS 	0x0L
#endif
 FILEOS 	0x4	/* VOS__WINDOWS32 */
 FILETYPE 	0x2	/* VFT_DLL */
 FILEOS 	VOS__WINDOWS32
 FILETYPE 	VFT_DLL
 FILESUBTYPE 	0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904b0" /* LANG_ENGLISH/SUBLANG_ENGLISH_US, Unicode CP */
        BEGIN
            VALUE "FileDescription", "Tcl DLL\0"
            VALUE "OriginalFilename", "tcl" STRINGIFY(TCL_MAJOR_VERSION) STRINGIFY(TCL_MINOR_VERSION) ".dll\0"
            VALUE "CompanyName", "Scriptics Corporation\0"
            VALUE "OriginalFilename", "tcl" STRINGIFY(TCL_MAJOR_VERSION) STRINGIFY(TCL_MINOR_VERSION) SUFFIX ".dll\0"
            VALUE "CompanyName", "ActiveState Corporation\0"
            VALUE "FileVersion", TCL_PATCH_LEVEL
            VALUE "LegalCopyright", "Copyright (c) 2000 by Scriptics Corporation\0"
            VALUE "LegalCopyright", "Copyright (c) 2000 by ActiveState Corporation, et al\0"
            VALUE "ProductName", "Tcl " TCL_VERSION " for Windows\0"
            VALUE "ProductVersion", TCL_PATCH_LEVEL
        END		    
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x409, 1200
    END
END







Changes to win/tclConfig.sh.in.
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
1
2
3
4
5
6
7
8
9
10
11

12
13



14




15
16
17
18
19
20
21











-
+

-
-
-

-
-
-
-







# tclConfig.sh --
# 
# This shell script (for sh) is generated automatically by Tcl's
# configure script.  It will create shell variables for most of
# the configuration options discovered by the configure script.
# This script is intended to be included by the configure scripts
# for Tcl extensions so that they don't have to figure this all
# out for themselves.
#
# The information in this file is specific to a single platform.
#
# RCS: @(#) $Id: tclConfig.sh.in,v 1.3 1999/07/29 19:21:32 wart Exp $
# RCS: @(#) $Id: tclConfig.sh.in,v 1.3.10.2 2000/07/28 07:58:28 mo Exp $


TCL_SRC_DIR="@TCL_SRC_DIR@"
TCL_LIB_FILE="@TCL_LIB_FILE@"
TCL_DLL_FILE="@TCL_DLL_FILE@"
TCL_STUB_LIB_FILE="@TCL_STUB_LIB_FILE@"




# Tcl's version number.
TCL_VERSION='@TCL_VERSION@'
TCL_MAJOR_VERSION='@TCL_MAJOR_VERSION@'
TCL_MINOR_VERSION='@TCL_MINOR_VERSION@'
TCL_PATCH_LEVEL='@TCL_PATCH_LEVEL@'

56
57
58
59
60
61
62
63

64
65
66
67
68
69
70
49
50
51
52
53
54
55

56
57
58
59
60
61
62
63







-
+







# String that can be evaluated to generate the part of the export file
# name that comes after the "libxxx" (includes version number, if any,
# extension, and anything else needed).  May depend on the variables
# VERSION.  On most UNIX systems this is ${VERSION}.exp.
TCL_EXPORT_FILE_SUFFIX='@CFG_TCL_EXPORT_FILE_SUFFIX@'

# Additional libraries to use when linking Tcl.
TCL_LIBS='@DL_LIBS@ @LIBS@ @MATH_LIBS@'
TCL_LIBS='@LIBS@'

# Top-level directory in which Tcl's platform-independent files are
# installed.
TCL_PREFIX='@prefix@'

# Top-level directory in which Tcl's platform-specific files (e.g.
# executables) are installed.
78
79
80
81
82
83
84
85

86
87
88
89
90
91
92
71
72
73
74
75
76
77

78
79
80
81
82
83
84
85







-
+








# Extra flags to pass to cc:
TCL_EXTRA_CFLAGS='@EXTRA_CFLAGS@'

# Base command to use for combining object files into a shared library:
TCL_SHLIB_LD='@SHLIB_LD@'

# Base command to use for combining object files into a shared library:
# Base command to use for combining object files into a static library:
TCL_STLIB_LD='@STLIB_LD@'

# Either '$LIBS' (if dependent libraries should be included when linking
# shared libraries) or an empty string.  See Tcl's configure.in for more
# explanation.
TCL_SHLIB_LD_LIBS='@SHLIB_LD_LIBS@'

Changes to win/tclWinChan.c.
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16
17
18
19











-
+







/* 
 * tclWinChan.c
 *
 *	Channel drivers for Windows channels based on files, command
 *	pipes and TCP sockets.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinChan.c,v 1.10 2000/04/20 01:30:20 hobbs Exp $
 * RCS: @(#) $Id: tclWinChan.c,v 1.10.2.3 2001/09/07 17:10:33 andreas_kupries Exp $
 */

#include "tclWinInt.h"

/*
 * State flags used in the info structures below.
 */
36
37
38
39
40
41
42


43
44
45
46
47
48
49
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51







+
+







				 * which operations are valid on the file. */
    int watchMask;		/* OR'ed combination of TCL_READABLE,
				 * TCL_WRITABLE, or TCL_EXCEPTION: indicates
				 * which events should be reported. */
    int flags;			/* State flags, see above for a list. */
    HANDLE handle;		/* Input/output file. */
    struct FileInfo *nextPtr;	/* Pointer to next registered file. */
    int dirty;                  /* Boolean flag. Set if the OS may have data
				 * pending on the channel */
} FileInfo;

typedef struct ThreadSpecificData {
    /*
     * List of all file channels currently open.
     */

97
98
99
100
101
102
103
104

105
106
107
108
109
110
111
112




113
114
115
116
117
118
119
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







-
+








+
+
+
+







			    
/*
 * This structure describes the channel type structure for file based IO.
 */

static Tcl_ChannelType fileChannelType = {
    "file",			/* Type name. */
    FileBlockProc,		/* Set blocking or non-blocking mode.*/
    TCL_CHANNEL_VERSION_2,	/* v2 channel */
    FileCloseProc,		/* Close proc. */
    FileInputProc,		/* Input proc. */
    FileOutputProc,		/* Output proc. */
    FileSeekProc,		/* Seek proc. */
    NULL,			/* Set option proc. */
    NULL,			/* Get option proc. */
    FileWatchProc,		/* Set up the notifier to watch the channel. */
    FileGetHandleProc,		/* Get an OS handle from channel. */
    NULL,			/* close2proc. */
    FileBlockProc,		/* Set blocking or non-blocking mode.*/
    NULL,			/* flush proc. */
    NULL,			/* handler proc. */
};


/*
 *----------------------------------------------------------------------
 *
 * FileInit --
549
550
551
552
553
554
555
556

557
558
559
560
561
562
563
555
556
557
558
559
560
561

562
563
564
565
566
567
568
569







-
+








    if (WriteFile(infoPtr->handle, (LPVOID) buf, (DWORD) toWrite, &bytesWritten,
            (LPOVERLAPPED) NULL) == FALSE) {
        TclWinConvertError(GetLastError());
        *errorCode = errno;
        return -1;
    }
    FlushFileBuffers(infoPtr->handle);
    infoPtr->dirty = 1;
    return bytesWritten;
}

/*
 *----------------------------------------------------------------------
 *
 * FileWatchProc --
871
872
873
874
875
876
877

878
879

880
881
882

883
884
885
886
887




888
889
890
891
892
893
894
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







+

-
+
-


+





+
+
+
+







    ClientData rawHandle;	/* OS level handle */
    int mode;			/* ORed combination of TCL_READABLE and
                                 * TCL_WRITABLE to indicate file mode. */
{
    char channelName[16 + TCL_INTEGER_SPACE];
    Tcl_Channel channel = NULL;
    HANDLE handle = (HANDLE) rawHandle;
    HANDLE dupedHandle;
    DCB dcb;
    DWORD consoleParams;
    DWORD consoleParams, type;
    DWORD type;
    TclFile readFile = NULL;
    TclFile writeFile = NULL;
    BOOL result;

    if (mode == 0) {
	return NULL;
    }

    /*
     * GetFileType() returns FILE_TYPE_UNKNOWN for invalid handles.
     */

    type = GetFileType(handle);

    /*
     * If the file is a character device, we need to try to figure out
     * whether it is a serial port, a console, or something else.  We
     * test for the console case first because this is more common.
     */
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
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







-



+


-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







	    writeFile = TclWinMakeFile(handle);
	}
	channel = TclpCreateCommandChannel(readFile, writeFile, NULL, 0, NULL);
	break;

    case FILE_TYPE_DISK:
    case FILE_TYPE_CHAR:
    case FILE_TYPE_UNKNOWN:
	channel = TclWinOpenFileChannel(handle, channelName, mode, 0);
	break;
	
    case FILE_TYPE_UNKNOWN:
    default:
	/*
	 * The handle is of an unknown type, probably /dev/nul equivalent
	 * or possibly a closed handle.
	 */
	
	channel = NULL;
	break;
	 * The handle is of an unknown type.  Test the validity of this OS
	 * handle by duplicating it, then closing the dupe.  The Win32 API
	 * doesn't provide an IsValidHandle() function, so we have to emulate
	 * it here.  This test will not work on a console handle reliably,
	 * which is why we can't test every handle that comes into this
	 * function in this way.
	 */

	result = DuplicateHandle(GetCurrentProcess(), handle,
		GetCurrentProcess(), &dupedHandle, 0, FALSE,
		DUPLICATE_SAME_ACCESS);

	if (result != 0) {
	    /* 
	     * Unable to make a duplicate. It's definately invalid at this
	     * point.
	     */

	    return NULL;
	}

	/*
	 * Use structured exception handling (Win32 SEH) to protect the close
	 * of this duped handle which might throw EXCEPTION_INVALID_HANDLE.
	 */

	__try {
	    CloseHandle(dupedHandle);
	}
	__except (EXCEPTION_EXECUTE_HANDLER) {
	    /*
	     * Definately an invalid handle.  So, therefore, the original
	     * is invalid also.
	     */

	    return NULL;
	}

	/* Fall through, the handle is valid. */

	/*
	 * Create the undefined channel, anyways, because we know the handle
	 * is valid to something.
	 */

	channel = TclWinOpenFileChannel(handle, channelName, mode, 0);
    }

    return channel;
}

/*
 *----------------------------------------------------------------------
966
967
968
969
970
971
972

973
974
975
976
977
978
979
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030







+







    int type;			/* One of TCL_STDIN, TCL_STDOUT, TCL_STDERR. */
{
    Tcl_Channel channel;
    HANDLE handle;
    int mode;
    char *bufMode;
    DWORD handleId;		/* Standard handle to retrieve. */


    switch (type) {
	case TCL_STDIN:
	    handleId = STD_INPUT_HANDLE;
	    mode = TCL_READABLE;
	    bufMode = "line";
	    break;
995
996
997
998
999
1000
1001
1002

1003
1004

1005
1006

1007
1008
1009
1010

1011
1012
1013
1014
1015
1016
1017
1046
1047
1048
1049
1050
1051
1052

1053
1054

1055
1056

1057
1058
1059
1060

1061
1062
1063
1064
1065
1066
1067
1068







-
+

-
+

-
+



-
+







    handle = GetStdHandle(handleId);

    /*
     * Note that we need to check for 0 because Windows may return 0 if this
     * is not a console mode application, even though this is not a valid
     * handle.
     */
    

    if ((handle == INVALID_HANDLE_VALUE) || (handle == 0)) {
	return NULL;
	return (Tcl_Channel) NULL;
    }
    

    channel = Tcl_MakeFileChannel(handle, mode);

    if (channel == NULL) {
	return NULL;
	return (Tcl_Channel) NULL;
    }

    /*
     * Set up the normal channel options for stdio handles.
     */

    if ((Tcl_SetChannelOption((Tcl_Interp *) NULL, channel, "-translation",
1073
1074
1075
1076
1077
1078
1079
1080

1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096










































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







-
+
















+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
    infoPtr = (FileInfo *) ckalloc((unsigned) sizeof(FileInfo));
    infoPtr->nextPtr = tsdPtr->firstFilePtr;
    tsdPtr->firstFilePtr = infoPtr;
    infoPtr->validMask = permissions;
    infoPtr->watchMask = 0;
    infoPtr->flags = appendMode;
    infoPtr->handle = handle;
	
    infoPtr->dirty = 0;
    wsprintfA(channelName, "file%lx", (int) infoPtr);
    
    infoPtr->channel = Tcl_CreateChannel(&fileChannelType, channelName,
	    (ClientData) infoPtr, permissions);
    
    /*
     * Files have default translation of AUTO and ^Z eof char, which
     * means that a ^Z will be accepted as EOF when reading.
     */
    
    Tcl_SetChannelOption(NULL, infoPtr->channel, "-translation", "auto");
    Tcl_SetChannelOption(NULL, infoPtr->channel, "-eofchar", "\032 {}");

    return infoPtr->channel;
}


/*
 *----------------------------------------------------------------------
 *
 * TclWinOpenFileChannel --
 *
 *	Constructs a File channel for the specified standard OS handle.
 *      This is a helper function to break up the construction of 
 *      channels into File, Console, or Serial.
 *
 * Results:
 *	Returns the new channel, or NULL.
 *
 * Side effects:
 *	May open the channel and may cause creation of a file on the
 *	file system.
 *
 *----------------------------------------------------------------------
 */

void
TclWinFlushDirtyChannels ()
{
    FileInfo *infoPtr;
    ThreadSpecificData *tsdPtr;

    tsdPtr = FileInit();

    /*
     * Flush all channels which are dirty, i.e. may have data pending
     * in the OS
     */
    
    for (infoPtr = tsdPtr->firstFilePtr;
	 infoPtr != NULL; 
	 infoPtr = infoPtr->nextPtr) {
	if (infoPtr->dirty) {
	    FlushFileBuffers(infoPtr->handle);
	    infoPtr->dirty = 0;
	}
    }
}
Changes to win/tclWinConsole.c.
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16
17
18
19











-
+







/* 
 * tclWinConsole.c --
 *
 *	This file implements the Windows-specific console functions,
 *	and the "console" channel driver.
 *
 * Copyright (c) 1999 by Scriptics Corp.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinConsole.c,v 1.3 1999/07/27 01:42:25 redman Exp $
 * RCS: @(#) $Id: tclWinConsole.c,v 1.3.10.2 2001/04/03 22:54:39 hobbs Exp $
 */

#include "tclWinInt.h"

#include <dos.h>
#include <fcntl.h>
#include <io.h>
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
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







-
-
-
-
-
-
-
-


















-









-
+








+
+
+
+







				 * pointer. */
} ConsoleEvent;

/*
 * Declarations for functions used only in this file.
 */

static int		ApplicationType(Tcl_Interp *interp,
			    const char *fileName, char *fullName);
static void		BuildCommandLine(const char *executable, int argc, 
			    char **argv, Tcl_DString *linePtr);
static void		CopyChannel(HANDLE dst, HANDLE src);
static BOOL		HasConsole(void);
static TclFile		MakeFile(HANDLE handle);
static char *		MakeTempFile(Tcl_DString *namePtr);
static int		ConsoleBlockModeProc(ClientData instanceData, int mode);
static void		ConsoleCheckProc(ClientData clientData, int flags);
static int		ConsoleCloseProc(ClientData instanceData,
			    Tcl_Interp *interp);
static int		ConsoleEventProc(Tcl_Event *evPtr, int flags);
static void		ConsoleExitHandler(ClientData clientData);
static int		ConsoleGetHandleProc(ClientData instanceData,
			    int direction, ClientData *handlePtr);
static ThreadSpecificData *ConsoleInit(void);
static int		ConsoleInputProc(ClientData instanceData, char *buf,
			    int toRead, int *errorCode);
static int		ConsoleOutputProc(ClientData instanceData, char *buf,
			    int toWrite, int *errorCode);
static DWORD WINAPI	ConsoleReaderThread(LPVOID arg);
static void		ConsoleSetupProc(ClientData clientData, int flags);
static void		ConsoleWatchProc(ClientData instanceData, int mask);
static DWORD WINAPI	ConsoleWriterThread(LPVOID arg);
static void		ProcExitHandler(ClientData clientData);
static int		TempFileName(WCHAR name[MAX_PATH]);
static int		WaitForRead(ConsoleInfo *infoPtr, int blocking);

/*
 * This structure describes the channel type structure for command console
 * based IO.
 */

static Tcl_ChannelType consoleChannelType = {
    "console",			/* Type name. */
    ConsoleBlockModeProc,	/* Set blocking or non-blocking mode.*/
    TCL_CHANNEL_VERSION_2,	/* v2 channel */
    ConsoleCloseProc,		/* Close proc. */
    ConsoleInputProc,		/* Input proc. */
    ConsoleOutputProc,		/* Output proc. */
    NULL,			/* Seek proc. */
    NULL,			/* Set option proc. */
    NULL,			/* Get option proc. */
    ConsoleWatchProc,		/* Set up notifier to watch the channel. */
    ConsoleGetHandleProc,	/* Get an OS handle from channel. */
    NULL,			/* close2proc. */
    ConsoleBlockModeProc,	/* Set blocking or non-blocking mode.*/
    NULL,			/* flush proc. */
    NULL,			/* handler proc. */
};

/*
 *----------------------------------------------------------------------
 *
 * ConsoleInit --
 *
628
629
630
631
632
633
634
635

636
637
638
639

640
641
642
643
644
645
646
623
624
625
626
627
628
629

630
631
632
633

634
635
636
637
638
639
640
641







-
+



-
+








    if (infoPtr->readFlags & CONSOLE_BUFFERED) {
	/*
	 * Data is stored in the buffer.
	 */

	if (bufSize < (infoPtr->bytesRead - infoPtr->offset)) {
	    memcpy(buf, &infoPtr->buffer[infoPtr->offset], bufSize);
	    memcpy(buf, &infoPtr->buffer[infoPtr->offset], (size_t) bufSize);
	    bytesRead = bufSize;
	    infoPtr->offset += bufSize;
	} else {
	    memcpy(buf, &infoPtr->buffer[infoPtr->offset], bufSize);
	    memcpy(buf, &infoPtr->buffer[infoPtr->offset], (size_t) bufSize);
	    bytesRead = infoPtr->bytesRead - infoPtr->offset;

	    /*
	     * Reset the buffer
	     */
	    
	    infoPtr->readFlags &= ~CONSOLE_BUFFERED;
726
727
728
729
730
731
732
733

734
735

736
737
738
739
740
741
742
721
722
723
724
725
726
727

728
729

730
731
732
733
734
735
736
737







-
+

-
+







	     * Reallocate the buffer to be large enough to hold the data.
	     */

	    if (infoPtr->writeBuf) {
		ckfree(infoPtr->writeBuf);
	    }
	    infoPtr->writeBufLen = toWrite;
	    infoPtr->writeBuf = ckalloc(toWrite);
	    infoPtr->writeBuf = ckalloc((unsigned int) toWrite);
	}
	memcpy(infoPtr->writeBuf, buf, toWrite);
	memcpy(infoPtr->writeBuf, buf, (size_t) toWrite);
	infoPtr->toWrite = toWrite;
	ResetEvent(infoPtr->writable);
	SetEvent(infoPtr->startWriter);
	bytesWritten = toWrite;
    } else {
	/*
	 * In the blocking case, just try to write the buffer directly.
1078
1079
1080
1081
1082
1083
1084
1085

1086
1087
1088
1089
1090
1091
1092
1073
1074
1075
1076
1077
1078
1079

1080
1081
1082
1083
1084
1085
1086
1087







-
+







	count = 0;

	/* 
	 * Look for data on the console, but first ignore any events
	 * that are not KEY_EVENTs 
	 */
	if (ReadConsole(handle, infoPtr->buffer, CONSOLE_BUFFER_SIZE,
		&infoPtr->bytesRead, NULL) != FALSE) {
		(LPDWORD) &infoPtr->bytesRead, NULL) != FALSE) {
	    /*
	     * Data was stored in the buffer.
	     */
	    
	    infoPtr->readFlags |= CONSOLE_BUFFERED;
	} else {
	    DWORD err;
Changes to win/tclWinDde.c.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







/* 
 * tclWinDde.c --
 *
 *	This file provides procedures that implement the "send"
 *	command, allowing commands to be passed from interpreter
 *	to interpreter.
 *
 * Copyright (c) 1997 by Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinDde.c,v 1.5 1999/06/26 22:41:53 redman Exp $
 * RCS: @(#) $Id: tclWinDde.c,v 1.5.10.1 2001/04/03 22:54:39 hobbs Exp $
 */

#include "tclPort.h"
#include <ddeml.h>

/*
 * TCL_STORAGE_CLASS is set unconditionally to DLLEXPORT because the
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
729
730
731
732
733
734
735

736
737
738
739
740
741
742







-







MakeDdeConnection(
    Tcl_Interp *interp,		/* Used to report errors. */
    char *name,			/* The connection to use. */
    HCONV *ddeConvPtr)
{
    HSZ ddeTopic, ddeService;
    HCONV ddeConv;
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
    
    ddeService = DdeCreateStringHandle(ddeInstance, "TclEval", 0);
    ddeTopic = DdeCreateStringHandle(ddeInstance, name, 0);

    ddeConv = DdeConnect(ddeInstance, ddeService, ddeTopic, NULL);
    DdeFreeStringHandle(ddeInstance, ddeService);
    DdeFreeStringHandle(ddeInstance, ddeTopic);
Changes to win/tclWinError.c.
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16
17
18
19











-
+







/* 
 * tclWinError.c --
 *
 *	This file contains code for converting from Win32 errors to
 *	errno errors.
 *
 * Copyright (c) 1995-1996 by Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinError.c,v 1.3 1999/04/16 00:48:08 stanton Exp $
 * RCS: @(#) $Id: tclWinError.c,v 1.3.12.1 2001/04/03 22:54:39 hobbs Exp $
 */

#include "tclWinInt.h"

/*
 * The following table contains the mapping from Win32 errors to
 * errno errors.
143
144
145
146
147
148
149
150

151
152
153
154
155
156
157
143
144
145
146
147
148
149

150
151
152
153
154
155
156
157







-
+







    EINVAL,	/* 120 */
    EINVAL,	/* 121 */
    EINVAL,	/* 122 */
    ENOENT,	/* ERROR_INVALID_NAME		123 */
    EINVAL,	/* 124 */
    EINVAL,	/* 125 */
    EINVAL,	/* 126 */
    ESRCH,	/* ERROR_PROC_NOT_FOUND		127 */
    EINVAL,	/* ERROR_PROC_NOT_FOUND		127 */
    ECHILD,	/* ERROR_WAIT_NO_CHILDREN	128 */
    ECHILD,	/* ERROR_CHILD_NOT_COMPLETE	129 */
    EBADF,	/* ERROR_DIRECT_ACCESS_HANDLE	130 */
    EINVAL,	/* 131 */
    ESPIPE,	/* ERROR_SEEK_ON_DEVICE		132 */
    EINVAL,	/* 133 */
    EINVAL,	/* 134 */
Changes to win/tclWinFCmd.c.
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16
17
18
19











-
+







/*
 * tclWinFCmd.c
 *
 *      This file implements the Windows specific portion of file manipulation 
 *      subcommands of the "file" command. 
 *
 * Copyright (c) 1996-1998 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinFCmd.c,v 1.7 1999/12/09 14:44:11 hobbs Exp $
 * RCS: @(#) $Id: tclWinFCmd.c,v 1.7.2.1 2000/08/07 21:33:02 hobbs Exp $
 */

#include "tclWinInt.h"

/*
 * The following constants specify the type of callback when
 * TraverseWinTree() calls the traverseProc()
233
234
235
236
237
238
239
240

241
242
243
244
245
246
247
233
234
235
236
237
238
239

240
241
242
243
244
245
246
247







-
+







		return TCL_ERROR;
	    }
	    (*tclWinProcs->charLowerProc)((TCHAR *) nativeSrcPath);
	    (*tclWinProcs->charLowerProc)((TCHAR *) nativeDstPath);

	    src = Tcl_WinTCharToUtf((TCHAR *) nativeSrcPath, -1, &srcString);
	    dst = Tcl_WinTCharToUtf((TCHAR *) nativeDstPath, -1, &dstString);
	    if (strncmp(src, dst, Tcl_DStringLength(&srcString)) == 0) {
	    if (strncmp(src, dst, (size_t) Tcl_DStringLength(&srcString)) == 0) {
		/*
		 * Trying to move a directory into itself.
		 */

		errno = EINVAL;
		Tcl_DStringFree(&srcString);
		Tcl_DStringFree(&dstString);
654
655
656
657
658
659
660
661

662
663
664
665
666
667
668
654
655
656
657
658
659
660

661
662
663
664
665
666
667
668







-
+







    return result;
}

static int
DoCreateDirectory(
    Tcl_DString *pathPtr)	/* Pathname of directory to create (native). */
{
    int error;
    DWORD error;
    CONST TCHAR *nativePath;

    nativePath = (TCHAR *) Tcl_DStringValue(pathPtr);
    if ((*tclWinProcs->createDirectoryProc)(nativePath, NULL) == 0) {
	error = GetLastError();
	TclWinConvertError(error);
	return TCL_ERROR;
1280
1281
1282
1283
1284
1285
1286
1287

1288
1289
1290
1291
1292
1293
1294
1280
1281
1282
1283
1284
1285
1286

1287
1288
1289
1290
1291
1292
1293
1294







-
+







    Tcl_DStringFree(&ds);

    if (result == 0xffffffff) {
	StatError(interp, fileName);
	return TCL_ERROR;
    }

    *attributePtrPtr = Tcl_NewBooleanObj(result & attributeArray[objIndex]);
    *attributePtrPtr = Tcl_NewBooleanObj((int) (result & attributeArray[objIndex]));
    return TCL_OK;
}

/*
 *----------------------------------------------------------------------
 *
 * ConvertFileNameFormat --
1418
1419
1420
1421
1422
1423
1424
1425

1426
1427
1428
1429
1430
1431
1432
1418
1419
1420
1421
1422
1423
1424

1425
1426
1427
1428
1429
1430
1431
1432







-
+







	     * but does complain about the second.
	     *
	     *	fprintf(stderr, "%d\n", data.w.cAlternateFileName[0]);
	     *	fprintf(stderr, "%d\n", ((WCHAR *) nativeName)[0]);
	     */

	    Tcl_WinTCharToUtf(nativeName, -1, &ds);
	    newv[i] = ckalloc(Tcl_DStringLength(&ds) + 1);
	    newv[i] = ckalloc((unsigned int) (Tcl_DStringLength(&ds) + 1));
	    lstrcpyA(newv[i], Tcl_DStringValue(&ds));
	    Tcl_DStringFree(&ds);
	    FindClose(handle);
	}
    }

    Tcl_DStringInit(&resultDString);
Changes to win/tclWinFile.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







/* 
 * tclWinFile.c --
 *
 *      This file contains temporary wrappers around UNIX file handling
 *      functions. These wrappers map the UNIX functions to Win32 HANDLE-style
 *      files, which can be manipulated through the Win32 console redirection
 *      interfaces.
 *
 * Copyright (c) 1995-1998 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinFile.c,v 1.7 1999/12/12 22:46:51 hobbs Exp $
 * RCS: @(#) $Id: tclWinFile.c,v 1.7.2.2 2001/09/07 17:10:33 andreas_kupries Exp $
 */

#include "tclWinInt.h"
#include <sys/stat.h>
#include <shlobj.h>
#include <lmaccess.h>		/* For TclpGetUserHome(). */

322
323
324
325
326
327
328
329
330








331
332
333
334
335

336
337
338
339
340
341
342
322
323
324
325
326
327
328


329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349







-
-
+
+
+
+
+
+
+
+





+








	name = Tcl_WinTCharToUtf(nativeMatchResult, -1, &ds);
	Tcl_DStringAppend(dirPtr, name, -1);
	Tcl_DStringFree(&ds);

	fname = Tcl_DStringValue(dirPtr);
	nativeName = Tcl_WinUtfToTChar(fname, Tcl_DStringLength(dirPtr), &ds);
	attr = (*tclWinProcs->getFileAttributesProc)(nativeName);
	Tcl_DStringFree(&ds);

	/*
	 * 'attr' represents the attributes of the file, but we only
	 * want to retrieve this info if it is absolutely necessary
	 * because it is an expensive call.
	 */

	attr = 0;

	if (tail == NULL) {
	    int typeOk = 1;
	    if (types != NULL) {
		if (types->perm != 0) {
		    attr = (*tclWinProcs->getFileAttributesProc)(nativeName);
		    if (
			((types->perm & TCL_GLOB_PERM_RONLY) &&
				!(attr & FILE_ATTRIBUTE_READONLY)) ||
			((types->perm & TCL_GLOB_PERM_HIDDEN) &&
				!(attr & FILE_ATTRIBUTE_HIDDEN)) ||
			((types->perm & TCL_GLOB_PERM_R) &&
				(TclpAccess(fname, R_OK) != 0)) ||
385
386
387
388
389
390
391


392
393
394
395
396
397
398














399
400
401
402
403
404
405
392
393
394
395
396
397
398
399
400







401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421







+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+







		    }
		}		
	    } 
	    if (typeOk) {
		Tcl_ListObjAppendElement(interp, resultPtr, 
			Tcl_NewStringObj(fname, Tcl_DStringLength(dirPtr)));
	    }
	} else {
	    attr = (*tclWinProcs->getFileAttributesProc)(nativeName);
	} else if (attr & FILE_ATTRIBUTE_DIRECTORY) {
	    Tcl_DStringAppend(dirPtr, "/", 1);
	    result = TclDoGlob(interp, separators, dirPtr, tail, types);
	    if (result != TCL_OK) {
		break;
	    }
	}
	    if (attr & FILE_ATTRIBUTE_DIRECTORY) {
		Tcl_DStringAppend(dirPtr, "/", 1);
		result = TclDoGlob(interp, separators, dirPtr, tail, types);
		if (result != TCL_OK) {
		    break;
		}
	    }
	}
	/*
	 * Free ds here to ensure that nativeName is valid above.
	 */

	Tcl_DStringFree(&ds);

	Tcl_DStringSetLength(dirPtr, dirLength);
    }

    FindClose(handle);
    Tcl_DStringFree(&dirString);
    Tcl_DStringFree(&patternString);

793
794
795
796
797
798
799








800
801
802
803
804
805
806
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830







+
+
+
+
+
+
+
+







     */

    if (strpbrk(path, "?*") != NULL) {
	Tcl_SetErrno(ENOENT);
	return -1;
    }

    /*
     * Ensure correct file sizes by forcing the OS to write any
     * pending data to disk. This is done only for channels which are
     * dirty, i.e. have been written to since the last flush here.
     */

    TclWinFlushDirtyChannels ();

    nativePath = Tcl_WinUtfToTChar(path, -1, &ds);
    handle = (*tclWinProcs->findFirstFileProc)(nativePath, &data);
    if (handle == INVALID_HANDLE_VALUE) {
	/* 
	 * FindFirstFile() doesn't work on root directories, so call
	 * GetFileAttributes() to see if the specified file exists.
	 */
Changes to win/tclWinInit.c.
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
1
2
3
4
5
6
7
8
9

10
11
12
13

14
15
16









17
18
19
20
21
22
23









-
+



-



-
-
-
-
-
-
-
-
-







/* 
 * tclWinInit.c --
 *
 *	Contains the Windows-specific interpreter initialization functions.
 *
 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 * All rights reserved.
 *
 * RCS: @(#) $Id: tclWinInit.c,v 1.22 2000/03/31 08:52:31 hobbs Exp $
 * RCS: @(#) $Id: tclWinInit.c,v 1.22.2.6 2001/10/12 22:46:27 hobbs Exp $
 */

#include "tclWinInt.h"
#include <winreg.h>
#include <winnt.h>
#include <winbase.h>

/*
 * The following macro can be defined at compile time to specify
 * the root of the Tcl registry keys.
 */
 
#ifndef TCL_REGISTRY_KEY
#define TCL_REGISTRY_KEY "Software\\Scriptics\\Tcl\\" TCL_VERSION
#endif

/*
 * The following declaration is a workaround for some Microsoft brain damage.
 * The SYSTEM_INFO structure is different in various releases, even though the
 * layout is the same.  So we overlay our own structure on top of it so we
 * can access the interesting slots in a uniform way.
 */

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
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+















-
+

-
+


-
-
+
-
-
-
+
+
+











-







#endif
#ifndef PROCESSOR_ARCHITECTURE_ALPHA
#define PROCESSOR_ARCHITECTURE_ALPHA 2
#endif
#ifndef PROCESSOR_ARCHITECTURE_PPC
#define PROCESSOR_ARCHITECTURE_PPC   3
#endif
#ifndef PROCESSOR_ARCHITECTURE_SHX  
#define PROCESSOR_ARCHITECTURE_SHX   4
#endif
#ifndef PROCESSOR_ARCHITECTURE_ARM
#define PROCESSOR_ARCHITECTURE_ARM   5
#endif
#ifndef PROCESSOR_ARCHITECTURE_IA64
#define PROCESSOR_ARCHITECTURE_IA64  6
#endif
#ifndef PROCESSOR_ARCHITECTURE_ALPHA64
#define PROCESSOR_ARCHITECTURE_ALPHA64 7
#endif
#ifndef PROCESSOR_ARCHITECTURE_MSIL
#define PROCESSOR_ARCHITECTURE_MSIL  8
#endif
#ifndef PROCESSOR_ARCHITECTURE_UNKNOWN
#define PROCESSOR_ARCHITECTURE_UNKNOWN 0xFFFF
#endif

/*
 * The following arrays contain the human readable strings for the Windows
 * platform and processor values.
 */


#define NUMPLATFORMS 3
static char* platforms[NUMPLATFORMS] = {
    "Win32s", "Windows 95", "Windows NT"
};

#define NUMPROCESSORS 4
#define NUMPROCESSORS 9
static char* processors[NUMPROCESSORS] = {
    "intel", "mips", "alpha", "ppc"
    "intel", "mips", "alpha", "ppc", "shx", "arm", "ia64", "alpha64", "msil"
};

/*
 * Thread id used for asynchronous notification from signal handlers.
/* Used to store the encoding used for binary files */
 */

static DWORD mainThreadId;
static Tcl_Encoding binaryEncoding = NULL;
/* Has the basic library path encoding issue been fixed */
static int libraryPathEncodingFixed = 0;

/*
 * The Init script (common to Windows and Unix platforms) is
 * defined in tkInitScript.h
 */

#include "tclInitScript.h"

static void		AppendEnvironment(Tcl_Obj *listPtr, CONST char *lib);
static void		AppendDllPath(Tcl_Obj *listPtr, HMODULE hModule,
			    CONST char *lib);
static void		AppendRegistry(Tcl_Obj *listPtr, CONST char *lib);
static int		ToUtf(CONST WCHAR *wSrc, char *dst);

/*
 *---------------------------------------------------------------------------
 *
 * TclpInitPlatform --
 *
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
128
129
130
131
132
133
134










135
136
137
138
139
140
141







-
-
-
-
-
-
-
-
-
-







     *
     * Under 95 and NT 4.0, this is a NOOP because the system doesn't 
     * automatically put up dialogs when the above operations fail.
     */

    SetErrorMode(SetErrorMode(0) | SEM_FAILCRITICALERRORS);

    /*
     * Save the id of the first thread to intialize the Tcl library.  This
     * thread will be used to handle notifications from async event
     * procedures.  This is not strictly correct.  A better solution involves
     * using a designated "main" notifier that is kept up to date as threads
     * come and go.
     */

    mainThreadId = GetCurrentThreadId();

#ifdef STATIC_BUILD
    /*
     * If we are in a statically linked executable, then we need to
     * explicitly initialize the Windows function tables here since
     * DllMain() will not be invoked.
     */

242
243
244
245
246
247
248





249
250
251


252
253

254
255
256
257
258


259
260
261
262
263
264
265
266

267
268
269
270
271
272










273
274

275
276
277
278
279


280
281

282
283
284
285
286


287
288

289
290
291
292
293
294
295
235
236
237
238
239
240
241
242
243
244
245
246
247
248

249
250
251
252
253
254
255
256
257

258
259
260
261






262

263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284

285
286
287
288
289
290
291
292
293

294
295
296
297
298
299
300
301
302
303
304
305







+
+
+
+
+


-
+
+


+




-
+
+


-
-
-
-
-
-
+
-





+
+
+
+
+
+
+
+
+
+


+




-
+
+


+




-
+
+


+







     *		(e.g. /usr/src/tcl8.2/unix/solaris-sparc/../../library)
     *	<bindir>/../../<developLib>
     *		(e.g. /usr/src/tcl8.2/unix/../../tcl8.2/library)
     *	<bindir>/../../../<devlopLib>
     *		(e.g. /usr/src/tcl8.2/unix/solaris-sparc/../../../tcl8.2/library)
     */
     
    /*
     * The variable path holds an absolute path.  Take care not to
     * overwrite pathv[0] since that might produce a relative path.
     */

    if (path != NULL) {
	Tcl_SplitPath(path, &pathc, &pathv);
	if (pathc > 1) {
	if (pathc > 2) {
	    str = pathv[pathc - 2];
	    pathv[pathc - 2] = installLib;
	    path = Tcl_JoinPath(pathc - 1, pathv, &ds);
	    pathv[pathc - 2] = str;
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	if (pathc > 2) {
	if (pathc > 3) {
	    str = pathv[pathc - 3];
	    pathv[pathc - 3] = installLib;
	    path = Tcl_JoinPath(pathc - 2, pathv, &ds);
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	if (pathc > 1) {
	    pathv[pathc - 2] = "library";
	    pathv[pathc - 3] = str;
	    path = Tcl_JoinPath(pathc - 1, pathv, &ds);
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	if (pathc > 2) {
	    str = pathv[pathc - 2];
	    pathv[pathc - 2] = "library";
	    path = Tcl_JoinPath(pathc - 1, pathv, &ds);
	    pathv[pathc - 2] = str;
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	if (pathc > 3) {
	    str = pathv[pathc - 3];
	    pathv[pathc - 3] = "library";
	    path = Tcl_JoinPath(pathc - 2, pathv, &ds);
	    pathv[pathc - 3] = str;
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	if (pathc > 1) {
	if (pathc > 3) {
	    str = pathv[pathc - 3];
	    pathv[pathc - 3] = developLib;
	    path = Tcl_JoinPath(pathc - 2, pathv, &ds);
	    pathv[pathc - 3] = str;
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	if (pathc > 3) {
	if (pathc > 4) {
	    str = pathv[pathc - 4];
	    pathv[pathc - 4] = developLib;
	    path = Tcl_JoinPath(pathc - 3, pathv, &ds);
	    pathv[pathc - 4] = str;
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	ckfree((char *) pathv);
    }

446
447
448
449
450
451
452
453

454
455
456
457
458
459
460
461
462
463
464
465




466
467
468
469
470
471



472
473
474
475
476
477
478
479
480
481
482
483


484

485
486
487
488
489




490
491
492
493
494
495
496
497
498
499
500
501
502












503
504
505
506
507
508
509
510
511
512
513
514
515
516





















517
518
519



520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535

536
537
538
539
540
541
542
543
456
457
458
459
460
461
462

463
464
465
466
467
468
469
470
471
472
473
474

475
476
477
478
479
480
481
482
483

484
485
486
487
488
489
490
491
492
493
494
495


496
497
498

499





500
501
502
503
504












505
506
507
508
509
510
511
512
513
514
515
516
517













518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538



539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556

557

558
559
560
561
562
563
564







-
+











-
+
+
+
+





-
+
+
+









-
-

+
+
-
+
-
-
-
-
-
+
+
+
+

-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+

-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+















-
+
-








    start = dst;
    while (*wSrc != '\0') {
	dst += Tcl_UniCharToUtf(*wSrc, dst);
	wSrc++;
    }
    *dst = '\0';
    return dst - start;
    return (int) (dst - start);
}


/*
 *---------------------------------------------------------------------------
 *
 * TclpSetInitialEncodings --
 *
 *	Based on the locale, determine the encoding of the operating
 *	system and the default encoding for newly opened files.
 *
 *	Called at process initialization time.
 *	Called at process initialization time, and part way through
 *	startup, we verify that the initial encodings were correctly
 *	setup.  Depending on Tcl's environment, there may not have been
 *	enough information first time through (above).
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	The Tcl library path is converted from native encoding to UTF-8.
 *	The Tcl library path is converted from native encoding to UTF-8,
 *	on the first call, and the encodings may be changed on first or
 *	second call.
 *
 *---------------------------------------------------------------------------
 */

void
TclpSetInitialEncodings()
{
    CONST char *encoding;
    char buf[4 + TCL_INTEGER_SPACE];
    int platformId;
    Tcl_Obj *pathPtr;

    if (libraryPathEncodingFixed == 0) {
	int platformId;
    platformId = TclWinGetPlatformId();
	platformId = TclWinGetPlatformId();

    TclWinSetInterfaces(platformId == VER_PLATFORM_WIN32_NT);

    wsprintfA(buf, "cp%d", GetACP());
    Tcl_SetSystemEncoding(NULL, buf);
	TclWinSetInterfaces(platformId == VER_PLATFORM_WIN32_NT);
	
	wsprintfA(buf, "cp%d", GetACP());
	Tcl_SetSystemEncoding(NULL, buf);

    if (platformId != VER_PLATFORM_WIN32_NT) {
	pathPtr = TclGetLibraryPath();
	if (pathPtr != NULL) {
	    int i, objc;
	    Tcl_Obj **objv;
	    
	    objc = 0;
	    Tcl_ListObjGetElements(NULL, pathPtr, &objc, &objv);
	    for (i = 0; i < objc; i++) {
		int length;
		char *string;
		Tcl_DString ds;
	if (platformId != VER_PLATFORM_WIN32_NT) {
	    Tcl_Obj *pathPtr = TclGetLibraryPath();
	    if (pathPtr != NULL) {
		int i, objc;
		Tcl_Obj **objv;
		
		objc = 0;
		Tcl_ListObjGetElements(NULL, pathPtr, &objc, &objv);
		for (i = 0; i < objc; i++) {
		    int length;
		    char *string;
		    Tcl_DString ds;

		string = Tcl_GetStringFromObj(objv[i], &length);
		Tcl_ExternalToUtfDString(NULL, string, length, &ds);
		Tcl_SetStringObj(objv[i], Tcl_DStringValue(&ds), 
			Tcl_DStringLength(&ds));
		Tcl_DStringFree(&ds);
	    }
	}
    }

    /*
     * Keep this encoding preloaded.  The IO package uses it for gets on a
     * binary channel.  
     */
		    string = Tcl_GetStringFromObj(objv[i], &length);
		    Tcl_ExternalToUtfDString(NULL, string, length, &ds);
		    Tcl_SetStringObj(objv[i], Tcl_DStringValue(&ds), 
			    Tcl_DStringLength(&ds));
		    Tcl_DStringFree(&ds);
		}
	    }
	}
	
	libraryPathEncodingFixed = 1;
    } else {
	wsprintfA(buf, "cp%d", GetACP());
	Tcl_SetSystemEncoding(NULL, buf);
    }

    /* This is only ever called from the startup thread */
    if (binaryEncoding == NULL) {
	/*
	 * Keep this encoding preloaded.  The IO package uses it for
	 * gets on a binary channel.
	 */

    encoding = "iso8859-1";
    Tcl_GetEncoding(NULL, encoding);
	encoding = "iso8859-1";
	binaryEncoding = Tcl_GetEncoding(NULL, encoding);
    }
}

/*
 *---------------------------------------------------------------------------
 *
 * TclpSetVariables --
 *
 *	Performs platform-specific interpreter initialization related to
 *	the tcl_platform and env variables, and other platform-specific
 *	things.
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	Sets "tclDefaultLibrary", "tcl_platform", and "env(HOME)" Tcl
 *	Sets "tcl_platform", and "env(HOME)" Tcl variables.
 *	variables.
 *
 *----------------------------------------------------------------------
 */

void
TclpSetVariables(interp)
    Tcl_Interp *interp;		/* Interp to initialize. */	
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
572
573
574
575
576
577
578






579
580
581
582
583
584
585







-
-
-
-
-
-








    osInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA);
    GetVersionExA(&osInfo);

    oemId = (OemId *) &sysInfo;
    GetSystemInfo(&sysInfo);

    /*
     * Initialize the tclDefaultLibrary variable from the registry.
     */

    Tcl_SetVar(interp, "tclDefaultLibrary", "", TCL_GLOBAL_ONLY);

    /*
     * Define the tcl_platform array.
     */

    Tcl_SetVar2(interp, "tcl_platform", "platform", "windows",
	    TCL_GLOBAL_ONLY);
    if (osInfo.dwPlatformId < NUMPLATFORMS) {
618
619
620
621
622
623
624
625

626
627
628
629
630
631
632
633
634
635
636
637
638
639

640
641
642
643
644
645
646
647







-
+







    /*
     * Initialize the user name from the environment first, since this is much
     * faster than asking the system.
     */

    Tcl_DStringSetLength(&ds, 100);
    if (TclGetEnv("USERNAME", &ds) == NULL) {
	if (GetUserName(Tcl_DStringValue(&ds), &Tcl_DStringLength(&ds)) == 0) {
	if (GetUserName(Tcl_DStringValue(&ds), (LPDWORD) &Tcl_DStringLength(&ds)) == 0) {
	    Tcl_DStringSetLength(&ds, 0);
	}
    }
    Tcl_SetVar2(interp, "tcl_platform", "user", Tcl_DStringValue(&ds),
	    TCL_GLOBAL_ONLY);
    Tcl_DStringFree(&ds);
}
685
686
687
688
689
690
691
692

693
694
695
696
697
698
699
700
701
702
703
704
705
706

707
708
709
710
711
712
713
714







-
+







	 */
	
	envUpper = Tcl_ExternalToUtfDString(NULL, env, -1, &envString);
	p1 = strchr(envUpper, '=');
	if (p1 == NULL) {
	    continue;
	}
	length = p1 - envUpper;
	length = (int) (p1 - envUpper);
	Tcl_DStringSetLength(&envString, length+1);
	Tcl_UtfToUpper(envUpper);

	p1 = envUpper;
	p2 = nameUpper;
	for (; *p2 == *p1; p1++, p2++) {
	    /* NULL loop body. */
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
826
827
828
829
830
831
832



































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
		    }
		}
	    }
	}
        Tcl_DStringFree(&temp);
    }
}

/*
 *----------------------------------------------------------------------
 *
 * TclpAsyncMark --
 *
 *	Wake up the main thread from a signal handler.
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	Sends a message to the main thread.
 *
 *----------------------------------------------------------------------
 */

void
TclpAsyncMark(async)
    Tcl_AsyncHandler async;		/* Token for handler. */
{
    /*
     * Need a way to kick the Windows event loop and tell it to go look at
     * asynchronous events.
     */

    PostThreadMessage(mainThreadId, WM_USER, 0, 0);
}
Changes to win/tclWinInt.h.
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10

11
12
13
14
15
16
17
18










-
+







/*
 * tclWinInt.h --
 *
 *	Declarations of Windows-specific shared variables and procedures.
 *
 * Copyright (c) 1994-1996 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinInt.h,v 1.8 1999/08/03 18:07:15 redman Exp $
 * RCS: @(#) $Id: tclWinInt.h,v 1.8.10.3 2001/09/10 17:15:13 andreas_kupries Exp $
 */

#ifndef _TCLWININT
#define _TCLWININT

#ifndef _TCLINT
#include "tclInt.h"
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
88
89
90
91
92
93
94

95
96
97
98
99
100
101







-







    DWORD (WINAPI *searchPathProc)(CONST TCHAR *, CONST TCHAR *, 
	    CONST TCHAR *, DWORD, WCHAR *, TCHAR **);
    BOOL (WINAPI *setCurrentDirectoryProc)(CONST TCHAR *);
    BOOL (WINAPI *setFileAttributesProc)(CONST TCHAR *, DWORD);
} TclWinProcs;

EXTERN TclWinProcs *tclWinProcs;
EXTERN Tcl_Encoding tclWinTCharEncoding;

/*
 * Declarations of functions that are not accessible by way of the
 * stubs table.
 */

EXTERN void		TclWinInit(HINSTANCE hInst);
Changes to win/tclWinLoad.c.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







/* 
 * tclWinLoad.c --
 *
 *	This procedure provides a version of the TclLoadFile that
 *	works with the Windows "LoadLibrary" and "GetProcAddress"
 *	API for dynamic loading.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinLoad.c,v 1.5 2000/02/10 09:53:57 hobbs Exp $
 * RCS: @(#) $Id: tclWinLoad.c,v 1.5.2.1 2001/04/03 22:54:39 hobbs Exp $
 */

#include "tclWinInt.h"


/*
 *----------------------------------------------------------------------
83
84
85
86
87
88
89
90
91






92
93
94
95
96
97
98
83
84
85
86
87
88
89


90
91
92
93
94
95
96
97
98
99
100
101
102







-
-
+
+
+
+
+
+







	 * just about any problem, but it's better than nothing.  It'd be
	 * even better if there was a way to get what DLLs
	 */
	switch (lastError) {
	    case ERROR_MOD_NOT_FOUND:
	    case ERROR_DLL_NOT_FOUND:
		Tcl_AppendResult(interp, "this library or a dependent library",
			" could not be found in library path", (char *)
			NULL);
			" could not be found in library path",
			(char *) NULL);
		break;
	    case ERROR_PROC_NOT_FOUND:
		Tcl_AppendResult(interp, "could not find specified procedure",
			(char *) NULL);
		break;
	    case ERROR_INVALID_DLL:
		Tcl_AppendResult(interp, "this library or a dependent library",
			" is damaged", (char *) NULL);
		break;
	    case ERROR_DLL_INIT_FAILED:
		Tcl_AppendResult(interp, "the library initialization",
Changes to win/tclWinNotify.c.
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
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16







17
18
19
20
21
22
23












-
+



-
-
-
-
-
-
-







/* 
 * tclWinNotify.c --
 *
 *	This file contains Windows-specific procedures for the notifier,
 *	which is the lowest-level part of the Tcl event loop.  This file
 *	works together with ../generic/tclNotify.c.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinNotify.c,v 1.5 1999/07/02 22:08:28 redman Exp $
 * RCS: @(#) $Id: tclWinNotify.c,v 1.5.10.3 2002/02/25 23:36:49 hobbs Exp $
 */

#include "tclWinInt.h"
#include <winsock.h>

/*
 * The follwing static indicates whether this module has been initialized.
 */

static int initialized = 0;

#define INTERVAL_TIMER 1	/* Handle of interval timer. */

#define WM_WAKEUP WM_USER	/* Message that is send by
				 * Tcl_AlertNotifier. */
/*
 * The following static structure contains the state information for the
145
146
147
148
149
150
151














152
153
154
155
156
157
158
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+







 */

void
Tcl_FinalizeNotifier(clientData)
    ClientData clientData;	/* Pointer to notifier data. */
{
    ThreadSpecificData *tsdPtr = (ThreadSpecificData *) clientData;

    /*
     * Only finalize the notifier if a notifier was installed in the
     * current thread; there is a route in which this is not
     * guaranteed to be true (when tclWin32Dll.c:DllMain() is called
     * with the flag DLL_PROCESS_DETACH by the OS, which could be
     * doing so from a thread that's never previously been involved
     * with Tcl, e.g. the task manager) so this check is important.
     *
     * Fixes Bug #217982 reported by Hugh Vu and Gene Leache.
     */
    if (tsdPtr == NULL) {
	return;
    }

    DeleteCriticalSection(&tsdPtr->crit);
    CloseHandle(tsdPtr->event);

    /*
     * Clean up the timer and messaging window for this thread.
     */
464
465
466
467
468
469
470
471

472
473
474
475
476
477
478
471
472
473
474
475
476
477

478
479
480
481
482
483
484
485







-
+







	result = GetMessage(&msg, NULL, 0, 0);
	if (result == 0) {
	    /*
	     * We received a request to exit this thread (WM_QUIT), so
	     * propagate the quit message and start unwinding.
	     */

	    PostQuitMessage(msg.wParam);
	    PostQuitMessage((int) msg.wParam);
	    status = -1;
	} else if (result == -1) {
	    /*
	     * We got an error from the system.  I have no idea why this would
	     * happen, so we'll just unwind.
	     */

Changes to win/tclWinPipe.c.
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16
17
18
19











-
+







/* 
 * tclWinPipe.c --
 *
 *	This file implements the Windows-specific exec pipeline functions,
 *	the "pipe" channel driver, and the "pid" Tcl command.
 *
 * Copyright (c) 1996-1997 by Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinPipe.c,v 1.11 2000/04/11 21:42:12 ericm Exp $
 * RCS: @(#) $Id: tclWinPipe.c,v 1.11.2.4 2001/08/23 21:19:34 andreas_kupries Exp $
 */

#include "tclWinInt.h"

#include <dos.h>
#include <fcntl.h>
#include <io.h>
120
121
122
123
124
125
126


127
128
129
130
131
132
133
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135







+
+







				 * input. */
    HANDLE startWriter;		/* Auto-reset event used by the main thread to
				 * signal when the writer thread should attempt
				 * to write to the pipe. */
    HANDLE startReader;		/* Auto-reset event used by the main thread to
				 * signal when the reader thread should attempt
				 * to read from the pipe. */
    HANDLE stopReader;		/* Manual-reset event used to alert the reader
				 * thread to fall-out and exit */
    DWORD writeError;		/* An error caused by the last background
				 * write.  Set to 0 if no error has been
				 * detected.  This word is shared with the
				 * writer thread so access must be
				 * synchronized with the writable object.
				 */
    char *writeBuf;		/* Current background output buffer.
205
206
207
208
209
210
211
212

213
214
215
216
217
218
219
220
221




222
223
224
225
226
227
228
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







-
+








-
+
+
+
+







/*
 * This structure describes the channel type structure for command pipe
 * based IO.
 */

static Tcl_ChannelType pipeChannelType = {
    "pipe",			/* Type name. */
    PipeBlockModeProc,		/* Set blocking or non-blocking mode.*/
    TCL_CHANNEL_VERSION_2,	/* v2 channel */
    TCL_CLOSE2PROC,		/* Close proc. */
    PipeInputProc,		/* Input proc. */
    PipeOutputProc,		/* Output proc. */
    NULL,			/* Seek proc. */
    NULL,			/* Set option proc. */
    NULL,			/* Get option proc. */
    PipeWatchProc,		/* Set up notifier to watch the channel. */
    PipeGetHandleProc,		/* Get an OS handle from channel. */
    PipeClose2Proc
    PipeClose2Proc,		/* close2proc */
    PipeBlockModeProc,		/* Set blocking or non-blocking mode.*/
    NULL,			/* flush proc. */
    NULL,			/* handler proc. */
};

/*
 *----------------------------------------------------------------------
 *
 * PipeInit --
 *
826
827
828
829
830
831
832

833

834
835
836
837
838
839
840
831
832
833
834
835
836
837
838

839
840
841
842
843
844
845
846







+
-
+







	     * stdio of another.
	     */

	    if (!TclInExit() 
		    || ((GetStdHandle(STD_INPUT_HANDLE) != filePtr->handle)
			    && (GetStdHandle(STD_OUTPUT_HANDLE) != filePtr->handle)
			    && (GetStdHandle(STD_ERROR_HANDLE) != filePtr->handle))) {
		if (filePtr->handle != NULL &&
		if (CloseHandle(filePtr->handle) == FALSE) {
			CloseHandle(filePtr->handle) == FALSE) {
		    TclWinConvertError(GetLastError());
		    ckfree((char *) filePtr);
		    return -1;
		}
	    }
	    break;

1190
1191
1192
1193
1194
1195
1196
1197

1198
1199
1200
1201
1202
1203
1204
1196
1197
1198
1199
1200
1201
1202

1203
1204
1205
1206
1207
1208
1209
1210







-
+







     * using ab~1.def instead of "a b.default").  
     */

    BuildCommandLine(execPath, argc, argv, &cmdLine);

    if ((*tclWinProcs->createProcessProc)(NULL, 
	    (TCHAR *) Tcl_DStringValue(&cmdLine), NULL, NULL, TRUE, 
	    createFlags, NULL, NULL, &startInfo, &procInfo) == 0) {
	    (DWORD) createFlags, NULL, NULL, &startInfo, &procInfo) == 0) {
	TclWinConvertError(GetLastError());
	Tcl_AppendResult(interp, "couldn't execute \"", argv[0],
		"\": ", Tcl_PosixError(interp), (char *) NULL);
	goto end;
    }

    /*
1512
1513
1514
1515
1516
1517
1518
1519

1520
1521
1522

1523
1524
1525
1526
1527
1528
1529
1518
1519
1520
1521
1522
1523
1524

1525
1526
1527

1528
1529
1530
1531
1532
1533
1534
1535







-
+


-
+







	    arg = executable;
	} else {
	    arg = argv[i];
	    Tcl_DStringAppend(&ds, " ", 1);
	}

	quote = 0;
	if (argv[i][0] == '\0') {
	if (arg[0] == '\0') {
	    quote = 1;
	} else {
	    for (start = argv[i]; *start != '\0'; start++) {
	    for (start = arg; *start != '\0'; start++) {
		if (isspace(*start)) { /* INTL: ISO space. */
		    quote = 1;
		    break;
		}
	    }
	}
	if (quote) {
1565
1566
1567
1568
1569
1570
1571

1572
1573
1574
1575
1576
1577
1578
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585







+







	    special++;
	}
	Tcl_DStringAppend(&ds, start, special - start);
	if (quote) {
	    Tcl_DStringAppend(&ds, "\"", 1);
	}
    }
    Tcl_DStringFree(linePtr);
    Tcl_WinUtfToTChar(Tcl_DStringValue(&ds), Tcl_DStringLength(&ds), linePtr);
    Tcl_DStringFree(&ds);
}

/*
 *----------------------------------------------------------------------
 *
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
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







+
-
+








-
+




-
+







    if (readFile != NULL) {
	/*
	 * Start the background reader thread.
	 */

	infoPtr->readable = CreateEvent(NULL, TRUE, TRUE, NULL);
	infoPtr->startReader = CreateEvent(NULL, FALSE, FALSE, NULL);
	infoPtr->stopReader = CreateEvent(NULL, TRUE, FALSE, NULL);
	infoPtr->readThread = CreateThread(NULL, 8000, PipeReaderThread,
	infoPtr->readThread = CreateThread(NULL, 512, PipeReaderThread,
		infoPtr, 0, &id);
	SetThreadPriority(infoPtr->readThread, THREAD_PRIORITY_HIGHEST); 
        infoPtr->validMask |= TCL_READABLE;
    } else {
	infoPtr->readThread = 0;
    }
    if (writeFile != NULL) {
	/*
	 * Start the background writeer thwrite.
	 * Start the background writer thread.
	 */

	infoPtr->writable = CreateEvent(NULL, TRUE, TRUE, NULL);
	infoPtr->startWriter = CreateEvent(NULL, FALSE, FALSE, NULL);
	infoPtr->writeThread = CreateThread(NULL, 8000, PipeWriterThread,
	infoPtr->writeThread = CreateThread(NULL, 512, PipeWriterThread,
		infoPtr, 0, &id);
	SetThreadPriority(infoPtr->readThread, THREAD_PRIORITY_HIGHEST); 
        infoPtr->validMask |= TCL_WRITABLE;
    }

    /*
     * For backward compatibility with previous versions of Tcl, we
1800
1801
1802
1803
1804
1805
1806

1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826


















1827
1828
1829


1830

1831
1832






1833
1834







1835






1836
1837
1838






1839
1840
1841

1842
1843
1844
1845
1846
1847
1848
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827








1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846


1847
1848
1849
1850


1851
1852
1853
1854
1855
1856


1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870



1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887







+












-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

-
-
+
+

+
-
-
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+

+
+
+
+
+
+
-
-
-
+
+
+
+
+
+



+







    int flags)			/* Flags that indicate which side to close. */
{
    PipeInfo *pipePtr = (PipeInfo *) instanceData;
    Tcl_Channel errChan;
    int errorCode, result;
    PipeInfo *infoPtr, **nextPtrPtr;
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
    DWORD exitCode;

    errorCode = 0;
    if ((!flags || (flags == TCL_CLOSE_READ))
	    && (pipePtr->readFile != NULL)) {
	/*
	 * Clean up the background thread if necessary.  Note that this
	 * must be done before we can close the file, since the 
	 * thread may be blocking trying to read from the pipe.
	 */

	if (pipePtr->readThread) {
	    /*
	     * Forcibly terminate the background thread.  We cannot rely on the
	     * thread to cleanly terminate itself because we have no way of
	     * closing the pipe handle without blocking in the case where the
	     * thread is in the middle of an I/O operation.  Note that we need
	     * to guard against terminating the thread while it is in the
	     * middle of Tcl_ThreadAlert because it won't be able to release
	     * the notifier lock.
	     */
	     * The thread may already have closed on it's own.  Check it's
	     * exit code.
	     */

	    GetExitCodeThread(pipePtr->readThread, &exitCode);

	    if (exitCode == STILL_ACTIVE) {
		/*
		 * Set the stop event so that if the reader thread is blocked
		 * in PipeReaderThread on WaitForMultipleEvents, it will exit
		 * cleanly.
		 */

		SetEvent(pipePtr->stopReader);

		/*
		 * Wait at most 10 milliseconds for the reader thread to close.
		 */

	    Tcl_MutexLock(&pipeMutex);
	    TerminateThread(pipePtr->readThread, 0);
		WaitForSingleObject(pipePtr->readThread, 10);
		GetExitCodeThread(pipePtr->readThread, &exitCode);

		if (exitCode == STILL_ACTIVE) {
	    /*
	     * Wait for the thread to terminate.  This ensures that we are
		    /*
		     * The thread must be blocked waiting for the pipe to
		     * become readable in ReadFile().  There isn't a clean way
		     * to exit the thread from this condition.  We should
		     * terminate the child process instead to get the reader
		     * thread to fall out of ReadFile with a FALSE.  (below) is
	     * completely cleaned up before we leave this function. 
	     */
		     * not the correct way to do this, but will stay here until
		     * a better solution is found.
		     *
		     * Note that we need to guard against terminating the
		     * thread while it is in the middle of Tcl_ThreadAlert
		     * because it won't be able to release the notifier lock.
		     */

		    Tcl_MutexLock(&pipeMutex);

		    /* BUG: this leaks memory */
		    TerminateThread(pipePtr->readThread, 0);

		    /* Wait for the thread to terminate. */
	    WaitForSingleObject(pipePtr->readThread, INFINITE);
	    Tcl_MutexUnlock(&pipeMutex);

		    WaitForSingleObject(pipePtr->readThread, INFINITE);

		    Tcl_MutexUnlock(&pipeMutex);
		}
	    }

	    CloseHandle(pipePtr->readThread);
	    CloseHandle(pipePtr->readable);
	    CloseHandle(pipePtr->startReader);
	    CloseHandle(pipePtr->stopReader);
	    pipePtr->readThread = NULL;
	}
	if (TclpCloseFile(pipePtr->readFile) != 0) {
	    errorCode = errno;
	}
	pipePtr->validMask &= ~TCL_READABLE;
	pipePtr->readFile = NULL;
2108
2109
2110
2111
2112
2113
2114
2115

2116
2117

2118
2119
2120
2121
2122
2123
2124
2147
2148
2149
2150
2151
2152
2153

2154
2155

2156
2157
2158
2159
2160
2161
2162
2163







-
+

-
+







	     * Reallocate the buffer to be large enough to hold the data.
	     */

	    if (infoPtr->writeBuf) {
		ckfree(infoPtr->writeBuf);
	    }
	    infoPtr->writeBufLen = toWrite;
	    infoPtr->writeBuf = ckalloc(toWrite);
	    infoPtr->writeBuf = ckalloc((unsigned int) toWrite);
	}
	memcpy(infoPtr->writeBuf, buf, toWrite);
	memcpy(infoPtr->writeBuf, buf, (size_t) toWrite);
	infoPtr->toWrite = toWrite;
	ResetEvent(infoPtr->writable);
	SetEvent(infoPtr->startWriter);
	bytesWritten = toWrite;
    } else {
	/*
	 * In the blocking case, just try to write the buffer directly.
2353
2354
2355
2356
2357
2358
2359
2360

2361
2362
2363
2364
2365
2366
2367
2392
2393
2394
2395
2396
2397
2398

2399
2400
2401
2402
2403
2404
2405
2406







-
+







Tcl_Pid
Tcl_WaitPid(
    Tcl_Pid pid,
    int *statPtr,
    int options)
{
    ProcInfo *infoPtr, **prevPtrPtr;
    int flags;
    DWORD flags;
    Tcl_Pid result;
    DWORD ret;

    PipeInit();

    /*
     * If no pid is specified, do nothing.
2655
2656
2657
2658
2659
2660
2661
2662



2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673


2674
2675
2676
2677


2678
2679

2680









2681
2682
2683
2684
2685
2686
2687
2694
2695
2696
2697
2698
2699
2700

2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719

2720
2721
2722
2723
2724

2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740







-
+
+
+











+
+



-
+
+


+
-
+
+
+
+
+
+
+
+
+







 *
 * Results:
 *	None.
 *
 * Side effects:
 *	Signals the main thread when input become available.  May
 *	cause the main thread to wake up by posting a message.  May
 *	consume one byte from the pipe for each wait operation.
 *	consume one byte from the pipe for each wait operation.  Will
 *	cause a memory leak of ~4k, if forcefully terminated with
 *	TerminateThread().
 *
 *----------------------------------------------------------------------
 */

static DWORD WINAPI
PipeReaderThread(LPVOID arg)
{
    PipeInfo *infoPtr = (PipeInfo *)arg;
    HANDLE *handle = ((WinFile *) infoPtr->readFile)->handle;
    DWORD count, err;
    int done = 0;
    HANDLE wEvents[2] = {infoPtr->stopReader, infoPtr->startReader};
    DWORD dwWait;

    while (!done) {
	/*
	 * Wait for the main thread to signal before attempting to wait.
	 * Wait for the main thread to signal before attempting to wait
	 * on the pipe becoming readable.
	 */

	dwWait = WaitForMultipleObjects(2, wEvents, FALSE, INFINITE);
	WaitForSingleObject(infoPtr->startReader, INFINITE);

	if (dwWait != (WAIT_OBJECT_0 + 1)) {
	    /*
	     * The start event was not signaled.  It might be the stop event
	     * or an error, so exit.
	     */

	    return 0;
	}

	/*
	 * Try waiting for 0 bytes.  This will block until some data is
	 * available on NT, but will return immediately on Win 95.  So,
	 * if no data is available after the first read, we block until
	 * we can read a single byte off of the pipe.
	 */
Changes to win/tclWinPort.h.
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
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












-
+










-
-
-
+
+
-
-
-
+
+
-
-
-
+
+
-












-

















+
+
+
-
+
+


-

-




+
+







/*
 * tclWinPort.h --
 *
 *	This header file handles porting issues that occur because of
 *	differences between Windows and Unix. It should be the only
 *	file that contains #ifdefs to handle different flavors of OS.
 *
 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinPort.h,v 1.12 2000/03/31 08:52:31 hobbs Exp $
 * RCS: @(#) $Id: tclWinPort.h,v 1.12.2.5 2001/10/15 17:39:34 hobbs Exp $
 */

#ifndef _TCLWINPORT
#define _TCLWINPORT

#ifndef _TCLINT
#   include "tclInt.h"
#endif

#ifdef CHECK_UNICODE_CALLS

#define _UNICODE
#define UNICODE
#   define _UNICODE
#   define UNICODE

#define __TCHAR_DEFINED
typedef float *_TCHAR;
#   define __TCHAR_DEFINED
    typedef float *_TCHAR;

#define _TCHAR_DEFINED
typedef float *TCHAR;
#   define _TCHAR_DEFINED
    typedef float *TCHAR;

#endif

/*
 *---------------------------------------------------------------------------
 * The following sets of #includes and #ifdefs are required to get Tcl to
 * compile under the windows compilers.
 *---------------------------------------------------------------------------
 */

#include <stdio.h>
#include <stdlib.h>

#include <direct.h>
#include <errno.h>
#include <fcntl.h>
#include <float.h>
#include <io.h>
#include <malloc.h>
#include <process.h>
#include <signal.h>
#include <string.h>

/*
 * Need to block out these includes for building extensions with MetroWerks
 * compiler for Win32.
 */

#ifndef __MWERKS__
#include <sys/stat.h>
#include <sys/timeb.h>
#   ifdef __BORLANDC__
#	include <utime.h>
#   else
#include <sys/utime.h>
#	include <sys/utime.h>
#   endif
#endif

#include <tchar.h>
#include <time.h>
#include <winsock2.h>

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#undef WIN32_LEAN_AND_MEAN

#include <winsock2.h>

#ifdef BUILD_tcl
# undef TCL_STORAGE_CLASS
# define TCL_STORAGE_CLASS DLLEXPORT
#endif

/*
Changes to win/tclWinReg.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







/*
 * tclWinReg.c --
 *
 *	This file contains the implementation of the "registry" Tcl
 *	built-in command.  This command is built as a dynamically
 *	loadable extension in a separate DLL.
 *
 * Copyright (c) 1997 by Sun Microsystems, Inc.
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinReg.c,v 1.11 2000/03/31 08:52:32 hobbs Exp $
 * RCS: @(#) $Id: tclWinReg.c,v 1.11.2.1 2001/04/03 22:54:40 hobbs Exp $
 */

#include <tclPort.h>
#include <stdlib.h>

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
363
364
365
366
367
368
369
370

371
372
373
374
375
376
377
363
364
365
366
367
368
369

370
371
372
373
374
375
376
377







-
+







    Tcl_DString buf;

    /*
     * Find the parent of the key being deleted and open it.
     */

    keyName = Tcl_GetStringFromObj(keyNameObj, &length);
    buffer = ckalloc(length + 1);
    buffer = ckalloc((unsigned int) length + 1);
    strcpy(buffer, keyName);

    if (ParseKeyName(interp, buffer, &hostName, &rootKey, &keyName)
	    != TCL_OK) {
	ckfree(buffer);
	return TCL_ERROR;
    }
617
618
619
620
621
622
623
624

625
626
627
628
629
630
631
617
618
619
620
621
622
623

624
625
626
627
628
629
630
631







-
+








    /*
     * Set the type into the result.  Watch out for unknown types.
     * If we don't know about the type, just use the numeric value.
     */

    if (type > lastType || type < 0) {
	Tcl_SetIntObj(resultPtr, type);
	Tcl_SetIntObj(resultPtr, (int) type);
    } else {
	Tcl_SetStringObj(resultPtr, typeNames[type], -1);
    }
    return TCL_OK;
}

/*
676
677
678
679
680
681
682
683

684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699

700
701
702
703
704
705
706
676
677
678
679
680
681
682

683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698

699
700
701
702
703
704
705
706







-
+















-
+







     *
     * This allows short values to be read from the registy in one call.
     * Longer values need a second call with an expanded DString.
     */

    Tcl_DStringInit(&data);
    length = TCL_DSTRING_STATIC_SIZE - 1;
    Tcl_DStringSetLength(&data, length);
    Tcl_DStringSetLength(&data, (int) length);

    resultPtr = Tcl_GetObjResult(interp);

    valueName = Tcl_GetStringFromObj(valueNameObj, &nameLen);
    valueName = Tcl_WinUtfToTChar(valueName, nameLen, &buf);

    result = (*regWinProcs->regQueryValueExProc)(key, valueName, NULL, &type,
	    (BYTE *) Tcl_DStringValue(&data), &length);
    while (result == ERROR_MORE_DATA) {
	/*
	 * The Windows docs say that in this error case, we just need
	 * to expand our buffer and request more data.
	 * Required for HKEY_PERFORMANCE_DATA
	 */
	length *= 2;
        Tcl_DStringSetLength(&data, length);
        Tcl_DStringSetLength(&data, (int) length);
        result = (*regWinProcs->regQueryValueExProc)(key, valueName, NULL,
		&type, (BYTE *) Tcl_DStringValue(&data), &length);
    }
    Tcl_DStringFree(&buf);
    RegCloseKey(key);
    if (result != ERROR_SUCCESS) {
	Tcl_AppendStringsToObj(resultPtr, "unable to get value \"",
715
716
717
718
719
720
721
722

723
724
725
726
727
728
729
715
716
717
718
719
720
721

722
723
724
725
726
727
728
729







-
+







     * If the data is a 32-bit quantity, store it as an integer object.  If it
     * is a multi-string, store it as a list of strings.  For null-terminated
     * strings, append up the to first null.  Otherwise, store it as a binary
     * string.
     */

    if (type == REG_DWORD || type == REG_DWORD_BIG_ENDIAN) {
	Tcl_SetIntObj(resultPtr, ConvertDWORD(type,
	Tcl_SetIntObj(resultPtr, (int) ConvertDWORD(type,
		*((DWORD*) Tcl_DStringValue(&data))));
    } else if (type == REG_MULTI_SZ) {
	char *p = Tcl_DStringValue(&data);
	char *end = Tcl_DStringValue(&data) + length;

	/*
	 * Multistrings are stored as an array of null-terminated strings,
750
751
752
753
754
755
756
757

758
759
760
761
762
763
764
750
751
752
753
754
755
756

757
758
759
760
761
762
763
764







-
+







		Tcl_DStringLength(&buf));
	Tcl_DStringFree(&buf);
    } else {
	/*
	 * Save binary data as a byte array.
	 */

	Tcl_SetByteArrayObj(resultPtr, Tcl_DStringValue(&data), length);
	Tcl_SetByteArrayObj(resultPtr, Tcl_DStringValue(&data), (int) length);
    }
    Tcl_DStringFree(&data);
    return result;
}

/*
 *----------------------------------------------------------------------
818
819
820
821
822
823
824
825

826
827
828
829
830
831
832
818
819
820
821
822
823
824

825
826
827
828
829
830
831
832







-
+







	goto done;
    }
    maxSize++;


    Tcl_DStringInit(&buffer);
    Tcl_DStringSetLength(&buffer,
	    (regWinProcs->useWide) ? maxSize*2 : maxSize);
	    (int) ((regWinProcs->useWide) ? maxSize*2 : maxSize));
    index = 0;
    result = TCL_OK;

    if (patternObj) {
	pattern = Tcl_GetString(patternObj);
    } else {
	pattern = NULL;
843
844
845
846
847
848
849
850

851
852
853
854
855
856
857
843
844
845
846
847
848
849

850
851
852
853
854
855
856
857







-
+







	    Tcl_DStringValue(&buffer), &size, NULL, NULL, NULL, NULL)
	    == ERROR_SUCCESS) {

	if (regWinProcs->useWide) {
	    size *= 2;
	}

	Tcl_WinTCharToUtf((TCHAR *) Tcl_DStringValue(&buffer), size, &ds);
	Tcl_WinTCharToUtf((TCHAR *) Tcl_DStringValue(&buffer), (int) size, &ds);
	name = Tcl_DStringValue(&ds);
	if (!pattern || Tcl_StringMatch(name, pattern)) {
	    result = Tcl_ListObjAppendElement(interp, resultPtr,
		    Tcl_NewStringObj(name, Tcl_DStringLength(&ds)));
	    if (result != TCL_OK) {
		Tcl_DStringFree(&ds);
		break;
897
898
899
900
901
902
903
904

905
906
907
908
909
910
911
897
898
899
900
901
902
903

904
905
906
907
908
909
910
911







-
+







{
    char *keyName, *buffer, *hostName;
    int length;
    HKEY rootKey;
    DWORD result;

    keyName = Tcl_GetStringFromObj(keyNameObj, &length);
    buffer = ckalloc(length + 1);
    buffer = ckalloc((unsigned int) length + 1);
    strcpy(buffer, keyName);

    result = ParseKeyName(interp, buffer, &hostName, &rootKey, &keyName);
    if (result == TCL_OK) {
	result = OpenSubKey(hostName, rootKey, keyName, mode, flags, keyPtr);
	if (result != ERROR_SUCCESS) {
	    Tcl_Obj *resultPtr = Tcl_GetObjResult(interp);
1131
1132
1133
1134
1135
1136
1137
1138

1139
1140
1141
1142
1143
1144
1145
1131
1132
1133
1134
1135
1136
1137

1138
1139
1140
1141
1142
1143
1144
1145







-
+







    maxSize++;
    if (result != ERROR_SUCCESS) {
	return result;
    }

    Tcl_DStringInit(&subkey);
    Tcl_DStringSetLength(&subkey,
	    (regWinProcs->useWide) ? maxSize * 2 : maxSize);
	    (int) ((regWinProcs->useWide) ? maxSize * 2 : maxSize));

    while (result == ERROR_SUCCESS) {
	/*
	 * Always get index 0 because key deletion changes ordering.
	 */

	size = maxSize;
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
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







-
+










-
+








	if (regWinProcs->useWide) {
	    Tcl_DStringSetLength(&buf, Tcl_DStringLength(&buf)+1);
	}
	length = Tcl_DStringLength(&buf) + 1;

	result = (*regWinProcs->regSetValueExProc)(key, valueName, 0, type,
		(BYTE*)data, length);
		(BYTE*)data, (DWORD) length);
	Tcl_DStringFree(&buf);
    } else {
	char *data;

	/*
	 * Store binary data in the registry.
	 */

	data = Tcl_GetByteArrayFromObj(dataObj, &length);
	result = (*regWinProcs->regSetValueExProc)(key, valueName, 0, type,
		(BYTE *)data, length);
		(BYTE *)data, (DWORD) length);
    }
    Tcl_DStringFree(&nameBuf);
    RegCloseKey(key);
    if (result != ERROR_SUCCESS) {
	Tcl_AppendToObj(resultPtr, "unable to set value: ", -1);
	AppendSystemError(interp, result);
	return TCL_ERROR;
1342
1343
1344
1345
1346
1347
1348
1349

1350
1351
1352
1353
1354
1355
1356
1342
1343
1344
1345
1346
1347
1348

1349
1350
1351
1352
1353
1354
1355
1356







-
+







	    LocalFree(msgPtr);
	}
    }
    if (length == 0) {
	if (error == ERROR_CALL_NOT_IMPLEMENTED) {
	    msg = "function not supported under Win32s";
	} else {
	    sprintf(msgBuf, "unknown error: %d", error);
	    sprintf(msgBuf, "unknown error: %ld", error);
	    msg = msgBuf;
	}
    } else {
	Tcl_Encoding encoding;

	encoding = Tcl_GetEncoding(NULL, "unicode");
	Tcl_ExternalToUtfDString(encoding, (char *) wMsgPtr, -1, &ds);
1367
1368
1369
1370
1371
1372
1373
1374

1375
1376
1377
1378
1379
1380
1381
1367
1368
1369
1370
1371
1372
1373

1374
1375
1376
1377
1378
1379
1380
1381







-
+







	    msg[--length] = 0;
	}
	if (msg[length-1] == '\r') {
	    msg[--length] = 0;
	}
    }

    sprintf(id, "%d", error);
    sprintf(id, "%ld", error);
    Tcl_SetErrorCode(interp, "WINDOWS", id, msg, (char *) NULL);
    Tcl_AppendToObj(resultPtr, msg, length);

    if (length != 0) {
	Tcl_DStringFree(&ds);
    }
}
Changes to win/tclWinSerial.c.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







/*
 * Tclwinserial.c --
 *
 *  This file implements the Windows-specific serial port functions,
 *  and the "serial" channel driver.
 *
 * Copyright (c) 1999 by Scriptics Corp.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 * Changes by Rolf.Schroedter@dlr.de June 25-27, 1999
 *
 * RCS: @(#) $Id: tclWinSerial.c,v 1.9 1999/11/24 20:55:17 hobbs Exp $
 * RCS: @(#) $Id: tclWinSerial.c,v 1.9.2.2 2001/04/03 22:54:40 hobbs Exp $
 */

#include "tclWinInt.h"

#include <dos.h>
#include <fcntl.h>
#include <io.h>
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166














167
168
169
170
171
172
173
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







-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+








/*
 * This structure describes the channel type structure for command serial
 * based IO.
 */

static Tcl_ChannelType serialChannelType = {
    "serial",               /* Type name. */
    SerialBlockProc,        /* Set blocking or non-blocking mode.*/
    SerialCloseProc,        /* Close proc. */
    SerialInputProc,        /* Input proc. */
    SerialOutputProc,       /* Output proc. */
    NULL,                   /* Seek proc. */
    SerialSetOptionProc,    /* Set option proc. */
    SerialGetOptionProc,    /* Get option proc. */
    SerialWatchProc,        /* Set up notifier to watch the channel. */
    SerialGetHandleProc,    /* Get an OS handle from channel. */
    "serial",			/* Type name. */
    TCL_CHANNEL_VERSION_2,	/* v2 channel */
    SerialCloseProc,		/* Close proc. */
    SerialInputProc,		/* Input proc. */
    SerialOutputProc,		/* Output proc. */
    NULL,			/* Seek proc. */
    SerialSetOptionProc,	/* Set option proc. */
    SerialGetOptionProc,	/* Get option proc. */
    SerialWatchProc,		/* Set up notifier to watch the channel. */
    SerialGetHandleProc,	/* Get an OS handle from channel. */
    NULL,			/* close2proc. */
    SerialBlockProc,		/* Set blocking or non-blocking mode.*/
    NULL,			/* flush proc. */
    NULL,			/* handler proc. */
};

/*
 *----------------------------------------------------------------------
 *
 * SerialInit --
 *
1039
1040
1041
1042
1043
1044
1045
1046

1047
1048
1049
1050
1051
1052
1053
1043
1044
1045
1046
1047
1048
1049

1050
1051
1052
1053
1054
1055
1056
1057







-
+







    ClientData instanceData;    /* File state. */
    Tcl_Interp *interp;         /* For error reporting - can be NULL. */
    char *optionName;           /* Which option to set? */
    char *value;                /* New value for option. */
{
    SerialInfo *infoPtr;
    DCB dcb;
    int len;
    size_t len;
    BOOL result;
    Tcl_DString ds;
    TCHAR *native;
    
    infoPtr = (SerialInfo *) instanceData;
    
    len = strlen(optionName);
1115
1116
1117
1118
1119
1120
1121
1122

1123
1124
1125
1126
1127
1128
1129
1119
1120
1121
1122
1123
1124
1125

1126
1127
1128
1129
1130
1131
1132
1133







-
+







    ClientData instanceData;    /* File state. */
    Tcl_Interp *interp;         /* For error reporting - can be NULL. */
    char *optionName;           /* Option to get. */
    Tcl_DString *dsPtr;         /* Where to store value(s). */
{
    SerialInfo *infoPtr;
    DCB dcb;
    int len;
    size_t len;
    int valid = 0;  /* flag if valid option parsed */

    infoPtr = (SerialInfo *) instanceData;

    if (optionName == NULL) {
        len = 0;
    } else {
1149
1150
1151
1152
1153
1154
1155
1156

1157
1158
1159
1160
1161
1162
1163
1153
1154
1155
1156
1157
1158
1159

1160
1161
1162
1163
1164
1165
1166
1167







-
+








        } else {
            char parity;
            char *stop;
            char buf[2 * TCL_INTEGER_SPACE + 16];

            parity = 'n';
            if (dcb.Parity < 4) {
            if (dcb.Parity <= 4) {
                parity = "noems"[dcb.Parity];
            }

            stop = (dcb.StopBits == ONESTOPBIT) ? "1" :
            (dcb.StopBits == ONE5STOPBITS) ? "1.5" : "2";

            wsprintfA(buf, "%d,%c,%d,%s", dcb.BaudRate, parity,
Changes to win/tclWinSock.c.
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10

11
12
13
14
15
16
17
18










-
+







/* 
 * tclWinSock.c --
 *
 *	This file contains Windows-specific socket related code.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinSock.c,v 1.18 1999/12/09 14:44:11 hobbs Exp $
 * RCS: @(#) $Id: tclWinSock.c,v 1.18.2.3 2001/09/20 18:50:24 hobbs Exp $
 */

#include "tclWinInt.h"

/*
 * The following variable is used to tell whether this module has been
 * initialized.
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227














228
229
230
231
232
233
234
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







-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+








/*
 * This structure describes the channel type structure for TCP socket
 * based IO.
 */

static Tcl_ChannelType tcpChannelType = {
    "tcp",		/* Type name. */
    TcpBlockProc,	/* Set socket into blocking/non-blocking mode. */
    TcpCloseProc,	/* Close proc. */
    TcpInputProc,	/* Input proc. */
    TcpOutputProc,	/* Output proc. */
    NULL,		/* Seek proc. */
    NULL,		/* Set option proc. */
    TcpGetOptionProc,	/* Get option proc. */
    TcpWatchProc,	/* Initialize notifier to watch this channel. */
    TcpGetHandleProc,	/* Get an OS handle from channel. */
    "tcp",			/* Type name. */
    TCL_CHANNEL_VERSION_2,	/* v2 channel */
    TcpCloseProc,		/* Close proc. */
    TcpInputProc,		/* Input proc. */
    TcpOutputProc,		/* Output proc. */
    NULL,			/* Seek proc. */
    NULL,			/* Set option proc. */
    TcpGetOptionProc,		/* Get option proc. */
    TcpWatchProc,		/* Set up notifier to watch this channel. */
    TcpGetHandleProc,		/* Get an OS handle from channel. */
    NULL,			/* close2proc. */
    TcpBlockProc,		/* Set socket into (non-)blocking mode. */
    NULL,			/* flush proc. */
    NULL,			/* handler proc. */
};

/*
 * Define version of Winsock required by Tcl.
 */

#define WSA_VERSION_REQD MAKEWORD(1,1)
828
829
830
831
832
833
834

835
836
837
838
839
840
841
842
843
844
832
833
834
835
836
837
838
839
840
841

842
843
844
845
846
847
848







+


-







	FD_SET(infoPtr->socket, &readFds);
	timeout.tv_usec = 0;
	timeout.tv_sec = 0;
 
	if ((*winSock.select)(0, &readFds, NULL, NULL, &timeout) != 0) {
	    mask |= TCL_READABLE;
	} else {
	    infoPtr->readyEvents &= ~(FD_READ);
	    SendMessage(tsdPtr->hwnd, SOCKET_SELECT,
		    (WPARAM) SELECT, (LPARAM) infoPtr);
	    infoPtr->readyEvents &= ~(FD_READ);
	}
    }
    if (events & (FD_WRITE | FD_CONNECT)) {
	mask |= TCL_WRITABLE;
    }

    if (mask) {
2138
2139
2140
2141
2142
2143
2144
2145

2146
2147
2148
2149
2150
2151
2152
2142
2143
2144
2145
2146
2147
2148

2149
2150
2151
2152
2153
2154
2155
2156







-
+







    } else {
	/*
	 * store the tsdPtr, it's from a different thread, so it's
	 * not directly accessible, but needed.
	 */

#ifdef _WIN64
	SetWindowLongPtr(tsdPtr->hwnd, GWLP_USERDATA, (LONG) tsdPtr);
	SetWindowLongPtr(tsdPtr->hwnd, GWLP_USERDATA, (LONG_PTR) tsdPtr);
#else
	SetWindowLong(tsdPtr->hwnd, GWL_USERDATA, (LONG) tsdPtr);
#endif
    }

    while (1) {
	/*
Changes to win/tclWinThrd.c.
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16
17
18
19











-
+







/* 
 * tclWinThread.c --
 *
 *	This file implements the Windows-specific thread operations.
 *
 * Copyright (c) 1998 by Sun Microsystems, Inc.
 * Copyright (c) 1999 by Scriptics Corporation
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinThrd.c,v 1.8 2000/04/20 01:30:20 hobbs Exp $
 * RCS: @(#) $Id: tclWinThrd.c,v 1.8.2.1 2001/09/01 22:53:45 davygrvy Exp $
 */

#include "tclWinInt.h"

#include <dos.h>
#include <fcntl.h>
#include <io.h>
119
120
121
122
123
124
125
126

127
128
129
130




131
132





133
134
135
136
137
138
139
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







-
+

-
-
-
+
+
+
+


+
+
+
+
+







    Tcl_ThreadId *idPtr;		/* Return, the ID of the thread */
    Tcl_ThreadCreateProc proc;		/* Main() function of the thread */
    ClientData clientData;		/* The one argument to Main() */
    int stackSize;			/* Size of stack for the new thread */
    int flags;				/* Flags controlling behaviour of
					 * the new thread */
{
    unsigned long code;
    HANDLE tHandle;

    code = _beginthreadex(NULL, stackSize, proc, clientData, 0,
	(unsigned *)idPtr);
    if (code == 0) {
    tHandle = (HANDLE) _beginthreadex(NULL, (unsigned) stackSize, proc,
	clientData, 0, (unsigned *)idPtr);

    if (tHandle == NULL) {
	return TCL_ERROR;
    } else {
	/*
	 * The only purpose of this is to decrement the reference count so the
	 * OS resources will be reaquired when the thread closes.
	 */
	CloseHandle(tHandle);
	return TCL_OK;
    }
}

/*
 *----------------------------------------------------------------------
 *
424
425
426
427
428
429
430

431
432
433
434
435
436
437
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444







+








void
TclpFinalizeMutex(mutexPtr)
    Tcl_Mutex *mutexPtr;
{
    CRITICAL_SECTION *csPtr = *(CRITICAL_SECTION **)mutexPtr;
    if (csPtr != NULL) {
	DeleteCriticalSection(csPtr);
	ckfree((char *)csPtr);
	*mutexPtr = NULL;
    }
}


/*
892
893
894
895
896
897
898

899
900
901
902
903
899
900
901
902
903
904
905
906
907
908
909
910
911







+





     * Note - this is called long after the thread-local storage is
     * reclaimed.  The per-thread condition waiting event is
     * reclaimed earlier in a per-thread exit handler, which is
     * called before thread local storage is reclaimed.
     */

    if (winCondPtr != NULL) {
	DeleteCriticalSection(&winCondPtr->condLock);
	ckfree((char *)winCondPtr);
	*condPtr = NULL;
    }
}
#endif /* TCL_THREADS */
Changes to win/tclsh.rc.
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

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

-
+

-
+


-
+



+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







+
+
+

+
-
-
+
+







-
-
+
+

-
+















-
// RCS: @(#) $Id: tclsh.rc,v 1.5 2000/04/18 23:26:45 redman Exp $
// RCS: @(#) $Id: tclsh.rc,v 1.5.2.2 2001/10/03 20:24:59 hobbs Exp $
//
// Version
// Version Resource Script
//

#define VS_VERSION_INFO 1
#include <winver.h>

#define RESOURCE_INCLUDED
#include <tcl.h>

//
// build-up the name suffix that defines the type of build this is.
//
#ifdef TCL_THREADS
#define SUFFIX_THREADS	    "t"
#else
#define SUFFIX_THREADS	    ""
#endif

#ifdef STATIC_BUILD
#define SUFFIX_STATIC	    "s"
#else
#define SUFFIX_STATIC	    ""
#endif

#ifdef DEBUG
#define SUFFIX_DEBUG	    "d"
#else
#define SUFFIX_DEBUG	    ""
#endif

#define SUFFIX		    SUFFIX_THREADS SUFFIX_STATIC SUFFIX_DEBUG


LANGUAGE 0x9, 0x1	/* LANG_ENGLISH, SUBLANG_DEFAULT */

VS_VERSION_INFO VERSIONINFO
 FILEVERSION 	TCL_MAJOR_VERSION,TCL_MINOR_VERSION,TCL_RELEASE_LEVEL,TCL_RELEASE_SERIAL
 PRODUCTVERSION TCL_MAJOR_VERSION,TCL_MINOR_VERSION,TCL_RELEASE_LEVEL,TCL_RELEASE_SERIAL
 FILEFLAGSMASK 	0x3fL
#ifdef DEBUG
 FILEFLAGS 	VS_FF_DEBUG
#else
 FILEFLAGS 	0x0L
#endif
 FILEOS 	0x4	/* VOS__WINDOWS32 */
 FILETYPE 	0x2	/* VFT_DLL */
 FILEOS 	VOS__WINDOWS32
 FILETYPE 	VFT_APP
 FILESUBTYPE 	0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904b0"
        BEGIN
            VALUE "FileDescription", "Tclsh Application\0"
            VALUE "OriginalFilename", "tclsh" STRINGIFY(TCL_MAJOR_VERSION) STRINGIFY(TCL_MINOR_VERSION) ".exe\0"
            VALUE "CompanyName", "Scriptics Corporation\0"
            VALUE "OriginalFilename", "tclsh" STRINGIFY(TCL_MAJOR_VERSION) STRINGIFY(TCL_MINOR_VERSION) SUFFIX ".exe\0"
            VALUE "CompanyName", "ActiveState Corporation\0"
            VALUE "FileVersion", TCL_PATCH_LEVEL
            VALUE "LegalCopyright", "Copyright (c) 2000 by Scriptics Corporation\0"
            VALUE "LegalCopyright", "Copyright (c) 2000 by ActiveState Corporation, et al\0"
            VALUE "ProductName", "Tcl " TCL_VERSION " for Windows\0"
            VALUE "ProductVersion", TCL_PATCH_LEVEL
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x409, 1200
    END
END

//
// Icon
//

tclsh                      ICON    DISCARDABLE     "tclsh.ico"