Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Changes In Branch core-8-3-1-branch Through [4afa81de46] Excluding Merge-Ins
This is equivalent to a diff from 3429c5f93a to 4afa81de46
|
2001-08-08
| ||
| 03:28 | BRANCH: core-8-3-1-branch Removed library/opt0.4/* . The files of the opt package moved to librar... check-in: 0989f0fe4f user: dgp tags: core-8-3-1-branch | |
| 03:25 | BRANCH: core-8-3-1-branch Removed library/msgcat1.0/*. The msgcat package files moved to library... check-in: 4afa81de46 user: dgp tags: core-8-3-1-branch | |
| 03:23 | BRANCH: core-8-3-1-branch Removed library/http2.3/* . The http package moved to library/http in ... check-in: e2ad95fa9c user: dgp 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 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 |
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
***************************************************************
** 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>
* 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].
* 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 | README: 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 |
README: Tcl
This is the Tcl 8.3.3 source distribution.
You can get any release of Tcl from:
ftp://ftp.scriptics.com/pub/tcl/
Tcl/Tk is also available through NetCVS:
http://tcl.sourceforge.net/
RCS: @(#) $Id: README,v 1.31.2.2 2001/04/03 22:08:32 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 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 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/
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
Detailed release notes can be found at
http://dev.scriptics.com/software/tcltk/relnotes/tcl8.3.3.txt
Information about Tcl itself can be found at
http://dev.scriptics.com/scripting/
There are many Tcl books on the market. Most are listed at
http://dev.scriptics.com/resource/doc/books/
|
| ︙ | ︙ | |||
67 68 69 70 71 72 73 | 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 | | | | | | | < | | | < > | | | | | < < > | | | | | 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 | 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 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 "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 http://dev.scriptics.com/doc/howto/compile.html 4. TclPro Development tools -------------------- 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://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. 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 |
| ︙ | ︙ | |||
136 137 138 139 140 141 142 | 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 ---------------- | < < | < < | | | < | < < < < < | < | | < | > | < < < < | | | | | | | | | < < < < < | | | 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 | 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 ---------------- Several mailing lists are hosted at SourceForge to discuss development or use issues (like Macintosh and Windows topics). For more information and to subscribe, visit: http://sourceforge.net/projects/tcl/ and go to the Mailing Lists page. 9. Support and Training ------------------------ We are very interested in receiving bug reports, patches, and suggestions for improvements. We prefer that you send this information to us via the bug form at SourceForge, rather than emailing us directly. The bug database is at: 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. 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. 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, see the following Web site for links to other organizations that offer Tcl/Tk training: http://www.scriptics.com/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 | Recent user-visible changes to Tcl: | | | 1 2 3 4 5 6 7 8 9 10 | Recent user-visible changes to Tcl: RCS: @(#) $Id: changes,v 1.56.2.3 2001/04/04 23:05:06 hobbs 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 | 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 --- | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 |
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 ---
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).
2001-04-03 (doc fixes) numerous doc corrections and clarifications.
Update of READMEs.
2001-03-30 (bug fix) corrected Windows memory error on exit (wu)
Fixed race condition in readability of socket on Windows.
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-13 (bug fix) Correctly possible memory corruption in string map {}
$str (fellows)
2001-02-15 (feature enhancement) improved efficiency of [string split]
(fellows)
2001-01-30 (bug fix) Fixed possible hangs in fcopy. (porter)
2001-01-04 (bug fix) corrected parsing of $tcl_libPath at startup on
Windows (porter)
2000-12-14 (feature enhancement) improved (s)rand for 64-bit platforms
(porter)
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-11-23 (mem leak) fixed potential memory leak in error case of lsort
(fellows)
2000-11-02 (bug fix) Corrected sharing of tclLibraryPath in threaded
environment (gravereaux)
2000-11-01 (mem leak) Corrected excessive mem use of info exists on a
non-existent array element (hobbs)
2000-10-20 (feature enhancement) call stat only when necessary in 'glob' to
speed up command significantly in base cases (hobbs)
2000-10-06 (bug fix) corrected [file channels] to only return channels in
the current interpreter (hobbs)
2000-09-29 (bug fix) corrected reporting of space parity on Windows (Eason)
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)
--- Released 8.3.3, April 6, 2001 --- See ChangeLog for details ---
|
Changes to compat/string.h.
1 2 3 4 5 6 7 8 9 10 11 | /* * 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. * | | | 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.12.1 2001/04/03 22:54:36 hobbs Exp $ */ #ifndef _STRING #define _STRING #include <tcl.h> |
| ︙ | ︙ | |||
55 56 57 58 59 60 61 | 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)); | | > | | 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, 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_((char *s, CONST char *delim)); #endif /* _STRING */ |
Changes to doc/AddErrInfo.3.
1 2 3 4 5 6 7 | '\" '\" 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. '\" | | | | 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.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_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 | 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. | | | | | | 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_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_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_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/ChnlStack.3.
1 | '\" | | | | | | | 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-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.10.2 2000/08/08 00:57:52 hobbs Exp $ .so man.macros .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, 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 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 | 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 | | | | < | > | | | | | < < < < < < < < < < < < < | | > | < > > > > | < < | | | < | | | | | | | < | | < | > > | 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 a new channel on top of an 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 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 stacks a new \fIchannel\fP on an existing channel 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 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 structure is returned. If an error occurs when stacking the channel, NULL is returned instead. .PP The \fImask\fP parameter specifies the operations that 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. .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. .PP \fBTcl_UnstackChannel\fP reverses the process. The old channel is associated with the channel name, and the processing module added by \fBTcl_StackChannel\fR is destroyed. If there is no old channel, then \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 | '\" '\" 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. '\" | > | | | < < < > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < < < < | 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.2.2 2001/04/03 22:06:43 hobbs Exp $ .so man.macros .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, 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) .sp int \fBTcl_GetChannelHandle\fR(\fIchannel, direction, handlePtr\fR) .sp int \fBTcl_GetChannelBufferSize\fR(\fIchannel\fR) .sp \fBTcl_SetChannelBufferSize\fR(\fIchannel, size\fR) .sp \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. .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. .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. .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. .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 | 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 | < < < < < < | > > | < > | > > > < < < | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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
\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.
.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
\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.
.PP
\fBTcl_BadChannelOption\fR is called from driver specific set or get option
procs to generate a complete error message.
.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 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
The \fBTcl_ChannelType\fR structure contains the following fields:
.CS
typedef struct Tcl_ChannelType {
char *\fItypeName\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
.PP
The driver must provide implementations for all functions except
\fIblockModeProc\fR, \fIseekProc\fR, \fIsetOptionProc\fR,
\fIgetOptionProc\fR, and \fIclose2Proc\fR, which may be specified as
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, 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 | .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. .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 | > > > > > | 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 | 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 | < | 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 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 | 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. .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: | > > > > > | 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 | 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. .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 | > > > > > | 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 | 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. .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: | > > > > > | 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 | 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. .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 | > > > > > | 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 | 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. | < < > > > > > < < < < > > > > > < < < > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > | 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. It should call \fBTcl_BadChannelOption\fR which itself returns \fBTCL_ERROR\fR if the \fIoptionName\fR is unrecognized. 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, Tcl_Interp *\fIinterp\fR, 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. 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. .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 .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 .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 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\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. .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 |
<...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
| | | | > > > > > > > > > > > > > > > > > > > > > > > > > > | | 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>''
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.
.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_StackChannel(3)
.SH KEYWORDS
blocking, channel driver, channel registration, channel type, nonblocking
|
Changes to doc/CrtObjCmd.3.
1 2 3 4 5 6 | '\" '\" 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. '\" | | | 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.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 | 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 | | | 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_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 | 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, | | | 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_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 | 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. | < | 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. .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 | '\" '\" 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. '\" | | | 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.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 | 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 | < > > | 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 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/DetachPids.3.
1 2 3 4 5 6 7 | '\" '\" 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. '\" | | | > > > > > > > > > > < | 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.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, 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 | 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. .SH KEYWORDS background, child, detach, process, wait | > > > > > > | 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/Eval.3.
1 2 3 4 5 6 7 | '\" '\" 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. '\" | | | 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.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 | 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 | | | | | 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 (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 | 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 | > > > | | | | | | 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 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 | '\" '\" 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. '\" | | | | 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.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_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/GetIndex.3.
1 2 3 4 5 6 | '\" '\" 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. '\" | | | | 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.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, 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 | '\" '\" 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. '\" | | | 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.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 | 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 | | | | 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_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 | \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, | | | 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, \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 | '\" '\" 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. '\" | | | | 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.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, 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 | '\" '\" 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. '\" | | | 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.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 | .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. | | | 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 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/RecEvalObj.3.
1 2 3 4 5 6 | '\" '\" 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. '\" | | | 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.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 | 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 | | | | | | 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_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_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_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_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 | '\" '\" 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. '\" | | | | 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.2.1 2000/08/07 21:29:38 hobbs 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_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 | .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 | | | 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_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 | 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 | | | 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_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 |
| ︙ | ︙ | |||
166 167 168 169 170 171 172 | 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. .PP .VS 8.1 \fBTcl_GetRegExpFromObj\fR, \fBTcl_RegExpExecObj\fR, and | | | | 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 | 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. .PP .VS 8.1 \fBTcl_GetRegExpFromObj\fR, \fBTcl_RegExpExecObj\fR, and \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_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 | `[^' 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 | | | 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_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 | .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 | | | 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_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 | '\" '\" 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. '\" | | | | 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.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, 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 | '\" '\" 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. '\" | | | | 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.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, 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 | '\" '\" 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. '\" | | < > | < < < | 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.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) .sp int \fBTcl_StringCaseMatch\fR(\fIstring\fR, \fIpattern\fR, \fInocase\fR) .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[]. .AP int nocase in Specifies whether the match should be done case-sensitive (0) or case-insensitive (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/Thread.3.
1 2 3 4 5 6 7 | '\" '\" 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. '\" | | | | 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.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_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 | .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_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. .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. | > > > > > | 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/after.n.
1 2 3 4 5 6 7 | '\" '\" 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. '\" | | | 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.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 | 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" | | | 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(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 | '\" '\" 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. '\" | | | 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.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 | 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 KEYWORDS append, variable | > > > | 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 | '\" '\" 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. '\" | | | 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.18.2 2001/08/06 22:24:11 andreas_kupries 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 | 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 | | < | | | | | | | | | | | | | | | | | | | | | < < | | > > | 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 | 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. When a background error occurs, the 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. .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. .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. .PP Tcl has no default implementation for \fBbgerror\fR. However, in applications using Tk there is a default \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. .SH "SEE ALSO" after(n), tclvars(n) .SH KEYWORDS background error, reporting |
Changes to doc/binary.n.
1 2 3 4 5 6 | '\" '\" 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. '\" | | | | | | | | 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.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, 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 | .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" | | | 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(n), scan(n), tclvars(n) .SH KEYWORDS binary, format, scan |
Changes to doc/break.n.
1 2 3 4 5 6 7 | '\" '\" 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. '\" | | | 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.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 | 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 KEYWORDS abort, break, loop | > > > | 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 | '\" '\" 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. '\" | | | 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.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 | 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 KEYWORDS case, match, regular expression | > > > | 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 | '\" '\" 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. '\" | | > > > | 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.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 | '\" '\" 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. '\" | | | 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.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 | 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 KEYWORDS blocking, channel, close, nonblocking | > > > | 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 | '\" '\" 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. '\" | | | 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.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 |
.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 KEYWORDS
concatenate, join, lists
| > > > | 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 | '\" '\" 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. '\" | | | 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.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 | 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 KEYWORDS continue, iteration, loop | > > > | 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 | '\" '\" 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. '\" | | | 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.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 | 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" | > | > | 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(n), winfo(n), send(n) .SH KEYWORDS application, dde, name, remote execution |
Changes to doc/encoding.n.
1 2 3 4 5 6 | '\" '\" 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. '\" | | | 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.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 | .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" | | | 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(3) .SH KEYWORDS encoding |
Changes to doc/eof.n.
1 2 3 4 5 6 7 | '\" '\" 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. '\" | | > > > | 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.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 | '\" '\" 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. '\" | | | 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.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 | 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 KEYWORDS error, errorCode, errorInfo | > > > | 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 | '\" '\" 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. '\" | | | 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.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 | \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 | > > > | 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 | '\" '\" 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. '\" | | | 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.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 | \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" | | < < | 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" error(n), open(n) .SH KEYWORDS execute, pipeline, redirection, subprocess |
Changes to doc/exit.n.
1 2 3 4 5 6 7 | '\" '\" 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. '\" | | > > > | 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.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 | '\" '\" Copyright (c) 1993 The Regents of the University of California. | | | | | 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-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.2.18.1 2000/08/07 21:29:39 hobbs Exp $ '\" .so man.macros .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 | .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 | | | < | 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\fR command instead. .SH "PERFORMANCE CONSIDERATIONS" .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 | 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. | < | 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. .SH KEYWORDS arithmetic, boolean, compare, expression, fuzzy comparison |
Changes to doc/fblocked.n.
1 2 3 4 5 6 | '\" '\" 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. '\" | | > | | 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.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), open(n), read(n) .SH KEYWORDS blocking, nonblocking |
Changes to doc/fileevent.n.
1 2 3 4 5 6 7 | '\" '\" 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. '\" | | | 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.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 | .SH CREDITS .PP \fBfileevent\fR is based on the \fBaddinput\fR command created by Mark Diekhans. .SH "SEE ALSO" | | | 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(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 | '\" '\" 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. '\" | | | 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.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 | 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 | > > > | 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 | '\" '\" 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. '\" | | | 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.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 | 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" | | | 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" 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 | '\" '\" 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. '\" | | | 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.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 |
around \fB$x<10\fR:
.CS
for {set x 0} {$x<10} {incr x} {
puts "x is $x"
}
.CE
.SH KEYWORDS
for, iteration, looping
| > > > | 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 | '\" '\" 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. '\" | | | 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.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 |
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 KEYWORDS
foreach, iteration, list, looping
| > > > > | 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 | '\" '\" 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. '\" | | | 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.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 | 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 KEYWORDS conversion specifier, format, sprintf, string, substitution | > > > | 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 | '\" '\" 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. '\" | | | 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.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 | 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" | | | 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" 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 | '\" '\" 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. '\" | | | 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.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 | \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 KEYWORDS exist, file, glob, pattern | > > | 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 | '\" '\" 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. '\" | | | 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.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 | 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. .SH "SEE ALSO" | > > > > | | 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), upvar(n), variable(n) .SH KEYWORDS global, namespace, procedure, variable |
Changes to doc/http.n.
1 2 | '\" '\" Copyright (c) 1995-1997 Sun Microsystems, Inc. | | | | > > > > | 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) 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.2.2 2001/04/03 22:06:43 hobbs 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.3?\fP .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 | 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 | < | | | 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. .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 |
| ︙ | ︙ | |||
258 259 260 261 262 263 264 | \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 | | > > > > > > > > > > > > | > | > > > > | 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 | \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. 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, 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. 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 | 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, | | > > > > > > > < > > > | | > > > > > > > | < > > | | | < | | 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 | 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, 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 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 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 raised, but the status of the transaction will be \fBeof\fP. .TP error The error message will also be stored in the \fBerror\fP status 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. |
| ︙ | ︙ | |||
420 421 422 423 424 425 426 | .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 | > | | 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 | .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 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 |
}
return $token
}
proc ::http::Progress {args} {
puts -nonewline stderr . ; flush stderr
}
| < > > < < | 501 502 503 504 505 506 507 508 509 510 511 512 513 514 |
}
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 | '\" '\" 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. '\" | | | 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.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 | ``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 KEYWORDS boolean, conditional, else, false, if, true | > > > | 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 | '\" '\" 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. '\" | | > > > | 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.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 | '\" '\" 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. '\" | | > > > | 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.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 | '\" '\" 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. '\" | | | 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.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 | \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 KEYWORDS append, element, list, variable | > > > | 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 | '\" '\" 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. '\" | | | 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.11.2.2 2001/04/03 22:06:43 hobbs 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 |
| ︙ | ︙ | |||
300 301 302 303 304 305 306 | 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" | | | 300 301 302 303 304 305 306 307 308 309 310 | 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" 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 | '\" '\" 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. '\" | | | 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.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 | 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 KEYWORDS element, index, list | > > > | 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 | '\" '\" 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. '\" | | | 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.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 | 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 KEYWORDS element, insert, list | > > > | 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 | '\" '\" 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. '\" | | | 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: list.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs 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 |
| ︙ | ︙ | |||
37 38 39 40 41 42 43 44 45 |
\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 KEYWORDS
element, list
| > > > > | 37 38 39 40 41 42 43 44 45 46 47 48 49 |
\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 | '\" '\" 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. '\" | | > > > | 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.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 | '\" '\" 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. '\" | | | 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.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 | .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" | | | 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(3), safe(n) .SH KEYWORDS binary code, loading, safe interpreter, shared library |
Changes to doc/lrange.n.
1 2 3 4 5 6 7 | '\" '\" 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. '\" | | | 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.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 | 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 KEYWORDS element, list, range, sublist | > > > | 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 | '\" '\" 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. '\" | | | 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.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 | 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 KEYWORDS element, list, replace | > > > > | 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 | '\" '\" 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. '\" | | | 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.2.1 2001/04/03 22:06:43 hobbs 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 |
| ︙ | ︙ | |||
73 74 75 76 77 78 79 |
.CS
lsort -integer -index 1 {{First 24} {Second 18} {Third 30}}
.CE
returns \fB{Second 18} {First 24} {Third 30}\fR.
This option is much more efficient than using \fB\-command\fR
to achieve the same effect.
.RE
| < | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 |
.CS
lsort -integer -index 1 {{First 24} {Second 18} {Third 30}}
.CE
returns \fB{Second 18} {First 24} {Third 30}\fR.
This option is much more efficient than using \fB\-command\fR
to achieve the same effect.
.RE
.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.
.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 | '\" 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. '\" | | | 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.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 | .sp .. '\" # SO - start of list of standard options .de SO .SH "STANDARD OPTIONS" .LP .nf | | | 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 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 | '\" '\" Copyright (c) 1992-1999 by Karl Lehenbauer and Mark Diekhans '\" Copyright (c) 2000 by Scriptics Corporation. '\" All rights reserved. '\" | | | 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.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 | 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 | < < | 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/open.n.
1 2 3 4 5 6 7 | '\" '\" 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. '\" | | | 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.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 | \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. .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 | > > > > > > > > > > > > | 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 | 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" | > > | | | 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), 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 | '\" '\" 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. '\" | | | | 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.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 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 | 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 | | | | 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 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 | 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 KEYWORDS package, version | > > > | 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 | '\" '\" Copyright (c) 1998-2000 by Scriptics Corporation. '\" All rights reserved. '\" | | | 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.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 | \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 KEYWORDS auto-load, index, package, version | > > > | 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 | '\" '\" 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. '\" | | | 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.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 | 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 KEYWORDS file, pipeline, process identifier | > > > | 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 | '\" '\" 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. '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | '\" '\" 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.2.1 2001/04/03 22:06:43 hobbs 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 |
| ︙ | ︙ | |||
227 228 229 230 231 232 233 234 235 236 | 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 KEYWORDS auto-load, index, package, version | > > > | 227 228 229 230 231 232 233 234 235 236 237 238 239 | 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 | '\" '\" 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. '\" | | | 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.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 | 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 KEYWORDS argument, procedure | > > > | 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 | '\" '\" 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. '\" | | | 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.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 | 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" | | | 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" file(n), fileevent(n) .SH KEYWORDS channel, newline, output, write |
Changes to doc/pwd.n.
1 2 3 4 5 6 7 | '\" '\" 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. '\" | | > > > | 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.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 | '\" '\" 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. '\" | | | 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.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 | \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" | | | 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" 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 | '\" '\" 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. '\" | | | 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.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 | 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" | | | 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), regsub(n) .SH KEYWORDS match, regular expression, string |
Changes to doc/regsub.n.
1 2 3 4 5 6 7 | '\" '\" 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. '\" | > | | 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.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 | 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 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 | > > > > > > > > > > > > > > > > > > > > > > > > > | < < > > > | 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. \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 | '\" '\" 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. '\" | | | 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.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 | 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 KEYWORDS command, delete, namespace, rename | > > > | 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 | '\" '\" 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. | | | 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.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 | 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" | | | 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(n) .SH KEYWORDS open, resource |
Changes to doc/return.n.
1 2 3 4 5 6 7 | '\" '\" 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. '\" | | | 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.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 | 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 KEYWORDS break, continue, error, procedure, return | > > > | 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 | '\" '\" 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. '\" | > | | | 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.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 \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 | 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 | < < < < > > > > > | > > > > < | 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 instead of assigned to a variable; a XPG3 position specifier; a number 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. .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. .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.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. .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 | \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. | < < < < < < < > > > > | 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. 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. .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. 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. .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: .IP [1] \fB%p\fR conversion specifier is not currently supported. .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). .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 | '\" '\" 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. '\" | | | 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.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 | .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 KEYWORDS access position, file, seek | > > > | 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 | '\" '\" 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. '\" | | | 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.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 | (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 KEYWORDS read, write, variable | > > > | 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 | '\" '\" 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. '\" | | | 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.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 |
.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 KEYWORDS
list, split, string
| > > > | 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 | '\" '\" 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. '\" | | | 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.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 | 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 KEYWORDS case conversion, compare, index, match, pattern, string, word, equal, ctype | > > > | 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 | '\" '\" 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. '\" | | | 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.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 |
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 KEYWORDS
backslash substitution, command substitution, variable substitution
| > > > | 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 | '\" '\" 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. '\" | | | 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.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 |
{format 2}
default
{format 3}
}\fR
.CE
will return \fB3\fR.
.SH KEYWORDS
switch, match, regular expression
| > > > | 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/tclvars.n.
1 2 3 4 5 6 7 | '\" '\" 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. '\" | | | 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.2.1 2001/04/03 22:06:44 hobbs 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 |
| ︙ | ︙ | |||
389 390 391 392 393 394 395 396 397 398 | 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 KEYWORDS arithmetic, bytecode, compiler, error, environment, POSIX, precision, subprocess, variables | > > > | 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 | '\" '\" 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. '\" | | | 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.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 | \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 KEYWORDS access position, channel, seeking | > > > | 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 | '\" '\" 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. '\" | | | 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.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 | 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 KEYWORDS script, time | > > > | 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 | '\" '\" 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. '\" | | | 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.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 | 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 KEYWORDS error, non-existent command | > > > | 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 | '\" '\" 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. '\" | | | 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.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 | .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 KEYWORDS event, flush, handler, idle, update | > > > | 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 | '\" '\" 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. '\" | | | 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.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 | 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" | | | 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), upvar(n) .SH KEYWORDS context, level, namespace, stack frame, variables |
Changes to doc/upvar.n.
1 2 3 4 5 6 7 | '\" '\" 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. '\" | | | 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.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 | 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" | | | 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" 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 | '\" '\" 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. '\" | | | 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.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 | 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 | | > | | 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 (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), upvar(n) .SH KEYWORDS global, namespace, procedure, variable |
Changes to doc/vwait.n.
1 2 3 4 5 6 | '\" '\" 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. '\" | | | 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.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 | 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 KEYWORDS event, variable, wait | > > > | 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 | '\" '\" 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. '\" | | | 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.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 |
set x 0
while {$x<10} {
puts "x is $x"
incr x
}
.CE
.SH KEYWORDS
boolean value, loop, test, while
| > > > | 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 | # 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. # | | | 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.2.1 2000/07/27 01:39:14 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 |
declare 281 generic {
Tcl_Channel Tcl_StackChannel(Tcl_Interp *interp, \
Tcl_ChannelType *typePtr, ClientData instanceData, \
int mask, Tcl_Channel prevChan)
}
declare 282 generic {
| | | 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 |
declare 281 generic {
Tcl_Channel Tcl_StackChannel(Tcl_Interp *interp, \
Tcl_ChannelType *typePtr, ClientData instanceData, \
int mask, Tcl_Channel prevChan)
}
declare 282 generic {
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 {
# }
|
| ︙ | ︙ | |||
1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 |
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)
}
##############################################################################
# Define the platform specific public Tcl interface. These functions are
# only available on the designated platform.
interface tclPlat
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 |
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)
}
##############################################################################
# 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 | * 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. * | | | 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.2.3 2001/04/04 21:22:17 hobbs Exp $ */ #ifndef _TCL #define _TCL /* * For C++ compilers, use extern "C" |
| ︙ | ︙ | |||
55 56 57 58 59 60 61 | * 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 | | | | 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | * 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 3 #define TCL_VERSION "8.3" #define TCL_PATCH_LEVEL "8.3.3" /* * The following definitions set up the proper options for Windows * compilers. We use this method because there is no autoconf equivalent. */ #ifndef __WIN32__ |
| ︙ | ︙ | |||
101 102 103 104 105 106 107 108 109 110 111 112 113 114 | /* * The following definitions set up the proper options for Macintosh * compilers. We use this method because there is no autoconf equivalent. */ #ifdef MAC_TCL # ifndef HAS_STDARG # define HAS_STDARG 1 # endif # ifndef USE_TCLALLOC # define USE_TCLALLOC 1 # endif # ifndef NO_STRERROR | > | 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | /* * 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 | * macro STATIC_BUILD should be defined. */ #ifdef STATIC_BUILD # define DLLIMPORT # define DLLEXPORT #else | | | 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 | * macro STATIC_BUILD should be defined. */ #ifdef STATIC_BUILD # define DLLIMPORT # define DLLEXPORT #else # 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 | * 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 | | | 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 | * 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. */ #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 | 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; /* * 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. */ | > | 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 | 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. */ |
| ︙ | ︙ | |||
1136 1137 1138 1139 1140 1141 1142 | /* * Bits passed to Tcl_DriverClose2Proc to indicate which side of a channel * should be closed. */ #define TCL_CLOSE_READ (1<<1) | | > > > > > > > | 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 | /* * 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) /* * 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 | 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)); /* * 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. */ | > > > > | 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 | 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 |
/*
* 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.
*/
typedef struct Tcl_ChannelType {
char *typeName; /* The name of the channel type in Tcl
| > > > | | < < | | | | | | | | | | | | > > > > > > > > > > > | | | 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 |
/*
* 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. */
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. */
Tcl_DriverInputProc *inputProc; /* Procedure to call for input
* on channel. */
Tcl_DriverOutputProc *outputProc; /* Procedure to call for output
* on channel. */
Tcl_DriverSeekProc *seekProc; /* Procedure to call to seek
* on the channel. May be NULL. */
Tcl_DriverSetOptionProc *setOptionProc;
/* Set an option on a channel. */
Tcl_DriverGetOptionProc *getOptionProc;
/* Get an option from a channel. */
Tcl_DriverWatchProc *watchProc; /* Set up the notifier to watch
* 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
* 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
* mode. */
/*
* Enum for different types of file paths.
*/
typedef enum Tcl_PathType {
|
| ︙ | ︙ |
Changes to generic/tclCkalloc.c.
| ︙ | ︙ | |||
9 10 11 12 13 14 15 | * 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 * | | | 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.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 |
#ifdef TCL_MEM_DEBUG
Tcl_MutexLock(ckallocMutexPtr);
if (tclMemDumpFileName != NULL) {
Tcl_DumpActiveMemory(tclMemDumpFileName);
}
if (curTagPtr != NULL) {
TclpFree((char *) curTagPtr);
}
allocHead = NULL;
Tcl_MutexUnlock(ckallocMutexPtr);
#endif
#if USE_TCLALLOC
TclFinalizeAllocSubsystem();
#endif
}
| > | 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 | /* * 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. * | | | 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.2.1 2000/08/07 21:30:56 hobbs Exp $ */ #include "tcl.h" #include "tclInt.h" #include "tclPort.h" /* |
| ︙ | ︙ | |||
254 255 256 257 258 259 260 |
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;
| | | 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, uniBuffer;
int bufSize;
char *p;
int result;
time_t tclockVal;
#ifndef HAVE_TM_ZONE
int savedTimeZone = 0; /* lint. */
char *savedTZEnv = NULL; /* lint. */
|
| ︙ | ︙ | |||
356 357 358 359 360 361 362 |
* format string is above.
*/
Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
"bad format string \"", format, "\"", (char *) NULL);
return TCL_ERROR;
}
| > > > > > > > | > > | 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 |
* 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), uniBuffer.string, -1);
Tcl_DStringFree(&uniBuffer);
Tcl_DStringFree(&buffer);
return TCL_OK;
}
|
Changes to generic/tclCmdIL.c.
| ︙ | ︙ | |||
10 11 12 13 14 15 16 | * 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. * | | | 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.2.2 2001/07/16 23:14:13 hobbs Exp $ */ #include "tclInt.h" #include "tclPort.h" #include "tclCompile.h" #include "tclRegexp.h" |
| ︙ | ︙ | |||
1502 1503 1504 1505 1506 1507 1508 |
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);
| < < < < < < < < > > > > > > > > | 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 |
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);
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 |
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. */
{
| | < > > > > > > | > > > | < | < < < < < < < < < < < < < < < < < < < < < < < | | | < > > > | < | < | 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 |
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;
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], /*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".
*/
listPtr = objv[1];
isDuplicate = 0;
if (Tcl_IsShared(listPtr)) {
listPtr = Tcl_DuplicateObj(listPtr);
isDuplicate = 1;
}
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.
*/
Tcl_SetObjResult(interp, listPtr);
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
* Tcl_ListObjCmd --
|
| ︙ | ︙ | |||
2302 2303 2304 2305 2306 2307 2308 |
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;
| | < < < < < < < < < < < < < | < < < < | > > | < | < | < | > > > > > > > > | < | < > > > > > > > > > > > > > > | | 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 |
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 isDuplicate, first, last, listLen, numToDelete, result;
if (objc < 4) {
Tcl_WrongNumArgs(interp, 1, objv,
"list first last ?element element ...?");
return TCL_ERROR;
}
result = Tcl_ListObjLength(interp, objv[1], &listLen);
if (result != TCL_OK) {
return result;
}
/*
* 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], /*end*/ (listLen - 1), &first);
if (result != TCL_OK) {
return result;
}
result = TclGetIntForIndex(interp, objv[3], /*end*/ (listLen - 1), &last);
if (result != TCL_OK) {
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)) {
Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
"list doesn't contain element ",
Tcl_GetString(objv[2]), (int *) NULL);
return TCL_ERROR;
}
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 */
}
return result;
}
/*
* Set the interpreter's object result.
*/
Tcl_SetObjResult(interp, listPtr);
|
| ︙ | ︙ | |||
2574 2575 2576 2577 2578 2579 2580 |
-1);
return TCL_ERROR;
}
if (TclGetIntForIndex(interp, objv[i+1], -2, &sortInfo.index)
!= TCL_OK) {
return TCL_ERROR;
}
| < | 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 |
-1);
return TCL_ERROR;
}
if (TclGetIntForIndex(interp, objv[i+1], -2, &sortInfo.index)
!= TCL_OK) {
return TCL_ERROR;
}
i++;
break;
case 6: /* -integer */
sortInfo.sortMode = SORTMODE_INTEGER;
break;
case 7: /* -real */
sortInfo.sortMode = SORTMODE_REAL;
|
| ︙ | ︙ | |||
2612 2613 2614 2615 2616 2617 2618 |
}
Tcl_ListObjAppendElement(interp, newCommandPtr, Tcl_NewObj());
sortInfo.compareCmdPtr = newCommandPtr;
}
sortInfo.resultCode = Tcl_ListObjGetElements(interp, objv[objc-1],
&length, &listObjPtrs);
| | < < < | 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 |
}
Tcl_ListObjAppendElement(interp, newCommandPtr, Tcl_NewObj());
sortInfo.compareCmdPtr = newCommandPtr;
}
sortInfo.resultCode = Tcl_ListObjGetElements(interp, objv[objc-1],
&length, &listObjPtrs);
if (sortInfo.resultCode != TCL_OK || length <= 0) {
goto done;
}
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;
|
| ︙ | ︙ |
Changes to generic/tclCmdMZ.c.
| ︙ | ︙ | |||
9 10 11 12 13 14 15 | * 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. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | * 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. * * 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.2.2 2001/08/07 00:51:12 hobbs Exp $ */ #include "tclInt.h" #include "tclPort.h" #include "tclCompile.h" #include "tclRegexp.h" |
| ︙ | ︙ | |||
145 146 147 148 149 150 151 |
indices = 0;
about = 0;
cflags = TCL_REG_ADVANCED;
eflags = 0;
offset = 0;
all = 0;
doinline = 0;
| | | 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
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 |
* 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;
}
regExpr = Tcl_GetRegExpFromObj(interp, objv[0], cflags);
if (regExpr == NULL) {
return TCL_ERROR;
}
| > > > > > > > > < | 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 |
* 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;
}
if (about) {
if (TclRegAbout(interp, regExpr) < 0) {
return TCL_ERROR;
}
return TCL_OK;
}
|
| ︙ | ︙ | |||
270 271 272 273 274 275 276 |
* 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;
}
| < < < < < < | 277 278 279 280 281 282 283 284 285 286 287 288 289 290 |
* 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;
}
/*
* 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.
*/
|
| ︙ | ︙ | |||
398 399 400 401 402 403 404 405 406 407 408 409 410 411 |
* length of the match is 0, so offset never changes).
*/
if (info.matches[0].end == 0) {
offset++;
}
offset += info.matches[0].end;
all++;
if (offset >= stringLength) {
break;
}
}
/*
* Set the interpreter's object result to an integer object
| > | 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 |
* 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 |
Tcl_WrongNumArgs(interp, 1, objv,
"?switches? exp string subSpec varName");
return TCL_ERROR;
}
objv += i;
regExpr = Tcl_GetRegExpFromObj(interp, objv[0], cflags);
if (regExpr == NULL) {
return TCL_ERROR;
}
result = TCL_OK;
resultPtr = Tcl_NewObj();
Tcl_IncrRefCount(resultPtr);
| > > > > > > > > > > > < < < < < < | 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 |
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);
/*
* 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 |
listPtr = Tcl_GetObjResult(interp);
if (stringLen == 0) {
/*
* Do nothing.
*/
} else if (splitCharLen == 0) {
/*
* Handle the special case of splitting on every character.
*/
for ( ; string < end; string += len) {
len = Tcl_UtfToUniChar(string, &ch);
| > > > > > > > > > > > > > | > > > > > > | 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 |
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);
/* 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 |
"?-nocase? ?-length int? string1 string2");
return TCL_ERROR;
}
for (i = 2; i < objc-2; i++) {
string2 = Tcl_GetStringFromObj(objv[i], &length2);
if ((length2 > 1)
| | | | 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 |
"?-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) {
nocase = 1;
} else if ((length2 > 1)
&& 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;
}
|
| ︙ | ︙ | |||
1197 1198 1199 1200 1201 1202 1203 |
* 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) {
| < > | | > | | | 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 |
* 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);
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);
}
} else {
string1 = Tcl_GetStringFromObj(objv[2], &length1);
/*
* convert to Unicode internal rep to calulate what
* 'end' really means.
*/
length2 = Tcl_GetCharLength(objv[2]);
if (TclGetIntForIndex(interp, objv[3], length2 - 1,
&index) != TCL_OK) {
return TCL_ERROR;
}
if ((index >= 0) && (index < length2)) {
unichar = Tcl_GetUniChar(objv[2], index);
length2 = Tcl_UniCharToUtf((int)unichar, buf);
|
| ︙ | ︙ | |||
1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 |
return TCL_ERROR;
}
if (mapElemc == 0) {
/*
* empty charMap, just return whatever string was given
*/
Tcl_SetObjResult(interp, objv[objc-1]);
} 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;
}
| > | 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 |
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;
}
|
| ︙ | ︙ |
Changes to generic/tclDate.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * 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. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* * 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.2.1 2000/08/07 21:30:36 hobbs Exp $ */ #include "tclInt.h" #include "tclPort.h" #ifdef MAC_TCL # define EPOCH 1904 |
| ︙ | ︙ | |||
923 924 925 926 927 928 929 |
0, -1,
-2, 0,
};
# define YYNPROD 56
# define YYLAST 261
static CONST TclDatetabelem TclDateact[]={
| | | | | | | | | | | | | | | | | | | | | | | | | | > | | | | | < | | | | | | | | | | | | | | | | | | | 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 |
0, -1,
-2, 0,
};
# define YYNPROD 56
# define YYLAST 261
static CONST TclDatetabelem TclDateact[]={
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, 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, 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, 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, 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,
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 };
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, 5, 2, 7, 5, 5, 7, 3, 3, 3,
3, 3, 3, 3, 1, 3 };
static CONST TclDatetabelem TclDatechk[]={
-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, 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 | "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", | > > | | | | | < < | 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 | "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", "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", "number : tUNUMBER", "o_merid : /* empty */", "o_merid : tMERIDIAN", }; #endif /* YYDEBUG */ /* * Copyright (c) 1993 by Sun Microsystems, Inc. |
| ︙ | ︙ | |||
1808 1809 1810 1811 1812 1813 1814 |
*/
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;
| | > > > > | > | | | | | | | | < < | 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 |
*/
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:{
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 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 | /* * 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. * | | | 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.2.1 2000/07/27 01:39:15 hobbs Exp $ */ #ifndef _TCLDECLS #define _TCLDECLS /* * WARNING: This file is automatically generated by the tools/genStubs.tcl |
| ︙ | ︙ | |||
905 906 907 908 909 910 911 | 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 */ | | | 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 | 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 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 */ /* Slot 285 is reserved */ /* 286 */ EXTERN void Tcl_AppendObjToObj _ANSI_ARGS_((Tcl_Obj * objPtr, |
| ︙ | ︙ | |||
1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 |
/* 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));
typedef struct TclStubHooks {
struct TclPlatStubs *tclPlatStubs;
struct TclIntStubs *tclIntStubs;
struct TclIntPlatStubs *tclIntPlatStubs;
} TclStubHooks;
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 |
/* 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 |
#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 */
| | | 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 |
#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 */
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 *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 */
|
| ︙ | ︙ | |||
1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 |
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 */
} TclStubs;
#ifdef __cplusplus
extern "C" {
#endif
extern TclStubs *tclStubsPtr;
#ifdef __cplusplus
| > > > > > > > > > > > > > > > > > > | 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 |
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
|
| ︙ | ︙ | |||
3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 | #define Tcl_MutexFinalize \ (tclStubsPtr->tcl_MutexFinalize) /* 392 */ #endif #ifndef Tcl_CreateThread #define Tcl_CreateThread \ (tclStubsPtr->tcl_CreateThread) /* 393 */ #endif #endif /* defined(USE_TCL_STUBS) && !defined(USE_TCL_STUB_PROCS) */ /* !END!: Do not edit above this line. */ #endif /* _TCLDECLS */ | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 | #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 | /* * 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. * | | | 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.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 |
char *line;
int i, hi, lo, numPages, symbol, fallback;
unsigned char used[256];
unsigned int size;
TableEncodingData *dataPtr;
unsigned short *pageMemPtr;
Tcl_EncodingType encType;
| | > > > > > > > > | | > > > > > > > > > > > < < | 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;
/*
* 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, /* 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 */
};
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 |
}
for (i = 0; i < numPages; i++) {
int ch;
char *p;
Tcl_ReadChars(chan, objPtr, 3 + 16 * (16 * 4 + 1), 0);
p = Tcl_GetString(objPtr);
| | | | | 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 = (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 = (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 |
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);
| < | 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 | * * 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. * | | | 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.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 |
*/
void
TclUnsetEnv(name)
CONST char *name; /* Name of variable to remove (UTF-8). */
{
char *oldValue;
| | > | 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;
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 | /* * 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. * | | | 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.2.1 2001/04/03 22:54:37 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 |
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;
/*
* 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));
| > > > > > | 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 |
if (pathPtr != NULL) {
Tcl_IncrRefCount(pathPtr);
}
if (tsdPtr->tclLibraryPath != NULL) {
Tcl_DecrRefCount(tsdPtr->tclLibraryPath);
}
tsdPtr->tclLibraryPath = pathPtr;
}
/*
*-------------------------------------------------------------------------
*
* TclGetLibraryPath --
*
| > > > > > > | 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 |
*-------------------------------------------------------------------------
*/
Tcl_Obj *
TclGetLibraryPath()
{
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
return tsdPtr->tclLibraryPath;
}
/*
*-------------------------------------------------------------------------
*
* TclInitSubsystems --
| > > > > > > > > > > > | 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 |
void
Tcl_Finalize()
{
ExitHandler *exitPtr;
ThreadSpecificData *tsdPtr;
TclpInitLock();
| < > > | 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();
if (subsystemsInitialized != 0) {
subsystemsInitialized = 0;
tsdPtr = TCL_TSD_INIT(&dataKey);
/*
* Invoke exit handlers first.
*/
Tcl_MutexLock(&exitMutex);
inFinalize = 1;
|
| ︙ | ︙ |
Changes to generic/tclExecute.c.
1 2 3 4 5 6 7 8 9 10 11 | /* * tclExecute.c -- * * This file contains procedures that execute byte-compiled Tcl * commands. * * 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. * | > | | 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.2.2 2001/08/07 15:41:20 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 |
#ifdef TCL_COMPILE_DEBUG
static char *resultStrings[] = {
"TCL_OK", "TCL_ERROR", "TCL_RETURN", "TCL_BREAK", "TCL_CONTINUE"
};
#endif
/*
* 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))
| > > > > > > > > > > > | 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 |
*----------------------------------------------------------------------
*/
void
TclDeleteExecEnv(eePtr)
ExecEnv *eePtr; /* Execution environment to free. */
{
| | | 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 |
*----------------------------------------------------------------------
*/
void
TclDeleteExecEnv(eePtr)
ExecEnv *eePtr; /* Execution environment to free. */
{
Tcl_EventuallyFree((ClientData)eePtr->stackPtr, TCL_DYNAMIC);
ckfree((char *) eePtr);
}
/*
*----------------------------------------------------------------------
*
* TclFinalizeExecution --
|
| ︙ | ︙ | |||
491 492 493 494 495 496 497 |
/*
* 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);
| | | 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);
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 |
* 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) {
| > > > > | | | 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",
(unsigned int)(pc - codePtr->codeStart),
(unsigned int) stackTop,
(unsigned int) initStackTop);
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 |
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. */
#ifdef TCL_COMPILE_DEBUG
int isUnknownCmd = 0;
char cmdNameBuf[21];
#endif /* TCL_COMPILE_DEBUG */
| > > > > | | | | 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 |
for (i = objc-1; i >= 0; i--) {
objv[i+1] = objv[i];
}
objc++;
objv[0] = Tcl_NewStringObj("unknown", -1);
Tcl_IncrRefCount(objv[0]);
}
| | > > > > > > > > > > > > | | | | 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 |
result = (*cmdPtr->objProc)(cmdPtr->objClientData, interp,
objc, objv);
if (Tcl_AsyncReady()) {
result = Tcl_AsyncInvoke(interp, result);
}
CACHE_STACK_INFO();
/*
* 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.
*/
| > > > > > > > > | 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 |
}
ADJUST_PC(1);
case INST_UMINUS:
case INST_LNOT:
{
/*
| | > | | | > | > | > > > > > | | | 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 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) || (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 |
}
PUSH_OBJECT(objPtr);
TclDecrRefCount(valuePtr);
} else {
/*
* valuePtr is unshared. Modify it directly.
*/
| | | 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) || (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) {
|
| ︙ | ︙ | |||
3840 3841 3842 3843 3844 3845 3846 |
* 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;
| | > > > > > > > > > > | > > > > | > | > > > > | < < < < < < < < | | < < < < | 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 |
* 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;
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. 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 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
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;
}
/*
* 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).
*/
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 |
badValue:
Tcl_DecrRefCount(valuePtr);
DECACHE_STACK_INFO();
return TCL_ERROR;
}
/*
| | > > > > > | 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 |
badValue:
Tcl_DecrRefCount(valuePtr);
DECACHE_STACK_INFO();
return TCL_ERROR;
}
/*
* 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 |
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);
| | | 4505 4506 4507 4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 |
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 (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 |
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);
/*
* Literal table statistics.
*/
numByteCodeLits = 0;
refCountSum = 0;
numSharedMultX = 0;
| > > > > > > > > > > > > > > > > > > > > > > > | 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 |
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 |
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);
| | | 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 |
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 |
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);
}
| | | 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 |
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, " 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/tclGetDate.y.
1 2 3 4 5 6 7 8 9 10 11 12 13 | /* * 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. * | | | 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.2.1 2000/08/07 21:30:36 hobbs Exp $
*/
%{
/*
* tclDate.c --
*
* This file is generated from a yacc grammar defined in
|
| ︙ | ︙ | |||
143 144 145 146 147 148 149 | %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 | | | 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 sign tNEXT tSTARDATE
%type <Meridian> tMERIDIAN o_merid
%%
spec : /* NULL */
| spec item
;
|
| ︙ | ︙ | |||
353 354 355 356 357 358 359 |
yyDay = 1;
yyMonth = 1;
yyRelDay += (($2%1000)*(365 + IsLeapYear(yyYear)))/1000;
yyRelSeconds += $4 * 144 * 60;
}
;
| > > > > > > > | | | | | < < < | 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
;
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; }
;
number : tUNUMBER
{
if (yyHaveTime && yyHaveDate && !yyHaveRel) {
yyYear = $1;
} else {
yyHaveTime++;
|
| ︙ | ︙ |
Changes to generic/tclIO.c.
1 2 3 4 5 6 | /* * 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. * | | | | < < < < < < < | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | < < < < < < < | < < < | < < < < | | | | | | | | | > > > | > | | | | | | | | | | | | | | | > | | | | | > > | | | | | | | | | | 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-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.2.8 2001/07/18 17:17:19 andreas_kupries Exp $
*/
#include "tclInt.h"
#include "tclPort.h"
#include "tclIO.h"
#include <assert.h>
/*
* 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, indexed by ChannelState,
* as only one ChannelState exists per set of stacked channels.
*/
ChannelState *firstCSPtr;
/*
* 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 ChannelTimerProc _ANSI_ARGS_((
ClientData clientData));
static int CheckChannelErrors _ANSI_ARGS_((ChannelState *statePtr,
int direction));
static int CheckFlush _ANSI_ARGS_((Channel *chanPtr,
ChannelBuffer *bufPtr, int newlineFlag));
static int CheckForDeadChannel _ANSI_ARGS_((Tcl_Interp *interp,
ChannelState *statePtr));
static void CheckForStdChannelsBeingClosed _ANSI_ARGS_((
Tcl_Channel chan));
static void CleanupChannelHandlers _ANSI_ARGS_((
Tcl_Interp *interp, Channel *chanPtr));
static int CloseChannel _ANSI_ARGS_((Tcl_Interp *interp,
Channel *chanPtr, int errorCode));
static void CommonGetsCleanup _ANSI_ARGS_((Channel *chanPtr,
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));
static int CopyData _ANSI_ARGS_((CopyState *csPtr, int mask));
static void CopyEventProc _ANSI_ARGS_((ClientData clientData,
int mask));
static void CreateScriptRecord _ANSI_ARGS_((
Tcl_Interp *interp, Channel *chanPtr,
int mask, Tcl_Obj *scriptPtr));
static void DeleteChannelTable _ANSI_ARGS_((
ClientData clientData, Tcl_Interp *interp));
static void DeleteScriptRecord _ANSI_ARGS_((Tcl_Interp *interp,
Channel *chanPtr, int mask));
static void DiscardInputQueued _ANSI_ARGS_((ChannelState *statePtr,
int discardSavedBuffers));
static void DiscardOutputQueued _ANSI_ARGS_((
ChannelState *chanPtr));
static int DoRead _ANSI_ARGS_((Channel *chanPtr, char *srcPtr,
int slen));
static int DoWrite _ANSI_ARGS_((Channel *chanPtr, char *src,
int srcLen));
static int FilterInputBytes _ANSI_ARGS_((Channel *chanPtr,
GetsState *statePtr));
static int FlushChannel _ANSI_ARGS_((Tcl_Interp *interp,
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_((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));
static void StopCopy _ANSI_ARGS_((CopyState *csPtr));
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));
static int WriteChars _ANSI_ARGS_((Channel *chanPtr,
CONST char *src, int srcLen));
/*
*---------------------------------------------------------------------------
*
* TclInitIOSubsystem --
*
|
| ︙ | ︙ | |||
518 519 520 521 522 523 524 |
/* ARGSUSED */
void
TclFinalizeIOSubsystem()
{
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
Channel *chanPtr; /* Iterates over open channels. */
| | | | | | > | | | 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. */
ChannelState *nextCSPtr; /* Iterates over open channels. */
ChannelState *statePtr; /* state of channel stack */
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.
*/
statePtr->refCount--;
}
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 |
* 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;
| | | 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;
statePtr->flags |= CHANNEL_DEAD;
}
}
}
/*
*----------------------------------------------------------------------
|
| ︙ | ︙ | |||
733 734 735 736 737 738 739 |
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. */
{
| | | | | | 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. */
{
ChannelState *statePtr;
CloseCallback *cbPtr;
statePtr = ((Channel *) chan)->state;
cbPtr = (CloseCallback *) ckalloc((unsigned) sizeof(CloseCallback));
cbPtr->proc = proc;
cbPtr->clientData = clientData;
cbPtr->nextPtr = statePtr->closeCbPtr;
statePtr->closeCbPtr = cbPtr;
}
/*
*----------------------------------------------------------------------
*
* Tcl_DeleteCloseHandler --
*
|
| ︙ | ︙ | |||
774 775 776 777 778 779 780 |
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. */
{
| | | | | | | | 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. */
{
ChannelState *statePtr;
CloseCallback *cbPtr, *cbPrevPtr;
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) {
statePtr->closeCbPtr = cbPtr->nextPtr;
}
ckfree((char *) cbPtr);
break;
} else {
cbPrevPtr = cbPtr;
}
}
|
| ︙ | ︙ | |||
883 884 885 886 887 888 889 |
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. */
| | > | | | > | | | | | | | | | 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. */
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)) {
chanPtr = (Channel *) Tcl_GetHashValue(hPtr);
statePtr = chanPtr->state;
/*
* Remove any fileevents registered in this interpreter.
*/
for (sPtr = statePtr->scriptRecordPtr,
prevPtr = (EventScriptRecord *) NULL;
sPtr != (EventScriptRecord *) NULL;
sPtr = nextPtr) {
nextPtr = sPtr->nextPtr;
if (sPtr->interp == interp) {
if (prevPtr == (EventScriptRecord *) NULL) {
statePtr->scriptRecordPtr = nextPtr;
} else {
prevPtr->nextPtr = nextPtr;
}
Tcl_DeleteChannelHandler((Tcl_Channel) chanPtr,
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);
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 |
*----------------------------------------------------------------------
*/
static void
CheckForStdChannelsBeingClosed(chan)
Tcl_Channel chan;
{
| | | | | > | | | > | | | 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;
{
ChannelState *statePtr = ((Channel *) chan)->state;
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
if ((chan == tsdPtr->stdinChannel) && (tsdPtr->stdinInitialized)) {
if (statePtr->refCount < 2) {
statePtr->refCount = 0;
tsdPtr->stdinChannel = NULL;
return;
}
} 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 (statePtr->refCount < 2) {
statePtr->refCount = 0;
tsdPtr->stderrChannel = NULL;
return;
}
}
}
/*
|
| ︙ | ︙ | |||
1024 1025 1026 1027 1028 1029 1030 1031 |
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. */
| > > > > > > | > | | < < < < < < < < < < < < < | | | 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)->state->bottomChanPtr;
statePtr = chanPtr->state;
if (statePtr->channelName == (char *) NULL) {
panic("Tcl_RegisterChannel: channel without name");
}
if (interp != (Tcl_Interp *) NULL) {
hTblPtr = GetChannelTable(interp);
hPtr = Tcl_CreateHashEntry(hTblPtr, statePtr->channelName, &new);
if (new == 0) {
if (chan == (Tcl_Channel) Tcl_GetHashValue(hPtr)) {
return;
}
panic("Tcl_RegisterChannel: duplicate channel names");
}
Tcl_SetHashValue(hPtr, (ClientData) chanPtr);
}
statePtr->refCount++;
}
/*
*----------------------------------------------------------------------
*
* Tcl_UnregisterChannel --
*
|
| ︙ | ︙ | |||
1084 1085 1086 1087 1088 1089 1090 1091 |
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. */
| > > > > > > | > | | | | | | | | | | | 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)->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, 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);
}
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 (statePtr->refCount <= 0) {
/*
* Ensure that if there is another buffer, it gets flushed
* whether or not we are doing a background flush.
*/
if ((statePtr->curOutPtr != NULL) &&
(statePtr->curOutPtr->nextAdded >
statePtr->curOutPtr->nextRemoved)) {
statePtr->flags |= BUFFER_READY;
}
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 |
* have access to the standard channels.
*/
name = chanName;
if ((chanName[0] == 's') && (chanName[1] == 't')) {
chanPtr = NULL;
if (strcmp(chanName, "stdin") == 0) {
| | | | | | > > > > > > > | | 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);
} else if (strcmp(chanName, "stdout") == 0) {
chanPtr = (Channel *) Tcl_GetStdChannel(TCL_STDOUT);
} else if (strcmp(chanName, "stderr") == 0) {
chanPtr = (Channel *) Tcl_GetStdChannel(TCL_STDERR);
}
if (chanPtr != NULL) {
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->state->flags & (TCL_READABLE|TCL_WRITABLE));
}
return (Tcl_Channel) chanPtr;
}
/*
*----------------------------------------------------------------------
|
| ︙ | ︙ | |||
1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 |
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. */
CONST char *name;
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
| > > > > > > > > > > > > > > | > > | > > > > > > > > | | | | | | | | | | | | | | < < | | | | | | | | | | | | | | < | | | | > > > > > > > > > > | | | > | | > | | > | | 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));
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) {
statePtr->channelName = ckalloc((unsigned) (strlen(chanName) + 1));
strcpy(statePtr->channelName, chanName);
} else {
panic("Tcl_CreateChannel: NULL channel name");
}
statePtr->flags = mask;
/*
* Set the channel to system default encoding.
*/
statePtr->encoding = NULL;
name = Tcl_GetEncodingName(NULL);
if (strcmp(name, "binary") != 0) {
statePtr->encoding = Tcl_GetEncoding(NULL, name);
}
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.
*/
statePtr->inputTranslation = TCL_TRANSLATE_AUTO;
statePtr->outputTranslation = TCL_PLATFORM_TRANSLATION;
statePtr->inEofChar = 0;
statePtr->outEofChar = 0;
statePtr->unreportedError = 0;
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;
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.
*/
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);
Tcl_RegisterChannel((Tcl_Interp *) NULL, (Tcl_Channel) chanPtr);
} 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);
Tcl_RegisterChannel((Tcl_Interp *) NULL, (Tcl_Channel) chanPtr);
}
return (Tcl_Channel) chanPtr;
}
/*
*----------------------------------------------------------------------
|
| ︙ | ︙ | |||
1375 1376 1377 1378 1379 1380 1381 | * replaced by the new typePtr. * *---------------------------------------------------------------------- */ Tcl_Channel Tcl_StackChannel(interp, typePtr, instanceData, mask, prevChan) | | | | | | | | < < < < < < | > < < < < < < < < < | < < | > | | < | < | < > > > > | > > > > > > | > > > > > > > > > > > > > > > | > > > > > > > > > > | > > > > > > | > > > | | | | > > > < < < < < < < < < < < < < < < < | < < < < < < < < < < < < < < | | < < | | < < < < | | < < < < < < < < | < < | < < < < | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < > > | | | > > > | > > > | > | | < < < < < < < < < < < < > | < < < > > > | < | < < < < < | | < < > | > > | | < > | < < < | | < < < | < < < < < < < < < < < < < < | < < > | < < < < > | < < > | > | | | < < < | > > > > < < < < | < < < < | < < | < < | < < < < < | < < < > > | < < > | < < > | < < > | | > > < < < < < | < < < < < | < < < < < | | < | > | < | < < > < < | < | < < < | < | > > > | > | | | > | | > > > | | > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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_ChannelType *typePtr; /* The channel type record for the new
* channel. */
ClientData instanceData; /* Instance specific data for the new
* channel. */
int mask; /* TCL_READABLE & TCL_WRITABLE to indicate
* if the channel is readable, writable. */
Tcl_Channel prevChan; /* The channel structure to replace */
{
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
Channel *chanPtr, *prevChanPtr;
ChannelState *statePtr;
/*
* Find the given channel in the list of all channels.
* If we don't find it, then it was never registered correctly.
*
* This operation should occur at the top of a channel stack.
*/
statePtr = (ChannelState *) tsdPtr->firstCSPtr;
prevChanPtr = ((Channel *) prevChan)->state->topChanPtr;
while (statePtr->topChanPtr != prevChanPtr) {
statePtr = statePtr->nextCSPtr;
}
if (statePtr == NULL) {
Tcl_AppendResult(interp, "couldn't find state for channel \"",
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 \"",
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.
*/
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
* 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.
*/
statePtr->inQueueTail->nextPtr = prevChanPtr->inQueueHead;
prevChanPtr->inQueueHead = statePtr->inQueueHead;
if (prevChanPtr->inQueueTail == (ChannelBuffer*) NULL) {
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:
*/
chanPtr->state = statePtr;
chanPtr->instanceData = instanceData;
chanPtr->typePtr = typePtr;
chanPtr->downChanPtr = prevChanPtr;
chanPtr->upChanPtr = (Channel *) NULL;
chanPtr->inQueueHead = (ChannelBuffer*) NULL;
chanPtr->inQueueTail = (ChannelBuffer*) NULL;
/*
* Place new block at the head of a possibly existing list of previously
* stacked channels.
*/
prevChanPtr->upChanPtr = chanPtr;
statePtr->topChanPtr = chanPtr;
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'.
*
* Results:
* A standard Tcl result.
*
* Side effects:
* If TCL_ERROR is returned, the posix error code will be set
* with Tcl_SetErrno.
*
*----------------------------------------------------------------------
*/
int
Tcl_UnstackChannel (interp, chan)
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;
/*
* This operation should occur at the top of a channel stack.
*/
chanPtr = statePtr->topChanPtr;
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;
/*
* Flush the buffers. This ensures that any data still in them
* at this time _is_ handled by the transformation we are unstacking
* right now. Restrict this to writable channels. Take care to hide
* a possible bg-copy in progress from Tcl_Flush and the
* CheckForChannelErrors inside.
*/
if (statePtr->flags & TCL_WRITABLE) {
CopyState* csPtr;
csPtr = statePtr->csPtr;
statePtr->csPtr = (CopyState*) 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);
return TCL_ERROR;
}
statePtr->csPtr = csPtr;
}
/*
* Anything in the input queue and the push-back buffers of
* the transformation going away is transformed data, but not
* yet read. As unstacking means that the caller does not want
* to see transformed data any more we have to discard these
* 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.
*/
if (((statePtr->flags & TCL_READABLE) != 0) &&
((statePtr->inQueueHead != (ChannelBuffer*) NULL) ||
(chanPtr->inQueueHead != (ChannelBuffer*) NULL))) {
if ((statePtr->inQueueHead != (ChannelBuffer*) NULL) &&
(chanPtr->inQueueHead != (ChannelBuffer*) NULL)) {
statePtr->inQueueTail->nextPtr = chanPtr->inQueueHead;
statePtr->inQueueTail = chanPtr->inQueueTail;
statePtr->inQueueHead = statePtr->inQueueTail;
} else if (chanPtr->inQueueHead != (ChannelBuffer*) NULL) {
statePtr->inQueueHead = chanPtr->inQueueHead;
statePtr->inQueueTail = chanPtr->inQueueTail;
}
chanPtr->inQueueHead = (ChannelBuffer*) NULL;
chanPtr->inQueueTail = (ChannelBuffer*) NULL;
DiscardInputQueued (statePtr, 0);
}
statePtr->topChanPtr = downChanPtr;
downChanPtr->upChanPtr = (Channel *) NULL;
/*
* Leave this link intact for closeproc
* chanPtr->downChanPtr = (Channel *) NULL;
*/
/*
* 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);
}
chanPtr->typePtr = NULL;
/*
* AK: Tcl_NotifyChannel may hold a reference to this block of memory
*/
Tcl_EventuallyFree((ClientData) chanPtr, TCL_DYNAMIC);
UpdateInterest(downChanPtr);
if (result != 0) {
Tcl_SetErrno(result);
return TCL_ERROR;
}
} else {
/*
* This channel does not cover another one.
* Simply do a close, if necessary.
*/
if (statePtr->refCount <= 0) {
if (Tcl_Close(interp, chan) != TCL_OK) {
return TCL_ERROR;
}
}
}
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
* Tcl_GetStackedChannel --
*
* 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; /* 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 |
*/
int
Tcl_GetChannelMode(chan)
Tcl_Channel chan; /* The channel for which the mode is
* being computed. */
{
| > | < | | 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;
/* State of actual channel. */
return (statePtr->flags & (TCL_READABLE | TCL_WRITABLE));
}
/*
*----------------------------------------------------------------------
*
* Tcl_GetChannelName --
*
|
| ︙ | ︙ | |||
1914 1915 1916 1917 1918 1919 1920 |
*----------------------------------------------------------------------
*/
char *
Tcl_GetChannelName(chan)
Tcl_Channel chan; /* The channel for which to return the name. */
{
| | | | < < < < < < < < < < < < < < < < < < < < < < < < < < | 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. */
{
ChannelState *statePtr; /* State of actual channel. */
statePtr = ((Channel *) chan)->state;
return statePtr->channelName;
}
/*
*----------------------------------------------------------------------
*
* Tcl_GetChannelHandle --
*
|
| ︙ | ︙ | |||
1973 1974 1975 1976 1977 1978 1979 |
int direction; /* TCL_WRITABLE or TCL_READABLE. */
ClientData *handlePtr; /* Where to store handle */
{
Channel *chanPtr; /* The actual channel. */
ClientData handle;
int result;
| | < < < < < < < < < < < < < < < < < < < < < < < < < < | 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)->state->bottomChanPtr;
result = (chanPtr->typePtr->getHandleProc)(chanPtr->instanceData,
direction, &handle);
if (handlePtr) {
*handlePtr = handle;
}
return result;
}
/*
*---------------------------------------------------------------------------
*
* AllocChannelBuffer --
*
* A channel buffer has BUFFER_PADDING bytes extra at beginning to
|
| ︙ | ︙ | |||
2070 2071 2072 2073 2074 2075 2076 | * Side effects: * May free a buffer to the OS. * *---------------------------------------------------------------------- */ static void | | | | > > > > > > > > > > > | | | | | | | | | | | 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(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 (statePtr->flags & TCL_READABLE) {
if (statePtr->inQueueHead == (ChannelBuffer *) NULL) {
statePtr->inQueueHead = bufPtr;
statePtr->inQueueTail = bufPtr;
goto keepit;
}
if (statePtr->saveInBufPtr == (ChannelBuffer *) NULL) {
statePtr->saveInBufPtr = bufPtr;
goto keepit;
}
}
/*
* Only save buffers for the output queue if the channel is writable.
*/
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:
bufPtr->nextRemoved = BUFFER_PADDING;
bufPtr->nextAdded = BUFFER_PADDING;
bufPtr->nextPtr = (ChannelBuffer *) NULL;
}
/*
*----------------------------------------------------------------------
|
| ︙ | ︙ | |||
2142 2143 2144 2145 2146 2147 2148 | * Side effects: * Recycles buffers. * *---------------------------------------------------------------------- */ static void | | | | | | | | | | | | | | | 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(statePtr)
ChannelState *statePtr; /* ChannelState for which to discard output. */
{
ChannelBuffer *bufPtr;
while (statePtr->outQueueHead != (ChannelBuffer *) NULL) {
bufPtr = statePtr->outQueueHead;
statePtr->outQueueHead = bufPtr->nextPtr;
RecycleBuffer(statePtr, bufPtr, 0);
}
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, statePtr)
Tcl_Interp *interp; /* For error reporting (can be NULL) */
ChannelState *statePtr; /* The channel state to check. */
{
if (statePtr->flags & CHANNEL_DEAD) {
Tcl_SetErrno(EINVAL);
if (interp) {
Tcl_AppendResult(interp,
"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 |
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. */
{
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.
*/
| > > | | | | | | | | | | | | | | | | | | 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, 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 (((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 {
statePtr->outQueueTail->nextPtr = statePtr->curOutPtr;
}
statePtr->outQueueTail = statePtr->curOutPtr;
statePtr->curOutPtr = (ChannelBuffer *) NULL;
}
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) &&
(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 |
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)
*/
| | | | | | | | | | | | | | | | | | | | | < > > > > > > > | > | | > > | | | | | | | | < < < < < < < < < < | | | < | | | | | | > > > > > > > | | > | > | | | > | | > | | | < < < < < < < < < < < < < < < < < < < < < < < < < | < < < < < < < < < < < | > > > > > > > > > > > > > > > > > > > | 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 (!(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 (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(statePtr);
continue;
} else {
wroteSome = 1;
}
bufPtr->nextRemoved += written;
/*
* If this buffer is now empty, recycle it.
*/
if (bufPtr->nextRemoved == bufPtr->nextAdded) {
statePtr->outQueueHead = bufPtr->nextPtr;
if (statePtr->outQueueHead == (ChannelBuffer *) NULL) {
statePtr->outQueueTail = (ChannelBuffer *) NULL;
}
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 (statePtr->flags & BG_FLUSH_SCHEDULED) {
if (wroteSome) {
return errorCode;
} else if (statePtr->outQueueHead == (ChannelBuffer *) NULL) {
statePtr->flags &= (~(BG_FLUSH_SCHEDULED));
(chanPtr->typePtr->watchProc)(chanPtr->instanceData,
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 ((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 associated 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:
* 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. */
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(statePtr, 1);
/*
* Discard a leftover buffer in the current output buffer field.
*/
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 (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 ((statePtr->outEofChar != 0) && (statePtr->flags & TCL_WRITABLE)) {
int dummy;
char c;
c = (char) statePtr->outEofChar;
(chanPtr->typePtr->outputProc) (chanPtr->instanceData, &c, 1, &dummy);
}
/*
* Splice this channel out of the list of all channels.
*/
if (tsdPtr->firstCSPtr && (statePtr == tsdPtr->firstCSPtr)) {
tsdPtr->firstCSPtr = statePtr->nextCSPtr;
} else {
for (prevCSPtr = tsdPtr->firstCSPtr;
prevCSPtr && (prevCSPtr->nextCSPtr != statePtr);
prevCSPtr = prevCSPtr->nextCSPtr) {
/* Empty loop body. */
}
if (prevCSPtr == (ChannelState *) NULL) {
panic("FlushChannel: damaged channel list");
}
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);
}
/*
* 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 (statePtr->unreportedError != 0) {
errorCode = statePtr->unreportedError;
}
if (errorCode == 0) {
errorCode = result;
if (errorCode != 0) {
Tcl_SetErrno(errorCode);
}
}
/*
* Cancel any outstanding 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 |
* 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. */
int result; /* Of calling FlushChannel. */
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
NextChannelHandler *nhPtr;
if (chan == (Tcl_Channel) NULL) {
return TCL_OK;
}
| > | > > > > | > > > | | | | | | | | | < | | | | | | | | | | | | | | 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;
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) {
if (nhPtr->nextHandlerPtr &&
(nhPtr->nextHandlerPtr->chanPtr == chanPtr)) {
nhPtr->nextHandlerPtr = NULL;
}
}
/*
* Remove all the channel handler records attached to the channel
* itself.
*/
for (chPtr = statePtr->chPtr;
chPtr != (ChannelHandler *) NULL;
chPtr = chNext) {
chNext = chPtr->nextPtr;
ckfree((char *) chPtr);
}
statePtr->chPtr = (ChannelHandler *) NULL;
/*
* Cancel any pending copy operation.
*/
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.
*/
statePtr->interestMask = 0;
/*
* Remove any EventScript records for this channel.
*/
for (ePtr = statePtr->scriptRecordPtr;
ePtr != (EventScriptRecord *) NULL;
ePtr = eNextPtr) {
eNextPtr = ePtr->nextPtr;
Tcl_DecrRefCount(ePtr->scriptPtr);
ckfree((char *) ePtr);
}
statePtr->scriptRecordPtr = (EventScriptRecord *) NULL;
/*
* Invoke the registered close callbacks and delete their records.
*/
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 ((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.
*/
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 |
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(). */
{
Channel *chanPtr;
| > > > > | > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 */
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 |
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(). */
{
Channel *chanPtr;
| > > > > | > > | | | 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 */
statePtr = ((Channel *) chan)->state;
chanPtr = statePtr->topChanPtr;
if (CheckChannelErrors(statePtr, TCL_WRITABLE) != 0) {
return -1;
}
if (len < 0) {
len = strlen(src);
}
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 |
*/
int
Tcl_WriteObj(chan, objPtr)
Tcl_Channel chan; /* The channel to buffer output for. */
Tcl_Obj *objPtr; /* The object to write. */
{
Channel *chanPtr;
char *src;
int srcLen;
| > > > > | > > | | | 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;
statePtr = ((Channel *) chan)->state;
chanPtr = statePtr->topChanPtr;
if (CheckChannelErrors(statePtr, TCL_WRITABLE) != 0) {
return -1;
}
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 |
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. */
{
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) {
| > | | | | 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 = statePtr->curOutPtr;
if (bufPtr == NULL) {
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 | * line-based, we will need to flush it. */ *dst++ = '\n'; dstLen--; sawLF++; } | | | 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(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 |
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. */
{
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;
| > | | | | | | | | | | 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 |
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 = statePtr->encoding;
/*
* Loop over all UTF-8 characters in src, storing them in staging buffer
* with proper EOL translation.
*/
while (srcLen + savedLF > 0) {
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(statePtr, stage, src, &stageLen, &toWrite);
stage -= savedLF;
stageLen += savedLF;
savedLF = 0;
if (stageLen > stageMax) {
savedLF = 1;
stageLen = stageMax;
}
src += toWrite;
srcLen -= toWrite;
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 = statePtr->curOutPtr;
if (bufPtr == NULL) {
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,
&statePtr->outputEncodingState, dst,
dstLen + BUFFER_PADDING, &stageRead, &dstWrote, NULL);
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 | * 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 | | | | | 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 |
* 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(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 (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 |
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. */
{
/*
* 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.
*/
| > | | | | | | | | 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 |
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 ((statePtr->flags & BUFFER_READY) == 0) {
if (bufPtr->nextAdded == bufPtr->bufLength) {
statePtr->flags |= BUFFER_READY;
} else if (statePtr->flags & CHANNEL_LINEBUFFERED) {
if (newlineFlag != 0) {
statePtr->flags |= BUFFER_READY;
}
} else if (statePtr->flags & CHANNEL_UNBUFFERED) {
statePtr->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 |
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;
| | | > > > > > | > | | | | | | 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 |
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 = (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 = statePtr->topChanPtr;
if (CheckChannelErrors(statePtr, TCL_READABLE) != 0) {
copiedTotal = -1;
goto done;
}
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 = 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 |
gs.totalChars = 0;
dst = objPtr->bytes + oldLength;
dstEnd = dst;
skip = 0;
eof = NULL;
| | | 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 |
gs.totalChars = 0;
dst = objPtr->bytes + oldLength;
dstEnd = dst;
skip = 0;
eof = NULL;
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 | /* * On EOL, leave current file position pointing after the EOL, but * don't store the EOL in the output string. */ eol = dst; | | | 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 |
/*
* On EOL, leave current file position pointing after the EOL, but
* don't store the EOL in the output string.
*/
eol = dst;
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 |
}
}
}
break;
}
case TCL_TRANSLATE_AUTO: {
skip = 1;
| | | | | 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 |
}
}
}
break;
}
case TCL_TRANSLATE_AUTO: {
skip = 1;
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, 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 |
offset = eol - objPtr->bytes;
dst = dstEnd;
PeekAhead(chanPtr, &dstEnd, &gs);
eol = objPtr->bytes + offset;
if (eol >= dstEnd) {
eol--;
| | | 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 |
offset = eol - objPtr->bytes;
dst = dstEnd;
PeekAhead(chanPtr, &dstEnd, &gs);
eol = objPtr->bytes + offset;
if (eol >= dstEnd) {
eol--;
statePtr->flags |= INPUT_SAW_CR;
goto goteol;
}
}
if (*eol == '\n') {
skip++;
}
eol--;
|
| ︙ | ︙ | |||
3596 3597 3598 3599 3600 3601 3602 | /* * 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; | | | | | 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 |
/*
* 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;
statePtr->flags |= (CHANNEL_EOF | CHANNEL_STICKY_EOF);
statePtr->inputEncodingFlags |= TCL_ENCODING_END;
}
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 |
* 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;
| | | | | | | | | | 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 |
* 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;
statePtr->inputEncodingState = gs.state;
Tcl_ExternalToUtf(NULL, gs.encoding, bufPtr->buf + bufPtr->nextRemoved,
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);
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 = statePtr->inQueueHead;
bufPtr->nextRemoved = oldRemoved;
for (bufPtr = bufPtr->nextPtr; bufPtr != NULL; bufPtr = bufPtr->nextPtr) {
bufPtr->nextRemoved = BUFFER_PADDING;
}
CommonGetsCleanup(chanPtr, encoding);
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.
*/
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 |
*/
static int
FilterInputBytes(chanPtr, gsPtr)
Channel *chanPtr; /* Channel to read. */
GetsState *gsPtr; /* Current state of gets operation. */
{
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
* at a time. Since we don't know a priori
| > | 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 |
*/
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
* at a time. Since we don't know a priori
|
| ︙ | ︙ | |||
3753 3754 3755 3756 3757 3758 3759 | /* * 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: | | | | | | 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 |
/*
* 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 (statePtr->flags & CHANNEL_BLOCKED) {
if (statePtr->flags & CHANNEL_NONBLOCKING) {
gsPtr->charsWrote = 0;
gsPtr->rawRead = 0;
return -1;
}
statePtr->flags &= ~CHANNEL_BLOCKED;
}
if (GetInput(chanPtr) != 0) {
gsPtr->charsWrote = 0;
gsPtr->rawRead = 0;
return -1;
}
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 |
}
length += TCL_UTF_MAX + 1;
Tcl_SetObjLength(objPtr, length);
spaceLeft = length - offset;
dst = objPtr->bytes + offset;
*gsPtr->dstPtr = dst;
}
| | | | | | | | 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 |
}
length += TCL_UTF_MAX + 1;
Tcl_SetObjLength(objPtr, length);
spaceLeft = length - offset;
dst = objPtr->bytes + offset;
*gsPtr->dstPtr = dst;
}
gsPtr->state = statePtr->inputEncodingState;
result = Tcl_ExternalToUtf(NULL, gsPtr->encoding, raw, rawLen,
statePtr->inputEncodingFlags, &statePtr->inputEncodingState,
dst, spaceLeft, &gsPtr->rawRead, &gsPtr->bytesWrote,
&gsPtr->charsWrote);
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 (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;
} else {
/*
* There are no more cached raw bytes left. See if we can
* get some more.
*/
goto read;
}
} else {
if (nextPtr == NULL) {
nextPtr = AllocChannelBuffer(statePtr->bufSize);
bufPtr->nextPtr = 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 |
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. */
{
ChannelBuffer *bufPtr;
Tcl_DriverBlockModeProc *blockModeProc;
int bytesLeft;
bufPtr = gsPtr->bufPtr;
/*
| > | 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 |
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 |
if (bufPtr->nextAdded < bufPtr->bufLength) {
/*
* Don't peek ahead if last read was short read.
*/
goto cleanup;
}
| | | | | | 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 |
if (bufPtr->nextAdded < bufPtr->bufLength) {
/*
* Don't peek ahead if last read was short read.
*/
goto cleanup;
}
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;
}
StackSetBlockMode(chanPtr, TCL_MODE_NONBLOCKING);
}
}
}
if (FilterInputBytes(chanPtr, gsPtr) == 0) {
*dstEndPtr = *gsPtr->dstPtr + gsPtr->bytesWrote;
}
if (blockModeProc != NULL) {
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 |
*/
static void
CommonGetsCleanup(chanPtr, encoding)
Channel *chanPtr;
Tcl_Encoding encoding;
{
ChannelBuffer *bufPtr, *nextPtr;
| > | | | | | 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 |
*/
static void
CommonGetsCleanup(chanPtr, encoding)
Channel *chanPtr;
Tcl_Encoding encoding;
{
ChannelState *statePtr = chanPtr->state; /* state info for channel */
ChannelBuffer *bufPtr, *nextPtr;
bufPtr = statePtr->inQueueHead;
for ( ; bufPtr != NULL; bufPtr = nextPtr) {
nextPtr = bufPtr->nextPtr;
if (bufPtr->nextRemoved < bufPtr->nextAdded) {
break;
}
RecycleBuffer(statePtr, bufPtr, 0);
}
statePtr->inQueueHead = bufPtr;
if (bufPtr == 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 |
(size_t) extra);
bufPtr->nextAdded += extra;
nextPtr->nextRemoved = BUFFER_PADDING;
}
bufPtr = nextPtr;
}
}
| | | 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 |
(size_t) extra);
bufPtr->nextAdded += extra;
nextPtr->nextRemoved = BUFFER_PADDING;
}
bufPtr = nextPtr;
}
}
if (statePtr->encoding == NULL) {
Tcl_FreeEncoding(encoding);
}
}
/*
*----------------------------------------------------------------------
*
|
| ︙ | ︙ | |||
4032 4033 4034 4035 4036 4037 4038 |
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. */
{
| | > | > > > > | > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 |
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 = (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));
}
/*
* 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 |
* 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. */
{
| | | > > > > > | > | | | | | | | | | | | | | | | 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 |
* 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 = (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 = statePtr->topChanPtr;
if (CheckChannelErrors(statePtr, TCL_READABLE) != 0) {
copied = -1;
goto done;
}
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 (statePtr->inQueueHead != NULL) {
if (encoding == NULL) {
copiedNow = ReadBytes(statePtr, objPtr, toRead, &offset);
} else {
copiedNow = ReadChars(statePtr, objPtr, toRead, &offset,
&factor);
}
/*
* If the current buffer is empty recycle it.
*/
bufPtr = statePtr->inQueueHead;
if (bufPtr->nextRemoved == bufPtr->nextAdded) {
ChannelBuffer *nextPtr;
nextPtr = bufPtr->nextPtr;
RecycleBuffer(statePtr, bufPtr, 0);
statePtr->inQueueHead = nextPtr;
if (nextPtr == NULL) {
statePtr->inQueueTail = nextPtr;
}
}
}
if (copiedNow < 0) {
if (statePtr->flags & CHANNEL_EOF) {
break;
}
if (statePtr->flags & CHANNEL_BLOCKED) {
if (statePtr->flags & CHANNEL_NONBLOCKING) {
break;
}
statePtr->flags &= ~CHANNEL_BLOCKED;
}
result = GetInput(chanPtr);
if (result != 0) {
if (result == EAGAIN) {
break;
}
copied = -1;
goto done;
}
} else {
copied += copiedNow;
toRead -= copiedNow;
}
}
statePtr->flags &= ~CHANNEL_BLOCKED;
if (encoding == NULL) {
Tcl_SetByteArrayLength(objPtr, offset);
} else {
Tcl_SetObjLength(objPtr, offset);
}
done:
|
| ︙ | ︙ | |||
4199 4200 4201 4202 4203 4204 4205 | * Side effects: * None. * *--------------------------------------------------------------------------- */ static int | | | | 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 |
* Side effects:
* None.
*
*---------------------------------------------------------------------------
*/
static int
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 |
{
int toRead, srcLen, srcRead, dstWrote, offset, length;
ChannelBuffer *bufPtr;
char *src, *dst;
offset = *offsetPtr;
| | | 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 |
{
int toRead, srcLen, srcRead, dstWrote, offset, length;
ChannelBuffer *bufPtr;
char *src, *dst;
offset = *offsetPtr;
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 |
if (offset < toRead) {
length = offset + toRead + 1;
}
dst = (char *) Tcl_SetByteArrayLength(objPtr, length);
}
dst += offset;
| | | | | 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 |
if (offset < toRead) {
length = offset + toRead + 1;
}
dst = (char *) Tcl_SetByteArrayLength(objPtr, length);
}
dst += offset;
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(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 | * Side effects: * None. * *--------------------------------------------------------------------------- */ static int | | | | 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 |
* Side effects:
* None.
*
*---------------------------------------------------------------------------
*/
static int
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 |
ChannelBuffer *bufPtr;
char *src, *dst;
Tcl_EncodingState oldState;
factor = *factorPtr;
offset = *offsetPtr;
| | | 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 |
ChannelBuffer *bufPtr;
char *src, *dst;
Tcl_EncodingState oldState;
factor = *factorPtr;
offset = *offsetPtr;
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 |
* rather than using the factor.
*/
dstNeeded = spaceLeft;
}
dst = objPtr->bytes + offset;
| | | | | | | | | | | | | | | | | | | | | | | | | | 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 |
* rather than using the factor.
*/
dstNeeded = spaceLeft;
}
dst = objPtr->bytes + offset;
oldState = statePtr->inputEncodingState;
if (statePtr->flags & INPUT_NEED_NL) {
/*
* We want a '\n' because the last character we saw was '\r'.
*/
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';
}
statePtr->inputEncodingFlags &= ~TCL_ENCODING_START;
*offsetPtr += 1;
return 1;
}
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) {
/*
* 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.
*/
statePtr->flags |= CHANNEL_NEED_MORE_DATA;
return -1;
}
nextPtr->nextRemoved -= srcLen;
memcpy((VOID *) (nextPtr->buf + nextPtr->nextRemoved), (VOID *) src,
(size_t) srcLen);
RecycleBuffer(statePtr, bufPtr, 0);
statePtr->inQueueHead = nextPtr;
return ReadChars(statePtr, objPtr, charsToRead, offsetPtr, factorPtr);
}
dstRead = dstWrote;
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;
}
statePtr->inputEncodingState = oldState;
Tcl_ExternalToUtf(NULL, statePtr->encoding, src, srcLen,
statePtr->inputEncodingFlags, &statePtr->inputEncodingState,
dst, dstRead + TCL_UTF_MAX, &srcRead, &dstWrote, &numChars);
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);
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(statePtr, dst, dst, &dstWrote, &dstRead);
numChars -= (dstRead - dstWrote);
}
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 | * Side effects: * None. * *--------------------------------------------------------------------------- */ static int | | | | | 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 |
* Side effects:
* None.
*
*---------------------------------------------------------------------------
*/
static int
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 = 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 |
dstLen = srcLen;
}
*srcLenPtr = srcLen;
break;
}
}
}
| | | 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 |
dstLen = srcLen;
}
*srcLenPtr = srcLen;
break;
}
}
}
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 |
srcEnd = srcStart + dstLen;
srcMax = srcStart + *srcLenPtr;
for ( ; src < srcEnd; ) {
if (*src == '\r') {
src++;
if (src >= srcMax) {
| | | 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 |
srcEnd = srcStart + dstLen;
srcMax = srcStart + *srcLenPtr;
for ( ; src < srcEnd; ) {
if (*src == '\r') {
src++;
if (src >= srcMax) {
statePtr->flags |= INPUT_NEED_NL;
} else if (*src == '\n') {
*dst++ = *src++;
} else {
*dst++ = '\r';
}
} else {
*dst++ = *src++;
|
| ︙ | ︙ | |||
4614 4615 4616 4617 4618 4619 4620 | CONST char *src, *srcEnd, *srcMax; dst = dstStart; src = srcStart; srcEnd = srcStart + dstLen; srcMax = srcStart + *srcLenPtr; | | | | | 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 |
CONST char *src, *srcEnd, *srcMax;
dst = dstStart;
src = srcStart;
srcEnd = srcStart + dstLen;
srcMax = srcStart + *srcLenPtr;
if ((statePtr->flags & INPUT_SAW_CR) && (src < srcMax)) {
if (*src == '\n') {
src++;
}
statePtr->flags &= ~INPUT_SAW_CR;
}
for ( ; src < srcEnd; ) {
if (*src == '\r') {
src++;
if (src >= srcMax) {
statePtr->flags |= INPUT_SAW_CR;
} else if (*src == '\n') {
if (srcEnd < srcMax) {
srcEnd++;
}
src++;
}
*dst++ = '\n';
|
| ︙ | ︙ | |||
4653 4654 4655 4656 4657 4658 4659 |
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.
*/
| | | | | 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 |
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.
*/
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 |
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. */
ChannelBuffer *bufPtr; /* Buffer to contain the data. */
int i, flags;
chanPtr = (Channel *) chan;
| > > | > > > > > > | | | | | | | | | | | | | 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 |
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 = statePtr->flags;
if (CheckChannelErrors(statePtr, TCL_READABLE) != 0) {
len = -1;
goto done;
}
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 (statePtr->flags & CHANNEL_STICKY_EOF) {
goto done;
}
statePtr->flags &= (~(CHANNEL_BLOCKED | CHANNEL_EOF));
bufPtr = AllocChannelBuffer(len);
for (i = 0; i < len; i++) {
bufPtr->buf[i] = str[i];
}
bufPtr->nextAdded += len;
if (statePtr->inQueueHead == (ChannelBuffer *) NULL) {
bufPtr->nextPtr = (ChannelBuffer *) NULL;
statePtr->inQueueHead = bufPtr;
statePtr->inQueueTail = bufPtr;
} else if (atEnd) {
bufPtr->nextPtr = (ChannelBuffer *) NULL;
statePtr->inQueueTail->nextPtr = bufPtr;
statePtr->inQueueTail = bufPtr;
} else {
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 |
*/
int
Tcl_Flush(chan)
Tcl_Channel chan; /* The Channel to flush. */
{
int result; /* Of calling FlushChannel. */
| | > > > > > | > | | | | | | 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 |
*/
int
Tcl_Flush(chan)
Tcl_Channel chan; /* The Channel to flush. */
{
int result; /* Of calling FlushChannel. */
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 = statePtr->topChanPtr;
if (CheckChannelErrors(statePtr, TCL_WRITABLE) != 0) {
return -1;
}
/*
* Force current output buffer to be output also.
*/
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 | * May discard input from the channel. If discardLastBuffer is zero, * leaves one buffer in place for back-filling. * *---------------------------------------------------------------------- */ static void | | | | | | | | | | | 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 |
* May discard input from the channel. If discardLastBuffer is zero,
* leaves one buffer in place for back-filling.
*
*----------------------------------------------------------------------
*/
static void
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 = statePtr->inQueueHead;
statePtr->inQueueHead = (ChannelBuffer *) NULL;
statePtr->inQueueTail = (ChannelBuffer *) NULL;
for (; bufPtr != (ChannelBuffer *) NULL; bufPtr = nxtPtr) {
nxtPtr = bufPtr->nextPtr;
RecycleBuffer(statePtr, bufPtr, discardSavedBuffers);
}
/*
* If discardSavedBuffers is nonzero, must also discard any previously
* saved buffer in the saveInBufPtr field.
*/
if (discardSavedBuffers) {
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 |
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. */
/*
* 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.
*/
| > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | > > > > > > > > > > > > > | | > > > > > > > > > > > > | > | | | | | | | | | | | | | | 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 |
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, 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 = statePtr->inQueueTail;
if ((bufPtr != NULL) && (bufPtr->nextAdded < bufPtr->bufLength)) {
toRead = bufPtr->bufLength - bufPtr->nextAdded;
} else {
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(statePtr->bufSize);
}
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 = 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 (statePtr->flags & CHANNEL_EOF) {
return 0;
}
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) {
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)) {
statePtr->flags |= CHANNEL_BLOCKED;
result = EAGAIN;
}
Tcl_SetErrno(result);
return result;
}
return 0;
}
|
| ︙ | ︙ | |||
4966 4967 4968 4969 4970 4971 4972 |
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? */
{
| | > < | | > > > > > > | | | > > > > > > > > > > > | | | | | | | | 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 |
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 = (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. */
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, 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 = 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 = statePtr->outQueueHead, outputBuffered = 0;
bufPtr != (ChannelBuffer *) NULL;
bufPtr = bufPtr->nextPtr) {
outputBuffered += (bufPtr->nextAdded - bufPtr->nextRemoved);
}
if ((statePtr->curOutPtr != (ChannelBuffer *) NULL) &&
(statePtr->curOutPtr->nextAdded > statePtr->curOutPtr->nextRemoved)) {
statePtr->flags |= BUFFER_READY;
outputBuffered +=
(statePtr->curOutPtr->nextAdded - statePtr->curOutPtr->nextRemoved);
}
if ((inputBuffered != 0) && (outputBuffered != 0)) {
Tcl_SetErrno(EFAULT);
return -1;
}
|
| ︙ | ︙ | |||
5040 5041 5042 5043 5044 5045 5046 |
}
/*
* Discard any queued input - this input should not be read after
* the seek.
*/
| | | | < < < | < | < | | | | | | 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 |
}
/*
* Discard any queued input - this input should not be read after
* the seek.
*/
DiscardInputQueued(statePtr, 0);
/*
* Reset EOF and BLOCKED flags. We invalidate them by moving the
* access point. Also clear CR related 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 (statePtr->flags & CHANNEL_NONBLOCKING) {
wasAsync = 1;
result = StackSetBlockMode(chanPtr, TCL_MODE_BLOCKING);
if (result != 0) {
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 |
* 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) {
| | < < < | < | < | | | 4974 4975 4976 4977 4978 4979 4980 4981 4982 4983 4984 4985 4986 4987 4988 4989 4990 4991 4992 |
* 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) {
statePtr->flags |= CHANNEL_NONBLOCKING;
result = StackSetBlockMode(chanPtr, TCL_MODE_NONBLOCKING);
if (result != 0) {
return -1;
}
}
return curPos;
}
/*
*----------------------------------------------------------------------
|
| ︙ | ︙ | |||
5145 5146 5147 5148 5149 5150 5151 |
*----------------------------------------------------------------------
*/
int
Tcl_Tell(chan)
Tcl_Channel chan; /* The channel to return pos for. */
{
| | > < | | > > > > > > | | | | | | | | | | | 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 |
*----------------------------------------------------------------------
*/
int
Tcl_Tell(chan)
Tcl_Channel chan; /* The channel to return pos for. */
{
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. */
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, 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 = statePtr->inQueueHead, inputBuffered = 0;
bufPtr != (ChannelBuffer *) NULL;
bufPtr = bufPtr->nextPtr) {
inputBuffered += (bufPtr->nextAdded - bufPtr->nextRemoved);
}
for (bufPtr = statePtr->outQueueHead, outputBuffered = 0;
bufPtr != (ChannelBuffer *) NULL;
bufPtr = bufPtr->nextPtr) {
outputBuffered += (bufPtr->nextAdded - bufPtr->nextRemoved);
}
if ((statePtr->curOutPtr != (ChannelBuffer *) NULL) &&
(statePtr->curOutPtr->nextAdded > statePtr->curOutPtr->nextRemoved)) {
statePtr->flags |= BUFFER_READY;
outputBuffered +=
(statePtr->curOutPtr->nextAdded - statePtr->curOutPtr->nextRemoved);
}
if ((inputBuffered != 0) && (outputBuffered != 0)) {
Tcl_SetErrno(EFAULT);
return -1;
}
|
| ︙ | ︙ | |||
5240 5241 5242 5243 5244 5245 5246 | * Side effects: * May clear the EOF and/or BLOCKED bits if reading from channel. * *--------------------------------------------------------------------------- */ static int | | | | | > > > > | | | > > > > > > > > > > > | > > > > | | | | | 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 |
* Side effects:
* May clear the EOF and/or BLOCKED bits if reading from channel.
*
*---------------------------------------------------------------------------
*/
static int
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 (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 ((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 ((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 ((statePtr->flags & CHANNEL_STICKY_EOF) == 0) {
statePtr->flags &= ~CHANNEL_EOF;
}
statePtr->flags &= ~(CHANNEL_BLOCKED | CHANNEL_NEED_MORE_DATA);
}
return 0;
}
/*
*----------------------------------------------------------------------
|
| ︙ | ︙ | |||
5310 5311 5312 5313 5314 5315 5316 |
*----------------------------------------------------------------------
*/
int
Tcl_Eof(chan)
Tcl_Channel chan; /* Does this channel have EOF? */
{
| > | < | | | | 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216 |
*----------------------------------------------------------------------
*/
int
Tcl_Eof(chan)
Tcl_Channel chan; /* Does this channel have EOF? */
{
ChannelState *statePtr = ((Channel *) chan)->state;
/* State of real channel structure. */
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 |
*----------------------------------------------------------------------
*/
int
Tcl_InputBlocked(chan)
Tcl_Channel chan; /* Is this channel blocked? */
{
| > | < | | > > | > > > > > > > > > > > > > > > > > > > > > > > | | > > > > > > > > > > > > > > > > > | > > > > | | > | 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 |
*----------------------------------------------------------------------
*/
int
Tcl_InputBlocked(chan)
Tcl_Channel chan; /* Is this channel blocked? */
{
ChannelState *statePtr = ((Channel *) chan)->state;
/* State of real channel structure. */
return (statePtr->flags & CHANNEL_BLOCKED) ? 1 : 0;
}
/*
*----------------------------------------------------------------------
*
* Tcl_InputBuffered --
*
* Returns the number of bytes of input currently buffered in the
* 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. */
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;
}
/*
*----------------------------------------------------------------------
*
* 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) {
bytesBuffered += (bufPtr->nextAdded - bufPtr->nextRemoved);
}
return bytesBuffered;
}
/*
*----------------------------------------------------------------------
*
* Tcl_SetChannelBufferSize --
|
| ︙ | ︙ | |||
5402 5403 5404 5405 5406 5407 5408 |
void
Tcl_SetChannelBufferSize(chan, sz)
Tcl_Channel chan; /* The channel whose buffer size
* to set. */
int sz; /* The size to set. */
{
| | | | | | | | | | | 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 |
void
Tcl_SetChannelBufferSize(chan, sz)
Tcl_Channel chan; /* The channel whose buffer size
* to set. */
int sz; /* The size to set. */
{
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;
}
statePtr = ((Channel *) chan)->state;
statePtr->bufSize = sz;
if (statePtr->outputStage != NULL) {
ckfree((char *) statePtr->outputStage);
statePtr->outputStage = NULL;
}
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 |
*/
int
Tcl_GetChannelBufferSize(chan)
Tcl_Channel chan; /* The channel for which to find the
* buffer size. */
{
| | > < | | 5384 5385 5386 5387 5388 5389 5390 5391 5392 5393 5394 5395 5396 5397 5398 5399 5400 5401 |
*/
int
Tcl_GetChannelBufferSize(chan)
Tcl_Channel chan; /* The channel for which to find the
* buffer size. */
{
ChannelState *statePtr = ((Channel *) chan)->state;
/* State of real channel structure. */
return statePtr->bufSize;
}
/*
*----------------------------------------------------------------------
*
* Tcl_BadChannelOption --
*
|
| ︙ | ︙ | |||
5496 5497 5498 5499 5500 5501 5502 |
* to the standard generic options.
* can be NULL for generic options
* only.
*/
{
if (interp) {
CONST char *genericopt =
| | | | | 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 |
* to the standard generic options.
* can be NULL for generic options
* only.
*/
{
if (interp) {
CONST char *genericopt =
"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) {
panic("malformed option list in channel driver");
}
Tcl_ResetResult(interp);
Tcl_AppendResult(interp, "bad option \"", optionName,
"\": 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 |
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;
int flags;
| > < < < < < < < < < < < < < < | > > > > > > > > > > > > > > > > > > > > > > | 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 |
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;
/*
* 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, 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 |
}
}
if ((len == 0) || ((len > 7) && (optionName[1] == 'b') &&
(strncmp(optionName, "-buffersize", len) == 0))) {
if (len == 0) {
Tcl_DStringAppendElement(dsPtr, "-buffersize");
}
| | | | | | | | | 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 |
}
}
if ((len == 0) || ((len > 7) && (optionName[1] == 'b') &&
(strncmp(optionName, "-buffersize", len) == 0))) {
if (len == 0) {
Tcl_DStringAppendElement(dsPtr, "-buffersize");
}
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 (statePtr->encoding == NULL) {
Tcl_DStringAppendElement(dsPtr, "binary");
} else {
Tcl_DStringAppendElement(dsPtr,
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 (statePtr->inEofChar == 0) {
Tcl_DStringAppendElement(dsPtr, "");
} else {
char buf[4];
sprintf(buf, "%c", statePtr->inEofChar);
Tcl_DStringAppendElement(dsPtr, buf);
}
}
if (flags & TCL_WRITABLE) {
if (statePtr->outEofChar == 0) {
Tcl_DStringAppendElement(dsPtr, "");
} else {
char buf[4];
sprintf(buf, "%c", statePtr->outEofChar);
Tcl_DStringAppendElement(dsPtr, buf);
}
}
if (((flags & (TCL_READABLE|TCL_WRITABLE)) ==
(TCL_READABLE|TCL_WRITABLE)) && (len == 0)) {
Tcl_DStringEndSublist(dsPtr);
}
|
| ︙ | ︙ | |||
5695 5696 5697 5698 5699 5700 5701 |
Tcl_DStringAppendElement(dsPtr, "-translation");
}
if (((flags & (TCL_READABLE|TCL_WRITABLE)) ==
(TCL_READABLE|TCL_WRITABLE)) && (len == 0)) {
Tcl_DStringStartSublist(dsPtr);
}
if (flags & TCL_READABLE) {
| | | | | | | | | 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 |
Tcl_DStringAppendElement(dsPtr, "-translation");
}
if (((flags & (TCL_READABLE|TCL_WRITABLE)) ==
(TCL_READABLE|TCL_WRITABLE)) && (len == 0)) {
Tcl_DStringStartSublist(dsPtr);
}
if (flags & TCL_READABLE) {
if (statePtr->inputTranslation == TCL_TRANSLATE_AUTO) {
Tcl_DStringAppendElement(dsPtr, "auto");
} else if (statePtr->inputTranslation == TCL_TRANSLATE_CR) {
Tcl_DStringAppendElement(dsPtr, "cr");
} else if (statePtr->inputTranslation == TCL_TRANSLATE_CRLF) {
Tcl_DStringAppendElement(dsPtr, "crlf");
} else {
Tcl_DStringAppendElement(dsPtr, "lf");
}
}
if (flags & TCL_WRITABLE) {
if (statePtr->outputTranslation == TCL_TRANSLATE_AUTO) {
Tcl_DStringAppendElement(dsPtr, "auto");
} else if (statePtr->outputTranslation == TCL_TRANSLATE_CR) {
Tcl_DStringAppendElement(dsPtr, "cr");
} else if (statePtr->outputTranslation == TCL_TRANSLATE_CRLF) {
Tcl_DStringAppendElement(dsPtr, "crlf");
} else {
Tcl_DStringAppendElement(dsPtr, "lf");
}
}
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);
} else {
/*
* no driver specific options case.
*/
if (len == 0) {
return TCL_OK;
|
| ︙ | ︙ | |||
5769 5770 5771 5772 5773 5774 5775 |
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. */
| | > < < | | | < | > | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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 |
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 = (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;
/*
* If the channel is in the middle of a background copy, fail.
*/
if (statePtr->csPtr) {
if (interp) {
Tcl_AppendResult(interp,
"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, 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)) {
statePtr->flags &=
(~(CHANNEL_UNBUFFERED|CHANNEL_LINEBUFFERED));
} else if ((newValue[0] == 'l') &&
(strncmp(newValue, "line", len) == 0)) {
statePtr->flags &= (~(CHANNEL_UNBUFFERED));
statePtr->flags |= CHANNEL_LINEBUFFERED;
} else if ((newValue[0] == 'n') &&
(strncmp(newValue, "none", len) == 0)) {
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)) {
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(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) {
statePtr->inEofChar = 0;
statePtr->outEofChar = 0;
} else if (argc == 1) {
if (statePtr->flags & TCL_WRITABLE) {
statePtr->outEofChar = (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);
}
ckfree((char *) argv);
return TCL_ERROR;
} else {
if (statePtr->flags & TCL_READABLE) {
statePtr->inEofChar = (int) argv[0][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 = (statePtr->flags & TCL_READABLE) ? argv[0] : NULL;
writeMode = (statePtr->flags & TCL_WRITABLE) ? argv[0] : NULL;
} else if (argc == 2) {
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 = statePtr->inputTranslation;
} else if (strcmp(readMode, "auto") == 0) {
newMode = TCL_TRANSLATE_AUTO;
} else if (strcmp(readMode, "binary") == 0) {
newMode = TCL_TRANSLATE_LF;
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 | /* * 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. */ | | | | | | | | | | | | | | | | | 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 |
/*
* 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 != 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(Tcl_ChannelName(chanPtr->typePtr), "tcp") == 0) {
statePtr->outputTranslation = TCL_TRANSLATE_CRLF;
} else {
statePtr->outputTranslation = TCL_PLATFORM_TRANSLATION;
}
} else if (strcmp(writeMode, "binary") == 0) {
statePtr->outEofChar = 0;
statePtr->outputTranslation = TCL_TRANSLATE_LF;
Tcl_FreeEncoding(statePtr->encoding);
statePtr->encoding = NULL;
} else if (strcmp(writeMode, "lf") == 0) {
statePtr->outputTranslation = TCL_TRANSLATE_LF;
} else if (strcmp(writeMode, "cr") == 0) {
statePtr->outputTranslation = TCL_TRANSLATE_CR;
} else if (strcmp(writeMode, "crlf") == 0) {
statePtr->outputTranslation = TCL_TRANSLATE_CRLF;
} else if (strcmp(writeMode, "platform") == 0) {
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 |
return Tcl_BadChannelOption(interp, optionName, (char *) NULL);
}
/*
* If bufsize changes, need to get rid of old utility buffer.
*/
| | | | | | | | | | | | | | | | | | 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 |
return Tcl_BadChannelOption(interp, optionName, (char *) NULL);
}
/*
* If bufsize changes, need to get rid of old utility buffer.
*/
if (statePtr->saveInBufPtr != NULL) {
RecycleBuffer(statePtr, statePtr->saveInBufPtr, 1);
statePtr->saveInBufPtr = 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 (statePtr->outputStage != NULL) {
ckfree((char *) statePtr->outputStage);
statePtr->outputStage = NULL;
}
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 |
*/
static void
CleanupChannelHandlers(interp, chanPtr)
Tcl_Interp *interp;
Channel *chanPtr;
{
EventScriptRecord *sPtr, *prevPtr, *nextPtr;
/*
* Remove fileevent records on this channel that refer to the
* given interpreter.
*/
| > | | | | | | 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 |
*/
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 = statePtr->scriptRecordPtr,
prevPtr = (EventScriptRecord *) NULL;
sPtr != (EventScriptRecord *) NULL;
sPtr = nextPtr) {
nextPtr = sPtr->nextPtr;
if (sPtr->interp == interp) {
if (prevPtr == (EventScriptRecord *) NULL) {
statePtr->scriptRecordPtr = nextPtr;
} else {
prevPtr->nextPtr = nextPtr;
}
Tcl_DeleteChannelHandler((Tcl_Channel) chanPtr,
TclChannelEventScriptInvoker, (ClientData) sPtr);
Tcl_DecrRefCount(sPtr->scriptPtr);
ckfree((char *) sPtr);
} else {
prevPtr = sPtr;
}
}
|
| ︙ | ︙ | |||
6126 6127 6128 6129 6130 6131 6132 6133 6134 6135 6136 |
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;
ChannelHandler *chPtr;
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
NextChannelHandler nh;
| > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > | > > | > > | > > > > > > > > > > > > | | | > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | < < < < < < < | | | | < < < | 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 |
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.
*/
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;
}
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) 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 ((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.
*/
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 ((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.
*/
if (chanPtr->typePtr != NULL) {
UpdateInterest(chanPtr);
}
Tcl_Release((ClientData) statePtr);
Tcl_Release((ClientData) channel);
tsdPtr->nestedHandlerPtr = nh.nestedHandlerPtr;
}
/*
*----------------------------------------------------------------------
*
* UpdateInterest --
*
|
| ︙ | ︙ | |||
6224 6225 6226 6227 6228 6229 6230 |
*----------------------------------------------------------------------
*/
static void
UpdateInterest(chanPtr)
Channel *chanPtr; /* Channel to update. */
{
| > | | | | | | | | | 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 |
*----------------------------------------------------------------------
*/
static void
UpdateInterest(chanPtr)
Channel *chanPtr; /* Channel to update. */
{
ChannelState *statePtr = chanPtr->state; /* state info for channel */
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 (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 (!(statePtr->flags & CHANNEL_NEED_MORE_DATA)
&& (statePtr->inQueueHead != (ChannelBuffer *) NULL)
&& (statePtr->inQueueHead->nextRemoved <
statePtr->inQueueHead->nextAdded)) {
mask &= ~TCL_READABLE;
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 |
*/
static void
ChannelTimerProc(clientData)
ClientData clientData;
{
Channel *chanPtr = (Channel *) clientData;
| > | | | | | | | | | | 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 |
*/
static void
ChannelTimerProc(clientData)
ClientData clientData;
{
Channel *chanPtr = (Channel *) clientData;
ChannelState *statePtr = chanPtr->state; /* state info for channel */
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.
*/
statePtr->timer = Tcl_CreateTimerHandler(0, ChannelTimerProc,
(ClientData) chanPtr);
Tcl_NotifyChannel((Tcl_Channel)chanPtr, TCL_READABLE);
} else {
statePtr->timer = NULL;
UpdateInterest(chanPtr);
}
}
/*
*----------------------------------------------------------------------
*
|
| ︙ | ︙ | |||
6335 6336 6337 6338 6339 6340 6341 |
* 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;
| | | < | | | | | | | | | | | 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 |
* 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 *) chan;
ChannelState *statePtr = chanPtr->state; /* state info for channel */
/*
* 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 = 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 = 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.
*/
statePtr->interestMask = 0;
for (chPtr = statePtr->chPtr;
chPtr != (ChannelHandler *) NULL;
chPtr = chPtr->nextPtr) {
statePtr->interestMask |= chPtr->mask;
}
UpdateInterest(statePtr->topChanPtr);
}
/*
*----------------------------------------------------------------------
*
* Tcl_DeleteChannelHandler --
*
|
| ︙ | ︙ | |||
6414 6415 6416 6417 6418 6419 6420 6421 |
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. */
{
ChannelHandler *chPtr, *prevChPtr;
| > | | < < | | | | | | | | | | | | | | 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 |
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 = (Channel *) chan;
ChannelState *statePtr = chanPtr->state; /* state info for channel */
NextChannelHandler *nhPtr;
/*
* Find the entry and the previous one in the list.
*/
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) {
if (nhPtr->nextHandlerPtr == chPtr) {
nhPtr->nextHandlerPtr = chPtr->nextPtr;
}
}
/*
* Splice it out of the list of channel handlers.
*/
if (prevChPtr == (ChannelHandler *) NULL) {
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.
*/
statePtr->interestMask = 0;
for (chPtr = statePtr->chPtr;
chPtr != (ChannelHandler *) NULL;
chPtr = chPtr->nextPtr) {
statePtr->interestMask |= chPtr->mask;
}
UpdateInterest(statePtr->topChanPtr);
}
/*
*----------------------------------------------------------------------
*
* DeleteScriptRecord --
*
|
| ︙ | ︙ | |||
6509 6510 6511 6512 6513 6514 6515 6516 6517 |
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. */
{
EventScriptRecord *esPtr, *prevEsPtr;
| > | | | | | | | 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 |
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 = statePtr->scriptRecordPtr,
prevEsPtr = (EventScriptRecord *) NULL;
esPtr != (EventScriptRecord *) NULL;
prevEsPtr = esPtr, esPtr = esPtr->nextPtr) {
if ((esPtr->interp == interp) && (esPtr->mask == mask)) {
if (esPtr == statePtr->scriptRecordPtr) {
statePtr->scriptRecordPtr = esPtr->nextPtr;
} else {
prevEsPtr->nextPtr = esPtr->nextPtr;
}
Tcl_DeleteChannelHandler((Tcl_Channel) chanPtr,
TclChannelEventScriptInvoker, (ClientData) esPtr);
Tcl_DecrRefCount(esPtr->scriptPtr);
ckfree((char *) esPtr);
break;
}
}
|
| ︙ | ︙ | |||
6560 6561 6562 6563 6564 6565 6566 6567 6568 |
* 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. */
{
EventScriptRecord *esPtr;
| > | | | | | | | | | | < | | | | | 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 6616 6617 6618 6619 6620 6621 6622 6623 6624 6625 |
* 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 = 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,
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;
}
/*
*----------------------------------------------------------------------
*
* 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.
*
*----------------------------------------------------------------------
*/
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;
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 |
* 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. */
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};
| > | 6669 6670 6671 6672 6673 6674 6675 6676 6677 6678 6679 6680 6681 6682 6683 |
* 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 |
mask = maskArray[modeIndex];
chanName = Tcl_GetString(objv[1]);
chan = Tcl_GetChannel(interp, chanName, NULL);
if (chan == (Tcl_Channel) NULL) {
return TCL_ERROR;
}
| | > | | | 6692 6693 6694 6695 6696 6697 6698 6699 6700 6701 6702 6703 6704 6705 6706 6707 6708 6709 6710 6711 6712 6713 6714 6715 6716 6717 6718 6719 6720 6721 |
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;
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 = 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 |
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 6741 6742 6743 6744 6745 6746 6747 6748 6749 6750 6751 6752 6753 6754 |
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
* 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 |
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;
int readFlags, writeFlags;
CopyState *csPtr;
int nonBlocking = (cmdPtr) ? CHANNEL_NONBLOCKING : 0;
| > > > > | | | | | 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 |
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 (inStatePtr->csPtr) {
Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), "channel \"",
Tcl_GetChannelName(inChan), "\" is busy", NULL);
return TCL_ERROR;
}
if (outStatePtr->csPtr) {
Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), "channel \"",
Tcl_GetChannelName(outChan), "\" is busy", NULL);
return TCL_ERROR;
}
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 |
}
}
/*
* Make sure the output side is unbuffered.
*/
| | | | | | | | | | | | | 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 |
}
}
/*
* Make sure the output side is unbuffered.
*/
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) + 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;
if (cmdPtr) {
Tcl_IncrRefCount(cmdPtr);
}
csPtr->cmdPtr = cmdPtr;
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 |
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;
int result = TCL_OK;
int size;
int total;
| > | > > | | | > > > > | | | | | | | < | | 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 |
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;
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 (inStatePtr->unreportedError != 0) {
Tcl_SetErrno(inStatePtr->unreportedError);
inStatePtr->unreportedError = 0;
goto readError;
}
if (outStatePtr->unreportedError != 0) {
Tcl_SetErrno(outStatePtr->unreportedError);
outStatePtr->unreportedError = 0;
goto writeError;
}
/*
* Read up to bufSize bytes.
*/
if ((csPtr->toRead == -1) || (csPtr->toRead > csPtr->bufSize)) {
size = csPtr->bufSize;
} else {
size = csPtr->toRead;
}
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 | return TCL_OK; } /* * Now write the buffer out. */ | | > > > > > > > > > > > > | | < < < < < < < < < | 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 |
return TCL_OK;
}
/*
* Now write the buffer out.
*/
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 (outStatePtr->flags & BG_FLUSH_SCHEDULED) {
if (!(mask & TCL_WRITABLE)) {
if (mask & TCL_READABLE) {
Tcl_DeleteChannelHandler(inChan, CopyEventProc,
(ClientData) csPtr);
}
Tcl_CreateChannelHandler(outChan, TCL_WRITABLE,
CopyEventProc, (ClientData) csPtr);
}
return TCL_OK;
}
/*
* 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 |
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. */
{
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. */
| > | | | | | | | | | | | 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 |
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 (!(statePtr->flags & CHANNEL_STICKY_EOF)) {
statePtr->flags &= ~CHANNEL_EOF;
}
statePtr->flags &= ~(CHANNEL_BLOCKED | CHANNEL_NEED_MORE_DATA);
for (copied = 0; copied < toRead; copied += copiedNow) {
copiedNow = CopyAndTranslateBuffer(statePtr, bufPtr + copied,
toRead - 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));
}
result = GetInput(chanPtr);
if (result != 0) {
if (result != EAGAIN) {
copied = -1;
}
goto done;
}
}
}
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 | * Side effects: * Consumes buffered input. May deallocate one buffer. * *---------------------------------------------------------------------- */ static int | | | > < | | | | 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 |
* Side effects:
* Consumes buffered input. May deallocate one buffer.
*
*----------------------------------------------------------------------
*/
static int
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? */
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 (statePtr->inQueueHead == (ChannelBuffer *) NULL) {
return 0;
}
bufPtr = statePtr->inQueueHead;
bytesInBuffer = bufPtr->nextAdded - bufPtr->nextRemoved;
copied = 0;
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 |
int curByte;
/*
* If there is a held-back "\r" at EOF, produce it now.
*/
if (bytesInBuffer == 0) {
| | | | 7239 7240 7241 7242 7243 7244 7245 7246 7247 7248 7249 7250 7251 7252 7253 7254 7255 7256 |
int curByte;
/*
* If there is a held-back "\r" at EOF, produce it now.
*/
if (bytesInBuffer == 0) {
if ((statePtr->flags & (INPUT_SAW_CR | CHANNEL_EOF)) ==
(INPUT_SAW_CR | CHANNEL_EOF)) {
result[0] = '\r';
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 |
copied = space;
end = result + copied;
dst = result;
for (src = result; src < end; src++) {
curByte = *src;
if (curByte == '\n') {
| | | | | | 7267 7268 7269 7270 7271 7272 7273 7274 7275 7276 7277 7278 7279 7280 7281 7282 7283 7284 7285 7286 7287 7288 |
copied = space;
end = result + copied;
dst = result;
for (src = result; src < end; src++) {
curByte = *src;
if (curByte == '\n') {
statePtr->flags &= ~INPUT_SAW_CR;
} else if (statePtr->flags & INPUT_SAW_CR) {
statePtr->flags &= ~INPUT_SAW_CR;
*dst = '\r';
dst++;
}
if (curByte == '\r') {
statePtr->flags |= INPUT_SAW_CR;
} else {
*dst = (char) curByte;
dst++;
}
}
copied = dst - result;
break;
|
| ︙ | ︙ | |||
7837 7838 7839 7840 7841 7842 7843 |
copied = space;
end = result + copied;
dst = result;
for (src = result; src < end; src++) {
curByte = *src;
if (curByte == '\r') {
| | | | | | | | | | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 7341 7342 7343 7344 7345 7346 7347 7348 7349 7350 7351 7352 7353 7354 7355 7356 7357 7358 7359 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 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 |
copied = space;
end = result + copied;
dst = result;
for (src = result; src < end; src++) {
curByte = *src;
if (curByte == '\r') {
statePtr->flags |= INPUT_SAW_CR;
*dst = '\n';
dst++;
} else {
if ((curByte != '\n') ||
!(statePtr->flags & INPUT_SAW_CR)) {
*dst = (char) curByte;
dst++;
}
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 (statePtr->inEofChar != 0) {
for (i = 0; i < copied; i++) {
if (result[i] == (char) statePtr->inEofChar) {
/*
* Set sticky EOF so that no further input is presented
* to the caller.
*/
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) {
statePtr->inQueueHead = bufPtr->nextPtr;
if (statePtr->inQueueHead == (ChannelBuffer *) NULL) {
statePtr->inQueueTail = (ChannelBuffer *) NULL;
}
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 |
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. */
{
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
| > | 7492 7493 7494 7495 7496 7497 7498 7499 7500 7501 7502 7503 7504 7505 7506 |
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 |
while (srcLen > 0) {
/*
* Make sure there is a current output buffer to accept output.
*/
| | | | | | 7532 7533 7534 7535 7536 7537 7538 7539 7540 7541 7542 7543 7544 7545 7546 7547 7548 7549 7550 7551 7552 7553 7554 7555 7556 7557 7558 |
while (srcLen > 0) {
/*
* Make sure there is a current output buffer to accept output.
*/
if (statePtr->curOutPtr == (ChannelBuffer *) NULL) {
statePtr->curOutPtr = AllocChannelBuffer(statePtr->bufSize);
}
outBufPtr = statePtr->curOutPtr;
destCopied = outBufPtr->bufLength - outBufPtr->nextAdded;
if (destCopied > srcLen) {
destCopied = srcLen;
}
destPtr = outBufPtr->buf + outBufPtr->nextAdded;
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 |
/*
* 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;
| | | | | | | | | | | 7589 7590 7591 7592 7593 7594 7595 7596 7597 7598 7599 7600 7601 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 |
/*
* 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 (!(statePtr->flags & BUFFER_READY)) {
if (outBufPtr->nextAdded == outBufPtr->bufLength) {
statePtr->flags |= BUFFER_READY;
} else if (statePtr->flags & CHANNEL_LINEBUFFERED) {
for (sPtr = src, i = 0, foundNewline = 0;
(i < srcCopied) && (!foundNewline);
i++, sPtr++) {
if (*sPtr == '\n') {
foundNewline = 1;
break;
}
}
if (foundNewline) {
statePtr->flags |= BUFFER_READY;
}
} else if (statePtr->flags & CHANNEL_UNBUFFERED) {
statePtr->flags |= BUFFER_READY;
}
}
totalDestCopied += srcCopied;
src += srcCopied;
srcLen -= srcCopied;
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 |
*----------------------------------------------------------------------
*/
static void
StopCopy(csPtr)
CopyState *csPtr; /* State for bg copy to stop . */
{
int nonBlocking;
if (!csPtr) {
return;
}
/*
* Restore the old blocking mode and output buffering mode.
*/
nonBlocking = (csPtr->readFlags & CHANNEL_NONBLOCKING);
| > > > > | | > | | | < | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 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 7724 7725 7726 7727 7728 7729 7730 7731 7732 7733 7734 7735 7736 7737 7738 7739 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 |
*----------------------------------------------------------------------
*/
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 != (inStatePtr->flags & CHANNEL_NONBLOCKING)) {
SetBlockMode(NULL, csPtr->readPtr,
nonBlocking ? TCL_MODE_NONBLOCKING : TCL_MODE_BLOCKING);
}
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);
}
}
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);
if (csPtr->readPtr != csPtr->writePtr) {
Tcl_DeleteChannelHandler((Tcl_Channel)csPtr->writePtr,
CopyEventProc, (ClientData)csPtr);
}
Tcl_DecrRefCount(csPtr->cmdPtr);
}
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 |
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. */
{
int result = 0;
| > < < < | > < | | | 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 |
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;
result = StackSetBlockMode(chanPtr, mode);
if (result != 0) {
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) {
statePtr->flags &= (~(CHANNEL_NONBLOCKING | BG_FLUSH_SCHEDULED));
} else {
statePtr->flags |= CHANNEL_NONBLOCKING;
}
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
|
| ︙ | ︙ | |||
8236 8237 8238 8239 8240 8241 8242 |
*/
int
Tcl_GetChannelNamesEx(interp, pattern)
Tcl_Interp *interp; /* Interp for error reporting. */
char *pattern; /* pattern to filter on. */
{
| < > | | > > > > > > > > > > > > | | > | > | > | | | > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 7910 7911 7912 7913 7914 7915 7916 7917 7918 7919 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 |
*/
int
Tcl_GetChannelNamesEx(interp, pattern)
Tcl_Interp *interp; /* Interp for error reporting. */
char *pattern; /* pattern to filter on. */
{
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
ChannelState *statePtr;
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 (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 (statePtr->topChanPtr == (Channel *) tsdPtr->stdoutChannel) {
name = "stdout";
} 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 = 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 |
/*
* 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.1 2000/07/27 01:39:17 hobbs 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. */
/*
* 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 | /* * 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. * | | | 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.2.1 2001/08/06 22:24:11 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 |
}
if ((mode & TCL_READABLE) == 0) {
Tcl_AppendResult(interp, "channel \"", name,
"\" wasn't opened for reading", (char *) NULL);
return TCL_ERROR;
}
| < < > > > | > | 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 |
}
if ((mode & TCL_READABLE) == 0) {
Tcl_AppendResult(interp, "channel \"", name,
"\" wasn't opened for reading", (char *) NULL);
return TCL_ERROR;
}
if (objc == 3) {
/*
* Variable gets line, interp get bytecount.
*/
linePtr = Tcl_NewObj();
}
else {
linePtr = Tcl_GetObjResult(interp);
}
lineLen = Tcl_GetsObj(chan, linePtr);
if (lineLen < 0) {
if (!Tcl_Eof(chan) && !Tcl_InputBlocked(chan)) {
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;
}
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 | /* * 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. * | | | 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.10.2 2001/04/03 22:54:37 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 |
"index", /* name */
(Tcl_FreeInternalRepProc *) NULL, /* freeIntRepProc */
(Tcl_DupInternalRepProc *) NULL, /* dupIntRepProc */
(Tcl_UpdateStringProc *) NULL, /* updateStringProc */
SetIndexFromAny /* setFromAnyProc */
};
/*
* Boolean flag indicating whether or not the tclIndexType object
* type has been registered with the Tcl compiler.
*/
static int indexTypeInitialized = 0;
| > > > > > > > > > > | 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 |
* (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)) {
| | > | 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)
/ sizeof(char *);
return TCL_OK;
}
return Tcl_GetIndexFromObjStruct(interp, objPtr, tablePtr, sizeof(char *),
msg, flags, indexPtr);
}
/*
|
| ︙ | ︙ | |||
147 148 149 150 151 152 153 |
/*
* See if there is a valid cached result from a previous lookup.
*/
if ((objPtr->typePtr == &tclIndexType)
&& (objPtr->internalRep.twoPtrValue.ptr1 == (VOID *) tablePtr)) {
| | | 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) / 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 |
*/
if (key[0] == '\0') {
goto error;
}
for (entryPtr = tablePtr, i = 0; *entryPtr != NULL;
| | | 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 **) ((size_t) 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 |
done:
if ((objPtr->typePtr != NULL)
&& (objPtr->typePtr->freeIntRepProc != NULL)) {
objPtr->typePtr->freeIntRepProc(objPtr);
}
objPtr->internalRep.twoPtrValue.ptr1 = (VOID *) tablePtr;
| > > > | | | | | 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 * 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 **) ((size_t) tablePtr + offset), count = 0;
*entryPtr != NULL;
entryPtr = (char **) ((size_t) entryPtr + offset), count++) {
if ((*((char **) ((size_t) 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 |
* message. */
char *message; /* Error message to print after the
* leading objects in objv. The
* message may be NULL. */
{
Tcl_Obj *objPtr;
char **tablePtr;
| | > | > > > > > | > | | 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, 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,
*((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)) || message) {
Tcl_AppendStringsToObj(objPtr, " ", (char *) NULL);
}
}
if (message) {
Tcl_AppendStringsToObj(objPtr, message, (char *) NULL);
}
Tcl_AppendStringsToObj(objPtr, "\"", (char *) NULL);
}
|
Changes to generic/tclInt.decls.
1 2 3 4 5 6 7 8 9 10 11 12 | # 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. # | | | 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.2.2 2001/04/04 21:22:18 hobbs Exp $ library tcl # Define the unsupported generic interfaces. interface tclInt |
| ︙ | ︙ | |||
573 574 575 576 577 578 579 |
declare 152 generic {
void TclSetLibraryPath(Tcl_Obj *pathPtr)
}
declare 153 generic {
Tcl_Obj *TclGetLibraryPath(void)
}
| > | | | < > | | | > | > > > > > > > > > | 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 |
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 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)
}
##############################################################################
# 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 |
int FSpSetDefaultDir(FSSpecPtr theSpec)
}
declare 6 mac {
OSErr FSpFindFolder(short vRefNum, OSType folderType, \
Boolean createFolder, FSSpec *spec)
}
declare 7 mac {
| | | | | | 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 |
int FSpSetDefaultDir(FSSpecPtr theSpec)
}
declare 6 mac {
OSErr FSpFindFolder(short vRefNum, OSType folderType, \
Boolean createFolder, FSSpec *spec)
}
declare 7 mac {
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 FSpGetDirectoryIDTcl(CONST FSSpec *spec, long *theDirID, \
Boolean *isDirectory)
}
declare 9 mac {
pascal short FSpOpenResFileCompatTcl(CONST FSSpec *spec, \
SignedByte permission)
}
declare 10 mac {
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 {
|
| ︙ | ︙ |
Changes to generic/tclInt.h.
1 2 3 4 5 6 7 8 9 10 11 12 13 | /* * 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. * | | | 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.2.1 2001/04/03 22:54:37 hobbs Exp $ */ #ifndef _TCLINT #define _TCLINT /* * Common include files needed by most of the Tcl source files are |
| ︙ | ︙ | |||
1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 | */ extern Tcl_Obj * tclFreeObjList; #ifdef TCL_COMPILE_STATS extern long tclObjsAlloced; extern long tclObjsFreed; #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. */ | > > | 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 | */ 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. */ |
| ︙ | ︙ |
Changes to generic/tclIntDecls.h.
1 2 3 4 5 6 7 8 9 10 11 12 13 | /* * 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. * | | | 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.2.1 2000/07/27 01:39:18 hobbs Exp $ */ #ifndef _TCLINTDECLS #define _TCLINTDECLS /* * WARNING: This file is automatically generated by the tools/genStubs.tcl |
| ︙ | ︙ | |||
502 503 504 505 506 507 508 | /* 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)); | | < < | < < < > > > > > > | 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 |
/* 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));
/* Slot 154 is reserved */
/* Slot 155 is reserved */
/* 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));
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 */
|
| ︙ | ︙ | |||
716 717 718 719 720 721 722 |
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 */
| | | > > | 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 |
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 */
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 */
} TclIntStubs;
#ifdef __cplusplus
extern "C" {
#endif
extern TclIntStubs *tclIntStubsPtr;
#ifdef __cplusplus
|
| ︙ | ︙ | |||
1348 1349 1350 1351 1352 1353 1354 | #define TclSetLibraryPath \ (tclIntStubsPtr->tclSetLibraryPath) /* 152 */ #endif #ifndef TclGetLibraryPath #define TclGetLibraryPath \ (tclIntStubsPtr->tclGetLibraryPath) /* 153 */ #endif | < < | < < < | < > > > > > > > > | 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 | #define TclSetLibraryPath \ (tclIntStubsPtr->tclSetLibraryPath) /* 152 */ #endif #ifndef TclGetLibraryPath #define TclGetLibraryPath \ (tclIntStubsPtr->tclGetLibraryPath) /* 153 */ #endif /* Slot 154 is reserved */ /* Slot 155 is reserved */ #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 #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 | /* * 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. * | | | 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.2.1 2001/04/04 21:22:18 hobbs Exp $ */ #ifndef _TCLINTPLATDECLS #define _TCLINTPLATDECLS /* * WARNING: This file is automatically generated by the tools/genStubs.tcl |
| ︙ | ︙ | |||
144 145 146 147 148 149 150 | /* 5 */ EXTERN int FSpSetDefaultDir _ANSI_ARGS_((FSSpecPtr theSpec)); /* 6 */ EXTERN OSErr FSpFindFolder _ANSI_ARGS_((short vRefNum, OSType folderType, Boolean createFolder, FSSpec * spec)); /* 7 */ | | | | | | 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 | /* 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 GetGlobalMouseTcl _ANSI_ARGS_((Point * mouse)); /* 8 */ EXTERN pascal OSErr FSpGetDirectoryIDTcl _ANSI_ARGS_((CONST FSSpec * spec, long * theDirID, Boolean * isDirectory)); /* 9 */ EXTERN pascal short FSpOpenResFileCompatTcl _ANSI_ARGS_(( CONST FSSpec * spec, SignedByte permission)); /* 10 */ 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, |
| ︙ | ︙ | |||
246 247 248 249 250 251 252 |
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 */
| | | | | | 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 |
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 (*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 */
|
| ︙ | ︙ | |||
448 449 450 451 452 453 454 | #define FSpSetDefaultDir \ (tclIntPlatStubsPtr->fSpSetDefaultDir) /* 5 */ #endif #ifndef FSpFindFolder #define FSpFindFolder \ (tclIntPlatStubsPtr->fSpFindFolder) /* 6 */ #endif | | | | | | | | | | | | | | 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 | #define FSpSetDefaultDir \ (tclIntPlatStubsPtr->fSpSetDefaultDir) /* 5 */ #endif #ifndef FSpFindFolder #define FSpFindFolder \ (tclIntPlatStubsPtr->fSpFindFolder) /* 6 */ #endif #ifndef GetGlobalMouseTcl #define GetGlobalMouseTcl \ (tclIntPlatStubsPtr->getGlobalMouseTcl) /* 7 */ #endif #ifndef FSpGetDirectoryIDTcl #define FSpGetDirectoryIDTcl \ (tclIntPlatStubsPtr->fSpGetDirectoryIDTcl) /* 8 */ #endif #ifndef FSpOpenResFileCompatTcl #define FSpOpenResFileCompatTcl \ (tclIntPlatStubsPtr->fSpOpenResFileCompatTcl) /* 9 */ #endif #ifndef FSpCreateResFileCompatTcl #define FSpCreateResFileCompatTcl \ (tclIntPlatStubsPtr->fSpCreateResFileCompatTcl) /* 10 */ #endif #ifndef FSpLocationFromPath #define FSpLocationFromPath \ (tclIntPlatStubsPtr->fSpLocationFromPath) /* 11 */ #endif #ifndef FSpPathFromLocation #define FSpPathFromLocation \ |
| ︙ | ︙ |
Changes to generic/tclInterp.c.
1 2 3 4 5 6 7 8 9 10 11 | /* * 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. * | | | 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.12.1 2001/04/04 14:47:16 dgp Exp $ */ #include <stdio.h> #include "tclInt.h" #include "tclPort.h" /* |
| ︙ | ︙ | |||
945 946 947 948 949 950 951 |
}
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
| | | 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 |
}
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
* Tcl_GetAliasObj --
*
* Object version: Gets information about an alias.
*
* Results:
* A standard Tcl result.
*
* Side effects:
|
| ︙ | ︙ |
Changes to generic/tclListObj.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * 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. * | | | 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.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 |
listRepPtr->elemCount = objc;
listRepPtr->elements = elemPtrs;
objPtr->internalRep.otherValuePtr = (VOID *) listRepPtr;
objPtr->typePtr = &tclListType;
} else {
objPtr->bytes = tclEmptyStringRep;
}
}
/*
*----------------------------------------------------------------------
*
* Tcl_ListObjGetElements --
| > | 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/tclMain.c.
1 2 3 4 5 6 7 8 9 10 11 | /* * 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. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /* * 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. * * 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.2.1 2001/04/04 21:22:18 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 | * 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. */ extern int isatty _ANSI_ARGS_((int fd)); extern char * strcpy _ANSI_ARGS_((char *dst, CONST char *src)); static char *tclStartupScriptFileName = NULL; | > > > > | 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | * 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; |
| ︙ | ︙ |
Changes to generic/tclNamesp.c.
| ︙ | ︙ | |||
15 16 17 18 19 20 21 | * 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. * | | | 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.2.1 2001/04/03 22:54:37 hobbs 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 |
&& (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);
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;
/*
* Create an ImportRef structure describing this new import
* command and add it to the import ref list in the "real"
* command.
*/
| > > | 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.
*/
|
| ︙ | ︙ |
Changes to generic/tclObj.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * 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. * | | | 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.2.3 2001/07/16 23:14:13 hobbs Exp $ */ #include "tclInt.h" #include "tclPort.h" /* * Table of all object types. |
| ︙ | ︙ | |||
519 520 521 522 523 524 525 |
*/
#define OBJS_TO_ALLOC_EACH_TIME 100
void
TclAllocateFreeObjects()
{
| < < < | | | | 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 |
*/
#define OBJS_TO_ALLOC_EACH_TIME 100
void
TclAllocateFreeObjects()
{
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++) {
objPtr->internalRep.otherValuePtr = (VOID *) prevPtr;
prevPtr = objPtr;
objPtr++;
}
tclFreeObjList = prevPtr;
}
#undef OBJS_TO_ALLOC_EACH_TIME
/*
*----------------------------------------------------------------------
|
| ︙ | ︙ | |||
644 645 646 647 648 649 650 |
register Tcl_Obj *dupPtr;
TclNewObj(dupPtr);
if (objPtr->bytes == NULL) {
dupPtr->bytes = NULL;
} else if (objPtr->bytes != tclEmptyStringRep) {
| | < < < < < < < < | 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 |
register Tcl_Obj *dupPtr;
TclNewObj(dupPtr);
if (objPtr->bytes == NULL) {
dupPtr->bytes = NULL;
} else if (objPtr->bytes != tclEmptyStringRep) {
TclInitStringRep(dupPtr, objPtr->bytes, objPtr->length);
}
if (typePtr != NULL) {
if (typePtr->dupIntRepProc == NULL) {
dupPtr->internalRep = objPtr->internalRep;
dupPtr->typePtr = typePtr;
} else {
|
| ︙ | ︙ |
Changes to generic/tclParse.c.
1 2 3 4 5 6 7 8 9 10 11 | /* * 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. | | | | 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-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.2.1 2001/04/03 22:54:38 hobbs Exp $ */ #include "tclInt.h" #include "tclPort.h" /* * The following table provides parsing information about each possible |
| ︙ | ︙ | |||
1452 1453 1454 1455 1456 1457 1458 |
Tcl_LogCommandInfo(interp, script, parse.commandStart, commandLength);
}
for (i = 0; i < objectsUsed; i++) {
Tcl_DecrRefCount(objv[i]);
}
if (gotParse) {
| | > > > | > > | > > > > | > > > > > > > > > > | > > > > > > > > > > > > > > > > > | 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 |
Tcl_LogCommandInfo(interp, script, parse.commandStart, commandLength);
}
for (i = 0; i < objectsUsed; i++) {
Tcl_DecrRefCount(objv[i]);
}
if (gotParse) {
next = parse.commandStart + parse.commandSize;
bytesLeft -= next - p;
p = next;
Tcl_FreeParse(&parse);
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.
*
* 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/tclPlatDecls.h.
1 2 3 4 5 6 7 8 | /* * tclPlatDecls.h -- * * Declarations of platform specific Tcl APIs. * * Copyright (c) 1998-1999 by Scriptics Corporation. * All rights reserved. * | | > > > > > > > > > | 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.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 | /* * 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. * | | | 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.2.1 2000/08/07 21:32:40 hobbs Exp $ */ #include "tclInt.h" #include "tclPort.h" /* *---------------------------------------------------------------------- |
| ︙ | ︙ | |||
982 983 984 985 986 987 988 | #endif #if defined(SIGPOLL) && (!defined(SIGIO) || (SIGPOLL != SIGIO)) case SIGPOLL: return "SIGPOLL"; #endif #ifdef SIGPROF case SIGPROF: return "SIGPROF"; #endif | | | 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)) && (!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 | #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 | | | 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)) && (!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 | /* * 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. * | | | 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.2.1 2001/04/03 22:54:38 hobbs Exp $ */ #include "tclInt.h" /* * Flag values used by Tcl_ScanObjCmd. */ |
| ︙ | ︙ | |||
690 691 692 693 694 695 696 | op = 'i'; base = 0; fn = (long (*)())strtol; break; case 'o': op = 'i'; base = 8; | | | | 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 | op = 'i'; base = 0; fn = (long (*)())strtol; break; case 'o': op = 'i'; base = 8; fn = (long (*)())strtoul; break; case 'x': op = 'i'; base = 16; fn = (long (*)())strtoul; break; case 'u': op = 'i'; base = 10; flags |= SCAN_UNSIGNED; fn = (long (*)())strtoul; break; |
| ︙ | ︙ |
Changes to generic/tclStubInit.c.
1 2 3 4 5 6 7 8 9 10 | /* * 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. * | | | 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.2.2 2001/04/04 21:22:18 hobbs Exp $ */ #include "tclInt.h" #include "tclPort.h" /* * Remove macros that will interfere with the definitions below. |
| ︙ | ︙ | |||
225 226 227 228 229 230 231 |
TclHandleFree, /* 147 */
TclHandlePreserve, /* 148 */
TclHandleRelease, /* 149 */
TclRegAbout, /* 150 */
TclRegExpRangeUniChar, /* 151 */
TclSetLibraryPath, /* 152 */
TclGetLibraryPath, /* 153 */
| | | > > | 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 |
TclHandleFree, /* 147 */
TclHandlePreserve, /* 148 */
TclHandleRelease, /* 149 */
TclRegAbout, /* 150 */
TclRegExpRangeUniChar, /* 151 */
TclSetLibraryPath, /* 152 */
TclGetLibraryPath, /* 153 */
NULL, /* 154 */
NULL, /* 155 */
TclRegError, /* 156 */
TclVarTraceExists, /* 157 */
TclSetStartupScriptFileName, /* 158 */
TclGetStartupScriptFileName, /* 159 */
TclpMatchFilesTypes, /* 160 */
TclChannelTransform, /* 161 */
TclChannelEventScriptInvoker, /* 162 */
};
TclIntPlatStubs tclIntPlatStubs = {
TCL_STUB_MAGIC,
NULL,
#if !defined(__WIN32__) && !defined(MAC_TCL) /* UNIX */
TclGetAndDetachPids, /* 0 */
|
| ︙ | ︙ | |||
286 287 288 289 290 291 292 |
TclpSysAlloc, /* 0 */
TclpSysFree, /* 1 */
TclpSysRealloc, /* 2 */
TclpExit, /* 3 */
FSpGetDefaultDir, /* 4 */
FSpSetDefaultDir, /* 5 */
FSpFindFolder, /* 6 */
| | | | | | 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 |
TclpSysAlloc, /* 0 */
TclpSysFree, /* 1 */
TclpSysRealloc, /* 2 */
TclpExit, /* 3 */
FSpGetDefaultDir, /* 4 */
FSpSetDefaultDir, /* 5 */
FSpFindFolder, /* 6 */
GetGlobalMouseTcl, /* 7 */
FSpGetDirectoryIDTcl, /* 8 */
FSpOpenResFileCompatTcl, /* 9 */
FSpCreateResFileCompatTcl, /* 10 */
FSpLocationFromPath, /* 11 */
FSpPathFromLocation, /* 12 */
TclMacExitHandler, /* 13 */
TclMacInitExitToShell, /* 14 */
TclMacInstallExitToShellPatch, /* 15 */
TclMacOSErrorToPosixError, /* 16 */
TclMacRemoveTimer, /* 17 */
|
| ︙ | ︙ | |||
787 788 789 790 791 792 793 794 795 796 |
Tcl_GetAllocMutex, /* 387 */
Tcl_GetChannelNames, /* 388 */
Tcl_GetChannelNamesEx, /* 389 */
Tcl_ProcObjCmd, /* 390 */
Tcl_ConditionFinalize, /* 391 */
Tcl_MutexFinalize, /* 392 */
Tcl_CreateThread, /* 393 */
};
/* !END!: Do not edit above this line. */
| > > > > > > > > > > > > > > > > > > | 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 |
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 | /* * 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. | | | > | 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-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.2.2 2000/08/06 00:20:10 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 | 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)); /* * External (platform specific) initialization routine, these declarations * explicitly don't use EXTERN since this code does not get compiled * into the library: */ | > > > > | 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 |
(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);
| | | | 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", TestChannelCmd,
(ClientData) 0, (Tcl_CmdDeleteProc *) NULL);
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);
|
| ︙ | ︙ | |||
4238 4239 4240 4241 4242 4243 4244 |
if (!strcmp("testOpenFileChannel3%.fil", fileName)) {
return (TclpOpenFileChannel(interp, "__testOpenFileChannel3%__.fil",
modeString, permissions));
} else {
return (NULL);
}
}
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 | * * 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. * | | | 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.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 |
*/
Tcl_GetIndexFromObj((Tcl_Interp *) NULL, objv[1], tablePtr,
"token", 0, &index);
if (Tcl_GetIntFromObj(interp, objv[2], &index2) != TCL_OK) {
return TCL_ERROR;
}
| | > | 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 * 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 | /* * 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. * | | | 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.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 | 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 | | | 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 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 |
Tcl_ThreadId id;
ctrl.script = (char *) script;
ctrl.condWait = NULL;
ctrl.flags = 0;
Tcl_MutexLock(&threadMutex);
| | | 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, 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 |
Tcl_SetObjResult(interp, Tcl_NewLongObj((long)id));
return TCL_OK;
}
/*
*------------------------------------------------------------------------
*
| | | 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;
}
/*
*------------------------------------------------------------------------
*
* 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 | * * Side effects: * A TCL script is executed in a new thread. * *------------------------------------------------------------------------ */ Tcl_ThreadCreateType | | | 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
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 | /* * 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. * | | | 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.2.1 2001/07/16 23:14:13 hobbs Exp $ */ #include "tclInt.h" /* * Include the static character classification tables and macros. */ |
| ︙ | ︙ | |||
107 108 109 110 111 112 113 | * * Side effects: * None. * *--------------------------------------------------------------------------- */ | | | 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
*
* Side effects:
* None.
*
*---------------------------------------------------------------------------
*/
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) {
|
| ︙ | ︙ | |||
777 778 779 780 781 782 783 |
* 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;
| > | | 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 |
* 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 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 |
if (!isdigit(UCHAR(*p)) || (UCHAR(*p) >= '8')) { /* INTL: digit */
break;
}
count = 4;
result = (unsigned char)((result << 3) + (*p - '0'));
break;
}
result = *p;
count = 2;
break;
}
if (readPtr != NULL) {
*readPtr = count;
}
| > > > > > > > > > > | | 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 |
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((int) result, dst);
}
/*
*----------------------------------------------------------------------
*
* Tcl_UtfToUpper --
*
|
| ︙ | ︙ |
Changes to generic/tclUtil.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * 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. * | | | 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.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 |
if (objc == 0) {
*concatStr = '\0';
} else {
p = concatStr;
for (i = 0; i < objc; i++) {
objPtr = objv[i];
element = Tcl_GetStringFromObj(objPtr, &elemLength);
| | | | 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) && (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) && (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 | * 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. * | | | 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.2.1 2001/04/03 22:54:38 hobbs 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 |
"anymore", "donesearch", "exists", "get", "names", "nextelement",
"set", "size", "startsearch", "unset", (char *) NULL
};
Interp *iPtr = (Interp *) interp;
Var *varPtr, *arrayPtr;
Tcl_HashEntry *hPtr;
| | < | 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;
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 |
TCL_TRACE_ARRAY));
if (msg != NULL) {
VarErrMsg(interp, varName, NULL, "trace array", msg);
return TCL_ERROR;
}
}
switch (index) {
case ARRAY_ANYMORE: {
ArraySearch *searchPtr;
char *searchId;
if (objc != 4) {
Tcl_WrongNumArgs(interp, 2, objv,
| > > > > > > > | 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,
|
| ︙ | ︙ | |||
4765 4766 4767 4768 4769 4770 4771 |
Var *
TclVarTraceExists(interp, varName)
Tcl_Interp *interp; /* The interpreter */
char *varName; /* The variable name */
{
Var *varPtr;
Var *arrayPtr;
| < < | > | | | | > | | | | | | | < | | | | 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;
/*
* 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);
if (varPtr == NULL) {
return NULL;
}
if ((varPtr->tracePtr != NULL)
|| ((arrayPtr != NULL) && (arrayPtr->tracePtr != NULL))) {
CallTraces((Interp *)interp, arrayPtr, varPtr, varName,
(char *) NULL, TCL_TRACE_READS);
}
/*
* 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);
return NULL;
}
return varPtr;
}
|
Deleted library/dde/pkgIndex.tcl.
|
| < < < < < |
Changes to library/history.tcl.
1 2 3 4 | # history.tcl -- # # Implementation of the history command. # | | | 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.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 |
#
# Results:
# The index into history, or an error if the index didn't match.
proc tcl::HistIndex {event} {
variable history
if {[catch {expr {~$event}}]} {
| > | | 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)]} \
{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 | # 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. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # 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.2.1 2000/05/31 01:28:57 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 |
| ︙ | ︙ | |||
276 277 278 279 280 281 282 |
}
# 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
| | | | 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 |
}
# 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
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\""
}
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 |
set state(sock) $s
# Wait for the connection to complete
if {$state(-timeout) > 0} {
fileevent $s writable [list http::Connect $token]
http::wait $token
| < | > > > > > > > > > | < < < | 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 |
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 {[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
return $token
}
set state(status) ""
}
# Send data in cr-lf format, but accept any line terminators
|
| ︙ | ︙ | |||
445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 |
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.
| > > > > > | > > > | > | 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 |
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.
# 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 |
}
}
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
| > > > > > > > > > | 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 |
}
}
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 | # Arguments # token The token returned from http::geturl # # Side Effects # Sets the status of the connection, which unblocks # the waiting geturl call | | | < < | < < | | > > | 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 |
# 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]]} {
Finish $token "connect failed [fconfigure $state(sock) -error]" 1
} else {
set state(status) connect
fileevent $state(sock) writable {}
}
return
}
# http::Write
#
# Write POST query data to the socket
#
# Arguments
# token The token for the connection
|
| ︙ | ︙ | |||
776 777 778 779 780 781 782 |
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)
}
| < < < < | | 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 |
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)
}
return $state(status)
}
# http::formatQuery --
#
# See documentaion for details.
# Call http::formatQuery with an even number of arguments, where
|
| ︙ | ︙ |
Deleted library/http2.3/http.tcl.
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
Deleted library/http2.3/pkgIndex.tcl.
|
| < < < < < < < < < < < |
Changes to library/init.tcl.
1 2 3 4 5 | # init.tcl -- # # Default system startup file for Tcl-based applications. Defines # "unknown" procedure and auto-load facilities. # | | | 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.2.2 2001/04/03 22:54:38 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 |
# 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]
| | | 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 1 ::$cmd $arglist} result]
if {$ret == 0} {
return $result
} else {
return -code $ret -errorcode $errorCode $result
}
}
|
| ︙ | ︙ | |||
184 185 186 187 188 189 190 |
#
# 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;
| | | 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]
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 |
if {[string compare {} $new]} {
set errorCode $savedErrorCode
set errorInfo $savedErrorInfo
set redir ""
if {[string equal [info commands console] ""]} {
set redir ">&@stdout <@stdin"
}
| | | | | 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 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 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 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 |
# 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} {
| | | 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 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 |
# 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
| > > > > > > | | 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 |
# 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 1 [list ::namespace current]]
set patternList [auto_qualify $pattern $ns]
auto_load_index
foreach pattern $patternList {
foreach name [array names auto_index] {
if {[string match $pattern $name] && \
|
| ︙ | ︙ | |||
499 500 501 502 503 504 505 506 507 508 509 510 511 |
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 {[lsearch -exact $shellBuiltins $name] != -1} {
return [set auto_execs($name) [list $env(COMSPEC) /c $name]]
}
if {[llength [file split $name]] != 1} {
| > > > > > > | | 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 |
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} {
return [set auto_execs($name) [list $env(COMSPEC) /c $name]]
}
if {[llength [file split $name]] != 1} {
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 |
}
}
foreach dir [split $path {;}] {
# Skip already checked directories
if {[info exists checked($dir)] || [string equal {} $dir]} { continue }
set checked($dir) {}
| | | 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 |
}
}
foreach dir [split $path {;}] {
# Skip already checked directories
if {[info exists checked($dir)] || [string equal {} $dir]} { continue }
set checked($dir) {}
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 | # 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. # | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# 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.2.3 2000/08/08 17:53:42 hobbs Exp $
package provide msgcat 1.1
namespace eval msgcat {
namespace export mc mcset mclocale mcpreferences mcunknown
# Records the current locale as passed to mclocale
variable locale ""
|
| ︙ | ︙ | |||
63 64 65 66 67 68 69 |
}
}
}
set ns [namespace parent $ns]
}
# we have not found the translation
return [uplevel 1 [list [namespace origin mcunknown] \
| | | 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
}
}
}
set ns [namespace parent $ns]
}
# we have not found the translation
return [uplevel 1 [list [namespace origin mcunknown] \
$::msgcat::locale $src] $args]
}
# msgcat::mclocale --
#
# Query or set the current locale.
#
# Arguments:
|
| ︙ | ︙ | |||
166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 | # 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. | > > > | > > > | > | 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 |
# 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 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 | package ifneeded msgcat 1.1 [list source [file join $dir msgcat.tcl]] |
Deleted library/msgcat1.0/msgcat.tcl.
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
Deleted library/msgcat1.0/pkgIndex.tcl.
|
| < |
Changes to library/opt/optparse.tcl.
1 2 3 4 5 6 7 8 9 10 | # 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. # | | | | | 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 |
# 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.12.2 2001/04/03 22:54:38 hobbs Exp $
package provide opt 0.4.2
namespace eval ::tcl {
# Exported APIs
namespace export OptKeyRegister OptKeyDelete OptKeyError OptKeyParse \
OptProc OptProcArgGiven OptParse \
Lempty Lget \
Lassign Lvarpop Lvarpop1 Lvarset Lvarincr \
SetMax SetMin
################# Example of use / 'user documentation' ###################
proc OptCreateTestProc {} {
|
| ︙ | ︙ | |||
105 106 107 108 109 110 111 |
# programCounter :== {"P" integer+ }
#
# singleStep :== { instruction parameters* }
#
# instruction :== single element list
#
# (the difference between singleStep and program is that \
| | | | 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
# programCounter :== {"P" integer+ }
#
# singleStep :== { instruction parameters* }
#
# instruction :== single element list
#
# (the difference between singleStep and program is that \
# llength [lindex $program 0] >= 2
# while
# 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 |
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];
| | | 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 |
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 [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 |
# 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];
| | | | | | | | | | 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 |
# 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 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 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 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} {
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 {[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 [lindex $lst 0] 1 end] {
lappend res [Lget $lst $idx];
}
return $res;
}
# Advance to next description
proc OptNextDesc {descName} {
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 |
lappend adress 2
Lvarset descriptions $adress [list 1 $value];
# ^hasBeenSet flag
}
# empty state means done/paste the end of the program
proc OptState {item} {
| | | | | 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 |
lappend adress 2
Lvarset descriptions $adress [list 1 $value];
# ^hasBeenSet flag
}
# empty state means done/paste the end of the program
proc OptState {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} {
lindex $lst 0;
}
# Advance to next argument
proc OptNextArg {argsName} {
uplevel 1 [list Lvarpop1 $argsName];
}
#######
|
| ︙ | ︙ | |||
958 959 960 961 962 963 964 |
}
# Gets the value of one leaf of a lists tree
proc ::tcl::Lget {list indexLst} {
if {[llength $indexLst] <= 1} {
return [lindex $list $indexLst];
}
| | | | | 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 |
}
# 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 [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 [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 [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 |
# 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 {
| | | < < < < < < < < | | | 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 |
# 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 [lindex $indexLst 0];
set targetList [lindex $list $idx];
# reduce refcount on targetList
Lvarset1nc list $idx {};
# recursively replace in targetList
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;
}
# 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 [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 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 | # 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. | | | 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.2 [list source [file join $dir optparse.tcl]] |
Changes to library/opt0.4/optparse.tcl.
1 2 3 4 5 6 7 8 9 10 | # 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. # | | | | 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 |
# 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.12.1 2000/08/07 21:32:11 hobbs 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 \
SetMax SetMin
################# Example of use / 'user documentation' ###################
proc OptCreateTestProc {} {
|
| ︙ | ︙ | |||
105 106 107 108 109 110 111 |
# programCounter :== {"P" integer+ }
#
# singleStep :== { instruction parameters* }
#
# instruction :== single element list
#
# (the difference between singleStep and program is that \
| | | | 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
# programCounter :== {"P" integer+ }
#
# singleStep :== { instruction parameters* }
#
# instruction :== single element list
#
# (the difference between singleStep and program is that \
# llength [lindex $program 0] >= 2
# while
# 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 |
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];
| | | 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 |
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 [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
|
| ︙ | ︙ | |||
249 250 251 252 253 254 255 |
# (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];
| | | 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 |
# (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}";
}
|
| ︙ | ︙ | |||
273 274 275 276 277 278 279 |
}
#######
# Programs/Descriptions manipulation
# Return the instruction word/list of a given step/(sub)program
proc OptInstr {lst} {
| | | | | 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 |
}
#######
# Programs/Descriptions manipulation
# Return the instruction word/list of a given step/(sub)program
proc OptInstr {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 {[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 [lindex $lst 0] 1 end] {
lappend res [Lget $lst $idx];
}
return $res;
}
# Advance to next description
proc OptNextDesc {descName} {
|
| ︙ | ︙ | |||
344 345 346 347 348 349 350 |
lappend adress 2
Lvarset descriptions $adress [list 1 $value];
# ^hasBeenSet flag
}
# empty state means done/paste the end of the program
proc OptState {item} {
| | | | 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 |
lappend adress 2
Lvarset descriptions $adress [list 1 $value];
# ^hasBeenSet flag
}
# empty state means done/paste the end of the program
proc OptState {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} {
lindex $lst 0;
}
# Advance to next argument
proc OptNextArg {argsName} {
uplevel [list Lvarpop1 $argsName];
}
#######
|
| ︙ | ︙ | |||
958 959 960 961 962 963 964 |
}
# Gets the value of one leaf of a lists tree
proc ::tcl::Lget {list indexLst} {
if {[llength $indexLst] <= 1} {
return [lindex $list $indexLst];
}
| | | | | 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 |
}
# 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 [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 [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 [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 |
# 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 {
| | | < < < < < < < < | | 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 |
# 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 [lindex $indexLst 0];
set targetList [lindex $list $idx];
# reduce refcount on targetList
Lvarset1nc list $idx {};
# recursively replace in targetList
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;
}
# 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 [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;
|
| ︙ | ︙ |
Changes to library/package.tcl.
1 2 3 4 5 | # package.tcl -- # # utility procs formerly in init.tcl which can be loaded on demand # for package management. # | | | 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.2.1 2001/04/03 22:54:38 hobbs 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 |
# Defaults to [info sharedlibextension]
#
# Results:
# Returns 1 if the extension matches, 0 otherwise
proc pkg_compareExtension { fileName {ext {}} } {
global tcl_platform
| < | < | > > > > | > > > > > > > > > > > > > > > | 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]} {set ext [info sharedlibextension]}
if {[string equal $tcl_platform(platform) "windows"]} {
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} {
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"
|
| ︙ | ︙ | |||
144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 |
cd $oldDir
set c [interp create]
# Load into the child any packages currently loaded in the parent
# interpreter that match the -load pattern.
foreach pkg [info loaded] {
if {! [string match $loadPat [lindex $pkg 1]]} {
continue
}
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} {
| > > > > > > > > > > > > > | 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 |
}
} msg] == 1} {
set what [$c eval set ::tcl::debug]
if {$doVerbose} {
tclLog "warning: error while $what $file: $msg"
}
} else {
set type [$c eval set ::tcl::type]
set cmds [lsort [$c eval array names ::tcl::newCmds]]
set pkgs [$c eval set ::tcl::newPkgs]
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]
}
| > > > > > > > > | 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 |
# 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} {
| | | 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 -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 |
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 {
| > | | 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 \
* 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 |
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
}
| | | 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 -directory $dir -nocomplain *] {
if {[file isdirectory $x] && ![info exists procdDirs($x)]} {
set dir $x
tclMacPkgSearch $dir
set procdDirs($dir) 1
}
}
}
|
| ︙ | ︙ |
Changes to library/safe.tcl.
| ︙ | ︙ | |||
8 9 10 11 12 13 14 | # 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. # | | | 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.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 |
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
}
| | | 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 -directory $dir -nocomplain *] {
if {([file isdirectory $sub]) \
&& ([lsearch -exact $res $sub]<0) } {
# new sub dir, add it !
lappend res $sub
}
}
}
|
| ︙ | ︙ |
Changes to mac/MW_TclAppleScriptHeader.pch.
| ︙ | ︙ | |||
8 9 10 11 12 13 14 | * 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. * | | < < < < < < < < < < < | 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.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 USE_TCL_STUBS |
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 | * 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. * | | < < < < < < < < < | < < < < < < < | 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.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 "MW_TclHeaderCommon.h" |
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 | /* | | | | | < | < < < < < < | < < < < < | | 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_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.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 BUILD_tcl 1 #define STATIC_BUILD 1 #define TCL_DEBUG 1 #define TCL_THREADS 1 #include "MW_TclHeaderCommon.h" |
Changes to mac/README.
1 2 | Tcl 8.3 for Macintosh | < < < < < < < < | | 1 2 3 4 5 6 7 8 9 10 | Tcl 8.3 for Macintosh RCS: @(#) $Id: README,v 1.12.2.1 2001/04/03 22:08:32 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/ |
| ︙ | ︙ | |||
71 72 73 74 75 76 77 | current release notes please check this page: http://dev.scriptics.com/doc/howto/compile.html#mac If you have comments or Bug reports send them to: Jim Ingham jingham@cygnus.com | < | 63 64 65 66 67 68 69 | current release notes please check this page: http://dev.scriptics.com/doc/howto/compile.html#mac If you have comments or Bug reports send them to: Jim Ingham jingham@cygnus.com |
Changes to mac/tclMac.h.
1 2 3 4 5 6 7 8 9 10 | /* * 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. * | | < < < < < < < < < < | 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.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> typedef int (*Tcl_MacConvertEventPtr) _ANSI_ARGS_((EventRecord *eventPtr)); #include "tclPlatDecls.h" #endif /* _TCLMAC */ |
Changes to mac/tclMacAlloc.c.
| ︙ | ︙ | |||
10 11 12 13 14 15 16 | * 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. * | | > > | > > > > > > > > > > | | | 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.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 (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;
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 |
TclpSysRealloc(
VOID *oldPtr, /* Original block */
unsigned int size) /* New size of block. */
{
Handle hand;
void *newPtr;
int maxsize;
| > > | > > > > > > > > > > > | > > | 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 = ((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) {
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 |
VOID *
TclpSysAlloc(
long size, /* Size of block to allocate. */
int isBin) /* Is this a bin allocation? */
{
Handle hand = NULL;
ListEl * newMemoryRecord;
if (!(memoryFlags & MEMORY_ALL_SYS)) {
/*
* If the guard handle has been purged, throw it away and try
* to allocate it again.
*/
| > > > > > > > > > > > > > > > > > > > > > > > > > | 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 |
* 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) {
HPurge(toolGuardHandle);
}
}
/*
* If we got the handle, lock it and do our allocation.
*/
if (toolGuardHandle != NULL) {
HLock(toolGuardHandle);
| > | < < | < < < < < < < > > > > > > > > > | > > < < < < < < < < < < < < < < < < < > > > | > > > > > > > | > > > > > | | 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 + tclExtraHdlSize);
HUnlock(toolGuardHandle);
}
}
if (hand == NULL) {
/*
* 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 + tclExtraHdlSize);
}
}
if (hand == NULL) {
return NULL;
}
if (isBin) {
HLockHi(hand);
} else {
HLock(hand);
}
if(tclUseMemTracking) {
/* Only need to do this when tracking memory */
newMemoryRecord = (ListEl *) *hand;
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 |
*----------------------------------------------------------------------
*/
void
TclpSysFree(
void * ptr) /* Free this system memory. */
{
| | > > | > > > > | > > > > > > > > | > | < < > | 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. */
{
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));
}
}
/*
*----------------------------------------------------------------------
*
* CleanUpExitProc --
*
|
| ︙ | ︙ | |||
267 268 269 270 271 272 273 274 275 276 |
*/
static pascal void
CleanUpExitProc()
{
ListEl * memRecord;
while (systemMemory != NULL) {
memRecord = systemMemory;
systemMemory = memRecord->next;
| > > < | | < | 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;
DisposeHandle(memRecord->memoryHandle);
}
}
}
/*
*----------------------------------------------------------------------
*
* FreeAllMemory --
|
| ︙ | ︙ | |||
300 301 302 303 304 305 306 307 308 309 |
*/
void
FreeAllMemory()
{
ListEl * memRecord;
while (systemMemory != NULL) {
memRecord = systemMemory;
systemMemory = memRecord->next;
| > > < | < < < | | < | 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;
DisposeHandle(memRecord->memoryHandle);
}
while (appMemory != NULL) {
memRecord = appMemory;
appMemory = memRecord->next;
DisposeHandle(memRecord->memoryHandle);
}
}
}
/*
*----------------------------------------------------------------------
*
* ConfigureMemory --
|
| ︙ | ︙ |
Changes to mac/tclMacAppInit.c.
1 2 3 4 5 6 7 8 9 10 11 | /* * 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. * | | | | 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.12.1 2001/04/04 21:22:18 hobbs 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> 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)); |
| ︙ | ︙ |
Changes to mac/tclMacApplication.r.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * 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. * | | | 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.2.1 2001/04/04 21:22:18 hobbs Exp $ */ #include <Types.r> #include <SysTypes.r> /* * The folowing include and defines help construct |
| ︙ | ︙ | |||
38 39 40 41 42 43 44 |
# define MINOR_VERSION TCL_MINOR_VERSION * 16
#endif
resource 'vers' (1) {
TCL_MAJOR_VERSION, MINOR_VERSION,
RELEASE_LEVEL, 0x00, verUS,
TCL_PATCH_LEVEL,
| | | | | 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 |
# 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" "\n" "© 2000 Ajuba Solutions"
};
resource 'vers' (2) {
TCL_MAJOR_VERSION, MINOR_VERSION,
RELEASE_LEVEL, 0x00, verUS,
TCL_PATCH_LEVEL,
"Tcl Shell " TCL_PATCH_LEVEL " © 1993-2000"
};
#define TCL_APP_CREATOR 'Tcl '
type TCL_APP_CREATOR as 'STR ';
resource TCL_APP_CREATOR (0, purgeable) {
"Tcl Shell " TCL_PATCH_LEVEL " © 1993-2000"
};
/*
* 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.
|
| ︙ | ︙ |
Changes to mac/tclMacChan.c.
1 2 3 4 5 6 7 8 9 10 11 | /* * 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. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /* * 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.12.1 2001/04/04 21:22:19 hobbs Exp $ */ #include "tclInt.h" #include "tclPort.h" #include "tclMacInt.h" #include <Aliases.h> #include <Errors.h> |
| ︙ | ︙ | |||
132 133 134 135 136 137 138 |
/*
* This structure describes the channel type structure for file based IO:
*/
static Tcl_ChannelType consoleChannelType = {
"file", /* Type name. */
| | | | 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 |
/*
* This structure describes the channel type structure for file based IO:
*/
static Tcl_ChannelType consoleChannelType = {
"file", /* Type name. */
(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. */
(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. */
|
| ︙ | ︙ |
Changes to mac/tclMacCommonPch.h.
1 2 3 4 5 6 7 8 9 10 11 12 13 | /* * 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. * | | | 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.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 | * The define is used most everywhere to tell Tcl (or any Tcl * extensions) that we are compiling for the Macintosh platform. */ #define MAC_TCL | < < < < < < < < < < < < < < < < < > | < | 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 /* * 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 Metrowerks Pro 6 MSL */ #include <UseDLLPrefix.h> |
Changes to mac/tclMacFCmd.c.
1 2 3 4 5 6 7 8 9 10 11 | /* * 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. * | | | 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.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 |
}
if (err == noErr) {
FSMakeFSSpecCompat(dstFileSpec.vRefNum, dstFileSpec.parID,
tmpName, &tmpDirSpec);
err = FSpDirCreateCompat(&tmpDirSpec, smSystemScript, &tmpDirID);
}
if (err == noErr) {
| | | 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, 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/tclMacInt.h.
1 2 3 4 5 6 7 8 9 10 | /* * 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. * | | | | | | < < > > > > > | > | < < | 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 |
/*
* 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.2.1 2001/04/04 21:22:19 hobbs Exp $
*/
#ifndef _TCLMACINT
#define _TCLMACINT
#ifndef _TCLINT
#include "tclInt.h"
#endif
#ifndef _TCLPORT
#include "tclPort.h"
#endif
#include <Events.h>
#include <Files.h>
/*
* 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);
# undef TCL_STORAGE_CLASS
# define TCL_STORAGE_CLASS DLLIMPORT
#include "tclIntPlatDecls.h"
#endif /* _TCLMACINT */
|
Changes to mac/tclMacLibrary.c.
| ︙ | ︙ | |||
9 10 11 12 13 14 15 | * 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. * | | > > > > > > > > > | 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.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 | /* * 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. * | | | 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.2.1 2001/04/04 21:22:19 hobbs Exp $ */ #include <Types.r> #include <SysTypes.r> /* * The folowing include and defines help construct |
| ︙ | ︙ | |||
38 39 40 41 42 43 44 |
# define MINOR_VERSION TCL_MINOR_VERSION * 16
#endif
resource 'vers' (1) {
TCL_MAJOR_VERSION, MINOR_VERSION,
RELEASE_LEVEL, 0x00, verUS,
TCL_PATCH_LEVEL,
| | | | 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" "\n" "© 2000 Ajuba Solutions"
};
resource 'vers' (2) {
TCL_MAJOR_VERSION, MINOR_VERSION,
RELEASE_LEVEL, 0x00, verUS,
TCL_PATCH_LEVEL,
"Tcl Library " TCL_PATCH_LEVEL " © 1993-2000"
};
/*
* 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 |
resource 'FREF' (TCL_LIBRARY_RESOURCES, purgeable)
{
'shlb', 0, ""
};
type TCL_CREATOR as 'STR ';
resource TCL_CREATOR (0, purgeable) {
| | | 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 " © 1993-2000"
};
/*
* 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 |
* 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. "
| | | 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
* 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 Language¹ 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
|
| ︙ | ︙ |
Deleted mac/tclMacMSLPrefix.h.
|
| < < < < < < < < < < < < < < < < < < < < < < < < |
Changes to mac/tclMacMath.h.
| ︙ | ︙ | |||
8 9 10 11 12 13 14 | * 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. * | | | 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.18.1 2001/04/04 21:22:19 hobbs Exp $ */ #ifndef _TCLMACMATH #define _TCLMACMATH #include <math.h> |
| ︙ | ︙ | |||
131 132 133 134 135 136 137 | # ifdef floor # undef floor # define floor floord # endif #endif #endif | | | 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)) #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 | * 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. * | | | 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.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 |
Rect mouseRect;
/*
* Check for mouse moved events. These events aren't placed on the
* system event queue unless we call WaitNextEvent.
*/
| | | 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.
*/
GetGlobalMouseTcl(¤tMouse);
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 |
}
/*
* Process events from the OS event queue.
*/
while (needsUpdate || (GetEvQHdr()->qHead != NULL)) {
| | | 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)) {
GetGlobalMouseTcl(¤tMouse);
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 |
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.
*/
| | | 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.
*/
GetGlobalMouseTcl(¤tMouse);
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 | * * 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. * | | | 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.2.1 2001/04/04 21:22:19 hobbs Exp $ */ #define MAC_TCL #include <Aliases.h> #include <string.h> #include <AppleEvents.h> |
| ︙ | ︙ | |||
2116 2117 2118 2119 2120 2121 2122 |
if ((err != noErr) && (err != fnfErr)) {
Tcl_AppendResult(interp,
"Error getting a location for the file: \"",
fileName, "\".", NULL);
return TCL_ERROR;
}
| | | | 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 |
if ((err != noErr) && (err != fnfErr)) {
Tcl_AppendResult(interp,
"Error getting a location for the file: \"",
fileName, "\".", NULL);
return TCL_ERROR;
}
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 = FSpOpenResFileCompatTcl(&fileSpec, fsRdWrPerm);
if (fileRef == -1) {
Tcl_AppendResult(interp, "Error reading the file: \"",
fileName, "\".", NULL);
result = TCL_ERROR;
goto rezEvalCleanUp;
}
UseResFile(fileRef);
|
| ︙ | ︙ | |||
2303 2304 2305 2306 2307 2308 2309 |
Tcl_DStringFree(&buffer);
if (err != noErr) {
Tcl_AppendResult(interp, "Error finding the file: \"",
fileName, "\".", NULL);
return TCL_ERROR;
}
| | | 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 |
Tcl_DStringFree(&buffer);
if (err != noErr) {
Tcl_AppendResult(interp, "Error finding the file: \"",
fileName, "\".", NULL);
return TCL_ERROR;
}
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.
|
| < |
Changes to mac/tclMacOSA.r.
1 2 3 4 5 6 7 8 9 10 | /* * 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. * | | | | | | | | | | | | | 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.2.1 2001/04/04 21:22:19 hobbs 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 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" "\n" "© 2000 Ajuba Solutions"
};
resource 'vers' (2) {
SCRIPT_MAJOR_VERSION, MINOR_VERSION,
RELEASE_LEVEL, 0x00, verUS,
SCRIPT_PATCH_LEVEL,
"Tclapplescript " SCRIPT_PATCH_LEVEL " © 1996-2000"
};
/*
* 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 Language¹ 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.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 | /* * 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. * | | > | 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.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 |
SysBeep(1);
} else {
SetPortWindowPort(macWinPtr);
GlobalToLocal(&event.where);
part = FindControl(event.where, macWinPtr,
&okButtonHandle);
| | | 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 ((kControlButtonPart == part) &&
(TrackControl(okButtonHandle,
event.where, NULL))) {
done = true;
}
}
break;
case keyDown:
|
| ︙ | ︙ | |||
171 172 173 174 175 176 177 |
SetPortWindowPort(macWinPtr);
TextFont(systemFont);
BeginUpdate(macWinPtr);
if (stopIconHandle != NULL) {
PlotIcon(&iconRect, stopIconHandle);
}
| | | 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);
}
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 | /* * 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. * | | | 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.2.1 2001/04/04 21:22:19 hobbs Exp $ */ #ifndef _MACPORT #define _MACPORT #ifndef _TCLINT |
| ︙ | ︙ | |||
51 52 53 54 55 56 57 | # 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. */ | | | | 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 | # 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 # 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 /* __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. | > > | 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 | #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) /* * Make sure that MAXPATHLEN is defined. */ #ifndef MAXPATHLEN # ifdef PATH_MAX | > > > > > | 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 |
| ︙ | ︙ | |||
281 282 283 284 285 286 287 | typedef int TclpMutex; #define TclpMutexInit(a) #define TclpMutexLock(a) #define TclpMutexUnlock(a) #endif /* TCL_THREADS */ typedef pascal void (*ExitToShellProcPtr)(void); | | | < | > > > | 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 | typedef int TclpMutex; #define TclpMutexInit(a) #define TclpMutexLock(a) #define TclpMutexUnlock(a) #endif /* TCL_THREADS */ typedef pascal void (*ExitToShellProcPtr)(void); #include "tclMac.h" // contains #include "tclPlatDecls.h" #include "tclIntPlatDecls.h" # undef TCL_STORAGE_CLASS # define TCL_STORAGE_CLASS DLLIMPORT #endif /* _MACPORT */ |
Changes to mac/tclMacProjects.sea.hqx.
1 | (This file must be converted with BinHex 4.0) | | > | < > | < | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | > > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | < < | > > | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > > > > > | > > > > > > | < > > > > > | | | | | | | | | | | < | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | < < < < < < < < < < < < < < | | | | | | | | | | | | | | | | | | | | | | > > > > > | | | | | | | | | | | | | | | | | < < < | | | > | | | | | | | | | | | | | | | | | | | < | > > | < > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | < < < | < < > > | > > > | | | | | | > | | | < | > | < < < | > > > | | | > | < | | | | | > > | < < | | < < | < < | > | < < | | > > > > > | | | | | | | | > > > > | | | < < < < < < < < < < | | | > > > | < | > | > > > > > > > | | > | | | | | | | | | | | | | < < < | | | | | < < < < < < < > | | | | < > > > | | < < | > > > > > < < < < < | > | < > > | < < < | < > > > | < < > > | > > > < < < | | | | | | > > | > | | | < < | | | | | 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 |
(This file must be converted with BinHex 4.0)
:%R4ME%eKBe"bEfTPBh4c,R0PB3""8&"-BA9cG#%!N!1irJ!"Nl91Je0dG@CQ5A3
J+'-T-6Nj0bda16Ni)%&XB@4ND@iJ8hPcG'9YFb`J5@jM,L`JD(4dF$S[,hH3!bj
KE'&NC'PZFhPc,Q0[E5p6G(9QCNPd,`d+'J!&%!!!Z2i!N!0b!!%!N!0bm(`0TD9
5CA0PFRCPC+@P!+@3"!%!!$J!3,Ea6[1fm8mc!*!0#+H$!*!$cJ!0K$!!!,J`!!)
Y2L"#G@PXC!!!&e)!43!L!9-#3J(!rj!%!alrq2r`bd3!!)!!N!HPN!3"!!!f!%#
d(A&cY`Y3"!#3!h)!!,IR!*!$FJ!'V@`!!!%S!!f#5J!!YVm!"#dq)(4ME!!!UV8
!I3!3!GN"`!(!rj!%!alrq2r`bd!!!)!!N!HPN!3"!!"!!!#f"X)LY[%qG3#3!mi
!!##e!*!$cJ!3)r8!!PXD!!!I+3#3"!m!3Np"Ae4ME&0SC@aXFbl2J!!!3,*069"
b3eG*43%!rj!%!*!+J(!!N!C#`G6(%)!JUNrXG&95kD&*R9PD2))ceM6*#M!miQp
GY(1#221Vi@,r,&UQT,,!FY-0H0eEpm[QB!9+8K1eYGiE!3LDrUVYRm8p8,HYeA[
&bZ&kE"8DUX`JDH'd1,E`4N95fQ*N5lTpDGCiMC3"TBiQ9BCHV@p%3heS@2cM#fe
T%9DP@E$KbF5+`5+3!'SH8!1+kHlHFj5-1Q0[9Nd*a%aQ,"51dVCKV@13!1pSRq$
ee(YjGd6h1cm5V8MeVbemGTMEajYl9@DMLp-'QZ@C&lV&`I1r'S5UAIebG))CVF1
F42HdK2f#k6N'mrbq2ibj`)5M2NkfcfPi'[`JqP-(k,H-+,CF#"e`S9`QXjVS!Pi
K,#S5@0#0JPJ(8[8CUqJ$QLe@&lYJ&T`Ea,ij%6-d%p5bY*rqYdHT(CXBbb9K9H&
-M@5#QCRqDfNbV)HU'S2dp1pdDMEAhCJ[f*m"9bH+SI0b1Ip$8Gekb[XAF%*M"@I
B@1$T$5k-CJb`NbriU[j'[U,Z5k`d!'21!&I3iCcbCL6IE6YSCPTLX08QhIM%a"L
'GPf2%jk'#SC6dh!H6R+fSN2R64-CL#5RrG5@aF*Jj-c"j!e+V2HD-K@6[acJeHJ
mB)AX1R4!h3bSJ(EMc006')VUdlKTMfBam4@rlB+&*am,B2",F&VMAV(e$*5QhY5
21!j('V4B9T2$LFQ$18!GfX*!R8!SRVT-cPIAhJ3D44JVeNXcTZU4a-'b3NN)GpR
i+kF%!+-GKb[2-e&ZIY+#)5`AC!,`@YaaPUb2"rV5dL'mjKr,hqMehJQGFS5fMb2
)[[-Y@4(CC8TL9'DHf9mp0'$@U9h[ENADJ$55i63IBqK+kVIML(EUL*JP4VG-8BB
XFUF+UMr'M5XL)ZK&V&r"%&dS0$f5L6[f0A@QV[0d,QT"0GIQPD9+*Z8I(3`c)6T
5+RE+*E9mRL0D1ZrT&lYH"%#aS4-i@VpXp)KL(LDe9-06V('C[4Hllq*+pJ6$r'd
MpcYLC#k8YDJPG4AHY5GmX*c`0%kMP8$UkX%Uaq&Z4K1q2R@TKYp`qPUPbE$lm'm
YC[hT@BC,+YkCMkXc&BPiVqbjM54+bbaIG#@VlF1&im@5)8c#Z1$5N9Miq$541A@
CmPP2KR2L!ViSIpIYY@PB',qm`2F!hGcJAXPSX2jaceJPjFrk4@'SHmDe0+#cp9h
&&hPm"TbNffUBqTBXXZY,Qe(PfeIirjjHkfGhrBNYrGkXNT!!YcmD+Pl5TrPA9h+
BJMpSL`960-FYB1+T2!KXBiNkkV0!MGU,2-NlfK9#kTFl8VlrB2l"T2f0eG9brii
DI)l)r(ShG1'2HQ[dIiJ+S#f,m$`r-CU4-EESh"F1*5GRI[9!D1DcY#rp@mkA3d+
fQ'#DLYRj5l!4Sq!%,1I2LaL%CI@Vb2M88*%U'6A3N9Tc([pV(#I,,Y0p$ekDhh9
S!p4)f'DlH61b"$'jqZ,hr0GEdd&4lVR[#Y@'S2F56D0kR(FfjhL[2$%8!AMlN!$
p,!+"PQiIJN!8aD`bZe+p%BqkR'P#G$Fc3Fp"YV0&[%0"JFL5S$6XqqU#C"6V"'p
M*p[-,flmGU`M(9@UG[UFfF6+i9lH(M9H@1d(2!KP4G8kk!"rp'K[1k6+$lVr[e[
B(qI[D1''j`Eil@Da%M3aB8&BEqf*!`TXU4prHH'!5FSmq`Z!IN*(MiYjG'pdfk8
Q(jZ04L)T4,h!iAFbCiBm@S03bbN(b2pRb44RJ9K&3!lM@QZCm2'EGr6ZGR+KX0&
V-B8H%+JDqcUKK2U*AYpJZB0JVMUj$a6Z3[p2)hQal$$Zm`2d"d*d@a6@YUqj1@"
@$rJTa0Q6dQbi['!Q+P!U'+fMdr500idC6ThKd6L-AE)VFM+X@X(0JUTT'q%RDUe
jSLH@&c&4#UHIU)DkcLCr`J$"i8IS(+$HRf2!6P)9bA2SPd-l`DDa%`VRV0P#FJ`
C6NHiSf&l(-ZdcHiH#kFH&'TZ,Tq8Xc*KEk8bD8kNE2+rDCFm$-1-[[%85$TNSM[
Z(H-6idblV8TlX`kV*"YZ-Cm8'A)#2UIDam2E-ej)d`Td[mje*GMf`iR'1k'T`f3
MQCMX'L(j''-phNUYYi$e$[XSfQJB-H!4-1E*9%EjN98b2Tj#RP`B[%YV42,b&0(
U2,rZCDZfmL5D3[!IKJG,a[!'`hDZVQ#aBK#HkYYkT-0@%kmdaH`h4icH22h(mrR
qhpldhS'dcl!AlC%-*d9rC1qVc%k2l%m`&-2BF'AXj%fY8b6@,V2c[f"jKS,q*Fk
G)S1H[%5CGSD['$VEfhK,*HkEB%ke`H*f25rBq%GcL*bm5beBI,[Rd+5$jU8[!EQ
%XZR'V1@!4S`+MDMB&!Z9"(+NjQYdckdX3NP@rk0D5N2024BSU*hkjj*$YAE`H"6
jVZSIhMb#Fc!bmX"eriG%[@RhV#I$rkYi*e1M%(Q+[F,mqAHa[@dKq9IYT)h201-
)Br@3!'#(eE1-8)mVcBJS,%2hdSN91d*XLXPJX4Q[Xi,NVBV(Z%50lCJ1c31*BS4
h#,-9P(*r[PCIID%Q+&pmJ6BJJ86NYR3CeG0X[1)+fKQb!rRQ6$[0)pKC-+#*J`&
)N!!Z!iAf0([6,Z#i+NUrK!C%PcBU&TN)Km&V'IkNlT%ELqb"lQSAcB8QbNq19KI
afFYA9d!bhUr!GH1e*B`2qp8C(@jHa-JCf2mreLCMfJVRZ@,eB"A'iHk,5-+S1ml
9f2I94&SCPaD8UZ'9T0p`THEk#NqK*kX,U$UQK[%$e2Cc#LVe[Q!paS$(aEa5bEq
f+($@JF)$qK*44$ZXCr,c'Fm5SVSFi&HZ*+Z[mZmp$9E!M``AlRG(cG&SAq,Q@lK
ib*T*-1p1b0NJ"4dbmQ0!pM%@BiGI-08k2Db9bA0i4XlLTB(@j*!!j$p#fl)CIK#
jMKUK$2M"([Ji"iB[lXD23HEJ9@MQcjq%!MA6pBL@Xhp+ITqjLr6qe4#Z-VjBF%Z
-P`LH4KMe,#[+mAkAQr4Y69a&RUbH(`6-6mK)b0LcDL+iaX&JGe"X19+Me%eajm"
03V+af((U[XmT2![a")(NUL0)FL-aA-Ma&"L'SaVk6rc+'Rl8-E20)6lhhFLCr&C
UAcIHf#qjeT`a1TSqZ"G'q1rDHcjT+4+[,#J@R85Fb6ER6a6aXAm&E+q'hQV)UfP
mG-fm2(Ub9fAmP)QPGHLR90@8fFT%31-[F(hjUjN8%kBQ)6V(9(,J+p$a!AL-pXJ
25TDa84AM4!U%1*l4d9J(P0d'JSX(YBbXTkT%b"qBVF%rF#VNKl8(UClC@H*C$Q5
T9DhX'QTXK6k4'*LZR!h[(id[RTB2je+4Ze`,fRk#1ARaq')ZH9@6D&+SX4h328B
F5Jmp92XhdGT"+h)48q[Q&GAUB$dGrlQR#A4&fCU%jPcUp`G0Pi*+Srl-!+pN831
l-mHilFH63G(RdXPVUF%XIa5bf3#-RpIAcqpZeNTK3,dqR,@03Ni9CLBb0l%E@2%
S+CS6lr"rkhLqGG8hH[HT8,@[K`GbNaXJ1%28er%1hfm(4B4f*kDrFPGEd#ZV*hi
SJY+fccV20[F4ZCcdrfRJJGk(B([[dQ(hdZaZ*("YkU-eb511rdHTUFIpf#AGEdY
H5l'61GaGqX5%1Qe$FYIHC%B9p3#FqRpJF4+kPVhM,b##T8lec#LFBl)EA&Peh*d
lE*!!bMZ@0!e+r8ZX"22QAmX@VUfp5TVhq&9m+XNN+RJ$j''(df545KP6E5SQ1GY
!0FMec!ReMY!YbP&i$P[SeY6EbmQY6KKGC!`$%@KQD0f,*k9NAJCS#JAk+!hIAh3
d*X`))0h61m2ITRc)UKdfZ@PihcN&YSlA'LiV%RYib"NdA!42BCJhk[FbLc68XP"
j5pS&6EJG82%IKDp[**fKZ'hBAX&G'Xbhj&22Ub``@#9i)NH)ZX(FBa3F'9bd#pA
!5Q1P(,Jbe)pe5NZ,EZX0*#4)8(Gbi1(cUp2kpTEbM#,JS4(,Yr40+1D`D9!#MJU
fkHj&c)@"bChmD(S9LkQ`i9eAE9$!C$LQ3d#K8`L@181hf*BME"251CfMSF9ZIVH
)'AU830JU,[e6@bX(D3pmE`1Vf1I#Ki5!PB*'TH59'hl[J#5iIXGE,5S4qq!U6P1
!2$Qrq%Ea-AX%$B5GFPhhIkhrL%4qDE8!T!p0i$5N4#aEE-cMM)bj59!G&4"D8P+
,!rDSVbU[6Jf&H+rZZK6cba4GMHPkq8b!$aDPl)rQh-)'*8IaFMici6!QfU,2"XD
+T#[J4CMeJSNqP+JFSc3Z-GlLAbjSclaaH!KL*!5h`XqUPq3NbGN*Y60FDK$Kdid
G(2+e&VL9a2+0l,5E,8UT+Cq(P2VYC!9JG,eI8$X1KLb9XH&bKZ[T9kE4qpJfa!m
Y(b2DT!m1Kc$),V'HU8l`a-e8`lmcZ0l'aPh+"lf-E`M#mjL(l6ZC"BKfLal49'2
fQ@AdGhR5rL4H#L5U244(Lrj'Y0'H5RSjY43[&(P0l[V)Sb#*k8a82Ik6%biG0[P
KBPGK%VpbEDbI"ifA23qdHH`1EGDb1'+``Ie%0V*j*%5fl(FEmJi*HHF[AJB6c(m
d5h2k!X[`#abSEEI2NEH83(9K8kIHJbr!"baG!"c0M6R64r`J82[QmVU8F"!cY*)
MF@BqrbTpqA!#,TXDX@&Mfp55qjN4`PM0Pe1#)dMcNC4dBi4`LeBMD6UJ[LYXX#D
-VEiE&!k['Fbc84d8i(cG5F00QlA[eE6TjE,kGfG6*[,LG6$1Sl[c3p*Dl0l#P[c
bD3ZU8E6Sk)XiPS%f@4r6a6a8k8%aYqAGbEM-AE`M+jJcmbd[MU9Lj+V-3HAH-p0
Qj0c[p!b8Ui-k"DT"ilN5*-j!kL'YYkkENp[4TDXV'52VI,+8TMMUSdYGlcm3%$a
*8[5CR#mHK&K!@m6c%`UpHI+ieVZ'PlGrVK$Xe8+Ue,Ih"R!KBCrLjTVBZZV)am1
8H!h9mfFBcIZ,NRdS3qLJ*+U4LkNS*MkD"e5B(rK2@A8$!1j%(B@)YLJp-h-m56!
NVYl[X9BYcXjh!k%'A1&G&ai92c&KAc3LMBkC8NUa%Mm9H!PY",[YjZ*EQT!!E$$
$F*rD`eb5p'cNBJfL&YrRCp'CPUi*cP&YAHq+Qbfei5NbfqqBKZDXd4`c&EK)@`[
MBNVfPr4b`L!YKpJiY2Ri$"%,dFQTFh'd9lqHHmlZ6[CMK3Q@mHQd0ec@iQF&-h4
d6KFPjJ4'(2kNJVTABmCF!(jSPBA3hC%V(IT#%HKF,!QMN4'9CIM+1DCJdH!)PU)
iN6%Zi)4ARJ4JRQj@-d,L(4S#Jh[M#mJiMmc@!fi+QkDfGl3e0VFJNqLGpeEP1Gi
TE&X!2Z-@E1LBB[X06,HA$NGMF66PQj2rc"Q8T++D2(,-'+8XqeG-+hm@9HFb!)(
[P*dkQBHTb5re!b`"8bBh6`jbkd,bhK#9VeXqe[TLGP,U&BMENXa%$m*QbM@D3Ad
!aA-NHJP&[L)P1!X4b*dIEad&hIc@(9&*#I$NRRf+a"beNLmXT[HGPQEYmLZP"Nh
qlQ21(0PRMc0Df*1T+pPGFl++8d$&r4ZX[,64pbMX5F8-(Gq#'$ISrUhAGYZF[5a
l0K8kRFC54k%j!8BQLleHc36&GplF!EpSeYkLd3%K,AmVCPGGHEE#!$MGXMiRXQ0
(@0X!I%lPf@+RI[%a2Va8e(9CNIrqP$S-Z200rd`S1r,kFCPiUC1SM'(&r)jdQ!P
*1aK#MN@BM4M5ZB%%M-PpM`SR+%0-EJV-@9d'J&UG"YUN)iQE9U6&dC2,#kb&l"i
'2NIT"48%l6%2C@XPhAVUjm+mZ1%E%JAedi+B)YhAX`(Y+8keA(,b,pZYQ)5k+#T
4e*16bGE00ED5HiGLUcC'%K'6$6Hq9Q[&2&,#m'+@8Ffq@m)M6d&,X,#2GJ+J*6p
3q*VB'QqRJGpVkZLY*dQff4)!rlEd3d%T@Bqcp1NS@pfHmVb4RiT[d64$TjMI#b*
XHi[drAaGhCEi+&E*`14)T+IKqih$b2R[RKVZX&%LiP,,DkVTJj@fbAD[`@+E(a$
hGbHadLd$6i485Qc*,b9Ul@"(R'GUj9j5CH&$46QBDfY`55-d8((!KVl+B%Ub'p!
rl4`N9f3hS5AV(I`*C%&&JDd0pB'0cP8PrG5D)(DQ6mT*eA6mr5'f*''4jpaN"Ub
DM+TUKhNP`X5[rq3Tel4XKHaXVYpCT)4F[q3h+(ESLhBql8)FH*FILj1'H5K+H5R
cUQNaef1I&UK&-*bJCeLaf*)9)5[P4a6AVdFflp-i,TH-1KBH!Xe#AR#r-KaE*0B
*8,&QCjpBEq&$`6P[NB%Z"E[""![J058!FT-m3&A!1"Q(%fFkjH"QK8+RM8dP+19
`6Y(8r!XLlbBM"@fP(LFNi%C"CjFqFZ-"apCi0Ahb0"%@j589(c1H&dj6*m(fD,`
(1T28!0l"0qRFaHMrGr#-jkC8m2$KG2D%6f'1)2$2Srf3!&["&e5bQ9VKUA)c1(k
kmdlEZlb!B18r@!'0%DZK*2U%1!AIT[)I62XB&4&5U-c[D*2kH#,+[l[AKr1MNIN
5Ikf9+T[deeI"Y61j'Y%+r!-4U[J+)`j*29!9bd1PPR9hY5HHHUHp-'AM,&00!k@
h+10Zb9Eca+,mSCJNL2aGhcFS,F%6GLPpNf1B3TK&i4rfBlS9CU0((pI!i$CV$Dj
k5S+e)Y++AU6cLX6DN!!@S'2*c$me[iF3LMe44&6ZSS8IZI%6j9589m*fI[cB%le
P+HH(6fM5hS&k)3ka-*`H%fDdcG!!3X(bEr4ldcj*5)&TB#9Q+RMc-fp'5A[p35V
i-'(U0QCYZ03-dmi9i9(mE6%(E,6#Fam5K)Je!&XSU&ik4&l3ihcK#8V&C4A%%Z!
BmB!Mi$)YaU[F*HAZpdMI1e@B"NVpi0N+fUkd$&FSrCZSLcI@Z(eFeY5!@qF)Kj@
%R[5b'N2i+8B4V+dS1bV#)a%5'-RjqU`q[@D5JM+c'fRZ2E#428,j@QINrIhID*'
08qjK8jT![QX9+Bd#G"kd(q218mT5UD*iRjVI-K4le`LRl%elA!R41D0*3@4,U4p
,,NcdF6*E#8I1-J)d5"JqS*3YG63QqCl8Y-eD`Bmi&b6(#fZ#DNj[5rSHmmZ8`(V
J[0"DDBNAcEDmUB#,MJe3jp%2$SF3R-lJRS2QN!")d(8a()HqGrVUS9mb8hBAa@L
)L5Qp+d5+NAlXbDS``hN*0r+f9eM,Prd8crc"p04hQBfKTe8b29j%Viibm+Si8&C
(*8D[2fQ+KM1bY(+&92-("3h0VJTPK8IITX(*#(I6hKbPbq9@Vf8YJTAKCE2%HD$
9+Tbm'KPI3`8Vb'Sl-*JKMVj(Z-)llYL,l6jSQf%%d3,pVL#bdDDeiLprIeU"Ea(
BK'bdF'Tc&8'@bRF`hi0LlE(SXlK[2pE@(DYhBV`#!da1E+`4UGdA,df&dipcBBS
-hb1!X`D2(rD+RK*qCA+81$6Jh[RZ&ZpLCZqPDYbZBF5EG*I`VN4r(RDSdbC6mTL
C2bA#Y@05Jdm)03kdEqCf19b#BA"A-j1I#VhJc!m8B(Xa3'L-ISF30m!!BcbpQGP
@l8H[NN8R)D#IJCcTd8Lk6EGqHUR,q$QLEFi@Z3eq+iM$HqEl+GUcVAAf2,4K3KJ
a!l6Vf![&58LBcHV1iqq8cYY)V2p$Yb&chcf@$3)Sr-qD%I*(Re1Q('@&Uj!![Hd
490SJ@RP)8DJ[DDBGDmBkCCb8UYUX#Ul8i5Pp4L+qT[[NI@JR"+9#F-1CMqL@0pI
YRhlHq8`"H&4C$"lS3T0d9MfDmD82P9lQ95r5PjJMU$emEFIXMIi+a!TL"!GU84f
D*(-MMERc4[4Q1p0SNCEA!G`pZ!I3J8K@2&#X'L3rTEiHRdf!Yek(rkh'SeY#+LE
LBkpc"jj!8jhL4Dd*!)LL!aH-4c4fVCA)fi,HT(`E93@!IV*CcA8#IZ$DT!cra8+
UGriU59U,iSVfXe+qDpCIcY[SZf)1#[kd4ZPM0VkF"*1B8KE!GSBcH)fj00fBPb(
rU"[BPVCf5SXJh,rSI[BjT"h(V36qm12Qm'@&*6!["#ILhfM%!H+d5"0IG8AY9Mm
I$Z'a3(B[))mcpbpi"5Z3!"2l8PiMRe-FVH!DZa9@Mj1HdbXakIDi"$fI*62YjLe
QBIHS(MU69h%PIDK"Hm`'El4h%Niacl5V,k*3T"krihHa8HJcFSVM1'bm*a4HV'a
%*ZLd#*DPpRjZM5bMrS&LZ[)ebeGH9l%AVUr@PCe,8HU@JCr!iCK1lPa2A(pd&Z#
@M8Y`cYYCm3"PYRrKC*c(Vif0e(GcTbYV+J%k`TPhl8R5093++V3%3G,8%m55CBC
X8#p)KEZp"+dq$XHTc&P"GD#TfRS&+3UTY83U2!*rM@Gl3G#(P)m!irPl'$&j)S5
ZdbIVrG-MAAEq((!r(CIGC1HC+)!b&%P@lZFIbYrIhQiTVr48TQHaL0TbTpI$!4r
KbEHmap363)m"lr-$q#R-daYdkGARVl+Z)rA@S[Uh*lj2JpEj$iNfmIX@EZ5``j!
!Z4M2m#Bf(84P!d@6Gjl58V%FcBXaJpa6dRS*ma4K)12GqlC9R)1M$$QNTA$r9k#
FdM+P6E(#Ik$ErC!!PMe1ceIa"J1eYC3YAEL@)fUh[9EM*4CrDa55NSkCacU5P9G
+mNIrL8N&mU6e)M+-K9hZG9U903)`G39X0EcHU`VaQeRf&cB+iab"1rbfCUCG$HA
C[Lmra9UPYDifprR6k0J(53`h*a#UeNV1G-rM4'0CVSPReMrfjq3J[@+"L2`RriT
S'')3q@HpJS!RL@8)$c)l-E`"&6-Vr%R4chVJZi#`r6TGEdKfr68`ITPNE8phR5Y
FPXqPjS3,q[4&ai'dmJrlU%KqURhBB`r,0Bb'k$XhGC!!F%'M,68rPFbZa2%Pb3@
SfUL*@+C&TlUK4e34DiLkQQQ2S+iL2XTSYAE,"2`P6+b(k0mi+$K1UcA'-TClFqq
T-G*0LNRUm#IA`@0Pd$-D5H)Ph#N!HGU3!m5ilKHp`mBQY9GkYf,1jMU1dm,C8[l
3'pEpT1ZU0f2QVJ)*+8V$U3S"E"X)LF@B@r*EC%+fj8m65c0qYBRr%!b5aaJH`+a
"9`D#lF5`GZa3dI5DC[&j4F[aAQe)hSAMST(*@LQdVQUDjpSY9+2pcS*+%CX,FH$
q-9[JNi@d0(!fUGE%6qX%DqaKAZ[FAb#USb#Gf"B[qQ"Lb40dYYSDT%b`KNMT8VG
FLD!Rf&(E&,T1Hmqh2d,51eJP-6DPHm-rBm6)`C5dAq!2DEj6kfpbG@4H6D!ha)Z
T#QM2d-'%'hR5%bBf*[KV8d,hSAB6aK#l5IZkld$eA!B[YAG5eS6rQGe&ZSPRq,X
,05"I$GSApK9Kr6ER-M%9FdpVjCaekRdl-@lYT(EDMa&XMRaAa1NS3@%clH0(%IK
-MkRcS&CHDjK8jUa`1E3N6&*Kli@Cjm,qR#E4m0a(2$`L91I8-`%&TB3d5`S%j(Q
XH$F3j,AHU1qU,U4Z!JCEf6-K#h(#qH60p94FfmiBDC%MekF-9RhdU$LN[QC5Dq4
(&hUXKED[*[q@AQm&,%**F(hmE361qZ8H+52G*cIk`$Zj,aeY6&d,X+B@HGUqVJ[
QR"dQT&861VrKPk!N*aR$E!3c[fYi*2dR34JXPLHk!qVP%qr!S9*p@LG#e0"`3D1
ZY8-q0aj2dJlHl30X*j!!"Li"J4+3!)I*'iD0CL,[Jpf5KBFH4pV,p6kQEkLXC39
rdZmhcjFl)UH2h"8-l*I`+Bpa%KDlXSl#U66BPDK2*#B2e4V2ZQL*b(Qh*+pS1X8
p()Y!iB4e'&+A,IK[f0e,SYBb-#Q#ZG1#cc@C`iA3-Pf26c3I4K3XCB#I65"54,!
A`+86,`SeR)%##Mi3C&a!5V2k0!Q[i&*Ua8S$ccj5p)4A[)-b)NL0%LI`FfPAqYL
C9CJ8UAB+NCh+E8-9DF0dQmeQq,4USX*FdH(hJVBDrf-"d51&'fM(6-Y5NKAJ%@'
*!rK`Q`FS&bjZ!K0BN!"*"G'4iB@2ADJeBq'0X8U8VLqaf8Zm`eL#UN(pJ0[$AGB
ZV3Y`i@QEk,H'"1MEcpbLCRe(MdU`rA5ZTLakeR%UbZJrGML2T-JFm8b!(Afr,,N
,[d4NTYb8h`JbI[4i&ZmY-VFqSQP5N5m93X"dBrYGILPrqLTXLVUDjiU2'F&R"+A
ada@'lZ'3!26+K)ZQ#MmeNl3@ZJGEEKZFB!Z*$+)H@r(me5fGRHMrIFSBQi62F*P
)6fdeRR@1KCK5j94-IjPF(LjV8D-8BUf4RH$PrCm9L95%@kG[E@&[)8bM3XDBdh*
dLXNGX%KS%K2C8JqjGQDV!-8Jc'-!hJ!R'BTQX+hVPQ4&EH3cUZhIk`EX3RY`HL@
a29QFA-kXjSMeS6%)A3J3AI#h&Y$)CB,jJd!PZjI'G4Iab%CR(he'+2%)J[4q!4R
(""k#J4PI+6MTGP0TTjf@GH4IG2F8!AI(!Q23#59Tl@$08Bf&Vb$8G"ihR-8HCX`
F(2Mp8ij)j0IcDLX#epMeU,F@$qQkhk83D,dSqH$q0EVRN3aM``('1la'Bh9)S%V
6&)iS0#X81VB"#JF`mr4(&9CBqd8!cMEe$A36Emq"F'$b8+P-m"ll(kMJF`JrjI5
PN!3"!!""!!#dSDNkY`1GhJ!!!5J!!$k3!!#3!mi!%I[i!!(Mj!!!(AB!N!32!&4
ME'&`F'aPFf0bDA"d,Xq!!!"!XNe08(*$9dP&!3$rN!3!N!U!F!#3"N,"e4bL'T9
`EhBGJSRVa%A9D6'YD+kU#)ShAT,ZqjVJ$G@)r6[S8+KmFUK8i[&0qQJq5)PNf2M
FUDTMf@'qMjEYVMBI#h`P6lYe'A'%liY#F`&aeIQFZH1cX+LpLaDDrN$&i3(Y)5f
N%6,3mSR0jrPZ&Rf95F(i(DHBXa6%h,Q4iRlD'm$2'Gc0cm!6Aa%*TVLC'++8SCD
'akR#)12Cfcd98e3IEedNI&qQb8lbD'IMk%f(*PSaD(1`YmS,Q*-HUdQ"`l[l,$,
GA,Tm3*UMDr-M-$CGfD9Y)p5BQZFVY0lkMMfCbRGI3L'Yh"9a$bYFU5BGK0`bTY-
Zl16)'kUFV6&qd8rmipfjJ3IeePb*pV%`e[m+AD-S(K)LTLb'HH!mr2kD*K!kGTX
Pl&N4`3hA$$@5a`U#`RZp(iEdTPHS9hYX`$f,A%MG'QdJ4L5'ciSX8r5X,e`!V3V
MNH1jL[BbQbS[*c9QPZLD(MDeVPD0NcpM6b'PVDmbET-%!PJcfk3Xm3D)@KGfC*T
U5fa,HGp2ej*+DAf&V'%GHhj1L1dIkL!kdb5NZh-AY[+3!",rB*Hr"a'qk-rjk-U
&*%le[i!08,lFBLNrHT%YLmNlaa,P1qZj+$!$$e4hRRc5`r03+Gm*jDb'Z6q+Phd
+hNYpAa2mNaD"2INLQCS5`)QXBI@[RhS'4F4r2,VDb4j#JJ0H3-`G5f&U),h8m'R
d`jhlcZEaa0b'j"bG+efhYV%&iRjU%Vc[kT4U!&FSSh#I*FVS[AC)r,CicPLfPa,
9L3Q'm0@EJBqp+BVrIQU%Hc0H!,YQhYAfRMVfjIEFCET"f,!Q-8BZ4Skl%3BmdiH
K3GAB*232R9hCcR!p$f(aRp4CFAHY+I6blBcBFGXq(0RAPJ8)QrB1IJ3C*8H#G42
@H[h#ZbG0$#2T8U#!aNp*FVR8Fr@@G6M(EL0!,YpSBFkMpBh1-mGMU(QYlP008hI
'2(`V@hriYjLhKbj!@N"ckNhlGDkjp6lrShmKi$lfdehbhc[LPNMC)`4pajh*h6!
3[PGdSiGl""1JLVV+@"SkP-r*1Yd8)M1Q@da0d,@`Tm9H9*!!l+CfbTU1rFP*)F"
-&1C2C4FPe3`VQc@$E-m4)UT1@6eSE"J)aZDNV[e*-CmYh,Y81'h25!*&"J6+(c"
ZXZl`QRdAK&$I9,-Tqm04T-E[a"p@rIDa@*!!,DAH9E"39$KaSmqCpkkDVlME3!R
a-RZ!+X,!)@U*$D3q%'eA-5Y[*l-E@'&V98K)9B%%fHTJh10P[lZaRDX$9R8@6aZ
BL`$9FFDaIhQ+!ZEQaLrS,MZGLEk1$M*9KraG6V$$HA48CbKmjCcZFkK64iF#R6+
!BScfbcrqQ-$Xii('*KFD+`1X9k235Q%2XP6K#pVi%r(%`IB!DXl'(VTP"QiB6)j
kclFfHK$T4iFb[@TmHRr&9@&6L92MmDMAZqD3!*8hJ)YY*0#"cCqc2b%PbrN!GQk
5rbdabZ4d(l[)#V3+((r0,k3*k2eYL"5L8'1KjhbJq51C`12IkhHcJJA)K#j)e))
3UVfB'fSKEL*!Z,3"RDE3[Y90E@Uh#S5(rR,1c%k`hrTaj`dPQa8B&V6E8mGdha%
&SU*cb[AZh@'Z'rpN$SLVhG"5#(rMQmCfFb+FMChpEMX,bS-8131$!cH@1ad00-C
R+hSQ(MPMjFH'pq2VfMNe"A(G%9!a6B),IaD'Sl2b*0213mb'"+9fF1GX#Y4#EEP
r!BMZm`'CGMd[ELl1B*8d(,0KrRjeVdch3b#`N!$6@+MPM%%@PXc9GDb1"V$-r9"
TCF0JP'KDC`53!,Mhq@kHCECr(BGh0CC+JK2cLHUY+ekVh!DrGk@F1I9qCY'4qYF
2XY@1e1Z"dp`$8pS[#&RTk#S%kf`YV[p&RTcPC5@,"e,'BZFhL@GiCM$J*FEh`#Q
(GlkbIrrD`IlmB(HmKj-R-QATkpf2#cYIdQ,GHI0bS@%A%"A`HBBFjd5)S&lE@MK
j`C!!2+jfjCK"aa1%aJ&hG(@lFd"0V)+N8"AAeSH6a"DQPipBXJCP6R9-)MCrU*!
!hDDGDM#b3[rem'iEF,NPj$Icc`,-qEXCdlr,Q1PDJahj#Vck!C+D+C6Y`%jR&jC
a'c[@(JGBJ!(Q9a`CU6aI1cBUE&QJD-HYUS(kc3C$*CN9VJV!'KP-#eIdTrX&[b5
Ir(MQL81NLC8UXiBHmAVJ,BNkk*)Ec4U23Y"fK0ce+Mp0QAF8Ai00Lar4H83e1aq
pTTP5#'SaTb+D*!SU'QYp2[j61I2D4!YDpr[dH+qM8&BM8%'hibIb*&A$"('#$hj
8Bc&FP!eKI@6[+1pIMT`ErZFJ0Vf%4rBaBGH-,+L`HUY3-VMp9a4iD!%2IrI5#4*
H`8cGp,CpC1G$'198SPMl`4$DER8*9Hl8M6Z*eMrBm#&a*8hjK%iCXS*4lQZYBbm
Z5hA*2,Mf4bkd1*')f@eU5494M3AcQ*C'BXL-'i")f,`P65KR+$rJ(U*bI)LGR3Q
Y*bDGi#l5VaK-[l#(@Te93N1&8$&[qPlG[@jj64P#9S3SFe4MDK!8&A)NaFB,pfd
6Sp(%6Z1&Daikraapr`Y)R'@80U)MIP#Ri81ck9+`XNlNhpa6Y)6USLLLBa8fL!3
0mB6@f*dFY-lP1AA+IL-L''QT2GTY1h#4hcf6@!0jVf%PE9#1AFeDKeSa`YV'X5F
%IDIME1XX!cp"K`GQj%FiB4l0U$[J+V'BYY&'d%(UCG)0P'!CB+)RLYr9h2acYah
IfG&MNP$KjD(3MZRS#j&9C5(SI4"N+"&R@#*m4,9[Tr100Z4+Paa-B$&R,6kiNjT
&1a*kGAeilSN%`M8EQDCJ3U5r3X0b1#%CDL"de!dUB2)fJGf12mP,V1&rVZF$M5[
$f'f68Mh@'cI9-kqYKNmF"([IVei#!-%K6qHXjDRSKeTdU$&Qi%'Q@KTjF9CZ52F
(hi0p'pc9bH%&1`b"[2lr%8!!3`DRSMRE!qhc'kK`dIAYX2%!XeaK)D`-"3Dch"H
j#Sml!cG`Sr,P"DV@LA9C'ij(2BDq1LQ&#&f`2&B[QQa&KIaiZh50+E8RC65%TdJ
b6$DjA)cJla3(AIj4"i)$+VP%L`8)qA#8R2piQ+mDP4DE`RRZJb@GS@%A6S`TbKY
mQ4#cf-+3!0CUa1`)XV9TI+SpRQSZ1Tjl'6B5Dc+@dcqTZ1"kZHhfjB4jZAiF3CZ
rYra(X68PHpDXIpLYN!!EGEdiKPG[UTEaFG,[rVHb1AQrXI[+CKU6Gk+`&c-**[U
b$el9h*iZLdF%R8ZUaE6Nr,IVpbmbhSrT2JH5CCMH%HTNqVbUc,LEl'"9NAP$!pm
R,RmhC!C(&G0D&M[Jq53aAXRT`m$Q2G()A5el8mEF"e(HS[GE[6MV4XP@)N8'[!c
8LRU4(cDN)2JK*LQ$$GpXQYVp-LUFVUV'refBcr4eVK*kRVaejlTXFJP*m5SeYh)
K`-QPhBT&6Mk8h[N&rFJMB0V62#i"Vj!!IPV-8@e&P[jIfe4A(fpJ++m(l)")%)4
F!XDQ#SS%Z53"aImD,a,T&hfS[ZeLK13dDSjCJAUQ#"m)#@B$Xi96cbppUhhU#5)
hhJaV2hHe2$fS%f@`L))"`fZTN!$X9DVUYc3`DNqa$d2#KTSJ%`,lFP39HT!!(FU
6Ni'%d5J5bf98C-pIIC4lbAS!bTHFRAqDNC8%d"j8LX,BJc5BCXb+#ZXpJNi2TbX
ie5%4'8Z$9))B-*42DNM&L3H,c*ah#cad0Ea#4UU+6lLmZA-YEbV-jFf6Y@1Y1p@
+dqUI%'arkRQc8C@rVl!CFfqh'!h!pQ#SQ&SD)A3$fl`!)f9+5qidVZjcGE%GH#q
%I'`J)9&Gf5Q2HBG$P@lLfmF4l2I`!),N18qB!e98)fH4642b)r1SPK`bSBhi0A@
3!*Vh$EZdrPNYU%`0UCUm@ULDEPXh)a0Y(T+Ki$`3N!$4K*bScI*'-U@S3@),YRP
%RY8Pj,192VYDe,CClCPk[4bhcP@UZlARcb'1S[CZiUp3G8B59rif+c8eleURS@m
I*IpDMk,*aZ5VM,d1dU!-p+3X6T-#Tkem)[TC"k&hh1F!ciG*#D'Z+VEFJ8mrLAp
Pk5#M'*8b+ah'0QAQ3VmUm(Ua9V5%aIA$0e`FASLH8PGK8H%c+MHhqUa5`FFL+c1
D#X3'`5[[adQd+j0c8$2f53Y+Q)HKi+d[hEAE)d-iBcX#N!"lG6b+NrkZ$ilYGdm
j8SYQ-U[5jN"l)0m-T-U@3aE8I*F1"2mf6Pb`l#ND"DGVCa#108R%Yr$)!jG9A2N
GIaF)'1RX0S"2`p(***b6r'jV[YfX5hc56#T-m%%JfI%D+29VlhHEYlimFXVCRLT
U''qbiVUR826HNR2iT@PU5B2j-ZA%Ek&*AH`Bi,+QjJP*J)0)Y%$"r#fY%288Fk6
pXa+6!9jNA#f+1#!0fVX%8jHk-4IpILDHB(TM9",'4XA!6&`E'C@f!!Dm(V&SYeZ
MVdd!(i+jc+60J(pHkFiL#bL6(r$d#kP"Tc8d`56%aS#3!2&Kl[L)KZZhjG-4e#e
5XVl9bl2lDell2G'T-Ycl6I@"piFYqm5PpiJ%UK$dE1&6+MFT%a$p+LVQP&)cJr@
%E@Cramc+J6B9[SjhaAq*Bp0Hr(1Pp[GYJFi89qBp,l8p*hGR)m%Yk@JHkQH0JeX
9!pJLU[MCb@R)G4aX1ZiVpRDf25p4&"9k)Ba,9rkebkfp("![[iJb"r5$S,eGHU$
3!(br0@+V"lCc#(l'&bma,!KceQ&dUF9Q[DfT!rR(fJT%Me3XQJ@ZV*q(U-"X8S8
Kbk4K*Z-[Nk4XQ,l2#%Dp9P"9#'Z1i@krV,`c"`pd+Qq(2K@Q+`jEqV18q(`PClr
KZ+)%0B6YQF02D9ZMNa98)jrmjS&`p6KVpbqcC[)Nc"KAQH5YiZ&krb"[""GpM%)
qJ!,jm6NGeTJm8DM85Vbf(C88"lI,RZr-1S0,MlFqPQV$a3['bb6448MXJA2'S+6
%2mKl$X"bD@Qe*K"HekXi05mcR,))K%le*k`*6ShA'BbIdlM-[K'2Y%'6,%r-cPG
8Y@GcLBfI,I-pURYK3G039K6@J@FCdDZX$!T)bA$G`EY65mYQ(jU&-f!mcrF#,JA
HLf6`P6qFIh@(*`[$#2ZrAERGfUVD8cX"!*phNrGm2'(JQPlCdH"k+P8(+!CH#cY
%i9PI0LhqV,iE%I$GN4BH-*i!Y8,(KrYr5Y2F$T)kTc"'c@j)$M,)d"@2i6Q6FB$
Q%%`D!)HdDf6b,D%2dNA3#ZRM$e,k-$PY2bLb1$$KF(5qBVVrbS#aIb4CJNiAMSa
*Nba(-kQhH493`jQ8j0$Y-3bf6d@e'$8(D!iZ#Hf((PdJjP+ZUai)U'N@+*l2`QC
!@Ih5Ec-h*TeKf"kfFGfSd10,C`c*I0iKb&QLc`BDZQ83FBH#Uk,-A4p!h4cNI`P
"c3Rb16BDTeiT66ZH$IDpY51"@b,Df!NB42)(9+Vrlm[Sk@@(VjE+L@pfZdZVPGV
PUGH"0A*(rqCm2BGZe4&Gk231k&%DcGCqS1mGal$e'qB%+-5GClN(IFfHQTL1l3R
l"f43RXJU%"pqC6NpG3i!k2Q&'`4mip1!8UVHQGRhMCcVchamXrRCdGlD'H#0U$Q
'2%&SFRK9J[p`LI'0iKf@"`GG92bTZi(Gc1Yh,QHjk91RrjRAP2Z)jK3-kTYQV`&
fk08K3L6q`mVdjUUJ8VN+(M`ES-K6F+L+UQ!Q"N'A2Y(E`d586-#'1JP('9-lJC@
Q@"KKEeAST*fL--kS29)V(Z$!b)1RE6a[DlmFJ#cf'!hE*N9I1JHPBTHCrCc!50V
Heqi-NV0YFE4Ql853!"U%-,G@RM$fcYCA-XlfXSJVVc,P,PlqUZ!H)'$!lf)TYc#
F"bV$KX#4RFVmG3hY4`3'&4LelX"d9,,iYp%!*+0#$'NY@VD&@r4,F$6,*-+$RBi
P32mh@Cbp!2h1BrK*aL#Gl@*j"[Gm'bd4i-*lq!QF,B6LHBGTdHTlRTrB(d(ma-E
@*RE6#5TIB0a!Rp4&+5T,AEm0@!f,U5"D0ZdHpTEhACC'p3aHeP#Tm0q%X(hm+"C
@&FX+4Hpp6U&jAXTU0UY5P0m@lJCabqN1f1Ep&)SHrKMrU1mCF5fleMS24-Q-Uc+
%Z'D'b)ciCLZ)-[LFS3GmmAB#T'@ed9DTEqfT0P[U1M)J'mcJUp`CFH#*6j3NFX!
$Pcdm4YKlc)49clSJ@"Fr#DR(CdhD(l,1I`JXY-D#PC0+##M6!HjZ,fC,$6P`BDT
)3hPiiBYaeF,PB#"'a(*A2+F4r)ah*TS!bHBJcA#XrR#E#bb-M(pVh'1@5#LZ)+!
l$4eZTlk&1RNRNb#+ebaCc$FQ8mATIpa(X$cZS**qIdi5LUdB*MU!1ahP4Ve&'-'
RD9j!KC!!`3IA11kSLLpAVk*plF&lBZZc6-66i9E%!@@(3c)iPh*FGFQX'!qbf!Y
"'!0mpFpL#1b@UVQFHL`$PjM06+ACN!"V9ir99fj4-+6d-fm22A8mT#5IL@Q%lMc
miQXU,H-eXB6XKEb9b)+[&KlpH11Irfh(#YUlTXF@8f9Hqlm@fdDMbmZ#3A*!3q`
#aVDpZ$)YRAdB-$BMh0L-i`NljpdH+dl+$1Q)")Am&PbC1d8p-l2+MLRB8UEU+q8
p'6M`$eX3iV!i3,%U(j-kB@1q1FIE#pL$fAa(c3V@PN)GbXhbY)NSIeAk&eq'E6i
f1iL!1"R@UM+Q*G"kNBEj62[UZiUaC(1MdHRGF(q"rYrP46`PA9CJ#qP50pba3`q
kqCXN01'"6pE[m@"--&S*B`CS+kL$'f+F"P[ce)m%a2(3P6mcf(MHj3k%S!JSpCG
1jRcQ9aV2f"P%,eHPab%)ZIB86$k*'6@`EEP,c(96$dplQA%!BMbrf$E5iN5MML,
3fI[![BCVEYJPChY3YBDE1q*bUMk3!$*VD1*E$DAUU`)k8GcHTPY,`A-"LQQX$dZ
mV&F@CMN(Tlf!H[TZ1K6ibh*9eQYFI1kVKG0+C0+0FlV4'DUcD2!3'dB-cK%8da5
@TTpd$42a8f2"R%l0LaFE6+eEK1`+IKTaPJU-HF2f`TPV6em!-af6LZ@BRCUMh`@
Yq,d@NmPk,ke@BSACbEe,b8Rj3)hMaXZHf4QQ`Nq9Qj*)-I,JDJD3!,iAb1iL902
f#GUj%Zb"d&5@IQq-eM9qGL*%"QNlQVe-f[U%D*JQllH('1FXR-B3UK3FJkUJTY$
ZQ2`&+"V`0J')2#kimmIkXcQimMr%QPHb0q(8(3A)K1c"JU+UEM2jqDfB(@8)D!4
mQjYA)q36BGVciZVC+PGPUMBR`rKHHj*Q3TZIq-FKbI8%GMpZkQKVP2FppHCY6XX
6Th@%15ci0aZ'"$a-044AhImebJ$YDb-$T&Rf*EZbHrYBFM")#kYl5M[F4+r&L"N
Ge!b5MMTEDJ-,cQ$(bF2C*JVAH%IDqhT0FE5Y%AfUY*HkelJBM,bJ2#EK(5EJrVP
3XF3RH2SC6+&rYl%pm)19P%B3aUb)PY31A&ZaXZR+D(!A[-i46SN2emSR"dQIFU5
,E(Cifq,rXS#-VH(b,N$)kHH9SS9ii(D1(ac9mCLr1q["8!5fQq)eL`4JckkC4%&
!VVd[ZD#%bTkSLGi3dMXB2U$deC9Ua54I1R*VV%6d("J*0h&(hf$j`NfEG%6e#Cf
"4jYJZ*8DEeXlaCG`(,hEAMhm1hXY3$bcFDGBpp[e8e,QFD163I&*bL0%M#@jQh"
6F`*5MVVJZI5$Ik`lX,d'99M)YUIkEd%5bV+Pd(lk#2@YC3[@6EN@a%RK-4US-VY
VUNb"M'Qbk@Y(XX%[U%48iI[d&p`r"X[2IUNl-cmrN!$Z[e36DdJdXpbNkHrqCjJ
rrG4),E!(51"66MfeJh52*aJ)[N93i*9C`c5HN!$c1Dr84jKTbT-K!#QUXp%3-G0
[h4c0f4"mYMY0Y8-)3KXS0aIL9QlfTBhmd5$)9EYSSm-r#jN&-FC6fi*CS1i*YF&
FUE8`$a*Ba!1(PdBFZp3LiaPb`1mPqh@m$j(QefPJLBY5Zj3!NLqj6G-jJ"&XX"3
0`6!Pc52rC(Y2Y$L@H8Bjbfl`d(qL1ri#QQY-4P5G$f1Z80F+[Ih*Vc5LhH4$2Y#
9L1'64rL'M8hMfV$`iaD'd2F0NhiHXER(N9"e'$!d+N'T[eUB[ShXjB9@,RPe6kS
jkVp9%D+kA(&C,Lj8QPcU`m20Ie#133bL-m)CBJ5L*J1$D[c,K%#CS,@1!aTQ&+"
AB`SYT9HBF,$QZ*M3Gl"[4&K8lCBpE[+66"BLrTjb[HGZ$3S1%(DdkB-iF()$6@c
HUlddk3*Y%cd%!!1+f[8Cd&N[aMM[9h@$hkPiqeH2+r@jQ!`CcKmA2EBl8Emf#J0
16TLV`TURKZMSNF&SP6Nh`Hp5-#Se`eNSj4P)i!`I')j%V"3m&eb5+@H&6d&2c2F
)FMa$4`23+Pi*l[S2*RJHcNj`4J5j(KLl`il1CiPTa!SF'K[KeQeUa(h"Q#,@,-`
2ZMBV3EBDQpI0EpB,pe1i)"9j4F'rTSeJL4LcC#&KTjlPDLb)pS-V54D2ITBPVPQ
N5@mq,CZ'FSdFlQXBN326XSb[BTG0DC0ViaE3HB`i"qmJ`[&E8T4LrA9LkMVebG#
*$NMb3kqTcAK40k24Ic0m*@8lZ1)9Z5R+[XU+HC@2JU'Z(QSDVr[b@1,!B6a0#Ip
`cLDVB$0$S-*(DB(1QR2j30MiANC$`BC03GLVE&Kl!'"e+e9k-e*'CG@6VJrIl0!
V'Ge''hQ!,D%5X'V"5IE+P!V"5DICq&d&d,6D(,*,5,kPA(c8SK2P0MYdB4,Cf*[
GSh`%Y5N2)&[8Y3*Q@rCcPAUc#Y1cAGee+CK6"22@MN"cdDX6j&QXDEl,`d@S"RP
pCP!l8&S"CBJq[bZQi"paZNAi+Pdj9!LmljkQef2[PY,09$l(&)E6CM[SAQj!,@$
F*[Xj2BJK8KK[8F9jcZ5iKEP#j(hEk12dlRF"M'A!SaGHq60*RF+1$!qeUbcL++k
$NZfFVDd6V6YYe0UZ#c6$bMXP8i-NZ2AGS&Q6c9&q1QYIXqfE['-kc0'09F0Bl'a
48(M`Ihf@cl-(PX5,STGmjZ6#[C-MSdEkA'm%IM'[4DI9&Pb0S54I1H$aJe+8[[2
YMR*Gm#b5bRmUEfS,I8(YU`%5V+J#d)YSG""Zp'Y4`+YJq2Cq-Crcp%Uji`VNmlh
'X%Im)#N0JpS`hXlFY$Eb5QiFlX%9&iZ++BJ&CdBAbrBH5abPAZMT*ZQXH2ml,CA
QE1h&MF"QDHZ$ii8TqZAXE1kC1$&i4fR5JAP5EF*j+V,2Bkai4A[a6Sc$+r+j9ef
e4PQ)D,d3l)aeV+Li-ikDcq6'K@)[5["B1[3BP3hiEdJT),M3i+8Cf9MfB(Mh)QL
1GN8[!1FLHYdG5V%@N`U83+j,),jEGahCf`lqr,E6JjK$BE3CYr8qcalSiG#NBf3
!XELMq!U"e0HPYpP8"cLk*iTbllE[$LDmDi1p8rlK'jY9@ES4m1-I9BkrpDJaKHQ
HlXHNZ"DH$T1"a*ARkjd5-lfFr9U@d$ST`VHi@kihfY6pe''iA"ERcE$J-*4XF8p
DF!$F*C0BJe%i&Ep*5#4+ZEbabb9@lY!2%SM[G[fC1NTQSBT&L1rbqGSaU@M[0jr
VG%aJf%['0*BGDA8(C!RA'k8VYTP+QGrHXPXMLr0'H"@K%jLph(XCjfX,JVMJ0PB
`M4k(HB$21kp)K+3c5Ze6#p1d0U!9JpY@"9b%-$J`,i`'a"U`L%5E*08M&2J1rUq
M5PMHLRbldEEJ%$jH@D3!)alHjVTF43T!8!4cqJ'-[a+L&hb0INc$)P2&S'I,UQ@
0[HZ128+qI,Gk+iAef!(b$RqcB2VF-JfaMjDMipe["#B)*a08b#i#!9ir)-*h$P*
"`cANV-*erJ0jk)jl"B8iHJjpJEjbJ4@YRhQMF9%9b+A[RfFYh[pA"aSJYBK#"J'
T`,(,j"c4#rM&f@#DK4B)@F2!iJHmE@5j,H15,CHUC89FC$h&AE%NJ4iph'f0,UJ
H2[%`,iF2V$[b*Z4+fU!K!LbB,UN)!+@3"!%!!$m!!,5KSlDh!al-!!!JY3!!K-m
!N!21!!q@%!!&*98!!%AF!*!%$`"8Bfa-D@*bBA*TCA-Zci!!!%#b68e3FN0A588
"!2q3"!#3#S"`!*!'3X(9&S(3%pJ,JrR3lUbT4H'R$MeND'E1Nm%f4Z11Xpb#i#K
G356)GE+bb+*@@V)Y--!X6-`Nb2VHFJ9I%dlHe[8TrLe*D&@8h1BI$'A$XC&Sf"@
(,4"$qHkTAb[fKirA9eFC365P'&D96hQ"aPq8N!"&,PbJG"be963G`HcQk8R5k#J
290!j%0A502pf$XP$5T4Dm8,[SRlqX#5P#5cVBYdVMrIRrA$$c3G,M3)e2,a$8K)
X5$'-N!!C$I9CBpU)fYa4IaEHc6M,V5-,IB`[*i!H9V%*Z-2TbF(FDETIpV6JZIH
Rbdm"TS``p!U@TDUZ1R`",4acYC-2XRmN1*YZX"QR2#AG[MfKKMEMX`UDqD1E1ca
J4l#ihlDVS@mi8*l@R+Vr)3e"m'mNYD4`-Ihc1`+BZ!dlk9XKi)13!$"-h3XJZqm
3Mi$9X,2fJ*0eVU4TAi@h%)Tp!$,'SB"J(BG'P5Ni@V+FX*ja`H!UREL$8$25j4c
ZJk[#b68rd%C@D'I+@p"%UV`'S&&EQ,!BP5DC+`[M9*GiPTSCVq0'Z$$$`&L@'cr
cK*Bbb3crpH!#eeH*&$jIAVa0[+h5RZBT2P4*S5Am*2Xm0(c`*rIR),*F#mQmc#[
Va"JF5+L[LPfA0mmH,EFmYH+q#R8(94$XX$T(4!J&39N8Q5P#S2h)Qp3Tb358S1j
ZC&1X5A,,d&cfPp4KZXp+9J`Cc#B(+CpIREJ3)#51"SHdeaS9-#!H"F`F9B6MhM2
(Gb(DXZbZI'E5Z*H@9)#)pk+5E8i-+f$+)er@Pp2JdfaMa,BaGA5FC)LEEXNb`1b
#Ej[8+HS"Lph[3lAEB"IN8lS'm-T*Kp3&2q#Z#fNlbBjhr2fV+`L3!0E5I2c"0%2
kXF0F9Sbe1A[I6M0r3aQ*IFdbJ$F$ZH3"Z(Km2[CCP$fE5bU8M#`m#Ta),*I(aXm
%jP*I5#Qp6qGkSebQ@-mC`9VTqY*i0HDj"$YPF2MA1(VbC4f(GX,*c'hZke$[5Ch
fSCX@"(RRCTk,K@Q+L&(TSr39Yq#c6+fMpB(XQ$PMljVqEI[-X3Br'@S(0E[MK+-
cFpUfb)c*-cEe[0dqYQj&JS'4T-mjNKmA+P+UZaJ3C"j4i!J$8fchP!**2MaPp6U
p#@1Ui!I$c#THD*a9b1B$$'B6TYXRF+&lkh)-p-k5d0TaRc)Rm'22l3&-SM*fjP4
9J[5A@Xa*IEK'S51'*fr6N!!e5!3*Q*DJ*[FGJUT39JkS6S$9m+j%E6q`FB0%-8e
N"@#q-cE&P*a@iQR-L9mIMEh'!M5%Sa'[-a040pFba[ar@-"l-FGpHkGU#qAdClE
!kV!&%#,MMcN%&-6LAlVA@M(SMdE0JV4Mjp%rppehcjIe$qHB6rT,KApH9L0j-*H
',a!rQe%p#J[4+bUTZL(q-RQGRmP94Q"IU@am4BlY,+"i-XKdij,0AL(3lYjZeII
YN4!CGP)5cYj'1TBA(TYQ&Z1j)mAM5ar4%MjYqd'HXYHFLRY9+Y["Q-D05bGYfTR
Jj0ET(2%9Pf*fic#pJQl8#cHI"rj'0ppBSLQ`jAV)bF,2hM#TM8bk"QBh8`p+Jj!
!hCU9qII2D@VXM-3NER6VX[pdd-dajc,lfGX'SQ!fHZN9p-EC13%@$Y6NJ6EMGGU
LEl%lXBMlB)bA,!5I,Kf$GSXMGf-31QeNcJUqT&jhLF1M9Xelf)%jAC6LSiN&TL3
9TLjZ(Ea6QIhYBKiI"aYJq`9L'3Q%'d(d0Z0!SfU5P#'K8RA-86RUdFX@#ENX-TR
Z'KkKc+JN[0ek!`T%@1EdFKSRTMeqrJ,LP*K+Vk9V#-R$b*m3l(6*rMXY58c9U[C
J"&rUX"fVm#H-bdJ"J3i&UZYBbC!!&Hl3Tb(pq31X+@qU63@rJGKKeKDb`82aIYf
84ST#5fS2MD[4QhI-%m%8hm$TcpUh'`Cm9$5k2G#cY4cqEeBaR6cjXZqR00&b0Af
)G4IB%Kp!$8[-9I`UmbfFk(M#3hiFj0P8Fb0MUh,M@9T3"c8@R('rfhiCi"RNpQY
,E$0dR1I0,V-mBfkRR(CC16mNQd'pN@MiP[b1ITbkJ+EHiHBeTK"ah&2jHDPS&h,
bSM&@QpIfSAP5bN&'C3QHSY(iJ(6!K&#(9C(VKi111CNf9&f2*2VhNMpH0eJSb,a
p(6*VT*!!R$TM8ESGN!"IKm)BXS(&6BlC1L[93jVk5)H4X!DVR$"+$Q$[*EeR8fm
h'i!3HMZ-kJQj*,E&,"mH0#-aS@c2434,SGr5V5$j"%TpI6l0"`SbCHdVkh9(ac6
F8jTI[&[J`b'Ue%4Dr(#Ji``[i[ZNjSIIXC!!2+)LT3l5*BeLPeq*Bm[3b(Z9ppi
hAb+jcTl"9m1@D**X+6C5ZG+@ZAXl1e$X(TaAJfp4L01(jK,(A&X2bJ[2Z9fGLQ"
cb"6k@G4h-N+&!jJh0j%ImYPjUTKHAUhjkK@eG'p5VerSA)5(TX,lC&I(41-mVE,
FECL')eJEkJH$f-ShMU5cCCL`R5RSGB9U0cEBI9k8Kf+$DN3&"8LSG4MjjdBb["8
&XhcifNNEFFql0+84CFCZMF2JX8*F%6B)S)Fj1)GG@"%9iPV18Tib&XGc0X0$$4i
@3D2frkX-L5@jm-1Tbqr2T%#i9AJ$hNGD2djkUkS!r1#d3MSDk[6kS#1Q'T@[')&
LbJEeT@jZ&&29DCVXf*XTCSE9H4Db`0iC-3K4FMkFBC,emab[DRU$SBeMdT-SR&2
aDa!ZSi4qGMAK"XYh"N,@cLS*PF`3Lh&I0q*S#4j%hh,3SpC8bbJ%15160l1k*!@
("Jc29RkEFU)D$aCbah1%QBMMh+TjlSKb[(hYerI$MpKe8iR%LDHqZmcdEJPR-%G
RN5N4ILk-%@(JQ@R8fj83IkhSq69T50J9&Z2j!@&RC*50h+T@i9&[B8C(HUQ[-$E
DBQ3mNf#NiSMc9mkD6dl682PLd"c%BQm"*qC`&@3XjpURf9TfeR1p#KkFLQm6Qj*
ejPS6lFDHKB%UCZ&Mpjc%(HAX`e8#B'ET,qEr@G,23E9SrL@fpJ2hB9QGUd+'Y,b
Hf-5l!peI4UIblf@6A!DEe,M2iUd&3rJHcd2LLIQppdp9KpJGT3T!Lj64fM[eST6
Yic26Mf3GIq"S#@Gl()9L*8J"RCN1%6DCq8B[69NcEH+2jG#SdpBk@6+)L)aRQpj
)3V5h6iZAAhGp331cpZ4Z,mI4CR&rQj3qB"KhG#fJ[9bVlB65TY!KY"E`FMTcl20
,H[2Pj03r$)mGYR[KS%'*h[Ve6L(b@Kjq4#SD2#p"-(%JJE`YNGal$D9bHllV0PP
4`1q@JIGaE0MiSLI'lC[90r3mc@[Y%bM'h2'qSl#(52r0)(PP&H61($)VZBLEeh4
&jBV"3GKi-43i2E("f6Himh)CB&h15BNG4F$d5FI'jam$pdK)QK8YUqI$cMDA[#X
a%9TSfJD2ZhGC&`cXCqJ8GHD$[#*&0)&*DHM#i$*%r%%'kYP#T$*rRLm!JU0p&fM
rm3)@F+p@,9r$8qS*-pmQLN$FE,8Ic6a9i`IhaCY*G5P5*FShPb58pTCH(rMQiR6
VFe3Q5U1jTi9XP6EY(V+@8`LP#8&9dIAb@K6Napea1,2&G1L8'4Ta)V%JZcZ"IM+
bc2'jmfJrrBqQY0jE5`2)Q!)KcUJZ8KMYp5CNP4Xh)CrpV6A-E3CL1H,Saq-VqGi
G*GbU`8"lSL35j,6&Yq@6(%MFd5k%KccK#5GLNEbjZSS90('3!"eMiK4YK)!#Xh[
%b3-c)rGC(+c#FH%MkATLZ"SXD,XAfl9jDF0SLDB15@UdrY-9ClV#*[6+bp&,3'P
9R%hiVmE,"T%'qH8e"DPbr12&cNP'RV8!@ZVPkb6[Mlm8Je1,kjNE'qB&Giqd,fm
E)lD4GV&iQ$`3UFhG*YEKGjH(he8fD(+eBJN6ZBCGkpch48VbbL9S,BbcBR8(jZ6
T-9p05H("1(LceEY@A+$N`k["#EklE#P6dc8j0r13!$#d"@Aj6A2LR8l3al-SJQm
k`qG)&R31mRJjMhhi6E"*)Fi)J02Tjc"H2K'KbrM#I6p`NUD'cl9X,S40N4d-qSX
MI(HQ,Q6I-d('D[GXdJ8b5YMhJMQE,!4XhGp0%-liUDG$EX8U)HHd%4QMGk9'QRc
5'Fd0ha+#c2"p'h%$!E0I"(8U0TDUq'1Jd8+N0j,CJ0i4jRakr$-`U0F"MbcEI0*
(e2qrbX6B3m!Z)@ppfh,rUh$@$YchXlDZ,9hfMGH,"H6@29iT[cCFlRlA+9mUTcG
'#aRJI[Klll`%,+0!(4Gh#$hc!QF[Cep'+cb'Y6mrHG!HTD2ml$L16'YBCBqFQbL
'p%RHU8pij`M-L+FdQmpeSTBrY5B*JAj+),2Q"*!!IiK+K[RX2L[K-((`'TNbjSe
``UlKMK%ZSG%8lVQV%TF'U$QGkZC"LeSIf0Z2q5`)@pml%h2$,mArJ"q06m%M[re
e"P,*Q9E5C`j5hk3UrLYpYkJ4TL!YPPEQ&I66!,&fM)BA`m[38qf&Y"P,aUaqeEr
T`[(VGAG@S+0Y'Fe)`JIhdJjXZ``Z-DUk!icK+26E5NV)#R*ci5QNN!")3FVQN!"
!C0)hM-a6LFeh$H9PV5S`Pp2MQ$PM$-efkH9G6+0jdfScDX(PMbK8QPD5HhRbhce
UhXpAJ'9k[9DV5Pk)55rmMT+Z+($(A-PA+%%+(VX)Pp0Cm"NmmplYbX!c2GMdHJq
9YV$GGTFTq&CZ1QUaZHSTL6pj,+j-LkU+l!2aj+@U!-[[,B$C#9clV$mIEVLJ@E2
$1T'90#*p$(F$RL4jliiaNJ44'ab+PZB&9lVH-@FLde2SQEMeD(c60*01F*%P*@N
6c@e'apH50+3B(&l(`0Qk(2&APAZk$Z6ZI&Sa+EZFe61CQ9(KIf"3UiZ%fYTN*A1
m5+*%kcMVjeeP1)Uhqfj9IRe5YT!!8YE$8ka(QYR-KSZ`Zfbdfac'$PZ,MK)PVVi
*8qUhG%4Y9GYRdaA)EAESR`HI5Pi#(cm2MefI-pLjqq,'eXCMMBiSAP)I*jAVe2V
2Y64Hm`j*RFhG*YIEE"@%G[q$kDP"TcAiJKrXhfalc2#iD!$)PH$'89h%44'TfHA
4PTNkHcG5(,,f%@4C'aZUVEl0@e`UPH'%d`U%["qFimGAKX(PViSMKQEmK5(CmDC
Xp*a$EiKGHjQdG20JJ*U'GFri'+4!%ZKmQ[G&T$HFAMHdfPE6kDS8`k0J,5*#1dA
43bF`G(ahGj`FjBY$0Yd9Y9`KUT-SEk1rK(M9aR3(YLXdGi)jX(ZL3Jk&TLmfi&%
pbM%'i483[RBbEA82fcX6)ALb"F,0@C'$`[2PPd(&L'8N#D9`i6NCqPZZ$YcTp)0
k`jQ`H4$i%*PlTGMJN!$Xb4&k4MVY8m1K5NZE,hYaLQR@+C@(b[Q8-AX*kaIb!8k
8Y$Eq'$"H8rG5R0CR8r9GXLjc-(U9-QPGEkFJNZVD$i&3c"VAR'dfEPE`P[hH&m0
,FAfSjYdPb@mVmf(Hh2F*cK1e[eIVpMULCIqic#FSbK,DI`Y'ifp(me1Z10&mqRa
lphaBI8HH9Jj8dGheU$arU-KI%rkffrh@pb94`,G`$31J1R!J-E3HJRU6XS#)8Dl
8Rh`1e1(0*(2M%0ri!3!bJ2+h16G1918JX3f8rdfViE4epr8H'PNiJciS3c*&C[p
l8jbFP`f$U#LT&F4alDh#NMaJa'CJm`)[G3HcXU['DX!FL`CZdEl-3IdXN!#&hXZ
,FNPDdDd0VYmTY+,k#(l!@YbFbV$T'dS4pcPR3jm6"GL#@))9(ji'(%fYibbTVp(
F,h9*aa2Z2KSY-N(VEiaaHbZ"Q4X[PXQqZBJa4KPk[id85AmEN!$b%,q1flcai[3
"ZIQdr+T,`cLiXlV44Jrbi2)UFUSPqRk'#j0fBqKP,fZkDbr6lFU('+V-,%1N%Nl
C(SKpf'3AG*G"+E)cDi8RZd4qDY#Y-ATI-BUqeeEE(NL)38Arfkh2,0#DE83JH"D
VZjUY1(6,0fV,b$cAmbr'qPr!&3&0PU'GHlZB&kCe[AD3!'VrUe0YrrA"r1[9Xj8
J*L)d)jkpIV6QkI#4#"hVT,[Ip)m8lre1-M6FiS#1Ndr82#)X2cm0`0#frdA1M2f
E4UXHI0FC-ZIc19rI'!McD"r-mX#P5(`F`EN(PRrTG@)YTD2,RhT%pp@6ZF5E+JX
[kjcRPfriJQm+EiCN,0bkVkNip-8h+%3E$Be1C9fX8m[B$Ya$r,jD`a6DcB!!cPk
Cp"5-91AQ'kk2%pJF!MLXlVP3K[Nfb53M9"[`C)DZ`YTfQ#F6Yq48p50hk2Q!M[I
pF,#!##ElhHcQ-F$dHK@Ld"p!eYeUY@%#qA*#k#RQUK)5X$dLrk`A6h)IZA-Grr4
Ph!-F[3h!j8f#0h3FDK3U""MMDfTpje6Jkq4LLA``59aLLCGDLQ3[&kP#6VSd#R!
ZG96m$-"MX21Bf"*ECY+$$&dZfdQML8b!c[9G,'!5i+kc1C[HLS*9HEK&UVUS"*Q
6-IIDiZ)%fXDbTF"6ACG`-mX'8m6QFrk"+P9#L(eeBAbECINYB%aPTqGR[I*$5H*
4,JMdd-fm8[Ei!XmQRXfUJ$ihd@1`MN9iECP[50r"[$$NhB&r(+a3NR$B1%aGlLc
r[p[YMf+-&+p30CUYIpBCb'2R'flT*4JJ4$fK-V@G@AXXT!b1DTMrD9"[1C8Eq,9
9L25&"fbSA5dLhK14+(XIcTD0*'XE(Pjq1QLMAr4PGp%bCV8YCrIL+EGh8fLFqZ8
83`pmmRc$e28'SiRa#q5E)3jlc$jcXLICmp)XJVNM-GGl-DfmK6A%Jq!%0l$%8M[
XHbQjP!`&rEi1NNJ9C%p9`hHeZVL-`3K`JM)l%-1V3rqdH`i#bLlaEM!LKc+!Xar
l'"C@Q&(fhCXSVBDicT!!$c[1+dN5PIQPM85Ml29j9f,N1DT,!DPAMY,X@aN@Dim
r!ZdU"Pl"99GBpXLN"Ulqre1@-9bBPf05AlBMI&)m[U#PSh5KcN2NDPpra%Ed@UD
kEVH-+93+JN6-N!#YZ&@!AfTjk'VeCVFF3P(LkeRpVq`PA)rE39BLUplI4mXE6HJ
bIJafVMY!m+p)p@eIXb0qD3eIA&*h+cmZhU#!+"8()*5+JiJp%5X!XA3ea#rER`A
CAhC3[2h9['I(p0J'Y6`3'+JYc5eERlZffNNH0$lb#Y)KB-D,PIc550efI8'2dpP
,2-86`aRm9Cq#pS,U5&-`-PeM1FQ%F+Ep&mlB1fdFC0Y54m6KVZ8!0rJFEl5Ce+,
8r$%Q+E+SZS0'!HFI*'fMX15P2AX%i*[T@Sa6%er%qm2``bhk'UX!Ee`f"QU$-31
lj@VdK2K8a'mf8!`%%8SjNCLVSfFB8cH)+J$ccUrMbc1#l8(UI8LKQDGDN!!RTAE
P`p,(K`8EDqLN)Ji(pCRSrcfD0YXE-B2dKZ6C&aL2I4fk)Qi!M5'8@JX)`p-J[I4
jM)K8m(Tm["MH!&SAD95d4JZ`*JJFP(k(SbYqPqmaZD4RZHCU'`3Q3pf)Y[-HK(Q
Lh)q-Q!GYma!)6r'p8%%H3c*T99Mqr'9Jj+'d3bLqr2FJX!90Y1'liR0dI4VR5D`
NV0)*eB*TYN6IVjeA9HZDE`RR*4pV2Y1rA``EfX1#UQRaRF#UacQXHhV`2$X$ZbN
hQNmfC`jM32lcqA"FEAdY(DA%r8f!%AMU#Gp(HV[GM%J!I'9KPr8Dd+Ca!QLNc6"
)GXFD3p+265-pJM%j*@HMqFE,e"S"DU5(c2'lAH,59YCjRjQX'l--CY6,"C)kJPh
&bCJXMNS+DMf"2bVT,Z4&T9LqHS6@rQ'c4Rb!+Dm(qD[I%65f4ki8Y@qPDFX9NRY
S`K('(B'SAY@*G9NE&XRJ4VTiBjMSYl`*dlYYlQj-bT8cK!,YF*-bKjS8FDN*I)3
ph!jrh@r4TKMP[$!2J`jfj+%cVJ)IiL6UC4*e'LFBB69mHdNM[L+8GFhfM-S,hS4
,@E6Y'6db"kM[+K0arY4hq!j*B#haEaX0Z@LU5PNAi["ZUjT5(,&RQ%hXB,Ucmk9
Eb'p*hi'TFHY+[B4hE"pHYcr4%pkh92P518LIZb3"cfmZ'5m$S`PT(0Nh"d!+"9C
iB6"T3'ZRC&)6m95$N4$#(2eY&UNPf@clA'PEVm9%!qV[pC2!I&rG3*!!A'+f*X0
I$,5@ji@EN`C2QBCq$S1SZPU#T4+V2@KZ&pKqNL*4i#Lp"JdG9fk+E+6X`8PJ2N8
l,XYLCKAC4kZh*NS1IQDhh21),D[-QX-AJQ-[[NHTRV2,5m8R9jPk-rK&d'ik@A`
iC-EVHd+P'a64R,bABL)FMjiR+i%VKZ1[36hUb[`fUpJ8`*`fDNdDU9,X-lAhEf9
N!LD+FqUa8@"F(*0-mRHUq*fq0V@bd9TL6CfYl)R`cV((D$X'&Z8ZrrJ9kfK6,l$
ULd6j9+!4iBjV*GCDXdPp'VXIFN`b0q`iTSfFR-2rQ2LeDU3@[U4l,qZ&%)QPqXh
[XX)@e3UNF8YD*!piGK'0jhZ$dS(YQ"r&I6CBMrV&(FmE%cKbCYI&VeRHK94bTC&
rPhPZd55'kTJ+b2%"&UHmM+a#8-5*d32PSc9j03+RmmEaMJS193%e$iQCJFUIqQE
@fG'Z6NAN@Jqci'-%9deA+lBVMG4%@mZKhXB[iAq,9GHCfh"Ql3CI`h6CTa)F8PE
X%p@H1J6"V'*+XlYp13aMpI&iNrXN(a%C49fV6HT@E26c,EGYjj!!@%U,HF2[H-[
mD&4PCT9PVK2MX65B'GBqHr(pJb8adqeF"Ul$)0heD*8-cAS4j2-KX'dQQ91D&ST
Bm&bm0GfrmU[CB!8rT[l6f1P5l+85K66b4(k,h$!MIbH,IPAP1F,I5$EAEbV4ehH
IUU,&R%0J100SUBAqk8Ql!M05VYj"X%'Sd[ZEkPZ[G5D9eJD[8K0Mk)@UG%,*a!e
p%5(apUPVkP39i(EC9@AfepAPFRH6bkemN!#HKIc1bRqf48N$9p+Z8MBk[5`a`B,
1#VJqH`%AYT!!YUPfr5)Q2,IS338J5U!ihZHcDAf!4QFTT4Q5a[h`+ffAiU)E'mL
$)mj4pk6B3HS1%G,F1GNKJY58E1Sjk83A&JR2Nj2aaf@@E0214aDYh3HP$YDlN!"
Vd%P'T`pqq5LZR5(1`2KZi#b*%8NhXpI0d+@H@TZr8B3ih'G$I691T`,!'$2rF*T
I3HFQKS(f6Y1L3*h+HJq$fpPa,Ea1@+IM*C!!b0j[80aeJkYcX5Gd1Am6,AK)r!4
E@fM'NX16@,3k)kGideZ8DN9cHb8J"K0U2h+!bqE%$kU[mYFDjZ0`(5JCVp3Ejf1
Vb9L'UU9k&HN%*%kbdAPa!1TDX44I1UCCEjcB`$6fdh[Vl5m5T%*UC!-Jhe%#0"m
PmCeSVSZkXHZ[YLkdIh%CA,N&ii#9LVTfK2b3!$H,NHYXaq'fiI8*jpEJ1Q!UNV6
9ZQ#ehm-iUV$U4K`!p!BVQTJ!d,TA8VR$31X0dNMXZ[LrS5M*G5dLiLQH+&HbU+i
D$29V@MedCkfA,DHS1)4D&c!P8JPqX%89P'#ZaX,X[mTXDNXb[N0bIG96aFIrIQA
ILYe(YNR)DqeIVX"!m`jl!C5XkhJHDb$Vq[LK!G$l4LImAeX!(F#UX'GQSKqFAc@
h+[NNCBQJbLdqlM6IBlEjUTj`DfH(r$m1MleP`,",`PIS5e1m"GG9ARKV,VP$5l2
K@qC[Za1TZa&S%CJj8R@,aF5l(#d3Y&d%MNEUjLY"4G*b@AHr,0h#"-X+#2&-&)q
NqKNBhY&K3h5)ELiJQ3SR$F$62E-I[rXPb%V`FPGFQb)bRD!3KM$MIN6e!PjLViR
5SGhZS)iY4F`M8"-rqB&ZZc65ANrVmYTqYCdZTqLbJ8b6Tf&+6BD%5R*4B@m)X00
M3TBP)$(Bb)MERq95ISXYehD'N4H)r+&'*ZZB@--Qr`#c[HeMZ35dC&pc(m,hBf!
#j',3Vi13!0`5$cr4fQibHC%jAH22&V!TK#!#-TA@bXS%UI%`5`VL$#U$LKRF,h#
@8Xp!I&kqrH`(6%ldAY(FP1(QEb@ST+ecfK"HQ8M!8JT4j8ZPk,MYk3!j49--DF'
JplIPCBhKi#0G&fl&I,aL`EX&+FrGMelbf,1Yp-(5hr@PM3lbJ8+XXIiJ$`[@X8r
!G6JbAQ,`ICj2hC'$`c9mS1!K1D+i43Pq6bC84FP--DKQBGQ0H&6(ai"G$"m`D2&
@QS11lTH1[eGZpA6GiC!!'e6rQkEJ-(hQAl1UhG'B+8e,GV!JCTm!Aa'h'rq691q
T[5,'VS)E$E&DSii"Aq[(JC+41`l[MSKpS"Ze82V$3I!p1e1`mFYApjdpS8AKNY9
F'JiCeCGA1%JdMC-6V0`dl(D"'*DkC9@lRc3LCUiFDfIe[&jffENIrPNJp0&PGd-
iV,kGfd*a!XMN88H!+NJ2J'BSY8i5A'Kd*0ZJ#3l'N@"leN`5&TN[q%qNY$JA-N#
AIN8(I)BAQ6[lMKYUk$`)c("$1Ve%lZ*QipMMGSB265q"H$'R2&BP!p,i&[Rkd1R
#F"YN!5'5bDBK#bc-3*%5*a5eXV2ilIp&G@NME2iVaJUkQpPbPNC[ih+2iZR-hGr
UTM!(9mK`@F-ehK@`YE)S2ZdL)CIqQGj`(0NCb%EHRAa+6'm)qaY@B%$C2C8&SBE
V9*-[Nmm%VJ(KqYH#E#NFZ4I$peTppCh&EkCh@r0FF(GmRXEbliN(hM5H5jGN0h+
$`Z[JmmN0#-[65'H#YCh'08i[)hJ4pYQZC8El4"15,J@`9LBBpGJ#me!UqR-VcUM
P1b#'bMEXLZ`5I+P3H&((ME*SV&EpXlG,#Ml&NY+DX-Q5cepSCLFjH*+4JqVIh8G
IE-IFA`$j"'2fPkQpM[1`2B@MJi!UpmI#UI2,*3DL%XbkLl,rPPc1r30YrBpPCBP
8A(PUA-6HGJ1e[#$+U"J$@R$cjdNCaj*qZd5eJrS5TP`13G#NM"q-92'XbqUjTD"
c`NS4L"qlU#BGBBjKm@Q%'9*)qp`qjE9iaV!lqUBSYV*X(SHiaMjAXhRUjSC!V6S
CY+p4rrD[KTUR[##'qX1'%XF-)XUeXb`N)))+MBiV-X%RjSJAi0)#)3ECp+)+Af,
ibYH0V`3*RjYLX[h0Ij+Ui$A0)a!SI0@qZ+++eeRMDp4f-%*,PP9@L)`F!p2`D,*
!8$`QdA*UDS`K5RS9SZTK4E(TXZpJ,Ii0'd52c-B"M2KN1Re)8J2CI5Q&D-!C6[L
Fl1pmr"!GY*fSiFhB6RV0AU(!4dNT+FBl06relkcBB*SY*MKD`AqIaa4lkCmUdkH
ETQ8b,CCb4NL$e)01cdZ0*BBH')c$19!j#8pe9JaKiq-0l83#DhMGq",p%#RVMC4
A#PURdiF#V6MB$KCARI*RNb!+-ZKSUR)002SQJl$'E%mR`[2#fmIi+%ZYlYVc4,U
j+H-Ai#cDGl(RNIbd@VQL"4EYMDKecSKp#,T'm52qLQp%LU$390@G(%j")(@D$ml
rZh@9mI,0f,05f,m,6,QUhZ8j'V0-1Sf2q5NH(jE431j"#-c55A+EQI&[qUp&M1J
8)9h[ibR$qN*VbFhKpE+e!m8p%9V@bFD3!(,jB"i8-D-kQeU-Er,dL6[QrU6$Gjk
fTJhfPf$@`A!dh5Vr82'E'I1"'4QNK"[5CQQ,eGC3qaG0j#Xfek1Blj!!6$R+d(k
'VL+$L81l@'(l&GD2KNQ@8l$DN5+!p0dP!f[4Y)GQ6Sc#j$%!0TrJi-Y!ERqLEIb
JPA`PK3efSG0(B5YKN!#b2r)RB-)2(Y[El86GhJkDLGL3!*%rI3BE+ZR)l6K$&#i
T59jQpkUVkGS21H4D)BfS"Vp0pE+5jf5GXYhU2UPE1FVjB-+Pk#SR,P[RLIr+hL*
ILM&HVLhmJ44d2l81iira2iX+U1BII3jIlZ3`@[+#6E*N$YA(0Uh"pTN&!rJ%1B[
&9pY@!XRr(S!X6S43K(UJ[)krB,K)%MPJh,eX4a"q)Ie@P`(Q#cL)28N)KKNaDRX
U#E*2KVKr*DbFbDK(V`RNN!$VlE(!Mmp00!5qRhb-J&rSqE6QJ@af!05rDk3K-,d
Jq%cYmkHmL)6rSSr18AUVUXH2N!#dpjBTa[HK0B`)mA,j4a918FI&j0e$e5J3"P8
U,"G-D*UX43#T!TZm1*iPU6l-Bi%mIK5dTm@fSJ@b4DFSNeT5[k"db0,3N!"X'$9
5!9*-Aa8&1E34)R[mB'CcZc!(h1,3-X,-H`(hNKd5@La1%rD,!(Xmp*+[$edRq3Q
3!&a56G@-5M("50AYffArLUhNBrmV,RBd+f$)qFq-%FB&K"kMGmJ5-8SM"JBrq3'
rm&Ael$QA0ERp5,6H@Q5R0R1cDP0e41EcpGI6FHKK'pe6fqk()$SmR,pb+S0%c#P
"*1(Mh#!,,!iq&UL3!-@-lL2C6828CHpZdc+mIc!Gd@AR$%Z6CKG5G6K3*KDG0S#
2VPk5-1eid"9ihI%f"1aj%0+)b6F*TecbM%BIVmE0&6A-ZpkB[`'j&XQqmi!["-b
#9FY)mGa$IDi@Yl%[lZV1-Qj)#iKM0Q)"+L1`49GD&Y+ZPEpG4Ia$E#ZAXbaG"1N
P6k$FjXmi(D`ZVXeK-iV3*))aHCkqb3M'1-"VVN-2d$@l"AKq@r8-4LD,V-acYfm
l2L3VTFj-QR!ID(EVfG&Nbe3KaN+8UXk$)f6I#Cf!TjfS$GH!6mrl+Z9HKq5R+$@
l9-P#aMjITd5Rp0a!d$+bC[CAJ#Sb%6E!MSa0eFh%4A1R4b&'jI$GZSNb5`MI&IE
aqkqU`MK`G&USj0(X)f6fc2NU'`GKCbqhM@e[MA`&GA-j9m"A)VrJ"Y(I(N24Mpm
9-R2#dIjPdpb0+5jc2RPI`U8HD3('QZ,eQ#c%#P52#0#QZAEj`1jJX3AP!"r[dSA
&PYH*-DI8SQ)rr+A29G[PaCi3PF8lXHPdhmQMHXiZja,*cZq(ZJ&Xj!53!'i4HAM
(NB5RA-JlD2Rc4[&GR-5k1f&LNX#iVr"Ib0)I9kPX*@fr+-MQRXc#9lkiKH+#[5L
rCJcX"f#Tm4*I3[eVDNB-!V33VP,C'5DUhIU`-4I#GH-*YPJ,j+9AbX[+lV%L5Hk
p'9G4L@ET$U6C9&'[GG&6f+QD(hiCiUdKc4VTG#Q15j%I*kR@AH,2Uh`9idlG&`8
V6bXCJ,FiTp4G2%0E,*fQY9pRkH9B)4f4#XKRD0*PA)M43T3-X&fePXBIacP6jM"
,-4*4D'HA*Lbj-U#3!"HA451mEf32h93aX@J+Y*&P03db1K246Rl6bZ`piX'`k8A
*La&GPDc#LL-Bi[X*faA!4+ZfrGT43Ge(m@#he-P3VMjZ`dF6S#"$piP#3IEX@G$
+'3$a$eeKef[6XL#F()PN6A2cYNSK6N$eI4'('),)HJX!"8b@)MBIXAfD9MJmp#[
EB%B(3ffpM3i1PFQ&5Z%%D+)cmd'UpKa@qIUpj[-ap9Ymbi*885%D534-hq68LZ4
jI'(mjiCUa8QlkLASUXpmMMRq9fJc)fkV+#5Di"JDIrGEq*THTVA#pJ2mE)P+4iC
L3C&kHZ0TGedD[AJE&rV[CKB2Xe5SYl"5N!"#$JC)lGYeZfXF0T&$fIJm2d+(UN%
%!c+U&PLT$keE3"ke"ZiMRkJmba3"pq@[lPJdrd#[f0fDV*eiRA8i8@Z!3c+5$"j
`2Z$6e%KVMb"jNd5UTLAXBHS2`[1T&2`S@ZMd-11ccG51jM`[!TAU3!32Mi8e)1`
*5K+E)kD(9V9lh*DXk(LTKePM5h#M9GeD6$'-@K%Z)pI8EI!E-@Yr53URmZ*RB1#
+(UUfV'%f00Ga)SLi5M#XG#PHaiF%DjBbbDR",'G'S[-fHGPLQR!(JU`k#qBNLle
rbmacTJS-!D-pcL"N8Y6)d**KA$"@DP6p$@CfceDq'2F1#aH*`(@+UpI0Cr$44`!
JXj+jFTAlP-HG9FjJI'K0Dq(SHp0e*,5+IQK[,R--'d[MXN`HSGY"rmr,HaZSN9a
`2lP4La94Pdhh9U$#KR2#&(qTD[6f*NKC(V'X+CqPcM"&k1*KXMjGhlkap[kd,C9
,LArDI-Bh0$@3!0(M#%+B+IF0mla-0'0G,,I0%q",BXdh`b$XN39PMYlG)(Ze@fa
p@LLV([aDE')b9ca45JlG-$Cl`N#B(D6ccb`!)I,`MXT)4X5$V50bDI!LJ-4MNiL
"lR[%-5[JlJp0293$qH&9LEaAbT@IeGE8,4XmUMQ"l#[#*R6e[(B#8YX9R30E,9e
4K0UC-3e%EpaaqCQP)XbK$4CXIfBMi9N29SaGfU1d9dM`3lii+e8hNbPN30T6E%"
J#j+j&VJT(ckKf6m)L`4Rk&RB-aCY5hAADNR*2!-)QKYlZq-bBh'2EAr-kZR6(l8
b+QCPUKlN6i`5A`$Cpqb4'D[K81`rk8!p8U&I2Nc+e6F2JHZI)afK8hiU8mcV"LK
!D4&)jT)Ql-C2qqS-M)&1&VTUci+HeCJ,qBpVk[3P`mF3NP`rmbZiU+U03D5B"6j
h19&Xi"8M,Ja2cITH0R@E0)UmPcI"E&p80AkrXqZQch8``cTCQN*PTHd1K6KP8cS
e6NZ2JAf)[fplTF-4k8D%M-k6k"0jK)PiEheU(mU&$%3kU+3bm&PaDrLDc6TNC&$
M3d2@lLX36F!SqbTNU22QXFl&!le0I6ddfZ8C%80"C"B2hGTp4d0-DqlcX+(*kSV
@a65%BF`*b!p!UQpS-5QHShR&K"S,+82-!$6HD!@V%@C9k@c5dI"jV0-Z$T*YNDA
[brPV8q,%IlKX5'k$A$6`l'$,5b(8MCUFE@fMeE$U)h55@X-)R@fXmeXT`2Rh-bp
(PK59em)K%FKpp`!faJ[H3QAiie`adUj[R0MS#"kf*9G#Ulhcc0ahkef-CSFAjkl
+iZ3m`e4a*SHr`UipJ[#"-f5p)3kYZQ1qeGKfT0VH'C(Dr1aT#861KUa+'TaaRKF
j16ZjF$6d1S`"fqNPP@pqB9")5qIqdAQU,d9V[TFHMRPq,KbHiG',SDqS%FUE9LX
clqR1)%S#1SGjP%hBLk9MK!5C[CbbP!`KPHD0HbXAq-Ye'(Y(LV`-fJi+ecjf%lf
IkN!J,@cYV6a-D-el12rQhieX`S*[mY6UeIr16LKe@&M(f#1Ca1M$33Fr5[FeJP@
T$CNce0pH[J1BlBXQ*-AEDF8E6N,G6rYb)QdNA!L6&cL0(F`l[(l0eqK@M5%q$-6
Bl3kUYMlmaZ0cdFU-HSl0Dh`*-9B-SkIMJ(cm,1LEpC+5DbL+6eq20,V)l+iK@Q9
*2T!!II'([&+D$CmUC@3LbH`R6!IGh*MIJC0CDC!!!9*6db[NPSH9VZJfSNT9UME
p""#b1Zrk3kTTX%PY!+prJRp3b0T!k`BUbP,H)!Ji(Rq&T5DfYZY4*iBKR*T8[!G
4ci4Uk*pM'E6'Db23EC-&##Ufc`1m(SNF30U+S3l3kPrHZ(6fiEkF)Vi!CcS4TQZ
Ym4-255@RlA9R`"EFA&DadLX,-5'$Daq9abd'8m1jYDL*kh&IM'dr[LJB2dqra`-
VJdD)[`$mGHSYGFr"h-pQ%UUSX'E[P0ClS1IHR+0mVZrqqRpm53BlKe9H3`IC`UU
T%LfHARf"S5@#ZUH1qAhK!FrpVV)CIH'[62eSULXi5)AIpr`KN!!`fYVTH,4ZCbc
[06T[$aUk$*4$H3FE#H$qU%ckVH4bI5%JAq"C!B%$ZRP,hM-'ERfC6&,pKa*iT5a
J[@mD,d"Z@dJ*dH*@NPV@kYNqZq80NIVE`2(i%hrP#(QGaA!68jM4j-HJ#G[pR!6
XD(JZ)F0CHbf`Dd0#l99Ij3K5S6qY%HH0h2[)I*!!CHR`e%TRGarZ+B4R[hQ#GYN
Le!Ac)N8C8ZJ-&#(#e,(iLBS*-He!F1FLFC%(Xqa&&V9SV@!-jp"3N6L"%A@"$mm
hBBrr-X@%KT+5PVA5)P4-5A#Ck@S&i)'H"M@`f,EJJ52R-'d$D0b3!2@$B#lbm6q
P[,9GrIVEiLERQL5Va8i,b'M@Geh%LrFEPkpGV@TJ%0VMLc%p)L"`6MbHU%['Mb!
'k#0d[j+%JYS(Sb+)hhip!$*6-qqNi*P6TAbkX6ehklHlBKEk6dpmfHiBPYe2bIq
RMe*Gb-K5if)HLFN2kqX(r*P[aSrQ$[c`[pP#"Qr9%E0VX,HPlVj,GNhQYpU4QM(
*5ebj&`f$hIHjN!$f0SB@#JEcBFbc5+9@3iVkb-F&fkNf3jA8ITHAGi+%'em1ccR
DJ*&,AHMXkYc,3`r@95Z(0PVl8ArCSVQTBAl'1lZC64U$R,CkpTDRG,d*0H-6#99
jHlb9,M#d5,E'+P4h8!beM8q$N!#-6Q`&hI4pDebB2jR9Yi2Y6&1#mU'AE5q'6EC
&F++[DZ[DT,&'5p3DQP0hZ'["H`diHB,205iZc$5BiQ4UXPRZK$lM2UK-*eG+*3-
83(A,+iR&KK`CDYK53RT2b!,@bpD,JECC%3kk$p)V(b+hYjkSS6-r%r!@#ETTJar
C`[-[mVZGbL4m2(hHhGSk1"8bD[dE1FR41)Fd3L#l'qJ2SU$K&eIaX"64&F0E0$D
q1f8)5YkdUL)8&imBh0@ZL"QDdFM'Mb,`,M$c9ND!Elf[ES(ITNS38@CY+5-Um&f
RN6#004h-#qpk@6Zrq3$pKZ*2BAZdDG3[Xqc1fh$DM)mTTalb+T6faT%cPA0q#9+
T"4S8Q4r164EN8)ViG4b)3bbqjBCjl@c+[hS"DHPZfVC4-b-'cQcD5L6$(mr""*4
"bV)'Z3&4qCQ#5$hpaGR5i3cUCfE%kVJI3Y[H4Y)BGb'28BPbG*1kErpiLI*VG%k
V`K4lQ2F*Rk#V8ei$3Z3rpeGQ[XYl#00lVUB`%rShh83)28,3b6M'B'Vr3cJIC#!
DIU+da[T"QjY2@pU1*3McN9pmd5V5r!XUC`99DrRj(&MpG&q9`0TSGNE5('LA+6'
GXEZ`,BrE-+KaZ3k+YG,p`lR5Hq-XEJ&V-N`"m2A5E@iGmidSI5*8NMl`rYK4jSR
SPS4Z$c`[8hTRc'a"h"RSZpUcM65L6aV'0[#QP#B!%1[E1`1qcT8K!$8+1UhiE0$
m'aK[jl)`N!"Pab`lkZikhA2@ll&a(%@R%8rGUecmX3h[B-qK"dCT[R%G&SkiQSY
mC$2552cic'rXq8i40PBi$XT2R*S3+%`$c*!!,i-q#D)dL#a[RF"AK6r*Dk9,Q[i
lYjYebS!)fUVqBS6LMIhUE[pj`8dGkURYXP+l@idIb[hEJ!lcmKDpRQVbJNk,Y)h
&)f"iU-!Z!93qZ#2-@Y5H9G6T%bEk+r!p#bLAEP&3+5mi4KX-V,*D0&8GN!$+KU1
!M(DdjL5jk%3r[afj)LAerEKFh4plpdT9G43iF'HQ*d!K4RmlEJ"Eq*8IcZh!r!r
$V-#p$$`2cNa&Hka(4)d4+!+C@FpkpN#'[04k9-pp'MeCcYEF"lENU&[iYpXq6!C
UTfMre,G6`QcT)BXPPB+0Ekca4(AU34"1lACDEA"L(kDX'Hre9UTP"PMQ"+%Pa@m
(q'JrH2$IlqZZcJ`ZZDUSQk&fV$k9I0Y!V'UjI&*h-5qij[-8BmA0V05hiaP-jZ%
ZllrG!%e942[rU06d"[PlC9-RbT28,kQ8*YH)G03AbkeBAY,(-V#$'D'pedMBhm`
Y)&MGDV!MED`G,QXUZ)(D*IRcU#1HZZaY+8"0+DGbDe6hXKS+rkIQYRl3*,cF$GM
-mh(4M2L3!%5,m8d3d+U@SR(Y*I#E0@IifU(3q@8hhrmKGLeUVr(9(JZ['M&ZKP@
4p$4A[Q%$3"3PZ5cLNV9-U[d6cUp)3[bVDPeDHaQi`B%T2RSpA3,S(11[3)c"93h
G5e2$)*2Zm2Q!caj2LFK[i&J0)K&qZqq)qJE[06dcb0)!#AYZ1ZS*13HRKhaKiL&
MDlip(I0'r#&[X5lAk'"(F%DASJ2,PBSGXK#RXY0jqSBd6r3,b`HC@#'[!meUF4i
H,dSLR4j!4q[V%N0[PHSe+GQPGSMa+"EV8EQ&qV9B4DUmfbKY@S6AbU[9pc3bQrN
*[rqH0NIU"MTjJ4,1'[a$Ul[,*Jr5MA%'$(kidL!eBHZ5ZVN+DL5Nf8D-TmlX(3Z
4eJV2Vff3!&b,RKMV3A5pTJc-T`Ei3)KHNfSL89Z9"VZfZ$"H$#e!(CT9hf#@B"1
rT*!!4aHTVhGRR(hY1rUj(V(6J'rfY-#XBL4HIpkhUdak@,V0Q#Aaf2'+cke$AS+
8'Y$IFqXfHTI8ACPPf#d)5J@lq!TPUL"5NJ"(J4r"`Pc13ba$dbf8KI-2)UlLI-B
Pd9qNfkXhqA@Q2b!D8b,Jb!D1Tq[ppGQFj3C'PNFjQYNfSKP2RZ-6k#lKlHq8MIm
"A`!9"BYAr8"YS6JH)D02ENN93+mq694G"1kK1hT"(Qbq(!J-QXkVpFN@V9f[P8K
ETVLecId$9majEa9+ZVUTBB-ZI%bM#cM4r0m1rY-'!F)ZG!$ZH*F'''NHmfY!D'C
K(*'He4bS#G`p+iapQm8iiel)-rbUQ4AV)5'K%$E+VfF,HdM3$bbCPP,ImKm1SG5
m0(piE061hTYEk&&Gfj0jIc[(8rYX-c`TrmlC3Dc4f+L4"8&'L"j8%STr5mpmK+'
U-PDMV'#lf$NS1*iKYi2rFS1Cmc*jITqDZi'j"$LhBX1,$&m@T@T4DUZ&db8"92P
L+#+b&V!bdreqc!pl3F%8!Ej)fH&P1*RfYUi0iA`'1fdGNl'9Cprlhf@r5TN6)#i
1hZ6hh#[V*c)NBa)6+je*H&KPTXQRRNY$"M)#XJ5K[j+pQVLB0cKMf[R[edIfPC-
(%hr`f%B(+$8'"SN6dmf-p(cB#mal&HVq8""%XjS8emBP6r&fefa+,Q1')hR$,dl
5`,+hG5m2A[cPR3IiF-I4"EjClQ`X(mh5,0-HF2CEcaIABB[X5NZRDDcl9rZ884Y
TaKbQ4`,ZVqPXAES4"Tc&Nrf,[2q'ed,*YD&R(H*DDGh"5,2%JU#D"!-DU3f09,A
FmdlPMHfF8+Y9LjfBbDq+EMRp5Z(9*&AM!PrFQJ*h'&KlU@lhIiT5#QYYe13(hHq
r(bXBpd*3M68I3A@`Z6+(hkU8VNM"1(Ujd8-qRL!bkG'cKbkb6Ka!-"KcVChA))#
4iqG`cc%-mT*fV),JR&q+eel0Ij6I&mj%Iqr2@CD"0kXE(hA@ljhN%ERTE[IDaKA
,hF2EFcK@1@[T`JP9#$q%fBf0!j1*a$H9"H80rLNZ-bNhI1JJr&j(hPl8HKB!$VR
eIEIQB(&pr)S(RGa[&S4M@A(Qf@MXM5b"qm49**Va#3i3S(5F5L[%kZ1LbUVHlLd
&`bRBQD`%QEaEaZLEIa!T4q@GBiUCZr&@(#8@ma8U10rBk),@pKlSRIP[KM)je,D
@Um5fij@kNZXk3&9i@3!MBL8j,c50TJDQ5c!B3&PpF-K69l4Fe8mL2e9kqD-Jp-L
fMeMDH,F,XJ8c)3AA@EE(Z,pKX@P5T9N&T)AU`lZ,6DjI'Z!AlK2Pl2d&YlGk39#
@PrarV1F"jFSK$&Zc1bfRM"-ZCYcl1jKU$Di$@%Sei&I)0iHkkdA9l$afRT)[*!D
NpTla!ab4F+%$ZR2Fmk'J#i[9,kq)dTBNR#aZpHFfXK!J0j2m92&8TU@MbNh4C&M
[jTb$(fr@B&rl@k+lUqm[3YRh'e,ZVAc4emL&G!R2jBH9&TpS,@[-JkIJqNSdhme
X-69P@6a3!,G#aVGL(k-M&&a4b&*HZ'4bPJ$k6Zc&349Ph`K+CL!fA3F6NelRLU(
cpBBmjL"b+@IDGqHmj`GaLih&"4ShC&NAVVU-`N-0$['G,`90h(J9[!I9C9ik,NN
h5Kc8("UHYSkk)YD%"JU,GQP%&FNGD,0fZ3[aEqCTfrNMhMQaQJHd6(0KFrVclFa
"(**ickD&"kK,F(5ileTXCHFLBdja,[@hhI9Z@+XI"0PKT3aYMAEV*05cJY"#F8f
9@$EY39(K`c@Fkf01h3V%*L+8@`i-2N"!jflR-&@QrRRdU)Mm8q[Y`J%&T0G(iH*
kF,,LF&"BQhVlGKSkC(8VK+``lefd6dEq-h8mSCJalaQb5P"!EJJfhSC+BcLrm4L
0%f3"UE'T69FD4m%M%eHEk,1(mUj([8f-4I09F+l3')q(6$mS6IF-'q(4BY!!#'@
Ei*mKhJh0&LQh`%L3!!9K*-Scb@&%R1m$@hV9k++*l%$(SP9S@A%i'"Md)Y@BiVI
9L28*U),*9HZ*rF5,C&*L3&E2qkN*-,8@mj!!jIL5%2*0A*&MkbpB8a$DC8bZ)YH
-N9YE,d69H,)R@3I(Z,JAmNNPj3`&S5bA2I0aadk*V#qS&Pq6ep3YNRUU*MdDXpj
-i,+mpe@H!H$&Rar#)dHcr*bk1FfPKV)r0Kp-X0IS$L!N%T4dQA6Qr6(QN!!X,j4
((EM*f*!!&ZM$ZUp3hS*2,mLMEVpffX[iRFU4,Pr%8MHb[J*Bkh4"M`9p([HQUZS
i,I8&DMc8MaID83@Y&,c'J6Iirm$h8RRXJVETi[Ar#a5e!2KHQPQ`p(#bjX5Y412
E"GCj!-38B`$I"4IU`Rc804LSerVUKZ8qJHVJl816H9N2`,M`U"S3H0YKc#pdIT2
*TIp@FkN65*b$YlLV``XZe)eV&,EDp1$q`V21Amm6"ITpmBN@kZX-RGTIZHj3`b(
HpKlC%fK*EcPl)F5eq+S!'XB+LYEm%md5MUM8-T*[02,ZIh2MmKBL@#jP'K8[SRL
*(GbNmmPB@Qq,AZ4Z"CJQGAe11j8ZKc`2JHSSq14S@$cY)p!5ZBf5+RZCr[J@@Xe
IEerLeSY!EE1""BL#Gi5a%+Rf-q,cB+IZ1k-eYQ!cG!(B,p`@@VL(9eMMHFJ$1QI
91$N#Q-NS4Q''X&ViTU[C@I)[q12mHX3CD%,a,p5p1KY0JMZqMCpRY+AjQrM$-!c
liZ644@2Y0`bH6MSa[X0RE450fBYm%eR[6RRNIVZbZ1L2d&A5(K#bJSiiQ(#h2%a
39G*jUPSe"QDCm+G2YcUh#h3#Tb(cDZ0PPi(C*C*`6@9+VdKpRCpI*'Y4PC%RJ%r
*mIL)$q&RBVp6fGSINN3i$"*1!$'0f*Q+jI4Q8,`41Il&TM")6A"'&ZFM4Ahi"V0
Nc9PUVXPQF`H"kL$A%EhkAf)T,!$H@*B3B-EmdTa42k3bHXDN31Mqj68"3'hKBdm
"JJXUX9p'0(fkNNcVP6i9&#dIFfDTZZ&a9qc3[DhA"ai9J9'CiSTaNe,E@$i'Tl'
c1[HJpeV`0CZ!pLG@$Hj,&0pkfmP1*D(!%A`cIa,$35r)'kD)AhlhY(CMNq&Kl[6
H(El9%EeArQ-(b4&-Y'Qm+acNbKlEflN&YMU$3M"&d1e32mSf&k8p5LD&PQ-DK'@
F&@Hk@Mc!lU0+hBZF!@9Ci!B4P*3d+$VlDY9hp0X"KUb1p`m(%@)1R@'@)2!MTr+
fDJ#X0X4TNLYD(lUVPAGkY*Q`[TbG#%1GI&+dD6Th&jbd#cZ,mC6QEqcV#1!QVKY
)[kpVMhrXZ%FAKJ&0pJ6NmS#+C5jp,aSaQIP$S,3S1mURIX`bQ%e(ai52*T0JL6-
NKkpcA*!!e(C)b*DJ`"MBq-'"jNS-Zj!![hX&T%8q,'(hE8#'Pj&YemDjEJiNHRK
!"%KiIDT,K22!c[%P[PkMjR["+iJq@K8SY4bLhA9j!$2(mBZFZVRISHIKGbdR6r9
F50[Lr*LXH$R'VP#d(K!+"ZfFdVPQ#`)KE8V3Sk$j9LbrZkIkI!("qU'CGHUC8Yl
GbY*DCB30k#6rcmX!fQiikI1KiYBc[h-`q22dG#LCLTTr6@TeGheG2elT)BcXB`%
LYcCQ#[aE5!%(GA9i*48r2F[-&F2q#`S603Tfc*P9$A3,055XC2c"$@rQ!Ii`NX1
QlC%)eX%PSTCr,TNY`6CGK$*CC'`e1&GM2aL$Cc*dT'H2AVT(mmfR&pMH4"-8h+H
F+U2EV-)8LM!cbqrDDaek'*pr%PA@AS+3!(CTf"SEeU$l&%DYZ`Dcp*AJMUG!IiE
fh@[0lA!8VYDNRXq4EYl2U8-r1P686i-1VCi`%8f+QNI%8b+rP+e22i@2X!+#k*m
V43Lal4mfR9-0,LkE)B"C+3HCDfhh3B(2ZX9mf9C),BQk%'&9CF0j2`*LLXGbMHN
$YqiBN!$!lKfQU8XGUA&a5%mX5"6J$'c,KXYMb@mkK03''LkV$8J$f0SAiAT5@bP
kIB0)CD,HNCR[G4B062VdXIhP0#Zpj#ABe4M0["V'GHlN%5YM-D%j3EalF1JMC-c
`+HhEjqh-HBBdjp(r3`MRS#6*Cp51$kCNm-3bMA'qS%U$VA`pU,Virkm2U,+h*,X
BZ98@*bG*8Jid"A+@-CF#k03fGG1i!V!VU01DCpJ2&-)0`C&`09(#Q#JCc8c0eN5
((2,P9+!c+'45U'6@rCdH`*GK29HllapmqVJeC4$Q-mTCdi)0ETc&2qHM,b5d'cq
[HAbfcRqNN3a@#UFi8$c0bR-fI`ehR6H+dfXE1-B)l-9Cp8lUcDd*%Q`Ud2qII(d
-#-m$b+K!LG4#b@0#R*FL!",raI@6Drq&Fbh(!1Z-E8khqC!!-4a#3P`ZTIii5i(
1Tm0Br1I[0KYJYV0`0E@+54b6F#GQmMRFqY41@h2)!Y6GfNfG3Jm*(X4&#F+K6h0
4TZMGcS'Ea5LdV+B[&UI9Q@iEYV16h#J55FLdK"Uaqaq--YYd3cTF5B!%NRFp5Z%
*#`I!Q#DLUJ5(&QU#"+j+('E(jPlP8R4`j6Z%XTdPi"#J6K[lI1DfkZ9R40LbX2K
66DaBi,T53V&&-KIc%5BPcr`rSJ!B)a'R2['R"F2j2TRp0haK(M3R1BUp"SGIjHY
)U$cZTflJbAJLE-9f01Fi'apAaGrNV0#HD*QhViL1B(f(lC@M5e1L`(kcbRD2rNC
TGZHNS[j'PQ[QilIaEVi5B!AM@l63CKaSAhQ2D+GBILE9TH,1D3N`EEcP%!8cd@*
0h5Q(Zk$#U6bR0Mm![L[%hf08a)aVrIbICA)ikP5Pk&eCm,Q*``UdR)U"8$)%1R&
a%&(iJ"Pj2jRd#j&64(K5JNSaDaYN6MK"X3M@N4G5i'Hhbp+L3#kZ4rTI%$)TFTQ
6PbUZ4@!RN8HT0cd6"hmNc6&3rpZP%3#IH(U3!"RLjHKfB+Bihf9)b,U``jd13ZU
9%B*rF6CcjV#pNJlN[A'EMGaad[5mIKM0f,YbJFcL(DeH(EUR!DFZc-'UQmF`4&K
D,8YB*43e%j!!1X$A,E(#Hlaqk+DK1l`2QHCKQQI3'bSeL8lqVIPC2q3"Q#`f,1d
[NQ5TUjEZ"I@PY,"12QS@@rLDP3@K'9FD$`SlfpX90-Tj4)'ij*R)Mja!H'MAeqC
i9p[DK&`5hqb-Ti#!UD1$Ph6R,JTKU"K,kH'bj$'p4l#+U"1iPcG$hm)ZIbhb`Hk
P2IUp`3*N4[(4M)5TH[c9jc&X+UXAaD+C#jMBD*DY0dq48A8@c,8cYDc#B$966T-
)4ErJbP$D`AKjA6E0`cJUaeFCc$5i,aJ&0#!&I663U*4'Y4RJV8HZpea-EGK%0-I
9#Ye6434CpFpE#9hS&(*!"PXaQrSqDMZ*-m8lDYRQBRQ6"MZ6CD#C%$Y""#HfS[2
Cqj8DJ4l*)IT!DRp`'Jk+"LaZ1L*6f"Yd5R4e#1+PfhG6'[e9"NY(K@Gkpm[(+$r
jI@Y&["1M0F'HN!!PV2C%(@U@1pfTN!!GD3JIFrialkpGRI$KfZ9(8TjZ[9cI49)
KeRUMjLJ`$V6+bY+)A$S14b08mlDHHA+p%&QZ!Urm"G[5*N&RNHY8Y8p@q[4i*5T
X"H!NLAj#E@i'D5FqUDAlJjAjM+NQ-md$Gm6&8MC!qFCK!pDQUer,BlS`i9Da-Qh
M5em+Xiim9[EUadKXlG,H*-aSY109a8H#XD6eakc[lSmeKXKf&#*V,RY$!'eT*FM
Xh*Ab1q#eJGq4p8EhY#!!TC!%!3!!2!!!Y+(%UEEa5r%!!$k3!!!!YlF!N!21!!c
TR!!%(IF!!$+)!*!%$`"8Bfa6D'9XE(-Zci!!!%#b68e3FN0A588"!2q3"!#3#S"
`!*!'3X(9%JSR5P-XqP+QSIBSScBKNV"2X`if)YU*R#6B"KBZ5`haYSZiDZTXIEN
Kcpm!'#[L8%JERXN4rX9R4'V[84K`G0,4jZP9rCklGh4"N!$Adl5Lm!U84KLR9cZ
CcL-9ASZhCfh%P8C'BrjAVi,Yf1F9Fe(4#%,QMX$%AC+*cI"Sh$IcJ*a[2F#q*&0
Gq"61M`!C9S*9lk@h3I`l6pc$#0`iNJ`4jAHC+fj'4D28UkZ6bEKPf**LQU!DX%5
GV"XJ-PNK9pL@`pNp4@#(CR!AD,&rL,iMi98HSXXbjG8+JH[if``)UX&TH$fNXQQ
hDKH96,Uca+pZbcc&(j2(NBADq6qMHF&paUr"&9p+[#ZUkkX$N!#YX1Cl5NSL&KA
ea[`ikU5@UBCYqarfGAB@5MMX+6m+efTp@2$MRcA[lF82-RmGd'J1Y$j'Yr+*VJS
fMje55Nl@j6b3!',(L%["*[)fYrpH*meqIqY'rA3fH%eHPN$&p&SmB%*eTiUQ3r1
Uea@ChjQK-clDXf1NAQ@PH-8-Np*Q$8T1YQfSJVYiI#bc66-QT!mEeM@PVM--Vmh
G-hI4NEd`QIbU5+$$b$N42J*DJUF[b*CZ8mTIp43Sp`#D[YXkRhPkKERm9HKBeF`
G$ED#4XAe+ITVrV"1Q`imjp*ML[LD-kELTF)S9[!IJ,4ldaqR8rM##cN%&4'GekG
BAl,a9`2&1Tjf)I-$E*D(8T3qpq53!)PiLfLiRpQmkE4HU#AYai@Kp6k[!cK#hS(
UcFH(N!#[`G)5*BViUi&YrBkb'@r#QNqTpD&e6@aSmNZSPV5+hUYRp2VfDe[hSKF
qLYS1$"q9jTXHb9+m%X)R@jD0iSQdiN"MfbcY0blJM!jVcYBlLqYYqrck%['$jh"
[$G&4A-jp#LGrPiY8Z1G,4E4JBeT-2Di2')CIj5qGmi)"Saj(YY*FGYTCZD23Bkd
%kHYAJ%`84)&5(&8iF(VUI-m3&ie&pAH)83Zc-3E,cB+&BDhqHh'SSj8'Ah)R*X*
QeT&hFC-"p-%r"61S`e4--K22rArH`DK1&CiY&HT4(3)cGX)X5[fFNjQrMr3dB)G
54e!qlaLN9a`'(UN(%hiki6$9'G@%M@,J&@rQ9Ud,U!a2YlhT*qMmc!BiBkR)D'H
lERk&8YI2pY00akeJadY"l3R!3QI,Fd+*&eNS6hDd+[HpmXdTQqd4B0hf)`'CFre
3D5'U3UZQR#C@"m@[@%PA*+&&$kibrZPjTmrSLZ(Cbp*cCcLS0Jf1("2Iekr"dGl
&F@q'KA*j'A-YMha8!-Uf&Tp3&1[EU+60Q3Re1EfhCfPNj,bTY%MkCG"pI8mrM'5
U2NSF8RQ$DLSr-K-$9A'3!)T3J+pm`dTE"+'Mc(YGBAVXU$XJVDk8q2iVlJk906S
2!pLb-4#+l#P4GDGG"Aa0jTA&J$aC641ZfpMpkVffT5"DPXkMR8H'R44iPKbKbq!
UMeCTINBJZ[m(9h3YV5F)EI,S)m0(G`SPKcm'44l)lAR4&1$4Cmc*1RGSNT9Nk%6
4@33eh@%M)P9DCRMJTp@*J4$"2N)JD4a4DcmXa"k2ZYa-XjIPU[%[m5J*GC5k`f[
ErK2D,ZfiGIQp!'`h4a5pI9kk-!'%!X%TVD[@HM*(9mYPaAQRmN$fTZN-#hkE1&L
pdcbd"K3cf'`+8ZFTeHN+ZFH*RlrEY&I5@&*KDY9,iNRXZ44Q&fCS&G3IkPILR'Q
d2'epZSZ3!1Je,`,2PY#41Y1TKK5b6%@,2rj03NI5ECX&I(Rraki18)P22TB3$S5
9Z4$!DMrJ#khcMak5UhpDXCq+0`ZX'`N"MmGiI+DTRUM@P%TmNke#JjQ0mXM"#Z&
%ZS66G"i19Ym8SJlcV1LabkiD%ak5-UI!M5+@#D`,i##Lp[jdk+AR820BYIUTkqD
Y34G2ea@K$S@)eb+Z%VCJL%F4*f48B-(04i[#iHL,r!f![Ue9LDcQ89+XH+`8*iR
&,J(69ZL0R0C9*3Vd5PJAYe`,hXj9"m4DC0e`Pceqb-+YfTUqR3%br1e&Z9dF@j&
jS*2imlI5i-KmM$%QPiL*+J51"UZ$HQKfclK[X*k!'fY2C-fGYVZD[i`qk1f!JLq
j#(RV+3iRS8q`bmHi&`jUFcLCi[I0`F-)%iPl6'pEaqKdP5$4,2klj6,"kMBR,#B
cA3YqM+fi3[,aI62rQacAQAF-R0qrH!2,@$ZhS%k)&![5JX$6JB[B2,C+f(H*hC9
T4,H5qFmbA6JKF5rV2&`X$G3i(ECK*QR03Cc015B9+Nk6dqbpKiX!M(9HQV#Dm2E
+fddQF6&5mCEI6(fUDJ#l"rYr$IEHal*br@[XX[S`Re!VT2`R[9Jp2M!`F8i+0G9
F1KDBCeMV@mN-jYXVD)2`5TH8bF-lLqIZfSRi)cAf-*VIH%[@!GLS6Z2dpj9V+Tr
+e-d5AQBeXCP$4+6A((kTkJ&9#`K$cd5Xpk0d@m@cYekFr#P4JTJ4!#Ih9E)L"6b
$8jXXcT`"+Y3FG2ThEV`EDq[PCKLL-lkU[a0ae,aE6$lYi+Ne5mBJ3clJa2i['G2
k9QF91+D#4V55H6lCYZPc##A0j[*#UpRL`QaDCTj"kT@l"1+a'TBEqjBjV-Iq($p
4,lrmk01QD4+!''8GXdTj3Shqf3J@LAFdb(`CH@qM-TJf6qXGfKpVmIYhK$$mad*
CHVV!1+#"9U[L[TV4FKp*9+Z%KePeC`YTeNj`QQIP2c#"$GARmmk[&#ap,QPfUCq
[MVF$32[EUaZ1K%K"pFliIB1TV@i+dbT,0P!KHAI3(*Q94K8[pKSQrr(dmRKK@XV
TbTjY4IS%'`5MJ&XjYVJRi5S4F-R3)IAUZflXGJ8pj0"ZR'HJ'H%21[i)QJY!'eK
c4["!Ze%648#BFf@jI2H+2MrbZD*9N@'2lM"[0PBCpl[UB2P%Q+&E)Q3638eYq2-
QRC`Q#&E-(lDEE%'IeaZmNZ5!kFd-65V)ahHkA5#mkYM&!5'e,Bp@U)2afM@f5a#
j9HAc0pqNjFN4+eU@m"Y$*&dIY8r+ZQI)N!!A(2)BNl&XGq2*LmUR,4qVQIq(5IM
Cr4+L+S$k61!k'C10i1RiTVG")Q[FSP+0NPAEZFXr6f(F*3QiJXi95MeBhl9B!A*
AId-B(e`3#j(DY0pA[1m(ZAdfNrDl*VP5Q8,&`)qJT)a6j+k-9[-'cq3G(Y*,DAU
[I@%a5A*2jN8CS9"JlM#TmBqXGl3H!h,*5R4$I2fKUZS@qXFa$6*NYi#*#9Zp&Ik
YrIMrjECfq60&NJAmEBa1&qAMPNNiILr)pVaq`XHl0ei8i6#Bc,3$S01E,"d,Gp*
$Jma1($6#ZDh'hlaT[0T5p'r#fqe0YNf#X`FE`)G91P9dD)jJVJERf"RDplpPF*U
qTDp"L(2ASp8*bbY00LNaV5qPJ4$UC8JiEa9FQLST"1f2QEURZ@X*!)#3!-,B`fX
eI2%GNT!!$"VMh568`&['Z40lEldl46k&r14"0elrqLPVHM,PV%@$%T0Y#''&MbF
Z`(*9aP"D!ec--EK*-q!EDlc&@MP%qUAJ,AEF&-cP4JFKkdr$AN5$5E4C,r'MKJX
&rA0Ec@6lDQ,+#)$f920"mchhT@VG,kmX)P5BHcPlp`IY)M@EM3#kBc$$%ENjhGQ
ALV%MM4S[BNYKSbIVlC4`l%ei'+&l9,&5)keM@94plF[HZ82EQTMTF)'Ic"#FA$(
UK$P@XE5G3dK$k@-fA$FDKTM3&!((`jUHK6I3669[G0"MrR82Ec5j*UiDUhA*eN*
h`!j+XC16DG6f8UeV8BDbB&LH[afUG"M3G[Ul65IcBVP4H%RpVJrhPmJ[K*lBDf`
S+2kI[[N9,Fi1[l1l`#E`5@UfL)8DmSFDfi2fQJrlLcQIHSNVlDP-A)44e0P3RE$
*)X%&`f!%R,Y*S8218@UNKqIN8-Ik*`c#3b6$ZZ4%,h@ZqLbY*INHpG3NM3aK&Jc
UAY&Bjq3m(e[hG@&eAhSp2$Tlk-NXNA"QGT!!+M%HA(*Y$8C&Lb,[cA"jjU+rTTI
CD6!Yc0EPRccDpe3+@)l1rrN2,)J32p`B$Jdp[@201Ll,m+RGY0@q3ime5Rh-4dI
4Hr9E'j!!mHX2(3!*,B'XH6BXeJDMa"f!9)#P3fIKmGY5E+D2GZ"F5@ckH3kGlc6
i2%2&R!dHN5rcr9q(V&*R5&MHbaiacGSqDRjD3bA4Dr,AUYUmrqp)0b(8GbmNMe1
+'kClL"j&AYKA@f6G*eHHDKRaQ4#SRZGac6!pqmlh3dKRrlYBI(9'r#XUYm[V&r"
mD5rA,I3"@9C06,1SVCIUSKPFiarmHFRe,'Xr@pQK4jXj[ahMreq$bKEPlT!![KH
FRAQPlaBRTI8['I2a[3[HUNbLLMb+)dbPTjXh36[m1V9G+)[*PREVFFV%b[YASl8
(pqhpp[eId399a&LqTQ%R4Sk6%fq65E*fC-qYQSFPSa&B3(q"jI3#9L8'Y0Ei3ZR
qSP@XfHSj#eKhB9`NSZSBJi30*#CK1dU'@Y%%ENNa6dCkid6Q!DUpa5+f26CVH2C
pF!*mX'6qC54,Vr0[LjjFEl4bA8*085FeP8F4*GQ%M(-MI![F[kAU!mQMELQS0e"
l$[!mjLiVHfd%SpfUrMf2Ve,qRNaA`dLV%CY#"0+mfj5$BYQecPM)!@H""[XD`PM
B@RX!qe6S48GZ3SqSBCA'irdbkjMlFbUX3BRPDE+$kk(+1kkT+#2QKk"Gm+@U))A
'"dBH4rSD#![QlMS[DhdC+KP+km!X@T@$lT!!*dq#QB`ha0fVS!0)d5@K2$5V2A'
N2q+fXFeNjL+8lh%i5aCI)Z5d-NSH1SjYa*BX8TeGPFai&A-)ZrYpeA*`B6,+PRI
4B6(0[cjrZd)pLCM)QX6L9UcPra'iIjV8dSYa-0F56-SS2l)%BRd'"eka&PXAppR
V!8b0P4!C)F%(Xf(q1TfAIMV-J%LXj6ZhcI6-Hl6#4'VYM2T&4m6N9YIibj84#1!
6$q8ACi5k6Di,GdU'KlBX6$)bRm)i)FE(lJ0C00a%LYUkB1"0Q54CBrALckdE#!R
lAN$)Mrp%$S,af08i0%&K,KjLk&ZA05%Gj'-1Fl6GA8rHrm%&3ji3U&YK5CSG@UU
ah&D(*9aiK8L#al&fa!3NJm&[lR(me8@J+[RkIjLZ8*L3!+Td64Y-bVULJeTE9I3
AP8A#A@1PL4*T$IGB&RdN+'rql!Ld*59e)+qX$X6q!Ma54G-'YT!!,VrDEI,cBC1
c`A-mcc3iak%CJ2DqYmiQj1pl&Pk4r53'D!9Fl,*NN8JIhkZh39J@YJkSD,!qh9b
qa*5f[Gfi*QaISKA2!l5mDiM(Vrb-#UTGaI@X$A$4e+SDer4Nq8FB29bN0LXD(qP
Ma!FK!'T$j%d#Y+$)T&+4FX*6I#$!9$aEd9fj#cVUJ,RBFmIBNNcp2LQV-pLUka8
hA6DAFdU8P'd[HT!!mG&m6LqfCfYVR)C4Ejc4"0j6Q2PUKd3PZ%q`IF$iqU4KP3p
hMX#(16V'NG6H&P+6fP!jkHGGfkl5mDR(k6dA52IDQ"qmi&eq[I%G-6F8'%N%Q%c
"me6+S-CBV,88%m5f9'#rZ'H(@jFY5J@!XC'IjlE-*$Jj"d1)GdI`H"1E1eQ+@a9
EAEX4DKF1jEX46i"9(fJ1NSp1FVMkD'eE5'"iA(A`!kl5AMmYjr+e9"@"R"q8rh9
%[4SK$IKf8f0,%+iaIl2$i&AcY&EI(8"!G*KF5E)LS(m-jNh2GDN2J5Y9-cQSkb2
@X-caX6eBdB("AmIKAM1f5l@9DA0A8kA-a'He2fU01Tp0Z%@r!46R5D#I`,f4!jF
1%M0@)D,@S!ZT(kr[+,bj%lYXbZ6CmdY+Bdpl@j*c$3l$2!X[kNrQR(Yr9Z%"Pf`
J$9$c8KRDcXGb&l(-Qm'mQE4"V'e0eRITT&96j[S8i'(-$!*Mp9)4meF'XGDpGL0
4GX"B3d+FkiY6C-$8DI#mm`%RX`V9X020F9EVHB9-+1Mh)Mcr9(Ghbhf),%`[$ci
J[%,pDSZAN!#pj'!Q1i1&hf1E(KTeGX)YCZAU+lHCKL)GrkQi2!0(8lQ0IHki4F"
4)eDTEU!N[Sp[@5SV+Q!ISpH%aNkl#DpUl$)U,&i9$lQ&bf!1i+2NCp*jQ,P9cJ5
Mrd+,DlAhlkRCMQTMY`K5i,kIFMdXM6GaZ%VpqU2%LbE'G[qI9XQlYNpiTb-EM36
hHPqKeRD0&)!+'ME6Xa+iS5B5Y&XT40k#35L`!'VQH0$6pV-S@UG21P"QT995jdS
!p*de0$iG"'rM1,T4+ISmbi(A(Y`STfUQ-FpDe6RTpVYl1'rC)q(#Ee2PL6S8lAY
pGBKdS-q$mB,N5(5**Qlhk99%1eU2!e4*9)3UR5fL%B3-[#9kc[9%d6%d'!m6XJZ
9XKZ)rCek(r`1Yp!46Tb,KVBclRFV-T!!@YGY-d01(m+XYPI!99VUF-BM"LPchTG
8m3P5`h"f,4@d#N`PfHNE5`NC*2$#&YVf3eEp001EeJ+EXN[qkf4eYk@cLJ#i"Fm
IhB9hI6p'2)De15TJ$p*P36%$F5bB3fhp&X,&lcqXR1e(q4*,ejPQRDARS+mPSL(
(2,fCZBl%98mDVUNBYJ56IRX-UUSKB3N*SiDklS%3-m4'd4LAYN0"4MNHeKlaVe5
,6#X&#KGKA4d$%%dj)p6R"B5FZhmdN!#%M+d"N!!i-chq*B(*ShIfpXPp',c-A@3
#h[9p(eZ`QD+KEV4FYN"F)I*6UcV1QV1!A('fQFeE'q%DdE(jiSPJTQ(PVal@[+j
`&Q!"Eq-jP$T)RPm&HhRTj2M#82"$b&!"Tak06(Lh'H0d6F,-6BJ3CEMbp8B6Q@B
r1S*jZd*h,[BGi'rq(Ra6JA*"(ZcYpC2KDNaG41THr)F5a%mpL`5!A,K@k"K+ZaU
8a%"3"mK[G"-c"di"lE9Y6U(36h-CET9bj(-fcQ+)F+DQZ6ih14'22LG!&f#IV6b
69Yf4f`(c"cQ#2q@Y!!F%cDkd*Q[(`TTje2V$bf`j6"f6bpJePAjUZPBMGZqK32F
"e23TqJh"XHrBUHD4d0FEH@biVqd(+HFZZ848lrEE9(4"dL$HT(rUS$S-M)h26rF
ReCFIjT2R-ca*d18C5N"P1%p#8$#!cfH#pK!P,!-RS'4cHSI"h%3alZZeG5&PQZ3
S(NHUq8V#lPb4$KaAN!"Z3BD)1chl9PI0Jrp3mcE)#Vq4!*`HkjPHS`LALr#T6D"
lehTmdPBXEm,VarZLBcjfIfD,hi*RU2`92l)82kD!4l'4S%+VB2Q`Ef1r*&Y5!$@
Vjb4XLCaj[PiT6SUr##hCee*X*C4rCE'*#!<9aYZ@*ADj`V6K'"2a9%3dCZrhf
J*d#k8)5,GTX3#BlVcAHf$P"YI%bm1j!![TY9#KI0`Z2LJiYjHM*&8"iB6QAH9E3
MN`Z*6eS3Sp`KV)!&09eUrj1!%hM4T-[-AS&idU3,U&!PeEDH+'-(%@(f)`h1PKi
#J&[+23kd8@`mLbZ!$A583cMBd',cLJ2RqQqI"1p#3'M,HJHCrQVbphM(4Fc4pU2
$Kar-[jeHKX&6qbpG)M3Kl#[8jPp)#UpGIiiPi+UjT$NFX+Nkha&T@%pD"Ufhm8a
bRjLMX9"0c[,j,lYFrkpY4K!0Gpk*R#[M-kM@%-dPGl1`jIQ""CB'8LNpR*+Q8e3
RXZMl%MRmm+R58C08Nd`FU,mY6$$BCa68'Ua9hQ0KiRAUNH$"61'ZPPbZ)BiD33"
2[R+TTbH[3$lE4R`d[`R2R9E9YI0K%[@D-LJA'IC2J+ia@jbhr@pL3"-rjD59,9)
Pb&-H&U0fBYZCq"@dX"ea2bKX-Iark%'2CFbIh85TiA*A5)`kEha#+p2HKA$+`LG
A+P`,S"dRh#'JQ#D92h'dl-h[jV3QED%%4"0ZD&YMTR"9YBpa(9k8@2L+8Zj#QL0
rKda"V&Z8KF0QD)e11SFINM4AP-jKSlfNUjEKX@AGF!Q+T$ica4XjB!LTGGTYUT3
92I'6r0J+FBK0Tpp2Ee44KXVQV1b9m00Cbm'ErHGI'iY"EZdeF*04!-q&(3DK*c"
0d$"3J!M)b(Jq*B0hiDf6V-'Z!6eQla,1prXA,$p3@6bDYma#hRKBTb!qaM9jr$G
m+2S$'k`l4MU4)SjEpTRIp5pj4&Vq%!'&+!I,`kH*'rG-eGVR9Sbli8VqIC9!fcB
20CfbD6e[T+M8b*,daL#pCYF%R*64f+HX5!AMrbS,R3PS"'E'd+dZ*M&ATbf)T2!
CHp%(KdL(YI#-&!$YF`+CecSBZ6d1Z,X(Q"T-QV"P&0a"j)289kMIU`5M,4Qh8F5
e!L&GZN8[@CD6'$&iLCLRr*8![a0rM6JCb[FbU44MNEF+lmHY%9P-JR[d5KqCRM+
TP'Aa&b,-aE+N[)*lf9'C6+0Y3EITjJUBFE*5kKA%DYhbb')AlGeD130"rIc-$PI
+cBf6j4!,IK)ehJMkic2Q1XRTf2(`bm5j2)DqS5Y3ASba@&S9G"BRFhD0@0a*Clp
ll5JBcHr+*#-Ca9XXQ-R1c)#IJI5LBl(0JGZb0V@bP[Q`Z`6V3%a-k%Q[DC!!B8G
alqbr'[h*VUdhS-56B(Ccj$RRa-j2`8a9E(X+FqMC2Tk"F*E4`P5&a[N$I)dmEa`
D&&J%l1)D)98TTe%dMFAVXm@80e+9XJ-iVZ!9pcFei0q98r$`D[d3X8VTXdR'3%p
+Ve*UV+%#B)q4LG3JZTp()H,TMA`rr80k)$m30DH*9c#p4NR&"r9(aYaN+L1V+9b
jDN$@@N$'Z,V6l-ccJ)F'q*V`H,BqpLQpiJBc,LcllCKH5E!M6EGqBZ82RZ0fDpQ
3!)YV&EfA%5961d6PRH5bC%BRr9a18A%d!l5@BqY+[lZ3!(NmqHR"83&Q%-@%$bc
hf&1[9#M2rpV4l2N%Cd4*%%pXA4,*p%MMC1@SfQGS4*bf"a`62V2$hSY%BHYc-8e
[AT-EA%8N3Ppa-TJ&$cLVUT!!dZZ@0ISAhGlB9c$Zj3&rY2)mpCpIajJ(V5'6rfa
D)4%Xq2&KBVM0(E`8j6(j391RlZc-E$r23p-FTi`13Sqe,-l"RS94N!"@2mMDa$d
-,BLieLUR`i`V+dYf,#cqDj0bF,MU[`pd$`di*,eiF,-Z&9!Jr+p)4UfkJ$,Vj!B
X3jmb8D)hDb(C92J3)"HCHX0Ci1ACf3BaADB(!SK#CP"$G50FJC4M#,TfQk#X@Iq
lBf$lFJVl4Xlla6)8D'2f-3&X[Er"Ha@kN!#$jGGTaJ#Y8AU+8G2#9e'[hk[-15!
K$GQ$`kH3!2S$)d3"Ri0)0#9&i2E+*MYLDG9,HH)%H+(q%Q%Kjbi1jGT#4f+iRM,
RNHp&JUJjkh"2$8Yp,$lfAdkZr@U6#dj99*8iGfAUhZ1VK*5AFHA"I8cD0J[Z11L
XidMa)&ah,%PfrMR@K0%XD$lpYX!S+JAdV3I'8`Ujf%GGfILhB&E#eTSNY*8S9)$
dU+VG2r+NBAN!ReH5bGFi5jA2)'J+L,jfe(b6#K[pe9C%8UC&J`Ul4CJCR,E8-!L
R1U#(hfUF4cb!a'06Xl&Ef4pC()jF[ANe46eI0(diXHTT3Bb'cp%`iB-B#CdZLVf
k[jMGI6Merke,83l@qQ[$Jd+1BfL6LVcJ3!)3*Hf&F4e`Ci,*XD8rdcm8rHL[d&G
3"+LX02[8rajrEUj+3k)jP6Y%Z5G5%!CLB2'EH!(4PrZap9GYr+$G8A2bU*H2(Di
bG)(Th#A*l06cF)`PQ42%TmhS[*!!1FIH$c391bFZT6KQiHk9lUGFj,Z0kk@`bPe
C[,MK3q`3VVbmV[34h9aHkqia3kVm-CRPSISfdA-B1k&mV5GrF#%Ali#`rbeC#5q
CYI+-qM2#M2&KXbH1a6i-MQi*+`9AG442MX@rK@``qb%B'qi"5I"5U2d%"%L(kc!
'i1KUk4M`$+#1aLfDI9G5RT`0rahmCE5r%EPk,+P*jF50H0Q-23Z1EPYRDZ5H"CN
%)d31ii90eU-miLJk*e*#R[$&i##3!,YkH1E"cYXSFlJAL(X1A$k+fUKDAGjK'AJ
(JRN,j[8NKBI$VdkmCGF2",@63$L6URKG2klM2Uc1QmmF*Xkmm!PG3MZKh*LQL"Q
!(JeS(paHKCj6mIDjMIhE2#H8hS@e!VEA@E(BP3`+TjHT4akfM`*1dCkhDiiZjep
eK`UJlHHhr%EZPJ9X%1LCA8[$+JR'lq2p3'M5+l[j`hQGiB!fNbQ,-pM(2lADT,#
$V,mS38SjhbmS0R&bmAL$IiIhlD'pfZ%SEAeL+&"U"V03lcfhh9!JZd5ehjaY*FR
mD@q"f*Bi23KdM5(C'$R0YbVc00+lAGSVQT!!VKB#a*qq1AASfDdXR0@arih6U,f
$(#KDmM`De*mIqJ5`N4H*KlcFqGIE64!)2MRBFDZLYpMq3'cFd9Q@4q8Cj#T6QjE
LD@ji(Ui,rcec%+0pR'i-c'pPapiG,!-dbH&F'YQ`NFp!a8N%!'Z*Y0(BreV0%2T
KR!+93eKZ@M5mKbB`f4(4j2VjDRDT"&IT*RR3Z6KF6`ea8(Ym#qG(`q0ZjJqa(*Q
Y"T!!(H!X'GQ#IP1#kE,-3jZ,hl)4$XbS,kVVjBJq`41KN`C669Hflja'B%e+kRR
p(20cY'fBd4ae!@X!BD(ISm@cHrej6l#QAdS8C0P,#[$@eSVcqB9pllIkcrR5)+h
8I2M"$["4MV6aeiT601lZ$2Ml%Y"R"aA3Z`"kE$MkZG%5a-Hce#HfrBVf+J%k#GS
qe4TN[`Q5S5bN,f[KNf"Vf%lXThaG5MmH)@i$Z"5mG@if$irlDKkN&airaVbmGiS
q6-,fc@jHAe)3Fppj+SpNQfZqc2jjq"89A4K8T*1p$l0&DSXCX$6[69eF4e&[*EG
8I3f(@(Q*-pRmI2T$krjAmFe@[ZkPq@-*qjj,4a+jQ`+b)DirV5Jjk@-(2"lRBik
6ma)Dc8H3!2i)&I(hldYQ@PSIP[m3kV"D`qb+ESlRkr85NlQeGf(`6-9m@hG8D&M
@(qm5+e9Y3h`lKM4kZKk)Ld'd9A&lp*!!PEI-q)4m'D%cjlPePfH-hLNT[2C(R8c
C-hAUY$hDHH[Db'8ZYIIKM9Z-V-9l2856KqhUj'"bkBI3'0![#Q%"5!5kjl)K)m)
AXCaDh[9Q,@GkkZ$3LA"a3,p5Gfq`Y5MC89k+SkM&KjMb&p02Y-cUli`f[bP4[eR
P(e+rU4HNLZ15R$YLmkSI,rNrLK"Qb*(bKA$V1rmV8%Gm*FDQXhbj#MecL[DAki)
VTJ#V,Sp*&1B4jSNJ`#8RLVPc2LIVq)i!DG5100'eA)*Ued`0@,p+a9*IC!V4%!U
L3b9$A(`leR*F'T)#9dNNE8ef)"2CP[cN)m*E+"Y*m*HBqHU2SNZLUjS)80-#U)F
0$N6GFm0YI8k4J$*BV5%"qfejM1cBESb5@6Qb#HbpLB`l&a@kKG!F!L-6P*EFI9"
+0j%T5FHM6B%!Z#[Er"3T8mqPQ+(,FE`S@Qq$ib`1"$a(+4i*N!$m98,c6kHQ@kd
GN5k4LbE-Q*223"8keG2@LC)8hA6AG5GE+cI@&@'KY1D$6heRKU4@b`Ka$`r"rqV
rc-hS&H!2$mDJLq"*DZPpB'6Y6'4[IZ92XH8,p''2mVULEeaVF#I[YC)013Ye`(%
+UkDDkYC"KkK+V&p@k9LQCI+IAaaa0SPHFdqii)V-PLPjRr6AYR$N)&R34!,+R3i
9U"K!"U[2LT[l[P#I%N&5HHrJ4AY3#`V9XaA+L"%C[ifk*rcXXSAE+iE5FLma5FT
KARS!2`#b@09i21N"6E5bY3i-%SG188Fc4V*"!YcjepUa(p2,VEeJ42"fekFZcZS
"!Gdd6CH3!)haZ%%L'(q)LmQ8P``'UQ9,@`5URY!G8Ae%r#GpfQ"(mLU!A4%XV3`
BjbLHfh*VUq"q@!5)ba01"jRQibeBK5d0"PDIa!SIrd0ljZN,+M#ZCNH6MBkH&&I
9JAPPaF'!DqE$9S@bhqQ5K+qS2L&e1BTcFF&FRh`(2KbJ&(8Cf08mq+#Q4bre+J1
mA$iVZ!0EL[8%5J%9K"cLNJeE'SiRiU9J53V+'-%-r0EZ@H4@dX`YH*m`14GI)d+
a,dKd&6Sk+5QliMZ%cHpSNX6P86'qfUQ)%i89f[VH9UIecNa@*[#+hdZD0YlGZk5
-c"b*pp`G`FFjhk#G0KlemiF06-@@QK-+*Gd5IRlU2NHD9CEP0SLCE[(2,!V5i`J
B%#rCJp+Zr3&Se"T,-DGc9q%YQk!4MS!46q*"ieIP4FQ8Cj+TM,!5DV@3!*qU5j2
haScS8)YqG*hXNdTK,a`cYK@1EP14YhSd-`f9dE*"5139p2jPLB9P8ArbqLT+,EH
m+b6H'd`Y#&El%`ZS(c#c&TUX$TdVZXDFikq4Z8+6LlA''c(%VBdI(aZ&V)MI"2i
Laa6"F@B34jfJKf*A((r2h`jpb4r#T&EQ@ki)i0NZ0XKAM5)!GK9BC@FC!ql'YcL
3!)'"EJFF$fRacVH$e5iad)JqF(bdcBBpHF&BZ(M#*YYDNK5qX+d36FETT#J*24q
1EifrpRQ1C!5K$NkI0$U,TqG8*`1`VdN16F,0$0%!9[@0T*J*C%p)`4VAh`+1JRL
E&6@KN66hZp*)DI%#B[pFjDB`Y,ZNR1$C4Mb(mlDeKmLI9L4bJ'2l2eh*'e"#*KU
dGYe4MqX!rX'-3EiZ-,S*E1#Ei+feJ84BEYr%0kbZk#K3@"N6XK@E!6kjDk#pdBh
BH3NMUP`jchchLhN2Z#lP@qT(jGc+*&9+(R$q,V*[Jrr&qlYTXJ42Se$mbZ10edU
G4-AB0a`6U*Zp9LkFQCb%C'-1Qk31ZcpA2MUjcL)MUf$"I)CpAqbJHPLF5m23'Xh
K8XMcMX!0$"2H-q*ETHqC0Kc*X!bBf3qL'TSb`NQ4`qF#,PY,EQJM95LP#*S(Y"-
[1U*l%&VE!K$KUEMpKTSFMADH`S9lNK9*'ZjSZZf40AC*`Cd)VA@1HdX9p(e`&YL
9,$-SUSMR&d))j%4C,%0(X$Z'J43U)qFPH6E80VXS(L$Nr0+`8pDXi1"Bp)[FES*
#fQp)khY@m3QkXeHqRP2F,X,pZHXqAN+m5mPR!+3Q8b4)k)d4XpC$PCN(epfeP@E
*j6BRGl3`V9#%2[R!b",d&BKBEk(3m[CX$c#5PY90,qT`G&3VZFpffQQL*1qMhBL
lrPQ1%A8jJrV(X6S+XFPChf"1#`+L%CA1-5IXF2[%NHcmK%%H8@Hd+MD'2GTVDFI
ji1i'f!34Daij@mS6hM&@@$bY$F55-r9Dh*0&,fE(T91cmee`Lq8&6FqpV)ali9I
aYcQYEB'F9X)9hP8mf(kU,N@*UDDC#NV[1RfV1,U#DjC&(*!!RC5hKIeXr*ihec@
2UU#$`'0$BI6@"C5Rb8mGAIjZ'l#2#G+0!+S2kIa8)5f(RmJXpbiTkXd)6b5USrZ
ml2'J8R'2VR#$HaXm[NjY886)$[[ReMQr)$*(54YN!*6*ZJVYD[4hY*46AZ)BGJ#
c9AI(&m%M(6P@I5A6qGbMLG3Pp5h2&8!E'b&[(5qV6!'KqKiNSSLIG#GDH',UMD(
44,YZ$L)mLmKYjbri!JcNLM$`TG(r3L)&dDj&bCqk`48"-BFQ2GVp5PS8lieT-D&
KUN2P!P4cTS!1KY9*"994$iSdK)rp4a#ff-f8aCXcp2jQhmBjFKpfrr5KPmR-,-'
K'rFq3[paJDde2EANNPjL`G@L!U,l!Z@L[CdEb'3TL[dG@C+rhMkmYRcLJS-*m&N
$r2Kl+[LU,aTm[C1!CYFF0`ka`8dk)EGXr(1kF-T9&Bi+!h!KNQq(,+QiC`E%)GM
EYi[XAX@h,Ljf6r2(B!NSQ[QEiCj8ljG%,SAFPfliQkqG#q$8d*R1d0#(ZBr0Z$@
aFlbYCKIXIe3iIajp2kT@eR-1J#[#S6LRd5fPqM3JS6r"T5i!q$&0XmbT(KE%G)N
SQSY(mh#0"QCk,5FBPRYXq2IPHl3HE*!!5,iLaY&qHMqi-fRY(895Iqk`J$"[ee(
3D#i-Dk5+,dFa2K'0PUbRSJB&-$Vd%`V&!PY[!2kQN6(dC@S'[K@DT8`#DpX8KNl
p0C!!NdSpK9F)a-'Y-!q)@mYTb%hT$1akCCF1@4TL!jfZ5A-49[mID[Z*(L#Y"#J
bP1),DLS2T`da3PH0MPC2,c+T)-*liDU@)"UqDpJB4M#A6Ld[*A,Vflj3"GTPbiD
+j812SSG5TD6#LFEUY'EjpTh+k+r`kA%&(Q2!C,ULF&k9XYSJU[@5l`%IqSY0E4j
Jb+#&2Ark'MpXcNjBGDq4aT5Cq*P!r)[Y'm*aL3L6c&d,ChK[PIk8M"PHZZ-5E8C
dk'2miKKZ+G@EmfjlAU)D5qT2c1&SDl`#N!$0qX5F525N+QT1b8CMRjJQ`BTe'T@
E,6LCeqHl""%G"TMS`ZNYUN#RUINV!01"9@be[2"Beq8'A(L8f936j21(VLdLhMa
"D9q)0V$'Qf+)dI[edGf3!,bTrdM04cP)[cJZ82#a`T[pI!*ShZc(QY!l(,UNSD#
ZBJDFf9pNU5(3!p%JF[Km3-2E$q(1LG"LKZ*e9M+%p5ZG4PPQ[K%(p%G*1S-[R42
X&RhZEMSdr9b#M"-$52QVR,j%qj!!`TqGYk0+AkUS@ZhYPN0(8XD-k8MaY!rVSXq
mQ#6NKrDRIT&bGk'*A&KGeJX9IM6C,A,T3elP0JPG"jfpKi(HR[CQ1r"IPpmQ0&$
eFZ!3`eih3[kVPJ,Rah"N1%$9JT&c5-41+mGr+3ILIMG4r4A*ak&j-cD'*4+,f6l
1i984H2e&,`iLm%C"qQl,#bhlLU!AB6FM"$MTmF4JXGi`jcP8c*&CN!$dGB*-)'2
NNU3F+McqcFpm-0FRVV5mb'#JJY1i`25dcEBaLT-C#LPKmK2q(pJ&46%#UPLF6h&
)b&d4hpL'5Q9c,9&lBF*dk"J-,4D1k#@9H!#&jR14r81GdDr8V[U!M%MDQ%E&,*+
95#3$T#m@k-V2m5292Ui+J-1H'e8#cZ(G(2!Z)r&0"Me,5LPiQRP09m#AqET!pNF
P1IGNC-Q@Y2#6GS4RTl[eSrSlSp@q2#bGi9Zb"Ae"-!`iT!rfe($a64CJDJYR$Yh
6q3MfI%X"NF$%EMYBk1FLQaDFI,`USj+V)GSL2(P4FdSH5XBhU&blaVG@qhX9CEc
Y"*aKpqKH+)m!j8ZFG#QkhTa6K9'8`UFA5d@GaHq*Xq!KM0A9KrJda+96IeE'!"M
0c(q5jfl"YiP)Y(N9pKT93d+[E$YM(&TEcaAl)fPA$j2-Q9&!kMheCE'Za!'Cf&l
Zk0$K21S-jVX+YeTXL$Pklej'81d8%heQmXaEP$jd%Flmm)Nk'Cf#E$(Z[3G4$25
)*8HCHB$$+j)rK[Z&l90ipNB#Mq6JC0lfj0BqAcEihTU$RV[VIDN+i(,i&&accl[
BFJj8pT!!paHQT$ef3ehI*QVU-HKHHVB4Nc(9*k&U+eS2EI@)d,3H$f2IXf%pX4%
GfrBYqa@A%l'4Yj[aJV"J"A#0J399j5jLG"1Kd40Eh'QIXZ0&iS0pS48lU"QA*BC
deMZ8jRkbk14Abmrb)BFD&B6hf"#IA4(D6bbbi#2pI"%Nb5lZ+qa(5h[PIRP6$92
AKB9J8@HE`pD(jk9CNkACFBG'k1YTi'ZjAYYEP$k4+$1ra96MZQC*(`+`!,0Rah!
+"3RiLr"m2!$9$ZZ8f(EXCl,becip!r!Kiq3A[M&'lY+TX@%e0r`Ul8jHl5Y(Z)j
iJlclTAlUJS+GJLA+EF-JLDR*3`KF#T*4-"Qeq5R%T1lE1PF(P4r(062h(9%&V,!
#i%ck2%N[Vq%P8KM5c2'$+5BL8r!@20#$!q6*mi"`H9U"SP*-A92%cPk)CbQq(ZX
QYk[cUcAP&Am3aGBAaP-Cd83&BTZi@UcmB!59%M1Ipl"EJ2A[*2QP)QSkKYpI#%a
U3UcHPVahBCKJ[)&&RVFF'2bXrPQrpMR%JF[pQ&f9S1mR!2USrVchU2L6$dTbpS$
ST9mDeGc-I1mQ"eBNkH6&J,6J$hSK(M'N,K,Mi%FY$RNFU)&h`V!8I1iqG@H[@48
H$`h)r$+a-6-)'+5i@FfKXKf2)N$U"(rD,8Xk%S1MA#)8"re8EFBP#Jc#*6jB!2-
eIb9DDVbNH(HS'(RHKr&9VMCBH!)TDKkMU0MmphRVhLF$6)+2MU8I$P1cUSQS%69
k&P4VJ+bca%2e#"@er4R5d9k@CcmFb)0Zc2iCQK$LMm(`N!"rCNI$H+D!4)ER"(!
&N!#3!2EPEIN'YlTF)@'-YXc!f*Sb4)&41+p)U$5r,I1Y,N6NGHY%Z*!!TZ["1E[
TZVlSXk##D(G)$!H%5dL[eZLNmqCdTGelXZ2Yk&,*cD'jekSh3#'ZXrBY`*a`+qV
D6F(+j#P1(bTRXED`9Y0)p&L3!!53!"1jR2Y0Q@,BPV!9hI!&BV1!20DZC4Y9!`R
@iCkMYJA9%`9@U-KaYiU,hMDefKpNU#d-3iiEi!VclZrNM4G@l&VCZ@$X@GP)E,l
G!Ap5ehKCkRFNI$Z2+-F)SiJ'5cQUFHrC4')YL6cB1DNJ&ZI'HcEZQfK1Tqi%T2H
Kj8[#(im'3[KP4UAV*B-Hh5@9JXMe*!@0RA(4Z094NGJDabZiiUT"CAYMDVK)q"k
Y5,Uh[Nr#2#)kR$*!b#bN*hMEKq[QA#$(2Ad!`fd0D&dhT1,-UM-RRe,`a#+H+Uj
`T@%[DkP"ZU1rYeAN$ZmBVI9fa'TpI'm)5(U06Q,A%d%Y)4p8aYEMCY,J@L)rRkE
1)3-TpH53!("(!,9a[fVJBdSkic(2Ef)!mQ)DF3TeihNN$i2U9dM6J9m#G,)k+&3
R5PC'!2eV8p'U-m8Q`iApMZJGH2+afHQf5+YUEDE@ck)JUVmP*KLBpZ6iJq)+FQL
5eMF4lr$0-h3mMH4AQ29$Gf4%N3"k*$p*Zq+)#+ZDf-TXHf2*,Jd`2E6frmPp`A@
`cCdh)L*iLk*4$9jk"EEQH*p4I8QNa6erk0EVPNbL(rfE@I6+8,Km9lj[66cHQGN
jKMf'QLT+[VSQ5dN'-CA!$@fm#ridjGN`UChVfA(r0j%Z(QNGX`F$cGTrm$I-jlQ
mHP38[Vf1U#2KmX&`3KBKT-C'*HBpIZT3DP4E#VNeY2,$'N9[VRT+IE3h!BbBY`b
*fbaB&-9iKVlUM-da#1"65MXKq1HSlZTbhj!!0N5,N!#`+ijabBiHf9(UIHpH,6#
rm#m!+lGRUUHrMP(e6,S@KD1cfTXc`-8PljDIi1el#*UHK`#%l2iCXdlV@CIk'c'
@LD-9ZA-iYU)[23ilcb4Z''ANkL9Y#()9rkS@RiV'%82'e`!!TC!%!3!!-!"!!*!
+K-m!N!I1!!#V%Iq3"!#3#U@3"!%!!$8!!,Ea6[1fm8lc!*!$cJ!!Z-i!N!0b!!8
Ph`#3$NPMEfi0!!%5,@PMEfj038063!#3$i!!N!N"jJ#3!i!!N!32!%,"e1([a#"
i(T,V1b+63jBp6KE&40bkJ6-15jfD#UKj(*k(jm"JiedH0VMYC24mX`HVe+GMeF+
dQmZ$01k[6XH0K4dq8mdCCkBT6YB8X60cfjDl4FpQHiI,ZRhD$mE*L4*AjH@8Sa(
[GeP4F4lYQSHRkQ1Y`b))1"iN"5,R8eJ!TC!%!3!!-!"!!*!+YqF!N!Gb!!"S%rq
3"!#3#YkI!!!"!!!"MdN!!Bj*!!!%E!#3mh`!!3#3"@N!B`"p!*m%!Np,!*!(23"
J!21)A&4SCA*P)'Pc)'j[G#"PEQpeCfJJFQp[E5"[EL$5AM$6)(4[)'0[ER4TER9
P)&9Z8h4eCQCTEQFZ)#""EL"KC'4TG'P[EQ&X)&ia)'*jG'9c)'&bC5"ZC@9NC@3
Z!*!$8J!"!*!&E3"Q!)%!SJ3#6dX!N!8%!%J!C`%$L$*6Eh*bH5`JBR9d)'%JC'P
cDb"bC@aKG'9N)'9bFQpb)#KH-#NJD'&c)'pMBh9bFQ9N,J#3!d`!!J#3"6%!C`"
&!+d%"&&eDA3!N!8+!&!!(!%3L"T9EP0dG@CQD@jR)(GKFb"cG@0MCA0cCR9X)3#
3"3J!$J!S!#kJ!J!"!*!$I8&%3e)$!!"q$9-+Ni3"Sfd!l!Yb!l5b-LXVieY0hP[
[D[HQELEAJ$%!3!-!N!1kY3b!!!PT+[lJ!985,2Y+b&X1iq9cZS94MV)rcirrVL!
j0k`Dq"(+KM9jKQ+MCf[`V&ir"HlX#m#`U3BL1%aA2VhVbkfM'32&(&P,'cJ,!*!
$@J!"!*!&A3"`!(%!V!3#6dX!N!G+!&8"%iJk8fpbFRNZ)#"*ER0dB@aXBA4TEfi
JBf&Z)'pZE(NJBQ8JF'9bCQpbE@9N)'pZ)%K'8b"fEfaeE@9c,J#3!fi!!3#3"@J
!HJ"m!,B%!Np,!*!(5!"H!5@)6P0[E@8JDA4PEA-JGf9bC5"cDfP`F'9N)'*PBf&
eFf8JG'KPH5"KFQ8JEQpd)(0eF("[FR4PC#"LH5"dD'Pc)(0PE'BYCAKdFQ&MG'p
b,J#3!eS!!3#3"9d!F!"a!+`%!Np,!*!(5J"9!41)1P4SC5"QD@aP)0*H-0-JE@&
j)'*P)'4KE@&RC@3Z)#"3E'9KFf8JGA0P)'Pd)(GTG'JJBf&eG'P[ELi!N!-S!!%
!N!@N!)d!Z!$4"!K$EfjdD@jeC3#3#Ci"AX!#!qJ!N!28384$8J-!!4)08`UE*!!
lLSL+&Fm@d(1X4'`3p5`rIcrXejfrjql1$+GBf'%P+PL&999LjEra",'U"3ZbC6Y
1)2Q3!"m"9#5BqM@mKDIGaGRG6G,)HT+pI4mZ3pc&PmHP#aEjM6KA6jAe#b3m5Sk
53ElSG,A`G'S9QL)q"HC1abaeLk9cJ@A[I"3FZ$A+c+Ce3%m()3a-9j4CR+h"Zf9
c)KIFIJai(r!m3+*2iaUXL26-$cGj+&$EM-KaUkHFa@0E8ER-cGETJDZ80pr*q`c
Tre6rb@d!N!3k!!%!N!93!&N!C!#6"!*25`#3"3-!4!")!1L)'94SDA-JBA*MD'P
fC5"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!``,9@j6G(9QCL"KFcS!N!-)"b"QEfaNCA)!!!3c384$8J-!"RF
093e$)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!iJI
r6PQ'N94%1+J,1hML*hBK,0+!l9$&S4Cf%PiIcijT$+G2[eNUFK-MbHfpC'm6p0E
IcBDF5mJT4aqj[p)@X[AQGIR'*!P,+@RBhU3A&C159eN[%2cJbH(#&ajm5X-QD0&
L4-VGcEkQ`r)XP,P*,SMR)FNFrFAJLaU$lM`9cA8P820dQ"q1j-RJ+KhQ[L68+ci
KBT!!RHr$(BZ5%%MI@aB0YUmG+cH9Fc#*FlDI2+6+KXfGMlqi[`EXLf[bq5DTS"G
BJ&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$P
LQ,KZKIc2X5Gal+,YACH#6FZ"UHV$eS-Ujc5-Gh6@aB"d'i-,eVDeLc'L6-mKjM,
F%r*FlYZBmf)r3FhBZqB8*mKFDkBmH&M*CEjpUU5NcqMUMHZl,G$)FrP&YX*lJ%6
&V")5fb&&5#AJ#$hRCZLJ)NBKdc[fS@lc&8+41k84G`VH8bAIPL!j2GVYU6-RjVb
F3lRZ&DPJc0[DAFTb'rRhYdi*$'iYhrbA$q+6*eD"#2hXL3&E#6aS*Xkh8XD5XZL
!8d`D3&(YeTiH)j,QXMTfCIrBQ',QaYKL5NVMZKb[jqBq*1K-Xm!cl6p*FZL0,qj
368Vlrpap[%LPH%SI@AC!''TAaj91(AL#-@"3aPPimHVhYlZRfC3AeqX$cDJ8$@f
Jmqd&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")bcdZ
iN!#&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,*MDZ
6TKGp,[+bNp-`jPQCpEJ64GUkaD!DXF'80&)2BbYeEc[GB!TTEhMfk&f2mYQTP@l
1bb2j`E4mDbafS5aG4rV(QBS,DAF-pIPCbZIRk[pq5'N+mhpAIXl%CM(qp[IPf*a
9Cbj2D@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-1
AH$!(GljqYG"C`e[Aj!i!N!-B!$3!N!2c!9i!!3%!!3#3"32S!*!$P!#3!c`!"33
JEfBJ"b"TG'9YFbi%8h4[F"Y*G'9YFb"bC@eKD@jTEQFJG'mJ9@j6G(9QCMS,9@j
6G(9QCQPZCcS!!!FL384$8J-!$%-1A3ZVJL3qkK$[IhHFK&$&)G4%DP3id51JI+m
$XhQ`E%%LLLY5&L[+BUmfRPPS56c20V5eRIKlp5'd&R#V8-'DN`[NHa2f&Rp[Uq2
[+Bkr"`Z$C0@51V1le%jX88M#[#6,5*F+)D6h2b'G@&alE[hp!!hQjM3a!53d)c8
I9H31TRe)rcV)$iI*09++@dDQTRq#k&TppEhe[XIrZIY,JQEAQSTlA2-l*paR2Y5
,b2iCjXre,L1E3r2Sef%ELF&(C*Jd)T(#pFK,#LST),jM##,K-*&P)-*'4#N(P,)
Al$TU(bITSp*QRrABYfrHDa1r,6ZbNYQXrAKQ61GrVaVm%1D2fkBE,&GRSiHmj'j
dIq'+@IR4JL(UGe5X`5E*!eQHbRapb*ZBmZmrGfA-)@dYfHQr'i"Y)IkTiB`XAjf
#C%06d@6BATL+H`a'2eQEE-kf+IpU1*1YDdKN$-N9qrQPKCPeRHf6%JDc)IYAk2D
PL!&Dh!UIjADp8-!q4hB[5KibK#-S)IaD0Zdmaq,MV3&H(T28'jD(r@GCA+CH%l)
[SjdNfmEk-UZA@RA5k`r[AePd(Z6H@GNEi(ZR#f0fIc4Z%cldphL%jIr[+@JqArA
Vk3,h[p@GN`4mj-([2DIj5KfmRVaKJ-K3(i2,4hV#!Ej`Fk``mZU3!'(1Y[VK-#C
LRRM[*[A0b2i&[YCHQ2FM@iU%X,h2T5G"SY-3c&2Z4+H4+(5KA("K63c*QPKGd%6
$!8eN1%f`#K8QC%qL3NCVUAUH+PkT+F,G*ERBE&L6qA'pV%RTqhC*Nm,EpS)Q*pq
ZHNZ6(BrcT3(Q1ld"T[#(RS!AT@fTJ+6j(l-"$q6QQlA0q1#b),24mMSm[r52PEZ
cdS("#!a5B2!#JqS1GX"hm#+(KEAh#0-q(T9LIif+X83hfXl(N!$2KDajX'+)-G-
JaQE+,D[E-L)rLl1$A@L+48kN6+2A(p8riYX1elZ3!%30["K#[P"0iMMN%'I5pDl
"+9($iJJJXeh`r)K66A46"'G#6q'"1'GX)pR$1GJ()$K)%EikjmV"McEMQFiXRPT
$L%b1QR+#U2TXMQl#UCS'[kGY`ZS#8XBc2MHLTK+h,m4QE(`P8j&K"NN8q8LR%p@
EX,5+E$ebj+ZL'$'q5jcDiK"r'aCE2rM![3Mp3ipm$r,r,VUNla@b)ak5[2,NL@E
bC-H1&*8aQNammYm8+D,i%Pf)49MDQ)macSk`RPqK$Jp1l$GJp$"20l0kARafiHF
(YhA#D1kmr%!GMCe)G9dBhH`JPG8R1i'mL'`Aj[Am0lr)$TlmJMAL"!0#e4+YcRI
(qI(aKj4VB",1ikHNqkKTHrD`(NAIr,B64)dBRD*kI)8(FJf)PpYLUHcfFR"8l3,
`e[%Q&bL%`-&&YGEjP4ij#NEd6V+N-r)qKQTKU%paAR`@8ArV[!i4'Bam-j0c+VV
aMi`"$`5'lajYHZ$Xd+0%Q9YU+YAP[#8f$94@-k#0MSPSJTCL5S9dc+@K(98LMU4
HI-Z"*Rm343l'9e"2HEK`Nqj%)qGMQq)+R0&[,r0r@fTq,F''-FqLM!jk'3SQjA!
,p!IDJk%SKZCHi*)1@H!J&`-")$(rh0QR)14RcfEf0$DQ@cqEZhqaEpcchI[hrLL
qclAmDE2-8SaQ2eRA5HPZ"UHTC@-&[Q%8j"YUe1!Y622V3R*TYr#bIG*FD*Ghq3h
4Z'5eDXNV+ZjIikS%GB("F9T)XRmAZ(cKCrPf15FCGQ@Pb-e3mKCMK@#Y%`52'qF
!Gr3)R,f`(j*[q!dYLM3a&%UHIUZL4'kX5P[LF`-A#jZmTbUCk4B59h['2-(LKXP
J,FYEfQK)*'5VB5rk8$c0c%VchKF+rK9N1l%I82R'JS*$-Y3DHCC$hSKLHIN04aP
S9dcrbk&2&L(5F,9FTUfDSCL5h%8pT3QY4p2A4bbAG0+APYepe@I2P&9YYedrVaA
XD'RZ$-&aIf-`D)LDeqZmFX8E`V8*,pFBA!U9mYJZGlSf+Nrk2F&Jb8i'[Rp08(r
[j6c"a9#4MqhD(UBSDr"2$0'm9X&64eP(U2J[cqZ'jp+,JQ9G0j%2YNR99Z&5ifj
Z8A#%cJ*bX*(#@jJU5Y!)f+hZ%ai6K'2DqN[dA!"'Z2k132HllH*P%+r4m525"`N
bLV420j*)$p3L@B%)&fQ2cAHj)&`fiLXClN$MN@6qkSB9MT1F$'G-&b43k21PXRr
Hr1KIqH54*!+d@bP*RklP@V1Rq[VIc)8S4r4Mlr4%IYqf3j8Y'eD[XY"H*eIG-"K
BFc53!+V`6R-(`TQN3UR%li#bUaf'@A0FScBST8KK4j+M&2I6pMUVhE0JN!$FUHS
SGAbJl2@'`P*aRfPNY'bJYShE9AC2VVC-'LV0Nq(bS+A3*b'"X"%i4N195-SpCUG
3N@C&-%3)+h4$prRk"ap0Q11q$`#3!aS'!)!!N!-$0Li`$e0dG@CQ5A3J8d9")$B
Z-!#3!`i'!)!!N!-$0Li`!cBZ-!#3!a8!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'`$pMIe6d[rp[Mr0f9KR'kJ!,Q680A&D0p-'
14[HZ8aVX",2c+"6FaH)b3VE8Z5$*F`Z3!0p[JRD#kG&%G-mTHE-6hEc*lLZ&K$2
-5eVUQP++(3Xq(j[6I`6`H[ijkXV6kQVrRepZakZIr82rqj'@*3+i-fUMJQe@`8J
Q[%@VE)a9Y9jE2Q+EYiAYB49ph"I'dPT-T*5d!R%I6(k-`pHZ'qD(TKRU8p[f6Gd
2ZK"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+VVhTe1X#JZ*BmLfiRI@!&)SrH'p`)*+Z-9
!Tf0)-Sk[fIFQ)JkrkFEqqpLI1PG2++D4"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'mJBQ8JC'&YB@GPC#j,!*!$UN&%3e)$!!#f$9X
,8c!$Gh-YCJEX'G2+9FBh011qY99@aMp[6qr9HVIZ2IrL'aS!!2!0!!$S0Jd!!!Z
b,4Z"TIJ(GQIlqH@Y,A269XhI@GL6%@dlV3-R+QGCfFQZmRMAGd5&i&,%Ii)B&,j
%$*hc3NQSKJ%P3S!ZU!lHe3A!Ni8FS"Ldp)0C(qm)NQG"[L$ILXeK[1,pDj-&TB8
5+iUjFYcRZF,59(MPm@%"!*!$$!!S!#J!I`&`"+p993!!!3#3!i!!(rp!!#!#)!!
L"*!!!#B*b!!L%q3!)L!#!#*!!3!JKq#!)3r`3#)F-#!N'Im3+"U+#$)bLL3Q-[)
b6M3'15CPp$)5C43N#'Im#!4``"!#2q!J!3'!3!#'`)!!3!%!!#!#!!!6j!!!#FJ
!!!53!!!!!L!!!!&!!*!$J!#3"i!!(rr!!$rri!!rrr!!2rri!$rrr!!rrri!2rr
r!$rrri!rrrr!2rrri$rrrr!rrrri2rrrr$rrrrjrrj!$2rrrrKrrrr`2rrri"rr
rm!2rrq!"rrr!!2rrJ!"rr`!!2ri!!"rm!!!2q!!!"r!!!!2J!!!"`!#3!i!!N!F
"!!IrrJ!)!)-!#B%#J!T#!N!)K!)J#3J#%![3!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!$rr
r`!rrrq!2rrr`$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rr
rq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rr
rq!rrrrJ2rrri$rrrq!rrrrJ!!!%!"rrq!!J!J`!,J3+!#%)#3!Q%!L!)5!)3#j!
!!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!r
rrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!r
rrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ!!!%!"rrq!!J
!J`!,J3+!#N)#3!T%!L!+5!)3#P!$q!JJ!!J)3!!)#)!!#!N!!!J+!!!)$!!!#!J
!!!J)!IJ)#!2m#!J($!J)"Rr)#!DJL!J-S)J)$!')#!d"L!JCI3J)'8F)#"Rr#!J
F-!J)$rJ)#!"J#!J"X!J)!!!)#!!!#!rrrrJ(rri!$rrr!!rrri!2rrr!$rrri!r
rrr!2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!r
rrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!r
rrrJ2rrri$rrrq!!!!3#3!i!!!!&!!!!#)!!!"*!!!!!*b!!!%q3!!#!#!!"!!3!
!Kq#!!3r`3!)F-#!%'Im3#"U+#")bLL3Q-[)b6M3'15CPp$)5C43N#'Im#!4``"!
#2q!J!3'!3!#'`)!!3!%!!#!#!!!6j!!!#FJ!!!53!!!!!L!!!!&!!*!$J!#3"i!
!!!(!!!!$i!!!"r!!!!ri!!!Ir!!!2ri!!(rr!!$rri!"rrr!!rrri!Irrr!2rrr
i(rrrr$rrrrjrrj!$2rrrrKrrrr`2rrri"rrrm!2rrq!"rrr!!2rrJ!"rr`!!2ri
!!"rm!!!2q!!!"r!!!!2J!!!"`!#3!i!!N!J(39"36!#3"JG6C@Fb!!%!N!3(8f9
R-`!#I`#3!`G6C@G1!!2r!*!$"d&38%`!N!BFBA9cG!#3!`&*3diM!*!&K%C548B
!N!@%!*!$0%&9Fc)!N!-"5801)`!$!*!$J!!"!)%!!J##!!-!JdC548B!!`#3!i!
!!3#"!!)!JJ!$!)-!N!-J(kNJ-6Nj-#dj1#""E'&NC'PZ)&0jFh4PEA-X)%PZBbi
!N!GA384$8J-!!3%08`,FeJD6pp*'c886E3#dq6FZ[0Y0'fE#E,kV#pq%hE$Ej0e
feG9eB3!*1+@)rh3&qKSdTMBHqm5GDpP1JSQ`da$k`,2S!'L3!-@qrJ5q"J!!"!#
3%B%!N"k"!2m!N"b"!&3Vr`#3'S%!92p8+rm!N"L"!&6rN!08+rm!N"D"!&6rN!9
8+rm!N"5"!2AfN!08pT!%+rm!N"+"!2AfN!6ipT!&+rm!N"#"!2AfpS'3"PEhp[B
Vr`#3$S%!pIEfrIq3"[a@pT!$+rm!N!b"!2AfpPErIrH3")(rprD3"#[r!*!+J3$
epT!$r2hh9Rq3"DZ3!hrfpL[r!*!)J3"8pT!%rhrfIbTr!*!$9&4r9L[f9#[r!*!
'J3"8rrD3!eErq2Gr+Rm!N!089+[h+rEr9#[r!*!%J3"8rrrfN!2mrIG@9#T8N!9
rUrIfp[rr9#[r!!#"!&6rN!08q2ErIrCr+T!&9&4rIrIi92q3!e6ir`!!rbY8rrr
fpPErprGr+S'3"+a8UeEfN!2rre6ir`#3"2mV92rfp[cppPDV+S(fN!1"IrrhpT!
$re6ir`#3"[mV92EfrIhh9UZVrj!'IrIfN!08q2m!N!Mr+rEf9[jrpj!%ri(hN!6
fN!2hq2m!N!Vr+rEf9[hrN!D"pT!&prMr!*!-rb[fN!ErJIH3!rD3!rIir`#3$[m
VpT!$rrrirrripT!$prMr!*!3rb[fN!2hprMhN!2fprMr!*!5rb[fN!48pT!$prM
r!*!8rbY8rj!&92Mr!*!@rbY8rj!$92Mr!*!BrbY8re6ir`#3'[mV92Mr!*!FrrM
r!*!Hr`#3-8'q384$8J-!L*3393eP94%!)9AZ4TmqRj95PcUATCN,r9RRV)1Y&6P
H1jc3GFqEVLjEl3C1JUk`V3AFmqjV$&`iAPc"J3XJ$Z3-4`bCdm0Y##l%,r%icjZ
FCiMR%66'8q2A)&qI0c'k%%2)(0[kr[[m2Qer(3-KPpIhrcNG9MB5%3)"N!34!C!
$%8)1!&d$hjVfq3GkSM-)I$p%JIi-VY(dH,DTQlm%+I%l&pq,KG6e2rZA[*+*Ki9
Zk1YTJNrm1+q%MK*aN!!IIC1)fQ+kp4CCBci[B"bL3I2"8)RUN6Ap6DF6h`'adj2
)DcU0"36Mmj9TS#RE"L,9@i0@[`hNhLm(IrBACr*6N!!XQl+0J6[RfmDDYl`eZ-E
FY"[,Ar&P"-ZGI0P*VbG+3ZHARDAA%bA"9VlF#D*`cl+cRIm'%,b12Zk6)#!Q(!2
2j$P$*LG-J5E2RrM!p&ER[i'19!mLFeAc6N(d(66I2qpZca(Mf+)36klmC[al)S#
I%(k#V6P#rY0r$hpUIYB@",(+iU`)$BRrQIVVj*!!BbLV12B!RhBj+rKLAm4PV[p
6I@`Z(mV1**MMND'46f-5JpS*JThiaJ(9e$mc!FYX`5JbS%jQc(ACRK+qcZdJ5-C
%8Sb,EF+8If@U8+AL2hqGqLXec0M8ApR%13bEmE0Pp!T04Dl`k9(pG15+a-THM1d
E%ppSrR'N,pSRJRP#jC&[cqrQ*)1$9[IRhBNF%9hjRr(2XIR2XIR24E$MKqNLeYE
b!h@!Ecek4d!G-&[-pGGEBVU94iL9[h)jSlBI2Q(HkZ+[+[6(@hria*@Y4q8F&#j
@-A9AJdj-(R)FbQf3!2[cZc[L4$4YlEIHBNe59SM+BKeS1Xd'k9K)5mT1D59#UF6
Fpehf)N,XfQ'I0DNGG1Q2r%H*d0P$P"dSUMS1S,'4el6EJ5hD[9K'N!$*Q'clbaY
LY"XNB2b(E,N5qH21Jd12#M'9APmSe-rAqEGd(S6+!K$l`QLhqIk0'dqp,6``#)m
md"4c*QAA2K$"1fY'2p!8*qr9"bHDT!"P(`CE&M)rS()$Dq`Q4pHkf8k[l+V1N!$
IV2j)cTBeXVrk&-MqIKXac9$Y5CM[fLb`QD+0FREL1hrF,,`J1iF5rPMdRVfG32#
2c5+NqHR,Fe621"#8+*2Nc[Qi,%1*8YYIbXSFAB%"CkKCaEG"aA%TXR+5f)!rHSi
%f3p%3F!A[Vb8Lh2BjD(9YZ(0rb!@SB*"LpCq"(P0CF5DY`MaNKBaE+d$"90r'),
RP3LfC[Im"KA"`BkdY9i+[SL86Kk3!,G34%Q"Qb)+34U4(jYD%fNblKY6UDc)J*!
!N3(4@A1LZc@[b5JRl8p5G*[[YiRd81IfK)JPf`+#b0[4cS1Y`Qakrl2fJ(RS[IV
VKm`QNkRqXlP(TCGK4bDd4`)QNpPN(jq&TTlCjI4C2YX%)EBJ,H53!-5dLEmdQpS
$+GqirZKGPSCR-ldecdC#,rmB@fG-RBqU9#8H)X0CJj5Y',!KUXG844BaXF8[UJH
U8mejcBHEFTZ+V)JFPBSb+*TEQQh0Gb16ilqD00@cUQI*BmD8R&4Nb"6HZ6K40d[
BakQ#RV3iIIJ*aIaNR-ecBP%8ZHUB6aTUX`cQ@i0VmTSqE,`ARfQ0*cXAIlXB*,b
Sk5d`eL'6F-q*EQ0J!Z"fGFe6!,BE6hbDUrTkik3mCMmMbrT,(5klhaLU"aP2RiR
hUDXa!UEFM*49-VdXMje*cl#(-38U-IeGjq,LM8rYA5XDarKRk90l9DV'`kDmaVk
RpSTSSkPcmDl032`jFeT)B$%("mc)'XTE8SHIUXiC2lM'&MFYETjlq,R3P#hHjhV
+eAbp+Drj*L+*i'FZ92a&j`cc030l*rUJj2QQ4DT(m&10LRQckN@`9022[M&E4I1
[$81rZ[RAB'XFb'XZ95h#C#2pD0RBN!$Bf"!N#Ep""!fpI2J#IVl3XRk"RrHdV22
Cd0rmke2eI@*Bf!DDRk3-&BZ&`"9RD(rJ9,GbBiLUkpHBQamh6Uea0@r&YMpd"1d
Y%`mhIf'deFDJi'(()YAM6M@C!6,ZTmaT)[6'Ai,)5PfA!X8CXT*f@5NE#8!A8#L
K,&pcAZ0SmmG@RM8TNXe28aDL5#,UGP8rPE$3#e6c6aZbA!c%rbii5Fb2,%@3!*k
(JX3"NTTca2DUZAkEX+d4AR0pcE'f[AiUAAecMm8fdDXHrD[A%Q,M6qPIk8r[X'`
pBX0NUpKiKIk9AVRHXK8Jjaf[f3+ck%$)A+pcBH($`F[Ea-DVp+rdkXf@VFGXlXS
((cPkmq90U+VRp[dpUY@r(a3KQfpZ,`DqF))pCB3#L'RV2JYPq*ZV@j%pKb,C8Ie
4Hk3,5-kIA)SVjpdQ3Q-$64qDhpXad$60r0RbBf0Hmh[,Mfd,D0%iX[9B5[,Q)iF
(QZifIapXFm(ffQ'hqI[,AqX*E2b!rT9qm2L4VDr01JC8qZ6)$8!-Rl0!V@aZ,jr
`F@6k4p[Nb$kGD'QZ(XMQfIH&e3l+$U1XZq%D!(B$MC01R5j#fGBL#H,93(e*I*Y
)lYXQN!!p$4)b-NJT`KT[Pl0MZ[B@aKJN4RN)1Ap*L!pMEIlrjHaf-lEG)GpZ8"#
b**1%dN4EC,5bHXM!c#KBV#e%9*BG-0FN#Q$Y3@Z3!)kJ+TR4DUBPSG"mE&DF,V%
&fq2P-Pp9-,pf(F`R&Fb(9QG@28-'hR4'BHE2m-cNA&9ammIdXBkT#P@&6FdSH)-
Lf240D9+SKEUT!BX!`0"[kS94aLL4M&[*h%%Z"MMHdLkHYMM94[pdLee'Y9P"Q6I
1iCrI*d*f([cfHBR3VGU[kBlP'i2689`Eh@"ZJk055-SbE4FTYb",a8H[lCZXkrC
j'CU&K'Vcaa6eXLDU!cAm9LHDk%*YUj,%&VU-J42G-Cjp'r8Se80CPfJS9jMr33j
'k4Vh5C[YUC!!"&"fLLMqkHKR6D6ar"T8S)eCFP*MN9eV0)h'03$E'p0MlI%H-3,
&$@-aC8e#I49bhZ*K0'CdBK60ZFA&1N5hfM'`j&&l3Jik2Cp,9C%k9S&#a)LImf#
50Gd%bMFk`b)388&43Nc%M#V,CbK5e14'a)X8fJCFJUBHZ$3jP$I-`F"eeLM%aM4
A*SISqUclB+Kq`q&aQ6+Z3G*2iR!&$VM42&hmk2PCJNc62NXpd(acLKT4T,B10*G
5dcAJRb@Ja2&6h9#UQl*XIP&PLbZ')l2LYL!bT46Cih'Hq3j(TH5H`0l!8i200kh
TDbjpDJJ&mm0,5P!`cq9&m9TH&!Xa6h[Yk3jF#k3Sfhkk`h+LflPA'ST59')PI,$
i851bJl`d!6H2BSk-BH+b,Fk9AqqJ,DQG4b1$Hp"#81d0BjYCkGMZTA&NTZ6[Fp2
425)b10U03fCEQENH!%Ua3S&mDk6!0-%3VH#)QKLLJj83(@K-X%XkfDADU9FhfZ*
G3N+AN!#eHF1G$-E&8UC'UVC*CE96cbeZ,V@hc-KVIY`H*3#!90Vm4I8[V&j#rY%
dLLbRKbl#P8PEA2R#[PPjJC9-`2m+6!MCdBe`0)*"L8fb`rK+E8aKLZXN4TLEQYM
NfkXrHQ95b#M`%-!ULPr*&Ufr!#*L3",`bPlMmB0CSJZ#%L5SI694[*LG3R$a0-A
EXq9ecUjb"&Gc`ERL4eV"K#J6#qB11+GmU442TYfUckcUiB'E+[8!&$l@2p6j[*@
CUfSr9I8dI5%eDj0f1SET)*[ZdNil-1f9TXmB4'c#Y*Y0'd5Xa,5264Y%8!CQP5&
`%(LlrfDT-3qbC5'@(l`e#"*M)B"pFZ13!'YMXm5q)6(&!C!!G!$ZZ`XHS1TA'@a
Pae"T!E+He5d45fh2AJ(`+iUI&K$iKLG+#ak!D0Ni"3**+m!J33$2,1(dfB)a3"e
b6m&Q+PE9`JjR!8aei8JKM[$M))lC6,QUFAj`VH*J#i"!@@8"3DF99a&SZ!!(DRP
eHaNEEAmRZk$%N9Y3!MI4VF6#a#k!Z'8JaY9$j'AMZl8aA2%**UT3p25SUU6M"5R
QY!!DA2ZQidJG1CT*K3Ymc`*0)qpN&aA5X[QEMYbL3XTB!M%c$HjNBkE1[VDQ@m"
3p!kjEad!H6e39*3R!Ul2f@YN5af!SeSf"1rPVS6$U#cfSKQ*6kYQ)++ULMD5H3L
rhD0cD#lEYK'ip84G5[+1bhGBN!"9[M2QN4fD1L,-Sr'QIePhKd8hJDd9fr!Mqjq
SJm#Gh,f`"!54VqMk`8M[)+C,#)4S3Y%Z*jhTlC'19q(5TYS2TjXZA"8ES@CN`fh
#Dipb"c69i8fEr$&rrTA)d25qR+d1-$[E54`KZDq-#CVD9`Ee'03A)UA-@+5b1&[
JUZI+LZ,LZS6Qq8-C+-Mb&kP+)S3Q8!5KXEJ"P9H180h,&G%"-AZE[`3$C@!ID-J
Y+XS44H6N@@HiB([*[TkL`ZCjh&%6SUZIYr88P)5"2d%81+MqpV&UUh0'p)YCFB8
Cqb9(*DX%L%40lmBjQ5#j4Fh!l*)RLDKN@P3)Ti'dJ15@#$*2)%q)+`4ilr-fIB0
!I+"93Nk*r'@-Zb1@l!Xf9E4Q@j0J,$,R&YV`XkQj+EU)`$&9LEdGC['DULM2Mm8
P99'11TVV(X4%"4BiNZ[MMSKH!%D1b*!!iBVTVTcU5*q%bR-ZU1b!#48j0MU`T-i
kX+6+R,C@6GZJ+KpN2"FfIC1KkKRYG[,Jj@i`,9jbPCKZ3$0-Q0j!3dcdiF!S'0A
d`Y3N-J"F$LbjDKeB2)aT[m2&+blrJB!aBieVbG9bANIY`Yh"TMaFM#l`%X#18aa
JJR1N8bD3!"@[A3la*KT-RlU@2%U!b!NpBKk('d6)bkHkk6L-e'A1qhFd%C1S')d
C&aIrHp8D6#bj-Z!Up"UB#&b$f"P&8H9@lF+l3#%SYj!!+YAPR62@[Pk*,HdT[&L
b#jq&M@P4K0-P#jd9D+KUBX*l`UKDi`)+LaqYQ5KHUai#Q)!#VQZYQSSiFqjf,`F
r,8"a'Jh"f-8VfM(KjG22m5TemD0U0ZhQdl9XfTmQfVf%B[3m!0E6A)8*S(BHk&*
8')N4Jp0JYK`)%!-#FY-"`9mJUZP&G%"iPj4SZP-(JGV!NT)h,36-%(PLU,6`lih
HkKi%BQrK*ULbMS`3362T%*TZH`ZQVNT6KF8djI4q$J%8X#G()r+qX9#!QJc%JQB
#VX)&2B@E8Z,,,G*9$8Fdh6P*Bl`'diK+3R@6Y,9LMDCE)8M`TNGNk1('!caE306
f`('H90+#3k5F2IJjLS-0($`DYR-bmT*(8F6IY!D[Pa``jb)`JTN3Q5JYh%6!'U,
XU*j881M(6e3L&A6YMHDCqTU,)'V+1Fa**9$leh558!#0)Q3aUKTJ6PPQ3V-hc6K
*$YZYf66X2*Jh5-0f+Y68FN5R[QC4BA5bULhAj5f%Lb#Ua-PpK!M-Kb+[A5GfarB
USmd"8mmjKbUYGZkLSKIQdR&,@ki3KG&VN!$08E!-dmpG5m[6#"JZY3#Jl`)CEiS
*5-[[*J1P#q$+eP0`KB+25pL6R)M*AbL[b[h+m5bUN!"&ck'B5PdUHfZ`D1ZKkka
#!ZM+5[94BhS,C+P,T")[#VTRKJdU#H3kHZda8M'#p4i8*dF*r1E"1QP2K,fBXE1
6TT@"+'$M4G"4BY*(+B,DLI#J&NL5QRJ"8'`&)&Um"CI)[D@&SbHZS*NPa(Z1AUI
202$f+c&Z'!"9%0f%j0Z[D,Sam#5J[MZJ2P4dJG881+*%NkPS,P9#X49Y6"HqXDr
Y$pqBdmr-8'2Y+@L`pK60,1H+1@5`9LpY#U*YF!#RKP@,2STdJNF5@SYmbm5NbmG
QLMFE#LH3!2'+E(%UC&$XZ,J!LF$h@ZH-,4q#`#F-lS$F@CD$P-C!HdI!9rqXdar
Y%+VJ)E[$k-G3lHN)j8@pU,bAiZ1fEm,VXP#@Fj[4TQ@ZXUmdHSPjZ#2`[@J3c"A
iZ1hdZLa`fSlXPVF6$)NMR62q8(UL@e)&Mib%j03-m*%hAH8ic#NNGeY&p5@Hf4c
YR1Y)#efp,@%E%c9I$LE-@!#`r18FTjUbZ3$mVkfZf3Ib#3lRJ2J-XdkBBllJUqZ
3!0i&3r9@ek6,P!m#G1'16d3)#AS@hE0A936hC@T+Vh@D(!"HFZ9l#,`2mDYXpe$
#)Jc@*FkeBK!5SGLik3)r%J)cULe-Hc(Y`b)S3RMTMAD*8-#DQe4h"D`4ekXZ8FD
&9ILlK(GG`ZPlPB6kSfRl9+'V*kAK@R9AD#@b',kh!`9mJrcQMj'T1R(2K%JkZN)
AEr1dG!@fB`rIL),iB%m#mCYI25r+a#hhT)A8SX+4&Yb9eiHV+h"mc13%QEP3lVi
K,CN[2%CrEFcHHX0jq0d0ejEC4pii,di,faYlHb2pYiYaB`#[IIHF"hfa!JSq)2F
Ri*4pq*2lUMV[)T1J3PA+KU0Pp@+H%9F"&mXSL,B`P84GV"hCDV0XBrHp$&I,k1c
j6TpM[V-PYQZS4-KrR)[-4@+cF,F"0EN-D$lSR![f5+adIfE+'96HXEcMUHHab$M
cqc2lXDJMNMB@bqh'Jh!1%![qR`bC&TY[1jQ"4@$NH(V@E9LBm[+))C!!NA)mMaC
e@9M43V$rB%a(%iKLScGk34a%%V#@k)A3IJ#qhSJVjP0h4ApjJM,6Bb$CG!91BlQ
E+Q#+-J`FL%4[`1VXBT'f5Hjq"SAPepkerE$(((A&2FlKU'ZIakR'TmYCJDNZZ%b
)@!@Z64TK$XBJQ6*%#5QLFmHP4P!V9q@5i&Z$8SAe3ThGKb-LjZ2ZJj442Ndb"M'
F-,GiR+,SMYR#[Z[LMf8rAXlQaZ`VmlVpDq%bc-eM1-`mr'3H!)h+`&iPQ@)HN@L
kSMq,iNCR&*pJRRI5*5&B&&-L4SdcZ5[JIk%15Cdq3#!GE[T!MS0YkHq@MBaJ'%@
Q)95MpTKGkKmiV%K)9i'2cqPpF5bQVKk,4DAKXM%F'8X#a6K-44rFdB#F*RHrJ5D
JD,Q"QX8!r-3)IMi&'$PZ(+Q149fUDIC3Y5"$fp%N2$#d&ZDDNY3,`&%rNX2!+3+
6H$N+)hcjXeK)mjRf!Vq3!'qJ"VF(JU*[[#aD6HI&0Pc5i`MB[G@K@+Jk5+,TGD)
*cNAh*U3V%%a8p9a%NU2S&m29[`"V"E'Fq)!c0(#'&XkJPVC3lEF2iiVakULpBQJ
cR'Y+%8`@L@Me,Hp3SM&*I!8r2LeF2$qqYY)9dLDMf15Yp)S(1LLSA"D2JU9R0CB
+iH'-flK5HUVlT)#ES)",dHP&4UdIj2j5"'8NhS"Ca([3$%0L-k&@alcUc5+!iVA
%T'EXQZE(B!$H4"f+C6r2d%1a`J#ijmN9T,QDP'Uk9Bil%j5*D22!IGh[(*lY1JP
(M-N*TdrYZDXqYNZYMVLUHr4&#"#qfaU%@j0Dp6JDfRIA6Xd5)#G%iEbrP5F'38D
5MD+-0mJ8jR3h$P@S(Rm(c+UY'2K9K9c!,eBcR#TV%'c$URPJDe'p`!pqKFEXJKr
4iGp`TieU(+ibMK$CJ+l&pBr`DchDDp8E*U`fH9fL8%Q,GmLTEKk438&BH)'VJB[
M)P"LfAAF#9%5L6,!lKQJLjViKPqN3rc9,8Kmi-8P)b#5HGJe,3U%TcM#DRj&928
9hka2[eQSq!@1iV!@45NC@p8lG'JH2r3#[p+!h0V9eE`+pSN0BMHYaRlh1m5bP5,
B'+U0DB0rYpk!q#DhFQ8p`#1"'j1aM'e5E50(G8Si4)N8T%e[,RI6$b'K+Q8$*%'
)U`!*Xd@Im#lUmSQm@96%hMNS*IGU'T%5AT9m)5AhiU4,0mKRkq+8,6&LLj2C)J(
3R,dUj5Y+USJ'eJZci[BS%4pSZ$da+`jR*(pd5286%*@[R*+5aC@5Db5DAMH$1Cd
cPqSc1+5X)P8)Vdi61ed!eXfB!#,bZZT69L5&S`ZEham$mEEjl9Rak#,8TL&9XAf
+(i%iPLKKGPFm9U'Ia*CfG3%GHfJ@#)Jhr#8CXrPS+`!`dm+#i%0%q1!*1+4%*qS
`CA@%+HY659Q2,QI+LNS+DIS8)(fpAMfQGbAP&-jA+UI%"p5(9(qbYfJChk+QI1%
RT$6lJA"PE@r!BAYjbLUi&UrD$-VD$J&fC$Sdrfc9kYQq-&`pMei6VKi*m$DB+bm
@15QTj(8i![!-M'2'(DPRdP1%P2b3!!TY-NI*d5`bmF+Y2%RGL#d`13((-I8[rA`
L+8hBYaJ$#P+a)4(Fj&*eT(H@1cSN!PPdB'brF26QE%S6VC0rHRrd#M)0LBaE`j[
Y2'Y*EK3q,+D`3+*Q*"*6Af-"ZDihEaU"kZ1+jN283pNd9+!I%#06AHj0ANGI6L5
k5I6)`MkSGYH%)U,&NKCSElYfCZ45V0A@eqTrGBP+95G'EN$HNeXFcicLFq#NchX
$NZ1*b+9)(bU@@hGicCr0YZ6-aI@q592Z)VVBBp0Ir(Qh1HpeN!"!*[Y(-j(&8)q
Ua'GDr(T*E"081["k#9bl%2&6pmTaHiXd*4(MIM%AS)eDQX,"%MP1ahLcIFISllR
MQTEBlX!VC'FajKpkj,Mfi%`j6K%(ac@*X&G,53jCGT8DcDQTrG,a9ZQ)P@FjPQb
&Q"CGh&l4[UKNFqZLNSH`1C!!Tq3SL&3J3jE8%L-)6ddm)YVd"XPIdBX1PYN6E8I
Ke,T)9E`r%(0SfI,qI5&Rmc)fQi+YY6*E`H1-,@PJ8`F0#4Q4dK%E*2$H++*(pq%
rHc4kK#mS%HV+k0(4h[a4QXc)1A1F6bBG4qdqaa%N)JhSX`&-6ZZB25FV3`T@Ah[
4NIeQ25@6prH3!(2,lXrU!hd#581ji9rX(cTPRYMG1pMIf6IBhGEA'q%Z[ec)mD`
,CjL3!0LUK,c%K%bdp8p-IQHLFq+XAJ`&)S"4AVC`Xi@2,mj,JF`Sd+P%NVfUB+m
kfB5'XXD*0)bS2#mL-!+EP"d[SK1EaA)dIGU0E[P'DQED,P,&`TSqU(MUqSFLNk-
6N9%K4Ma$+CR(dc2Pe*aFq`AR`C6MkI"`PSqI@8TS&PR,X&eH)2Lf)BQVGmqd@-K
dPV,R)$$DJ`U)`+RAZ-"Z$GrD9DUNi*C4NVKQ4`eFDNY3f809ULmN!1-G0'Y9M5#
2jB)eQc)l$PXSF6S*P-4GhJeepC!$4bBe[81mf&&GXCC"E%@Bf&SZpK1klJ4P&#c
Ji&36&heC,rT`h(i[!f9UDI%'#PS43P4j9Bflka-Jm%mBCm2TI2GR&M3BpJ4L0R,
&,4V"CYZPV9-`KFK,q,PLM$BpIcLqZpl5SlS%Gm+!-l3Rm-jCdG,$+q,(#kN3rHP
JpbNB6(pE,dFG@I0P(#M8)bp,KC2k40h3EdA%q!dTLMMD*ATP)fXcqmh[pj@Tbq`
pH`0dK%a$BYVRNjL+lL1eG5#V`4KS115mbA')M[cS,&9fBL0$#*8GmU-R1[AfbiY
`EMJ9Y$(k-@3HU"-$f4,`)Qd&!5"#aMr8h6RBIeDlTI[-p`HS%2H6UJTIKkT@@XH
)rQf&'eLQRB4DSqBXJBBGU5ZQ!eNB5GHTQZZF86S(86*XFU)k+T6Bm1+qcKQlGKf
13jA4YVqS,B3#5%KcVp,Y'Z6R+0"A,81Q(,qH%S[Z%6cS8F,V&K"00"6i%#R6(+r
a&bXGI8prKUE6P+0[pda(b&R4(Rhc(pi2(Je9CRZ6$JiMDDSkLFCVI3$6I[J!94#
ED9$2q0cJ[Cc4p*E0peNKh(c5b9QaS+)R6XQ&(Dm"q2R#0'KbJl'qa5f*FYTiT,B
BMQ$$bh$XJC'i0%QZE80`lj9[Y&f%S*PU0c8rF@%A8&!lGr"SI`B4IS`L[%IBC8N
NFm8JBI0'iPa-+Gck)%B5`6H3!%"3H3JCJ9#qUSR8"+EA86c!m",AN!$K(3LShAC
I$a`@#ql&&Y6F1&SN`49e2A'ZfYFS+q0@%,3'cP+(%HTLCL3!1qI$5-lfG[C'*YS
Uf`T&ebiBLdGIkHm4MQe#)kRH2[E1T'VA`'d%Y(!3D"H!PIGli[B4Z8e6Pd"A#IU
Lk`G%Q(+EYJQIK-J2*%68U(`YqJ*Y)49!+#hk"cq[K),Jc338KMDMYrc#F$N1pr8
16TaU'k9MR42I`G(KUIlFp-b8h-ad@31McNc*c%h02--&UJN-YNc#j4)rbCLDXN#
4D#$k$K(HNM'[+GF!i&r@p%Dq-pSp1%N,"8*NV(!dR%D&(SJd`P$iA4Sbp`lGhYm
jfGmR"6HiJ!A&Z&63qdeNkK@Ii2LEp5QKfE6i,$h`JZr0Q60$[!!6X@h%`LmBC`%
GlV+hC2'Sp%XU4!)E+FScSFJ@&"IeKN"rDE!l-Y4V3%$DX&-b$)"N&5qLN!#SB%K
Ak$Y2q$M5fpBl-4Pfd%T*9rd8jE[VHB8BG@5*6LFjJA8fcc0KJ%M9k,,e'frVKS$
"ENe[*ppiXIRqEj!!f54(J)"N1V[V(HihUD#@6-L[4PDZ2E6RVccSS8VKlQ9`-d1
a8S(QJaZ"4Q1,%qMqc*0MFB"5EdY"b2LR"LJLjFECVh&aZ@Uh0N,pXCL*h&C1KiZ
cmST#qR61q*ASLLYI!`KS+1rkJM[BpAEPp8!hqRH$S[-([DM#Y`QhVFcV8RhSp(h
2"9GC+@+1)f,31B9kLel"9''EHXrfGdV"US4("iVXJJDUm[A94Y'9(f@VYP1eU$H
RBcMBfpR(Ma948L8H'%dp4FAEAN@R(4B#V)dU'GPG1KFAkT'UZk,I3RK96rc0HNV
Bj3$3`BY)#6dl,a!AL5PHh&*L'f6X&"86F'jb%B(%A'm9FTa)GE8pR"NA[[QCipM
6-h%XZMZX#%E8[3MPS*P#9b'cS,0j[N&CH(d-L%(a%3eGdL6VXJf[jDKGLa)UPEF
)M2ceaSkidGY`+%GkPB&AKfAhjaCXGT5Uh8304k,Hm4*(2r(*5ePqcRSb&YVfUMb
9El&+6Q!qr4EfHC[R!b$f8SFX6%NpT+$#*k(mBPcJl8(f2U*X(%@5[QLF3XA,LmC
4UX#%2LLcLK003$PqCk+R6[FENa21Xc,ElM#rB)SR8#)NTT!!P@V[L8GISdhDTka
6G"!%d&B*1*3YH`3ZpZJV69`-mNb0i@,c"&`a@&&-J!LrIJmT$XVRi0K1(JA,T)X
CU2-e&-8SqQ&@89afBD9P2!kfNA$NT)j[N!!&GQm2[9l*Q6Yi-Z@G%T,+VB&&jL`
I9GiL%q2TL9ZMFCqDMTjMk24`92Cdd!@K(VG-dIBDMcDiP1T9`45`dD!!2GLLe!#
"XNcpT,K4YEVq%h*`M&J1#bZKibH3!0CJYM5mDk&HX940I$c8VINFe-,qcV2GTdD
e+U8!03Ah),ATV,b1`!5lc[%5&5YffA(SD9TiV!4``EAUYi-*G*Mep*(Cr!8hrl2
fL+lhaMmbK[CYF9)J823C81&423cRNG"Z%VmbBDCZEQDrI#m*TqSJZN0YrZb6)eb
Spr#BkLc%SMXZ543R4ZV)-6PFT$3jpc*-i"N15#$V"38)1D3r)c8S!M6aS@%L4"-
c$"0"QQJd6(KTBKiAMQkHN!"Xl*RPPfZ1F(+9j4dH54j&*&dkeDQC',UpYh-dmVP
HQGmJCDU*(&11-U[#PAPr#90Q9CJbqr6+[2qQ$NQCrNV+p+p5QAj5jSa`C3j+JRJ
MBR99XXPYiZE,9KqT%HBeD$![!r-l($$hE$%!jTF(*bC(%9+C&[592DQ"9jdQ-LZ
AqPA64-[8E&GZQRj3-c%'S(p2!"06$@Ic)L!XZ06ha1$1#2FF!H+&%"9Br"H5#2U
mJ$F1@cM,*Z-U@'caKQbUIT!!E1pXE*NNqQQTfLC!UeiI$+lf6k+4hBYU[VYcp`3
$b9&9"rfXQiSS&5mmmYSG#hRNV86"6iYK(RNSSKmi6*%hqeLfS5Vh8'&Mj3dE)JZ
JF+f9#Ji@[1X0TR09+Ykq-k%a++j)EckmX`a8EiA8-%LXii@&alS198FKU5qmDQ+
)YM"%NkLQ#KAJ4CCTm)$JL,PCCA[DN@hIcF%`&c+fKMpa28h0JLkDmU-K,hl"+dN
GN5lT5RV"!PCl#lD-Pa)30cL1icSh0am%PTXXXIQXL9(K'!b[D1e6V-$NRGe*cI#
HZ+3@V6&",Am,Y6#Gp2G1'Z"B4-p101&*L"U*$%Ie4%9Nb1m(X#e,Ve"S&eZec8!
hLR5D3[(k2+kDdMCZSj,kFC(K"RrCGiiEM4GbRA39-`38X6S,%8P5MERT8J'rG3c
+Smf-8E%X!9,'0jSkG,pa,,5M!VB)5b#Q!`-[M,Pc%E)9QcTkd!8A4%dCr8dGC",
E"!QA`(pe[B+F-F6)'AU$P"Uj*!T0)8Q8"#BC42&Ua6I!'jd%!M0#aT!!PT!!SDq
`Si3ij#a(TEebY8Ul"eA4U0A23,!5S&bKh`LDZakU(P&K68'GF3AbfSS&9c,FP5#
#Bb%PJ#)!3'AVLFH58Y!T09)e5D)'Y%eP"ZC*@1XE'"AS3"+45dZV@Yr!abCm[&(
H3FhmQ!4X+&`(rr"!H2-IJ%3j66Tq33XZd2%,@UaUN!$TkDG#F9&5V'3A$FG@5Nh
+bQa`r0K%$)DQj(IlKeE3NQ6A4R(Y1,mfDP9V$5A)VP,(@L5#Q#6q9e8dU9Fcb($
PY!pA+AMG#J3[8JS'X,&Dfj'*6@V&*VQ5r*`-iQCL+jMBC*b,rCUD*[AJ2Sb#3IY
-Q%HVF!p(d3"!5B,9`XF%Mc1&HbUciC)LBM!!U$mPK62iP&ddKBYDq896r#,P*9(
4bLlaa#S"Jp)&Ahq%ASB"STAKX2@lD'69&qfF(Rl4"pU0'-!peXbZFAVi0AjF3d9
"NSQ1aLVd6DKRCY1%&*!!$[82mGB5%k$@"L1e9BNL-['CS#N@M"6SP9bP&iBLmq2
qSE!5Fle8-,jU&6aD%Dk#KIb5e8VrpEYXDY@A&F[KPhh-e@fSIeQb%aZk`+"%-4A
8`0`[dX3"i6LEBapr0HS6rh25Mi6G3j'U@!6$Z4RYF1J)%CLfYRd+#6MX88Vi29S
e1R4!&E0&VN5U4Lq0$X@),FMC"'HVN!!5L1qZfNf-IQ,FI@Rhd25cH34fYXK90MF
bXa3*4PEDaK4)(4$lKFdGk@dBc",q"4idIp9H,hIDjBQ3!2lRT2#RkC-KJA*A%4J
2G!5k!S1"dF$*J$'`*h!j-#r3&*JHH$p`4f"MS$43'%U'2+(fd+D3!#QN#GdEbJS
G#0@&[JUp'*SGUJrG%GSB+Jd9"T2"m@"(X#Xi'"`0fS2T`D2"KF(DB%0`CR"ZF'Y
`TcIN9AX6hNhH3HqSeqj0paleeRJAH&rhc[$1m9lVhHcGjIDl4p`kpbbhfEhERH&
1F9[F9pf2Z"HjkpehZ*pdlr,jIF-qR@q@VmqhfhIHGm"hfEI!eq#EkC[VfqVE@HB
VQbT,P0R+$THePCdZ1eqf[kbUE(PCGGRXX[UbD@8hPpeAYXXImPIi4rcYrKhq`hk
(IlIrj&5Kq!Im9)dq'a0PGMBma)IjE2JD(cVBm+Gm1-D'&rQ`K`friN1C$4rK`aB
f[*-2[@aB682I,MDXjF20E2JL(pl%KPrbiGeXq+pmq!8E[X@($@cBc)HeE0M%K`[
CX*%2Ml(K%Mj-Bm2&I(L1$9rR`a0XZ)J21pR`E6jdXH(2q(!('rk5$e[CF$BI$V2
K#hcSCm2T0(5AX1(rjX1(f(!'(cl1K[r'Kh2Cm$riF#BEIX+(,f#j&6m@8ZTZQL)
&%&-$CeM)KPc&lQ0Xb*AU6Q0$VNEh1B@S@LiURc&)#1X0i$Gm1-CHFJ@jHpL3!%H
"@fDLUV5L+KJ$9i4EX#'2)ZmcM2fRqLei0l+VMR''1pK`2KqqcpMVm,1!XmpQiRK
dH&p8L(Z4-baA62dVRl+`)pbB[#PXb#2#Qk'ii#KRMbLQ,[)TPf,U!cj&#[J*+Bm
,N48-5cL$AJ(F$,ek"I$)$T)#TZQ9&hb5EAFC(el,KXrai4afm"rjF!BEmS!9I*d
0ZIN'&bK3Q%FS"#pMq4jqPR1'23UPe('',-@4BhcU0"2*!dZ`M3fj%3B2+iaP'@I
IaKKi`!kZC)KcK369E2JX(iEBm'pT'0U*j6rV%3Xp`)B[mH%eLQYHSQY#lbQQ&[)
TC3"iK%r9+UDqaDGU&&2cqG3HaG4rmUNXKYE2qGAh-SE[iZF+CfKM$&cjSF--84i
a)4YM2d*'cpP*!AmJmpFEG5LUZ2,ID#T3STLD`DFfXf-8Q8Iie,@++@k1JIF9aql
N8rS!`&%2[+KJi&%I@+kBiN%QB&&-0I#TA,DpSea)M!f[m''%$Br`B4mEAZ,$@@a
BaiFk0[bB$dIBm#SI4YR`!aU+)MDmc)GEf*!!4cY(MBB,qI"kTS)[5IQ%V0!AJ0a
Na!YX1)m2Pl(K0rP`2K[q*aqLLaVa2LXSpQ,a6kb)-E)"99FC6*P8d1Hc&e6`Y,%
"LA+a!9fjL4dJ3p#a&pr#B*`0#"%e'e!ekTek2r*Xj*)%R15*EpXj12-X*H`PPk@
`K018P#T%LC!![(C+K-J"Q*NFJ,RPT2#fDC04Mm0cBM4i2VM!Dj,q"@IcaBLh"`F
l4)!IVHC(iqJ8laVYdHPLJ6!,MCL'(MZRLGdLAC`APd@MH"($Nf)QNL%F`(+Db"A
(a!Na4hb#`A,4`#HRLIR$Bq*18L`@Y9JFaH,,f!&mASbPil-XPSY28q`m2XfaNrJ
XLCh!jrABERaq&Y2Jmd,-JFrrM[AKmaqa`rKm%Z[#Tckf!jr2BY[`Q4PVaqIl-4Q
I1E%4I$k-6H&6'+[!TcMQaqHa',bXe8K#k6BV0Lf"HrY1LT!!6J[Z,3[-"9Mh1VC
F"lIYQX$0BRlJ`m#eJCf"VB(0JG,35P%GmJ9+3JKBSLQd-P!$`#mDDK%0SC8B@N5
pH!kUZ%E-&4X$mm9Q85bf!)6d"ccSFdJ1k-"N#lJ!6*S$q3&0i,P!GH"m)!DJ-Sd
,q!,)`J%m-!q,)a3iX6L+"5Q4JJNTX3S,8Z-K,&+`1)E&15aH`i,8@)I&D5aq5S%
6LbYBN!!D,f&K`J*G$!D@B[%a&U6'UeKdB2%"&JNXDLK`BR%4LaBXPQ14a1)P,%*
B,%4NPQ$aYeJmJm9A@0b(aAFTF')a(iZEX%#AQq)1,1CKm5%@hk6!LF8M@-c!iPY
Bc-CL!4D0@2`'LeSXhX+#&,!)#e,!fmb)[Q"'p)rFL2k*'p(Gh)MqK4[4YGb)VZ&
'p!3hSJHi%Gh2M@Jc0k,IFL1kMa[4VlN42F50k'&Z4+AFL2l!MHKAh)LHi8Ed0@j
%1r9'&23LiFM2i0EZ8iq*VdXZkk%Y#X0DlUbJ$JEii"8RQ[Fi2Sf,qJNAGD0H9'J
'4#eRSYjRSTBT4"ec*L$+c!HhmN%VIYVadi-I*,4bbM%E41lLfrJfhmDMI"XPI"[
Eq6B+q19&r(+9p[,$Z,bCAIl[l2)16&VBj,qab@(q3B*0C'QMZ!PjKeZ3!(aQ+a)
i9D1VDU$kf#@1FJL*[)+%UZ8P*0$UQ+5(Mh4m6TpCNiE2k#RkH#B0(c00L4SqX0&
(A+CMBZ[,&XlFml+&[r4,(kk-$kRE0eS'9cScq')M1DRaJbp+"d39MUIT"hM9pV,
PHaCR#KI`IjhlqF,Ml-'VT@!k6"1h2!&Q-["kU+UD'HUr-N0YC)DkQ"PU!c28fFa
3ImN-G6Sce*pc3hf1'qS-EUMr`!heRlQK[XF0pFIF81Gb3lf,'qSGh&$rb!heHQk
SIq+'qYmmLQrL8A`cMq,rbk0i)irLV6b+raH2iLGC&*p!02h"VUNF5G&RKAMpU(-
EAaaaVU6&PrrS60+LYKUChKi)fF,&rT@,ICb,r3X6kq-G)3P&eb9)6-mI`5+4#N!
Q%#Yj0aC4Hj5j0e(b""YeGb)G+6K'cTqYc"'%-RS'cX%&IIiljq#1rJJ5G0I+MYU
b@C6KHfhdR+N2(EAjM01S'%(A2AhSZ-H%j$%GiV$1`KFpl4C+kSl1c4p"BRJiAKF
FJ`2B-ZTS1L48M6a4qQ`DHJ9h-Mp@(B,`Y'LZH8e4b*jbhBGa68q4Ykh(,`VQfA)
,DK2qd52TDjpSjNR6Y5+GAL64EdF#aQ2QHUTBc'ZFh[h6BLf[j"BX%MEGSS,TlBX
+CT-DU6VAZkK59U4(TXF*95-R!-NCRd9#cAQj#DMa@Q3#N!"c++Qh#!53!"meSIZ
a@)8Fr0G%+a+3!-R"1l'3!"hkK'N-0*!!A-DDm#U*"-KUdlZFZ)0ZEhKL+M`QSeA
4@828ld'd)42Fll`h`ETYL(PEhUF1lp"C6$#aGUE&[J81VSGHVFSAaRMp)IY1[0U
",L5pFZLaZLU,($+l6#iXqRAp0rkc,[V,pc1Qj*RKrhjfGqC$)&$E$!BMMq8SZZY
#G#5TLc"k))fqSbeYadqETHiUN!!iYA8#REqpkQUY`m$2"dGEkp"p8c3((Dj3jiM
IVX[[PKhSeJ8GCI'*mrRGX5*T`pr+cXj)cmjqHFFpk1$VKRY1(Xr)cNa,c655Iq2
JIURc9Ze9RJd92emTrZr#*!Y*Q*6JK*+IF2E89E+RG4lmc`I2(bq(DBLi1011cS-
,P%b90X8jaHS+E1Rmh43B[N@kkhK@9NiUZdC#UU@2@-04el)15@V@GhJ#*&C122b
6eYBkC-8JiHYf$D&bSM[(6d-*&@9(5R5)%b+*f5`GjCf4q0%a4(GP9NRmY!9DmEB
0%+q6MPkRq0(I@IcSGB[rPiIdiJ[%HSM(Um*Lk4M[U!8G+H5[524q*RT'3A5p4-m
S1#`G#aG+"3B5qhdN'TfHa%GLQ4bSD4Decdq)@VNI6S8VRcH,"DXKd!&4SV@12Q"
UaB2CTU4YPPbcBQ6JH+`R35mZQ8Z(T@5HHM%da(96NNX[&$[#XeDE4#eE,+2&VH5
DedK,3SmG@X!28GGa&SNGQE5iT[!mNYm88F(,*Q[aF+X&H(c95#Fk0)1lDT'#fFL
V1I2cB*1ZBQMITfqS16UJT+5M8G6D[5B-q-38ZS0F%'N8#hkN8DNQ'hN6D6kB4Zc
F8%SfjP-5m4SM28aPTrQF&Ue#IBGEq&&"#&#D45J9-LDMBiLFmj(-j%ERS141+jE
Pir&a5,cT-'YiKZrL%L59hel(R1iIJPPD0'""TR!%bZFG9NU-MaDMdPK*$fTKAB#
aDKp1iKPbCNT+6STm)9IZ68XI[*!!PGQIDcbB2TQ1PhP,Pa+,lL-KhN!TX(5TYPa
kiieH`lUr@c(5CY3`p5&*MYUQll+[RG`IN!!3S&a9lU#ZhpXl41edX'6aMZ"*ZBR
EU9*"eMiqGd(4Y,JS+ASC9h3,ZTKEaj@pQA8eX4cG(5#a,h8`))k5))AL5r3G$eV
A+G4HXJ+e2d5CY8cYI9cYZa4UhmAGR`eUceHSICGHlE,d%$6r"LJmpIcaP)jYmTN
,"c+cdcrD)1@V#LPCN!#835C6GmJeF18Ham2ZCNS*'lDAjN[)8PFK4Tj`#SLYGX@
T-jNT5XNX5dM0%eGT-j2@BI1ZGJiN1NGDEq0&!d!G$Ua%V8'H+!SCl(*3V`!*8'*
Lk(KAZc#UTP-A+adr'P+TQ*!!P55%!JCe1D8A-dcQqbbCEjK!J#&KQ9X'P0#j!b(
"91(AUk,N18N9*8mb9E6S95%cd(Cpe-%ZpSGYBJFkF1)SVhCT(l[8q$Hje"!&&*!
!Q,+Q2ZrQc[N+PEI(BITUMU!856'kbU!d#%SMTd"*CI+E#8hL!V)",bUlbk2#@cr
"1llP5BB-hHCTUi*fG#cS*DFSG)dE0CrM(A#28b9!PkkJ5UTdJD'+%S-1NGpYP`E
$qGdS8*'N(X"-k1+Fm1iBHC&#MelebT3B2S"(1rU9AIlaV1)Qi5FhjI+Ucjp8kkY
2-A,Ge5F1pH$3bGBk8SEXB"f0YdSL[Rlj1MDX&c,#98P&PAqp3BdCSN9#Ya+3!#&
PcfF4@P)ebP`$r3bjT+%3CLUI)8j(B+C@kXbfKJb49F@+M'(435mU(pFhrf5rqNB
l(Y+SI#&VP%-Mh1-F(RZ*FY+UKX"06$!DrrS'!BC6X5J(8KG,)+VqQ1%"Hb3J[bj
mdkU&+e"8K@PjZ*)8eG"QK@TJ@19Ic#jS$jYBr1hjKXGA#Qe54ri`UIPNVNjrC!N
8FAYX%1kcDC4-"Tdm2Y"U*S-Bk+D+"JC,kVIakQNPCq*6K3XT`&,(-Ymf-S65U#%
i,X)DJP%FJ4)$akJaL1STbJXmfR,5X&hqJ%pYelLY,ePI"F0Ap-#crP+H+1Ff!LD
C#MUP!)1#LJ9H&R$E!FK&j4BHR0GJNahFE!l`EPCeBBK*3GLb)T-PpiV@QK9&"k)
i@,q)*r[clckbh#)(&%a4-ZH@'L9ibT0*Bp-TFX146'pY6`aG4$U6LE8YedaDl#@
*#ENrc#625j8D,k6AD9'$#PA(5#&R5rN,#Lj-)DV$j5Y%0F`93YXI9hD15!KT"a$
dfcSHU25QAD+rPT+'UPS-Pa,SJ844'bN`k#m[QPRqj8Ack(*chNqq,d9$d9BbEkP
cqIEX2hma()kfD+L-YTLZ4&[%9Q"#QaMDlc2MD5N2EAddlkK4UR'Z4DR'2kY4F5E
IfdLLq"$3,0Qjc6$iqVf'`GG@9LlbjkV$LRb!G&+4riGjekPFFVkE4L+NiPP4!*Q
[UkKQKE'KLpSdP8VKVVDi4+F&TY#dJI28989ahK8@'(4HEp+#$BB9UG,&CHV+aA6
K&kY0[ElDe$cpP05*Xa,d+M'A9pA16GGAYHJQEEfV[8I(TD1V4cJH@+!f&-N5!E+
GZLPYQ9k9%@VhSX1U'GXID4GiM,ThqU(mlS`)&F2YjmMP8`iDM(9lPk+i@bFCl2D
VfS#d6Q,lYZD9)H%P%ijTp)9dE($kS956EM@4*3mS4,,LFrZB9L3,Q,Z+p#+9#Gc
e$jP99MC5GeN0!))bI3##d)aN93`[cVBIE9G8-P)PXIfNcLa(88Qdm)S$&e*&8l+
,'!QBFY"MaJHTFdF+r#8f'4d#S[(#L`dUmX&mZAdjVkKNIY8kkE+[heG19A@lXNU
3!#9N!A+0+N!ZCI'0*PbrdXb"")%',3555!DNfKJQ$Tfq9$DrSQX9VQ#m1c&b6iF
E@#"01)lPM&Z6$*ceG&kN$XbFS5[2A[YXT1UjBhP2bR!PmkC9lVD!9h4VF'"'S%3
RG!#U@pXkTYVG-kSdh5I4GHLebkGAT4EVJ[1AFeCdF5baLrEfj&HSq*pmPTUI"L"
D$N*pR[#Z#k6(S2B!A1dSDqZ"5fpdQe[AJDkQSIEjadJj$8KiP9&"B2eA5-M89QB
$mI5V3h,,+A5Iq0MLEHlTadkZ[2CC4*1AA4AY[*M`iM%pkM$ae+i`ULNHEU`d
2-c8!bYb)e$P4#I3!mJP0prl!Hif#rRL"k0Bk&19N(QSjV#0cIBGYP(J$aPF9IRf
l!0($,c9ml)05BYBY2YC82XqEbS@+TM)RG5LDbKQ+TR+KYUNFP-J6%`rI1)TZ+'c
S0`PUHUcj@D#U!B,2i3GGdUAT5H8AU18Xfp''PM0c-ml)"h-cdibCUHQC'9Qrhe#
5"5ZbS"$UmK$+G2'KZZdFKRiVVk)QUBS+!lYieH9(p%8cI,4%akFp@[$$3,)GjS4
l(49rq@(&AcJJDK#l6fV5%8QL1Ub)@#49(Arc+k5M2-ZJK9qR$cVqcSXR+KHjIlC
V&4YlEX9A82GU0+b[86EIbTZFH2KkPk'#$D[Q(blCU"KX9JbZNBlqD5cmU+(L,Ri
SA04fS4Mi&3123Q`a#BKVUqp!6cjrE(jJ&Lh#Uh3Nhq!Ur!@4H(H!L09Uj`Rh8@$
[`*'q%peiD[Spq+&K"@pN*""ScL&S*AM33Z),8Ff#8SHHP##Tq8,1QHb6ampNb[E
M&l*!F#*#8fT@j['8e3-%Rp!I@,U8R3J2%"`-ZVid[1(lUfe5KIl!`[8"JakB3b,
+Dk6qbPkjQBNN1$Zd%8k*P2%31#6JpaqeU!2P[CLTH-%%h+-&r[N@+%VL-&29)Mc
@X4!2'JmMIM-bmSj`P!fJ&fY3Y+i'f$K!2!caTQd+*ePXfcFQ#qeN*qm+G3BkH(0
4jKh)QdL+K!)dK#+`'PeYjUj)CC4&b4pmacGR#pXF%U9TZk9Kh6a33q&D-M"LL*2
bCK5K`a9$%0%(9P-,b+`"RU83)S""LqSch,`dfSNlC(pq0bGU5a-cHF1GSkfGr%*
UpNjp)UKEQIQ%L2jPB5&ebLUU`LBhBp+SR#TUN3*(d3kZ2*im@I[bR%3U+$Tm3RY
P`9Dq56h,P(5mB#G(T-)!QT!!+4SDdT8+-A45'8BFJVVH9"3Pk[)+ELh"CR[6kU$
VLJSj$U`J$cLFC%B25GD5+(Ph)CTbb4"+8X8IXPC%UM#3!%J8*,aa!`R2+&B[FVH
(&EQ4*Yj*MAmedjj#d6M#-K6,09)k0SRMGZV8aNqNZ98eAUK#I+*16a#pUel"V#6
DeUmb#'S"imT%*d6pZbc4af*9fUS3f4$N`LpKC+'-&C1p($9fIf6acir+p+0H6D@
H$5)d$KZBmeI%V(q)"$)YN!$98@&Yi4NJNQY!0)a!8)R8UL9-+`(dMi3ADVJ3TJ+
ZQ[!'16qX,MqLL*chd1#6G5XJV1Nh9e'q@9%eZVfBUY&#[f+J9Jb%NR#3!+JTeh3
hA0',#h3V9V5qH5eQDC[AKJdA58dB-#`Zm'ZdcHm#9q8UE89SUY*AP9'kRPHVVrY
URJKd5XSLj!fZh4VUP,qBZIV385*-UYP%G!@"TM*"Z,b)B)mM`1CZeK)PpGH!f+[
T0PbLUUe-N!#SI(PjB+%")G8"a4B9ekJ@K9ecpfT(&aI)Ub`5p&YlqCGc&G9S)8[
%A%L91c[8SP$CdV!!pA+##YIq94CT'NhGkSJ8[9MqYX+99f5[908`Y4Gp@-jfZeD
J`+PbYYE"ARBTYMCFU4KdV5kXS(3&NA&['0UZkd*2UAaPeEaDGK')l`Q&djRmmKY
Y`UZlQ,MdEVr`YQIV$1"8P$U8ah9K"9PBC)cp6bALQ+aHY6'8&mP53Q[q)#p**EV
9!pQ+SMmm%PFG!-S2H1&"52Aq#JLS(MVH@[-+@#NVB%9Ne!dMZp)II+-mS*T0AIb
p3Th99,V%ZUjGRiddqFB&MJ3qmN[+4`k9L4kTJB"1+&Yj"pBGJCZ1EMfdcIe&3jE
)p#EFX9#V@`l9(!(KrdNj)(@*CSL@9MTq3D#VE4[m#4qM5Ne(K!5G1+SJ#(-95Ub
k@aH*9ce8hDNh%[[Z'b`MB53Y1*f89kKZePI"+0$h6ccm[ciN9jMIEN1&h2Vc15"
kEKBD,)CT%S0U$*KV9X&Q&24*j`iF-K&a%kr(CGi%CmfVF@,EhJ53!,Q5qpEU$Pl
kLYlbrbTpZZk"UpDC#kRC4"BjHG#HrD$HVf`6H49NTkFF[j!!IJE6f3E(XV$0E(e
r[6G6V0r-e[p$QdNYGc1TfXdB3#-JYR[LiFG+3C!!pG*#8jGIPiJNkYSMp2LKLrr
dVPNX*66`3'a-!'d2f+l5RjH%2pA'`4f#D)Yc6R4[+,)jClJRah8U2JcCdlKq2ee
2Lh"NmjAS*U3T"F*4KR$dGdAi`Zq#-*5lFDDNh)dcedHj'mrr1C@l3BB!j@l85-V
GU&PIjA+%rfc+A3q%pHJQk(+@BF+[C@"LT@[jTIH%AIVhl0+F-aYii@0ArkBAVNF
KSlr3p1FT,MK#IkG%D0-0%N+5cYHRZ!K(kmp4)+m2@UY@PYT+h4"f(R`N)bIl`3X
CQEPk59fTkEmhCS*aD$"9k*f"2&eX!hh)M!UeM`k[%6Xm`46hR#-1VefHYBDFpBQ
N,J[U`TQ4SEJj&cfAAiijkl[PY4aQQlKRJiUf@@FbFp06IKrQKUdRpie,&fh(Re*
4@C8F-*'80qE-6)H2mHm3U82rAekl`LhcDk0iQKPPd5(bd&%N2Q[KdSd)c$d14lm
(biR""bN+k5&[XkcSXQNS!0!'53l8r!p$`%1`5V-10rL&lBIi8lELNUMdR+bF"c0
6bT1e5P&EbK&ed'KFS5KH0(MjSfiV11"+IkL!F9JLZ8E6K#Fiak,f%M"m!L*eh((
0BS2F#fI+%5QCc`dfDBU)c*[bMTqjlF&+4C!!22(`%q2FQGfR)$f9%l5qU`aCfSX
S#XJG(d&hUDaqfA,Afb!B`)Rp`+KbqR2YLrmUPrfr'XTRhhZL-V,h&ki2XTChPGM
ZZ#IlE'CZCJUX+M8R)c0eIcS`4pPC6S&-9l6q@Dj)$Eq#`'VmS4e`iJ)!2%cQ[d*
h'L)8d"@[V-L+8a'pQU&8r*qU5@A&eLU-R[K68mY$C'Up%(Pq"D@K!3q0&+5!5*6
q2!4N6PU3!!"&48&"(Caiq,iXDJEJmX#UJe3U+ejA,1VAjBJU,dMT4D',mS-@(IM
bMUGPCfAQ1Y22CaY+Nl#SdKGKa35m$0"$1)Tl5e@m!diS6%f20q811AJm!!qB6E+
D'PJ-!1R"*GGe3@6SJU5[8eN-Y68iGMcV`H1r2j1GQi1Z`[H[%M[T8$X1SGrFR!c
d$lC+IQ-3l!0J2jKlj[`&HrSU-,ZJ34a'H$3L)%l*Em0!m'G2B1(KBRC3)C1l5JP
mCa&Z$%a@ZD,ZJDLFJqNE+%Y86[a`re8H50AV'e`AK#9EfP41)&d[8hR3S0kAZh[
H"V##2`EL)KiAL$mR`L[rX+%Zbc[ahc([a"m`K(PFKf%m@+jKL28cM!Fhc$!Hh"$
$H,!F`kJF"C[2DD1Jm'm3"BU#'!!!-!0"4%05!`"@X!p9#b`T!#TYFlqAGePA4&a
@)L+L&4(4e)aac"K(hrIGIFRcbmK-c8a"cLdB!F+#CUE2ZlX#)Tl0e"ScTh%FafR
-QXBaTk"a(+I-2,mDac`hRMXP-j!$)k6PITi&A$ahdhcrllUqll[1mehA"4XFJ34
"%!4"N!")LQ4%+pE9eIeQr92kH8H`q"9S`60JMX1FKZN+`f&#B5l$G),THl$0FbU
Qb8d)39(NbGfRFV1$4eZ5kM4$qS8Kir29ZqTN)a!pM[p5,DCI*lA620)XScCk'Ap
228!I*mh4LU3mqL$T8ffdp&YM6,5Cce4R'#A4Mr%rU)r3GdQ,Y'`TRCBN,G!HPjB
DMdCRmF9U+8e2HN0l@[Ucm94d'Ap0R@*iS`rbU@S"68ZDVCQN`FETk"IUq$hU[qR
ZT)&DTA5'KL6GVpdT2@$m-rSX(k3HTCUNZc68!q0%p$&Z981-mZJrmD(UEA4(8V"
fA'UJP+5(Y6h53mEcdI[iF(@%F5Vk1Ak[HT)H6"UTlCIQ'MR4HrNhkQiDPM4+UjG
bDAl53Zf3!$621"aYiC&U*b-m1UU12k-Qdlq51QXlT'EUNr4hEE2d4b-S1S(IVQC
3[k5rDZp)Ic2bSc2j6fTrBf2dkrahDK2p*DQ[eLMYSTj*2pGqP&iehSkq`(ZVRaX
hSfr`,p9[k6G*hE@,dLH'1cU@reIG3[p)HPp,Nb+S4p+(@ScdJl%TZTAh8P2TFY+
YHl62T!('9p%Vq6QeQl%LHK9r3[fHRNcUSLfAAMDf4Ar%rk2ZT'H61QMETDh82ZN
9l8fTSr&@p'VH93deMN4[i0I9YA3P+8aE)kfMUdQAY#qNDmEAdHYjQqSLCp*j6CF
5MIZLihLmDMH8D!Hh@96*TL9ac5,Cd23`P2i'b651$Y$MG)*Z8*e4*pH0UcY3phM
GL6SbHfS,m`*&aTMLCI,SF3G8Hr'-dEUffUaV%Nbd1BiMlKURDmm(G+fd@0GUBE*
J(S%C$D3*(3Xkam&8!M0MM-XqHNDYbfl`2*Fp`%Hll,+`"cL3!11%pA!X)A#&l&3
`(a"fR,"Mf0iCYEVQJ@5M8,F8kYSi@GGNMkkCLb8MqJkqc2,(a*9"-8%4D8%*PMp
+pUrFXCEQq!eZ5d2bRKFXYpR[2)RJ2'j4-k)X#HHD-LeIr4MM$RSRCVpP3fEbUIf
@4SYEDbfh2(GiLqe8P'"UDmU-q6(Q&,+mjjL`X!hZjjEPCG1bqc+#,*Ra&M8faYf
8UIb[3*hDbIQ0'cFY"[ISh&!YKX9M-55lKp"64(4S(V)Bc&SmUXdMV[S+(XeMk0b
M@Mca"JQX4p8-$q3,6XM"%)bSXH6"!-E*Z(3JFChB``e(aA)+pl!GBM'&'bkf&00
!X8'DS@)9lR(B28`JC`ULCiHdUQ8iikSqjRJaV9C,2mpk(KHN*RSiFR&1A1&FGD*
2*YGe#cH43&Ui+JCF',$BB99ZFL8b"M*a0Ek#dF'jUd)!0bNfJ9DjaD@CZ**BXGh
Nd)!+C5aLYhUHV@"5l6KAE)*&&5Xi3YQ5%'p4Z)AKA%iQ"'ZVA+K%eHSPXJ'BAAD
rKVLf(mDdpmY3H+(&E#PdfFf&C$&,A,JDeP%eJ9(aEcG6)I*55k%025"jS82XdX9
'l&FYKC*Q,P5G%'%QYYeH+(SU$X8HXb*B155"3a'5*16-BU6D#UZ%5f+CZ+Te+m5
!"IYiYAT9r%`+SLE@B4BL9D'DId99+-J,&FCP-G[mQS&8S[!YQM"+'b-32P&T-!)
2+!)j08C5-($0&5r11B-`&"C)+qKRX&*fB)0khLp!R2[lSNc9H#BA)UjS9#'"aNX
pJK@8khjfYYXTMXIVjI4[jPV&URDKhA@,8D@Yd&5e@5S+Xd)E[hb8YS(8#k2D&9%
*3'D$*%86'-NX-1Ue3ZL$!B'$&,0L-`X@%!XjR5TbZeX51r'E3ME!EM*FA&'F6,c
#&BIQ&bI@8H`-k9qR6DQ3!-r@866XMKHlJ2-c#T3GXP@aXU+FCmZ`I&D&h1Y9@jR
k$"h+pJX(SYVabZ#!-KD,*2US2Da,NQUh`&B-3)hVk1#0!4C96$+ji[e$e!l"*YR
%3!Q&$','CC'B,-8ZS@C)%VF`U`LaM[1-T`S[PS!1*U%0&R2k&f%B*N0MV2#3!%U
&8*G0l&G3-feJ&AM1p+M5b9'aQL1d!S1%*RSX91JKFk%q`%bL!q![p&J`X)L"m+#
La!SpLNf`LUS(0[8+1fCEi9MYf+,DX89SLB%$G5'8b4(b(0MZX!QC!'@c)0SPX4)
cM"pPGGi[6MKdaL+N#4N9kLLSP4i8ViH0&FLjcmP',LG$1Ha#$jX3LJUVaN1BL8`
5Fe)HH%+25@+Hd!3i!5(JkL@64`d6"q3"hJ0hjf%E"-8p+U-K$K3Rie#[Xah#Q"3
d#qjcXT'I#4Q(i&,m%BAP%@AJF,)G3Y4jX6c"j@),%qrIlS"U6#G(U&m4UQ*)"*V
B8Ab&LXLJf-V`mAj14Db$c%8qI+T!Zar[*2Ih9Aib$Rq2*TUq+cQSeBe[#)ITX-p
!hq@1DmS)fT!!f4VVrXSG%46eMRV&Cd3&fUbV$T[J8G([l,Jd!E[JD+r`8X5q$Q0
@,h5LIA$'V1P!Ad"r-8b`VRhr5B&@d`#$PkLDikUf+J@G)c#TJX(,4kVDMMBB0``
bUaApBp`*P[,3S#U9SFCl4ahA@L3*5VbhhQ'mYabG(6#C@1HX1Q$PI#8UqIA0%IQ
aQ3RVQp$`c!b+8"1VZq"XllLN*MHkBc-h9k'&V0XKUamkhFA!H'mQa[(SciDCUf[
,&kPrH@Ze+mSG"9+iJb*mL6%T5Y$#BFca&QKcFX6!Q(-DmQS`aS[NR2@3!(G4eGi
+9K2IkT%DNEmj)XJ5Ff[LBYM@1BhBCSITKUhTUVBe@ReLkj(afR`4krBTb"C$l2V
!F@XLI$LC!G'4k!`5!q0M`VK(JIDa'5C,elk+9V8hSHHEC`ZF3b0CJF4Rj'pZ5Yi
CC)R3mKNT3Iq2Mi*r(Fa@AG[@4h9Zcf5mL4P"QC[GMB,CRXm)[0liH#[i)m$VK1N
+rJK9fjkTfJkc,FiG83NlSb`Cp[cN`rT%N!#UI9+Jq(L4ilS[3(`m(%X-4!HdRJd
h[U1VkNa1QkMbJRHfTF!jZj+GYqA(ZRIQ0qq-L-VF(-4%'E12J581NPE$C1KDmQ)
eFAYQ9B%0d01#-Ye(Bc0MQMCRiMdS)cpcmc%)RZddCRFf3Lb1LDAKUKS4%j6CP&c
eGFm5%`VU1#S'Yr)MQ&4A8daVP$ZjN3(Ql%KMGJJdQ9@J65Z%+6*#S&$),TK`Q%B
MT(9L5fN+hU0H#BS)5[!&UCEJ0@fEBk*J0kh4B8aV4FFZ"XDdUaLMXNlV"Y2I#-'
hMj!!b`AR3lU1EGe,BYfA"-TT)mB#P00U(-B86i%fT83-M#Nj@"[IAkEXKj'-N!#
q@,XR6(6"-b'p(ZaTXdcSPeUQC)UlfSP0#6@QF1DHTL!p8a,33AUQ)$dcI&d6K2Z
iTLRpQ@[D#%$GZ"@QZH"@5+53!2K5UH06A9@V6LdcTKDa9DGQBG84k-!I6$eZK!5
hA,9'+Y#'P[KARAVF[qT-Q&i`h@&ZacRUj9"6`E0$*q*[@LClDRYMDKq(-48&0I8
RQ0l'8+`cp(M"J+(5Lh!B8iFE8i1arl8#E6V%6DmeKN+YSB#kSH%&eiC'YPaYqRj
MqR&MD+-aY2AUKLr'9mC*+q[dm*D9GAUV`jJ11*jZ&`0M1XTP1RcjG*6,p2l'd0$
UUT[BP"qcFdG86""UFA088dCXK#!ZfrmZ1SYJ4ZRDkae8Chi*fh%q)cmj#Pm1bTh
08FP"EX&Y0Gl`kYIbVdk3!0JhkSdhcKT$CaY$!3C$)a8q3Z%V&"kXm&mSr$m+IeE
K2bPm[m,rU[$h&*l$X(h`qUI`%SArA1(2+0bZm&L&2mbi[eGiXm)h+MaHiCX8[PM
K6LDa'`[2X2%ZKIp$iC@-6eEi3Y%'jJ9-+0SV,SAE92'kk@"R@3SIc-5"qh@&(f"
l6M,88`Tr'fd,K3r"qb'6Hi'Y-8rKpbUmM4dN+RbY`[qZm2N+hk,`%)AhC#hm%@`
FcG+c4a'[FlZCaPk&4l+9TLRmSX,c&(jGiGmb3HfBLNN+Id(KIe2iFDC+Sm)I8AL
D`Rp8q!Q&IkI`Ac,8'DBF9NfZ@Uq@$Di`4E(j#B@rS[!r+rb5`TFUI+$#rm9dDQ1
N[ihTp#&6U%$K45be#NXR#U1G`XmTr#f&cf4,5Nb$")9r`JSJ@q%G&'j9q%k&"a4
q91%USmKdKIGAH&H@B*6PiicZI9RDTLLmNm)(X10lQDkJrS1-1ZmUr#'@KSIC'SG
BQY-9[PIKUa5q41&SmRbXm"X+rdEK[GPL`pRr'DC+!b-0%V1G3F`k4YDV#Pr05JZ
,h@*kB1eAUd"N!k2JMbb4Gc2@,a5q8Z%[-pBYM2Vl'1(!1P[K(4Aq094Ra4-1@3a
kBPNjc@&-&LCk&5Z2"a4HVr$R&4kQm#pC!L$#T[#c#KqNe$e&A)UfG!U20&e1RAf
k9qYJFqL4Q3ep'e0+ZUkHFEcRVQ#2dp8ZjrD%ZD9GPNmrqiPl8'hEqPRlqf@-c(T
jfq+Mh5r@&0U9Gh-lljM[2EGb5Q@2L)&jB@Xqf0Grir$XpPXAPIHq%"+)MjYFhkG
j9&Qh&DqGH6pY50(9GA01rC3j)Vh$pLA(2VpCCc8d0HR`-e(c#Qjp0Zf&(cEG-qE
kKYrZq8[6`ipeI1X2YrhmacZ+cqZrh[[(S'qHI[,l0rljhpJ(PPhlqVf6IhhR`8I
rmp(5hrrQflYNQq-AKrk9[2$JJ+qQr[[$Q,Y(AeRlkI1rHrfK4ejjmlXr[IVfd('
*prebppmh$h[UL99r[[-I@qirF1Q,Mjrl@rkpMcqlFm'*,fqBVLP0lTGS&#p+Q(L
1Z3M1D"&mfD)`-6!@GF-B[Qa4"jJHaY$"UVCj"ebhj&MTq(HPV`qL#4c5SXLaC)b
,4N$QN!##a1rbQ"!XqPfkX@J%AJ@3!#pm9eE43ADjD!ikb#kr1f*mKfaXD,#U4G6
$&-&N#bH(A!EEDm`&jfY-&IR8GaH0lqa'M@A56!NjiH@De%PD,9hc)d#TVr-6JM*
SDe"%rKF4#8%4E#c%IH#BY*d6RcqHBC($q'iq1M9LB#`fBiamDV%**XHS`G@9'M5
kDd5q(+PUc6I9bmh(aLl`fL3+,'if&UFjM-AVdEm*%fE8A*j%k2RQBa0T[Na%@MY
MmA5MCQDeK'Z3!1"rH@"Y0F%cb&KDD03-IQ,#P`UIGikPpFC5015APU%2fLje'AI
4@YqANU8*aY*-ikl8LEAPcP8N2biUa[dVY"bApTY)3IJEidXR3aP!bY,jBQ!X"A3
YlB,qN!!#E8QHF9G&!r-ZeX"%Ta'Y[GDAd1bVM2`Y[i*Q5lD09E-P+,NP+,8Pjm6
!@0)"BaIkI@"k'hIYUY#-9fJ@@R!TT2AVU'5IPXI%AK1@$'cCp&K3k$!@j"9F@e$
Uff34"mB##mj3#aDFV4JE#ij!#4"U!9T"#c+-ZmDr8S4@08c%AUHai*aaedb(Ire
Z`10Y!`8X+[$4j-DSL2d@GR4*$(Dk)k+Dh$(X`(+X5QGIHBXV**fVN!#8(r1cT'!
AAQN@i1dRdL)'b-M34hjCDbcSMbj5&(P%ebjZ%ad[,PCSpR1#3hGq@qZVG2k,8pU
rKYQrKYQ)G+1,BSVXV@Y[pa)G,`p@RID,6%,(P[6BiKGB)IkFVrL+XfUU2$QH!#p
UQjm-mr$Q25qZQJcc9JSb4++P1'mV$$i8[%fLibG$JZ!!'9VSQ[qVk&T0$,'5fCM
A(YdT-'L@APJZ1RjLV'0#Z[TAm#q`)lEjCe0kIX#BAkjVhiiXd+c`k9C!SK8Zc4U
UD[NS6L[UUa99`SVkDN@eX1,9cES,,qfpI-Ze'Elqa5eAlM$QS`l14c(1lkjV2q)
p`KTGX5kFS"A1d%Sqk`k'`8Z60G+rVR8'Nrl+K1PmFD6N#b9M)9*l%fm&9T!!e)T
X`3T9V(MeXq)0b3VJYZ),Pa@9e)UFbJThDZf+C5AIiUY+lBXX[S9)md+NHH(l-1r
LFLZq!9Q$aHTHE[BL(laVF0A5AYlJj4B[&lTdpAB`9EqE9,bC@(#e-cNM+#U#$Nr
JL#b(l@0lRE%F9LEQq*m&pCSb0eZ5mr&0*5)ffCdI8@l*Y"bc["1eDfG-di@JUNm
RNkl5iQY(pG,M[mN`G%8GQr4eD@l2#[Gc+pRpBfY3&E'1qGrU`KLfbPA066(Q"M2
SRc[,BFbGAU"p!r3hTEUQ@990kqEPH*q9[2`)4ZZp2"@ad-YAUpU0%Lm2ae@2@9l
HH*pY(cPSYh'Sm$3ZKjdd0jcHDmlT9-Pcc$RKP9+ZQ4XhEYJRX[US"-IB%M(USX0
h#`0`8GLMh%cE8CFGaLJ!cLMrPmC11qm616&SPSbF2cR0A9&4r+%TdehPN!$D+KL
U94KK$+2a)LFAD--`')E[ClED0relZSj0*KA`B3lrAQ-B2K!-3j0Pf%DBH&f,akY
rI!*-YUUGR`[c2S`GTN4e1P1Bi0XR8ESDhLHk#&B!J!p$24df50IXr5[dDrm5fe9
I&3FjM"4m[NL"BdhCS@ZKP9lHeFXlU9TL$F`FQ2B`#JcFlkM2M6UZDXi1AJirj9c
ZjCG9,I1UUYQ'`-a4cpXbrfI!HciY503)5hQAk[SKK2Mj,(kqqm5lA#PlEhFjY$c
qQG&l[lJ%@k$eh[q&8CILjB2KQSf(,cSd,djIV6KpYFAT,!FZPAjQG+milHjl1Mc
V4QUG85KlLJ2Mc'2b4YFZ+cTJ+[!H,(fkl+Q5al)IbASdrA(,iGa$1A[VGcIXfII
mrT1RRM[p3Z@rcrlcc*h(Eb[rdp(I(cXK4He)6JKUhYcBY2(eM(FbmeXh4F5iBp1
fl2Va`T[E2YUq-hcX$'pIr2EQME"CEGHZGQ[rE',SpE!Vk&qkI1[FJ#j2GRZLDmI
fVlcmR`l2GRUQmlpZrf1I[rIp5rrIpI[VjerfqU((Kjrmprerp2ajleHlrqEc,k1
6h[e&Zep2rZA-hhi3HZ89bmH*XkG0Q6VpMGIqE*P4YqLla8ZA,)LF0hrKh1ZA%fp
G1YIPb3&2G"cFpH81rhPJb2h"Gi3-VER,@NIr8aUSLX1PapehC-1DYHZrA[G&kQF
V[eVqrBT9UpqkHkZI#'2Pf-U)`$@lcANqIYLRhr"Ck$mm+QAiJ`q0G)kijplcl`d
FG(Gm5aVmp,H@02MTEcidq(6@HjBjifR`"emDI$0U@-V$`amDqH#)H`II-r$Z35e
S--Q[X2TR[)LIZ(BfdCp8jqqGRXL[*@mRRaprN6pI!H%q2mRR9bI4f(p9Zid**%Z
rmUpPDR`4)-'%bTSRiCI'FM4HSdNhmE%)Q*!!6*fVU$8aZPAmA(@Lc'@8C$%&-0h
,6'-SMdC6,5fM)Ncq-P%"l[BiL,[*RUBbHST+k$(+TNFSLakPG%`0Xp"KbU9$P%0
lUCjf8`2YSAhd21fRNlLliMN8p`ZBPrY[h%Id6pbEGLFGTpZSR2k%ZF5rTf1B@)D
#LU)GP%`*&%60Y*NDUBNfdZZ83Hp3*ZAM4VY0&%%aj+CB5U-YY)YqT![d*QfMMfJ
ll85Trlm)H*XZdVGd%r2D`ULZMDl49HT'lHPC5U43ZJlX&I+M,p&PZNARD!"eS5I
"p!4eTBjJIB9HT[p3"fcT4-p3CrSAh8jrT$ldGqT,Ik(qp$[U4hqPcqP,kN8r8!r
kN!!qSIr5qr32kNNrTpld+R@Rhc#'D-bqSRIT&p51INf6kCFdNhj,(d#2+eMPBra
Qdc5D3P0T1Ve"Vp'ID3CqLqJl@Na,D3NYS%LD4r0T)Ff&jTH4JP[3qKc6G`$dl8L
$SI2,d28rp!!0SIXTQ1kJ%"T+0A3A@DP1qEm2!LTQ9cM)46V&dAedK$E3'PT,kqP
V@NGI8#Tp4L[T+eT1hp-+@N@Vk5hDfJ)%rPm%M!F"h(5PNCeXj+6c&%r$k&2k"YK
Cj%Fr6+-SKBE6Jr33M366#,U(lJAVHc53!!E4hGMb8L$`%rhY*8&!-%46hF4!i&2
Sm"l0`@p#%2J$IK-(J@qJl6$Sqc!d&[Sq#(h["3MF!fh[KVi6"3%be[%l90Zii(8
)jKS4mTDc`%8BRF2#"b,8CV$36J46(!XA4$LB,F*MJdA)GSU3!'j#X+4VE&$*!YZ
3!"l2`Q3@)PQB+m,M4eKJairhCf%@#b0%X*5bS,#`QJ@V#)IAX0#&K4!4FK0BL'C
KL3Kl-d@Slb2#lM`@cSM3B"EK4#F4T,-LT-i@i5ZfqDY")La2Cf%P#aGCk-A#)K'
q,f+"EIkqNB93&MjKJBPBY9L%0pZc`",fjZFLE'1UE#YRB6X,%5*ma%Mj%52+GNE
klBamfeRLYhGQSBF)iB`SiI8XX!),CiN2lmd#)h%i8c6+aF*P%ACdCB'TPF`1NX0
CH*Q&ReKJ*%KQ6!NQ&PJL%pL')*EX)%DDS$NX-(@$'1JdlaHKFEi)6DGCB0ZD@!%
d-H8f-Y*[c'+"-@eN6"Y[XX#+Fq0d%6+1Xj!!bJ*60)1"9`CMbQ#%IUGCK2bM,$!
JbrHM''MQpf4K#JX-D&V,@'#%Df@Jd-U@Eph+!LZUeViXX-fYM*5Y$&Jh-4*[FV2
!90R%#,H*JF8Q9V5EKSX3`BSYJS&e"#Zf#!E+-5cC-3aFBKJjBKMjh!%@'&RG$+c
GV,+j@59dX`5lql(!5101BB&9fPK'd&J,#`a3BPPLBKP)aE*+&FZ+0TDT'2XD#fa
c'L[JY!B@',R6GV#`Li9c,,"+NXE)NFDUCGS3%EB`TEH`T'jK5Gh##QP,0aBBiED
`C1m5br"G&Z&T,,ZB9pJPT'UlHXP8@bK6IjKfKE*4@LJA,SGa&mVb6CJ2d%M[@bJ
A"f!U#q8a4`[P2!b@V5Q8LrS8bL8G#Z9$f`VPh6MBh30Q4+(FF!`'!KUk&-TlbQ(
!X!I#Rdq!!I,jff&k`Xb%Q3'68LM[*b`DN!$P`NKC$Tb5jC)d@GiG,F[2pjIPrG0
Pq85B,+Y&XUaNb,,H@CE[Li0abr)4Nba[!--'E&cVKHNKbqZcB&E#,*EPVi(mZTX
XI`&"UAQbr0Pq'!Klkl)XKiq3!1@SG"J)LZSZbcXZbR*bUL`(PF%FJ3%LU%f@Qa9
ChJa"66KS4@H69CBMS'4%-ma2XKc6(JE+EZN+!q8ZG)#C,-YCjccbkAL2r#HA4rj
pZ8FqJFk*IKlCYGdMkjFpmLU#`3(9&XZ8A5c,ETKfaE+R2mb)BMP3#Y-2jV9LfE`
9jJ*-Mf*jc1aLZAC8X9c8!@C)X9a3@#`IR&%X2eeI,*H%&m[CABVP4il$3'"@AV'
FVX$-K"PH,$pH!R1j@$jm"ZBL$$EQ&X'8``3AbiH`d+%G-&MX8'HBhX9b6LA-DTJ
fQ$i`%*B$"IIQ`NJ`f,!AKhXA&m[ebf&f`8$aqMN`mi[Ph9"S0aCU5#Q@pd38bbH
4X*2BF2*p'#akLQ!@&F[23C(R)2ad'3`%RiD#,jb#k9NX9hB[PXp#mAq'&XYR`SV
P1k(Jm3DB6iVPfm``50KYqf'J4,N*"K[+"aI,4jZ,j424aE,NJVN*%e)X+dLNFK8
'a(EXJeN(JifZ!!b)k)*`9cc-Z@)jVV9B[LqY@$i#jBl-,CBhp#f@eh3VPYIQ`)$
!Dk(!HK6B&e!f&B@B#Z'IT4E,bb(mHbcqIAXB%'%&$PI"8&P!TNT!1X(d$-L"Z)!
m,LdJQ`(pjPDBQS!mCL2-r)#FY`mQ!kB(6%K!(Jh'dCm(j0S!c%fBb3&j@5h-5TM
C!EN)`Jm!F3"#6""Q'K'3!![Q"Q6[D`(ji*U!r&4U3-lU(j!!(fd,b1P6!V)&3Jl
YJ%N*b!hC!IRj8TJK!IRNdB"m#TdA"JIN5M$GD3V)+K4e()1C'C!!AHYK)%![KqN
--c)Jakd1S$,#B-14b)#m!4Xfp![)DhS(j29)8#S3Rrd%-cdJEiAL@kd"qFd9!6R
K6%"ZcS2C$Y-RJ#F!S!%VV"5kX(3G&GA6Z2dZ2Jjc@h$a"V0!H5dqSUMDbUfBY&P
i9%c(jq2%E%fY0G)9'TPeP[*bD&`C'!ZmpK4ZLZ0V[)NTG0LF3mZ+9&XTQ8mT'MI
`&3CIZ[[b2%b!cLZ)[cq8`SmhN!$&+eh2+`-R@8cdU#*N4$*QeCECRJkkq'PIM$L
IbB&1m#E14#0Z'a@ABhDcAfBSC%k!X`QFKFH[TkIUb95TaUqMR$9dZ%b0hdV2ZbQ
pc$'aG2U6dPhBk4aIYHHZa`HP5Tp4SGIES6Y&,AI48jMYQ8fVQLNhMaiY%c0ccj6
3(K2K1MmNil,Td,i3ac5fpb0$A-B3kDKPp,YTGr'$$Xh)pGVEqH#`lQ*I&KF2DBN
Um0h!Y'hV4h@m[eC'*9jk1PYeDZ@8AS*@+D8I8@eCP0kX1XXSRIIf*fde@cCGp!b
KCGXG`AKk%@qM-VccZ&3Rri#+6UR1,#V#j"A0cf5l)eMXl56dkH)0kd4e*6Q8Ck*
aakS+(LIl['%TG'p*($Y*pcPClfe,)8Y*0TQ,m-C9M8mA'k*5XkQXL!kDe&Yj915
P,"-pAdTl6AM"DP(`[IaEr*fY!LbUS1'Qk"4i1d6qcm[Nfj'6P)R!qC3*BfP4*K8
FicIiP!N2U5k6%PBQ*Da-XPQCP+*-1[L@5@&eQ9`4CE,pCR@46'C&NLf+a0'b5$S
,GH+pBChr0bb50K5*ZC&UXfPF,ZjH(ErEc#C3eB*D&j8fI$ALR9I3lrNS+Lp5"ab
RqZ98@85(q9A+EU#$1A3iPEQM`D+HZN3eVDQSTK!i4,AG`+4ih2l@e@ZI24j9i$X
8L[88RZN$Ee[2RkP6VG!TbTcfXa5[rCPFY5*H,bQEJ-VCATib8AbB+"2FHea%il`
qK9AjNLIK*3Q6R$51rH3b6XiHSDaX+M!4lYXl91UUVKJ-Y1eHfb`5rR1dm*q#E0f
mpVQJk+6iX,NdV'3ejCA3Z#+I9CUpee1ScTQ&5d@"Bm+$32M)JPXeJfPh[8,H-MU
3!#Xf(8"TqS,bA1&IPf#fADShG#l!fGi06kcc&r2J&lPpU9eXKek4$GXTEdeeiL1
&`TfpSC&NbDUR!(G@b&@[4q!aV9Qj[MJYBS4L,r(*jL*'Z+jDkL[*DhUTY4Ih8(L
jd0a5T&fJ3%P92Hf)UQc"ajmlXqPd0Zh*TPam5-UQ8Y`aUE!9-&IPXQ,[5q-(E6k
$9Tr"FTr"FCp"9V8Jh9NN8A&*PGF1aH+(5cG5FAC9$Za(AC`3C@UX4Y88R"FS,GI
#*DdS@l@jD%bf[a4aS98N@A4V#Uic0QmQ"E)G@J95Zb0B1Eq2DXe8V&BT&BjE3#S
'1-B0G,KK4K$Albdh$GH[Pq#6E+e[6DJ9lBFSI,-UcU[1bQmK+cqFRN[,5XQE4AR
(D9N@Fl[cKG)KiV@B8-C(UM&DaLHSBkB*4*IkUal`*Ppm#6UiBDK%LMGRq4lXppF
mq08d'VI$TiA6"N'+[GiR*5ZhaYQcUK&)Z'9#K+ZMFIBBPHA5SbA#[HiTTB1j9&4
#"me8T[S,!q3P"Ulq6806I3"Y2!l30Qdb*Kffi2c9TCqH92TT[r3c,D@IGS9C5Y#
-Dd'E"Rm'-LRqjbNdc"RH3*9Q1PP#hq+"E'CUb+)Q,c9ikG"&j)*dL2HP1f[Td!j
+aDL%'QVTC#e9eMUBUjM&9"AG6m4h&0EY+EkLX1lF!PX0-FEC"EDKJaNbZX!@B[Q
9YR4rdBXiXDADlIe+M,l(Ph"FCh+*Y[8B2SZ+DKRa"`R&rIlY'[cEa-L*QR#SD+Y
2R4EeVNj,hdH([1TPq*'cG+#@5K9kV)4+H9G'3ZXS[f"djiZ[8Z5[R99eGllUE*c
[dfCq6MN#X-&YIG"!E6Y0ZHRdG#kC5ZKTFj@DIMqhZ"U3!-C$$Z"P0ZE5@Vfi*IY
5r39k,+ID5H*aLY@-a0bN(k$Z+R&9lH[QLjB+Mr+"d[R4I!QCUr-XF(k-fI9'1e%
9)dZ18YjURab0(@1'YD$6X"+&LSq$6KAB#&&(cb0V0Shh4["!Z+1qUXELjDA%4AR
H#56#NDm4bmdVN5K[qD5RS5accDS8ZDI2D4b2UrBZ%h-km(*j[[JmjN019@FdSR8
60i&2FF9(PI+8kYaNL0rVP[&HeEKJN5VF2jIQifY#CNL&fYEpdXGZ%q@ED1-C5Pe
"2jC4DK(ph85TkfQYPq,b5+fPSbDkddZ9*A5b([929-UMYH)JVTE@eP,U2RVM'!9
9dXCDbUmPYapUf`'kqSTfmf,ae9MdqJ-9,(TT!2P`dEX!9+MSR40INd@[JrL86#$
KV1eiIcSP(+iBC@*8cNDk9KJ[HJ*%ha9INeQhIjA)62(jQF&[R`*R65qIZ[Er9fM
YrdHK0JJYH*(-m6@p+ZB6DIR*LZEGMTZk6U[D9pe8cBYE@Vc0-2Ell#eQ(S%9Xb(
#("01Se6JVdp2N!$&R4'+K&Zb*+GSVCAi`ADZraA"1AGXmcYmPV)FaLh`b[@5SJP
DV9irH*G1J#raANX4ZmGVT4e-eEA2d,lk+U"U"c&IjL"Q&Kdm9j'SYKEFDUM[aR-
kkJ,U`haXD$pTFThc5$3TVR%[bkYE*RbI2jqDP"khi%r1CP1fLBV18%%*M5j"bmd
K1'Ba0[(Y)E0U*+ThZYHC-MC#Y93IY+UBl6AKJ@UbPHDbUZV&V*`ZUPD+q8,M3RA
Ye#j9bmV!&(p-3jcqYEDkl'YY99p9Hr3SCSZRk0TQ60h*c3%3VRk,dI$JE*A4j1!
Rk(cLKa9[H`%[1LSPlK2'P4`4PUHcX*+&LbcdBQ'4#0mAXA#@K8B%lIY3(@$+ZTK
ZD9UKDL[kUq,Z9@h9BKdhJQ+`6h@qYCVMVPRE@ceiP-2j9M#2+P5F@ip`!hI5ESd
@dIEQ@CcChlb)j`Qmf9lBrYb&5d#3!'ar-`6pEAPLN@hP1UlrL1@hp@&KZ!JICB[
$MijKX9*9qbK$e3jB9IY(%+&pp+jZrfJf"(id&mp*f+jS"`!6fl0eqrC+5-9p'pL
j(I1GF+1LGQ#bDYpq$XcE1f2VpKj!KDZfR6PJFZj-jC&SL1lXMQdlCiPY1`IVp["
kF)B[ejhK#6cFSfMK[B'FM+FQK#rLi3%&&j6%!aUL,%"&A4BS,5T%YqqSKC3G&L&
PKd[(P5E@ABcebP9lFKNd50k(,FNZ,ZjV6`lAlFPT!KXQl-[#rL4X0-3N,aB%5$!
*%3PRG5h""6'jUKC8T'Y"k5VZ+0+#jZMf)+6H(P3$ECZcG([cIQaY2XDIFpLDEf)
+Q+djKCp`f$E[i)FG$(#@c8!Mi+S3fMKCeaT"XQAG9AY6&J3dRGDe*Ua5Z`0YQTZ
#TkN28,f"LJ22)2"X01[fM9e%lhEdTL-T'fZiT9Da[Gj"E(JGmNBhS,9YdTdCi4b
2h0!bR,Sp3fc*Z&e(Xeb`[91Ufpmj#Y`lm'1M8Imc0qTD*J!fElKUcjb"Nda!G4l
QTH@M)C+(`XSrUY[cih#5[`fpCY'lS0[b@6VbH`)h4H"'S@F&09T"CkfeAVHhZX4
`Ul#C!QF(VUrSpG4a,8Z3!(F6!rT0j6cFBGq8J,00EYfqk@A4kiAHjk)(4I,La#8
YX9a%NBi,@Q*A4*S!RSM1SL5G%Cqc!SfBMq-4iL!QLah%('F(-GYdCd`M*TmSpKJ
"J$%!TKL!VM0QVUJmGRF!@(HkERF$G*hZ0AjX"X$DE4&(AA5RZjr!DZlTi%S4b'$
G(QX'Hkb&XH1q)CFp9L3f0N+JireS!8kaR`[-Dhj--$DRQA4l@S2S(8G["hM5GSQ
K8hHQc4*UDQP$G2X@SG8@D,AP#)"U5lK)rjB`(9Hf@,HhlY`bQH1@IQh,#$(a&Ui
,d2NMjJb1`a-e,L`(6@e[%`Zp4,Li6B4[D`Aa[KAH"jr'9#d`Ahbe41GG-Dp8&ep
R&MUd'lM9`i-M$Tp6'#bQQZSfV4ZA(6C-A-C@qcVGCZm[40Q%3,Y0P+m0YF%f"$d
RDZhj%Ki1hFlEG9ZmF(+BfUME3LY&0l6,eml(c[!kN!!cqh2GpSJChNR,@U2EXMV
c1SIfD!pG5mI0dk8E9@IZ$$i2I)Hf`EP#fj`5AFYCMN&reERA`aFf+0VZSlTY0kX
XZhZJ1d,8X`CiUi0PUVh"$@dDi0HpH!&YQ)c1qkTp6cRS[@HEX$H&l35Q2Hh@FF`
@0@@S0YN0-MRPGM`+c`R`G0"YR[l!D"lF,h6JGP8V"N81#(U9kVC!2`&TJGIi3[#
D8h@Rq3,(`e@FjKlm8+fLM8'Z8!628iZjl-[3I#QkUYU+@$8Y`N61)Z3P"AK`bM+
Nkq!-G0#dH"Th'pAH9,@5F$b1#XM4m"ACA35CXkI`3`lE)mI&i"%hh`f#jH&49Y"
Np%C-AK#ZPUGE1,MXk6-",HR-GcpH!Scf1$j$i-%Ub5J15epG1h`'ZjCMTS+!!HI
K'G`S91bj45"$,LD2jk+fMck'@3["3Y0$@hAl)3'IKbi)+kV1SGkk,8H8SbeRY5M
kR$BFjI6"SMNc'9T82r[HA+$h5N$[h5(3Hp[iCSHfGl&ZUemZ%2@lK2ckIVUcIJk
VSI@!YV`dc)VS)Pc"EZ'%GL-ccS-VE-MNmabfKK3!TQe2"!VBYQFi80Sq91Tp6Pk
AT@Ml"qZfNfe#mXRh19TK*i0efbN'RkG%eUSp"jIpA$cNR9CYc`NplDIKSfbRdBC
bD+F[kYVT3DSP6l@pF%TXHS&Tpd*294Z$E,F50@X-I0"Cc-)G!erm6p5`-Ae8l8`
B1ZG8lFi,k+$8MMISYZ2-[akISGZ2Md35EM2VYYZB(VH*[%3V0qQfmP#"+1r1%)0
el8q0f)m+Hl4CS)lL8kTjT'Sl0P`!mSPXhAELP#M%%eeeQb3b2%eU4&F![%hU,)k
NJEUQSNPUlUhDP+f#4EQUfa`Xlh)&@+JAD"ID*fC!X!Z1fh91P,eV#R1),T&ekAJ
%KKP6M2A2dGQP1Z0DHALTiV`[MBIMd4e(LN68MU"%c#Y8jiDq2"aPYQ'3!'jE)ab
-YJEYR,8L+lHYAFH#@bbj&UdK-eT*kp&Q-H-HZLmZkVB[@$XSPE8T8U(51&53!-m
`XAdFDZIbGQMY('@YRfB@fJZ(pIemSHb+E(i)+Uc+AXFV`Gj(%GqFabQUc8MKN3i
ZapRNRR!MYN#Ff$T1C!dfFk%!&R-V'p3)JSlCL*U,XKXcAhIQKBL'NMBk$8q&3aB
B#"0e6hFZ@mQMi('@cFDRZc)q$'fS!l9m)9!(DR5RD34$&FaP+1pVZRB3,m-"6-8
[KBF*S'D9BDTc!*qDRd+LLTfUPShPLVHUcNFqi!Y4!E0!#`rQpMq+jh9ii((6Tk$
6'8m(!J"jS0dKY*B1S9RRb3(FC`Zrf)"QTpbU1[HGC4+H4aY-KRNH,U33,Z)Nh%J
K)2@83'$5q!X!UFUEiZe)YGeT%K,Zl)$ApAM9HGXqPL(Hj[E(bDcDP50r0h)"IHq
LIYTqRb(mlc'i!!2PGD*'%GrYe$J!''i*rJR2*m$0`@'UcA&-9%A(6"&Fkd9fiCU
Lfr54SKZh@VFGBHli5#5!JV9VeqF+a(Ud-El'$E50UQeGYS#DGEL&HLA!iK4Zp9@
ee$J(VRJ@0V[le[6$lr+-'G,+#V0maS`E(@YUDJCC3kc@J8lR9+YeL,$S[b(k`I0
JlaeiSa9-09CV-%-1[h%qe'Sp"d4mX$8Bb*!!qGEaIb%eRdj`r)hrT)DG4SB))BY
#@!baKV4M[DA9L'm@ep3m8-08'!)80,YrVY-CiR31V1!B1+AP'"[ZVK'LlkQTZFG
ZY`qT@5L#3#h`paMM[B[Yl'p`cIe1Dmd3ra+$KN,#F'G`"G2Ghfjd3X$G051`IA"
0"IVqNFlJQS&1Uj-*IGJTD"95-bhXR08j&a+GpK'-,(Hm&RTjZ"KA)9,mHraU,Q$
lr-Ym*lB0&&+Jr--#I3m8"1,qlm6S)A3IU0kj825qU4M1VHJ-HPJ`49BY9d'X`AF
XX9jBIY04943SpI3HjhZ&2GRaMNj5i`$TJV$RT0GH[ZH(5r'A,X9,H[bPlRH`[rI
$`X)'$,dFP[K(kCdVYpr6mIV!3Cqc),NlcT&fMZaicmKK`k5Y,#5IlpSP,+ccd1$
,!kjG(pMK9Y[9EVGkGlebrC1`-+PjbJp6TNM*-+%26d(i(B*d)FcU[#VY4(Jb&%q
+hICfa&hr4rqp[9H!Fdd`!rIIrVQ#h*rHm0B)l)e90lSRrAE)Dr%I$)Urd5Rq2B5
V0jq`IQbpFG9T[I($YkG'@ZIH@!AJZ2'KdhVc2IXXqf6l2#Z+1-PUA@#ecV(qf[l
TjC4c6T4IARRX3eFNj3(*eI2$)AF2Z9[km$F9REmR2[0+m+$qL9Ia8ceAVNZ6H`k
58U8DP-pD88Kr(5)p+`9*@lZFPkk*-[K@@*YGfQ*reNlq[pXNVKDT1B6C[2'KSFq
'KRCliYc,k(CGqGF"LGFPKl$V3UA88(ri-,4AD-r%kkm#r9ES*iQI*%T2I#QYq%%
0501N*-JE*fAD`SM8dfeAfS4m!!!F%8&%3e)$!#la$e80C884!$&PlN1rE@q@19r
#b`cjKT!!Nlb%1FG-XZ'40%FP,PN5jc+5X83*h(c*e'36bC)eaM6PHR!a-B4S)BB
@,*G$!k@RmIN-,&#V(S%"PX-9,cIbI+ceH$NL&+5)jECFVpM8IIjqllYN#CCblqP
prJ%ETLIP34!%3"!!SJ%Ajr%4R3i[2Pc)A&#*C)3"[[jRd`XYcXEZ&MlCl3dq6TA
mHUVmBRcKN6ZGlrhpLr83L80DQaTjGMTX@@KbqP66kA)N(6J'RMM0K&4mVKqGCk1
2FI&MQ&K9#-m5qeS83SIZB`A0k,a$qr"4,AiNa!qrV`hZ-G(0)cQ!JRjb1$Ri6PF
A0a`P&b3V+-fJ5NLNR$MFkc!1@Ai9VRLCYeil%[V[JP!"1DP'ErRJQI@T9Qjj*a"
DZcG%VN2GGhYl(4RAMqm0Y2P@1T@0HfSYmlQrqmIdYr&#pir2lqIEqjarGQL$8rh
NRLXK`dm$dCa!8pQ8&Ap99@6(jCIF[4idpk0QfB([39D`iF$GeFi+kkM4UR!jLek
6SE"IDC*"`@3CAUhaDVaL4Akm2MX3bZ@pfq1#+HJjS`5(f[5*l9D+A@&Y%m2$M)`
b!NIp$MKXSC,e1m)fe9qrBiLVTZ0lI,&!60h3T)6EI@C6IYcEq*%Fi3P23KEiCak
K+4,9X)TB@6Rr$%@Kl0fQ51pHcfTeJj+Q*KUbLK8BemCdD1lQ%5%PP3QYr,14X%9
0)'PPe3D4[)ZT*X0@-TF%)j1DB#!96KdNc2cD'k1Fhfek!b)&T[+k94QI0rV-i4j
iki2*#QSi"UHmA+ZEjB!b*b"ZYAJeFARjPhfa5@RirhMKP*jeaC0G1'IePIZZj*D
Y,S#EA+J2lqJIQa95ap[LlBEN$VVAFVAc@4mk`[*i+LRd1IqNp9UNC6hpRQP-h`V
Rp`*Xp6Qe$@QX(L5a1ZYIm*R9$HS9Npf6m2D'cGV%kFeF30&,#8MV9KiEd9af6-Y
U1a*p'Q[GjEh95T5+ArE*50beUhY6%Ah``@A%R$-%LM`d56b#Vb,U4E)[,&iDVJ3
q[rM55(&DIDNq1C6I"LHS#QE#a&Xb8m'XY[ZXb'TDMj@IX9+U-UQNcTDK-8"`C+4
(R6hb63iF9dL0)EADkiL246fQJJ0,!k%e"Eel9rekZ%*025q((%631BG(8#ZL&M9
eG8R9T$"5%4A#&GEYhaB8ABS'-0KA22MFLZF90UMXh)UVP9+,efKej[p9eZTGEd,
rH[%aE%r&aTpkfha@EkI[m(dA9&2p`l2bND+T5%DdNCD4C!85#"PF4M(8-S*8`"H
TYKGK0KUK"28"K6DLj1*S!PE3aA-jVUh3Y32IK#X!2'%N04a6Ji%fEbRdC5N#8re
cMh`)-K+%*,kf3MN3HH$A3a@Uhdb*DJja*G(!%LS3b42NTT05B'TPmej5409rAfC
cQJ%j8ffHDUp90GY[4pilmY5`ck3ZL,H'Hm0l,lGcT&29pG@#"&5Vic)T9'GT4*T
QL3%Tf8$)!k,HpVC*k3K$a9$EV#a2M,N`H042(`)2S#18%Jk'G--%PlZiQ&+JG-5
+[8CK(-N%PN!3L&&!B[`l!f0Ifr*m-XK)*K3D`%5G#B%TMhIA)CRRK*%B-2'HrRL
6ZVrAr*`@#DEbCjdMQ5DEaam'F2+#EAEH*"Vm(#k8CQ,k'ZRp4NT0@JSMprE9Q6"
N*pY-Glm5dHmQa%%*$%R%Qd`!5Yb3!%C"LJA$rpTAjqi[(U)Vhp%2F3@*2Cl!6c9
G5M8k'f(dE6!+5#6'iAk'FGP'e9q"(0lp%LEJAGT*fP`-ph)N1hQ`qmF!aPCXC1Z
1IPT-"iaNijBk(+d&Ul,L)e5Y5E@"p94UF-Y[9KLh&L+Y0,LPES9abm@9,PbRapE
i34S1pZ&JmVMcJc3kD("ZU@P!Klh3YZ89GI#$Y01Sd!D,%85CN!!3C2JF8S-lI62
HQhNSE!DkDlBYi4BNT!+m,aS,@f%iMP&DU$DQMr!X$@MZhd#JfPJI4K+VIT)8cQH
G@-L&aEdR&R,rSf#C'QbjC((Y(fbjdI,*dik8B(%pl6!IQHq(1[LeL611XF'@2CE
r@$rBdQajTqk0X3V,Ip5p-4aFq`6p(A[LcS*9EiaRTIc0ADVe+i4Mi,8"6#ZE1eL
&Rj%aZmHX@J%'cFEk`4Q@hLk[0e'k#+NYjjm8#$k$@h[MAUq9dVVB9$Njk0V90X3
6jiIB0PG6!K'#BIR@6R8Qk[9Ta)84@UMDN4P,J(fTT4[r9Cha@FKXP&BlNp(C'PG
6Jmj@E&YQ[,(EZE(j&#ShAMpkbmEhk[mrHe@,J&a,bEX68U!$3l@NF,kLchREI*1
0G@He*CA,rlM%a*Q4MQ&"*Y#h"iLXLC[cJUIX'pFXl0Til&3(*MQQ@l[3XV'CTY(
1H5S+93SSJa[2j#UZ!JJYF0Z+l'UVX20ElG&YqUNrhGZ8*'"!I"Z1k1l@YL2F9"%
RYaK9j0AbJAi-EUL+PP6XKU+B"VIFKN#DZ9DJ-CJd@`VR+"MJN!#02,Led0fIENR
K+"R$i5IB*()8$qXq+CaHE"X68T9)RA-0('eI)Z(j,edBERcr'@,6jpcRTL''!Lk
KG*qP)Nf-p(JA51P'mq**GN&CZQ#8"rG,bb!ZR$$aUAk3!"E!G456AlT5peNi!6G
0'5i$&X&QCTTUD31TqY4mhPek%k26G%KU$S#X1'8VIGc6Eb"8%K)YK6SG#BT#*jD
r&lBN%bdR%4K330Z!Uma#NPp'4Ij(k#Lfh"E0J4(CVp14Xi-BY%54lL4(2"S[-`l
2M9iNePA"BV1iX-8TDRD9$ipc-P35X(Q)dX&rI)D"S6TH6D`*&+IXcYCS%d0+HjA
V`,82N!"S!"*bFll0$2RbA@p2pHXPB5j5PdZ1mNCdZ3E$iCe4ph[5-bCK[Lq+jKZ
"4+k[G4F0i4e02$!%dp+"cM2E"0-5ApS@55jJC-,%J2L,qYX&G$5CK2JB3)$Mj2l
*ST-hXqdlL*pG@Ylb!JbU5La!k#kiB`q#aEG9@%KQUikC,4'P$fD4bH[q@PFhHZa
J&S5pa3rL+VURZl0e6d&aXTkU4$1-5"j$k-'Ri[9LHQBa$,2Spc3e"R4rK$!FLr[
aXRLN"+TKbM2kKK*'&QL[hd`3[S#D[&bU83&3@V5b+$4crmU%'h3eRhT0[Sk"+mY
q04P@0"C(BjNPrb(E4-68P9e'JQF+!&k"N!#,56mY+MVcqS@IAcS3S+90KbeTLfh
M%%L0VDBZMj*D+#hY49FjfjAYTk9,0bhlF$,Q+r-qlXZ22[Vc5ajKS#EDip1%8D&
f$Q51G$cqU6TRP@0Y*[dYbQaql@k(fRRmdNKX9F(DeqK[d@[AC0jGm+8M3m'f8+T
V,0`j812ZMeBR+b`hSqYHVKX+,)#cVZ2i*Dh`#pG5VN[T#eXT%Ljah9kE-GDpZ(Y
aVbfMa+5HharMb8(RHM$Ce,Gm6SiHL#J3i%kSCqJAYf`qk+(0KdT!Z%D9eHP%"km
Sie`b4A`A#5lcN!"i&EIC$b%(3Y-*(V,c5S4'IA*q[d)6R3$6E((5F45@GKZGi@k
R-f$UBLM@Tp@m-pI(4fpaATe-a8"HF&3D0UG9UT`3U"*%R,$-Yi(%15%kQ%K0b$L
-R4FNaV&&B$FG(6"ea-2&62c,DH!)IZchfML*BcEqe$!DPDVHSSG+6q$2)X+dL@E
lHC&SImj8rd+!dkN#T4*k4[efkVKT+$@qS3,l[#MNF4MP*QFi`jE#9CPMpLe"5Qk
TZeSF!-P#Qc2JaL#*JG%9'(3'U!RpZFj,#Am"+G0eFQM-,frJFRBYULSQeXNmeDj
L)C!!TjiBr$XB4&qPUPaCUK+-A(D'DIQk("PLrAfCBD0cq$TAG!KQ"G2'56!4%#J
630E0G9mQL"Xql8,6%Na@1BK&,a&PeHRL0djSj+iJRaa@)pCm,24pNaEMFMlDq$U
M*KQ"i4eia1P8"rU0224H(LG``"ReC`PP3TZpfETpB$!fQ6JKq$Yd%5KLrIF+@-6
B-fd!@86(3*!!+!&"!Q!CaL+E4jB)(HL2mP#VBF!KDF$R*3-qGiEp(AcdHdAH%%f
8aED5!Ld%$"YrRNqRj0#$'h3(5cE82j(#KQl3hp$IdBCH[G)0p@-MapIRBP2Rr1F
f&D*)9la`61MG!(,+M`6A9pk9rEfkHQU$0fDrjIfR8Pr9F)Z,L,YL)c,QP9`[jEH
#i6"INCqZU*80q4BA*AGeZX@1D%)kp%B@1e)9&YF)1kKc$!9R&@3)fl+-BkTJ*G(
F0`+%(,%FAK(M63D%9%SKj$$8-SdGK!TjEiIRNbJ[Ia9!mehhVJq[Ima0G@c+,2X
[(1h#N8eI"$d&%H,pq[@$lpI,Sj9#aR4U9)d43,Zee3*q3PqGdqQUZA@8MSfVp0e
%e0c9-Q1FT!kT'ZR09ir`3Tl(AkB!U'VTd'H$B6HI5C[@+*@cA46NpD8MhYTBDFQ
IL-KG1Te(+%5`@FUZ94Xb#i2hE$ECde[4P8-N5ITKN!$#!reJ,q0c&KQZJ4S+Bd'
6mS*aFbNRNKm12(5+1Cr2,4LpjAeA'H,VCVmplcAYjki#"BChYQXSG1mVCack93(
r[EpH8kSUA(&[cI@P&i8qrL)Pe95b3!d&fJ`Z0YdZJ#YP#(4#UN[Q5REJj5!#F*5
lM(QFZTVQ#ejq2m*1C(l(er`EFfK6KfaAZ"%Z@RkMZS#DejrVI"a1q&hH"9#9cGV
EQq'QI0$'!QdLmRVH*SILY8cNfq@chA'1+XDaU9EMqrAhjjrMdB4d1,jHTSpb*$$
+dE9jS&"TF9r+(SLK'aNHqqS9)3k"1UUNa-'%#PmjVKE'HA3SC4pLbalmb5XKh8%
6AP"%#&49PfH(a[QU+mA6H"jP"lMH1-3GHCpqXl#3!!00Dr-BUN!9E$iEa1mdU*F
#pG`[UQIj$e62FS3118Y8%i10FdN0*F!0FbaII`,'"ee-kNMSUPd+SC4!3BKY-Vd
UN!#)R*Fk&I,hr40q$J64mPE%0dhbHQXAJIZ10*QDmpIdkKIRXJ+8K4@hLBC+6N@
XGNS3hC&@b`h,5jXT,-pmZI)5P[IXTD-(f0',M+cH$Qa5Q6i6UG+cU'4Udm[RDA"
ZBNd"$9r%K[qrMcYF9LUX(-H41abeR")96H[0h**QYG-5+"NrQ*I(I5D[()ephmj
$!aI%Sc6M6FR%H9*p*SMqmaJe6%ST**V$HHc+pf9fh2*qmh@Zma%&4Y[LJ0LKN35
dmJIF09DlE1HA5E@,lY4h`SJ"QG9HKKjK-iJMd9Dq(f58ICIL-!4fjPT+-bjLb5)
$+C-L+5bm-LPldq&365)T"DHFQXlP%E1T)1lAV1iYm1a5cA$*lFkDQ6Q3!+lp,IB
p+BaJ1C)aekSK&T,UL+Hd0YIfH+[fr&`(81eDEqLH+jRX-bcF8j2QL!U'Sj(32Dp
YGi5$0)QkAChYEH[Er8K(iIK%jmb'STaqMqGN8Fl-6,[lJ(Y("NY-PKY-+!4CZEX
"L4+i5mRChR%Ejf8j8!29Ci8$M`I,PReBK%G-e-l6lbllG#N2#UDYA%ED-UDDMhr
SMIN#A(lJJ[TC-ec(2YX4(SMXf+Y'GML+e[RmQrDZZM!F85[[bjceAB`AYDVB$M"
bH5fc@RKX8[#CSmT3a*S9&3*`cjrEHf$2)apL8VpT#aFm!P$c5G9kqJBN4Z3Am-$
'iXI9K43m5l#"@jj%r8bSiQI0@%lA8"eNi(bp24HS#2HA!1Ih-XkEpL"'(pf#QlP
B)2#,PH5#FrI('pIJBhRDdQU%fEAHd`P`YQECSYFMIGE)8Q`1aYapfL85!M63+YH
jF(("``qH-D#G)bA"Zrfjl-Q1`J0&fKaNJUe)#qG15T!!rqVqaeiX1CQGl8NR0-@
'aF,cZI`Y%NiH5G$A8#!aK93l["*,qqlFh+,XR0%$0*+BfEpD*j9Qja6P(Xe*cc8
%ILZ5Q9p#JEaaHIb`j"KeF#3#Ph$&4b"*5%#jGY`%*k)RKNGCG!$dpE6JXTXVY,R
ape!eLaPfJ[9KQ+-RQffT8e`b5)YKNP*i68$DYh!h(i$&Q3pGFk15rJSaif+HKF3
#Q%@cYGAX`b0@A+h9X)qGiNHIZ+"GV"M60V+2FA(!X,M!*hj-6p'V#H5KDILhc&b
jZB!Gq0P9%VL)R&))K$$eV'(V#%YJl#XUe)2K98')V4"554jcP8XArE0LiAflmA,
3DcBVc'B&%bZB@+'6&6T4q)-dcf2TH88pkHhZ3VEV*`eE)k@,#%'4'*V2*p6HF3A
*SDI$jMrFbLQF0B)f-F!G@4[h6L#`2Xr[fl$K9Yi8B!+YDfrFrhV0@5YAAlr3Dep
PKY%+C6bJEA0PaF0j5Q%P@ec,&NH`@(LpaPH(T9fV1Z%)Mf6-8eNLF$q2"bEfUcb
[XS5YmQE0kc83GCK5e*UQqNAf3XDGkSDAHN#SfCdjXJ&S[er0i%)*XRpIZUdlAGZ
EFr6!cHfj4ie&$+lVHqERT[r)RTkG!hL[$1FCQ[V5JBj**2L!S-J(F*NTY@GR+*m
5QYV+EBlXK"Vj'c-@d@SemUC$+Sc1ifVBJQeUXVKf11)Dr,6#V%FX$SZ,EIMZ&*`
&DN`UU"VT)h`cRlMZhC*K#RiDbGP3-XKDGBKMT-4flMbDXAXPGmYJ@iY(3F436#L
Hl#A&NcdqJj,92Z@&i`c#SkK`j2lcV+(L`mp(VaN['iY)#XTe"N@,E#j@Y%Jp&+d
2VeHi+eJ@[$%8#ldDZK6D&h`S8XrqaL*Q[$*p-VRH92X)VSQ(#d+@Rm3i(U[apc9
)+S6Q1)qm5XYJdqe`1[SPm[lP5j184QYG+B0%Am08[kKd20)U63-Q!Q-5-M!K&NQ
ZfUY1'CShK+3KR&%6IjR(3`&-1`LQZR)IR02iV%CMhS[!D)3mN!$i4-b%DrlL-Z@
RDhirPkE#ic!GI3fpq92pfFG%dm"$[aQ5'3RYqL4iE5@9*9IcmC,+K+%b8&aCA6+
BUm*)T(KkA-IlPL4SI(*hr+TJ!2KX!"i&9bEd0U$D!)lJQKm'`"miY*jYA@LP@cI
d&X48kl'80P1m4,#2YSCYab)DAQU`l66#eV`@Y9hFXQVGlGLbDRaUG$GKbqJ"K*Z
S19S+D)Q9!Ndbj*cIkC-r(Z+3!01!Vp"$e859#irm)%B$"T5G[q`BNVejB[&9&BK
iHK%239b*U9dQ#"ra%GAZG5ql&5l4f0Rj5)P"&"'[3-aL"$,@e8`c9N-`Q%1P1aa
*N919BKI,bd2Gl-,rh&A961l)rK'%!QBT2ik4G1GaJiLQ-"'0ZJdNM'%3`je`3UK
-M)(B*CQ@K`q+cQ4+%LS3621PcR'E`lLTf,hV5%V%c$ij1lYA@h6J1Fpc"iiDHN-
)*q0&K6-Rp3mN)[E3Sl(NkS6`8$EB,kRU`rABU1h-SEf)+NC@Qa`3T%6A-9@Gh8m
N`@N1ZEDX4fq4VH-B`ZGCGf2pGK5LjQ&E100V`YCAieTlk1#&+432dY!hEdV+M-9
`-9-+%QI&,k80-$b'Hf9QCRGf85'ZN!"60-QPlTc%DI-m[Sr,jRQ)-IIfR6BBGR0
kGYbdfkKGbAlNP3K6c,$la""l*1%L%Y*0(f%GbL)Br5hFF[PQhX8&[-`mKSG"bk"
q3"pe#%d0+*md*0`%dXY+YZ)aL3M,dHc*M+)G*94r,0ciB4ZeQKSX*2`er4XQG"a
QJ8aK"m"e"UKL%lZJVh9R)25*U!Y4V`Z1CU3AG'F-MdV5(bS@Z62GQ6!$@rN%2AT
+!eVI'dF+68mSV(h4C[6&'`8E6aLR8C!!idfpYRJB2k&SpH'j0,hBe5N'*Kr&L%P
d14+Hqh`prd$(!-!*[1Yb,lG!HFbA1lNl+Z$6AC@S`59m!JVa`iM*!!&jF3mM*KZ
&UAJ#K%cLamV8C690bFa'J(IT+ih('Kf6,Mb3!1Qc*"A$!JPG252*``b%$'($265
NbZ8d95l(G8[)$CZ8L`G1(i&!2['246cKfmSYCjF3`Z!&K)'`fL8V2-")D98l#Ha
RdF$!JB8H+0#YaQ20&(b$#KMQeA3S6Bm,h3dNmeZd3$+*[#Ch[k(CD4"j'6**H*C
l9I6Lr*PbhQ2j1jj8iCDrkqJ4`5m!cNQq2jR1HlJ0V`(HKGF8Yq!9jHENjc69CH'
0QCNFiL5T5M*"L-H-T`DN-Y-T0D3I&pX[4h-1c#Idl@+#0JC!-B&q2&k'9ic5I8b
PRarSaqCcK#'9)6hriV#YVaPUAC30e6K!2,KK`Q5%(VEhK2)%1#'A3B$m&+lAf%#
rTp9%S$J#0`dq[*qJ1I"EUZKVL'j56BEQr@Xc-pNr!Mc%K[!m&TJK0Gq*@E0SM1B
9'b0af'3'39%d%0)!N!"pM)jVL1P4N5YMDeMJ(9Xj`aTLH&6N5%2ZTP58#HUVfFI
-C,QqQG6dK60p"M0jGfNcfCZ5$+eQ8l'C$-p)SB#r&lGUCZR4bCQM'4RT"fCQrZp
NcQ5lH!efj9Qdp2KNcR`$UT4H3SJZ,GQpdL@UFBqeVi%Y3@2+q&cfdCbLUbcC+5f
TfkeRl`aV1(0D1&Zd,`%aZ)#A`'-,,5eD-Z*pZaI2c13@aCml#HicmBcdT8FcCY+
A,J%6,U8GdC!!U)@E43dNH9MYk'j!H*Y-+9f@X0XGYXYPh1eCEldJ(qCf6iKpl"3
rmMa0UVe*3G#J'qP44")9$`3E2+j&M36QQ(XTMRpiJG!aFNUdr(*"2#DQDRFVQK8
IHGE*VI`Pcqej20UN4R)6NR#NDE88@0kjaU&Y[XEK#q,TXTFmUp310Gm`"4Zd5hU
C0*i5PMkcp8+da9SMNTc!8#)F&Bd8e'J[AXUZNN$P6QN"PZiX2QE,h5cYDr8dEMX
Fhaa96*(L+dSXFI"A`j!!2aM3KHRE$!@d(mdY%K%Hk+RG5D'b#1Y#)!D&-SEQ$[3
MF(E-%2jP3$XfB0!j"UGjLhk3!+9BZEA+SQqV9(aDTH+5SB,%#ce'EjF%X6LGBbc
i4-'2M&$"NN9"kRSedC*$&T*Bc')A(HZRYr'`Am49N!!ljki5`V84Z2APR$PhEhc
E`CB8&,XBbI"CPP#kq,S6Ge$!A+JEMG'"rY)"[pr38E"8X+ZA"kZ'Zl)'*!30K0D
8`E88aVpZ8AdG3'@rYm1,LPRj"d,H#2kP"F)ZNNJ!mrGDU3Y6iJ,%$K@"2C(pR)@
)Y([NKp,q-IHbRBI4SDUSM+&5-19RRd[jU`4ZPSLAQ&B$SpTSSK$*F0MFm9F8V0R
P*L[Fm4U%3jUR-ZdhD!qVIhRc8c6Lc&-AYQhKi31#Eb%2*iQX"5a&%QMPTM4'PXC
8i8P!l&C(ZLJ8m#cq9BEDq@5TJ%9$b!!4J,!"TC!!0fT-!4k-,`A+"Z06+)6LV8$
C4S!eP+5T&Z)aMZ8h$0aKia&h2aC%2)6H)8m+`EH*!)i(EqCKASCQTjUX3+K#Q58
((D3XEG)06k)l$4F'L8"&+"8kQC!!JL(*CBL&ai"Q#!Si'1TH`K[CTiDpZP86#A,
5pX)SI'2HfZ&lSQidmje$GHq8MaBqXHphYY'DZUGa&R0rF-MccZLqiphEMpXq4-h
%BapGY0@-*Q`Y@D1h2PmlqZ5Il[e`eCrrGYHCLaF[(RVrcY'lPcekl,Y0ccbH[rc
h0VYYik'k2EDV$bfh04bUXh8de$cph5mhYcae[1'0RelC#J!!4fT"4%05!`"ki""
9$@4@!4!a0Hj&rlpYcM&A'6,XBUcq-TCP%CphSBQea1#B)XZ`DUDPKR*JTE"CSV*
$2&i2(fqkJ6a[J1C3`NRTZERp%TU6UP3PchXSAdYb$0#%8JlAT$3"5K2+)5QPK()
**BD+HrrqIVmpViEdpRXrcrrhm`!EVDFS*i)J#)"!0-qALNGe1Vc%j5e1"Y!I[i$
-9E,%&a&J59Bq(8`B4L!UPD6(NT,r[k2i9#8p8,CTj[@C$k@dd[k5IG**DEr-l&%
B@AT6&C3aGFb`1EKG9rC"*'(iH[V4H5&*da@c5PUSD23C[N!F2b%S-d`c,i!&*S2
$BPB'Y1!#%-VeR2P,&&CQMh4)RSb6b(L1QSB#NC`kSFDLc+*AVcjj3S4-Ck'dkC@
+49bb"rb4BL!*e3M3#6CrTdMZ'*[+`k4-)b+m1ZC2l$FQIMmpB$Aj!`i-D*HZL0$
mBK'k(NVX$cEI8D3p'HaBi#[FJXBa%iB0f*p*0e`9mHc+CqG*A5iXB9Q[,1ZaA%6
,HKFZKNM)0B5QHP8&ml*HK$"K3qd*hH*RdKdG,aFa5CrGNHS#8pAMqV(VadTcD9$
(@@*dC(DRI0LJe"9)mR&JfCbb0I'"mp(8ZIDVm8A3)EAlN!"3VA1&qT2**$1RE5`
dU9jSDLYGfX*+PmN-8HC0CX"Lm+Q4,RaqmJ4BbC@(X+PH"+BY9`b9f9)5B$(N6&T
$885i+LZcMI8M(8a`*G%kA8-fdML[k%kDRHM5DkL2!dNXp@(3AKUdfA*3QC8TfTV
'Fd-L1IJI8YF6jXS-@KbDX+Jej3D!NX#'mi19B!'16Ci-E'SBiSN*N@UrLlGB@hN
)SXYC%bi3d$I99[+fHNV5q8*Bc!iFQ!"k[Irh`F&LZcNi+"XCr8e-U**d6-phi5,
-i(8'!I!DLFfTaX(Q0!YaUUK(@'k&QEm)ARTF%-8F-i[Yc(jY2k$9["5+Chm0E'`
6rMY%LdJJRc)UA+Dk(jKLMii)S`E4rE%k4&1)$X3N4&X4r@+X$G%K4,0MGN56L+E
(3L0!N!#@&h1$LJ0)!Jb1V5#8+9!hBNd99TS5qm'!k`0UXdT$meqp(NUC$Qhc,*!
!&f0EQ5@IqPq%*T,ZJ9TCE8L)(kUrCKTd0JekBm3+mTZ8)D2rBj[`aa`j9d9c6$q
[@#4MrT6*D,Fii!'T)4"h(p)kJD(0@Afjm4%)%F+2ej!!5(i2'Aq`P[CRlXhF#k'
R66-ZYN[VRjZU+p1X$em4E8$GrV&aSI[3c&'Y,l(r1d@(YQ'LI#QpUd8jI*%PkJY
ZRA`dNXPZ+PEeJEDQ1PAIG%9p2l[bqA"+C+B(r%rfUASd0P0MmiXDQp%i4)e$,fS
FNZTN%(%)1`&+V#99Tji+@*XmcXN4HA+2HXTp49dD*K!c5ZL"8Y)3D8C4$4ANkY`
fJ3*b+"BhS5'3!%6KR@BS-XDPFCdZrhQR!J*!b-8lXlUa181"b1*)Id5BNAJcE*2
mV2)&#mjZ6%S[Dcpb16*1Qdj$f24%9mlaaEC'3VYb*Ap',J*@Xr4bb8HZQr*RE(R
3-mdRK6#GQVLVr"PE(R'U30)X53[!F4MU2Cm5`qfXrBVS%U(-G$$A[f-8RSZ-!MN
J2TB(6RJR[`38(JiJr-HJkMri5a(UfmB)PTHd[KQ0b5ZLA53#59%-MST3iffVl4i
K"4ai2399Ehkqaile!jfBB,C0H#S3aq[K'(F$6+Ra))X)Ue-UYYU5p)MfQ*@@VJL
9&Z1m5)G)2)J,j1DN!'+9$2HK`-J*RfALclp24&PJN3If6C`kc#bdm(PPiV"lSKN
609G%JP8bUh5-'PDHPCXN0$P@Ac*$4GR'#m*(#dBXa)0QEl%D6kl'aH,"*(q!*+S
m15MC&Z6*$TV-T&,akHI2*qm6&e8pAQ0U-eihe#'m"Y3f[$,9&MK@a09f)0Yra-*
4p44H*@SfANC9qpKpN!"VcZ(9SilM&912iR9G0H0P8XF`U9FGa5ZP0Z*9Tel%B"d
UUmjl+0QZAJU$k9bXZZMc2S2CCECp9S2Yl2`SY%8EIfI`AP80p0(%8D-3TA3a2XK
&"r@U&q8,+-H0384)'Fb'SXI-G-')DXC5RE,N`P+0fV1EYp),iQZJ4p6Y0UZ(-94
@b'JU$KN$CR`F$ehRcB8+(+Y$3VGUYcP863Hd"eU)p%N-84JU0-ChjiP3U"#I"D(
lJX(mh#I0S@'CD%!)f3'$MA3ap43RM$bFHNiCVP9*("l`2[8[mS$UAr$j+r8C(M#
r1(6p5E0kr-NHcb8--q`C`5[UU@G9S!e4$#TLq9#HJ,,k6kiUhI6'@LkUjF"@KQb
SD(%jAN&!e0elF)9Zmmc`'#1FZ-CM&-P@djQB95l@recFb%9k2,J3$Ak)`Q@k(!4
ErBBUd3baqKhU['C-a%4l&F6UE3$cAI+`YBGe+jLj'4HkjDq`'RX*Lq'ibXB)a'r
*$q&pqIb6Yr55jfBZa+IPH5S2pNN)Kkc3cB'c`iV)rTHhLULdrq"f%De,rZ1q9-G
'&*hiDFB3bfHI2)`1QIXbpifY(LicpH%+0HJf4pT[[rRIq"H)M`#0Y)G09d4()$N
fRJqhQ(BpJBiISUX92`lmf2($cFmE4A`VLZDfJ!X)XJh"9-2"e$U22i%mUR5,QJ5
#Z!DLr"84[j5Ilfd533dbD(Vm0%0a3)MBZJ["1IV+IFM+ch2G4dK"XJe@cCrr%i2
04V1%$1`m(T5Zq@GFXeIZ"ME+SZ%i13Mmb6T,q!%L(8#@piQN'XFV$T5*P`J"i23
8Q*[9&Vb'++Lh89"[39!IeVe$J03Tr-j#54CE`2+G'KL["A$TAJ[UjXm5dCMHL55
0BA4mMC!!3BU3!%%GJA5MHLlcb2%M`HD0[YNqie8d4+Nj4FdSi(CcB#["UeCpCMG
e`+Y*rF[IVUSPZYF$B6QaJmhjHb9chcE9L14Ue,dqSj%Q[)R21VAN8R1qGhd40Ef
CldfCFGJq%i!mPM,&Be%0(,i-4I0c#m1FS5E`$$&iGN#p#C!!JXT4!lF(GYTCRJm
'cA36JNC*HU#CPk@N0!!'c[3CMIbC-UbIZR'I-RJ8JhF'rI0m"bB0l*rR("J"f%1
)FNp3MGVR3(6HI9b9+"XXlAirUH)c5Tp4rM3kT)'X)ipPBSSFLCBFHbCAkVJ*!%$
`6TLZUY%!@0@D1PA+,eB6@)bmJNAGI&U-iN2595'6L3PhqP)(0hV4d+LEMk9'AG@
G[[A[cYk(5Cfk3HV3L5"@(1fi9U9l*hA`6GmY"UC&+'5Ar(k&VVMDJ#`MJ4kQq'L
J`CY-@Qarr4HNKJFa%*&"!KPD6ER$NiMJHFe*"!D3!#)!#%p!8&rZ'(Uj#!'X,B-
GVfE6DaZr3MH-)V4hSK$N%,%N1Z&DS@&RNFG*DXm&d5iHD*PdU0Pj+%KT[eQP@r%
MG!Eb@+4EVL5!A4VSfkV65IiCM4P(8J-QUa-0H2cBcY4B#a@,80N'((,KFZNLZFm
X0mD$#Bi`QTP(`3bSDj%a2V)HPjXk#R%$36[%a6hB%iXiD$ZZcF-R&q61B"UD@Dm
'df6"!@*$@0NXL[5!iK3#X5K8,hEhU$A)K1q0Q[TqUMDb``lrTi"JTF@McN@kY&#
eYQX,Y4H"+a%biK@KiUNQ9-$"+R59JeAS2Ll83Y9i24`U$0H&VU+,&@,6aEjYS8X
X&XpS4%Blp%,*),Bcq3RS@jRi36m6aCd%kMZF"%Bp05cL4K"mQqGXN!!'&X8[12"
0'PLb$5a0'MLQ$#a0'PM#`0SA$4ZRB@r3S-ff3CXR$6UN$0VmiN%*kBH"#"B&@,"
ZSd5eCqFd[k1`aNSIK(X8NAq-a)%Sd!2)jVQ8[jF,GbV@@k@kd,#cD$Bf@dj4Mc-
kLE#$+N!k9J"0UaUc!TAeNZ-0LKrqH,Q)J3*)pr-@J@*X1KICKUYU(#,Mp(iJYDB
'4$q(S0r'Q@S'ZK@RH#KFXLeQc@R8I4jShSdTDLmAl3k)cKa`K1j@R"5F1M#)Td0
FEZIJX,X(f9iFJ)acSfikKV,$E3dCjeLbU6dljrkdNR5j#&H+l@&GMK,dHM3H#pE
ICQBkF$CfSKJ"CJ-9m5$@F1!F#`55kH$fd#@Jfa@-`N1&J@B&+3ap(4N&BaZMLU#
!5(895F31)m[j3clH59J%mHA-C,%PkRN3rRLJa(Q!DR3HS2lPK3j35p`(U#A1!p6
M3,$Db3G-)%'2*3'FV!QGLi8X-,V)-B0GMU#3!,Bf0SV`L!lXQVUQMRjr8c`lCpQ
@P%&U3%)K%bPR@2[Zj1aUG!0R9bp#53j@TI#J3"20,aHPc,JiEd$r$8DA)D#51A"
'*Q%Q0!qXmNX(CFA,j@!3&hkEVRK@kXJrJmqpD$`RJhcS5&$pI9%XM`%*2h2XM4"
*EJE#L'J3F5$b&#**4"l@hB5!&m`raL#)B6Ec"l0@mE-9#qp*[I-(aDREIJcd(JM
qTS&r1--cV,X'CiJ2,E-fL%"&fh!D'`ihG66TjBAPb6&"f4bV)ZEDQr6-IPkD-bD
1TlmS8!YeX`XCDk#RprliK@qZ`b$2)'JQ`%"TCl*#,1dF%`L5ca$i-d1P&3A[0PX
4[!2&Ti6)KUqRpr[425ZlFRQDTNXZ6V'P)`$m)m`F64QB86A@PC8H-b0)(,PeJlZ
!0DAL8SRm-mc`@eimeK@,+N-GD9U0T4eMAFk*')U(,`DlYLm@Sb,D&6K2KDM,mUM
)6cSUXYDMV#pi&,D1lIQ3!##Cq"R!M`%r2@#MD+6pc0LYcG"PJNRCJ!jc`D!dJ'R
B*Je38jCZ!%efTDQ(#0[)%Gd!IJcib@3b0qQlQ,P!),cLAJ,J#)V8r62VQ!'*`HU
)l&C5rqr$K`6a$3SXk3J+j!DDHN'CHJ'NN4!N@S&FI"`BJ'MeF[!J4"CQaS8PDT&
CCDa8`2@Xc'KYUK2ARD`,H%*Q!5@D+50cQ3",LYQjLCG@p'5Q@c+qL1(!D!UX-@C
f!%ABa(i%-DJce-K)%+rSL)B(f(V8**L&5@Jp+BZFGrNL!&(*E`QN!3-[U($cM)d
45Tq)aR9mEHiZi[d#V-9f*#RF1r8l$%9hqAM$aU6FE$&i%X,"N!!XhXQ#ABRh6Yp
GAN@)BU4`&$rCq$%D,dfkcS&JiLiIEq#AEp-'Y&48$4$#[FSLmedqip&*R4T,6KV
V*Lff"#9-Y8jDpJHElr**(NZf,,1),SkVBp,,LBH%3k0Q(#5f@PL1aKCGF!R(4)B
5b'mhqV8IDIGDe`55B8I!rjSrX-cK-2L'3JE[0E0'MEMC9"hZ6N#V$VPMaV'!2Bc
19R5H&`TXTFjVR*hVR#bQ'HaN1k,lHRVR22hjF"FmaH%)$Y3iJbSP`-f)N!$l4N3
I`2+FB(+'mBB)*2Xl(Vj(Ec6@pE-!J!)-56CMm)NZrjTlp1F4##f@%66dJbeMAA)
MJkl6"9GAj-ai%q+9Xpl6Z$[BEF1kDBb)MV*L!-Y'd6(2eP5%TY+MB04hI'*Cp*!
!B&iXZ0!Uimbd(jPT9Pj*(XSq9qQ+N!#"EY39h6c*a4SZZ$`ljqj5cYK%$(,@*QD
AQI&(Zh#J!BAjG0d+ZC!!1mVCSM(l`SbAXjj#JA%c0A"CYArPdX![rP2SdG4UbeS
f-a2Z5FT-3XMdXa*!VF02)hiZ!X5'&'@3!-2B%Qa$eB!N[Ha'1cSjR*mNCJdT@@X
r"rb1me`NX)T$RjNk!8I[KH0Gl-c2#5CRJ0-H(40bmYRlG$TNdi5k8qiJRAMV#l(
3C6MVGFpQ"rH-fq8"VR*"!e9S@1(a+4#0%$1GD$$5GDYFbRLX!-'X9FTi-K-9(JU
`QA"32`rC)5`9#,hS$$VQqDT[)"2CUM$Qi`GUE)cj"2ihihmE-X[0B%H'4+Z4)af
)a18&eiq"QS$SYJq"4GPk20dBGPd&Sq@Ui%JEIUciDB9LS401l0ppi@C%SP"#-HT
)C1GXUfiDrq,qfrmQEj%hL'+N$KY-1EFRGH(!U*3"%5r"+%4%Cc6b%D+1HBqZUbT
A'KPhAITr[M'"6!N-)JQZ1+@kKaS!S1'I&Fba#!q#lLRm*)M3[bV[Qc!%Sr-H$#&
C$S'Z#Hl+A6iVrlIU#9hDZ!#B-$R&NddG!6q5marlipfc)HTm169!l*rV!"H(SI"
G1i2-eqieQEm"eN4BA(ENq4PmM+fD$ZfKYKm+!5DZTT!!@ERIZU@iX%m98"%QZ9)
)%0)'I#$2KU'B*@2&B!8QFfBk!2r4X5[L!$*d"b*Aa(Nd(X#4erQid$[m'AaICYG
!J&i"K[Pe,15#@A1GQ$8)QNjQ6@MV85k+SK"HGLj!ad$b+'8%e5ffJ+4&9Lb$JP)
@"DAMJPQ[*3JLecQ)I([!X0hS6""19L8SAZ6JL)aKaL9(N4GX2#-UYGLafI-FI2J
(a0k-DK4KZD%SE@*$`"kU%hm9+M0[M*h531B4G`#4f4-)0!-P[0`CE(k`@0MT-!Q
Cd('&IC&3)LP8il1Aq*!!l@QNSL`"iES4RaIT-d8&@i),YVmlKf%fGD2523)A#BK
$!q1M")*C*qq`2#aj"`E$cd9LN@B%Q!hFbS!2T9GmprZDK,C2"RkZb[#QVh$V$Aa
S$ieeD2UNj)4V0fX1TC+m+!m)TC6pH[`SXd35U0BN)kX@4PBNI2KCh5)RXmUZXQf
@QDFGq5AT-KTAK,4TLT!!"RB+9,C3J@[1J&Ae*lGi8hE++Gk-E#)K)![)XaFrVQq
`3RdF`b&)'SE,6R&a!C'`$TH!)%3#N!!X#0R4I-j5%(VkNL`)696j'AjVCmFEURM
4GrqleH``1fU91M+138($c%Gr!MS94cJDHXXEmP)PN!#(@i6KA5Qd`bGA#RNGVZp
bKeMqD1l!23k048'R15TAqQZ'1UIP(kER#90ZM0AG3Pf16E$)maj[i8BAP#qX)(m
2660!Q+&!FKj)r(1KjUC3J@E`Irfi&d9@N@EmJmV[pX+YUBL9$G,iVFmN#C@BTRp
3'Ge,#Zfc38F4Ncj2'KmTR0"i0+K5djJdIZNAKCC0#@G93"56dfrHM2Yd1J&mC6q
'kTAL9McRC(8SeG(NN4dPZ+#md5ATXk"i-ad+K(DHP26BNVV!9lh*Y)HCSUe`TBL
C8RjR&hDX#1LGkZk*A4#9h&2P+4KD+C!!Ek"!&JY0m8!cCC+Q!A`k"rq9h#NH)LE
kBAF'A1K4r'["`0$!I@Mj[*2ArFL5+Zb0'e!G0M8dbH,*#K5DbGP!@"KL#50)dk'
B(mNbGF*"NR,3KAqBER5J-`2i%$*MQkR+)l+TDjm1*M!bJ-K8)h%9B(p2"RC0"e3
26VE!4UG$%,,'l2,Pq1Dk2hlKU1H"``rdA9DcFql*![#Kk$Ee$EFLkm[J)%)S1,0
c[QU'b$F8h9Z5MJ*!rcHYlJ((N!$#)Y'('h82K2cLCmD@bBi$B6#bH*,9TfNh&!(
-0ZElZ)*()jc4lrjA64ql+k*`'D+UD'9Gb$aqp9`,"aDpU32+8Rq-Uh8fF!C#YcJ
lCp2FP+%NR4HFL3UJI9Zbar6-'YRdj3JhfbFd'c&3'`B[E@T!C3!i&Mc098H4HDA
+S"$@f)@T+FkSK#ka#ml+($LfbjhJ4$!6'6'S(R4EiG###iNYpA$qd(RK(Q3!'Hk
j,#!ZlU$11b#',L&@d$e!4RCQ"E%,`6c+8X5NbfSp#(XV$!I-(9+[3f-@miHBf0S
pfTjjIB9mb!j#A$Z`Q6#B2Kf"@,e)l%IP[5ASU$%0a4)DX-mCJ9lc5HV"E8+&5"'
Dd@JY%dAim@RlXRSJM'2!"6h$qC4mjc9pN53ce,rNNa-3@B*-#KJpd[kSL4P1B-m
a5Q9a[JdU46RC8lD1KNNGp9+[dK&1$-K%*TNGpk8#6KKmS'MqdR%iAq4mGGF%GK3
jSS%9ihKEI(2GQ2q2Ak##0`e"!4AQ0Mh!P9!KN!#RQAU'@qZGJ*I*J,GaUJAJ(@9
NfH*`G#LJCdG8L*paPXlB14RiH*QRF5FiM#)TkTL"XPAUZ*XU'5'MRKCJi&MQqM%
UlL%$Z2%"G%TMm'-Jdr3`!6BDeJ*d#c3p%Q9rS[YR0)iJN8`pYmbF1$8L`mF*9+H
qkDY1)HYC&*2X*1E&`NJ`9SQV8[cQX3`Sa&dY'6hD2NU`[RPp`d8-ZR)&P[9EeJ,
+,UMpP)#`rM9@qr'#aB4S'cEamT6!Q(fi(4@#!Sd%`[Cq4L"J+$apr3B(V1CB'`L
Y)k,-eIPHbH2*F"SNFS!4F$,@1VQMb8`G85A-Q%P%-mP9R*P!63d@3DGGUGiX"aj
dIRCfA9HJ&B2f8R)lMrADMRelP)'ENrX!1TGQjfcB1!RF6&$kQ0Mj%!"hP!"96i"
kNkT`FYH)TLG&S,VKbj-kfbQ*6*+(J49JKFT&M#Jfc'ALbS#lBEiEF$Gm`S$lT4U
0he)FJ-XF96Ul,&#%&U[[+iAS%!NI+0`I-)d5m`c+@6r3bT,89I9pJ%XcNVe$C&f
APhGKUBkRLjdm#$*q,A!L56jT80qANh#d5aNJjl+DTm)TKCe-0#PQ&K5NkS64H%!
Q0)NBRXN#aLq(4Q9'5bm,*TK`P3C`b&H,DEJ$"03X-'!q"UZJFDP49L4#a%B'0Hf
Gr+UPAlR,CqU*a4F8Jj@i%&%*4aeA,K+'!(cFe!(408bEf)6!f)aL5#rKS*NA)0k
qcd5c@lLlGBl+MN'F(8`Sf8F869H%UqQ+k'PUB2'@-qQFGB4!FGU@FCc1"AQ,,H[
iF[V"!J4Vhf!A$9-a#J%JeQM[dCN$N3pD)JDh+B%AQ$i`m`PXaiU#di'UipH`JFV
R4amaF#*BCQVFcRUkKFiNYmcmhZJL`Fm&X[5!q6BZ2"EAAi!LB#EFk6ppjDT`kBU
"e1EAAK8pZQN3!KB'9mi`ZV2&TbL$a0Y6+XCEA$Te!Q$#K5fa2P(dfaUEDSZ@G-m
L8,@L38k@5#XR)$,VhC9b0KbCU$K[b-MEqZE%5ePF5$r$f0r"@lC2F%mNKKiREll
*M-$$DV$H91f8kNMYP1!9lC6U+e#66!R+SJ833ikiD$)I"dKFk80Mcj3J6'd86UQ
'XZe'-)5XY4i0H@M`XH1$M5QrV-R$3bK6(A,e!aEGem6!r&J'9de@9j8j"eZeJP%
*rf"+$eJVLaF!F3#S@qQ#R5B%m%$EPF)Tj90bmDUIX[F+KTP5MX2VhG@k`E$LLQL
X2Kl)r-KKR4qQDY6aYrjdHh&3MCa`Xc@C#1i,VJSL+`#51+C,Y92+hlU'9reEa8*
Qpk*K95Da0BNFMNrj@MDfjMBDM)8d0Lf`QGN`a'K8PD8b14+DMmJfqF1c$-QcM3X
)1&DKLQq`BdCM2pc$P#jIjJ$Z2S#V`M,V$F(-UN`TB+G`1IY"#l193`BX$MP5MmU
SKh!3KQXa1Ka$mhqS%CaTRmTL5"pPb9&3cMpfHjI&i9'(rhLkZmUVl(iA4JB-B1"
M9EpJ&b`r&0fUT(l3bB*hJ"9G3e'6V-MN9ppbFVkdbaeQ0"VUr4`BQH@FC"8rA1I
dM)DIk''NG@9rC4E%fUi*MXq0A'P-X$XT8&QVMB%*j9K@S*Q5KCUHk$c1MUCC%a-
@M)-#2M#aPk0!T82CP4$%Y%rP"3jG!+HBShrpVeNI3FK'G(E1TM4Nc4"eA-`D%9C
FbZ(1ZXP!5p9QNK12B3'GKhjq,`0R5IUY*+%FL#q5bCCma)CNN!#%1XSq$R)%qe0
CNGAh(TR+k[eiRIMYhZYq,Ca'T)lIlT@b(V`TXdN#pG*Kl4Q0ApX6c9Tp8i6Y2F)
F1hjCe!ZifK3PXMM,Q1)XimA4&RE@3U*F((fL2(ahpfNI,6rqZldq,eIZJ%[paA!
iejFkAE*2HkLN"iBm(,IIB8DRP!8f#M0-l29!,`TlCUq&)$IIQB'3!,5eQES9H)%
4!39H[k5YFGclm6TIEDpZ2LSXMHVHV,CViM$E-FV#UP&2(rAmJFS5A"R`035c)ab
3!0*@!'8ZbK-)!!Z3!#%SC3%XT@95d(CqD0[1$bffmd2EGZ,BcJpj1f!#P8UR5kT
dTDLUXULN&pGSeLfkr4SfYN$5bKY6(f9e')ZGQHN4,5Q#dP*#HY5HP,28j+"4pVJ
[A")CNRSNcAKbael,TKTeM5rm60f3!(5)'eeQJePZAZ-V10Fi*"hQCEI4"Lcr"CG
*+m'"Z)jIPhClM`8aiBkr+X`&*33AHcRXPN6!kP`phe"L%$G#fN1'Ar0R58Q*'!p
Pp4VHimq#NJ*a0(6UX1&crU`[JHp5U!5ZFM!EJS@T*91aF-j-@DdbQ!B5UqFR5m*
B2#i[PPSZRTFA&lXA-eef+!B+K@l%pE!%a"eHTPae,T)pc0GNN!"[G+4J*U)ZJN`
N6+K)RPjIdGQSCmkadllDjh4Elra4h([(e8rU(r"+lI@2Eaq-Y2reb&lIKT15(a1
24Iec6Q,LVd#-dMZlK6rZhIljldpYmNVa5pDGJp&iZCd61(A`MQP5!cUFM$E-bD8
15GddG%M'[3NTq+@0AUNMEpA@`CU1mM9h9ahaEGSRa6%p&p22dR5l,Kr6lA([Zfp
XAR'A9r*FeQmEV218YpeGZFHh%3VCAPqdSFJEl9!k1(5Ed-%4prijEeA&"UrN(hR
mhX'8rkrlc[VZ1MCKLc#@TGZ1bGDipr#CpqVZH&GUH0ZkBV#a!9H[q0Mh`%QTR6E
DVQ`dM'T(h5)Fp`jUHPI64PI44YFS'rhFYY%ce+&99i31VA([dYjr8'QMHYTSQm9
'cpJf+ZR@BES8prl+0hX$Ej4)lL'5Rf@5dcEpb[5%EJ1Q*q,HI6h29h!#%G(ECD+
MJRrCHX@3!!"Y'"'&q"(G,R5-a,dkh9rHSLf[SLf[S5ecThBLIrXFI&#A'YdbG+Q
*HcmkIXFl['e+J,L5!'Fi!BVB%%1(XQf0ELikD1,HqfkZLDie!FlB%Z"4h94-IK3
NQ[h2VrjGZ6*Y"4&j-j'$kkG)pPj8XN&5f*@N'09Y3FI4Z2I6Iq[lQ,DrLVE[6)T
eR"50JK-MBCpcQMU0khDJdhMFqr*VbDI@NK`0f,DGbBZ+4+9alk,1*`p3-Mc"bI"
,14RLP'#j0'Pah&YNIYfmrPh*IZNh10jH[T+2Malmqc3&K&FU`bf,He2Rcce(j"i
LFMF6Z6qLC)@MYp4HP1[cXK0!h2I6"CmAEr+"c(BLXe8KmdSLh%SQ()EF([IHeH6
iGb,[%dcHAmVNP3(@`dQ"DE[LhP#20H2[ldSVkBSVj5X556X)91h+J$[LhJdIh1X
P8Ji4+CZ9cDcM*'-R,fPPd8Qkj+DillGrrpV8M6k3!0"1*,35#6rLC+,Yf)[1dY3
0FGp6[rZ[HeQK1B'-+`NS9bU%h",h6[PHqef6#8Q)``)9B'Tqh,[i1cmi`aXL3Uj
8#,P2$Ki@K&`ApadkCler,B4X8!+G[2'TF@rh2rfdirq#N!$6iYkb[hkhP"13!+l
BB%YU*b'G#9-8p`CZKGBc)I1'3"`QT%`FMd+FZ%,'ZA(IpqX'pM!CkqdJ$T2a+h*
3I`06hr,+bDaEmLdA)Ee@4RSrr6if!GI&rq',aQR+ZVMhc$m[mP)5lkBNEP#)pfZ
Ti3qqU*qQ!3!,rrpI4$R`FM(A'$FFGKdQ`V9('elh46YS'K*LkGfMGL,'5LC'q@r
ZRJ9bR*%mr`,bdL3%M%rHfGE$`DHqPDrp8k9!q,d[fNj60X@pqarirlU*@,Z*@!f
fB,%5&rI30""Ud4rf'jP3I+@DGN1[UjF)&BqZI0ejF3$`1rmb0dJ%@%P)rcG1T'm
M%T)`m[qqr4jGZj@[r9-&dIc"5D5YFHqf$ajC3Q#cQm#Q`BRHIqrF2%"Vbemeaj`
NLXB0"ed(kGUI5b[raAPY"(RrhVpe%2*B5D$r'b9jj@[,*0J3pklIN[mY3Kj-*-p
2Mda+f,PalleIqZEG&0af8h"VF"H9YX4&S1bDN9I+&kGN@cNTf@3L!6LRIHA8E8,
-+`R8Iq-'GGmaj9)J`Z+(SMe%TKBQdrdf32HG9)L!41QVdrf4NUk0NNj[L5kLpY-
)b+p6YILiEpE##cpq!!(ZdKVD`+S*k')PTYTTk[DiVqc9QGmLC0&!*0[Y4KDqXfk
#h2l,-e1)C#e-X[YYL-+AUj!!!dRdVrCee`K0Y"'Dd&ZLL@J$$[A6SEZJH[MVi[r
Mld9)m$@8i+[FD-*haJh+ah,rr8%LA!-4E[GD#)F!GQ[`lI5I5$JN9&V0[6XQ%mk
*(SJF-Z%@ahhI9IZX6,Lm0B3H9VR4JidF!1RXj*S2+*!!04"Uf+fJ"NZ#)+!pRr(
fD3SF,4`ilTH43jbZE`[iEpaBrKL$d%JEVVm59jY&'r"EE!!J9(I(RApJ8K$"iJV
"6[,e36#2%karHIE[2f*58&,kPD3mmk@EAad8rRX'4I+13@'(S&Nkb8%M15+#Ub$
b$fhhcJ(V9YZ(c%(48ekrF,4F@PANIFVhU0$ffIXJV'kS&jG4I`6LYFS1E-b%[E6
UQZp1lpdI(ETrbVV[['[8-m1A2SUNeE[fAPVeU0m`*aA+2(hZp$3[$jc3e)Llpq6
k%UGaD-1G*qIiDY5STPAXqLMK1AjkQNqCi2hGRQ2ASTj6Z&+M-U&F[q@NHi,"jA,
aP%a-L4ad$U'e'#)BrPhaXAm-pPpD9Ei5AEh4e6rpk26m'M((Pr"H@TA`C1&+882
di@VKE2MG4bH[BASc6BGp9QF$)aYZ5RKi'p'(epQDF%Mhb@YCaj!!YHY"&K(LI0S
ZLd`(X92N$+aSN9NVDPaK'q"$l,9d)9)bl)mV@5"8"j*mlJ@U%(66[B!U34DIhYR
ZMfqViaUPimh*9j!!eVLc9)iLDBdlfm@IcJ`D2Kjh,hpE(C3M(6ihBk1,@5T3adj
CPeUGTdBpj9flZZHFVI&X1R[%#aF%rf8ekXI5X6VraQ0l['p$rETp,i*E+`FhkI'
hFS2p4EN(ljmqN!$5f%@`2qVImG%Fhm(lT`kFRGmUSRlA3F0"ARK2@5J2Bc!X6+1
&5%IdmGGcHB![B-&bJ$p0'Z"cC8(ZrQZjHlbQSmlrqf2D`rE$P)Q,54dlpdBlbVX
)kEdVaI%CT`r[`$e*Yc1IA9+f((NC,Kfqk)EAepeHBX%@Qc4"@Qmj39H2#U[%c'!
cG3#LHM"'TYIQU4F1"A5PYANIcIU[[a*$Mm#VV"1Q%dTr-kal9UKi,4%K[,iQ2(L
9#6pH5d8(AQNLMTG1Y)q`!lAH'%RXKa1"h@&PCFpE,Dj@#[c*DVr*'YX'KLJE[%U
0J''"K5e`CmaA,K)Y!GZU9@(4k"Da'81ZdNK9'a9@(p4pqLBr&+9R6D3H#HLlf!M
b4E$iiF#J'8S*U2f6A'8GUXL,F*m)b8!$*NDDh5`DS5DU%mfmU!SB`&-Qk0Je6c`
'jHrSA"(#35%kC*J'(`9l&1k`GRBN5iXj6,@cPS#*2$m$%63-SZ%*0#4GmJ+-!m&
E$P9'%B'lC1bFqm"!GP"m%%faFqN5GYPT'Xmk9*+&c5rTALV"a8'ha1f#P1UbRj3
GcP1b`hP'hrfc[XDUN5IkCLeKGe"M$BlSdUAG5YKVK@l@NZYY@P`"!41[JrI2@V+
QLY9TaML6VAYU%l0"r3ECYAL4SE!iUr[lp)UiY+iXKBKq9j1iU"Kc,!HEp&6D)X0
`@YPJ1E2a"Mq$)SUV#BRj11*kTaC4UME%M##aCUliEf&V[Vh6kH5"!CEJaq,)`3r
ieB4V3DA3VDNY2Q8Sb[,eSl*pFBQKk"Z)$Vk+5iV"A$CjLFJ4+2V0$aCLBMf8qJG
SN!!Cq(KU%%SSA1mcZQiF),-94'8QlV,"FP4a6U41-++8&6(GqcL"$2AX5JUc@1d
JFRR#d)4Y`A9D*JdcHEHbBB(ZlmZ,rDaZVRhM1LfbF6Q`-YmSB#*friJ,-#@C3dM
QHjRNK!#j5T+!ZjLqqb4Br9fXH"[m6*l'bS5ALa)R8NTJ6&[XC15he9EmA#Ber-!
,+lQkGB3F@GbZkkHK6[f3!"Y0%IA9J!X6[UiS9FIN,M$"1X*49(@TleZ4YKJXfq'
daEaN+&!ACZImGUT-VU#DbDTC,6HjKiQe3P&MCq+%f(Akm[&dC6U8Ck%8Z6'!Q$'
(C))lL("Zd`Jc!GqlCUKIbDS"0Qb5Cr*"b@%eHGMd`2FbhB1S1jA&F9EY--J3XaN
!`e@0UA[Pdlh1kmV$I8e,6QNTH9[U3MiDlU@0!-6NT+N4Q%*bEr8G9SR%TRjlK,P
h2VQZ1AKT$3+#qQSp'mbS)f+S-M'`d')MIYL#q(BR8BeXArcE*URBmT0)1QCfNh4
TR59*(dZc'15QXVMYK8MU"L8f1[2E&RR6SPiQ5K1E1PEP,QaXqEIR#+@f"6TT-%a
'GDQ&`6K-P9Z5aQ(EPQUj,FF%)a-@4KZN58BE2$#UJB!Hd$`MZlN1'91+@LD*!Dm
"10['--@jb)CpIrXDXCJYM2l##0+iID2QX*6mS"0Q-XkaBV&T221cfq@XIZZHQHT
+$5!Sp58b4p5-`i8J9R!9XeK"XL3lJ'rh'If1PTH,Q+P9!r@P`m0+P6D"DNq4&ji
k@l40FdieMYNla+UI0(f$jI5NSq1%i+@-`p9#9hjPS$)S$3#S$q,kj4`0R8DdrU8
md9#CGi@09HXUhkD'DfJic9(2ha%pbp%1+k*l-2N(P4rcj!CGj8eU5+"K)8IMYa'
GcG(f6a&p(j1E+fIbj0@kbKR8X!!0Rh)dq6bLa4c9Mb*D4CGi8lR%Dp4J3--mMMC
mK1KFMYUR)eT%NkFTNpqcV()J1GRNUV&Cba8#(@[H!L`),9FmAh-aa#k&Yqke9'K
'5-K0EJH#0m#*UVBbP9fjU048fpdRUqYGK9@RM&N`K*%bjGiD52QjJ03T"D41Gm9
8&E[59h899j+U,Ve8@$QpkVbVXNS,099YCGa3@08,YFib(SS$`mSHNi$6Er`l8fD
I((kY[lEU&"Be["KJFbM6*aK-JE0X9$'QR&"8H**,FN5Yb+#[HFZEmV)4jQL030B
dqT!!3,EXNB03"De*V2i2A`)Lk&ZRSf#F`kAZG%#rFimicGM"'0Uj"blprY5*b)R
*TL38BEpaVFUUCPC6V8e*a84X$r-PSD4bA"EPJJAMV(dmM'[3(mG2k*+)lSpk*9A
VZ`#$$j+DaC'NT*lLL&e55cMLN!$8Faba5ZTaMS3P'!a&T,A[Td,+p0UpM+J+jqA
aB'Z3!*L2PSKmlaCIk$5,+G(ADm3MhKUK2CCcKKh+5cl5RV@IT5jhbXiN!QCf`M[
FPel&K#93iBXRD[bK5)dr$JI@[FC'l@Pjf$TNacBF#e%&["V0J(MU'(l1eN#Bccr
,4M3jkrEkie*laKNi9Njrb1822G6MMm1pFTRc))"#N4X&%5S[%1I)!2mj11+KQ6k
b64c9mi3V"F*B9F5*d95,cMRL"KF68%6VM*%8PRJl64'eQ5FM`JTqkBUjULL6+rI
V1#Tjh#L,A946XL&aZp'"b3D)NFr#B)31L2a$[X)EZB(iJXTCHkThITf+-MBL3ZT
FUQTe9q@XMj9TA-%Ik19(q)"5P*@`YC93l+jV)EFI"eh4j4j%9RkcD4*-FZ@Ic%`
R-eCq90q5"l3fkC@#JDG)2("QqN362%iaC86!PH'8jCECU!S*j$Qk&TP!-(K`h9d
",H)dab+a5CH*AFP)bBblc&6)jk"k*9G9i`%5F'dHid,8,')KEGq,Zk+3!0JcfD6
4Q&aT--NZ(V%k8f(9e)!$!AXU(p0iqL9ceA[(dl%m$8'SY[KEU*V*)Plli#1QbJT
V`!TR%C!!%KhHN`SVV0NhiD!9dRMkmF!#K4!NB!V"MP6#h[dEUF[ZqkcmHSc02I8
V!4IE+8G([`B,k$T%hI4d3BLPU@%j)d2(pp*9c*aKHFiA'q8X!P9"4L8$RS"%e-2
P[KfLF'6bNLZ!DdlVIK[SF"SZl`L`%cS1S-*5hS"$hN"3G*RCa5&e`LR13r@1L`C
5%%IeF"$VT'Y`*4)BM4&kpm"XfUUL`GN0&@&N"f[V-raS"rIQcjPU+aS#iilDUQe
Fc"PmBm+&*5)Y1diX8B6Uj4#SZDT2BG@fl[1SR+QhIClJKd8df3LBYXA4K8Xh8ND
Nd8CkKfcqRVI)h9b2@,MDYjPUUkB(D!!d6XIflGNhMFe14#S[d$"*E%@VC#Q6#)a
fHT!!`d$kB5*`NJhlE,mY'rKCpSYqd6dcFB)hd1e)D@%H)J3h6KL*)%G1,%1!'M)
824T"pCXj#hd,[A$ahX[r9qc02lh6KmcQ$(B6DbKQNed3%,6Z6qk14`Fi$1qLZaA
G[3Yp%Dh'LJ03K2!"NiF$8e',)@HqK1U!9G2`LPC0[3,cRa9@[#)9$USik1$YBmZ
S,"0j!!(%l`*K1$N3fCDG8fHNE8)XCDI,lK-+#HGF19&K4kE'Cl%i9A'1j`HiI0)
r[[dfNQXQ*TAM*`q!)K#TCJ&3Y(G[DkUYX&YfPRTJ5,jBkS04[Um3B-'e#PFDJ*!
!q3QZjD,"P!-`8"!66[@2,rX&2ZSaT!G$HTSiih8m1qH4kFS34JbKaa#Rf#hArDJ
"S(A1fJ83!&[*T6pXFqZh&D0TGT[6#5&FC)kIaE1"FL!VL`"-XJ"%m!!-![M(q6A
V@CibSGTN[6TJQUF1"(US-N5F'!aaBM#NX'"9X[BYr,JPKHh@b)mFNE2Gb"JdrdH
TQKQ)*l33R1G14+bb16SmQU1bSZ9f(Dj9Jb$e(&IRN4XZeHClVjJV@Sc0cUAM2Pj
`2VDNb@-a41IY!L#MmDrp#cYd-QN'M@eGX9%%J4Yi,-TP+411(b'`H!T%(!!-0di
B3NQV$R1&I%6,UT[K(KrAEDp&"pff%48L,@HPmD#E(m"pF-)&1LdFY@3$E$*aB4l
-k!)lKi[5'pNj$ed'-[E&r!k2X8E6ei6!1fX*LKip4fbCFJDNBjb48-M[1ClZ($j
Y"lXP1JheTq5+%808%E0P8J((VNhN1JmA-kjS'Rl4K"Cj!N"T,KPJ'T0G5)H#-(&
A@j&JJ@VjI+lUL5Ui-,l#9H3j8l3QLpfBr@P8+54#%ikb!6,,!SNcD%iM&%qB+a,
1M'*XiP"k'JT'XhHIKGQ"M5cBaUM5-N!HV##Z0SJXc#mZPB0)%8dAQ3Rp-SQN%`C
bc+'"USN33U6K#R#60Y4c*[2jU6`XXVkGcS%4-%0)4SM56dH93I(i)DV'@[f5ZEM
hbYA3pBVcH"NVcMATA3&UZUpIb)B&j)MRT")jTM48)r+&)KLkDZ+LcF-9b$flJQC
H3K$Y$-5[A2@mAA'1`3)1d!d)cLQBjh+K!1C0fkRb*kkdI#1U1Y3@QqCI$48%DQK
kbZQHV)$'D8ccJAL,Z#ZF&q-bQ$4em'ECqAIe!8T`SEE4!(KdQ8`31QTYC'L9bE#
d4bD$HNiQJkTP-UMC6!B''@Tm4Yk`qKH&!+H95+l5F!k2"#04"dpIqCkE'+%0U&K
M5Bc,&HF!D[1S@V2HQ94`Cje!S0p%NCAZX%M%Y4!+"Zeq)U%FQbF5#XHkL"3L0%U
"Y%@jC1AbfCbPCP+8hFKLpNBC"i&&bda#GZH&QIp2B4bK'"9NTV&lV0-aPNa$0)*
KXC!!X`018bSKS",GA##[#lMiSiJm'@L%XfiG9A&j*a"&iI0F)*TX"(DF'fJ*$DI
TS!iFIQX(e*(mHXFBPaF4Y#lLTa%*GGl%jV-N4!FL"L6H22bmKZZcJhX*[CJjC-8
aRBTCXMDkh&(PFPR1bp9H9GYdQr"UdHhJ,(U0q$SMF-pFQ+2M"hTPjb6B1-dQZ4T
()Sb2(CRT[('RmbdG-"BiLQeN"ZTiQl(%+ceT1fVldRD#PA3[)j+RVU)SM1!6Jcc
e2J[L%%+Fa2j%VKi6D-03l6#Sd1`%6'cM88fABQDK(QcK#$RQ4aL&X,Q6Qi0`(KH
bJ2qRX#cJac,"+)i%6*Kq&%RN)LCT$Blj-LU$)Y1SLj!!@B,pZU2m!CHr!A,qMbJ
'#M+aYH2B@Nd`-X0)dbr)#"%XTYTeAj6G-V0cl)mLf1h03K#l+h1L@G3Z#DKi#&A
9@Q'SXK1SQE-'8FP$KGqb3")#5VMB$!'NX0MX+Ua)Z@U,!d&ldFQBR5D""i$JqZK
,KbY,R!ZS0R3BL`QCIDDq+JZ6ii)V)$Q0LL(4NSKN-S2Ge)2#"QB%`'T"CI`fVY*
XB`GfHG#FP!fB3*JM3bQ'c(jQ+09@R(F@#L$'%3BISfRbB$bP+`+fBS(k$rpcJe(
!61+a*d!"2qL9Q9a8jERM`*LYbM1bfIMIb$m[(DT))9MhmX1YJ%"@)G[Sq&&PaAR
0)5R*%H-36A&q-PZLa1+"-"ZG&3EC-$#5S(Q%RcM5pA-rR*'lZ'S6&eQG@bJDldF
PLTBL!U!K9![j%1kR'lAlE01UY(e83104)ea!%dY`BhhRE2-0[kB$kPNaK-$a*SU
j@rkriF%[0'%(J'J(Q2k0X+$8k&c8qRLjEeP5i1&M0-b-4RZIjlIdf+iDARL`N4i
)k,a8$9e+MmHEP"2M(X'R8`SLk,XV`#de1&A-,!BdXN[aT!)iCFlMM%H#(CM"i#e
`XP*KLU8VVB$0Ak)b#k*b%G%"%d"T"6!G-B+%+P13!#d-T%5!+"K0,$8iNGc5VCB
)EZPL*iU%%*!!C05fG&(-pR#[TEpNY"G$PDLP[a`4&P1EPF``)$d3'P(reVId9BK
@3djNYA5Kma#q9P-lQ4#2%L0@(p$,D"c&[CC34MY2!TQ#5+E'XDk$f#cFEf9%IAJ
LSQE8[XK)6#lKYal%CLBME41Z'SM6YH08RI3G,,dDi-N,Ai4%$eY84H#Kir,3RK`
&HF%XcY)b4Pj,bpD'[+BG9j!!9jB*%`2CVUUd)D$30NCHD8*"AKFPG'IN*@mXEBJ
ADM26*%CJ5mYN"*D@U$fFTX%8)5-`G,R!,1)rPbYALJ!8(Vk"`RNbUb)P5-arNX'
!+UUR'He14J`qPdeJ`Y`lJ3P6m!*-Q!+C#G2SFE0KFKEb4TP)LhI+9`TpZ(CQ6-k
#r$-rQ4Q6Xe"QaNaQJ+3)`*iA%bBAd'!jm8p-KiM8E168c+B&hFbB4LFcTM(M%,C
96QDEFeUi5J-8I,SJ3)a0`(am")'*!a3V!b!DE,DI8B`)&CMf"GJmE0`TkV,5b`D
#!%cGY&IbJ-`QJ1(6'f9#U"mcJ+)DD5Q$%icBEkSGAQU3!![PP&)S,l!9bUdhhB9
bDkjF++m9M*(FJEJBKL'2Z5m-`#m'GNY`IRT8[U,BLZSmd9GkPRj5HhMTT`b'#+$
&360AI@#'aY*2)+EP3@PG@4%*M(1"$r*CE`K8Zcf%LJ2KmBlRHZ'BRlbPcqaEd&Z
ia!MQeB*$K8[NUBrAZp#4`C10JeA8"0T`e!#1bXD%'J`rJ%N(N!"*[TjaD!,i9F[
J*pA1qKJQqDSjfH6N`Z0h5Yd*'Gi13%%&X0$`a!4G2XmL35-N"SUP9JX(%ca5SP9
Klc&$LXd*LXe)N!!4r&c#TaB4k35V))mmKdUI!)NLCY[JFBe2$,CTZNCBp98P`8$
E@rGAh%"#cm#'EJaqjQ4Ub8T2IZLLA6qLNV$TXjKH,Nm(k1kKSDj(@#92V&ifm-D
9rZeqd3K&UemmJ3ipLMUlYS+#8rHrmi-piHk`3VGijNY4(cHi!Yhr,U01'K)X1P3
#SkSph68hZVK)Lk$5C`a9RlQKqa8f4`qKDV'LUS'j+fE5b"F8@jKC"B8Ec2E&,L,
"2kdY(*c1fH6"cI5BXM*Pm1hG6lS+haM!6lB"NF%J*QZ0@8%21X,%HFX`+R6TC@H
H`AqQKkL@+ZC[PR9ADlVJQU"R8e98Z4Q0%1d,P'@l['@R52pi'EBecQ55k$'4'3M
38#lN"L+XmND90EjiUda@0-$NZMX*p(Xj#4aXH-K@08M*)#F9TSR$`V9#bG5#*@H
e-326L0NklYRZC*reHrM"[)',LQVGBk&BVhh$+#[,@4N14Uj&Kq2TXFf@V""N2QX
VqK%`EL$V8&PKaL1VNC6GAdHJ-I0QZUf)hT!!YiMU5NPNhr98L3i-VmH(,!EU!-0
Ml#Q!XeL)aj-Z6%6%qkpjBme4Jr53!*J*XfZc!GlAAS2a#jlS'K5IF#4UZ&!J&SV
hmCSYCX)!dqcAd&4BB"S8#fmpLSS6#b98B0BYJr$D&JhYm!k-KpQJaUqPMKfq!A0
B03j&3ml&J80BJ+U&&5ALelILdA'DLQ-H2LLQXr*P)!,,9!X(mT,8!BrarU5ZDbd
EQ2fri`Ci)KMJb3F,a-fe,&kcf#J[99BBN!$FKPY!16a0UUd`2$JSEre04+VpH,$
jE0VLrcE%!+!DkVSQ96aV"PYJRYYm&bXP1B$b8'2MDYH("H*M&169m[69RGaJMm"
iHc@,Ve#p)iVXChU!MGPjZ*QRZ`*0ikH6ZKf$rm'9NH%kU1+a[J-3UJVAC3mH'Hh
LBN5HbLidmf'3!1$$(L-4+b-LULFh$pr,(Cf,f6Nlac2"LV-`)@Dl-LB-b&FGBXH
J*!m3"kSL`TM&aj1kX(S269aX3fKVP"RjNcUC,)%&'TlC0P8r8$%HaJbQT#NLKQ1
0K!af!fL3!$A$4`mUj4+bJk-0AK$RAFi(lRB*bbBZBT!!"$QK5h#IK*QC%$1"6eQ
JQN)Cd6Z0h"%UNZL4!1L1V4U!M2h(+@ZUA(SG4#iq))S%2NA4#bmQ&Y5-k`,$8%T
rVcJ,,hha+EaFa59i29Km$N9&9V&9GST55,YCAR#k4e(JJBY8IS'BMN1RJPee5R'
!+RcMA,(e*EK&&CpM0Ebc`@KkiH-Q1er4dRIAFSJmfIB!!cBD"B,&RBjj8+(@9Jc
!C&15cErDQ0!`P()l*Rp#X6!JN`'(Mp*e$KDAm&%[&BLTaDH#$A`F(c8Q&Q!Td2K
`RjJU'BKJl*DiT2KaHB[b9@c%M&1MeFf#aY"rXpKZVHfBMj9YI"IEI3MZDkmkJAF
`Gf*#)@KPB'"+$2FfR82EKP1'IbP2IFJj0*%ZJX"EG%QIlqhR`[3Kfd(9N`r#!#X
YVKUfAG9NF9@Va98Pja$X#YQkPZ[+3pU'8BE&&F1@9ab0L'Z&MiljJ@CZh[#B$K9
'P1cq)XlZ+jX`@@c#5JjiL`Cc,3ca,C&G%#J6e8m)eq'+L!(m910(HKL#[c$3kaT
3-9b*!8Sh$89!L3YTH6SMD2c-a-rl$l140a1p2XDV38`&ZbPK,p6ThKL)C3)BM9#
(e4CICh8B9f*,Zd05E5SaldlI5qBhXYdU08`p$h9DEI%"9UGGkYlL(FL,K0MBh"E
I5kih"QKJ,9La%-cHb(`*,b3$"$@!i6Ib35D!B3N(J,KCIBK"NJ-r4,pL&MF!b$e
%mS[dm(9-*rA&)rE#GP&m[0!Il'#9S4"k2%bI4#!mLVhi%,VG-'Uqr5lGUlQ,M1c
NC*C4Lia@C04%4)q)`BIc2Km9QqQ96k5pNi1%M+Cq-12&D%T"4RU`8ip6--)JX9'
!bJm*'!m6HYM%`+2qVIMF-i68#%Q3!)"&$fh#UcX,9c3E'HR#J%Ah#39%"cQ,B4p
'YUA91EK6G(0HQ%8i'+`l!m#b$qka9DNZXp`Ze0)3k3LiRQ29CF9cM2*aJ+-l-K%
a1pPHR%%D*rEEma[`N`pfS`%1RXpH+D`FUJcakbYTB$*1"pYX%cX1Z3UlXr#cf9A
CABfIHbeCE`%SiIr#4Y4V[Xi[Z"+(hNk"a@F[&2l+%MCl+aY$UI0)(4pdF[9hJ-I
l1ir"k*Ai@@Re0McZTlPZR$rB8!Xb%,j)4ml*@k')ae$Br3l8Q@5@eE2md2hGlf6
ZbGa$IrT!cLjKdJkApX03e+jjP!%eITL,ac'9%,Xm%'J0STTE3+m"#a@2GYKVK,M
I4'DU0mc06'GhT[lf*M,lk%F@qCpH)`HR((m9XrK-*f@4I`J%qFDl2HV,lm*J1Kl
2$9-`-(kK&X&jQ-h2c'-(UTq9&LEPbaY$G4jPQ!+kH!FZAPZ*UhT'2c`Q6qEK#j-
4T30[X()G1SbL3`pYY,B5!1&*ITL,5dQQBp`"`Pf4Fq[BFPPrEIGQ0%p6-YfId+B
6Y1P1E2UBXZN1fR3(XC!!F)NlhV0YZd1jeRC6,T2bPK($peJ-$hE)2m9Sq0j*Jlq
BS(6K1klbi*AVL+6b&Sj`4TNb35*YSd`@MeEHVXF%F,m-`$d(`#Z"-QiB)(i+JKP
BQSE#CihiJ9R%Cc2a8`+$1X['@!#"HpQIPr0%%pL0JA'!Rk(A$'4MJ&Zm,eCMUB!
fmZ-%p4281fIG#P,mk3#9cqp!X@mS0PNB#5YP!`r14mm$JCdI*YFL&8G9T!a&q9K
LCM6!e8iN!(L$#)5)IPE+eF`6qk"3+&2B8$'TpSeF&1HPeFGV#pr)eC90G%NL"h8
B8JjBSH"G$j8"'(#r@ac8FHCH6*rNh*6$PAh"Z#Kpm"SE"H)$EX9Tf0)*`jDb%BE
P1dDGV,!N6fF'@')I4rNKm#q`'4a`Fbp-UL'5%Rp%Xl6r`5P`+(0%pm+F)"YQ,aX
HJJ'Dp6"*#kE*leJ"US-QLi($6PPi"-,[a#$1B502Amr1H4k2LH#+#'j$&VJS'"C
I5B1TTF+[3#5X(!)`i0&%D@H*X@NRTbXl6p0@9[)MP4aZ9e8PB46ep3*+(,kQdHc
LeifeNPJ[%b0fZBRq2)APQjeN"E-kpL'fK-I"PVPCPQrN$XmM-,F#c%r'r*,(Q#6
LH2,hTS4VPV"rMare&BCCcKVm`4[5)hdL!6338SE`ra%['%EDb#4BIJ!-A[Y%!T!
!maSFG1iC)1G-MqbXDq'Fk8GeMbMF8C,G$ecTkpl*6TMGfk!+FR6IaFJ%epmq"U)
bU0`c25[G`S'!a!TRm&8HRJ9Kmjj2m'GJR,"ma"SE!DEMEFl#Nbj`-@ALKpHB-SE
,aZU%!kBqmHGi)#-Y2FQE6m#JV#4U(Z2(R)@*JETGZ4!8S*D2B80K&)ke%(KBLDM
0LNX*K-1r`m@YLBGS)BE)N!#01'cqAH@18!p0GhG)QmB&d`Lamj[kK1`i34fj%Vb
`)`0m+ZJ!5'[PaahD"1Qbff%CEIbIFaPY+#+e&NEDTRF9cRT@BFJNPD$2TT[iMdf
`Fb!H@`f6j+9-9YG#1FK9R,pPK&[(H9fTXF3*E[fVhB#'S*cXla-D"0GV-X!Y1qm
'1$6QkGDMZCa"G'a3Q-F!TXjJcFUTla3pZ0$''&G34q'(R&@PJ+eIHm#Q)$N%&9X
c"mZ[[YEI)bi#K66,%bV12lJ35aV,bLK#!-5DZr0IBN$EJJppp`S8kKX2SRKKGV-
c#9mml58)5LqHf13KJiP*FU%E(rl2kQSbf-9rFXCimXR"YV%ZMFF59"8MSc"C59f
B"HVRD6%b1U5VBK#ID$$8fFPd,CB-mN-erFlXUB9"p6IP3)$%QiZISZ!iJ'%DSP-
j1BhPT1#GUaL2[$(iVe#9'1dSNAUdZLfa8rDU,alXbp"YL!f3!'[I+%er%e1r4e-
MmS)ba"r3m!Se1#!-r!(QaDm&3c!9jMIU%cJHMb!U%Rc"0[P36"rPk9$2j@R'P`j
1$*!!l&l-K!X@r1,RF%Gi4$2H88[ND%PNJ%4@@k1H'P@CS*C"VFN$CqBNh"$jmBe
K@`FZrVL,i#j'jE',#V(bb43j'h#NbMS)BU0Xb!i4$9I5334+H&BJT%PGXK2L&Rb
m6fLkMIl8(ARTHTL9Fd25$qVU9rVT6cl*4a+Qf23XV[(C-'IpYl"l'2fT,!Sia(U
j16Cmr4*HraRNDN&EfHL5r%HCD-BEV$40NUqfG"d$"$Z)bN$&!5iB'V``aJmfJ#&
Y,TJJA-jQC[2-KhMSAe6rkM2qE(,3iT083@1AlIJB*F[LT[&Dr*1EiJjU'T!!LE$
d("ej9*l)K'"NL@4db-aCeimeicriMCa)-TQ@4UL,A5EHdKEqT-2Vq''`3!EjM#,
6XU51Glm2pafqFT`QA*!!"bME,RFYfb&IS@b$[2QbI)f(e9#@IdU*daL8E2JA5M*
#iNrId0LFT'@c[dfb8DaQfIRjDE2'&J5$BS*j-+VQ'"e`+RQ8rcIY9Y&ebaq''M`
bi4'L-bpB2'L6(Q!!-)dc!S!Dpf1MLjeEjBThGCk"[-`1C#"lkhYKpJ#Q-fFQC+0
r3*AXS0`@l"hS3-QLIE#S,jmHJY#,4ea0B+Z6Sh"bJJ(`AVI#a5fXe8ZZ$-jJbNB
+aCYMF`PXm3I)-!XG+V2&E'U*b6`BP2mm&c`dHV'ZP2mm'2lMB1#qYcJIaUhK)&U
'acI$e$9AG(`Q[ILKa!PXm$`"3bNC8iTbiJ`@`fPfR0%A!1-(a6AiE&3q9p'RK-F
4&iJf+40SAZ)Q9i!EBL&AaS+HkY#SK`P9I)@(MmdJ)i++Q,"d%cD56Hl9A`a`%Yq
%LfA)H"iUhNeFR3Q!"'1(5cFamdQpJU4YidpZcXljVh`i(i+953CkYb&iEm82c+Z
PEH)(jH1MP)-mP(DECTjRi('"d8HI6L5+2aC$5#B4Df-A5(,f@YEpc`kiqm(a4J5
f+G0@%$P@"(90c1Ei&L-h(M`BiZ*A*K92`-rc6P3*TiARhFDI@J9-Z#9ap'+)cRD
aDqCcr2#!d%RqmeXL(RV)!cq3!#SZ6V)GdifSA$mK#+!iS)T4"H*p%0L4e8G+P*H
c"[VCUA`Q*GN3+@-i3I#Sj18,q)rRQ9LSN!$49(rhri"!F"hCC#M-qGAN'(b1XK%
rGdiFc%4'QMk&a6m!!$'*384$8J-!@#)293eQ4K%3)H2ZBIpY[jDUp1E[ZVkjRZE
aZDkVHUUfHN(c4(C50`EXbJ+pELDcXmLIapEbN!#1kjZjK4$#&HhRPae`bSb)6Sm
i&`i6Dj,a21YN(VF3AXr#HS4`HJ-MK19CKp'!J5EG*1pm-alVlprIrrGe(5#rZb6
[*5mr!"9hAL6c)$)L%L(a!"%L"PpjA5CM-Ic)[QB"T*JF`#BKL'Dc"i'6c+,ccC`
$Xa5a9),[cI[c[JNMq2[1JSchF2@f@SBmSY%MV8-I'AUlS891h!iA+Q+ahrf#&3q
#ZABef[bF%Ha[peYmAbq54K$KDeJaN!!kh8!@KB&iB5#&-`LN#hcT#5Ca[TcDLS#
`Y,p&PZ+)j*JiA%EHX6lRH+0r`$m!X2eKIa`rPp@YcA%SLmTS8&TmBc$4bZ+r"R`
@jJ1aC!5Xi(+BF1PN%LCX`R6h`f`39H0PhZ`TrQYEK)YPD*95!c)i2A(84bha-5i
qSKVa4cmbid!D,El@SbjPd5mPY`)JVK1A3b!U,dV90%+rlm`TajGE(0dTKMf$XaI
9A9I%!pV[1c2+!jhk!pTdb9'Ak4'AmA%bSXU6+QLIY-LH$4fqCRA#d'`YXKR"G$0
!j"""ah8)XHTm'@2q8C[$Eb5,YDNP'I8rl'P@DkRiSlDPZlB"1@iCYm&`Uia3IaF
!JM![3a$RSq8K%XK$aXE"ELqJaSb!'PQXU%"r"jEDXcd-4JarbJErSF96BJ49!LP
6eX'PTBXCK56`8S4aGS4`9ZIj`[+YhC0"6PdJr2iXGhHrj3QRX4a+X0@C9hZ-C&X
l312PbL-AP8HL@"VBHhmdf0pPK"`@`,VRESI8RBpqT'S&lIRlNdPPJ9mX1,[,5!T
BR`bdKJf8`mK#6QS`3lZY[E(GGi90&JP%V5Lbki[Z5)0P`@INT0PfJSST*qeY*`V
ji4`(%pR)T-3dPCJQaA4bZ3Y!`Q3!PqD``mUJb4J-pXr[NkUlCH3V#"*Gc-M`LY2
6SG6T@-bA0+L`!5fH3#UV"`cT`mE'hDbDDV`jDGejSV$NAEl6BL`4X-E`PVE6!ZL
NlU+mV!&5X[,&2fY48dX[aHVm@CF%qHPHeVe3kpDDZPPB50eShML++'b)EZE&*P,
1Dc)-!`SiZRQKQC8S"m8%pl2idN($dU1,#lR+p!)6"F3Ea04+dlTYX(j@LC-46-h
%G%*-*k9H@1YH9!UV+SGLqLbV6bE$A54imFM$LZ#P[%k&j'-"qHbMSGeIc-DKlZA
`2"I$kaCe'e8LkP0(3lc",*)Hp-#RiJ'hqIXe5)53!-#fcI0@QXjYYf$6V5aH'&k
hNFqC(LpIKS$aQh-j'4DJi*3QCGX*hTKrhLF+mb(9RmP*`j-d8QdG,'ie*1"#,[K
*A,`2PH6LRM64T9PeKRQ+9")%p``-"f!5S*A0"e""EjU*9J'@2,V3lh+9-LMb[5F
5"9le*bTQG)E++ec-5U(bKc&4U"kp+KF6PAD2,Vr4!U2(jDDZZ3*5'b`%Ef!UJQ,
BT!Lj%Y9[a4'SIL'[BR%KrdZV[MbYiT6@q-T1THU,k4#eRKKJQ1F99K3S#SL5SHI
D$'ehjNkIRj1Q8,dlj`,M(qeZTq#(QD&l'53FP-#RbPK##NMMlZ,[m'Kq*0V%!9M
iZPGMjXQj0"II&Z6LmTrcf#p&hR[BNlN8a8r&T5"qA1UeUbLBCcC1KNLY3&baVf(
6pSa8Hipp9AeDHEAbf&H9+j4AaV'[[ZT@AS9SDimklU3kH)ZqF!-#UAq4-DqK$9A
$T,`B#V0cB3Z$b1CNkELYX@1kY+$Y[Qp-!HLbEHdXh-Zp'kXDHcG@kHp#p@qP+CX
2)$5BmL[cLa$Km%B@,LYc!Sac""i2X&VeM+K&9ePSfQ5!b"+,-i@UhZ9Y&k6kfX&
HVhY&HCdrf1Z[EP*HHipj$3Kfmi,b-N6XaU2-@+4AhK5*2NI"94L9CPH,Y-mm#`+
L(%j#+'Gb1FL1F*+1#*m"YJ0-6"$kJBm2BC*P9MPP@f+3!0i6PZh3DRL*#HLp%G4
6H)2Z%T61FK9FaV[S!2F"8k&M'&0pij2K56[)pEZbp96$eamA'dJi5k`!i64KdRC
KHPLX&8A4RA-`f@A'2,V4LZblNX0r'bS4jXSJK!Cm*Dd+)6%cdYm"B$$+(FU`U%L
Sd,3G2qD[ld&&D'mK26reYf'V%[cC+A&G`dNfjpP"`VZd1EUH!rZPcC%2-DRk``%
NY@!1N60r11#cdl&@1VE9D(G,[2#KNp8!8+dec[H1)m#f,mK)9UJiN@B5RFaUMRH
)&!8RJ"cM[ce`@jMDIm8KA['U1!"c+Lh@b-$BY&D5QBf6bGf&mIR8Xi)C1U+N(Pj
QaVVbrpj(XE'Lk1le)J3ac"rMFkT&FUkbFL%dpe+X@Kh("j-rh!l09FE@UBYk8F`
@Y"Bf'(&iFA*[I5LrAFlC`+"@4r2"@#KIMPY9*lTJCCSBAZFLYKM,QcMFi)+f%,%
P9LR5+[mArbrb2rJ[HXar3H8r$Im&m*pq80D#&*)PZ-q`E)EceF2i3p"#MF++*&K
3',6'K[`2Ka4$V[Q(3`Fej"fFfQ9$rLmX1KQj-GbU*1RU8MKmZjbZi-N2B`[ErZ%
3(VJiM'2Q)UPf+F[PY-'6[idY@%1@@#`MLj22elHeKl$!b9fKVRH+M8CD!(&T&b1
ULfr$NQkMkNa+Q!RI"X'H!$4AEM@eN!"UdD4b'e#YUCDrKUA&kKDdLb%eH6(+DB,
BZPKG43!X6)J#f[['J1L'FMZEh5-fGKla1+PcVD61jD,1jD21GCNkPj3A31iD`GM
r'fm6ZZhrpCmhcP2iA9G$UG(rhbq9G$-VMlaT@[#SH#64AEcLN8FipIl#hBEB*C5
eY1fTVDSN9j!!bH8`M'6d$I4B6Ub'ZE-6BH0LQD!#-DP`iQUcI!2aQ&3RH"*KaBp
*9"BqNaE`F",@Y,I)MpQ")hS[*"Q#X)*XF)+5EiEja9*%iPJq2%Q(4p@S)bjHdC*
)mFGlerZ5GJ*QiRMY*39ZRN2ke$UBmL8b%8B`PlU8qYR$CArj[591kP)&MYRk&bl
(BM+U)[(iK6`Q)AH%*h2[bZJL#R$$J-HVT1-"2R`AB5f5qAM*6-k@FjbLrQjHKX$
ZQ6i1qbU2B-UhJS$3GYjR0Z1-4%!CM,h2C#r,kD!r[-@Jm3S8LYf)%qba$#kF)$i
a@q%QZe*i8Tb8BlG1I$b!`rrJNp&U1,$m!H6-B2)'NQB(J8VbFDU-lJ@Tfc%CI2i
qJ"QEFHmCK8Ai*bEL%f-5VTdE!Iir(-F4A"5!22GX)bCh+K+@pV(B)ebJEHH+)U6
%bcM!`T&r`*rhXrC8(Z%9-l6NY-,1-0Z#2jYKJ6JX9q8c)5@d6Jf(SNZ,3P$,pki
RKm(e91#M91$Ab(MJk%FG6-Upe0eNT*8k(`!)!!hZV,hiMaUA3"jp@AY[[VMDYJ5
#hMD$JaN#["KppA2%S0ihlRdAiIL`RF%j!(PKB`BIY%8'-R)iC))1m@EYMRaaa(+
`3kU'(&)ep""CSQp%[TLqNH,)N!"$kSBF8RI-)@[dMFJEk4XTMJijT(E))E9$$P'
(lB1N&5rbF,h5q"!@L@GQdF,*jYeVGp`(M*NK`i6EbhX)4Ga4r%49!iDR`8#X3df
RmMRGG&KN0L'bLEhV2GDCTB,FdVle[[2HddZakQ%lILVlmiZ@e"JE-%,Upf!k*A!
L[3R6+'Gh6rcCKcqV!3[Zir3A-j'aI@$I$R'B","P$ZTU(iaU1daj(fkfrjL6C(#
[4,KE$rCK'F,Qe3DkDfc&lMGlcc8a('K6NkPEV-"mq6-5F0m+0FF+T*G$P6h-V2@
0Jeb9-3RVRH,1hRFHRqhZ&,Q$PQ!c+cEJk'PCZ9rCqM8%IdCahRE1paSZ[U+4ArI
UhB%2KbYI91m3e!h!J+e%FH[G3)%ESUN"T6-NKi2lPP"d'R8#"0GIEHC1J#*Z[8S
*dmd0)`m'1abk[L8G"K+TH+i#!+q6Pf9KUZqmFmVP9hYaZGFR3iA3mrI*e+m2GZH
*#Hl1'3R3i#D8`RmR1!iG!%AifHq#Y!+fYH2&59q5!+b6Eje'Q[Bd%N4GaRaMem)
hq#8kfKJ@R8!401('Lm)ki@M2)$N-)'`Ehek-[2UP1cJb1jb9VfiD(Xl,aL9N*!K
kGrPAaKRQGjh2cQqcc(A$c2F!E$K4Q(+Gamf"a3SC'`9XSMBA!XrIjih0CE0b`m#
XYKJF!d65J-XZ61J[rHkXp'de3LM`HR&*d0F"GQr+E0bp#B5kK!Ne!IMP$"Vc!lK
jFA5M@P%)A)NFrT*)5#"*"rI%3S!qe2%(+1B`Jaqic!hX3(+#JBV*BXVqlSDZ"CY
5`$AFrH!3a4HSS8GDBLp+kHKDKUe1beKf8'69fh8iPTAepr,9C8AbVA[9*D2"XH"
P160@A8ANe5`1fQ$%eEAi8m-"PR(qN4,*#Rh!1hlNX$4KSLi5%-30JbjR-Y#RQlC
Za'9mif)c,i&k(i$STMbc)#k'"`BI+epkUEV5E4Srr10pF&H'bA'3!)2`,iR1ja*
"A+`FS!$$UUdjk5R`!RC&GrfTfr4Zjf9'#!5"&eZ&Qf49DZ3"6('+KF2NB@Z65(f
LfQHVpd`'RT'6"+)Z[mj'#+aNV(S[QcDU@5j#5F-&`-"U(kXZBf)b&FPV!)5d,Ch
Sr!1+-p[ipml'cXIbB1h(i8)*SrEB#@D+q$JN6,RMaR1m153%aj9!@S3e$L)J)d3
iI%4'h%3m,K,TZ&+mN3M+$B5Ijcc&a4rMTkJi54qlLTIc4pA049jG"9E`Te*@ekQ
2*cj%kF0)iS0'(kB5(m,dS5,a)8)IFQ-"0316EUNZ8BfaJ$[+)PHE-Bh30*9M"Za
hBKQUlDmZFh5E-"*I%9+mC38(L2cM4Q",*ic1pH[l8LV+G!FAIX&djmQ8,46ZcRr
B-4PNTUqYBe+LD3&8F0Y*J+6a8`e2cE+Dc8PIXa(Rp,D6QF-G2fCAQZe(hS!Dl5)
efRaCkX`'h'[#["'2A,H*0L4P,864bXV4Nk4Yr`fkFVN)dB93)H`b&[D8c'YZk`Z
*08eX!b5fF4,E9"Slh8YLkb1ah5@a&C23(#5dZb3dP86@UcS5`MU9%00!3N!V%k,
**S45J&#mLP"k%N)a%d)*#D%iUCXpDS-$HkB3k'rIF!Z1IGfH9S1+b,YabemHIbR
@HrbETQakidJpLQ(HDI&hq5C5YpJCGPSFmcIi*19DBk2$`YdH$A5d+e*dCE@8SA0
5hKHi%`N)$DU"fF@`Sf2&VGX[8U!6U5kj2D&!,S!S[P,MHS!MV!$p0#Cb`U8E$MP
`@f19mh`R!p$BiPKecHPcYR1@PZTDTb9ULGA'BVLTFeT!E[)kZH%YU9C5'I'$GIq
K`$5j%*0$'#Xe#JlXF)+[BbGilhCQPa6&&dChBq'1NA$$*0BCp6)FjC&D))GeFPV
J#Ved+R09JH"'M2--lL3H5!P'4(BUN!"Ga9%2!-+50m9Vj4$V`5lbmRlp)TliGr#
CLXlqkl1a+P3Ia"#J+KHaR3'YPbfZ"`3!#B$`Y`3(TU9@6#,(h1Am5%PiKVr0iNL
jG2J9c!!*#a$6j,cB-'!VrQJeHNme&DkUdD+(#'BE"-`iL%*6)c3a+5ASc,3a22B
PbA&Y+38G&qPeN4iXa8B8f0D!-PE6i5RmM-P-X38X60%NdX-Eeq,5fdieI(l%p3!
+3'UlS&,ZFPHQ(k[(04C8j`SEYpcA'HD#LI4MGKB**%lS!J`HF,CIM(c5c5iSFT[
KmQFLDhc4rJZ1@fL3!14Fe6lp-a(i)m''$fMZma$!X88i9cdmmlDiq'0p-%eHc'T
J"%dMVXP94Y)cJ3FJ`-G@ZYK&If(QEDLm%CKe-6i@k10Y2$)DDF'(C[S`Lq)CjB5
DMddM`mZVEG`GBL0hpXZ(U%(23hd2q+A"Kf9NkDQ'9mrbj@-ME1UmHFmBMXh)RP-
0LcEabRY0pKMrK!H3!'V#6r,ACf910Z-R+a(mmI%ri*[N$rJ&(N)(dcrET3mrBAR
@$k2h653fQ($aMhhVc[l)'T!!EAEd'h%RL@b[TTX*ZYQAiC[QliX(i[6a3)&[5Kq
KMdXPFK8qYY%$aI3!Urm4)[[EH8TXEMNpi+-(pSL&N4E")Z#&9l#mG&1JQaVPS3m
9Ck-4pdh45)TZcY)0i2jSQ-4D+TL@a[B&1aQE+5##2KJ)8XT1,,,j6Fm!')V9c!D
MH2BCmH*mfcNQ3!D!mpL"YJZiXCpUf,pG)8BbXXq`-aaVf%%QhXm`8AVraaI!&Rq
,a,ZFMm1I0KajM4d0%5kXaH)H@Zb'k5r$KEIM`Xl#I,5G`38'MJ!1f(N5PCk8!#B
%d)#(bbNCY)H1,M[9F,L8`9ldiLj5(F9FG65Hm,,5ZMh,m#q+M"fApKQZ,$X(e@3
Y)-6Ai)#d`aeA9+5SHLXhUM,Xk$3Vi!6aIP2(N5B1)*5+(AATNM9$,Me!KS-d[@I
PPFK9M4FBTV5!FNN8@Q+KF)(HA)6&c6Rj[B(B-MVJYci00bT5$J!CBXXm[FUQ*NJ
Kf!(LV$M5a%R)f'SR9bRqibDU92a+T+6qF$ffbJr'H4,EJdIUP%HUa%H)@da-46@
BZ*4FYepF(&0H01)I4GG+)6N`bPhVkE8Me,@8VTk#8"HiHcjpIH3"EQi2G[@RVp#
R@G(4Rli*p[*CS6DHIQhN!4089%VeK)QFrPCY9PJ9UTbrb5I)l%j5D%P54$"AE$r
%5LM015XVQYH-lfiQ0hmNZLD+M'AYXm0--KZlI+1MmHHk'YURScID#i%YpcQFJJ+
)JjJ&RZrN)1ql+!MCkIK!JKaSep)D-jL+Qr3%0eMMC!0BT`Uhd@#CRF[-EqmZ-PE
Jf0IEQGK6%*'4RHbdlV1+CQI%*,(,#P,8j1KK%3h4`QN0MNbML*+rc[BIh+-0K00
HdJDJLP0rrb@T2I+'-9pN01+5Irm'$JN2TMHYeXbJJdLF%N!6cfK)A#RX3fbB'AB
dV'290HXrk4Y'YkZLK-[M)&mQ1c,pp!`r9*!![X,-r)r3'%&'m!0J$$rVC&$PG+2
'A9abUM0CN!$qGTpeF[lB5e9cBR5#5D$9HSb$3,KLM*2mR'CepL,KC#rihDf2f-i
J1G4[i36pD($[Ae("2BALVJ8$fPN)l,l23%3fhRKk`Fj*bmE6dbPkU"B22DA1)J3
-([i5&ElCH2TfUE(aF$dA1GmZQ%C!19SqGf[[Ai%8$MkHiF0Qf3fT4PP#RkBR`$c
H3P1('PULm@8JY+Gm-RB*NeV2V"(BV3Z9`EUkU)9EIhQ5839`9ZpQ3j`Np`CfTc9
JHGhLl)9,CafC"%bZB$**MVE6BT-$q+L&$k#Q0IDh!%RqVMa@4F99K`URBPmhZ#'
)51GAT6&Z"12Rf*%IE"l%ld44CiS!jf4JE$+,MM-QFj41Vf%A(fB,@9JJ!*9`1'Y
f4`lPlrjN)$$H2Ii6&$Q6Hp1"*)e`h5*hXNUp@4""J+eJNbIqic+Jp0U#k,E*JTi
%2N'Ar"SE&l0SSQ'(c1RXfUQ'hGFTE5jp+M1jB,jlM(RZf&kcm4bFKCMmY),X!*,
Z[m!92A+5YJpS'edqTaU'[GI5f,(!"#VAfb*c#0TVHdqUZM09d[%'Ja`)f9Ib9R`
&e8`FD6lIbFFU&di0ARLfR"Jfh9PJ$j[V'!S6"CQlM),%JaP$&#DRjQqK+2I3CkI
"$NdS6QT`c1abH+P%Xc1CKFT[CT@IlKS%80+V&bme"bLc5JDqYbM*GM6HZFF1)$F
Z8#-YJ[TJC0Ji*p3+qHbmJ'$Kl"4La6@+"[%q*cNaf8NJZa#bl,SB9C4T)DH,T5&
1c8"-GTmlkPK8)91)8r@fF60KT4(&(M3RCH9iRpe`6M9XfDQ3!2A(ZF-FZB##3#)
KNeHG9$aQ@hIMVGY#MIp#(HH22fa5YF8IrUBEQka5#Vf9#Xe-#$b9%%ila)fAMLE
a5'1,6%h,kKe$!T3k4Bd8CZiY-M-mQQfI#@)bCVCr$f%b8-D`RNCJ"bk2!j9YjS3
)!f6$`R%fdYE13D[X+H40K[#MF(`6UGAI)BPIjFG(MrM`+$k8i+%J"&@ARDF,@[3
8#$Q9PT,+-0PCbpp1$G6KC-EZ94@IqTSAdFaHHShlrPl2*89`MkX1GJBlKkk+iNk
GND95G6R2pjjIqDNCafAqACJ$'m-RYpJ%0PKmKF9ZjD!lRT`ib*-b4f@%+Qj4V61
!CG@iNJ#k$b0"!fki(pElHhd&'+&*E)IG(9fdd%(8J%ad@X90*6V%1DPH-AjZb*L
"-XPHPQ4D+mMJF`DT$j!!r9D3!2e@JjZI`C@qf$cb&c$kHL-2KT1"V8eUNJ,)H[c
CT,J0@D&!'V(e(P6e2@bYKa`)0(F@@e$am4p4+0Y3q1bUjX6"ll-#SqkP01FRaG8
M&"FB9ar)ciaZX-V!!qANY$!@fi3rpAV5(qc(2k)*5b1(K1KkpUZQiJJlQS2,"%#
,QYKl!#qh`d9e6k`F$VUlBQAXTKXV`FZABc9JKj)+)bBM9BEGB@Qm06Z!ier'Rrh
iXiZ(22JPPbiCFZP&[M3UZ*e)bm[0k%l@XGKl'c6IK$m)-cU`!Cma@6ecakpjV"X
dMhdii,JMQLk!29hfh@9`9T)`T4V2-2mdBVNR!i!l%UYK0bUJ%fp"3I"NE"Z@#LG
D@JVB%k"EfGjaEQbV-P0EhJ[3-fXHr%'iL*I"Q,E6aEc+a9lf@!qfS4N"R#lM8)@
EM[)P),jF)Dih3BZcJ"F(!rIBqj2,53Q9%a--S2,hCrA336*lA3FeXe`S+A@!c-p
%`iBbd5!6+X+C8$JU[pB["'EB(+cDR1dhSSPIQ@mr0Y3+0@3P-Q-N9*!!!49N#"8
8U`*"i6#U%XelDK`R#rB0YkEPZJq(++,eZNZ9mB4XcE$c#SFjkiP8Vk(ZXUP)G*G
f8SlY`qm+Td)m8#mB*466qmD8dPe@(+3l,+2Z))2IJ&,*+PfL8CA"$kR46FYP55c
3DJEHfEa-miUd5X9P"%'*V[C3M29#jF9@&2*aU$FP!GSM'V)5I&-JD'k83,PAe$i
kqK-)G,9kGbB)eIS*rUa@rEUD$*j59(iAZJ*)fA5TlTS5h(E-+cEaeH*!0D&@Jmc
bIq+K,Z(SJQKDIXm'fI+ACf-Y`Zf3!!Y+8Edr`F1V`AUecK`(%@[4L4K#B$"35&a
F0q$!$UBhMpHr8*S$l)2MR2Q)$HPE$3d@pQdB@'L&3e#SF@$D2JVB"Sd%DJqea0C
cBU$"-YKB2hE),hfD[prh-l$*F-YCbF89DFKl3ZjS3plh'LGjB(a"5NdGS)pJV@)
(RZI%l3'B3BUh`QNVmIP)#i%#YUa*DKXTa$24V#!k5c$a0[me%"XTpjh4Q1hLC21
9)&,0B@lmcNe0p51G$+RZ)`G,9%Qi@'ka2'TMU"G-Aak,3[ma%Q[cK9pTK9Z'6@8
fG4QF!(k#5ZhN"SG`ebYAYcQRHUG@YK+TqANDU4&*$bBfi9F#G-!fKCbFb$"%h`B
ed!Chr9*e&@drJ1h(HA0S2Y4b*ST1cc#%cArF9q#Q!Kil2QhL6fHLa-6q0VC'6G(
d)8aP*+@SKBd*T6#MJpj3!ie3R&P5#cC5#lC6$ErV8paCem#a(3U531d,SQ0`1P&
QeG1+HYLBTKc%4Ar"&j@[Ni,B+03$#`A+`FBK[mb#LFaQ,EmjMJVX8K5%SCYa[q@
&&)A-r)i2+S'kq%!GTD5&k0ClU$-2CIc+-#b(93GSq'MU(,+58k*VKMDGYeT*GCL
N1P)+f2GCJ(dq![Xq*d,RRlSC`J3jDZ"dTQH!`Z-"J[YHb349Cd&6i$lHX!li14@
QdJVfVph4`H!H3YFG"`Ih)MjfNLf+f0Spi55"e0)q#-la8$'mNBma!"!$IdKZ23&
ff@8)GdFVU48r`IXA4A*IEQ*9GI9GqDRLNTG5!'ml%dS-FZ%N5!LX2K[!**+Fhm`
`SFa`8i#@2m[#ZVbbX1K2[S`Ch(r6X(!-#erjXbhm5Ufb8(%h*4Jk$F$)("c!d!5
!BE@Q!aL!`T5QAM6ib#LTNcBZ3JMEcJkDibr*F'`2#-2PM*m(eVJX1@61"2Xle$%
%[-G[6f3#r4fMfR0GMQi%Vce)KYjA%U24aZ1ccEQ!SiYIlrdVrG@bMZP2M-$K6RE
AcXih(Pq3!-(Vh0%EMdr,S+A!#K1*!$53!*KJK3Ne)B-h@Ch5i%ZRS1$,&8@&S@,
81#RlFRA-r`5'%FZ`'UC$Dj8M5j3$kj3$kh$J$[83&&Bj+KAAMf,fL#j#UM,kZZL
kZR[jEJY8khD`J"C+RfK3I@!Bj[LKi"l,5KQpJcDl`HJ!@Sm&P#C$1&3%2FT'Nrj
qMibZj3eL5p5J60P5&EDdPpe('`F@RX-N#E+amjL0+5SmUK"FU1A`d+e&GY(@JV3
e'c8Q!J0-`UX%DE&"Y'EEp8,qSX`&plic4(bKrSkF9YlYk0Vl$X3A1R`r!99!I*a
5jpGlhp&I08"mKG!9M5%0!NNJ`-JKJNNJ`)LYcfr%EiE"2Zr!YPb$Mc)XTP4TKe+
mF9'*U3Vb'%bK+VbSPDS5TDUX(PV)&F(SD4Rchr'aB5I4"qcU'&Gf$YAEF!FEQF&
'iSehX*&&)3T"2X@J*PKJpGpLYapHp1Mr[LJcrViTeCTQM+FA`Q3iTfI$MQiMhYL
pX*Gri"K3`N$Fc55RAaJZ9braKd5&3ZRQ-U4#`V%`JZUX6'ce1$ICTDfLb13lSMM
%9[A&[''hA8$cLN[GSqVMF**SF`Ff@-!JD$!EEX#l(HQe1+I+e!SH)#`ECc"ZcS+
`*rSM1*4K%X3NL%N!%`f6-#B"6$lq%EZ3!+%K"5BE'5M%8#hL8Z9$3c4b@,FU+DS
8QJYSB'UdR(eXIYNYc`48-pb`M&8BqZQ@clQLQci"fM-fm@"3[RL"!6mB,,DGG-F
f@!D(EV+Q`8PS20!`dF#!NC(2Z0cQpfeAi"TJ-YK9"HDaB16AIiHCCDF,#@TrV&+
(2q"HGeNN'3TqGC%G4H81JL)CJ$cYiQ'p@T@N-EN([pV*Jfbipaba'@%mA1p12@)
$D3,jfXU2h1-"qP)G%%&JHJ8F3C[eK'(eCMl-CfF9#00!#)F803"@$(G9RRil23i
a9"8Faeq9&m$B[H+1c$&BAqXG,dVpr#0h&J2b)4caM[FK)FShF"E%Db-SAKMG-hR
$J@6Y"@k)J5'rF0Mk8519eVLLMJYVT@L)0A&&'LNZ8!cjG`F0DpDHD[LMA3cHc39
i@+M$je"P&l-*1cX,5f$[Nll(S5D6[Uq4dUab2J'#$bMGL!pBIQaa@-#Q9CN-l6!
S8rN-TaXKk-Pj$%,hRR$rb3E'EBFYY&8AKq"YRBAmXhKBTK$qiEMeISBC21,Q1dK
i6MK`3B-r3D%KED%09N8d"@#Rc#G@BZ0McM`2`BAM(IV4[&Q2eSmIfVDGUM!"eLB
PB0rNjVi(D8d@+hAS'Pdi$SD)'@af-d'U!)'`4)8!*&H[%N#bViF*,EdDSmSfiq9
DmC+KZA"D3mM"3DiB9%Sr(MI@Qh&8-!2hP%SZEX2-@05H5EjSUh)dNXA9imTP,bU
Ae9mLX9'G8ekq0NRE5Ea%3i4U8hNjJdi&3Ab[,h-e!A4@A()AZlQVE@6h,a12Y9,
D1F3#3RH"D$%iB*h8IX"*k6!"MJPA9C%J6Up-SSKmI3r5#U@[ld%L4Ac3)UD&A-Q
aa%+ZPT'ijBV%HIZY0`TAP@eM',@0Ke`2"JXDD5N'MF0S%XS-B8TY*YM(0C0r1Lq
Y-`"a10L&#$l$l%[I!leaK,PS#*2MaB+C0-&-pX)m(QGeiQFeb8TYPI*UTG[jGpl
#Z,(FPrV0JeG@4)fjUq-I)B(1U38TRc6kM@A-pL+K#eDVjdP+-iH0qjPq6Mhc)%)
p,e,LZ&)NkGN9jY-e'0!4$+K["S&)VI%FrrpPGJhjp)q9)4mrp4YA*k8q!15RGrP
fjQdF9L8'2H5&EifMfYT-MPK"X*@E5rS`4+'4p!QJq8@eedJ+9F-GT+PckM)Rmk6
a(AE0m(ZRi'+4JKS"#iG2D&)M'K"0SR',Zj8RR#`MpdZN@pLK!@+jhXHT-DlSD56
'`(JMNDmCjpGrRN@R9$H(Y&Z3!!Y2Z"FBRh%pd"0I`KL+j,2h)KrLc`fhI$BIqI1
CGb0VIiPJY`R"8XUlP-3,4`6F&0(J6I9Jlre)6cr%(Ac,hEi("a&l'BZG54'fHkc
JpjaU#&rL4Ye(#Ii6DYMqbGpj-q0'kQ$#Mh3B[56mY56b%b4`$-"TIBN%AL@ki*G
A+-+H0FlV3c9kYaZpr`5"4pD3!-"4E&rq@N,JI1[6"IlP-!Qm"U"jM6[rGej[lqI
(i5J32RT$F"&RFqbGJAX"J0"H1"(dX+LUGY,JSQAFi&Sa$#N2F4MXc+06AG&92TU
U*%b%PdHqJ3V"V+`'15L8HA[[(Bkm4bD$@a#[&$D6Mk`b6*l)3h#eTK35IIjJjPP
R,j0GZ%5XQNb#C&9LHF[Naq,'AIac'fiJXXeYR%JZ5*J9,[DM@MBVhbJ5EcFM,HK
DB0M5!pAr!kHNEcm3c3S"8qlS%dB)NQC-N4&@#4(mU2lJ4NJ+5F"LbceaCcm4-iG
KFM13!)fImfK&$kRC8`fK@4$5&0J!"bI2AZddHJ@"iBC%22MRjLGKG2hV2mq*+Qi
%c`DRAkJ[l8,-!1'JH+'ARH44(A'KYA5K9c#BE#9h9e`)&Bem!aGb((-K'cTd2b@
e3mC0fB1KK([jXTNAZ#b$UC)'D5&h1%T3J0JrT%,P"*TJ!)*C@mA-fZ!!Skf*)ED
BJ3UY&N2CqN,%'Zd53p,b$lUJ&5+Y)dD+iFFkGdiiF@6khGHqEe1("d0k2(!2'qM
'!!-8d$16CTL("5Y9Ul"5ea0X9-e30ZT+4%eKD1*ZMmPXRD1$$%&Yl*MGVdqRmcb
S+c&06@#DjK5QU@53!%e#4aZm+6%%!pDK-%Y0#@DTpQ$-%KG'%3T$bc"VK'l!`pc
f##@1caZBa93qDr4jR3M&Bh93NCX!Hm"mdMVEcP6hTE2IqKF!p0e-bMaK0BAQPbR
kQ9"$4CcmDX%`"2+Q&3)d!Di*H-9#4cb#edeC6@'MUJEC+$6q60+J#P2%l*`Q&Uh
k)#aDYI-mZa##8D[f0&1$a6$FEk'D)K0#ZHZX',UHNpJ[hND5'6#a%B1'@MCb`Q%
03fDhHkbTGQ5"(d*+119*i6MK)MIUHU!3!K5&h8P1&5LF@"9ZQlP,TK8e!dPJiD1
V@3d&&fJ`fk5RQ)S5LRhGV#K)MmVN1Q94LY#L&+'ILP$M)[322&%aTbQX)*4,@e-
Kcd(c-FbJ09&JD3bKh-m-BHZ3!#%,1"cLVSd"D8p@A-8@hd%haED831Ydfi9-hM@
&`B46l)cXrU-2(#Z[ZQ-!@U'5hrc&iY9a"V`lR`QmqEVq`6G#B"32Y@,bB0%&#hI
'M""[2[(B(*5+Ih,qc3[m#81*4pq-iG-2#P+SHRSSMLB,%0e2UaKFJpTM044EP[G
Sci6HI,hK0#D"0fqN(D!0TSae&crr'aKN0ibPSrMcT`P@cH5"([L"Ef-iepJkA16
&`P831AER@3G'TrSh'+E@)LFVTUpF1M[c,"kkL$qAhE,qmaMFPYa)+,P`!QQTLl%
2!EVFQ1%"'cm,CrQ98"NAN!#kZS`%eh,2R(8H!lDFprS"KD0"`[SaIJ`-M@9Y#SN
F0)MleEA(&f,ViF6D-RhfGP&XMBmKHKSDfB1ZcS0CUFl%BfELX4!r"UF%ZK#''%S
FkYP*Ld&Jc![Z4`963G[F4Jr2XFYYV"@2Ei-k-e!Y%*F)6'01MRrN!EYXMZMU9Jb
6UkYE[*S43`PM`3P5jL%Q*kaJ%d-&mdYhiL85fml2*"EedBZ`)$4(,9ZT[rie1rG
TD3Z0Y)AKSaC'Kba-Zk!X59ZB1RDK2$4NBFUCD"*(VcF0H@fQ(AXKl9Ml8FGH'V,
32RJX$pfqI,ha'Ai4T5kSIc)bq*!!'(b%b9N"+@MiI-iAB9$FE$b9Mm$*`H9hY'r
SQ+lGd$'V'FRd`8GiB'L`KZm4-mcJ361aLSd)62,%!ViVLTZ'JPEJK2$LPCJbE,%
B2T@JqGKM2)"XC1Y["0-"&XG81[hLe@FddF9j3(%Q&!!G3PGLH,`HC+#%KJr"82$
$bb*C35`QYJX53J2ahT6Q#"SrJKQUm[jahjm+0aEZ$)S#KFUF+)2+K0)*ARYl#![
+&q6YLiZLLbibkl6Z*&a1-BQ8%lXRAM@lXm3)c[*"5I0YVaM'lB@1NVX%qlRZ6*r
#L!D[$4iR9lPG4&KGB2G5a"`EE`m*M)ikm)3B3"6X%LVXl8I!FAVY')D9ldG66LJ
[GSEPJc5aYGSAh0UF#)2@%AY2i)M,Dh(RD5XD!TAPj-+$kNGV1,#&D'l-j08F"bE
-4&IZdLXN,iKLNUrKU0J+9TaiQ)FRKU)ddi0@BACZ%deK+XN&YV*JUMe%90))b1B
2qKldYa1jDIIY63pLf!L*dHahBT!!H+KU2`m$,cEde4+#)H3[HIMcLBHI6(qB'C6
54A*TaZ96A5,B,,Kik2IrR2l9l$-9dU,mF`3!`34*@RQ9ADBLC`Al3)0iFbSe15S
J3[cM"K4f9*hkiT2,FPH0d0ZPQA%K"PlUd3GF'U2`"SDC-S8Kmi&HN`IC`(!E8dB
ShAK6QC%(K40&cZprC+6Z@Uj8fMSbHEL1Dqiq(PElVXA@iFaR!2ZfRAJf,jSSdC6
qD4#DQKb@dY413$42VCMDDGU+UC@Q"UDY0(9LDY!dJkQ6TMP--c60BTUMk6C-Xc4
Ga(3E65X`AD4T(Y-+QJjJQUIT1+B$0*h#G*bQ,NbRD0U,UBZQICMfdR3%cQIH6)#
D#mPre6+"JBjR"k5*2hEmXH*2+riB4Q!)H8k5'(h&[a*LG(j'BH5[Xe(J(bZiS+X
EABP@AdS-DF604,Ll(*KFVTY(N!#66+N#f!3`jIS,',p@Qrj#*qZV,deI)E+q&Rr
@-&RRd0*6M0XfhT!!1i,KiElic@EH",p#pql5&rr,YflrkZM&[PRH8M8hq'Y$pik
#j+k0KFJe)%8$iKTSkP(VrRLYbS6@0iH2"K+Kf`kfc"dlq$)Smb"#p3kNZ)UFHH(
+rl'E$*3KNMD[SpMjmlq)-`JqU'"VkE'Z%B)+ULemLHVVD",h$M-Ae8e,0!aQG4G
IVTU6`FhrFEEkHQb%,[mD[dBB[i"$km@KDmF%UmM$i-0T28%J5-%JDDi6#UABETb
4cPkP!AAGD"`$'LhfXI0RTFjJZLa%2+E@1`G$I*!!)`L,P4@Bb`Y3kJbKDYM-5#%
`9C(Pd8e1EchT[5G8,"5L`T*(+X4`2lkSijEbQGAN5i1INGj)'Vd1K%4mL8&QFX9
T6j`ZQ%SMFJG%S6M1FM&9Ab,Q5PE[C9H#S5RLUpBa-@4cA!`EJN4Zmq(l'I[@MX)
p9TI'3)k(!fY'+S@GP6&%$D@ccR,JiHMQ4aUkTXXDZQEC(ER(k&Cp4Lm2m,1X`lF
iUVQ0jbbF'R5E',*ZbJMU4D9XXj**"JVTMY3S"A95A,3!jZ[Cie,l!Lk$KUcFS#A
*!"5&16e'&aH$3@l2k@Q'Uq5dbPhcdVACiM3&bd!K('KK)"mb@9c[&e"E!3`%A#3
kTV80(EI&!fjkB#JMMhm'C&)CBPc,+BRbmF34*M%*MUeI`XK"lmVCaRBi!2Z0i1(
1iQYYjr6U+JI&`9VGNl-kf"JU*[1[dp9!D)%qr$XI$S*Qe`ND3fS`3a9"qI9-RJ0
i#[CFSqb@9)R%PmQ"Tc%2#"iLBXK`jYjMpf3BIj!!P(N-a3CRN!#`*d0Z8QaB*JC
hUZ!`MC-lkcBcV*14Mf(JITKDKqm8,CV!SZ44LaMHj8@IT#fD`++H)[14Md"#5!d
kkP%B'rY[-@-4ZhP9$"L*#JG@8CMjlk+kJFB4)[9[ILjpq#3a1+NZb2mF+XJ5AC!
!d4X-&C!!)%X83BE5"4Qp4!mF)mMSDb4)J%l4@5()k&6L#(Y#N!#Fd%VTJRbeXpJ
m9T!!d@B5C%S(%E82KJT5Zj%3C)N#aBL89Ne#Q1&AK6$0Si4TKaNf1GN%TJV2mIp
NDKN#IP0)h2C!11C-(Mpa%T4p$JEJ'4dUU2qmp+qrBN&9PUB*bJj"i4rUSQA0I#b
@aJqbP-cLUf9T5jYTU8C,VFT5qe&,33jTk3GT5kfm9"kLT6h+dZD$,,e05peT5hY
SD4-YE9@@@Sme5#`9fje,@pU+TAGTBHN,,rbIG-R0e@N,5l'`&("kLrJR4K,'(0D
0Z9ShCMDK*p1019T'aP`be*M&!#8&JZZ-B'+B4`(YE980B3k!G(Uf@llG$VEdkpJ
#"d%KmFM3`8HZ,M,Spf3R35fMc"SrH9d*NeV"l%Bpc3#%H!#UX,N-QSbJG4$F2(q
D3CMmj#N#ZeVGKJK52#bB)!8G'KeRlD-J4TiN&Vq5rc%Y@3pieqmk2aDrc1(F[",
1R8FcpP[6YFYZq9k$)i+fiCE204VXlBD#$a3&GpHl,%-k6*'cp`G3m$aN)MXTZ-l
R0UVaQAYcl9qiaqk$c'c5NGh6qr&3ThKS$X'Bi`+P(c8aH!TYEJh#Q,$(j"668h%
%"J2m33p�!*ddZNUc#FA!86#FmSGbh$"5GMHi*PecqCkCr`-b9BqDG5+!a0J@f
VG##""aR$ba#&b3!#Q6Pj+U3)3FSr*c&)q5'!,(,-J`&Icm"aK3VEFUUK0N0,lEc
`Q`1F$"'AUah&m3hr[*0HTr62rea1RcY%8%k,,26TPE42-cLQGdM9HSG8DiT"D#j
L'Zj-*!H6iKpL!P3Mi@c[ArrI1%5Ji90jdAFSj4BfiQ)S-iCMdZ#&)-(@eQBma)1
p!JJH`lmU`5Nk(,TqG("!0Rk`q+HfFm8pcpIcJ$R4FqbrFXRFmUB&`b*,NcqJH6&
F(j'@&#j,U8&JR2ra)fkiJSr(31C45c!QCE(*rpc*`9kcP46h(2dDA9(b2iI(cIj
L-6D5Plr1S6i$S4PP-CSQ5Dq@YM@)AeU21BD(58f*VJYS!!NbFM-ad8J%$B!*VTL
!1EFMhF50(dX''`1R$m-&!!!M'd&%3e)$!&IL$e80CN3#%#(LlP6[`8P1[0SVZCJ
V`qJR15mAJKa0VH05US$'R#FpVQ!TilVa&1j1M2cq&T!!8XI0R!%YBpfZ'MIMGM*
C0jY*%aX-BXE3@qYDif3F3qeTV10BQf%FkY"8$68(*D,`prpqlrIGGm$KQI6CCjp
jIJ!GCMiN%4![%!!3%!!385q9LEpSDX)ImD0A+*!!dQ%9$PbA,1b4[-EAP+`aC6H
q&NN-HY*%(BLQc$'cjC2P,j9CH`'FXb0&RmfI'"(YTNe@K")E&dF54hV!!N&Di'F
A1Q`H@0QiDk"-"+IX%'@[k@m'9MBYTS(ETXE0b*61Z'MV[Mf')Q+[lL5&IILd!Y1
Q3`L(@NA(eb-8,1SdjAlf'T!!#5$I!-*Z1Y&f,P,da53HD,pGHAl5TH[#Mc&Z#K@
pNfBfQqV%HA4`'8fD2A--J9X81d,2CSipGr@G00DT3qQN9cTj)SP)+6VeS*0KB&j
Ed16q4K0lHU2XkAEekGahdMTH%CfN$1[YGp)LLAe[Fa(S`Y"lQ$+$+qSpr%c(XXA
D$mF-"9fRiqG%*2&JR[90I',LR`AT!cp3iU*fA!+LY(%c"[CJiP&-E1-6pq"RGb6
4[S-qk"*k9[Y40d,"h6R#%eNUGHKFbDFQTPDc+j2UI2[lQjSB1X3@G(ND@k#E9XB
@10$*D@b"BhS2XJ9YiP@fS1e4%I5"q'@`H+bai'5rF-8MI,'%&+bEF+UPBrSS2QM
B2DB,lSFDV$I8BpXM5dq0G3!jAP4j2QQS'(r-A@NciQeTY0db+,XZY-mm-p5-!Sf
%&R-#r)QCXLFQh'25d6J$jE-&Y[Al9Hc)a+irB!L`p,F[l0rR@i)YH*NB3C)AT54
Rp29&kp+M5FQSLaBYqPC+0286jeU)cN[CD@F2jQ4S'I*+5dY*2TXFA56fIJ%2p9k
apNT"CYe*kc#1YFI3BKcAVS!*[B6%8!$-kE-1mm9f($)B3K@BCDH",lCNMQNK`aR
M'@FScM'KK1+)rE$C,C'%f13'Zp+8Q!IXAa6V-JTqiEb0,PcT51m'Dkq%%q@Bb8f
"GU"LEXlJ)U)`1!,'&Ic+P#2mf("%G'XKS)B4BV,6!9+58h1bG9Tk9MBq$k3RCkA
fDGRD-5hhE0fCP*`689&6+AcJB*BZ*re-0$8e+e8CLQEVNLmUBj+U+1LVK(PPDKX
e`[QJAG%&*jmh1dL&X@%VA,@N(2GB&DTU95ia,%&PX&KB#2$!MG144%'f9LMG`Ke
jGI`b!N"fI-50TVPAKB88%[G+ch9mRIiR05NXD[-3#"F("jj%Z(ahTA#!6*i1G`C
P+Q9)[k%&@h-XV645+-K$al!1!qd!mL4!eK@)LF-k4+#8Cpd%GF1!Kcmr+KdXCY$
'Y9T6lLm@+X1QT#-#ReZ*BH)MFKDUHH$i6)#Qh(Fqa35[!@U$%+LU"Z+L+AG1+6i
14)VQV'@++!lGISGASfD`cMXR6,Na%cjZiSU)dZ@2i(#51U(c,0la!E$C"[C8Kdh
(@G34Mll8e$6263q6UhKJH@"aGmZ,8*b`i)m$'Aj*C3'&!B,8cG"5-kZG)Z&9Jp0
k!XLNaP[jb&*LqpMEB2Y#c[B93$4,E1rV9GKHkRkYQ3+9PeD51a61L##BIp6)VT*
%b(b+#B8p**!!C4(V8e"f@8K!N!!lp12IIF(FTBAL3M5MBZ&#VKrA2&c)2I8,ZE@
AVT!!-L3HqSH(cCe@5mIA1F[8,5#J1862LGRS[$Sqf[%q'eL2$cV@3@)"%aIb@+V
#*04C#bNZLmYR8b"fNY$fpCe05STQCfK*@5PDeS&N,FZXTCl0eNAp&PR-1T0P2X0
R+5+Ej&1bLi5hQe`bAbZqPY'&T3HQ#kT!0c9+f8P9(6+L%3&3K`aJbCL6!ab(QVN
aC#i2D*2"J!63P)cPi1aD$A"@S'BX#FURP%(Qi!*LLekiZ@R`3d-,$rR3iJ&qh9C
TB43EQc2(-VSfe'jXMXk$SQNB"9&6EZ#l6V%cFE'$1$CcF(kI(N-iZak95d"1ieS
FdE6a+'!N`8mEr6m"N!!*SN"abia`eJpbKB*KRDcIGSHVD*f6pGY#USTipfZe"!j
"U,@1f)P!!@"+0)k-1K4e8iCFlT5@A%afXiRh8$MIl9BcSff82lA$Q4PYrG@HZKG
SRK*+aN#)CR,%bp[S`-)AP!00SdN&PPF8B!R5cB0TUkeGr"*"E%rLTS*-&@"b%9&
"CkLC1ZMD`3CH--%9'`"+4%'[G-$ZS4AhVYdP3P5kDYP(e#e65&1N*Fpq!eMLGHG
&&cP,''mUeI[YmDC5)M9dlGbNSPla0r`8`1+(I2K+@,"pF#m('kjfX&HUEA@ijPC
ap(`RiU,#c$F4EJNT"3aE0Nk0*KdmQakY#6QH01LSr`'jZ$`a3J,Jj'9@TIdQE*@
fbmmUEC9I9CS,iVJ'i!d'2LHh$#aIYTUUYaG0`NY!F"(#pJk8Z'5,#mTL8)J3,9#
`d0K(*rZ)X)papQ&J(hUBqS`ePCMU,-Lq,ejM6de9'jLJDJ@XY!E-YCX1$R"jL)X
SM!,+ml(pFl53!!S'XI--I*iL"Q3N0(8F*"+*Nc`-Q$-@b)hQCUAq4-[*eJC58k,
C1HR1U!k)`Vjk4QYQD8e5@DRb1dL&-$ccJY!ci2PTq0#cMbRf-8%I(6UU&(qI6m3
"9Ale%JLEBA5Q9L)R40,aI&GZ9j)hhj9e!G[Ej953!-qS+#Jf6DDJG8i&q6TY&46
6m1a@'""UZ['Nip[iaGZNLcI*,VE`LdX`BC!!A9b#RdUCiKYP&k2MCc[Si[c&3XX
5iQCe0B3!bV1bdhaIrJBBSF)k40N1G4R86rhSd*TlM!%fbaKJ)kXZ%jmT$"$MK86
R36E*$N)G"b8'!32F3#9A4bV0B@@Ll1L2YFX(Xp)rd-+3!2if'Da-LpEPT#46,5L
E@r98reJZ*cXR@Hb9b4V[bjc0(S$ITiRd0dJK!Bre1A'5''VdQ(X-aR2(-(!-aFI
l80#QSllZji6f9dX`U1'R$`9D0iUcRC'P)`*Ch!F6+T'd[h[Y0hHJN!$a$4(K*+2
H90I84)C0M6XK6"lkS0$%R6ZXB%V$Up'e[@-'24C*2*HC1BD+BIHf'CI"4)eEC%b
dPM+[%8cheGP5jM@#14YM-ZCFim`mhT%UJkh5aEHhFN,9+#fR5Sh#1p)N3V8Bc01
#ic1d$i6qDmef-9PVVSJIBYd54J'b3,42("(H'fUhHhCTSZ-6)(rf8A"a8p2N,8`
Xr-Y$68+D1MSGKjBH0[#(4G-%1aJT-k'pH@T-0FAbY3eCER5pD6rHHmAcTCPIF(a
Yq+RJ-kXIp2kKrBmkrh,V!Qe4piZ'ZFEhp3q02MGeHm3kmDY(IRlRpbIrl-Krk[Y
YrlH2l4mFk0Khk*-,ljSZKDlfI#Fbj[lQq15jEqAp+222crqr8rrhf62aXjI6-k*
QhF@F`amFc-h15[V[U5R*"p*qA2H6%hpap,qprFHZZkr@0YqlqIf@2lRedq[rjBI
ripV5kFr2q*m2r21drrU$Irh`lpllrr2rckIrqq0rI1hVVlbeq"Y[&#ejThKK`Db
Arf(MkrRI6Ib(EGrEr*mhr@EA4l[rrV'rfI(AfaqZr0fUA`5@VAKKhFmfr1hDIe[
cbcfrI[bI5[rPrPqeIQlR[jGpqHQ[V&qqmY'+Vflj,&CHq-@5PqBec*l6f#6*39B
DDV!$f9V'!9l!YJNhl*fYRHBjSe*Je4%D&AI!d$Fik%Ld[qdH5a2NU2B*AJa+@"-
+Dj+BEdR9(aD'U4ZKHm5f+,kZEEI8#@rRj-d&)*FBUb2F0,iBPG'S'1mjM*XZK1k
H'M0lZ0-'3M04i"iE!9*lNk0$SEYQaqeh1D#,8BGI$EV(%#+pN3m$cc4I2(Zm&XC
2VPcc#G'1Kl3ENrGJE**h'JpfZ-H-p1#3!1c"IFi(*`)JDILejX9T)R66,*UQR)$
YUr2C!XSBf5f4m%UBZQ%q6(Z11)XV$B&)iJm)2+f)5q'@KPDSY!r!)kL%($Qa4dA
kGZT1)Mj+a6B2!JNRN38R-C`2aPp,#`Kj1lTfbLBlN!"930&%3jGl$02k-0#(D5p
M@L@kffR!#A+mSZCJ1`eDE!G6M`IZ'Q''j,#N$K6I*GH1H69P3QS+'G3Q(Gr)+kb
0[-*Uq&3'E"B6X'QSM#5@Aj1!68-PIYk3!!'Ea8jJ`cYk1E""%980p$NL5ppGfG$
klPFXG[e99%DCXX0j)dXRA6rDG%Jm-bMZF"0Njm4JC#P#9f3U)ar'&$d&K5bb3@`
4caTX,`kK-+'E3H`0a$L1YbQ5H(3kI4"EM#6BS@Ri3`S"Vlj2fFSZ`103SfDV4U2
JQ9i8-r0!`)L1e$9I9UeZiqVD&NQX[mc8Y3dr(mZUe4dbGD(M9jlQkZ,Xm0!TKU$
-IS`YL&e@X!ABc6Z6,F#+$`BTM!jfj5CIf9R*fPQe5Y38X"(03)`b0ASfGfr!Bpr
i2LhpBM6pJj3$Z9TZ6NVZfH6dLlmP1Mm*e@l'fH5c@Nk+aLT[2dJi%-TV'1Rplf&
*lc)r5HqBAk6hI!$!5ZZ3!*'+q$b3!%j%q*8,)#%,L"6ZEZ'NpMlKB15c296V(M-
6LEDU"QQ%D[2Tpdbj$5f-p)0arjHfXNaFCd[k2@fN6!3"&T2),NCfJj!!i'4ATHc
bh3Vjph5(M2`,b"KNMbhjpqAYP,K!)EYak#!2VjKH[!K,B3mY*#2K%p(8,#dV&D5
BlQab6PT8Zhc!E)kQFUU+++81[SjQA-T'GNjbMT!!afkVc0",Br,FV8'%eA0hAem
pSkG$pZXTd``Y%!c+kKD*Z$rq+52ZHqXMlVNj-#IZ89%ilVHJ5JKZG&dHlMk-SF0
3eY#R)h-2NpVd3&'RDme@!C5G"mm34QD#lL""6fVL)Zl4@IjfX3JU34hR)8-B0Jp
cJlqEY#$h@&*62$L*"6f(#X[MF%JQd[)MGQSX511S%l*,1Q5AC#!"8M"4Qf(8KUl
GXe)icF1,q$C(e)X(-)@1b%0YI)1T@[(GU1A6NIK-9+#phFH(edkkc21k"l!&ccq
MqpTDHUaaJfE*"0&PFCTrjaB,595,[a419)YRqLHUaHeqLHU1qN69rXM!mK@Q*b1
U1f1fSRSmQBR6"PY4hAR8Ee&p6"(9RG2#L'UTVDMZe15L+KG4E#4iqU)kaL&[2E,
kq4"@qHe1DC82RkDiVM"9&pHZ@rk*+m64`B@e@DIA,0GUVF6UGPYfKq!kN!$8L)Z
[2-M+Mm'CTfN*U4K*Cbc1#V`HNE9cFAX94e'%&!iK%YUD"b2Qe21$T@Ym@Jphc(K
XMdC%@r`)Z5Kj*`4NiU2GKhR'qb'5mSe!H)a-$(mH9Jc[q#Q'Jhk*B3A%X)35IaK
Ci0KB@bF-9cYJYKeUeThA,,!`"8@03'p*NJmKhK)LH#")4E&@ATMV*B14qbf[Zq*
GdLFj6VJi&-8HjedXVdXQi#AhAFjVc!NN'TXY,*QhaTXpcI4%lR91TS(XKGRh9A*
+HEabGm)LU00L8618Za--HSY&DbYYJHQljp*[p'fcQYZD#GcU*hSX#jXA(E*Bp![
8+8M@TQGZ#A),'DBX&Qba@q[*E((miG+QlVD&Gp[ZdR5kXRZL8mab'F4NXrRq3ae
dNIk-M0dBZ2T#-4h$G*')rpM6%!&'C0!Rc"`-$,K`dHr35q'r'JkY#p6GS%j#`#D
)!TYAaaPeq1R--54G#[&(%N0,*-(k3LS6V2TGB)h@)3SP)aZDT)-qp5'U-jp5RD'
#kD8%!e,9C&49&))Jk$Vaai'JZJeBISUEqP"b*"QVpM"@rI1`V(VH6eBeqm1U$CU
YmQIHN5QrBQ$j#i1+mPmBp&[j2G6GS%j5P6q6&b`B%*&R3@qHP!9IUUJU#i4686`
M9%@ZPM-4"I0j'&pD&(*A"Hmi[&,@8CB4`aYN'C!!bM,JMm0QJ-[2$,MZ9`E819A
((4&Jq"Gf'9VQFRHY&XSFFfjI9I"@UC1N0-'9GQUXIT99!piH'I"Q5UM@a9%G[20
MJ4A@"IGq,1SN(F[HA0@a&Y4mq%NF6A*EVaX-llEQK#%(`TMJ'HA%)DC0)HQh(J'
,HkL!C+%32BK6FPAUHTpT2L,'DcIHLjEUKc5,-qN2Cj&TM%Aq-5b,[1BRLa6ia5)
lC*R"(,5ampKi!6PbhH'bSS"P49(Xh0iBK"1k5aIP#)Z`S0K[dBlVfXDA+Q!2"LZ
0NU$i&%IcIEKjKb6Q!$LF&bNU0r*NX3hNp#T[j`%AMbiT6B!J,*3'THf92c)1"CX
[)$M9`Gh[K!`bj%ae#'3M%PN@PEH&"*%jZTP1YaeGM8I[Fa1Q)Ce(Q45EIBSC+r%
$D9VSe*KaJ8`j9CLkP"raap4&d*'QR)cPi)aPbRdG3BAbQdEZ`#aR"LlP*cDkh'-
CAXQ-S$bC$@FEN!!3'H6f-3#`QE+J1(q`r#+kpI)*PrQ%K1LZH3'44H4%p0KP4cP
5ce(bk!K4Q09S3q-ZUc6SCLjF@S3-*M+HJ+YA)rGZq5%bNX&KKVNTQ5)@h*!!6!+
PjFF-,CQf4Ld`#D(+Ad0Qmd[bp!*L"IGqqNNbVH(2m#hV0,l&+KiC*h1!lC5&@Jm
U"350eSc5NPpcA9BYH&M@p$L6M",V5`aTC!*5ISUljrAND*F'ZSHQ8qC`ahIjHjQ
5@84#E1"NjT4c8SCQdk@SI"UjF2X&lck6$L&R+e+qRS%A#JR$`!6J-4lKahj[kF1
DrEkVY)AqApm5D'Pe'BPd@ihMHY4(L$66Fm2(UdZh9jq`p!d#Yh+P@cPB*-F+a0D
aX",%llA-PX`r@9KT,Y3ZkFp80`,@-m#(i`8"pS3[aVG9E"3*1"JZpe*4Z"KQ@aR
-`-#hKaI2@Td'"VkGFJ1$mXA8p-H+HdJF1,X!#VZF*bPXD@@pQp83$V"mVS@#!FX
fkHhD)925+C!!Q438p$e'Ph)`h+YrIV`fmcS!EZ%[FCLim%9ZBdT6$-&Z1jN'`pP
I-6@Xp5#*3da[[ppFHThqAhppE8YVF`LQ`HDfSljY))JcZ[EFh(McmMbBq(6aJhe
-$@X`Khf3!)SrfVZQT"jKI42&p3,e!%KQSGhiTNXrQ'42Z,#mU9N#YA6S4Fpl"!P
3S0Qj2'Hcc,0CCYSXcpXX6pNXRj8YhE8EVdH[afI+RqA9cdS8hbcjY4N'$8SN-Pp
5*#Q40Y)[6%Pf')22+H29b[G"B!eEhq3ERmj$il``B,LTK0h6SYbB%'imQ&!QfpS
#2"&6!+Z(J`%R8hDpU)%KjcNCNPHFQeR&qA$BLV25ciTcV9m9CePe8Z&Rr9@6#Pk
99+#L$#CeSbLcP8"DZRI")f5Z+A1E!'#G'SZ@b3Y8XXffXXeq0HaQYrLjf8Dr0PZ
L'2XKQDiR&Hk)d+[TlGMbZ8"aTaKR4E$HA`QIA45r'YeCMF56`'DL2'eJqCS%#)I
&h*66J4plH"+$GqA%ARP'955'+AGKVk51K3q'8mG#VhrU@'M`4afc[6)b%K9T4E*
#6TSZ@M"3EKKBrNZh9*5a1'MKEQ&,Hld&QL28DDlD'CpfUI"#em9Q5i4@qFDU#bp
1SYILF6,5!V8B8Z&5(jE#Gd1failY$09b3$E-`LA5Y+05T546p`46plI$U[ZBRqS
1qDAZ6(SBUVRP$$#L#JG"&BXlYd!"V2*YdU(&ZAV9I)FZ-E4`)L$%Tb6H0+Y,*)e
CiDeDaG*952"`Q%pq1h0X[m!#PHf@NSN&+X,-%$"hfp)iS9ERM5X9-J*)1[iY*,%
9E)&L*)`2d!J'L[MLda&8N@Mk"+jf%*YEeTeFF'j-Kc"RidTCQ21mBNU`$'6qR'R
lKjJa!CbK,hUj14b&1XrCQK-XSf3p@rH20-k6$YZeR3Hrb15d9b%mdXpQNdFU#iD
QQMRR)!pYAX!(6-!`GKT"c1qF6EF0DN)*MjqZ%U#!,@LUKbqXrI[aRr3(L28R&h#
eP-V8NUqS*I#KM9U3!)5rZde9bdCEY35i!4!PC'&U,j68cUpr[-Ee#"N(MURAPh#
$L-5LMpAVAjCGMmkrf-@8ALJTr3D40)NjaI8S24hafq4S0E9,Sdp%mH'cp)PI6SB
,XNc&"LdRH3!a@4%)5ai*"&5kjZ3#0U32lF[N,%h'h+TkHa5R`+T54Edm+)Q%%GS
&9Ed4@mI!UJa5,kY12089HM!VKEC,IY"U1bI8%pciHQAM5-ET3,"d9(LZi5"'3Fe
l(16*F8%mcXj+8e3ae-0"!lR+HC&R5bQBc1hCer4[A"RVCFT`+dk-hke6P8&ZM*@
4a))q94Q(E"dC[mXNC9"!GaN13Kq+3T!!caN5*HE8!3eq[P6!Jj!!-*[RBFLMNN+
8EEIP9G[f6NQdE$BmVQbiXVAkKVH'`QfimU*m`pc9S,,!Me0c)%V5RU80mk%RYZ%
YDQ@6m,Qj8IS&cU$e''G@GXSF@c"@@INKFciGXfAJKcrQQj!!'NVbb%hcE$PflqC
jeBr,+qXm9PQRKkfX-rbXV*2mUUcVP+#2YN5UQQY8`c2$NmJDEckUq&SHM%TN"%F
,U[4KBL*@[Dq@6d#cAQh+`!5CqQcLclYN&a`ejFk1NjY#ZUcT@6Fl2JDZ%a)Q9,N
,dA4Gdb%CkN0T'J,"Z3YI)3H4$2N'3lCKJFBRQM`+%UUBB+TSF@kEAe2RSl"bQd)
-Ldd$brG-XD35`IT*B1V!JV#2lB8%hXBbqUr$C[4f2c0kJemC2Ff'[2IbC%mmH3D
)LJ#12Td&Flff58'UEA#kXX%hQrHb`IYXJiq'h@#&RaZFlGF'Ae%25`DQGM,,aJH
#I-aTf5BEES2E33)-R5MfPr%ND4,+SU+1!,9+KV+VU(0![5a$1948%P!ri'`QS63
9G4dSP``eU+,!USeQLH%ibU@LN!#)Y,'(LjJ2$E1@-[Gm+h1dP0%(&$#rRUa#Dc8
UQ8cAp+P,HQj+AG+aYUT,1Vj$AG)ffp3Pe$%RTLkKYMNlH6#1#+-pM!LIU0G*YS@
jK%G&QGQ#+Vp9GIPibHAM)HGBlfAK-dlmYUdVdS!NZ"TD-mJ8Pm94mB!S&T9L*e,
cVNjU3S1@T3J%(CT,66'Ld99qTI$GiBR$YT-"Vdr2N@dUdXZ45cM5Nq4M9l5KQZY
d(Z+FLa$F!,J-U#1bicP4Ui!kjd5jRDLAJ8TbSP)GJEXUFKU3!0GP5%e&(JAU&4P
U8%9G"QUh%p9&#P+HUejj(9-UVlq2b`cRCFE*`QeEHHfQ`0"@+A18DL[P*lQAX`k
'XI$qcVN,hmR+L"lXkp0&r6$dGJCH14$81'(T3G#UPE*H'd,LY&&4+JqB%KZ(`0E
2bUX3CKE!-ldecIF-08PF"J1"8Zl#pTQli04[M6[iXXeXeiB#,K!8V4ZidFfFkmk
ZH(k(e%fhU30-!61%9PX$)dB1!@'QUQba+&@D9l3*kqB@f#@!9["-1)"@X0SrJ&E
3l4G!fe3MDDkI&6)UFXFLlTBlRDQU3GI`T#[9pbp[c4f3!%)q-'!HeLb6c6#Uk*5
CBb"3%DMGi**3)+YDjm+!5+jDQHT'Q1Tq'eCerAkUcZ5AkXTiSL#qD94CHa3R*Ii
%U5&G-QqKK$aShXlcZ4DVB)Nh&-1N06@)A!M1,K%Qi8lF9X"qdk)Nh&("(&6PG)r
@-")k$`ZPXG5-D#S6-pZ"dc%-fLTYPKN'6D1XcUc#a8H0I2ES!9`FU&`mF2,CZmQ
akTZmLkcfG*HK1-)AjTM6B8EK(1dKi3Qm*4`[BTS'9`fTFD!#!Hb(K'2C08)A[b@
#k5-GEi'd4iIZKp4Vfl@Rd"aQLp(&,rPAISAdb%kR5if(ZMbKfPaH$@jm49Kb9B'
8-G8jaP4R`c,9C6qC+YXITTTMNN*D[qjeKV6UFchrZVHUJ,,U2Npdc82R(L)Q`cR
1#Ff-ZeUV)V8iH908[Si4$H4'fL%rAVL&drQT9ZXdH4HVeS[+9e9TqP*#aKC8U'-
(f1QQ4Ta,@+'4KYDSfD@BC4590kT0"("#MBDPN!"#B4pVfTX@)qiaYS6j8k'H#Ti
5LTjK5d*CZ$2BUc0aTc-0G5)$(8l"i`NYbKM5XCH,1XhjDZ)%E2q8QM(+F489Xf-
q+cYbTXf4af92PGJm09MMb$e9(2R#ALkb2I)ZfC(ANh0EF9h`T"[Ni&h2,kQ3!)c
'bUN4pI@%+,bMAKjML"*T8GM,$Lc%BME8VENAVJ$!2m%5XFeQ8qKBUpR8fHV8S'k
+$5J61m0fpTMAmF3(8Z2S-A+$YMdQ1db'G"Mc9MD`ZXC"28KXFPlHC)HLKY$c4"+
cDa9&a'5+U*!!+D*#YLhE)hTee'cDE(8,20'dk3-+K4BHVYRG[+,MHF29c&Yc3h#
jhDV[B2cCSj0NVLFGi98%SLUF5EY&CSeNpR(&p5SPfQE2Tm&X!0AEA$H"&elN35L
l-'RmHEiJ`DB'(MAP%!H4&[$clI5MjQ5&kQ!fjIik,MA!8*K[1NJZDmN"8&KJ$'A
qp(ddp'(m+9@Pj2BZI)-VISq8)B@[%@Z6f6#C&r-1mhQ(Y8bpVb&4beDfq)(LP#q
F`BCqb-a"P-aSS36[jN#F&`AQV,G*l#dC%)GNrda#Sj)ef-!TA[#RE-Ph0TmJH&"
"ZmUfXpQC`GT9+5aJ2&-[Z'A'*Y6%"8rUcaQD'L#K)CC*TGKDR$,5kQ"CZ&Xf3@)
VKijFNJif+$(K&5NFAhKiFRU0#9jc`2B*q4&4rCeJ&HRh`eDN,Aj@T$2mUNL6@%@
DYTH+0-frLR4Afm$baiFTb6+)eE``eHQSdJR%8CicqI*(A98C66HY84)3m#B`,(c
+P&&3iQ!N!ckUA%E',9RC*haI,Z*%j3dC5CP(b`fZHJM,N!"#@,lq5KM#-Y1@X(a
p3L%XkCpd31)lPU3JA#,G#fG6NTp-3PfT-8$DGKSPejMU+1jA2LcX`miq21c$`6k
#l-2,2MVGYCjDER#m-BfE[-+-ST,)a@qkH22YpZ)Pe25b+-!%29a)51j+8mH,28)
GmY8BDUXa0&4Mb&*Mk%D0SDiD3fmU3c#q320[8G&d-4kXH6LiqA(`k%i-6(4F5r0
4dm#LT'Np6-JQU*2fmrlCJH,qfHqMk@qp-RLRAf"3216UYk"`bJHl$fQrkVF%5,'
(&VRklD-+iK-Jl!&5p#G!H+B8a!8J2!&5r!8J(#-+iPdJ(!(+L(H"#-*-CJ+Z$8+
"GB!-"LKc,J(TjFJ5KL`"dKZJ$#0N*prfqP`d4a[IbM['@-FB1[)YmBj3!-[@05a
ETja+dT1D*Q#5RpFpi4%[eREbJI(L(N9Ykc#3!+H4m4%kR%"6Gr`+0``U+6&T"a+
6GNZ*3f26P35Rj5ZF58CMC-3b6!pU0mE[i5($8m9(N!"1JDie6Z"`cIRd6$%PQPH
5PA)`0jq"ZD+`B'k*Rf!Zi4HBZfB,TVjh#L"SPapJDPG0-,8jIVTJD[20[B1TJ%X
1TJ+ZUX(8V$Er`&6"VG-$8j-(XhlmC-"83q[r'M$9d2SI0jKUD$dp-093pUF"6$@
8R4kB3R,S#P+%8@+6LIH6m1r"@0LRR5GBT%m26pT(R`lKB*p"RX#3!$kp`XXq1dA
RZeq"H#P2I-`Bja(+"QUdJC*kkp'%3d1&&@#10ap@K(ph"`018%M!)VU+0jTQi4d
#4T!!JkacB*3-)YP%rC!!m3E!QS2)5r2M018S*Bb'HF5MfG,6-'XeXH6i"%)TkIa
k!J39dh!P-S!pXCeIbam!S1iD[iN$'kKC#I9)`5JV82,VM9UAXlN)"NJIBi$dKE#
!G*fIJ,68,d#DAp-NE9RA`2*r5MDdr&jUYLkX-4TeNN"SS+6+!!SMc@A0PUdfMR-
MFM38aaZENM9F9VK(D[KYf8VKX5@QT@[3A"`lD-'f"8U5%RP6F8YXhBHm%6dP#Ca
(Gd*T1K*QY1fXkDpDAMcN$9,YYAKBCp[`Pel34XL)e-V0P3[d#b3c-RBNeR`9Ejk
6#N+@m-hA!8)I1*K-DG)eeKLPV2A**pCS9-&kaPB[K@@VHIkaeDbZUYNUG([@JfB
(1P*@hLI%V!FcaaLc"3!L(pahD&r1*pmEq0R!4`2I'Y`dm,9p(`kQ$Ajrm29p'`E
[$@B0*R9F(2blJG&p(hHNG(`mF&+`r`#3!bXE384$8J-!DEX393YNQ3"CEC2[eQk
8@TCQ$00EKVb-@ZUFfj!!a4L1`0Y0TGDaP@l)3NKDYlAGG0I6XqY6#)G9Gcd-Vir
0H3`B$M''L"M8"A91)Y+)0a(a"m-B%'*!"%')HRYbFc`lBZccrIr[fq[ETTY!cVP
rpc8G9MBN$a%3%!!3%!!3%#(Zhp8V8Bm(Ia69&(+NK"ACT5,IK)[F8U9XfXGFC"$
q-p4,VKN6'DE0NQ!L0LR%K&(4mZK`%-l"Qr6eKa4RI@c`6M%KTFdp#J6%020d0A$
#((2hUA5hA2*ikQdT+cbHZkDaQrmBTN'1&M*QqBIbT$M(`[SDaCHb3P%qSeZ[kGE
*EYd3$B6DY"M#,XiN+8jd!c!m!2k0h9k@BlGrGIVUp*bbID9TkIEm)qRD[GPF[+b
[ReXISk2X!K-P-PLMA1fHS0KN*pDYJR,k6mplKq#`(DG8K[2JYYEK9M`BjfQ0(PE
-I$PA-#UDNq*8!N+&VG(-P5IVbF9'KfU$80hU4UHPL4#TkSAeC[B5LMdl%-H2ZGj
kc&dl&G%4Sfd%r['`'dYTmQkP,Dr6@0D*(c0qE2MaiUFI2clm0%AX36XGpHA5M0)
+MKV!@@A(TXPG)iCqmMI9c6SJ5E3"C5Fd66Sih*9'#4d&$,`b3L,0Z`iS6X9*5"A
RUSC#c4c!A#&F+qcf)qQQG4[X)DfQ*bdh)dGE&XK*PEirp#Hl[6LYm%LaePkD'EB
r*)qrqV3pS64$KHpG$E6[$I8mAV`P`06(kLhZJe1IeD5%,BH%UHI#MIKc1AK`kVN
39,RA"FFm4h3NHXJppD6SETKqcIM"k91l,bkCfKh0A1k,2UFS4ij*bTGe0a!fP85
0&dbADpbFkAM1G"bBMJq0ePZ-'%i3hGlTec`*KT2!F")B4SMK,eEl-9a1$)1h4`M
4r`EIC`0$U,I"IA$YFjV+D1EDBTVfh(!dmc&kI)'86$FYJ%dZ+jZece%e`C5rmLP
IQUBmMmFY&8lj+jY5FLY0+6'ETUc(ipQ+TT6F+NdTj&11dj6$UaKC*@8djFp['8`
TP+Cm`kFmDjS#XNVd&8ljKNeCH6G0@GPLQJ+b9MC90'APhA`clZ$bKY$dj3eZ&lC
m1bmZ@9j(S1*U(k0Tlfl"akF)'0D2CbX[,PN6Sq2kIebqfI#M'T-l-jIAh4&9kYM
$QKJpL,K4cmD@3R3l#A%,BR9&9),Z1TFdC6-0`c)"!T'9CIpLI"a$3,"q2$2qiT+
e36UQrmFem``rUM%C*!3B1I5`0XM)@4[XLK`qC4i0!lJ#j'b(%p&-PIa0Zlf3!%6
,eAkLT@i("-lHE&-e-R8*La-!CS4#Xk$16h'"-L8+--LhbcHc@a,rH+`6[qdX9mb
GT4#S(G,(TrK(Tr((0E'L(jG[0[k)3@2Sq0m(+0F'jGXempLYa#C3G,NeBiUbAKZ
XJ)4jaKm"T#Ke2IlG$UqL",#bUJ%-3MkLFACXF@ahebJMUV--J69eEL8TMVmiK8j
T"1+BGb'14pcB)&64Lcb)rSLmS'YIBA&DZYBNqrk!p8S,lCV5BQeqVXDqAjD"GBA
P4e,Y1DP(5R25mGR1ZN%Q!JRKNA)PXJEZ*98,)q4)2PX`l''E80*bIdjr,U0`V&E
VkZMAbdHrHi2IdDprK8F[V*!!QX,(jqL6ABd(-r@d4B6PSZ9+NjmCB'6Xm)@LTCR
jZDCMe6h%9NV25G8HbC`mP1AZFM[Vl&#pdp#9jlUZ6GIQd05ai"RBAka`mbrAp3G
M!05'5EE-i[VdmV6pQ8FbRKYE2NJHm4#Mh)`bEDUQ1'hr@$)#3KC5&dU1i2UjU0S
"9'aG5JF#TB8f`H1"'ZCYaf+1@15!BSlr+6CefKXXXNKdhCcl#KDA$a(12e*i3(1
NY(KX'1dh-ESf,A[XBE(re9E1VZ["@#YRec`$KF@e8Dh*eY&`949V)Q+&0Yb++KE
EmU+Y1K*`f4k(M43V"-A#pP5l@(A9UX)KUU"BAE-TP3r"JMbqTAj8mA8mJNf5+,E
ac&P`%K6RUCGkYMUFkUABp[@Q95)dk1rF+Bk)cP3aDlI@1DRDdB+0`PMRLqd,%Pb
DaChU'a'bh,Mj*8a'L190fhZf#@clIr+)iLYVTpX3"J5MhP'!ieh(f4H8-jEka2U
B"-"p+4e"*4!ApT5i9,B%-!Me%CZ-,d@R(1LjVMqF(Xl0b4JV0HSK2@,(pKNIfiC
MQbGlE(2R#0*`ZMlfCKcFE$Uf!+CQ(0T@eN+6F@Jc2l$AG04+1QS51fTlF#4diHb
SdB(er-!mpF"elH&dPABX$mbV$DSIdLZ3!))iM9G$Q#MD!q'dp,(Kb&lm@82c5`d
0RheTB@e'CPUCYZLL"fM40-eBeIeLJhAq6-c+5P-RXhaALLfDj`h6[kA$[F1cA&4
9+d"hK*3F5A%fE&p#3+UJl,fZS2)f+IB(K')HPK#D"lGEPGY,Yr&FZ4Y'YlrVk,r
CFSZIBQpA2SqcpAJmISUpZMD+2CQZZfIrC"5lbXFfipKcb69J2ID0qTXNa6BGqhU
6FYYS%JjYhQkJfYZKf[b`81hi#pZ09AY6E94lBXC+V9@lDik2RfTh[HMBUABVG`J
!`DT1kXJ$`dR$P(ME18b)$ja,1XFFGHSPmmVjR`#p4VKRTJI6m+mkKlP"c$peE%#
LlmhdJBl&AX"3N!#-C'8V62%kQ!LYl%2'!RVJ`Gh,`5Mb+d96"pL8dR&@i@%8(i,
"BflY8IB45pTF-(9qj9+Nk@GJPc+J68kJe9Tme!jNpehQIl+Y),X[qp8%QD,mSFB
!C,bkq)2X6l8'f@3U5Uh9dJ"NTaM)M!&QS'#E*(!jkD%LF&Q"pAqK9QQ2PeVpNMB
dG+3#5%q$-&d8'YDC"led'cm-Cr%&Z)rAL`P",e,5G-TT6IR"FUA1ma6rFm+0V6T
91cB-RN*5!L8VF1F&A!X*P9ja,jm3ibQpLab+FYA"[Ci*iYjlbjA6RKq%N9,@AZh
j`4lA[@V2'dMcI!--*K#$SeXrMm2`,'`GM40lq2"*d["*I2KP$,q-iH1-KZm4%m3
!A%@RUmhh"MaAlXh`A2%mLA5E*bR*fDeScSSIim@2`SfFdBrfZ!jql-R`lKB6$JD
`T4[Jbec!Y!ZHCq!'Ri-29hZQB6ZNf[--Rc*YN`XE%Gl"CqJI$c(#e*8!P3A-rBh
YR99+SaJ2`%3m,r!r``$2-0,QI`R3rMI!H$m!pB*R$D9Q@&8#(9NI0l6lB'M(Ff$
pYf0%M+I$e*M&Lb"l[%6fH*!!IG'6#V,M1B(,3Gjb5X&$#RC&T29+MRNX$cIAJNM
m[8Gac#N5ZbPlA,HUPG2FXA''[hUC[hKjMdYddr)`*(rThBeA9h[HiJ0qc!(b&Kr
fB`i3!"k+NNmQThV*ZhZ`'Ebe%j9Th9*f5aX+5F1dJ4l0[$q2d2AchK!F&C+,ZJf
h2$fG(KGlD4"la-"05G`PLYYa!0Y@caKbQaji#`2JC,aI0"fdk@##*jZMFED%aTG
!j%ZTLIVG51%CaH&(068JC2Dej8U$jh9XmEdqa*f)f04U&ipK+ie5DE*0LMXLEe#
jpQQ+Fp2,ZkU(%`[@Ub4k*%'pe#TklP[kbNA2UbfHdaj(mFc5S,-EE4DP%5lB[Ke
,2De*&k"8VD48#$NV@H%1)Mak30'Cc,2qP!iIdL5KNKBFS4pK6(Z#5p@#Rl`%R[#
*,E(Y&m%)bHX`%-XkXE8AmCk*ZU*k8Mqik%k%A0MUSUfc&U4rE09H485SqLJeAM,
XEXl05#m[eH5-TE[1Nd9+3#JRCdAdU)'M)X[UU,!L-AQH#BNj3(UP&@QdkBLMY[2
*mkb6BEa@qRFa5@b",GC"k'CZ-5&jVjp$T1U(+Z)1B9ZVTcJ+F8`ET5@kIkT%90k
`Mi5%iJXfNTM3f-+HL)Zf"#'SaqZ!9"4qB!6l8MTd-X&'MTZ`9cm+SGET2J4ADj1
lVpM(JKM*h4Sc-6b1P%L)2S6HKjMMYFcVGT(i8eN(R3kE1EY6iNlD5VJ6&FedDcE
GfJDa@!5QrDkpLT-9JJ'`l!DQH0A"9@9$A%iD-3+Mea")`3U!9'2K`$DlZe9HpfL
'-C!!llG9Sh")[mD*Pa%1a&2ZdH)cIN!dRV#'",[5MiS6Sjq[A5V4dANB46)10q,
&f93clf,1L!F3L2e4-Emjl'Jj215`JMJ9l)GH81UGBQ)R&r21MIA+C&!bD-5f#QL
4@H@[U9BL6a1,T$L6Q#ie#&bUMU+a#eXQbHNII+2lqS0(dG&[eZ6"mDi-288GZ@,
6p%Xh*&bF52bfi@8qYJeZ8HR3f@`QFF"%%$Vr"EccAm"&NFFd[!k-+cf8%2+493d
`I+1N#*1-+NXM''bN4,jl-j6[H1EcU4X`5)qIUr$cGrbXNQlQ3``4%4XNYVD8$R5
6lq(R*Ykjhd6GJD3)*%M0+(b"Sc@q$Y0S[ZI[Y,e"+Fa&a#J(3106M2c'l%'i$E(
FPi0h)Zh!3L+F"YrXib6HaBfF4k'Nq%2TU5"q!86qA5%b&@D4d4!X9fbG1rr@@rN
LdM5S#eK8ReFrP`i%iQIKjLjqN!"%[f2mP`q19Dq6MS$Zi",)MjH1iA-85i+8*cV
m@f[B`ih'Mf")hJ85'q9Ahjh'dcQZ"a',1MkT0JrH@IqT62kP6IaP*a')p&pAL&`
3[m-3+N6Q0iJG$5RKfmNe`3Y2BS!1Kh*8Fa$f&`&JI`8%9SFSc@mf'Gi`*fe)Ki*
KqVIH&HpT[[3I6Q$rh&SPrYA3[9le1J&I+YpLLU3KYDNH6N!BKkUBj#KajX0K`,H
@FK2'NI-!,VmmHZNGT3G@@&+dX#'Z5d@FZV@L!eAYZ&c9D'109l3fTQL@M5EA66Z
j*1N4U0Gjk'8*VfMSD14`a%jT6"raD[C4NU5UPMB`G(Sf5kiP*j!!G!%r0i4E-1b
#TK+!hm`0efGKI'lfP!$d*IMiE$L'BX&)qNqe%1Y%*eMI`)hPKPdN`0a[,rAFJ-H
(-(@BLKbML1Q`BN2PHG[c(T(jq`c2Hai2VfV[JB`BVk`6+2$aUqCA5G8mb8MF9hZ
Z3P8I3#V!N!#mbFL2YS%IEB0mY+%5,2Ir2E-ikh&J%TD+q6k!RacTCTBN"XC*bhT
j"AS*2crMa2fXBM%`p"QBcr)m`)'R0`*H(hkZim$Vim$6Fq"0![$dR[%!hRKmR#3
"lcSMi&eR!,cV*1#j*1#jZ212`2D!",B()&l@i3M(CI9I[)m,`+X#FF9lVB!*+U5
5!-VCLLTqimRE,Al92LYK)0ci*A96XB`[ZAKDaL[a-SLQM5E40-HkJ!i,&(5p`1N
QjqejrN[)BNfhN`6E`4fHhh%8,C)+3FcK3SdA[2(mVYiQ)@L4(i,qka3*Z%p"CXh
AXQ$695MBRZA&80R58a"!hK@)B`H#8,V%dEI+#(h2ifFM4prc((fV12V'!(fVN!"
#6@R(5-k9d,I4#(dE$G#h88,IB3PpKdhSZdY#hefBGX*3H(P1'!Q[IEPM*lQbjC3
aCR#6b'!EpP"F[ZfaNX3&#Z9jhh8dq@pH-&9418QS'@eVA5UbX9CEmrm*Q4ceNPQ
$R@iN+AH4&-F"f83"6kh6mCk`LJJXXjN&Q46@hFB6"#A(RSlIk*!!e8cN!'Pb`'R
``@c`JF)Z*+3UCP0SFJm,6D3"FRKbMd&i-Yp+&V'%iPFFSQcf(rKlK#R'D6bZRSV
#dBR$A`T(rf6IZf2NS[,r4+Jj-AI$@)5DVZ1Q821G9cA8I,q+S@BYNN+q*k(QL('
S+D8d29kKjNLY3meABF[RF3JeIfF3DSiBKjS5%)dRE#S5DPBl'K"UE[F,0A9bU1Q
rjIHQkhXDH)kmSX$ceGiZQq)AH)j`JhL6aN`T06$06YSb2"k%R'HN'l1)&a!p9!b
GKC4K'-E[UkV4K@aL(fAK4)BB0b+[Sd#1-h4+Nbja)f8p*Uhh-e"l*5@CBK#'pN+
`YPd,eI,F`+GZ`D$94Q(SPc`%4B&CbF$CiKI!r48rrq5'`Mm0$&!Nf,1$0Sk$#IU
2b35L%N!Dpl!M0,iJKD)&KU%S*h0a"D(S$HJ5&XGA244G20&3p(SFiEKdP$11$(m
$L!MQ4P[[iab-eK8*4KZk#%E29NKLeq&SJF'%@SDMNdreNX24l8A$d4L4aX,0Vf&
@mBek(T!!0Sc5JkN581-"93p,*dZ239Jk)S@PNYSj'db"U6GH#N`EG*k&H(@@9cm
)3,q`G$f[H1Z66)TV@FV0mdfbH9iNjH%#GaQa-(8l%)+05L!e#mEk*XmDU%m-#f6
aSVq8r%"&M"BBQH`,H&Uje@c(kejXpVbYPlClM)*@&(hkb2-1(H'K$-mlRSAB1(N
("+E`L[d%PRM#6b6-Vc"NR5q&V"'rN!"e#crf&ZZaKeT4V6rah-HC6c-+@QG*35[
Gh#F*M@Pq3G&[m,1##id94B4'Zm4q$&lI&h8K8A)@"qrU,X(EKjpe8L",i&h0`6X
&i&hYH9d#la3Uh'N#lcSMm+iV!YjeIZ!e#'XISQ#D!$X,JQT4"8(YI!5ed3U#@Pr
&)U6afFQ%Y38'BDe9c&88eRDe4'#X!Y[&Y3jXccLUZa#6(aQ(YPi[4qYLSr#fMU2
ibbj4r$aeAe+`5bMqNU2iCD$i5mqE%STIaXqE*K6h'U'iY`L+Hre3E"$k!X@,23Z
[T6mR$)9N,F,HLDE$'i@p)ccXCGeiM5R`G6BBK,hE&4+4&2D5k'bS6GJlX9$%+1a
pi(X5pMk`B5*KlmJV#AYjQ-6#hRFHYl$hrDU([42GK$81HaI#U&JS(qADBXkq)4I
&$c4(#V8jFK'i`TcR`PVLBEI6K`V$,cp@ecr,#KFBXJ*4X&F,Xh-3KL1TTfZ149M
HXR9L,2G2R+9,$Ql30+-0D4I(`JY,A#L9I4R#lKj+3U!8"5VBVelbB6ie2XJ6&*C
aGpFFpC,lIaRfK&aZRfBaU[V,)CG"NX)FPU6!ELP"!G0i3aSpQ#UD[6GUN!!#mH%
8[J!@V1'&ccj2V8p%ZS,,P+lJJj!!mE,LG&4B2SK#1%J-QBdN"TFZ!HNL,YATX%8
rfQNj[[ZNDjYD3A0Uf`5SD+ALj%CH!@rZ3fE3YJhUbT0Yd2!H$kfSmDN,pG4%ci9
k(K+9E8GLc#LDY)53!(jhq[dlpbNNa#$-BpA[eRr+#J)CTij!3GHaY"')f`IGdkH
18l@%m%H0`Rik-aQUeL0%STcmAPk)UJ50(f4&8#`3"m#IcS06*p%Kd-J4#Z"0(5q
kNDM2#m$DPh%6!dIE48HVNBifM6Thdp(k)%TYBMYrpHE"c+N6d!e$U(YHjidZ)25
!m(fcUb4QIX3)#&V$6+%+$VQ+(9)A#rDCa(#KFAR82rh"P-Z!8TPGHjZNlkH2&*-
ZjU5PFKI8em@&XSlk[c-9E@A0E[%Qf%*"Vmjb1a@'5f4&XaB,*328ECGe"N0"K-)
hIB#NDb"A6'cV3i"VBH&e'5qL,MHEjBT$@`5P,fKIY31B5%9b'+UTHrV+,%dX0(h
PRN1C+rHXc!SHA*NP(JX')MY&5aC%2*,L,61(%ELE)f%c'UUK*Q5Y4BiMV-La9lh
NRfFL[%Y3,jRC&"N@Mp9iJaGe&`hCei"pCD+BQ296aDNp@jdBHKV-P2T2TH+qHYi
4jl%&hpCAQj%SpE%ZJ+,"`B3R&+I'+BiiKMUf"+1kR5Mqfmi+#NZL'%AK2Sr$YK%
DZKA2FD+2L3%UBKIj&a$Z0UR$AVZpYU*5"LB%H(ND5RQPSY4Z%6!@'"fd!'!XQ!J
BXiU!d3Bh&(IKMA5LH4%V#2eB!i3&rmFJI,mS#+[B493-5803VM)km#U!FYABJh,
R$AkJp'-08+lkR`c+r@-*bYSA)jqCC#e'[[,S+bp'2[-AeQ,N+l1V8)`mLaTITLB
38*Mk'Fe4fB%pq0E&*5ZRbDjY-L+$EYi*'$L`X3a2)m`B3b+8PZR#k@hNd1E&XCp
4B`&6X`@&a8I55EEDr8!Y&jTX*F!DGj,qUTDL4e([Q%ckqd%d(G6+8VGRjXX'5""
#2TSj-eqDFSDk#Z2M&5'l8bl`qHqC4`jSl9e6+$Fp5P8S+$8Q"j1T2p*6FU&-GdY
l2HqLpbD*lSi21XhcAU0r5erE1$aVprGG2LAqh0VeRmGT&r!N5ECaXEdX$GREGN-
*f80&1HKrjY4mU)'piD@+-iqN(c!LK6A`d)j$YUcF8"JjV2K!'%La-9,18R"SdIH
j8Ha%N`F52Y(1iP9$fMJ"!HQ&4c)UTU+,j4PaBdH%ULJ4rbS6NC'@8hXUH"1fAmI
"bA8QQ+DF@[Y*@A"IqhDRl9LMSR8f@"bmf(X[LVX[+liqbk`dI,r1a8Qi3G`C(mF
EV-eeGB+%R,6FF"J9[!*FX*@UZY$5L5f%k("b#d'm`@'R5e1mR@NS9,5q,1Ee49f
Rp6pCVedNMZM)$AF('1d[,G0Q9+JjKI6rIX9IA@R$JY39KP!rN!"eGZhk-YrYPP[
1`2R2K'NG3Lcpf[@"11eX)`AGKD8bMU5Q@J2D)NTD'#MND,KGJC1abGE6U*6ebm#
B8pc3B&CSbi#+9F2-0)F4U#PS4Vl#J4Cji((p-F@R9$JSchK3Nh*'mHCpLeYb`lB
lSlZMIkR'9KBeGFm@mLE5UdT&MfBm`d254kFm4Gq0cml*N!!NQNMrV-)"AU1M08b
'N@!dd#'4F8QC8X8TJY(!Xri$H92-,QPS$%aGE$"[jKNhEc*TTRQZ!J55NN$*R'4
@GJlINDDdd-2XNrc"V*MIK5+LX0H6LKN0VbqC@8E"rZ!fG0FlS"URMF0XL@XK&8(
VSX,QIeeXd($%D9SX-JcAVNePJaZ0'4F[)b#,UI+BUGY9J`[qMIbB9Xq@R$QS1+L
N2P45hGRfk'Md!bR"bN29e'Y4,rPM-EBp'j!!aYlBl`T409dJlZ31K-N*Jd,5HDT
G99hQNBNY8j%Sm&[Qd`BXSF05G4!+N3kiD2fl&AaZ`1G+-TXLMFmVUhHA1Cp[M#3
'TbTLC+T5QDUipi"6Gmh39`0KmaTA)9,pijXl3k'6lG03f1*aH!MXIRC!1mE4B[`
aY2[C2GUPhM`FIKi1Ic81RjCV`TqK+GDc0e6+4%Z)rN+qK#34mkNAi)K!C4Y`F"%
(EqSdilB5YlSDml`Vp'rTP4Z'C`e8*aU!SkPcUU+6`$('"!j&15FQK*V*%5Tq&Gq
"CY!HpdF1S(-1VrpR$U)j"#)cJHJdQ38CNiF3k8L)LrS!),AIZ(*4%S-8iSa"*6Z
+30%GL'09jmI'pGD3!29HrdTUa'LHHXQMPk[!U0$+L!Vl!ePQmIGCEF9j9&`5kEQ
m!B$Q6*bZe'TbPq*r!e&NTSG(U3J-#4ZGm@URVlCrV-h3TX*#Ui$m#YK%UXLQd"J
)e%`GDci,U3ENH(A#9E-9Phm)KDPal[YKSMVj0XYKUH%X9j,F"*&$&m9P,Tc-M4*
Nc@c0CFeX'EK4CNY&Rkb0Dqhh%kZ[IZ0DJ5lHb8%0JJ0b!G*@+"VeQm[F+@*#K,C
ah5)9*XD,VKa(iNlHH*KNk,ZqSTj(PI(UZ&5JkS3Cl[U8ZK$hB*[X()HjrlP9AH1
U!9b%+c-G8J-A204FV%M&GAa5ibkLR`iEJN4@K$QbLDYMc49kEAfh)*D#m"LZQQ0
dpL*VB#*D*ZiB4FMMlX%dIkFS%U6ZN9bLD*jUpQUV5a30keAUqVBG3aMXR$PX$6Z
hZ@'@1b2C40%jPMM3RR8XBeE5DM,YpaJklUqZbYB8%l8"2YJNe9Kc3Ci**U!H
heJ!BfdRBI*!!3V%S(VUMcr('rD3`&)%QECVfDr*i),J!(fk8(Ql%``h5``eiq)I
dm!mmc*FHjZ2Klp,$hr&`PI4`&4kZN4kZ`F-mk@%H(Zk6(Zl$`bcTB4BH(T!!(Kk
SAG$qQ-mSD0HrmU$pXEZ0J[Ee%`RDFfQcN!$!Ule%E&IH,hriDPdJ,L9hi%Kq@QU
1SX$PFVpQZhYk`Hbd-`Ri)aiXQ$d6"H0@cKEK[%&$M2LBm5"2m*RJRVjL'C)!-PF
X5fNEa%0p2A-VKi**B0QR29`+MQ#jBJia@c&(2,KL$M%VQ#-c@c%R!ilY&IG`0[G
`0[FmH8p+EVIG,NfAc#-[8Z$l`aEA+"c9YPhB[YVA'R3(cJI1Na#XMi9Rpil#(FZ
GXI&KHL5(GVK96aYGcjUhNM#LP`NC9%b4'8j[$%)M$d"NCd#-j"EQd'+RpL&B%L[
VP3JQ2k(B)MRQV8%hA&EQMLdm25`hXM1lpChQ'SXZXD5l,"+")a`I6YCB#R$"'*e
Pl5FD'kU2DAK*YhDqD'RV6Je!c0Q3!+l#bBKIKHC)q!,E3#$)Ll(`0Mj'R5+EHTQ
4PjkEcqmB+'i'H6iB,Ne%42LlIfN@Gllp353D[ZX[EE[3i,*%p-JrpEmk9qPfce$
Y%d0hPT2j63kafhBUYMY$j16'V6Pb(XZfdl*IadH'63m2NXUJfD,cGf)3IQcK9M'
NE`XU@8mSjN,RYKlD(2XFi$[(##`Zc@$%+@IN-$1eG90(H'Kh4pLjqbG)[Z&%"8G
Zd[rUI1A1jGGTR-%R&G[b[fR-Jmf$B)V'Jj'UFeXT*a0rF'XM9hS5QZ@j`"E*cC!
!PZ&Q3$d3fqLDLNQii*Uifce9mD+T,HIZ0YcfUfaBZJf2@6iNQpbfflFe*IGNJJ4
%Beacjb@CJ0AeLZk&9Yfl'rV#3rSq1CJ,+XmlecG(G[lcVq'&HMJEFGNLLra5Td$
9mY#8akHb`U'*#c6YJ5f"Tr'+S6M-'bc9UFkLm8XEDcEM0JM4A34@0feFFiGLlQ8
6FHRKBNRK@mi!M%e33M(Xe(GSmQZf)58f%H64*Gaf!$6KP0cJMYpX#RrkPqC`+i&
lijj0VY&Q$'R@a!khEZPBX1I1[ZK@F@pPi)[hi25%d@%&XJkh)J6jE50dX4['6QE
EE#)R8jZUdYV4T()f3bj!j3@#qi(1jSL#p!*pj3iX1%-6BJ3`B[5lGc-bR(F#p2c
@$19FlU2N0qGZh!6M9i)Nh8qK!ZXd3i-RZNDq)6%CfX-jc#5$`'K&bQ$QLYE10['
VfhBScM[`!'A!(r'e3cY@Y$TLp+IcY6YfN!#*f#HT$c@q%L4h#*SMl4aCmBPQU2Q
pP8Y@Y'UF0&am8@AZE'B-"i(b`@Ca4p"1,T*ZN`*50`9"C-XE946[piG'2CjPLQd
8+B"+@4iZmG")&f%Lp'Y@SH1089)0R-dmf3NE49`a3QAXjRLUb0fLl29P@J"(h'r
2YeEf"LVd!`4rCq2S*PH`-4`SFC80C3IimI2SX)iB@qliXU5iB"61pVP-6*&`+i%
KNqmc,GZ,TJ2Q"Z!`1q6'a!D),HGD1[S#QB@9B-E!H#VFm6X$`qc&Ek4Z(!l`e,4
-HcDXVA"D@R%k*jNU92pAjeQ9`B866%+AL@VG6UM%#536Y$2"6"H2JrSd2qZ5Qmb
PG'i*3"2BM@BM&iKBqU8bl@3@2d@,L`M1)RFLb)8be#Z9e08me[5f2K+p-`$cT6e
T9'I"LlT1*dXLU94U&#Je8Pj&*,V!#(-prarc"m6%""FZP,1lX"b#p!2GHCJq6Th
leEN0p"9dDkFj@SaCKrTSb3+ApK(GH5)leFD5Cp9,9Qap'i9hB(`&!-kT5J2V'%l
Z,6eFN6MchDb$bbaEZBK$1ja*-%)+6ZDhLKCrKX&SdV!ZkQl6()mHrXi8H[AYCmE
)rabZ49aLcrfViFUS(XPdiR&F-X[Xi&fTTr8V&p+5lZR&aLH5Kfa3NRGP9hV5F2!
F0iIMG6#MU@%bdCddc"Lqj)mi6HPKECN9GCa`dC!!F(6j6EmkCdLq$Z4A4RF")*A
RX+&MeSM"H&*m96me,Lb4BU0210#F`41$-aJ*[cC8(MmLH+8fDr+SXZ,iadTFq6C
@-Aje$YX18MAlpM08-`cScZ5m*'Fa1@lJBVUH!5h)J*EJ$l5JSV0`YLhe%T'I$3D
)X84`NZ65lG1NDLPpJLS1`&(CF+P4VmI"jN49dQ$()b$#MHSlJ[6Z&TA8Q04R#d(
QQD%$#fp"-mX())@F)#N'9eL,LN6C#-bA06b3!-SpMbL&YhL*-c"aaJ&[[*6AV`R
,S@`2,3F@mqA#K'$#fQ,J6%JJ8cJHmBT$#AY3J6[EIfpV9"l@j,@[3P*X$!maM4-
2$iGHBd-d9h'A'l3AZDJj$"m3I4#"f[3Z'FBi`iFj`iFj`jJa`rqd-Xa*-f*("X0
YD**3LH#2L#3NRH,66i16"`P*q15$ScVhLThkZE!G#6dDEDU4`3R8-Q"mMNBkXZ$
fS@*pZii5)cJBScapVNCTUUF'k#kP`%3+$j93JKqDJdFBUB0D1S1iFBqUj+*-Z8L
`d+(*,amZ&QY4%M9HQ3PI*J5M8'%$Ve$mH+6-L#LIb8@)j5*)Tf[5QB-)aP5KA6f
+VN+'3pMF-L48)%,&Z85Q!ANq+hQQBbZbDPk@N5j64#5*"#Bk+P6YBBh0UN6Sp$f
i'"FQ)P8#VYK(jU)#0"DJQ%jiRaiT*JqDUCN866Y2RRqB@-J6`TB59qCf,ddb*bK
r011DL[1'DT6E&I0ZI+6A(!80!+rP@aFFSUI0[aFEf@3f8+(,m*TC8-#2X5l)Nf`
dH8M'dfPUF"NlPmCQAGVKC42j*jXa-3Q%4!!E@m)4Z'#pl2-jZafYLpR*cF!0!J$
"($f-KZKCGcAEMD6Y6(,E4JLFa!4+h',-5+li2eqF41k[h!%01"BbN!"#&(SjSZR
L"ITh#*`l65"fZNHYS#9Pdr#N)ZdT"M#%M%1TqcB4J&qN!MLUQf%qMUT1)F`ENX&
K+SE",pIV"cB4,MS*m8Pa-JT8&5%TMj!!1-[mYF)14XU)0'Y4dbN[mr0b!N0&Nif
"kZf6@Ce9`+c"E9(PK@-&VUS`iJp)kMFK"@hFq5(&9L&5USf3!0*[)Q5U-KI-kT@
j$M6PJK#@GcRfNB#%([!ZY#SmKB)b'AiU,`&8&TrB0UB+GbbP$GHp2%ULHI!NUUN
6$Fl%m3f+*PPd!ke19'5TX@$'TP[$jE44bMd@jS6pBM86`a991[C+VQ3*#T(&2M+
%fR"09kh0Z++`&emV6'5Cd0l#"XR6qD8dT)AJR*-D[-PI`iXR$@8VNd-BBm%B3P6
j'1VBjfi0PbTdc%4blTl'F6D9BTNGGBff)46+bi1i(d,9hDBmM-$ZMN2#&j9K6`d
kiIjY)"@S%,FT2[U!i#(5m4JFmpZ8ZSh$Q'c4iM*lCiDq(MJj)$E5N!"ZZbC(5cf
@)MXTmU2NT"L3!,kE4#b-+#YB!F3m!M9%Pl3m%iJbU$3kJm2lM!l[0i8,(Pa+8!*
H9+IFb,X8UXLU-KPThbUU*-EF4j8LcqC8,*Up-!Yp5+2aPF9`mBZkJUQ+Vp$-31T
SS*GYI9!e',T)db1aif[$%,VBK$'U(ARX84)@af!`l8-A48dJ4*(J!1-C$S"Q,Kk
mA4m$5FffAHL%C%5bc`!ZPCT5*&2+"K"lB4c@XiYYj'pJJ3i"QifVCi0XFQ8Vqa`
G0@m+NX`VE5BDp19Gc#Nb"rUC@AZfAVNl,-*-KUXdE+PjmGM!"PGPSXVfmS#i)r5
DGc4K3,-)RGPCd4)9"S915ij[jT0S1XYbhl"VGlHVa[R)&3b[%hFN[BB%c#Vr!G[
e,pbqSHpqQKicI9`8YQaaSG,'T-Al0)Z`3AUBLb,N"KFMC-h%%G58*V2J8"6Z-HT
#i38Y6E2$"M8jY[CaTaC8)c-[R&IL5Z1LKB)G5Mp5,rQLi@dp'C@k3'3Nh,K#VaS
DE!ihVY9MiCLQKDX8&cam5N`6Smd!FZI"'@a*1FQkEhSj!(Fi54-bpf$+62mLLZB
*'JNPERUSCYd),R*$c9MCh%*m('e[!r&44cXGiVYk(1)HFKTq%FeZ*%-3*NTKZ9D
+3G)SjjH,ABj`l33BC9L!UMKGL)%*a2TfS,ZI,k',Z&$Sj#6[PU8,&2-Jf'j(3e9
P9TjG-1@Xq'IP&'2&Lr1D',eKYqp2,B@PEq*%$6br)CZqTXqS1XiIRH)'EITckAE
*ULH6FFVY(*Ad@6,*kA-%33)A$H9Fi$U*EEJ"hU$%f@CHd+8"2cT(TAY2@XZ3!%l
j8%P%)#SUL3k[HdqacI6*Ub4f$MRb8N&`UNGXT'T"f4G@daH%fATGA@k,B22TkIe
3X-,`FiD6d#J!AJr6kd`8p&,iIaH%R[&A$3YIAIR2FkX(K%pQ,IMC!Q(,Sr5IfRh
AA8+UqMCebV([U`qTXj)[*#mAi[%cjQRe6jI1QL'N#LI96VAPXH5X+fUhm)C`6I)
cqYi[2K3bK,m,1A15e`SpDN8Hf+lqG(Ebe-[UR`Y6K'A*,bGrmq%h(`PKiBr55'(
Cdm+Xj-[*%i36kj+rQ5HX6,iXr#pq9J[Pdi6IMKH5a`XPR,D2Ir$JqDI(MAYkF-Z
9`EL"+pd$3N!S%cjqqYGA[K&q[5#j3qKEX--Mi&*abN2U(d`6hRrd8H&r(hhdihY
Q#+-cK1GR#*-H%jDH'1J@hTJKV&FApLa,[LdjIh#r-&Ypp0M"j1mNIcAiTYV@,*`
EI($DmVd6fS5r6#[TX3Yad`6DY"S[1!!5HlHkM,%9hRpVdD)[m#2m1eiFZ9#`iN,
"FRA+B*[`@h@Hm0)9B8!pmkRAe@ZZ##GAR4$1G3JG"6p8(def*,mP("EqCHPJBQp
b6R,cB&Rh0m,,dSK[IUM15IjPmT[#EiA8TB-e(bBA*JqS0h,+mM(1mF-RKHR#%R@
Mm%2K'Z(idbGA#"H&`Cl9VkZr&Ei8TJirqFePSHI#clU&eaHTAlc5*hamcB3([KR
6*rcN"m,&mGhMZfHF(bGd,jmf45KF1H2e'5H&Lr1&Mhrpia-[#4GI%ljpjMG#GSI
`c+rlIR5ZHmaj!*!$'!!!*)J!!&Hi!*!$#!#3!b!!!$mm!!HTm!#3!`TB`!"G`!!
!AF!!N!3Z399c-J#3"306C@Fb"h0PCfePER46C@Fc"h0PCfePER46C@Fd"h0PCfe
PER3!!"TZ!*!$!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!6
9U"p`!4(!#Pj+RfFB6R%`2+P`TdC$qJ!U)SK"qJ!J-$bTF+C(5S0R"(!"6R91l3!
L6R&+JfB#UI4`!%jeB!B!N!8"6R%I1[rf5KpQ%NMRi1""q[rU80"1ZJ@Z60m("bm
krpj1G@"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))$V
r4#)'`VJ$'PK"B3$r6#!krcc!Z!-D3IVr1##!5S9Q"+%LB!3J4D!RCJ!!Y#T))!j
3J%(kr`JJJ#!kr`T4J%(kr`!JJ%*R5(S![#m95(Vr!LmkrZ)[1[lL,cVqbLmkrXS
[1[l+B3!06M!ICb!r!%U&C`JJ6D!US#YJ"#"0S#-J6U!I)%HJ'c(I!L"JB#"1S"m
J4k!EFJ!5"1F*iaRN%3!"!#!#!3$J)%fJD3)!!"q!!5"0S'V9e0I83IVqGNU3!'F
)F!'JQ(!$S*JJ659)!!K`!%cIB2K1G8cIB2KJ!2kq2`!J6U!I)%HJ'c(I!L$9e0I
8-$J#)$(!#Q#4b#9)!!K-hf$i6R919J!!51F!1#KZ!!a(q[iU4IVq+L!8X**Y"#!
5+)"+J'm5)&-LEJ!)SLiJ&0'6NC*`!'!%-$crf8cI(!"1ANje6PErb%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,[rNS4iY52rS)!K
R!!&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,`T
1ZJ5k@%mY32rm)'lrm+!T8%SQE[r8*dS!+&P2,blrm%kk&F`J(h,Sd)&4J#G!!#a
96dKkrM)[,[rd5'lrr#m-,`3[,[rF,blri#mZrqK1ZJV'9%m[,[r`UD-NE[r8*@l
rd!!-*@lrh!!3*@lri!!8*@lrk!!B2cbKQ%kk!eC86bC!2cbSRdkk!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)SJ
GI!!"rmJJE[r-S"Y96kJF-"mk!!a&!!"[G%KZrq``"90&2`#S$e92,blrl+J0-"m
m!!a'!!"[h%)RUCYC6bmZrq``"P0'2`#S$L!I,8$rm()"(`'TQe92,blrm+QQ-"p
)`()%`)&R##mZrr#TSQ$#*'lrm%U5Ca"96bm+UDB`(dM!FJ6!J@HU,`UTSf#N%#l
rb"e!!"C-haai6PiJAdr[!!j1d%j@rra)j`!`3Llrr$mmS2a1ZJ)X9%mN3%U!Ce`
[!%kk!B"B6dS!Ce!J#LC!)%![+!!-2cbJr$mmS2a1ZJ(H9%mI!%kk&$JJ5b"S!"#
J(b",)'J!'+!I)(`!!!&D-"")`1#!FJD`J@B+F!!JI!!!!c`JJ"em!!(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")`cJZrqa)a*D%1!*
)a*D%DJ*5Jq+$282rp$BZrrE@36e$rrSb,[rddN)p3Iri@8p#TdKZrr4)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+Kc60mFq%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!amZrra1ZK(J)"m
S!,#&CJ*`!%cI!$K1ANje6PB!!%MR'$!i,J!)*'i!#L"+)"!Q3#"!-K!-38&%CLJ
b+!!#$%&$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!0
J!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("K1ANje6PErj%MR(cJQEJ!
)+Li!$#!,+%!Y32rSF#6C`#e-rqa`)0R!,8crm(")fF!Y62rdF$lC`#!-N!#,X)9
M"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[rN8NG
JX%*!2J"`!6`!0JG`(lC!C%4`!EC!C!4`!'!-F!!`!e1!DJ*5J1+!H!!i!be%rrc
BV[rX*%38J#!Zrrc3J0#Zrr3J3$#'F!%8%R)!%J,MB0a!8NGJY%*!60mFq%jH6R9
19[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-!!))`,[rfFJ(!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%MR($!NEJ!)0Li
!$#CZ!!ib!h!!-!(QJ$J!-!0b"m""1J"`!#e!rr`d"()!-J,5LL""%K"`!"!"0!9
b!$)#iU"b!F#"dDlrr#)ZrrcMLG+,)%%b%(!!-!%Y32rm8N8`"A))X%&Q"N*!1J"
54$)Z!"*`!$!"d)#`V[rmB`*JUK!Zrrm5,J!6dJ'3!!&-h``i6Pj1G8j@rra)jam
J*'i!#$JZ!!`k,J!1-J4`!$!"jS!m!$)%G!I#3Mi"GJ!f!0D+)%-3%(3!&!!Y3[r
mF!!`!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,[riiS0k!mC&9%-p3rr
QGJ%k,[rQkf-p3rrSIN$)"h`!(!3p4[rLH!(VC&0%286ri#SZrrKq!FU(C`Kk!$S
%8i9J!RVr28ArhRJ)286rj%T'CdB[,J!5,`!r!e*+,`T1Z[mk6qm!$ZG!d@lrj#m
Z!")[,[r`2`-[,[rX6VS,#%r[!!i[,[rd2`-[,[rX,blrm%kkr+a2l`!13N!p32r
B-#lrf,"Z!!aN!!%k-#lriQFk*%!r,[rS,blrp$mZrq3[#dkkrBj2l`!-%J!J#R!
!%!%p32rDG!!d!05Zrq`J3K!3FJ!5!00Zrq4J($mZrqBr,[rN,`Y1Z[h`8%mp32r
D-#lrjY&Zrq3`,[rDX'lrhQB@-Llrf&*ZrpK`!$!"d)`J3%)3B!$rHM!ZrpU`E[r
JCJ!!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[r
N9QlrfM!ZrpT6E[rD5N"R!2m!1#lrf(B!0J3Y3rrm8i2@M#"$%"!L,[rmdS`J34#
!8Qlrf'$1%#lrhG!ZrpXd,[rB8Qlrf()!-J,5M#""%)"J!2kq-Llrj(!!-!&HJ1D
!60mFq%jH6R919[q-51FI1#CZ!!JU,J!-+'i!%#`Z!"3Y5rr)F#6A`#e,rq"`)0I
!,8[rc(")em!Y5rrN,8crP#Bm!!!"*0HZrj3J2!!!!NM4V[q8F#$4V[q8+$`!N!1
!fDlrP0QZrj3YE[q8rl3S2!!!"*!!fDlrP#eZrj6rZ0HZrj3YE[q8rlcCV[q8,@l
rP2r8F(c4V[q8,@lrP2qN)$`!!)!!dDlrP#!Zrj53!)b`K@-+F'8p3!!S6[S'HR!
!,J"#3$e!ri`NE[qNeI`!!)!!,8VrU#eZrk6rN!!YI!!!J!$rk%KZrqJ[,[qN)'i
!*%k3!&"2)#lrk'B+F'Fp3!!S6[S'0#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!!3%"e!rk"b!")!dN&636e"rp!`,[r3d%!p32r5)'i!(#!3d+i
!)#e!rl!N3#m-,blrZ$mm!53[,[q3!%kkqr*2l`!1-J!J#R!!-!(4V[q3!#m-,bl
rY$mm!53[,[qi6VS(ZNr[!!i[,[qm2c`"*#mZrlJ[,[qd6VVjA%r[!!iN3#m-,bl
rZ$mZrp![,[q3!%kkqk"2l`!1-J!J#R!!-!(4V[q3!#m-,blrY$mZrp![,[qi6VS
(D%r[!!i[,[r82blrd#mZrlJ[,[qd6VVj#Nr[!!j`!#i!3N!p32q-,@i!)2qX)'l
rV,(Zrl"N!!5S3N!p32qB$'i#52qBC!!!`M!ZriaQ!!#-*'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
dC!T`Cce!!#K1qJ4#)'lrN!"5V[q3!")3F!!3!5i!F!Jp32q--!Gb!F""d@lrQ$)
ZrjK`!$!"d)$3V[qm)%!`%$e!rjJJ"q+),J"6E[q-B!$r1!4Z!NMrQ!aZ!3$rQ'3
3)'lrV&+Zrk`3V[qCB!$r#!4Z!3$rQ$JZrjKf!$B%,82rq0D$eUlrc#"$-"!p32q
D)Llrq0+ZrmJJ34)3F!!3!6e!rja+3'F!!-)-EJ!BriaL!!#B*'lrN!"55VAZrkK
MD#"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[rdC!T`Cce!!#K1qJ-S)'lrN!"5V[q3!")3F!!3!63Zriab!$)#ikL1J&"Zria
J!2pLF2pb)$JZrjaf!$B%NS2LU-"(d@lrQL!(jUJZ!*PZria#3$e!rjJ`,[qBX'l
rdQ3!!-)`,[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#@#"Zrj!!8Ul
rN!!5%(!!%!%Z!(!)28$rM$!(FJ(!3G&ZrjJb,[qBF!!`!G#!d+lre#"!-"!p32q
B)!ILL#i!8flrM'!!rcB`,[r5N@lrQ$JZrjKf!$B%,82rr0D$eUlrj#"$-"!p32q
H)Llrr0+Zrq!J34)3F!!3!6e!rja+3'F!!-)-EJ!BriaL!!#B*'lrN!"55VAZrkK
MD#"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[rdC!T`Cce!!#K1qJ&D)'lrN!"5V[q3!")3F!!3!63Zriab!$)#ikL1J&"Zria
J!2pLF2pb)$JZrjaf!$B%NS2LU-"(d@lrRL!(jUJZ!*PZri`JE[qX-LlrRR!!-!'
4`#e)rj5alJ!JC@!JE[q88UlrP"!3)'lrV&+Zrk`3J#"Zrj45V[q8%"!JE[qX8Ul
rV"#!)'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"#!8flrQQ$8,@i!)2q
8-#lrQP0ZrjT+3'F!qfBJE[q88UlrP"!3)'lrV&+Zrk`3J'$F)'lrV,(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"bCA0cD@pZ-$-`-5j
M!!!m!$iJ!!"i)$i`)#BQ)(JJ2$dc-J!!1N0[EA"bCA0cD@pZ1N4PBfpYF(*PFh0
TEfi`-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-#l
rk,"ZrqTP!Q"b1#lrk(B!0J3Y3rr`eS`N3a)5F!!3!6e!rq`k,[rUH!!i"5e%rr6
BM#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!0J3
Y3rrieS`N3a)5F!!3!6e!rq`m,[rUHJ!k"Le&rrcDM#C&%"-8J"DZrqdJ,[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"%k
krPa2l`!--#lrkP*!2J"J!2jF,bi!%#m-2bi!#M!ZrqT53$m!6VVq0Nr[!!`pE[r
U!!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$`!0JDf4@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,[r
XiSJY32rXB0Jd"R)!-J,5JG+Zrr3J36)3F!!`!H@!d)XJ3##ZrqK54P+Zrq4J!2p
860mFq%jH6R8LAb"IS#8ZJ'S#3TG1d5*I%Km`(dS"C`5R4Q!#SdBZL%l4)Pm5(c!
I)&p+!@F%TNGJ!U*(6Y%!N!-+!$LJ!3!&!*!'!3!!!Bp*!!'153!!"'`"'h`i"$B
!N!-F!p)!&%4*9%`!$3#U38a59!!+!9*69&)J!!%"eP"cCA3!!!(Z4%a24`!#!IT
69&)M!!!#(P"*3e3!!!)UGQ9bF`!"!MCMD@0Z!!!#6NP$6di!!!*D5801)`!%!QC
'8N9'!!3#SN*14%`!!3,H399c-J!!![CKGA0d!!%$!QPME$J!!!-D3dp%43!(!bC
%394"!!!$KP0*@N8!!!15DfPZC!!!!jj'C@&d!!!$UJ3"rrmJ!*!)KIrr*!!!J!%
6ZY3!Krrr!*!$eJ#3"BErrb3!!5B"("1J!)$rr`!!!DF!N!@errmJ!!)&!*!&J[r
r!!!#G`#3"!2SrrmJ!!,9!*!&L2rr!!!$!3#3"!)!rrm!!!2C!*!%!J(rr`!!""F
!N!3%5`!S"!!5i!%6ZX!%Vrrr!!!6-!#3"!%(!$3J!"0Z!*!%"!(rrb!!"'-!N!@
#rrmJ!!4c!*!&KIrr*!!%J`%6ZX`!Krrr)!!%N`#3"BErrb3!"+-"%lSS!)$rrb!
!",-!N!@"rrmJ!!6$!*!&L2rr)!!%d`#3"!)!rrmJ!!6P!*!%!J(rrb!!"28!N!3
%Vrrr!!!8(!#3"!)!N!-J!!8&!*!%!J%!"b!!"48!N!@!rrm!!!8K!*!%!qMrrb!
!#9J!N!3%5`!3"!!4#J%F%U!""`!F)!!4)`#3"B$rr`!!#A3!N!3$k2rr!!!*Y!#
3"3,rrb!!%0S!N!8"rrmJ!"$i!*!%"%[rr`3!%6m"%lVm"%[rr`3!%Q8"'c1B!)$
rr`!!&#`!N!@"rrm!!"8`!*!&J[rr!!!@0!#3"B2rr`!!&cJ!N!@%rrm!!"Jm!*!
&J2rr!!!C3!#3"B(rr`!!'8X!N!@#rrm!!"P@!*!&Jrrr!!!CB3#3"B6rr`!!'@`
!N!3"!2rr!!!CG`#3"B$rr`!!'CF!N!G!!!!Cc`#3"B6rr`!!'I-!N!G2!!!Cp`#
3"B6rr`!!'P)!N!8"!&iF!"j@!4Ym9!!#!'JF!*!!(`%6ZHJ!!`"b(!#X0!%F%NJ
!"!"m(!$cSJ%E-iJ!"3#'(!%P,`%5mj`!"J#3!"`"5%i"($M8!!$rrbJ"Ffd!N!8
(rrm!!A2*!*!'rrmS!'!B!*!%rj!%!!&cL3#3"B$rr`!"FjF!N!Err`!"MMX!N!3
'F(*[EA"d#-3JFh9QCQPi#dPZFf9bG#"%DA0V#d9iDA0dD@jR)&"A#dPZFf9bG#"
%DA0V#d9iDA0dD@jR)&"A$NphEQ9b)(*PFfpeFQ0P$NphEQ9b)(*PFfpeFQ0P#90
PCfePER3J-3P6C@GYC@jd)$)*8f9RE@9ZG#!c#90PCfePER3J03P6C@GYC@jd)$B
*8f9RE@9ZG#!f8%3:
|
Changes to mac/tclMacResource.r.
| ︙ | ︙ | |||
8 9 10 11 12 13 14 | * * 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. * | | | 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.2.1 2001/04/04 21:22:19 hobbs Exp $ */ #include <Types.r> #include <SysTypes.r> /* * The folowing include and defines help construct |
| ︙ | ︙ | |||
36 37 38 39 40 41 42 | #if (TCL_RELEASE_LEVEL == 2) # define MINOR_VERSION (TCL_MINOR_VERSION * 16) + TCL_RELEASE_SERIAL #else # define MINOR_VERSION TCL_MINOR_VERSION * 16 #endif | < < < < < < < < < < < < < < | 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #if (TCL_RELEASE_LEVEL == 2) # define MINOR_VERSION (TCL_MINOR_VERSION * 16) + TCL_RELEASE_SERIAL #else # define MINOR_VERSION TCL_MINOR_VERSION * 16 #endif /* * 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" |
| ︙ | ︙ | |||
79 80 81 82 83 84 85 |
* 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") {
| > > | > > > > > > > > > > > > > > > > > | 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 |
* 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)... */
};
|
Deleted mac/tclMacShLib.exp.
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
Changes to mac/tclMacSock.c.
1 2 3 4 5 6 7 8 9 10 | /* * 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. * | | | 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.2.2 2001/04/04 21:22:19 hobbs Exp $ */ #include "tclInt.h" #include "tclPort.h" #include "tclMacInt.h" #include <AddressXlation.h> #include <Aliases.h> |
| ︙ | ︙ | |||
71 72 73 74 75 76 77 |
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
| | | 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 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 |
/*
* This structure describes the channel type structure for TCP socket
* based IO:
*/
static Tcl_ChannelType tcpChannelType = {
"tcp", /* Type name. */
| | | 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. */
(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. */
|
| ︙ | ︙ |
Changes to mac/tclMacThrd.c.
| ︙ | ︙ | |||
120 121 122 123 124 125 126 |
if (stackSize == TCL_THREAD_STACK_DEFAULT) {
stackSize = TCL_MAC_THRD_DEFAULT_STACK;
}
#if TARGET_CPU_68K && TARGET_RT_MAC_CFM
{
ThreadEntryProcPtr entryProc;
| | | 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 = 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/tclMacUnix.c.
| ︙ | ︙ | |||
8 9 10 11 12 13 14 | * * 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. * | | | 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.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 |
if (Tcl_GlobObjCmd(NULL, interp, objc + 1, objv - 1) != TCL_OK) {
Tcl_ResetResult(interp);
return TCL_ERROR;
}
resultObjPtr = Tcl_GetObjResult(interp);
Tcl_IncrRefCount(resultObjPtr);
| | | 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, (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 | /* * 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. * | | | 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.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 | * * Side effects: * None. * *---------------------------------------------------------------------- */ | | | 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
#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 |
return err;
}
/*
*----------------------------------------------------------------------
*
| | | > > > > > > > > > > > > > > > > > > | 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;
}
/*
*----------------------------------------------------------------------
*
* GetGlobalMouseTcl --
*
* This procedure obtains the current mouse position in global
* coordinates.
*
* Results:
* None.
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
void
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 |
(This file must be converted with BinHex 4.0)
:'(4ME(4V6@&M3R9TE'46GA"`Eh*d,R0PB3""8&"-BA9cG#%!!!%41J!"NlA2`e0
dG@CQ5A3J+'-T-6Nj0bda16Ni)%&XB@4ND@iJ8hPcG'9YFb`J5@jM,L`JD(4dF$S
[,hH3!bjKE'&NC'PZFhPc,Q0[E5p6G(9QCNPd,`d+'J!&%!!"%6S!N!0b!!%!N!0
bqh30TD95CA0PFRCPC+@P!+@3"!%!!$d!3,5KD[qh'$r`!*!0$4A`!*!$d`!+5%X
!!4"R!"08Bf`[9'XJ4QpXC'9b!!!$X!#I!$X#13)b!F$rN!3"$[rm!&R,3!!!J!#
3"!-%L+@3"!%!!%3!3,BJ!3+h'#Jr!*!$FJ!!J,B!N!0b!"3)93!!!6X!##TV!!"
rH`!%+&"bEcBJ3R9TE'3J8h9`F'pbG#N!!,16!)8!,`+M!MB"`!&!!)%$$[rirr$
,4!!!J!#3"k@3"!%!!%%!%,B4*!Dh'"8A!*!$d`!!&&S!N!26!"'M)3!!0"-!!"(
%!*!%$`"#G@PXC'PZCb"0B@08Bfa8D`!"-BY849K83eG*43!!rj!%!*!+J!#3#3'
D!*!$k!#3"!m!3X(8T5mNI+IfD!VL20iHrJ63rlBYUTaK0b4ST-icL,Cb*Xq!EJ2
C-5d'f19IHNm$-YRY0eq3!%"q"%&CZ2+(kI`j-M2a0rFX+fVZ6Jp8(%kTFX0[d6,
bV3PeU99AFF5L@%DHPXYFXTF3&-%hMI224pj!)aj)-@8i0FTpL$lbdS@A"mR@QR'
,NHAmcR,DY4a)"i11#"qhl-UDq9RcX5CX"aQU)q**0k1Db%Z2%C1JrFYi)[AAHX&
IcTi*J'$-hfA9q9deRFQ0Q1c+8YjdbU-ri-T%GGGcJ+I!VpZfY!Z",jVEEHEAZK*
N,J"#`G6!fa05l1!E-BbSe2lUk3B$6KYQ"'DMi6%EG,E+cilQFDAiMpc46Mr'SB)
'afT[c,K8TFI4eHqikm!lLK8(qI6l4iE!qNf8ULJ3N[VkeGUIfM"+-+BFNS!&9UF
*(#kBUQVGedj!j%XiSMFH(0HflRj!QC6b!FVSU(HGXp3A113hV(5#KEpF`M"K[5A
ZC0PeE&(2aS8)0"XKAXMa5m%T[T!!XJ$$qC!!P8`S4#B*,B3B$XAcY,f$*IQ0f!-
SGT!!IHTIk3qblNmM-l8ZkLh6d&Zf-)'`J@)dhAjC$TB'GQ1D61%RF`E$TdjMX6I
lq[5YdI$di+pRPHpB0jRb-&YF4E)de#Xj*+S5hDX4`2FZ8Z1)m'(2hDSIl66$mYf
*P`0AFJS*EF5KrI(&,L"-LcQS"@"aL9Zd88QSpK9ViK3K,aEq*ji@0TB-426D@A-
YM*JQ%Pb)X@2&k5EdS[rIfPF)N!#ILDjq"cVM1kN"5!JX(X(["I$fL2V`&Z4YM2I
bR&aZj8)3rF3pPpQ-@db!Z9dC&Chd$TQ!KJ"%["4F6,dA+LMqKRHQ&d&l0ILdjJS
J0mbNE+(BDfCYlX&*#p%1"L"%1c3#UVBffH&bPe0c6K6%pJYb%dRUN!#lN!#P9Kc
k91b*BZJUTK(!!8T%%mdlTqm)"b%e9C,2c1K@a)a88V5UEj!!r!3"VPphmKbl-`f
#!"fXk,j6AL'TrS#rNb*8&8bK9piVj+4d6!V6NdhH+-X3@@#imD8HaN)($HU*E3#
XSZQhi2&eek$#b)`IFp"EPdKkDk@6FLJjQ+T2SalaY(+GrLDe$JGKlqe&5bdeb)q
Qij&G"8"a,6M1FX@J`!*0(18Z[aG+(m'(J[[rf++p`4p(9'TEI$iNJrim04U66(%
QB-q`$T!!DVYJ3!!8bXCPCAYGlGH!8C@+S[Cqp$eK8r+bG8AbZR(h'I34[aq,lpa
G$'+[ZUT1HY"BS-kV)3T5mpIYl059ALR,'I[S&frTK-b,%8pRVCHQMX0EhEZU)qY
%Me8#Cm2Nh$QLp'I4pKiECL4j#&i6!$VJh3H5'lJMPD-Abda$+kLH"`r`$#+&iRX
hA2c1!'HR",prm)+!Qa8Cdd-cJ%+A6!CKGFZ!+PTMQf@GD0aTU+SM%hmYVB'F"S$
![I'&prQ%TfjdZ(*BYE9M-'QXDpS"YhR`iK4dl9eVZJr20TF8rI*#Hf*!NTLXl6-
%KiiHGccR&)[(+X$q+!ir@VZaDcH%JfmY(LZfNI*'pJ#6`I!+HjJejMVj(MXEcck
)fppEYF1+ra0*)'9#RlKU1cmGP@-+5)9Qb!lqEm(99$hmlc&ZH@XpfL%iJ5`[2DI
N#E`p@d8)T6Q6I(dGp@0*NCGXqFC-fq89#-rfmTUjNdYkZ*[8N!$@@fcK`&lG0,Y
TGfZ-@0[L*1jK5,6[UMI"VVAL6f&HfL%SjkdrN9+DC"9jc98c(b5J,9(XYS*ifFV
UQDVk,-J-YDJ[kHYSRd6)MaKH$9%NJ%HFZP,TBHN4qZ,Lq0ee$!jiSB'Cd*9Dl8k
`*K9Y9YY3p6jr-b%N@%jfBZUiC)X1E$%1ISPQbC`IFfUG9qb##$QkCPH9B&Zd9P[
c3fTG53ZPDhXM(1-1%mGaEP$Dim,#*%9SHm2Z-a'V'hj#@BD`J"&BA3'06QT+mbY
IEhjdb#2mqHGckiHjrE!+!'V6IQXafZ0FF(jp-G8FMF4qpqGbPeAJ+SaFI0KFIkq
JX6FX*LdS)1dM!TV[U"F1R9DjHI43YGDr6F&"&K8DC3l4RHLE[@G")A5hb&T*T54
NQYM!HhG5J$ILGZckEq65GrQr"d[brUZ#-8R8e"jeAQ#h$Zme$'N1XBV2+C`ImC6
XT-+&B+-%cJ1-4i!BZIY[I*R*(LVr5VaZda4TRBePAJKcSJ*-#Upj6S0l5U@SemC
a%BH!,(%6k&Aj"@I*,d&)2h+I0"Diq9!0-4@66V[NE6B+"lR!i-'5NFUAI@GFG1r
00-[JSN1`@AAe8M$`6G3QD&eQ18*Ee`R$YbZ@D'rlcb5(8d&D@`+8KR(Yp*[j6kL
c*#R-#mGZ6Y32b@!6MeN!9#G#bLqU@4B$$rb9Hi(++hY,A5NGhjH46"GXFQXd2Ca
UP*T$DqIkd$HP),)kAB*V3MT8kI&L0YbE0DeA"ZMP1S@FYBH@&V'pUD`L$#5YbC9
kXl[IE""4$ejh0pliViqjq1Pk3&!@e9p9qZK1Q1m(H0%)36)+YAIaTpXRef)6h+A
4PQ6R`1[XS99[Dmdmqm%5jNXJIlHaPqejXEchT@2KGM0")LFcTUD,qi"mh%BKLcB
2!"!Vkpa,P9cQS2SkeL0eC2a*a0("4%*,k5VJ,lBZ++BHQ+CM66[Df%A'$E*@H+H
K&rNZ$hIk8@6UicFj"Mr1rp*M&6NI!'Nfr#BB&0(F&%!+jrqN1"EH-Vm'VKR[,HN
F*q4+T`iS&dM4U4(ZU2'ZE"-+hj0RF``0Br210D4"Nq'0SJ*HIjU2![$m!PHrcj'
ehp(r15dIS%EIj,2D`q$N-@%CVMmM2"j@ajrQmGSK#ihfC5&C&[D,cEXSMi$NL#@
[EkJMX[(SHki#Q(XcTE36NaNPf!i'm61(j!GNl'B!e@GYrIEHcVDj6h'Z1S@,Bd#
qeAIp1`SfrGFklASa"E)eM`06Q0J$VQ%2e+,ZH1Sh&G`T#e"M1BJKH[95Bb9M[I`
Zb6fb"5G6T0SUdi5LMYPAQ[cAAqN+X-flm5EQ@V$Pl)L3!'iqlYFka3ed+b6Thlj
+dkL"F'-#!UE&ma2ICKq2E)r+,BB*p+rLhi1eMYlfY6DS!c#J!)MeJ$0ibrrYK(E
#Dj!!Rd%lEip1@PEZ,pLRV9pH0[L[9aZTB)Qj!pP-KR4Cq-L-U*bBa86D8hDSk"E
HbAk*+*1X!9M35AA1-8b*8[K[a4i%$I5F1(J`-#`pE0H40+18B&cLP26G9Qm[*0(
[p4CiRmA$XHdk-P!Hl0F#&3))9JFDZK6RDeY080&,**!!@hMXi9QP0Hm%)S@LYc"
Yfd(Qq!Q&ZjPXEbV6kN[ml[j45Q8YA6#mU(1Ip`Q#LMEa50M4E["ZiYlqrE2Lpf,
*i"f"h@8L`q4DmA%00+kYR4k5[+R3fH2#d3-R)bZ"TRcaXe3SbJ@N(*d4!hCadLM
rhBU1Tk[k+RVhLI'q*9C$"R!-BfTKZX!b!4L!VB+FIjd,S(-kH+fNHmMNjT`@bMd
Hrb$jhGik3,EBCVU,$aLbhT1'fmYbB9dH%4*1T,qQb0PDrkS55R!#!$CmaE6+lU`
`TQD65%D8BS99CrNVVr[HHME-JGiEf+(Yc@m6"m60EUJ0+&f#`A%#fa+cJlG6XHh
#Nqp20l"dC,prArRre5k08TBC,+(PU'6jNDXrX%r1a`2HaI)jiarlS[kXb5pK')m
YfR%A120J`K`SNM-'m$L'#4MYYk%k&I5c50XbY2!'L,YJM-5aRRk1[mmYmmC%(aS
lD$&ADT!!j!B"iI8M'6%"$61B*"T$F9S-FJIj0F-G%Ijc3$4"j#VP(p*aJK-%KMi
1*$L[,lI(556"+10"bC%2eAViDM#CM"kk"j!!c1%(PV0'pppS`d+1"hdkLcLN,5j
0pRIjr3e&4i-2VlR-N!"aLdU''dh$XS4alQ%c-*Z6Z!T%jbJ9V@r9X!4&fH)l"D'
Tj46)`XjSJZM-IPI6EQ@KE6[p8+I+5qjL8m0I2"RNZaSlSZcdfSk@ACS9l0qRP6[
*(+SlG`2-3MM6e#9jKMMBm(30*9c63HG#r@(5-TX+hVD3!)CiUakJe[GrNRfNhdT
aGLCUJi,FGXYFpRN6m[)km,0df25828LR$fm)k4-q8AYdp-ri9,"5T[IKX10I`Yq
Qm3BXHME@Qj&R-"Q$pk6b8Ui#1pV'4DTDh0kBepFQp"NPeh0jaKaiSDB$#8'ACJj
fAAe'M&-`*bpiQ@lS-YL$C9T$K`Y`Z5FYHZ"E[k"bQSFSQjJ%VVe&*D$NBS"$-EK
kAD06hm-frHXU)bi`h-A-q6q6Kd#!&%pfQIh[818X)SKeCk-1QD1aFP)qh1[SaHH
mR0TIF-0,2[PMi+%),ec*!!b"N!"*@r5#m)J&SK)Ge06bA08ZAl!9b3+Qjp0dDP,
ACqKDCMb-`19#qqjm[$R!348+@$Bi4&K%iqMr2e33!jB(-82hNF3YAkh0f!aA#6k
YL&pK!CX+l152k@HBKHTm!9A81D'bAe#!+4'Vh9aHKXkZeZ4YV(J6JkS9+U"rHlP
Z1B33i`P$f!d0@'j1Iq"rP$Fi@[L(#`hQfaZ$mAZNkFDF(e$dH9+cJU@'&1k'(Dc
fm(5bD#9mdmKR1YApiC956"290Z8AHE0R0NT5-BI6mDVYBQ25B2qL'*`pJRNPkqb
-I52F,*%2'!16ib"YG-ld%Lp5!("b[*S6p(a3a3-CB*IY4(DFrK$Q564cNQ5+9([
JUN99FFfQ6rVr"[VB$j)CKfhiaHE6m1*YCZYr,!YFSMI%mr5k4NQK49TmYQV-jeR
+0$$E([FmCY@M,l1jP5KKE+%k(KiC@ThaUqJ@L-I,ed*%0CCQ+"aaa6I#NqqlLR,
U*4pk3'HAN`UfE![rJ`BK`4rLeCT22hBfTfNNaE8fF+1#hpR&ZRL,)RBC`@QSS51
kS64p!A"e)1pBJ30-ffj3e#&p(9d%2DT4VqE6b@SKc4B9*AFb4Gm!F652(69rd*j
-q*!!RS-KGh,@`@+iaL&1X0d$"dJX0!Lm*X&XV[&aQha5'aB95SlH3p)AUPTcaIm
ei-9bNFk@JKiSkjFq0XQiJFibrKcU5VXUQ!`jGdJ11""DQ'P!cBjM8cHj-Zh6V%5
8JAP4N6(Q$d*k@bH,3V6efdpH&C)UeIr0'$[G*8"Q"Kap['ZUTZ0B,B'6GfElkNU
GL-l0`@-Y5LXGl"VdbEh,0ajhpqkKB4f!E3`4e1eJ2bVHfQ4#XlHmracc`9MeEdZ
%MXk*GJZ$F*m6lbdjZ(QDUamBfUSF'9[IR[&#Hb5,)fb8i1X,4ElH*Ra2iamF
ClTZ(['5QZk[DG5'1m[L6SSSA[5Gb21lGH&+T@Pdm(k3`NZcM0+pq&)mrS)!!Hb#
h+Fh*Y#pm1H'U2-K54!$*HbbFbaLQjrJPk@CfdbG'S%eVD1#2[FeV40"!eV@p+YF
khdN1[6+',B4(+r&G)2lc6,#IdFadM#I`TTN"NqM$"KHl3'f5,6C`Q5,QCHiaAYJ
chh0`LEcP6#ZZ)A-*$cK$I(5iT%d1Y[U8LYh9$f+V'TN26Qp),UMARShlbd`*Y'3
8&mD,M@I+KY2QVj[ViR9A#4TEY!hmbN)#$if@$c9EjmR0cEST&M'%2,jAQZmFbiN
j++SM%#dJ&QacLc!h@QbGB"%'M1X3Ibl`(93&UD5EU"Rc$1Q3!"*!kbG2dSV$4+0
,2UQBN`!25-U@*Fh`mi*aPS1IDN"2@JZZk`cPfAYkSZMFI$`$i'L0U$9ZSXUB4X+
V%m%6YdHpP*Y6h-VcId!Pr4R-f$0q)MA)lpK`CpNaNUjdXQ#Rq'NG`dpaVk(D3k#
dRE845q@XVEr+E4Jm9Sr24d`5ej+cB*)5Id2cVF+mQmqHmEa5[VjcZpVZ,2TG)j8
mI!FHbR9rj0(8'MVQ*2BKTc3QDjAS+L*hT6MB&!cNj[8[+(LGI&E$4`+SMr"LREf
M*Qr!cFG6A!KpXkc,`0bA&&*(KDj-N!!GT@1%iM51G'+8`MP%HAC!m@5,aA9-al6
jJT5[Di%MH6B*[QMG%L!l)![)e*J3k0j,l1#[-i@TJ6+e81-N8E1A9IU3!$0F32p
)Y4H0qrHIjQ5)1f$[`T!!5dij(q`b*2B@)la+*j+,mEb`Nm#c1N,kr9rl`P2lhXc
6U[Llqq6L3HJ[&eTFdEmlcbXh5bq*,rUfN!!ZZl#&$ZFXIZ3[I9#,'C@leLBh""h
549RKrhlB8(NGV6j)-h'ECLd(H'+Z@349V#d2TYL6Kq"S(L-r4qV5B'c9KMBaZIe
cF(#-9HRZj*p@5Na-'R$@e-(9ijPV*Lf+XNK*b)CQadGr8(`N$E8+5TD5Q&$b8U1
J,3JN64I#B)83&&)mD"dG)5$)5lQeLh*I`F6GGpkl-jJH$aQMPF"dLT1eCJ1eY*c
(pNYf9qTPH%)*pGI8!+@3"!%!!$m!%,BJ"!bh'"3c!!!"1`!!'48!N!26!!qHIJ!
!"a`!!!1I!*!%$`"$9b"3FQmf)'0SB@jRCA-!!IAj9%9B9%0A588!!2q3"!#3#S!
!N!N"QJ#3!kX!N!32!%,"e-qA86ACe@bPCNZbK1CcE,LC2i3rm@k''#TXf-IG,d1
UYIT)3r1I0@,jHqY4mp)`CR1@#)c)qb9TmBf!*Y-FA5JhlBXVIaQS2`Hj&KME4$(
"K(I12hVhfecX"MLL6'C5pi%`iZpE-3FfL##H$DaHB2qi-8h!lcBP*VFH4-2'qAa
[#p!0MqFC+8#H$fdAc`))UKbMQA[Hm`%r&4Hr0!)R%id`!#c[al5(!%,"e4#Fe3G
e%hK30hE['[YC4A2R3+G4'(0A9@Z1JKFUE90FD0aJCieK5RSh4Y,A)lC`G6@Tm$%
5k*MqG#%[B%Dl40bV'*K&Y"8r%6q0Z$`i(X*TF(qa)J*U65bRF2iC3#K-Nme(1+)
ECI@YESB6H3j%%i&9h!LQa+KiGP[99%bTZC!!1Sp3heZk+($1'66+T8CJVmII#C4
FDABB(ZSe[b1dMUV,K")h"a[G%0@DUVa,ZSRBiEN+"EidqCFTe8jZY$`-X4Zj@R)
cX,TNUGp6AEbFA(C$,aH9-`'A(c8EU`iFm@4Y*'0YG%ClZleM$6QAG&XTCN[#RG*
c*2(riRT!D4N+NBEV8*q6f4K8BNAfbHfajALdM2FpG%3ElT%"+k2@edDCYUhrd0%
V%i3-02'%B1hYaP6j5j1VkkH58Al5S!!X-)Be)X-+*GrpCB(PQM"#diCY!EfB4IR
JC895FmhRBaSVCqM@fc5*5,e3@1rd%$,p-k(HC(DPeF9M1h2q,+BBAcXmb`JpB!D
X@K1DKHS`P5&i8'b@UaLJ"CiQ0!iR%b$bN!!Kka@-a)4'"BIlEkCN)-!q6+l*%VV
KXT@%#!r!cX2S*0Xh(l9GlV(S)1BCb[ESMj'%"Zfpkj-q9GIeCel`5H4BF((,CRf
9&,(4PJXACGrYG3jMkd+0&m)!$IDC+[h9RD0&)VCMApKaYG*Gp,b3!$J`iUiEGmZ
FprcZbB9Dfh[)H"Gib1!EViQJ3ch*+`G&)PP3%l0(2-dFa$BdPdHb2lFcRCX)``k
+kjQpDLI5&0TJ@fe`B&#f[A%[0$@l8Ji(reDHT3Z([(,Tq5H0'hYbRbZ&FN[Q,J8
Sqd3ecHe93b`MHS44,6YYb#C#!`3KN!"I5a8(G*6HH$ZmY%,Y*f(09kHN&HDMGGQ
KG1mU`ZMECfiK#@DiaP,ShI%+4V$MT#'[`5mrN3CUR6DYc2qR-4qep4!b)4JCH'f
CNeC3j#UJS$X`%`)6q"Gd0)3b&9Y3-1+bidZV@0H+lZPCJ,Z,m#`HL",'2Rikiie
b(5BTH`YCbcXj[$Uk9@%AS)1i2MmJEH)I&(H0hXfG'$T4A*hT%H%BiU-X#-Xe&kh
`PI61,M*+G#*pUDTf8U(GAf!q`N(bK)Xc58CeN@LA29CY0FI2[m-rhIVm[fH@R!(
63@(L26p$E6m9ZL-24hbcB%k50McfMHR2hReeZ)U#8(ST5cY2jpML!'Tafi2,'#D
pS5(,#*AleSYeb3#PN!3"!!!r!%#d6(DpY`Y4k`!!&&S!!(BJ!*!$d`!26NB!!"P
i!!ICb3!!A+J!"de[FQ9'D@aPFb!a,M8Z-3!!1Ud!S!)`!XS$SJ(!rj!%!alrr2r
bbd3!!)!!N!HPN!3"!!!e!!#h!2CaY`$fF3!!'48!!"Rm!!!C&3!&@M)!N!j*Bfp
Z$3!"Z%KTBfpZ68&$8d!!N!q!!*!*!4i!N!-G!*!%$`"#`G5I66Y4QLC-XLL#I[0
id6aLSH3I'-#V81EJ!+@3"!%!!$d!%,9j5)QeI4Y3!!!CH!!!(bX!!"N9!!e9$J!
!#GF!!!09!*!%$`"0Eh*P4QPXCA-ZCAK`!!%eq&4&@&4$9dP&!!$rN!3!N!U!!*!
*!CS!!!&V!*!%$`"#`G5+FbDmfpl-A2J+m9VJ)2h"&*)F*b'Ff6'aAaD*bSC'dZC
6H@BC!VKk4hfECk[!-kFd4TMrEli58LAU!p+mhU#6S4Z9h*Dk$)E4Iibj$pZ0+Mf
ZlD[U$%bA$BbR5LQQ[&,*AQdZjAjkdTIm[p-Lp+qk$-)LZ4QBE61dJ+C0CC)e,6A
iN8",j@!pii-mf9QP5dhPU4,JMj6Y@TIIHGb%PKdl[#lGJ,f3!-cBVhcM"jNaQ[b
F,5HV#0MpZKlNMXp&UMqVe6jm2@iGQ@HH&22K-K2J+dDF)YV([Kr+Dj%k'MSc'Ti
bl'N6G0rD@)6KfhZd$i34j-bkXS0X)5*R)1MM#X8l!M8+L)Yb3C64!!,D8"8,Q(@
9L&+)TR4lTkK3-#3+84#q3"j+XL6q9Z3rC&ae'Ja3m#iI"D%bQ)XTPkSZRD)1ImH
)RekeiLL[5'4A`cB"@bXHR&I"6FE"PLH)*PJP"%)%HZH9+R8LlIG!3X(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!!,F%NCHh",H
3!!!!'I`!!'`P!!!C&3!0P1B!"lj`!!"-Q3#3"!m!6@pbC8CTE'9c,QeMF!!!mUa
069"b3eG*43!!XH#ai!#3#S!!N!G#`G5m(BkF1YTr8-$(lcLF'JB@B*9aKf[hH%-
%Z9SEId80JPA`RDIrD#%'$[85$9$LaMZLMK3*`)YV-B(N+e84F5jm0MA@3bTF8$D
*'A"*6&"k)F66+H4aEReKRM#(6j(XQXQC9%0)(GQ21Cca+KBR50,BY)&[@3J`DeT
T0j!!&5Ei32+`'Rd*dINrRfd,*iK(RL'B*m[0iR#emk*3VCYMYTTfGi+H5+eIbmH
&b@3KZd9L8VqjKA#05*BCl[HG`V(FNEM-[@b4"QbE36%6l,(1f)#AD&6pG)*A`rC
j8rUHG,GJ)jU1Ef9d[!V8EG&-[leM,F6d@#QQJael4r'FTl-#kh&`JZHV*3B*C$e
'ZLYYcie,jdb+CJCkh'HQlj0'j6,ci'0VhmXA&cHC4,j)ZJUeVRX@YKUHdSr++0p
(jMB*"+dC!HLh#4r)95(S-Jl)T8dNrcXS3fLeNdZpC,h5dF,JV5EU1J'r'rb1c)@
c,e(`jIhC[83Dj@J2,U$KLb@E19$8"*mlB`N8CT!!!iCC&pE"hPkTqUkepVL#!6p
k"-43%2-Q,LG2$ZQcLcfJ1U0(b8RD%rR`XbRY"4D&b,`E!N,5U-L!fQBN,A!"Lcj
!8#C,3VL%BiXJGYlBQ53Cjff$TDd)C5@U$JaZi#HZFr59$IBYY)@#4-0K$IMU$mm
cJfkD+M#[0IVA@JZppHA[L-NX&&*Gc8'+ld+,ZqY5+5%)D[V'HrTN!-0N30%3SIX
$d8p#VY@KVED&k0hc$))Ab'l2hr+h,6ECajHF4JVA52LjJkdP(RhHLC6NQ[90q'h
E)$I9i&"+VlZ"``TbAXqm*BSdcJJPA$Rq1JNcB8Kc"BHZ,a'5Y,j3kQkFY'mm@[b
)I02le)j)JdU*+D[M-Vf)6UQEZ!FlAXjRU6-9(RCFkcYeYkX4i'qReAj@["CFm(S
qIKmaHLNd0abK@!`E0pGF-%*P9q@M`dQpTQ`iH)+b9KJjH3*)aYljAEeUZ4SKq6E
*X$@M"q#*'B#aAR',$b'HcJp"Bq(R,6`jFEScFcQc,4QckZLT[V'[h3firD"dRiX
f!bV6P*U@BE4[J$'HkQr*,pL2&5iXkUCpiUYe`NM[GkBHbbT401C2Ei3Fm08QcQH
qpi"34YU&6,lFQ,X#UJE&0Pld-5[`rC6AA'RC'6hi9[)e`$*h0a4lNSL#6*3YbB4
',qM6H,9+RMV@%*DTIY52BFXLGC!![1%RAj[beX#ELIYQU+)D`cp,JFd9##cl"eh
j1mNYdV)aFMYjaRR5[Am1IMTp5M,5K@cR[l+jmN(48i"UBdNVIRl[bL$i05I,j1q
&lVIT8M'4C@B(dQ%!E`jAl3aE1+@*+[0M6l$9TYNe$"5)M#FcAC@ZE*!!A0BERdi
S8S9jdFfJGpSccr&IQ39"%AFMh#"1(rMr1-J3Zd,JAZdNUmjc5CN5)6+FIdq9-EL
mPBp,KEU(4TL!j1(-!XG92LB"DN$qaF$H(D#`D[C3Ml[V"dj1lZG`Q3J+iZS!%TQ
Z+4TD@2IpCCb'b*K[E,N-rS'-UVIJ2a+Y*`a0S%G)`Fba)eJRqVEU`(kIjNb,%KV
cSXDJfSRX#JqcYF5%aUVMPlGj[R*QH0I+(3!MP%ARh'9pj*pYCLU$#Q1UqTFf8MS
+*2a-iHaM&JA8h2j%[kSYfjRm5rEUpKf8e#l,*BQ8lj(SY$Q,#$c(%4GL*J!aCQ*
Y5Qr&@AK92HK,4#1$MbF9+1RD(K,ji3"&6DqeZkmKf*i$`1aSFZC3,fkMFTMb,`K
ejbQ8GVJUhq@R`TrLkNcJldYrK8VHB&*kHh*M*"(c@&Z'(M-dCL)60qcYb6*VL&M
B[5+JGB!"6H5%49#-&rG3T@2lFN6T',$FM0ICjBBmYmjl(!`4lFhA-rI#Ui$-&KK
@Rh-bF#+J9Jari#phE#BdbZ1-VEeHD31%a%&"l2B&(ciGr%*3MlU3!#4&%T`cGKb
96VH)B66)P&lAab[[)M0Q0NaA(M3R$,T88aX(1)[4)laCSeHdm#qIXAFGE[J1AM)
VA"'-2C'Ia"UXprq8YNAjIB,bqlq4d*QVXL!%h$KfXpeGU'4kNQcUrVE3[l0L#Dq
S3c-r)p1hFIh-YK&d"G@Eh,B[*TSP-NHFrMBml`r`N!"$+BcD$U+SHd#pIMMGb1+
#iHHrKLRqck!br"'E8X0@#4+M"`KfhMK64XdY1VjbRq#,e'-&!Q!Fd9-*0l6jBmY
4amk08hcV,YU%L6J#JbE"$DD'p#+-,[RG1rJZN!!rf![-F521f,19!aP1JeCLGbC
&#i2*R[AbiFi8G+kH"5bjBRkCGJcH*`U2+`E6BRr29#jr316J)pJ'h3%h2bRUr-`
Ee1qGEHpI0j08aaeXiUSN12+A'@e50q#e`'1pX`#KKAVKS[ImVS51'6hjc!hMrlZ
R2+X$pbN&&HRlQaGX0Dm53m)`q#H05l$@A,J,)cm!)H,aDY&#Mq52J&AQq0QPESc
!jGajQQaa!cI2EBIEY2mMR4iH(eVTbq#"bqj"paNVfJa*RBqQEF')%dI)Q55RFL`
hG,Idjckp6Dljbp$bBKfH2$STa6JG6,kPd8%Gcfl-EDV,*BQ(NYaj',Hh!'b9i#m
lY2T[1SlD)E&qQY1SZeFQ`&AG2LT(AC(UZd91@AVcN!#GUCVIpb&a[blkRC!!%-*
krhUhe"1ZciAp&K4Fm%H"$Ai8"Zc8c&k*-(a!L6D)r"k9[@6Lh2!p%$*l@P&-VhR
*S0qq#0ViK6NqY"SZTak8J&#Pd[K!&%Xq&CN4DT1D-rU&(MUjJceKkdbK`%A6ep(
[J61'4a0%d&4*RJeNRNUhrVf+FQPIXh+K4m@MUrk*BF0lqREYaQ1%(e'$q)hA+QX
+P,PYK@hRZ%TNTRV[GTq5K-[6)UKfMh6FeP4G@BI$(Aq9`DB4$N6TI`!cX&(#''d
FhYV02U3SAQi!ZU(TUHr4DR$)eM$2FN,*r%QpBS"48LQa4(K!&BRX&A[a@hBA`21
ZPHAPEEp5Z'phe+@Fm$RQ&`Vq)`64YSGN62G1L25YMQDCrC@PekGrPp0bidE)Tqh
mQqh22SANdSlRq"+M[@f(VVDbe"RKUV'YCX6b"G!m1+-9-#H&LFq)-"HlECelhDP
81$Q0PpdD#mR4Cj&p4$+m+Z`4`UZplEKTGDmVIpN+RU(XK3I+k5E9H+[9PN*!Q,T
`CCL+fq!mP&mb#3b4F92mZZNSaZ,cBCc!+2A)qK,616j6rKA@l6%T'mae[9`cqJc
jZ6eUmRZ"GqBeB,3%I)#'V,cA*ed4l$NTK-VHU(@lK#58+J883ACcQimZ,E$HG%l
1GpS(SpBBkJUM)3lX*3!(h+EkH%ZRTKJpSUb4F81l[rAc9rba%X4Y44Cp','&M"M
--Td*)iD$*0b0AV-3Gk[dQL[YD6%RekH$%*1cY688(BY&e1l`pb(eJTT-P',#d&Q
YYkVXaN,1Qf!B$EL,[INf%AL14P*9F`a#ED"ZjMB1"r0-FfP-6jjB8Bq`(-Q`k84
VQ,rB(YYCej-TEZH(m+3qLa)3@`fd-k8i!ZcNf6Y"QlV,lH01"N-mSP+X[LqTmYf
S!d*%G$b1q3KPS`f[h+[i'-@ip$0`kf2FG'eHFHD[qk@&Q5Q4*S(P@LM-H0E*d8%
9LXEK(`eAXU,`B9YlM#UmGCUr[k!5Pr)(XbRB9Z$-,4cU2$H"P94T8c1)%@D#Vik
f[MZai1YDM9B3fE$+h"dM[YR(h#APS-XEc8E4K"XrBfN)&b(E0Ip(TbrrH%e'UiV
U"3cQNG5-H+6D`Jm35CA*2'8T&RfYar9!lc&KqPd#Y9T@ra,DN`ZEl'&PF&b!cSI
bk3DjPV-D#KV,4J*QSlNUdDB*cI9cbTr3bS`!USBPp%ScITMC"Ld`9jF#IS%MR6#
`b3aZmmUGDr`!b-HdIb1LUB"CF0J@f0"5$pe2Ff@I'Z)kD#6@cfrrIGGi!()D3PC
@4q3'(5Aq$!aQ(XIhLJd-$F,'Q*A6#d(3dILIN3H4*THZaY+Pl%G+a,4,dX6E[cS
G`305ej!!6@C[Qr[Jk56QF(JlGa4Q9B[0cf,Mfc6`N!#@bD-F-[I0,3I$29r"Pl+
,53Hh%5QadQCJ`bQDh`CcjFH1SZECAhFITbT2ZRhe[-'iV&cHNX``6SScc3E2%Vb
4heRZR[!jTPq1-`)8N!#FSp[rL6pR+I)93HHMNNP#f,3l)2b8APmQb4Yj(,mlXa"
eH2f-c2SrHVX0G,D5dZ"Xkj!!-HdVc0l8"@KkSR96rrbi&Y8&0jbL&Q@lBNcAPR'
@J6#-3k!'%D9hARG+9prN`UEIeY(SdKb+i`Y)r"LTiAXqGQGY$Kj!+J[U-V*N)8&
hE,b@BmE)!DM-lcfGik)9V#2a,PH8cl8Up0*NLq(IeJh`G'Y6Y$)ZP%10Pjbhmid
&+U'D1ZVpH'XmkmVPSLlGDiGf6STdmD0k@hdYm@`GX(mc1m)iMU8jPk*cPFJJLHe
FB9[0b(9%h[@'Y[m@X[8K-mp([dLB'ZlD*iHrlJi1d"C1'RMiS8%)A8C$barMHHm
dDfXUDS!bT0"(4)@hrA`I`m3ilUPqG5q5l[SjHlBJ!8+qGjSFJES*bSm$`#`#j[`
aX-I@Blb53+IRS$frf+[3)!83H,$)r5fjREU5el!M'!L8HV!)qc2Qe$cS5)NbQK4
P"FD'EmZ&FcPMfVL-d+)[SGrSVF)CKB$$i#!M"ATi&D[c!8Ci`66-lJ")*Ke"ZKb
+C4+KZ#m$DVJ%2lGb#R,T`p*+eNVUM2l*`lGeJ!'kb$$KH@23jNPH#KCrPX'XC45
lr5UQLD-+Hl@IrbAX*6c%ECq((L62,0RcT&9-!S0I!DRE3"@`UaB'pIX5mT68%ZR
1D(eRGC!!+"iVBHe`j@(h@iM)9*e),TR#VLVS"FcJcUD4&%Sde5F"D[9a1&rLBTE
JfBBZNX!,[L@l'&fBfL,Xk)K,lCeI[a+lY4dbmd9Rf1cV5R)+4F)AY!ZrmhqcEPG
,ZAp$(*RGVALRf1&Vd'1CmqbEGmB5NdZQlJPi4U%I3TjR2dE58d9mml)R-YK0U-M
4CNHk!TcdLGKaH2@c(d*fA#9ikc9`Ze+clLY(m6T!Q%pIaEI`AD"QZaa`YdRS4aV
A6+cT%X-lmSFlh)MDAPTNqMA&K(HabkB&+@NB8ml*Fi2U+hGUXX6NXC+`RY1b-3Z
ql&I3V[`qJ!#CT8!plR6dPUDh4V,[`'(4Cr,XXrR+J!H9(Z!0e+cc53LC`BXj!rr
ddk(LT9*&p$qA"N,S$Q!!$55G2ckDc%681U$UQ$JFC&`B1XZKlmj%&dDbJ,8%"1V
!6B5GT#)4B*XXck9XR8h@QchBe)pI"dQ*NFrek0YDeH(j9&FQ-kT`QImU92rQf69
K(kc066@3!)T#YCZQ4@&3UVTU2-+epMdd`$,&N!"$#JRP!B'8b4[(3XB)2GE-X3m
QL%iHc,E5'AEF*@CLJ-P!FF4QS'fm4&cP)kIeceDLaLmjVK)UYd6)*2[UDL*(IjJ
H'ET8l*ee9qmXBLJ*d1)hMJDN++2@a)jT#Jf@[JI'(2p(9BZ`#D3cY[15D8(VJcE
c55!b[Z0%&QKP"Ni"ZhEHUPPBcXDUG0a5"A!H@ep"@q480&e*HA'e-@V2TTF1U$D
G%0&#Q8kL9#q)B#b`Qkj#AEG8mR9AAecaaA$A%Ym(H&fR"p*k"&*09L6q#5,`Mch
0'hd8305"$r`&er$Zr*CXL%J85!`)6bBUT(%r($KaJkPS*RU(#BKS-8fKG5p9@,F
8NTp3PdPfEFmq[@eRIHUmf`pqNhekc%jQ$$9#Vb+3!,8eDNJXRIA(mDV-&l4pc&"
)@*qh5$*,8Z(#BSrml[ad!mHh`D01$fI-2+A[VSYQG9ljR-%TcQIfp6+ZHUmkTK6
A&bDP+"l)L-M[&IMcS&mMAeClFNBYp+J&GLaYKRMfC*+jC#F89JIb4$"%CU#ki6!
+rFd4r&Lm(kaPc-f#m'*936a-GAUHE2*!H`TB244(ImrBH%92HGF%8K$ETGH3!#h
b6f3M$['pIam!0L+b!1dQFImqJ'qej&,M)*5QIY5&@pr0He+*02G4acbQ@M'SraD
)99[MVGAU,ZL@C-mKiQM#XG39f-'NUA$EXGcMb-Yjf)b1LQb,pSMpJUe#1&Tlb"I
,i*Ul5a0P33GX[@l8PS2qK&`hGX'NBq*0m(S8rS)`*!`2[qYVjqLBafE(RQXq[!h
YE4E4@L8c'c(I(*GbNh,K9NJ'I+Sd0Ph151Q'q@E4KALT0$-H3"2EhP!08hP63&P
0dm%0,MdbLFH`QCRM(*)qhH&hkNr%'KdBKY28M-iNN5X9$iZM"9,ikkIApdG9"#5
piC-a)NeG$J'"21m+QRNlKb`N&"`06NI[4$N[5G4T+EJmXRZFRE)S[X+V4PFJaT@
KqVSDRlP@3BBF4ik)FerA%`TcU#dBN6rFU3'YTJi8lJ8G4a@ci5STN!#AE9@N5`X
blZRP&p5S$rhU1$%)BF()Xq+L!kr5"[p#c3XJlfD6JS"rRaBcB(@qda"-0i[E[TJ
!JjaaP`SDXkDBmZ+"#GXBEBX[fN4R$'`qkKE-02-MV,)Y3MM96Ha6XLd,6S!Lh,8
HZYm`X5Ka"XYUB@[#Ya3rbmHB+#%`k%hq'9#Yc*Nr4BpA8Db3!*V&pH1fPT!!UqG
1Z+bDqlQe+qX0CMTZVDC%mU,M6mh'GpE%Iq)4iK(eaNThA+CV4P@Ai)ik"SDAe-e
DqqGFmeB@$H44*FrmAAQ1kCJ"hH)Y)*ENYKTFJalX(00PKQiBV&$jiaA%d*bNcm$
I5r($l$0hTKDCBY%9)L4f)HL6'N`hdmpa)RQm4VGT%b4TjDrjYTZ'a%1V*l8#+*L
'4DcHmhbq%hV(0[#bqJIH3@BcXkQ+'Xa0X5ZfLlb`(DIhZbQYET!!iP3YU8Nj$G(
iNj&"B[HDkV!$PDIDFl-Rc+P,,RV#ZcpkLq#aMqhX&DP-H*V6b&q8P0Xh)ebpkaR
6VR"1Vrdpf$c9S(2d"qJX+AqX0526kN#i6i52qZXcb&"U8SL,)d"`)Xq$0bqqSX1
ES+FG#d-6Ha-`Ra%p"q9!8RS-U`P35DHPPIk5Vf#P6mB`fpXR-AeU$EdXkV'"+U6
*%I,HG%4'@&VhfQ!ip$Q!#qNPJY@kT4kNPAi,A[bGN`p$'QrNM2Ghk3mjf&iTAVr
,YCiEX0,552Q0daNe'KQ*pah!#2+93rA$abT6FV"$30(6N!$a@3GL(b#iQ2!&K,2
bUi[rA4[r"R&HT&'caPQED'l#BR&UMRp-PU[2iKH-!#a40jZ0l2BFkjXACeY4I-h
bSDHLbR&YC[AbYH3AcHbL6`IAL44&DrS"MLpi%$aa6b6V+Y-D*aI+RU!c6EbGF$j
*%B*I&d4hpT!!'+[Y-'1d%jS096LZSXY$e*Rj3df@LY'A($0&I)DA%&J[CPi4&*V
rZJ("A(@Y"%+,+-G,N`#I%(@U24B23i(d,P[#r0hXR[D3!#r8M-FZr&Sa58p5lcV
jf+QDNm6X+a5Q`G,SL'T*FC8#f,Ul#Nr6Z3Ab0a%T2Zm`%PZ5"eB09Eda6bMbR[B
(p3fk("#43X(@A!(+[aVJQl`XdU'+!8Y&I,b9rGk'9CQ(SFI&MNBk[h(j-Aq$h$S
XH(H`GZdGK#Sh8JfFM(,dFHMGjm%NJIl5Kra20Fck*Bl1AlrX&!VNF"@4bc@`d@"
V&M(&5JkQGL*QNFH5d"+C1MM$iGmE*KZNJB[$i,45,aUQJd1cAQ"R0dcdpk20+E!
aFYF61ZZAJ@["9GAmr2ZJMF#mjIG$#$dcX[!5%cPhGeILXT-eUf+!35L6A+@l*R'
*HL8$UE-0KX$ClD#2e0'#GiB3QT(m)m@'a`,!K#TPYL"N(R*b"ma8C)F"@pkBqU0
%4jVq8BIjSUI"jbI*f0950hpA5R"S(PVi4XGCU-'YUKXd#jIRIk"0E&9i[1mCbe3
beLdH8"TDZ)0lXk'Q)B%!PGd`%m$DP@efTLAaAC&rK!B`5+d*"!iX0*!!P)e8("!
)"%VZq"lI*j[kS*VNBl,e#ER1QjqSj%1V'#64&8Xm0,qpTS*i6C[DHNYX4UN'rG-
@6e0V@Ic"3",86*Cmr8-$49dYjG)hpFb[j#ZXZ,HqP`1b8G+`UbPT*A!AZKX''`p
0KCK"-hA,G*YmTEje8@8kKGV8!N,A(d48l3MfCq9VN!"EEj9!5XlH@Ge(Rph"Lbj
D-J`XCBeV34FBV--P@S9GCfEAK!(IV0C!QAr&mR8$5#*8NMJhXCH2%KClGj!!hYA
KJdLF%`KBf9C2mjf"pdf3!-QcG@!U3!+aA`P4D$5*kBmrbLQ128`M(kN@pT(`L8l
!M`@6KKdG4p4XHAK,)!,ld'Y+$dfK""r*9a0LI59GFm9VVDEl9ahmb&QVYVkRQSU
%"&p55G@LmM(DT`Lq5PrV)-V2`8R2Y)K0XL+c!"BqpZkYFppB-QGk"#`dPr,Jkje
ZAhKTL*i'LMK)Qa1Q,KUVcYZ3!,$aK)8CP!FqYqrSqS118eBN#&,`KChPMB)`d)$
liQV68Hrr4Pic1lZIQP!92H#ra--*ePbrjl[qlUEM+k5pM68H(-%JAdm"&cVahKd
fk%`IBASQ5I'd@KM+c--KM'ZrUc8)B$1@c`e5J$[V,@'0M#&Jem"qj)Ecr5IIdHS
L+mXY,4UFTaDbU25&K3J+8p'!@JAXcc&XYQ53!"N4S)`Hf!0!C"D+1MZS)RAR$jJ
5fYiCAQqrii-*Zrb[E1bkNfa%E##'Z@R*Gk8*1YheZmm,FZ!$(3(%aLmACPe	T
'mf+'DrNfmS0FXL%2jPUAS(4c+3!"`NkD(!fe5m6(M2`$$V1Pp0LrTd"MAbm%`88
05'1d2@8"(fmdBj3jkF!EhrR3(Nd13K!)@p1iEElYF'k@m%R$bjV$"J&!+-TaaCa
lZH8V)L$bCYC4H[T8%p`p@BFaeX1K-N&mbpp##pJ#a`f`CP"h#j!!D$(a#*)D2eZ
U64YL,,NApC4DYFYjS5j"$Jb@m41D[+R$8JMViZV'AZK)&BL4FPPkSf#-R$EI6Xa
qNf"+1p-VYD"fYVAC-QBG)Z(K-RQH"8p6d)RQ9LTJ3-01NIkhaq413jc4DGP(e-1
p#&ZECqJlN!!Cd[,82FGTj1+BN!#Q`iL&pb%Y6q%j2PeJqXI@Ak*4(h*S,cNBD-`
`jSq9I&Y,4)dQ!rRaC)1NCRqPL3IXEYp8jpQrq9JTURVL*Ud,[%pUekL1ZBDTEMp
)'*-f-diK"*HCKjH!4RE%b(8$fYJU+1e)JqK2[&Q*[iFr[(IQNEJ3LVSSr(i#H9#
LSEif0M*dRmHD!M"PDYKq@qU3!"LUYccD1Jj$"FdaAH1-DYY-C1qZPUN&d,EQmk+
51SC#@Zphc*!!#A6Y*#23j@+BHb3VUqqF,*V*K&GlkE"AJh!MH2#GDVT8K%C*f@6
[[3Kp@R5X3F!br#ZZ"TY$8&X)b2j1!mq(UrTIK3k6rG-l,b'6@"H[1PNY,`l$l`5
",0*2EYUJ+)IK1)9[%k`,4i9Np#8LNc8pSLF-Cd2A+q1fPK0mEFmqF@KFRm(pf$8
P4h*)4Yh)9fE-2G*kJ6lAe%@XT"BPAla6UA8aV*)T*$r["H5`@&-,BArfr4h@"S'
@X&*kQDj6q8!'09ReQ@$,XKH04P*ZI4RNIP5A2qehd%KprG93lU28UYflb'ZKL*d
*BG@qIhIErTJYib&Sf+F8b-PcT2LqGLk6L5HrAVeRqAD419j8&VBl,lH'U-iV[bh
-#dL,&563rpVf#Nd5+8kL&#S)FePQmm[-,3HPjJcY6RHYrGcPVk"k$SLTHA3kear
*p1l-#NQT)bj,S)VUY`%4@-KV*a2e3!TV2U,R!2i85rM01er1+QFYfm5SUBZNh!Y
(Z1VN(hXY9Kjp5m5H-2Y@(aA0,4J9H6pSFHF802R$4"qdB`l3Z)P,BfHlY8e!cY$
P[9QVB(,+(i0Z`EVG3AIPT8-a1h&UBZd)eTSU!&kbKA60+Y20``1k"ELkQPUMALY
-UYJp9YR6ai%S#RK$QaAI(Fl4mKiK%(5b-"imHINVi4lTeff&-6K-GFi#J0r))Hm
HA-T+f62bA@D-h-Z3!"BcfL(*3dS-GS6G2d3XphF[QiSm9k$*2k%``M&"-$#`#UV
YJ%k,'hhA9!$4rP"mHK@SCS+ZlX@kIa%F9Mm3rG')28P9-@S4NQL[&*[M'MjqBL#
@jRZl4elphH29(D5qE+XJ@eT'&b!58PqYl4)92!(C[V([VHIANXrJ&9LZdl'e8e(
JT'$Y392[q9jf*KM-+P5rP&-hJ3DCX(jiA%cHQ*F`rS[3""b3!(KV3b-eEU,9m!L
X5p'V[F4Zh,!Se9j'm"*219%@T&NQ)9a@`ba$IjFC`#8,`dKb"LS9#jYEIBCpC&c
9$6TY`Vi983`3$!@P4FLB+N$T%UKjNV%U6C)q'm&B6cfqi*!!d8kcIq8bei2EVBV
5$!lPL[!f*rk1"aidUh@E+2qZeKICK#VQY)`"2DG36arS$R!AdY1$F-*D'qVeEj!
!JBN1*aq+RYCj+IGE)pSiMU8NR'IS3NkZiq1VLAN"+PUq$B%+JdVJAhj6RN2JmYN
N4l5EU%DU'6!p*p&hpDehKY%,iTi[!+L5NcSMd`[,h,@&3b+ZL24f1,QPXr13!)[
*5%PmaHR%kJ4Lr&)ZcA@cKrA,S+YC4a"be#B#3TN8SD%I%mmTaFDriic%Fj92pDm
Qb`i0A%SAlE"CmTjchJJc"ZP&"4@&0c19EDYHS1b9P$!#Rm0j2$DZ44p9*4Yp8Y3
HQ4mL83bbR24AQA(YATN@CS[q,`GErAGq-SD!cX#)a9Bpl)kKEN"Y3[XIV96QJIE
mc,5N)VAR[225i"*qXTr1p-,aVA4(PYGeZlKFFqXdm"`(Pr+'BMA)0YVI48lQ[qD
M,mi0I5XrhAIb!l[[T,rr2FEHKV&$52j!*k-D2mjlMp$ij)4I2Mk,04@%D&(2Hfh
@Z*hRa26("d(rmSmm+Eeq'$$%kZGk!MGePfD%YZKXr-1[SL%L9J[$h*Bi#4PY3#"
eS6E1M2L[MJ!#V4l'I[&18JVRB8T[IjI`IfBI5FL*l5`(KZ-3-TEdTCAYpEfh#*B
#NM!q`Jc',eSiBPmlQ+Cdc,Pp+j)XDUlQ&UU%Z"2G2qZE,&mc$k!b(+"&dlHG$FB
eTIKRR3!IJI26bSl6m3[!QR'LaYh",me0D1!&-mZQ#Ur%1`'peRle8%5p+Qj[SK#
Tqq#X2(E$JcU)5`ZLhBN-PRbf$kISQd*a4NcF"!aZKJ-',5ET0)8,YbTTBQ(6*&3
2HU0Bi3hMX#5I1@fP@"j'b1R'(#V[KT-!@eNjGSVHBid"$@2FU8[0U@8JJEAIi`J
KG$QF(k*GL1[qEDm&D5(Ef3a%2Cbk`5cNc0IbRBTeRj@[,NH3!&!e&32QX!@dN!!
d&bd1p(@5360fC%X6lI+QGa-q5j!!&3Y!BFpR`GNc2B9rE!Drk'Ml(+&qfCdNm`'
CUl4(pQ1fPUm,E$kSIPSTEUe*)K'6Z&XbEN89aVR"-Jm0'+RiLD3UYLmk-XLR[4e
M",6U"lAL+EpAX+P9B23%q`Cq-HHAT-d*'kibP(%rcCaJ(Ek(*d`+hP1L4mY3V$H
EPpqi5h3NDJY*3Ak,%kUDb'H3!(%$-CKT2*6Nf(AkEk"aJ`l-i!T#L-l@RpFe$S+
IaRIhFjr,+bV4bV"V4!G&1)kE)9d#iC(Vm5L5fHmmPi%N[K+l`8paK+2fFa"Uf8[
6Pk!-H#i&S`690pP`D0Imd#MB,5#3!&R[3KraS9Xcf0'aA`S!5dUUr!50bb(QdYp
Cp'[lXCShlASpmYmj1rb$M!N[EJ!JK$%CDm8kqYE"&43G(Sd$6!2356iL9B)93,j
JlILLX6$Y'V@m4ViVPrDBT`)r[ihkTMTrdNl(cq'A`VTU52L"(ir,LJ6c'1GQZ0"
%D(kpY`$j!f$(qMV%($8p,FX'*K`M,6'`4"eS+,GJEfRP#a3`PXHMUE$lcBeaq#Y
,DLc6l,jGA`@#0%c@E*60NHF8D0UMRR4P'VRSaXINF1*i4HlDTM"%EK!arXecalq
A#F3EJc0RI-b8rF'r+Fl0["$P8B-ZMRqBR9-,3956DXd3-[Jb)0,@V)35a8bHPJG
GDadapdEf2#XX-T6I"rVa[3AC(ICAqU`SZr&hd&,1iD#QQ[TqfkQ5MpZefie@HSA
f0aYTU3C9ccRmr1!f1EI9,"MP(&qAMAbSAr"#V@A96j,5%iF")@J6p`F0&NUaV2h
K2#H[D-PMGXbVc&25haVe2K5FHRl4%+IN#lcDEN4[TdEq"442BlD4!ccQTlJbS05
bc#UXA&K4cE-BC@$$pS%9iNPX!KE"m8PL0"I6UUfVpDKdM+'CVr%K"GLjGI[I+14
!00bq9Ld4Xil&*%QP9Cq'hf5rhJhE13MUK+!+Xl$Y,cDGEEqj(M*`A![`dK-54V%
'YlK6BHbQNKLf[82l&0b*8(BM"V2a9JE&F8X@N!$b$R2c-0VKj!rGV3k,eeAY&RM
#BXMYa`$UV$1KI9I(M,$5darjJLefAUI468r58IAKSQ#E[350IL$k*D0eFm+F+mJ
kB-JbD*("1"29"(X@Kl1UbGBaa"5TZ'%+Zk!C!aV[k%HZ9%hcHKAK4J#[8I`0BHc
cle3hN44Z"EhZ*Ejh#EJ8X9mTG#R6ZV+%`#XYpFi&a-p+%QG`Q5Q3!!HLkrVkC3)
EAe+k*,ilV`dZkLL9!hRqX34#`E#IE99Q+kJpUR$*@(li(X'laq'+ZY0RU#4+4+Y
B%jEGGdPUq!kETm,YGPmU1$lDJr8L-a(pakPH*"[6YrTJBf2G'F2Ie)"A1fm4Xj@
b#K1h(SS+K[QEaRY8aFd6q8dheYMib5iqicGH$Nj)FrAfl4J2+MVqFBZ%Je!&@JV
6'+aiN!"`q9qpmZS9MQNE%cpbbKYJ-X(RHK'1`89HQm@QMKL4RZZZUY"Ye$Z9L*B
fZ1mMC6%l2dbVc-bX3ZkdkQl+jiQ8`EcQY#GdSfpbi+iE&QBTMPjrZ-HY@-9TfS`
!,`,kr+AB%Gi""feE$*[ZH@ecB)K,I$C@6!0p`UBj3&MIF)9dFBQ"HV(GYhX!IEG
1Y8qJp-53!"a&kmQ&MHV"qI$Xk0[Q'$&E@H&BF00V%1maBZdmY'ZhI9d+P1rb[c#
3!,9@I#4XK6FC'mID*0&"-D3YJXLRSb`[1,8A['KCkTfa,lqUTJEX`Nbf[d`dZI(
$#kLfQEc9"5C30@CI02'1*C+KE[6AqGX4pITki&D+ZNCBY!5--mL3!$%SaF8+V[Z
*FBALhracD65aG[bQElpfV-i0JiHr3l1#
#bl54amfSc!V[aqVhaGkfa&Ml!c
H"Mq"E+5Q88[NbhjX9al2!!'8hBARmXE`Q@jG+IHj3YY+a#ie$9hCpE&*08l`3@L
S+*24Yl8Xi&aAFXcrj'iH)[I'P6bdA-Q*,R8bAUr1NfZUU(BXTm5RhkTNeB&@4l(
9B`dGLI"5rK-k4prB'mcNBQe1ZCjAe8B'M$!3P5l#Gr'LXY6dJ6IAkHLU!2Sdm5*
9AriJU[`e!ci@KD&dfYae3ii14B8[iU$SHl%Tp[QQ`ePHSb3S`9XL2)pK$S""c[C
mLpJ5`*Xj([c#iY%ET4PqSI`SaBfmKh(2jHCC'!414"2mX)CTLlV5+H3r#,jmZV-
V#DKbh$+P)RP*FZlTPQA$reCFCm'J&3kqIReH[U-FR"dQL6'X2j,)-PE[6FRc*%M
)URpB1f,IG5%)$43LC0YMh"q(@e`IBbjAa)Md5Pa"`l8R$9$6cF4#*dh0,5Sl%(#
L5Hr3j3%5[%Ld6r&$NXBIiqc$Ckf'GSY&mjR`cKCb91hhXKmYIZG3Hhb64+Q@V[@
P2eTHeL,lM@IQc`ZYfD#%1%e"$Fk`Z1ZmIif1lPP4+c8baq02PP'#5lB"Ml"Yq!f
)YZa@5iRQ@Jr0$Gik1iY&`lLG!a2H0i9RmN`!`'4MbE'1k0(Pj(1`!HZ%rR%ZFF&
j0(lGSDdD0,Qp-p2()EGKSj-`G&)'dCbI#(j#pirXQ1KFmA4Ie4"b`JX&T6)m%`m
h1*!!2Cd#!eY[-[LNqP2DXJZc85,EJ'1,p8SYU5i"lmj[i!4H,*b+qbKFXqNh'-)
Nr(@(*mQibHq%Nc*@8fi3Gb`k!i")dbbaq!F%Jj)`G`)ka@LKV#,j2`r(k3Lq[N[
lAp!rM+8410@NXSQ23qE6iYA4T0KPjM29cLSb)9)H&f"J@3@)NK*XIEKY!q20%k%
KHr#6l9Q(J#&qaQfqf-E*Tjdm3[P2r3D@*96$&r8SFH[bT5kHHS,,,IL9$YG&%eH
EP"lFl(E9lBh!hN)j@cTMMK[mB0h(#pZ2[IN%("S2HI("0iQ3!0N%YZ)444iQAq'
YE``9pqL5e5&1SiCQ9531X@haq&+K*L@BJiJhmhpqkF`cbF-klqA@%6a"ClQ!T+Z
U)fZjD`HSX0rPSJl5fJ-%TT9V3L!26AkV3f-E2U&@1-#1E+Qa,ddj&IfGkD&*Cia
&'Qk`$qF$6B(6UGDQZdI)"2H1SSeX((SCGSKcre'e%ml"hi0HPb9'l[(,KSHN&LI
dU,SpE%FEP4"iZ8#i[0XG`HU%-(a##0j48G%C119!C%bM&q2@jjV028UcrJG3ENN
Bj!QNf$1RLB'HT,CKf6R0fRcA-#mqLZ,!J!liB4ZRa9eKGK*lI3-iK*J[NK@X)6j
E"aH4$Gdpp["IDHMbYf'8%H422r'#(TEikPR#&QRK,"ZFl`3`Y6IY,d8%2d0k"XY
@k0@[d2f4qe-)A"fjIE@&bA-RrGVfBTl&B)lL5)i+1DY0`Kk3!%BhZRXIqN"0&5[
V5NPpKLBRZG)p3HI)43P#q!La%#M5FQ0FkUm(eQihY*SYK)QRh!XQM65df,"V8TF
+T1Cpf`9blQ1Ie@3M6DMpUDkKej3XiNjl@NdT8AQZRCjc6rq&)[+i[DM3EfkGKLI
QdMKp,ZrGUk#&P9D'AF+i0A$R#(c*ffN8&$5RcdaGCD)*bG%mc1&l,4PNQaTQe&0
l$+hG)#NQ0A4RArkhmhS4Le%VjBf4c(+pRL3f8QKQ4Q"GqIB*YMjlhA3r'mGQ8L&
fU`TY"BC'6Q`4m!bId8j'TN16a+)bQhB9b"CRVlJaXFJH993@a!rTQ(1JH[Vbc@N
G$2[%ZU9d#FE)(**QcXrRYPIk28FD6+jB%fh*YS,39jfSC(ejmBefB-R(+&G%$+b
'ZkRr&+4$l-D3!&CmpS0+S5)$fQ`,'le1AC4fY'6@P(l#)cc[e99&1ILi0V(3H[M
L+d8mh%`1YD'RQjpRFFfhqT*GCUfaKV[RY`dA4I4!k$XBrI'4ij+ePCf''kbYaQa
F6`R*+&@T2Jd+Y8f'MPrRlKR)Ac3F+Nr23l'09*l+acl1f3*c(PUHfaaRE`HL@-1
Y8#YkR&r[DE8@RH,RCcYV9f,m6LMQP'KLC@@`DNDp'rB[P6Z,reK3*Q'"iik@5'0
fk-2,#I5)US6hhcETXq8Fr9P)KAf+@(pT`kIlA+8Qk&%dE9'#HRM5qA)'K+#9!K!
VeKc'4Y&XCeaD9XH"0E#I,--G&U!)G412Dk8qC-K'MT%@3d"lLJE!3"3jMH,XZFH
l5DMPNP#Hb8$fi`5,,%8+0hU#ddhGk%8a#AHQ[kE((1$jLj3c*EhjI!d"EJad2J3
l2I,J%%E3#Ba0j"S80%k&eUjEkABUf$KBD"MD@dD$5Gk2(a"aUYp!#N,p4(hXSV$
([EmANSk9hpkhR+*8lmlDZ`d`,4IlCh-Kf%rIVVcDJh,4JRUDPK'j(SCZJjiG(q8
YZR40R65"-(E5"@q+a"!HFqXP"[V4EMJT%Lp&8a,UHiK%(k'!bfUQR8a,S`Nq!D2
"emIT9eJfSq(*aI'*[hjRAhbE8kJH[&,fbh,Lf11I9m8mV6BP,)%[Kp'B$SFSVE[
-b*4,GhHG!GB,$fd2Vq16UMXCEm8drAm`*qdPS2B$3*0,DMf98l"(((Up"XPRK9l
G36J(dGMRhNR&!f(H*ASM(lX`&K91S3caG@R1Vb!'e`qP8qDaaSGYeB3drlQd2+,
6(HKAGdr2`mZ5DdZGGQfPQNB*@)h"M[YEl'20J")S1+$KIfT2Je%FB(Hb,klrQRI
KiX,RpX-rDR!TBIKrBNBjU-c&2h!$(b`[L$VSDd9jB'@"8+kIVYH2mVmjHZM"S5r
-fFC"qLT362JBM&ir9+m0UchL8mLVcGISJTUl'4C0rqp9Y4eRCbk)j(p82B@!S46
k@3SQBAPl3lB4RA+*Z93VME"56M0rY%B$eX`YG6E@H#G9105rp8%PN!!`[D*D$!Q
P8V$3i"SV'H%e8q*EQBdk&b8QIT@3!)!9K0#)8iA0i1#Mcm#,Kb#J#1(ZGp'kjeU
NL2VVQhAXLpM62L"*D3#TNc@a)kp"rNTjSZI604F(Za29mI4'+lA**6@#ZrU'Y,M
djj*$95"[5mc)',[qYV&+p60961MXdA&9T8r@2eUEikI21G@#*3d!M2G*m[*c%Y"
[QR%PAQ+Fm!4Y3`JFVC4V&[Ad,B-#Tb"f)bMJ&+UGP`a8Xh'hG"NrjE9XZM5LbQH
BKX58R*VGl1,k6JK#%TQIRQAqe'q%!0a`U4'`E#%*'FqR)bA!K+F2$KC!rVNQVG0
RX0*TQPY!q2%$8c1KhC4`M$j"&MFa9NDA9TRrJBp3%DqKI5(!bklD3j&UN!"*Q*6
bBjb$+Z-[LeiAG,#kp`9a$G!KDb)AA,+D+MT8UC!!J)SVI3XS,('Gmja8-NGR`XY
+SKb,,mF8CJm-NGRJXlElSa%2[194@DPqBlNi2+X[Yai1`aSpV(iRmPe2UqVN200
`#pbYHM635Sh($DqlB5h4Yi`X3LrH8IYljZ18mK*rjljkiJD#mj%VD0UY(Ll*"16
b[c0YIj&FXD4mlE6lP4`eG%'Pk!`[R#lAa2H-LK)[qJaKE-,)IVmiJUKbcE3jM4K
&(r'p93`#NamU&HfKI&f&N!#H2[0`#1J6G5QSR2aG(hP`!(Di@#2kcZLAF![#HS6
M'8+-8kZMDL9"R!4kq4%NUrh2DPqBU*X6*bE[`!)5XRM)Qh+C[JS*4,'",J84CQK
pZj*f0H0(+"D@XH*C&VB)-26ZJapIZr@I'J3+@DbbR`6cFC4T[[q(2F+#KpTj&hS
PNAmI#'DiYpiX2YCN['3E5IfV$a%#&JmNlK)PGhKB`4hYi6mDiMfJprA(1IJZK'+
CA639$RYiJ,Y65BZcf39ID1@%h'@JEL$kA,Pr"IeK%DZT8A"ME`Fc5K$3T%H@)$D
Yqb#b938SS*Ta8[XHj$HNEGd4bC-iJc85&DmZrT-Z'DTVI('P3ZL-"-f$HA,EZeT
h,#f-[CYkS"#PZh-*RE%ALVj2jcc(D`8Q3PHK5L0ClqI2Y[lq8+`QMXY@4-elZGF
XH"-m-6ki@`IU-(#Y)T`VdZj+ajlYIfYKSDII4ql(hh*4,HPlUCl!KTJH"iB%Gcc
CE4lHrV!QkJ4mchX+$1jK&8T@LZrNmHKBMhQp$,E)i5'm+G1E,3j*qG!rZPffYj1
B*mR&&%!TM!DC50Xe'GQqTE2R,qa!faBLYJT5i+-kH$(j-Ba!GfS2X`e!ah1XQJ%
XVH)1d2($4#G26pT`S+UU1*N"$!&A'4IQcPQMGcI)ArZhS%f5l#T0L`&#@kM9"'T
Z9GbEY"*&3eGGU4UF-'$*5k#UM*(m1'kG!,AUDaE%e&j!&kfTU1R)IihR(J[S`a3
F)fr#f)ME9!QQ8QY*-PrHaeLCMKfS%McimHABLAY$`bTPMcFpCEEKp1j*lpf63N)
rU%BZ@p8%m3CJ4i83m`+j,PLd%(p$e(0Y)0LI$45XGmP'*8jfZEZTJ&-c`PRKTeQ
iIjHTih3#YN#P$4)Pi5+"rIcd3LHLLiRY!k`GSiq[8F98Sf&!5Am51Dp6Ah5&ebf
q#2mc*2C-4i[jRqJ#&k`h`QKTi%!SGiee1S+R!FIrQj!!aBqKf44EJQRpqaR3FFQ
@#Q@f2rhCTG(TaYU8Y2)hpiEic0HVaR+kT(`dflY61HhZ)&YEM4PRhF!*k5%ASDJ
)lNB#Y6iQ4fj$Tf#S!llN"N6)S+9D2)b,&5YldAb6q-bVk833q,,4DiMc8l,TN6Y
@iCAS*@1pPlfGl3di9JJrGa6100DVpDIMQ!T4"2N+`[r#ZY%1Tl"A"Cm%*j!!(T0
%6a,$@L1TQj,kpYI,qGh8PSHYfE*Ihr4J%!R((cjfj%f!BXIL$p(3!33p6BGSj5J
""RXZ8MQ5bE8I+*!!9be8-LIETbFXI0M'0M$9Y+TH(&EQrc[+CG@SZR!kNZB'YZl
MES'+C%i@4fml&jQTi1m536f'S(H$I'1(C+D+ld*GTd8IQp%XGi)hcT2q0abVT'X
F6pQa'8(!DkZ[E5r,1qfc0fiNkPVNVPRG6@[lDaJ"1F0GRiE+`cpabG0RHlVC&eD
+)m-T`cpD88VQaRGHh%pD"H!BVHiLVM0*bGbhi%2Pr!+BAkjd+3`H)0*q@1-'TJ-
S6-kDfUc%p$4F&4CQlPj65Uep@jekp0jbU["YM8V,c`@PcXh3N5UH&iDB++[3$ha
GcDHaeIc@!'Y8ZQ(14-[E(fmbZ&N!D$iVY6PGZ0lI`(BHE[jbl#rNPI9HQpJm2!l
L1)T"aG3F@GA#G&8-E'1P!ACb-I1)e-&e4XSElfMX*4rTXhE%4NFBJ'ARh45+GkY
Z,a$,C'1D0TYBcJBfE+Um-#h%4rQTH)Php2U!05lLL&,'YUJ49,9F0NLfh-JDX5*
a#U+Jm8i,"H@M1RQSD@#pj1ANdDMcKSiM#(922@d'9#64R@qCG@``Xa8j[mmf%9!
E$f`bmJp'6+-,$SAad6@fiaDJ+"9I1"i,P-pqqkeU@P#UV*U`0-Ir-0$-U!LecVN
JCqQI2*K*"P(5L,j&8L+f&Nc"cYE!+r[ZM5AVS$Ye[i#Al(b9!djA$MlUlJ3Ea[N
iLCQ8$qEV'k1Tp('m,i0YLc8)DPNqiS&Z*)hZ28,&-3L-#$mkcF+GBTPHXNdaEF+
iKN8)Y[jYMYhj(KKbN!$H452C)*ZPT3309k!aSi6!"SDh5)`f',0r@&F3hhK(qMl
SfP,DA&`e6[4QLhe1il$lVU"SEZ"X#%fqCEN5,%hG#M"0'0CCJDc4&`EIfi+IRUF
dp%)!1e`)lmI6''P&5PX0Fa-*HE0(FM'9i22K@2l-&G9N$*T08HM&S*f&UcpFrk(
pX$#CPA'9e'VBU,UTX!Gm)mamJIPl3Ul6`r8fH#VBeiE9iqNVe$)GKZ&,))i*Y1M
9j9ZTLiXKN3*dF2+LqKkKX"R1)jBPT[$-d%56+-6b8U'$ZI31"'CX9p31p1dB[hK
BThfCD#5q4cISd$G8l(bXVD&9p!Cl42[Z5@#6m90Q'i6ejeUDJ0@*YLQKHj[D!A3
3[Y1%`A-d%cR&58DiNJ3ZBHMbDUi3XV*bGX6AifdCjN'dYK!T8kS5MF0RM*6V-pm
r+G&FK63b@Y-lT64ArShrf'#81cP')JLfMAIafYm'bhS!3(pq'*cY,Y&GJUqj@U#
YUHicMhBBL@#r2mTr5`b$kEih6A$TCl[ea5N0`TXSK&G4lD$[IZr)FDEkEmiJ1bC
Dcj!!!XlH`Rf%dQE*k#h@d"[QF(YjV[@YT*N3[+!$'qk8`!pDfcp3#Y*$0[jF-!S
iC[r'GA$8l3%-L1UFXirU%X1C&$cmXXiT9rN4`)#IcP8D-Heq14*PjBfFPPEd@TC
[[bIaG5NVF)G36V-da@14UhU'KHZU"h8eXZi6``ApHmfA,P8PlQ+l'`r#S*DYR9M
b)a"YfN(L)2f2k36VNa3QZc+aC5LqQ*)RH!L&%LUM3h,N-&X3*36@H`0-5[bI8IN
SjG-MPi[E9Xj6'f4*[+A0i"BTClB"QBB#jAaJhYTD0(`N8-jK0B1ArhB%l*NDiLl
iZr+!b*jTIZ+rNFjCAI5dThIk1I8!4"),@T2fVCrNCQ&`YXCBa3*mbq%[YkBk"Kh
4V*!![&cH1VY[iq"F9PMHNUVYL!M,j6MFTRbi4K'JZB-#EdG&aERVU&8PQ%&j8K#
$3Fd"mF(QN!"rQU3beQM2M-VGf)fd!3+@@8FADa00,)B&JaLSk8mi0K#%HV59D'E
@)@mJTT4YlJPa9-Qd6F3L0m*`4LPba*!!a)@)j)V'6[E0"Ej,(bF+UjZ'P&TPMee
SEK-cCF3e0YXY@d0`Y($&$b+895YaGh!F5QrId3HGQc[*%eLCGF4ZU&*Q3`0B$9Z
&L%[EfMk@4-ITNjSf"00kqpJ(Bk0'Hj9%BG8hr*SKY#,"V&'RG-96&dQJ38S-eXb
3!!p'q4I$amjCVJiAFKh@Z1N4"ZX(E-c04Al&G)*fpCA)I9C)0R0,$&GUABNUHeV
L+GB*@6)X5,kr(T5SdN@$)Hf6VF`,8aF$LQkCMREUYYAE2C!!Y4S44#r3q%K[I3A
6DhCXq-b!JDbr%[IISBJi90Bb*i[5`Nj4*fl(kKf19RY2'(`ZmJJRZFA6&EFq)rm
4GK1m"e*,(&ELFXS6FP!a6,'CY2IeA$Z-dGl1Pj6U-08'4$S&RbDImXpG84XJ)SH
"T+4M4NfVPJ'+34F*rY0C-9"5ekmG9DNd%"mXBD1!Ue$PINK'KY$,+",r8JQmQDX
a!&IDR&@JVE8aF,3Jc'd@Kd0(IX0Cd[!IK0D2l[ZZGr#QSc!8"qhSYU)MklREI4R
Be8B'B'%F!"PNqK[4q*GfKK#lMTTMV#Ne0j!!$#d9-&3JIdE4rr*$8AqPbc!kaT6
GRNR%jUU6PLNJUL5TSi&HcbE!Ge00iI1cL$r982UYV!ReISQ$Gmd(e-l&#GF(+'I
[kR($bUq8Z)*p9(b%rf-paB"-`'4!je8IRh*j!)3K&c9&[JVp3+),(9+r'p[GdEF
SbfYU3Z%FH*TBK"*aSLJE1N(0F-XQ#b@1C0%fM2&cHl2reYC)Mm$F&KPB8FrE`4Z
P`jf"'CQ5acPUq@5j,BqqDcLVQm"-0a3pb3ZFmGE#41M)L)k$HI%a9XCaK4'%+[e
%rfSQrF@r3p`mADm"!CA@b(41jNKr!,%bS!a#SB9"T3p3,+f*-FA**-hFTY(ZbHB
jfijh(T'`e-N&#ilTX"Emi+Yqr998MM)(%m80BI2c4#DNTq1LV#"2IK)mP9jCFMM
XSR,c2iV3jVTR#fK[&q(ZS1l8LjBFH''UVUe)2k&iZ(C*b2k[eC`df'L6I!k#VIi
Ti!e4qc8aVJKrB`BIbhkYCadd(RCB@H66'[0cUE8%U$Njd"NqL9Pm9NQGBRcqe84
-K[Jj5Q2DbPA!P5Z8AN6'P#rJh-d![#G&$S1Nb+E9'-6-h[e(21r2'NJh@JRkkKJ
BCfR!Vd5SYr[FX,P`eifHKl*EL"pi*Q9jM6lrj`%jZ4)DU"3LB6Pi`TYm`-PF21m
UqS9d141Ucad@JKHaM,0*Ub'%rUiV&AjaRf,3lkV8iP%$BGV$Vm148%eP#I[1103
cMVMFPTae*bcM8JEId5ei[0R-55T-i+&K1l9'A'@B!`MPU5&Y-J@ERV(6$SlH"R8
B0#3meV-biUM@acT-`1Ib$jMZXM!1qF(9(qN40p,0$ULH)SlJ1Ychr-B5FXM$F9l
qNN,hSp(##0'4k*2"qbAr&(Q+Q2U&h8fA3U%ZN!"V`fe#FS0d*6iNJk9"29[,jMM
Cb2p3lb)3Vp6j6hd$URJBY`1QXhU`C)cQcrY,4S5'hI(`iXeEdGXZ+a`GFM#-UR[
fPPQ2[4XX`KEN9ihp0Nl*8!%[i%+-5UX`Za8K-c*JR4mrc(i[2T5ZXLKa*A6NcBG
&'GZH#[KDqph!ICYd!,%#MH$4GH#k#KADJ+@kq`6j+8B[j%T+i&YDV4GSBKDHRZK
MPGY6rV60@PPjDZ@iFK1d*2%T)QDk)L9a6*Q5hKN5DJ3+H#)U8+2h03-%+4@cHh6
a&qjblK`Z)%1'AiVHmG"q@'"RMID"XZ&KA9bpVRC%SJ'NjE9'8rHIET[@8q@eiRj
0dLEpHBYZ$))KaXK3%c3dNJ@3!0K)U3CdiIS(,lh#kSkmqZUA(59*(l$AM8'%!XT
G(&hf90l`++ZdrlD&,9Z,P+V!IFM2'*0IpYIfakPlCm1)Li+3!!K*H&9GNSI2NU%
[T3LY-BpRJr9)YDL$9&kU4'cYp0`(Xh0d"JLKpC2-S4#0FdDimh&IH'H[Zi0*&k&
Y%"P8(fTL&Ha)"V)@,[$3,&ahQk&'ZGDaU)4KT*CA*NUI@5jd@I,hmY,3Ur'AZZa
V8khkYfd8Xl"EUN@lHI2Z#`-9[Cd"Bl4R,RJe5*mTp"*`M8JZCeP3i0D9L9iJZZB
r&jG'&1$ZUD9qdMa'KSN1D(0p$@6f49QJ3`GfmI1,er+PCcMf-"lPj22!Y168M0G
M3pcm3"Y)qUXbl8ZE6#AE,Nj8BAhJ*@9L0)%JFmQFI!TQ6&*PXH3*9a0N0$J@*UH
ZeEQc4fL18d!j8!j@+6apV%LTST@#Qp5$N6'HH'!5PfaZPEf9q4@"kBeG!4L6@bj
&hL0pU1I'eV3qL)e[U[CXrk"U1Fm(HYbd)*h9X9aR-VSiiaZNNA1aY9J(T[2`XB`
B-0f%J)Q!E1d)"k#Ra4Y#0#rK+#$jjS'))mIbP&EH$"*%GZ0YeVLh"L5rp4'NphS
X6C5LRDaFA&iX-,9L'LmLFLQjKk@@@Pr"48ATJSmk-I`!dN9'pdj!"qVpZ`L08Ym
VQ&5C$cNlH!N)UMbqJBBZM6e@L[d[A`!H%PQbN!$jTREdKaE3KEkZX"LmRFQK3CE
I`&j-Sr8,%5eamJejV+Jb&`""!l9d`U&3#5b*`Pr$Ar0BkP#+!J'ThK*Cf,'MVTD
`""c@`S4)de[$`ErR-m-e"0L9f+*,K$lEReejjfk)ELNL!qeGDTB$6(GRFLhk5GH
RTm"UTIB[32#"a'aNlTqSQde+TYB%J2lm)1dj6ll3qGXZE`D`NFZmaBQFYe2Z2aD
Qb!X'UHT'[D9aTMCFf`e$BDhI#1bc4Y"qSraRU"kY&5eNifS8'C0f4HNr2!hf0CQ
HahMJ5'h*B*'8B*VT6%8IlmC31"F&$&$Z!XcSjT!!1LPh+Z@&lVYS&BUJYJjAB1!
mEV96'#-"9*heH8kNQcir8klcG%JZ#!4ICcr5@[fE-`&"fZ-bVm8*LM&96C%E!,T
G+&'Hp#ASIRrHZr1CZkrRYq['eMp$&T)qm&X6(G%S6-XFpTS,[1LEch)VKZZ(DUr
C"THmEh*bm0F[)LDA'aid1*!!Zlq`LPB[@SH8[$Bdai,fcT!!L9&DVh2'%DX%UDL
UfLDbaIBH2G'L9fGQjd&"&dGX,c[,p2eki-bGTr1h%A(h)cY@CU0pEZ[[#CpX0Xa
rG$'8p8'Q4BDL@#M9Ym*j(133H#%%QQ+MrT&42+ibbh2+RFTX$KhQ`A1f!5N!eSQ
Q991eIRCVemRp#',Q[eAbeYfk+8QLi[dkbDi&!kV9Fj2ACeP`8@r)UD#R)8AY#"I
+0p!pJ2,fp'+PFkVEI#GhJ9"SN8h1,$)klNrD5T1UT9i)@i#h+%,P2)cqfXX1Ypj
)U-Gqd&F%rASMP%Qc6GK$2HPHJJMGm4hKS-E&QrL#T3%R%+&f@a3Q4miG%$@4N!"
N,VRLQ4YP'bD438pFN8cfdVY"pF"pHB*#!UZXK,V*-4@LfDXQJ$(-l(e%rBTMk-6
5,q'GM[-$mb8)k5kTba0IeYfc+`b%M*lCF,hqmVFjj[XFCMJX9h)@6$H+H(%lfkG
Dq+`,@`V1)6MbU9pPeRV"A&$[IJP@cccVV&YXD6Gp4q9KXdm#(#NID"$BV'4Y0L#
LVC!!PdY8UR"Fh(V#lJl'%%`QAC,Ec4X`cC,pY#R51[R*cAT'4600ZTjMM"8"b'm
q*Rr`IBfNe)&e[T5US3+q,bF#UM'f[0(T@CaRLaf"r$-95V&%@EjN59hY)K4G&4#
TC25'EQ+P,&Xc"+V[ee[Z'5&qME(NaGmR#2iM#UZA(Rj6Yp!h1qB1VKbCic"A*Pl
kE4c3,HlKe"Eb(mX5mqNB@)&-Qk[0)9DUX,KYIepU$PKl2*`X88K6XdGKZC)PHPh
&MiFA*#fJL",@CaK8#k5cYTlCKMBaJ,9CEI&*P"(f,e%8(Qch3)I)*,aN#r0-&ej
@UAdH,4Pcb'P%61Z1kQG5TJ(GH,!Y[88(5lXIcm8P$c'*D31B4hIppG'@RfZcScQ
Y-f,+!DqhB10kLFPX0TV"U@U0J6qI5[eCB9B@YbIFAPPdV69X2I4JjK`+CT!!DaK
l#iRZ+'C-1FYEMlIET$A!L-J@qKA#CP[HQr'0jNm,M+294lDV0`LZXL&Y,N*+FNL
!U*aS"(NLrH90C0Hr(")lhXK[aHU(GFcECc2DP41-ZFc3!hIK8m9j8'ae'V)Q',T
*F&imC3r0&YBmRV[1*&K5f6@CiJNAel)bN!"plLlAm"5B"qK%jXlJ%XL2eDF211C
4R3B!CKr2YESG+B"3J+&()dJDII-BA#""dm-ZGdl[@FEqQB*'P8,&EKA,(%$$-6r
aQ6$ECU40)M9EJe)*VAGNJSd&dNre'1d(65CNNem,5)Hp,TM9)Fd*b6bDrRP&+G6
C(q508N[HdL&3m*Rq8,le%Ge&p8l1S1+U0cr1qUlrHk3BChfH,45ir0bLB@aPmIb
MAIDLj0NlemlU(r9*PGbR!I&M%[F+6'rSPc'6@A9-T@,0PXIT1h0E@eIP@FhUKLG
jaT5FHejK*1-R&'jd3pN5`3(S$,jXhhH1f4eh(#2k0MNJAfA[LebJFjS2mCaKA#&
TCk"%`mL"(cr&jVV$l[U)(j`[A@r@$YCIJNF29!(h14%[P0@63epB4@Ja"JI0dET
*@ZilBKEL%cKiX@&'EdN$"5+5bJ-BF'EbcAlrB+,,'BjTA4R'2RXXN53dTR8hCfd
,Rpk-ImaSm(ZXj3LIfAj'P6lch,0jJ28@)6EJVb2TJZFL(fmiHE[qNrr[jVc+C3F
PK84Z,*T6G5A@HS9*C)b!m'Eda&c[#,RNXD+XlcRa#1+e8BH9IX*4Kf*IVaJGVpR
Fp`khpd$QC5-'%5U@ek)2&AXb`ANDimIGPrqiK$50YS39fi'PX(#dU(bC2U%CHQa
1Uib"ldVZDJep3aH0#$H-*K)VChIQ8A@J39%KCFjT6lE9B6G05MHA%+jK)%JHK-@
Qm(@DA)jRj!-2bE+kGKZUC&N&iJJaphaQ(hc+QZ4LlNZjYXe`S)ML5m%AL)4TH@@
M4*fhXCaD2,cj-B%J#)9el%fX!HEZ+MfXk5qUd,dUcqR@d*l4E1cal"VSRkkTRrF
6YR@B15pZTMA6KjSE66E&U)AJY!GRLPQCR'JU`3!2U*`['95iJM@[62kMBBTeB1&
SHlA@#jk#80K6$F*H9rd`Q3dX%k[YGIcq3**03!PR4iKU'6!pfpL1iEXFerANpdh
h2a6cH)IHdkY"Lbi,"4*0Q,#Y!)6+EbL[JJYEbLIApl&a,aY8j@'cpR8c0`-"j13
TYC3c5cl5C@ATJA-F3V$#FEPFcA9ae`cq$elG@Z8G*RN+KaXlqfl"lcfUb0X6aNZ
`VM**CV1EN!$m9DCCIZC&8b2QFXQf@lUJqXpa-C(iJ9`AI!'e&SpaKUI00%Vi"[K
cLfrGl3Q[,Y4i&(Fb#"(iKKFFk3EKSf5SY!DX9#N-Gd!`SV`cc4m!"rYT+GdlTpa
-IN8Pfjj-`mUGUcS9J2bl2LSlp+1A[ed5CcCARV@m4eRZi$X$hJVEk5N"N!!&4Zr
mM6S,09H0dkdJ"+mr'-cFYYHIleJU2U%)b1PU3P1Hj2Al8Y"(EXQ$X``FRM6XUNJ
MBi2bFr)'iC*F`+R0NQSie2H)[UI39T!!BZf0kBd-FjI%DaRl#6p&cLNUFj)AJA,
3fb$HRPHD((iB'F2Pp-pG6+hGP4F1&5T%b@`baDELFb5&(12Rh`Qhq&+!'S1l6DY
BX*B*[F"pUeV9EcN*@3ScBc2'hB++R#K[#(4"$fa0Cik"NS1+`Hk`4h22CVNm)%5
3!%F$fm645K2Y1IcG[GcIVpfjbfjH,M(p03(3'(BB4$BHCUSLrPq41hIC[f642fH
DYDkJRjjmNIBbUi%6Le*Ca6dPq&kN#0A92f`45`TL*hDK&+b,Lrlr1!0C%223HRc
`ZTmkcK@1-%L-2%rVj@NeHMXj!%"+T0Pe5(@@h+FfQ,Y$Rde4jY1IJqH#YKf)BjR
b1cYR$D-(9pfh`r"2a1V&pi%4V4P*j4XF$eQ'Z6KN#'L&A9)YYCI)Q#AbB[L+1r$
QP+8@RL%,jBr(p&XSQD5&LH`dIfBZM%bT*U3(VAb[Y)NBIRZ+N!!L[BDMQrJm*hC
$[4bMR9qDP2KC!,B5C5PVBX-!6XIE'80f+ki&%f9pir-JrY8$TT-EUqRT`#PF`55
DBLbbq2L@#qZk!S50r$0mZ0Ic6k',()[-TTIV2YCC$3$r6+3h`+@3"!%!!$i!!,B
E`R'h")c#!!!I+`!!EK`!!"N9!!jCU3#3$Ne[FQ9'D@aPFbjbFh*M!!''f&*68N0
%Eh9R!!$rN!3!N!U!!*!*!F8!!!'(!*!%$`"#`G8(%kET#Kj)d"X[(CU81hmG*$H
j&2YF*[ak4Rfb800jijq0BYGS5AVUk6-!prTfVU[,fGl'J8-JJ,!EiJdX$md29%a
)AZKdc5iPA'R#Zh4T#P"G%lIQS,B*LK"0D3XGer9&)+Ea,$QV@QBUFL)Zk@kRD-%
4Q%+V`b5KTHlH0-rmF8&CdBjqd-4UR`lVN!$(VhC&DPq!Am'FkX92i#klZjR[M#D
04d9'2Kb8+*SDpY93-fLfGAekNC!!YS)lZS'hYfSV%'CAVQrh`kUam%ZRL%'!q@#
Z)!4j%adfY%(-lQXU@jjMQV![P(X&fX%4$mQ$3k99$%[p@DS%%&ai4b@50b2jC5C
lcVS@JqX)&l[INPRb6p-*YpYAR`4*9qYD@6i0hJ1VhC%N23,&*NCpimaJZ4!1Xh!
JNb6LA1a3JD`I$)$LQHpZF2JiPZK""&&DSl(crLAE4ceP1#B"KL,K[r5YGG-*f+X
1YQiPPk!Kre[VE@c#b)I18kc+9`QKGprlULMRK640MDc24J5PN!3"!!""!"#eH8L
*Y`5c*`!!E#8!!()5!!!C&3!4IlS!!!EJ!!!#&`#3"!m!6@pbC8CTE'9c3f&bBQp
Z,Q-!!@%F9%9B9%0A588!!,(rXIm!N!U!!*!*!CS!!!&X!*!%$`"#`G5qFmEdFN$
GmUIG!)L#"Xf'1h"4%KY#*ZZYq"E&HfLVNVP4HXC,aRQ5P6fADT%[%$dGi+j,[d@
G948S'"j$C&NbV&ZHZAMQlD"e8q0+Qk)eAmBm$Va)qV,5&+SpEb12j*9&rKIY*i3
lbq5IB2RcTF(81,qHIhaM6%L'l8541m$+C6&,[,k9!HNiVU*+LDQE#JcCQ*D`[F6
I5NPNY-R3Rke2$Rh2$3I4&),F%6mU,3,+Q#`*#N)apA4d5SR9#[34eiZrm0@3!"A
*CXf+%P1r1eahdD!39J'c2-EmchN"F$fN`MH@m%5m@IkLZE[*&%EBB#l&cq4eI2A
QrSKJJ-eC$"4YJk$RAJ9Q)PPm'V&dbXbP[2,61,,-DVB6i`PX9rCTQjr``9`GhGr
G5qk5D#j$8#KFMZaeeQTF9BaY1Ph)S)QkM*&b6-QcVGdh5rUY$0peG-[T,!B!d'8
@+XfRX!["FN25cMC*L,@QZi@F3%,"e-he9jh`$*bJFENri,HQ#ja1!"T(5NV4+q[
VaFRYq#+U4($K0jQh9jjkDDYi%CEaV,kT4(J8eFcrmMPf1!9m8L%*PQ#lN[I%($`
%8Je,C1'D3U-289daYHRr#HY)p0F`#c2RLc$e9`LjY2A1`Nd56K%l[223%6IN)#K
J2I5BS9*iFKl9P0F`IV+rjYa`r6kqaQK4M9K0S$mmP+jXaH-8ci*i-hrE5h!Vj4R
T!V+`a@alETb)hZq"'QITcHljLFled'G6[#iab#8&5(Kp$bQ$C`m[#j22#qbiLm`
iYqDQplGCj!HN2fFFjf95KP4DE-SH@IFiN!")JB'h6AQhY2Z`J#A8rD"T#@C'PN@
SJ6*45*)pL)16hdD(F4$T-'rSh`K!E)'A&f6ZPm)1qaYJEBk`md$ZKV[j"YMcQiH
R$Yd*ZcYmN!$ZiP'1el)`D-"@Z%5f"Ae9Tp1M%1r#KrBZE"'#)Bl0YhNm#NmB8e@
Z5Nap08d@2MM*V'5%@#3E+IpKHD0MfmmAR1kc5`+`q@NaGAXViq6EmS%jThdYp+q
4$aCjN!$Ij-E4'Rp#*)R'I1P3j9DrQhAM"RFk,8JeQaM1*$TU+!Nl4V&VJ9Sd3pX
)q5iRmiYA8Kfj&3h1(*XK44#BF'Jr@2,Aa25KDKkFD#q"bEK%&,MI*UHHAKCS'TD
kFD!N8b2%jERh9BmZL`-Be6lT`44TliS%brPki!#PN!3"!!"$!"#eH8L*Y`5cSJ!
!EK`!!(3i!!!C&3!68+`!N!1Y!*!$53#3"!m!6@pbC8CTE'9c3f&bBQpZ,Q9iF!!
"T8P849K83eG*43!!XHqal`#3#S!!N!N"QJ!!!@J!N!32!%,"e+8[*()C!kAbTpd
!L))'d8a2$T)*Nfq6,kV,#qIXFE%H'I86IkFCcdTFX"C)a8PCDRX%V+0QE"h@Pa!
f4#eH$l@!bcUM5qQN'emXr([Ij(-mV&Z,a$rm!M3%pTk1dE&Xd4pJ)@e(B(D1U#p
c)qb%9iK5aV-XEL"bN3F"JYNpNCDTUMH5[jTpihBJdV-`HP94UkTJUI6k$3SJ,Je
G"IZ"mP"j52Ip'NCT,Z45bl0GpNQ[GNCC[39jV5KVcd,DI+58ZC2*Bp#2PP`X(#p
h#X``+,f`3KUMGCeYZYpRN!$[j$G+h'*R`82U9k[(,Jplc`2QY9D(qDD[+iAdqGd
l$D(dGmchEX(449ZpDDPJp$#'pJPq(F6@f%K9lhDALqNSMe`L9KSZ+bqPSi[Hb3(
ldT+YE(32kA%058p8XQMI*6M#iiqU-JJC$HpFj6l)D%)4#A'YhLHffF'A%`,8q2D
F"Xjf,2bl#bb3!(V83X(8FUE)AQQE9f6'#RMaZL&GX2kN[Yeq,d(d$FZBpbT"[hF
R*CQj30cJ@aeM!&2-m`3RM,3m4Zj6L($1QL4!P(Gq*KUVh1R*5+@3"!%!!%F!%,9
NM1kh",BX!!"b%J!!GI!!!"N9!"Gm)3#3!kS!N!1&!*!%$`"0Eh*P4QPXCA0$BA*
LEfj3FQ9QDAJZD!!"p2K849K83eG*43!!rj!%!*!+J!#3#3'D!*!$ZJ#3"!m!3X(
8ZU1&L(TM-mLkEVjK'@%m[NR)Z4k'abkE6,,Y`QNl)dV%&6-Q4qdEE"[ceCfIV`r
[rX`E4q*`9[i%PMmY#q+#5pr'b@Bi8@DhK!kKlSV!B!VA0((9%l&(YGNh1e+0[V-
C%0N2iR8fM%M!Id$fmbAY$9Hkk%c*a-lMRh'8E[cfXmS#-HG&I&Gr2,pCrH@5TrQ
0qfi``N&"[28U5,@F#(jq@E#pcCCXlVKJh`l3MFCQTIaUm[ZKZEe!3X(8LR0T,Xf
Np,5XLi*8Q6*T19cKEaM-HIiBG1,9TBSR42PUF'H&"l8XY3C2m+%@5JiR%91l5C,
RJ@+T'FR%'-C(Yri[B3D*lbk89T[SRL%`TSD5B90Zr)kdA68FT(q94Zf'k-P&Z)m
DbkE6EX[5S8H+X@QFNc((+lZK%lXb[@T%R59kJ+@3"!%!!$!!3!#3#R3i!*!''48
!!1SGrj!%!*!+TC!%!3!!33"!YL!"+,F,86B!!"N9!!#!KJ#3!p-!%D2b!!"fK3!
!%Mm!!!S"!!G5G@jdD@eP)%aTBR*KFQPPF`!!$`3"E!&Q!XB$6J(!rj!%!Klrq2r
`bd!!!)!!N!HPN!3"!!"'!!#h",PYY`5jE3!!GL!!!(I[!!"f)!!@l-J!N!j0Eh*
P4QPXCA0$9bj$BA*LEfiZ4%a-!!(`2R0SE')rN!5!!2q3"!#3#S!!N!N#Q`#3!r)
!N!32!%,"e4JL31qBrh$r#$T2`[2FIqd3c1i$f"@[UcNk@4h1R&44J`Q(d!*QVh'
3!'+Bk-X[UKK()ijF)85AQd2U3kIGi-II@cNiLp"fa4@bk9iHN!$68*KjhH!CcU,
5h"PHk(daDXh#@Y)@5GTM[-2!)B(BrSQ8U)kB99Y+cdA3@hLK*G0I5)c5*k91`C1
r0GbUqFXBZb6d)RKjeAPS)c3mmT1@Q`BIb)qJ1N*-bQEP%#$64E,+2TQZBpiEVJ@
2jiGeCQlMhX+PCSi#IMkP2,UMN``SjapR%A!49N#AMU5Z6b#HC`pp@jT9kV5!Bce
l9cL+@p[4N!!!TC!%!3!!4J!!Y`5jEEF%Z@d!!(D&!!"j@J!!GL!!&Jq@!*!16@p
bC8CTE'9c3eFZ3dC00MKV,N4-6!!"-#jcD'aL2j!%J!$rN!3!N!U!!*!*!TX!N!2
c!*!%$`"#`G8B)N$[Q2p`r`Jk6m,ch(rXiqHeT`&IMcLacXLrZHNQLf&JSD8q*1N
Z$`GMGU!e4+&#pDk+aaUX8h[j[BDfb`CE#%e0kfFDQMHEHTab2'A(8@LF3m+$RKr
U+3cYd'X+1HGZA!Zb+)2dqS@LYYZ*f[#K0FME)XI"kffT!!Z6`dP(rbf44(CqSGi
*0El2Xk#MmV#2@-EZX5If3mID!521lT0aBP58e6[!60,K-3G&'eD[qR4c18KMA#*
ammbI)+I'eR6r15c'ccT&Mp2C8P$CE'B%0-EBj`-1D((RM9+a@EC6TBl8S+L$lEN
&b+@cl6D41F#PN!3"!!"$!!#h",PYY`5jE3!!Gqm!!(Um!!"f)!!63*`!N!j0Eh*
P4QPXCA0$9bj38%-Z4%a-!!%Pi(0SE')rN!5!!2q3"!#3#S!!N!N#P!#3!qd!N!3
2!%,"e4JL31pUj6$r##`TiIRZ2rCJef`-qcJRFKlGa@rQ+JFl#Y26RdYHcImU"!m
3XFAhb*MMqrZEel*$BKem#&ZU0EcdF1e$)FK"8b#ZqF3Yq*VEN!#fiCH"-e3kb(!
IeA1"q5QTKr2+c0eCFqrVCZAQ'VJ[Nlemc4q+hU*qX5%#3$BEZ[XUa`jdQ#E3SC6
b*D[Qb#DLhZ-DYrJNS*YSFS82ajB+,U83&(Be$ppbqPd6B1MNU-)U#0j*G`@4TRh
3c$iND`h,$C-YdJ[5Zhc"b%R0c1-TS!kJ`ll`$(Ml'4G"&5Q8m!6Xj['m)J#ATS#
PN!3"!!"!!!#fm6)HY[%b(J!!H9S!!(`6!!"f)!!3iam!N!j08d`J3bj$4Ndf1%X
Z4%a-!!%[8h0SE'*MCQeRJ!$rN!3!N!U!!*!*!SN!N!2P!*!%$`"#`G6U30B3p+p
mK@GQbh[3@bE'DESRL5ca%)UMA+)@Ei'8fDG"4dpZ91#J*,%"a%Nri9%RImjK0PI
%j*D$a2[[QGMVm!,p)3GP8[HPmlRL1%5STUhale!V8SFj1"e#!(KhXrf(NB+e-5C
,C5lK8+[PP,IPbaflBkR!lT!!@i[bZU*aG"UIS$$ipP,pI4,E64F0&J-Q*2UpUKc
4922FXSMh)QbU#"klj,G6lE#DSa$pj3l')"0rZi'jTTAA+@d@"HDC&#Y0r)ITHM+
'FdpD-kmkmA#KGSF$#JPBhIhph$3QDJrG6r@+B+@3"!%!!%B!!,Ea-Iqfm6(r!!"
k[!!!IB3!!(BJ!"E&&J#3$Ne66#"09e*eER4TE@9-D@*$4Ndf1%X!!4i`FfKXBQ0
QE@H!!2q3"!#3#S!!N!N#V3#3!rN!N!32!%,"e1T!eK2i8bb&CfD*B)5M*XCTThp
ep%ZHIR@p-Ip%ih,E14XdeQrbm'Y4hch1a`PLSZaGC)&JM`h-pCEhDDCqBd,%GkB
89&mrk%d'mURXH8CU8XfF3XB0%rfepPaNc8@QVfLf[GQEhJ@1la%KN!!D,Dp9EVD
-85#%L'X3G5+Vd6*rLrHP[d2q)5K0J%(j3UYfR,hhV1PCjH@SAS%FU[PEe4hrAQD
ANqDIk0!PM3ap@rjXrplm`Z''HVk-If(baYd%m9G(iA(fUABE$!L2M*KJlS`XDXY
eCcLC)Q4MlJpJ#PXPJ5R+KrD0*p2lErh`,QK1DSaS4amcKN#PN!3"!!"#!!#fm6)
2Y[%b$`!!I"-!!(lb!!"f)!!5Q,B!N!j09ep08d`Z3f&bBQpZ,P0SE')!!IBhFfK
XBQ0QE@H!!2q3"!#3#S!!N!N#S`#3!rS!N!32!%,"e1T!eK0Grcb&Cfak*Si$*XC
D535IC@hD0q[pBU%,+DlE)IG09DkiVe"Amj!!1iPXFS'8Fc"Rea6l*8jcRIKTT3X
82K45GhG!KTmV45m*&1VH&*cDmEANeM8RHf3L"b,HMijr)(NINdSKck0ZFi1r([`
@MP!FTQajL0(Mc@mIKc6`'R*e"`jQKLi9Q9S(R3ZEFl[ZHU#+N61,d0Ye&1LMpqD
B'*8R@1FV3*D-4EP$9k[33Far-dq8S*Dj0T(3Z*[jq#EB"TCKR5#2[I6qjH3QB'f
3!2Z6H(J&$#ll6Umi)e)P`!2aXYcq`N8TpK!##KaarIj)A2cqQh!kJ+@3"!%!!$m
!!,Ea-Jqfm6)2!!"pK!!!J&B!!(BJ!!m%iJ#3$NeAAde66#j38%-Z8fKXBJ!"iQ&
cD'aLBfCYCi!!rj!%!*!+J!#3#3+F!*!$m`#3"!m!3X(8kN$@%[FFR)9RE(SP%V-
QaPk),i4CkjGR4HCr0A%+p'!mdc9GPGd,p'p%(ra$8KQFZT6pU'VErMZDqZ@hPY&
fUS1+lUe5!5k!8G[ePA-84'c1i"Qmd`-NQ)DX0MjrNH&QL6#cI5i##d#+RpED5Bm
AhcA4S`#[iF`Z9NiU5N-PMP3NjSJB#Ck&a,FIc*p2a&Ne(Z"XiQlZTq-rE-Ji6-I
XbHd9U6&DX'mk$5CaPQMk9Kc-hZ#k!58h'GZem'1IZXI,!l5(B'm'PBN*T`+ESl%
,9X(d(0UXRcZNk*VTkel!GGdj86%&kD&rpiPlh5!dak3!TC!%!3!!-!"!!*!+I[)
!N!Cf)!!!*P2rN!3!N!UPN!3"!!!`!%!!N!Tf)!#3"p-!!-#crj!%!*!+TC!%!3!
!03"!Y"eaD,Ea6Mm!N!26!!#[BJ#3!h)!"34e!!#"$`!"4Xm!!#j6!!4#G@PXC!!
!ZJ!!3!!6!Z%"p3(!!-!!J3-1rrMrm-Y%!!#!!*!(TC!%!3!!1!"!YJK,ilEa6M-
!!)#f!!#823!!J,B!#&K8!!#"D`!!+hN!!",5!!-S3f&bBQpZ+3!!Be)!5!"T!MN
#+`(!rj!%!alrq2r`bd!!!)!!N!HPN!3"!!"$!%#f&lE"YLBC+J!!J3m!!)@h!!#
"$`!6IV%!!)(5!!!(6!!!!q8!!bK6GA"`Eh*d)%aTBR*KFQPPFbN!!2N3!%m!9J*
"!J!"`2q3"!-1rrMrm-Y!!!#!!*!(TC!%!3!!03!!YKHf`EBAYX%!!)&V!!##Z3!
!J@X!"4M3!*!15@0[EJd!!DiJD@0[ENe"3e0!!,(JXH!!N!U!!*!*!HB!N!1!!*!
%$`"#`G5L`,pNj(cG#Y)Cd!IRq+M!r(hll(3c@PLL`hG1JM48Mq6Q'G&-*Hc%K&&
%8h'&K0UT'Zfc3E*aKEATDa*Y5D&A@c8$F*!!96'kY5GBbhpPh%XA-p&!GPfq@ce
PdiQVK09[X$`C[ipDiYkQ4KbjUd`aC8Qim`"CJlm[2'*mT!#PN!3"!!"'!!#f)"f
CYS2,H3!!JG)!!)3N!!#"D`!@p"m!N!j0Eh*P4QPXCA0$9bj$BA*LEfiZ4%a-!!'
JZR0SE')rN!5!!2q3"!#3#S!!N!N#Y`#3!r-!N!32!%,"e,jdKT!!E1Yh-bGa+)X
[3R5*TDVZ$Q*N[DdalF$%hJXDh"$RH$GUMreIA-8%"(qjrc6DMYllY)Z*)Rj`K"m
'LHq2-bHlS-0@jR%$IMTFH+!+dD'b!l8TKBJl8qm'8DcX#lF9eei85mBfJK6m+kL
VP3AME)A1D+@2F`f1a1BRkC@fkP@fcJ!R[@8riA9hkJ[VT8EaPG,*YKSa"R,EU&J
!-RRr4dbZGjUS%6#M-kI4EAeJb,ZHQ6GHUarT!E#A'e[($8De3"Jhl'aV'[#V!&G
C`&mcRQ)"6,aQ%5ldY-ESdbMq%imIk"&$S*a"'6AljQTi3!#PN!3"!!"#!!#f)"f
CYS2,HJ!!JVN!!)@(!!#"D`!5QfF!N!j09ep08d`Z3f&bBQpZ,P0SE')!!@G-FfK
XBQ0QE@H!!2q3"!#3#S!!N!N#V`#3!qm!N!32!%,"e,jdKSqI*MFc*jAh0c,#G46
lFG$DfUBe"k#AFTR4dal[eHarU4mSpf(B0&X8R4q0I)6fca,kG*k4jjlHU8Ck'Vi
IMCHM*@jQkVY'pH#656j1j6#"c1@%R'18akaUKJN*YeplP@FNU)&a!$EQD#5N-+E
IH8rhae@!R)LhlDT@`r+%Q0i9"J-Q**ZG@S&'SXAE(&2YCUQf4CX(QkV-`N6bL0e
f(rB%!,ScdaR0bEGeKd30bq14jaN8pLd6ApYKpMfQ9$mr09kPiRVjAeQbB[Na`dJ
)M'6$bl@cXD9,5#dFeB-%44b`R0eXUimN`r!!TC!%!3!!-!"!!*!+K#3!N!D"D`!
![PlrN!3!N!UPN!3"!!!e!!#f#%[MYJK,i`!!J@X!!)EV!!#"$`!&1'%!N!j*Bfp
Z$3!"UVeTBfpZ68&$8d!!XH#ai!#3#S!!N!N"jJ#3!md!N!32!%,"e4SF1)aDQa)
RpZ5*#VcA4'eqmGk$a@%P`KE+RK*Y+0KPGjYEZh3RcqSJ(qZ$I`k$5,$*Ta6HPA,
fUICUFmDYMA!%%ShGJUYh%*d&NI*hEkFf'$J,!@K%`,""AYUd)ATXV*2Kr3VrbmL
jYXfca-EqQGp'mF'R&2ZT5Y8R!G0(,ADjSjLHdV,G'EJ*dS[(L@4*qNi9PD9Ra66
R4b"ArrRaBCQlqLmIQmb+#109"Re)AkBH@ZikM%'Zq(L*5T)FBKa684U5%cNA--G
`3`#PN!3"!!",!%#f)"FmYLBC+`!!KEF!!*30!!#"$`!E)ZF!!)GD!!!L4`!!$,-
!"("cCA9NEd0KFQ*[EP0eF("[FR3J8fpeFQ0PF`!!Y@i!Y`(f!UN$S!(!rj!%!`l
rq2r`bd!!!)!!N!HPN!3"!!!e!!#f)"FmYL!A2!!!KZX!!)K!!!#'k`!&TL8!N!j
*BfpZ$3!"S5pTBfpZ68&$8d!!XH#ai!#3#S!!N!N"jJ#3!hm!N!32!%,"e+,![f6
NI0d+dKR3"qJJFB@i'fB$qIiJ1HD-D*5U+I&6mb&Zk1dBm6QRH3)J09f1'eJ5!$,
8kUe4E@Z0'ZRqTMZB9rqc02$ZcNd*D,"1kIiR%SkHZ@X9&ZeAYm[JD&1PME&Cl5I
aRe$GDP"-RNkEh@43G-eM$A*[4),BbJ#PN!3"!!"&!"#f"mkqYPTP,`!!KeS!!)r
q!!#'k`!9P,B!!"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'!"AfrZlKXr&Fll8C!!,EELQp42[eV0T3p
PmeIVj#-I*#&1I'4Q&eKSq-fIjX9-HL810$-)(@"Kd,RHK[2UQ%A,,XHLlMISE!S
C@YI)ARM5V%CEa&(iJ#R#FI0K8`$'eM-dM%"kXLKqMYm$8F)if60-cbKYm+jf&(R
)P$dFd!"#`G5'ak"X1EA1D(Z'9d-mUL6b*Rm@ZHHbFX+(al&2FmTcAE-4k+DcT81
(H#@*B)mcmERSHiRCS1(IkIEDfhCl@J45MKc'4LaPjBMf"jfaqPjB`QFLPY8C'#1
J8,#m6L1acd-lD2Ebp9dQJXVdQ""%U!NY3K)@$2K+,S!TQl,'b-&C+Il-rN3mN`(
p(pNaP%"@h@50qPeUr-8S+0AklIf)C`prTKXXI"iPEU5FP,L0kISSe4&!,PMd!L)
IH#ZiR$85Ce`2p6NSCK2"-erTpl+J&ScKDYf2p2ZfpA5@d"I[L@86,-1dI+G&jr6
TN@94jYeErh3FHl#MpDEXD"&01Dpb)RZp'ClfG2CT)iPmje,6$hFD&GqGc%p$bam
Nj850P+U#dJ*"bffaTiZY9ZhBrJ$J!N,Y([5KJR4)P3&'cdq$!L%XZp0'Sjk#S&b
eSE8[2),BQ588q$$,F+$i(Mbk"'DF#MMmX@G20!XBbhqN`0[kBSRe5JBLiISTN!#
5b'K!KF!A4#Lr4d6Cq[68hhCKPCPp3m+Tk@(B#DUD8@*(1!0q#N8PBkXHARBlImY
JA+b!N!"&ZX&TddD%aGPH'pl`(ALZVJ,iVLGQ"N9m9QI%"+P!JF3#B[B2*(VC[H2
`,Z%eb!,-E0-A0ElRFb0S"D@m&)6V#CjbKGm%Rk%2kK2rNk6a*#,6mNB"cHF$&Cj
XGm1D!,IVer54mYIZA`ci3+@fp8)mYGBEDq9rdE`XJkB6P-rB1L$+0LQ**EcLF)E
cI9EM88crE[k#dZr$1MJr!-IZ&EVX9IL[QpBNI`j0MfF$R!BDF-Le&rIGSh'rJ66
eSd"P4jJ'CYk5$'EdKrq1R[k+9Qi*R6$lASeNIUa#C!,T1p!P*qFP52I&b5c552Y
3GAJR&ZpZm4B@B6"+DK`lEX+TE`rIfZ(&6-AZXPV(4[hSC%13!)DrZepjcJZLd'l
F)iR'A2P&[`!$-@edm"QL6"VAQNjP5+!HQcDLf(FAr3D8K+NR%2Ca1#e#ampZ2D9
RdXV**ATYC)G%V&qY%K'm@FG-m@r4fpqf3UmjF&Na(q"@GfVFpbNFRda%NZ,%CJk
hBm6K[*%NTSE&Ei['Yf*QqE44i123TIGkKp&aKIGpL%p9eBKhjHG'Zla+bR$jU)Z
rP5fPQ96q%Fj,DmIC)k"239R5eklfGmr2QkI'hq2Z*cGl[%JHArF(RX"6If8mq1'
bRNqH[P-()KTaX+I"RLeMPBBX@mq1#&#r!0#-U*CqF38dK-EabNhCjB5TM4!jerH
"bJK$GDI(-[AG3QC$l`V*FhCKpf8+DVS(@rmp`2[&a5-Rdk4c26b4@!9I9H8+"RY
AcG5'ZDJq*Y'4)+Mq(AHj*%J@JEYdMGN(IhZ[M9SFR8*-NTNIpai9#0V!%5C'DYA
QSHUpVINMT(Bl*[jP@4bY,T8`4Dl3RRmj@pN-C#iR96EATqZhapj2-8!DH*3CBSl
PZJ4lM(B1BQq3!!Z5pZqq@3H'mI[B"QB"-G3SEj)qQlZ!%4-)3dM,Lc)09kFe*f3
1644MJh2qKb0UVHIb0S+q-51'TJZ+k6TBJqCGPjKQC9XZ9FVYhqX*4V)9H6(PHFq
4f1@2XK(AV9bXXB0K-[45M3e$3UD2DhSd"@3&3B0r[PaMcPCXX`4k4jk@Y0TU*&m
VaabCfpD2212I0*)4$q`QRJ9KhI3Uc$&kbL)-Ule"#$V(DH%[0b%0XB4aH'Eb&p@
kpY,FA,LqLdI)j)BV,EDUE`AE(TXC`DPHX!2XVmrMRkQRbQ,fcZ[@E'VGHVIi1B1
Fq"FHm2%PGLVbMbhkUHFQCcZJleMa"aR(Nf,@Mq,b@YQ)!Xj"!B9SlZ5d*#0Q4"E
-VEFqGJc+F"0,Yi,Bj6)Qe8DY'YFFaHNa#&M(3ZaP0X$&!+Ummh3J(p!D@a8a(K3
&9j[e)0YbjiR3l'!ihF&9$eDb!XMQk!K*X1-`RiC0H+rrHerhhk30#VRYX-iB8L*
(hpE)[)NJ*2@b@c'Y!Tc[@P5J,9f[4P9Q1D(I@4Y!$NPe)f-EcZcB61)hZqSc,5L
QS4C!3d!IYSm6`(!3S6cJLY$5J"25cG1EC&GH+ZHA0f(G@QY1eP08$iEqUh'&-2+
CMV*b2l0%h1fAYKSF+hA"$(NQ1leq'MIHKlFBTkmP8'M!&3KII1,@%R[,&PlFPU1
cXSr1hCdr+Lja,cH-B`+UMD*F9S8NPRAaT%aLqJbqr2LjG@31,")AIpp8TY`L-"8
5D+Pq4F-$#,Z0JM3h2VS'AbpN&5ZXLd05J+@3"!%!!%F!%,B)!lqf#&Xp!!#)3!!
!NIm!!)EV!"GZBJ!!!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$K1VeL$cpE5*!!l"(JllG"`(p#0jC
0V9F9&5dC`mqI%$EjY@A`e**9mS(5(Uk!q#SkkpQLZ5VN&HGf0f@SJ%,"e-NiZ4T
fr2LD35$-+@X)k5@#9V6HJfHNil44"KB&l6qP9$,#2c)@!MkrX''"El2r8&i9c9f
GE5M2@hlf39Fpp5+9+#-iI'2(bfi@pZaXRUFY-dMdR2L(Y+CT31YqAZZ8I*ca$Lk
qB6fdMjd2+*lhfbNDe&'MG6!DH@a2ZcU0$cmFN!#13,GcU"#hQM`A%$3aJKhZf`e
8QC*'2q#lSa'HJR@P4C*R4lE3j&Q#aKbp@[EY%(-`chFfXhf''UPjP1l'E$68j81
&Smmb$E24MaBeik'P$[##QkVHJjI3326QUe2PDq&J0NC8BFYJNI#aY'X0J+@3"!%
!!%N!%,B)6Dbf#'+E!!#2rJ!!Npd!!)EV!"R)`3#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'[(Shbp3qJe2)%EiRDJHeLKMZ3V[6hM
J,!,%E(Tj8%fGC9XaMEm0,iq(kX`al52f%YNG11A94NBc#VNclc8`k'PYP3h6B!S
C$rfK-q%,i40%)$YI3*'I!--l*kIVPX"YCm`4a5T`E!4C2k8mX2pG4[(2VX0YI$R
TGhSl,@89UQAQ@3D+dq+YA#3U9@S9KIJ0q+8SYH(V@%FccbTbZNGT35VCU1+mE[%
AN5XYIQ+!+%'L'%Q$[JSJbdbm5c*FfG0(fY'2U%,"e-C3'4VA6BI&93E3LqJ%P58
1*FF`VMdFNH(qJ[KJLFBXi+qS)cP$3Cl$(!q!MHbMCq6MJ9Pq5QG--ZY!UJ!(4-d
qDGA5S3$8JUJjSlY*S!li3-pdEJc9MHrIp*8,Mff6LSjcj((EJrNJe)(-K(D`RMb
Pi!EHL6&9'N%0$DF&I6J9l98kK[M9%)cf3+@3"!%!!$!!3!#3#T(r!*!'KZX!!#M
Rrj!%!*!+TC!%!3!!-!"!!*!+KZX!N!D"$`!!R6ErN!3!N!UPN!3"!!"$!%#f&i+
MYLBC+`!!J3m!!*d8!!#!YJ!6j%B!!*5N!!!29`!!#(!!"LK6GA"`Eh*d)%aTBR*
KFQPPFbN!!!('!%J!5!)k!I)"`2q3"!-1rrMrm-Y!!!#!!*!(TC!%!3!!03!!YKH
#SlBAJU-!!*3p!!#9jJ!!P$d!"CbV!*!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$CM"2QiPiL#!4612e-a%Ip2YG$
!,!l#+MY0TYD+1A4VLliK,m`9H5dYeAUNfjE1JeU!1fcIY2iTqMle`m&L,`,Sk#c
A2cLpLVKCp!EJ0[*I%SQ)IYLR64S'"eVk[,Qq0J'kaI5'ZHA22R5Q@r[Zr1GC'1$
,'QD$SELMES)Jmf6d*$A5G*PedZ!4QXX'd2M*kUE6rbfiVMXJ[c)jlhqE"!#PN!3
"!!"'!!#f)"f-YL!GM!!!P+3!!*G6!!#823!@%Ai!N!j0Eh*P4QPXCA0$9bj$4Nd
f1'XZ4%a-!!'Jh(0SE')rN!5!!2q3"!#3#S!!N!N#Y`#3!r8!N!32!%,"e4JL31l
A[1*A&f%9Vm66r$D6H'(c#mcck1&kFd$hlceh@pJkkAI)!0HVL4ma4NEQpX[+,0V
d@CJ*3i[k*bX`q*G+eUP**Xk1@f*56-Ul',#62D!FVA8E%(A9169-l+rEZ*MTU`D
r[1$l1I(G2rNbhm6!Qm,V"QRFRE4`A'9ZqmaGa0+G$$$6kj'a26*$r3Bb"'G32qR
EdpH-'hki0XG`kD`J[-CFF[&Q1Z%,JhCNpFI[ACZIKX"IKJTS2dd0LJfVlLJ*hN2
'kM"bP58"V&IQZ+'l(4T[I'c4Z@Y6[D5f,'E"STJGGhP-R8I'rq'idS6)*%`!TC!
%!3!!3`!!YL!GMEBJ(Bd!!*AQ!!#BZJ!!P$d!%l-R!*!16@pbC8CTE'9c3eFZ8&"
$,N4-6!!"&,"cD'aL2j!%J!$rN!3!N!U!!*!*!V!!N!2b!*!%$`"#`G8B)N$ZHiK
L9aGJqi2idr`fQF+1j-4lXPfA(P1*ZfNEYTjB*'A4*d8PBRmpk+M,i"`Vp`1l#V-
'XjmZ)X0m3MeU@J"i99liN!!LX6TF)(XNTde@6#)62N1p!A&Jd-J#2!5*!CH3!+C
J-PTD-$@8K1&*6dN!aHrj))jImCQ3!#V[[bCq,IpilCl!3))VmChh6LD!CSB(I$0
N(!%S%dQdrDP0eeNlbk"LMYqS[V4AK!P4fmedQ(Q(fl4bdP2C08r!BmblH6f0R6T
9NTbZTLUcaU)b@AdU%BKpA000f-6jHm'ST3GBN6R&'QR[`QG&N55Pb$+!3+@3"!%
!!%!!!,BJ(Bff)"f0!!#A8`!!QKX!!*3p!"!"*3#3$Ne66#"$,N0'66Bi5bj%6%`
!!9GCFfKXBQ0QE@H!!2q3"!#3#S!!N!N#U`#3!qm!N!32!%,"e4JL31j0EL*A&f$
K@#c6r$D9F1*&r4k53VjIdU`3jUQa"A0,$bJ@@+6L6HDDIQ83P&bA%B$jM6mI6$k
ZMf9V5!(SNb$+-mfM'Y)ZlrGp(4UlAK5C%DF,Br+JD@mpVTXckmVGS0'V8ML@JT`
A)3F@F`j()d(B!)6fRXcj!cSp0QS#E6`h&p`5dFN-@e@VU#KXIm2)3%CkfMbJ-#k
VHJ94#[q%08rC1IC2daNT-P-f5p-fkch0r@*T!ImV15GmBbBGb"@rUN%$fNGAGAX
F9AJS)pH-GZ(4Q1Ja@!l4'RDMkEcG5&C*M6@RDHBfJ8i!TC!%!3!!4J!!YL!GMEB
J(Bd!!*Lk!!#EK3!!P$d!&LLN!*!1690-)%eA8R9ZG'PYC8aTBN0'66Bi5`!"a[p
cD'aLBfCYCi!!rj!%!*!+J!#3#3+h!*!$mJ#3"!m!3X(9'#*!lYHmiPFA8YFVa02
m0SqYB1!ih-#IE%BGaRN2#CR5kCMQ6AB@-Q[`VV$@QVbPhNhJUb)I#Gl#Lf&FIN5
3!+"D'p3!i9*aN!!Z56Ae'6cP8aMq6jNGU'XK)aK+&e2A6f4mb@hIQ0r`j&+q2!,
KCa'TH-jE'#kQ1)12e5cV28QjD!JdCBUrh4rRXGCY85HbSD4"V6fQZqNaFSL+mcG
RP`Jkf2cMN!!feVY*ejMfkp(k$&&*P5G%P9FH3KFM#+H*chRH6#L!CXT4$i2`!&b
3!)3JF%6f*+kRY26Af4mJqES192-qCKUFDR(X1hcVU,$*b@-!TC!%!3!!2`!!YL!
GM,BJ(Bd!!*SE!!#Fj!!!P$d!$jHX!*!169GI690-,P"33bj6D'aL!!(64R0SE'*
MCQeRJ!$rN!3!N!U!!*!*!UJ!N!2Z!*!%$`"#`G8B)N$Z(e2L9aLD0rESdr`fPJF
G0+3HNN+qAp+X%1DTX39c5`mY+QbNiNer*rjP%*4BY342Z82&!A@0LI2j'd$)JG1
&)Y3-S33@G2q"p4mRi6[BiS43#SKm#K1mfQZb*eC29a1DJVM90P6IEFFJQ!TkcYi
ZhSS1Ve('X0H1a[iZi#bl[K'i&eRk`*aACfdR*B+H$A1i8P-Z)-hKmr'r3Y&ea6H
)h-(A(qAeHU6F!Gi#Qa#bfIi4'i9529irdDa"$+YTMJ%*pKFT-a,qi2"pB[1MIRD
0Q-+qFPC6l8#er3JaMYVdpa2P+5HHj%d!TC!%!3!!-!"!!*!+Qi8!N!D823!!RX(
rN!3!N!UPN!3"!!!c!%#d(A&cY`Y36`!!P$d!!+kX!!#!YJ!$A[B!!*eV!!%,r`!
!%8%!!A4ME!!!"0%!L3$0!H8#I3(!rj!%!alrq2r`bd3!!)!!N!HPN!3"!!"'!!#
f"mkIY[&-f!!!R43!!+jm!!#G&!!@q!B!!3[r!!!3T`#3"!m!F(0PG@4[3f&bBQp
Z8h9`F'pbG#l2J!!!%Tj069"b3eG*43!!rj!%!*!+J!#3"d,"e5"CY#8aKF2Q*9r
0l+5HhQl"d-FLD4+`'2%mFK$&ZS%CZBjF,dXhP+%aii@ckTGpaHdFDZN'3UGckTC
(HaE+aSe+`Dm#48US1jZh@PM0iIDQ'VM'BJMhSYIa,NY5C8qX*5T'dK'*M3@hj[K
BS3rRkUK!8RcMNZme`l`U@!'L)$Y%djf*eL(1DfI'h98&hTN61RG)ZFl10)R8m5#
Dckl99f(r0@DH%H-IdHlUMkK3pbR6VGH1HV!H8c0+5$qQB4)b"AY'C,)P!AcbQ,b
pe2+1GNSF1"QaV%Q)+8p4qH"k5q9M[+0UiLe5'pmE4Gk5De49%`DU!)$aS,b4Y-&
4k+(+Dqi)Fh8qThT13XcT9dZM3*MD2*1J"SQfDMTXLra`1k4SJ0%kmhJp`YH"r(l
dAN4RH*a-*lbfNJI*9+bE#,#SUM0PVh1YchD13(aNSZYrA"iY9@mBMU-GS(&C1+%
EUa`dY'ZcFc$(#iT8q&kCl-(5r3F8pQkU2%Hm,LfVUiEf)CZ01B5@JrMh`*822c4
8P8NFpDd5Ce+N48HPP$YU&BqbkpTkjL)h-)jdMXV&3TeXfVdC34M#4Rk-HT'j'&r
9DYphNpHAGAA56fj66S[05m9i*jmcY`Vj+A"0IF8l("Q3!%k%pe1P"&XF8prm)mL
0$$VVIG2A*Rj!$68p-qdhbMa5ST+P&@2ENBkIlN8QTc`#'#iTe@[X@N5%F"V)5h9
l1TNfCH`$9q,TA3J2VP&PISpA1p,PH@NRqAPh$mra($h$F#!60+QmRCZ+G9YU90q
!2&HF&cMm5GXPPA3fZ8NMCi'aTE5YV#LiNiH(3N%+2RfQii,**THrK96j9R-&@kD
h%'VN[!Kq+3'D#aKhZddqa[jiNLQ6I9`Ti+KT%0BUR%jm+&mRrXDfk!!Nr6M*XX`
1jfNf-mqNAA&q@bF&&VM*PKfXTr%CAR9)h-d@[H`pdkkjT"hUkaqfmhF3A6X0"ee
k4ZAR1l,rehSj`rrmNeJI[-QBpPdMac'ErSY6JX2hBf4K!8IjhmL'*fqNiCabkZZ
T&G,-+FpJ[b3jl&Vq%YReq%kfil(cR-ml%9e3dbG39Zc@l$1VL(,"%@VGP&,85CY
-A*ZLI+eK%0YCJa8rqcIj2%J"E5a#NSbaC*YJ#%"F9,f)pH(#eSNamRk+ifUU'-c
UI`PfMhQ#LIS(5e))X9[@0CUFVd%fqZ%jl'iRCQPAVXGQpRDVq[pKNEaHY)(![rE
Qh-P$GMZ6Y$paYr-qajpQ0`0Krki2,Aqc2'*mjTe"Mh6ff#L5"%LX!(Ze@6J6,H@
S"'Fq,$f)Kb6dFP)bIqFY[8Ul8T)$r206b2!#l6E9qm1-8#`r0YqD)9iq2U!3Jrq
BQNak-2hBPS2",R,`9pFb6XGX3"ja4@jb-ZVXl%)LQaK+'m[%$T3d`"Hh'Qf[Fmc
1`1jR`Y4ArMGIRp&%r&M$5"J)4fJEf69cD#*8jL"Xe[$V6-bLKK53!"D`Xp4QcK!
ZS"1%m#Y"jCB(*192hiQ%Vlp(c#2JmS0H,pUjN!!)-$Cc8h,kV'-"Sk(qrc4#hq0
(j$VUKqfE-Xj5MK$UPr)KqXE40UZZ+,$h*e!@HP#Zqc)LAacC91X5#%&UE*M-5X$
&13%%UZAR)#b+A-30-Z1-YeikUZ+C1(kqj)P(SchAC!jUFQ,8jq1p4KT6-D+LmlZ
XEeh5EJrBGAfYiMQXhb#@[a6Uh69$Zf4,q1l3!Bb[l9XH0+3qk98SA98Kk1f)-b#
%2H1c5"lKEG&9FP&19R#!fIJ-`,X!)qAplG8a`9YSGE,,c(kGc4KFHFG#h6PU""R
abAf#m,U!m5aUhLfZNA[bX*d*GY66#UQ+mi#XHH@T%%jlKP00CD@jC@Cm(!3[GI6
j8P#dT5q!lb!)rVd1YriCI"q`+-m,EKf0A&qTp*mU-`0[fK+Q#pafZ*!!fSd(m2A
B*!3b$U%q@aDF'b![lCJr2dZ"V32!a"ir4PD@63YDL)U,80HfIGRZIMLUEQBK'Ba
VRKr5*)%QMJeIVqR@ZrFVd6&2l*3NIG%"GQYm$4f"rkY2IS+1TkqiT'f`'V-LMd2
)63@JKHKN1hZ2##Q0G2BI*#&4TicbKi[akD-6B)L)ErZllL9Y+HRdJ9GBA36bE"d
QZ['4)@H@K-)!m2CVlZ5k-cl$Z-1j[5R1MA9FAcCE`"UL*C2l52i!E0Il8F'[Eh#
FHUBR!C!!`jJ,CFN-8b863a[jp&(*9(rLX@HH`6-3Kf4#*mPSR@G!i@IfkR#Uk*U
f,,1(X)H-0,5&pjGJ,(A'NUN4TYT"&pX5[hkV"B3BA'fPl0p15&53!$6k5QlP`XL
hei%4,l'Br69RIXCJ*09EZKK%(&a3,8V0eS0[mmRhcLAlUBU'[Y,%GX!D(X1*q4e
HMH-lHdDIi4&Ap+rZb6@F%e*`[XIK2TN[+Tj53L++iac5U!BYEQje#*h45Qdq2c%
aG$LPTmaShh!E5DC2Bk*GT-QRINT%',ADq2+8I8D4Y4)K`dq(2FCb#jCUM`P%rh5
[8`e+l%q9!`f8,YfB!qK&UmCXr#d2lM0ASlG"T-6A,HAX%+V1I8@Zl1-Jc1Q9iYi
4(,jF"`5HXRT&N`ldZ$),jV(Y$@)Tref$Xk1UAam&lGkGjrGd2UV&kjQPh+(6Tf3
rfQC$VaZM9j[NZiCH@h'+S@T9hhZ$&,k`'f6D#)",*XTcY%k4JISbUbNVCGd)cP#
RlLARl#ErAFcVhE2pkRTNL#Gm@R&Y)R5r)(2&kG,[UYjd&4-af6dH`Uj!NV&U[L%
J0"dVTIhd*3(@MjTDZV`h0R#Z3)amM[Epr3QVYQXIL0[Nrl&"$5QFejd0fIE89%8
'9'FRQME9Ma)f#F&bX29Rd4iaVp)dd,9YM*B4#dAqTQfZ'IhCX5S,`YfSR,ZN6hD
&AG8QK3b**Cah%5)Tqh,-G-A)98DkjYP))34NUXK!D!2@0'dA,'[RDq"d-A++$T,
IQ5K4J5%hiNTSUT,8rAa(9*Ejj1i+QeP*JGYaFhh2`bASD6HI)ILEcMiYXD6N0L%
mIaf5qkFiK29TpDTN'SS@cQ*`FPXSHF6!!f&LXX@`Zlbp@@"jVD`M+*!!f,R$K`c
Dprb0iRldPZc([b5VZNB@DYXH9a'6,kM$9Mc@P[qANBTXL*Qrdllhq*(XG0RUMd@
*)"F'fB!UTL%bVA@&3q8h+G0PfPIpHdL"Bl#Cl$%Z@!a!Vqp(YU)@e*F'KMPNjVl
c@(a4BDh#X6BcIhAjm6Xp6QVV!5eaA%H#YI4FBC3H*[6%b[e8CPBb4T&T$E)M`1E
$XhM1bp#XMK4arh&e55h'LHG-p(JaLrMM68f06(HI6&8Z6mUT[#BVEcjJ@ELG16q
!RhUSi3)"ENib+X3hPNaFG-'NJ+FdVZK3Y)ME&1$cNC!!LQqpdHbCP1!)((J8bQM
IJ0,$XrFc#+#iU#Vq#lKFVTPDJ0m*"&PKDMR'SR1k4H3RX54*LT)-(fCFmLV@8(b
qp'U0@13,U+K5JFKC8H'fK9e4+UXEQX,9(mB2iB`,3JAIV12BRC'"TQb-"`RFPXU
KGA0+IXmHRJ-CD)`B&4!L%QL'm53*B#JaC[RNK,GVXXIIkPH%%J1Z+Bic-C,h0lj
V!HJ(*`@p"cLSKJI#ah[TF`#VKR5-6lXI('9'1($JmV[iKrHcZ5U1mYEdf1j9ViQ
3!&a**"KX@QI[GM8@DBeqkUCTK3hAC5cMa4$QK6!h!3X8&b5SAL',8aJ&Id`l2mB
*$1("k)kS%m,aI[f'TKL,&+h5L,,CBecVrXq+TCALK,BaFm8SS8DK,Y*1k9PAET8
3Q*qdT+dG*MTi-8-V88plRh2`Lh,0crq1c+JJfJKZ+"!TGhB,($#rUe!S6FJ(k%9
XD9)'G59k&G6k'#mi(e!RY"K-Y#"$[e*6B(V986iM&Fd&cqa*301@B"hi"68hmpP
bqRk96Mk)+LfI)8X*f3`)QZXRe[N`35''!"XIbSAV8KRVYLZRY3M%KaXkNDGShYQ
fX&*)G3ZX-pj&82$!-l$Heie8fiH-Pj(CZ[LpY%2CGSB29aK@kB55f+FKVRj%j(b
EY*KrjYQGQ&ZFabie`d&+C0(iGV*&Ma*2`,Npa29-%H[4+`!@VB+FHJQc3UcaRmB
NDVlMQ2apK93a6a*LLV20ZGT)E1dFGjb&H`iGG2h&DiBLGe"Je'hKS3PRh)D0E!0
#fifL9%@'[ih82hk6a!VNhEZr[r1C63[@*0)ek1DTABj01L$*AK'F5DjHNqTE6hi
iDk3"(D#@@fallV6fpDhGi$lMEUFe2%B9)@iZ!h)AJ!MZN!$CUQ9G9-lVJ)h&9)T
PI"5#SPHe6@R$q`khJ[!LpcfF#kEpj62AIKi,!C(qbjDqB2'ei1lU3`4KX8ALDm1
B@pYLH,hAM$M8"N+a*&#RLC6eI@K2,PeJU1@X%-!J5Y'+hfVlCK@'eif"P[Mm#`H
`ejU,ap&QHHf2NMHCqUY9D'V&Rf',k5KflXmE1a4YN@MpP$,8##J29F#2YDcDZ-V
[LR&BElKEM1pLa5XNi8DUIiD2(MpQ8084R'50R!jF1H1Ed2ZAj-*eFkhY'6*NML[
'YBZiPeMNX'1Ti'%TbjBU4erT`Y@IHc@R3jFNl6X'-69D$ZYFKhTE8p$AACU9+L-
Br`l*+#TC)iAeCl'3!1ZCPX%peie[,4J@$J4A-YA0`SfC1l@3!'m"l&$dCQ`Em`+
D4f82V9P-+jV5*"'BUplUj-mL&V1HfSY`ee[J@2L09YF**m+rYRaCe'T)Kci#r)P
dV+%CH9$l9AM"dVBa2#EZ9XX@baC(J,J5[@3+68,-E$9Qd[AjaUNp8YZpK9#(A'F
MrKZmlC3La20$h0Y+2kBMRT!![2eK[MHlV4RX%Clm2*RNq6[X(ii*UPmTNZ4"%@Y
8&ddalcej,X3[2A!H-9+j@,G%N!"F0X5MhQ'"TY-FfYFlhK1(-F22r&RP0$Z+kGd
TiM-U"fS1J#d"FfNYrM9h9DIHQT99ib%-'`22('H9RVbe"LpEZp4$@"U&R*!!0'i
aT6D2U`e+pdBDM%bL#2+F!c"FrA8"ILcTF3rUiT,JHDG,#+@)j+qQQEZM,J'mc5&
p2Fa2mDfNRYkjVk!2YTY8#JPbKTHVS$Ma9Nm"$Y33T*!!ZlDkHIE,DT&[%adQT6C
#1f1"N!"MfVNa0lUE*afm1bcbpR5j6RPLLAH(@0cYMQhjP(X3$(GB#E!0i4SEiC9
XEkPTcFK&AeqZPN"d@[$1Hb[mH2PhZV,f6YTB+)"SE9b%4E'Sd%N(VmN!lGDE)Kr
r,P9#Dh9BIL3HjFmkE5!JJH2ekIi!l'a90&Q&L$eMT[pBl"86$%VL"*R)di%LYhL
DUU8Q(jBU-ED5AM(pR9kVEJTCE([JAf$+Pl*(Th$c"%TB9Ik1H#Y&4h0S$(B[[*'
88"UmR2Bhr%*([d(h2`#J`8$XD,KrXV&M*FcL065!3jql$V8AhCfE9r901RJ`-c-
!QFMAHYqZ[UC"a@$6Y)d#mCaMr16l"`PM1FSTbif$!BAU(4U6`hNAq$NPS#Ta"4T
J5",iVkrbbNL&)+P*c04Ci0H!*EBm5PEIm!a[ZN6')+6p8Jk$!Aem#M'-lka5cYh
Y+AmZ2PHLrl'Lm3HiI#8V,IIGdF6b4b)h[LI45$T6T19$UVrTI9#L4fV6YMTNP*l
2F2#(qB1L3Zqr3UAc&FS9+mVG10I29'Vm*`EqL%$LL`ABj1XF5"ic%Z3!TC!%!3!
!-!"!!*!+R@X!N!DG&!!!@NArN!3!N!UPN!3"!!!b!%#d(A&fY[&293!!R43!!+m
b!!#!YJ!#)cJ!!+m#!*!(-!!!G'X!!'SS!0%!0!)$!H8"`2q3"!-HrrMrm-&%!!#
!!*!(TC!%!3!!-!"!!*!+VU`!N!DZV!!!+NVrN!3!N!UPN!3"!!!`!%!!N!UZV!#
3"S#f!!"iqrq3"!#3#U@3"!%!!%%!%,Ea6SUfm8k+!!#!YJ!!X,X!N!0b!"(9LJ#
3$N*eD@aND@jR)%eKBe4ME&4V!!%X"P4&@&4$9dP&J3!!`!)"!*!+J!#3#3+H!*!
$jJ#3"!m!3X(9'#*!lNeZ)PEiMB`0F#U,YJCSh`JD-N3Vk,5b%KIY1YXVI)k-P$0
B"H+"[ce9`#cela*9H6GVLTA-6e`2+&"9#SX`3K%TV#KDS"SMf&2S'1&'&,hmJkD
2bZbER6J0DC)Bhj2rJiVi5H*,6@JBQYU*emdQ%'N!a9L)-cNAT%IXD+"F5JIkDG`
Vk9jm9U"TMLH6&[+I,T8k8[JMqZTk@j,,md0-HH!S%!i9KAU@C@-NQd$!Be3P9SE
H#'R-C6QK-cP'hparab(I4qZmYa,$f03Pfj+#f[)%(`c&+EbVbLCXJEGZSi#PN!3
"!!"#!!#dSQ-cYSChH3!!Vf)!!,I2!*!$FJ!5%id!N!j%FQ&R)#BJ4(*[F#"8Bfa
PG(-!!39CB@4bF&G*FdL&!*!$!J%!N!U!!*!*&EX!!!DJ!*!%$`"#`G4lA6Y#S$"
#q")&hFZrR4*(AM5UD'H5m&p6aqIq[(jrrQkM,!N+GZHQZ1@!X1U@UKD'AaBrh-Z
rRB'(if#G8rm-!q+BLk,@H'chmi-b9j`ee3amE2U3!&h@hYKIpBRq+Za#BQEmd0D
8,"SLAj2YdjJB4N*KkPr2dj+X0036IAFV8h01Qe2-AL&Fb`f,E'D8Hb`XiAShE&N
,&M&,Y18B80*[4ScSFXAkI"IkX'Ik*CZqUKa3Y)Lf2c&@jREQaN34@D31[R"cJh5
'S$E)TiQ4MS%HLS1%p,CJRD$FmZZbNj5qbCQQYfZI@6J9,qMpVVSdfkB!6*N!`)'
e9IIk`LihbY$FJF#,EXGcH5R3UD8@Lj26L3SAbB)jjci*ejh[iJAr6RS(BcCBMRG
A"fH[S94YM#6N*Drh%"$NNZXQ`b[RK#AX1dNaSK98Ihk`*R4eUi&j@-XEI+Y2(mR
S5r9J#jaqA[,GR!!PQfKhRb+*qdi&(r!Qi8&AQ$)lm'C%cI#%j[2BrA6LjY#ZGIS
*)"8i(jI4S*8FiY-e-[(#[F9`+6"Z(Pe29HqUY*I$!e'r3k!b'C-@"lp@UelBBU2
QXch9Y1Dea`DT14RYMViA4kjFTJEh!@k2Y-Z4GUSm%,%aCDKr00hf[H21H*a0`ZT
cpmPqefe0Na1+V-bDZF"r*aTFI&Dr))JAAEr+iPiRMA[dh&mN($X,XVmbL,"qrF9
3Vq`S4dqUAEh-q[+KrRTcU+AZa$(mEqB@6"Z6jFaR8c8@G-i$l0[C%jE"9jh3LG$
DmFDrjEQQ,!N5NHI@RAK`aG#&2&)+#I1*-eSDr*Yi*CC(Fm2eZcG9a!d[aTp!el@
)6dMqFiFi`@ZG62ebpJBfF!UmP,kc6H((2pSq1V0Fbc)!0YBb&!h`Y[[1*8!BNRF
U%-*4DqQQ#&5dj`CBbb['le9GLNi00K'%(ATHcB#d,-X1BFGIXUeNMR$iQl!G"mH
l"JBYjmlZCER$K%U@8%N%+-c+X+`D!aBTq*2mR29K(6kDP!eDFr&%[QcKJCY3j4D
BjjJED6aH!@VFYZ#9f#)[VX1I(EpkKkXUMm1A-8"EdPcER@pPa84E#A*`D5qQT%c
c12pX$T0f@e0-dLEcX+XiMD-%T*if*EMrbD[6p*Z2`QZ"k6NJ("1k#",Dj'1FSSL
T[c#,p@eDEZ1rZ#(2+-8S59G)$r,1(IS3!eNhQ,SV28(IQ*dG%"db8$irQ`qd2VR
F5dSmr(9-DRc9Q@G5KYlI2Hq0$1EPUcED2p3meU[X$MHTTHV0cH,Fel8JT+&pbBM
9qKm@XlFlBE')*kHGGDA()D%`L5bl[[@RXTM0BLC,PcV"N[+efA9QF!9)5rl-qTE
)4Z+VlZ4J)0d2k)#9,%jPZLXZrY2I"Z-mcL(f(KC"RpY(rUi+I+2*%#cI*H+1D-+
LZGp'kI(D+06NSfa[!#daN!!VekG'N@S$BdqFPjH#Q)$hp[,I3!aJHN8QU"%L6cF
JcKC`c&8fXP!Y-LCeYEJVeq@HT3VhjU*-cHQ"e+q2&kB4)bBC3FRUhibR$mI&rAl
F@&p%m#MXMkhG0hQC-,I%bN26@l55Di8LY-Ui)0&Pd2Z`$0CMZaR4XZIC3YMNGHl
YI09rRNkf@!C+c2@Sj`C!d4KlqelRK(bZ`V"4UJmL2UZKqE$amRk-GFEQYkD#)9`
"-EkJVZBq)bBJ3AJH)HED43D4h`l$0#rlq05X#,)hRZh5idrcA)E%bGSZ-d96'f(
L2RZ+DQ&Y-fd[r5M8[M9kH-rXTNp'cY6Y1GXSKI9C8pa-`45!8a#me45B+S4(K5i
9*RNrI(6pm3jj2,!(Ld,[+#GbVl0b%r5h$4LQHEqV!LrG8D#QdDdZFG*E1$%-FGf
r+qFfdjpi43FPpBJMST+4GAM84Eh1i,fUK&V[eLS3bfrYfa!2LN3GRQr@%VX'6ED
qJL`Dl[caCT,4PS"8TUpdV'S1qc4$LMGldiLXZ(#0(YaALPUVrcQBjLS,0Y8Y95E
J[`0l(X!8'H2&6LjQ!cR*'bi4*HP1m2HZePcB9MeVaNc(FeS1c0B@BaiiQIf[a8+
@HhI%&TfYj"UP&$diJM&-X,CCkj`YU'8r@Tk`E$+`5HUZlJkj#T['eafIeJpU5FL
8`d%i2UBp15f8#+`[#NMepb,k#Y`$3!,C6FA-Z[UB15Bh'X@r2P&"P8,p1d*r-XU
-dkAAc@i2Q199LfmfMq$Bb+`p`KXjc$Q592$MA&iH#[*[KPj206EB1m!(akR*cQV
dDC@m85)@3S#PN!3"!!""!!#fq0V*YaJra!!!X,X!!2*P!*!$FJ!4!ii!!'mM!!!
M*`#3"!m!6@&M)&4ME#p8Db"5C@&NE@8!!9AlG(4bEh4dH(3"!!"!!B%!N!U!!*!
*'LJ!!"Em!*!%$`"#`G60p@NGfXb#*VSG1"mlQce4J@H,NV5K`fLh0-F)Vp!KT%8
cm'@QQf`"(RPZXV,Z!4PEe'bB6ST-Y(@Ri)ED[N9lf`BlK*c"ce&IVfiCBr"V#M9
`AGG[!SmD4%[*1`a8Y1Hb+D6JTMGYM6Y*Y2GSI['KfIR9r,!@D-,Bi)@6MZTG!3Y
,HKEmC9f#LK48k#5D&jfjU##m1J`FGaZ!A1Gdp8DpcVX'e!*cX!cdM'Dl[-VFYfb
5LijJNY!j*c$-+(,k#,FNDl*0P6bMi(XT#ZPhGL4q*&#iD#k'Q0kXQ@TrG5@Z!1&
`m`)jB&4ENN2dbmBRbP(X#fBDL4mi6j-Hdc9Rkc$SF'bJDl&Ak+qlF!8(P9QQ8@`
Nq9lXfrG2J2ZF9Y,@fbE[3-S`QqS0jpm1STm1AZq3!2X%ThJ2CZ%hH4UUPA@NMpa
9crB!VKreNcmi5r*62e62c(#Tj(RmcrRL,NUc%)VmLfP9%AC-eC!!EH3(,51bXEV
AD!pq,cd,Xaj[HQaek!2#'+p64r"hjVP%R3pNTaSMIe5S%lJU+9&[`,f)fhB(X8T
pQk5ha-ljj8U@h"c%"L`)T$4Jb[Dc"UjlR'Zm83b&$EMGiF*$'1KB6I2J5KDpdTd
TdDH)V$N'0qM0(UDS38-I,8kK[4E0HVd--D29)8T4CrKB80'-*XqlACXM9P-Db6U
)NKJJRNmei`N"0d,#VLQ,(DY+4lI5(,S(9C!!'3,e-!`qf[QkeQl8ZRJ%8ecjK&k
62FJq%e9`m9$2fV@VekN4e[9E@*Tm-*5BV%XkZpTRYqGMr`#G&Kk[!ha&V%!CkD4
a#lTIE1PRmY4Fa0S'd5JpCfaajBe*#d!e02XAZaUkG3jXK6",R!Dc`KD@"LZ['f0
jaM[6rL*$b+)3A)AjJM6S%2%ATjHP`mi+Mhcl[j,3&3hfHmU19@SbqeRFP'RhdUX
%!K8+(qc$pePkC!jGAA`JV0mJV[Y6$d(h@&1E)I'JX`+bKN%4H&+R1pK&N[9d8ZS
S-5@42()+6&If!Fd)DbXS-mEb,$U$baDc!kXDTAAD6lMebZdFSHBATS&1QNlh5Zd
`MST"QrQG%q$Y1Ul@4mJ$K2X%ZF!+VS#'rcM3&q0Pq),HR(Lcb,N5dq69$m6bZ(V
ScLYhXA-(KRbr1qT(B+mc&T,AH1!k,Ym3p@qEcB%-%`cb1e%hIrGF8bpTA%@E1-l
m8#IHV'!%*+U&D*D+"e1`!G@PpcF5A8mq(X0QNVP*`33rYM8N$'5E3)!!bPjljfh
-I)UD3FVSj$4@A*aF-CQ%JiTGRP$j)-%%QX6KXMZUrCbHd$LEr*,aR,9jXc2%SJY
9p!)XI5&[MqQ&-Mb&&q[0B1VUhcMrTAU!klJJa,ci#m%61M-(X)3qIXciSI(DRZX
FCDl5qEm``aZ20HU[ZXU0Ji`&YMMNZ#e3fTEjl6+6L#jSIcEeA"5P,QAdD0d(-Lj
I6rCpqqQY1#6c(Z1pc9+'%QVYDac9%,4BLXflb-9P4Ra&YA91JI#L6r)jL0dYCF'
SP9'#eP`L@'C@bH!qeQGb)VeUh3Um'$bYDM&mUCA#mNYP5lI,!QE-Qm[C)hm+ihS
S(Ne(aZX[F-RQCi,IceFV,1T(a&pFV4Vc)rd"-84CX@QiHF'P8kE83V%4R-%(&qe
$#ZNbVDj%eHhH+$QbQ,F(H!Dp"-iQbRbcd5[SfKD'5TdF)D)N)QZZrKULLY'r2pf
&pDm"-`rNE3(A1,lj"qfcmU889'V*B9UUlc)H9r("jp,4D-5rjjlr`jSX0)*Bf3$
#aEh(j&)c42qj4TSeb0eQlBdBJB"(INY-0(dQD[pGSU2H!QbT,I%0e"!4,`f)h'R
IRFj9!p(6bY*q&VI2)42qRC6,il$-Q)BG(5QXhPIK*N1+,G21#S-rR5pHGAZkr)*
`N!$))hViddqF)ec!4rGHe(rmm!krm+R4Fj!!'PArPdq%mS#LiFGh0*THX*cHPRf
lEr(fU6cdYC1Z)5qSfb!3He[V"P`%Si(HAS([m9[0[eMKHQ(4'8"N0315jaSj-f$
HPHVf[Ep2MTh$'922Z#h*Uh0IYIZHSi[(a2X6RmXLHTYRF-*8U!1,Dc+VT!dF)HY
0UbM2`$l`N6daql0T3aH2U4B2&$95h%i(pdjUNSNk6+48&*!!M$PRAFA8JZelfhl
GirH+lmBB'Rp@[dS@Q4j2GeGXmIVJ0)pi-2J&bAfReJ@P@!EZDebD"JE5ij5cRe&
L'FY9Vm[MM,LNa(')9[hbPbD99`mQr1L8a1fYa#Ge3MC6#malkU@6ZpAr5mBG-@3
HA$L+5'kVkZ4,SG`BC)#1BImaU*2dV`!mbR+l@F"pN!#",6@JFrEJP886T+p3f&V
,!`81p*13!+q@2jq4%dGA-EL0**CYQ-PheT831`L,Z%+$q91L2rkb+C4$`q3B4GQ
@,kHE*ajKlUpc[5%PBG5DTUG&MG!PQ*jilpdMl!b#lfk3!&2)$CBEj*FAfA"C,54
a*2phc&"dBljHhGmDCQ11N!#C*J)T))3DZbIrSC8m&-@RFp!T(IQL$Rhk#fXS5R4
@IrU%FfK!$"Q8kP`&R01[kSmRR'UVNh(eXhQEL3H"er(P@I3N[R1H!m`!heSE(1T
pE!MrY9Z5Y)aD2R0$6S1$aBcrR,UpBPT&-A163PYCT4&A,rTH*cRbM+0dHbca1T(
@"5P!DBE!JJ@2j'dDA4Z5Jb-T1ijU$XG8)QVrJ*'KNKd[[NUFEGNcJfDe!kQMajB
ja5YZh2(E66FVi+d@5Nkk50FGI'Q+E1K*d1Z-93+8edPC[M5h*@F[e4B'H6Q@YTY
q3!@9*m)am[SLM@@"SmqHTh"rH%QB#fc%im&F'Erbrmbl-+Y6EZdLN`1Rf`#qJk9
H5+#$&&YX&G#8b9lXmke1YpIHa9Jkk`9db(*bi06,iUbL"P(aZiN%(f*INjdAm)U
ZIKr8XCZh)3Z#)+`X+-V&2rA0V959+Klc"K9k!e!-6!$mJhHhDi('`GMQ4d#+'MX
mDPM"4NpRjD)AeDE9IC+BI0h*i,2,FlUI)UZj9Bkaj%I"aSbm@PbkT9Sh39b@LQ'
*J`kkDh`TE#1f2jX9RaeQ6Z!ZZ+D'Gc(6*IpM4"Lei-d%3LG1J-B-rd8,IUF$P(0
5`T8l2TLR@6PEEBTf,-Mr-Y40cj(%L!UZU@`Sc)G1'23hNcaSr5H1PmDY%Tlj)#Z
,VlpHN@HDm8Ai*URXeTSPafVD5%kb'*VIfICARH'L98SHl'&-'a$PG,KM6KddP09
p@mRXVJj"i'3QEM8ep)+dZ4i4#-#Rk'[2Z43'QN4emahP$$ESZIr[km3HA03LhK)
3Z`00NkdT#QGM,*&Dhb9ld`dMq&cAk$TIAri05GKpeL+C#C2jYRCPAI6VkldANQQ
[D[Bl'MGMSZ#V3e4&1ZCEH[#G)4J@Za)4$TA+3keqh-i9adC#GP1Q"-cXZMB6!EY
kZH5T6jYCimRrFqYV4cr9TUVr8&&hdG%6)$*kZ+'X*M,*MalFhc$!A+T"`L3X8V"
pBATek!)XPZ`K-Yam8G8X0DrZ-%fHR`'HiFlrlBFh,mimd$j%+8FZT6ra3CHM5I2
TM4)FEF`bCNTF43`3c9F,a8ZKI`T%J+bLfkbbNBFZlFJCG#VTAfc9$-,kA"2N0B8
)Ki*Zlce1C%*VFLIfQEk%U8-,lr&J+ATkl-Jf0Z3MXEV3X2AIG1M)eLXZC9&2Cbm
bPijk$E"'aL)a3&Z@#"q`SM@eG)(3J@$k-1U"5#I#,KqM94`fMF#$0TN,&2fX66X
dKTD18Sm$+ihcAT*Xf9aBVDG*dT2VcX'P-(cq#30kX%5XH+30@HI"9K4`fPT)rcm
J$&@GA%%F*mUh!`YJ0d3SJK&6A'-DSHCZArmbl)FLUQTkA0(QCjEa&&'ei!5mEF5
m6ak5!!Y8TA0,%Nl,edeGkUrFJ'0Y+eiB$eLh)"KjcKpYL#D9R&R*&&M9'IUmjeI
q(-C3BII3)rLL+ePR!BE1+)3FTqK,!G'-"mX%+&91$dk+I$kUk20a50j'Gka%!M*
khl"M*&MZLMGUh(FcAmkRBpd$HGiS8I,%a[LEiNJJVakUR6mSe9NIh!5ffq-dlJT
i#VP1A5qG8F41H9D5f'-)%Ikfp@RU2`chpH*S4b2R$B%r,PK!*aP#IkPEr!@l'Vf
+TN49CAPS-bi-f'3!l&pPBhe(AP*-)EiJ(,0RFpaQcUbmiVL)26$QGcT-MZ,PI2R
C(ZY*9lFljdV8l)0kN`$qQ)'6BkEX(aiDbU5i&3pS*[V`E!jRd%EHYb"UD&lKpCY
(V+,AYbfmJ3f[B@UE04Z@T**Fm9@VXLkP#0Fp&rEXCSSB34bGhmfhm)A#-,4JIB0
R`2kRd@33q-&d"2"#9Xl+Bd6KIYaME9CfKFT3mB#I-[Bf3T3re$aSL$GU"-2iQ(1
K8VPqC[F*U3`@prFJC%[1hTYJjlG82BS*Y$f[qdZ4Sa[2&[9N@pp5A"`!&&UhbUr
85%0QJJ89Ml2@AR9m"Q"(YV(j30$D$U#GpXP9-a5pdihbD3!JrQXSIKbH0%1*!Ni
%pN*c6HfV0N&S%,9kqX$$(Y+9#C4k@R6*&mPLaG+(j#kFabJ3ZmHk5bdb,%&E#JM
L`-8AdM"#FMkNrSX6PL,rkUpT#(Vd&+aDRkJ0UXUE8H'&iETPlRRbZM*V[fi!Dm&
cKD6q85)90)lbB%eT1LBEUSaDm!e5KmPbeZ@cepED$UV,+dMd)e)h2F'Y(PNm6k[
ff*4aLe-Nh&*)N!$Kc6FHC"qdNV5FmX$bK6mflcGh&F)rc(E([0UQ,[p8S4,l``!
&8HlAD01Xd(0l044md$Y4BqR8E2Km-aIZ@#EEjc(EPQD-8Q5T*B'Hhf2+)L`8NPL
Lh9DL54TVFPK,X"PqBb6%d*L6LQNqjcc%9bk+KC!![D*Rhe)LiF5R#J'L*3mZKF0
+RF"@[*P"aeXpTqq4'@Rk!S"1cCk+phGpdPPG3m)jel3HVZ#'U6RD#X@+,8T4pDY
3q6CGT2kCP8'V2Sbrr***K*LahIPr1&%KC-C"-cC@HNP6C-@`QrmZRQ3PaHR0rD1
KCYd&*E[00Sp!IAC'"68G"#Pd)6A%p(@ADI0"l6Mj!$J%Si8[K22Sc0J$@Fh&J88
iFbEGeaNeU1%E2Ar4Y#bj,HKEZI[#0)cUZRIZl-(TT&je1NC*h1+1[*peJIR"K%c
@ZQ1"lA(+62EH'0q$C1QfYXlUJTk,rNHHj!MQ"B9XaS%$9J`H2VKA6cN'e%beDEY
!jb65Y'G*r6DSrZ5r1)aK,M9(Eh3f*I&ZA4LXFj(m-LkaHSclR@fcqVdq+C@R`BL
P"h3XKfb06Sa[D'mkf3#rD"rPB&SD1KpZ%+1kpG6HbmJL$'1I,iemYYEX&G1qp9C
B'e@FT0l%q`[`&l,eaNZN*&"(5#B!(9f4%Plc6D1bajUbXP+ihAJNe-`CKiGURAj
i54*V6D6Q6!h%+ejZ`N2m&U3C%k,da!`hFII8*h4)fAmp@aKLb@$"arp9@4CMR$d
3V)*$m*(6F[q&'N9YlMbl,Q%MHYVCRYc*EKi,1`i4N!#1bEU!2(IB'pHi$m%dS13
eY2`[')'D`ch0ME(I#q(VB2$8Pc+hV#I+qT(*qe$-Zm'+-@"e3)BMi#M@M1,*LE%
*DQ&%$K1PE(K"'ZhJ6rY9AJ-DS`[I9jeGY"Y%6dPR%2RqDU&r56I5ZqMe&0LJ1Qr
,GB"U!NhdP$!faXGNYPk'qjDf,jbpC0m1TcZrPe6H'a0k9!P8G3r3FKTRCV3$0+U
d9Zj8,QL,@)X9X$%MZ5H4BAh#TLXBIp0K*bh-!IGMFRcHG3Q`SB8YC-K(e!bkTRD
RN[Q-0%@DT(6h%UQcZZ'MRb#RjGc3+qY9QK`!R&#MQiXHZ%,&ap!BbDUqaC-p@C*
4m6pZ(XUY*+KAUa2Hr5DBZZR8UFcikd*R'R`I[RZVF,&`"+mbTa![*b5&I&&2I-2
%R-a@M!6!16R@2Ec4Q,+q9V'p0XE,!Hi@Jp$H(%@)eNF%$L#NrbBbG1815$kNARF
52fEl8+,kmJl6TPA@(a4D@%5lcPd4hr6KH486jV3F,k#aE1'r3cm!8d4HpeFj"Mj
'[&NZPbX0`PkF(i)6MHY[HlfC(laZ4T+@3f)9&iIRK)haASAa$K)!@4%qN4`(%F8
#e)ilVFEfMTf(DddMJ"#m6#Ur3J5MmNSh6CL,b-Z+3X6UmQVml86KKARDYjB1de`
4%0DC`6bY@Y+K-DeT%aqE#RAq!,Q%pQ`BI-+438#ERaHQ92GR&dC1YGaPjVRBeFQ
283ir#L4ke%Ke3*NN'8E)*Acl8j'bb2pS55-iTrR8cmLU3j5CfVjZBqS*fY#XG9C
)!MH`h8QlbX[I[aH84dBUXkhLF)C,jaJ!2P-ACI5"A1$5r#3`MJR6D[p5UYA"qc5
r1&35AZHa+"6LCM6RJU$6'3Pi8UUG5P9YCTI1hpCMKfrp0IR'cZkH)#QBUdJQZ)S
Vc2Rli0eXf-&XB$l&Nie'SD#PkkI`q4+TfJHFCaYRD6pZYib,R2peX#aaF@cVeX6
j!+5kYHHH@V699el%MB*4@CeiK60G8Af"YXa9FGpUD@+qK'`%IV2i6T,L,Hf(@dI
)A(ZJR)p2jrq@"J*`92G3ZTe$ITEEKSLj31kc9'fID6r3-62%%'&2Y6(5#+EJp1@
hrmP-AT-*Bf5r!cLV"l+T0fHB(8,@elL+KT&9[$8pIK2$Ji%mlar0m5l6pR(khGP
ICa9F49%12Yb6UV2S-Sf,`XUmqTSQ9XAbM,kcr0DEH!D5UbRaK,Z,UlTE&&jEG19
rGGd`[UAE&`GlcbeU%kMTNmRH!qdj0hk%,qQYHa5'X4pGd[Vr(#Sa-'Aj0-2*ZF0
q55qeN!!U)(8dbdLLpR39`)4X1$Q(JK@I"5[r+YM)MVK9-3bB2IGmcIUHB(5cLV6
a,kT&FDH%*6e9ATS`N6V#fX6Fp(merlIfC#GQCqIPC@9R[(X5&jV+dC1hS'!Jj(G
)Se%8e`5,&Gb-DNJ#D2FTR3kC4!@&aeQ4&3$$D'$%KmcAq+Cq#makSKB"eUEUrr8
(+d*e0)3CFZlRBH`iK6&"FDhp1krlH53kG-cl(L-R[CEb@SjmR2"k"#D@d-er34i
5`a``hDpqpMa)$2(#N!$*U5iAAK+)&D"H[lq3!)`ID[J%R*LXj&ibHqrYk+LkUrS
ZT9lj+K2Ch1GiNJLB,VkAG@jR@k&B*S'T@!4+&fj1iqUhjS$!@`N9If"jI@l+103
JAEd%$DX)r[EQr0YU5XC$h`XD-0Ij@P95J0C#5EUF3SD%%kL5HMDLJDR3IKQ#R&&
QR5#UmabcRhUa@phRP`BNTTaB,!dBD%-@ir[bb@lKp0R8+Cd19R&#R*k1cK3G#$Y
qVk([amlmbRClX[0h+L&`),0EbAHiFL&0Km6ZZH&FISNUAj658ApmS8Vf0Z[jMCZ
U2-HKCr1D+cV%DdeN@iGbjr0[@I8aZUfFV@6dXU#UdSHeCAf&55-8!RC,RDdNADI
3)$)Pm&d[+N286ZFNC1[#IcMX*Td!qkML)mEhHfUKbkdrrFMrIbMGK)id5[&5kBE
kL[Sl+rEip0IeK4E#i8!!(!2*)j3RAKUML8q(AXVbB[Nb*cV$dY)m(RFD$)QY,lK
4MEr2mNjB[ZS,66ZeR4qTZZj(%0-mIM*iL"j#ql!&`%([RR8YY@NPm@0b[JX+jel
M+j08@5Gp%05cVq%Z+'`bKTdQK1@)q(ZISbQQ`'RP"(2lXG4h@8)M!c)RApYVDHT
J'EU-MarAlba4lqFHDS*b5Qld-c-G6E-Lh$X4ki45ipU,a94-4if)"#cid&E[VFE
@KZ0-c[rR0!FM2%6UL$A*DEa+-h)Xh4XmX,I+KqG#V[aqVGeiN!"8N!!i2[p4'EA
[lffB$9kCa2q!3X(8f$51C&9k-PXi`m(093kcDiAh*1GH30!$LBZ!T&Q'XbI6Z"k
DXp#4hBHCZJ@IXTiQ6pMUSF+@[2#X,%$P`Xf'l*FcCU0e$Y(YXk&@h+4E5,KQC0J
%jR9k!f2JZY0V@'QUi%MEC%MpDqcLQBU!(kKG6Qpd$*k3!*Mj96QT!E'DqhiZJ4Y
&aQ`e'kc(F-k9Sbrf8DBL(`Ze+X9R&m-0jYqDGGmTX-Gm!)M%j@fYcX#Tf%JrIEI
XSiZbQJC-05rDNL0)C'L0#em9-jU&'1G3V4r%IRY)fdf-d,-'$M*VY$ArkXq9K'a
9KM@0SMX5EQrL5pUX,G%ZHU,J%@3llrdp)d2DM8aUkkI4HI45#82V#BL!0T!!Zp"
fRcjX*6D*HqpcM+%VZ@1dA0[%X9rXUQ&q%0pUeFA5DjMCYm&$`*Qacp[LjLm*D+8
SqY48)M2Fq[EN4d@%ABH#kM%*!K`bR&BDSLbLi!N"0!ZNpJ$lldP(X23f5-LY'"k
BSCQrB%ZNkL"k[U0)&(F!pNA'QJbXQE+@*$X4LLXI3QS'1j(F0[c#jL-VUG'+X10
05Z(!)UK@"-jUhlY#a*m2&E&RKa821A-'K+9bIKcT4NTZ$q$UcdiKmaeBD%R#'8!
'S$kiETQCbk6)G-IT*fT%ph9lJUM,SP+eRIDUIPJ*QHl``*K3ZLUKY#pi*PdL14"
8jP!CcJkIP004VL,`*BIU5[h"j%!iVpZ2CKFNGJI5m0jr@iGa!Bd1&UY1MR%B@U(
'h$*JpQ9CY5mK1pT*,*4V5D@#VFr#e)+!XF*AXKhVffiqT5$IiF@%IdN*Fq@`5iP
UkF$%Q`2hh!Xf,9UZU[Q5UQkC!PI'-Hb#Fpb1BqK2pDHRXCkRP&crJfS[8Q-jR)D
(hU3X39FrpR4*`4d!LhcfXkQ043m#kZlp8m$e+NG`Y$-+XTZ(*M#(V9Iq#[Ci%55
8"rN+N!!9f$kr##$99V&MCK2)eX@EaXIJAS@qh[X5-MIN+UEIFYEJ,l&'DZUMH[0
#S&Pe*[p`I&l&el,X'-ffeXTX$T(PB-ihFKae,6ErEc%1%&UKS!J-Q'm%ED%9MCr
F0LQEQPSKa&(SjAf&KqJj,f1+[48H+'Te5"CkMH`-d+d3jFp6iC)hERG!J9@KXAr
P4U!q&Q`i,F)f,k562B(+0#NXf5N)("f+@d!l1jIUC+c8CP',PAj(9P[ZF%Ki8(Q
KK34hmcaIHV0%fp$lk)DM2M(T3''()JJ*cl,H9H6KjSC@J1h+,c91$%c(&KQD(M$
1q6M+kJcc2d`kC!mcmK%jbq6VPC`dFJqXlMPRfG(H55#j(cRUV4ab$TbS*$JCZAr
Q@TqK)T4Mf(JRS4e82N'KA"@PY'%V'DI0X&GXmm0[M#araI*R9FJmh@-*[jEb2GP
+1-Iq03+5k,ZUJGhA%VN'bNfbVXE&[lC(ZKDi&GrCDEU)9`UcMLAMh0pM)9H`RI0
"h3m&-cq1B9L"bj6p'la-,bi*cSJXl[0$&MCKVk2pUCTbhJh9MQ!&e-HC@8GUI36
KiL*Z(h3(pA-P''B'dJhbBARTX,MlEK(I,bVl-+eZkC!!hE'LpJ*aKCdX[AlFq+C
Bcb)rCifma`%4HbYUN!$6L55@(VE@[q%%A6*TY&#B0T!!PkmC!%&(D9+Cmbcf8DV
mUab`p*)45rFN@cR'XSlp$FSej[(EMqc089MchYq5XC&d8""k3I40AYMH8`NGB0f
51B&#Up03@jZQGl89C,)'@D8LT'SUiZ*$kQ'1Y&BGaH4S(T-aTaU@AB5EEED*-Sl
Ah"HqGZaQe$4,RR[mb6F6)%U(lNd$,QMdll*[DB@K",`8S-3Q,XEkNIXFd1IicRP
efVYF*UT('`S)lIB4(VaqB+HUV2YT&h3@R"3KU@Y$TLNFEa&m*pVI%G1Zmc2I*&#
LGCl25jG!r3!K)*IN!5a(GB()AEeYM#(H'%Zi)kJm+ba!E6M$h8lFmMc[Urp$[3`
T-A`FIa*,[Sdd%G`"%Qq5lr`HSREmFbPkY$j[`Q)Z$)C3MR256[$q)$Y6l26[mG6
B*ABEF[Cq*[EerAS(2S*JiDFi5%,$XUSqf#`ZR$,6E+3[SA-8eLD4'A,,ZKHH)Vf
j#pBip#HVX-16$[U-eJ$+TkqHD*aTk3[BD8%[bYSeK"aCPe45-,m6aHc)&iaaSaX
kA"[khFSEr(+jhY+`Ra4j50%G&63D%h*!eqRrSFY$@RCE(E5Db(F6(#p32Lr%j-d
k6$GQbmLc*c&MI``Y1*QY2L6+GkID$(al8miP[@kMPV&Y-1qIcXed`3mqe-V%)Jp
eQbZ#!9VJTH([95)h9hP%+MlHC,Q[0f-f)JQB")NU[Z4GFdfQI0GD*(Y6TeY@*q$
@L8iLk`mSU-JD9VaZQKdh4QZRK4)@9P-9DlrGMfPjFaV#J1EYMa&IY%L'9F6PEH#
$(3a&h)A%qPc&*c'iaHKZ454""imcT+1Tq9)QcB1cAV2T&!KRe81Kje%%N!$)pd,
$D)@$XHCrbTpRb*h@mZepr(e[&VJ'YK9*2NRcJlm$8f!F1Pak(#m$3(rGUNBlG0c
FVD(af#4Km(+Z%qa$IpJ5[%1YH&P0d#lpVQR@,(kaFlASXBTL,pEF"E8Ad2bUART
*!eYXfEaM+P#Y6S$1hZLbH"D%pBd#+62bN9CXdGQSiq3SC+ZR3@Q+1p1"@@M(H[X
2liUVJj9L!HTfpe"aV96UhNZAjE'2E,EhQaq'p'E(E@)AC"4PhKCej`5VCcq)Z+*
C#A*-V![4(KX@rHU@EKU!e(JahfcMpUa%53$ZEDE*KDVVLX2RKV(KCL(2ef)*[dj
#BYQVLP80j(X0iqBiRC!!A0J$reNi9AXHB[0AV)00jZF(H*r0!`@5!V$)TG9Pj-T
-FCAQ9kpXqXqT(jlZ`dTfdH3Vc!eLKaKGcJR(F'#DJ'm,d)fY4hq1-U$3[$T1$l-
2-+@V4kLSk'cdA&XkT3NFLUf-1@YBeb5Jqi6djBeRfR1IfGMh4him[D4ja1GISG+
9fG+m9fk`rP53!%aFY,3'@8)fI[mF8"-$@%L&&fk&Gr3iS(CImE,18cpX+r*DifC
0UK)913PL)UXa*B*RpAYYI[GJ$e[9DXFR($P5h8PDAKI48UA+0HSmP0,%pjHNiX&
IVLN'jC'+f*@aB,3"'2#&REK+F[$q+05R@jT6+SqUja`jpXb05Z-#b`LY`MhTl[[
iMk-,eK-V`++2*%j59MCR(jr))Y$VSRJlc("XNa[N*,bF(@d2))2Z,SP'Z1%pXrI
Km86Y220[!SMcd"K$Hhi!`HU$UMa0MVpU&p#[BCN(8GciNB@Gc0ql0A[Pc#2QAkS
@jFbqhNbh5&CIr6ADmcdbPJa+),,iU(HY)jULiGPl4V(CK!rZ1Z$`10SCV4k&,NY
+jSdHqA,4$Y-#`0GLDmXHP9(3%P"%,@mm6pfr1fCY#X#GjbKhKeXmiA!iURe&VD2
2)[9jZ0N(bM28$ZMi@UlLTJQ"D#6bG`F'cFc$)mUT[-TcZ9b1rrmC&-mhGBQ+'-$
VRmc!Gf,M,-+k)6'%CB#b$@LFB`ddrTEF00D"DMa@FAp#rcGVrC+&8TIIlLd(cLT
bYPJpiA[p&1L5GU#EK1kdY,c6D(Mc(`50qiPG8c&cJ80bM8L82`HKATQ6ElTh!1h
5+10qVX*T9+GPI("UMA4[SMD89P4ZZ`fjqQrjPXNS@X0$kZ#X&'!fdk`LH3J4%[U
,"UJV2%31rQ,0(ir6RV-mDqJ6[5a1T%2kL3Nr+3G'alHdJ#HV9Pq2L15ha22Ad'K
e-L(T**1LK,,B%b[$Xi3k&I!+A1)pb0YP`Qch,cJCcr)Z*)U+&b&HS'S)i6qb)b'
a+q%IELFraR[!KT%[$*KMpEK5)cAlMHGC-Mh&QaKSC",(V"RRG@*"h`-@QR")$Jc
bNKDpbA[)+q3i*l9K'cR@Z(GiVr[aI[E(PPlT$#I,#,1PN!#*[lmTBRYk'S&DEhC
TL@i!TM+@$-Qp)X8-hKGrRefr,jc6a8jh*,XYBQBEBLMDidmYPRqN`5-r#@,!+#F
a31GQ*Cc+@'R-L8"YT3&lXhL*M6-L%1rTBXA1+@BZZH&aGZ*a6a-E2l[GQX6l1j0
jfX660#%fejV@l`j3-"[Tj9QqX,5J)M1b0B5KCh"')H"Ip'!+8[9eS1c%4%iXA"G
SNfT$3AH9m8!cSLc,VaY`Y(AUIaBbaf'LV9%T%fi0V!ke&b$[hY(&k&aXCPY3[Nb
LPGiarXcmj&UKZb6ECrba5J0,%abq6-5'Yd-56-C"&ZQFZY"f0eVm1aZa*#B#,54
QRQG916-j$liVQ3ibi8ijpYD!N!"`L&Kk"NS#R@[2BAZJ-UE+'E!)XcrCVH$4h[%
b6X#EN4,PNA(ik+aK9alkc[2GXi#0`q3-!p[kYpYrfPY86%N8AE1L6"MMLjZqYdU
p5IHImq8%rZM%#90QaXBB0k2VADU0K3qKCCeJmT9aJ8(6EVp[,VYj1Cij,$UIPr1
Ae!KEJ23hh#(*qTm8IacT)JCTC"RpaJhf36@Q,Z&(lN%rp@@4$I8)bd5TiY&fFjD
QTU$1)T!!*r83SF51*@hUDJ8U#-%83bFISSX%L5eLA0$b%ZEX1$!aJ1pb$K,q[#1
Uc0@Y,lPKFA9bD5G0(#c0FlD*Y3Y",IMX,`H$P$BXA)UBS9"1aN2#M8H!cNE1fkQ
JY49N1p["4Cm4bqkR'G'X#UMdrhMIUd54Z1S#*b#951N"S,q!k@h+X2&3&k-V%&X
Pd[(M%X,6A3)(IAD,dJG0$ZfHa09kEU-dH6YJ42RJ,$H&cXpiHmj4MZlY'BYB+3K
2SZ8J6"+TZr`m5-f#PZUHT%PQUTm0E&*pIFY'FqZXV4#J49XIflq!@NprFIe`Y69
pH$(Iipfm'AGFYaL4RA4-Tlq&j',EDpZd!G@B!SR(M39!3E6rb5T',mC295NLDp&
,5'!$AQ)d@fi`MjJHRCm'UNT+35Xb#HX1QGL$GepA6ibc9#DQZVT"Zkl+H5[jNcq
*hUrq5,hqh5lVV+VbQ%UbM#rHBXfdAc`Y!-T@LScTkFJH@rhZchH,I@chSb[UT$Z
,KS9!R!iU[VVN&Y0fTYfLC39PA%2,@cVfRH`HK@r0&K31*UP[*Sl$GhXDJ34(53Q
5,DQ5e*!!-dh024c#$i[GhY"Fi&DKeXC3PC!!"(2R-$B0YY&H3#1e!L'EMrEEbJV
%f61pGefkX'k'6EH4JpF,9VN*'ml8[jGfPTYd[eKG$CN%f3F@A'FSH-jXc!80I,5
6$,'D(m(C(fa)F3i1'[ECp&(NZV*FMT-cZRU06q@P@Ae,N!"jZJDbG6q3!$BXRF9
F[IKr[MRU)cFYEA2'LfrkUEh"J*-[cTdl38aFYmhdJJq*r*!!db8`K5$+2Hr1p1d
!+!Dfc@X'ab0-rJSD8GfC1lJ*daRi)l-GqY&$@'9V"PL"AP(GR#JHkc8LVhEKcIm
N!FLr8%C&f)c4GiBqjPcNbT%K[JC"0h2XM)D+`4pR3j1jh2@P8aCr)NI$I4F*f!`
rdr)#4MeAmN&$bpcScZPC-ID0ZXq"'lR28G&2iY!"$C5Na@)SA1rF-Gj#UBee6a*
NkFJBLldhR+kMc)VdI!e2T-MPpq48$58H8AP1dHQ'*0qjP00F`4FJ`(RBf8VJFUI
cL"RV*q-BJF4memI!+6V(d+S164qfHNm8CiX%SDh4PLYGA!HPIfAP1#Mc+rk2Prj
qJ"jhCEb*LaYc'BH(ifQf&(!HR9T(p'Rl&!G,iI$$!,B3#G9$[)cYS839P4ilXiC
lHm3eD0KC+A(m`3)[HLS13d+5H`Y(0E2(59&2[6hjk2BN)`kH6Ec*5q#UERCrCCa
*2$(hrA'&j8JeZS@A0H9,K8+[VG`NATh8CD`mqEHe,fTA%V,,Y@TTZb!0*F"'YXC
!HKfjap!bB16fK[@5JT!!9,qJ@UQLp111[9T6J2)fF[rPL`"*ZL$UD"FXS38c$5%
j+lIA%G1Ii8"LBE-`UKHJ)Uq9P*j9FIS9eUqbX-)4)3M1#04*rRXcPlm%GHGB*$9
jZaNC0DU@SBN'I4Ied6p8pC'Y4)RTS&rIdf+jp5+2Qj&0LjY'PU5i(VEN0UDUI[I
ALIhI&M5UG[+9NA"Gb1i#)IDIm"RR-G49RS`SG*ZEpEY+&68cpB1!+I$1c#D(4RX
fRL0Gd(G'djlRS!-i["#I#39!8&SCmipAXh(qDMk''YHGfYVUD`k#rcb#QN(fe!2
e0%BjZ-pD1fA[#Sq16NF9Pai#3,*a')H3!$CZ$2#aTmKqD*M[ZG6p8h[@4a,05YU
$,NjfT(P(lj4)D23m4Q%UFQR!U@9A5pCX"deJkD8RJN!c5qrjRcRR$N0(EA3ErFT
pK&%4@)1A-UVk!%a%$&'HVPf*dNemp#pZ32B%I"C2*rA@SpFZ8j`l0LFailVS["Z
J0cD)%EK`1i"0rS*LBJ+f*E6AGf%AdfT*kZL5&Nb54VSK1'9GL#"TBi#98eJJckp
"3ZBfIBMXT(akN49'pGP[hN*U@-pA6c5VFPd!+&D)l[j'T,NM'MUZ*%'T2rCPGTk
N3%S5[UJQK2FC2`+4G3$S"@QfhalRSJXfBZ*K`AdVbLCYT,"[Iem@3)p@2A-iKe8
*k!idpKH%hhMY[D9,Q`-D%(dYIlRPXSPLlEe*%-Z#fi!F'j4SVAf0UqfNNZU+&-%
Mkh0+Pc[%cE6$[$(1El*j,kB2B6#d21akE2"-pk0qh&jLVjY`rf-*4389CR`l,Xe
jI"(Vlh86B!pSThhR%&3a&P#m9*R43p'"d9$KIXdIVDjA8L&"3mr!#@m(eeV$0&!
hrp-2#36q1XBbJ'%Y1V4r6X'qEQUP3LCq689jiKA0k8kVFYrYVT!!cG`AUDMJhip
8qZLpGh+LXTQ1[@T50*9DI[!H%9E@Ck0Pk!(KI5CkPU@i[#[*'$I$0*U0b"eSEk#
aCPk8Al!T,M5Xrk)pNL+KkVAQT2DVRbiUTl4V#[Ab,U,B8R&`Zi(&83r`&)*KXQS
%8cEC3BP06(Sa-cC9@lrUMk%B,ViVhkXar)*(Y&m5)LZKadUh,UmEXPEIEfF)9cb
G+T!!2%(8%lqAQ+BhK`)EE$!Vb1Dmk@!1h&lJ("9mQP`5U9LG-b5'aJMPL"ZJ9hR
KE$p&mFS$2b@$ZDS#f)l$5l3pId9HDHBPhFl"B#4'E[K1"-4SCjrR@a3$PL@K&"!
*SZIRX*F-AKjEh0MkETCmqV-3BUXmjPFDL&Xq10G,a4b03i1jrPZZFEa+qYR5kZM
kaYMf9GK)`J$#PmcJ9[BaqS,Mm8!ekc,U5EANYRikN!$4iFK%EBE2%4Peq*,-XK2
T%lkr4$Pa@$%GM!jYPRrIAS3NM@MUb&3HH#"10F`"`RIh&Yh"VJX&50-hf-qAI2[
*3heaZr6YQ3K-1Nf81q3Q&Tl""V%lmbGNl25E5+8RLVpb%Lae-a'K5a)jYR@%PJ-
2fQ)kZq56-Q`@F@Y6N!"[IN&&"H8m&ZL()M'%%qXf9p5B-"J9SpYEj9(VI$JUSQ#
VUVmD!3lk'Zr05HM45%%GZ!45SNT!+2F2-d8ccF9*(-KCr3ad6ll8*L6I&mCAK[)
qR,"GD!Cr[`'Jhf480XcZ@Y3fShq*L[L@-Li%[+d0ZAI`KVAE%JHLK6P4rJN3,RU
#`@Lal%rNjH!l)[2BNcR'BDCp%)e"JBPAY%!M25hEABX)f%crd+G3E+L!aF#d(Bc
DK1,SE3pm'ImdciT2dJi@&Z2qGB%AVYD'hEihVP,dqaPh4mRV+-bI)M(XLlVcJ#"
KA&ZmJY&Sre[bmP+#!jH!q$-*XpR13Mcq1&*04b*9pXPLfi)*L8"$A!JPhcPJ##T
MQ5#peKT%Gd5+U5lVTGHcQ02m2)q`SETS834(P$0@hE"dpQ'+-i1IkZ5aNAlaDpX
ceaP"T6i[i6RBN[U&p5Bl6"F0,8S'I"kcN!"Y%%-!"6A8q(E*Na)6Q$cS%hYJV4K
Xk$6kYMQA*Ii9M$cI@F+,0H4YUh!NRXQZ*C4fBqcGSB`Xe[i5qkMp0fB164eMNcc
NkQpcjJ9a9m%e3)+E9N0[rfKVUM-!a4R5U`fEaa`mZpZ*"&f@Cr)9jN500H`,SH"
HUkJNa*DDhr[UVibS2(4*MMF1(k+1E!NS!%r2JNbPM(bdD#84bcIYmfpL04R#h4-
Qc0)PUIDUiTda6F&SCTLdJPplc#!kZ13rm*fi8eXZ3!Rq*&1N[1MkHj0F5ZdaD!B
49*4&`YjQC+[M,SmQ%@VZ34-#3*Dq+bX2E!9YpdchRQeV&fV2lB6rN9rYpDB[hNp
hiiYIAp(+!(k,J@G8rRifU[A',F1m!Ul[ClV3lK[![r0K%BS1A85cA+[M$FT133l
JLJ8'Q8,9*#Q[k)9qTJM%S$Dk-eC1[#9[cBfF'`UZMc1bSmKKNkT8CF-j$K3cK[R
h,1BY0(V&p2pcLDNj0BCer'ER00k@8@F&*cJ$k'd14U!-mYfD`cU4MiAS-3a)K0m
AFDf90!6jh8fl+EqL5dL%d3ce89rNBip*P"43YNRK5ZCJ(1%lP#m)6l@Hrh$T+Cc
(VQPX!8$h'T5AMGE1FG33GRPcKL@P(lRAk#55Tr+ekC!!)S!%0UPmH4TYi*BfM#!
M8L&CfLKj`FII29f"*$r(MiRNDQb#U@YQq&X8@!(cl-)"0AdbVJZ)j,D6m4c0#AR
hF@4R4S0J[R2be[PhPf"Jqa,+-iT4m@dTD,al*,$'$brp-@-2qGle9$C``kNS8bI
q!rqXp-+`1E)K&I"i2'p!c(8aEGmhV-dcLBD8q)X2i)i6rei@`jNIi@qE3QeQ0h!
G+1YP+MD[PE`b@-88JGr9T5KL#2Kpbkl0d*S,&DecRY`kiJmj3[-kah)X5$!VYmQ
qJd[YA-j`Mj`Jf,H-eqNDdXYVI,36r!r@"ML[T1cFSfNrpE@TR4e@GGrD"c[)JEm
cU41!@h-9$KHK8%,Z&1b,"M1)3-H)Qqar#1AeLeFUf%a&4h)GZ5j*YhM@Qpf(EH8
8--qZ(Ih"KaR2NP-'bhm9PlEI$*(&XcEKekcRfl")('Edp"A$FAda0Dd#4YGiMMP
VkF&a$pZMjY8[qBEX1qJApLM[,5RceI!HU!IS#+ZYA$9XrddVh'9pXK9%Y*d*&re
E8,[H3$4k!a'Qq3LjP`(qllTBXEdi!pDABc$l2QrDfUl(89*F)iHf`'L,BU`18%c
lSN,PDqhm`qed8YelE5H@P8&mIE%aQZ`BQ@pa`mYLQN#`2`lRMAThbHZb#MN2qJM
@JH69FGVbc)L@6m2RjFAqID[[0bjajje5a4Sq'qid!1$F9#X46YZS0E%b@8dSjRk
%aQKpYILddK#h%(%L"5+S,NU!2@BF5D0ZI&3mCI"+b5QHNFi@`TmBjVKH4)bR@Zf
bTYF9M-klF)"!M0,pFbDN(Sd19(jTrliT%-JCLMHbXi1'$e,[)2ha*'!Gr4%V4mp
kUdcZ+k&RQ!GJe*!!Praflr6C(G&"SZ'Pl%dGE15BM#r!J$Sp*ihJm58[AHf6UIJ
VSH%J1$*N,#I&f58Pb-G(++mK'B$`0-`TaQL3!'p@k+G&X@0LFkaVClH*0EY*kVm
SbQ1aTM)*H-A&ESBRBlYP3$9PIekhZM)ar"`Q2C`Ab(Q,bF&,'S!@frJ8QeT,qeU
Scc@01@VYFe4UXm(-$!34h*D(cMM45%MQkEUKCqh[R-'i2dJr`qAbZ1E@'$`Jf*V
SifN2(KTfjdJKL@G1%+G6X66%TH8KEAY)ee4XGASAAe'F6$K@+4paH%ZQRPKqCKp
INPT9&@rjYU(Rj8q8CpBbALr""MB5+$6%1S&0da500P)5DC'+h%QCa%9AS#5KSlX
k-R&bLYSTAThKSVGY@JKPQ$fd2C3T[5PS`0Q@$-`D+kl"`J!(e"lLiIfajU$Bi6f
Yf&-(D*4SY)h2%3Mp+3G01Hd)+#mG'NrY$ChUGh5QS4N3H%6blQ14)Ddj48!SX9!
kZN3Hr2VQPHf480'ApF,8F2p$1rlM[&Dk%pZ0R)a[j,83QQG%kkhk#B"KR,-c4Xr
3AkRGkSVY*8T0PV9+ANY)"9IR(%0@&@')E9Te03%a(iS6PAca%,6iYqV2eK$5(&#
9IN%KEADP@kHji$*MZ+0hN!!p,AGSIp9'LCaH"JfeB*+Xe&e!Pe+&9-X"(@qMP,2
ld)@%h24H)3HYLZJk,YihI*b8Tf4440-C18&(3Q@phec+3'Qq8Iiqb&6+IYJ`l53
%c#BZ(l5#99D5mTZXG),P)hkZ20im2*i8b"$XYLQq!`HZ1qCF,r(mHTSS)B89RKA
&)eDS`A0S2D5+mH&Imq9(N!$d*q&XH`SZaeQVhqbjUH*ah58H6RGT8(G@YA-lRJ-
0AK+ZqcYX+&0Rm3e46"l0fSjeJ!fSmI8kdq!4#+eNZAZ"Um0NjiJqK&*XiQfNIJN
kBEal20Y1'X[he+M#Y%ZqUf!j)dF6rU0#[mKia8NadZri2`$pL#)K-Y9Sl0#3!0F
Ae5eC*j--`+@)!IK+clYLLFrmLQP"!p3C3IH0Lar"[0X@&AHE6r-VS*0$9NHl1C!
!kP6IQ3HdFkilRh6,S2!TBSXACKM@3cc#5D&plbq#Q(M8UVpIdJB[pIZ(4+q3!#B
CjVT5Br%CPED+IkIEDXe1`20&JQF2YmA2T!Rmcf3EN4I'@)Z+N!!+$bGQdqkZ!hS
[5padpLY`6Klk2b2T4#mi1[Nj23(QJ0IAmJK!F3McQVbjR'hDf)69@L"q5c[+SYk
LhLV`j2bPQlZjB+MdNVhd(R4p,Z0&@1AZf"LS96rMADSF!ET*UM@cPAKR#"M*hbB
X(16"fPTA[UH)lCZZfE+pRA#chJ#ZrdM`FRD2$93h3SiG0)bjBY%FZKdPV'6r'06
Qa!PJhi6@E@aBC&-,%0fI0UUqF#Y@LS-JU*YcjKPbYcibeSE)lS'5,!&CM-S&S`c
JS2CU06S2arI9T8pDYNk'3CPR`!1Y$%%5cG%0HJe1Ebm$IMakUDiKLkZGcaSFq'M
ID0'r90EPbhHY`eh#JIApHKDVC',),YYC5-f%hjXeer8,j6HQ9cLQ`9*&X$*[`T[
-bP25QFGK*ibK*iGZ"4L$@1A6e1Kp188Y1S0k[)5X%l2DC6A*e*AVTSL*pH+%kU*
,99+85ZbJF!ihNiVK82"+M,(*DYjhrlQU#U8%'kIcQIii+m1ebBUc!`bd@02dHMR
8U@VJ`[`F8QL9@%8qXkTF925`MMPp9%$DP'2hI!#L!%bmqcE024S`KiT4D6rc(DP
F1NkU)km4aMM5dZ!5!6EQeMf$b+*R-BH+*LEMGeqD&Bk*6r`V&,3)qZ66FBh4heK
B%Nj"[`b*!dN#Uhdc,rrM9Y%lQ4LL6)bY"&"cZ61r#$CEGiI5I,[4+G+V)r*jZ4(
dA@e'jRQ#Jr0p[VeI#29GNL5rNJ2iBZM0*L5HXb[$qHC5TJ39fT&BYJVV3Uk#!BJ
4XUVHN!!05&4&GQGVSiV)1Mcp)R1a#kZ#"i#RQP,CA9rrlP$5qIdM6&'('9ST%Tb
V"[YajNcYFdFU*rTV0250E(5N[M3f"#qm-6F4(KVF!4j3e*fM)aHU[b5q&If"R&Q
IlQi&dP)XJaDE0di"'"k2S33Y!'*k1YbqA"alXBGlpGP[+a`b[MI)SaZ%+8SBD@K
,9Z#kSj!!"iirjAifCd'6SSF3pVKmpEYAjfD01$i8Pi8A28$)*BJlJ(GLGU$HhkA
8E'D6Z3MRk5l(PXbdMTf(Z@N#bc2li%BT93cql0'*Uh5[%1'3!"[XT2Yk5TjEQRa
(fCLLh[*hMDV!m5!3k"Ra,arU4HH*a4c@Lh)9[jj08@K2rfUb0iK,R)Q[#,%L5c3
5mI`C'Sq!FaZ(&16cBaGZ3E+KEmU*k4DPA8hdP+b2V*P2[qq2*q18Gc[B0`[dc-i
F06AEl@69aXI8EpaP[84$`@8Q4A5TF5&I`TP9h%9aD3+j'V,jdl@HFfj$iQ)-!j4
*&QG6IRQH$lrET29,GEhi9*R#@a@IVVH'4i8bFE2'cR9,YIELa#[UIJ&jk)CXeic
4cI%j`p-J#ajhK1ZST)BU66LqTKjb@E$a#J3`8Be9YM&*EF`X')p+$),"5riddre
Hr`'"I$Cap(CVLIjHK#9H5[XD&m#PN!3"!!!p!"#dSPMhY+*Bp`!!Ymm!!22@!*!
$FJ!05X8!N!j0B@08Bf`J8N9"4%e&!!&V-94&@&4$9dP&J3!!J!'"!*!+J!#3#3*
V!!!"!J#3"!m!3X(8iHr%("93PhXmAdET15-qLr(BVT6)8FG'NL1D,H#Zd!Z*,Ba
DA)#cdUR5Jd+MZ$eUh`p50Rh!PY4FhLh#-[SU#)(rh9)p`THirZNb65me0*f[NUV
#Df%8N5jcF6k2f4KSj9iQG-kP)i6X3VVN#bE"ENYZBF3E`elI)S1Ve#ibG1AS0HE
#KD!E*Yd(-&8hG6aES#IJR(U`XG-a8"N3E18fm#V)(HQ-P),V"JRhqIlbdGYC@DM
lQ(bJ))jTiaL`+B44dHQ%If3K)q-KiU1LI9%N`FXL`I5r6F5kMK5jc2LGp9,mdH2
dmJ8N$0'"[!5+F&*)d1ESh8EPhU8,9EEIYT!!!+@3"!%!!$`!%,5L@4+dSPN6!!$
bC3!!p8-!N!0b!!b)p3#3$NeKBe4V)&*&384043!"kGe849K83eG*4B%!!)!#!3#
3#S!!N!N#D`#3!rm!N!32!%,"e3Q#-dD0EcB$!GQ@h,)YYCJ&JkDUL-YG%4ZE,JV
(0VBZZceK,$DG%63re[3N#Epac&lrfm"G2Re-AAI,'5T1S##K[a4a&pI6idpT&B8
JcM%AcR),,eB9(fNI%ZrG9mV-bEUMTl`p`R9XF"PQ&ep*"pE-0+aZQmK3kcE'kA,
9%ja@&GV1j2T02hC08EV5KrEa1jSBK%3p,SZ3!2YH6aB$Lk'LLEBh'LVA#J!mB@+
4iXF1i316,pHXr`krf8Y+kiX9DVi*2,d!,bPNa5aAhJ3ck!"NjjP)9+[$N!"H,dp
AV2hk)DFS@Bp32TVQA#8-ElLq["H4,HE$I2`j"C%1U`!!TC!%!3!!13!!Y`YYQVF
,ECS!!22@!!$fJ3#3!h)!#Eb2!*!16@pbC8CTE'9c!!(P3fCNFR"03806J3!"3!%
"!*!+J!#3#3*S!*!$d`#3"!m!3X(9'#*!l&*0BPEdUV&%-+*0FS"j-q!a*4Kl8R2
&,q3iKlRdNbG81+N33QjPBB&0mrFbY-IHhMllhpa4)h[Hh#'DqYhZmUj-KTSj[XY
3-,4Q$qk-(2GpkYN+1Ybq'bFmpZ[5Y'cAVN#N2p6#8f@CEeF9L9RMfkS&pU[0#2B
mbqh2j2SLA1Za$iTpKSGI`Y(Z@,Q&Er+0)$-*h0Y,@(NT#LffJ(1C,lJR)",Z!rV
X3"Hf'VbpF6KE&TUdZTJpM&hfFIeC!Skr*hcp&-X)XkVDi)ZVi+@3"!%!!$S!%,5
L@1kdSPMZ!!$e3`!!pl)!N!0b!!U4q3#3$P4ME#"548&%688!!9jQ9%9B9%0A58@
"!!#!!)%!N!U!!*!*!Q%!N!2&!*!%$`"#`G6)[q9[ia5rrCf$YG%282R4qUP$0pe
PH(6PU&["r*U0[-C1YZ-`5PPf['Zq1D6ph#pLG6eHF[karp#8SjiJ(LI&RZc[Rk6
2Vr-DFaaL4)RaRqP5fE+Bp[P3h"'+#bQlQUIGaNA-RSGh99'c!+eF#9Y&j5FkM+H
3!2K)Mp92HRk86jUV8q"NrYj$(pCRUhEZ6TY(+@TEAm[AD+"F1U(M#K4V#mKX'&k
V2HKPKEkZMeB(9k0L"dR(+SIY(r-BCbh5)b899qLPN!3"!!!l!!#f$CC'YJf@4J!
!pS%!!2Pq!*!$FJ!,RqX!N!j8Bfa#6d&6D'9XE!!"Nj*KC(*`9'0X6)%!N!-"J3#
3#S!!N!N#F!!!!9m!N!32!%,"e1T!eI3iD5hjjh#)@MVZJi5Si1ADl(0K"bl$L6F
c(IA8A548D))F(#92Cl#EMF4P$Fk*0j,h@Z'hZlhC4IAGDVJ1R,5MXeP[-VRPrrL
P)@bm!B#l,("ZU'[Tlk9V3J[S+STeJBjElJR@`KY@5!BLNdFd0[4L(K9#qKaHZec
8R8Fp3p1`Q#,jD5INF#-'0R51rr9lI4BmbMRJ+4F#R%d&,"qjR0f*TZehNjMpVP8
4)UT4p1DfBM`c3B+jh@NBd!AYhEaCl!j*(!Li"8mL[hGpjBfC`kQC@a[%TA3I6Y#
4m'1[a6$Vp!PXH6B8pJNYh%91Sq3SQHScqB$C%F%-heV#('f)m8$X1#kR&Z#2c8K
Y8,@p,N&*Ihj`T'`61(59V-FfcZ9I)RPKCA`mf'TiYKU*1Cp+$MidC1)!ef[0U5e
P$mB`Sf"-X@DG)dJ$4DhJXU'a3-[G,a%0&21*Lac8!+@3"!%!!$J!!,5L@'QdSPK
T!!$hXJ!!qZ-!N!0b!!KUM!#3$P4ME&0SC@aX!!%Nc@&NFR"8Bfa-J3#3")%!N!U
!!*!*!QN!N!2l!*!%$`"#`G8*JM0)4lA5I`#8mk4A%0Q*BMTMd9B(FDlf"kC5A12
,rm'X0'',YFKddX-SVHp-fTF"`HA3!(kK`FqB$TLq*T1ME*@Xr%r`11hUMd+hPmB
+b!88&S8j2$8BSaRK*2&p`ECFU8m[qB@Z!T-4Te)8GkaXmH+"%$iX(6FQdac&9[E
b!NGL1kdb0*2%pb,,+Z*B%if+i'fT"9p2K[dpc%m(9T9#C0I(AT!!lfah"PYGp!)
'4ZT`DB5bXGkQYF,$mR$FL@f6&6(4H%d12ji+-E9IAEkdB%,Y3&+)Nhp0AlH@MNJ
(@YV)%SKl6"kd*hmF+Pi103)a94G#`D$Sq!#PN!3"!!!l!!#dSPM&YXf[%J!!qAi
!!2ak!*!$FJ!,ad!!N!j8Bfa6G(9L,QaTBJ!"pFj08%a'3eG*4B%!!3!!J3#3#S!
!N!N#F!!!!5S!N!32!%,"e-qAT`Sbp*!!1P59K8N(L&e*3HdP6KC)q+Nk-HfpMA-
Bq--af8L2L*[hj`q+JMSZ(pRA@qV1NeZhNqMh4'ZV%b82!qTIkpk!BF)R@26CKYP
)C,3kq!FE@X8%d+DfijEaL[!Jc6PPL2`i2QNYPD[cNL"ecHQ!-hTj'JN&'Zh5hH&
0Y`d'2$BTiEr&+e5*qla52c0U&"fj6Z#i%h4SRpbY"@GHd#8pUa`+PRceQ+1bL)I
N4"q#cUKf0)elM+bS-9-&kf1KT)&ha,Ja54TqCFNb4iS6-RH)5)K#19aNm2kEf9J
,FL[p'De"P+H4LKm9eXBNJ6!ARZkeV%6KmJmD-)SV%ahE6SVMj8cH)(XD8C43BZ1
)q0kdlr+*BE,Xkl@(+4+4Te6X)C5@9i8!TC!%!3!!33!!Y+*BaVE0Va%!!2VM!!$
q)3#3!h)!%DpJ!*!19'0X8h4eBN0'66Bi5bjXD@)!!8N169"-4N0A58@"!!%!!B%
!N!U!!*!*!R`!!!%d!*!%$`"#`G5L`,pb2XUMI,4[j@dC4,i`Ul9Ih$"iM#B2&U4
$Ec6cQ8bjDrhhR(P)K4ZZh-)jT[`GH6&H5jMbM(afeY-Q(,rjUBAar`6J%hljUj*
[df8'hV#Y50+CNi+q*&Gr)bC&#%80Va'Eckc*A'U)3[@[KRe9E[pV[pBpj("1%IJ
@,D2KiKD0m2S1KFI!L-B%$IaCN!#jrS-4K[19ZY,R'-!fd'*L6*L*$8NhVDQD!S5
#e[kNIX$b!p6)drk4RF,Yebq-m*BSe,`rk+U6hUMbJ%Z(GaGP***Sp-MB(T*i8h`
K'QLdk4TQ91l66BMac,Hee[JR-A,4+a'4(I"ImVLhC+MhK"39ARlTrSRHdY"iE9N
KTKlcEJ*5K#iPi)*DpS2XK8X80hXNGir!d&16dG9jEQdI3qFSb0LPN!3"!!!j!"#
dSPN+YJI6'!!!r(S!!2q$!*!$FJ!*6dB!N!j8Db"548&%688!!@kq9%9B9%0A58@
"!!#!!3%!N!U!!*!*!Pm!N!2h!*!%$`"#`G6Klm3F3&63["mBeKi(c4[8HU$jV*6
UXG&GaAp`X"aX0Sf@Eh$m2$)XD82+I!V-M%R"PNUBK"8#aQAb2@E+NpH)Y5,1L4L
`915Kqa0Clj`!8,UjC1"d484(JNS5T+Yk2JDS%XkRK50`$"5XL9PcML`U#HXHe4[
&SZp1jYDTJBN1qlj$F9Z%hbr%6[F5b"#a"[I1kAVqD(Z"(f3mM$6k(&Z""VeY-Ua
+$6TBd(Cf`[@"ISAcJ6ePABZiRMM+*YI64`LQRd1SJd!%%EQGk2rXCrpTILhB[$`
*1a3PXIBMD'kb[4E)ji`!XB88DUMqq%4LeJ2&T5Z!TC!%!3!!1J!!Y+*Bb,B(daJ
!!2iK!!%"%!#3!h)!#Xad!*!19'Y6G(9L,QaTBJ!"3KY08%a'3eG*4B%!!3!"!3#
3#S!!N!N#E3!!!5%!N!32!%,"e+,![f!HQa1'!*(Mf3K&b96VlIlGF@'iaeH$lFi
*Z-&#$$)SZeL,JG[hMc@&(eLM+-X'r[3'"iPa!VTL4TEEpm2FHp0C(q*he@rY"qH
$5-ASV"N&RZT21ERkCkUU"A[GNbbG'Qd@b6'PHAabj'PUD`jA3X"i%HFEV%cRH*B
dI%b6H85,@f-ZDLFdc+jaDkbb9M!Am%jh+mk5(NC!VR,cq"40C'R,D+b@LAEa-GN
[+U302Pd@&cbJD,r"pF)XHi55YULja(G0fp`H#URmq*IIl5X'$aLKc([8kVEI@5`
FU88$Bd1E("Hff)raAKA%Z--b)mRcL2JCceSQ+MP!j+2qD`Y6TlfbeEEr!NL23VF
pK"#5'!1jBMG(hHlZQUelpB#PN!3"!!"!!!#dSPM)YJI6'!!!ri-!!3*a!*!$FJ!
31hB!N!j8De0dG@*$4Ndf1%XZE'PL!!(&Y%e36%C$9dP&J3!"!!)"!*!+J!#3#3*
j!*!$l`#3"!m!3X(8[R5'I"$LREVIJYe1PA2'keL1RQN5CLR3GPX`16%GKk3jeYQ
6KeBUR3Tj[BCiVMj+@HC$jMph6+DeN!$q'c@Cf-'eX!&j(rH"PK"T3BQ++bLjZT[
!Bc"ETdRfaM&a8%QHYTK(j`8$bff(05'ERiZbCR-N[Gk!E2XhCkkhcf*h5e`Y5Rb
8QeFb4(iK-f@N2V&%A44*+M'3!2hQN!$HG0!(&BqJM6eC2b'FS6rjh3`-TF'F2jk
CPb8c9#i$m41rGKkmJIJHer5r'e&VU@+"m!,E@X+q4IrAMha'8aKdQj!!rre%Rq8
kAj!!BG8b8r@9hMkPJ+@3"!%!!%8!3,3T(VQfm85Z!!%"%!!"$NS!N!0b!"9JC3!
"!YS!!"88!!!,F!!(9'p[E#"$EfeYB@jN)%aKEQGeB@GP!!$mD3&$!"B#(3'*!F!
!`!'3!`i!I!"Hbd!!!)!!N!HPN!3"!!!f!!#fm85NY[&%T!!"!R%!!32`!!%#F3!
'3B8!N!jdBf`i,M-!!FUcCQ4bF%e"3e1!!,,JXQ%!N!U!!*!*!MJ!N!1Z!*!%$`"
#`G82jI0U9eYPY3YM*-ZKq3HRr8%`UdjALrS-N!#hZr`k[263P8d-P1KF@m@mfM9
&BkAi$V%[N9ZF!NJkkp*Sa9C94Gcf@BPF@,r3p(j,p-NE-`-aH$2!)6F8M-G&9mH
hd0CU2G2+Z6+[(3e*C5VlFUmrERADC)&1#ELr`!6R,dN)EQHL5@ZLGjbUj3)BQB*
BARp(&cIr0cFLqM8kEmiP)`DdGT!!T`(kL*SBD(f6X+@3"!%!!$X!!,5L@9Qf1r)
b!!%#fJ!""Li!!3*a!!ZU5J#3$P4ME$JZ-bjcD'aL!!%35R0SE'*8Bfa-J!#bB,*
K!*!+J!#3#301!!!"d3#3"!m!3X(9"+5qk$KcSP-*+"pN+HAl,K8k8lQc'XXd535
mkB)(SLmSLU@RL%!%Dph1fRi2B!S3Nhh(IIqe8(['B3X$+Ib'MM`e-cMR3Vj6GQh
UkaZ8%JA))Y!IX'mTAbYNj1-EMU-f0eAY@i!5dYRp3%kC6acN&q1@%e0am&$NH&K
#i)1@)*dd*Q`HH84%i)Y4,B'bd2P[%6AI,6LQLGU[k,Hhm#jp(*S2h'9IYh1l"i*
4p'NEPR@f"2P5`cNd1UhN-+R0&A)Z`J5VjL2%UiKBUS#4fK&1)qNH-P6Re3Ykc(T
A@5pZbVMYK+0Ne-dCQ'-(h`)H#h12K5T$E6ZY`*hbabl3rN!"X`'3!,A5+,*ZrUi
1cARJL[P1V#Bi)5CL2P)eSfk5`GeF90+U0$mbUEeP"4"jFEKf#fESDLA'BJ4JKC*
%9Y[UfI8dEGT[M4IZGKKU`0L(K-be9ZUJI6-fj,HS*b,T164hFFL45Ap%Zc2r"Pi
V31XhFGbY2SU$+`FB$(Bcq1A"eiqIhq8qhjYZpPY20C4MLF[-#K&TJda8lD68*!R
Ie5KRR"Z3!$6&&NK@$fL6(f+mX@2Y8"Z@)11G0(ZJ&)2&a(QE+l)*UjG)lNI&dB!
GL+UhbB#PN!3"!!""!!#f$CEIYS1eR!!"!r!!!3IG!!%#F3!4+@)!N!j8Bf`i,M0
$4Ndf1%XZFfKXBJ!"mrCcD'aL9'0X6)!!XU#bB3#3#S!!N!N$@J!!!6`!N!32!%,
"e3hVTAlJP()mL0hYZPIbCM+T)@@a+Rq&[JIcES!ZKPaG$)&lTlIXRXCj[1Il#LD
drAk6,cQ0)IY'cQP602UQG2c`[4#!DKVG)b1MU%U990b)B0#B,r-3Qf81p!+J-SY
m`p,08TTf3m6,)'JR`,EPN`m""PmGKXM!%RG!E$VK`0E2Q[)MKDJ%GHF)j@#d(J9
%`*DV(mTHQpp1!RBa'dKak!&l'%K&%M)STCj5L8HM"e!P-H6&,!V,Lp!#r+hd`Q+
jIEC'#pRX4$l@1J9KNDT$1NN!@UV[B*MBFYMSJFTm91aZ8!qIV![bE$a%SFhcEIV
+Mj(PdNS"mMNpbbKI(TJcMr)U9J(FGAY$68aXDh!Y@ZV!i0dJYdZZ$'Bh$5rpT(f
J8DI"fEY(%lR+qmD,[N(,'6+a0#&#)&1XB!#PN!3"!!"$!!#f$CE4YS1eR!!""Li
!!3QL!!%#F3!6iP8!N!j8BfaKF("XCA0MFQP`G#jcD'aL!!%eMR0SE'*8Bfa-J!#
bB,0K!*!+J!#3#30H!!!"8!#3"!m!3X(8IHVQEZAX"LHU*&)%j#Y(95+4KL@Vphl
KpABhbhB@!Y"&CE9)iA%-eYfPAF%B1bLK(FUB"kbZ$!m8kc,#,q3$d@hYKRcV%ma
hkZ[4B28j5l)p2r*dpPam2prU@NU3!!)K[@mJjA6'L[0pG!FlYJ#HlNY9`D4SlR-
$36dGI3ah#p`U8Kml&GqqI(TiUVF&B5RNJEiV&kV-#&!'(QhAPaM$qjC!2Eb"4Dq
jG1-l01r#QFS02qD8a6KY$dm%4L$+)p!PYNH8HY503%IPKI0mNF$Z`pii3IJU20(
@aPZ4H&HLbbapZfb0BMp5D[[e%'NI0%,L(mY-*laT8ETqrH'`Qc$Gmr5G3&BYEj)
SDhFd'BI2J5U(fF@(-*MpbNH(f&1f0+fK('kJBBR%E$4kmQ,(amXdYTE+$IkL@*P
&PKPj#`22r($(!#'amX!01ILfeIp(J+@3"!%!!$8!!,Ea4+bfm85X!!%(h3!"#VN
!!3*a!!8j#`#3$R4V1#ic!!&YFfCNFR"03806J!#bi,,K!*!+J!#3#3)d!*!$X!#
3"!m!3X(8LR8'&[8,TelN#*1#IJF1B)EGSQSRD3@K$fT!UDUEI#%RDB`-$PR!h8@
$@)IqD!rY(kUN"4a!"hKRIUN!EiF,21)ha(b2F""a[D+9pk)fXhZ'Tq8H&V[(B5-
P!&MC9'c-H#YNTY[rB`fjAEV6bbFBI-8HE52UiGjiSrhlVfD8NB29*%fRKS&%1'-
aS`1%b29HhD6Y$qVb-bb`1L,SIqqD@TLFB#ddiqbR`3$JV!#PN!3"!!!k!!#f$CE
0YS1eR!!"#D)!!3ah!!%#F3!+B``!N!j8DcJZ-bjcD'aL!!(Lk(0SE'*8Bfa-J!#
bB,,K!*!+J!#3#30,!!!"8J#3"!m!3X(9(Hm6`ek+"j(K4VAGlQ96B0flEIiDYKh
B"&96ATd88HeGA%9*Mj+mZ&r1aflFS!9-EcT!&!5p[%CC@pSa&4e,kfc2(2mjPll
B@HdqGS681r5+R"f%XJjdQFHQYD3!$USZR06*MRCKQiKh+8#0Kc3(F4"q,Qpbk-q
m$E[hNrKq-[MRj-phQ,E+d4p9JZMP11)5)m$m[B!3iXS1jUUHKZ3*R%F$IlXVB[Y
-JcC+LhrqD6K0-fQI$rHhDY+f,"c+&9RHkXMUe5BKVcaBheY1EQ,DdR-4e+eb3L$
jkSb53Jli"@9BPLqSYpj6i)JZ$(),)bbk6"3R(YPPkHLH1ZMC9lAd,j(JdK+@Yd*
9he&&fG,AE!JA!N#mc8*kM8VNZ(rrefC(H`J*UGNkMf0CQH,!4eq0+J6X3k#'MJS
*RmYTkj!!,!bDJCT8cGJjf+NV$m$rdp!!TC!%!3!!3!!!YJf@iED$YC`!!3Uj!!%
1'J!"!R%!%'jV!*!19'Xi,M0$4Ndf1%XZFfKXBJ!"D4"cD'aL9'0X6)!!XU#bi3#
3#S!!N!N$9`!!!6%!N!32!%,"e2)G%9!FAc3L-0cAL!cA&1pERJ,h8Nh6F@9Uq2'
Y"*!!Ti+a[M-$qSGeFNHC`H'IZ14[IJ*pNQMbBrcH%9X)(b,karMNRc)A`F90ZB!
I*PiEhlSRacL,(e2DU5fjpJU!-eNZ6pIi9D0M6k9)B2'e3NbDXYE(JBBGp2)B&rI
U'EKB%)#DLYf%$NhJG@BSE1@N@p5f`D'ZH5&XNHqiKm0rfG2ClL)`L`'$MPEZcK-
PjQLPTdQ&Qha5,$UNM[dMN!!k&[@k'Ek,5$AM2"I-@0ZI(&+$"AY9JCl[%U$PZj[
iYHmf[2Fd0Zal+44e&`%1!RA[)LqF3j,jk#f%GheNMj6d)h-TcAfZ4@,j6X1$2RL
h[VQCQ#*-3"6[a3PAH`*,,))eebH&!lQ85c)kj&Uj%ae0-8#PN!3"!!!`!%!!N!N
"$(F!N!8"!R%!!-rMrj!%!*!+TC!%!3!!2!!!YM-[3EBc,d%!!3*a!!%2J`#3!h)
!$#`2!*!19fPNCf9d)%4PE@pc!!%VkQ&NFR"A5A0)J3!!3!)"!*!+J!#3#3*a!*!
$b`#3"!m!3X(9'#*!iNIZ)BM#b!T6Qp[qZhdQeS&S[XJCVcmI&DCJEAE*N[cPmU,
d,L'C3lLUFYI@!KQSU*ZcBpI9T,)INNMci@B-)qQS5[GU#XlP0f*,N!!$Y*-,k5j
DGjbVaCp%Uj-FQk@`+0d&+5LD)YKkQ,026rJC0SaiYQ`#[m(C[RBbqMTD)3rSrb`
b2ETjCLh$$Hc&T,'kK,q*+BJD$dk2dU!iGMjilF6k'piT3bB'PbaE'q3@m`UZqCd
*c1!IC)(b5c$)NL5*Q*YmHA8!TC!%!3!!0!!!YM-2qlBc$rX!!3j+!!%4#J#3!h)
!"!pT!*!19fPcD!!"IleKC(*`9dPc5)%!N!-"!3#3#S!!N!N$2`!!!5%!N!32!%,
"e(+SSMTD!GR2!ZYAQ(%hfFD,4-KE&9%lR+kr,#H%`a05JhcAXjD&%FY54[lGf1p
T0kNVdZIZJMPrQ"@[NM0M-EN"3I3cI#N&Jcdk)8bQC+Rd"D[[q3#DKA9I(3-'l#5
R%Q![rQ$-HIJ+pM,[%N2bJRd-EI5m,DJUE!%pEZDVPS$hfq6YRqqG(adZKk5cGcc
-&DN,YBJ@!8%(G`,XBVfJa+qDpjJMA6V@8%@SI"-Va3i[kGd")m-'Tm*)C'k*QaB
hRb'4KY[f6,l+T9Q@-mk[Q(clJfEG'CaMm@LrX"MmE0qEG3'##(K,e,BH6Z0p,c*
@+&SiUp[f$c(EkqS@c"0S#$r#i&JUJrj6bq@BX`FM(Pqj8!m2c#a`0XS%&+m-6!#
PN!3"!!!`!%!!N!N"$i-!N!Gb!!!$0Iq3"!#3#NQL!!!"!!!"MdN!!Bj*!!!%E!#
3mh`!!3#3"@N!B`"p!*m%!Np,!*!(23"J!21)A&4SCA*P)'Pc)'j[G#"PEQpeCfJ
JFQp[E5"[EL$5AM$6)(4[)'0[ER4TER9P)&9Z8h4eCQCTEQFZ)#""EL"KC'4TG'P
[EQ&X)&ia)'*jG'9c)'&bC5"ZC@9NC@3Z!*!$8J!"!*!&E3"Q!)%!SJ3#6dX!N!8
%!%J!C`%$L$*6Eh*bH5`JBR9d)'%JC'PcDb"bC@aKG'9N)'9bFQpb)#KH-#NJD'&
c)'pMBh9bFQ9N,J#3!d`!!J#3"6%!C`"&!+d%"&&eDA3!N!8+!&!!(!%3L"T9EP0
dG@CQD@jR)(GKFb"cG@0MCA0cCR9X)3#3"3J!$J!S!#kJ!J!"!*!$I8&%3e)$!!"
q$9-+Ni3"Sfd!l!Yb!l5b-LXVieY0hP[[D[HQELEAJ$%!3!-!N!1kY3b!!!PT+[l
J!985,2Y+b&X1iq9cZS94MV)rcirrVL!j0k`Dq"(+KM9jKQ+MCf[`V&ir"HlX#m#
`U3BL1%aA2VhVbkfM'32&(&P,'cJ,!*!$@J!"!*!&A3"`!(%!V!3#6dX!N!G+!&8
"%iJk8fpbFRNZ)#"*ER0dB@aXBA4TEfiJBf&Z)'pZE(NJBQ8JF'9bCQpbE@9N)'p
Z)%K'8b"fEfaeE@9c,J#3!fi!!3#3"@J!HJ"m!,B%!Np,!*!(5!"H!5@)6P0[E@8
JDA4PEA-JGf9bC5"cDfP`F'9N)'*PBf&eFf8JG'KPH5"KFQ8JEQpd)(0eF("[FR4
PC#"LH5"dD'Pc)(0PE'BYCAKdFQ&MG'pb,J#3!eS!!3#3"9d!F!"a!+`%!Np,!*!
(5J"9!41)1P4SC5"QD@aP)0*H-0-JE@&j)'*P)'4KE@&RC@3Z)#"3E'9KFf8JGA0
P)'Pd)(GTG'JJBf&eG'P[ELi!N!-S!!%!N!@N!)d!Z!$4"!K$EfjdD@jeC3#3#Ci
"AX!#!qJ!N!28384$8J-!!4)08`UE*!!lLSL+&Fm@d(1X4'`3p5`rIcrXejfrjql
1$+GBf'%P+PL&999LjEra",'U"3ZbC6Y1)2Q3!"m"9#5BqM@mKDIGaGRG6G,)HT+
pI4mZ3pc&PmHP#aEjM6KA6jAe#b3m5Sk53ElSG,A`G'S9QL)q"HC1abaeLk9cJ@A
[I"3FZ$A+c+Ce3%m()3a-9j4CR+h"Zf9c)KIFIJai(r!m3+*2iaUXL26-$cGj+&$
EM-KaUkHFa@0E8ER-cGETJDZ80pr*q`cTre6rb@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!``,9@j6G(9QCL"KFcS
!N!-)"b"QEfaNCA)!!!3c384$8J-!"RF093e$)K)4jPjZ%'3Y'84UmN3N#a"CUkB
Q*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$&S4C
f%PiIcijT$+G2[eNUFK-MbHfpC'm6p0EIcBDF5mJT4aqj[p)@X[AQGIR'*!P,+@R
BhU3A&C159eN[%2cJbH(#&ajm5X-QD0&L4-VGcEkQ`r)XP,P*,SMR)FNFrFAJLaU
$lM`9cA8P820dQ"q1j-RJ+KhQ[L68+ciKBT!!RHr$(BZ5%%MI@aB0YUmG+cH9Fc#
*FlDI2+6+KXfGMlqi[`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
*CEjpUU5NcqMUMHZl,G$)FrP&YX*lJ%6&V")5fb&&5#AJ#$hRCZLJ)NBKdc[fS@l
c&8+41k84G`VH8bAIPL!j2GVYU6-RjVbF3lRZ&DPJc0[DAFTb'rRhYdi*$'iYhrb
A$q+6*eD"#2hXL3&E#6aS*Xkh8XD5XZL!8d`D3&(YeTiH)j,QXMTfCIrBQ',QaYK
L5NVMZKb[jqBq*1K-Xm!cl6p*FZL0,qj368Vlrpap[%LPH%SI@AC!''TAaj91(AL
#-@"3aPPimHVhYlZRfC3AeqX$cDJ8$@fJmqd&j*@%XYf`G)B2KUU3!"Si!i4'pV`
UFE3TZ%Vi1,Y29L@qKkdk$`8SRBhC9E-k+AX1V!#*JeYF)Z3(X`,GA!A9[Q0'IDa
q[E"flB1d$rZ$9epp#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!TTEhMfk&f2mYQTP@l1bb2j`E4mDbafS5aG4rV(QBS,DAF-pIP
CbZIRk[pq5'N+mhpAIXl%CM(qp[IPf*a9Cbj2D@i@qUC8h'a@H[,JJMDNfrH5e-h
a@AMdST,jr-qAljL($06eY9h'+bI[Gal`F%%Abe@eJpQRlELVUi0e"4+H`Fl,5pZ
Ha$lSC'#l'ZAeThN#F3DQm&#m#9iTh-1AH$!(GljqYG"C`e[Aj!i!N!-B!$3!N!2
c!9i!!3%!!3#3"32S!*!$P!#3!c`!"33JEfBJ"b"TG'9YFbi%8h4[F"Y*G'9YFb"
bC@eKD@jTEQFJG'mJ9@j6G(9QCMS,9@j6G(9QCQPZCcS!!!FL384$8J-!$%-1A3Z
VJL3qkK$[IhHFK&$&)G4%DP3id51JI+m$XhQ`E%%LLLY5&L[+BUmfRPPS56c20V5
eRIKlp5'd&R#V8-'DN`[NHa2f&Rp[Uq2[+Bkr"`Z$C0@51V1le%jX88M#[#6,5*F
+)D6h2b'G@&alE[hp!!hQjM3a!53d)c8I9H31TRe)rcV)$iI*09++@dDQTRq#k&T
ppEhe[XIrZIY,JQEAQSTlA2-l*paR2Y5,b2iCjXre,L1E3r2Sef%ELF&(C*Jd)T(
#pFK,#LST),jM##,K-*&P)-*'4#N(P,)Al$TU(bITSp*QRrABYfrHDa1r,6ZbNYQ
XrAKQ61GrVaVm%1D2fkBE,&GRSiHmj'jdIq'+@IR4JL(UGe5X`5E*!eQHbRapb*Z
BmZmrGfA-)@dYfHQr'i"Y)IkTiB`XAjf#C%06d@6BATL+H`a'2eQEE-kf+IpU1*1
YDdKN$-N9qrQPKCPeRHf6%JDc)IYAk2DPL!&Dh!UIjADp8-!q4hB[5KibK#-S)Ia
D0Zdmaq,MV3&H(T28'jD(r@GCA+CH%l)[SjdNfmEk-UZA@RA5k`r[AePd(Z6H@GN
Ei(ZR#f0fIc4Z%cldphL%jIr[+@JqArAVk3,h[p@GN`4mj-([2DIj5KfmRVaKJ-K
3(i2,4hV#!Ej`Fk``mZU3!'(1Y[VK-#CLRRM[*[A0b2i&[YCHQ2FM@iU%X,h2T5G
"SY-3c&2Z4+H4+(5KA("K63c*QPKGd%6$!8eN1%f`#K8QC%qL3NCVUAUH+PkT+F,
G*ERBE&L6qA'pV%RTqhC*Nm,EpS)Q*pqZHNZ6(BrcT3(Q1ld"T[#(RS!AT@fTJ+6
j(l-"$q6QQlA0q1#b),24mMSm[r52PEZcdS("#!a5B2!#JqS1GX"hm#+(KEAh#0-
q(T9LIif+X83hfXl(N!$2KDajX'+)-G-JaQE+,D[E-L)rLl1$A@L+48kN6+2A(p8
riYX1elZ3!%30["K#[P"0iMMN%'I5pDl"+9($iJJJXeh`r)K66A46"'G#6q'"1'G
X)pR$1GJ()$K)%EikjmV"McEMQFiXRPT$L%b1QR+#U2TXMQl#UCS'[kGY`ZS#8XB
c2MHLTK+h,m4QE(`P8j&K"NN8q8LR%p@EX,5+E$ebj+ZL'$'q5jcDiK"r'aCE2rM
![3Mp3ipm$r,r,VUNla@b)ak5[2,NL@EbC-H1&*8aQNammYm8+D,i%Pf)49MDQ)m
acSk`RPqK$Jp1l$GJp$"20l0kARafiHF(YhA#D1kmr%!GMCe)G9dBhH`JPG8R1i'
mL'`Aj[Am0lr)$TlmJMAL"!0#e4+YcRI(qI(aKj4VB",1ikHNqkKTHrD`(NAIr,B
64)dBRD*kI)8(FJf)PpYLUHcfFR"8l3,`e[%Q&bL%`-&&YGEjP4ij#NEd6V+N-r)
qKQTKU%paAR`@8ArV[!i4'Bam-j0c+VVaMi`"$`5'lajYHZ$Xd+0%Q9YU+YAP[#8
f$94@-k#0MSPSJTCL5S9dc+@K(98LMU4HI-Z"*Rm343l'9e"2HEK`Nqj%)qGMQq)
+R0&[,r0r@fTq,F''-FqLM!jk'3SQjA!,p!IDJk%SKZCHi*)1@H!J&`-")$(rh0Q
R)14RcfEf0$DQ@cqEZhqaEpcchI[hrLLqclAmDE2-8SaQ2eRA5HPZ"UHTC@-&[Q%
8j"YUe1!Y622V3R*TYr#bIG*FD*Ghq3h4Z'5eDXNV+ZjIikS%GB("F9T)XRmAZ(c
KCrPf15FCGQ@Pb-e3mKCMK@#Y%`52'qF!Gr3)R,f`(j*[q!dYLM3a&%UHIUZL4'k
X5P[LF`-A#jZmTbUCk4B59h['2-(LKXPJ,FYEfQK)*'5VB5rk8$c0c%VchKF+rK9
N1l%I82R'JS*$-Y3DHCC$hSKLHIN04aPS9dcrbk&2&L(5F,9FTUfDSCL5h%8pT3Q
Y4p2A4bbAG0+APYepe@I2P&9YYedrVaAXD'RZ$-&aIf-`D)LDeqZmFX8E`V8*,pF
BA!U9mYJZGlSf+Nrk2F&Jb8i'[Rp08(r[j6c"a9#4MqhD(UBSDr"2$0'm9X&64eP
(U2J[cqZ'jp+,JQ9G0j%2YNR99Z&5ifjZ8A#%cJ*bX*(#@jJU5Y!)f+hZ%ai6K'2
DqN[dA!"'Z2k132HllH*P%+r4m525"`NbLV420j*)$p3L@B%)&fQ2cAHj)&`fiLX
ClN$MN@6qkSB9MT1F$'G-&b43k21PXRrHr1KIqH54*!+d@bP*RklP@V1Rq[VIc)8
S4r4Mlr4%IYqf3j8Y'eD[XY"H*eIG-"KBFc53!+V`6R-(`TQN3UR%li#bUaf'@A0
FScBST8KK4j+M&2I6pMUVhE0JN!$FUHSSGAbJl2@'`P*aRfPNY'bJYShE9AC2VVC
-'LV0Nq(bS+A3*b'"X"%i4N195-SpCUG3N@C&-%3)+h4$prRk"ap0Q11q$`#3!aS
'!)!!N!-$0Li`$e0dG@CQ5A3J8d9")$BZ-!#3!`i'!)!!N!-$0Li`!cBZ-!#3!a8
!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!i!!(rp!!#!#)!!L"*!!!#B*b!!L%q3!)L!#!#*!!3!JKq#
!)3r`3#)F-#!N'Im3+"U+#$)bLL3Q-[)b6M3'15CPp$)5C43N#'Im#!4``"!#2q!
J!3'!3!#'`)!!3!%!!#!#!!!6j!!!#FJ!!!53!!!!!L!!!!&!!*!$J!#3"i!!(rr
!!$rri!!rrr!!2rri!$rrr!!rrri!2rrr!$rrri!rrrr!2rrri$rrrr!rrrri2rr
rr$rrrrjrrj!$2rrrrKrrrr`2rrri"rrrm!2rrq!"rrr!!2rrJ!"rr`!!2ri!!"r
m!!!2q!!!"r!!!!2J!!!"`!#3!i!!N!F"!!IrrJ!)!)-!#B%#J!T#!N!)K!)J#3J
#%![3!rJ))!!)#%!!#!L!!!J*!!!)#J!!#!`!!!J)!!!)#!(i#!J$r!J)"``)#!C
rb!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$rr
rq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rr
rq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ!!!%!"rr
q!!J!J`!,J3+!#%)#3!Q%!L!)5!)3#j!!!rJ))!!)#%!!#!L!!!J*!!!)#J!!#!`
!!!J)!!!)#!(i#!J$r!J)"``)#!Crb!J'S)J)$+#)#!`"L!J0!BJ)'Ad)#"P(#!J
Cr`J)($!)#!ri#!J!B!J)!E!)#!!!#!J!!!J2rrri"rrq!!rrr`!2rrq!$rrr`!r
rrq!2rrr`$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!r
rrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!r
rrrJ2rrri$rrrq!rrrrJ!!!%!"rrq!!J!J`!,J3+!#N)#3!T%!L!+5!)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#3!i!!!!&!!!!
#)!!!"*!!!!!*b!!!%q3!!#!#!!"!!3!!Kq#!!3r`3!)F-#!%'Im3#"U+#")bLL3
Q-[)b6M3'15CPp$)5C43N#'Im#!4``"!#2q!J!3'!3!#'`)!!3!%!!#!#!!!6j!!
!#FJ!!!53!!!!!L!!!!&!!*!$J!#3"i!!!!(!!!!$i!!!"r!!!!ri!!!Ir!!!2ri
!!(rr!!$rri!"rrr!!rrri!Irrr!2rrri(rrrr$rrrrjrrj!$2rrrrKrrrr`2rrr
i"rrrm!2rrq!"rrr!!2rrJ!"rr`!!2ri!!"rm!!!2q!!!"r!!!!2J!!!"`!#3!i!
!N!J(39"36!#3"JG6C@Fb!!%!N!3(8f9R-`!#I`#3!`G6C@G1!!2r!*!$"d&38%`
!N!BFBA9cG!#3!`&*3diM!*!&K%C548B!N!@%!*!$0%&9Fc)!N!-"5801)`!$!*!
$J!!"!)%!!J##!!-!JdC548B!!`#3!i!!!3#"!!)!JJ!$!)-!N!-J(kNJ-6Nj-#d
j1#""E'&NC'PZ)&0jFh4PEA-X)%PZBbi!N!GA384$8J-!!3%08`,FeJD6pp*'c88
6E3#dq6FZ[0Y0'fE#E,kV#pq%hE$Ej0efeG9eB3!*1+@)rh3&qKSdTMBHqm5GDpP
1JSQ`da$k`,2S!'L3!-@qrJ5q"J!!"!#3%B%!N"k"!2m!N"b"!&3Vr`#3'S%!92p
8+rm!N"L"!&6rN!08+rm!N"D"!&6rN!98+rm!N"5"!2AfN!08pT!%+rm!N"+"!2A
fN!6ipT!&+rm!N"#"!2AfpS'3"PEhp[BVr`#3$S%!pIEfrIq3"[a@pT!$+rm!N!b
"!2AfpPErIrH3")(rprD3"#[r!*!+J3$epT!$r2hh9Rq3"DZ3!hrfpL[r!*!)J3"
8pT!%rhrfIbTr!*!$9&4r9L[f9#[r!*!'J3"8rrD3!eErq2Gr+Rm!N!089+[h+rE
r9#[r!*!%J3"8rrrfN!2mrIG@9#T8N!9rUrIfp[rr9#[r!!#"!&6rN!08q2ErIrC
r+T!&9&4rIrIi92q3!e6ir`!!rbY8rrrfpPErprGr+S'3"+a8UeEfN!2rre6ir`#
3"2mV92rfp[cppPDV+S(fN!1"IrrhpT!$re6ir`#3"[mV92EfrIhh9UZVrj!'IrI
fN!08q2m!N!Mr+rEf9[jrpj!%ri(hN!6fN!2hq2m!N!Vr+rEf9[hrN!D"pT!&prM
r!*!-rb[fN!ErJIH3!rD3!rIir`#3$[mVpT!$rrrirrripT!$prMr!*!3rb[fN!2
hprMhN!2fprMr!*!5rb[fN!48pT!$prMr!*!8rbY8rj!&92Mr!*!@rbY8rj!$92M
r!*!BrbY8re6ir`#3'[mV92Mr!*!FrrMr!*!Hr`#3-8'q384$8J-!L*3393eP94%
!)9AZ4TmqRj95PcUATCN,r9RRV)1Y&6PH1jc3GFqEVLjEl3C1JUk`V3AFmqjV$&`
iAPc"J3XJ$Z3-4`bCdm0Y##l%,r%icjZFCiMR%66'8q2A)&qI0c'k%%2)(0[kr[[
m2Qer(3-KPpIhrcNG9MB5%3)"N!34!C!$%8)1!&d$hjVfq3GkSM-)I$p%JIi-VY(
dH,DTQlm%+I%l&pq,KG6e2rZA[*+*Ki9Zk1YTJNrm1+q%MK*aN!!IIC1)fQ+kp4C
CBci[B"bL3I2"8)RUN6Ap6DF6h`'adj2)DcU0"36Mmj9TS#RE"L,9@i0@[`hNhLm
(IrBACr*6N!!XQl+0J6[RfmDDYl`eZ-EFY"[,Ar&P"-ZGI0P*VbG+3ZHARDAA%bA
"9VlF#D*`cl+cRIm'%,b12Zk6)#!Q(!22j$P$*LG-J5E2RrM!p&ER[i'19!mLFeA
c6N(d(66I2qpZca(Mf+)36klmC[al)S#I%(k#V6P#rY0r$hpUIYB@",(+iU`)$BR
rQIVVj*!!BbLV12B!RhBj+rKLAm4PV[p6I@`Z(mV1**MMND'46f-5JpS*JThiaJ(
9e$mc!FYX`5JbS%jQc(ACRK+qcZdJ5-C%8Sb,EF+8If@U8+AL2hqGqLXec0M8ApR
%13bEmE0Pp!T04Dl`k9(pG15+a-THM1dE%ppSrR'N,pSRJRP#jC&[cqrQ*)1$9[I
RhBNF%9hjRr(2XIR2XIR24E$MKqNLeYEb!h@!Ecek4d!G-&[-pGGEBVU94iL9[h)
jSlBI2Q(HkZ+[+[6(@hria*@Y4q8F&#j@-A9AJdj-(R)FbQf3!2[cZc[L4$4YlEI
HBNe59SM+BKeS1Xd'k9K)5mT1D59#UF6Fpehf)N,XfQ'I0DNGG1Q2r%H*d0P$P"d
SUMS1S,'4el6EJ5hD[9K'N!$*Q'clbaYLY"XNB2b(E,N5qH21Jd12#M'9APmSe-r
AqEGd(S6+!K$l`QLhqIk0'dqp,6``#)mmd"4c*QAA2K$"1fY'2p!8*qr9"bHDT!"
P(`CE&M)rS()$Dq`Q4pHkf8k[l+V1N!$IV2j)cTBeXVrk&-MqIKXac9$Y5CM[fLb
`QD+0FREL1hrF,,`J1iF5rPMdRVfG32#2c5+NqHR,Fe621"#8+*2Nc[Qi,%1*8YY
IbXSFAB%"CkKCaEG"aA%TXR+5f)!rHSi%f3p%3F!A[Vb8Lh2BjD(9YZ(0rb!@SB*
"LpCq"(P0CF5DY`MaNKBaE+d$"90r'),RP3LfC[Im"KA"`BkdY9i+[SL86Kk3!,G
34%Q"Qb)+34U4(jYD%fNblKY6UDc)J*!!N3(4@A1LZc@[b5JRl8p5G*[[YiRd81I
fK)JPf`+#b0[4cS1Y`Qakrl2fJ(RS[IVVKm`QNkRqXlP(TCGK4bDd4`)QNpPN(jq
&TTlCjI4C2YX%)EBJ,H53!-5dLEmdQpS$+GqirZKGPSCR-ldecdC#,rmB@fG-RBq
U9#8H)X0CJj5Y',!KUXG844BaXF8[UJHU8mejcBHEFTZ+V)JFPBSb+*TEQQh0Gb1
6ilqD00@cUQI*BmD8R&4Nb"6HZ6K40d[BakQ#RV3iIIJ*aIaNR-ecBP%8ZHUB6aT
UX`cQ@i0VmTSqE,`ARfQ0*cXAIlXB*,bSk5d`eL'6F-q*EQ0J!Z"fGFe6!,BE6hb
DUrTkik3mCMmMbrT,(5klhaLU"aP2RiRhUDXa!UEFM*49-VdXMje*cl#(-38U-Ie
Gjq,LM8rYA5XDarKRk90l9DV'`kDmaVkRpSTSSkPcmDl032`jFeT)B$%("mc)'XT
E8SHIUXiC2lM'&MFYETjlq,R3P#hHjhV+eAbp+Drj*L+*i'FZ92a&j`cc030l*rU
Jj2QQ4DT(m&10LRQckN@`9022[M&E4I1[$81rZ[RAB'XFb'XZ95h#C#2pD0RBN!$
Bf"!N#Ep""!fpI2J#IVl3XRk"RrHdV22Cd0rmke2eI@*Bf!DDRk3-&BZ&`"9RD(r
J9,GbBiLUkpHBQamh6Uea0@r&YMpd"1dY%`mhIf'deFDJi'(()YAM6M@C!6,ZTma
T)[6'Ai,)5PfA!X8CXT*f@5NE#8!A8#LK,&pcAZ0SmmG@RM8TNXe28aDL5#,UGP8
rPE$3#e6c6aZbA!c%rbii5Fb2,%@3!*k(JX3"NTTca2DUZAkEX+d4AR0pcE'f[Ai
UAAecMm8fdDXHrD[A%Q,M6qPIk8r[X'`pBX0NUpKiKIk9AVRHXK8Jjaf[f3+ck%$
)A+pcBH($`F[Ea-DVp+rdkXf@VFGXlXS((cPkmq90U+VRp[dpUY@r(a3KQfpZ,`D
qF))pCB3#L'RV2JYPq*ZV@j%pKb,C8Ie4Hk3,5-kIA)SVjpdQ3Q-$64qDhpXad$6
0r0RbBf0Hmh[,Mfd,D0%iX[9B5[,Q)iF(QZifIapXFm(ffQ'hqI[,AqX*E2b!rT9
qm2L4VDr01JC8qZ6)$8!-Rl0!V@aZ,jr`F@6k4p[Nb$kGD'QZ(XMQfIH&e3l+$U1
XZq%D!(B$MC01R5j#fGBL#H,93(e*I*Y)lYXQN!!p$4)b-NJT`KT[Pl0MZ[B@aKJ
N4RN)1Ap*L!pMEIlrjHaf-lEG)GpZ8"#b**1%dN4EC,5bHXM!c#KBV#e%9*BG-0F
N#Q$Y3@Z3!)kJ+TR4DUBPSG"mE&DF,V%&fq2P-Pp9-,pf(F`R&Fb(9QG@28-'hR4
'BHE2m-cNA&9ammIdXBkT#P@&6FdSH)-Lf240D9+SKEUT!BX!`0"[kS94aLL4M&[
*h%%Z"MMHdLkHYMM94[pdLee'Y9P"Q6I1iCrI*d*f([cfHBR3VGU[kBlP'i2689`
Eh@"ZJk055-SbE4FTYb",a8H[lCZXkrCj'CU&K'Vcaa6eXLDU!cAm9LHDk%*YUj,
%&VU-J42G-Cjp'r8Se80CPfJS9jMr33j'k4Vh5C[YUC!!"&"fLLMqkHKR6D6ar"T
8S)eCFP*MN9eV0)h'03$E'p0MlI%H-3,&$@-aC8e#I49bhZ*K0'CdBK60ZFA&1N5
hfM'`j&&l3Jik2Cp,9C%k9S&#a)LImf#50Gd%bMFk`b)388&43Nc%M#V,CbK5e14
'a)X8fJCFJUBHZ$3jP$I-`F"eeLM%aM4A*SISqUclB+Kq`q&aQ6+Z3G*2iR!&$VM
42&hmk2PCJNc62NXpd(acLKT4T,B10*G5dcAJRb@Ja2&6h9#UQl*XIP&PLbZ')l2
LYL!bT46Cih'Hq3j(TH5H`0l!8i200khTDbjpDJJ&mm0,5P!`cq9&m9TH&!Xa6h[
Yk3jF#k3Sfhkk`h+LflPA'ST59')PI,$i851bJl`d!6H2BSk-BH+b,Fk9AqqJ,DQ
G4b1$Hp"#81d0BjYCkGMZTA&NTZ6[Fp2425)b10U03fCEQENH!%Ua3S&mDk6!0-%
3VH#)QKLLJj83(@K-X%XkfDADU9FhfZ*G3N+AN!#eHF1G$-E&8UC'UVC*CE96cbe
Z,V@hc-KVIY`H*3#!90Vm4I8[V&j#rY%dLLbRKbl#P8PEA2R#[PPjJC9-`2m+6!M
CdBe`0)*"L8fb`rK+E8aKLZXN4TLEQYMNfkXrHQ95b#M`%-!ULPr*&Ufr!#*L3",
`bPlMmB0CSJZ#%L5SI694[*LG3R$a0-AEXq9ecUjb"&Gc`ERL4eV"K#J6#qB11+G
mU442TYfUckcUiB'E+[8!&$l@2p6j[*@CUfSr9I8dI5%eDj0f1SET)*[ZdNil-1f
9TXmB4'c#Y*Y0'd5Xa,5264Y%8!CQP5&`%(LlrfDT-3qbC5'@(l`e#"*M)B"pFZ1
3!'YMXm5q)6(&!C!!G!$ZZ`XHS1TA'@aPae"T!E+He5d45fh2AJ(`+iUI&K$iKLG
+#ak!D0Ni"3**+m!J33$2,1(dfB)a3"eb6m&Q+PE9`JjR!8aei8JKM[$M))lC6,Q
UFAj`VH*J#i"!@@8"3DF99a&SZ!!(DRPeHaNEEAmRZk$%N9Y3!MI4VF6#a#k!Z'8
JaY9$j'AMZl8aA2%**UT3p25SUU6M"5RQY!!DA2ZQidJG1CT*K3Ymc`*0)qpN&aA
5X[QEMYbL3XTB!M%c$HjNBkE1[VDQ@m"3p!kjEad!H6e39*3R!Ul2f@YN5af!SeS
f"1rPVS6$U#cfSKQ*6kYQ)++ULMD5H3LrhD0cD#lEYK'ip84G5[+1bhGBN!"9[M2
QN4fD1L,-Sr'QIePhKd8hJDd9fr!MqjqSJm#Gh,f`"!54VqMk`8M[)+C,#)4S3Y%
Z*jhTlC'19q(5TYS2TjXZA"8ES@CN`fh#Dipb"c69i8fEr$&rrTA)d25qR+d1-$[
E54`KZDq-#CVD9`Ee'03A)UA-@+5b1&[JUZI+LZ,LZS6Qq8-C+-Mb&kP+)S3Q8!5
KXEJ"P9H180h,&G%"-AZE[`3$C@!ID-JY+XS44H6N@@HiB([*[TkL`ZCjh&%6SUZ
IYr88P)5"2d%81+MqpV&UUh0'p)YCFB8Cqb9(*DX%L%40lmBjQ5#j4Fh!l*)RLDK
N@P3)Ti'dJ15@#$*2)%q)+`4ilr-fIB0!I+"93Nk*r'@-Zb1@l!Xf9E4Q@j0J,$,
R&YV`XkQj+EU)`$&9LEdGC['DULM2Mm8P99'11TVV(X4%"4BiNZ[MMSKH!%D1b*!
!iBVTVTcU5*q%bR-ZU1b!#48j0MU`T-ikX+6+R,C@6GZJ+KpN2"FfIC1KkKRYG[,
Jj@i`,9jbPCKZ3$0-Q0j!3dcdiF!S'0Ad`Y3N-J"F$LbjDKeB2)aT[m2&+blrJB!
aBieVbG9bANIY`Yh"TMaFM#l`%X#18aaJJR1N8bD3!"@[A3la*KT-RlU@2%U!b!N
pBKk('d6)bkHkk6L-e'A1qhFd%C1S')dC&aIrHp8D6#bj-Z!Up"UB#&b$f"P&8H9
@lF+l3#%SYj!!+YAPR62@[Pk*,HdT[&Lb#jq&M@P4K0-P#jd9D+KUBX*l`UKDi`)
+LaqYQ5KHUai#Q)!#VQZYQSSiFqjf,`Fr,8"a'Jh"f-8VfM(KjG22m5TemD0U0Zh
Qdl9XfTmQfVf%B[3m!0E6A)8*S(BHk&*8')N4Jp0JYK`)%!-#FY-"`9mJUZP&G%"
iPj4SZP-(JGV!NT)h,36-%(PLU,6`lihHkKi%BQrK*ULbMS`3362T%*TZH`ZQVNT
6KF8djI4q$J%8X#G()r+qX9#!QJc%JQB#VX)&2B@E8Z,,,G*9$8Fdh6P*Bl`'diK
+3R@6Y,9LMDCE)8M`TNGNk1('!caE306f`('H90+#3k5F2IJjLS-0($`DYR-bmT*
(8F6IY!D[Pa``jb)`JTN3Q5JYh%6!'U,XU*j881M(6e3L&A6YMHDCqTU,)'V+1Fa
**9$leh558!#0)Q3aUKTJ6PPQ3V-hc6K*$YZYf66X2*Jh5-0f+Y68FN5R[QC4BA5
bULhAj5f%Lb#Ua-PpK!M-Kb+[A5GfarBUSmd"8mmjKbUYGZkLSKIQdR&,@ki3KG&
VN!$08E!-dmpG5m[6#"JZY3#Jl`)CEiS*5-[[*J1P#q$+eP0`KB+25pL6R)M*AbL
[b[h+m5bUN!"&ck'B5PdUHfZ`D1ZKkka#!ZM+5[94BhS,C+P,T")[#VTRKJdU#H3
kHZda8M'#p4i8*dF*r1E"1QP2K,fBXE16TT@"+'$M4G"4BY*(+B,DLI#J&NL5QRJ
"8'`&)&Um"CI)[D@&SbHZS*NPa(Z1AUI202$f+c&Z'!"9%0f%j0Z[D,Sam#5J[MZ
J2P4dJG881+*%NkPS,P9#X49Y6"HqXDrY$pqBdmr-8'2Y+@L`pK60,1H+1@5`9Lp
Y#U*YF!#RKP@,2STdJNF5@SYmbm5NbmGQLMFE#LH3!2'+E(%UC&$XZ,J!LF$h@ZH
-,4q#`#F-lS$F@CD$P-C!HdI!9rqXdarY%+VJ)E[$k-G3lHN)j8@pU,bAiZ1fEm,
VXP#@Fj[4TQ@ZXUmdHSPjZ#2`[@J3c"AiZ1hdZLa`fSlXPVF6$)NMR62q8(UL@e)
&Mib%j03-m*%hAH8ic#NNGeY&p5@Hf4cYR1Y)#efp,@%E%c9I$LE-@!#`r18FTjU
bZ3$mVkfZf3Ib#3lRJ2J-XdkBBllJUqZ3!0i&3r9@ek6,P!m#G1'16d3)#AS@hE0
A936hC@T+Vh@D(!"HFZ9l#,`2mDYXpe$#)Jc@*FkeBK!5SGLik3)r%J)cULe-Hc(
Y`b)S3RMTMAD*8-#DQe4h"D`4ekXZ8FD&9ILlK(GG`ZPlPB6kSfRl9+'V*kAK@R9
AD#@b',kh!`9mJrcQMj'T1R(2K%JkZN)AEr1dG!@fB`rIL),iB%m#mCYI25r+a#h
hT)A8SX+4&Yb9eiHV+h"mc13%QEP3lViK,CN[2%CrEFcHHX0jq0d0ejEC4pii,di
,faYlHb2pYiYaB`#[IIHF"hfa!JSq)2FRi*4pq*2lUMV[)T1J3PA+KU0Pp@+H%9F
"&mXSL,B`P84GV"hCDV0XBrHp$&I,k1cj6TpM[V-PYQZS4-KrR)[-4@+cF,F"0EN
-D$lSR![f5+adIfE+'96HXEcMUHHab$Mcqc2lXDJMNMB@bqh'Jh!1%![qR`bC&TY
[1jQ"4@$NH(V@E9LBm[+))C!!NA)mMaCe@9M43V$rB%a(%iKLScGk34a%%V#@k)A
3IJ#qhSJVjP0h4ApjJM,6Bb$CG!91BlQE+Q#+-J`FL%4[`1VXBT'f5Hjq"SAPepk
erE$(((A&2FlKU'ZIakR'TmYCJDNZZ%b)@!@Z64TK$XBJQ6*%#5QLFmHP4P!V9q@
5i&Z$8SAe3ThGKb-LjZ2ZJj442Ndb"M'F-,GiR+,SMYR#[Z[LMf8rAXlQaZ`VmlV
pDq%bc-eM1-`mr'3H!)h+`&iPQ@)HN@LkSMq,iNCR&*pJRRI5*5&B&&-L4SdcZ5[
JIk%15Cdq3#!GE[T!MS0YkHq@MBaJ'%@Q)95MpTKGkKmiV%K)9i'2cqPpF5bQVKk
,4DAKXM%F'8X#a6K-44rFdB#F*RHrJ5DJD,Q"QX8!r-3)IMi&'$PZ(+Q149fUDIC
3Y5"$fp%N2$#d&ZDDNY3,`&%rNX2!+3+6H$N+)hcjXeK)mjRf!Vq3!'qJ"VF(JU*
[[#aD6HI&0Pc5i`MB[G@K@+Jk5+,TGD)*cNAh*U3V%%a8p9a%NU2S&m29[`"V"E'
Fq)!c0(#'&XkJPVC3lEF2iiVakULpBQJcR'Y+%8`@L@Me,Hp3SM&*I!8r2LeF2$q
qYY)9dLDMf15Yp)S(1LLSA"D2JU9R0CB+iH'-flK5HUVlT)#ES)",dHP&4UdIj2j
5"'8NhS"Ca([3$%0L-k&@alcUc5+!iVA%T'EXQZE(B!$H4"f+C6r2d%1a`J#ijmN
9T,QDP'Uk9Bil%j5*D22!IGh[(*lY1JP(M-N*TdrYZDXqYNZYMVLUHr4&#"#qfaU
%@j0Dp6JDfRIA6Xd5)#G%iEbrP5F'38D5MD+-0mJ8jR3h$P@S(Rm(c+UY'2K9K9c
!,eBcR#TV%'c$URPJDe'p`!pqKFEXJKr4iGp`TieU(+ibMK$CJ+l&pBr`DchDDp8
E*U`fH9fL8%Q,GmLTEKk438&BH)'VJB[M)P"LfAAF#9%5L6,!lKQJLjViKPqN3rc
9,8Kmi-8P)b#5HGJe,3U%TcM#DRj&9289hka2[eQSq!@1iV!@45NC@p8lG'JH2r3
#[p+!h0V9eE`+pSN0BMHYaRlh1m5bP5,B'+U0DB0rYpk!q#DhFQ8p`#1"'j1aM'e
5E50(G8Si4)N8T%e[,RI6$b'K+Q8$*%')U`!*Xd@Im#lUmSQm@96%hMNS*IGU'T%
5AT9m)5AhiU4,0mKRkq+8,6&LLj2C)J(3R,dUj5Y+USJ'eJZci[BS%4pSZ$da+`j
R*(pd5286%*@[R*+5aC@5Db5DAMH$1CdcPqSc1+5X)P8)Vdi61ed!eXfB!#,bZZT
69L5&S`ZEham$mEEjl9Rak#,8TL&9XAf+(i%iPLKKGPFm9U'Ia*CfG3%GHfJ@#)J
hr#8CXrPS+`!`dm+#i%0%q1!*1+4%*qS`CA@%+HY659Q2,QI+LNS+DIS8)(fpAMf
QGbAP&-jA+UI%"p5(9(qbYfJChk+QI1%RT$6lJA"PE@r!BAYjbLUi&UrD$-VD$J&
fC$Sdrfc9kYQq-&`pMei6VKi*m$DB+bm@15QTj(8i![!-M'2'(DPRdP1%P2b3!!T
Y-NI*d5`bmF+Y2%RGL#d`13((-I8[rA`L+8hBYaJ$#P+a)4(Fj&*eT(H@1cSN!PP
dB'brF26QE%S6VC0rHRrd#M)0LBaE`j[Y2'Y*EK3q,+D`3+*Q*"*6Af-"ZDihEaU
"kZ1+jN283pNd9+!I%#06AHj0ANGI6L5k5I6)`MkSGYH%)U,&NKCSElYfCZ45V0A
@eqTrGBP+95G'EN$HNeXFcicLFq#NchX$NZ1*b+9)(bU@@hGicCr0YZ6-aI@q592
Z)VVBBp0Ir(Qh1HpeN!"!*[Y(-j(&8)qUa'GDr(T*E"081["k#9bl%2&6pmTaHiX
d*4(MIM%AS)eDQX,"%MP1ahLcIFISllRMQTEBlX!VC'FajKpkj,Mfi%`j6K%(ac@
*X&G,53jCGT8DcDQTrG,a9ZQ)P@FjPQb&Q"CGh&l4[UKNFqZLNSH`1C!!Tq3SL&3
J3jE8%L-)6ddm)YVd"XPIdBX1PYN6E8IKe,T)9E`r%(0SfI,qI5&Rmc)fQi+YY6*
E`H1-,@PJ8`F0#4Q4dK%E*2$H++*(pq%rHc4kK#mS%HV+k0(4h[a4QXc)1A1F6bB
G4qdqaa%N)JhSX`&-6ZZB25FV3`T@Ah[4NIeQ25@6prH3!(2,lXrU!hd#581ji9r
X(cTPRYMG1pMIf6IBhGEA'q%Z[ec)mD`,CjL3!0LUK,c%K%bdp8p-IQHLFq+XAJ`
&)S"4AVC`Xi@2,mj,JF`Sd+P%NVfUB+mkfB5'XXD*0)bS2#mL-!+EP"d[SK1EaA)
dIGU0E[P'DQED,P,&`TSqU(MUqSFLNk-6N9%K4Ma$+CR(dc2Pe*aFq`AR`C6MkI"
`PSqI@8TS&PR,X&eH)2Lf)BQVGmqd@-KdPV,R)$$DJ`U)`+RAZ-"Z$GrD9DUNi*C
4NVKQ4`eFDNY3f809ULmN!1-G0'Y9M5#2jB)eQc)l$PXSF6S*P-4GhJeepC!$4bB
e[81mf&&GXCC"E%@Bf&SZpK1klJ4P&#cJi&36&heC,rT`h(i[!f9UDI%'#PS43P4
j9Bflka-Jm%mBCm2TI2GR&M3BpJ4L0R,&,4V"CYZPV9-`KFK,q,PLM$BpIcLqZpl
5SlS%Gm+!-l3Rm-jCdG,$+q,(#kN3rHPJpbNB6(pE,dFG@I0P(#M8)bp,KC2k40h
3EdA%q!dTLMMD*ATP)fXcqmh[pj@Tbq`pH`0dK%a$BYVRNjL+lL1eG5#V`4KS115
mbA')M[cS,&9fBL0$#*8GmU-R1[AfbiY`EMJ9Y$(k-@3HU"-$f4,`)Qd&!5"#aMr
8h6RBIeDlTI[-p`HS%2H6UJTIKkT@@XH)rQf&'eLQRB4DSqBXJBBGU5ZQ!eNB5GH
TQZZF86S(86*XFU)k+T6Bm1+qcKQlGKf13jA4YVqS,B3#5%KcVp,Y'Z6R+0"A,81
Q(,qH%S[Z%6cS8F,V&K"00"6i%#R6(+ra&bXGI8prKUE6P+0[pda(b&R4(Rhc(pi
2(Je9CRZ6$JiMDDSkLFCVI3$6I[J!94#ED9$2q0cJ[Cc4p*E0peNKh(c5b9QaS+)
R6XQ&(Dm"q2R#0'KbJl'qa5f*FYTiT,BBMQ$$bh$XJC'i0%QZE80`lj9[Y&f%S*P
U0c8rF@%A8&!lGr"SI`B4IS`L[%IBC8NNFm8JBI0'iPa-+Gck)%B5`6H3!%"3H3J
CJ9#qUSR8"+EA86c!m",AN!$K(3LShACI$a`@#ql&&Y6F1&SN`49e2A'ZfYFS+q0
@%,3'cP+(%HTLCL3!1qI$5-lfG[C'*YSUf`T&ebiBLdGIkHm4MQe#)kRH2[E1T'V
A`'d%Y(!3D"H!PIGli[B4Z8e6Pd"A#IULk`G%Q(+EYJQIK-J2*%68U(`YqJ*Y)49
!+#hk"cq[K),Jc338KMDMYrc#F$N1pr816TaU'k9MR42I`G(KUIlFp-b8h-ad@31
McNc*c%h02--&UJN-YNc#j4)rbCLDXN#4D#$k$K(HNM'[+GF!i&r@p%Dq-pSp1%N
,"8*NV(!dR%D&(SJd`P$iA4Sbp`lGhYmjfGmR"6HiJ!A&Z&63qdeNkK@Ii2LEp5Q
KfE6i,$h`JZr0Q60$[!!6X@h%`LmBC`%GlV+hC2'Sp%XU4!)E+FScSFJ@&"IeKN"
rDE!l-Y4V3%$DX&-b$)"N&5qLN!#SB%KAk$Y2q$M5fpBl-4Pfd%T*9rd8jE[VHB8
BG@5*6LFjJA8fcc0KJ%M9k,,e'frVKS$"ENe[*ppiXIRqEj!!f54(J)"N1V[V(Hi
hUD#@6-L[4PDZ2E6RVccSS8VKlQ9`-d1a8S(QJaZ"4Q1,%qMqc*0MFB"5EdY"b2L
R"LJLjFECVh&aZ@Uh0N,pXCL*h&C1KiZcmST#qR61q*ASLLYI!`KS+1rkJM[BpAE
Pp8!hqRH$S[-([DM#Y`QhVFcV8RhSp(h2"9GC+@+1)f,31B9kLel"9''EHXrfGdV
"US4("iVXJJDUm[A94Y'9(f@VYP1eU$HRBcMBfpR(Ma948L8H'%dp4FAEAN@R(4B
#V)dU'GPG1KFAkT'UZk,I3RK96rc0HNVBj3$3`BY)#6dl,a!AL5PHh&*L'f6X&"8
6F'jb%B(%A'm9FTa)GE8pR"NA[[QCipM6-h%XZMZX#%E8[3MPS*P#9b'cS,0j[N&
CH(d-L%(a%3eGdL6VXJf[jDKGLa)UPEF)M2ceaSkidGY`+%GkPB&AKfAhjaCXGT5
Uh8304k,Hm4*(2r(*5ePqcRSb&YVfUMb9El&+6Q!qr4EfHC[R!b$f8SFX6%NpT+$
#*k(mBPcJl8(f2U*X(%@5[QLF3XA,LmC4UX#%2LLcLK003$PqCk+R6[FENa21Xc,
ElM#rB)SR8#)NTT!!P@V[L8GISdhDTka6G"!%d&B*1*3YH`3ZpZJV69`-mNb0i@,
c"&`a@&&-J!LrIJmT$XVRi0K1(JA,T)XCU2-e&-8SqQ&@89afBD9P2!kfNA$NT)j
[N!!&GQm2[9l*Q6Yi-Z@G%T,+VB&&jL`I9GiL%q2TL9ZMFCqDMTjMk24`92Cdd!@
K(VG-dIBDMcDiP1T9`45`dD!!2GLLe!#"XNcpT,K4YEVq%h*`M&J1#bZKibH3!0C
JYM5mDk&HX940I$c8VINFe-,qcV2GTdDe+U8!03Ah),ATV,b1`!5lc[%5&5YffA(
SD9TiV!4``EAUYi-*G*Mep*(Cr!8hrl2fL+lhaMmbK[CYF9)J823C81&423cRNG"
Z%VmbBDCZEQDrI#m*TqSJZN0YrZb6)ebSpr#BkLc%SMXZ543R4ZV)-6PFT$3jpc*
-i"N15#$V"38)1D3r)c8S!M6aS@%L4"-c$"0"QQJd6(KTBKiAMQkHN!"Xl*RPPfZ
1F(+9j4dH54j&*&dkeDQC',UpYh-dmVPHQGmJCDU*(&11-U[#PAPr#90Q9CJbqr6
+[2qQ$NQCrNV+p+p5QAj5jSa`C3j+JRJMBR99XXPYiZE,9KqT%HBeD$![!r-l($$
hE$%!jTF(*bC(%9+C&[592DQ"9jdQ-LZAqPA64-[8E&GZQRj3-c%'S(p2!"06$@I
c)L!XZ06ha1$1#2FF!H+&%"9Br"H5#2UmJ$F1@cM,*Z-U@'caKQbUIT!!E1pXE*N
NqQQTfLC!UeiI$+lf6k+4hBYU[VYcp`3$b9&9"rfXQiSS&5mmmYSG#hRNV86"6iY
K(RNSSKmi6*%hqeLfS5Vh8'&Mj3dE)JZJF+f9#Ji@[1X0TR09+Ykq-k%a++j)Eck
mX`a8EiA8-%LXii@&alS198FKU5qmDQ+)YM"%NkLQ#KAJ4CCTm)$JL,PCCA[DN@h
IcF%`&c+fKMpa28h0JLkDmU-K,hl"+dNGN5lT5RV"!PCl#lD-Pa)30cL1icSh0am
%PTXXXIQXL9(K'!b[D1e6V-$NRGe*cI#HZ+3@V6&",Am,Y6#Gp2G1'Z"B4-p101&
*L"U*$%Ie4%9Nb1m(X#e,Ve"S&eZec8!hLR5D3[(k2+kDdMCZSj,kFC(K"RrCGii
EM4GbRA39-`38X6S,%8P5MERT8J'rG3c+Smf-8E%X!9,'0jSkG,pa,,5M!VB)5b#
Q!`-[M,Pc%E)9QcTkd!8A4%dCr8dGC",E"!QA`(pe[B+F-F6)'AU$P"Uj*!T0)8Q
8"#BC42&Ua6I!'jd%!M0#aT!!PT!!SDq`Si3ij#a(TEebY8Ul"eA4U0A23,!5S&b
Kh`LDZakU(P&K68'GF3AbfSS&9c,FP5##Bb%PJ#)!3'AVLFH58Y!T09)e5D)'Y%e
P"ZC*@1XE'"AS3"+45dZV@Yr!abCm[&(H3FhmQ!4X+&`(rr"!H2-IJ%3j66Tq33X
Zd2%,@UaUN!$TkDG#F9&5V'3A$FG@5Nh+bQa`r0K%$)DQj(IlKeE3NQ6A4R(Y1,m
fDP9V$5A)VP,(@L5#Q#6q9e8dU9Fcb($PY!pA+AMG#J3[8JS'X,&Dfj'*6@V&*VQ
5r*`-iQCL+jMBC*b,rCUD*[AJ2Sb#3IY-Q%HVF!p(d3"!5B,9`XF%Mc1&HbUciC)
LBM!!U$mPK62iP&ddKBYDq896r#,P*9(4bLlaa#S"Jp)&Ahq%ASB"STAKX2@lD'6
9&qfF(Rl4"pU0'-!peXbZFAVi0AjF3d9"NSQ1aLVd6DKRCY1%&*!!$[82mGB5%k$
@"L1e9BNL-['CS#N@M"6SP9bP&iBLmq2qSE!5Fle8-,jU&6aD%Dk#KIb5e8VrpEY
XDY@A&F[KPhh-e@fSIeQb%aZk`+"%-4A8`0`[dX3"i6LEBapr0HS6rh25Mi6G3j'
U@!6$Z4RYF1J)%CLfYRd+#6MX88Vi29Se1R4!&E0&VN5U4Lq0$X@),FMC"'HVN!!
5L1qZfNf-IQ,FI@Rhd25cH34fYXK90MFbXa3*4PEDaK4)(4$lKFdGk@dBc",q"4i
dIp9H,hIDjBQ3!2lRT2#RkC-KJA*A%4J2G!5k!S1"dF$*J$'`*h!j-#r3&*JHH$p
`4f"MS$43'%U'2+(fd+D3!#QN#GdEbJSG#0@&[JUp'*SGUJrG%GSB+Jd9"T2"m@"
(X#Xi'"`0fS2T`D2"KF(DB%0`CR"ZF'Y`TcIN9AX6hNhH3HqSeqj0paleeRJAH&r
hc[$1m9lVhHcGjIDl4p`kpbbhfEhERH&1F9[F9pf2Z"HjkpehZ*pdlr,jIF-qR@q
@VmqhfhIHGm"hfEI!eq#EkC[VfqVE@HBVQbT,P0R+$THePCdZ1eqf[kbUE(PCGGR
XX[UbD@8hPpeAYXXImPIi4rcYrKhq`hk(IlIrj&5Kq!Im9)dq'a0PGMBma)IjE2J
D(cVBm+Gm1-D'&rQ`K`friN1C$4rK`aBf[*-2[@aB682I,MDXjF20E2JL(pl%KPr
biGeXq+pmq!8E[X@($@cBc)HeE0M%K`[CX*%2Ml(K%Mj-Bm2&I(L1$9rR`a0XZ)J
21pR`E6jdXH(2q(!('rk5$e[CF$BI$V2K#hcSCm2T0(5AX1(rjX1(f(!'(cl1K[r
'Kh2Cm$riF#BEIX+(,f#j&6m@8ZTZQL)&%&-$CeM)KPc&lQ0Xb*AU6Q0$VNEh1B@
S@LiURc&)#1X0i$Gm1-CHFJ@jHpL3!%H"@fDLUV5L+KJ$9i4EX#'2)ZmcM2fRqLe
i0l+VMR''1pK`2KqqcpMVm,1!XmpQiRKdH&p8L(Z4-baA62dVRl+`)pbB[#PXb#2
#Qk'ii#KRMbLQ,[)TPf,U!cj&#[J*+Bm,N48-5cL$AJ(F$,ek"I$)$T)#TZQ9&hb
5EAFC(el,KXrai4afm"rjF!BEmS!9I*d0ZIN'&bK3Q%FS"#pMq4jqPR1'23UPe('
',-@4BhcU0"2*!dZ`M3fj%3B2+iaP'@IIaKKi`!kZC)KcK369E2JX(iEBm'pT'0U
*j6rV%3Xp`)B[mH%eLQYHSQY#lbQQ&[)TC3"iK%r9+UDqaDGU&&2cqG3HaG4rmUN
XKYE2qGAh-SE[iZF+CfKM$&cjSF--84ia)4YM2d*'cpP*!AmJmpFEG5LUZ2,ID#T
3STLD`DFfXf-8Q8Iie,@++@k1JIF9aqlN8rS!`&%2[+KJi&%I@+kBiN%QB&&-0I#
TA,DpSea)M!f[m''%$Br`B4mEAZ,$@@aBaiFk0[bB$dIBm#SI4YR`!aU+)MDmc)G
Ef*!!4cY(MBB,qI"kTS)[5IQ%V0!AJ0aNa!YX1)m2Pl(K0rP`2K[q*aqLLaVa2LX
SpQ,a6kb)-E)"99FC6*P8d1Hc&e6`Y,%"LA+a!9fjL4dJ3p#a&pr#B*`0#"%e'e!
ekTek2r*Xj*)%R15*EpXj12-X*H`PPk@`K018P#T%LC!![(C+K-J"Q*NFJ,RPT2#
fDC04Mm0cBM4i2VM!Dj,q"@IcaBLh"`Fl4)!IVHC(iqJ8laVYdHPLJ6!,MCL'(MZ
RLGdLAC`APd@MH"($Nf)QNL%F`(+Db"A(a!Na4hb#`A,4`#HRLIR$Bq*18L`@Y9J
FaH,,f!&mASbPil-XPSY28q`m2XfaNrJXLCh!jrABERaq&Y2Jmd,-JFrrM[AKmaq
a`rKm%Z[#Tckf!jr2BY[`Q4PVaqIl-4QI1E%4I$k-6H&6'+[!TcMQaqHa',bXe8K
#k6BV0Lf"HrY1LT!!6J[Z,3[-"9Mh1VCF"lIYQX$0BRlJ`m#eJCf"VB(0JG,35P%
GmJ9+3JKBSLQd-P!$`#mDDK%0SC8B@N5pH!kUZ%E-&4X$mm9Q85bf!)6d"ccSFdJ
1k-"N#lJ!6*S$q3&0i,P!GH"m)!DJ-Sd,q!,)`J%m-!q,)a3iX6L+"5Q4JJNTX3S
,8Z-K,&+`1)E&15aH`i,8@)I&D5aq5S%6LbYBN!!D,f&K`J*G$!D@B[%a&U6'UeK
dB2%"&JNXDLK`BR%4LaBXPQ14a1)P,%*B,%4NPQ$aYeJmJm9A@0b(aAFTF')a(iZ
EX%#AQq)1,1CKm5%@hk6!LF8M@-c!iPYBc-CL!4D0@2`'LeSXhX+#&,!)#e,!fmb
)[Q"'p)rFL2k*'p(Gh)MqK4[4YGb)VZ&'p!3hSJHi%Gh2M@Jc0k,IFL1kMa[4VlN
42F50k'&Z4+AFL2l!MHKAh)LHi8Ed0@j%1r9'&23LiFM2i0EZ8iq*VdXZkk%Y#X0
DlUbJ$JEii"8RQ[Fi2Sf,qJNAGD0H9'J'4#eRSYjRSTBT4"ec*L$+c!HhmN%VIYV
adi-I*,4bbM%E41lLfrJfhmDMI"XPI"[Eq6B+q19&r(+9p[,$Z,bCAIl[l2)16&V
Bj,qab@(q3B*0C'QMZ!PjKeZ3!(aQ+a)i9D1VDU$kf#@1FJL*[)+%UZ8P*0$UQ+5
(Mh4m6TpCNiE2k#RkH#B0(c00L4SqX0&(A+CMBZ[,&XlFml+&[r4,(kk-$kRE0eS
'9cScq')M1DRaJbp+"d39MUIT"hM9pV,PHaCR#KI`IjhlqF,Ml-'VT@!k6"1h2!&
Q-["kU+UD'HUr-N0YC)DkQ"PU!c28fFa3ImN-G6Sce*pc3hf1'qS-EUMr`!heRlQ
K[XF0pFIF81Gb3lf,'qSGh&$rb!heHQkSIq+'qYmmLQrL8A`cMq,rbk0i)irLV6b
+raH2iLGC&*p!02h"VUNF5G&RKAMpU(-EAaaaVU6&PrrS60+LYKUChKi)fF,&rT@
,ICb,r3X6kq-G)3P&eb9)6-mI`5+4#N!Q%#Yj0aC4Hj5j0e(b""YeGb)G+6K'cTq
Yc"'%-RS'cX%&IIiljq#1rJJ5G0I+MYUb@C6KHfhdR+N2(EAjM01S'%(A2AhSZ-H
%j$%GiV$1`KFpl4C+kSl1c4p"BRJiAKFFJ`2B-ZTS1L48M6a4qQ`DHJ9h-Mp@(B,
`Y'LZH8e4b*jbhBGa68q4Ykh(,`VQfA),DK2qd52TDjpSjNR6Y5+GAL64EdF#aQ2
QHUTBc'ZFh[h6BLf[j"BX%MEGSS,TlBX+CT-DU6VAZkK59U4(TXF*95-R!-NCRd9
#cAQj#DMa@Q3#N!"c++Qh#!53!"meSIZa@)8Fr0G%+a+3!-R"1l'3!"hkK'N-0*!
!A-DDm#U*"-KUdlZFZ)0ZEhKL+M`QSeA4@828ld'd)42Fll`h`ETYL(PEhUF1lp"
C6$#aGUE&[J81VSGHVFSAaRMp)IY1[0U",L5pFZLaZLU,($+l6#iXqRAp0rkc,[V
,pc1Qj*RKrhjfGqC$)&$E$!BMMq8SZZY#G#5TLc"k))fqSbeYadqETHiUN!!iYA8
#REqpkQUY`m$2"dGEkp"p8c3((Dj3jiMIVX[[PKhSeJ8GCI'*mrRGX5*T`pr+cXj
)cmjqHFFpk1$VKRY1(Xr)cNa,c655Iq2JIURc9Ze9RJd92emTrZr#*!Y*Q*6JK*+
IF2E89E+RG4lmc`I2(bq(DBLi1011cS-,P%b90X8jaHS+E1Rmh43B[N@kkhK@9Ni
UZdC#UU@2@-04el)15@V@GhJ#*&C122b6eYBkC-8JiHYf$D&bSM[(6d-*&@9(5R5
)%b+*f5`GjCf4q0%a4(GP9NRmY!9DmEB0%+q6MPkRq0(I@IcSGB[rPiIdiJ[%HSM
(Um*Lk4M[U!8G+H5[524q*RT'3A5p4-mS1#`G#aG+"3B5qhdN'TfHa%GLQ4bSD4D
ecdq)@VNI6S8VRcH,"DXKd!&4SV@12Q"UaB2CTU4YPPbcBQ6JH+`R35mZQ8Z(T@5
HHM%da(96NNX[&$[#XeDE4#eE,+2&VH5DedK,3SmG@X!28GGa&SNGQE5iT[!mNYm
88F(,*Q[aF+X&H(c95#Fk0)1lDT'#fFLV1I2cB*1ZBQMITfqS16UJT+5M8G6D[5B
-q-38ZS0F%'N8#hkN8DNQ'hN6D6kB4ZcF8%SfjP-5m4SM28aPTrQF&Ue#IBGEq&&
"#&#D45J9-LDMBiLFmj(-j%ERS141+jEPir&a5,cT-'YiKZrL%L59hel(R1iIJPP
D0'""TR!%bZFG9NU-MaDMdPK*$fTKAB#aDKp1iKPbCNT+6STm)9IZ68XI[*!!PGQ
IDcbB2TQ1PhP,Pa+,lL-KhN!TX(5TYPakiieH`lUr@c(5CY3`p5&*MYUQll+[RG`
IN!!3S&a9lU#ZhpXl41edX'6aMZ"*ZBREU9*"eMiqGd(4Y,JS+ASC9h3,ZTKEaj@
pQA8eX4cG(5#a,h8`))k5))AL5r3G$eVA+G4HXJ+e2d5CY8cYI9cYZa4UhmAGR`e
UceHSICGHlE,d%$6r"LJmpIcaP)jYmTN,"c+cdcrD)1@V#LPCN!#835C6GmJeF18
Ham2ZCNS*'lDAjN[)8PFK4Tj`#SLYGX@T-jNT5XNX5dM0%eGT-j2@BI1ZGJiN1NG
DEq0&!d!G$Ua%V8'H+!SCl(*3V`!*8'*Lk(KAZc#UTP-A+adr'P+TQ*!!P55%!JC
e1D8A-dcQqbbCEjK!J#&KQ9X'P0#j!b("91(AUk,N18N9*8mb9E6S95%cd(Cpe-%
ZpSGYBJFkF1)SVhCT(l[8q$Hje"!&&*!!Q,+Q2ZrQc[N+PEI(BITUMU!856'kbU!
d#%SMTd"*CI+E#8hL!V)",bUlbk2#@cr"1llP5BB-hHCTUi*fG#cS*DFSG)dE0Cr
M(A#28b9!PkkJ5UTdJD'+%S-1NGpYP`E$qGdS8*'N(X"-k1+Fm1iBHC&#MelebT3
B2S"(1rU9AIlaV1)Qi5FhjI+Ucjp8kkY2-A,Ge5F1pH$3bGBk8SEXB"f0YdSL[Rl
j1MDX&c,#98P&PAqp3BdCSN9#Ya+3!#&PcfF4@P)ebP`$r3bjT+%3CLUI)8j(B+C
@kXbfKJb49F@+M'(435mU(pFhrf5rqNBl(Y+SI#&VP%-Mh1-F(RZ*FY+UKX"06$!
DrrS'!BC6X5J(8KG,)+VqQ1%"Hb3J[bjmdkU&+e"8K@PjZ*)8eG"QK@TJ@19Ic#j
S$jYBr1hjKXGA#Qe54ri`UIPNVNjrC!N8FAYX%1kcDC4-"Tdm2Y"U*S-Bk+D+"JC
,kVIakQNPCq*6K3XT`&,(-Ymf-S65U#%i,X)DJP%FJ4)$akJaL1STbJXmfR,5X&h
qJ%pYelLY,ePI"F0Ap-#crP+H+1Ff!LDC#MUP!)1#LJ9H&R$E!FK&j4BHR0GJNah
FE!l`EPCeBBK*3GLb)T-PpiV@QK9&"k)i@,q)*r[clckbh#)(&%a4-ZH@'L9ibT0
*Bp-TFX146'pY6`aG4$U6LE8YedaDl#@*#ENrc#625j8D,k6AD9'$#PA(5#&R5rN
,#Lj-)DV$j5Y%0F`93YXI9hD15!KT"a$dfcSHU25QAD+rPT+'UPS-Pa,SJ844'bN
`k#m[QPRqj8Ack(*chNqq,d9$d9BbEkPcqIEX2hma()kfD+L-YTLZ4&[%9Q"#QaM
Dlc2MD5N2EAddlkK4UR'Z4DR'2kY4F5EIfdLLq"$3,0Qjc6$iqVf'`GG@9LlbjkV
$LRb!G&+4riGjekPFFVkE4L+NiPP4!*Q[UkKQKE'KLpSdP8VKVVDi4+F&TY#dJI2
8989ahK8@'(4HEp+#$BB9UG,&CHV+aA6K&kY0[ElDe$cpP05*Xa,d+M'A9pA16GG
AYHJQEEfV[8I(TD1V4cJH@+!f&-N5!E+GZLPYQ9k9%@VhSX1U'GXID4GiM,ThqU(
mlS`)&F2YjmMP8`iDM(9lPk+i@bFCl2DVfS#d6Q,lYZD9)H%P%ijTp)9dE($kS95
6EM@4*3mS4,,LFrZB9L3,Q,Z+p#+9#Gce$jP99MC5GeN0!))bI3##d)aN93`[cVB
IE9G8-P)PXIfNcLa(88Qdm)S$&e*&8l+,'!QBFY"MaJHTFdF+r#8f'4d#S[(#L`d
UmX&mZAdjVkKNIY8kkE+[heG19A@lXNU3!#9N!A+0+N!ZCI'0*PbrdXb"")%',35
55!DNfKJQ$Tfq9$DrSQX9VQ#m1c&b6iFE@#"01)lPM&Z6$*ceG&kN$XbFS5[2A[Y
XT1UjBhP2bR!PmkC9lVD!9h4VF'"'S%3RG!#U@pXkTYVG-kSdh5I4GHLebkGAT4E
VJ[1AFeCdF5baLrEfj&HSq*pmPTUI"L"D$N*pR[#Z#k6(S2B!A1dSDqZ"5fpdQe[
AJDkQSIEjadJj$8KiP9&"B2eA5-M89QB$mI5V3h,,+A5Iq0MLEHlTadkZ[2CC4*1
AA4AY[*M`iM%pkM$ae+i`ULNHEU`d2-c8!bYb)e$P4#I3!mJP0prl!Hif#rRL
"k0Bk&19N(QSjV#0cIBGYP(J$aPF9IRfl!0($,c9ml)05BYBY2YC82XqEbS@+TM)
RG5LDbKQ+TR+KYUNFP-J6%`rI1)TZ+'cS0`PUHUcj@D#U!B,2i3GGdUAT5H8AU18
Xfp''PM0c-ml)"h-cdibCUHQC'9Qrhe#5"5ZbS"$UmK$+G2'KZZdFKRiVVk)QUBS
+!lYieH9(p%8cI,4%akFp@[$$3,)GjS4l(49rq@(&AcJJDK#l6fV5%8QL1Ub)@#4
9(Arc+k5M2-ZJK9qR$cVqcSXR+KHjIlCV&4YlEX9A82GU0+b[86EIbTZFH2KkPk'
#$D[Q(blCU"KX9JbZNBlqD5cmU+(L,RiSA04fS4Mi&3123Q`a#BKVUqp!6cjrE(j
J&Lh#Uh3Nhq!Ur!@4H(H!L09Uj`Rh8@$[`*'q%peiD[Spq+&K"@pN*""ScL&S*AM
33Z),8Ff#8SHHP##Tq8,1QHb6ampNb[EM&l*!F#*#8fT@j['8e3-%Rp!I@,U8R3J
2%"`-ZVid[1(lUfe5KIl!`[8"JakB3b,+Dk6qbPkjQBNN1$Zd%8k*P2%31#6Jpaq
eU!2P[CLTH-%%h+-&r[N@+%VL-&29)Mc@X4!2'JmMIM-bmSj`P!fJ&fY3Y+i'f$K
!2!caTQd+*ePXfcFQ#qeN*qm+G3BkH(04jKh)QdL+K!)dK#+`'PeYjUj)CC4&b4p
macGR#pXF%U9TZk9Kh6a33q&D-M"LL*2bCK5K`a9$%0%(9P-,b+`"RU83)S""LqS
ch,`dfSNlC(pq0bGU5a-cHF1GSkfGr%*UpNjp)UKEQIQ%L2jPB5&ebLUU`LBhBp+
SR#TUN3*(d3kZ2*im@I[bR%3U+$Tm3RYP`9Dq56h,P(5mB#G(T-)!QT!!+4SDdT8
+-A45'8BFJVVH9"3Pk[)+ELh"CR[6kU$VLJSj$U`J$cLFC%B25GD5+(Ph)CTbb4"
+8X8IXPC%UM#3!%J8*,aa!`R2+&B[FVH(&EQ4*Yj*MAmedjj#d6M#-K6,09)k0SR
MGZV8aNqNZ98eAUK#I+*16a#pUel"V#6DeUmb#'S"imT%*d6pZbc4af*9fUS3f4$
N`LpKC+'-&C1p($9fIf6acir+p+0H6D@H$5)d$KZBmeI%V(q)"$)YN!$98@&Yi4N
JNQY!0)a!8)R8UL9-+`(dMi3ADVJ3TJ+ZQ[!'16qX,MqLL*chd1#6G5XJV1Nh9e'
q@9%eZVfBUY&#[f+J9Jb%NR#3!+JTeh3hA0',#h3V9V5qH5eQDC[AKJdA58dB-#`
Zm'ZdcHm#9q8UE89SUY*AP9'kRPHVVrYURJKd5XSLj!fZh4VUP,qBZIV385*-UYP
%G!@"TM*"Z,b)B)mM`1CZeK)PpGH!f+[T0PbLUUe-N!#SI(PjB+%")G8"a4B9ekJ
@K9ecpfT(&aI)Ub`5p&YlqCGc&G9S)8[%A%L91c[8SP$CdV!!pA+##YIq94CT'Nh
GkSJ8[9MqYX+99f5[908`Y4Gp@-jfZeDJ`+PbYYE"ARBTYMCFU4KdV5kXS(3&NA&
['0UZkd*2UAaPeEaDGK')l`Q&djRmmKYY`UZlQ,MdEVr`YQIV$1"8P$U8ah9K"9P
BC)cp6bALQ+aHY6'8&mP53Q[q)#p**EV9!pQ+SMmm%PFG!-S2H1&"52Aq#JLS(MV
H@[-+@#NVB%9Ne!dMZp)II+-mS*T0AIbp3Th99,V%ZUjGRiddqFB&MJ3qmN[+4`k
9L4kTJB"1+&Yj"pBGJCZ1EMfdcIe&3jE)p#EFX9#V@`l9(!(KrdNj)(@*CSL@9MT
q3D#VE4[m#4qM5Ne(K!5G1+SJ#(-95Ubk@aH*9ce8hDNh%[[Z'b`MB53Y1*f89kK
ZePI"+0$h6ccm[ciN9jMIEN1&h2Vc15"kEKBD,)CT%S0U$*KV9X&Q&24*j`iF-K&
a%kr(CGi%CmfVF@,EhJ53!,Q5qpEU$PlkLYlbrbTpZZk"UpDC#kRC4"BjHG#HrD$
HVf`6H49NTkFF[j!!IJE6f3E(XV$0E(er[6G6V0r-e[p$QdNYGc1TfXdB3#-JYR[
LiFG+3C!!pG*#8jGIPiJNkYSMp2LKLrrdVPNX*66`3'a-!'d2f+l5RjH%2pA'`4f
#D)Yc6R4[+,)jClJRah8U2JcCdlKq2ee2Lh"NmjAS*U3T"F*4KR$dGdAi`Zq#-*5
lFDDNh)dcedHj'mrr1C@l3BB!j@l85-VGU&PIjA+%rfc+A3q%pHJQk(+@BF+[C@"
LT@[jTIH%AIVhl0+F-aYii@0ArkBAVNFKSlr3p1FT,MK#IkG%D0-0%N+5cYHRZ!K
(kmp4)+m2@UY@PYT+h4"f(R`N)bIl`3XCQEPk59fTkEmhCS*aD$"9k*f"2&eX!hh
)M!UeM`k[%6Xm`46hR#-1VefHYBDFpBQN,J[U`TQ4SEJj&cfAAiijkl[PY4aQQlK
RJiUf@@FbFp06IKrQKUdRpie,&fh(Re*4@C8F-*'80qE-6)H2mHm3U82rAekl`Lh
cDk0iQKPPd5(bd&%N2Q[KdSd)c$d14lm(biR""bN+k5&[XkcSXQNS!0!'53l8r!p
$`%1`5V-10rL&lBIi8lELNUMdR+bF"c06bT1e5P&EbK&ed'KFS5KH0(MjSfiV11"
+IkL!F9JLZ8E6K#Fiak,f%M"m!L*eh((0BS2F#fI+%5QCc`dfDBU)c*[bMTqjlF&
+4C!!22(`%q2FQGfR)$f9%l5qU`aCfSXS#XJG(d&hUDaqfA,Afb!B`)Rp`+KbqR2
YLrmUPrfr'XTRhhZL-V,h&ki2XTChPGMZZ#IlE'CZCJUX+M8R)c0eIcS`4pPC6S&
-9l6q@Dj)$Eq#`'VmS4e`iJ)!2%cQ[d*h'L)8d"@[V-L+8a'pQU&8r*qU5@A&eLU
-R[K68mY$C'Up%(Pq"D@K!3q0&+5!5*6q2!4N6PU3!!"&48&"(Caiq,iXDJEJmX#
UJe3U+ejA,1VAjBJU,dMT4D',mS-@(IMbMUGPCfAQ1Y22CaY+Nl#SdKGKa35m$0"
$1)Tl5e@m!diS6%f20q811AJm!!qB6E+D'PJ-!1R"*GGe3@6SJU5[8eN-Y68iGMc
V`H1r2j1GQi1Z`[H[%M[T8$X1SGrFR!cd$lC+IQ-3l!0J2jKlj[`&HrSU-,ZJ34a
'H$3L)%l*Em0!m'G2B1(KBRC3)C1l5JPmCa&Z$%a@ZD,ZJDLFJqNE+%Y86[a`re8
H50AV'e`AK#9EfP41)&d[8hR3S0kAZh[H"V##2`EL)KiAL$mR`L[rX+%Zbc[ahc(
[a"m`K(PFKf%m@+jKL28cM!Fhc$!Hh"$$H,!F`kJF"C[2DD1Jm'm3"BU#'!!!-!0
"4%05!`"@X!p9#b`T!#TYFlqAGePA4&a@)L+L&4(4e)aac"K(hrIGIFRcbmK-c8a
"cLdB!F+#CUE2ZlX#)Tl0e"ScTh%FafR-QXBaTk"a(+I-2,mDac`hRMXP-j!$)k6
PITi&A$ahdhcrllUqll[1mehA"4XFJ34"%!4"N!")LQ4%+pE9eIeQr92kH8H`q"9
S`60JMX1FKZN+`f&#B5l$G),THl$0FbUQb8d)39(NbGfRFV1$4eZ5kM4$qS8Kir2
9ZqTN)a!pM[p5,DCI*lA620)XScCk'Ap228!I*mh4LU3mqL$T8ffdp&YM6,5Cce4
R'#A4Mr%rU)r3GdQ,Y'`TRCBN,G!HPjBDMdCRmF9U+8e2HN0l@[Ucm94d'Ap0R@*
iS`rbU@S"68ZDVCQN`FETk"IUq$hU[qRZT)&DTA5'KL6GVpdT2@$m-rSX(k3HTCU
NZc68!q0%p$&Z981-mZJrmD(UEA4(8V"fA'UJP+5(Y6h53mEcdI[iF(@%F5Vk1Ak
[HT)H6"UTlCIQ'MR4HrNhkQiDPM4+UjGbDAl53Zf3!$621"aYiC&U*b-m1UU12k-
Qdlq51QXlT'EUNr4hEE2d4b-S1S(IVQC3[k5rDZp)Ic2bSc2j6fTrBf2dkrahDK2
p*DQ[eLMYSTj*2pGqP&iehSkq`(ZVRaXhSfr`,p9[k6G*hE@,dLH'1cU@reIG3[p
)HPp,Nb+S4p+(@ScdJl%TZTAh8P2TFY+YHl62T!('9p%Vq6QeQl%LHK9r3[fHRNc
USLfAAMDf4Ar%rk2ZT'H61QMETDh82ZN9l8fTSr&@p'VH93deMN4[i0I9YA3P+8a
E)kfMUdQAY#qNDmEAdHYjQqSLCp*j6CF5MIZLihLmDMH8D!Hh@96*TL9ac5,Cd23
`P2i'b651$Y$MG)*Z8*e4*pH0UcY3phMGL6SbHfS,m`*&aTMLCI,SF3G8Hr'-dEU
ffUaV%Nbd1BiMlKURDmm(G+fd@0GUBE*J(S%C$D3*(3Xkam&8!M0MM-XqHNDYbfl
`2*Fp`%Hll,+`"cL3!11%pA!X)A#&l&3`(a"fR,"Mf0iCYEVQJ@5M8,F8kYSi@GG
NMkkCLb8MqJkqc2,(a*9"-8%4D8%*PMp+pUrFXCEQq!eZ5d2bRKFXYpR[2)RJ2'j
4-k)X#HHD-LeIr4MM$RSRCVpP3fEbUIf@4SYEDbfh2(GiLqe8P'"UDmU-q6(Q&,+
mjjL`X!hZjjEPCG1bqc+#,*Ra&M8faYf8UIb[3*hDbIQ0'cFY"[ISh&!YKX9M-55
lKp"64(4S(V)Bc&SmUXdMV[S+(XeMk0bM@Mca"JQX4p8-$q3,6XM"%)bSXH6"!-E
*Z(3JFChB``e(aA)+pl!GBM'&'bkf&00!X8'DS@)9lR(B28`JC`ULCiHdUQ8iikS
qjRJaV9C,2mpk(KHN*RSiFR&1A1&FGD*2*YGe#cH43&Ui+JCF',$BB99ZFL8b"M*
a0Ek#dF'jUd)!0bNfJ9DjaD@CZ**BXGhNd)!+C5aLYhUHV@"5l6KAE)*&&5Xi3YQ
5%'p4Z)AKA%iQ"'ZVA+K%eHSPXJ'BAADrKVLf(mDdpmY3H+(&E#PdfFf&C$&,A,J
DeP%eJ9(aEcG6)I*55k%025"jS82XdX9'l&FYKC*Q,P5G%'%QYYeH+(SU$X8HXb*
B155"3a'5*16-BU6D#UZ%5f+CZ+Te+m5!"IYiYAT9r%`+SLE@B4BL9D'DId99+-J
,&FCP-G[mQS&8S[!YQM"+'b-32P&T-!)2+!)j08C5-($0&5r11B-`&"C)+qKRX&*
fB)0khLp!R2[lSNc9H#BA)UjS9#'"aNXpJK@8khjfYYXTMXIVjI4[jPV&URDKhA@
,8D@Yd&5e@5S+Xd)E[hb8YS(8#k2D&9%*3'D$*%86'-NX-1Ue3ZL$!B'$&,0L-`X
@%!XjR5TbZeX51r'E3ME!EM*FA&'F6,c#&BIQ&bI@8H`-k9qR6DQ3!-r@866XMKH
lJ2-c#T3GXP@aXU+FCmZ`I&D&h1Y9@jRk$"h+pJX(SYVabZ#!-KD,*2US2Da,NQU
h`&B-3)hVk1#0!4C96$+ji[e$e!l"*YR%3!Q&$','CC'B,-8ZS@C)%VF`U`LaM[1
-T`S[PS!1*U%0&R2k&f%B*N0MV2#3!%U&8*G0l&G3-feJ&AM1p+M5b9'aQL1d!S1
%*RSX91JKFk%q`%bL!q![p&J`X)L"m+#La!SpLNf`LUS(0[8+1fCEi9MYf+,DX89
SLB%$G5'8b4(b(0MZX!QC!'@c)0SPX4)cM"pPGGi[6MKdaL+N#4N9kLLSP4i8ViH
0&FLjcmP',LG$1Ha#$jX3LJUVaN1BL8`5Fe)HH%+25@+Hd!3i!5(JkL@64`d6"q3
"hJ0hjf%E"-8p+U-K$K3Rie#[Xah#Q"3d#qjcXT'I#4Q(i&,m%BAP%@AJF,)G3Y4
jX6c"j@),%qrIlS"U6#G(U&m4UQ*)"*VB8Ab&LXLJf-V`mAj14Db$c%8qI+T!Zar
[*2Ih9Aib$Rq2*TUq+cQSeBe[#)ITX-p!hq@1DmS)fT!!f4VVrXSG%46eMRV&Cd3
&fUbV$T[J8G([l,Jd!E[JD+r`8X5q$Q0@,h5LIA$'V1P!Ad"r-8b`VRhr5B&@d`#
$PkLDikUf+J@G)c#TJX(,4kVDMMBB0``bUaApBp`*P[,3S#U9SFCl4ahA@L3*5Vb
hhQ'mYabG(6#C@1HX1Q$PI#8UqIA0%IQaQ3RVQp$`c!b+8"1VZq"XllLN*MHkBc-
h9k'&V0XKUamkhFA!H'mQa[(SciDCUf[,&kPrH@Ze+mSG"9+iJb*mL6%T5Y$#BFc
a&QKcFX6!Q(-DmQS`aS[NR2@3!(G4eGi+9K2IkT%DNEmj)XJ5Ff[LBYM@1BhBCSI
TKUhTUVBe@ReLkj(afR`4krBTb"C$l2V!F@XLI$LC!G'4k!`5!q0M`VK(JIDa'5C
,elk+9V8hSHHEC`ZF3b0CJF4Rj'pZ5YiCC)R3mKNT3Iq2Mi*r(Fa@AG[@4h9Zcf5
mL4P"QC[GMB,CRXm)[0liH#[i)m$VK1N+rJK9fjkTfJkc,FiG83NlSb`Cp[cN`rT
%N!#UI9+Jq(L4ilS[3(`m(%X-4!HdRJdh[U1VkNa1QkMbJRHfTF!jZj+GYqA(ZRI
Q0qq-L-VF(-4%'E12J581NPE$C1KDmQ)eFAYQ9B%0d01#-Ye(Bc0MQMCRiMdS)cp
cmc%)RZddCRFf3Lb1LDAKUKS4%j6CP&ceGFm5%`VU1#S'Yr)MQ&4A8daVP$ZjN3(
Ql%KMGJJdQ9@J65Z%+6*#S&$),TK`Q%BMT(9L5fN+hU0H#BS)5[!&UCEJ0@fEBk*
J0kh4B8aV4FFZ"XDdUaLMXNlV"Y2I#-'hMj!!b`AR3lU1EGe,BYfA"-TT)mB#P00
U(-B86i%fT83-M#Nj@"[IAkEXKj'-N!#q@,XR6(6"-b'p(ZaTXdcSPeUQC)UlfSP
0#6@QF1DHTL!p8a,33AUQ)$dcI&d6K2ZiTLRpQ@[D#%$GZ"@QZH"@5+53!2K5UH0
6A9@V6LdcTKDa9DGQBG84k-!I6$eZK!5hA,9'+Y#'P[KARAVF[qT-Q&i`h@&ZacR
Uj9"6`E0$*q*[@LClDRYMDKq(-48&0I8RQ0l'8+`cp(M"J+(5Lh!B8iFE8i1arl8
#E6V%6DmeKN+YSB#kSH%&eiC'YPaYqRjMqR&MD+-aY2AUKLr'9mC*+q[dm*D9GAU
V`jJ11*jZ&`0M1XTP1RcjG*6,p2l'd0$UUT[BP"qcFdG86""UFA088dCXK#!Zfrm
Z1SYJ4ZRDkae8Chi*fh%q)cmj#Pm1bTh08FP"EX&Y0Gl`kYIbVdk3!0JhkSdhcKT
$CaY$!3C$)a8q3Z%V&"kXm&mSr$m+IeEK2bPm[m,rU[$h&*l$X(h`qUI`%SArA1(
2+0bZm&L&2mbi[eGiXm)h+MaHiCX8[PMK6LDa'`[2X2%ZKIp$iC@-6eEi3Y%'jJ9
-+0SV,SAE92'kk@"R@3SIc-5"qh@&(f"l6M,88`Tr'fd,K3r"qb'6Hi'Y-8rKpbU
mM4dN+RbY`[qZm2N+hk,`%)AhC#hm%@`FcG+c4a'[FlZCaPk&4l+9TLRmSX,c&(j
GiGmb3HfBLNN+Id(KIe2iFDC+Sm)I8ALD`Rp8q!Q&IkI`Ac,8'DBF9NfZ@Uq@$Di
`4E(j#B@rS[!r+rb5`TFUI+$#rm9dDQ1N[ihTp#&6U%$K45be#NXR#U1G`XmTr#f
&cf4,5Nb$")9r`JSJ@q%G&'j9q%k&"a4q91%USmKdKIGAH&H@B*6PiicZI9RDTLL
mNm)(X10lQDkJrS1-1ZmUr#'@KSIC'SGBQY-9[PIKUa5q41&SmRbXm"X+rdEK[GP
L`pRr'DC+!b-0%V1G3F`k4YDV#Pr05JZ,h@*kB1eAUd"N!k2JMbb4Gc2@,a5q8Z%
[-pBYM2Vl'1(!1P[K(4Aq094Ra4-1@3akBPNjc@&-&LCk&5Z2"a4HVr$R&4kQm#p
C!L$#T[#c#KqNe$e&A)UfG!U20&e1RAfk9qYJFqL4Q3ep'e0+ZUkHFEcRVQ#2dp8
ZjrD%ZD9GPNmrqiPl8'hEqPRlqf@-c(Tjfq+Mh5r@&0U9Gh-lljM[2EGb5Q@2L)&
jB@Xqf0Grir$XpPXAPIHq%"+)MjYFhkGj9&Qh&DqGH6pY50(9GA01rC3j)Vh$pLA
(2VpCCc8d0HR`-e(c#Qjp0Zf&(cEG-qEkKYrZq8[6`ipeI1X2YrhmacZ+cqZrh[[
(S'qHI[,l0rljhpJ(PPhlqVf6IhhR`8Irmp(5hrrQflYNQq-AKrk9[2$JJ+qQr[[
$Q,Y(AeRlkI1rHrfK4ejjmlXr[IVfd('*prebppmh$h[UL99r[[-I@qirF1Q,Mjr
l@rkpMcqlFm'*,fqBVLP0lTGS&#p+Q(L1Z3M1D"&mfD)`-6!@GF-B[Qa4"jJHaY$
"UVCj"ebhj&MTq(HPV`qL#4c5SXLaC)b,4N$QN!##a1rbQ"!XqPfkX@J%AJ@3!#p
m9eE43ADjD!ikb#kr1f*mKfaXD,#U4G6$&-&N#bH(A!EEDm`&jfY-&IR8GaH0lqa
'M@A56!NjiH@De%PD,9hc)d#TVr-6JM*SDe"%rKF4#8%4E#c%IH#BY*d6RcqHBC(
$q'iq1M9LB#`fBiamDV%**XHS`G@9'M5kDd5q(+PUc6I9bmh(aLl`fL3+,'if&UF
jM-AVdEm*%fE8A*j%k2RQBa0T[Na%@MYMmA5MCQDeK'Z3!1"rH@"Y0F%cb&KDD03
-IQ,#P`UIGikPpFC5015APU%2fLje'AI4@YqANU8*aY*-ikl8LEAPcP8N2biUa[d
VY"bApTY)3IJEidXR3aP!bY,jBQ!X"A3YlB,qN!!#E8QHF9G&!r-ZeX"%Ta'Y[GD
Ad1bVM2`Y[i*Q5lD09E-P+,NP+,8Pjm6!@0)"BaIkI@"k'hIYUY#-9fJ@@R!TT2A
VU'5IPXI%AK1@$'cCp&K3k$!@j"9F@e$Uff34"mB##mj3#aDFV4JE#ij!#4"U!9T
"#c+-ZmDr8S4@08c%AUHai*aaedb(IreZ`10Y!`8X+[$4j-DSL2d@GR4*$(Dk)k+
Dh$(X`(+X5QGIHBXV**fVN!#8(r1cT'!AAQN@i1dRdL)'b-M34hjCDbcSMbj5&(P
%ebjZ%ad[,PCSpR1#3hGq@qZVG2k,8pUrKYQrKYQ)G+1,BSVXV@Y[pa)G,`p@RID
,6%,(P[6BiKGB)IkFVrL+XfUU2$QH!#pUQjm-mr$Q25qZQJcc9JSb4++P1'mV$$i
8[%fLibG$JZ!!'9VSQ[qVk&T0$,'5fCMA(YdT-'L@APJZ1RjLV'0#Z[TAm#q`)lE
jCe0kIX#BAkjVhiiXd+c`k9C!SK8Zc4UUD[NS6L[UUa99`SVkDN@eX1,9cES,,qf
pI-Ze'Elqa5eAlM$QS`l14c(1lkjV2q)p`KTGX5kFS"A1d%Sqk`k'`8Z60G+rVR8
'Nrl+K1PmFD6N#b9M)9*l%fm&9T!!e)TX`3T9V(MeXq)0b3VJYZ),Pa@9e)UFbJT
hDZf+C5AIiUY+lBXX[S9)md+NHH(l-1rLFLZq!9Q$aHTHE[BL(laVF0A5AYlJj4B
[&lTdpAB`9EqE9,bC@(#e-cNM+#U#$NrJL#b(l@0lRE%F9LEQq*m&pCSb0eZ5mr&
0*5)ffCdI8@l*Y"bc["1eDfG-di@JUNmRNkl5iQY(pG,M[mN`G%8GQr4eD@l2#[G
c+pRpBfY3&E'1qGrU`KLfbPA066(Q"M2SRc[,BFbGAU"p!r3hTEUQ@990kqEPH*q
9[2`)4ZZp2"@ad-YAUpU0%Lm2ae@2@9lHH*pY(cPSYh'Sm$3ZKjdd0jcHDmlT9-P
cc$RKP9+ZQ4XhEYJRX[US"-IB%M(USX0h#`0`8GLMh%cE8CFGaLJ!cLMrPmC11qm
616&SPSbF2cR0A9&4r+%TdehPN!$D+KLU94KK$+2a)LFAD--`')E[ClED0relZSj
0*KA`B3lrAQ-B2K!-3j0Pf%DBH&f,akYrI!*-YUUGR`[c2S`GTN4e1P1Bi0XR8ES
DhLHk#&B!J!p$24df50IXr5[dDrm5fe9I&3FjM"4m[NL"BdhCS@ZKP9lHeFXlU9T
L$F`FQ2B`#JcFlkM2M6UZDXi1AJirj9cZjCG9,I1UUYQ'`-a4cpXbrfI!HciY503
)5hQAk[SKK2Mj,(kqqm5lA#PlEhFjY$cqQG&l[lJ%@k$eh[q&8CILjB2KQSf(,cS
d,djIV6KpYFAT,!FZPAjQG+milHjl1McV4QUG85KlLJ2Mc'2b4YFZ+cTJ+[!H,(f
kl+Q5al)IbASdrA(,iGa$1A[VGcIXfIImrT1RRM[p3Z@rcrlcc*h(Eb[rdp(I(cX
K4He)6JKUhYcBY2(eM(FbmeXh4F5iBp1fl2Va`T[E2YUq-hcX$'pIr2EQME"CEGH
ZGQ[rE',SpE!Vk&qkI1[FJ#j2GRZLDmIfVlcmR`l2GRUQmlpZrf1I[rIp5rrIpI[
VjerfqU((Kjrmprerp2ajleHlrqEc,k16h[e&Zep2rZA-hhi3HZ89bmH*XkG0Q6V
pMGIqE*P4YqLla8ZA,)LF0hrKh1ZA%fpG1YIPb3&2G"cFpH81rhPJb2h"Gi3-VER
,@NIr8aUSLX1PapehC-1DYHZrA[G&kQFV[eVqrBT9UpqkHkZI#'2Pf-U)`$@lcAN
qIYLRhr"Ck$mm+QAiJ`q0G)kijplcl`dFG(Gm5aVmp,H@02MTEcidq(6@HjBjifR
`"emDI$0U@-V$`amDqH#)H`II-r$Z35eS--Q[X2TR[)LIZ(BfdCp8jqqGRXL[*@m
RRaprN6pI!H%q2mRR9bI4f(p9Zid**%ZrmUpPDR`4)-'%bTSRiCI'FM4HSdNhmE%
)Q*!!6*fVU$8aZPAmA(@Lc'@8C$%&-0h,6'-SMdC6,5fM)Ncq-P%"l[BiL,[*RUB
bHST+k$(+TNFSLakPG%`0Xp"KbU9$P%0lUCjf8`2YSAhd21fRNlLliMN8p`ZBPrY
[h%Id6pbEGLFGTpZSR2k%ZF5rTf1B@)D#LU)GP%`*&%60Y*NDUBNfdZZ83Hp3*ZA
M4VY0&%%aj+CB5U-YY)YqT![d*QfMMfJll85Trlm)H*XZdVGd%r2D`ULZMDl49HT
'lHPC5U43ZJlX&I+M,p&PZNARD!"eS5I"p!4eTBjJIB9HT[p3"fcT4-p3CrSAh8j
rT$ldGqT,Ik(qp$[U4hqPcqP,kN8r8!rkN!!qSIr5qr32kNNrTpld+R@Rhc#'D-b
qSRIT&p51INf6kCFdNhj,(d#2+eMPBraQdc5D3P0T1Ve"Vp'ID3CqLqJl@Na,D3N
YS%LD4r0T)Ff&jTH4JP[3qKc6G`$dl8L$SI2,d28rp!!0SIXTQ1kJ%"T+0A3A@DP
1qEm2!LTQ9cM)46V&dAedK$E3'PT,kqPV@NGI8#Tp4L[T+eT1hp-+@N@Vk5hDfJ)
%rPm%M!F"h(5PNCeXj+6c&%r$k&2k"YKCj%Fr6+-SKBE6Jr33M366#,U(lJAVHc5
3!!E4hGMb8L$`%rhY*8&!-%46hF4!i&2Sm"l0`@p#%2J$IK-(J@qJl6$Sqc!d&[S
q#(h["3MF!fh[KVi6"3%be[%l90Zii(8)jKS4mTDc`%8BRF2#"b,8CV$36J46(!X
A4$LB,F*MJdA)GSU3!'j#X+4VE&$*!YZ3!"l2`Q3@)PQB+m,M4eKJairhCf%@#b0
%X*5bS,#`QJ@V#)IAX0#&K4!4FK0BL'CKL3Kl-d@Slb2#lM`@cSM3B"EK4#F4T,-
LT-i@i5ZfqDY")La2Cf%P#aGCk-A#)K'q,f+"EIkqNB93&MjKJBPBY9L%0pZc`",
fjZFLE'1UE#YRB6X,%5*ma%Mj%52+GNEklBamfeRLYhGQSBF)iB`SiI8XX!),CiN
2lmd#)h%i8c6+aF*P%ACdCB'TPF`1NX0CH*Q&ReKJ*%KQ6!NQ&PJL%pL')*EX)%D
DS$NX-(@$'1JdlaHKFEi)6DGCB0ZD@!%d-H8f-Y*[c'+"-@eN6"Y[XX#+Fq0d%6+
1Xj!!bJ*60)1"9`CMbQ#%IUGCK2bM,$!JbrHM''MQpf4K#JX-D&V,@'#%Df@Jd-U
@Eph+!LZUeViXX-fYM*5Y$&Jh-4*[FV2!90R%#,H*JF8Q9V5EKSX3`BSYJS&e"#Z
f#!E+-5cC-3aFBKJjBKMjh!%@'&RG$+cGV,+j@59dX`5lql(!5101BB&9fPK'd&J
,#`a3BPPLBKP)aE*+&FZ+0TDT'2XD#fac'L[JY!B@',R6GV#`Li9c,,"+NXE)NFD
UCGS3%EB`TEH`T'jK5Gh##QP,0aBBiED`C1m5br"G&Z&T,,ZB9pJPT'UlHXP8@bK
6IjKfKE*4@LJA,SGa&mVb6CJ2d%M[@bJA"f!U#q8a4`[P2!b@V5Q8LrS8bL8G#Z9
$f`VPh6MBh30Q4+(FF!`'!KUk&-TlbQ(!X!I#Rdq!!I,jff&k`Xb%Q3'68LM[*b`
DN!$P`NKC$Tb5jC)d@GiG,F[2pjIPrG0Pq85B,+Y&XUaNb,,H@CE[Li0abr)4Nba
[!--'E&cVKHNKbqZcB&E#,*EPVi(mZTXXI`&"UAQbr0Pq'!Klkl)XKiq3!1@SG"J
)LZSZbcXZbR*bUL`(PF%FJ3%LU%f@Qa9ChJa"66KS4@H69CBMS'4%-ma2XKc6(JE
+EZN+!q8ZG)#C,-YCjccbkAL2r#HA4rjpZ8FqJFk*IKlCYGdMkjFpmLU#`3(9&XZ
8A5c,ETKfaE+R2mb)BMP3#Y-2jV9LfE`9jJ*-Mf*jc1aLZAC8X9c8!@C)X9a3@#`
IR&%X2eeI,*H%&m[CABVP4il$3'"@AV'FVX$-K"PH,$pH!R1j@$jm"ZBL$$EQ&X'
8``3AbiH`d+%G-&MX8'HBhX9b6LA-DTJfQ$i`%*B$"IIQ`NJ`f,!AKhXA&m[ebf&
f`8$aqMN`mi[Ph9"S0aCU5#Q@pd38bbH4X*2BF2*p'#akLQ!@&F[23C(R)2ad'3`
%RiD#,jb#k9NX9hB[PXp#mAq'&XYR`SVP1k(Jm3DB6iVPfm``50KYqf'J4,N*"K[
+"aI,4jZ,j424aE,NJVN*%e)X+dLNFK8'a(EXJeN(JifZ!!b)k)*`9cc-Z@)jVV9
B[LqY@$i#jBl-,CBhp#f@eh3VPYIQ`)$!Dk(!HK6B&e!f&B@B#Z'IT4E,bb(mHbc
qIAXB%'%&$PI"8&P!TNT!1X(d$-L"Z)!m,LdJQ`(pjPDBQS!mCL2-r)#FY`mQ!kB
(6%K!(Jh'dCm(j0S!c%fBb3&j@5h-5TMC!EN)`Jm!F3"#6""Q'K'3!![Q"Q6[D`(
ji*U!r&4U3-lU(j!!(fd,b1P6!V)&3JlYJ%N*b!hC!IRj8TJK!IRNdB"m#TdA"JI
N5M$GD3V)+K4e()1C'C!!AHYK)%![KqN--c)Jakd1S$,#B-14b)#m!4Xfp![)DhS
(j29)8#S3Rrd%-cdJEiAL@kd"qFd9!6RK6%"ZcS2C$Y-RJ#F!S!%VV"5kX(3G&GA
6Z2dZ2Jjc@h$a"V0!H5dqSUMDbUfBY&Pi9%c(jq2%E%fY0G)9'TPeP[*bD&`C'!Z
mpK4ZLZ0V[)NTG0LF3mZ+9&XTQ8mT'MI`&3CIZ[[b2%b!cLZ)[cq8`SmhN!$&+eh
2+`-R@8cdU#*N4$*QeCECRJkkq'PIM$LIbB&1m#E14#0Z'a@ABhDcAfBSC%k!X`Q
FKFH[TkIUb95TaUqMR$9dZ%b0hdV2ZbQpc$'aG2U6dPhBk4aIYHHZa`HP5Tp4SGI
ES6Y&,AI48jMYQ8fVQLNhMaiY%c0ccj63(K2K1MmNil,Td,i3ac5fpb0$A-B3kDK
Pp,YTGr'$$Xh)pGVEqH#`lQ*I&KF2DBNUm0h!Y'hV4h@m[eC'*9jk1PYeDZ@8AS*
@+D8I8@eCP0kX1XXSRIIf*fde@cCGp!bKCGXG`AKk%@qM-VccZ&3Rri#+6UR1,#V
#j"A0cf5l)eMXl56dkH)0kd4e*6Q8Ck*aakS+(LIl['%TG'p*($Y*pcPClfe,)8Y
*0TQ,m-C9M8mA'k*5XkQXL!kDe&Yj915P,"-pAdTl6AM"DP(`[IaEr*fY!LbUS1'
Qk"4i1d6qcm[Nfj'6P)R!qC3*BfP4*K8FicIiP!N2U5k6%PBQ*Da-XPQCP+*-1[L
@5@&eQ9`4CE,pCR@46'C&NLf+a0'b5$S,GH+pBChr0bb50K5*ZC&UXfPF,ZjH(Er
Ec#C3eB*D&j8fI$ALR9I3lrNS+Lp5"abRqZ98@85(q9A+EU#$1A3iPEQM`D+HZN3
eVDQSTK!i4,AG`+4ih2l@e@ZI24j9i$X8L[88RZN$Ee[2RkP6VG!TbTcfXa5[rCP
FY5*H,bQEJ-VCATib8AbB+"2FHea%il`qK9AjNLIK*3Q6R$51rH3b6XiHSDaX+M!
4lYXl91UUVKJ-Y1eHfb`5rR1dm*q#E0fmpVQJk+6iX,NdV'3ejCA3Z#+I9CUpee1
ScTQ&5d@"Bm+$32M)JPXeJfPh[8,H-MU3!#Xf(8"TqS,bA1&IPf#fADShG#l!fGi
06kcc&r2J&lPpU9eXKek4$GXTEdeeiL1&`TfpSC&NbDUR!(G@b&@[4q!aV9Qj[MJ
YBS4L,r(*jL*'Z+jDkL[*DhUTY4Ih8(Ljd0a5T&fJ3%P92Hf)UQc"ajmlXqPd0Zh
*TPam5-UQ8Y`aUE!9-&IPXQ,[5q-(E6k$9Tr"FTr"FCp"9V8Jh9NN8A&*PGF1aH+
(5cG5FAC9$Za(AC`3C@UX4Y88R"FS,GI#*DdS@l@jD%bf[a4aS98N@A4V#Uic0Qm
Q"E)G@J95Zb0B1Eq2DXe8V&BT&BjE3#S'1-B0G,KK4K$Albdh$GH[Pq#6E+e[6DJ
9lBFSI,-UcU[1bQmK+cqFRN[,5XQE4AR(D9N@Fl[cKG)KiV@B8-C(UM&DaLHSBkB
*4*IkUal`*Ppm#6UiBDK%LMGRq4lXppFmq08d'VI$TiA6"N'+[GiR*5ZhaYQcUK&
)Z'9#K+ZMFIBBPHA5SbA#[HiTTB1j9&4#"me8T[S,!q3P"Ulq6806I3"Y2!l30Qd
b*Kffi2c9TCqH92TT[r3c,D@IGS9C5Y#-Dd'E"Rm'-LRqjbNdc"RH3*9Q1PP#hq+
"E'CUb+)Q,c9ikG"&j)*dL2HP1f[Td!j+aDL%'QVTC#e9eMUBUjM&9"AG6m4h&0E
Y+EkLX1lF!PX0-FEC"EDKJaNbZX!@B[Q9YR4rdBXiXDADlIe+M,l(Ph"FCh+*Y[8
B2SZ+DKRa"`R&rIlY'[cEa-L*QR#SD+Y2R4EeVNj,hdH([1TPq*'cG+#@5K9kV)4
+H9G'3ZXS[f"djiZ[8Z5[R99eGllUE*c[dfCq6MN#X-&YIG"!E6Y0ZHRdG#kC5ZK
TFj@DIMqhZ"U3!-C$$Z"P0ZE5@Vfi*IY5r39k,+ID5H*aLY@-a0bN(k$Z+R&9lH[
QLjB+Mr+"d[R4I!QCUr-XF(k-fI9'1e%9)dZ18YjURab0(@1'YD$6X"+&LSq$6KA
B#&&(cb0V0Shh4["!Z+1qUXELjDA%4ARH#56#NDm4bmdVN5K[qD5RS5accDS8ZDI
2D4b2UrBZ%h-km(*j[[JmjN019@FdSR860i&2FF9(PI+8kYaNL0rVP[&HeEKJN5V
F2jIQifY#CNL&fYEpdXGZ%q@ED1-C5Pe"2jC4DK(ph85TkfQYPq,b5+fPSbDkddZ
9*A5b([929-UMYH)JVTE@eP,U2RVM'!99dXCDbUmPYapUf`'kqSTfmf,ae9MdqJ-
9,(TT!2P`dEX!9+MSR40INd@[JrL86#$KV1eiIcSP(+iBC@*8cNDk9KJ[HJ*%ha9
INeQhIjA)62(jQF&[R`*R65qIZ[Er9fMYrdHK0JJYH*(-m6@p+ZB6DIR*LZEGMTZ
k6U[D9pe8cBYE@Vc0-2Ell#eQ(S%9Xb(#("01Se6JVdp2N!$&R4'+K&Zb*+GSVCA
i`ADZraA"1AGXmcYmPV)FaLh`b[@5SJPDV9irH*G1J#raANX4ZmGVT4e-eEA2d,l
k+U"U"c&IjL"Q&Kdm9j'SYKEFDUM[aR-kkJ,U`haXD$pTFThc5$3TVR%[bkYE*Rb
I2jqDP"khi%r1CP1fLBV18%%*M5j"bmdK1'Ba0[(Y)E0U*+ThZYHC-MC#Y93IY+U
Bl6AKJ@UbPHDbUZV&V*`ZUPD+q8,M3RAYe#j9bmV!&(p-3jcqYEDkl'YY99p9Hr3
SCSZRk0TQ60h*c3%3VRk,dI$JE*A4j1!Rk(cLKa9[H`%[1LSPlK2'P4`4PUHcX*+
&LbcdBQ'4#0mAXA#@K8B%lIY3(@$+ZTKZD9UKDL[kUq,Z9@h9BKdhJQ+`6h@qYCV
MVPRE@ceiP-2j9M#2+P5F@ip`!hI5ESd@dIEQ@CcChlb)j`Qmf9lBrYb&5d#3!'a
r-`6pEAPLN@hP1UlrL1@hp@&KZ!JICB[$MijKX9*9qbK$e3jB9IY(%+&pp+jZrfJ
f"(id&mp*f+jS"`!6fl0eqrC+5-9p'pLj(I1GF+1LGQ#bDYpq$XcE1f2VpKj!KDZ
fR6PJFZj-jC&SL1lXMQdlCiPY1`IVp["kF)B[ejhK#6cFSfMK[B'FM+FQK#rLi3%
&&j6%!aUL,%"&A4BS,5T%YqqSKC3G&L&PKd[(P5E@ABcebP9lFKNd50k(,FNZ,Zj
V6`lAlFPT!KXQl-[#rL4X0-3N,aB%5$!*%3PRG5h""6'jUKC8T'Y"k5VZ+0+#jZM
f)+6H(P3$ECZcG([cIQaY2XDIFpLDEf)+Q+djKCp`f$E[i)FG$(#@c8!Mi+S3fMK
CeaT"XQAG9AY6&J3dRGDe*Ua5Z`0YQTZ#TkN28,f"LJ22)2"X01[fM9e%lhEdTL-
T'fZiT9Da[Gj"E(JGmNBhS,9YdTdCi4b2h0!bR,Sp3fc*Z&e(Xeb`[91Ufpmj#Y`
lm'1M8Imc0qTD*J!fElKUcjb"Nda!G4lQTH@M)C+(`XSrUY[cih#5[`fpCY'lS0[
b@6VbH`)h4H"'S@F&09T"CkfeAVHhZX4`Ul#C!QF(VUrSpG4a,8Z3!(F6!rT0j6c
FBGq8J,00EYfqk@A4kiAHjk)(4I,La#8YX9a%NBi,@Q*A4*S!RSM1SL5G%Cqc!Sf
BMq-4iL!QLah%('F(-GYdCd`M*TmSpKJ"J$%!TKL!VM0QVUJmGRF!@(HkERF$G*h
Z0AjX"X$DE4&(AA5RZjr!DZlTi%S4b'$G(QX'Hkb&XH1q)CFp9L3f0N+JireS!8k
aR`[-Dhj--$DRQA4l@S2S(8G["hM5GSQK8hHQc4*UDQP$G2X@SG8@D,AP#)"U5lK
)rjB`(9Hf@,HhlY`bQH1@IQh,#$(a&Ui,d2NMjJb1`a-e,L`(6@e[%`Zp4,Li6B4
[D`Aa[KAH"jr'9#d`Ahbe41GG-Dp8&epR&MUd'lM9`i-M$Tp6'#bQQZSfV4ZA(6C
-A-C@qcVGCZm[40Q%3,Y0P+m0YF%f"$dRDZhj%Ki1hFlEG9ZmF(+BfUME3LY&0l6
,eml(c[!kN!!cqh2GpSJChNR,@U2EXMVc1SIfD!pG5mI0dk8E9@IZ$$i2I)Hf`EP
#fj`5AFYCMN&reERA`aFf+0VZSlTY0kXXZhZJ1d,8X`CiUi0PUVh"$@dDi0HpH!&
YQ)c1qkTp6cRS[@HEX$H&l35Q2Hh@FF`@0@@S0YN0-MRPGM`+c`R`G0"YR[l!D"l
F,h6JGP8V"N81#(U9kVC!2`&TJGIi3[#D8h@Rq3,(`e@FjKlm8+fLM8'Z8!628iZ
jl-[3I#QkUYU+@$8Y`N61)Z3P"AK`bM+Nkq!-G0#dH"Th'pAH9,@5F$b1#XM4m"A
CA35CXkI`3`lE)mI&i"%hh`f#jH&49Y"Np%C-AK#ZPUGE1,MXk6-",HR-GcpH!Sc
f1$j$i-%Ub5J15epG1h`'ZjCMTS+!!HIK'G`S91bj45"$,LD2jk+fMck'@3["3Y0
$@hAl)3'IKbi)+kV1SGkk,8H8SbeRY5MkR$BFjI6"SMNc'9T82r[HA+$h5N$[h5(
3Hp[iCSHfGl&ZUemZ%2@lK2ckIVUcIJkVSI@!YV`dc)VS)Pc"EZ'%GL-ccS-VE-M
NmabfKK3!TQe2"!VBYQFi80Sq91Tp6PkAT@Ml"qZfNfe#mXRh19TK*i0efbN'RkG
%eUSp"jIpA$cNR9CYc`NplDIKSfbRdBCbD+F[kYVT3DSP6l@pF%TXHS&Tpd*294Z
$E,F50@X-I0"Cc-)G!erm6p5`-Ae8l8`B1ZG8lFi,k+$8MMISYZ2-[akISGZ2Md3
5EM2VYYZB(VH*[%3V0qQfmP#"+1r1%)0el8q0f)m+Hl4CS)lL8kTjT'Sl0P`!mSP
XhAELP#M%%eeeQb3b2%eU4&F![%hU,)kNJEUQSNPUlUhDP+f#4EQUfa`Xlh)&@+J
AD"ID*fC!X!Z1fh91P,eV#R1),T&ekAJ%KKP6M2A2dGQP1Z0DHALTiV`[MBIMd4e
(LN68MU"%c#Y8jiDq2"aPYQ'3!'jE)ab-YJEYR,8L+lHYAFH#@bbj&UdK-eT*kp&
Q-H-HZLmZkVB[@$XSPE8T8U(51&53!-m`XAdFDZIbGQMY('@YRfB@fJZ(pIemSHb
+E(i)+Uc+AXFV`Gj(%GqFabQUc8MKN3iZapRNRR!MYN#Ff$T1C!dfFk%!&R-V'p3
)JSlCL*U,XKXcAhIQKBL'NMBk$8q&3aBB#"0e6hFZ@mQMi('@cFDRZc)q$'fS!l9
m)9!(DR5RD34$&FaP+1pVZRB3,m-"6-8[KBF*S'D9BDTc!*qDRd+LLTfUPShPLVH
UcNFqi!Y4!E0!#`rQpMq+jh9ii((6Tk$6'8m(!J"jS0dKY*B1S9RRb3(FC`Zrf)"
QTpbU1[HGC4+H4aY-KRNH,U33,Z)Nh%JK)2@83'$5q!X!UFUEiZe)YGeT%K,Zl)$
ApAM9HGXqPL(Hj[E(bDcDP50r0h)"IHqLIYTqRb(mlc'i!!2PGD*'%GrYe$J!''i
*rJR2*m$0`@'UcA&-9%A(6"&Fkd9fiCULfr54SKZh@VFGBHli5#5!JV9VeqF+a(U
d-El'$E50UQeGYS#DGEL&HLA!iK4Zp9@ee$J(VRJ@0V[le[6$lr+-'G,+#V0maS`
E(@YUDJCC3kc@J8lR9+YeL,$S[b(k`I0JlaeiSa9-09CV-%-1[h%qe'Sp"d4mX$8
Bb*!!qGEaIb%eRdj`r)hrT)DG4SB))BY#@!baKV4M[DA9L'm@ep3m8-08'!)80,Y
rVY-CiR31V1!B1+AP'"[ZVK'LlkQTZFGZY`qT@5L#3#h`paMM[B[Yl'p`cIe1Dmd
3ra+$KN,#F'G`"G2Ghfjd3X$G051`IA"0"IVqNFlJQS&1Uj-*IGJTD"95-bhXR08
j&a+GpK'-,(Hm&RTjZ"KA)9,mHraU,Q$lr-Ym*lB0&&+Jr--#I3m8"1,qlm6S)A3
IU0kj825qU4M1VHJ-HPJ`49BY9d'X`AFXX9jBIY04943SpI3HjhZ&2GRaMNj5i`$
TJV$RT0GH[ZH(5r'A,X9,H[bPlRH`[rI$`X)'$,dFP[K(kCdVYpr6mIV!3Cqc),N
lcT&fMZaicmKK`k5Y,#5IlpSP,+ccd1$,!kjG(pMK9Y[9EVGkGlebrC1`-+PjbJp
6TNM*-+%26d(i(B*d)FcU[#VY4(Jb&%q+hICfa&hr4rqp[9H!Fdd`!rIIrVQ#h*r
Hm0B)l)e90lSRrAE)Dr%I$)Urd5Rq2B5V0jq`IQbpFG9T[I($YkG'@ZIH@!AJZ2'
KdhVc2IXXqf6l2#Z+1-PUA@#ecV(qf[lTjC4c6T4IARRX3eFNj3(*eI2$)AF2Z9[
km$F9REmR2[0+m+$qL9Ia8ceAVNZ6H`k58U8DP-pD88Kr(5)p+`9*@lZFPkk*-[K
@@*YGfQ*reNlq[pXNVKDT1B6C[2'KSFq'KRCliYc,k(CGqGF"LGFPKl$V3UA88(r
i-,4AD-r%kkm#r9ES*iQI*%T2I#QYq%%0501N*-JE*fAD`SM8dfeAfS4m!!!F%8&
%3e)$!#la$e80C884!$&PlN1rE@q@19r#b`cjKT!!Nlb%1FG-XZ'40%FP,PN5jc+
5X83*h(c*e'36bC)eaM6PHR!a-B4S)BB@,*G$!k@RmIN-,&#V(S%"PX-9,cIbI+c
eH$NL&+5)jECFVpM8IIjqllYN#CCblqPprJ%ETLIP34!%3"!!SJ%Ajr%4R3i[2Pc
)A&#*C)3"[[jRd`XYcXEZ&MlCl3dq6TAmHUVmBRcKN6ZGlrhpLr83L80DQaTjGMT
X@@KbqP66kA)N(6J'RMM0K&4mVKqGCk12FI&MQ&K9#-m5qeS83SIZB`A0k,a$qr"
4,AiNa!qrV`hZ-G(0)cQ!JRjb1$Ri6PFA0a`P&b3V+-fJ5NLNR$MFkc!1@Ai9VRL
CYeil%[V[JP!"1DP'ErRJQI@T9Qjj*a"DZcG%VN2GGhYl(4RAMqm0Y2P@1T@0HfS
YmlQrqmIdYr&#pir2lqIEqjarGQL$8rhNRLXK`dm$dCa!8pQ8&Ap99@6(jCIF[4i
dpk0QfB([39D`iF$GeFi+kkM4UR!jLek6SE"IDC*"`@3CAUhaDVaL4Akm2MX3bZ@
pfq1#+HJjS`5(f[5*l9D+A@&Y%m2$M)`b!NIp$MKXSC,e1m)fe9qrBiLVTZ0lI,&
!60h3T)6EI@C6IYcEq*%Fi3P23KEiCakK+4,9X)TB@6Rr$%@Kl0fQ51pHcfTeJj+
Q*KUbLK8BemCdD1lQ%5%PP3QYr,14X%90)'PPe3D4[)ZT*X0@-TF%)j1DB#!96Kd
Nc2cD'k1Fhfek!b)&T[+k94QI0rV-i4jiki2*#QSi"UHmA+ZEjB!b*b"ZYAJeFAR
jPhfa5@RirhMKP*jeaC0G1'IePIZZj*DY,S#EA+J2lqJIQa95ap[LlBEN$VVAFVA
c@4mk`[*i+LRd1IqNp9UNC6hpRQP-h`VRp`*Xp6Qe$@QX(L5a1ZYIm*R9$HS9Npf
6m2D'cGV%kFeF30&,#8MV9KiEd9af6-YU1a*p'Q[GjEh95T5+ArE*50beUhY6%Ah
``@A%R$-%LM`d56b#Vb,U4E)[,&iDVJ3q[rM55(&DIDNq1C6I"LHS#QE#a&Xb8m'
XY[ZXb'TDMj@IX9+U-UQNcTDK-8"`C+4(R6hb63iF9dL0)EADkiL246fQJJ0,!k%
e"Eel9rekZ%*025q((%631BG(8#ZL&M9eG8R9T$"5%4A#&GEYhaB8ABS'-0KA22M
FLZF90UMXh)UVP9+,efKej[p9eZTGEd,rH[%aE%r&aTpkfha@EkI[m(dA9&2p`l2
bND+T5%DdNCD4C!85#"PF4M(8-S*8`"HTYKGK0KUK"28"K6DLj1*S!PE3aA-jVUh
3Y32IK#X!2'%N04a6Ji%fEbRdC5N#8recMh`)-K+%*,kf3MN3HH$A3a@Uhdb*DJj
a*G(!%LS3b42NTT05B'TPmej5409rAfCcQJ%j8ffHDUp90GY[4pilmY5`ck3ZL,H
'Hm0l,lGcT&29pG@#"&5Vic)T9'GT4*TQL3%Tf8$)!k,HpVC*k3K$a9$EV#a2M,N
`H042(`)2S#18%Jk'G--%PlZiQ&+JG-5+[8CK(-N%PN!3L&&!B[`l!f0Ifr*m-XK
)*K3D`%5G#B%TMhIA)CRRK*%B-2'HrRL6ZVrAr*`@#DEbCjdMQ5DEaam'F2+#EAE
H*"Vm(#k8CQ,k'ZRp4NT0@JSMprE9Q6"N*pY-Glm5dHmQa%%*$%R%Qd`!5Yb3!%C
"LJA$rpTAjqi[(U)Vhp%2F3@*2Cl!6c9G5M8k'f(dE6!+5#6'iAk'FGP'e9q"(0l
p%LEJAGT*fP`-ph)N1hQ`qmF!aPCXC1Z1IPT-"iaNijBk(+d&Ul,L)e5Y5E@"p94
UF-Y[9KLh&L+Y0,LPES9abm@9,PbRapEi34S1pZ&JmVMcJc3kD("ZU@P!Klh3YZ8
9GI#$Y01Sd!D,%85CN!!3C2JF8S-lI62HQhNSE!DkDlBYi4BNT!+m,aS,@f%iMP&
DU$DQMr!X$@MZhd#JfPJI4K+VIT)8cQHG@-L&aEdR&R,rSf#C'QbjC((Y(fbjdI,
*dik8B(%pl6!IQHq(1[LeL611XF'@2CEr@$rBdQajTqk0X3V,Ip5p-4aFq`6p(A[
LcS*9EiaRTIc0ADVe+i4Mi,8"6#ZE1eL&Rj%aZmHX@J%'cFEk`4Q@hLk[0e'k#+N
Yjjm8#$k$@h[MAUq9dVVB9$Njk0V90X36jiIB0PG6!K'#BIR@6R8Qk[9Ta)84@UM
DN4P,J(fTT4[r9Cha@FKXP&BlNp(C'PG6Jmj@E&YQ[,(EZE(j&#ShAMpkbmEhk[m
rHe@,J&a,bEX68U!$3l@NF,kLchREI*10G@He*CA,rlM%a*Q4MQ&"*Y#h"iLXLC[
cJUIX'pFXl0Til&3(*MQQ@l[3XV'CTY(1H5S+93SSJa[2j#UZ!JJYF0Z+l'UVX20
ElG&YqUNrhGZ8*'"!I"Z1k1l@YL2F9"%RYaK9j0AbJAi-EUL+PP6XKU+B"VIFKN#
DZ9DJ-CJd@`VR+"MJN!#02,Led0fIENRK+"R$i5IB*()8$qXq+CaHE"X68T9)RA-
0('eI)Z(j,edBERcr'@,6jpcRTL''!LkKG*qP)Nf-p(JA51P'mq**GN&CZQ#8"rG
,bb!ZR$$aUAk3!"E!G456AlT5peNi!6G0'5i$&X&QCTTUD31TqY4mhPek%k26G%K
U$S#X1'8VIGc6Eb"8%K)YK6SG#BT#*jDr&lBN%bdR%4K330Z!Uma#NPp'4Ij(k#L
fh"E0J4(CVp14Xi-BY%54lL4(2"S[-`l2M9iNePA"BV1iX-8TDRD9$ipc-P35X(Q
)dX&rI)D"S6TH6D`*&+IXcYCS%d0+HjAV`,82N!"S!"*bFll0$2RbA@p2pHXPB5j
5PdZ1mNCdZ3E$iCe4ph[5-bCK[Lq+jKZ"4+k[G4F0i4e02$!%dp+"cM2E"0-5ApS
@55jJC-,%J2L,qYX&G$5CK2JB3)$Mj2l*ST-hXqdlL*pG@Ylb!JbU5La!k#kiB`q
#aEG9@%KQUikC,4'P$fD4bH[q@PFhHZaJ&S5pa3rL+VURZl0e6d&aXTkU4$1-5"j
$k-'Ri[9LHQBa$,2Spc3e"R4rK$!FLr[aXRLN"+TKbM2kKK*'&QL[hd`3[S#D[&b
U83&3@V5b+$4crmU%'h3eRhT0[Sk"+mYq04P@0"C(BjNPrb(E4-68P9e'JQF+!&k
"N!#,56mY+MVcqS@IAcS3S+90KbeTLfhM%%L0VDBZMj*D+#hY49FjfjAYTk9,0bh
lF$,Q+r-qlXZ22[Vc5ajKS#EDip1%8D&f$Q51G$cqU6TRP@0Y*[dYbQaql@k(fRR
mdNKX9F(DeqK[d@[AC0jGm+8M3m'f8+TV,0`j812ZMeBR+b`hSqYHVKX+,)#cVZ2
i*Dh`#pG5VN[T#eXT%Ljah9kE-GDpZ(YaVbfMa+5HharMb8(RHM$Ce,Gm6SiHL#J
3i%kSCqJAYf`qk+(0KdT!Z%D9eHP%"kmSie`b4A`A#5lcN!"i&EIC$b%(3Y-*(V,
c5S4'IA*q[d)6R3$6E((5F45@GKZGi@kR-f$UBLM@Tp@m-pI(4fpaATe-a8"HF&3
D0UG9UT`3U"*%R,$-Yi(%15%kQ%K0b$L-R4FNaV&&B$FG(6"ea-2&62c,DH!)IZc
hfML*BcEqe$!DPDVHSSG+6q$2)X+dL@ElHC&SImj8rd+!dkN#T4*k4[efkVKT+$@
qS3,l[#MNF4MP*QFi`jE#9CPMpLe"5QkTZeSF!-P#Qc2JaL#*JG%9'(3'U!RpZFj
,#Am"+G0eFQM-,frJFRBYULSQeXNmeDjL)C!!TjiBr$XB4&qPUPaCUK+-A(D'DIQ
k("PLrAfCBD0cq$TAG!KQ"G2'56!4%#J630E0G9mQL"Xql8,6%Na@1BK&,a&PeHR
L0djSj+iJRaa@)pCm,24pNaEMFMlDq$UM*KQ"i4eia1P8"rU0224H(LG``"ReC`P
P3TZpfETpB$!fQ6JKq$Yd%5KLrIF+@-6B-fd!@86(3*!!+!&"!Q!CaL+E4jB)(HL
2mP#VBF!KDF$R*3-qGiEp(AcdHdAH%%f8aED5!Ld%$"YrRNqRj0#$'h3(5cE82j(
#KQl3hp$IdBCH[G)0p@-MapIRBP2Rr1Ff&D*)9la`61MG!(,+M`6A9pk9rEfkHQU
$0fDrjIfR8Pr9F)Z,L,YL)c,QP9`[jEH#i6"INCqZU*80q4BA*AGeZX@1D%)kp%B
@1e)9&YF)1kKc$!9R&@3)fl+-BkTJ*G(F0`+%(,%FAK(M63D%9%SKj$$8-SdGK!T
jEiIRNbJ[Ia9!mehhVJq[Ima0G@c+,2X[(1h#N8eI"$d&%H,pq[@$lpI,Sj9#aR4
U9)d43,Zee3*q3PqGdqQUZA@8MSfVp0e%e0c9-Q1FT!kT'ZR09ir`3Tl(AkB!U'V
Td'H$B6HI5C[@+*@cA46NpD8MhYTBDFQIL-KG1Te(+%5`@FUZ94Xb#i2hE$ECde[
4P8-N5ITKN!$#!reJ,q0c&KQZJ4S+Bd'6mS*aFbNRNKm12(5+1Cr2,4LpjAeA'H,
VCVmplcAYjki#"BChYQXSG1mVCack93(r[EpH8kSUA(&[cI@P&i8qrL)Pe95b3!d
&fJ`Z0YdZJ#YP#(4#UN[Q5REJj5!#F*5lM(QFZTVQ#ejq2m*1C(l(er`EFfK6Kfa
AZ"%Z@RkMZS#DejrVI"a1q&hH"9#9cGVEQq'QI0$'!QdLmRVH*SILY8cNfq@chA'
1+XDaU9EMqrAhjjrMdB4d1,jHTSpb*$$+dE9jS&"TF9r+(SLK'aNHqqS9)3k"1UU
Na-'%#PmjVKE'HA3SC4pLbalmb5XKh8%6AP"%#&49PfH(a[QU+mA6H"jP"lMH1-3
GHCpqXl#3!!00Dr-BUN!9E$iEa1mdU*F#pG`[UQIj$e62FS3118Y8%i10FdN0*F!
0FbaII`,'"ee-kNMSUPd+SC4!3BKY-VdUN!#)R*Fk&I,hr40q$J64mPE%0dhbHQX
AJIZ10*QDmpIdkKIRXJ+8K4@hLBC+6N@XGNS3hC&@b`h,5jXT,-pmZI)5P[IXTD-
(f0',M+cH$Qa5Q6i6UG+cU'4Udm[RDA"ZBNd"$9r%K[qrMcYF9LUX(-H41abeR")
96H[0h**QYG-5+"NrQ*I(I5D[()ephmj$!aI%Sc6M6FR%H9*p*SMqmaJe6%ST**V
$HHc+pf9fh2*qmh@Zma%&4Y[LJ0LKN35dmJIF09DlE1HA5E@,lY4h`SJ"QG9HKKj
K-iJMd9Dq(f58ICIL-!4fjPT+-bjLb5)$+C-L+5bm-LPldq&365)T"DHFQXlP%E1
T)1lAV1iYm1a5cA$*lFkDQ6Q3!+lp,IBp+BaJ1C)aekSK&T,UL+Hd0YIfH+[fr&`
(81eDEqLH+jRX-bcF8j2QL!U'Sj(32DpYGi5$0)QkAChYEH[Er8K(iIK%jmb'STa
qMqGN8Fl-6,[lJ(Y("NY-PKY-+!4CZEX"L4+i5mRChR%Ejf8j8!29Ci8$M`I,PRe
BK%G-e-l6lbllG#N2#UDYA%ED-UDDMhrSMIN#A(lJJ[TC-ec(2YX4(SMXf+Y'GML
+e[RmQrDZZM!F85[[bjceAB`AYDVB$M"bH5fc@RKX8[#CSmT3a*S9&3*`cjrEHf$
2)apL8VpT#aFm!P$c5G9kqJBN4Z3Am-$'iXI9K43m5l#"@jj%r8bSiQI0@%lA8"e
Ni(bp24HS#2HA!1Ih-XkEpL"'(pf#QlPB)2#,PH5#FrI('pIJBhRDdQU%fEAHd`P
`YQECSYFMIGE)8Q`1aYapfL85!M63+YHjF(("``qH-D#G)bA"Zrfjl-Q1`J0&fKa
NJUe)#qG15T!!rqVqaeiX1CQGl8NR0-@'aF,cZI`Y%NiH5G$A8#!aK93l["*,qql
Fh+,XR0%$0*+BfEpD*j9Qja6P(Xe*cc8%ILZ5Q9p#JEaaHIb`j"KeF#3#Ph$&4b"
*5%#jGY`%*k)RKNGCG!$dpE6JXTXVY,Rape!eLaPfJ[9KQ+-RQffT8e`b5)YKNP*
i68$DYh!h(i$&Q3pGFk15rJSaif+HKF3#Q%@cYGAX`b0@A+h9X)qGiNHIZ+"GV"M
60V+2FA(!X,M!*hj-6p'V#H5KDILhc&bjZB!Gq0P9%VL)R&))K$$eV'(V#%YJl#X
Ue)2K98')V4"554jcP8XArE0LiAflmA,3DcBVc'B&%bZB@+'6&6T4q)-dcf2TH88
pkHhZ3VEV*`eE)k@,#%'4'*V2*p6HF3A*SDI$jMrFbLQF0B)f-F!G@4[h6L#`2Xr
[fl$K9Yi8B!+YDfrFrhV0@5YAAlr3DepPKY%+C6bJEA0PaF0j5Q%P@ec,&NH`@(L
paPH(T9fV1Z%)Mf6-8eNLF$q2"bEfUcb[XS5YmQE0kc83GCK5e*UQqNAf3XDGkSD
AHN#SfCdjXJ&S[er0i%)*XRpIZUdlAGZEFr6!cHfj4ie&$+lVHqERT[r)RTkG!hL
[$1FCQ[V5JBj**2L!S-J(F*NTY@GR+*m5QYV+EBlXK"Vj'c-@d@SemUC$+Sc1ifV
BJQeUXVKf11)Dr,6#V%FX$SZ,EIMZ&*`&DN`UU"VT)h`cRlMZhC*K#RiDbGP3-XK
DGBKMT-4flMbDXAXPGmYJ@iY(3F436#LHl#A&NcdqJj,92Z@&i`c#SkK`j2lcV+(
L`mp(VaN['iY)#XTe"N@,E#j@Y%Jp&+d2VeHi+eJ@[$%8#ldDZK6D&h`S8XrqaL*
Q[$*p-VRH92X)VSQ(#d+@Rm3i(U[apc9)+S6Q1)qm5XYJdqe`1[SPm[lP5j184QY
G+B0%Am08[kKd20)U63-Q!Q-5-M!K&NQZfUY1'CShK+3KR&%6IjR(3`&-1`LQZR)
IR02iV%CMhS[!D)3mN!$i4-b%DrlL-Z@RDhirPkE#ic!GI3fpq92pfFG%dm"$[aQ
5'3RYqL4iE5@9*9IcmC,+K+%b8&aCA6+BUm*)T(KkA-IlPL4SI(*hr+TJ!2KX!"i
&9bEd0U$D!)lJQKm'`"miY*jYA@LP@cId&X48kl'80P1m4,#2YSCYab)DAQU`l66
#eV`@Y9hFXQVGlGLbDRaUG$GKbqJ"K*ZS19S+D)Q9!Ndbj*cIkC-r(Z+3!01!Vp"
$e859#irm)%B$"T5G[q`BNVejB[&9&BKiHK%239b*U9dQ#"ra%GAZG5ql&5l4f0R
j5)P"&"'[3-aL"$,@e8`c9N-`Q%1P1aa*N919BKI,bd2Gl-,rh&A961l)rK'%!QB
T2ik4G1GaJiLQ-"'0ZJdNM'%3`je`3UK-M)(B*CQ@K`q+cQ4+%LS3621PcR'E`lL
Tf,hV5%V%c$ij1lYA@h6J1Fpc"iiDHN-)*q0&K6-Rp3mN)[E3Sl(NkS6`8$EB,kR
U`rABU1h-SEf)+NC@Qa`3T%6A-9@Gh8mN`@N1ZEDX4fq4VH-B`ZGCGf2pGK5LjQ&
E100V`YCAieTlk1#&+432dY!hEdV+M-9`-9-+%QI&,k80-$b'Hf9QCRGf85'ZN!"
60-QPlTc%DI-m[Sr,jRQ)-IIfR6BBGR0kGYbdfkKGbAlNP3K6c,$la""l*1%L%Y*
0(f%GbL)Br5hFF[PQhX8&[-`mKSG"bk"q3"pe#%d0+*md*0`%dXY+YZ)aL3M,dHc
*M+)G*94r,0ciB4ZeQKSX*2`er4XQG"aQJ8aK"m"e"UKL%lZJVh9R)25*U!Y4V`Z
1CU3AG'F-MdV5(bS@Z62GQ6!$@rN%2AT+!eVI'dF+68mSV(h4C[6&'`8E6aLR8C!
!idfpYRJB2k&SpH'j0,hBe5N'*Kr&L%Pd14+Hqh`prd$(!-!*[1Yb,lG!HFbA1lN
l+Z$6AC@S`59m!JVa`iM*!!&jF3mM*KZ&UAJ#K%cLamV8C690bFa'J(IT+ih('Kf
6,Mb3!1Qc*"A$!JPG252*``b%$'($265NbZ8d95l(G8[)$CZ8L`G1(i&!2['246c
KfmSYCjF3`Z!&K)'`fL8V2-")D98l#HaRdF$!JB8H+0#YaQ20&(b$#KMQeA3S6Bm
,h3dNmeZd3$+*[#Ch[k(CD4"j'6**H*Cl9I6Lr*PbhQ2j1jj8iCDrkqJ4`5m!cNQ
q2jR1HlJ0V`(HKGF8Yq!9jHENjc69CH'0QCNFiL5T5M*"L-H-T`DN-Y-T0D3I&pX
[4h-1c#Idl@+#0JC!-B&q2&k'9ic5I8bPRarSaqCcK#'9)6hriV#YVaPUAC30e6K
!2,KK`Q5%(VEhK2)%1#'A3B$m&+lAf%#rTp9%S$J#0`dq[*qJ1I"EUZKVL'j56BE
Qr@Xc-pNr!Mc%K[!m&TJK0Gq*@E0SM1B9'b0af'3'39%d%0)!N!"pM)jVL1P4N5Y
MDeMJ(9Xj`aTLH&6N5%2ZTP58#HUVfFI-C,QqQG6dK60p"M0jGfNcfCZ5$+eQ8l'
C$-p)SB#r&lGUCZR4bCQM'4RT"fCQrZpNcQ5lH!efj9Qdp2KNcR`$UT4H3SJZ,GQ
pdL@UFBqeVi%Y3@2+q&cfdCbLUbcC+5fTfkeRl`aV1(0D1&Zd,`%aZ)#A`'-,,5e
D-Z*pZaI2c13@aCml#HicmBcdT8FcCY+A,J%6,U8GdC!!U)@E43dNH9MYk'j!H*Y
-+9f@X0XGYXYPh1eCEldJ(qCf6iKpl"3rmMa0UVe*3G#J'qP44")9$`3E2+j&M36
QQ(XTMRpiJG!aFNUdr(*"2#DQDRFVQK8IHGE*VI`Pcqej20UN4R)6NR#NDE88@0k
jaU&Y[XEK#q,TXTFmUp310Gm`"4Zd5hUC0*i5PMkcp8+da9SMNTc!8#)F&Bd8e'J
[AXUZNN$P6QN"PZiX2QE,h5cYDr8dEMXFhaa96*(L+dSXFI"A`j!!2aM3KHRE$!@
d(mdY%K%Hk+RG5D'b#1Y#)!D&-SEQ$[3MF(E-%2jP3$XfB0!j"UGjLhk3!+9BZEA
+SQqV9(aDTH+5SB,%#ce'EjF%X6LGBbci4-'2M&$"NN9"kRSedC*$&T*Bc')A(HZ
RYr'`Am49N!!ljki5`V84Z2APR$PhEhcE`CB8&,XBbI"CPP#kq,S6Ge$!A+JEMG'
"rY)"[pr38E"8X+ZA"kZ'Zl)'*!30K0D8`E88aVpZ8AdG3'@rYm1,LPRj"d,H#2k
P"F)ZNNJ!mrGDU3Y6iJ,%$K@"2C(pR)@)Y([NKp,q-IHbRBI4SDUSM+&5-19RRd[
jU`4ZPSLAQ&B$SpTSSK$*F0MFm9F8V0RP*L[Fm4U%3jUR-ZdhD!qVIhRc8c6Lc&-
AYQhKi31#Eb%2*iQX"5a&%QMPTM4'PXC8i8P!l&C(ZLJ8m#cq9BEDq@5TJ%9$b!!
4J,!"TC!!0fT-!4k-,`A+"Z06+)6LV8$C4S!eP+5T&Z)aMZ8h$0aKia&h2aC%2)6
H)8m+`EH*!)i(EqCKASCQTjUX3+K#Q58((D3XEG)06k)l$4F'L8"&+"8kQC!!JL(
*CBL&ai"Q#!Si'1TH`K[CTiDpZP86#A,5pX)SI'2HfZ&lSQidmje$GHq8MaBqXHp
hYY'DZUGa&R0rF-MccZLqiphEMpXq4-h%BapGY0@-*Q`Y@D1h2PmlqZ5Il[e`eCr
rGYHCLaF[(RVrcY'lPcekl,Y0ccbH[rch0VYYik'k2EDV$bfh04bUXh8de$cph5m
hYcae[1'0RelC#J!!4fT"4%05!`"ki""9$@4@!4!a0Hj&rlpYcM&A'6,XBUcq-TC
P%CphSBQea1#B)XZ`DUDPKR*JTE"CSV*$2&i2(fqkJ6a[J1C3`NRTZERp%TU6UP3
PchXSAdYb$0#%8JlAT$3"5K2+)5QPK()**BD+HrrqIVmpViEdpRXrcrrhm`!EVDF
S*i)J#)"!0-qALNGe1Vc%j5e1"Y!I[i$-9E,%&a&J59Bq(8`B4L!UPD6(NT,r[k2
i9#8p8,CTj[@C$k@dd[k5IG**DEr-l&%B@AT6&C3aGFb`1EKG9rC"*'(iH[V4H5&
*da@c5PUSD23C[N!F2b%S-d`c,i!&*S2$BPB'Y1!#%-VeR2P,&&CQMh4)RSb6b(L
1QSB#NC`kSFDLc+*AVcjj3S4-Ck'dkC@+49bb"rb4BL!*e3M3#6CrTdMZ'*[+`k4
-)b+m1ZC2l$FQIMmpB$Aj!`i-D*HZL0$mBK'k(NVX$cEI8D3p'HaBi#[FJXBa%iB
0f*p*0e`9mHc+CqG*A5iXB9Q[,1ZaA%6,HKFZKNM)0B5QHP8&ml*HK$"K3qd*hH*
RdKdG,aFa5CrGNHS#8pAMqV(VadTcD9$(@@*dC(DRI0LJe"9)mR&JfCbb0I'"mp(
8ZIDVm8A3)EAlN!"3VA1&qT2**$1RE5`dU9jSDLYGfX*+PmN-8HC0CX"Lm+Q4,Ra
qmJ4BbC@(X+PH"+BY9`b9f9)5B$(N6&T$885i+LZcMI8M(8a`*G%kA8-fdML[k%k
DRHM5DkL2!dNXp@(3AKUdfA*3QC8TfTV'Fd-L1IJI8YF6jXS-@KbDX+Jej3D!NX#
'mi19B!'16Ci-E'SBiSN*N@UrLlGB@hN)SXYC%bi3d$I99[+fHNV5q8*Bc!iFQ!"
k[Irh`F&LZcNi+"XCr8e-U**d6-phi5,-i(8'!I!DLFfTaX(Q0!YaUUK(@'k&QEm
)ARTF%-8F-i[Yc(jY2k$9["5+Chm0E'`6rMY%LdJJRc)UA+Dk(jKLMii)S`E4rE%
k4&1)$X3N4&X4r@+X$G%K4,0MGN56L+E(3L0!N!#@&h1$LJ0)!Jb1V5#8+9!hBNd
99TS5qm'!k`0UXdT$meqp(NUC$Qhc,*!!&f0EQ5@IqPq%*T,ZJ9TCE8L)(kUrCKT
d0JekBm3+mTZ8)D2rBj[`aa`j9d9c6$q[@#4MrT6*D,Fii!'T)4"h(p)kJD(0@Af
jm4%)%F+2ej!!5(i2'Aq`P[CRlXhF#k'R66-ZYN[VRjZU+p1X$em4E8$GrV&aSI[
3c&'Y,l(r1d@(YQ'LI#QpUd8jI*%PkJYZRA`dNXPZ+PEeJEDQ1PAIG%9p2l[bqA"
+C+B(r%rfUASd0P0MmiXDQp%i4)e$,fSFNZTN%(%)1`&+V#99Tji+@*XmcXN4HA+
2HXTp49dD*K!c5ZL"8Y)3D8C4$4ANkY`fJ3*b+"BhS5'3!%6KR@BS-XDPFCdZrhQ
R!J*!b-8lXlUa181"b1*)Id5BNAJcE*2mV2)&#mjZ6%S[Dcpb16*1Qdj$f24%9ml
aaEC'3VYb*Ap',J*@Xr4bb8HZQr*RE(R3-mdRK6#GQVLVr"PE(R'U30)X53[!F4M
U2Cm5`qfXrBVS%U(-G$$A[f-8RSZ-!MNJ2TB(6RJR[`38(JiJr-HJkMri5a(UfmB
)PTHd[KQ0b5ZLA53#59%-MST3iffVl4iK"4ai2399Ehkqaile!jfBB,C0H#S3aq[
K'(F$6+Ra))X)Ue-UYYU5p)MfQ*@@VJL9&Z1m5)G)2)J,j1DN!'+9$2HK`-J*RfA
Lclp24&PJN3If6C`kc#bdm(PPiV"lSKN609G%JP8bUh5-'PDHPCXN0$P@Ac*$4GR
'#m*(#dBXa)0QEl%D6kl'aH,"*(q!*+Sm15MC&Z6*$TV-T&,akHI2*qm6&e8pAQ0
U-eihe#'m"Y3f[$,9&MK@a09f)0Yra-*4p44H*@SfANC9qpKpN!"VcZ(9SilM&91
2iR9G0H0P8XF`U9FGa5ZP0Z*9Tel%B"dUUmjl+0QZAJU$k9bXZZMc2S2CCECp9S2
Yl2`SY%8EIfI`AP80p0(%8D-3TA3a2XK&"r@U&q8,+-H0384)'Fb'SXI-G-')DXC
5RE,N`P+0fV1EYp),iQZJ4p6Y0UZ(-94@b'JU$KN$CR`F$ehRcB8+(+Y$3VGUYcP
863Hd"eU)p%N-84JU0-ChjiP3U"#I"D(lJX(mh#I0S@'CD%!)f3'$MA3ap43RM$b
FHNiCVP9*("l`2[8[mS$UAr$j+r8C(M#r1(6p5E0kr-NHcb8--q`C`5[UU@G9S!e
4$#TLq9#HJ,,k6kiUhI6'@LkUjF"@KQbSD(%jAN&!e0elF)9Zmmc`'#1FZ-CM&-P
@djQB95l@recFb%9k2,J3$Ak)`Q@k(!4ErBBUd3baqKhU['C-a%4l&F6UE3$cAI+
`YBGe+jLj'4HkjDq`'RX*Lq'ibXB)a'r*$q&pqIb6Yr55jfBZa+IPH5S2pNN)Kkc
3cB'c`iV)rTHhLULdrq"f%De,rZ1q9-G'&*hiDFB3bfHI2)`1QIXbpifY(LicpH%
+0HJf4pT[[rRIq"H)M`#0Y)G09d4()$NfRJqhQ(BpJBiISUX92`lmf2($cFmE4A`
VLZDfJ!X)XJh"9-2"e$U22i%mUR5,QJ5#Z!DLr"84[j5Ilfd533dbD(Vm0%0a3)M
BZJ["1IV+IFM+ch2G4dK"XJe@cCrr%i204V1%$1`m(T5Zq@GFXeIZ"ME+SZ%i13M
mb6T,q!%L(8#@piQN'XFV$T5*P`J"i238Q*[9&Vb'++Lh89"[39!IeVe$J03Tr-j
#54CE`2+G'KL["A$TAJ[UjXm5dCMHL550BA4mMC!!3BU3!%%GJA5MHLlcb2%M`HD
0[YNqie8d4+Nj4FdSi(CcB#["UeCpCMGe`+Y*rF[IVUSPZYF$B6QaJmhjHb9chcE
9L14Ue,dqSj%Q[)R21VAN8R1qGhd40EfCldfCFGJq%i!mPM,&Be%0(,i-4I0c#m1
FS5E`$$&iGN#p#C!!JXT4!lF(GYTCRJm'cA36JNC*HU#CPk@N0!!'c[3CMIbC-Ub
IZR'I-RJ8JhF'rI0m"bB0l*rR("J"f%1)FNp3MGVR3(6HI9b9+"XXlAirUH)c5Tp
4rM3kT)'X)ipPBSSFLCBFHbCAkVJ*!%$`6TLZUY%!@0@D1PA+,eB6@)bmJNAGI&U
-iN2595'6L3PhqP)(0hV4d+LEMk9'AG@G[[A[cYk(5Cfk3HV3L5"@(1fi9U9l*hA
`6GmY"UC&+'5Ar(k&VVMDJ#`MJ4kQq'LJ`CY-@Qarr4HNKJFa%*&"!KPD6ER$NiM
JHFe*"!D3!#)!#%p!8&rZ'(Uj#!'X,B-GVfE6DaZr3MH-)V4hSK$N%,%N1Z&DS@&
RNFG*DXm&d5iHD*PdU0Pj+%KT[eQP@r%MG!Eb@+4EVL5!A4VSfkV65IiCM4P(8J-
QUa-0H2cBcY4B#a@,80N'((,KFZNLZFmX0mD$#Bi`QTP(`3bSDj%a2V)HPjXk#R%
$36[%a6hB%iXiD$ZZcF-R&q61B"UD@Dm'df6"!@*$@0NXL[5!iK3#X5K8,hEhU$A
)K1q0Q[TqUMDb``lrTi"JTF@McN@kY&#eYQX,Y4H"+a%biK@KiUNQ9-$"+R59JeA
S2Ll83Y9i24`U$0H&VU+,&@,6aEjYS8XX&XpS4%Blp%,*),Bcq3RS@jRi36m6aCd
%kMZF"%Bp05cL4K"mQqGXN!!'&X8[12"0'PLb$5a0'MLQ$#a0'PM#`0SA$4ZRB@r
3S-ff3CXR$6UN$0VmiN%*kBH"#"B&@,"ZSd5eCqFd[k1`aNSIK(X8NAq-a)%Sd!2
)jVQ8[jF,GbV@@k@kd,#cD$Bf@dj4Mc-kLE#$+N!k9J"0UaUc!TAeNZ-0LKrqH,Q
)J3*)pr-@J@*X1KICKUYU(#,Mp(iJYDB'4$q(S0r'Q@S'ZK@RH#KFXLeQc@R8I4j
ShSdTDLmAl3k)cKa`K1j@R"5F1M#)Td0FEZIJX,X(f9iFJ)acSfikKV,$E3dCjeL
bU6dljrkdNR5j#&H+l@&GMK,dHM3H#pEICQBkF$CfSKJ"CJ-9m5$@F1!F#`55kH$
fd#@Jfa@-`N1&J@B&+3ap(4N&BaZMLU#!5(895F31)m[j3clH59J%mHA-C,%PkRN
3rRLJa(Q!DR3HS2lPK3j35p`(U#A1!p6M3,$Db3G-)%'2*3'FV!QGLi8X-,V)-B0
GMU#3!,Bf0SV`L!lXQVUQMRjr8c`lCpQ@P%&U3%)K%bPR@2[Zj1aUG!0R9bp#53j
@TI#J3"20,aHPc,JiEd$r$8DA)D#51A"'*Q%Q0!qXmNX(CFA,j@!3&hkEVRK@kXJ
rJmqpD$`RJhcS5&$pI9%XM`%*2h2XM4"*EJE#L'J3F5$b&#**4"l@hB5!&m`raL#
)B6Ec"l0@mE-9#qp*[I-(aDREIJcd(JMqTS&r1--cV,X'CiJ2,E-fL%"&fh!D'`i
hG66TjBAPb6&"f4bV)ZEDQr6-IPkD-bD1TlmS8!YeX`XCDk#RprliK@qZ`b$2)'J
Q`%"TCl*#,1dF%`L5ca$i-d1P&3A[0PX4[!2&Ti6)KUqRpr[425ZlFRQDTNXZ6V'
P)`$m)m`F64QB86A@PC8H-b0)(,PeJlZ!0DAL8SRm-mc`@eimeK@,+N-GD9U0T4e
MAFk*')U(,`DlYLm@Sb,D&6K2KDM,mUM)6cSUXYDMV#pi&,D1lIQ3!##Cq"R!M`%
r2@#MD+6pc0LYcG"PJNRCJ!jc`D!dJ'RB*Je38jCZ!%efTDQ(#0[)%Gd!IJcib@3
b0qQlQ,P!),cLAJ,J#)V8r62VQ!'*`HU)l&C5rqr$K`6a$3SXk3J+j!DDHN'CHJ'
NN4!N@S&FI"`BJ'MeF[!J4"CQaS8PDT&CCDa8`2@Xc'KYUK2ARD`,H%*Q!5@D+50
cQ3",LYQjLCG@p'5Q@c+qL1(!D!UX-@Cf!%ABa(i%-DJce-K)%+rSL)B(f(V8**L
&5@Jp+BZFGrNL!&(*E`QN!3-[U($cM)d45Tq)aR9mEHiZi[d#V-9f*#RF1r8l$%9
hqAM$aU6FE$&i%X,"N!!XhXQ#ABRh6YpGAN@)BU4`&$rCq$%D,dfkcS&JiLiIEq#
AEp-'Y&48$4$#[FSLmedqip&*R4T,6KVV*Lff"#9-Y8jDpJHElr**(NZf,,1),Sk
VBp,,LBH%3k0Q(#5f@PL1aKCGF!R(4)B5b'mhqV8IDIGDe`55B8I!rjSrX-cK-2L
'3JE[0E0'MEMC9"hZ6N#V$VPMaV'!2Bc19R5H&`TXTFjVR*hVR#bQ'HaN1k,lHRV
R22hjF"FmaH%)$Y3iJbSP`-f)N!$l4N3I`2+FB(+'mBB)*2Xl(Vj(Ec6@pE-!J!)
-56CMm)NZrjTlp1F4##f@%66dJbeMAA)MJkl6"9GAj-ai%q+9Xpl6Z$[BEF1kDBb
)MV*L!-Y'd6(2eP5%TY+MB04hI'*Cp*!!B&iXZ0!Uimbd(jPT9Pj*(XSq9qQ+N!#
"EY39h6c*a4SZZ$`ljqj5cYK%$(,@*QDAQI&(Zh#J!BAjG0d+ZC!!1mVCSM(l`Sb
AXjj#JA%c0A"CYArPdX![rP2SdG4UbeSf-a2Z5FT-3XMdXa*!VF02)hiZ!X5'&'@
3!-2B%Qa$eB!N[Ha'1cSjR*mNCJdT@@Xr"rb1me`NX)T$RjNk!8I[KH0Gl-c2#5C
RJ0-H(40bmYRlG$TNdi5k8qiJRAMV#l(3C6MVGFpQ"rH-fq8"VR*"!e9S@1(a+4#
0%$1GD$$5GDYFbRLX!-'X9FTi-K-9(JU`QA"32`rC)5`9#,hS$$VQqDT[)"2CUM$
Qi`GUE)cj"2ihihmE-X[0B%H'4+Z4)af)a18&eiq"QS$SYJq"4GPk20dBGPd&Sq@
Ui%JEIUciDB9LS401l0ppi@C%SP"#-HT)C1GXUfiDrq,qfrmQEj%hL'+N$KY-1EF
RGH(!U*3"%5r"+%4%Cc6b%D+1HBqZUbTA'KPhAITr[M'"6!N-)JQZ1+@kKaS!S1'
I&Fba#!q#lLRm*)M3[bV[Qc!%Sr-H$#&C$S'Z#Hl+A6iVrlIU#9hDZ!#B-$R&Ndd
G!6q5marlipfc)HTm169!l*rV!"H(SI"G1i2-eqieQEm"eN4BA(ENq4PmM+fD$Zf
KYKm+!5DZTT!!@ERIZU@iX%m98"%QZ9))%0)'I#$2KU'B*@2&B!8QFfBk!2r4X5[
L!$*d"b*Aa(Nd(X#4erQid$[m'AaICYG!J&i"K[Pe,15#@A1GQ$8)QNjQ6@MV85k
+SK"HGLj!ad$b+'8%e5ffJ+4&9Lb$JP)@"DAMJPQ[*3JLecQ)I([!X0hS6""19L8
SAZ6JL)aKaL9(N4GX2#-UYGLafI-FI2J(a0k-DK4KZD%SE@*$`"kU%hm9+M0[M*h
531B4G`#4f4-)0!-P[0`CE(k`@0MT-!QCd('&IC&3)LP8il1Aq*!!l@QNSL`"iES
4RaIT-d8&@i),YVmlKf%fGD2523)A#BK$!q1M")*C*qq`2#aj"`E$cd9LN@B%Q!h
FbS!2T9GmprZDK,C2"RkZb[#QVh$V$AaS$ieeD2UNj)4V0fX1TC+m+!m)TC6pH[`
SXd35U0BN)kX@4PBNI2KCh5)RXmUZXQf@QDFGq5AT-KTAK,4TLT!!"RB+9,C3J@[
1J&Ae*lGi8hE++Gk-E#)K)![)XaFrVQq`3RdF`b&)'SE,6R&a!C'`$TH!)%3#N!!
X#0R4I-j5%(VkNL`)696j'AjVCmFEURM4GrqleH``1fU91M+138($c%Gr!MS94cJ
DHXXEmP)PN!#(@i6KA5Qd`bGA#RNGVZpbKeMqD1l!23k048'R15TAqQZ'1UIP(kE
R#90ZM0AG3Pf16E$)maj[i8BAP#qX)(m2660!Q+&!FKj)r(1KjUC3J@E`Irfi&d9
@N@EmJmV[pX+YUBL9$G,iVFmN#C@BTRp3'Ge,#Zfc38F4Ncj2'KmTR0"i0+K5djJ
dIZNAKCC0#@G93"56dfrHM2Yd1J&mC6q'kTAL9McRC(8SeG(NN4dPZ+#md5ATXk"
i-ad+K(DHP26BNVV!9lh*Y)HCSUe`TBLC8RjR&hDX#1LGkZk*A4#9h&2P+4KD+C!
!Ek"!&JY0m8!cCC+Q!A`k"rq9h#NH)LEkBAF'A1K4r'["`0$!I@Mj[*2ArFL5+Zb
0'e!G0M8dbH,*#K5DbGP!@"KL#50)dk'B(mNbGF*"NR,3KAqBER5J-`2i%$*MQkR
+)l+TDjm1*M!bJ-K8)h%9B(p2"RC0"e326VE!4UG$%,,'l2,Pq1Dk2hlKU1H"``r
dA9DcFql*![#Kk$Ee$EFLkm[J)%)S1,0c[QU'b$F8h9Z5MJ*!rcHYlJ((N!$#)Y'
('h82K2cLCmD@bBi$B6#bH*,9TfNh&!(-0ZElZ)*()jc4lrjA64ql+k*`'D+UD'9
Gb$aqp9`,"aDpU32+8Rq-Uh8fF!C#YcJlCp2FP+%NR4HFL3UJI9Zbar6-'YRdj3J
hfbFd'c&3'`B[E@T!C3!i&Mc098H4HDA+S"$@f)@T+FkSK#ka#ml+($LfbjhJ4$!
6'6'S(R4EiG###iNYpA$qd(RK(Q3!'Hkj,#!ZlU$11b#',L&@d$e!4RCQ"E%,`6c
+8X5NbfSp#(XV$!I-(9+[3f-@miHBf0SpfTjjIB9mb!j#A$Z`Q6#B2Kf"@,e)l%I
P[5ASU$%0a4)DX-mCJ9lc5HV"E8+&5"'Dd@JY%dAim@RlXRSJM'2!"6h$qC4mjc9
pN53ce,rNNa-3@B*-#KJpd[kSL4P1B-ma5Q9a[JdU46RC8lD1KNNGp9+[dK&1$-K
%*TNGpk8#6KKmS'MqdR%iAq4mGGF%GK3jSS%9ihKEI(2GQ2q2Ak##0`e"!4AQ0Mh
!P9!KN!#RQAU'@qZGJ*I*J,GaUJAJ(@9NfH*`G#LJCdG8L*paPXlB14RiH*QRF5F
iM#)TkTL"XPAUZ*XU'5'MRKCJi&MQqM%UlL%$Z2%"G%TMm'-Jdr3`!6BDeJ*d#c3
p%Q9rS[YR0)iJN8`pYmbF1$8L`mF*9+HqkDY1)HYC&*2X*1E&`NJ`9SQV8[cQX3`
Sa&dY'6hD2NU`[RPp`d8-ZR)&P[9EeJ,+,UMpP)#`rM9@qr'#aB4S'cEamT6!Q(f
i(4@#!Sd%`[Cq4L"J+$apr3B(V1CB'`LY)k,-eIPHbH2*F"SNFS!4F$,@1VQMb8`
G85A-Q%P%-mP9R*P!63d@3DGGUGiX"ajdIRCfA9HJ&B2f8R)lMrADMRelP)'ENrX
!1TGQjfcB1!RF6&$kQ0Mj%!"hP!"96i"kNkT`FYH)TLG&S,VKbj-kfbQ*6*+(J49
JKFT&M#Jfc'ALbS#lBEiEF$Gm`S$lT4U0he)FJ-XF96Ul,&#%&U[[+iAS%!NI+0`
I-)d5m`c+@6r3bT,89I9pJ%XcNVe$C&fAPhGKUBkRLjdm#$*q,A!L56jT80qANh#
d5aNJjl+DTm)TKCe-0#PQ&K5NkS64H%!Q0)NBRXN#aLq(4Q9'5bm,*TK`P3C`b&H
,DEJ$"03X-'!q"UZJFDP49L4#a%B'0HfGr+UPAlR,CqU*a4F8Jj@i%&%*4aeA,K+
'!(cFe!(408bEf)6!f)aL5#rKS*NA)0kqcd5c@lLlGBl+MN'F(8`Sf8F869H%UqQ
+k'PUB2'@-qQFGB4!FGU@FCc1"AQ,,H[iF[V"!J4Vhf!A$9-a#J%JeQM[dCN$N3p
D)JDh+B%AQ$i`m`PXaiU#di'UipH`JFVR4amaF#*BCQVFcRUkKFiNYmcmhZJL`Fm
&X[5!q6BZ2"EAAi!LB#EFk6ppjDT`kBU"e1EAAK8pZQN3!KB'9mi`ZV2&TbL$a0Y
6+XCEA$Te!Q$#K5fa2P(dfaUEDSZ@G-mL8,@L38k@5#XR)$,VhC9b0KbCU$K[b-M
EqZE%5ePF5$r$f0r"@lC2F%mNKKiREll*M-$$DV$H91f8kNMYP1!9lC6U+e#66!R
+SJ833ikiD$)I"dKFk80Mcj3J6'd86UQ'XZe'-)5XY4i0H@M`XH1$M5QrV-R$3bK
6(A,e!aEGem6!r&J'9de@9j8j"eZeJP%*rf"+$eJVLaF!F3#S@qQ#R5B%m%$EPF)
Tj90bmDUIX[F+KTP5MX2VhG@k`E$LLQLX2Kl)r-KKR4qQDY6aYrjdHh&3MCa`Xc@
C#1i,VJSL+`#51+C,Y92+hlU'9reEa8*Qpk*K95Da0BNFMNrj@MDfjMBDM)8d0Lf
`QGN`a'K8PD8b14+DMmJfqF1c$-QcM3X)1&DKLQq`BdCM2pc$P#jIjJ$Z2S#V`M,
V$F(-UN`TB+G`1IY"#l193`BX$MP5MmUSKh!3KQXa1Ka$mhqS%CaTRmTL5"pPb9&
3cMpfHjI&i9'(rhLkZmUVl(iA4JB-B1"M9EpJ&b`r&0fUT(l3bB*hJ"9G3e'6V-M
N9ppbFVkdbaeQ0"VUr4`BQH@FC"8rA1IdM)DIk''NG@9rC4E%fUi*MXq0A'P-X$X
T8&QVMB%*j9K@S*Q5KCUHk$c1MUCC%a-@M)-#2M#aPk0!T82CP4$%Y%rP"3jG!+H
BShrpVeNI3FK'G(E1TM4Nc4"eA-`D%9CFbZ(1ZXP!5p9QNK12B3'GKhjq,`0R5IU
Y*+%FL#q5bCCma)CNN!#%1XSq$R)%qe0CNGAh(TR+k[eiRIMYhZYq,Ca'T)lIlT@
b(V`TXdN#pG*Kl4Q0ApX6c9Tp8i6Y2F)F1hjCe!ZifK3PXMM,Q1)XimA4&RE@3U*
F((fL2(ahpfNI,6rqZldq,eIZJ%[paA!iejFkAE*2HkLN"iBm(,IIB8DRP!8f#M0
-l29!,`TlCUq&)$IIQB'3!,5eQES9H)%4!39H[k5YFGclm6TIEDpZ2LSXMHVHV,C
ViM$E-FV#UP&2(rAmJFS5A"R`035c)ab3!0*@!'8ZbK-)!!Z3!#%SC3%XT@95d(C
qD0[1$bffmd2EGZ,BcJpj1f!#P8UR5kTdTDLUXULN&pGSeLfkr4SfYN$5bKY6(f9
e')ZGQHN4,5Q#dP*#HY5HP,28j+"4pVJ[A")CNRSNcAKbael,TKTeM5rm60f3!(5
)'eeQJePZAZ-V10Fi*"hQCEI4"Lcr"CG*+m'"Z)jIPhClM`8aiBkr+X`&*33AHcR
XPN6!kP`phe"L%$G#fN1'Ar0R58Q*'!pPp4VHimq#NJ*a0(6UX1&crU`[JHp5U!5
ZFM!EJS@T*91aF-j-@DdbQ!B5UqFR5m*B2#i[PPSZRTFA&lXA-eef+!B+K@l%pE!
%a"eHTPae,T)pc0GNN!"[G+4J*U)ZJN`N6+K)RPjIdGQSCmkadllDjh4Elra4h([
(e8rU(r"+lI@2Eaq-Y2reb&lIKT15(a124Iec6Q,LVd#-dMZlK6rZhIljldpYmNV
a5pDGJp&iZCd61(A`MQP5!cUFM$E-bD815GddG%M'[3NTq+@0AUNMEpA@`CU1mM9
h9ahaEGSRa6%p&p22dR5l,Kr6lA([ZfpXAR'A9r*FeQmEV218YpeGZFHh%3VCAPq
dSFJEl9!k1(5Ed-%4prijEeA&"UrN(hRmhX'8rkrlc[VZ1MCKLc#@TGZ1bGDipr#
CpqVZH&GUH0ZkBV#a!9H[q0Mh`%QTR6EDVQ`dM'T(h5)Fp`jUHPI64PI44YFS'rh
FYY%ce+&99i31VA([dYjr8'QMHYTSQm9'cpJf+ZR@BES8prl+0hX$Ej4)lL'5Rf@
5dcEpb[5%EJ1Q*q,HI6h29h!#%G(ECD+MJRrCHX@3!!"Y'"'&q"(G,R5-a,dkh9r
HSLf[SLf[S5ecThBLIrXFI&#A'YdbG+Q*HcmkIXFl['e+J,L5!'Fi!BVB%%1(XQf
0ELikD1,HqfkZLDie!FlB%Z"4h94-IK3NQ[h2VrjGZ6*Y"4&j-j'$kkG)pPj8XN&
5f*@N'09Y3FI4Z2I6Iq[lQ,DrLVE[6)TeR"50JK-MBCpcQMU0khDJdhMFqr*VbDI
@NK`0f,DGbBZ+4+9alk,1*`p3-Mc"bI",14RLP'#j0'Pah&YNIYfmrPh*IZNh10j
H[T+2Malmqc3&K&FU`bf,He2Rcce(j"iLFMF6Z6qLC)@MYp4HP1[cXK0!h2I6"Cm
AEr+"c(BLXe8KmdSLh%SQ()EF([IHeH6iGb,[%dcHAmVNP3(@`dQ"DE[LhP#20H2
[ldSVkBSVj5X556X)91h+J$[LhJdIh1XP8Ji4+CZ9cDcM*'-R,fPPd8Qkj+DillG
rrpV8M6k3!0"1*,35#6rLC+,Yf)[1dY30FGp6[rZ[HeQK1B'-+`NS9bU%h",h6[P
Hqef6#8Q)``)9B'Tqh,[i1cmi`aXL3Uj8#,P2$Ki@K&`ApadkCler,B4X8!+G[2'
TF@rh2rfdirq#N!$6iYkb[hkhP"13!+lBB%YU*b'G#9-8p`CZKGBc)I1'3"`QT%`
FMd+FZ%,'ZA(IpqX'pM!CkqdJ$T2a+h*3I`06hr,+bDaEmLdA)Ee@4RSrr6if!GI
&rq',aQR+ZVMhc$m[mP)5lkBNEP#)pfZTi3qqU*qQ!3!,rrpI4$R`FM(A'$FFGKd
Q`V9('elh46YS'K*LkGfMGL,'5LC'q@rZRJ9bR*%mr`,bdL3%M%rHfGE$`DHqPDr
p8k9!q,d[fNj60X@pqarirlU*@,Z*@!ffB,%5&rI30""Ud4rf'jP3I+@DGN1[UjF
)&BqZI0ejF3$`1rmb0dJ%@%P)rcG1T'mM%T)`m[qqr4jGZj@[r9-&dIc"5D5YFHq
f$ajC3Q#cQm#Q`BRHIqrF2%"Vbemeaj`NLXB0"ed(kGUI5b[raAPY"(RrhVpe%2*
B5D$r'b9jj@[,*0J3pklIN[mY3Kj-*-p2Mda+f,PalleIqZEG&0af8h"VF"H9YX4
&S1bDN9I+&kGN@cNTf@3L!6LRIHA8E8,-+`R8Iq-'GGmaj9)J`Z+(SMe%TKBQdrd
f32HG9)L!41QVdrf4NUk0NNj[L5kLpY-)b+p6YILiEpE##cpq!!(ZdKVD`+S*k')
PTYTTk[DiVqc9QGmLC0&!*0[Y4KDqXfk#h2l,-e1)C#e-X[YYL-+AUj!!!dRdVrC
ee`K0Y"'Dd&ZLL@J$$[A6SEZJH[MVi[rMld9)m$@8i+[FD-*haJh+ah,rr8%LA!-
4E[GD#)F!GQ[`lI5I5$JN9&V0[6XQ%mk*(SJF-Z%@ahhI9IZX6,Lm0B3H9VR4Jid
F!1RXj*S2+*!!04"Uf+fJ"NZ#)+!pRr(fD3SF,4`ilTH43jbZE`[iEpaBrKL$d%J
EVVm59jY&'r"EE!!J9(I(RApJ8K$"iJV"6[,e36#2%karHIE[2f*58&,kPD3mmk@
EAad8rRX'4I+13@'(S&Nkb8%M15+#Ub$b$fhhcJ(V9YZ(c%(48ekrF,4F@PANIFV
hU0$ffIXJV'kS&jG4I`6LYFS1E-b%[E6UQZp1lpdI(ETrbVV[['[8-m1A2SUNeE[
fAPVeU0m`*aA+2(hZp$3[$jc3e)Llpq6k%UGaD-1G*qIiDY5STPAXqLMK1AjkQNq
Ci2hGRQ2ASTj6Z&+M-U&F[q@NHi,"jA,aP%a-L4ad$U'e'#)BrPhaXAm-pPpD9Ei
5AEh4e6rpk26m'M((Pr"H@TA`C1&+882di@VKE2MG4bH[BASc6BGp9QF$)aYZ5RK
i'p'(epQDF%Mhb@YCaj!!YHY"&K(LI0SZLd`(X92N$+aSN9NVDPaK'q"$l,9d)9)
bl)mV@5"8"j*mlJ@U%(66[B!U34DIhYRZMfqViaUPimh*9j!!eVLc9)iLDBdlfm@
IcJ`D2Kjh,hpE(C3M(6ihBk1,@5T3adjCPeUGTdBpj9flZZHFVI&X1R[%#aF%rf8
ekXI5X6VraQ0l['p$rETp,i*E+`FhkI'hFS2p4EN(ljmqN!$5f%@`2qVImG%Fhm(
lT`kFRGmUSRlA3F0"ARK2@5J2Bc!X6+1&5%IdmGGcHB![B-&bJ$p0'Z"cC8(ZrQZ
jHlbQSmlrqf2D`rE$P)Q,54dlpdBlbVX)kEdVaI%CT`r[`$e*Yc1IA9+f((NC,Kf
qk)EAepeHBX%@Qc4"@Qmj39H2#U[%c'!cG3#LHM"'TYIQU4F1"A5PYANIcIU[[a*
$Mm#VV"1Q%dTr-kal9UKi,4%K[,iQ2(L9#6pH5d8(AQNLMTG1Y)q`!lAH'%RXKa1
"h@&PCFpE,Dj@#[c*DVr*'YX'KLJE[%U0J''"K5e`CmaA,K)Y!GZU9@(4k"Da'81
ZdNK9'a9@(p4pqLBr&+9R6D3H#HLlf!Mb4E$iiF#J'8S*U2f6A'8GUXL,F*m)b8!
$*NDDh5`DS5DU%mfmU!SB`&-Qk0Je6c`'jHrSA"(#35%kC*J'(`9l&1k`GRBN5iX
j6,@cPS#*2$m$%63-SZ%*0#4GmJ+-!m&E$P9'%B'lC1bFqm"!GP"m%%faFqN5GYP
T'Xmk9*+&c5rTALV"a8'ha1f#P1UbRj3GcP1b`hP'hrfc[XDUN5IkCLeKGe"M$Bl
SdUAG5YKVK@l@NZYY@P`"!41[JrI2@V+QLY9TaML6VAYU%l0"r3ECYAL4SE!iUr[
lp)UiY+iXKBKq9j1iU"Kc,!HEp&6D)X0`@YPJ1E2a"Mq$)SUV#BRj11*kTaC4UME
%M##aCUliEf&V[Vh6kH5"!CEJaq,)`3rieB4V3DA3VDNY2Q8Sb[,eSl*pFBQKk"Z
)$Vk+5iV"A$CjLFJ4+2V0$aCLBMf8qJGSN!!Cq(KU%%SSA1mcZQiF),-94'8QlV,
"FP4a6U41-++8&6(GqcL"$2AX5JUc@1dJFRR#d)4Y`A9D*JdcHEHbBB(ZlmZ,rDa
ZVRhM1LfbF6Q`-YmSB#*friJ,-#@C3dMQHjRNK!#j5T+!ZjLqqb4Br9fXH"[m6*l
'bS5ALa)R8NTJ6&[XC15he9EmA#Ber-!,+lQkGB3F@GbZkkHK6[f3!"Y0%IA9J!X
6[UiS9FIN,M$"1X*49(@TleZ4YKJXfq'daEaN+&!ACZImGUT-VU#DbDTC,6HjKiQ
e3P&MCq+%f(Akm[&dC6U8Ck%8Z6'!Q$'(C))lL("Zd`Jc!GqlCUKIbDS"0Qb5Cr*
"b@%eHGMd`2FbhB1S1jA&F9EY--J3XaN!`e@0UA[Pdlh1kmV$I8e,6QNTH9[U3Mi
DlU@0!-6NT+N4Q%*bEr8G9SR%TRjlK,Ph2VQZ1AKT$3+#qQSp'mbS)f+S-M'`d')
MIYL#q(BR8BeXArcE*URBmT0)1QCfNh4TR59*(dZc'15QXVMYK8MU"L8f1[2E&RR
6SPiQ5K1E1PEP,QaXqEIR#+@f"6TT-%a'GDQ&`6K-P9Z5aQ(EPQUj,FF%)a-@4KZ
N58BE2$#UJB!Hd$`MZlN1'91+@LD*!Dm"10['--@jb)CpIrXDXCJYM2l##0+iID2
QX*6mS"0Q-XkaBV&T221cfq@XIZZHQHT+$5!Sp58b4p5-`i8J9R!9XeK"XL3lJ'r
h'If1PTH,Q+P9!r@P`m0+P6D"DNq4&jik@l40FdieMYNla+UI0(f$jI5NSq1%i+@
-`p9#9hjPS$)S$3#S$q,kj4`0R8DdrU8md9#CGi@09HXUhkD'DfJic9(2ha%pbp%
1+k*l-2N(P4rcj!CGj8eU5+"K)8IMYa'GcG(f6a&p(j1E+fIbj0@kbKR8X!!0Rh)
dq6bLa4c9Mb*D4CGi8lR%Dp4J3--mMMCmK1KFMYUR)eT%NkFTNpqcV()J1GRNUV&
Cba8#(@[H!L`),9FmAh-aa#k&Yqke9'K'5-K0EJH#0m#*UVBbP9fjU048fpdRUqY
GK9@RM&N`K*%bjGiD52QjJ03T"D41Gm98&E[59h899j+U,Ve8@$QpkVbVXNS,099
YCGa3@08,YFib(SS$`mSHNi$6Er`l8fDI((kY[lEU&"Be["KJFbM6*aK-JE0X9$'
QR&"8H**,FN5Yb+#[HFZEmV)4jQL030BdqT!!3,EXNB03"De*V2i2A`)Lk&ZRSf#
F`kAZG%#rFimicGM"'0Uj"blprY5*b)R*TL38BEpaVFUUCPC6V8e*a84X$r-PSD4
bA"EPJJAMV(dmM'[3(mG2k*+)lSpk*9AVZ`#$$j+DaC'NT*lLL&e55cMLN!$8Fab
a5ZTaMS3P'!a&T,A[Td,+p0UpM+J+jqAaB'Z3!*L2PSKmlaCIk$5,+G(ADm3MhKU
K2CCcKKh+5cl5RV@IT5jhbXiN!QCf`M[FPel&K#93iBXRD[bK5)dr$JI@[FC'l@P
jf$TNacBF#e%&["V0J(MU'(l1eN#Bccr,4M3jkrEkie*laKNi9Njrb1822G6MMm1
pFTRc))"#N4X&%5S[%1I)!2mj11+KQ6kb64c9mi3V"F*B9F5*d95,cMRL"KF68%6
VM*%8PRJl64'eQ5FM`JTqkBUjULL6+rIV1#Tjh#L,A946XL&aZp'"b3D)NFr#B)3
1L2a$[X)EZB(iJXTCHkThITf+-MBL3ZTFUQTe9q@XMj9TA-%Ik19(q)"5P*@`YC9
3l+jV)EFI"eh4j4j%9RkcD4*-FZ@Ic%`R-eCq90q5"l3fkC@#JDG)2("QqN362%i
aC86!PH'8jCECU!S*j$Qk&TP!-(K`h9d",H)dab+a5CH*AFP)bBblc&6)jk"k*9G
9i`%5F'dHid,8,')KEGq,Zk+3!0JcfD64Q&aT--NZ(V%k8f(9e)!$!AXU(p0iqL9
ceA[(dl%m$8'SY[KEU*V*)Plli#1QbJTV`!TR%C!!%KhHN`SVV0NhiD!9dRMkmF!
#K4!NB!V"MP6#h[dEUF[ZqkcmHSc02I8V!4IE+8G([`B,k$T%hI4d3BLPU@%j)d2
(pp*9c*aKHFiA'q8X!P9"4L8$RS"%e-2P[KfLF'6bNLZ!DdlVIK[SF"SZl`L`%cS
1S-*5hS"$hN"3G*RCa5&e`LR13r@1L`C5%%IeF"$VT'Y`*4)BM4&kpm"XfUUL`GN
0&@&N"f[V-raS"rIQcjPU+aS#iilDUQeFc"PmBm+&*5)Y1diX8B6Uj4#SZDT2BG@
fl[1SR+QhIClJKd8df3LBYXA4K8Xh8NDNd8CkKfcqRVI)h9b2@,MDYjPUUkB(D!!
d6XIflGNhMFe14#S[d$"*E%@VC#Q6#)afHT!!`d$kB5*`NJhlE,mY'rKCpSYqd6d
cFB)hd1e)D@%H)J3h6KL*)%G1,%1!'M)824T"pCXj#hd,[A$ahX[r9qc02lh6Kmc
Q$(B6DbKQNed3%,6Z6qk14`Fi$1qLZaAG[3Yp%Dh'LJ03K2!"NiF$8e',)@HqK1U
!9G2`LPC0[3,cRa9@[#)9$USik1$YBmZS,"0j!!(%l`*K1$N3fCDG8fHNE8)XCDI
,lK-+#HGF19&K4kE'Cl%i9A'1j`HiI0)r[[dfNQXQ*TAM*`q!)K#TCJ&3Y(G[DkU
YX&YfPRTJ5,jBkS04[Um3B-'e#PFDJ*!!q3QZjD,"P!-`8"!66[@2,rX&2ZSaT!G
$HTSiih8m1qH4kFS34JbKaa#Rf#hArDJ"S(A1fJ83!&[*T6pXFqZh&D0TGT[6#5&
FC)kIaE1"FL!VL`"-XJ"%m!!-![M(q6AV@CibSGTN[6TJQUF1"(US-N5F'!aaBM#
NX'"9X[BYr,JPKHh@b)mFNE2Gb"JdrdHTQKQ)*l33R1G14+bb16SmQU1bSZ9f(Dj
9Jb$e(&IRN4XZeHClVjJV@Sc0cUAM2Pj`2VDNb@-a41IY!L#MmDrp#cYd-QN'M@e
GX9%%J4Yi,-TP+411(b'`H!T%(!!-0diB3NQV$R1&I%6,UT[K(KrAEDp&"pff%48
L,@HPmD#E(m"pF-)&1LdFY@3$E$*aB4l-k!)lKi[5'pNj$ed'-[E&r!k2X8E6ei6
!1fX*LKip4fbCFJDNBjb48-M[1ClZ($jY"lXP1JheTq5+%808%E0P8J((VNhN1Jm
A-kjS'Rl4K"Cj!N"T,KPJ'T0G5)H#-(&A@j&JJ@VjI+lUL5Ui-,l#9H3j8l3QLpf
Br@P8+54#%ikb!6,,!SNcD%iM&%qB+a,1M'*XiP"k'JT'XhHIKGQ"M5cBaUM5-N!
HV##Z0SJXc#mZPB0)%8dAQ3Rp-SQN%`Cbc+'"USN33U6K#R#60Y4c*[2jU6`XXVk
GcS%4-%0)4SM56dH93I(i)DV'@[f5ZEMhbYA3pBVcH"NVcMATA3&UZUpIb)B&j)M
RT")jTM48)r+&)KLkDZ+LcF-9b$flJQCH3K$Y$-5[A2@mAA'1`3)1d!d)cLQBjh+
K!1C0fkRb*kkdI#1U1Y3@QqCI$48%DQKkbZQHV)$'D8ccJAL,Z#ZF&q-bQ$4em'E
CqAIe!8T`SEE4!(KdQ8`31QTYC'L9bE#d4bD$HNiQJkTP-UMC6!B''@Tm4Yk`qKH
&!+H95+l5F!k2"#04"dpIqCkE'+%0U&KM5Bc,&HF!D[1S@V2HQ94`Cje!S0p%NCA
ZX%M%Y4!+"Zeq)U%FQbF5#XHkL"3L0%U"Y%@jC1AbfCbPCP+8hFKLpNBC"i&&bda
#GZH&QIp2B4bK'"9NTV&lV0-aPNa$0)*KXC!!X`018bSKS",GA##[#lMiSiJm'@L
%XfiG9A&j*a"&iI0F)*TX"(DF'fJ*$DITS!iFIQX(e*(mHXFBPaF4Y#lLTa%*GGl
%jV-N4!FL"L6H22bmKZZcJhX*[CJjC-8aRBTCXMDkh&(PFPR1bp9H9GYdQr"UdHh
J,(U0q$SMF-pFQ+2M"hTPjb6B1-dQZ4T()Sb2(CRT[('RmbdG-"BiLQeN"ZTiQl(
%+ceT1fVldRD#PA3[)j+RVU)SM1!6Jcce2J[L%%+Fa2j%VKi6D-03l6#Sd1`%6'c
M88fABQDK(QcK#$RQ4aL&X,Q6Qi0`(KHbJ2qRX#cJac,"+)i%6*Kq&%RN)LCT$Bl
j-LU$)Y1SLj!!@B,pZU2m!CHr!A,qMbJ'#M+aYH2B@Nd`-X0)dbr)#"%XTYTeAj6
G-V0cl)mLf1h03K#l+h1L@G3Z#DKi#&A9@Q'SXK1SQE-'8FP$KGqb3")#5VMB$!'
NX0MX+Ua)Z@U,!d&ldFQBR5D""i$JqZK,KbY,R!ZS0R3BL`QCIDDq+JZ6ii)V)$Q
0LL(4NSKN-S2Ge)2#"QB%`'T"CI`fVY*XB`GfHG#FP!fB3*JM3bQ'c(jQ+09@R(F
@#L$'%3BISfRbB$bP+`+fBS(k$rpcJe(!61+a*d!"2qL9Q9a8jERM`*LYbM1bfIM
Ib$m[(DT))9MhmX1YJ%"@)G[Sq&&PaAR0)5R*%H-36A&q-PZLa1+"-"ZG&3EC-$#
5S(Q%RcM5pA-rR*'lZ'S6&eQG@bJDldFPLTBL!U!K9![j%1kR'lAlE01UY(e8310
4)ea!%dY`BhhRE2-0[kB$kPNaK-$a*SUj@rkriF%[0'%(J'J(Q2k0X+$8k&c8qRL
jEeP5i1&M0-b-4RZIjlIdf+iDARL`N4i)k,a8$9e+MmHEP"2M(X'R8`SLk,XV`#d
e1&A-,!BdXN[aT!)iCFlMM%H#(CM"i#e`XP*KLU8VVB$0Ak)b#k*b%G%"%d"T"6!
G-B+%+P13!#d-T%5!+"K0,$8iNGc5VCB)EZPL*iU%%*!!C05fG&(-pR#[TEpNY"G
$PDLP[a`4&P1EPF``)$d3'P(reVId9BK@3djNYA5Kma#q9P-lQ4#2%L0@(p$,D"c
&[CC34MY2!TQ#5+E'XDk$f#cFEf9%IAJLSQE8[XK)6#lKYal%CLBME41Z'SM6YH0
8RI3G,,dDi-N,Ai4%$eY84H#Kir,3RK`&HF%XcY)b4Pj,bpD'[+BG9j!!9jB*%`2
CVUUd)D$30NCHD8*"AKFPG'IN*@mXEBJADM26*%CJ5mYN"*D@U$fFTX%8)5-`G,R
!,1)rPbYALJ!8(Vk"`RNbUb)P5-arNX'!+UUR'He14J`qPdeJ`Y`lJ3P6m!*-Q!+
C#G2SFE0KFKEb4TP)LhI+9`TpZ(CQ6-k#r$-rQ4Q6Xe"QaNaQJ+3)`*iA%bBAd'!
jm8p-KiM8E168c+B&hFbB4LFcTM(M%,C96QDEFeUi5J-8I,SJ3)a0`(am")'*!a3
V!b!DE,DI8B`)&CMf"GJmE0`TkV,5b`D#!%cGY&IbJ-`QJ1(6'f9#U"mcJ+)DD5Q
$%icBEkSGAQU3!![PP&)S,l!9bUdhhB9bDkjF++m9M*(FJEJBKL'2Z5m-`#m'GNY
`IRT8[U,BLZSmd9GkPRj5HhMTT`b'#+$&360AI@#'aY*2)+EP3@PG@4%*M(1"$r*
CE`K8Zcf%LJ2KmBlRHZ'BRlbPcqaEd&Zia!MQeB*$K8[NUBrAZp#4`C10JeA8"0T
`e!#1bXD%'J`rJ%N(N!"*[TjaD!,i9F[J*pA1qKJQqDSjfH6N`Z0h5Yd*'Gi13%%
&X0$`a!4G2XmL35-N"SUP9JX(%ca5SP9Klc&$LXd*LXe)N!!4r&c#TaB4k35V))m
mKdUI!)NLCY[JFBe2$,CTZNCBp98P`8$E@rGAh%"#cm#'EJaqjQ4Ub8T2IZLLA6q
LNV$TXjKH,Nm(k1kKSDj(@#92V&ifm-D9rZeqd3K&UemmJ3ipLMUlYS+#8rHrmi-
piHk`3VGijNY4(cHi!Yhr,U01'K)X1P3#SkSph68hZVK)Lk$5C`a9RlQKqa8f4`q
KDV'LUS'j+fE5b"F8@jKC"B8Ec2E&,L,"2kdY(*c1fH6"cI5BXM*Pm1hG6lS+haM
!6lB"NF%J*QZ0@8%21X,%HFX`+R6TC@HH`AqQKkL@+ZC[PR9ADlVJQU"R8e98Z4Q
0%1d,P'@l['@R52pi'EBecQ55k$'4'3M38#lN"L+XmND90EjiUda@0-$NZMX*p(X
j#4aXH-K@08M*)#F9TSR$`V9#bG5#*@He-326L0NklYRZC*reHrM"[)',LQVGBk&
BVhh$+#[,@4N14Uj&Kq2TXFf@V""N2QXVqK%`EL$V8&PKaL1VNC6GAdHJ-I0QZUf
)hT!!YiMU5NPNhr98L3i-VmH(,!EU!-0Ml#Q!XeL)aj-Z6%6%qkpjBme4Jr53!*J
*XfZc!GlAAS2a#jlS'K5IF#4UZ&!J&SVhmCSYCX)!dqcAd&4BB"S8#fmpLSS6#b9
8B0BYJr$D&JhYm!k-KpQJaUqPMKfq!A0B03j&3ml&J80BJ+U&&5ALelILdA'DLQ-
H2LLQXr*P)!,,9!X(mT,8!BrarU5ZDbdEQ2fri`Ci)KMJb3F,a-fe,&kcf#J[99B
BN!$FKPY!16a0UUd`2$JSEre04+VpH,$jE0VLrcE%!+!DkVSQ96aV"PYJRYYm&bX
P1B$b8'2MDYH("H*M&169m[69RGaJMm"iHc@,Ve#p)iVXChU!MGPjZ*QRZ`*0ikH
6ZKf$rm'9NH%kU1+a[J-3UJVAC3mH'HhLBN5HbLidmf'3!1$$(L-4+b-LULFh$pr
,(Cf,f6Nlac2"LV-`)@Dl-LB-b&FGBXHJ*!m3"kSL`TM&aj1kX(S269aX3fKVP"R
jNcUC,)%&'TlC0P8r8$%HaJbQT#NLKQ10K!af!fL3!$A$4`mUj4+bJk-0AK$RAFi
(lRB*bbBZBT!!"$QK5h#IK*QC%$1"6eQJQN)Cd6Z0h"%UNZL4!1L1V4U!M2h(+@Z
UA(SG4#iq))S%2NA4#bmQ&Y5-k`,$8%TrVcJ,,hha+EaFa59i29Km$N9&9V&9GST
55,YCAR#k4e(JJBY8IS'BMN1RJPee5R'!+RcMA,(e*EK&&CpM0Ebc`@KkiH-Q1er
4dRIAFSJmfIB!!cBD"B,&RBjj8+(@9Jc!C&15cErDQ0!`P()l*Rp#X6!JN`'(Mp*
e$KDAm&%[&BLTaDH#$A`F(c8Q&Q!Td2K`RjJU'BKJl*DiT2KaHB[b9@c%M&1MeFf
#aY"rXpKZVHfBMj9YI"IEI3MZDkmkJAF`Gf*#)@KPB'"+$2FfR82EKP1'IbP2IFJ
j0*%ZJX"EG%QIlqhR`[3Kfd(9N`r#!#XYVKUfAG9NF9@Va98Pja$X#YQkPZ[+3pU
'8BE&&F1@9ab0L'Z&MiljJ@CZh[#B$K9'P1cq)XlZ+jX`@@c#5JjiL`Cc,3ca,C&
G%#J6e8m)eq'+L!(m910(HKL#[c$3kaT3-9b*!8Sh$89!L3YTH6SMD2c-a-rl$l1
40a1p2XDV38`&ZbPK,p6ThKL)C3)BM9#(e4CICh8B9f*,Zd05E5SaldlI5qBhXYd
U08`p$h9DEI%"9UGGkYlL(FL,K0MBh"EI5kih"QKJ,9La%-cHb(`*,b3$"$@!i6I
b35D!B3N(J,KCIBK"NJ-r4,pL&MF!b$e%mS[dm(9-*rA&)rE#GP&m[0!Il'#9S4"
k2%bI4#!mLVhi%,VG-'Uqr5lGUlQ,M1cNC*C4Lia@C04%4)q)`BIc2Km9QqQ96k5
pNi1%M+Cq-12&D%T"4RU`8ip6--)JX9'!bJm*'!m6HYM%`+2qVIMF-i68#%Q3!)"
&$fh#UcX,9c3E'HR#J%Ah#39%"cQ,B4p'YUA91EK6G(0HQ%8i'+`l!m#b$qka9DN
ZXp`Ze0)3k3LiRQ29CF9cM2*aJ+-l-K%a1pPHR%%D*rEEma[`N`pfS`%1RXpH+D`
FUJcakbYTB$*1"pYX%cX1Z3UlXr#cf9ACABfIHbeCE`%SiIr#4Y4V[Xi[Z"+(hNk
"a@F[&2l+%MCl+aY$UI0)(4pdF[9hJ-Il1ir"k*Ai@@Re0McZTlPZR$rB8!Xb%,j
)4ml*@k')ae$Br3l8Q@5@eE2md2hGlf6ZbGa$IrT!cLjKdJkApX03e+jjP!%eITL
,ac'9%,Xm%'J0STTE3+m"#a@2GYKVK,MI4'DU0mc06'GhT[lf*M,lk%F@qCpH)`H
R((m9XrK-*f@4I`J%qFDl2HV,lm*J1Kl2$9-`-(kK&X&jQ-h2c'-(UTq9&LEPbaY
$G4jPQ!+kH!FZAPZ*UhT'2c`Q6qEK#j-4T30[X()G1SbL3`pYY,B5!1&*ITL,5dQ
QBp`"`Pf4Fq[BFPPrEIGQ0%p6-YfId+B6Y1P1E2UBXZN1fR3(XC!!F)NlhV0YZd1
jeRC6,T2bPK($peJ-$hE)2m9Sq0j*JlqBS(6K1klbi*AVL+6b&Sj`4TNb35*YSd`
@MeEHVXF%F,m-`$d(`#Z"-QiB)(i+JKPBQSE#CihiJ9R%Cc2a8`+$1X['@!#"HpQ
IPr0%%pL0JA'!Rk(A$'4MJ&Zm,eCMUB!fmZ-%p4281fIG#P,mk3#9cqp!X@mS0PN
B#5YP!`r14mm$JCdI*YFL&8G9T!a&q9KLCM6!e8iN!(L$#)5)IPE+eF`6qk"3+&2
B8$'TpSeF&1HPeFGV#pr)eC90G%NL"h8B8JjBSH"G$j8"'(#r@ac8FHCH6*rNh*6
$PAh"Z#Kpm"SE"H)$EX9Tf0)*`jDb%BEP1dDGV,!N6fF'@')I4rNKm#q`'4a`Fbp
-UL'5%Rp%Xl6r`5P`+(0%pm+F)"YQ,aXHJJ'Dp6"*#kE*leJ"US-QLi($6PPi"-,
[a#$1B502Amr1H4k2LH#+#'j$&VJS'"CI5B1TTF+[3#5X(!)`i0&%D@H*X@NRTbX
l6p0@9[)MP4aZ9e8PB46ep3*+(,kQdHcLeifeNPJ[%b0fZBRq2)APQjeN"E-kpL'
fK-I"PVPCPQrN$XmM-,F#c%r'r*,(Q#6LH2,hTS4VPV"rMare&BCCcKVm`4[5)hd
L!6338SE`ra%['%EDb#4BIJ!-A[Y%!T!!maSFG1iC)1G-MqbXDq'Fk8GeMbMF8C,
G$ecTkpl*6TMGfk!+FR6IaFJ%epmq"U)bU0`c25[G`S'!a!TRm&8HRJ9Kmjj2m'G
JR,"ma"SE!DEMEFl#Nbj`-@ALKpHB-SE,aZU%!kBqmHGi)#-Y2FQE6m#JV#4U(Z2
(R)@*JETGZ4!8S*D2B80K&)ke%(KBLDM0LNX*K-1r`m@YLBGS)BE)N!#01'cqAH@
18!p0GhG)QmB&d`Lamj[kK1`i34fj%Vb`)`0m+ZJ!5'[PaahD"1Qbff%CEIbIFaP
Y+#+e&NEDTRF9cRT@BFJNPD$2TT[iMdf`Fb!H@`f6j+9-9YG#1FK9R,pPK&[(H9f
TXF3*E[fVhB#'S*cXla-D"0GV-X!Y1qm'1$6QkGDMZCa"G'a3Q-F!TXjJcFUTla3
pZ0$''&G34q'(R&@PJ+eIHm#Q)$N%&9Xc"mZ[[YEI)bi#K66,%bV12lJ35aV,bLK
#!-5DZr0IBN$EJJppp`S8kKX2SRKKGV-c#9mml58)5LqHf13KJiP*FU%E(rl2kQS
bf-9rFXCimXR"YV%ZMFF59"8MSc"C59fB"HVRD6%b1U5VBK#ID$$8fFPd,CB-mN-
erFlXUB9"p6IP3)$%QiZISZ!iJ'%DSP-j1BhPT1#GUaL2[$(iVe#9'1dSNAUdZLf
a8rDU,alXbp"YL!f3!'[I+%er%e1r4e-MmS)ba"r3m!Se1#!-r!(QaDm&3c!9jMI
U%cJHMb!U%Rc"0[P36"rPk9$2j@R'P`j1$*!!l&l-K!X@r1,RF%Gi4$2H88[ND%P
NJ%4@@k1H'P@CS*C"VFN$CqBNh"$jmBeK@`FZrVL,i#j'jE',#V(bb43j'h#NbMS
)BU0Xb!i4$9I5334+H&BJT%PGXK2L&Rbm6fLkMIl8(ARTHTL9Fd25$qVU9rVT6cl
*4a+Qf23XV[(C-'IpYl"l'2fT,!Sia(Uj16Cmr4*HraRNDN&EfHL5r%HCD-BEV$4
0NUqfG"d$"$Z)bN$&!5iB'V``aJmfJ#&Y,TJJA-jQC[2-KhMSAe6rkM2qE(,3iT0
83@1AlIJB*F[LT[&Dr*1EiJjU'T!!LE$d("ej9*l)K'"NL@4db-aCeimeicriMCa
)-TQ@4UL,A5EHdKEqT-2Vq''`3!EjM#,6XU51Glm2pafqFT`QA*!!"bME,RFYfb&
IS@b$[2QbI)f(e9#@IdU*daL8E2JA5M*#iNrId0LFT'@c[dfb8DaQfIRjDE2'&J5
$BS*j-+VQ'"e`+RQ8rcIY9Y&ebaq''M`bi4'L-bpB2'L6(Q!!-)dc!S!Dpf1MLje
EjBThGCk"[-`1C#"lkhYKpJ#Q-fFQC+0r3*AXS0`@l"hS3-QLIE#S,jmHJY#,4ea
0B+Z6Sh"bJJ(`AVI#a5fXe8ZZ$-jJbNB+aCYMF`PXm3I)-!XG+V2&E'U*b6`BP2m
m&c`dHV'ZP2mm'2lMB1#qYcJIaUhK)&U'acI$e$9AG(`Q[ILKa!PXm$`"3bNC8iT
biJ`@`fPfR0%A!1-(a6AiE&3q9p'RK-F4&iJf+40SAZ)Q9i!EBL&AaS+HkY#SK`P
9I)@(MmdJ)i++Q,"d%cD56Hl9A`a`%Yq%LfA)H"iUhNeFR3Q!"'1(5cFamdQpJU4
YidpZcXljVh`i(i+953CkYb&iEm82c+ZPEH)(jH1MP)-mP(DECTjRi('"d8HI6L5
+2aC$5#B4Df-A5(,f@YEpc`kiqm(a4J5f+G0@%$P@"(90c1Ei&L-h(M`BiZ*A*K9
2`-rc6P3*TiARhFDI@J9-Z#9ap'+)cRDaDqCcr2#!d%RqmeXL(RV)!cq3!#SZ6V)
GdifSA$mK#+!iS)T4"H*p%0L4e8G+P*Hc"[VCUA`Q*GN3+@-i3I#Sj18,q)rRQ9L
SN!$49(rhri"!F"hCC#M-qGAN'(b1XK%rGdiFc%4'QMk&a6m!!$'*384$8J-!@#)
293eQ4K%3)H2ZBIpY[jDUp1E[ZVkjRZEaZDkVHUUfHN(c4(C50`EXbJ+pELDcXmL
IapEbN!#1kjZjK4$#&HhRPae`bSb)6Smi&`i6Dj,a21YN(VF3AXr#HS4`HJ-MK19
CKp'!J5EG*1pm-alVlprIrrGe(5#rZb6[*5mr!"9hAL6c)$)L%L(a!"%L"PpjA5C
M-Ic)[QB"T*JF`#BKL'Dc"i'6c+,ccC`$Xa5a9),[cI[c[JNMq2[1JSchF2@f@SB
mSY%MV8-I'AUlS891h!iA+Q+ahrf#&3q#ZABef[bF%Ha[peYmAbq54K$KDeJaN!!
kh8!@KB&iB5#&-`LN#hcT#5Ca[TcDLS#`Y,p&PZ+)j*JiA%EHX6lRH+0r`$m!X2e
KIa`rPp@YcA%SLmTS8&TmBc$4bZ+r"R`@jJ1aC!5Xi(+BF1PN%LCX`R6h`f`39H0
PhZ`TrQYEK)YPD*95!c)i2A(84bha-5iqSKVa4cmbid!D,El@SbjPd5mPY`)JVK1
A3b!U,dV90%+rlm`TajGE(0dTKMf$XaI9A9I%!pV[1c2+!jhk!pTdb9'Ak4'AmA%
bSXU6+QLIY-LH$4fqCRA#d'`YXKR"G$0!j"""ah8)XHTm'@2q8C[$Eb5,YDNP'I8
rl'P@DkRiSlDPZlB"1@iCYm&`Uia3IaF!JM![3a$RSq8K%XK$aXE"ELqJaSb!'PQ
XU%"r"jEDXcd-4JarbJErSF96BJ49!LP6eX'PTBXCK56`8S4aGS4`9ZIj`[+YhC0
"6PdJr2iXGhHrj3QRX4a+X0@C9hZ-C&Xl312PbL-AP8HL@"VBHhmdf0pPK"`@`,V
RESI8RBpqT'S&lIRlNdPPJ9mX1,[,5!TBR`bdKJf8`mK#6QS`3lZY[E(GGi90&JP
%V5Lbki[Z5)0P`@INT0PfJSST*qeY*`Vji4`(%pR)T-3dPCJQaA4bZ3Y!`Q3!PqD
``mUJb4J-pXr[NkUlCH3V#"*Gc-M`LY26SG6T@-bA0+L`!5fH3#UV"`cT`mE'hDb
DDV`jDGejSV$NAEl6BL`4X-E`PVE6!ZLNlU+mV!&5X[,&2fY48dX[aHVm@CF%qHP
HeVe3kpDDZPPB50eShML++'b)EZE&*P,1Dc)-!`SiZRQKQC8S"m8%pl2idN($dU1
,#lR+p!)6"F3Ea04+dlTYX(j@LC-46-h%G%*-*k9H@1YH9!UV+SGLqLbV6bE$A54
imFM$LZ#P[%k&j'-"qHbMSGeIc-DKlZA`2"I$kaCe'e8LkP0(3lc",*)Hp-#RiJ'
hqIXe5)53!-#fcI0@QXjYYf$6V5aH'&khNFqC(LpIKS$aQh-j'4DJi*3QCGX*hTK
rhLF+mb(9RmP*`j-d8QdG,'ie*1"#,[K*A,`2PH6LRM64T9PeKRQ+9")%p``-"f!
5S*A0"e""EjU*9J'@2,V3lh+9-LMb[5F5"9le*bTQG)E++ec-5U(bKc&4U"kp+KF
6PAD2,Vr4!U2(jDDZZ3*5'b`%Ef!UJQ,BT!Lj%Y9[a4'SIL'[BR%KrdZV[MbYiT6
@q-T1THU,k4#eRKKJQ1F99K3S#SL5SHID$'ehjNkIRj1Q8,dlj`,M(qeZTq#(QD&
l'53FP-#RbPK##NMMlZ,[m'Kq*0V%!9MiZPGMjXQj0"II&Z6LmTrcf#p&hR[BNlN
8a8r&T5"qA1UeUbLBCcC1KNLY3&baVf(6pSa8Hipp9AeDHEAbf&H9+j4AaV'[[ZT
@AS9SDimklU3kH)ZqF!-#UAq4-DqK$9A$T,`B#V0cB3Z$b1CNkELYX@1kY+$Y[Qp
-!HLbEHdXh-Zp'kXDHcG@kHp#p@qP+CX2)$5BmL[cLa$Km%B@,LYc!Sac""i2X&V
eM+K&9ePSfQ5!b"+,-i@UhZ9Y&k6kfX&HVhY&HCdrf1Z[EP*HHipj$3Kfmi,b-N6
XaU2-@+4AhK5*2NI"94L9CPH,Y-mm#`+L(%j#+'Gb1FL1F*+1#*m"YJ0-6"$kJBm
2BC*P9MPP@f+3!0i6PZh3DRL*#HLp%G46H)2Z%T61FK9FaV[S!2F"8k&M'&0pij2
K56[)pEZbp96$eamA'dJi5k`!i64KdRCKHPLX&8A4RA-`f@A'2,V4LZblNX0r'bS
4jXSJK!Cm*Dd+)6%cdYm"B$$+(FU`U%LSd,3G2qD[ld&&D'mK26reYf'V%[cC+A&
G`dNfjpP"`VZd1EUH!rZPcC%2-DRk``%NY@!1N60r11#cdl&@1VE9D(G,[2#KNp8
!8+dec[H1)m#f,mK)9UJiN@B5RFaUMRH)&!8RJ"cM[ce`@jMDIm8KA['U1!"c+Lh
@b-$BY&D5QBf6bGf&mIR8Xi)C1U+N(PjQaVVbrpj(XE'Lk1le)J3ac"rMFkT&FUk
bFL%dpe+X@Kh("j-rh!l09FE@UBYk8F`@Y"Bf'(&iFA*[I5LrAFlC`+"@4r2"@#K
IMPY9*lTJCCSBAZFLYKM,QcMFi)+f%,%P9LR5+[mArbrb2rJ[HXar3H8r$Im&m*p
q80D#&*)PZ-q`E)EceF2i3p"#MF++*&K3',6'K[`2Ka4$V[Q(3`Fej"fFfQ9$rLm
X1KQj-GbU*1RU8MKmZjbZi-N2B`[ErZ%3(VJiM'2Q)UPf+F[PY-'6[idY@%1@@#`
MLj22elHeKl$!b9fKVRH+M8CD!(&T&b1ULfr$NQkMkNa+Q!RI"X'H!$4AEM@eN!"
UdD4b'e#YUCDrKUA&kKDdLb%eH6(+DB,BZPKG43!X6)J#f[['J1L'FMZEh5-fGKl
a1+PcVD61jD,1jD21GCNkPj3A31iD`GMr'fm6ZZhrpCmhcP2iA9G$UG(rhbq9G$-
VMlaT@[#SH#64AEcLN8FipIl#hBEB*C5eY1fTVDSN9j!!bH8`M'6d$I4B6Ub'ZE-
6BH0LQD!#-DP`iQUcI!2aQ&3RH"*KaBp*9"BqNaE`F",@Y,I)MpQ")hS[*"Q#X)*
XF)+5EiEja9*%iPJq2%Q(4p@S)bjHdC*)mFGlerZ5GJ*QiRMY*39ZRN2ke$UBmL8
b%8B`PlU8qYR$CArj[591kP)&MYRk&bl(BM+U)[(iK6`Q)AH%*h2[bZJL#R$$J-H
VT1-"2R`AB5f5qAM*6-k@FjbLrQjHKX$ZQ6i1qbU2B-UhJS$3GYjR0Z1-4%!CM,h
2C#r,kD!r[-@Jm3S8LYf)%qba$#kF)$ia@q%QZe*i8Tb8BlG1I$b!`rrJNp&U1,$
m!H6-B2)'NQB(J8VbFDU-lJ@Tfc%CI2iqJ"QEFHmCK8Ai*bEL%f-5VTdE!Iir(-F
4A"5!22GX)bCh+K+@pV(B)ebJEHH+)U6%bcM!`T&r`*rhXrC8(Z%9-l6NY-,1-0Z
#2jYKJ6JX9q8c)5@d6Jf(SNZ,3P$,pkiRKm(e91#M91$Ab(MJk%FG6-Upe0eNT*8
k(`!)!!hZV,hiMaUA3"jp@AY[[VMDYJ5#hMD$JaN#["KppA2%S0ihlRdAiIL`RF%
j!(PKB`BIY%8'-R)iC))1m@EYMRaaa(+`3kU'(&)ep""CSQp%[TLqNH,)N!"$kSB
F8RI-)@[dMFJEk4XTMJijT(E))E9$$P'(lB1N&5rbF,h5q"!@L@GQdF,*jYeVGp`
(M*NK`i6EbhX)4Ga4r%49!iDR`8#X3dfRmMRGG&KN0L'bLEhV2GDCTB,FdVle[[2
HddZakQ%lILVlmiZ@e"JE-%,Upf!k*A!L[3R6+'Gh6rcCKcqV!3[Zir3A-j'aI@$
I$R'B","P$ZTU(iaU1daj(fkfrjL6C(#[4,KE$rCK'F,Qe3DkDfc&lMGlcc8a('K
6NkPEV-"mq6-5F0m+0FF+T*G$P6h-V2@0Jeb9-3RVRH,1hRFHRqhZ&,Q$PQ!c+cE
Jk'PCZ9rCqM8%IdCahRE1paSZ[U+4ArIUhB%2KbYI91m3e!h!J+e%FH[G3)%ESUN
"T6-NKi2lPP"d'R8#"0GIEHC1J#*Z[8S*dmd0)`m'1abk[L8G"K+TH+i#!+q6Pf9
KUZqmFmVP9hYaZGFR3iA3mrI*e+m2GZH*#Hl1'3R3i#D8`RmR1!iG!%AifHq#Y!+
fYH2&59q5!+b6Eje'Q[Bd%N4GaRaMem)hq#8kfKJ@R8!401('Lm)ki@M2)$N-)'`
Ehek-[2UP1cJb1jb9VfiD(Xl,aL9N*!KkGrPAaKRQGjh2cQqcc(A$c2F!E$K4Q(+
Gamf"a3SC'`9XSMBA!XrIjih0CE0b`m#XYKJF!d65J-XZ61J[rHkXp'de3LM`HR&
*d0F"GQr+E0bp#B5kK!Ne!IMP$"Vc!lKjFA5M@P%)A)NFrT*)5#"*"rI%3S!qe2%
(+1B`Jaqic!hX3(+#JBV*BXVqlSDZ"CY5`$AFrH!3a4HSS8GDBLp+kHKDKUe1beK
f8'69fh8iPTAepr,9C8AbVA[9*D2"XH"P160@A8ANe5`1fQ$%eEAi8m-"PR(qN4,
*#Rh!1hlNX$4KSLi5%-30JbjR-Y#RQlCZa'9mif)c,i&k(i$STMbc)#k'"`BI+ep
kUEV5E4Srr10pF&H'bA'3!)2`,iR1ja*"A+`FS!$$UUdjk5R`!RC&GrfTfr4Zjf9
'#!5"&eZ&Qf49DZ3"6('+KF2NB@Z65(fLfQHVpd`'RT'6"+)Z[mj'#+aNV(S[QcD
U@5j#5F-&`-"U(kXZBf)b&FPV!)5d,ChSr!1+-p[ipml'cXIbB1h(i8)*SrEB#@D
+q$JN6,RMaR1m153%aj9!@S3e$L)J)d3iI%4'h%3m,K,TZ&+mN3M+$B5Ijcc&a4r
MTkJi54qlLTIc4pA049jG"9E`Te*@ekQ2*cj%kF0)iS0'(kB5(m,dS5,a)8)IFQ-
"0316EUNZ8BfaJ$[+)PHE-Bh30*9M"ZahBKQUlDmZFh5E-"*I%9+mC38(L2cM4Q"
,*ic1pH[l8LV+G!FAIX&djmQ8,46ZcRrB-4PNTUqYBe+LD3&8F0Y*J+6a8`e2cE+
Dc8PIXa(Rp,D6QF-G2fCAQZe(hS!Dl5)efRaCkX`'h'[#["'2A,H*0L4P,864bXV
4Nk4Yr`fkFVN)dB93)H`b&[D8c'YZk`Z*08eX!b5fF4,E9"Slh8YLkb1ah5@a&C2
3(#5dZb3dP86@UcS5`MU9%00!3N!V%k,**S45J&#mLP"k%N)a%d)*#D%iUCXpDS-
$HkB3k'rIF!Z1IGfH9S1+b,YabemHIbR@HrbETQakidJpLQ(HDI&hq5C5YpJCGPS
FmcIi*19DBk2$`YdH$A5d+e*dCE@8SA05hKHi%`N)$DU"fF@`Sf2&VGX[8U!6U5k
j2D&!,S!S[P,MHS!MV!$p0#Cb`U8E$MP`@f19mh`R!p$BiPKecHPcYR1@PZTDTb9
ULGA'BVLTFeT!E[)kZH%YU9C5'I'$GIqK`$5j%*0$'#Xe#JlXF)+[BbGilhCQPa6
&&dChBq'1NA$$*0BCp6)FjC&D))GeFPVJ#Ved+R09JH"'M2--lL3H5!P'4(BUN!"
Ga9%2!-+50m9Vj4$V`5lbmRlp)TliGr#CLXlqkl1a+P3Ia"#J+KHaR3'YPbfZ"`3
!#B$`Y`3(TU9@6#,(h1Am5%PiKVr0iNLjG2J9c!!*#a$6j,cB-'!VrQJeHNme&Dk
UdD+(#'BE"-`iL%*6)c3a+5ASc,3a22BPbA&Y+38G&qPeN4iXa8B8f0D!-PE6i5R
mM-P-X38X60%NdX-Eeq,5fdieI(l%p3!+3'UlS&,ZFPHQ(k[(04C8j`SEYpcA'HD
#LI4MGKB**%lS!J`HF,CIM(c5c5iSFT[KmQFLDhc4rJZ1@fL3!14Fe6lp-a(i)m'
'$fMZma$!X88i9cdmmlDiq'0p-%eHc'TJ"%dMVXP94Y)cJ3FJ`-G@ZYK&If(QEDL
m%CKe-6i@k10Y2$)DDF'(C[S`Lq)CjB5DMddM`mZVEG`GBL0hpXZ(U%(23hd2q+A
"Kf9NkDQ'9mrbj@-ME1UmHFmBMXh)RP-0LcEabRY0pKMrK!H3!'V#6r,ACf910Z-
R+a(mmI%ri*[N$rJ&(N)(dcrET3mrBAR@$k2h653fQ($aMhhVc[l)'T!!EAEd'h%
RL@b[TTX*ZYQAiC[QliX(i[6a3)&[5KqKMdXPFK8qYY%$aI3!Urm4)[[EH8TXEMN
pi+-(pSL&N4E")Z#&9l#mG&1JQaVPS3m9Ck-4pdh45)TZcY)0i2jSQ-4D+TL@a[B
&1aQE+5##2KJ)8XT1,,,j6Fm!')V9c!DMH2BCmH*mfcNQ3!D!mpL"YJZiXCpUf,p
G)8BbXXq`-aaVf%%QhXm`8AVraaI!&Rq,a,ZFMm1I0KajM4d0%5kXaH)H@Zb'k5r
$KEIM`Xl#I,5G`38'MJ!1f(N5PCk8!#B%d)#(bbNCY)H1,M[9F,L8`9ldiLj5(F9
FG65Hm,,5ZMh,m#q+M"fApKQZ,$X(e@3Y)-6Ai)#d`aeA9+5SHLXhUM,Xk$3Vi!6
aIP2(N5B1)*5+(AATNM9$,Me!KS-d[@IPPFK9M4FBTV5!FNN8@Q+KF)(HA)6&c6R
j[B(B-MVJYci00bT5$J!CBXXm[FUQ*NJKf!(LV$M5a%R)f'SR9bRqibDU92a+T+6
qF$ffbJr'H4,EJdIUP%HUa%H)@da-46@BZ*4FYepF(&0H01)I4GG+)6N`bPhVkE8
Me,@8VTk#8"HiHcjpIH3"EQi2G[@RVp#R@G(4Rli*p[*CS6DHIQhN!4089%VeK)Q
FrPCY9PJ9UTbrb5I)l%j5D%P54$"AE$r%5LM015XVQYH-lfiQ0hmNZLD+M'AYXm0
--KZlI+1MmHHk'YURScID#i%YpcQFJJ+)JjJ&RZrN)1ql+!MCkIK!JKaSep)D-jL
+Qr3%0eMMC!0BT`Uhd@#CRF[-EqmZ-PEJf0IEQGK6%*'4RHbdlV1+CQI%*,(,#P,
8j1KK%3h4`QN0MNbML*+rc[BIh+-0K00HdJDJLP0rrb@T2I+'-9pN01+5Irm'$JN
2TMHYeXbJJdLF%N!6cfK)A#RX3fbB'ABdV'290HXrk4Y'YkZLK-[M)&mQ1c,pp!`
r9*!![X,-r)r3'%&'m!0J$$rVC&$PG+2'A9abUM0CN!$qGTpeF[lB5e9cBR5#5D$
9HSb$3,KLM*2mR'CepL,KC#rihDf2f-iJ1G4[i36pD($[Ae("2BALVJ8$fPN)l,l
23%3fhRKk`Fj*bmE6dbPkU"B22DA1)J3-([i5&ElCH2TfUE(aF$dA1GmZQ%C!19S
qGf[[Ai%8$MkHiF0Qf3fT4PP#RkBR`$cH3P1('PULm@8JY+Gm-RB*NeV2V"(BV3Z
9`EUkU)9EIhQ5839`9ZpQ3j`Np`CfTc9JHGhLl)9,CafC"%bZB$**MVE6BT-$q+L
&$k#Q0IDh!%RqVMa@4F99K`URBPmhZ#')51GAT6&Z"12Rf*%IE"l%ld44CiS!jf4
JE$+,MM-QFj41Vf%A(fB,@9JJ!*9`1'Yf4`lPlrjN)$$H2Ii6&$Q6Hp1"*)e`h5*
hXNUp@4""J+eJNbIqic+Jp0U#k,E*JTi%2N'Ar"SE&l0SSQ'(c1RXfUQ'hGFTE5j
p+M1jB,jlM(RZf&kcm4bFKCMmY),X!*,Z[m!92A+5YJpS'edqTaU'[GI5f,(!"#V
Afb*c#0TVHdqUZM09d[%'Ja`)f9Ib9R`&e8`FD6lIbFFU&di0ARLfR"Jfh9PJ$j[
V'!S6"CQlM),%JaP$&#DRjQqK+2I3CkI"$NdS6QT`c1abH+P%Xc1CKFT[CT@IlKS
%80+V&bme"bLc5JDqYbM*GM6HZFF1)$FZ8#-YJ[TJC0Ji*p3+qHbmJ'$Kl"4La6@
+"[%q*cNaf8NJZa#bl,SB9C4T)DH,T5&1c8"-GTmlkPK8)91)8r@fF60KT4(&(M3
RCH9iRpe`6M9XfDQ3!2A(ZF-FZB##3#)KNeHG9$aQ@hIMVGY#MIp#(HH22fa5YF8
IrUBEQka5#Vf9#Xe-#$b9%%ila)fAMLEa5'1,6%h,kKe$!T3k4Bd8CZiY-M-mQQf
I#@)bCVCr$f%b8-D`RNCJ"bk2!j9YjS3)!f6$`R%fdYE13D[X+H40K[#MF(`6UGA
I)BPIjFG(MrM`+$k8i+%J"&@ARDF,@[38#$Q9PT,+-0PCbpp1$G6KC-EZ94@IqTS
AdFaHHShlrPl2*89`MkX1GJBlKkk+iNkGND95G6R2pjjIqDNCafAqACJ$'m-RYpJ
%0PKmKF9ZjD!lRT`ib*-b4f@%+Qj4V61!CG@iNJ#k$b0"!fki(pElHhd&'+&*E)I
G(9fdd%(8J%ad@X90*6V%1DPH-AjZb*L"-XPHPQ4D+mMJF`DT$j!!r9D3!2e@JjZ
I`C@qf$cb&c$kHL-2KT1"V8eUNJ,)H[cCT,J0@D&!'V(e(P6e2@bYKa`)0(F@@e$
am4p4+0Y3q1bUjX6"ll-#SqkP01FRaG8M&"FB9ar)ciaZX-V!!qANY$!@fi3rpAV
5(qc(2k)*5b1(K1KkpUZQiJJlQS2,"%#,QYKl!#qh`d9e6k`F$VUlBQAXTKXV`FZ
ABc9JKj)+)bBM9BEGB@Qm06Z!ier'RrhiXiZ(22JPPbiCFZP&[M3UZ*e)bm[0k%l
@XGKl'c6IK$m)-cU`!Cma@6ecakpjV"XdMhdii,JMQLk!29hfh@9`9T)`T4V2-2m
dBVNR!i!l%UYK0bUJ%fp"3I"NE"Z@#LGD@JVB%k"EfGjaEQbV-P0EhJ[3-fXHr%'
iL*I"Q,E6aEc+a9lf@!qfS4N"R#lM8)@EM[)P),jF)Dih3BZcJ"F(!rIBqj2,53Q
9%a--S2,hCrA336*lA3FeXe`S+A@!c-p%`iBbd5!6+X+C8$JU[pB["'EB(+cDR1d
hSSPIQ@mr0Y3+0@3P-Q-N9*!!!49N#"88U`*"i6#U%XelDK`R#rB0YkEPZJq(++,
eZNZ9mB4XcE$c#SFjkiP8Vk(ZXUP)G*Gf8SlY`qm+Td)m8#mB*466qmD8dPe@(+3
l,+2Z))2IJ&,*+PfL8CA"$kR46FYP55c3DJEHfEa-miUd5X9P"%'*V[C3M29#jF9
@&2*aU$FP!GSM'V)5I&-JD'k83,PAe$ikqK-)G,9kGbB)eIS*rUa@rEUD$*j59(i
AZJ*)fA5TlTS5h(E-+cEaeH*!0D&@JmcbIq+K,Z(SJQKDIXm'fI+ACf-Y`Zf3!!Y
+8Edr`F1V`AUecK`(%@[4L4K#B$"35&aF0q$!$UBhMpHr8*S$l)2MR2Q)$HPE$3d
@pQdB@'L&3e#SF@$D2JVB"Sd%DJqea0CcBU$"-YKB2hE),hfD[prh-l$*F-YCbF8
9DFKl3ZjS3plh'LGjB(a"5NdGS)pJV@)(RZI%l3'B3BUh`QNVmIP)#i%#YUa*DKX
Ta$24V#!k5c$a0[me%"XTpjh4Q1hLC219)&,0B@lmcNe0p51G$+RZ)`G,9%Qi@'k
a2'TMU"G-Aak,3[ma%Q[cK9pTK9Z'6@8fG4QF!(k#5ZhN"SG`ebYAYcQRHUG@YK+
TqANDU4&*$bBfi9F#G-!fKCbFb$"%h`Bed!Chr9*e&@drJ1h(HA0S2Y4b*ST1cc#
%cArF9q#Q!Kil2QhL6fHLa-6q0VC'6G(d)8aP*+@SKBd*T6#MJpj3!ie3R&P5#cC
5#lC6$ErV8paCem#a(3U531d,SQ0`1P&QeG1+HYLBTKc%4Ar"&j@[Ni,B+03$#`A
+`FBK[mb#LFaQ,EmjMJVX8K5%SCYa[q@&&)A-r)i2+S'kq%!GTD5&k0ClU$-2CIc
+-#b(93GSq'MU(,+58k*VKMDGYeT*GCLN1P)+f2GCJ(dq![Xq*d,RRlSC`J3jDZ"
dTQH!`Z-"J[YHb349Cd&6i$lHX!li14@QdJVfVph4`H!H3YFG"`Ih)MjfNLf+f0S
pi55"e0)q#-la8$'mNBma!"!$IdKZ23&ff@8)GdFVU48r`IXA4A*IEQ*9GI9GqDR
LNTG5!'ml%dS-FZ%N5!LX2K[!**+Fhm``SFa`8i#@2m[#ZVbbX1K2[S`Ch(r6X(!
-#erjXbhm5Ufb8(%h*4Jk$F$)("c!d!5!BE@Q!aL!`T5QAM6ib#LTNcBZ3JMEcJk
Dibr*F'`2#-2PM*m(eVJX1@61"2Xle$%%[-G[6f3#r4fMfR0GMQi%Vce)KYjA%U2
4aZ1ccEQ!SiYIlrdVrG@bMZP2M-$K6REAcXih(Pq3!-(Vh0%EMdr,S+A!#K1*!$5
3!*KJK3Ne)B-h@Ch5i%ZRS1$,&8@&S@,81#RlFRA-r`5'%FZ`'UC$Dj8M5j3$kj3
$kh$J$[83&&Bj+KAAMf,fL#j#UM,kZZLkZR[jEJY8khD`J"C+RfK3I@!Bj[LKi"l
,5KQpJcDl`HJ!@Sm&P#C$1&3%2FT'NrjqMibZj3eL5p5J60P5&EDdPpe('`F@RX-
N#E+amjL0+5SmUK"FU1A`d+e&GY(@JV3e'c8Q!J0-`UX%DE&"Y'EEp8,qSX`&pli
c4(bKrSkF9YlYk0Vl$X3A1R`r!99!I*a5jpGlhp&I08"mKG!9M5%0!NNJ`-JKJNN
J`)LYcfr%EiE"2Zr!YPb$Mc)XTP4TKe+mF9'*U3Vb'%bK+VbSPDS5TDUX(PV)&F(
SD4Rchr'aB5I4"qcU'&Gf$YAEF!FEQF&'iSehX*&&)3T"2X@J*PKJpGpLYapHp1M
r[LJcrViTeCTQM+FA`Q3iTfI$MQiMhYLpX*Gri"K3`N$Fc55RAaJZ9braKd5&3ZR
Q-U4#`V%`JZUX6'ce1$ICTDfLb13lSMM%9[A&[''hA8$cLN[GSqVMF**SF`Ff@-!
JD$!EEX#l(HQe1+I+e!SH)#`ECc"ZcS+`*rSM1*4K%X3NL%N!%`f6-#B"6$lq%EZ
3!+%K"5BE'5M%8#hL8Z9$3c4b@,FU+DS8QJYSB'UdR(eXIYNYc`48-pb`M&8BqZQ
@clQLQci"fM-fm@"3[RL"!6mB,,DGG-Ff@!D(EV+Q`8PS20!`dF#!NC(2Z0cQpfe
Ai"TJ-YK9"HDaB16AIiHCCDF,#@TrV&+(2q"HGeNN'3TqGC%G4H81JL)CJ$cYiQ'
p@T@N-EN([pV*Jfbipaba'@%mA1p12@)$D3,jfXU2h1-"qP)G%%&JHJ8F3C[eK'(
eCMl-CfF9#00!#)F803"@$(G9RRil23ia9"8Faeq9&m$B[H+1c$&BAqXG,dVpr#0
h&J2b)4caM[FK)FShF"E%Db-SAKMG-hR$J@6Y"@k)J5'rF0Mk8519eVLLMJYVT@L
)0A&&'LNZ8!cjG`F0DpDHD[LMA3cHc39i@+M$je"P&l-*1cX,5f$[Nll(S5D6[Uq
4dUab2J'#$bMGL!pBIQaa@-#Q9CN-l6!S8rN-TaXKk-Pj$%,hRR$rb3E'EBFYY&8
AKq"YRBAmXhKBTK$qiEMeISBC21,Q1dKi6MK`3B-r3D%KED%09N8d"@#Rc#G@BZ0
McM`2`BAM(IV4[&Q2eSmIfVDGUM!"eLBPB0rNjVi(D8d@+hAS'Pdi$SD)'@af-d'
U!)'`4)8!*&H[%N#bViF*,EdDSmSfiq9DmC+KZA"D3mM"3DiB9%Sr(MI@Qh&8-!2
hP%SZEX2-@05H5EjSUh)dNXA9imTP,bUAe9mLX9'G8ekq0NRE5Ea%3i4U8hNjJdi
&3Ab[,h-e!A4@A()AZlQVE@6h,a12Y9,D1F3#3RH"D$%iB*h8IX"*k6!"MJPA9C%
J6Up-SSKmI3r5#U@[ld%L4Ac3)UD&A-Qaa%+ZPT'ijBV%HIZY0`TAP@eM',@0Ke`
2"JXDD5N'MF0S%XS-B8TY*YM(0C0r1LqY-`"a10L&#$l$l%[I!leaK,PS#*2MaB+
C0-&-pX)m(QGeiQFeb8TYPI*UTG[jGpl#Z,(FPrV0JeG@4)fjUq-I)B(1U38TRc6
kM@A-pL+K#eDVjdP+-iH0qjPq6Mhc)%)p,e,LZ&)NkGN9jY-e'0!4$+K["S&)VI%
FrrpPGJhjp)q9)4mrp4YA*k8q!15RGrPfjQdF9L8'2H5&EifMfYT-MPK"X*@E5rS
`4+'4p!QJq8@eedJ+9F-GT+PckM)Rmk6a(AE0m(ZRi'+4JKS"#iG2D&)M'K"0SR'
,Zj8RR#`MpdZN@pLK!@+jhXHT-DlSD56'`(JMNDmCjpGrRN@R9$H(Y&Z3!!Y2Z"F
BRh%pd"0I`KL+j,2h)KrLc`fhI$BIqI1CGb0VIiPJY`R"8XUlP-3,4`6F&0(J6I9
Jlre)6cr%(Ac,hEi("a&l'BZG54'fHkcJpjaU#&rL4Ye(#Ii6DYMqbGpj-q0'kQ$
#Mh3B[56mY56b%b4`$-"TIBN%AL@ki*GA+-+H0FlV3c9kYaZpr`5"4pD3!-"4E&r
q@N,JI1[6"IlP-!Qm"U"jM6[rGej[lqI(i5J32RT$F"&RFqbGJAX"J0"H1"(dX+L
UGY,JSQAFi&Sa$#N2F4MXc+06AG&92TUU*%b%PdHqJ3V"V+`'15L8HA[[(Bkm4bD
$@a#[&$D6Mk`b6*l)3h#eTK35IIjJjPPR,j0GZ%5XQNb#C&9LHF[Naq,'AIac'fi
JXXeYR%JZ5*J9,[DM@MBVhbJ5EcFM,HKDB0M5!pAr!kHNEcm3c3S"8qlS%dB)NQC
-N4&@#4(mU2lJ4NJ+5F"LbceaCcm4-iGKFM13!)fImfK&$kRC8`fK@4$5&0J!"bI
2AZddHJ@"iBC%22MRjLGKG2hV2mq*+Qi%c`DRAkJ[l8,-!1'JH+'ARH44(A'KYA5
K9c#BE#9h9e`)&Bem!aGb((-K'cTd2b@e3mC0fB1KK([jXTNAZ#b$UC)'D5&h1%T
3J0JrT%,P"*TJ!)*C@mA-fZ!!Skf*)EDBJ3UY&N2CqN,%'Zd53p,b$lUJ&5+Y)dD
+iFFkGdiiF@6khGHqEe1("d0k2(!2'qM'!!-8d$16CTL("5Y9Ul"5ea0X9-e30ZT
+4%eKD1*ZMmPXRD1$$%&Yl*MGVdqRmcbS+c&06@#DjK5QU@53!%e#4aZm+6%%!pD
K-%Y0#@DTpQ$-%KG'%3T$bc"VK'l!`pcf##@1caZBa93qDr4jR3M&Bh93NCX!Hm"
mdMVEcP6hTE2IqKF!p0e-bMaK0BAQPbRkQ9"$4CcmDX%`"2+Q&3)d!Di*H-9#4cb
#edeC6@'MUJEC+$6q60+J#P2%l*`Q&Uhk)#aDYI-mZa##8D[f0&1$a6$FEk'D)K0
#ZHZX',UHNpJ[hND5'6#a%B1'@MCb`Q%03fDhHkbTGQ5"(d*+119*i6MK)MIUHU!
3!K5&h8P1&5LF@"9ZQlP,TK8e!dPJiD1V@3d&&fJ`fk5RQ)S5LRhGV#K)MmVN1Q9
4LY#L&+'ILP$M)[322&%aTbQX)*4,@e-Kcd(c-FbJ09&JD3bKh-m-BHZ3!#%,1"c
LVSd"D8p@A-8@hd%haED831Ydfi9-hM@&`B46l)cXrU-2(#Z[ZQ-!@U'5hrc&iY9
a"V`lR`QmqEVq`6G#B"32Y@,bB0%&#hI'M""[2[(B(*5+Ih,qc3[m#81*4pq-iG-
2#P+SHRSSMLB,%0e2UaKFJpTM044EP[GSci6HI,hK0#D"0fqN(D!0TSae&crr'aK
N0ibPSrMcT`P@cH5"([L"Ef-iepJkA16&`P831AER@3G'TrSh'+E@)LFVTUpF1M[
c,"kkL$qAhE,qmaMFPYa)+,P`!QQTLl%2!EVFQ1%"'cm,CrQ98"NAN!#kZS`%eh,
2R(8H!lDFprS"KD0"`[SaIJ`-M@9Y#SNF0)MleEA(&f,ViF6D-RhfGP&XMBmKHKS
DfB1ZcS0CUFl%BfELX4!r"UF%ZK#''%SFkYP*Ld&Jc![Z4`963G[F4Jr2XFYYV"@
2Ei-k-e!Y%*F)6'01MRrN!EYXMZMU9Jb6UkYE[*S43`PM`3P5jL%Q*kaJ%d-&mdY
hiL85fml2*"EedBZ`)$4(,9ZT[rie1rGTD3Z0Y)AKSaC'Kba-Zk!X59ZB1RDK2$4
NBFUCD"*(VcF0H@fQ(AXKl9Ml8FGH'V,32RJX$pfqI,ha'Ai4T5kSIc)bq*!!'(b
%b9N"+@MiI-iAB9$FE$b9Mm$*`H9hY'rSQ+lGd$'V'FRd`8GiB'L`KZm4-mcJ361
aLSd)62,%!ViVLTZ'JPEJK2$LPCJbE,%B2T@JqGKM2)"XC1Y["0-"&XG81[hLe@F
ddF9j3(%Q&!!G3PGLH,`HC+#%KJr"82$$bb*C35`QYJX53J2ahT6Q#"SrJKQUm[j
ahjm+0aEZ$)S#KFUF+)2+K0)*ARYl#![+&q6YLiZLLbibkl6Z*&a1-BQ8%lXRAM@
lXm3)c[*"5I0YVaM'lB@1NVX%qlRZ6*r#L!D[$4iR9lPG4&KGB2G5a"`EE`m*M)i
km)3B3"6X%LVXl8I!FAVY')D9ldG66LJ[GSEPJc5aYGSAh0UF#)2@%AY2i)M,Dh(
RD5XD!TAPj-+$kNGV1,#&D'l-j08F"bE-4&IZdLXN,iKLNUrKU0J+9TaiQ)FRKU)
ddi0@BACZ%deK+XN&YV*JUMe%90))b1B2qKldYa1jDIIY63pLf!L*dHahBT!!H+K
U2`m$,cEde4+#)H3[HIMcLBHI6(qB'C654A*TaZ96A5,B,,Kik2IrR2l9l$-9dU,
mF`3!`34*@RQ9ADBLC`Al3)0iFbSe15SJ3[cM"K4f9*hkiT2,FPH0d0ZPQA%K"Pl
Ud3GF'U2`"SDC-S8Kmi&HN`IC`(!E8dBShAK6QC%(K40&cZprC+6Z@Uj8fMSbHEL
1Dqiq(PElVXA@iFaR!2ZfRAJf,jSSdC6qD4#DQKb@dY413$42VCMDDGU+UC@Q"UD
Y0(9LDY!dJkQ6TMP--c60BTUMk6C-Xc4Ga(3E65X`AD4T(Y-+QJjJQUIT1+B$0*h
#G*bQ,NbRD0U,UBZQICMfdR3%cQIH6)#D#mPre6+"JBjR"k5*2hEmXH*2+riB4Q!
)H8k5'(h&[a*LG(j'BH5[Xe(J(bZiS+XEABP@AdS-DF604,Ll(*KFVTY(N!#66+N
#f!3`jIS,',p@Qrj#*qZV,deI)E+q&Rr@-&RRd0*6M0XfhT!!1i,KiElic@EH",p
#pql5&rr,YflrkZM&[PRH8M8hq'Y$pik#j+k0KFJe)%8$iKTSkP(VrRLYbS6@0iH
2"K+Kf`kfc"dlq$)Smb"#p3kNZ)UFHH(+rl'E$*3KNMD[SpMjmlq)-`JqU'"VkE'
Z%B)+ULemLHVVD",h$M-Ae8e,0!aQG4GIVTU6`FhrFEEkHQb%,[mD[dBB[i"$km@
KDmF%UmM$i-0T28%J5-%JDDi6#UABETb4cPkP!AAGD"`$'LhfXI0RTFjJZLa%2+E
@1`G$I*!!)`L,P4@Bb`Y3kJbKDYM-5#%`9C(Pd8e1EchT[5G8,"5L`T*(+X4`2lk
SijEbQGAN5i1INGj)'Vd1K%4mL8&QFX9T6j`ZQ%SMFJG%S6M1FM&9Ab,Q5PE[C9H
#S5RLUpBa-@4cA!`EJN4Zmq(l'I[@MX)p9TI'3)k(!fY'+S@GP6&%$D@ccR,JiHM
Q4aUkTXXDZQEC(ER(k&Cp4Lm2m,1X`lFiUVQ0jbbF'R5E',*ZbJMU4D9XXj**"JV
TMY3S"A95A,3!jZ[Cie,l!Lk$KUcFS#A*!"5&16e'&aH$3@l2k@Q'Uq5dbPhcdVA
CiM3&bd!K('KK)"mb@9c[&e"E!3`%A#3kTV80(EI&!fjkB#JMMhm'C&)CBPc,+BR
bmF34*M%*MUeI`XK"lmVCaRBi!2Z0i1(1iQYYjr6U+JI&`9VGNl-kf"JU*[1[dp9
!D)%qr$XI$S*Qe`ND3fS`3a9"qI9-RJ0i#[CFSqb@9)R%PmQ"Tc%2#"iLBXK`jYj
Mpf3BIj!!P(N-a3CRN!#`*d0Z8QaB*JChUZ!`MC-lkcBcV*14Mf(JITKDKqm8,CV
!SZ44LaMHj8@IT#fD`++H)[14Md"#5!dkkP%B'rY[-@-4ZhP9$"L*#JG@8CMjlk+
kJFB4)[9[ILjpq#3a1+NZb2mF+XJ5AC!!d4X-&C!!)%X83BE5"4Qp4!mF)mMSDb4
)J%l4@5()k&6L#(Y#N!#Fd%VTJRbeXpJm9T!!d@B5C%S(%E82KJT5Zj%3C)N#aBL
89Ne#Q1&AK6$0Si4TKaNf1GN%TJV2mIpNDKN#IP0)h2C!11C-(Mpa%T4p$JEJ'4d
UU2qmp+qrBN&9PUB*bJj"i4rUSQA0I#b@aJqbP-cLUf9T5jYTU8C,VFT5qe&,33j
Tk3GT5kfm9"kLT6h+dZD$,,e05peT5hYSD4-YE9@@@Sme5#`9fje,@pU+TAGTBHN
,,rbIG-R0e@N,5l'`&("kLrJR4K,'(0D0Z9ShCMDK*p1019T'aP`be*M&!#8&JZZ
-B'+B4`(YE980B3k!G(Uf@llG$VEdkpJ#"d%KmFM3`8HZ,M,Spf3R35fMc"SrH9d
*NeV"l%Bpc3#%H!#UX,N-QSbJG4$F2(qD3CMmj#N#ZeVGKJK52#bB)!8G'KeRlD-
J4TiN&Vq5rc%Y@3pieqmk2aDrc1(F[",1R8FcpP[6YFYZq9k$)i+fiCE204VXlBD
#$a3&GpHl,%-k6*'cp`G3m$aN)MXTZ-lR0UVaQAYcl9qiaqk$c'c5NGh6qr&3ThK
S$X'Bi`+P(c8aH!TYEJh#Q,$(j"668h%%"J2m33p�!*ddZNUc#FA!86#FmSGbh
$"5GMHi*PecqCkCr`-b9BqDG5+!a0J@fVG##""aR$ba#&b3!#Q6Pj+U3)3FSr*c&
)q5'!,(,-J`&Icm"aK3VEFUUK0N0,lEc`Q`1F$"'AUah&m3hr[*0HTr62rea1RcY
%8%k,,26TPE42-cLQGdM9HSG8DiT"D#jL'Zj-*!H6iKpL!P3Mi@c[ArrI1%5Ji90
jdAFSj4BfiQ)S-iCMdZ#&)-(@eQBma)1p!JJH`lmU`5Nk(,TqG("!0Rk`q+HfFm8
pcpIcJ$R4FqbrFXRFmUB&`b*,NcqJH6&F(j'@&#j,U8&JR2ra)fkiJSr(31C45c!
QCE(*rpc*`9kcP46h(2dDA9(b2iI(cIjL-6D5Plr1S6i$S4PP-CSQ5Dq@YM@)AeU
21BD(58f*VJYS!!NbFM-ad8J%$B!*VTL!1EFMhF50(dX''`1R$m-&!!!M'd&%3e)
$!&IL$e80CN3#%#(LlP6[`8P1[0SVZCJV`qJR15mAJKa0VH05US$'R#FpVQ!TilV
a&1j1M2cq&T!!8XI0R!%YBpfZ'MIMGM*C0jY*%aX-BXE3@qYDif3F3qeTV10BQf%
FkY"8$68(*D,`prpqlrIGGm$KQI6CCjpjIJ!GCMiN%4![%!!3%!!385q9LEpSDX)
ImD0A+*!!dQ%9$PbA,1b4[-EAP+`aC6Hq&NN-HY*%(BLQc$'cjC2P,j9CH`'FXb0
&RmfI'"(YTNe@K")E&dF54hV!!N&Di'FA1Q`H@0QiDk"-"+IX%'@[k@m'9MBYTS(
ETXE0b*61Z'MV[Mf')Q+[lL5&IILd!Y1Q3`L(@NA(eb-8,1SdjAlf'T!!#5$I!-*
Z1Y&f,P,da53HD,pGHAl5TH[#Mc&Z#K@pNfBfQqV%HA4`'8fD2A--J9X81d,2CSi
pGr@G00DT3qQN9cTj)SP)+6VeS*0KB&jEd16q4K0lHU2XkAEekGahdMTH%CfN$1[
YGp)LLAe[Fa(S`Y"lQ$+$+qSpr%c(XXAD$mF-"9fRiqG%*2&JR[90I',LR`AT!cp
3iU*fA!+LY(%c"[CJiP&-E1-6pq"RGb64[S-qk"*k9[Y40d,"h6R#%eNUGHKFbDF
QTPDc+j2UI2[lQjSB1X3@G(ND@k#E9XB@10$*D@b"BhS2XJ9YiP@fS1e4%I5"q'@
`H+bai'5rF-8MI,'%&+bEF+UPBrSS2QMB2DB,lSFDV$I8BpXM5dq0G3!jAP4j2QQ
S'(r-A@NciQeTY0db+,XZY-mm-p5-!Sf%&R-#r)QCXLFQh'25d6J$jE-&Y[Al9Hc
)a+irB!L`p,F[l0rR@i)YH*NB3C)AT54Rp29&kp+M5FQSLaBYqPC+0286jeU)cN[
CD@F2jQ4S'I*+5dY*2TXFA56fIJ%2p9kapNT"CYe*kc#1YFI3BKcAVS!*[B6%8!$
-kE-1mm9f($)B3K@BCDH",lCNMQNK`aRM'@FScM'KK1+)rE$C,C'%f13'Zp+8Q!I
XAa6V-JTqiEb0,PcT51m'Dkq%%q@Bb8f"GU"LEXlJ)U)`1!,'&Ic+P#2mf("%G'X
KS)B4BV,6!9+58h1bG9Tk9MBq$k3RCkAfDGRD-5hhE0fCP*`689&6+AcJB*BZ*re
-0$8e+e8CLQEVNLmUBj+U+1LVK(PPDKXe`[QJAG%&*jmh1dL&X@%VA,@N(2GB&DT
U95ia,%&PX&KB#2$!MG144%'f9LMG`KejGI`b!N"fI-50TVPAKB88%[G+ch9mRIi
R05NXD[-3#"F("jj%Z(ahTA#!6*i1G`CP+Q9)[k%&@h-XV645+-K$al!1!qd!mL4
!eK@)LF-k4+#8Cpd%GF1!Kcmr+KdXCY$'Y9T6lLm@+X1QT#-#ReZ*BH)MFKDUHH$
i6)#Qh(Fqa35[!@U$%+LU"Z+L+AG1+6i14)VQV'@++!lGISGASfD`cMXR6,Na%cj
ZiSU)dZ@2i(#51U(c,0la!E$C"[C8Kdh(@G34Mll8e$6263q6UhKJH@"aGmZ,8*b
`i)m$'Aj*C3'&!B,8cG"5-kZG)Z&9Jp0k!XLNaP[jb&*LqpMEB2Y#c[B93$4,E1r
V9GKHkRkYQ3+9PeD51a61L##BIp6)VT*%b(b+#B8p**!!C4(V8e"f@8K!N!!lp12
IIF(FTBAL3M5MBZ&#VKrA2&c)2I8,ZE@AVT!!-L3HqSH(cCe@5mIA1F[8,5#J186
2LGRS[$Sqf[%q'eL2$cV@3@)"%aIb@+V#*04C#bNZLmYR8b"fNY$fpCe05STQCfK
*@5PDeS&N,FZXTCl0eNAp&PR-1T0P2X0R+5+Ej&1bLi5hQe`bAbZqPY'&T3HQ#kT
!0c9+f8P9(6+L%3&3K`aJbCL6!ab(QVNaC#i2D*2"J!63P)cPi1aD$A"@S'BX#FU
RP%(Qi!*LLekiZ@R`3d-,$rR3iJ&qh9CTB43EQc2(-VSfe'jXMXk$SQNB"9&6EZ#
l6V%cFE'$1$CcF(kI(N-iZak95d"1ieSFdE6a+'!N`8mEr6m"N!!*SN"abia`eJp
bKB*KRDcIGSHVD*f6pGY#USTipfZe"!j"U,@1f)P!!@"+0)k-1K4e8iCFlT5@A%a
fXiRh8$MIl9BcSff82lA$Q4PYrG@HZKGSRK*+aN#)CR,%bp[S`-)AP!00SdN&PPF
8B!R5cB0TUkeGr"*"E%rLTS*-&@"b%9&"CkLC1ZMD`3CH--%9'`"+4%'[G-$ZS4A
hVYdP3P5kDYP(e#e65&1N*Fpq!eMLGHG&&cP,''mUeI[YmDC5)M9dlGbNSPla0r`
8`1+(I2K+@,"pF#m('kjfX&HUEA@ijPCap(`RiU,#c$F4EJNT"3aE0Nk0*KdmQak
Y#6QH01LSr`'jZ$`a3J,Jj'9@TIdQE*@fbmmUEC9I9CS,iVJ'i!d'2LHh$#aIYTU
UYaG0`NY!F"(#pJk8Z'5,#mTL8)J3,9#`d0K(*rZ)X)papQ&J(hUBqS`ePCMU,-L
q,ejM6de9'jLJDJ@XY!E-YCX1$R"jL)XSM!,+ml(pFl53!!S'XI--I*iL"Q3N0(8
F*"+*Nc`-Q$-@b)hQCUAq4-[*eJC58k,C1HR1U!k)`Vjk4QYQD8e5@DRb1dL&-$c
cJY!ci2PTq0#cMbRf-8%I(6UU&(qI6m3"9Ale%JLEBA5Q9L)R40,aI&GZ9j)hhj9
e!G[Ej953!-qS+#Jf6DDJG8i&q6TY&466m1a@'""UZ['Nip[iaGZNLcI*,VE`LdX
`BC!!A9b#RdUCiKYP&k2MCc[Si[c&3XX5iQCe0B3!bV1bdhaIrJBBSF)k40N1G4R
86rhSd*TlM!%fbaKJ)kXZ%jmT$"$MK86R36E*$N)G"b8'!32F3#9A4bV0B@@Ll1L
2YFX(Xp)rd-+3!2if'Da-LpEPT#46,5LE@r98reJZ*cXR@Hb9b4V[bjc0(S$ITiR
d0dJK!Bre1A'5''VdQ(X-aR2(-(!-aFIl80#QSllZji6f9dX`U1'R$`9D0iUcRC'
P)`*Ch!F6+T'd[h[Y0hHJN!$a$4(K*+2H90I84)C0M6XK6"lkS0$%R6ZXB%V$Up'
e[@-'24C*2*HC1BD+BIHf'CI"4)eEC%bdPM+[%8cheGP5jM@#14YM-ZCFim`mhT%
UJkh5aEHhFN,9+#fR5Sh#1p)N3V8Bc01#ic1d$i6qDmef-9PVVSJIBYd54J'b3,4
2("(H'fUhHhCTSZ-6)(rf8A"a8p2N,8`Xr-Y$68+D1MSGKjBH0[#(4G-%1aJT-k'
pH@T-0FAbY3eCER5pD6rHHmAcTCPIF(aYq+RJ-kXIp2kKrBmkrh,V!Qe4piZ'ZFE
hp3q02MGeHm3kmDY(IRlRpbIrl-Krk[YYrlH2l4mFk0Khk*-,ljSZKDlfI#Fbj[l
Qq15jEqAp+222crqr8rrhf62aXjI6-k*QhF@F`amFc-h15[V[U5R*"p*qA2H6%hp
ap,qprFHZZkr@0YqlqIf@2lRedq[rjBIripV5kFr2q*m2r21drrU$Irh`lpllrr2
rckIrqq0rI1hVVlbeq"Y[&#ejThKK`DbArf(MkrRI6Ib(EGrEr*mhr@EA4l[rrV'
rfI(AfaqZr0fUA`5@VAKKhFmfr1hDIe[cbcfrI[bI5[rPrPqeIQlR[jGpqHQ[V&q
qmY'+Vflj,&CHq-@5PqBec*l6f#6*39BDDV!$f9V'!9l!YJNhl*fYRHBjSe*Je4%
D&AI!d$Fik%Ld[qdH5a2NU2B*AJa+@"-+Dj+BEdR9(aD'U4ZKHm5f+,kZEEI8#@r
Rj-d&)*FBUb2F0,iBPG'S'1mjM*XZK1kH'M0lZ0-'3M04i"iE!9*lNk0$SEYQaqe
h1D#,8BGI$EV(%#+pN3m$cc4I2(Zm&XC2VPcc#G'1Kl3ENrGJE**h'JpfZ-H-p1#
3!1c"IFi(*`)JDILejX9T)R66,*UQR)$YUr2C!XSBf5f4m%UBZQ%q6(Z11)XV$B&
)iJm)2+f)5q'@KPDSY!r!)kL%($Qa4dAkGZT1)Mj+a6B2!JNRN38R-C`2aPp,#`K
j1lTfbLBlN!"930&%3jGl$02k-0#(D5pM@L@kffR!#A+mSZCJ1`eDE!G6M`IZ'Q'
'j,#N$K6I*GH1H69P3QS+'G3Q(Gr)+kb0[-*Uq&3'E"B6X'QSM#5@Aj1!68-PIYk
3!!'Ea8jJ`cYk1E""%980p$NL5ppGfG$klPFXG[e99%DCXX0j)dXRA6rDG%Jm-bM
ZF"0Njm4JC#P#9f3U)ar'&$d&K5bb3@`4caTX,`kK-+'E3H`0a$L1YbQ5H(3kI4"
EM#6BS@Ri3`S"Vlj2fFSZ`103SfDV4U2JQ9i8-r0!`)L1e$9I9UeZiqVD&NQX[mc
8Y3dr(mZUe4dbGD(M9jlQkZ,Xm0!TKU$-IS`YL&e@X!ABc6Z6,F#+$`BTM!jfj5C
If9R*fPQe5Y38X"(03)`b0ASfGfr!Bpri2LhpBM6pJj3$Z9TZ6NVZfH6dLlmP1Mm
*e@l'fH5c@Nk+aLT[2dJi%-TV'1Rplf&*lc)r5HqBAk6hI!$!5ZZ3!*'+q$b3!%j
%q*8,)#%,L"6ZEZ'NpMlKB15c296V(M-6LEDU"QQ%D[2Tpdbj$5f-p)0arjHfXNa
FCd[k2@fN6!3"&T2),NCfJj!!i'4ATHcbh3Vjph5(M2`,b"KNMbhjpqAYP,K!)EY
ak#!2VjKH[!K,B3mY*#2K%p(8,#dV&D5BlQab6PT8Zhc!E)kQFUU+++81[SjQA-T
'GNjbMT!!afkVc0",Br,FV8'%eA0hAempSkG$pZXTd``Y%!c+kKD*Z$rq+52ZHqX
MlVNj-#IZ89%ilVHJ5JKZG&dHlMk-SF03eY#R)h-2NpVd3&'RDme@!C5G"mm34QD
#lL""6fVL)Zl4@IjfX3JU34hR)8-B0JpcJlqEY#$h@&*62$L*"6f(#X[MF%JQd[)
MGQSX511S%l*,1Q5AC#!"8M"4Qf(8KUlGXe)icF1,q$C(e)X(-)@1b%0YI)1T@[(
GU1A6NIK-9+#phFH(edkkc21k"l!&ccqMqpTDHUaaJfE*"0&PFCTrjaB,595,[a4
19)YRqLHUaHeqLHU1qN69rXM!mK@Q*b1U1f1fSRSmQBR6"PY4hAR8Ee&p6"(9RG2
#L'UTVDMZe15L+KG4E#4iqU)kaL&[2E,kq4"@qHe1DC82RkDiVM"9&pHZ@rk*+m6
4`B@e@DIA,0GUVF6UGPYfKq!kN!$8L)Z[2-M+Mm'CTfN*U4K*Cbc1#V`HNE9cFAX
94e'%&!iK%YUD"b2Qe21$T@Ym@Jphc(KXMdC%@r`)Z5Kj*`4NiU2GKhR'qb'5mSe
!H)a-$(mH9Jc[q#Q'Jhk*B3A%X)35IaKCi0KB@bF-9cYJYKeUeThA,,!`"8@03'p
*NJmKhK)LH#")4E&@ATMV*B14qbf[Zq*GdLFj6VJi&-8HjedXVdXQi#AhAFjVc!N
N'TXY,*QhaTXpcI4%lR91TS(XKGRh9A*+HEabGm)LU00L8618Za--HSY&DbYYJHQ
ljp*[p'fcQYZD#GcU*hSX#jXA(E*Bp![8+8M@TQGZ#A),'DBX&Qba@q[*E((miG+
QlVD&Gp[ZdR5kXRZL8mab'F4NXrRq3aedNIk-M0dBZ2T#-4h$G*')rpM6%!&'C0!
Rc"`-$,K`dHr35q'r'JkY#p6GS%j#`#D)!TYAaaPeq1R--54G#[&(%N0,*-(k3LS
6V2TGB)h@)3SP)aZDT)-qp5'U-jp5RD'#kD8%!e,9C&49&))Jk$Vaai'JZJeBISU
EqP"b*"QVpM"@rI1`V(VH6eBeqm1U$CUYmQIHN5QrBQ$j#i1+mPmBp&[j2G6GS%j
5P6q6&b`B%*&R3@qHP!9IUUJU#i4686`M9%@ZPM-4"I0j'&pD&(*A"Hmi[&,@8CB
4`aYN'C!!bM,JMm0QJ-[2$,MZ9`E819A((4&Jq"Gf'9VQFRHY&XSFFfjI9I"@UC1
N0-'9GQUXIT99!piH'I"Q5UM@a9%G[20MJ4A@"IGq,1SN(F[HA0@a&Y4mq%NF6A*
EVaX-llEQK#%(`TMJ'HA%)DC0)HQh(J',HkL!C+%32BK6FPAUHTpT2L,'DcIHLjE
UKc5,-qN2Cj&TM%Aq-5b,[1BRLa6ia5)lC*R"(,5ampKi!6PbhH'bSS"P49(Xh0i
BK"1k5aIP#)Z`S0K[dBlVfXDA+Q!2"LZ0NU$i&%IcIEKjKb6Q!$LF&bNU0r*NX3h
Np#T[j`%AMbiT6B!J,*3'THf92c)1"CX[)$M9`Gh[K!`bj%ae#'3M%PN@PEH&"*%
jZTP1YaeGM8I[Fa1Q)Ce(Q45EIBSC+r%$D9VSe*KaJ8`j9CLkP"raap4&d*'QR)c
Pi)aPbRdG3BAbQdEZ`#aR"LlP*cDkh'-CAXQ-S$bC$@FEN!!3'H6f-3#`QE+J1(q
`r#+kpI)*PrQ%K1LZH3'44H4%p0KP4cP5ce(bk!K4Q09S3q-ZUc6SCLjF@S3-*M+
HJ+YA)rGZq5%bNX&KKVNTQ5)@h*!!6!+PjFF-,CQf4Ld`#D(+Ad0Qmd[bp!*L"IG
qqNNbVH(2m#hV0,l&+KiC*h1!lC5&@JmU"350eSc5NPpcA9BYH&M@p$L6M",V5`a
TC!*5ISUljrAND*F'ZSHQ8qC`ahIjHjQ5@84#E1"NjT4c8SCQdk@SI"UjF2X&lck
6$L&R+e+qRS%A#JR$`!6J-4lKahj[kF1DrEkVY)AqApm5D'Pe'BPd@ihMHY4(L$6
6Fm2(UdZh9jq`p!d#Yh+P@cPB*-F+a0DaX",%llA-PX`r@9KT,Y3ZkFp80`,@-m#
(i`8"pS3[aVG9E"3*1"JZpe*4Z"KQ@aR-`-#hKaI2@Td'"VkGFJ1$mXA8p-H+HdJ
F1,X!#VZF*bPXD@@pQp83$V"mVS@#!FXfkHhD)925+C!!Q438p$e'Ph)`h+YrIV`
fmcS!EZ%[FCLim%9ZBdT6$-&Z1jN'`pPI-6@Xp5#*3da[[ppFHThqAhppE8YVF`L
Q`HDfSljY))JcZ[EFh(McmMbBq(6aJhe-$@X`Khf3!)SrfVZQT"jKI42&p3,e!%K
QSGhiTNXrQ'42Z,#mU9N#YA6S4Fpl"!P3S0Qj2'Hcc,0CCYSXcpXX6pNXRj8YhE8
EVdH[afI+RqA9cdS8hbcjY4N'$8SN-Pp5*#Q40Y)[6%Pf')22+H29b[G"B!eEhq3
ERmj$il``B,LTK0h6SYbB%'imQ&!QfpS#2"&6!+Z(J`%R8hDpU)%KjcNCNPHFQeR
&qA$BLV25ciTcV9m9CePe8Z&Rr9@6#Pk99+#L$#CeSbLcP8"DZRI")f5Z+A1E!'#
G'SZ@b3Y8XXffXXeq0HaQYrLjf8Dr0PZL'2XKQDiR&Hk)d+[TlGMbZ8"aTaKR4E$
HA`QIA45r'YeCMF56`'DL2'eJqCS%#)I&h*66J4plH"+$GqA%ARP'955'+AGKVk5
1K3q'8mG#VhrU@'M`4afc[6)b%K9T4E*#6TSZ@M"3EKKBrNZh9*5a1'MKEQ&,Hld
&QL28DDlD'CpfUI"#em9Q5i4@qFDU#bp1SYILF6,5!V8B8Z&5(jE#Gd1failY$09
b3$E-`LA5Y+05T546p`46plI$U[ZBRqS1qDAZ6(SBUVRP$$#L#JG"&BXlYd!"V2*
YdU(&ZAV9I)FZ-E4`)L$%Tb6H0+Y,*)eCiDeDaG*952"`Q%pq1h0X[m!#PHf@NSN
&+X,-%$"hfp)iS9ERM5X9-J*)1[iY*,%9E)&L*)`2d!J'L[MLda&8N@Mk"+jf%*Y
EeTeFF'j-Kc"RidTCQ21mBNU`$'6qR'RlKjJa!CbK,hUj14b&1XrCQK-XSf3p@rH
20-k6$YZeR3Hrb15d9b%mdXpQNdFU#iDQQMRR)!pYAX!(6-!`GKT"c1qF6EF0DN)
*MjqZ%U#!,@LUKbqXrI[aRr3(L28R&h#eP-V8NUqS*I#KM9U3!)5rZde9bdCEY35
i!4!PC'&U,j68cUpr[-Ee#"N(MURAPh#$L-5LMpAVAjCGMmkrf-@8ALJTr3D40)N
jaI8S24hafq4S0E9,Sdp%mH'cp)PI6SB,XNc&"LdRH3!a@4%)5ai*"&5kjZ3#0U3
2lF[N,%h'h+TkHa5R`+T54Edm+)Q%%GS&9Ed4@mI!UJa5,kY12089HM!VKEC,IY"
U1bI8%pciHQAM5-ET3,"d9(LZi5"'3Fel(16*F8%mcXj+8e3ae-0"!lR+HC&R5bQ
Bc1hCer4[A"RVCFT`+dk-hke6P8&ZM*@4a))q94Q(E"dC[mXNC9"!GaN13Kq+3T!
!caN5*HE8!3eq[P6!Jj!!-*[RBFLMNN+8EEIP9G[f6NQdE$BmVQbiXVAkKVH'`Qf
imU*m`pc9S,,!Me0c)%V5RU80mk%RYZ%YDQ@6m,Qj8IS&cU$e''G@GXSF@c"@@IN
KFciGXfAJKcrQQj!!'NVbb%hcE$PflqCjeBr,+qXm9PQRKkfX-rbXV*2mUUcVP+#
2YN5UQQY8`c2$NmJDEckUq&SHM%TN"%F,U[4KBL*@[Dq@6d#cAQh+`!5CqQcLclY
N&a`ejFk1NjY#ZUcT@6Fl2JDZ%a)Q9,N,dA4Gdb%CkN0T'J,"Z3YI)3H4$2N'3lC
KJFBRQM`+%UUBB+TSF@kEAe2RSl"bQd)-Ldd$brG-XD35`IT*B1V!JV#2lB8%hXB
bqUr$C[4f2c0kJemC2Ff'[2IbC%mmH3D)LJ#12Td&Flff58'UEA#kXX%hQrHb`IY
XJiq'h@#&RaZFlGF'Ae%25`DQGM,,aJH#I-aTf5BEES2E33)-R5MfPr%ND4,+SU+
1!,9+KV+VU(0![5a$1948%P!ri'`QS639G4dSP``eU+,!USeQLH%ibU@LN!#)Y,'
(LjJ2$E1@-[Gm+h1dP0%(&$#rRUa#Dc8UQ8cAp+P,HQj+AG+aYUT,1Vj$AG)ffp3
Pe$%RTLkKYMNlH6#1#+-pM!LIU0G*YS@jK%G&QGQ#+Vp9GIPibHAM)HGBlfAK-dl
mYUdVdS!NZ"TD-mJ8Pm94mB!S&T9L*e,cVNjU3S1@T3J%(CT,66'Ld99qTI$GiBR
$YT-"Vdr2N@dUdXZ45cM5Nq4M9l5KQZYd(Z+FLa$F!,J-U#1bicP4Ui!kjd5jRDL
AJ8TbSP)GJEXUFKU3!0GP5%e&(JAU&4PU8%9G"QUh%p9&#P+HUejj(9-UVlq2b`c
RCFE*`QeEHHfQ`0"@+A18DL[P*lQAX`k'XI$qcVN,hmR+L"lXkp0&r6$dGJCH14$
81'(T3G#UPE*H'd,LY&&4+JqB%KZ(`0E2bUX3CKE!-ldecIF-08PF"J1"8Zl#pTQ
li04[M6[iXXeXeiB#,K!8V4ZidFfFkmkZH(k(e%fhU30-!61%9PX$)dB1!@'QUQb
a+&@D9l3*kqB@f#@!9["-1)"@X0SrJ&E3l4G!fe3MDDkI&6)UFXFLlTBlRDQU3GI
`T#[9pbp[c4f3!%)q-'!HeLb6c6#Uk*5CBb"3%DMGi**3)+YDjm+!5+jDQHT'Q1T
q'eCerAkUcZ5AkXTiSL#qD94CHa3R*Ii%U5&G-QqKK$aShXlcZ4DVB)Nh&-1N06@
)A!M1,K%Qi8lF9X"qdk)Nh&("(&6PG)r@-")k$`ZPXG5-D#S6-pZ"dc%-fLTYPKN
'6D1XcUc#a8H0I2ES!9`FU&`mF2,CZmQakTZmLkcfG*HK1-)AjTM6B8EK(1dKi3Q
m*4`[BTS'9`fTFD!#!Hb(K'2C08)A[b@#k5-GEi'd4iIZKp4Vfl@Rd"aQLp(&,rP
AISAdb%kR5if(ZMbKfPaH$@jm49Kb9B'8-G8jaP4R`c,9C6qC+YXITTTMNN*D[qj
eKV6UFchrZVHUJ,,U2Npdc82R(L)Q`cR1#Ff-ZeUV)V8iH908[Si4$H4'fL%rAVL
&drQT9ZXdH4HVeS[+9e9TqP*#aKC8U'-(f1QQ4Ta,@+'4KYDSfD@BC4590kT0"("
#MBDPN!"#B4pVfTX@)qiaYS6j8k'H#Ti5LTjK5d*CZ$2BUc0aTc-0G5)$(8l"i`N
YbKM5XCH,1XhjDZ)%E2q8QM(+F489Xf-q+cYbTXf4af92PGJm09MMb$e9(2R#ALk
b2I)ZfC(ANh0EF9h`T"[Ni&h2,kQ3!)c'bUN4pI@%+,bMAKjML"*T8GM,$Lc%BME
8VENAVJ$!2m%5XFeQ8qKBUpR8fHV8S'k+$5J61m0fpTMAmF3(8Z2S-A+$YMdQ1db
'G"Mc9MD`ZXC"28KXFPlHC)HLKY$c4"+cDa9&a'5+U*!!+D*#YLhE)hTee'cDE(8
,20'dk3-+K4BHVYRG[+,MHF29c&Yc3h#jhDV[B2cCSj0NVLFGi98%SLUF5EY&CSe
NpR(&p5SPfQE2Tm&X!0AEA$H"&elN35Ll-'RmHEiJ`DB'(MAP%!H4&[$clI5MjQ5
&kQ!fjIik,MA!8*K[1NJZDmN"8&KJ$'Aqp(ddp'(m+9@Pj2BZI)-VISq8)B@[%@Z
6f6#C&r-1mhQ(Y8bpVb&4beDfq)(LP#qF`BCqb-a"P-aSS36[jN#F&`AQV,G*l#d
C%)GNrda#Sj)ef-!TA[#RE-Ph0TmJH&""ZmUfXpQC`GT9+5aJ2&-[Z'A'*Y6%"8r
UcaQD'L#K)CC*TGKDR$,5kQ"CZ&Xf3@)VKijFNJif+$(K&5NFAhKiFRU0#9jc`2B
*q4&4rCeJ&HRh`eDN,Aj@T$2mUNL6@%@DYTH+0-frLR4Afm$baiFTb6+)eE``eHQ
SdJR%8CicqI*(A98C66HY84)3m#B`,(c+P&&3iQ!N!ckUA%E',9RC*haI,Z*%j3d
C5CP(b`fZHJM,N!"#@,lq5KM#-Y1@X(ap3L%XkCpd31)lPU3JA#,G#fG6NTp-3Pf
T-8$DGKSPejMU+1jA2LcX`miq21c$`6k#l-2,2MVGYCjDER#m-BfE[-+-ST,)a@q
kH22YpZ)Pe25b+-!%29a)51j+8mH,28)GmY8BDUXa0&4Mb&*Mk%D0SDiD3fmU3c#
q320[8G&d-4kXH6LiqA(`k%i-6(4F5r04dm#LT'Np6-JQU*2fmrlCJH,qfHqMk@q
p-RLRAf"3216UYk"`bJHl$fQrkVF%5,'(&VRklD-+iK-Jl!&5p#G!H+B8a!8J2!&
5r!8J(#-+iPdJ(!(+L(H"#-*-CJ+Z$8+"GB!-"LKc,J(TjFJ5KL`"dKZJ$#0N*pr
fqP`d4a[IbM['@-FB1[)YmBj3!-[@05aETja+dT1D*Q#5RpFpi4%[eREbJI(L(N9
Ykc#3!+H4m4%kR%"6Gr`+0``U+6&T"a+6GNZ*3f26P35Rj5ZF58CMC-3b6!pU0mE
[i5($8m9(N!"1JDie6Z"`cIRd6$%PQPH5PA)`0jq"ZD+`B'k*Rf!Zi4HBZfB,TVj
h#L"SPapJDPG0-,8jIVTJD[20[B1TJ%X1TJ+ZUX(8V$Er`&6"VG-$8j-(XhlmC-"
83q[r'M$9d2SI0jKUD$dp-093pUF"6$@8R4kB3R,S#P+%8@+6LIH6m1r"@0LRR5G
BT%m26pT(R`lKB*p"RX#3!$kp`XXq1dARZeq"H#P2I-`Bja(+"QUdJC*kkp'%3d1
&&@#10ap@K(ph"`018%M!)VU+0jTQi4d#4T!!JkacB*3-)YP%rC!!m3E!QS2)5r2
M018S*Bb'HF5MfG,6-'XeXH6i"%)TkIak!J39dh!P-S!pXCeIbam!S1iD[iN$'kK
C#I9)`5JV82,VM9UAXlN)"NJIBi$dKE#!G*fIJ,68,d#DAp-NE9RA`2*r5MDdr&j
UYLkX-4TeNN"SS+6+!!SMc@A0PUdfMR-MFM38aaZENM9F9VK(D[KYf8VKX5@QT@[
3A"`lD-'f"8U5%RP6F8YXhBHm%6dP#Ca(Gd*T1K*QY1fXkDpDAMcN$9,YYAKBCp[
`Pel34XL)e-V0P3[d#b3c-RBNeR`9Ejk6#N+@m-hA!8)I1*K-DG)eeKLPV2A**pC
S9-&kaPB[K@@VHIkaeDbZUYNUG([@JfB(1P*@hLI%V!FcaaLc"3!L(pahD&r1*pm
Eq0R!4`2I'Y`dm,9p(`kQ$Ajrm29p'`E[$@B0*R9F(2blJG&p(hHNG(`mF&+`r`#
3!bXE384$8J-!DEX393YNQ3"CEC2[eQk8@TCQ$00EKVb-@ZUFfj!!a4L1`0Y0TGD
aP@l)3NKDYlAGG0I6XqY6#)G9Gcd-Vir0H3`B$M''L"M8"A91)Y+)0a(a"m-B%'*
!"%')HRYbFc`lBZccrIr[fq[ETTY!cVPrpc8G9MBN$a%3%!!3%!!3%#(Zhp8V8Bm
(Ia69&(+NK"ACT5,IK)[F8U9XfXGFC"$q-p4,VKN6'DE0NQ!L0LR%K&(4mZK`%-l
"Qr6eKa4RI@c`6M%KTFdp#J6%020d0A$#((2hUA5hA2*ikQdT+cbHZkDaQrmBTN'
1&M*QqBIbT$M(`[SDaCHb3P%qSeZ[kGE*EYd3$B6DY"M#,XiN+8jd!c!m!2k0h9k
@BlGrGIVUp*bbID9TkIEm)qRD[GPF[+b[ReXISk2X!K-P-PLMA1fHS0KN*pDYJR,
k6mplKq#`(DG8K[2JYYEK9M`BjfQ0(PE-I$PA-#UDNq*8!N+&VG(-P5IVbF9'KfU
$80hU4UHPL4#TkSAeC[B5LMdl%-H2ZGjkc&dl&G%4Sfd%r['`'dYTmQkP,Dr6@0D
*(c0qE2MaiUFI2clm0%AX36XGpHA5M0)+MKV!@@A(TXPG)iCqmMI9c6SJ5E3"C5F
d66Sih*9'#4d&$,`b3L,0Z`iS6X9*5"ARUSC#c4c!A#&F+qcf)qQQG4[X)DfQ*bd
h)dGE&XK*PEirp#Hl[6LYm%LaePkD'EBr*)qrqV3pS64$KHpG$E6[$I8mAV`P`06
(kLhZJe1IeD5%,BH%UHI#MIKc1AK`kVN39,RA"FFm4h3NHXJppD6SETKqcIM"k91
l,bkCfKh0A1k,2UFS4ij*bTGe0a!fP850&dbADpbFkAM1G"bBMJq0ePZ-'%i3hGl
Tec`*KT2!F")B4SMK,eEl-9a1$)1h4`M4r`EIC`0$U,I"IA$YFjV+D1EDBTVfh(!
dmc&kI)'86$FYJ%dZ+jZece%e`C5rmLPIQUBmMmFY&8lj+jY5FLY0+6'ETUc(ipQ
+TT6F+NdTj&11dj6$UaKC*@8djFp['8`TP+Cm`kFmDjS#XNVd&8ljKNeCH6G0@GP
LQJ+b9MC90'APhA`clZ$bKY$dj3eZ&lCm1bmZ@9j(S1*U(k0Tlfl"akF)'0D2CbX
[,PN6Sq2kIebqfI#M'T-l-jIAh4&9kYM$QKJpL,K4cmD@3R3l#A%,BR9&9),Z1TF
dC6-0`c)"!T'9CIpLI"a$3,"q2$2qiT+e36UQrmFem``rUM%C*!3B1I5`0XM)@4[
XLK`qC4i0!lJ#j'b(%p&-PIa0Zlf3!%6,eAkLT@i("-lHE&-e-R8*La-!CS4#Xk$
16h'"-L8+--LhbcHc@a,rH+`6[qdX9mbGT4#S(G,(TrK(Tr((0E'L(jG[0[k)3@2
Sq0m(+0F'jGXempLYa#C3G,NeBiUbAKZXJ)4jaKm"T#Ke2IlG$UqL",#bUJ%-3Mk
LFACXF@ahebJMUV--J69eEL8TMVmiK8jT"1+BGb'14pcB)&64Lcb)rSLmS'YIBA&
DZYBNqrk!p8S,lCV5BQeqVXDqAjD"GBAP4e,Y1DP(5R25mGR1ZN%Q!JRKNA)PXJE
Z*98,)q4)2PX`l''E80*bIdjr,U0`V&EVkZMAbdHrHi2IdDprK8F[V*!!QX,(jqL
6ABd(-r@d4B6PSZ9+NjmCB'6Xm)@LTCRjZDCMe6h%9NV25G8HbC`mP1AZFM[Vl&#
pdp#9jlUZ6GIQd05ai"RBAka`mbrAp3GM!05'5EE-i[VdmV6pQ8FbRKYE2NJHm4#
Mh)`bEDUQ1'hr@$)#3KC5&dU1i2UjU0S"9'aG5JF#TB8f`H1"'ZCYaf+1@15!BSl
r+6CefKXXXNKdhCcl#KDA$a(12e*i3(1NY(KX'1dh-ESf,A[XBE(re9E1VZ["@#Y
Rec`$KF@e8Dh*eY&`949V)Q+&0Yb++KEEmU+Y1K*`f4k(M43V"-A#pP5l@(A9UX)
KUU"BAE-TP3r"JMbqTAj8mA8mJNf5+,Eac&P`%K6RUCGkYMUFkUABp[@Q95)dk1r
F+Bk)cP3aDlI@1DRDdB+0`PMRLqd,%PbDaChU'a'bh,Mj*8a'L190fhZf#@clIr+
)iLYVTpX3"J5MhP'!ieh(f4H8-jEka2UB"-"p+4e"*4!ApT5i9,B%-!Me%CZ-,d@
R(1LjVMqF(Xl0b4JV0HSK2@,(pKNIfiCMQbGlE(2R#0*`ZMlfCKcFE$Uf!+CQ(0T
@eN+6F@Jc2l$AG04+1QS51fTlF#4diHbSdB(er-!mpF"elH&dPABX$mbV$DSIdLZ
3!))iM9G$Q#MD!q'dp,(Kb&lm@82c5`d0RheTB@e'CPUCYZLL"fM40-eBeIeLJhA
q6-c+5P-RXhaALLfDj`h6[kA$[F1cA&49+d"hK*3F5A%fE&p#3+UJl,fZS2)f+IB
(K')HPK#D"lGEPGY,Yr&FZ4Y'YlrVk,rCFSZIBQpA2SqcpAJmISUpZMD+2CQZZfI
rC"5lbXFfipKcb69J2ID0qTXNa6BGqhU6FYYS%JjYhQkJfYZKf[b`81hi#pZ09AY
6E94lBXC+V9@lDik2RfTh[HMBUABVG`J!`DT1kXJ$`dR$P(ME18b)$ja,1XFFGHS
PmmVjR`#p4VKRTJI6m+mkKlP"c$peE%#LlmhdJBl&AX"3N!#-C'8V62%kQ!LYl%2
'!RVJ`Gh,`5Mb+d96"pL8dR&@i@%8(i,"BflY8IB45pTF-(9qj9+Nk@GJPc+J68k
Je9Tme!jNpehQIl+Y),X[qp8%QD,mSFB!C,bkq)2X6l8'f@3U5Uh9dJ"NTaM)M!&
QS'#E*(!jkD%LF&Q"pAqK9QQ2PeVpNMBdG+3#5%q$-&d8'YDC"led'cm-Cr%&Z)r
AL`P",e,5G-TT6IR"FUA1ma6rFm+0V6T91cB-RN*5!L8VF1F&A!X*P9ja,jm3ibQ
pLab+FYA"[Ci*iYjlbjA6RKq%N9,@AZhj`4lA[@V2'dMcI!--*K#$SeXrMm2`,'`
GM40lq2"*d["*I2KP$,q-iH1-KZm4%m3!A%@RUmhh"MaAlXh`A2%mLA5E*bR*fDe
ScSSIim@2`SfFdBrfZ!jql-R`lKB6$JD`T4[Jbec!Y!ZHCq!'Ri-29hZQB6ZNf[-
-Rc*YN`XE%Gl"CqJI$c(#e*8!P3A-rBhYR99+SaJ2`%3m,r!r``$2-0,QI`R3rMI
!H$m!pB*R$D9Q@&8#(9NI0l6lB'M(Ff$pYf0%M+I$e*M&Lb"l[%6fH*!!IG'6#V,
M1B(,3Gjb5X&$#RC&T29+MRNX$cIAJNMm[8Gac#N5ZbPlA,HUPG2FXA''[hUC[hK
jMdYddr)`*(rThBeA9h[HiJ0qc!(b&KrfB`i3!"k+NNmQThV*ZhZ`'Ebe%j9Th9*
f5aX+5F1dJ4l0[$q2d2AchK!F&C+,ZJfh2$fG(KGlD4"la-"05G`PLYYa!0Y@caK
bQaji#`2JC,aI0"fdk@##*jZMFED%aTG!j%ZTLIVG51%CaH&(068JC2Dej8U$jh9
XmEdqa*f)f04U&ipK+ie5DE*0LMXLEe#jpQQ+Fp2,ZkU(%`[@Ub4k*%'pe#TklP[
kbNA2UbfHdaj(mFc5S,-EE4DP%5lB[Ke,2De*&k"8VD48#$NV@H%1)Mak30'Cc,2
qP!iIdL5KNKBFS4pK6(Z#5p@#Rl`%R[#*,E(Y&m%)bHX`%-XkXE8AmCk*ZU*k8Mq
ik%k%A0MUSUfc&U4rE09H485SqLJeAM,XEXl05#m[eH5-TE[1Nd9+3#JRCdAdU)'
M)X[UU,!L-AQH#BNj3(UP&@QdkBLMY[2*mkb6BEa@qRFa5@b",GC"k'CZ-5&jVjp
$T1U(+Z)1B9ZVTcJ+F8`ET5@kIkT%90k`Mi5%iJXfNTM3f-+HL)Zf"#'SaqZ!9"4
qB!6l8MTd-X&'MTZ`9cm+SGET2J4ADj1lVpM(JKM*h4Sc-6b1P%L)2S6HKjMMYFc
VGT(i8eN(R3kE1EY6iNlD5VJ6&FedDcEGfJDa@!5QrDkpLT-9JJ'`l!DQH0A"9@9
$A%iD-3+Mea")`3U!9'2K`$DlZe9HpfL'-C!!llG9Sh")[mD*Pa%1a&2ZdH)cIN!
dRV#'",[5MiS6Sjq[A5V4dANB46)10q,&f93clf,1L!F3L2e4-Emjl'Jj215`JMJ
9l)GH81UGBQ)R&r21MIA+C&!bD-5f#QL4@H@[U9BL6a1,T$L6Q#ie#&bUMU+a#eX
QbHNII+2lqS0(dG&[eZ6"mDi-288GZ@,6p%Xh*&bF52bfi@8qYJeZ8HR3f@`QFF"
%%$Vr"EccAm"&NFFd[!k-+cf8%2+493d`I+1N#*1-+NXM''bN4,jl-j6[H1EcU4X
`5)qIUr$cGrbXNQlQ3``4%4XNYVD8$R56lq(R*Ykjhd6GJD3)*%M0+(b"Sc@q$Y0
S[ZI[Y,e"+Fa&a#J(3106M2c'l%'i$E(FPi0h)Zh!3L+F"YrXib6HaBfF4k'Nq%2
TU5"q!86qA5%b&@D4d4!X9fbG1rr@@rNLdM5S#eK8ReFrP`i%iQIKjLjqN!"%[f2
mP`q19Dq6MS$Zi",)MjH1iA-85i+8*cVm@f[B`ih'Mf")hJ85'q9Ahjh'dcQZ"a'
,1MkT0JrH@IqT62kP6IaP*a')p&pAL&`3[m-3+N6Q0iJG$5RKfmNe`3Y2BS!1Kh*
8Fa$f&`&JI`8%9SFSc@mf'Gi`*fe)Ki*KqVIH&HpT[[3I6Q$rh&SPrYA3[9le1J&
I+YpLLU3KYDNH6N!BKkUBj#KajX0K`,H@FK2'NI-!,VmmHZNGT3G@@&+dX#'Z5d@
FZV@L!eAYZ&c9D'109l3fTQL@M5EA66Zj*1N4U0Gjk'8*VfMSD14`a%jT6"raD[C
4NU5UPMB`G(Sf5kiP*j!!G!%r0i4E-1b#TK+!hm`0efGKI'lfP!$d*IMiE$L'BX&
)qNqe%1Y%*eMI`)hPKPdN`0a[,rAFJ-H(-(@BLKbML1Q`BN2PHG[c(T(jq`c2Hai
2VfV[JB`BVk`6+2$aUqCA5G8mb8MF9hZZ3P8I3#V!N!#mbFL2YS%IEB0mY+%5,2I
r2E-ikh&J%TD+q6k!RacTCTBN"XC*bhTj"AS*2crMa2fXBM%`p"QBcr)m`)'R0`*
H(hkZim$Vim$6Fq"0![$dR[%!hRKmR#3"lcSMi&eR!,cV*1#j*1#jZ212`2D!",B
()&l@i3M(CI9I[)m,`+X#FF9lVB!*+U55!-VCLLTqimRE,Al92LYK)0ci*A96XB`
[ZAKDaL[a-SLQM5E40-HkJ!i,&(5p`1NQjqejrN[)BNfhN`6E`4fHhh%8,C)+3Fc
K3SdA[2(mVYiQ)@L4(i,qka3*Z%p"CXhAXQ$695MBRZA&80R58a"!hK@)B`H#8,V
%dEI+#(h2ifFM4prc((fV12V'!(fVN!"#6@R(5-k9d,I4#(dE$G#h88,IB3PpKdh
SZdY#hefBGX*3H(P1'!Q[IEPM*lQbjC3aCR#6b'!EpP"F[ZfaNX3&#Z9jhh8dq@p
H-&9418QS'@eVA5UbX9CEmrm*Q4ceNPQ$R@iN+AH4&-F"f83"6kh6mCk`LJJXXjN
&Q46@hFB6"#A(RSlIk*!!e8cN!'Pb`'R``@c`JF)Z*+3UCP0SFJm,6D3"FRKbMd&
i-Yp+&V'%iPFFSQcf(rKlK#R'D6bZRSV#dBR$A`T(rf6IZf2NS[,r4+Jj-AI$@)5
DVZ1Q821G9cA8I,q+S@BYNN+q*k(QL('S+D8d29kKjNLY3meABF[RF3JeIfF3DSi
BKjS5%)dRE#S5DPBl'K"UE[F,0A9bU1QrjIHQkhXDH)kmSX$ceGiZQq)AH)j`JhL
6aN`T06$06YSb2"k%R'HN'l1)&a!p9!bGKC4K'-E[UkV4K@aL(fAK4)BB0b+[Sd#
1-h4+Nbja)f8p*Uhh-e"l*5@CBK#'pN+`YPd,eI,F`+GZ`D$94Q(SPc`%4B&CbF$
CiKI!r48rrq5'`Mm0$&!Nf,1$0Sk$#IU2b35L%N!Dpl!M0,iJKD)&KU%S*h0a"D(
S$HJ5&XGA244G20&3p(SFiEKdP$11$(m$L!MQ4P[[iab-eK8*4KZk#%E29NKLeq&
SJF'%@SDMNdreNX24l8A$d4L4aX,0Vf&@mBek(T!!0Sc5JkN581-"93p,*dZ239J
k)S@PNYSj'db"U6GH#N`EG*k&H(@@9cm)3,q`G$f[H1Z66)TV@FV0mdfbH9iNjH%
#GaQa-(8l%)+05L!e#mEk*XmDU%m-#f6aSVq8r%"&M"BBQH`,H&Uje@c(kejXpVb
YPlClM)*@&(hkb2-1(H'K$-mlRSAB1(N("+E`L[d%PRM#6b6-Vc"NR5q&V"'rN!"
e#crf&ZZaKeT4V6rah-HC6c-+@QG*35[Gh#F*M@Pq3G&[m,1##id94B4'Zm4q$&l
I&h8K8A)@"qrU,X(EKjpe8L",i&h0`6X&i&hYH9d#la3Uh'N#lcSMm+iV!YjeIZ!
e#'XISQ#D!$X,JQT4"8(YI!5ed3U#@Pr&)U6afFQ%Y38'BDe9c&88eRDe4'#X!Y[
&Y3jXccLUZa#6(aQ(YPi[4qYLSr#fMU2ibbj4r$aeAe+`5bMqNU2iCD$i5mqE%ST
IaXqE*K6h'U'iY`L+Hre3E"$k!X@,23Z[T6mR$)9N,F,HLDE$'i@p)ccXCGeiM5R
`G6BBK,hE&4+4&2D5k'bS6GJlX9$%+1api(X5pMk`B5*KlmJV#AYjQ-6#hRFHYl$
hrDU([42GK$81HaI#U&JS(qADBXkq)4I&$c4(#V8jFK'i`TcR`PVLBEI6K`V$,cp
@ecr,#KFBXJ*4X&F,Xh-3KL1TTfZ149MHXR9L,2G2R+9,$Ql30+-0D4I(`JY,A#L
9I4R#lKj+3U!8"5VBVelbB6ie2XJ6&*CaGpFFpC,lIaRfK&aZRfBaU[V,)CG"NX)
FPU6!ELP"!G0i3aSpQ#UD[6GUN!!#mH%8[J!@V1'&ccj2V8p%ZS,,P+lJJj!!mE,
LG&4B2SK#1%J-QBdN"TFZ!HNL,YATX%8rfQNj[[ZNDjYD3A0Uf`5SD+ALj%CH!@r
Z3fE3YJhUbT0Yd2!H$kfSmDN,pG4%ci9k(K+9E8GLc#LDY)53!(jhq[dlpbNNa#$
-BpA[eRr+#J)CTij!3GHaY"')f`IGdkH18l@%m%H0`Rik-aQUeL0%STcmAPk)UJ5
0(f4&8#`3"m#IcS06*p%Kd-J4#Z"0(5qkNDM2#m$DPh%6!dIE48HVNBifM6Thdp(
k)%TYBMYrpHE"c+N6d!e$U(YHjidZ)25!m(fcUb4QIX3)#&V$6+%+$VQ+(9)A#rD
Ca(#KFAR82rh"P-Z!8TPGHjZNlkH2&*-ZjU5PFKI8em@&XSlk[c-9E@A0E[%Qf%*
"Vmjb1a@'5f4&XaB,*328ECGe"N0"K-)hIB#NDb"A6'cV3i"VBH&e'5qL,MHEjBT
$@`5P,fKIY31B5%9b'+UTHrV+,%dX0(hPRN1C+rHXc!SHA*NP(JX')MY&5aC%2*,
L,61(%ELE)f%c'UUK*Q5Y4BiMV-La9lhNRfFL[%Y3,jRC&"N@Mp9iJaGe&`hCei"
pCD+BQ296aDNp@jdBHKV-P2T2TH+qHYi4jl%&hpCAQj%SpE%ZJ+,"`B3R&+I'+Bi
iKMUf"+1kR5Mqfmi+#NZL'%AK2Sr$YK%DZKA2FD+2L3%UBKIj&a$Z0UR$AVZpYU*
5"LB%H(ND5RQPSY4Z%6!@'"fd!'!XQ!JBXiU!d3Bh&(IKMA5LH4%V#2eB!i3&rmF
JI,mS#+[B493-5803VM)km#U!FYABJh,R$AkJp'-08+lkR`c+r@-*bYSA)jqCC#e
'[[,S+bp'2[-AeQ,N+l1V8)`mLaTITLB38*Mk'Fe4fB%pq0E&*5ZRbDjY-L+$EYi
*'$L`X3a2)m`B3b+8PZR#k@hNd1E&XCp4B`&6X`@&a8I55EEDr8!Y&jTX*F!DGj,
qUTDL4e([Q%ckqd%d(G6+8VGRjXX'5""#2TSj-eqDFSDk#Z2M&5'l8bl`qHqC4`j
Sl9e6+$Fp5P8S+$8Q"j1T2p*6FU&-GdYl2HqLpbD*lSi21XhcAU0r5erE1$aVprG
G2LAqh0VeRmGT&r!N5ECaXEdX$GREGN-*f80&1HKrjY4mU)'piD@+-iqN(c!LK6A
`d)j$YUcF8"JjV2K!'%La-9,18R"SdIHj8Ha%N`F52Y(1iP9$fMJ"!HQ&4c)UTU+
,j4PaBdH%ULJ4rbS6NC'@8hXUH"1fAmI"bA8QQ+DF@[Y*@A"IqhDRl9LMSR8f@"b
mf(X[LVX[+liqbk`dI,r1a8Qi3G`C(mFEV-eeGB+%R,6FF"J9[!*FX*@UZY$5L5f
%k("b#d'm`@'R5e1mR@NS9,5q,1Ee49fRp6pCVedNMZM)$AF('1d[,G0Q9+JjKI6
rIX9IA@R$JY39KP!rN!"eGZhk-YrYPP[1`2R2K'NG3Lcpf[@"11eX)`AGKD8bMU5
Q@J2D)NTD'#MND,KGJC1abGE6U*6ebm#B8pc3B&CSbi#+9F2-0)F4U#PS4Vl#J4C
ji((p-F@R9$JSchK3Nh*'mHCpLeYb`lBlSlZMIkR'9KBeGFm@mLE5UdT&MfBm`d2
54kFm4Gq0cml*N!!NQNMrV-)"AU1M08b'N@!dd#'4F8QC8X8TJY(!Xri$H92-,QP
S$%aGE$"[jKNhEc*TTRQZ!J55NN$*R'4@GJlINDDdd-2XNrc"V*MIK5+LX0H6LKN
0VbqC@8E"rZ!fG0FlS"URMF0XL@XK&8(VSX,QIeeXd($%D9SX-JcAVNePJaZ0'4F
[)b#,UI+BUGY9J`[qMIbB9Xq@R$QS1+LN2P45hGRfk'Md!bR"bN29e'Y4,rPM-EB
p'j!!aYlBl`T409dJlZ31K-N*Jd,5HDTG99hQNBNY8j%Sm&[Qd`BXSF05G4!+N3k
iD2fl&AaZ`1G+-TXLMFmVUhHA1Cp[M#3'TbTLC+T5QDUipi"6Gmh39`0KmaTA)9,
pijXl3k'6lG03f1*aH!MXIRC!1mE4B[`aY2[C2GUPhM`FIKi1Ic81RjCV`TqK+GD
c0e6+4%Z)rN+qK#34mkNAi)K!C4Y`F"%(EqSdilB5YlSDml`Vp'rTP4Z'C`e8*aU
!SkPcUU+6`$('"!j&15FQK*V*%5Tq&Gq"CY!HpdF1S(-1VrpR$U)j"#)cJHJdQ38
CNiF3k8L)LrS!),AIZ(*4%S-8iSa"*6Z+30%GL'09jmI'pGD3!29HrdTUa'LHHXQ
MPk[!U0$+L!Vl!ePQmIGCEF9j9&`5kEQm!B$Q6*bZe'TbPq*r!e&NTSG(U3J-#4Z
Gm@URVlCrV-h3TX*#Ui$m#YK%UXLQd"J)e%`GDci,U3ENH(A#9E-9Phm)KDPal[Y
KSMVj0XYKUH%X9j,F"*&$&m9P,Tc-M4*Nc@c0CFeX'EK4CNY&Rkb0Dqhh%kZ[IZ0
DJ5lHb8%0JJ0b!G*@+"VeQm[F+@*#K,Cah5)9*XD,VKa(iNlHH*KNk,ZqSTj(PI(
UZ&5JkS3Cl[U8ZK$hB*[X()HjrlP9AH1U!9b%+c-G8J-A204FV%M&GAa5ibkLR`i
EJN4@K$QbLDYMc49kEAfh)*D#m"LZQQ0dpL*VB#*D*ZiB4FMMlX%dIkFS%U6ZN9b
LD*jUpQUV5a30keAUqVBG3aMXR$PX$6ZhZ@'@1b2C40%jPMM3RR8XBeE5DM,Y
paJklUqZbYB8%l8"2YJNe9Kc3Ci**U!HheJ!BfdRBI*!!3V%S(VUMcr('rD3`&)%
QECVfDr*i),J!(fk8(Ql%``h5``eiq)Idm!mmc*FHjZ2Klp,$hr&`PI4`&4kZN4k
Z`F-mk@%H(Zk6(Zl$`bcTB4BH(T!!(KkSAG$qQ-mSD0HrmU$pXEZ0J[Ee%`RDFfQ
cN!$!Ule%E&IH,hriDPdJ,L9hi%Kq@QU1SX$PFVpQZhYk`Hbd-`Ri)aiXQ$d6"H0
@cKEK[%&$M2LBm5"2m*RJRVjL'C)!-PFX5fNEa%0p2A-VKi**B0QR29`+MQ#jBJi
a@c&(2,KL$M%VQ#-c@c%R!ilY&IG`0[G`0[FmH8p+EVIG,NfAc#-[8Z$l`aEA+"c
9YPhB[YVA'R3(cJI1Na#XMi9Rpil#(FZGXI&KHL5(GVK96aYGcjUhNM#LP`NC9%b
4'8j[$%)M$d"NCd#-j"EQd'+RpL&B%L[VP3JQ2k(B)MRQV8%hA&EQMLdm25`hXM1
lpChQ'SXZXD5l,"+")a`I6YCB#R$"'*ePl5FD'kU2DAK*YhDqD'RV6Je!c0Q3!+l
#bBKIKHC)q!,E3#$)Ll(`0Mj'R5+EHTQ4PjkEcqmB+'i'H6iB,Ne%42LlIfN@Gll
p353D[ZX[EE[3i,*%p-JrpEmk9qPfce$Y%d0hPT2j63kafhBUYMY$j16'V6Pb(XZ
fdl*IadH'63m2NXUJfD,cGf)3IQcK9M'NE`XU@8mSjN,RYKlD(2XFi$[(##`Zc@$
%+@IN-$1eG90(H'Kh4pLjqbG)[Z&%"8GZd[rUI1A1jGGTR-%R&G[b[fR-Jmf$B)V
'Jj'UFeXT*a0rF'XM9hS5QZ@j`"E*cC!!PZ&Q3$d3fqLDLNQii*Uifce9mD+T,HI
Z0YcfUfaBZJf2@6iNQpbfflFe*IGNJJ4%Beacjb@CJ0AeLZk&9Yfl'rV#3rSq1CJ
,+XmlecG(G[lcVq'&HMJEFGNLLra5Td$9mY#8akHb`U'*#c6YJ5f"Tr'+S6M-'bc
9UFkLm8XEDcEM0JM4A34@0feFFiGLlQ86FHRKBNRK@mi!M%e33M(Xe(GSmQZf)58
f%H64*Gaf!$6KP0cJMYpX#RrkPqC`+i&lijj0VY&Q$'R@a!khEZPBX1I1[ZK@F@p
Pi)[hi25%d@%&XJkh)J6jE50dX4['6QEEE#)R8jZUdYV4T()f3bj!j3@#qi(1jSL
#p!*pj3iX1%-6BJ3`B[5lGc-bR(F#p2c@$19FlU2N0qGZh!6M9i)Nh8qK!ZXd3i-
RZNDq)6%CfX-jc#5$`'K&bQ$QLYE10['VfhBScM[`!'A!(r'e3cY@Y$TLp+IcY6Y
fN!#*f#HT$c@q%L4h#*SMl4aCmBPQU2QpP8Y@Y'UF0&am8@AZE'B-"i(b`@Ca4p"
1,T*ZN`*50`9"C-XE946[piG'2CjPLQd8+B"+@4iZmG")&f%Lp'Y@SH1089)0R-d
mf3NE49`a3QAXjRLUb0fLl29P@J"(h'r2YeEf"LVd!`4rCq2S*PH`-4`SFC80C3I
imI2SX)iB@qliXU5iB"61pVP-6*&`+i%KNqmc,GZ,TJ2Q"Z!`1q6'a!D),HGD1[S
#QB@9B-E!H#VFm6X$`qc&Ek4Z(!l`e,4-HcDXVA"D@R%k*jNU92pAjeQ9`B866%+
AL@VG6UM%#536Y$2"6"H2JrSd2qZ5QmbPG'i*3"2BM@BM&iKBqU8bl@3@2d@,L`M
1)RFLb)8be#Z9e08me[5f2K+p-`$cT6eT9'I"LlT1*dXLU94U&#Je8Pj&*,V!#(-
prarc"m6%""FZP,1lX"b#p!2GHCJq6ThleEN0p"9dDkFj@SaCKrTSb3+ApK(GH5)
leFD5Cp9,9Qap'i9hB(`&!-kT5J2V'%lZ,6eFN6MchDb$bbaEZBK$1ja*-%)+6ZD
hLKCrKX&SdV!ZkQl6()mHrXi8H[AYCmE)rabZ49aLcrfViFUS(XPdiR&F-X[Xi&f
TTr8V&p+5lZR&aLH5Kfa3NRGP9hV5F2!F0iIMG6#MU@%bdCddc"Lqj)mi6HPKECN
9GCa`dC!!F(6j6EmkCdLq$Z4A4RF")*ARX+&MeSM"H&*m96me,Lb4BU0210#F`41
$-aJ*[cC8(MmLH+8fDr+SXZ,iadTFq6C@-Aje$YX18MAlpM08-`cScZ5m*'Fa1@l
JBVUH!5h)J*EJ$l5JSV0`YLhe%T'I$3D)X84`NZ65lG1NDLPpJLS1`&(CF+P4VmI
"jN49dQ$()b$#MHSlJ[6Z&TA8Q04R#d(QQD%$#fp"-mX())@F)#N'9eL,LN6C#-b
A06b3!-SpMbL&YhL*-c"aaJ&[[*6AV`R,S@`2,3F@mqA#K'$#fQ,J6%JJ8cJHmBT
$#AY3J6[EIfpV9"l@j,@[3P*X$!maM4-2$iGHBd-d9h'A'l3AZDJj$"m3I4#"f[3
Z'FBi`iFj`iFj`jJa`rqd-Xa*-f*("X0YD**3LH#2L#3NRH,66i16"`P*q15$ScV
hLThkZE!G#6dDEDU4`3R8-Q"mMNBkXZ$fS@*pZii5)cJBScapVNCTUUF'k#kP`%3
+$j93JKqDJdFBUB0D1S1iFBqUj+*-Z8L`d+(*,amZ&QY4%M9HQ3PI*J5M8'%$Ve$
mH+6-L#LIb8@)j5*)Tf[5QB-)aP5KA6f+VN+'3pMF-L48)%,&Z85Q!ANq+hQQBbZ
bDPk@N5j64#5*"#Bk+P6YBBh0UN6Sp$fi'"FQ)P8#VYK(jU)#0"DJQ%jiRaiT*Jq
DUCN866Y2RRqB@-J6`TB59qCf,ddb*bKr011DL[1'DT6E&I0ZI+6A(!80!+rP@aF
FSUI0[aFEf@3f8+(,m*TC8-#2X5l)Nf`dH8M'dfPUF"NlPmCQAGVKC42j*jXa-3Q
%4!!E@m)4Z'#pl2-jZafYLpR*cF!0!J$"($f-KZKCGcAEMD6Y6(,E4JLFa!4+h',
-5+li2eqF41k[h!%01"BbN!"#&(SjSZRL"ITh#*`l65"fZNHYS#9Pdr#N)ZdT"M#
%M%1TqcB4J&qN!MLUQf%qMUT1)F`ENX&K+SE",pIV"cB4,MS*m8Pa-JT8&5%TMj!
!1-[mYF)14XU)0'Y4dbN[mr0b!N0&Nif"kZf6@Ce9`+c"E9(PK@-&VUS`iJp)kMF
K"@hFq5(&9L&5USf3!0*[)Q5U-KI-kT@j$M6PJK#@GcRfNB#%([!ZY#SmKB)b'Ai
U,`&8&TrB0UB+GbbP$GHp2%ULHI!NUUN6$Fl%m3f+*PPd!ke19'5TX@$'TP[$jE4
4bMd@jS6pBM86`a991[C+VQ3*#T(&2M+%fR"09kh0Z++`&emV6'5Cd0l#"XR6qD8
dT)AJR*-D[-PI`iXR$@8VNd-BBm%B3P6j'1VBjfi0PbTdc%4blTl'F6D9BTNGGBf
f)46+bi1i(d,9hDBmM-$ZMN2#&j9K6`dkiIjY)"@S%,FT2[U!i#(5m4JFmpZ8ZSh
$Q'c4iM*lCiDq(MJj)$E5N!"ZZbC(5cf@)MXTmU2NT"L3!,kE4#b-+#YB!F3m!M9
%Pl3m%iJbU$3kJm2lM!l[0i8,(Pa+8!*H9+IFb,X8UXLU-KPThbUU*-EF4j8LcqC
8,*Up-!Yp5+2aPF9`mBZkJUQ+Vp$-31TSS*GYI9!e',T)db1aif[$%,VBK$'U(AR
X84)@af!`l8-A48dJ4*(J!1-C$S"Q,KkmA4m$5FffAHL%C%5bc`!ZPCT5*&2+"K"
lB4c@XiYYj'pJJ3i"QifVCi0XFQ8Vqa`G0@m+NX`VE5BDp19Gc#Nb"rUC@AZfAVN
l,-*-KUXdE+PjmGM!"PGPSXVfmS#i)r5DGc4K3,-)RGPCd4)9"S915ij[jT0S1XY
bhl"VGlHVa[R)&3b[%hFN[BB%c#Vr!G[e,pbqSHpqQKicI9`8YQaaSG,'T-Al0)Z
`3AUBLb,N"KFMC-h%%G58*V2J8"6Z-HT#i38Y6E2$"M8jY[CaTaC8)c-[R&IL5Z1
LKB)G5Mp5,rQLi@dp'C@k3'3Nh,K#VaSDE!ihVY9MiCLQKDX8&cam5N`6Smd!FZI
"'@a*1FQkEhSj!(Fi54-bpf$+62mLLZB*'JNPERUSCYd),R*$c9MCh%*m('e[!r&
44cXGiVYk(1)HFKTq%FeZ*%-3*NTKZ9D+3G)SjjH,ABj`l33BC9L!UMKGL)%*a2T
fS,ZI,k',Z&$Sj#6[PU8,&2-Jf'j(3e9P9TjG-1@Xq'IP&'2&Lr1D',eKYqp2,B@
PEq*%$6br)CZqTXqS1XiIRH)'EITckAE*ULH6FFVY(*Ad@6,*kA-%33)A$H9Fi$U
*EEJ"hU$%f@CHd+8"2cT(TAY2@XZ3!%lj8%P%)#SUL3k[HdqacI6*Ub4f$MRb8N&
`UNGXT'T"f4G@daH%fATGA@k,B22TkIe3X-,`FiD6d#J!AJr6kd`8p&,iIaH%R[&
A$3YIAIR2FkX(K%pQ,IMC!Q(,Sr5IfRhAA8+UqMCebV([U`qTXj)[*#mAi[%cjQR
e6jI1QL'N#LI96VAPXH5X+fUhm)C`6I)cqYi[2K3bK,m,1A15e`SpDN8Hf+lqG(E
be-[UR`Y6K'A*,bGrmq%h(`PKiBr55'(Cdm+Xj-[*%i36kj+rQ5HX6,iXr#pq9J[
Pdi6IMKH5a`XPR,D2Ir$JqDI(MAYkF-Z9`EL"+pd$3N!S%cjqqYGA[K&q[5#j3qK
EX--Mi&*abN2U(d`6hRrd8H&r(hhdihYQ#+-cK1GR#*-H%jDH'1J@hTJKV&FApLa
,[LdjIh#r-&Ypp0M"j1mNIcAiTYV@,*`EI($DmVd6fS5r6#[TX3Yad`6DY"S[1!!
5HlHkM,%9hRpVdD)[m#2m1eiFZ9#`iN,"FRA+B*[`@h@Hm0)9B8!pmkRAe@ZZ##G
AR4$1G3JG"6p8(def*,mP("EqCHPJBQpb6R,cB&Rh0m,,dSK[IUM15IjPmT[#EiA
8TB-e(bBA*JqS0h,+mM(1mF-RKHR#%R@Mm%2K'Z(idbGA#"H&`Cl9VkZr&Ei8TJi
rqFePSHI#clU&eaHTAlc5*hamcB3([KR6*rcN"m,&mGhMZfHF(bGd,jmf45KF1H2
e'5H&Lr1&Mhrpia-[#4GI%ljpjMG#GSI`c+rlIR5ZHmaj!*!$'!!!*)J!!&Hi!*!
$#!#3!b!!!$mm!!HTm!#3!`TB`!"G`!!!AF!!N!3Z399c-J#3"306C@Fb"h0PCfe
PER46C@Fc"h0PCfePER46C@Fd"h0PCfePER3!!"TZ!*!$!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(5S0R"(!"6R91l3!L6R&+JfB#UI4`!%jeB!B!N!8"6R%I1[r
f5KpQ%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!!5
Ae*A8)$Vr9U%H2cJ#)'B!!1a86ba))$Vr4#)'`VJ$'PK"B3$r6#!krcc!Z!-D3IV
r1##!5S9Q"+%LB!3J4D!RCJ!!Y#T))!j3J%(kr`JJJ#!kr`T4J%(kr`!JJ%*R5(S
![#m95(Vr!LmkrZ)[1[lL,cVqbLmkrXS[1[l+B3!06M!ICb!r!%U&C`JJ6D!US#Y
J"#"0S#-J6U!I)%HJ'c(I!L"JB#"1S"mJ4k!EFJ!5"1F*iaRN%3!"!#!#!3$J)%f
JD3)!!"q!!5"0S'V9e0I83IVqGNU3!'F)F!'JQ(!$S*JJ659)!!K`!%cIB2K1G8c
IB2KJ!2kq2`!J6U!I)%HJ'c(I!L$9e0I8-$J#)$(!#Q#4b#9)!!K-hf$i6R919J!
!51F!1#KZ!!a(q[iU4IVq+L!8X**Y"#!5+)"+J'm5)&-LEJ!)SLiJ&0'6NC*`!'!
%-$crf8cI(!"1ANje6PErb%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,[rNS4iY52rS)!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,bl
ri#mZrqK1ZJV'9%m[,[r`UD-NE[r8*@lrd!!-*@lrh!!3*@lri!!8*@lrk!!B2cb
KQ%kk!eC86bC!2cbSRdkk!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$e92,blrl+J0-"mm!!a'!!"[h%)RUCYC6bmZrq``"P0'2`#
S$L!I,8$rm()"(`'TQe92,blrm+QQ-"p)`()%`)&R##mZrr#TSQ$#*'lrm%U5Ca"
96bm+UDB`(dM!FJ6!J@HU,`UTSf#N%#lrb"e!!"C-haai6PiJAdr[!!j1d%j@rra
)j`!`3Llrr$mmS2a1ZJ)X9%mN3%U!Ce`[!%kk!B"B6dS!Ce!J#LC!)%![+!!-2cb
Jr$mmS2a1ZJ(H9%mI!%kk&$JJ5b"S!"#J(b",)'J!'+!I)(`!!!&D-"")`1#!FJD
`J@B+F!!JI!!!!c`JJ"em!!(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)"m
S3#"!*&!b+J!)NQS!"$`"0#S!"T4U!!)q!MBZrr*)`cJZrqj)a*D%1!&)a*D%DJ*
5Jq+$282rpMBZrr")`cJZrqa)a*D%1!*)a*D%DJ*5Jq+$282rp$BZrrE@36e$rrS
b,[rddN)p3Iri@8p#TdKZrr4)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)"q
J-Lm,U43[$+QM,blrk+Kc60mFq%jH6R8!!J!!6PB!!%MR!$!NEJ!))!SQ3#"!)LJ
!!Jb"38a"4'B@)LJ!"Jb"4%008'B+-#J!#R)$X%&R"(!!B!*`!8cI$!"1ANje,`T
C6cmmU'j`!4m!6VS5H#"I*%KC6cmmUQj`!4m!6VS5CL*I)%Uab@B'-$`#!'!%-$`
%!#4I6R919J!!,`-f,J!)-!0)`!+!!!!)!%U!E`4`!@!#F!!Q(djH6R919[rm51F
F!$BZ!!Jr!dkkrma86ae!rrab!E!"CK!#3`Ir6VVrJ,"$EJ4`!'!S@8mr2+LIF!%
I!%kk%I!J(bS!@8mr!amZrra1ZK(J)"mS!,#&CJ*`!%cI!$K1ANje6PB!!%MR'$!
i,J!)*'i!#L"+)"!Q3#"!-K!-38&%CLJb+!!#$%&$8QBH0J4brlC"CaSJ+!!%FKM
LU!+!!*!$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!)F2m
r!%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("K1ANje6PErj%MR(cJQEJ!)+Li!$#!,+%!Y32rSF#6C`#e-rqa`)0R
!,8crm(")fF!Y62rdF$lC`#!-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+l
rm#"!-+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-!!))`,[rfFJ(!3G&Zrr"`!$!$8i!d"h)!-J+`J@mq1#lrm(B!0J3
Y3rrmeS2@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%MR($!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!Zrrm
5,J!6dJ'3!!&-h``i6Pj1G8j@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`6
i6Pj1G8j@rpK)jami*Qi!##KZ!!iJ2!!!!564VJ!5)$`!!!*)dDi!%L!Z!")Y32r
XFL$6VJ!5)Li!%Le"rr!N2!#3!i$9VJ!5*#i!%Le#rr3N5aJ5GJ!@"#e$rrMQJhS
(aN953ce$rp`Q,[riiS0k!mC&9%-p3rrQGJ%k,[rQkf-p3rrSIN$)"h`!(!3p4[r
LH!(VC&0%286ri#SZrrKq!FU(C`Kk!$S%8i9J!RVr28ArhRJ)286rj%T'CdB[,J!
5,`!r!e*+,`T1Z[mk6qm!$ZG!d@lrj#mZ!")[,[r`2`-[,[rX6VS,#%r[!!i[,[r
d2`-[,[rX,blrm%kkr+a2l`!13N!p32rB-#lrf,"Z!!aN!!%k-#lriQFk*%!r,[r
S,blrp$mZrq3[#dkkrBj2l`!-%J!J#R!!%!%p32rDG!!d!05Zrq`J3K!3FJ!5!00
Zrq4J($mZrqBr,[rN,`Y1Z[h`8%mp32rD-#lrjY&Zrq3`,[rDX'lrhQB@-Llrf&*
ZrpK`!$!"d)`J3%)3B!$rHM!ZrpU`E[rJCJ!!P$!Zrq*R1L4!2blrk#mZrr3r,[r
N,`Y1Z[d'6qm!$")!)!T`!"!"28$rfR3!0!$8V[rX)%)3%()!%J$6E[rNB"`r,[r
Q2blrj#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-Llrj(!!-!&HJ1D!60mFq%jH6R919[q-51FI1#CZ!!JU,J!
-+'i!%#`Z!"3Y5rr)F#6A`#e,rq"`)0I!,8[rc(")em!Y5rrN,8crP#Bm!!!"*0H
Zrj3J2!!!!NM4V[q8F#$4V[q8+$`!N!1!fDlrP0QZrj3YE[q8rl3S2!!!"*!!fDl
rP#eZrj6rZ0HZrj3YE[q8rlcCV[q8,@lrP2r8F(c4V[q8,@lrP2qN)$`!!)!!dDl
rP#!Zrj53!)b`K@-+F'8p3!!S6[S'HR!!,J"#3$e!ri`NE[qNeI`!!)!!,8VrU#e
Zrk6rN!!YI!!!J!$rk%KZrqJ[,[qN)'i!*%k3!&"2)#lrk'B+F'Fp3!!S6[S'0#4
Zrj!!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&`#"Zrj!!8UlrN!!3%"e!rk"b!")!dN&
636e"rp!`,[r3d%!p32r5)'i!(#!3d+i!)#e!rl!N3#m-,blrZ$mm!53[,[q3!%k
kqr*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$mZrp![,[qi6VS(D%r[!!i[,[r82blrd#mZrlJ[,[qd6VV
j#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!!Y52rX)!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--!Gb!F""d@lrQ$)ZrjK`!$!"d)$3V[qm)%!`%$e!rjJJ"q+
),J"6E[q-B!$r1!4Z!NMrQ!aZ!3$rQ'33)'lrV&+Zrk`3V[qCB!$r#!4Z!3$rQ$J
ZrjKf!$B%,82rq0D$eUlrc#"$-"!p32qD)Llrq0+ZrmJJ34)3F!!3!6e!rja+3'F
!!-)-EJ!BriaL!!#B*'lrN!"55VAZrkKMD#"Zrj!!8NL4l[qS,8Mrp#"Zrj!!NHl
rT#e)rr!JE[qSNHlrN!!Y52rX)!KR$L"Zrj!!)QlrT#!ZrqbL,L4Zrk69l[rX,8V
rN!")E[r`,blrT#"Z!#41N!"36b!Zrr#`V[rdC!T`Cce!!#K1qJ-S)'lrN!"5V[q
3!")3F!!3!63Zriab!$)#ikL1J&"ZriaJ!2pLF2pb)$JZrjaf!$B%NS2LU-"(d@l
rQL!(jUJZ!*PZria#3$e!rjJ`,[qBX'lrdQ3!!-)`,[q-CJ!!M#4Zrj!!8NUel[q
SBfJJE[q3!&*)NHlrU#e)rr3JE[q3!*(Zrk3Y52r`)'lrU*(Zrj!!,8Mrl#!)C`i
JE[q3!#*Zrk3J,[rXSLiNE[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+lre#"!-"!p32qB)!ILL#i!8flrM'!!rcB`,[r5N@lrQ$J
ZrjKf!$B%,82rr0D$eUlrj#"$-"!p32qH)Llrr0+Zrq!J34)3F!!3!6e!rja+3'F
!!-)-EJ!BriaL!!#B*'lrN!"55VAZrkKMD#"Zrj!!8NL4l[qS,8Mrp#"Zrj!!NHl
rT#e)rr!JE[qSNHlrN!!Y52rX)!KR$L"Zrj!!)QlrT#!ZrqbL,L4Zrk69l[rX,8V
rN!")E[r`,blrT#"Z!#41N!"36b!Zrr#`V[rdC!T`Cce!!#K1qJ&D)'lrN!"5V[q
3!")3F!!3!63Zriab!$)#ikL1J&"ZriaJ!2pLF2pb)$JZrjaf!$B%NS2LU-"(d@l
rRL!(jUJZ!*PZri`JE[qX-LlrRR!!-!'4`#e)rj5alJ!JC@!JE[q88UlrP"!3)'l
rV&+Zrk`3J#"Zrj45V[q8%"!JE[qX8UlrV"#!)'lrP&+Zrj33%#"Zrka5V[qX%)!
`,[qD8flrQNT!C`$lhL"Zrj45V[q8%"!JE[qX8UlrV"#!B0a@E[qD)'i!'0('-Ll
rRR!!-!%LE[qXNqi!)*!!LC(!,8MrP$!ZrjTR*L"Z!"M4aV(Zrj4M'L"Zrj45V[q
8%"!JE[qX8UlrV"#!8flrQQ$8,@i!)2q8-#lrQP0ZrjT+3'F!qfBJE[q88UlrP"!
3)'lrV&+Zrk`3J'$F)'lrV,(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`FQ9
cFfP[EMT%C@0[EA"bCA0cD@pZ-$-`-5jM!!!m!$iJ!!"i)$i`)#BQ)(JJ2$dc-J!
!1N0[EA"bCA0cD@pZ1N4PBfpYF(*PFh0TEfi`-c!a,Q-!!%j@rqK)jami2Li!##K
Z!!`f,J!+F!!`!cJ(FJ!b"*!!JA)"X)&[!!'d286rk$e$rqT5E[rS-#lrk,"Z!!T
N(()!-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,[rUH!!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"DZrqdJ,[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!6VVq0Nr[!!`pE[rU!!TJ!2ii60mFq%jH6R919[rN51FI1#4
Z!!Jk,J!-*Qi!$LKZ!")Y62r`)$`!!!%NfF!Y62rd3N!m!$B'YN9N,(J!1!-Y42r
if)SJ4"!3)Llrq0+Zrr!J34#!)#lrq0#!d+lrp#"!-)054Q$1,blrp#mZrr!r"8*
R6VVpXNr[!!a#3$`!0JDf4@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'F
J)#lrk11))Llrl(3"`S+!J5e!rqJJ,[rXiSJY32rXB0Jd"R)!-J,5JG+Zrr3J36)
3F!!`!H@!d)XJ3##ZrqK54P+Zrq4J!2p860mFq%jH6R8LAb"IS#8ZJ'S#3TG1d5*
I%Km`(dS"C`5R4Q!#SdBZL%l4)Pm5(c!I)&p+!@F%TNGJ!U*(6Y%!N!-+!$LJ!3!
&!*!'!3!!!Bp*!!'153!!"'`"%jYJ"&i!N!-F!p)!&%4*9%`!$3#U38a59!!+!9*
69&)J!!%"eP"cCA3!!!(Z4%a24`!#!IT69&)M!!!#(P"*3e3!!!)UGQ9bF`!"!MC
MD@0Z!!!#6NP$6di!!!*D5801)`!%!QC'8N9'!!3#SN*14%`!!3,H399c-J!!![C
KGA0d!!%$!QPME$J!!!-D3dp%43!(!bC%394"!!!$KP0*@N8!!!15DfPZC!!!!jj
'C@&d!!!$UJ3"rrmJ!*!)KIrr*!!!J!%E'(!!Krrr!*!$eJ#3"BErrb3!!5B"'aJ
3!)$rr`!!!DF!N!@errmJ!!)&!*!&J[rr!!!#G`#3"!2SrrmJ!!,9!*!&L2rr!!!
$!3#3"!)!rrm!!!2C!*!%!J(rr`!!""F!N!3%5`!S"!!5i!%6QL`%Vrrr!!!6-!#
3"!%(!$3J!"0Z!*!%"!(rrb!!"'-!N!@#rrmJ!!4c!*!&KIrr*!!%J`%6QK!!Krr
r)!!%N`#3"BErrb3!"+-"'aL!!)$rrb!!",-!N!@"rrmJ!!6$!*!&L2rr)!!%d`#
3"!)!rrmJ!!6P!*!%!J(rrb!!"28!N!3%Vrrr!!!8(!#3"!)!N!-J!!8&!*!%!J%
!"b!!"48!N!@!rrm!!!8K!*!%!qMrrb!!#9J!N!3%5`!3"!!4#J%6QS`""`!F)!!
4)`#3"B$rr`!!#A3!N!3$k2rr!!!*Y!#3"3,rrb!!%0S!N!8"rrmJ!"$i!*!%"%[
rr`3!%6m"%jSN"%[rr`3!%Q8"%jSS!)$rr`!!&#`!N!@"rrm!!"8`!*!&J[rr!!!
@0!#3"B2rr`!!&cJ!N!@%rrm!!"Jm!*!&J2rr!!!C3!#3"B(rr`!!'8X!N!@#rrm
!!"P@!*!&Jrrr!!!CB3#3"B6rr`!!'@`!N!3"!2rr!!!CG`#3"B$rr`!!'CF!N!G
!!!!Cc`#3"B6rr`!!'I-!N!G2!!!Cp`#3"B6rr`!!'P)!N!8"!&iF!"j@!41D)!!
#!'JF!*!!(`%6QMJ!!`"b(!#X0!%6QN!!"!"m(!$cSJ%6QM`!"3#'(!%P,`%6QP!
!"J#3!"`"5%i"%jT-!!$rrbJ"Ffd!N!8(rrm!!A2*!*!'rrmS!'!B!*!%rj!%!!&
cL3#3"B$rr`!"FjF!N!Err`!"MMX!N!3'F(*[EA"d#-3JFh9QCQPi#dPZFf9bG#"
%DA0V#d9iDA0dD@jR)&"A#dPZFf9bG#"%DA0V#d9iDA0dD@jR)&"A$NphEQ9b)(*
PFfpeFQ0P$NphEQ9b)(*PFfpeFQ0P#90PCfePER3J-3P6C@GYC@jd)$)*8f9RE@9
ZG#!c#90PCfePER3J03P6C@GYC@jd)$B*8f9RE@9ZG#!f"dF:
|
Changes to tests/all.tcl.
1 2 3 4 5 6 | # 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. # | | | | 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-2000 Ajuba Solutions.
# All rights reserved.
#
# 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/binary.test.
1 2 3 4 5 6 7 8 9 10 11 12 | # 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. # | | | 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.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 |
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 ""
} {}
| < | 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 |
catch {binary ""} result
set result
} {bad option "": must be format or scan}
# cleanup
::tcltest::cleanupTests
return
| < < < < < < < < < < < < | 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 | # 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. # | | | 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.2.2 2001/04/03 22:54:38 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 |
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}}
| | | | 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
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.4 {clock clicks tests} {
expr [clock clicks -milliseconds]+1
concat {}
} {}
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)}
} {1}
|
| ︙ | ︙ | |||
333 334 335 336 337 338 339 340 341 342 343 344 345 346 |
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}
# clock seconds
test clock-5.1 {clock seconds tests} {
expr [clock seconds]+1
concat {}
} {}
test clock-5.2 {clock seconds tests} {
| > > > > > | 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} {
|
| ︙ | ︙ |
Changes to tests/cmdAH.test.
1 2 3 4 5 6 7 8 9 10 11 12 | # 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. # | | | 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.2.1 2001/04/03 22:54:38 hobbs Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
global env
|
| ︙ | ︙ | |||
1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 |
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
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} {
| > > > > > > > > | | | | | > > | > > | < | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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
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, 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]
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 | # 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. # | | | 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.2.1 2001/04/03 22:54:38 hobbs 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 |
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}}
# 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
| > > > > > > > > > > > > > > > > | 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 |
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]]]
# 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/execute.test.
| ︙ | ︙ | |||
10 11 12 13 14 15 16 | # # 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. # | | | 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.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 |
set x {}
$x
append x { }
$x
}
p
} {}
# cleanup
catch {eval namespace delete [namespace children :: test_ns_*]}
catch {rename foo ""}
catch {rename p ""}
catch {rename {} ""}
catch {rename { } ""}
| > > > > > > | 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/fCmd.test.
1 2 3 4 5 6 7 8 9 10 11 12 | # 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. # | | | 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.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 |
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:/}] {
| | < > > | 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:/}] {
set msg d:/tcl8975@
} else {
set msg [glob c:/tcl8975@ d:/tcl8975@]
file delete -force d:/tcl8975@
}
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/foreach.test.
1 2 3 4 5 6 7 8 9 10 11 12 | # 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. # | | | 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.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 |
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"}
# 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] "
| > > > > > > > > > | 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 | # 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. | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# 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-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.2.2 2000/06/02 23:44:07 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)]]
|
| ︙ | ︙ | |||
286 287 288 289 290 291 292 293 294 295 296 297 298 299 |
puts $errorInfo
error $err
}
list [http::status $t] [http::code $t]
} {ok {HTTP/1.0 200 Data follows}}
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
| > > > > > > > > > | 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
|
| ︙ | ︙ |
Changes to tests/interp.test.
1 2 3 4 5 6 7 8 9 10 11 12 | # 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. # | | | 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.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 | # # 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. # | | > > > | 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] == ""} {
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 |
catch {unset a}
set result [testMyNewSet "ok"]
rename testMyNewSet {}
rename mySet {}
rename myNewSet {}
set result
} ok
# cleanup
foreach i [interp slaves] {
interp delete $i
}
::tcltest::cleanupTests
return
| > > > > > > > > > > > > > > > > > > | 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
|
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 | # # 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. # | | | 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.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 |
} "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
# Reset the locale
::msgcat::mclocale $oldlocale
::tcltest::cleanupTests
return
| > > > | 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/opt.test.
1 2 3 4 5 6 7 8 9 10 11 12 13 | # 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. # | | | 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.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 |
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} {
| | > | > | | 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] \
[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 |
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}
| < < < < < < < < < < < | 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.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/pkgMkIndex.test.
1 2 3 4 5 6 7 8 9 10 | # 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. # | | | 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.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 |
set dirPath [lindex $parsed 1]
set patternList [lindex $parsed 2]
file mkdir $dirPath
if {[catch {
file delete [file join $dirPath pkgIndex.tcl]
| | | 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 [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 |
} {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}}}}}}}
# cleanup
namespace delete pkgtest
cd $origDir
::tcltest::cleanupTests
return
| > > > > > > > > > > > > > > > > > > > > | 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 | # 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. # | | | 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.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 |
# 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}
# cleanup
::tcltest::cleanupTests
return
| > > > > > > > > < < < < < < < < < < < < < < | 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/scan.test.
1 2 3 4 5 6 7 8 9 10 11 12 13 | # 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. # | | | 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.2.1 2001/04/03 22:54:38 hobbs Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
test scan-1.1 {BuildCharSet, CharInSet} {
|
| ︙ | ︙ | |||
319 320 321 322 323 324 325 326 327 328 329 330 331 332 |
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}
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 {}
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 |
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 |
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
| < < < < < < < < < < < < < < | 655 656 657 658 659 660 661 |
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 | # 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. | | | | 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-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.2.1 2000/07/27 01:39:21 hobbs 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 |
# using the remote server are not performed.
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
| | > | 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 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 |
set sock ""
set s2 [socket 127.0.0.1 2400]
vwait sock
puts $s2 one
flush $s2
after 500
fconfigure $sock -blocking 0
| | | | | | 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 a:[gets $sock]
lappend result b:[gets $sock]
fconfigure $sock -blocking 1
puts $s2 two
flush $s2
fconfigure $sock -blocking 0
lappend result c:[gets $sock]
fconfigure $sock -blocking 1
close $s2
close $s
close $sock
set result
} {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]
|
| ︙ | ︙ | |||
1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 |
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]} {
| > | 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 |
sendCommand {
set socket10_14_test_server [socket -server accept 2836]
proc accept {s a p} {
after 100 close $s
}
}
set c [socket $remoteServerIP 2836]
| | > | 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 [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 |
set timer [after 10000 "set done timed_out"]
vwait done
after cancel $timer
sendCommand {close $l}
set count
} 65566
| | < | < | | 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} {socket exec} {
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 tclsh $::tcltest::tcltest]
puts $f {
set f [socket -server accept 2828]
proc accept { file addr port } {
close $file
}
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 |
set x {server socket was inherited}
}
removeFile script1
removeFile script2
set x
} {server socket was not inherited}
| | < | | < < | 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} {socket exec} {
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 tclsh $::tcltest::tcltest]
puts $f {
set f [socket 127.0.0.1 2829]
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 |
if {!$failed} {
vwait failed
}
removeFile script1
removeFile script2
set x
} {client socket was not inherited}
| | < | | | | | < | 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} {socket exec} {
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 tclsh $::tcltest::tcltest]
puts $f {
set server [socket -server accept 2931]
proc accept { file host port } {
global tclsh
puts $file {test data on socket}
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 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 |
flush $commandSocket
}
catch {close $commandSocket}
catch {close $remoteProcChan}
::tcltest::cleanupTests
flush stdout
return
| < < < < < < < < < < < | 1634 1635 1636 1637 1638 1639 1640 |
flush $commandSocket
}
catch {close $commandSocket}
catch {close $remoteProcChan}
::tcltest::cleanupTests
flush stdout
return
|
Changes to tests/stack.test.
1 2 3 4 5 6 | # 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. # | | | > > > > > > > > > > > > > > > > > > > > | | 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 |
# 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-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.2.1 2001/04/03 22:54:38 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} {minStack2400} {
proc recurse {} { return [recurse] }
catch {recurse} rv
rename recurse {}
set rv
} {too many nested calls to Tcl_EvalObj (infinite loop?)}
# cleanup
|
| ︙ | ︙ |
Changes to tests/string.test.
1 2 3 4 5 6 7 8 9 10 11 12 13 | # 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. # | | | 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.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 |
} 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)}}
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
| > > > > > > | 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 |
} 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-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"}}
| > > > > > > > > > | 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 |
} 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-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"}}
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 |
} {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-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?"}}
| > > > > > > > > > > > > > > > > > > > > > > | 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 |
test string-22.13 {string wordstart, unicode} {
string wordstart "\uc700\uc700 abc" 8
} 3
# cleanup
::tcltest::cleanupTests
return
| < < < < < < | 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 | # # 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. # | | | 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.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 |
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]
| | > > > > > | | > > > | | > > > > > > > | | 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]
} [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]
} [list none "bc\u00EF\u00EFde" string string]
test stringObj-10.3 {Tcl_GetRange with some mixed width chars} {
# 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]
} [list string "bc\u00EF\u00EFde" string string]
test stringObj-10.4 {Tcl_GetRange with some mixed width chars} {
# 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 \
{}]
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 |
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} {
| | > > > | > > > | 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 "○○"
# 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®"
# 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 | # 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. | | | | 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-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.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 |
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}
| > > > > > > > > > > > | | > > | | | | | | | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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}
} {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/unixInit.test.
1 2 3 4 5 6 7 8 9 10 11 12 | # 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. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# 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.2.1 2001/04/03 22:54:38 hobbs Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
if {[info exists env(TCL_LIBRARY)]} {
|
| ︙ | ︙ | |||
146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
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-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]
| > > > > > > > > > > > > > > > > > > | 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 |
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} {
file delete -force /tmp/sparkly
file delete -force /tmp/lib
file mkdir /tmp/sparkly
file copy $::tcltest::tcltest /tmp/sparkly/tcltest
file mkdir /tmp/lib/tcl[info tclversion]
close [open /tmp/lib/tcl[info tclversion]/init.tcl w]
set allAbsolute 1
foreach dir [getlibpath /tmp/sparkly/tcltest] {
set allAbsolute [expr {$allAbsolute \
&& [string equal absolute [file pathtype $dir]]}]
}
file delete -force /tmp/sparkly
file delete -force /tmp/lib
set allAbsolute
} 1
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]
|
| ︙ | ︙ |
Changes to tests/util.test.
1 2 3 4 5 6 7 8 9 | # 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. # | | | 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.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 |
} {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-5.1 {Tcl_StringMatch} {
string match ab*c abc
} 1
test util-5.2 {Tcl_StringMatch} {
string match ab**c abc
} 1
| > > > > | 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
|
| ︙ | ︙ |
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/man2help.tcl.
1 2 3 4 5 6 7 8 | # 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. # | | | 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.2.1 2001/04/03 22:54:38 hobbs Exp $
#
#
# PASS 1
#
proc generateContents {basename version files} {
|
| ︙ | ︙ | |||
94 95 96 97 98 99 100 |
# that directory.
#
# Arguments:
# dir - Name of the directory.
proc doDir dir {
puts "Generating man pages for $dir..."
| | | | 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 -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 -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 |
# Given a directory as argument, translate all the man pages in
# that directory.
#
# Arguments:
# dir - Name of the directory.
proc doDir dir {
| | | 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 -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.wse.in.
| ︙ | ︙ | |||
8 9 10 11 12 13 14 | 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 | | | 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.3 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 | end item: Set Variable Variable=APPTITLE Value=Tcl/Tk %PATCHLEVEL% for Windows end item: Set Variable Variable=URL | | | 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://tcl.activestate.com/ 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 |
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\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: End Block
end
item: If/While Statement
Variable=COMPONENTS
Value=A
Flags=00001010
end
item: Install File
| > > > > > > > > > > | | | | | 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\msgcat\pkgIndex.tcl
Destination=%MAINDIR%\lib\tcl%VER%\msgcat1.1\pkgIndex.tcl
Flags=0000000010000010
end
item: Install File
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 |
end
item: Install File
Source=${__TCLBASEDIR__}\library\encoding\big5.enc
Destination=%MAINDIR%\lib\tcl%VER%\encoding\big5.enc
Flags=0000000000000010
end
item: Install File
| | | | | | 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 |
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\opt\pkgIndex.tcl
Destination=%MAINDIR%\lib\tcl%VER%\opt0.4\pkgIndex.tcl
Flags=0000000000000010
end
item: Install File
Source=${__TCLBASEDIR__}\library\opt\optparse.tcl
Destination=%MAINDIR%\lib\tcl%VER%\opt0.4\optparse.tcl
Flags=0000000000000010
end
item: Install File
Source=${__TCLBASEDIR__}\library\http\pkgIndex.tcl
Destination=%MAINDIR%\lib\tcl%VER%\http2.3\pkgIndex.tcl
Flags=0000000000000010
end
item: Install File
Source=${__TCLBASEDIR__}\library\http\http.tcl
Destination=%MAINDIR%\lib\tcl%VER%\http2.3\http.tcl
Flags=0000000000000010
end
item: Install File
Source=${__TKBASEDIR__}\library\msgbox.tcl
Destination=%MAINDIR%\lib\tk%VER%\msgbox.tcl
Flags=0000000000000010
|
| ︙ | ︙ | |||
2024 2025 2026 2027 2028 2029 2030 | end item: Set Variable Variable=MAINDIR Value=%MAINDIR% Flags=00010100 end item: Include Script | | | 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=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 | end item: Add Directory to Path Directory=%MAINDIR%\bin end item: Check Configuration Flags=10111011 end | < < < < < < < < < | 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: 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 |
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
| < < < < < < < < < < < < < < < < < < < < < < < < | 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
end
end
item: End Block
end
item: Check Configuration
Flags=10111011
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 unix/Makefile.in.
1 2 3 4 5 6 7 | # # 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. # | | | 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.2.4 2001/04/03 23:00:17 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 |
| ︙ | ︙ | |||
262 263 264 265 266 267 268 | 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 \ | | | | 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 |
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 \
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 | $(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)/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 \ | > | 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 | $(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 \ |
| ︙ | ︙ | |||
430 431 432 433 434 435 436 |
${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} \
@TCL_LD_SEARCH_FLAGS@ -o tcltest
| < > > > | | 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 |
${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} \
@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 $(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; \
|
| ︙ | ︙ | |||
469 470 471 472 473 474 475 | # 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' \ | | | 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 | # 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.2.4 2001/04/03 23:00:17 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 |
| ︙ | ︙ | |||
545 546 547 548 549 550 551 | if [ ! -d $$i ] ; then \ echo "Making directory $$i"; \ mkdir -p $$i; \ chmod 755 $$i; \ else true; \ fi; \ done; | | | > > | > > | > > > > > | | | | > > > > > > > > > | 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 | 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.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 \ $(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 j in $(TOP_DIR)/library/http1.0/*.tcl ; \ do \ $(INSTALL_DATA) $$j $(SCRIPT_INSTALL_DIR)/http1.0; \ done; @echo "Installing library http2.3 directory"; @for j in $(TOP_DIR)/library/http/*.tcl ; \ do \ $(INSTALL_DATA) $$j $(SCRIPT_INSTALL_DIR)/http2.3; \ 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 | 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) | < < < | 661 662 663 664 665 666 667 668 669 670 671 672 673 674 | 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) # 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 | 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 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 | > > > | 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 | 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 |
| ︙ | ︙ | |||
1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 | 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 # # 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 | > > > > > > | < | < | > < < < < | | 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 | 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 mklinks rm -rf $(DISTDIR) mkdir -p $(DISTDIR)/unix cp -p $(UNIX_DIR)/*.c $(UNIX_DIR)/*.h $(DISTDIR)/unix 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)/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 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 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 | $(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 | | < | > > | | | < | < | | < | < | | 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 | $(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 $(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/*.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 \ $(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 $(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 $(TOP_DIR)/tools/README \ $(TOP_DIR)/tools/configure $(TOP_DIR)/tools/configure.in \ $(TOP_DIR)/tools/*.tcl $(TOP_DIR)/tools/man2tcl.c \ $(TOP_DIR)/tools/tcl.wse.in $(TOP_DIR)/tools/*.bmp \ $(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.
| ︙ | ︙ | |||
18 19 20 21 22 23 24 | 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. | | | 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | 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.2.1 2001/04/03 22:08:33 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 | 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 | | | 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | 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://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 |
#! /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
# RCS: @(#) $Id: configure.in,v 1.57.2.2 2001/04/03 22:54:39 hobbs Exp $
TCL_VERSION=8.3
TCL_MAJOR_VERSION=8
TCL_MINOR_VERSION=3
TCL_PATCH_LEVEL=".3"
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
TCL_SRC_DIR=`cd $srcdir/..; pwd`
#------------------------------------------------------------------------
# Standard compiler checks
#------------------------------------------------------------------------
# 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:566: 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:607: 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:637: 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:688: 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:720: 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 731 "configure"
#include "confdefs.h"
main(){return(0);}
EOF
if { (eval echo configure:736: \"$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:762: 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:767: 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:776: \"$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:795: 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
echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
echo "configure:831: 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 846 "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:852: \"$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 863 "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:869: \"$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 880 "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:886: \"$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:914: 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 919 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:924: \"$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:957: 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:983: 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 991 "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:1002: \"$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:1030: 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 1038 "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:1049: \"$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:1077: 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 1085 "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:1096: \"$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:1122: 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 1130 "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:1141: \"$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:1175: 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 1180 "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:1203: \"$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:1241: checking if the compiler understands -pipe" >&5
OLDCC="$CC"
CC="$CC -pipe"
cat > conftest.$ac_ext <<EOF
#line 1245 "configure"
#include "confdefs.h"
int main() {
; return 0; }
EOF
if { (eval echo configure:1252: \"$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:1275: 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 1280 "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:1303: \"$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:1337: 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 1342 "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:1365: \"$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:1395: 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 1400 "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:1423: \"$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:1450: 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 1455 "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:1478: \"$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:1502: 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 1507 "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:1530: \"$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:1554: 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 1559 "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:1582: \"$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:1606: 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 1611 "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:1634: \"$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:1658: 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 1663 "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:1686: \"$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:1722: checking dirent.h" >&5
cat > conftest.$ac_ext <<EOF
#line 1724 "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:1750: \"$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:1771: 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 1776 "configure"
#include "confdefs.h"
#include <errno.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1781: \"$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:1808: 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 1813 "configure"
#include "confdefs.h"
#include <float.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1818: \"$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:1845: 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 1850 "configure"
#include "confdefs.h"
#include <values.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1855: \"$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:1882: 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 1887 "configure"
#include "confdefs.h"
#include <limits.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1892: \"$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:1919: 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 1924 "configure"
#include "confdefs.h"
#include <stdlib.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1929: \"$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 1952 "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 1966 "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 1980 "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:2001: 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 2006 "configure"
#include "confdefs.h"
#include <string.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:2011: \"$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 2034 "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 2048 "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:2074: 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 2079 "configure"
#include "confdefs.h"
#include <sys/wait.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:2084: \"$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:2111: 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 2116 "configure"
#include "confdefs.h"
#include <dlfcn.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:2121: \"$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:2153: 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 2158 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:2163: \"$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:2200: checking termios vs. termio vs. sgtty" >&5
if test "$cross_compiling" = yes; then
tk_ok=no
else
cat > conftest.$ac_ext <<EOF
#line 2206 "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:2222: \"$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 2245 "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:2260: \"$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 2283 "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:2299: \"$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 2322 "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:2340: \"$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 2363 "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:2380: \"$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 2403 "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:2421: \"$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:2459: checking fd_set and sys/select" >&5
cat > conftest.$ac_ext <<EOF
#line 2461 "configure"
#include "confdefs.h"
#include <sys/types.h>
int main() {
fd_set readMask, writeMask;
; return 0; }
EOF
if { (eval echo configure:2468: \"$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 2480 "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:2511: 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 2516 "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:2524: \"$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:2549: 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 2554 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:2559: \"$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:2586: 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 2591 "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:2600: \"$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:2621: 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 2626 "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:2634: \"$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:2654: 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 2659 "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:2669: \"$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
echo $ac_n "checking tm_tzadj in struct tm""... $ac_c" 1>&6
echo "configure:2692: checking tm_tzadj in struct tm" >&5
cat > conftest.$ac_ext <<EOF
#line 2694 "configure"
#include "confdefs.h"
#include <time.h>
int main() {
struct tm tm; tm.tm_tzadj;
; return 0; }
EOF
if { (eval echo configure:2701: \"$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:2717: checking tm_gmtoff in struct tm" >&5
cat > conftest.$ac_ext <<EOF
#line 2719 "configure"
#include "confdefs.h"
#include <time.h>
int main() {
struct tm tm; tm.tm_gmtoff;
; return 0; }
EOF
if { (eval echo configure:2726: \"$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:2747: checking long timezone variable" >&5
cat > conftest.$ac_ext <<EOF
#line 2749 "configure"
#include "confdefs.h"
#include <time.h>
int main() {
extern long timezone;
timezone += 1;
exit (0);
; return 0; }
EOF
if { (eval echo configure:2758: \"$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:2779: checking time_t timezone variable" >&5
cat > conftest.$ac_ext <<EOF
#line 2781 "configure"
#include "confdefs.h"
#include <time.h>
int main() {
extern time_t timezone;
timezone += 1;
exit (0);
; return 0; }
EOF
if { (eval echo configure:2790: \"$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:2813: 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 2818 "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:2826: \"$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:2847: 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 2852 "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:2875: \"$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:2904: 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 2912 "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:2922: \"$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:2946: 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 2951 "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:2974: \"$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:3007: checking proper strstr implementation" >&5
if test "$cross_compiling" = yes; then
tcl_ok=no
else
cat > conftest.$ac_ext <<EOF
#line 3012 "configure"
#include "confdefs.h"
extern int strstr();
int main()
{
exit(strstr("\0test", "test") ? 1 : 0);
}
EOF
if { (eval echo configure:3022: \"$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:3048: 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 3053 "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:3076: \"$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 3100 "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:3116: \"$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:3139: 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 3144 "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:3167: \"$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 3191 "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:3207: \"$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:3233: 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 3238 "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:3261: \"$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:3283: checking for Solaris2.4/Tru64 strtod bugs" >&5
if test "$cross_compiling" = yes; then
tcl_ok=0
else
cat > conftest.$ac_ext <<EOF
#line 3288 "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:3308: \"$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:3339: 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 3344 "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:3352: \"$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 3369 "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 3387 "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 3408 "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:3419: \"$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:3443: 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 3448 "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:3476: 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 3481 "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:3509: 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 3514 "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:3542: 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 3547 "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:3584: 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 3589 "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:3612: \"$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:3645: checking union wait" >&5
cat > conftest.$ac_ext <<EOF
#line 3647 "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:3659: \"$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:3683: checking matherr support" >&5
cat > conftest.$ac_ext <<EOF
#line 3685 "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:3696: \"$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:3721: 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 3726 "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:3749: \"$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:3771: 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 3779 "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:3790: \"$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:3814: 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 3822 "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:3833: \"$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:3871: 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 3876 "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:3899: \"$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:3921: 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 3926 "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:3949: \"$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:3976: checking for gettimeofday declaration" >&5
cat > conftest.$ac_ext <<EOF
#line 3978 "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:4006: 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 4013 "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 4035 "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:4045: \"$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:4069: checking signed char declarations" >&5
cat > conftest.$ac_ext <<EOF
#line 4071 "configure"
#include "confdefs.h"
int main() {
signed char *p;
p = 0;
; return 0; }
EOF
if { (eval echo configure:4081: \"$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:4112: 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 4117 "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:4140: \"$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:4161: 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 4169 "configure"
#include "confdefs.h"
int main() {
main()
; return 0; }
EOF
if { (eval echo configure:4176: \"$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:4203: 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 4211 "configure"
#include "confdefs.h"
int main() {
main()
; return 0; }
EOF
if { (eval echo configure:4218: \"$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:4240: 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 4245 "configure"
#include "confdefs.h"
#include <net/errno.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:4250: \"$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:4295: 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 4300 "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:4323: \"$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:4345: 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 4350 "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:4373: \"$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:4391: 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 4399 "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:4410: \"$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:4438: 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 4443 "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:4466: \"$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:4488: 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 4493 "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:4516: \"$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:4534: 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 4542 "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:4553: \"$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:4599: 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:4619: 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:4643: 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
echo $ac_n "checking if gcc is being used""... $ac_c" 1>&6
echo "configure:4666: checking if gcc is being used" >&5
if test "$CC" = "gcc" -o `$CC -v 2>&1 | grep -c gcc` != "0" ; then
using_gcc="yes"
else
using_gcc="no"
fi
echo "$ac_t""$using_gcc ($CC)" 1>&6
# 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:4679: 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 4687 "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:4698: \"$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
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
CFLAGS_WARNING="-Wall -Wconversion -Wno-implicit-int"
else
CFLAGS_WARNING=""
fi
TCL_NEEDS_EXP_FILE=0
TCL_BUILD_EXP_FILE=""
TCL_EXP_FILE=""
STLIB_LD="ar cr"
case $system in
AIX-5.*)
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
CC=${CC}_r
fi
echo "$ac_t""Using $CC for compiling with threads" 1>&6
fi
# 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 "$using_gcc" = "yes" ; then
LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
else
LD_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}'
fi
if test "$do64bit" = "yes" ; then
if test "$using_gcc" = "no" ; then
do64bit_ok=yes
EXTRA_CFLAGS="-q64"
LDFLAGS="-q64"
else
echo "configure: warning: "64bit mode not supported with GCC on $system"" 1>&2
fi
fi
;;
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
CC=${CC}_r
fi
echo "$ac_t""Using $CC for compiling with threads" 1>&6
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"
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:4817: 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 4825 "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:4836: \"$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
;;
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-*.08.*|HP-UX-*.09.*|HP-UX-*.10.*|HP-UX-*.11.*)
SHLIB_SUFFIX=".sl"
echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6
echo "configure:4898: 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 4906 "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:4917: \"$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 "$using_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_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:5024: 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 5029 "configure"
#include "confdefs.h"
#include <dld.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:5034: \"$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
;;
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:5079: 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 5084 "configure"
#include "confdefs.h"
#include <dld.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:5089: \"$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:5144: 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 5149 "configure"
#include "confdefs.h"
#include <dlfcn.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:5154: \"$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:5181: checking for ELF" >&5
cat > conftest.$ac_ext <<EOF
#line 5183 "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=""
SHLIB_SUFFIX=".so"
DL_OBJS="tclLoadDl.o"
DL_LIBS=""
LDFLAGS="-export-dynamic"
LD_SEARCH_FLAGS=""
;;
Rhapsody-*|Darwin-*)
SHLIB_CFLAGS="-fno-common"
SHLIB_LD="cc -dynamiclib \${LDFLAGS} -compatibility_version ${TCL_MAJOR_VERSION} -current_version \${VERSION} -install_name \${LIB_RUNTIME_DIR}/\${TCL_LIB_FILE}"
SHLIB_LD_LIBS=""
SHLIB_SUFFIX=".dylib"
DL_OBJS="tclLoadDyld.o"
DL_LIBS=""
LDFLAGS=""
LD_SEARCH_FLAGS=""
CFLAGS_OPTIMIZE="-O3"
;;
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 "$using_gcc" = "no" ; 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"
if test "$using_gcc" = "no" ; then
EXTRA_CFLAGS="${EXTRA_CFLAGS} -pthread"
LDFLAGS="-pthread"
else
LIBS=`echo $LIBS | sed s/-lpthreads//`
LIBS="$LIBS -lpthread -lmach -lexc"
fi
fi
;;
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
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]*)
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=""
LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
;;
SunOS-5*)
SHLIB_CFLAGS="-KPIC"
SHLIB_LD="/usr/ccs/bin/ld -G -z text"
LDFLAGS=""
if test "$do64bit" = "yes" ; then
arch=`isainfo`
if test "$arch" = "sparcv9 sparc" ; then
if test "$using_gcc" = "no" ; then
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
echo "configure: warning: "64bit mode not supported with GCC on $system"" 1>&2
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 "$using_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
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:5447: checking for ld accepts -Bexport flag" >&5
LDFLAGS="${LDFLAGS} -Wl,-Bexport"
cat > conftest.$ac_ext <<EOF
#line 5450 "configure"
#include "confdefs.h"
int main() {
int i;
; return 0; }
EOF
if { (eval echo configure:5457: \"$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:5503: checking sys/exec.h" >&5
cat > conftest.$ac_ext <<EOF
#line 5505 "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:5523: \"$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:5541: checking a.out.h" >&5
cat > conftest.$ac_ext <<EOF
#line 5543 "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:5561: \"$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:5579: checking sys/exec_aout.h" >&5
cat > conftest.$ac_ext <<EOF
#line 5581 "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:5599: \"$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 "$using_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:5696: 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=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}
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.
#--------------------------------------------------------------------
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:5733: 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 5738 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:5743: \"$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:5773: 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 5778 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:5783: \"$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:5810: 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:5872: 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
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}"
else
MAKE_LIB="\${SHLIB_LD} -o \${TCL_LIB_FILE} \${OBJS} ${SHLIB_LD_LIBS}"
RANLIB=":"
fi
else
case $system in
BSD/OS*)
;;
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}"
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${exec_prefix}/lib ${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
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`"
else
TCL_BUILD_LIB_SPEC="-bI:`pwd`/${TCL_BUILD_EXP_FILE}"
TCL_LIB_SPEC="-bI:${exec_prefix}/lib/${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"
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}"
# Replace DBGX with TCL_DBGX
eval "STUB_LIB_FILE=\"${STUB_LIB_FILE}\""
MAKE_STUB_LIB="ar cr \${STUB_LIB_FILE} \${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_BUILD_STUB_LIB_PATH="`pwd`/${TCL_STUB_LIB_FILE}"
TCL_STUB_LIB_PATH="${exec_prefix}/lib/${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%@LIBOBJS@%$LIBOBJS%g
s%@TCL_LIBS@%$TCL_LIBS%g
s%@MATH_LIBS@%$MATH_LIBS%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%@STUB_LIB_FILE@%$STUB_LIB_FILE%g
s%@TCL_STUB_LIB_FILE@%$TCL_STUB_LIB_FILE%g
s%@TCL_STUB_LIB_FLAG@%$TCL_STUB_LIB_FLAG%g
s%@TCL_BUILD_STUB_LIB_SPEC@%$TCL_BUILD_STUB_LIB_SPEC%g
s%@TCL_STUB_LIB_SPEC@%$TCL_STUB_LIB_SPEC%g
s%@TCL_BUILD_STUB_LIB_PATH@%$TCL_BUILD_STUB_LIB_PATH%g
s%@TCL_STUB_LIB_PATH@%$TCL_STUB_LIB_PATH%g
s%@MAKE_STUB_LIB@%$MAKE_STUB_LIB%g
s%@BUILD_DLTEST@%$BUILD_DLTEST%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%@TCL_DBGX@%$TCL_DBGX%g
s%@DL_OBJS@%$DL_OBJS%g
s%@EXTRA_CFLAGS@%$EXTRA_CFLAGS%g
s%@MAKE_LIB@%$MAKE_LIB%g
s%@TCL_SHARED_BUILD@%$TCL_SHARED_BUILD%g
s%@SHLIB_CFLAGS@%$SHLIB_CFLAGS%g
s%@SHLIB_LD@%$SHLIB_LD%g
s%@STLIB_LD@%$STLIB_LD%g
s%@SHLIB_LD_LIBS@%$SHLIB_LD_LIBS%g
s%@SHLIB_SUFFIX@%$SHLIB_SUFFIX%g
s%@TCL_BUILD_LIB_SPEC@%$TCL_BUILD_LIB_SPEC%g
s%@TCL_LD_SEARCH_FLAGS@%$TCL_LD_SEARCH_FLAGS%g
s%@TCL_LDFLAGS_DEBUG@%$TCL_LDFLAGS_DEBUG%g
s%@TCL_LDFLAGS_OPTIMIZE@%$TCL_LDFLAGS_OPTIMIZE%g
s%@TCL_LIB_FILE@%$TCL_LIB_FILE%g
s%@TCL_LIB_FLAG@%$TCL_LIB_FLAG%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_SPEC@%$TCL_LIB_SPEC%g
s%@TCL_LIB_VERSIONS_OK@%$TCL_LIB_VERSIONS_OK%g
s%@TCL_MAJOR_VERSION@%$TCL_MAJOR_VERSION%g
s%@TCL_MINOR_VERSION@%$TCL_MINOR_VERSION%g
s%@TCL_PACKAGE_PATH@%$TCL_PACKAGE_PATH%g
s%@TCL_PATCH_LEVEL@%$TCL_PATCH_LEVEL%g
s%@TCL_SHARED_LIB_SUFFIX@%$TCL_SHARED_LIB_SUFFIX%g
s%@TCL_SHLIB_CFLAGS@%$TCL_SHLIB_CFLAGS%g
s%@TCL_SRC_DIR@%$TCL_SRC_DIR%g
s%@TCL_BIN_DIR@%$TCL_BIN_DIR%g
s%@TCL_UNSHARED_LIB_SUFFIX@%$TCL_UNSHARED_LIB_SUFFIX%g
s%@TCL_VERSION@%$TCL_VERSION%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 | #! /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. AC_INIT(../generic/tcl.h) | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#! /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.
AC_INIT(../generic/tcl.h)
# RCS: @(#) $Id: configure.in,v 1.57.2.2 2001/04/03 22:54:39 hobbs Exp $
TCL_VERSION=8.3
TCL_MAJOR_VERSION=8
TCL_MINOR_VERSION=3
TCL_PATCH_LEVEL=".3"
VERSION=${TCL_VERSION}
#------------------------------------------------------------------------
# Handle the --prefix=... option
#------------------------------------------------------------------------
if test "${prefix}" = "NONE"; then
|
| ︙ | ︙ | |||
56 57 58 59 60 61 62 | #-------------------------------------------------------------------- # 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. | | | | | | | < < < < < < < < < < < < < < < < < < < < < < < < < | 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 | #-------------------------------------------------------------------- # 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)]) # 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)]) #-------------------------------------------------------------------- # 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 | 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 | | | | 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 |
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)])
#--------------------------------------------------------------------
# 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)])
#--------------------------------------------------------------------
# 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 | #-------------------------------------------------------------------- # 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. #-------------------------------------------------------------------- | | | 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 | #-------------------------------------------------------------------- # 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)]) #-------------------------------------------------------------------- # 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 | # 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. #-------------------------------------------------------------------- | | > | > < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 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 |
# 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_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)
])
#--------------------------------------------------------------------
# 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
#--------------------------------------------------------------------
# Look for libraries that we will need when compiling the Tcl shell
#--------------------------------------------------------------------
SC_TCL_LINK_LIBS
# Add the threads support libraries
|
| ︙ | ︙ | |||
444 445 446 447 448 449 450 |
RANLIB=":"
fi
else
case $system in
BSD/OS*)
;;
| | | 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 |
RANLIB=":"
fi
else
case $system in
BSD/OS*)
;;
AIX-[[1-4]].*)
;;
*)
SHLIB_LD_LIBS=""
;;
esac
TCL_SHLIB_CFLAGS=""
|
| ︙ | ︙ |
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 | -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; *) if [ x"$src" = x ] then src=$1 else | > > > > > | 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.
| ︙ | ︙ | |||
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
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_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_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
| > > | 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
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 |
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
ln ChnlStack.3 Tcl_StackChannel.3
ln ChnlStack.3 Tcl_UnstackChannel.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
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
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
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 |
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
|
| ︙ | ︙ | |||
261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 |
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
ln DetachPids.3 Tcl_DetachPids.3
ln DetachPids.3 Tcl_ReapDetachedProcs.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
| > > | 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 |
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 |
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
| < > > < > > | 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 |
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_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_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 |
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
ln GetIndex.3 Tcl_GetIndexFromObj.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
| > > | 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 |
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 |
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
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
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
| > > | 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 |
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 |
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
| | > | > | 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 |
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_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_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 |
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
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
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
| > > | 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 |
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 |
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
ln SplitList.3 Tcl_SplitList.3
ln SplitList.3 Tcl_Merge.3
ln SplitList.3 Tcl_ScanElement.3
ln SplitList.3 Tcl_ConvertElement.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
| > > > > | 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 |
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
|
| ︙ | ︙ | |||
822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 |
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
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
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
| > > | 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 |
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
|
| ︙ | ︙ |
Changes to unix/tcl.m4.
| ︙ | ︙ | |||
343 344 345 346 347 348 349 350 351 352 353 354 355 356 |
#
# Sets the following vars:
# THREADS_LIBS Thread library(s)
#
# Defines the following vars:
# TCL_THREADS
# _REENTRANT
#
#------------------------------------------------------------------------
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])
| > | 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 |
#
# 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 |
# Does the pthread-implementation provide
# 'pthread_attr_setstacksize' ?
AC_CHECK_FUNCS(pthread_attr_setstacksize)
else
TCL_THREADS=0
| | | 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 |
# Does the pthread-implementation provide
# 'pthread_attr_setstacksize' ?
AC_CHECK_FUNCS(pthread_attr_setstacksize)
else
TCL_THREADS=0
AC_MSG_RESULT([no (default)])
fi
])
#------------------------------------------------------------------------
# SC_ENABLE_SYMBOLS --
#
# Specify if debugging symbols should be used
|
| ︙ | ︙ | |||
609 610 611 612 613 614 615 |
CFLAGS_WARNING=""
fi
TCL_NEEDS_EXP_FILE=0
TCL_BUILD_EXP_FILE=""
TCL_EXP_FILE=""
STLIB_LD="ar cr"
case $system in
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | < < | | < < < < < < < < < | | > | > > > > > > > > > > | | | > > > > | 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 |
CFLAGS_WARNING=""
fi
TCL_NEEDS_EXP_FILE=0
TCL_BUILD_EXP_FILE=""
TCL_EXP_FILE=""
STLIB_LD="ar cr"
case $system in
AIX-5.*)
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
CC=${CC}_r
fi
AC_MSG_RESULT(Using $CC for compiling with threads)
fi
# 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 "$using_gcc" = "yes" ; then
LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
else
LD_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}'
fi
if test "$do64bit" = "yes" ; then
if test "$using_gcc" = "no" ; then
do64bit_ok=yes
EXTRA_CFLAGS="-q64"
LDFLAGS="-q64"
else
AC_MSG_WARN("64bit mode not supported with GCC on $system")
fi
fi
;;
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
CC=${CC}_r
fi
AC_MSG_RESULT(Using $CC for compiling with threads)
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"
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.
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
;;
BSD/OS-2.1*|BSD/OS-3*)
SHLIB_CFLAGS=""
SHLIB_LD="shlicc -r"
SHLIB_LD_LIBS='${LIBS}'
SHLIB_SUFFIX=".so"
DL_OBJS="tclLoadDl.o"
|
| ︙ | ︙ | |||
702 703 704 705 706 707 708 |
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'
;;
| > > > > > > > > > > > | | 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 |
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}'
|
| ︙ | ︙ | |||
757 758 759 760 761 762 763 764 765 766 767 768 769 770 |
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
| > > > > > > > > > > > > > > > > > > > > > > > | 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 |
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
;;
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
|
| ︙ | ︙ | |||
836 837 838 839 840 841 842 843 844 845 846 847 848 849 | SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" DL_OBJS="tclLoadDl.o" DL_LIBS="" LDFLAGS="-export-dynamic" LD_SEARCH_FLAGS="" ;; NEXTSTEP-*) SHLIB_CFLAGS="" SHLIB_LD="cc -nostdlib -r" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" DL_OBJS="tclLoadNext.o" DL_LIBS="" | > > > > > > > > > > > | 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 |
SHLIB_LD_LIBS=""
SHLIB_SUFFIX=".so"
DL_OBJS="tclLoadDl.o"
DL_LIBS=""
LDFLAGS="-export-dynamic"
LD_SEARCH_FLAGS=""
;;
Rhapsody-*|Darwin-*)
SHLIB_CFLAGS="-fno-common"
SHLIB_LD="cc -dynamiclib \${LDFLAGS} -compatibility_version ${TCL_MAJOR_VERSION} -current_version \${VERSION} -install_name \${LIB_RUNTIME_DIR}/\${TCL_LIB_FILE}"
SHLIB_LD_LIBS=""
SHLIB_SUFFIX=".dylib"
DL_OBJS="tclLoadDyld.o"
DL_LIBS=""
LDFLAGS=""
LD_SEARCH_FLAGS=""
CFLAGS_OPTIMIZE="-O3"
;;
NEXTSTEP-*)
SHLIB_CFLAGS=""
SHLIB_LD="cc -nostdlib -r"
SHLIB_LD_LIBS=""
SHLIB_SUFFIX=".so"
DL_OBJS="tclLoadNext.o"
DL_LIBS=""
|
| ︙ | ︙ | |||
975 976 977 978 979 980 981 |
LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
;;
SunOS-5*)
SHLIB_CFLAGS="-KPIC"
SHLIB_LD="/usr/ccs/bin/ld -G -z text"
LDFLAGS=""
| < | 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 |
LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
;;
SunOS-5*)
SHLIB_CFLAGS="-KPIC"
SHLIB_LD="/usr/ccs/bin/ld -G -z text"
LDFLAGS=""
if test "$do64bit" = "yes" ; then
arch=`isainfo`
if test "$arch" = "sparcv9 sparc" ; then
if test "$using_gcc" = "no" ; then
do64bit_ok=yes
if test "$do64bitVIS" = "yes" ; then
EXTRA_CFLAGS="-xarch=v9a"
|
| ︙ | ︙ | |||
1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 | ;; BSD/OS*) ;; IRIX*) ;; NetBSD-*|FreeBSD-*|OpenBSD-*) ;; RISCos-*) ;; SCO_SV-3.2*) ;; ULTRIX-4.*) ;; *) | > > | 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 | ;; 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 |
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)
fi
fi
fi
AC_MSG_RESULT($tk_ok)
])
#--------------------------------------------------------------------
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 |
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 |
], tcl_ok=yes, tcl_ok=no)
if test $tcl_ok = no; then
AC_DEFINE(NO_DIRENT_H)
fi
AC_MSG_RESULT($tcl_ok)
| | | | | | | | 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 |
], 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(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)])
# OS/390 lacks sys/param.h (and doesn't need it, by chance).
AC_HAVE_HEADERS(unistd.h sys/param.h)
])
|
| ︙ | ︙ | |||
1576 1577 1578 1579 1580 1581 1582 |
timezone += 1;
exit (0);],
[AC_DEFINE(HAVE_TIMEZONE_VAR)
AC_MSG_RESULT(yes)],
AC_MSG_RESULT(no))
fi
| < < < < < < < < < < < < < | 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 |
timezone += 1;
exit (0);],
[AC_DEFINE(HAVE_TIMEZONE_VAR)
AC_MSG_RESULT(yes)],
AC_MSG_RESULT(no))
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 |
# 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"])
| < < < < < < < < < < < < < < < < < | | 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 |
# 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"])
#--------------------------------------------------------------------
# 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)])
#--------------------------------------------------------------------
# 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 |
# 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
| | | | | | 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 |
# 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)])
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"])])
# 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 |
# $Id: tcl.spec,v 1.4.2.3 2001/04/05 20:34:11 hobbs Exp $
# This file is the basis for a binary Tcl RPM for Linux.
%define version 8.3.3
%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://tcl.activestate.com/
Packager: ActiveState Tool 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 | # 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. # | | | 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.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 | # 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@' | | | 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 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/tclLoadDyld.c.
| ︙ | ︙ | |||
8 9 10 11 12 13 14 | * 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. * | | > > > > > | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | * 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.2.1 2001/04/06 18:42:39 hobbs Exp $ */ #include "tclInt.h" #include <mach-o/dyld.h> /* For compatibility with older API. */ #ifndef NSLINKMODULE_OPTION_PRIVATE #define NSLINKMODULE_OPTION_PRIVATE TRUE #endif /* *---------------------------------------------------------------------- * * TclpLoadFile -- * * Dynamically loads a binary code file into memory and returns |
| ︙ | ︙ | |||
83 84 85 86 87 88 89 |
default:
Tcl_SetResult(interp, "dyld: unknown failure", TCL_STATIC);
break;
}
return TCL_ERROR;
}
| | > > > > > > > > | 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 |
default:
Tcl_SetResult(interp, "dyld: unknown failure", TCL_STATIC);
break;
}
return TCL_ERROR;
}
module = NSLinkModule(image, fileName, NSLINKMODULE_OPTION_PRIVATE);
if (module == NULL) {
Tcl_SetResult(interp, "dyld: falied to link module", TCL_STATIC);
return TCL_ERROR;
}
name = (char*)malloc(sizeof(char)*(strlen(sym1)+2));
sprintf(name, "_%s", sym1);
#ifdef NSLINKMODULE_OPTION_PRIVATE
symbol = NSLookupSymbolInModule(module, name);
#else
symbol = NSLookupAndBindSymbol(name);
#endif
free(name);
*proc1Ptr = NSAddressOfSymbol(symbol);
name = (char*)malloc(sizeof(char)*(strlen(sym2)+2));
sprintf(name, "_%s", sym2);
#ifdef NSLINKMODULE_OPTION_PRIVATE
symbol = NSLookupSymbolInModule(module, name);
#else
symbol = NSLookupAndBindSymbol(name);
#endif
free(name);
*proc2Ptr = NSAddressOfSymbol(symbol);
*clientDataPtr = module;
return TCL_OK;
}
|
| ︙ | ︙ |
Changes to unix/tclMtherr.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * 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. * | | | 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.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 |
*
* Side effects:
* Sets errno based on what's in xPtr.
*
*----------------------------------------------------------------------
*/
int
matherr(xPtr)
struct exception *xPtr; /* Describes error that occurred. */
{
if (TclMathInProgress()) {
return 0;
}
| > > > | 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 | /* * 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. * | | | 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.2.1 2001/04/03 22:54:39 hobbs 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 |
int *errorCodePtr));
/*
* This structure describes the channel type structure for file based IO:
*/
static Tcl_ChannelType fileChannelType = {
| | | | | | | | | | | > > > > | | | | | | | | | | > > > > | | | | | | | | | | > > > > | 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. */
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. */
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. */
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 --
|
| ︙ | ︙ | |||
1411 1412 1413 1414 1415 1416 1417 |
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.
*/
| | > < | 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 |
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/tclUnixInit.c.
1 2 3 4 5 6 7 8 9 | /* * 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. * | | | 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.2.2 2001/04/03 22:54:39 hobbs 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 |
CONST char *lang;
CONST char *encoding;
} LocaleTable;
static CONST LocaleTable localeTable[] = {
{"ja_JP.SJIS", "shiftjis"},
{"ja_JP.EUC", "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"},
| > | 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 |
* (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)
*/
if (path != NULL) {
Tcl_SplitPath(path, &pathc, &pathv);
| > > > > > > | | | | | | | 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 |
* (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 > 2) {
pathv[pathc - 2] = installLib;
path = Tcl_JoinPath(pathc - 1, pathv, &ds);
objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
Tcl_DStringFree(&ds);
}
if (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 > 2) {
pathv[pathc - 2] = "library";
path = Tcl_JoinPath(pathc - 1, pathv, &ds);
objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
Tcl_DStringFree(&ds);
}
if (pathc > 3) {
pathv[pathc - 3] = "library";
path = Tcl_JoinPath(pathc - 2, pathv, &ds);
objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
Tcl_DStringFree(&ds);
}
if (pathc > 3) {
pathv[pathc - 3] = developLib;
path = Tcl_JoinPath(pathc - 2, pathv, &ds);
objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
Tcl_DStringFree(&ds);
}
if (pathc > 4) {
pathv[pathc - 4] = developLib;
path = Tcl_JoinPath(pathc - 3, pathv, &ds);
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 |
void
TclpSetInitialEncodings()
{
CONST char *encoding;
int i;
Tcl_Obj *pathPtr;
char *langEnv;
| < | 372 373 374 375 376 377 378 379 380 381 382 383 384 385 |
void
TclpSetInitialEncodings()
{
CONST char *encoding;
int i;
Tcl_Obj *pathPtr;
char *langEnv;
/*
* 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 |
}
if (encoding == NULL) {
encoding = "iso8859-1";
}
Tcl_SetSystemEncoding(NULL, encoding);
/*
* Initialize the C library's locale subsystem. This is required
| > | < > | | > | < < | < < < | 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 |
}
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. We only do this for
* 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].
*/
setlocale(LC_CTYPE, "");
/*
* 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 |
* 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.
*/
| < | 477 478 479 480 481 482 483 484 485 486 487 488 489 490 |
* 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.
*/
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 | /* * 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. * | | | 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.2.1 2001/04/03 22:54:39 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 |
/*
* This structure describes the channel type structure for command pipe
* based IO:
*/
static Tcl_ChannelType pipeChannelType = {
| | | | | | | | | | | > > > > | 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. */
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 |
TclpCreateTempFile(contents)
CONST char *contents; /* String to write into temp file, or NULL. */
{
char fileName[L_tmpnam], *native;
Tcl_DString dstring;
int fd;
if (tmpnam(fileName) == NULL) { /* INTL: Native. */
return NULL;
}
| > > > > > | | 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_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 |
*pidPtr = (Tcl_Pid) pid;
return TCL_OK;
error:
if (pid != -1) {
/*
* Reap the child process now if an error occurred during its
| | > > | | 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. 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, 0);
}
if (errPipeIn) {
TclpCloseFile(errPipeIn);
}
if (errPipeOut) {
TclpCloseFile(errPipeOut);
|
| ︙ | ︙ |
Changes to unix/tclUnixThrd.c.
| ︙ | ︙ | |||
645 646 647 648 649 650 651 |
MASTER_UNLOCK;
}
pmutexPtr = *((pthread_mutex_t **)mutexPtr);
pcondPtr = *((pthread_cond_t **)condPtr);
if (timePtr == NULL) {
pthread_cond_wait(pcondPtr, pmutexPtr);
} else {
| > > > > > > > > | > | | 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 + now.sec +
(timePtr->usec + now.usec) / 1000000;
ptime.tv_nsec = 1000 * ((timePtr->usec + now.usec) % 1000000);
pthread_cond_timedwait(pcondPtr, pmutexPtr, &ptime);
}
}
/*
*----------------------------------------------------------------------
*
|
| ︙ | ︙ |
Changes to win/Makefile.in.
1 2 3 4 5 6 7 | # # 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. # | | | 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.2.5 2001/08/04 00:33:59 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 | # 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) | | | 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 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) |
| ︙ | ︙ | |||
126 127 128 129 130 131 132 |
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}
| | | | 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
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)${DLLSUFFIX}
SHARED_LIBRARIES = $(TCL_DLL_FILE) $(TCL_STUB_LIB_FILE) \
$(DDE_DLL_FILE) $(REG_DLL_FILE) $(PIPE_DLL_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@
|
| ︙ | ︙ | |||
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 | # makefile to look into these paths when resolving .c to .obj # dependencies. Note the ':' to avoid autoconf's habit of deleting # all VPATH lines without an explicit ':' in it. VPATH = $(GENERIC_DIR)@VPSEP@$(WIN_DIR)@VPSEP@$(COMPAT_DIR) # : AR = @AR@ CC = @CC@ RC = @RC@ AC_FLAGS = @EXTRA_CFLAGS@ @DEFS@ CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LDFLAGS_CONSOLE = @LDFLAGS_CONSOLE@ LDFLAGS_WINDOW = @LDFLAGS_WINDOW@ EXEEXT = @EXEEXT@ OBJEXT = @OBJEXT@ STLIB_LD = @STLIB_LD@ SHLIB_LD = @SHLIB_LD@ | > > | > | 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 |
# makefile to look into these paths when resolving .c to .obj
# dependencies. Note the ':' to avoid autoconf's habit of deleting
# all VPATH lines without an explicit ':' in it.
VPATH = $(GENERIC_DIR)@VPSEP@$(WIN_DIR)@VPSEP@$(COMPAT_DIR) # :
AR = @AR@
RANLIB = @RANLIB@
CC = @CC@
RC = @RC@
RES = @RES@
AC_FLAGS = @EXTRA_CFLAGS@ @DEFS@
CPPFLAGS = @CPPFLAGS@
LDFLAGS = @LDFLAGS@
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@ $(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 | tclGet.$(OBJEXT) \ tclHash.$(OBJEXT) \ tclHistory.$(OBJEXT) \ tclIndexObj.$(OBJEXT) \ tclInterp.$(OBJEXT) \ tclIO.$(OBJEXT) \ tclIOCmd.$(OBJEXT) \ tclIOSock.$(OBJEXT) \ tclIOUtil.$(OBJEXT) \ tclLink.$(OBJEXT) \ tclLiteral.$(OBJEXT) \ tclListObj.$(OBJEXT) \ tclLoad.$(OBJEXT) \ tclMain.$(OBJEXT) \ | > | 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 | 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 | TCL_DOCS = "$(ROOT_DIR_NATIVE)"/doc/*.[13n] all: binaries libraries doc tcltest: $(TCLTEST) | | | | | | | | | > | | > | > > > > | > > > > | | | 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 |
TCL_DOCS = "$(ROOT_DIR_NATIVE)"/doc/*.[13n]
all: binaries libraries doc
tcltest: $(TCLTEST)
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)
$(CC) $(CFLAGS) $(TCLSH_OBJS) $(TCL_LIB_FILE) $(LIBS) \
tclsh.$(RES) $(CC_EXENAME)
$(TCLTEST): $(TCL_LIB_FILE) $(TCLTEST_OBJS) $(CAT32) tclsh.$(RES)
$(CC) $(CFLAGS) $(TCLTEST_OBJS) $(TCL_LIB_FILE) $(LIBS) \
tclsh.$(RES) $(CC_EXENAME)
cat32.$(OBJEXT): cat.c
$(CC) -c $(CC_SWITCHES) $(DEPARG) $(CC_OBJNAME)
$(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)
@$(RM) ${TCL_DLL_FILE}
@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) $(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) $(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}
@MAKE_EXE@ $(CFLAGS) ${PIPE_OBJS} $(LIBS)
# Add the object extension to the implicit rules. By default .obj is not
# automatically added.
.SUFFIXES: .${OBJEXT}
.SUFFIXES: .$(RES)
.SUFFIXES: .rc
# Special case object targets
tclWinInit.${OBJEXT}: tclWinInit.c
$(CC) -c $(CC_SWITCHES) -DBUILD_tcl $(EXTFLAGS) $(DEPARG) $(CC_OBJNAME)
|
| ︙ | ︙ | |||
399 400 401 402 403 404 405 |
# 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)
| | < | | | > > > | < > > > > | | | | 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 |
# 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)
.rc.$(RES):
$(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: binaries
@for i in "$(LIB_INSTALL_DIR)" "$(BIN_INSTALL_DIR)" ; \
do \
if [ ! -d $$i ] ; then \
echo "Making directory $$i"; \
$(MKDIR) $$i; \
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 to $(BIN_INSTALL_DIR)/"; \
$(COPY) $$i "$(BIN_INSTALL_DIR)"; \
fi; \
done
@for i in tclConfig.sh $(TCL_LIB_FILE) $(TCL_STUB_LIB_FILE); \
do \
if [ -f $$i ]; then \
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 | $(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 | | | | > > | > > | > > > > > | | | | > > > > > > > > > | | > > > > | | | 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: 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.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" \
"$(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 j in $(ROOT_DIR)/library/http1.0/*.tcl; \
do \
$(COPY) "$$j" "$(SCRIPT_INSTALL_DIR)/http1.0"; \
done;
@echo "Installing library http2.3 directory";
@for j in $(ROOT_DIR)/library/http/*.tcl; \
do \
$(COPY) "$$j" "$(SCRIPT_INSTALL_DIR)/http2.3"; \
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";
@for i in $(ROOT_DIR)/library/encoding/*.enc ; do \
$(COPY) "$$i" "$(SCRIPT_INSTALL_DIR)/encoding"; \
done;
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
@TCL_LIBRARY="$(LIBRARY_DIR)"; export TCL_LIBRARY; \
./tcltest
depend:
Makefile: $(SRC_DIR)/Makefile.in
./config.status
cleanhelp:
$(RM) *.hlp *.cnt *.GID *.rtf man2tcl.exe
clean: cleanhelp
$(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 | Tcl 8.3 for Windows | < < < < | | | < < < < < | < < < | | 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 | Tcl 8.3 for Windows RCS: @(#) $Id: README,v 1.16.2.2 2001/04/06 01:32:53 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 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++ 5+ 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) 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. 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://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 | Tcl/Tk 8.3 for Windows, Binary Distribution | | | | < > > | > | | | | | | 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 | Tcl/Tk 8.3 for Windows, Binary Distribution RCS: @(#) $Id: README.binary,v 1.19.2.3 2001/04/06 01:32:53 hobbs Exp $ 1. Introduction --------------- This directory contains the binary distribution of Tcl/Tk 8.3.3 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 by the Tcl community. 2. Documentation ---------------- 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 Developer Xchange is at: http://dev.scriptics.com/ The home page for the Tcl/Tk release is http://dev.scriptics.com/software/tcltk/ Detailed release notes can be found at http://dev.scriptics.com/software/tcltk/relnotes/ Information about Tcl itself can be found at http://dev.scriptics.com/scripting/ There are many Tcl books on the market. Most are listed at http://dev.scriptics.com/resource/doc/books/ There are notes about compiling Tcl at http://dev.scriptics.com/doc/howto/compile.html 3. Installation --------------- The binary release is distributed as a self-extracting archive called 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 | systems. 6. Reporting Bugs ----------------- If you have comments or bug reports for the Windows version of Tcl, please use our online database at: | | | 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | systems. 6. Reporting Bugs ----------------- If you have comments or bug reports for the Windows version of Tcl, please use our online database at: 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 | 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 ---------------- | < < < | < < | < < | | < < < < | < | | < < < | 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
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
----------------
Several mailing lists are hosted at SourceForge to discuss development or
use issues (like Macintosh and Windows topics). For more information and
to subscribe, visit:
http://sourceforge.net/projects/tcl/
and go to the Mailing Lists page. There are also Special Interest Groups
(SIGs) setup for these topics and more at:
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 |
#! /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=".3"
VER=$TCL_MAJOR_VERSION$TCL_MINOR_VERSION
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:576: 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:606: 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:657: 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:689: 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 700 "configure"
#include "confdefs.h"
main(){return(0);}
EOF
if { (eval echo configure:705: \"$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:731: 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:736: 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:745: \"$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:764: 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:798: 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:827: 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:856: 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:889: 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:919: 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:970: 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:1002: 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 1013 "configure"
#include "confdefs.h"
main(){return(0);}
EOF
if { (eval echo configure:1018: \"$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:1044: 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:1049: 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:1058: \"$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:1077: 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:1111: 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:1140: 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:1169: 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.
#AC_CHECK_TOOL(AR, ar, :)
#AC_CHECK_TOOL(RANLIB, ranlib, :)
#AC_CHECK_TOOL(RC, windres, :)
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:1219: 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:1248: 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:1277: 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:1310: 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:1342: 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 1347 "configure"
#include "confdefs.h"
int main() {
#ifndef __CYGWIN__
#define __CYGWIN__ __CYGWIN32__
#endif
return __CYGWIN__;
; return 0; }
EOF
if { (eval echo configure:1358: \"$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:1380: 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:1386: \"$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:1404: 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 1409 "configure"
#include "confdefs.h"
int main() {
return __MINGW32__;
; return 0; }
EOF
if { (eval echo configure:1416: \"$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:1435: 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:1445: \"$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:1472: 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:1502: 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.
#--------------------------------------------------------------------
echo $ac_n "checking compiler flags""... $ac_c" 1>&6
echo "configure:1540: checking compiler flags" >&5
# Set some defaults (may get changed below)
EXTRA_CFLAGS=""
PATHTYPE='-w'
CYGPATH='cygpath'
VPSEP=';'
# set various compiler flags depending on whether we are using gcc or cl
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"
STLIB_LD="${AR}"
RC_OUT=-o
RC_TYPE=
RC_INCLUDE=--include
RES=res.o
MAKE_LIB="\${AR} crv \$@"
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"
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
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
# 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
echo $ac_n "checking whether $ld_prog supports -shared option""... $ac_c" 1>&6
echo "configure:1610: checking whether $ld_prog supports -shared option" >&5
# 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"
SHLIB_LD="${DLLWRAP-dllwrap}"
else
ld_supports_shared="yes"
SHLIB_LD="${CC} -shared"
fi
echo "$ac_t""$ld_supports_shared" 1>&6
runtime=
# Add SHLIB_LD_LIBS to the Make rule, not here.
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
MAKE_DLL="${MAKE_DLL} --output-lib \$(patsubst %.dll,lib%.a,\$@)"
fi
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=-g
LDFLAGS_OPTIMIZE=-O
# 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.
LDFLAGS_CONSOLE="-mconsole ${extra_ldflags}"
LDFLAGS_WINDOW="-mwindows ${extra_ldflags}"
else
SHLIB_LD="link -dll -nologo -incremental:no -link50compat"
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"
RC_OUT=-fo
RC_TYPE=-r
RC_INCLUDE=-i
RES=res
MAKE_LIB="\${AR} -out:\$@"
POST_MAKE_LIB=
MAKE_EXE="\${CC} -Fe\$@"
LIBPREFIX=""
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"
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}"
CFLAGS_WARNING="-W3"
LDFLAGS_DEBUG="-debug:full -debugtype:cv"
LDFLAGS_OPTIMIZE="-release"
# Specify the CC output file names based on the target name
CC_OBJNAME="-Fo\$@"
CC_EXENAME="-Fe\"\$(shell \$(CYGPATH) \$(PATHTYPE) '\$@')\""
# Specify linker flags depending on the type of app being
# built -- Console vs. Window.
LDFLAGS_CONSOLE="-link -subsystem:console"
LDFLAGS_WINDOW="-link -subsystem:windows"
if test "$do64bit" = "yes" ; then
EXTRA_CFLAGS="$EXTRA_CFLAGS -DUSE_TCLALLOC=0"
fi
fi
#--------------------------------------------------------------------
# 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.
#--------------------------------------------------------------------
# Step 0: Enable 64 bit support?
echo $ac_n "checking if 64bit support is requested""... $ac_c" 1>&6
echo "configure:1727: 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
echo $ac_n "checking for build with symbols""... $ac_c" 1>&6
echo "configure:1739: 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
CFLAGS=${CFLAGS_DEFAULT}
LDFLAGS=${LDFLAGS_DEFAULT}
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:1771: 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 1786 "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:1792: \"$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 1803 "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:1809: \"$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 1820 "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:1826: \"$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:1852: 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 1857 "configure"
#include "confdefs.h"
#include <errno.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1862: \"$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 "${GCC}" = "yes" ; then
RC_DEFINE_FLAG=--define
else
RC_DEFINE_FLAG=-d
fi
if test ${SHARED_BUILD} = 0 ; then
if test "${DBGX}" = "d"; then
RC_DEFINES="${RC_DEFINE_FLAG} STATIC_BUILD ${RC_DEFINE_FLAG} DEBUG"
else
RC_DEFINES="${RC_DEFINE_FLAG} STATIC_BUILD"
fi
else
if test "${DBGX}" = "d"; then
RC_DEFINES="${RC_DEFINE_FLAG} DEBUG"
else
RC_DEFINES=""
fi
fi
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%@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_DLL_FILE@%$TCL_DLL_FILE%g
s%@TCL_STUB_LIB_FILE@%$TCL_STUB_LIB_FILE%g
s%@TCL_STUB_LIB_FLAG@%$TCL_STUB_LIB_FLAG%g
s%@TCL_BUILD_STUB_LIB_SPEC@%$TCL_BUILD_STUB_LIB_SPEC%g
s%@TCL_STUB_LIB_SPEC@%$TCL_STUB_LIB_SPEC%g
s%@TCL_BUILD_STUB_LIB_PATH@%$TCL_BUILD_STUB_LIB_PATH%g
s%@TCL_STUB_LIB_PATH@%$TCL_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%@TCL_SHARED_BUILD@%$TCL_SHARED_BUILD%g
s%@PATHTYPE@%$PATHTYPE%g
s%@CYGPATH@%$CYGPATH%g
s%@VPSEP@%$VPSEP%g
s%@CFLAGS_DEBUG@%$CFLAGS_DEBUG%g
s%@CFLAGS_OPTIMIZE@%$CFLAGS_OPTIMIZE%g
s%@CFLAGS_WARNING@%$CFLAGS_WARNING%g
s%@EXTRA_CFLAGS@%$EXTRA_CFLAGS%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%@CC_OBJNAME@%$CC_OBJNAME%g
s%@CC_EXENAME@%$CC_EXENAME%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%@RC_OUT@%$RC_OUT%g
s%@RC_TYPE@%$RC_TYPE%g
s%@RC_INCLUDE@%$RC_INCLUDE%g
s%@RC_DEFINES@%$RC_DEFINES%g
s%@RES@%$RES%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
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 | # 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. # | | | > > > > > > > > > > > > > > > > > > > > > > > > | 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 |
# 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.2.4 2001/04/04 08:36:16 hobbs Exp $
AC_INIT(../generic/tcl.h)
TCL_VERSION=8.3
TCL_MAJOR_VERSION=8
TCL_MINOR_VERSION=3
TCL_PATCH_LEVEL=".3"
VER=$TCL_MAJOR_VERSION$TCL_MINOR_VERSION
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.
#AC_CHECK_TOOL(AR, ar, :)
#AC_CHECK_TOOL(RANLIB, ranlib, :)
#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
|
| ︙ | ︙ | |||
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
#--------------------------------------------------------------------
# man2tcl needs this so that it can use errno.h
#--------------------------------------------------------------------
AC_CHECK_HEADER(errno.h, , MAN2TCLFLAGS="-DNO_ERRNO_H")
AC_SUBST(MAN2TCLFLAGS)
#--------------------------------------------------------------------
# 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}"
| > > > > > > | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 |
#--------------------------------------------------------------------
# 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_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 "${GCC}" = "yes" ; then
RC_DEFINE_FLAG=--define
else
RC_DEFINE_FLAG=-d
fi
if test ${SHARED_BUILD} = 0 ; then
if test "${DBGX}" = "d"; then
RC_DEFINES="${RC_DEFINE_FLAG} STATIC_BUILD ${RC_DEFINE_FLAG} DEBUG"
else
RC_DEFINES="${RC_DEFINE_FLAG} STATIC_BUILD"
fi
else
if test "${DBGX}" = "d"; then
RC_DEFINES="${RC_DEFINE_FLAG} 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_LIB_FLAG)
AC_SUBST(TCL_DLL_FILE)
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_STUB_LIB_PATH)
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_SHARED_BUILD)
AC_SUBST(PATHTYPE)
AC_SUBST(CYGPATH)
AC_SUBST(VPSEP)
AC_SUBST(CFLAGS_DEBUG)
AC_SUBST(CFLAGS_OPTIMIZE)
AC_SUBST(CFLAGS_WARNING)
|
| ︙ | ︙ | |||
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 | AC_SUBST(CC_EXENAME) AC_SUBST(LDFLAGS) AC_SUBST(LDFLAGS_DEBUG) AC_SUBST(LDFLAGS_OPTIMIZE) AC_SUBST(LDFLAGS_CONSOLE) AC_SUBST(LDFLAGS_WINDOW) AC_SUBST(AR) AC_SUBST(RC) AC_SUBST(DLLSUFFIX) AC_SUBST(LIBPREFIX) AC_SUBST(LIBSUFFIX) AC_SUBST(EXESUFFIX) AC_SUBST(LIBRARIES) AC_SUBST(MAKE_LIB) AC_SUBST(MAKE_DLL) AC_OUTPUT(Makefile tclConfig.sh tcl.hpj) | > > > > > > > > > > | 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 | AC_SUBST(CC_EXENAME) AC_SUBST(LDFLAGS) AC_SUBST(LDFLAGS_DEBUG) AC_SUBST(LDFLAGS_OPTIMIZE) AC_SUBST(LDFLAGS_CONSOLE) AC_SUBST(LDFLAGS_WINDOW) AC_SUBST(AR) AC_SUBST(RANLIB) AC_SUBST(RC) AC_SUBST(RC_OUT) AC_SUBST(RC_TYPE) AC_SUBST(RC_INCLUDE) AC_SUBST(RC_DEFINES) AC_SUBST(RES) 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) 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 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 | # 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-2000 Ajuba Solutions. # # RCS: @(#) $Id: makefile.vc,v 1.50.2.2 2001/04/03 22:54:39 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 !IF "$(MACHINE)" == "IA64" # IA64 support is based on the standard setup with v2 of the # Microsoft Platform SDK for Whistler, build 2267 TOOLS32 = C:\Progra~1\Microsoft Platform SDK TOOLS32_rc = C:\Progra~1\Microsoft Platform 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 # 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. For IA64, we do # want to use the native allocator. # #DEBUGDEFINES = -DTCL_MEM_DEBUG -DTCL_COMPILE_DEBUG -DTCL_COMPILE_STATS !IF "$(MACHINE)" == "IA64" DEBUGDEFINES = -DUSE_TCLALLOC=0 !ELSE #DEBUGDEFINES = -DUSE_TCLALLOC=0 !ENDIF ###################################################################### # 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 | $(TMPDIR)\tclGet.obj \ $(TMPDIR)\tclHash.obj \ $(TMPDIR)\tclHistory.obj \ $(TMPDIR)\tclIndexObj.obj \ $(TMPDIR)\tclInterp.obj \ $(TMPDIR)\tclIO.obj \ $(TMPDIR)\tclIOCmd.obj \ $(TMPDIR)\tclIOSock.obj \ $(TMPDIR)\tclIOUtil.obj \ $(TMPDIR)\tclLink.obj \ $(TMPDIR)\tclLiteral.obj \ $(TMPDIR)\tclListObj.obj \ $(TMPDIR)\tclLoad.obj \ $(TMPDIR)\tclMain.obj \ | > | 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 | $(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 | $(TMPDIR)\tclWinPipe.obj \ $(TMPDIR)\tclWinSock.obj \ $(TMPDIR)\tclWinThrd.obj \ $(TMPDIR)\tclWinTime.obj TCLSTUBOBJS = $(TMPDIR)\tclStubLib.obj \ | < < < < < < < < | < | 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 | $(TMPDIR)\tclWinPipe.obj \ $(TMPDIR)\tclWinSock.obj \ $(TMPDIR)\tclWinThrd.obj \ $(TMPDIR)\tclWinTime.obj TCLSTUBOBJS = $(TMPDIR)\tclStubLib.obj \ 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 cdebug = -O2 -Gs -GD !ELSE IF "$(MACHINE)" == "IA64" cdebug = -Od -Zi !ELSE cdebug = -Z7 -Od -WX !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 | # 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 | < | < | 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 | # 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" DLLENTRY = @12 dlllflags = $(lflags) -dll !ELSE dlllflags = $(lflags) -entry:_DllMainCRTStartup$(DLLENTRY) -dll !ENDIF conlflags = $(lflags) -subsystem:console -entry:mainCRTStartup guilflags = $(lflags) -subsystem:windows -entry:WinMainCRTStartup !IF "$(MACHINE)" == "PPC" libc = libc$(DBGX).lib |
| ︙ | ︙ | |||
365 366 367 368 369 370 371 | -@$(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" | | | | | | | | | | | > | | | | | | | | | | 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 | -@$(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\http\http.tcl" "$(SCRIPT_INSTALL_DIR)\http2.3" -@copy "$(ROOT)\library\http\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\http2.3" @echo installing opt0.4 -@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\opt0.4" -@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 "$(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 |
$(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__ \
| | > > > > | 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 |
$(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) \
!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 |
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
| | | 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])
])
#------------------------------------------------------------------------
# SC_LOAD_TCLCONFIG --
#
# Load the tclConfig.sh file
# Currently a no-op for Windows
|
| ︙ | ︙ | |||
161 162 163 164 165 166 167 168 169 170 171 172 173 |
# Results:
#
# Adds the following arguments to configure:
# --enable-gcc
#
# Sets the following vars:
# CC Command to use for the 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
| > > > > > > > > > > > > > > > > > > | > | > > > > | 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
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 |
if test "$tcl_ok" = "yes"; then
AC_MSG_RESULT(yes)
TCL_THREADS=1
AC_DEFINE(TCL_THREADS)
else
TCL_THREADS=0
| | | 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 |
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)])
fi
])
#------------------------------------------------------------------------
# SC_ENABLE_SYMBOLS --
#
# Specify if debugging symbols should be used
|
| ︙ | ︙ | |||
280 281 282 283 284 285 286 287 288 289 290 291 292 293 |
# 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}"
DBGX=d
| > > > > > > > | 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 |
# LDFLAGS_DEFAULT Sets to LDFLAGS_DEBUG if true
# Sets to LDFLAGS_OPTIMIZE if false
# DBGX Debug library extension
#
#------------------------------------------------------------------------
AC_DEFUN(SC_ENABLE_SYMBOLS, [
# Step 0: Enable 64 bit support?
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)
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}"
DBGX=d
|
| ︙ | ︙ | |||
312 313 314 315 316 317 318 | # in the final configure script. # # Arguments: # none # # Results: # | | | | | | | | | | | | | | | < < | | | | > > > | | | | | | | | > > > < | > > > | > | 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 |
# in the final configure script.
#
# Arguments:
# none
#
# Results:
#
# 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
# SHLIB_LD
# SHLIB_LD_LIBS
# LIBS
# AR
# RC
# RES
#
# MAKE_LIB
# MAKE_EXE
# MAKE_DLL
#
# LIBSUFFIX
# LIBPREFIX
# LIBRARIES
# EXESUFFIX
# DLLSUFFIX
#
#--------------------------------------------------------------------
AC_DEFUN(SC_CONFIG_CFLAGS, [
AC_MSG_CHECKING([compiler flags])
# Set some defaults (may get changed below)
EXTRA_CFLAGS=""
PATHTYPE='-w'
CYGPATH='cygpath'
VPSEP=';'
# set various compiler flags depending on whether we are using gcc or cl
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"
STLIB_LD="${AR}"
RC_OUT=-o
RC_TYPE=
RC_INCLUDE=--include
RES=res.o
MAKE_LIB="\${AR} crv \[$]@"
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"
extra_cflags="-mno-cygwin"
extra_ldflags="-mno-cygwin"
|
| ︙ | ︙ | |||
391 392 393 394 395 396 397 |
# static
AC_MSG_RESULT([using static flags])
runtime=
MAKE_DLL="echo "
LIBSUFFIX="s\${DBGX}.a"
LIBRARIES="\${STATIC_LIBRARIES}"
EXESUFFIX="s\${DBGX}.exe"
| < | 428 429 430 431 432 433 434 435 436 437 438 439 440 441 |
# static
AC_MSG_RESULT([using static flags])
runtime=
MAKE_DLL="echo "
LIBSUFFIX="s\${DBGX}.a"
LIBRARIES="\${STATIC_LIBRARIES}"
EXESUFFIX="s\${DBGX}.exe"
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
|
| ︙ | ︙ | |||
430 431 432 433 434 435 436 |
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
MAKE_DLL="${MAKE_DLL} --output-lib \$(patsubst %.dll,lib%.a,\[$]@)"
fi
LIBSUFFIX="\${DBGX}.a"
| < > > > | > > > > > < > | < > > > | | > > > > | 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 |
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
MAKE_DLL="${MAKE_DLL} --output-lib \$(patsubst %.dll,lib%.a,\[$]@)"
fi
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=-g
LDFLAGS_OPTIMIZE=-O
# 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.
LDFLAGS_CONSOLE="-mconsole ${extra_ldflags}"
LDFLAGS_WINDOW="-mwindows ${extra_ldflags}"
else
SHLIB_LD="link -dll -nologo -incremental:no -link50compat"
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"
RC_OUT=-fo
RC_TYPE=-r
RC_INCLUDE=-i
RES=res
MAKE_LIB="\${AR} -out:\[$]@"
POST_MAKE_LIB=
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"
else
# dynamic
AC_MSG_RESULT([using shared flags])
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"
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}"
CFLAGS_WARNING="-W3"
LDFLAGS_DEBUG="-debug:full -debugtype:cv"
LDFLAGS_OPTIMIZE="-release"
# Specify the CC output file names based on the target name
CC_OBJNAME="-Fo\[$]@"
CC_EXENAME="-Fe\"\$(shell \$(CYGPATH) \$(PATHTYPE) '\[$]@')\""
# Specify linker flags depending on the type of app being
# built -- Console vs. Window.
LDFLAGS_CONSOLE="-link -subsystem:console"
LDFLAGS_WINDOW="-link -subsystem:windows"
if test "$do64bit" = "yes" ; then
EXTRA_CFLAGS="$EXTRA_CFLAGS -DUSE_TCLALLOC=0"
fi
fi
])
#------------------------------------------------------------------------
# SC_WITH_TCL --
#
# Location of the Tcl build directory.
|
| ︙ | ︙ | |||
539 540 541 542 543 544 545 |
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)
])
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 |
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 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
// RCS: @(#) $Id: tcl.rc,v 1.5.2.1 2001/04/03 22:54:39 hobbs Exp $
//
// Version Resource Script
//
#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 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) SUFFIX ".dll\0"
VALUE "CompanyName", "Ajuba Solutions\0"
VALUE "FileVersion", TCL_PATCH_LEVEL
VALUE "LegalCopyright", "Copyright (c) 2000 by Ajuba Solutions\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 | # 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. # | | < < < < < < < | 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.10.2 2000/07/28 07:58:28 mo Exp $ TCL_DLL_FILE="@TCL_DLL_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 |
# 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.
| | | 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='@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 | # 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@' | | | 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 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 | /* * 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. * | | | 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.2.2 2001/04/03 22:54:39 hobbs Exp $ */ #include "tclWinInt.h" /* * State flags used in the info structures below. */ |
| ︙ | ︙ | |||
97 98 99 100 101 102 103 |
/*
* This structure describes the channel type structure for file based IO.
*/
static Tcl_ChannelType fileChannelType = {
"file", /* Type name. */
| | > > > > | 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 |
/*
* This structure describes the channel type structure for file based IO.
*/
static Tcl_ChannelType fileChannelType = {
"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, /* 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 --
|
| ︙ | ︙ | |||
871 872 873 874 875 876 877 878 |
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;
DCB dcb;
| > | < > > > > > | 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 |
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, 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 |
writeFile = TclWinMakeFile(handle);
}
channel = TclpCreateCommandChannel(readFile, writeFile, NULL, 0, NULL);
break;
case FILE_TYPE_DISK:
case FILE_TYPE_CHAR:
| < > | > > > > > > | > > > > > > > > | | | > | > > > > > > > > > > > > > > > > > > > > > > > > | 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 |
writeFile = TclWinMakeFile(handle);
}
channel = TclpCreateCommandChannel(readFile, writeFile, NULL, 0, NULL);
break;
case FILE_TYPE_DISK:
case FILE_TYPE_CHAR:
channel = TclWinOpenFileChannel(handle, channelName, mode, 0);
break;
case FILE_TYPE_UNKNOWN:
default:
/*
* 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 |
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;
| > | 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 |
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 |
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.
*/
| | | | | | 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 |
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 (Tcl_Channel) NULL;
}
channel = Tcl_MakeFileChannel(handle, mode);
if (channel == NULL) {
return (Tcl_Channel) NULL;
}
/*
* Set up the normal channel options for stdio handles.
*/
if ((Tcl_SetChannelOption((Tcl_Interp *) NULL, channel, "-translation",
|
| ︙ | ︙ |
Changes to win/tclWinConsole.c.
1 2 3 4 5 6 7 8 9 10 11 | /* * 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. * | | | 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.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 | * pointer. */ } ConsoleEvent; /* * Declarations for functions used only in this file. */ | < < < < < < < < < | > > > > | 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 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 WaitForRead(ConsoleInfo *infoPtr, int blocking);
/*
* This structure describes the channel type structure for command console
* based IO.
*/
static Tcl_ChannelType consoleChannelType = {
"console", /* Type name. */
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 |
if (infoPtr->readFlags & CONSOLE_BUFFERED) {
/*
* Data is stored in the buffer.
*/
if (bufSize < (infoPtr->bytesRead - infoPtr->offset)) {
| | | | 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], (size_t) bufSize);
bytesRead = bufSize;
infoPtr->offset += bufSize;
} else {
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 |
* Reallocate the buffer to be large enough to hold the data.
*/
if (infoPtr->writeBuf) {
ckfree(infoPtr->writeBuf);
}
infoPtr->writeBufLen = toWrite;
| | | | 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((unsigned int) 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 | 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, | | | 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,
(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 | /* * 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. * | | | 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.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 |
MakeDdeConnection(
Tcl_Interp *interp, /* Used to report errors. */
char *name, /* The connection to use. */
HCONV *ddeConvPtr)
{
HSZ ddeTopic, ddeService;
HCONV ddeConv;
| < | 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;
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 | /* * 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. * | | | 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.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 |
EINVAL, /* 120 */
EINVAL, /* 121 */
EINVAL, /* 122 */
ENOENT, /* ERROR_INVALID_NAME 123 */
EINVAL, /* 124 */
EINVAL, /* 125 */
EINVAL, /* 126 */
| | | 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 */
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 | /* * 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. * | | | 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.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 | 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); | | | 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, (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 |
return result;
}
static int
DoCreateDirectory(
Tcl_DString *pathPtr) /* Pathname of directory to create (native). */
{
| | | 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). */
{
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 |
Tcl_DStringFree(&ds);
if (result == 0xffffffff) {
StatError(interp, fileName);
return TCL_ERROR;
}
| | | 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((int) (result & attributeArray[objIndex]));
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
* ConvertFileNameFormat --
|
| ︙ | ︙ | |||
1418 1419 1420 1421 1422 1423 1424 | * 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); | | | 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((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 | /* * 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. * | | | 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.2.1 2001/04/03 22:54:39 hobbs Exp $ */ #include "tclWinInt.h" #include <sys/stat.h> #include <shlobj.h> #include <lmaccess.h> /* For TclpGetUserHome(). */ |
| ︙ | ︙ | |||
322 323 324 325 326 327 328 | 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); | | > > > > > | > > | 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' 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 |
}
}
}
if (typeOk) {
Tcl_ListObjAppendElement(interp, resultPtr,
Tcl_NewStringObj(fname, Tcl_DStringLength(dirPtr)));
}
| > > | | | | | | | > > > > > > > | 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);
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);
|
| ︙ | ︙ |
Changes to win/tclWinInit.c.
1 2 3 4 5 6 7 8 9 | /* * 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. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | /* * 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.2.1 2001/04/03 22:54:39 hobbs Exp $ */ #include "tclWinInt.h" #include <winreg.h> #include <winnt.h> #include <winbase.h> |
| ︙ | ︙ | |||
244 245 246 247 248 249 250 |
* (e.g. /usr/src/tcl8.2/unix/../../tcl8.2/library)
* <bindir>/../../../<devlopLib>
* (e.g. /usr/src/tcl8.2/unix/solaris-sparc/../../../tcl8.2/library)
*/
if (path != NULL) {
Tcl_SplitPath(path, &pathc, &pathv);
| | | | | | | | 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 |
* (e.g. /usr/src/tcl8.2/unix/../../tcl8.2/library)
* <bindir>/../../../<devlopLib>
* (e.g. /usr/src/tcl8.2/unix/solaris-sparc/../../../tcl8.2/library)
*/
if (path != NULL) {
Tcl_SplitPath(path, &pathc, &pathv);
if (pathc > 2) {
pathv[pathc - 2] = installLib;
path = Tcl_JoinPath(pathc - 1, pathv, &ds);
objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
Tcl_DStringFree(&ds);
}
if (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 > 2) {
pathv[pathc - 2] = "library";
path = Tcl_JoinPath(pathc - 1, pathv, &ds);
objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
Tcl_DStringFree(&ds);
}
if (pathc > 3) {
pathv[pathc - 3] = "library";
path = Tcl_JoinPath(pathc - 2, pathv, &ds);
objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
Tcl_DStringFree(&ds);
}
if (pathc > 3) {
pathv[pathc - 3] = developLib;
path = Tcl_JoinPath(pathc - 2, pathv, &ds);
objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
Tcl_DStringFree(&ds);
}
if (pathc > 4) {
pathv[pathc - 4] = developLib;
path = Tcl_JoinPath(pathc - 3, pathv, &ds);
objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
Tcl_DStringFree(&ds);
}
ckfree((char *) pathv);
|
| ︙ | ︙ | |||
618 619 620 621 622 623 624 |
/*
* 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) {
| | | 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 |
/*
* 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), (LPDWORD) &Tcl_DStringLength(&ds)) == 0) {
Tcl_DStringSetLength(&ds, 0);
}
}
Tcl_SetVar2(interp, "tcl_platform", "user", Tcl_DStringValue(&ds),
TCL_GLOBAL_ONLY);
Tcl_DStringFree(&ds);
}
|
| ︙ | ︙ |
Changes to win/tclWinInt.h.
1 2 3 4 5 6 7 8 9 10 | /* * 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. * | | | 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.10.1 2001/04/03 22:54:39 hobbs Exp $ */ #ifndef _TCLWININT #define _TCLWININT #ifndef _TCLINT #include "tclInt.h" |
| ︙ | ︙ | |||
88 89 90 91 92 93 94 |
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;
| < | 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;
/*
* 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 | /* * 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. * | | | 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.2.1 2001/04/03 22:54:39 hobbs Exp $ */ #include "tclWinInt.h" /* *---------------------------------------------------------------------- |
| ︙ | ︙ | |||
83 84 85 86 87 88 89 |
* 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",
| | | > > > > | 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);
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 | /* * 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. * | | < < < < < < | 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 | /* * 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.10.1 2001/04/03 22:54:39 hobbs Exp $ */ #include "tclWinInt.h" #include <winsock.h> #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 * Windows implementation of the Tcl notifier. One of these structures |
| ︙ | ︙ | |||
464 465 466 467 468 469 470 |
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.
*/
| | | 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 |
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((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 | /* * 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. * | | | 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.2.3 2001/07/17 01:45:42 hobbs 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 |
* 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. */
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.
| > > | 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 |
/*
* This structure describes the channel type structure for command pipe
* based IO.
*/
static Tcl_ChannelType pipeChannelType = {
"pipe", /* Type name. */
| | | > > > | 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. */
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, /* close2proc */
PipeBlockModeProc, /* Set blocking or non-blocking mode.*/
NULL, /* flush proc. */
NULL, /* handler proc. */
};
/*
*----------------------------------------------------------------------
*
* PipeInit --
*
|
| ︙ | ︙ | |||
826 827 828 829 830 831 832 |
* stdio of another.
*/
if (!TclInExit()
|| ((GetStdHandle(STD_INPUT_HANDLE) != filePtr->handle)
&& (GetStdHandle(STD_OUTPUT_HANDLE) != filePtr->handle)
&& (GetStdHandle(STD_ERROR_HANDLE) != filePtr->handle))) {
| > | | 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 &&
CloseHandle(filePtr->handle) == FALSE) {
TclWinConvertError(GetLastError());
ckfree((char *) filePtr);
return -1;
}
}
break;
|
| ︙ | ︙ | |||
1190 1191 1192 1193 1194 1195 1196 |
* 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,
| | | 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,
(DWORD) createFlags, NULL, NULL, &startInfo, &procInfo) == 0) {
TclWinConvertError(GetLastError());
Tcl_AppendResult(interp, "couldn't execute \"", argv[0],
"\": ", Tcl_PosixError(interp), (char *) NULL);
goto end;
}
/*
|
| ︙ | ︙ | |||
1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 |
special++;
}
Tcl_DStringAppend(&ds, start, special - start);
if (quote) {
Tcl_DStringAppend(&ds, "\"", 1);
}
}
Tcl_WinUtfToTChar(Tcl_DStringValue(&ds), Tcl_DStringLength(&ds), linePtr);
Tcl_DStringFree(&ds);
}
/*
*----------------------------------------------------------------------
*
| > | 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 |
if (readFile != NULL) {
/*
* Start the background reader thread.
*/
infoPtr->readable = CreateEvent(NULL, TRUE, TRUE, NULL);
infoPtr->startReader = CreateEvent(NULL, FALSE, FALSE, NULL);
| > | | | | 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, 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 writer thread.
*/
infoPtr->writable = CreateEvent(NULL, TRUE, TRUE, NULL);
infoPtr->startWriter = CreateEvent(NULL, FALSE, FALSE, NULL);
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 |
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);
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) {
/*
| > | | > | > | > > > | > > | > | > > | | | > | > > > > | < > > > > > > | > > > > > > | > | | > > > | 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) {
/*
* 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.
*/
WaitForSingleObject(pipePtr->readThread, 10);
GetExitCodeThread(pipePtr->readThread, &exitCode);
if (exitCode == STILL_ACTIVE) {
/*
* 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
* 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);
}
}
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 |
* Reallocate the buffer to be large enough to hold the data.
*/
if (infoPtr->writeBuf) {
ckfree(infoPtr->writeBuf);
}
infoPtr->writeBufLen = toWrite;
| | | | 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((unsigned int) 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 |
Tcl_Pid
Tcl_WaitPid(
Tcl_Pid pid,
int *statPtr,
int options)
{
ProcInfo *infoPtr, **prevPtrPtr;
| | | 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;
DWORD flags;
Tcl_Pid result;
DWORD ret;
PipeInit();
/*
* If no pid is specified, do nothing.
|
| ︙ | ︙ | |||
2655 2656 2657 2658 2659 2660 2661 | * * 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 | | > > > > | > > | > > > > > > > > | 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. 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
* on the pipe becoming readable.
*/
dwWait = WaitForMultipleObjects(2, wEvents, FALSE, 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 | /* * 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. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* * 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.2.1 2001/04/03 22:54:40 hobbs Exp $ */ #ifndef _TCLWINPORT #define _TCLWINPORT #ifndef _TCLINT # include "tclInt.h" |
| ︙ | ︙ | |||
62 63 64 65 66 67 68 | #include <sys/stat.h> #include <sys/timeb.h> #include <sys/utime.h> #endif #include <tchar.h> #include <time.h> | | | 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | #include <sys/stat.h> #include <sys/timeb.h> #include <sys/utime.h> #endif #include <tchar.h> #include <time.h> #include <winsock.h> #define WIN32_LEAN_AND_MEAN #include <windows.h> #undef WIN32_LEAN_AND_MEAN #ifdef BUILD_tcl # undef TCL_STORAGE_CLASS |
| ︙ | ︙ |
Changes to win/tclWinReg.c.
1 2 3 4 5 6 7 8 9 10 11 12 13 | /* * 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. * | | | 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.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 |
Tcl_DString buf;
/*
* Find the parent of the key being deleted and open it.
*/
keyName = Tcl_GetStringFromObj(keyNameObj, &length);
| | | 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((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 |
/*
* 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) {
| | | 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, (int) type);
} else {
Tcl_SetStringObj(resultPtr, typeNames[type], -1);
}
return TCL_OK;
}
/*
|
| ︙ | ︙ | |||
676 677 678 679 680 681 682 |
*
* 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;
| | | | 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, (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, (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 |
* 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) {
| | | 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, (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 |
Tcl_DStringLength(&buf));
Tcl_DStringFree(&buf);
} else {
/*
* Save binary data as a byte array.
*/
| | | 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), (int) length);
}
Tcl_DStringFree(&data);
return result;
}
/*
*----------------------------------------------------------------------
|
| ︙ | ︙ | |||
818 819 820 821 822 823 824 |
goto done;
}
maxSize++;
Tcl_DStringInit(&buffer);
Tcl_DStringSetLength(&buffer,
| | | 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 |
goto done;
}
maxSize++;
Tcl_DStringInit(&buffer);
Tcl_DStringSetLength(&buffer,
(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 |
Tcl_DStringValue(&buffer), &size, NULL, NULL, NULL, NULL)
== ERROR_SUCCESS) {
if (regWinProcs->useWide) {
size *= 2;
}
| | | 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), (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 |
{
char *keyName, *buffer, *hostName;
int length;
HKEY rootKey;
DWORD result;
keyName = Tcl_GetStringFromObj(keyNameObj, &length);
| | | 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((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 |
maxSize++;
if (result != ERROR_SUCCESS) {
return result;
}
Tcl_DStringInit(&subkey);
Tcl_DStringSetLength(&subkey,
| | | 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,
(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 |
if (regWinProcs->useWide) {
Tcl_DStringSetLength(&buf, Tcl_DStringLength(&buf)+1);
}
length = Tcl_DStringLength(&buf) + 1;
result = (*regWinProcs->regSetValueExProc)(key, valueName, 0, type,
| | | | 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, (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, (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 |
LocalFree(msgPtr);
}
}
if (length == 0) {
if (error == ERROR_CALL_NOT_IMPLEMENTED) {
msg = "function not supported under Win32s";
} else {
| | | 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: %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 |
msg[--length] = 0;
}
if (msg[length-1] == '\r') {
msg[--length] = 0;
}
}
| | | 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, "%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 | /* * 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 * | | | 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.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 |
/*
* This structure describes the channel type structure for command serial
* based IO.
*/
static Tcl_ChannelType serialChannelType = {
| | | | | | | | | | | > > > > | 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. */
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 |
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;
| | | 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;
size_t len;
BOOL result;
Tcl_DString ds;
TCHAR *native;
infoPtr = (SerialInfo *) instanceData;
len = strlen(optionName);
|
| ︙ | ︙ | |||
1115 1116 1117 1118 1119 1120 1121 |
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;
| | | 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;
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 |
} else {
char parity;
char *stop;
char buf[2 * TCL_INTEGER_SPACE + 16];
parity = 'n';
| | | 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) {
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 | /* * 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. * | | | 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.2.2 2001/04/03 22:54:40 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 |
/*
* This structure describes the channel type structure for TCP socket
* based IO.
*/
static Tcl_ChannelType tcpChannelType = {
| | | | | | | | | | | > > > > | 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. */
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 |
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 {
SendMessage(tsdPtr->hwnd, SOCKET_SELECT,
(WPARAM) SELECT, (LPARAM) infoPtr);
| > < | 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);
}
}
if (events & (FD_WRITE | FD_CONNECT)) {
mask |= TCL_WRITABLE;
}
if (mask) {
|
| ︙ | ︙ |
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 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.2.1 2001/04/03 22:54:40 hobbs Exp $
//
// Version Resource Script
//
#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 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) SUFFIX ".exe\0"
VALUE "CompanyName", "Ajuba Solutions\0"
VALUE "FileVersion", TCL_PATCH_LEVEL
VALUE "LegalCopyright", "Copyright (c) 2000 by Ajuba Solutions\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"
|