From 7a92bb857ae185395cd8bff47d7154a9a9b3dcbb Mon Sep 17 00:00:00 2001 From: Pat Thoyts Date: Fri, 13 Jun 2008 18:27:44 +0100 Subject: [PATCH 1/1] import: tclcontrol-2.0.3 imported into git --- examples/html/example1.html | 59 ++++ examples/tc.ico | Bin 0 -> 766 bytes examples/vb/Main.frm | 82 +++++ examples/vb/Main.frx | Bin 0 -> 814 bytes examples/vb/TclVB.exe | Bin 0 -> 16384 bytes examples/vb/TclVB.vbp | 41 +++ examples/vb/TclVB.vbw | 1 + examples/vb/plot.tcl | 95 ++++++ examples/vb/plot.tcl.old | 95 ++++++ install/TclControl_Install.tcl | 168 ++++++++++ install/tclcontrol84.dll | Bin 0 -> 102400 bytes readme.html | 101 ++++++ src/StdAfx.cpp | 12 + src/StdAfx.h | 30 ++ src/TclClassFactory.cpp | 153 +++++++++ src/TclClassFactory.h | 13 + src/TclControl.cpp | 578 +++++++++++++++++++++++++++++++++ src/TclControl.h | 196 +++++++++++ src/TclControl.htm | 8 + src/TclControl.rgs | 34 ++ src/TclControlPrj2.cpp | 143 ++++++++ src/TclControlPrj2.def | 9 + src/TclControlPrj2.dsp | 433 ++++++++++++++++++++++++ src/TclControlPrj2.dsw | 29 ++ src/TclControlPrj2.idl | 80 +++++ src/TclControlPrj2.rc | 147 +++++++++ src/TclControlPrj2CP.h | 60 ++++ src/TclControlPrj2ps.def | 11 + src/TclControlPrj2ps.mk | 16 + src/dlldatax.c | 42 +++ src/dlldatax.h | 25 ++ src/resource.h | 18 + src/tclcontr.bmp | Bin 0 -> 246 bytes 33 files changed, 2679 insertions(+) create mode 100644 examples/html/example1.html create mode 100644 examples/tc.ico create mode 100644 examples/vb/Main.frm create mode 100644 examples/vb/Main.frx create mode 100644 examples/vb/TclVB.exe create mode 100644 examples/vb/TclVB.vbp create mode 100644 examples/vb/TclVB.vbw create mode 100644 examples/vb/plot.tcl create mode 100644 examples/vb/plot.tcl.old create mode 100644 install/TclControl_Install.tcl create mode 100644 install/tclcontrol84.dll create mode 100644 readme.html create mode 100644 src/StdAfx.cpp create mode 100644 src/StdAfx.h create mode 100644 src/TclClassFactory.cpp create mode 100644 src/TclClassFactory.h create mode 100644 src/TclControl.cpp create mode 100644 src/TclControl.h create mode 100644 src/TclControl.htm create mode 100644 src/TclControl.rgs create mode 100644 src/TclControlPrj2.cpp create mode 100644 src/TclControlPrj2.def create mode 100644 src/TclControlPrj2.dsp create mode 100644 src/TclControlPrj2.dsw create mode 100644 src/TclControlPrj2.idl create mode 100644 src/TclControlPrj2.rc create mode 100644 src/TclControlPrj2CP.h create mode 100644 src/TclControlPrj2ps.def create mode 100644 src/TclControlPrj2ps.mk create mode 100644 src/dlldatax.c create mode 100644 src/dlldatax.h create mode 100644 src/resource.h create mode 100644 src/tclcontr.bmp diff --git a/examples/html/example1.html b/examples/html/example1.html new file mode 100644 index 0000000..b2e3fed --- /dev/null +++ b/examples/html/example1.html @@ -0,0 +1,59 @@ + + + + + + + + + + + +
+ + +

Variable + setting and tracing with Tcl, JScript and + VBScript 

+ + +
DHTML
+
+ + diff --git a/examples/tc.ico b/examples/tc.ico new file mode 100644 index 0000000000000000000000000000000000000000..8766d3288e9ea13fc5b2679ce6b5eeb05cd2a789 GIT binary patch literal 766 zcmcJNF%H5o3`KtsQzjmick zblpaV>q^=Zcd&zd=(NTIYR?fQOd*tjCsp6~L@VUMl(S`!W1q||Ax$WqlT4#lN>M)g zN-Jrm)0euvKcCMM!@SdxpJSDdtl=wdwSsZK_qufb*0W}VCEYatSMUaMko$yp`YwTW UN_3{Dd-=wok!SKlMbj_v0O7s8b^rhX literal 0 HcmV?d00001 diff --git a/examples/vb/Main.frm b/examples/vb/Main.frm new file mode 100644 index 0000000..8743758 --- /dev/null +++ b/examples/vb/Main.frm @@ -0,0 +1,82 @@ +VERSION 5.00 +Object = "{E796A720-F130-11D2-8003-0040055861F2}#1.0#0"; "TCLCONTROL.DLL" +Begin VB.Form Form1 + Caption = "Form1" + ClientHeight = 7785 + ClientLeft = 60 + ClientTop = 345 + ClientWidth = 8745 + Icon = "Main.frx":0000 + LinkTopic = "Form1" + ScaleHeight = 7785 + ScaleWidth = 8745 + StartUpPosition = 3 'Windows Default + Begin VB.ComboBox cmdcombo + Height = 315 + Left = 840 + TabIndex = 0 + Top = 6960 + Width = 7815 + End + Begin TCLCONTROLPRJ2LibCtl.TclControl tcl + Height = 6615 + Left = 120 + OleObjectBlob = "Main.frx":030A + TabIndex = 1 + Top = 120 + Width = 8535 + End + Begin VB.Label Label1 + Caption = "Command:" + Height = 255 + Left = 0 + TabIndex = 3 + Top = 6960 + Width = 855 + End + Begin VB.Label Result + Caption = "Result:" + Height = 255 + Left = 0 + TabIndex = 2 + Top = 7440 + Width = 8655 + End +End +Attribute VB_Name = "Form1" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = False +Attribute VB_PredeclaredId = True +Attribute VB_Exposed = False +Private Sub SelectAll() + cmdcombo.SelStart = 0 + cmdcombo.SelLength = Len(cmdcombo.Text) +End Sub + +Private Sub cmdcombo_KeyPress(KeyAscii As Integer) + If KeyAscii = 13 Then + If (tcl.Eval(cmdcombo.Text)) Then + Result = "Result: " + tcl.Result + cmdcombo.AddItem (cmdcombo.Text) + Else + Result = "Error: " + tcl.Result + End If + SelectAll + End If +End Sub + +Private Sub Form_Load() + Dim mbt As Integer + mbt = vbOKOnly + vbExclamation + If (tcl.Eval("source plot.tcl") = False) Then + res = MsgBox("Can't find the Tcl script 'plot.tcl'", mbt) + Else + res = tcl.TraceVar("plotupdate", TRACE_WRITES + GLOBAL_ONLY) + End If +End Sub + +Private Sub tcl_OnTraceVar(ByVal name1 As String, ByVal Flags As Long) + x = tcl.GetVar2("plot", "lastX", GLOBAL_ONLY) + y = tcl.GetVar2("plot", "lastY", GLOBAL_ONLY) + Result.Caption = "Pos: (" + x + ", " + y + ")" +End Sub diff --git a/examples/vb/Main.frx b/examples/vb/Main.frx new file mode 100644 index 0000000000000000000000000000000000000000..eeb476a6ca0f8657bbb002df9f0d7e6456efa1e1 GIT binary patch literal 814 zcmcIjAr1mD5S#)bp+TTXaEHV20Te;w`2-SyY{D0K!09SH<{T1s1Bjh0>FHi`ganuZ&EU#URqI=oe7njjk z`D^v#O4n=kp@BqJ9m=E+W+H=XG?GfC4YglaGs7u0ky6`x`qaU6O!rq+RWw+t@4vO| zA5R`i9JVpICwBM=(7lQ10P~y{1Urbj6c25D>3jFtednoKS*k1{Qo&&abk(3>3^1jc zZP2_<1<198AWHD>{v}a~WPrd=7P7WT*++D=k!U@)HKNsJ7W4n8R7|S!c+4ehZZ86U zL(duD@4W>D+of7HDjQUy1O8aVh=4Iujv`?9%&#?~34bP=iGnTH0EX1*kOy0L54aw1J>Yua^Y4Lo-mi|Y zTe>X%gELC}sW(gFe{8FYKlfls{JDQpoUIp)-Wm;Mtt@L~>62xpEJ>CtP!bK~zNFE` zcLe7V82E8=0JshKmkUQO{p{f6O?fYArF$d)0Sll2G{8POz(wG?XWYU}9^ z_4afHdmq}|mFRCXl75{3wsgwKq?6>yQI7W1zfo7M(A{0FUr8DMbclP$y|K_&Tmuga&B{v`$%Y4pINCd>A(vzvK+bncU)w>;XQb zHZ%k@I$5vreVdOH)q^S{k(I3VX=r#Bq7Ipg489sPgrp8r?Nimv2;;L6qi zjtta1zs*NqzUN!NX=~XRwB8kUCX#w~-|j>-lg_5`k1(9b4o8w|pD`Rur1yne@7soA ztG}nK73SlQA|xgj^v1<=)mqoZ@;)_y?gE~6*jnNEi#mI| zgpNuIvMLGX4!Ig|du0R}MkFy1b5tq!H^+5Y25tx94@aPkCB=8Y6Eew2C?gT18 zJAPkQ=gy%#YdDL1W{%&cQMEO0`c0jZpm|(_weQ9)dIB}WN!0jjK}>t;1!Vx19$ur- zdFvYcUK%MI!!>^ucn&xXY=Vv{v5Z&x5w(4$EDJ+)>C)TYT2H9emd3 zEzXDtFibREyrDu=o!$ZMREc7eGGCxwfH{){cGUM zz&C&l>`RVqcfmKCf!l!B6E1!V{U8io?xRGn#_8Ik`DO&%5&!FRY(fGyI zUCbM2BL2WV6EE_vANUF``^)3Ji6oCtfyLWq^UmHr%hPNgpAu7!&-h|s-#3fADrRh0-1D|5nYh$7~3$RrK%kYo)B-;k)Ph1^C%-07v9 z7!u2?*#<8n*G_6+jesX*DW7R%i)e+c@qhy`go2SC8UiwK9J9|e+siNouQAyCPm@y_ z$NA>7e+F@j+Z-<@(T?Gq@>xG?@%cQTL;L*zCYl<0T(k^`QfjQPzFJZj626cqJl8Ht z(5KMV@C?1OG9 z6@n8sjU^ur2XuoaIdvCbUU#OpP8A^)o)8Z9XB zg9qwLq_0k)e+>9!CCya5vib@w-0fd6L}yHxmnbNFLAXZ4XmcCLO&=6ny%ZCgSp6cc zQgDQ@VdN2t#H3pftTV)hb=z@_ur{eeu5GgyTYtNGZh~Sl(!ve7)d ze16ZNEx*m-3*vyc(AQT&`KzdF?jX7Y*b0mhjBpTpH~m?xAe_|t@Fqyg1z|v$hkrdH9s#Qla@y%zqvQ% z_{|gN<`(B4UWC7Cm}q1XKELA{XXSu7J6Jo>tFm0kKMVe}hWB`Q_8Y}`2DRPHE8283 zXnqH8)20-U;cQu$`e;AO4&+VyXczTRH|Sj`JJDwNo%h{>`J8ClVm~v=P82+?-DC4G zB_NCpWd?c@$N=ilnL@raEqfZ|s1SNNmztHiOapTKUWlRGJL={4hYD=s_e7j!J-CRb zq?8FD?-!u^fX#SQ#E;>}@a9jE@0kYiR!PTb1G6CAPb!`Xbnwz>an6?Wt(>i$%ll?Q zM`SPOe4UwGwwLq0S!iLMs?6J(BM!;+CQ$av74r54aw1J>Yu4^?>VvFTMx<2P5fIbpQYW literal 0 HcmV?d00001 diff --git a/examples/vb/TclVB.vbp b/examples/vb/TclVB.vbp new file mode 100644 index 0000000..1661ed7 --- /dev/null +++ b/examples/vb/TclVB.vbp @@ -0,0 +1,41 @@ +Type=Exe +Form=Main.frm +Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#C:\WINDOWS\SYSTEM\StdOle2.Tlb#OLE Automation +Object={E796A720-F130-11D2-8003-0040055861F2}#1.0#0; TCLCONTROL.DLL +Reference=*\G{3D5C6BF0-69A3-11D0-B393-00A0C9055D8E}#1.0#0#C:\PROGRAM FILES\COMMON FILES\DESIGNER\MSDERUN.DLL#Microsoft Data Environment Instance 1.0 +Reference=*\G{00000200-0000-0010-8000-00AA006D2EA4}#2.0#0#C:\PROGRAM FILES\COMMON FILES\SYSTEM\ADO\msado20.tlb#Microsoft ActiveX Data Objects 2.0 Library +IconForm="Form1" +Startup="Form1" +HelpFile="" +Title="TclVb" +ExeName32="TclVB.exe" +Command32="" +Name="TclVB" +HelpContextID="0" +Description="Demonstrates the use of Tcl in a VB project" +CompatibleMode="0" +MajorVer=1 +MinorVer=0 +RevisionVer=0 +AutoIncrementVer=0 +ServerSupportFiles=0 +VersionComments="A demo that sources a tcl script and sets up a variable trace." +VersionCompanyName="UEA, SYS" +VersionLegalCopyright="This source is distributed under the GNU Public Licence." +VersionProductName="TclVb" +CompilationType=-1 +OptimizationType=0 +FavorPentiumPro(tm)=0 +CodeViewDebugInfo=0 +NoAliasing=0 +BoundsCheck=0 +OverflowCheck=0 +FlPointCheck=0 +FDIVCheck=0 +UnroundedFP=0 +StartMode=0 +Unattended=0 +Retained=0 +ThreadPerObject=0 +MaxNumberOfThreads=1 +DebugStartupOption=0 diff --git a/examples/vb/TclVB.vbw b/examples/vb/TclVB.vbw new file mode 100644 index 0000000..ec2195b --- /dev/null +++ b/examples/vb/TclVB.vbw @@ -0,0 +1 @@ +Form1 = 11, 35, 445, 373, Z, 22, 21, 618, 609, C diff --git a/examples/vb/plot.tcl b/examples/vb/plot.tcl new file mode 100644 index 0000000..f833608 --- /dev/null +++ b/examples/vb/plot.tcl @@ -0,0 +1,95 @@ +set w .plot + +# plotupdate is used to raise an event on a plot change +set plotupdate 0 +set plot(lastX) 0 +set plot(lastY) 0 + + +catch {destroy $w} +frame $w +pack $w + + +set c $w.c +set font {Arial 10 normal} + +label $w.msg -font $font -wraplength 4i -justify left -text "Here is a familiar plot ... play with it!" +pack $w.msg -side top + +frame $w.buttons +pack $w.buttons -side bottom -fill x -pady 2m +button $w.buttons.dismiss -text Dismiss -command "destroy $w" + +canvas $c -relief raised -width 450 -height 300 +pack $w.c -side top -fill x + +set plotFont {Helvetica 18} + +$c create line 100 250 400 250 -width 2 +$c create line 100 250 100 50 -width 2 +$c create text 225 20 -text "A Familiar Plot" -font $plotFont -fill brown + +for {set i 0} {$i <= 10} {incr i} { + set x [expr {100 + ($i*30)}] + $c create line $x 250 $x 245 -width 2 + $c create text $x 254 -text [expr 10*$i] -anchor n -font $plotFont +} +for {set i 0} {$i <= 5} {incr i} { + set y [expr {250 - ($i*40)}] + $c create line 100 $y 105 $y -width 2 + $c create text 96 $y -text [expr $i*50].0 -anchor e -font $plotFont +} + +foreach point {{12 56} {20 94} {33 98} {32 120} {61 180} + {75 160} {98 223}} { + set x [expr {100 + (3*[lindex $point 0])}] + set y [expr {250 - (4*[lindex $point 1])/5}] + set item [$c create oval [expr $x-6] [expr $y-6] \ + [expr $x+6] [expr $y+6] -width 1 -outline black \ + -fill SkyBlue2] + $c addtag point withtag $item +} + +$c bind point "$c itemconfig current -fill red" +$c bind point "$c itemconfig current -fill SkyBlue2" +$c bind point <1> "plotDown $c %x %y" +$c bind point "$c dtag selected" +bind $c "plotMove $c %x %y" + +set plot(lastX) 0 +set plot(lastY) 0 + +# plotDown -- +# This procedure is invoked when the mouse is pressed over one of the +# data points. It sets up state to allow the point to be dragged. +# +# Arguments: +# w - The canvas window. +# x, y - The coordinates of the mouse press. + +proc plotDown {w x y} { + global plot + $w dtag selected + $w addtag selected withtag current + $w raise current + set plot(lastX) $x + set plot(lastY) $y +} + +# plotMove -- +# This procedure is invoked during mouse motion events. It drags the +# current item. +# +# Arguments: +# w - The canvas window. +# x, y - The coordinates of the mouse. + +proc plotMove {w x y} { + global plot plotupdate + $w move selected [expr $x-$plot(lastX)] [expr $y-$plot(lastY)] + set plot(lastX) $x + set plot(lastY) $y + set plotupdate 1 +} + diff --git a/examples/vb/plot.tcl.old b/examples/vb/plot.tcl.old new file mode 100644 index 0000000..f833608 --- /dev/null +++ b/examples/vb/plot.tcl.old @@ -0,0 +1,95 @@ +set w .plot + +# plotupdate is used to raise an event on a plot change +set plotupdate 0 +set plot(lastX) 0 +set plot(lastY) 0 + + +catch {destroy $w} +frame $w +pack $w + + +set c $w.c +set font {Arial 10 normal} + +label $w.msg -font $font -wraplength 4i -justify left -text "Here is a familiar plot ... play with it!" +pack $w.msg -side top + +frame $w.buttons +pack $w.buttons -side bottom -fill x -pady 2m +button $w.buttons.dismiss -text Dismiss -command "destroy $w" + +canvas $c -relief raised -width 450 -height 300 +pack $w.c -side top -fill x + +set plotFont {Helvetica 18} + +$c create line 100 250 400 250 -width 2 +$c create line 100 250 100 50 -width 2 +$c create text 225 20 -text "A Familiar Plot" -font $plotFont -fill brown + +for {set i 0} {$i <= 10} {incr i} { + set x [expr {100 + ($i*30)}] + $c create line $x 250 $x 245 -width 2 + $c create text $x 254 -text [expr 10*$i] -anchor n -font $plotFont +} +for {set i 0} {$i <= 5} {incr i} { + set y [expr {250 - ($i*40)}] + $c create line 100 $y 105 $y -width 2 + $c create text 96 $y -text [expr $i*50].0 -anchor e -font $plotFont +} + +foreach point {{12 56} {20 94} {33 98} {32 120} {61 180} + {75 160} {98 223}} { + set x [expr {100 + (3*[lindex $point 0])}] + set y [expr {250 - (4*[lindex $point 1])/5}] + set item [$c create oval [expr $x-6] [expr $y-6] \ + [expr $x+6] [expr $y+6] -width 1 -outline black \ + -fill SkyBlue2] + $c addtag point withtag $item +} + +$c bind point "$c itemconfig current -fill red" +$c bind point "$c itemconfig current -fill SkyBlue2" +$c bind point <1> "plotDown $c %x %y" +$c bind point "$c dtag selected" +bind $c "plotMove $c %x %y" + +set plot(lastX) 0 +set plot(lastY) 0 + +# plotDown -- +# This procedure is invoked when the mouse is pressed over one of the +# data points. It sets up state to allow the point to be dragged. +# +# Arguments: +# w - The canvas window. +# x, y - The coordinates of the mouse press. + +proc plotDown {w x y} { + global plot + $w dtag selected + $w addtag selected withtag current + $w raise current + set plot(lastX) $x + set plot(lastY) $y +} + +# plotMove -- +# This procedure is invoked during mouse motion events. It drags the +# current item. +# +# Arguments: +# w - The canvas window. +# x, y - The coordinates of the mouse. + +proc plotMove {w x y} { + global plot plotupdate + $w move selected [expr $x-$plot(lastX)] [expr $y-$plot(lastY)] + set plot(lastX) $x + set plot(lastY) $y + set plotupdate 1 +} + diff --git a/install/TclControl_Install.tcl b/install/TclControl_Install.tcl new file mode 100644 index 0000000..6e71fca --- /dev/null +++ b/install/TclControl_Install.tcl @@ -0,0 +1,168 @@ + +# TclControl Installer +# Author: Fuzz +# fuzz@sys.uea.ac.uk + + +package require registry + +set piccy { +R0lGODdhKwBAAPcAAAAAAIAAAACAAICA +AAAAgIAAgACAgMDAwMDcwKbK8AAAAAAA +KgAAVQAAfwAAqgAA1AAqAAAqKgAqVQAq +fwAqqgAq1ABVAABVKgBVVQBVfwBVqgBV +1AB/AAB/KgB/VQB/fwB/qgB/1ACqAACq +KgCqVQCqfwCqqgCq1ADUAADUKgDUVQDU +fwDUqgDU1CoAACoAKioAVSoAfyoAqioA +1CoqACoqKioqVSoqfyoqqioq1CpVACpV +KipVVSpVfypVqipV1Cp/ACp/Kip/VSp/ +fyp/qip/1CqqACqqKiqqVSqqfyqqqiqq +1CrUACrUKirUVSrUfyrUqirU1FUAAFUA +KlUAVVUAf1UAqlUA1FUqAFUqKlUqVVUq +f1UqqlUq1FVVAFVVKlVVVVVVf1VVqlVV +1FV/AFV/KlV/VVV/f1V/qlV/1FWqAFWq +KlWqVVWqf1WqqlWq1FXUAFXUKlXUVVXU +f1XUqlXU1H8AAH8AKn8AVX8Af38Aqn8A +1H8qAH8qKn8qVX8qf38qqn8q1H9VAH9V +Kn9VVX9Vf39Vqn9V1H9/AH9/Kn9/VX9/ +f39/qn9/1H+qAH+qKn+qVX+qf3+qqn+q +1H/UAH/UKn/UVX/Uf3/Uqn/U1KoAAKoA +KqoAVaoAf6oAqqoA1KoqAKoqKqoqVaoq +f6oqqqoq1KpVAKpVKqpVVapVf6pVqqpV +1Kp/AKp/Kqp/Vap/f6p/qqp/1KqqAKqq +KqqqVaqqf6qqqqqq1KrUAKrUKqrUVarU +f6rUqqrU1NQAANQAKtQAVdQAf9QAqtQA +1NQqANQqKtQqVdQqf9QqqtQq1NRVANRV +KtRVVdRVf9RVqtRV1NR/ANR/KtR/VdR/ +f9R/qtR/1NSqANSqKtSqVdSqf9SqqtSq +1NTUANTUKtTUVdTUf9TUqtTU1AAAAAwM +DBkZGSYmJjMzMz8/P0xMTFlZWWZmZnJy +cn9/f4yMjJmZmaWlpbKysr+/v8zMzNjY +2OXl5fLy8v/78KCgpICAgP8AAAD/AP// +AAAA//8A/wD//////ywAAAAAKwBAAAAI +/gD/CRxIsCDBevMSztM2z6DDgggTgtNG +URs2ZhiZLSvGsRixjx+LMWv40OA8jyBT +qlzJshhDiRUpZkzIsqbNmyzn1UOJs6dP +YsX+7fxJ9GbQfzxr+gLpa2lRlcsEJmWp +DKS1qk9TMpN6k5uyptb2WcuqlStLX8q4 +EUOrlmxKbAKXKbVmbalXp0zXEtUmkJlS +ZV+V1U25FNvCvX3/rr2K11cxnb16LcN7 +k+8/vzjHMi1W740GChTW/SSJ+e/gtY/f +gAatZXRim74Yg9SmerWNn5wFYsvMlNmt +1aBDpZStGeTRf9p4g4z3eXUWytzqxv5q +fGDym5p9MasN+jZQkHeJ/mEFGVXgdZtY +fWlrHjyUrXrM7Nrcah4ndWLugIPWoKGX +NrTFrUQfcriJoR9oEtiijSaysQRXfT4V +48OBFNgwT3wBrmTZP/PgNuGBYJwkHmUq +bdhhhB/q185/49VkIlEf+sCeNnL1RBKH +Pi1lQ4ViNOcDNiTWdOOJOHm0oxbtrLbO +VDXlJtBQOFG0IypudKdXT8cJxaRKvoDT +y4RUBrdRhAVtWeKEEjCjRHfyTNZTeQOZ +yZQ2E9pA537xyFnWQFDCdqedH2oAzk9w +aomTL9gYCChoPvxH5kBEwsaMgVrY0pwY +jmJJUKRKLZOkFsyBtg6QjwrEaZOfhkqB +KKRiWQ+k/hGiQgGozaESX4SvmvoTMxrQ +ClppPt143k2OaWBDPBNqsQywOAmbIzE+ +2GDLhO5laqN1ERJjw6IUaGAtTuBge+hI +PkigzZoU+HCrTxsOexNz5tbWTjFBuiju +uBM6o5q3RbVLFK+o/OaDmz9tuBtR66zz +myj12rQhsz2519pTD16WlTZ61jQgxIdi +nNXGT2m37r8DcQybL8s2bBOcNf60VDEH +F3Vcy0VhkxS9RcapDTgTpTTNoD//A840 +Hmk3lS+nfvTzccX8PDQx00xDzM7TIBd1 +clETDXXUU/+T9dZS78w0MRNVHW5Mg4Jk +ttd8hRs0PUOvPQ1FTno0dM8fTYR3bN7J +7bwz2XP7TXbfPCdHkkde9yz10H9DPfjg +Pf8zNV+LJ6e31A0NJXnVAlUd9kBRCzTo +05IPLTnUohPjNTGZZ6y0Wyo1lHRLrvfE +F5EdYYRNRQnVE5FC80wUU0XYXJSRRstk +Dk7vJTXv/EMBAQA7 +} + + +# edit this line for the path of regsvr32.exe +set regsvr {c:/windows/system/regsvr32.exe} +set bin [file dirname [info nameofexecutable]] +puts "Install dir: $bin" +regsub {\.} "tclcontrol[info tclversion].dll" {} dll +set dll [file join [pwd] $dll] +puts "dll selected: $dll" + + +set location {} +image create photo tclim -data $piccy +proc updategui {} { + global location + set location {} + catch { + set clsid [registry get {HKEY_CLASSES_ROOT\TclControlPrj2.TclControl\CLSID} {}] + set location [registry get "HKEY_CLASSES_ROOT\\CLSID\\$clsid\\InProcServer32" {}] + } + + + if {$location == {}} { + .uninstall config -state disabled + .install config -text "Install for Tcl[info tclversion]" + } else { + .uninstall config -state normal + .install config -text "ReInstall for Tcl[info tclversion]" + } +} + +proc install {} { + global regsvr bin dll + set cwd [pwd] + set answer [tk_messageBox -title {} -message "Okay to install $dll in $bin as the default TclControl?" -icon question -type yesno] + + switch $answer { + no {} + yes { + if [catch {file copy -force $dll $bin} e] { + puts "error in copying: $e" + } + set f [file tail $dll] + cd $bin + exec $regsvr $f + cd $cwd + } + } + updategui +} + +proc uninstall {} { + global location regsvr + set reply [tk_messageBox -type yesno -message "Unregister TclControl located at $location?"] + if {[string compare $reply yes] != 0} return + set dir [file dirname $location] + set f [file tail $location] + set cwd [pwd] + cd $dir + exec $regsvr /u $f + cd $cwd + + set reply [tk_messageBox -type yesno -message "Delete TclControl located at $location?"] + if {[string compare $reply yes] == 0} { + file delete -force $location + } + updategui +} + +wm title . "Installer - F2 for console" +bind . {console show} +bind . {exit} + +label .im -image tclim -relief flat -bd 0 +button .install -text Install... -command install -width 16 -height 1 -bd 2 -font {arial 10 bold} +button .uninstall -text Uninstall -command uninstall -width 16 -height 1 -bd 2 -font {arial 10 bold} +button .quit -text Quit -command exit -bd 2 -font {arial 10 bold} -width 5 -height 1 + +grid .im -column 0 -row 0 -rowspan 2 +grid .install -column 1 -row 0 -padx 2 -pady 2 -sticky nsew +grid .uninstall -column 2 -row 0 -padx 2 -pady 2 -sticky nsew +grid .quit -column 1 -row 1 -columnspan 2 -padx 2 -pady 2 -sticky nsew + + +wm resizable . 0 0 +updategui +raise . +focus -force . diff --git a/install/tclcontrol84.dll b/install/tclcontrol84.dll new file mode 100644 index 0000000000000000000000000000000000000000..73eef1a8e78c14307e08b443f341f818f73c330e GIT binary patch literal 102400 zcmeFae|%hJnecrkGf7U{X=hpz7$DFaMWrzgsFj{6 zVNKG+X|$)OqwKS~qN}^G%362bXWd6uf+8fO+q6)-1wo3S28?>L6Wt))G}y>_zt??c zlIagncc1tDynoPsCg+^{+&{1Tx~}`WuOIiRecyeWSJN~fKgZFuKCbewTK#?dKe|WL z<}Lj0Jni9GKe(vRv;GGc-O~2qZRK0<{@91^e*Z_xKluKSe)MBT`3JU?-<|wu`G-GR zzV_z&@{fG%jxCqZojbcCTlMFc+&22mjqm+#?zg9{>bpPUd1K?s@9yWir)|Y|zsR+! z;i~UGpUroG>!%wo`ffkhZ*%>zO0WFxd0an3dC7P7`sLp}!u9gRRqDF&!yjyuHr{GP zv52Ov_Y`W*iH}s}@(gS9E}G*h(zGL_^k-9pT;(^co`dS1XMvym%U!hx0FLD2UxE6| zgL=+g-N*4+9_{PAf8d0sJuLZd_h>6FPz6r@)9ul^11Bf_QBT8k)$PC;vtMp(X*YQD z;{*JW{vF9)x#a$p)2qwxzT^GI`!($ge@5yszh&7gm)yT<(B^VCoA$LENDTr564jMU z?q4;~y!`HMcYlxsHCD!~mGcnen)k0->brZ(T^}Rk2hQUKFi`ono|fFTT64e5lU4dTNh_55MbB8v@3Yoc=&61^me3mA zoW1=$MW30|u=9Efmx<)^K^!)xs1Jl(R3$u01CYS1XrkG-Gk(g9Ob3XfA)ttJ0 zQr*_?zO6!Uv|gJSEHEnK>8`1^+vaOQ=jw#N(eCfkw248FQ5?6QlFZi7=1i$|*ggxu zs`N(t|ETo+Ew?`D)0``uQbSs5u*R&~lFDbpPxX1LwQl3;ss_Im37Yebi>rdkbE;y# zKol<*P3ucO( z(lM@;{ZHx|J&#v9=?y;faZ%;iUzn?D=}&!)TeIC~u1J6Co9b5QX-HfDb1j(KP*ZI_ z-Y=<-?^Ayts2in9x^{APeysnDcwmzYSPohqVlNlmM(tCxkLTgP8K|KOqn_M!#s z^tViD*5TtXra$!nwX5X4^EEA1JLOo1Q~P}?>tXx3GMcVEwz=ijJ4^K`$-%9 z1et+)&sZ6%g8D{*;A>7&xAy|u%9qTDzv^!UJb|5Gkt&^1AJ32&ND_Di0=vwE-p81ovb{zjf0BOZU-I*j4G5*if{k$} z8MHcq5I1_8P1o%eRG8WqOh?9D+=w~b>6V`c0*^$d0*};AI?0lO;ozJB>oBCAD762a z5}R8Ny0!LnnoLPU%syrS|!u4mDsXslM{1 z#;W^e0^-To6WV;Z*bqhE6L(6VqdV4kH0`@8)$gsCvYY9ywXZRjaN_m#piQe8qDILS z@z>Y4t;lG>`ubSgB!px?4bEkntD5~uU*$yRa&XQmeVMH34z0i%a_gHb^&P9Pk2fX& zihtLI^jZv7QH$IORwK)d3M zKsyTCeJh~F+J18m1egp?L+>$$2DgRO!cSY{CxNeWVy2%88S3gzMhCa2OiFfU^8q-9 z_I321nV_oXpmn88thGvJE?H29DK4wrl!$K z>b(=j&8f~3_>Yqesb1Nu8CX+OEd3c-AM9s~nU$q#>Vx*X$r<6^3N35^Mo?RL{pZG=e|7K%DR(bY#pCn##S5_yu*;GI*#l&62*UK<{@kKU&pXVyr#`!+q^u z2ApNMEHtMx+>&~Pr5wk#B2(!t=;(_f73(6GRKO+`|TyaN4={x~oC^Gpr zcrXcT8y)@=@clCBu>#bw(|G=|x99o4z2_|kdn&$nC~Q)EG-!ZLp)+FBSEafvHU-aw zO(C#pat50w(_3tXO^RAh2GZN{;pcVu@Xa|sd}gWVob1s45S={W(#ijb14ro3=;!~0 zDf{#7xheaTm+9-I=;<8zbQbkxcgpgaQc$*P>FD~HeGtLo!4k>Qx?W4Q-maO^JFNXJ zgCY(OOvR7?^!$lRXVGh^{p+h%)gY`Ui%fM*N6TVuArjik*$vvYEQs+~Jl@9G5$TPJ z#nxf@YkROsZ*D;_>-#^lKiiMFH#JsX-x#-EOH{B$vtJ))FKb5Z%9r3!Y|k!86r|gI zO>MI;(t>SX{?sLcaZ|T-ovJqp`&Qflhwc~-$2(Qd|t>jqv>5g-GA3o5z zAT?RgS!iwdWoBDZpS64!MJK|qo5>NQ$SP`dV!rU}aADcZ7}ZDu>6?RgHxD8@{JZ^K z?yMrVN43w@*Cjk{8iPhK4HvCc&YV6lsI|6D4VN+)>OGRSm%`PK|B$#qq&gV-u_O#b*N}I6QTo2xz`cT zMfznQ8`YBws@P^3ewAk^s?XDkyO}t4{?yT$y4Gui&QKG%y|SUxslm3exh!J0P`Fmd*&%Bn3*E) zA2CJE`BNnOxKpOcufS#L;kh;Jw~`lGpib#}xjoy8>EY6t+|IFL{&49n+!`169z>~9 zb7rMV0b8WZ1+q&dSFzH^Waf!d%Jjr6-Kq1jQS@tZtAh+qF2mf$$8ENF5AhE{ce5Z3 zB?KqZyKbTPZJTJA#pnWCiwWd1D1vA<4 z^=CGvqk3b^t@jG*O?8%`dzy%xQ*C(7WSNt!u&%6tt+3BUds1fA_^hC{)ek;c)%udx zmOR-QLlaP5w^4+JWDp${8{~B+$?Yfy94<9!> zr;KuDFpZm4J%$m1&O$dvJ#o#Vo=syfGwn^&XyY&K`%MImvN5EPd}229#-6CEps#7bqw%P*C<+#ip0v z8eeKqLHq|+=XjzZp|PpZA@Q>d6+dok1HId}GKjc+snF+m??mT3-hZ6th}~M0mLq;^t1t6W zi=|)#Yl+cd6;(dl+aLJclfBQH4gTbXRxo@{@=9R@abNN>;R10zd5Kl+53lnlFG#)N zF)nwu`|3rZke@DRDP?Fj&#Q%?d!V8qrBB-%Wd6VdUi&&S;N(kgv zeM@ET@BfIV^^Eyged@a(8b5)H9P1{!vY`Px*h-IjchTj*BR@;`%1gCO#Q#LbWgXlMtQ`FY3)~UdrzoLhr9YBRh_p{=vsV5&=UBFXXLr1HU z5Im*>r5`xABRml<*YLXgMsb%WEMBRtfAlFis#JFOe2&(>c!}!LwcF;vK%?IAI zK~GrQeRRf(jEi13ygx_dRr)#zr8=+%7)36%%U8Xu2ljo*~?lEJ<;f+5@Q6b@v)28e~tO+-t?aA0-m z;V!>%3QN;7|KV)c?ewqcz-CZRjd)^4Y&kZ=-b5wZ8ANv-H+EPJe&{ISX$k+x@b$iA zeAMdHQ#*9cXtCD$fmqzSIoNy9h^4mpHQ^TC@R99sasRdg>q)W~K;z8dfg18$n%?BG z)-gNgJgeGg!iKNa4BaYH6X;8=3+k!;`c27~nU0LVPqs#xLdEWKbh5re7tjp6;`P)7 ztys{i@rR$;Rt%`P=m`%H+5{$wEu!y30-weN@DcWz+A;?5^!7jDrPjdCy-XBxmneGe z4>5(-WUmw0^S?+%Lj@E)#s$6Lvz~>HZzwV*6D=@KNA!$0jZlfCFrLs*6#E6NZSoo% zvL+|UYs`hU&Y)AT(@`O!W$m~X4bCt$b2Tceal20Nj1F{`lA-sY^_t((4ow{8NL7{GJ~eW@t0AJj81db@P93+U5*5fLHhs8Ar|jVaX|;x)BekrFcsZ_UmN zTnVwD*8y6^ad;T`@3)GkYuC+d6~bd6iYLmRkp9?HBWl@#G%kcR&S$i#){tvj%3raB zt&m6L{T=d)jE@-EKXV2dkn!V~%y$+K#F+`P$%!`KD$TNYa=!J^Bd4gp?N&xEY# zN@x2D5xP6`h&lf};V66Xb0_f|7not(q!RY3uHnC@MwYniak+MpF(ZhBg+Xf-fC2y%mY zmHle>03|5;r;ouz4YV3FqoGE#Yo&dl6+iowHCP`+r!i+99qvfKhXR7+XBb>8r z%SkH>!&LmDm=P|cLsnE)bC7&`IgOT(;LT46l2DMJ;1>ZPKS7rzIWOUD7bT2utgDGu zci-?u{M6|ztgvTHhggKi+nVwIn&d~@jv_2RDtZY-jJ92X-F{Fevv+b@N^;cxf*lLk z=B6{QJ&Y@XP3b~(oznZcbvto%1yZ7%ELu`}I6(XG3%p_x~P+_4N5 z?d0uH^bQRHztJwgQtZj7KaB+mh8k?s$!4!(;^=5S3ewUJhWEthD8uZ>)4erNX?@K8 zw>w;XQ_tr2C6&?NFQACL%-!d>OMQP6$py(-sqe4nrf^#$0u&5j`-ap8!}0c49{dK? zb|>dN^HJlO;nk@($~%6;tra!WzFy&72%_8Bm5IBC8Evn0ru$=UXg7V2t_yb=+cTLW zv!&f^F*dhU_A3m=@1yT2LBFqjK+rFqSm`boKlrIyF0x_{+`1eu13SVFARVn3Dk@{b z>G*mYLrpS*{hD{|U(57(wbeE5=#N6hGipiikKNR)ZqT{#>G&(}P=QHv*?cO5+p?h=TKg%jgcu*3? z)}Jch__e;@O6y;`-EI8{6}YVry?mzDcfia}YJH*1_^ET9B3Gk*pQ_;$fl4vX)Vn|> zUlxh78c=%)!_A8O9lr#(qQ1M-W&Q2ya@R_A*;=kHM*lA)OZ)xm(s7$yKGjXXwRe?y zaF9Atrocb|?i;tV4hDMvi;Nh|tz@XL0Lly>NQTn2Q@pB6-~4b^gJORaBFJ?0iMsa8 z8Ga-gn)|f3%VpL(M(d2u=-?Xv?E^^J7H?xXrt=M-X6p!d^s zSUk8ew*9*x600&ub{LXk-TnxS{?Yjt(a69(ml`#zmXvGS-KDGE!)5z5tE#vdm8&+$ zWvP-q4n7&uR+W(d?(tQnT(+04xq*~fcX z99UCP$hji2bx+9ME}$Q9u5#`vaY~m%!ifvj?J{n^C#50f=eUnqQNK6ptN-GXC!d+* zLH8E9w<`BiawxvZDkwsg>zbqXK6vW{HMMav76?^8sx4qGl>O!P*Rl>Ng&cY{HyPcT zng+mZZ{&3|00WP#xqb>&_KP}`3@WcZ>pDOl zCo9xyZ4F>Wpk?JC*LDOtSu_x{Z~qNUMr~t6sa4fk7U=y;jhb1)Cj-f{geM&-Ye^0C z#gsBoa3m41-xG)XzCSfteC7+ z(_{Fo{jT^b0O@<;Mzr%TqTfeZ`|lMex`Tl-lX197_GyZGOTkmxIF-?R8L$7 zpjsW>K(?jSlf{b;q<&Yd-ruv`srdXY*T9>SWvKxJ{II`-k~p)OJDw?$aAvyqWK;;d z<9g`j+L;3XB?YkPMT$B(VAb3E0y7FE8tMZiZ6j8!mwpdJxO~X#TISKeBwQ2^XS$sEL zrN$EI71c?u7i9u?>zUNRp5s40|5+SaZ(PhC{l=y2(evl!^twNJgQ{DKPq(RBux=2Q z%xoE*<$)e$V1GDQ3As)g-7PbtORwJL&Y5B?6RU6Vu+{4?$eb@evAxe4XIZObW`UsQ zB_7S$QHZuuP`1zaJZt&kO+wy!W4dOSm#*>IgRmDcAtFMT zvC_KoVPva#B3S7-KVn1F2{+xGnD5>ftXr2@kWFSYOx>tk{Yp7lwpsDr%7eZABnLh} zpwu$2};r4Y_5z*mtKf3i$-u~mx%Sdm`6^Z1LP-T4Q>KoEZb z9L(dR>(>i1F3nO)S@v3zGu)sKOZ8KMxR#~{LUs1{V2G*>5W|b-|A|McaKVn^9ZhEZiE6@(8*1f{)%CZRC{og@4cP6t%WhVEmgHl`uonD=n z?#!g;F#n|YU#U?P=5jr?+XSW9h$2GObOVv&M*+zB{h;2W0V}rN*&0jNtala&V5*z( zdFwk*u>VK{lB{dQ!3w>9+8pt9CI%zUGW$2rAlRCbvG9Jh=Z3%0I$(dh7>YT{3iOho zZ}_JuLM>MN&uaM8{b|Io`JWp~8BkbJxD|wEg5o>_qJr>6)^yq_+&`>%w(y zqVS5SC+JCD+&x#_q~?B0_NhaKd%1+@;ZWf>xvP-Af~$hQL*j_5^+|@T-z`R(VDC#g zR`}u6B2f~esR?QYzHa-ANMyMGS;h3`FM`QizA`1tfew(=ikDlrM8TV z&81csUS*H4CJA`hh8nX~ee7j2g-;ZMu-Vs^3y=472MT9s<4bbtM6m45cLO3VMq zO6losQt8K~QgJJao6Y0&717$RQnjj{iQB`taV=&$V3lsrH`ZHvB3R${9D+(rG%`*d z!w8?~n1k@9MpXjDBl@o9sqkP_W z^=%7+nx^`3r7c}@>inuZEbeL>hbvnw^e6X7G%|FHKc~oL_G0)UZ-hro(|pfeAX<(g z`|S6-VwYg8T0;*M=H4ef!m^Dzd(NbiVI@m?mwF4$!vxqYr235+^M1&J(YXsdjBc?o zx}}QIoz?|$7Mbb7BS=Na6>wniuT!^%jvq~bRBFb_x-+hnAZG7rDWPYkD_L;@lVzSbA%cQhGu=Ig zY%TOh$C*2nB*RxI=(<|=87GFt!8tG?={Or&YC207%TWfYGir*v1`|cQe zF*g!mV2^TrYE5k!(H6aCMaz_|(j`2sGF>}T*B1UgN;CV5f2K5P@SzKEa2T1BJe$jy zmJA3-W$%i$4NMX-)t^Rf#`A^349DF-3vu%iMu9da&$wd^C2E;~x z*#1(OqNuJqW?6?T9oqmwvSyWO;jglPVs(wqc8=&Gmc7K3y@f(_&$WpucF22hjZuc7toye3dqy53E z&Z&+cS@-(9oqi{xry_oZf~mo>R9H)|nGEzAARnAkq$ahZs1T^iex))}DtL6CVkSTV zj|O(AXyjKX>uVGmSBH@8;8Jg4HolZ$H`*^8l!fpVv$1ApwRVA@DXkszo7GlHL#G<2 ze|xSNr=`ilKI(KdD<={)I;Nyp{~~|WJ@OYd;v8tc*z%weM@P5+Bzv`NVy4AYh`JM1XTQ1=Rp(xHcRzRS>P}Rhcc{AuxLd34MAccror^+(!B)2* zsXKMDz@MC?lOzi#wtSHxrj^gGS4ihYS#8VVuu@JN*!^U|RMXyQ555Fk&N$`u`;{mx zlrWkeavYjSjg?6(l38mL^@CQt5oxyaV4Q}{+GA$zq*;rW6+KB8c0ymBY@r%P%*K#) zc0H=^q~DB;n9XA`X8|sqU7=)WPpAKrjLVSS8IC+S7Wka)WjOA@kO`N{+-9vh#BE|q zUc5ji459UHQsk7JtXSbfQDGYAWiy8({^UF=b03wf9$m7|7MjJ2&)JA{s4FI>cDi-B z1+)kK4RQ&Fj5rISf0=iGx?$>xK6v=XxN@@T#A-AZi)W$N`(xpVQv~DXFi6~~ zjy&Pb#d1&(D7$#t@PR7K^bd$Wd*#%`TdC7Ce zg4DF@nYleq0fKk3@QDK6^*Sw`UUm=GP|jyWN%(>pN)`#mMZ<8(D?-yUnx0>3Z=TrE zvtPCu$=P(!^Ev;_)RK-%U4d+q3WG-&9V5hRBiJa#MG4T38&SpbaQ2{a@$1!+&A5WQ_FqxpAP+ttXALR_k1XJgci)Q&pEHi(7}ZOSS6i)vH^pu1Jn-Y%4Dj zhlP<=6b8aM@yZJS)HuiTGQ9cDHXpBI_9vuj9C=3Zp=gx!uCjE zm*#P{Iwrg3HxjyCLNXN6I}zCV4-~>+DlkA2c77;5b3+#8e#*K)_v$;H}2{fIKE4B60OP`-6au4AcPMvl|5L>+r}3iA!gRx8Gc+D`%Li?K1kuP5>qV38~iF>s%r6d zUD9A(CVAs1T2|ig+~aeecdmAxkJ~FKvZg8A;_LXu=4Jts7_E?k3xb|!Y6Pz z#s+ld9+}b~F+ruykF4>YU&>jIJ%=@s-(@+koKUV$*=;F-m{NK?{5nhXbkXEF4EV$B zd`fpt*Ud&I^OI9+%&b*dP};33Va-}mR%Be9j(S{zdN&>C!4l)59=ERnSU5xMD!W?N z-r8ev`))d9jSC``wo?UxN5b)0D-?|W2>1_OpAVYT;a~59--1b<1pYoBY7X0^bR!EU zYbP6y*X)a+K;`>aIC?~S7MZFyi@H~EIKaQk{Pj)|hC!6OT>_0-ld=g5?D^~IH!J=NAD+qmOQ}j!I@`LxFExB3xt<^?qdcKmm{9z=jC3Jp`+aT?I+kV5m3U4)_cms~ z=FL{K6nQZrbry}@4)Q)BKC_u~R6P7le)GbZ{RAZxY=ug!p<7)75-Z>1eMpYjJlQok zrN@9g=rSL7&viX-E=HKRdqlQSgO>02kC88P40^GOcI(}5%<4F=`;FOMv%BAzYZP|B zQJ$P53|r)(qRdZPgl5zR^)+=UhIQ@k;+_3Q8*9kQOOxB;oRAnfI=o)!|<`yX(@GbB#qS%Z-H~v~(d1Gut+Mck#Mi-ZkNC zsY7)%`3xnqTStUgkMu|USfm8^h7a>G=avlijR_yweI2+wwv;`N+L7y(_~ymsNB~)e zo*9mr%{D4zcN=X+##J~~a`xkD8~r$wXI|TV9UJKEPTIOaT4CJXD=y(YhaU=jE=isp zOV`@=cgW3vRGMbAWnQ!<6w7a)tKb#9-WWF!sK1f_p+)exxm{WW9h&(*D1Z7SM0(itOhH( zHE;JhyGnGYXty}Cec46Dx$cX&N4;^)_G%L$iq$O7oO&CE`7c<`&&V)WT!?Rb?Np=v zeh4R;8K>%8=&W)8_t}t)Y{UhV6)L}hCw=E+)jd8$qOM!5V$1g}D};(%j3Za#8gMGF zzKW(R`>kWKSoga$iE^xuF|J{miOxxcGqq-tk|ny*XjoO{(4|aX=63 z{1;w|wQzSpG{n}>&Vxp%`;FU-92eNFXT~HFViYJoUX8Pya}^|)9qNV3AESoU4jZzG zvlD~L?JlXEI`K}wUN!uPIAD*%Tp2;1@I2|wHk}(asE0@@Z=M1R0y`_YhetZ4AqF*i z2~Xm}s0@~~rqi7(A7iA`{Xhj)J9ZI5n7u(YBqQ7`^<4RIezrib1WS-L-Fs9dT)TWa z_Z8$;otitHbfGkT-Ks$EDsBWtgBaVeg)mVB^{5(stoU#A5$ zc6F@hNFqmg4I^l1I~VJZr0~Z6o|{;W%OTy8p2q4MaT1jG#IMi`srgQF;aS-{ZU9{v zfI!_<5fb>>TgzM3*NHb|0tK$cBq^}$mIae>U@pT+-~J?H9+jheWx!=8_2de-CvYKI zWXWJB=l014#eNyDOmmCfCJ*$>cKMssa5251cKh#$QDQAQEBkmrJqC6@;Z9`SZl3Pg zN2x>g_531%tMpa82)nQQM6w3igjZr#9FN-_(^L@Vy_}R`Twz6qr7Xej_MGV&MQm3! z9;DULpU|Xa4)jU|+5UJ{e~ij3WvC&zv=P|(RVg6;N{T*S<(*8+2dH#Zv^EmpGj8B} zlZCpNCIPw4t16;sarCj(Oa*iJayJGMcU&p*sE#e8c}eOpTw;C|>}9}#-WR!%m65Xe zlm>ba@{DX!JEmkrfN)P1&pWPB6`h@}yJN}d-|$BIM(FD_y%DHEXESS|P{ETdb*4JU zwS2UZ7_sz2hajz!H#U+lql06aXHG^mcXdCgL=o_JHat}D4^Kf??m&!dBFqh zxYGVhCKFNaO`}xiBaaG(M!y1_(_qFbjRs?lh?QfF+3hj$Dsoa2CJ*LM+}&%^YTHcB zF}sT@na+rvTuAZhtoh|t!OXv%(qzQWEG5ZWB?ICFFsYk93&bm(Qo#gydla7}d1DO% zaF&EM7`bx^7tWPrZ`o?tc*v~`*@EW`SG5d-MW|k1gz@9W+Pe&#gi@cB7LdziZErQh?oM6|@bNecakmIiuooYP?1-;;!Z-SD znG)4Rw$i;GUM3ggw`U!F=7crq?ov`zZ*G|qW;bPD1uWR3U~ItXQCO{YkEW?5)j6qk zEeB<+A?5Uk;d}SaRnqyG?O`BI*1sowsaHJ2c396eEqUtMVZCTwxO1}O5W*^A{FJ37 zyb34jiJ#%2@woJ)t|7F!J;hbjb)RvTxmg9DVQvo`6NrlKDE-hd6QM)}KW6`B%IshL z;9i!m?z!set9__-9{eT=U+tH>Z*kW;RQMS8y2i~uZqCxadVmX0hq%l~MIhS(ZqK|e zIKrFUwg69;@h`2AR1kN!7H24;Ya5am=t|C(eavVLF#Z_IlY(H8Ku2#Op z+62MZ$GGxO=#yzU3K0Y| zb5ClOO{fwB`=pe;nPyRqFsQ(k(v^m|3vlC=z1^EUacjUJr^gqIsAelae`YA;!|BXay8(_ z3j5q(Z4hs!b-6gf0u?9NnI9+EnT->?P~rrMGGl2qi?bdG5~AkA)9a?>FA#J7KzLxm z9}W-PEMU3%y@2Hpga=*)vB?ho|FiJG``He+iD@qz9{66-{hksYxPb7vM*B%rNvB0F zoDv>bI};vQFz~B_xcx~AofaNgE8&6XF+&y+JUG9)aquq82Ys1W-YzWgO-vyY9Ccb) zVBdCu@eh{?>P-j!d1>BNnaj$F$yvq!{o6_Le=}xMi76nD#Q#Oasm6@}%v(`XcUAcA z8vWqUDX;D>n7&(-z1un(nZ9#gb@OcZV^WihiQ-E_zZ5%WlRv=c8+U3*88$jq|LuTw)68CxlK5cZ^7TSxE8 zc5CbC%IUitVj80xvT4Ss1cpk98N_TKU6xI2AJwMsa){Y6x*(g@G5RV~C1qX2oJPXe zvNI^%9eq6iVPEz^Az=$Rj8x#Gs5H%jV=<(Ox7) z2{+&4>xR#|7K1#>$qwoBbiIMY1%e!DbSYTBh*ekw%pqP0o_;pKUg*04{qT)w=j&mdvNCac3 zqs#4v_b36JO~JdM<3^uyvRcy zjn+M=mcfm>s@p0;3g|qX1oYv{azMYZ9+>xBr=Yz+92W+SIrYvF0r?=C_0)A)VE=D$ zKl2SLENL-{>*IDY^8t@l0REZ)_`{1unv;_r;v!p!-Wafo-VpT?UKVP5Zhs~>jm?ZE z-QeG-+zHB%pVv3GO^L;{bg$40dJE&SHViLfiT)ZXj2cCr-}!h+t5tWN^YP$DuAz-} z&Ji-SOA&F8cViHiweWCqaI=#{H*d(6QTYZ>%P>k_>lqWDIvkVPXf&D}dr}ftS|>A< z?j09pAY|!q0+I??7E{hjrF=P66}$up%xIzWPWW|e!7^3)O*-m6sZFpWn_$(#>6_r6 zTuNnFR8%=}&C_lP(bQg^EU?CDR*Vh1 z^=qEykha$)sm))i0DI(*@6Lulx;q_y`sSV!9OT^MhvZ!CX)9k}zu?NMcZu#rf)y3S zo6(J;)E)y*viL%$U3_Vg!i=$_#!`pLD41inW|KF9k(~Jb=jj+5c=tJG*8qxE^UD!= zn@tmah)n;N6}+s-*h#+C@^%_CICU!zHHf9~Sx;I|wWhA&Txx#;(wiD6XidF& z8>hde-h7Wy#NTTGDo4pxX~~ybBwWzlNv6i|<3wK?V=(ahaWld>ker!01zlM4V~K*9 zqwN@NowG4?aIo)XfzJh(2(v1~J6}gPWqIR`*k%&Gx_X>;M0YeE*z*SC?CG>MSl#xl z;zI0>DC5|m!P?O2RBc5E^L-MnReKmZF3Tw~ZHi35*$nIkFAyK3v%C>JhwIoUZ)BsW z>Nd%dX~X^YsKzOLM`cdzFOjBRceDY)sv=`CL;+FGR%@&{Fw-y&R{BQgDhULV1Awl! zim-{LBS$$|0e1o2{uyM(T=A+*$Wy&}ft5AY#Y6O1p!ZgkW0|=_k?}$_G45-cQQrO2 zoY4Y$C$mNZZQyYOgY#>1m*2*(yUmD7cnSt zUUm-}BnJ|)f#WiVDl?J?1aSdi4pE0r89#apI@rXoncsW()$wcRr+GXD1qFp(k5=d{ zEaX@dPhp|QBgQV_(Lf4xc@f=j5$YN6OPs=BOiNIFfgYEq2Hq62;@4=NsrRzLh&eNJ zwlz;wTT`eh-I2L)6f?fkpn&%(1bP#-y9f_!P1gzu5Lp6UI<1z5hhFQdx!U(MAMxel zLu|}x#(B`qJk&(8E+=$lm7py|ht9L}->6f*I8&f5B+9YDKK~0K!7CRD z?UaKyav-&($LsO>OZYZ&n8b)s3!e6Jc;#4N&#!>K*wy$PgR-erZGv9JRy$2ERiVJn z&q@MEkv(l(B;?Yddm|iRUfG9PL+o1e2Hwh#;yaw(I_aym=e$P!3M z4#}D!kaa>Jb~^H$OCaO+e)Q`ufh?tZPQbM5saW;5<0A6Gxe(=`n5vd3MKJHn63m!O zFjT}5jE}Bz2syv^oTzT9kZU$2cWhf%7Qb_HE(>&{Z+Sd#%xR>8I`9=9X!0-F~ z-kQwNy;yH3|0ntK#a`;JuBOKspU@xlk*=M@0dtDu7!>tEXB`|^H>DZ#d4rp#xN}?$ zS<0CjxM&E4!QL>+ML88iyuR(%rSG?3Ti@U}XItC-tWa(o5lU5wu7KDfNa+Sg&h=N_ z<7Xz4CH7+!;{o~%?EJdivqUAQ0-q5BqOxR$mK@;xdU30TuZwP4mR>^WS;aQA-;^%f zKJfDbYh8(VkjSqpBEQbDH1EMW9C4j1Vm6)?E~7VQZ%Ae6Q|EJ;v#gs-tcH@bZ@aa& z2X)f8>6_1sb0u_U9k!bw$7d$}EF_C%otY#sE;5yhln`Ay6^;Z0dy=5~tyW}Gpa25j zA_#o!0zqIojY|25`Hf=E4*ESqh_|goTdl&L+|5~4iyu=dZ_*Jv#;H9VPN&Ni!o=^a z^qb6#aN@w82g#$jf-STPV!Px@jD|4kyA(~cc{64yRHb)t@-a(KH;ip;3n5lXP*;I7 zAFN|cEPgooyzgPU4yQeA|4u;{azSC|hc3f|!YgtzKeTX?XaXy7y=_k;X*D``YuVTq zZO@&EbCy&;v>9s8lVe=x2En(+gx~fM)Tdkmle6&KRQ#L+mHccYI(0m8VAPw-@Z895 zX|2z8Q)T+o^4Hv;*PGzMA@E=`6EUTXX)12Q)iGyxE^^9Zt6yUQDNcCpuip*Z%6K68@rkcC0bJk zg#58keWa)D!FySuH~HcT+`(7aM`!{AShFrvBho{qLl6k23Xb0ld`5I9((D-2HI7JC z0?}=$1m}>{V%8j{EbGx4V}_h%^-kR~a$IIbu@e)DsB7LKBE+L5&hix;*CU9tp~PHU z5z~P+4>9lK;b}`XQY# zIZpKwIVY6^HFcH>j^J1+Z0INeM@E?q6yu6ISn5lpGv*2bESvsma*_^hng%FR;=|H@ zKan_fbz*N7+h_J{LFHg4_Ro&Os?ITE9o-Vhj!#3jQ$bc5;B=o2!TNN|QfvE4D_D=q zOIqT zg+BjLdhl>adQdJpC=mi)3+!CWrcA{Q1a?-*?ZSFFA1}z9nG1=A=IAt}nUf%+a85$Q zNcGpXtx%XKC?w~pHjhX$BUzkFE>Ov~B-?dup8Q0dbJ^vZDk>j+KU9u z^o?zM6}lq`?(Yb~bkp(RMrWI=JK!W!ks^F~N0mlw9vY?SbLe>Jh^*4ls%=4I^>pn; zWVzU_U9w50>B{|7&f-SenJOQrBu%H|KDY8saAT5~t#q94oH=!%)rgyr8Y;na6*#DU zvUr~7Sgw*e3-S|2WCrpR{IcW9Psr-Ea&@qSf!~SjT7b|xU9nqFUV>XsUcxETrn}2= zPYyjr>;&sp2-aPDwqRX_?ES$xaKx3r;RdSHoJ2q7as-yt9A{EPmYzivBrDWvT;)Q- zliy+clqGcJ6h<{P%6He*3h!d^;vCWl2Da6Jj}R9NgX=;mum>e&M=Y~@L?%Ri&11M@ z2bsiW@@aR?a{bup$;Na8PE{|9La>0`)of$MOze=24Gfyzqq64_Blc1DH;$ZsbR;Ia z!6SVmZBp>>b6yY^&EXynhmyQAPf*LLlcm%re+n?fv*{!+5%-iF;m+2z zxY|H&b1c14EibaCp9$0{B2WirL*SYlIho52-b$oz==9uZV%N*;SC{-Du6G@KL?Qq= zmP2tpD3T@3)Zd2b^|edQzeN5?jjea3!FW{*{%}8lhs|)T`xUpzu9DHUdp*hb@2yU9 z#%M6z=mXc}weUwadYmW+Aj?u4)|M-TtAUH^tvwso7I-pCQ>|-%pLrL>;%)7ek!45@ z-z<{c94Rm9ZMk&nqN0_&@>mkU0;(G4Gt(y{vFoVvIxneRTCWRHzi?YzL#6W#FAqib0%vU_ofj+tYZ<`ybi-a= zgQ1V{BHeI^JDcB#bfKJ8w;*}FI%|?1FHPW_t%8xyxc;7(U5{7{`l)xFHV zPc*xaQSBjUfQrjz#FR~H0_c#-?)A!psmUn=03|tIrYSXfqT_55x@M&&-y|G(aEFd5 zLcIz(rnI0d%Wkox=&%gbT= z?`Wn9X2dxcumR!8P_0Z4GKYO?g5)SBhm6>LJ^i$uV0ezqK(j0q`akO4X?6h>^^B~y zc5i{PbT3gG7()D-F_#r`${s=TWU=}<2TntjEYWNwH>vYcGMo4Mj3$+rndH2!6`VyN zyF8I8CP4+A!_-wxXG={0<9_OrV|@Z&8L$R2IjM||d{!dk@L}~GLUFB8n^oDX%GXHv zydajcxLyBswjR+?YX8hxIyyW?8OG*V#f@z?tQganItWDZ79Tj96=XPFCn%@uh!=}1 zgtEV-h19)-2d6*op2n~hWMsG!9qs2hhTMq#?kNMpA_fBpe~3EBp0CZwcv-&S%6QS0 zRV$#)DB*1~pR(eXi9o9KIf~dytfS$dbuybS>dZ)cgGzDXQqYibKJ+uJq*a)xE4;dg zx2`l-RCRK?HDXsm@;vJ9HcH&~+-27fv_+2%a?^)doDr;85E0&MUuK8lrnzUaBZ;5V ziPI1SNZ#O=qvW!1D?<(!P@v4q9htT(q=GDa28gx~JZHQO>QI zGG_PPsrlRkAC&Z;GnmUnq}P<8QH$IE$af^Iah7C>;EhhKi4<@;)_xTveBuet91|5} zhRqDelMGgf+Sb08669z0ISn5ZHw%`=iS+Aye0GAfoUJu$C-&*a*&KJUzzXEv-&7`% zf;W{zNVaPgqCIqzx^Y*Y=mG(+N#p&d=<;k-r*04@yt@0umrq?Vr zBdiE|4KY=Az`y}A$YFB=(9B&`wIxZfSqrlWV#)~*7;{o9^t+4r$VKXxp2W&@WM5s( z{ue((LlMgEDsn*VH<3eZYR$+ID}ufam2#Ph5E&^qBb?4(k*?i`TxfYYMrtUsZ>7LA zIl`t~KvM4N`)*S#u8OniU(3zpCV-z1MXcYxe!97d>R>q;?x3rqSBp5&xOQScs(1{+ z)&`oJ%*?W)71oBu+)nH-2gj2EQOb+Mtv#0loFR+?j6EoxxGT|R6ViDr${8FnzZQ>~ zox^75i2XyRCtW)%qpN*PZfd{jn6>>#Lo5|$^VbGO=Po*cd;MOs^IK-;!)9ckS$l|& zJA>>oGt%dj#<+{e={oo8<(@@YdBF2rBP4M0^?anMm^Yt)K=2riZrUP56cCud1>&Jb(1|9ad zq*#P^RHB)id}g~ojg4Yg0q~Gr>7i%}1q4F)|Yb_b{D-%vu*Y?2(M$iYtKMhT;9m?Rz;J!I`v>JvdN zc`h4ZXIqK=J%)vLXibT^hSRhMh*iapgX60^Z4LlR6p-a1&XtyNji-K7s5n6~icVGb zI@^NyP4J3L?xeA+k=xrzt8`=r2mp-O_2!z8y%;hF=JlL$ z8pAsqv#CTENDH@7CVYHzOL7jAEfvaSLp{JJXMPfeCY#IfU_7w%EGlocYG${FpGKKD zktqy3@|t%%@JNjhC8O>=;FV({2>BwV$a{d}x@!IMLBnI2vcMzJXyM<|HO_at8B~z3 z0oxNY?U7^dw-duBWV%zZtPlT73z!XZ^mJ_O4~PtSe`c9OlHSZSas`FI|U z`K9dimteDHUoMs=PbtgE;@PtPs%AGN?%iS|$bLjNTl7IGs=iJ~@UZ%b?39#qlE>V* z?Z(W-VwNdoKE*C0)0vtqGzx)YW*%42H{5Qm) ziMlfc2SW&NDmNR1gVj}7O^dlzUjzVZX9@dKEbK;PT3Lu1CJAA;ZuT!JUUIXK4-G|^ znj4mxjmyoJ6?}{2CF5L{uu>>#e)!3x55;JR_7&3NptQ-1uHdT#W^@_FQmqx5f|o+Y zo-r}DqvQ}q%<(y)v^umXr^;Lo*^0Z9(JVYQyP*3?ly%`@37op0aHUl3W3mq>OS%^3 zcnGVIbr>l~82?bDPr6}t9)S0W;2|F!k|RTMwXMi5{s-L%>x9$R$9mZIxi4wKJ07H@ z7Q4g5*??BWih}3P2v#Y-wI9|K^spi!6*{%S_Bron;pFVihLQ|6TormKVx7(U4wa5) z)sJf6e5by1L`!n43*k#JVXPp!Eu9p`L;DBL+`fvwB-|_4B8LU(OKMp$RHMI!>N2Z+NETV5}`n0dY8O~m$2I1;1xS&~#12_K#bL2)GNgRV+dOcMV{#Wg*_&wT5 zPSA35TYP5Idxxo-%vMfysWAl3_!PaV?8o9DifvpX=N0m z?UX=DR@@T&B((p9MNtkEU}$PS#o?lN3=D7w2+m>U2-?>zpofSSW7%;Js1stQs8JS> ztwCq2E(7AK=F98$A=~hBg&9Y|wwGU`JtdS3QjPd6d#DG zj;hp~PO{K$koBN8xFPNPPSyI9FYQZp7KUr|u0nZ@URQU(9*$?nXhc1oPhn-lq8c@? z;9zXi!xzr(@rB2?7us{FhdMU5Py^#VEDHuz<*)~Q6cQ{v)s%4o2Z^}7Hj;{dHPvi2iQBh$m zPA}hX`M+&)rnGa*xAn~69iJ_fs$gMshJgAzthw^s zbFWVt!t9Ged!xUqPRAcd`Zic!_q}DTKbhIt8^QORbhZrUo&F~IoXw#_EFmsJ#ps$p z+e`DV3V)hk%oTB%IK2^(6j?bP31a7gNHy60Fp!3afrL9^cA>jNacW1b@phd^&+c+9 zGgmwTI8E^g%7P|2VkLW=lBy9}bt@G_5x=exa_4Hd|CL<|BRz9{-81zaI&`RRl|&k) zf#2OFJ)GC2X_v{LUXM!OHn!w|wXfG>y^iKx@N_e{&8Nif}~=tAFP>gY-H7pK>|?uQ+IU zU1dK3VXVAwq<-hS`?BLNre5(H`jTgM6|cJ?`8(^tz_9KekV}xuQ>j$K_Hv>+`SuDnc*`tJ6phP~bcIB{vDI~D0kF86WmkZX`XEBW2dZ_zWm>CEn^ zXV*Ho6f6pc~bieQbPsOg}hukrgbKWpu0M$EOJ9pP$owYiRQ9pgIAb)4%luE)4ea-HNl z#dRv}OEYZEJMNv#LBf#%YxiqGKfiK*kVVVpgM;_UX!Gygk!Mrr<4Mo}6uG=<O$vW!zF%Za&^{=VOV?$1eIp4#|Aq{oMEQ8|Jq= z>Rt5Au65oGRD82Q?mKzaO24x2XXfZP1*!j3(BG4n^S-=%^q$dW=ju1!)PKs120kgy zQ+Xw*dpVt1$!{&c_55z(cN@Pu_}#+~IF|wEGOi)6A+DJIKU=~z$W`9^x%#>4T=`z! zXM9{?^!fAR!skBfyPw})eve7rxp|3t8GYV7sAoo-HwTQ3JZ{=a^Oi@T!Wmik);zw8-6DFgBq%DT=U*#o7OB_rlcbr_u>sxvcyL8 z3iQf$1K~@Y^~8a8(p)oTVY2;%E-TXe)Bf$Lj?eluBhuKAzBB0D@>ySV3pLE) z#Mt(gHW{@KifYCxGX zwK8Q&rE-q=un()s^k$WuTVxyL_+g99d07l&e$4(xHj}$8g?Za&X5Kl`SH9snWglZ{ zuiARMu`qY6+RsUFVz=`yGY45i3BX8Kihm2VM{h#518_8;{rZfueXao!${ws{X=P&0 z&Q?z-M)4VIy#eB&Ryc4d{zQ4nZ{HXc8HiOktdf{wU=za)T$}7Zcwhrf$ua_@CD&=PVjdN%2pxfJcHz$ zS?H#7(tqA7b)*(=mAI7^Ohc@}-69doH*_5~*&XasLgCfEjzarC@ElkB!SBhAAUlK$ z1HCta`vmWJlOL$+DoHk{y7>BW-0qTnB_C%F?0gsR?T^U@dh1>GhvZtlRlYnP!8kqU zv6~PWR5W~{y^9vAs8L+8RgFQZagM67&`xCEzLb3%=zWGeas+x0aKqPj#S=}P-l&Ef zvcE?ReQF=Z1?BN(2U3<42=C|!f5Nxp9%~JluUl)NX{7(IJ48iS?dPlDDo{5v*|ks( ztGrqyzg03sQM)G3b8073L%yoWBym!;$5IiU?+F~!c08G>P&zdJme;F7Y!s$8Iw`s;jxneU-OZRsvcNbzplH07#GIy`e8JAfoeV({@fzr5w(&V#V`A^w%aD%A6rZ4H#YZsMA>a{=**<*Zo}CJqnfj}aSFu>aZ^m~TS~u+QRy^MKDU8_hb?|9z?88pD8Pj9vQBMz zSt%-_2)jq^eprrGeHU`C{jchFD}u274|0oFWBXn9-^wi>=rvp2jp-C!qiudJS1Dl1%M0sOBM&y4}6HYY$E+Q-PYUHRH zowDDh8Xhrg?y}EUx5MjuK(7$@5a3FC)&TI-k>wdG>SEht1_R zI@&~AdCHCCxv6%_oz>IsmYbbwhXiw{mAMN+^;-c^lsp1NWa`x*PGDz}1_Z+cJMZMq zT8)QQVCU^}+u%=k1W`EfVPlVu7?H$VfuKJ-j`g4kv=8iDMz(|}ZohvzA&UDEUU@CQ$PNzI8Q^e;u(LUQpNQI-N zx=MV3Uge_C_u>OPA0`Vi7LA!Nq`LU@Nw(JHHTJhLIk|2tkb zH38M(NF`b5Aug^3Tf?SR0-w@)`1>Eb$(uns2++kR@*K|1}XT3v+M2 znD^!(c~fX_6sh1e1=e784IX{=xMGwLLhQ_Qm|M(Qh3U%qYDE>j|9qLLI%jLhUP(h| zXrZ!yMZ_;3$V7uSdMC|@xZ=9+daOF1cYp7*9doVa?`46u{PVm|c?Vji_hKSef?1-u zQU^9DT^c=TfTRVNJ~CxTp&-otM>e-uKWQed!OHZ!AuJ$S_-FxOsIx1`(cFZZo=`^c zd8j&8ezqq#RILtvg6HCUkHXoxGKPdgxJzkBY$W3t2d_&Q36K5#JL$3XXRYO9eEEX-ny`K#16pjAg z>Ok*rL&Mkh^P_Or~o*e1UsI=ms2|H~4Ujh}GNo zive7$fBwu>sS}QIuJyDvIPgYcYIvdLPd~7Uqi22nd^!dj?zdp=)9dNSRtDdnMCJF|D zy1H^=_ri5MUow-&2qZH*amGBxstqr!d^RIXhLt?R2M8L7qIsG0?i1x5XLX-w-!U)n z_~7pDm0)gaI3Qjifya05zm3O%NxpAfjFvC(=`T@$?caO;iA=TQj@fX?Y&dE*44WLz z-7sY~ygb@Y4k}97PXY^Wbx@)Jp zN3V2K3PzVo%85TqEL+KuRFbV^^we| z*)Tr(Ya|^hexWMCNgk^YZ9#ZB60N=b_SKkdB>K$KPbKmG!P4gxY778=%A zT9%jIxnF@9ZbE^MfFNZe!XOX=4euznW@BKBBITA_?ylQvTI-gTl^K;KhAEX>W>!?T zQMomQwU{PUDF4rM-gjUiW!vxf_x)eKe_nXzob#OL+@5oL&K*K%dn0p{D$Ml!Tr4O( zKbHw(JwGpxShI!j>F4C_4>7kriuQX&jk0|WS;gtyk)FE(wC>TfW`WKFzPFdbV(q*m z_2Jdy@fPj8;}LtB&nDUfJi>UkCBQ8Qqa5D5K(+2lf<4nkoxfXsLz<9#_Tar*wtSD!R$3h zBWjPqRK!jsz6qVp*73D89qegVB71EOuQXz&)$%5-%{9COmzYlm|G9ROqy1wehD*^9 zEMB_x%+auhoI1R<5YSi!ID?&+YV5qE2y|Rm*WhBR*Ha>DX>Foij=tI33fU>Q zjyc5z#Y8IlgJEa;*We9HD5g271mU{B6l!&+pG`U^7cPs~$Gz)i)9`1cWVSy~+=P?@ zENt7i!MHVxIDxgN_Iu&EJIwR*5<2y_CaJ ziW-s{vD~`|MFBfNAg`?c$^*9ogoaMeJz65d(JBz+lJ8^DdiJ9W8Je+mhC3V?8PM>` zi(nKuoa6lz?MQAr2}U*El89Pja*a1QqV{2Ez@}PKgt=4!YtO+AuJjVGhol<$23#FV zI(98+I;_+7zuVou8yGS7S(hdhiGth+79=4MN2sZ0lXL|;Wv&oXgx#V=Yvmom zY}cri>+M%lexO*vdm5G?-#h}U3Y>lmo7@gNxfUkj7dv)Ql)}6%gpb(Q^oNcq-n~r! zLQ}{0eFS)EgE?&T{)JS{QL+&(Uvu=X%T_|Psv6VPT5}W|X1YEmPS^j0(`TLaKT){u zpqj5S%i77^i8DAX_t|-{uKI(ahukXHtq#Q09S$NJ%m)K_Sk>IwihB&tfJayvJ=<&(t~q-MN0g8iGdd#AHjCP6 z9U*6%1BFmvmC}M>y}NCi`@}T&nX}DdScViEq3lwn_cAI|2NZ;9NcsjX6Xum2UbTol z+l=aSwpr%qg7^Ltfx`s}#JD>i1J+fPcC4l~RO9SuPy+mEaU^&j73HzqRci4t4;}k! zad=xr*Y$_yAZc@c==w41aFQ#qHy~n9Q%5M)-{jskkhidsg~#EN z6u3-8-g|3vFL$dr(8O#tV!CP)#+OlS?=&_pMtXOmZAIHv6Wfbjh(vG~&BM_>8)5a$ zH)ZF*#WfhEM$@P?;?)s3$#50z@X{$cau!FY~NIjTvx#+)DEo-*o$Fmb7;Xm{5I#>10#I~=riy@qCh z6Lu8UfW9@0q1HFZbIgPH(MogXgVr~Q>cZF3 z|C{R@j1#?-;5NWX0QU_1_RXXJkF9SkdKRIG>l+GaFS5Q-jJO~lh9X|2mc5ecOBeDLm+?Zj#_*FKCC9nYZtTx@ z(|PV9w6(~S{oTP0(Q9Zd3*5|LTK+4q}w- ziKyKV7Gjxzyu`}*o$`o#z5xb%WN_62HW*@$ktJPGbse;r0bUn^=MLN>aZdLj7jCPQ z+v-~yeovIs-o#`EqK6A!yG6Gc$S0k_bh2o|QPiMbEsu?#;4^rf0C^=KsT=1>af4LP zG#u$mQn=RP)B)il)@(o&=m@~#(%^--P1&91y&739<@Y3L*YX{9G1D;V-*Jc@&!Bxg zv>e|b2)sUn6hTt#_-jA$W|BAZAt191o?ahB46@;jA=XNa6YvrYION?8`$JqbqTziO z+O@`xqtlW)*^GW~a3TtOG3`b0{*a4mf=&}s;##|02(L*ElOM82kzL0a81V9SBrJfU zz7Mm9HTg0;7r-P8OE6Uh7j4C&)k7*|n8c7u**cW28g!*wJ;=}OQXIivh%LJGK5Yk% zQrg7A_c7nk$HORQgM5r1K}W#<)+erI{Extn{g`%9ZR4C5xUJ+;Esj{?0XAv6f05QAb`S|xE&Q0mk#C7 z{QCpo$sz7~!~o6Ytuzse#YEgz8QO&FD$=mVgUwQ!qg|)4T9-IE4C;Fwc5JX)02}P8 zBHX*}?|$;`H}AHFzTrO8bsFQq!pTvf!1_?vS3&Q(Mq5C)T<#ia0qwGY*_xw}a&N&l zO<$H}5~&m%^N6rDA+u@ z7z2 zuhS}uqw(WSpghkl<_R&C5Nd{4^T{oELyI<2<~36c*0R{(z!@Tt*IXLz{gMV)q_JRr z-Pai-A$UFpmpuv;;6Yi(w`>9!i)_?|V7@#hGdl${vzX{guJOt+*2HY1m2}tFct;3P zDS{li-=0hz(8P^M)js;^h_9cxfeiH1p{t*`i4649G1aSUr&;RWWe#eE$CAVD+?qp} z6}z%yV*SMRL`grT0lww^>uDz5Ezhm_IlztME&F_7>=|AO9nFq$#~e zz_N+=X2N4oHW%$UC8Jx8OSrm2@zi#=%zb%%b`~($?7Vh%mOHgRd;X#1`Rn1w+IeSy zcN^-%H=)Jax*0z~`zJR+@;?XR#O;=RmE{cQ6EDj_Mo3E@2vcyBXDg5 z+kr{pe~g>rb5Tp=*b%vGektA(%gybelQq5X0UMgjsu0HW=<0}SZE}_y_llfZn>=4U zDA9}(E3XgV4)2+0VRFfG@ci1?25V}A^(Dl@a;PepUJyOg5SH2yw$8Gj8F39UPW?1* zB}ojIcM0LB_1D+L?1VP~?n%WxNTW9jKU=qefL3Xcs-oOHpAn>|JujgIORj-T!SD#-F6Sw*a&2OfNZVU`enAi!`bz=+xpfmr<$g&I+N z3cn3&79c;^wSm|=C|(r^2bW0r9i6Bz-geZg+*}cb_d#AEC*DG|YBo#_SeIQV+Bm#( zfg(AB>}$N1(x9O3;_dJu$IE7pF_*H2UVp&VORGIt4FP z;zV!Q4v#Q;@;NMeb&RC7u$s59Pl3Igymmw$9s0v6tkhay7(z_JOW*5G(XE=fCMI*P z5~Q^50zdK?KXM(}-brW@#Z>0fdr>K2XZP0#JUT`+O%V=nG-WpNYhpsj1j6ECTigL4 zjK*UUl9f9!v|D1@E^vaH*xY0b3v=aqFw2Qpz-43rI3@(rPzsR^^cDb}+l;eLrirbP zV(@ffd~qkLvvi9p&ctKcQMVmMq4)&QIES{TX&X@rj^bk?qPU6FZO2In`e0idl&z#k z`Y!D~Qs0WhFQc~-7KmV642wf-(!iBe9F`;BC^o1i-9FKUskDbi-cj1HeKPWut7np8 zjwFCahytj^Cx8wudtMFMbAl*)j_#K|SKy||h85>Kj++Z8MZ<(8Mi(_l5*?E^vSuOgI-&ER=Bq7H74bbC6$S}ht^((T8{0> zMWW{5tUyR1k|D3TPO_!obFd_IM>dX%qKHOz9YmAL(Y8zXNX*T+D>^2v8<9+VqJ=4t zsIL?4-5vEGk?q`?FN1_|kpQ+g+~huuP!+c<%xe~R+6rUIsd({|wDy`l1RznQ{|Ayf9Z9`HN@|#xRQJKPmvuzZJ^2t9F6$T#9pVq2 zOmmd^scA|TMq!irNboV$-Hiyl*ZATH5x?eS6jht?-W=TALE_Kvskg;}i={&QiE+4LCwvO*e1T3}r{A0%qr6*6X@UqsSg(%qM+}-~df;ug1D(VQEJQOJtb~fT z^!AfzjlC)4$U6dwWi*(S7)(=4GaVA$Kft}30}Jp(P6Gv5R6pkIYuJV&mI1}Ojlm}o zNZp1-lOU|&b7#Fd(EyK8(+_sz>AeSWog_ABe^ zm`_*MbmzM+sp-CB`DmYaEuMB|N1M+xc=ak|yqcIws&nqKrRTg+G`(^tm=IJ}2J8+x ze7GUL_m*aB)zqsxqT(WLdyzwL9UA!eYS6YhsHncSd+g-j? zWQVrakJ?AG5Lhnm(!7Op3_sSK>ZJ*ZcQgmF5`(?tn3HfvPhnFN?~xMVmg6;X)N1zu zoCc-IruZIXtDr~j|I2t>xE6iK*I3s9Y8+6wAL(yhKI|?P|hlRJ~AqIr#baynY z>Rp!~h`^?<8-cC##y0nXb@m`cB5GYxFP4LhZNg_A&p@QPC2!qp?eC#%HO%UTp}GDL z{i68ipespNe0dG}6YMDL(lmYlRM$sAZ`Gg22By=GtxLvzEaq9b!e5Z3rgptszaO0i zq;m8<@|>D?de0_@*)SNxU5p)aG+&qL-3c>B8{@2KaWH&nG{1!Oi(} z&o|qXiD~Z`M-paEl5=t}2bNjP!2xUDXlq;{SQ{ zwenCf*`syA{BqKCT<^oM!7j|C$gN~s(;euZh^?=Kc0!9DwbQ;g*1*2UJW;yk ztkK667dW)fyu%$7bn8b=o7{$J4yAY}eSIsgpR#-wQM(z=aCu{c>~ir8eB>L*Fl;%+ zr4`3%TVe;DnWjyMxRmowhN-{xgz3)XLJ_v&9v4HvB$Urzl(cku@QtkKESks)Jg4by zwR8#Uvq|AH!DhNMI->Sj1Z;6f--Sn(DQSb9V8iH|`#?euueJ=@)hkWLG|2Q~oENo- zamGb%Z7j}X`{ImC5NY=&LjO$IosB?F42l{eyczMy!877HIUOU!$Yf`VlZ}+BHddf5 zT@kgnv);bFj1-y_!B`THm^9qjD}>WF87x1XO2rPI(=aS_2Ty}_bNy>laZ+BaIFS$r zes9e}PSgG8?pV4w4T4lQD^Zw$EfdR<4E1Fq+2Q2{DoGHzilvf7f=X%N{B7h1m6pjk z=L?^Lx6%}=m_=f4pr(?W_P@XZD>NivnQo2hD>PBKcz~^2;Eb?ep@|X;4R+q)pnm~w zplPt80TG%1uA^Aew-EC z^X}Qi>;TU~VYJ72o~ujmsY^On8rTuyah}7zq#l%xhIAZ_paZybF}vJDLP8c=^qK>7 zjv?@kW;}{G>guF0sd<)`35^$DCY*>xzAx}pUH|f+hHX(7n{4kHh}hC}#P@Vho^s&w zU=duh5vR50JdPsNoDXzgis9lMpmE@-+nWqcuH{g!5S{HclOFk)$nw6g#q9>q5c;3t zd;LLLBkT^w;Fe9SG=!b?6xPW&deA1vdzJ)C4B3gtzTSk!+BL$&9dcnj-hlQlwn460 zT@=>!vj&?lN3iFfWCM2>v-XwxJGOhiA-E9*tp@wj-IiUw^}T42XQEeKckL|W0pa`U zcI$)*Z+Jde2JV;H?`a!gM5lUmLQ`~a#H&pm)t$Y;wCGS1LyHXDU9wWHV_au%IN`9I zunSKI9g?vl;f*9{Yd+b4aIU3ruABvV;d^YMHKO6f2CD-y?@Z{R8k>cW(e$lB*6#9v9W%4XM0^yxS5oHOEfexw3MZFJ6 zb-zzn1`8o9R99fvM*|W+n)$yU{!{Ybk^~W|Ueclrnk4r`Hd$?tSpPVA+ zq->|*3O4WWBT>FI!1CF`JExe~I?bw3oYl)FsWZ1@)K;pC>tyqbtXlrV2TJENyW zoBfpKpnF8b9^B0yj^A?;d(wL#xQ6a$112U9LYjr-rwDDKkv=xICSpD9bF7(Uc74uP zf#kI05=84k@~+Q=-lOG|-YJt&s~}6_YG_=L&?M{n=<+wNZfTzzhg!vO!CR1c32Otk zal`j$PCs}Bnd|m?7h;|;7t2>C+MmPoOpQm#?j^}CzR&IbCTy|f*53OlPK`HmXFwAy(TH*Q3Kq;8dHW|mZCLvepH|WSx=$O~ z{*q4{)&4ZJjZ?|HJ$s2io!(e6-qnPAM8aJ!;bY0GKFx(gqz-n8v`8q8$xy)$WGB`_rrG4?pvsh zO=NfGWeSsWcGXS5brPn6LMlAXN$cfjGbn)aDDQUtqUx1rBn8Qe9_C)~0yvb}_3o$WJ- z*6|Z)wSBa&rU18raLT?o1T*>*?dP^q8olj5F!f~nw@@1!iS|sRFRdRDuA6XeeYn>N zr~DbX!xHXf`!mds&i22NT?*Ol>ZAWX;i?I@88|dQ!{0CmhB+|Ifng2|b6}VQ7vw;7 zZ~*rd;E#Yhz%_tkz|DXZfF3~K30VL)0dNgK4~Pfc3@8Jv1k?fk2-peO184!X0=fYs z;D*3Y|h{gL4GXc?n(SY+fnf@K%AAlynvw%kc z8v%8Ig`g=1+z7Y>Pz%@qcpQFi2Gjy*qtODuY(P9f3)l{t-GBpt4*>LGLfwNcE}pH3 z$~XY#X+2mb@`M210E`4+RP5OXz;194PH1|t_UCy7K<-BeA>By-dO$SvQvq5)JRl2D z1aJXX0_p%80owu30$v5Y4fq(KgnKO@9xxklGoTc32jC0XpM<&#@G9Ua;2(hV01kP2 z2KMwlG9rLGjJ!P#_>S@z=19QxfJ8txpcJqQa6e!-fWD_j25@@;Ct&Ud$e>q(&!Yf8 zLH`ZlW5An$>3}G}7QnrLm4Gt90zfjr44}^jw+_lHKrw*6TI?S509FF30cC(ifcb!b zXCJBH6h3f{;S|pRhVt*RtNQ6LyP8uN0spv(Qxv3eiYunjc4?Fm+-^^*7(3EQ-*ucK zU>2wNa4M(x1N8j$oMJrG1yG4%sBp=C=3gKDnm=`Pj3I2{$h=yE z18izeF$1bEt>o{KF(RJ^$CuJNtq5rZTqvz%KL&PJ0LCYB3NygRi$8%M-#9r%7eEI4 zy$PJ+6F@V}M*yD!IGCR^;cy**)F&kMYT%0j4*)iU?r(rSfIH*y5Fel!;D-5bzo@HdO-<^)uVYaQJF4M6(4V80gd03ZYYlmpfQ?gRMv=HuPVzzJqCt(4x4 z&_54&3(x_$7XHryECoCOpm^rP-`fCg0GSCWTou#=;L-s(0OIR&M&uvh6oBX`jJY~a z@i@%80H2IS88C2)?t0`uc)1JZT>#VqQh}cjSONG0;H7b#;=4#rk$EYn_!+Q13isBH z$DSs@R}(nJ!OM|{(Wq}%aEeC&Po#+TWYH!4<<;S*w?V%W<(bMc@26M#=@rm>BpS|7 z-#NA)-v)iPL~{iCN=e@Yy&&m#L0=~6xA^HdKwm52JzWxddFSu0II7ZGa2a^$Oru0@eb2bv*_8d4R=$UsKm7fo>+i0`RZvKP}-DBY}$q zP+fly<~G2$fT8O8PT0Q)I0*37^)=An5BLj!>iR;cw*jgF|E{jvKyxD?3-F)T^{e1! zIzSH?s;C!>!FgnYN+I{3@W+Hf=ccZ zp^`fuD!KDjrY2F7>@)k+d!BvpncXivJY|K;C|+zOM=^w3VcoMmrEWy z$P9s*+4$@wQM8|)8WVg??3YV!GVgut@lW0!^XD%S-c5~jw}ft*_qgtzF?()@Iqiei z`{TbiKN$A*m@V(Xyl7No{h;{Laew-n*e{nnevsMoQc_YdeL9|V z5V3Nq(J_CdoHOuzjssG^Qb~&@oP1I7B77WISy_!w4hn80CznH!`my+YcM{!(M+MLWx5kp2UGj;YXKO>hoC*7VpyC0LG z=hepWQ8Se8^8CeRPNh(xEGaJ$O7hD}?r=KV zr?LoPmsKn;@pG6jlvI@WyVGCPU6oKcggYI%t8}}Z%4H=k!JS{GEOM6@kl)IJ{IW6@ z0L4ptQUCKQ%AM6E!VUQXDN2Eo*cUIAiQM(4yQ0zwk1NWnD!_+A=dzLlKU#@L&gx2M zf#57;oayHxo?X-PD#jl-LX>Ehy32$Tq1ffjF9e4QZW~O0alS~73iE}0L^pg?{^Ifq z*HSQ`(p9mbfl~o|P@+Hd3ijs1H6$4-jorNMl(@P3m6;%~Qf-<|Lin1zU+B9W`R6x^87Q6CY zE2!*_LZS4blc?NI8a2uxCd!N=%*~uRle79#S)Py5?JmEqykdEIEXU1q3TgROf*nO* znbT2G>8@lr(VSCKURbf5OLtaPC?~ z=M-uH>7RWYV+=rwdFfJfRTWo=Z@MxapOQ2y@Nwxk6y5-ZbEI>e9gyfOa4uc!bWsqq zE0*=?=M)GPgwAwU3O=OWy~JGw;qgXy8RN%|C@(!hgy2)+5=8XB+%7C~lX>t*`BC%s{yYxVN3T46 z@$mLa^amw+3d=DBeXAc`^$>KOeso)gppzf#k7vsebkU$ACQO#-DW2U!&>Q{elxHrU zeuqSd{)|f*f=&P(g?|@R3VR(?%8TDag>1!bfl7J%1XSWX(QG<%@o<~`=$eM0JLX5{ z9fHp5N2kD2JA(hkN9Cf&kIpy*o#OrebSxTzZn7U;-4Jv}iH>--YY4hD&{4#*{OH?; zpf8r_DiVlSD^(yJ!fyouDJW?v~WOe*SM7!rc)+x~3uMPDpeV z4?N9u(R}R&9Y{Ft15uSj^_4?q*TvmM`_ZKgLC5>iRSrRy;zze>2)Z&qx~3uMJQ5w1 z8}ATw8$n0O-|R;p)qU}F?~>>n{peGMpg%0pACu^*oK+7&@AdO{%Mf%ulE1PK#r&dt zJ~9M-6zHhDDWOsvruw;)|9J8AT0sYLE>UuqCb=WN+JF9mVrFRN~_asKkqtP$>`2K&AG) zM^a_2VtNQyIfTDapaTh~gv#;qloBf^L&UM}8L%LAMihAmMiV`MYTd`WDa~=ph&4Hx_Fzm2DUVp7&v} z7KF8!-Jj!18b7*dtiwzNU6vp2Ra%{x&?;8IXb*5qlX%^V}m$pWzfu ze_^I%mlLD8#{*LPrce@Gm`uTJMJA>VFmb`ngMVdC!8sUzIhRmYQRPg@FE1=}azD{n zH^J?4VH}>tCJ<5!IqpgLi-A8)B{&N)hH^P+oR0R>AD>#@hyNj9j$5d73oHehf(xT} zJBQWXoRUIkLUFz;t0J9dDB@QLPA(*g<_6PLgvnqVVoZLqNKLVM)pmGKD z`vcOP`OAKhAg+i@qSy{jDE9=HT;{GSPAx}xZpM^^`~oc3b@`s0f^(BO+v%zTgOf1s{}aoL1Y{W!hTR54U0mT3 z9Qi`A=*2bt{)!xjue&kMbvk`h6~7P6!~|GHQHHas!tE-6KZgR+FyGN{-o_{&_HnS>&b=6rT9p`|kO@8(vdrNA%u^B^LP4=Kivr)SXPgozRqWgiftgMrxuU?0IE*A4N#DuxuB-&b zF#`piyM^e)85u_fXlqgGizG9pgX8A+Q>0a}a+%ACIVO@3!=7NN%#;f5>3|I9k`iRP zE1@jEs)})RXW;TGOq`SpMRx9wj2e}us={UGykd+%NJWH*??oIKKc$(Xu@wKCoGUT~ zDkk3qIE2)47J2Tsf%D2yl$fD35JhLXByxcpDHwWAFw_j7xeQXV@Ww`XTY4IqAI7zM($lM>2^$}v6!q7Yk3v; z%gjN68E8rJtDK1m+&M}u)H^`43{$t5ICP3>c^S2^(2)-oaad#Pl; zhs+dBa?Hx{GQ!MtJ6$WNw1N!zQ0j9fg<((3wmW>0M9xI;M)ULYm>6-5;*lgn;{fG0AYEE}(0~r9TN3BFm_m&o8I;^KA-=nox=& zDz!6zDcZ~&^p8$fp)-Z0+{Z*i8J|@lQ4~lq0e(P4D$1Nve$7csvd_!%mE`FGSp{Wz zV)n7#vXbNWG92~E=((8Q7dJE}urCNCHA^3tVM4J+C(2bY`Yab#M3{@p0cJIKFEh_87y2mf8-!6qZlHL;XXe8^X3vU=OO3X$ z-%icdOKz(q+Vum>YVKA>jsA%(<6y?!=T{ciizpX;=1ixH);YwQk?(U=m{jd7aI@7C z-1AUSX4JAt^nC$Yx8(YyH5hSAPyxkp#mkiqKp-X#Imx4{BjaA z@(X8U=>=w_jn(Bji%Y3n00s>Z>$9n#fvdpGD|ZdV!T;fJm;=Kc80Nq*2mbHkz?war z;+huh^~CE8zA$IJ(67J85AU;gU>|h~AS>6Al$ILLiE<{bf76Txq>73R=TfYH6Mb?8 z2F;QY0xTB~Tp}P7pvb*p&s68TV;&rXHOni)!#9(kTmkmCD7g~sbrG-;*Tq!=oRXgK zRj@4tCLh0;@5IO!I~C|UN^S-g`jve36yr=IZP(=HlxN*$7X-{ID5toUQws44%0BA$LIK;a?oYpHBmUA_=mo#K#C@5A?dFL)7L?LN0B6riGgIW| zON8BDVt*sgDaK(B_MZVh_hX?ap#8Hx+)yg@%=9&}UoN=?{-TdoVna^WZES}|i8K#Y z;e+h29b_K74{q>2yTSYN^H8Q~^989?Fsrf8n4)f!_Tf&2o@B900F{I6 zru*4J+xPk0`Va|Rg;Zmx-avrFcTDn&%Gt&8JA+H&W??*^$z@^mp3B^&!>>ZN(~MPN zF6E}A+`NQ&85v2lv+@$=%uY_7CE^luXXho_v+QuiXdFoy$#XK&?Xwe-2HgcfH^vH9)GfjD7&8MIQp8_>+j({$H{u82*Mi@Sk#E|9+ggxB%RZJ8KBAs``t+ zso32s{{7PKmzWeZG(-K>Vy1oY-$44+T>l@<2>hBqe;@AV`u_q^Q+~~#&%N?LW$6EM zdTM91ot%Q&Q#n+e3FVIei&Ib=*a(%Huk}zNCUXm*j)iK3O7cP&)F`OOzQZ{js5_xf zfGR+}9I6#+G}K6_)UL{)k}PrtebpUMPe7$D18q=gss9L6Uvo+ABVE4kYYVA;CO!2B z6eju!cC9H5FNI4uN++d}fbf$5gx5)C zyJRMTfb1Ora+3idI*1xfr71A-pQIWJy9_|~O94tiC4hM20#IBj9YpT|P@Gpw>fKPu zz6L<{wE*%5eHz<||FC4<3YFrs9YEpz6+m<^04RQM1IYeE0NF=@Da0R22f_c--~Sup z5CA4%h=TU0{|gADON7DKAnfb8d&S+8B&)|h6E#~O71h;$X=A%zY^yv>-2wXj+dkf= zl;{U5tEK%eHc6!yjKnCc+!;+nV zlK?N^1fUIY9MB3l1~>vZ3}^uy05ky_0XqTP0h<9tzY(w=Pz$IAR00YC^8r}^2OtHY z1xyDJ-)Y|meVc5!uO07C{yVr!`nG^xbSeINu(5~O(Rr%3*O5uPhyUxJBk{lI{v_fy z-7dzD_H6jaWU$$1NBApXumElb(7vsQ0M7%C0Zs$PAb~t!Hee~h=f(^>+V8X+@E~9} z;61?i0NU_>10Wqx1{nT^IWWwDVGay)V3-5L92n-nFb9S?FwB8r4h(bP|34g{`&_E= z9-R@#Ue-Z%K&3M(#Zc)yj0gWTxZcFH(DZ$Ha}N4l7r@idvgHDJC-7|-z|+~F?hD|_ zABl?Qb;mkd39ugLy|b0w4j@lGF~8pmwKb6S*_{@+TZCjkBlIQ2w#EG&U< zB{&&Hce<4$M=L-)pV9D~mg6}SK+7%0FYa34u7F!QX}%PHPIlhB3iur6m%#35DCd-* zUV-0a+|c0S?qK&cD3L}d^iG^iFXnE;$t&E}2wU=VLZ6?Npe={n*-*)U`sM*s!YzZz z1-B&#gZ!>QOqJkFK5znbc2F%rDoTJMKQD!!zH}wBPzzWbD?wcX*X7J_@vaHq$$1y> zWr(MXE9KPibKog>Jx*-(`?;ZaUoXe!nUfMl4RZ1u))=BHGXIvrHH8$9xKg<-gk2iTZ?YHfEhqqme;FDooWc2QX8AnO zufe%}vAh=JnTh;yf@f3~>AsWxcqX!RWCM@4IauudYaQNj;Ha?>bEg~}En{izFRvl8 zU92^se4sX&0Iz7`_ZN*P!-+p0(bD7Lpab9!nx>{EsD#0kB+W`Cif zL|51LU#uw+@uGzob0xlORg#TLqtY5QqO};+Yo$9(Bm!Ul^8dClhlE@!WsJ}7nPRx) zF983nqGDYjGdU{|Eed@hG7)KqB4Whz-Xd1~y%q{&M)uMA1D$170z3dh``i^m-vXEp z#0CJ#TxS5}hR%NPL|Ek3XKsX<&Sm?|>tR;K(VVQ%s>9|JudwD!3_20?Zs zXnf{kBv|mXKaRko{M-{AjD7THU{7tW&%F$Xx`(14?EacbNDmzZm;69fF8cZ0DkTb^ znT$R?CC~pOymAs`O@v{C=O@71{xImI`M}TT4@sHy`ON-$3S%&S@}xk{Ga7dUz^)14 z3uCa12`esze!#R^#D%`eqQZX3-vHbMaG@}!TouGcQK7&`biOb|%)s9bFjCk(QW!h@ ztjR6eU5HoOt7I$;56)w^fxs6AmBGOu`Dw%9{YWX1d;JI~i~vX<6b3~hklk`1#+%Yl z_SKR~`v2sEGvstepGqm`6Uwm}|MU-500Ai{J;p zA>AT{%MZFMiP%Ga4ZaJD_(J%>Z%nBZfW`CB~<} zm`Y=_y`b|BqV@WPGu_Wm^2Z_3YN2kI^bW+ciI{;eN}@jkJ<;0+rGao4`l!5L2)_t; zU)wp@p6dEwoWFSo+{*mop9MYDU4I&%p4O*ru-^nXjZ)lwcGE8sx7Lf`$=w)k-^8qh zG~8a6l`$vHk#VCM_kp2&5Rb?{*f_Exxh#K46>x(sqc-(U~XLed{pMRtI;!`kB0e!G6RgQiO6>DX!JA7`XJ;j4IP&@|eg1{> zjrZfi?d+tyq>PNb^vqd)d<*5vT@HIjW>Ox0vs5|0He;;umb|>we*PsbgE$6;`|L+? zmUi6PDBX?V z+J3y+FAZxma1S+Z5bsYzFn8i6L>cci_PZa!+2V0q^8mUL-0n6?D-rtQHIl2CFZ$OX z#z^k#QqgTcPR{*h<2;DV)90WM*s zVGd}NoOto-Ku;(rAAfRkrd*U}pl{K5X%r9VB1NnOQS$oZGn4WQC1D8rN#wq25J6v* zahdpvnK_dY7razj{%^=~F2&7`C}GH2rGH{(Mu~U{EyZ8-I%guJJZifpaB>?SRQ62Z zLT#a3sOJ*y$?m15oSaK=Yg0gQP7cW=^ilmJ8B5MgxQ`2JB;Zmm$U~?=w9crO>m%{& zk3$y(T;KqljNyU?;NUOlWCL)JbASsTfKxKuhygeo!;Kt(^Dvxz01i=ue<1^LfrJ}1 z5GUi-BS|)-$AF;@eaJ&5b(%ln*4gQJ`A@y8$hLl>j3EdEkM9FN+I9L=Y$TCE}Ozj$|bA zItY28gi88E{QBI<5JH$N0QTZXVfniwJ;_*u{U9@iMRF9ix%5$dcz84&>UeIv2MWff zY1|k@Mj~N*^1vU)JQ_?#`l7r^#Q4k?CnMwU z$i6ro8|0rqe<^QC?xs9ifE4@uu%ZNqB+8Le@jEj_x_(Xk9H^^4zilkNA${qMLcWt9 zzOqmH3zgx4<#1G=e~B#bM)l>LP4e$TJdM76Ntvs9y01 zQ~(^He1N+`z;3`vfd4ldyr5ggFTC>OPdTg~=D`0#4xoXj{^U~r3VtTmKCFB^pTaNX z|G@v1f0A$JKjpvX&+=ER7O7rP?Nc36ol}ihU$3^R)72}~<22W4bQ-&6t|mvbP*bX@ z(>$ozt2wMWqZzB6q4j9DYG2lVp$*hU=(M_6U9v7uSF78o`%w3p?u4#OH%dQKuhS>! z%k|6jztL~hzo>sre^ei3P#UHfjD}dlvxe6V3ykH)zZ#!5?l%72_`UIGW2h;{lw`Wm zbgQYr^r7h+Q?z-q`8u=J9B*zm%Pe7*F_syY42#q98_QoTk6E6#d}-;hbXtO}A=Wpn zVKI?0<71}BsAHasc_ZfAm@_d!u{XpTVy&_BV(*A;h}{=^DE4sdXR-f`EsCp)dphog zxTd(*io%TiV$~YeZq+ zIil&+L~GNvIY|GNx<$GoU77A0{WSgMhMNr~hDt+&;RVAdh9F~{ah|c*_=52j2E>)+h z9qMev`+aqW}W6wn(^A-Yai3@)IO(uNxNU$qJ2mEf%a4F*VPQw$%_l;quai&jA zS?2lX1?ENOLUXaX%v@>yt+~PcnE6%n0rO_dBbI+!mR5hW=K4vHm0dDSemTX2=5Pml$3&d}{d8&~E55oHL9vZZf`QeAn1&{LJ{3@mu2= zl&(NinCViJ(saE^Yl=0cm@-TYOhu+;rr((!Ha%+EX?o7|l4-xG#dOqk-1L>H)AW-` zW*%*hGGAq$Zob2OpZPkA){<$-L+SgoMTEDcmTerpRi1|3?hnO+3O5|f* zY*VZ^_EhW*af{-9h$A7m1^E}jujQZTKj){YZd9#PJ&lspqUurwsmGzN-KBn1{iga8 z&9|B#k>YV$leR$nl{QLu9k`#ZTctayQ|Z%@+FJd~`Zm4Zu)t7mc+l{<;cMhToY7&- zH5M878jl%2HhyjlFv(3Dk&X#wwfR|dsl{!%$Fjq6z`|J*tv92@{mJ^Q^+T)I`jgcd zlM?d;a^&rpb+ON)c6=6F5_d=3#<)h*i-U28kwYKEeS$pdi2I)MX%YHcq(jCl(2}V5 zTC^SC@=n!C^`)B2HEn1SqO@0N@6@N8=9`L5|1@1^ZZ|6|QI;z#H(KwvZnAE(K5l)> z`n^>XV~;6{5n}F(c_C(hOh-%)YUvfR$+3>uTVt2SJ`cWyp>{qPcaq9}rFg&Y-}yFv zvTB;jpt7k_RgbHlR~=RzQ5{pYs*bDLRM)BN)koFQn)4cqHeP$P)}>v6w&}3;g!Y{F zGMxsc*rJQmC4iSzI$pm||C#<9eYhdh@QR_?@P^@SgVJa;RvBB+0wtR&Ogl_}H-(w2 z%p1*5m|rlTHeYMG)AE|7*J8KkSj(+ztVgXsTivmb#g2>{7dJQV&vBdw>rII2biN8T z^6&g{w6i-DolX8P^rp6Gw{zG~QZ{*21ECU8PeOs#{U#@78YCKB|3Q z_mZwv--&wDi&`x=gc)>(TMTZ)O4RFGL!DtgVzkk)$?yeYbP^@(jNxXZ)95k&*0|od z!MM@*jPVm=xGB;UWr{{!nrxbCnr`AvcbGh;T2q~Ay~$-+Zh6nrYU#49imQpEK_8Wy zhxpC>an| z(s8_npT{rY7x9IBF<-`4@&aGYzs9%lhtYB#v)N*y0TA{vKy$IYZR+p*wsSl~os3SC2YNlvrXj0K9mTErNe5biYdjrbd9&NU6 zo9<=Z5#0p+V*Lu_>=yk~`n~!?`cL$q>;I+i)`y_q(;AWua}2i`?gf9hq6D@XZa1zl z-UZ$sHFlwoh%l+lG3G>bmicCLzWFwDt$DrqcjiBvA2IJUzi#F&I!lZt-g2X5jzzGn zuyk9_Stg)ez03N7^`N!Ydfpm}9&j@FwJ>IB%+oQ=F`uI!3_<B13gH%E?O6Z8ds<**R4SNb&u}Px@UEb zx+YzV?mb4qCo8p{ne;Lp>By@tbv zZw)^hLXG2%Q;jC$0`x5pn|GKi(XMT@Y_&XPX+-UO6Q%8}O>rH59UbLRHX2qS9x37onbffY$laxG8a~;(kZzJ|fm%1=6kOALhT}Px3$U zsj3xdUp`iOu}fr$`Y-Bd(35hSBF#gZ=QQtVPH1|N>oc^8+G6bs+PAcyX-}iqyc|8I zU3V)|+<=nsy6z+0x4JRRA)ASB~mVUl|0dlSo{cf4QQZMMM z^(*xr^ucxd_4*BvXE*6LqmFOa@6hkm@6zwqH=?#T=?~~z^hfl^^wnvIbDZDDvwcM1Q8vhjNxO9G1izw$VXW*^J7pSJHfP$S>Q>au9<>}baXRW?7V6we)VJ-ZVTU!xAQknXhE3M;s8Ly{ zO@*jQ0_xCa)R_aQBPUTOB2fpdDD#CVkY*M~TToSy_p)u^pwM5xIXHIo}D1 zJraHQROD(J@>4(#)*;7sA%|L#BOG#IGPth==M%y8`DOt;rk-dM_}K)>b1TV((d50wh`fMx9qg+w(Nyed)RW!a@=yla?*0f z(qoZX!>p0kXzQ-H-H>AU#?d5E6ykFvu8m0sopER4x=B8=1z<)9A1~wOycpXkJ{mEe z%uhwEd5n{d7%5ZiQ}{IA!DpdA94tqy-hEj27U{_o!@~m*)D!J--vNp6Mp~_ zMj7M^3TF5l=D;uqhB+|Ifng2|b6}VQ!yFjqz%U1fIWWwDVGay)V3-5{lN|WJ09v-h AGynhq literal 0 HcmV?d00001 diff --git a/readme.html b/readme.html new file mode 100644 index 0000000..ec217e0 --- /dev/null +++ b/readme.html @@ -0,0 +1,101 @@ + + + + + +TclControl verison 2.0b3 + + + + +

TclControl
+v2.0b build 03

+ +

16/09/1999

+ +

Overview and Changes

+ +

This is an experimental alpha +release of TclControl, an ActiveX control containing a Tcl +interpreter and Tk! With TclControl you can re-use your Tcl/Tk +scripts within ActiveX containers, such as Visual Basic, Visual C++, +Delphi and Internet Explorer!

+ +

This version applies the +following changes to the first version:

+ +
    +
  • Pre-Built binaries for Tcl8.0.5 + and Tcl8.2.
  • +
  • The control now works + correctly with loaded Tcl extensions.
  • +
  • Throwing of automation + errors are limited only to the most severest of errors. + The method 'Eval' now returns an automation boolean, set + to TRUE if, and only if, the evaluation of the script was + successful.
  • +
  • Tracing of Tcl variables + and array elements has now been implemented with four new + methods and two new events, which your favourite + automation client will document for you. These closely + match the entries in the Tcl help for Tcl_TraceVar etc. + It's a good idea to read this page before attempting to + use these new methods and events.
  • +
  • The type library for the + control is now called TclControlPrj2 1.0 Type Library + - apologies for any inconvenience caused from this.
  • +
  • The IID for the control's + interfaces have been changed.
  • +
+ +

Requirements

+ +

TclControl has been tested on +Tcl8.0.5 and Tcl8.2 with Windows9x. It may work with NT 4sp3, but +this hasn't been tested. I would be interested to know of any +interesting configurations that TclControl did/didn't work with.

+ +

Installation and Uninstallation.

+ +

Before installing this version, +please ensure that any previous version of the control has +correctly uninstalled. Then run the Tcl script TclControl_Install.tcl +in the bin directory, and press on the button marked 'Install...'. +The program will automatically detect the version of Tcl and +select the appropriate installation. All versions of the DLL +should be in the same directory as the running script. The rest +of the installation is fairly straighforward. Uninstallation is +via the same Tcl script.

+ +

Examples

+ +

I've made a couple of examples +using the control - one with HTML, and the other with VB. The +HTML example runs with IE4 and above. The VB examples also +provides an executable: TclVB.exe

+ +

Known Problems

+ +

None so far ... so let me know! :-)

+ +

For flames, suggestions or bug +reports please email me: fuzz@sys.uea.ac.uk.

+ +

Have fun!
+Farzad Pezeshkpour
+
www.sys.uea.ac.uk/~fuzz

+ + diff --git a/src/StdAfx.cpp b/src/StdAfx.cpp new file mode 100644 index 0000000..a5eea17 --- /dev/null +++ b/src/StdAfx.cpp @@ -0,0 +1,12 @@ +// stdafx.cpp : source file that includes just the standard includes +// stdafx.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +#ifdef _ATL_STATIC_REGISTRY +#include +#include +#endif + +#include diff --git a/src/StdAfx.h b/src/StdAfx.h new file mode 100644 index 0000000..703f44c --- /dev/null +++ b/src/StdAfx.h @@ -0,0 +1,30 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, +// but are changed infrequently + +#if !defined(AFX_STDAFX_H__E796A723_F130_11D2_8003_0040055861F2__INCLUDED_) +#define AFX_STDAFX_H__E796A723_F130_11D2_8003_0040055861F2__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#define STRICT +#ifndef _WIN32_WINNT +#define _WIN32_WINNT 0x0400 +#endif +#define _ATL_APARTMENT_THREADED + +#include +//You may derive a class from CComModule and use it if you want to override +//something, but do not change the name of _Module +extern CComModule _Module; +#include +#include +#include +#include + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_STDAFX_H__E796A723_F130_11D2_8003_0040055861F2__INCLUDED) diff --git a/src/TclClassFactory.cpp b/src/TclClassFactory.cpp new file mode 100644 index 0000000..d325017 --- /dev/null +++ b/src/TclClassFactory.cpp @@ -0,0 +1,153 @@ +// TclClassFactory.cpp: implementation of the CTclClassFactory class. +// +////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" +#include "TclControlPrj2.h" +#include "dlldatax.h" +#include "TclControl.h" + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +CTclClassFactory::CTclClassFactory() : +CComClassFactory(), m_hT1Ready(NULL), m_hT2Ready(NULL), + m_iid(IID_IUnknown), m_pMarshallStm(NULL), m_pu(NULL) +{ + m_hT1Ready = CreateEvent (NULL, FALSE, FALSE, NULL); + m_hT2Ready = CreateEvent (NULL, FALSE, FALSE, NULL); +} + +CTclClassFactory::~CTclClassFactory() +{ + if (m_hT1Ready != NULL) { + CloseHandle (m_hT1Ready); + m_hT1Ready = NULL; + } + if (m_hT2Ready != NULL) { + CloseHandle (m_hT2Ready); + m_hT2Ready = NULL; + } +} + + + + + +HRESULT CTclClassFactory::CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, void ** ppvObject) +{ + if ((pUnkOuter != NULL) && !InlineIsEqualUnknown(riid)) + { + ATLTRACE2(atlTraceCOM, 0, _T("CComClassFactory: asked for non IUnknown interface while creating an aggregated object")); + m_hres = CLASS_E_NOAGGREGATION; + } + else + { + m_pUnkOuter = pUnkOuter; + m_iid = riid; + + DWORD threadid; + HANDLE hThread; + hThread = CreateThread (NULL, NULL, CTclClassFactory::TclThreadProc, this, NULL, &threadid); + if (hThread != NULL) + { + if (WaitForSingleObject (m_hT2Ready, INFINITE) == WAIT_OBJECT_0) + { + + if (m_pMarshallStm != NULL) // marshall the interface pointer to this thread + { + m_hres = CoGetInterfaceAndReleaseStream (m_pMarshallStm, riid, ppvObject); + SetEvent (m_hT1Ready); + + if (FAILED (m_hres)) + { + if (WaitForSingleObject (hThread, 5000) == WAIT_OBJECT_0) + TerminateThread (hThread, 0); + } + + } + /* + if (m_pu != NULL) + *ppvObject = m_pu; + */ + + else + { + // unable to create object ... + // don't do anything as the error is in m_hres already. + } + } + else // thread didn't respond after being created + { + TerminateThread (hThread, 0); + m_hres = E_FAIL; + } + BOOL battach = AttachThreadInput (threadid, GetCurrentThreadId(), TRUE); + CloseHandle (hThread); + } + else // unable to create thread + m_hres = E_FAIL; + } + return m_hres; +} + + + +DWORD WINAPI CTclClassFactory::TclThreadProc (LPVOID lpstruct) +{ + CTclClassFactory *pcf = (CTclClassFactory*)lpstruct; + ATLASSERT (pcf != NULL); + MSG msg; + + OleInitialize(NULL); + IUnknown * pv = NULL; + pcf->m_hres = (pcf->m_pfnCreateInstance) (pcf->m_pUnkOuter, pcf->m_iid, (void**)&pv); + if (SUCCEEDED(pcf->m_hres)) + { + // we've created the object, so now create a stream to marshall the + // the interface + ATLASSERT (pv != NULL); + pcf->m_hres = CoMarshalInterThreadInterfaceInStream (pcf->m_iid, pv, &(pcf->m_pMarshallStm)); + + } + + SetEvent (pcf->m_hT2Ready); + WaitForSingleObject (pcf->m_hT1Ready, INFINITE); + + // interface has been marshalled safetly, so now release our stranglehold on + // the object if it exists + + if (pv != NULL) + { + pv->Release(); + pv = NULL; + } + + + if (SUCCEEDED(pcf->m_hres)) + { + bool bCreated = false; + int totalwin = 0; + + // the following line ensures that a message queue exists for this thread + PeekMessage (&msg, NULL, NULL, NULL, PM_NOREMOVE); + + // assume that the Tcl interpreter for the object has been intialised. + while (!bCreated) { + Tcl_DoOneEvent(0); + bCreated = Tk_GetNumMainWindows() > 0; + } + + while (Tk_GetNumMainWindows() > 0) + Tcl_DoOneEvent(0); + } + + else // something went wrong in the process of either creation or marshalling + { + } + + + OleUninitialize(); + return 0; +} \ No newline at end of file diff --git a/src/TclClassFactory.h b/src/TclClassFactory.h new file mode 100644 index 0000000..0fc6b20 --- /dev/null +++ b/src/TclClassFactory.h @@ -0,0 +1,13 @@ +// TclClassFactory.h: interface for the TclClassFactory class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_TCLCLASSFACTORY_H__D415E3AC_6678_11D4_8004_0040055861F2__INCLUDED_) +#define AFX_TCLCLASSFACTORY_H__D415E3AC_6678_11D4_8004_0040055861F2__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + +#endif // !defined(AFX_TCLCLASSFACTORY_H__D415E3AC_6678_11D4_8004_0040055861F2__INCLUDED_) diff --git a/src/TclControl.cpp b/src/TclControl.cpp new file mode 100644 index 0000000..3fe3310 --- /dev/null +++ b/src/TclControl.cpp @@ -0,0 +1,578 @@ +// TclControl.cpp : Implementation of CTclControl +// Author: Farzad Pezeshkpour +// Date: 13 April 1999 + +#include "stdafx.h" +#include "TclControlPrj2.h" +#include "TclControl.h" + +inline void _cdecl MyTrace(LPCSTR lpszFormat, ...) +{ + va_list args; + va_start(args, lpszFormat); + + int nBuf; + char szBuffer[512]; + + nBuf = _vsnprintf(szBuffer, sizeof(szBuffer), lpszFormat, args); + ATLASSERT(nBuf < sizeof(szBuffer)); //Output truncated as it was > sizeof(szBuffer) + + OutputDebugStringA(szBuffer); + va_end(args); +} + +#define MYTRACE MyTrace + +WCHAR* tcldead= L"Tcl interpreter is dead"; +bool bInit = false; + +///////////////////////////////////////////////////////////////////////////// +// CTclControl + +/* + *------------------------------------------------------------------------- + * CTclControl -- + * Constructor - Creates the interpreter for this application and + * initialise it. Sets member variables to default. + * Result: + * + * Side effects: + * None + *------------------------------------------------------------------------- + */ +CTclControl::CTclControl() +{ + + m_hWndTk = NULL; + m_bWindowOnly = true; + m_tkWnd = NULL; + m_pInterp = NULL; + + m_pInterp = Tcl_CreateInterp(); + + if (m_pInterp != NULL && + Tcl_Init (m_pInterp) == TCL_ERROR) { + Tcl_DeleteInterp (m_pInterp); + m_pInterp = NULL; + } +} + + + +/* + *------------------------------------------------------------------------- + * ~CTclControl -- + * Destructor - Ensures that allocated resources are released + * Result: + * + * Side effects: + * Interpreter released + *------------------------------------------------------------------------- + */ +CTclControl::~CTclControl () +{ + if (m_pInterp != NULL) + { + try { + Tcl_DeleteInterp (m_pInterp); + m_pInterp = NULL; + } catch (...) { + // catch all exceptions!!! + } + } +} + +/* + *------------------------------------------------------------------------- + * CreateControlWindow -- + * Virtual function override. Creates control window, and initialises + * Tk environement + * Result: + * NULL iff failed to create base window + * Side effects: + * None + *------------------------------------------------------------------------- + */ +HWND CTclControl::CreateControlWindow( HWND hWndParent, RECT& rcPos ) +{ + HWND hWnd = CComControl::CreateControlWindow(hWndParent, rcPos); + + if (m_pInterp != NULL && hWnd != NULL) { + char buffer[255]; + sprintf(buffer, "-use 0x%8.8x", hWnd); + Tcl_SetVar (m_pInterp, "argv", buffer, TCL_GLOBAL_ONLY); + if (Tk_Init(m_pInterp) != TCL_ERROR) { + Tcl_StaticPackage(NULL, "Tk", Tk_Init, Tk_SafeInit); + m_tkWnd = Tk_MainWindow (m_pInterp); + // this is a bit naughty ... loop on the message queue until + // the tk window is initialised, other wise, Tk barfs <>! + MSG msg; + while (m_hWndTk == NULL && GetMessage (&msg, NULL, 0, 0)) + DispatchMessage(&msg); + } + } + return hWnd; +} + + + + +/* + *------------------------------------------------------------------------- + * OnTkClaimFocus -- + * Message Handler for TK_CLAIMFOCUS - this is probably not implemented + * correctly, because focus handling doesn't currently work + * Result: + * 0 - I think this means that it was handled + * Side effects: + * Focus changed to toplevel + *------------------------------------------------------------------------- + */ +LRESULT CTclControl::OnTkClaimFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) +{ + bHandled = TRUE; + if (wParam!=NULL || (::GetFocus() != NULL)) { + ::SetFocus(m_hWndTk); + } + return 0; +} + +/* + *------------------------------------------------------------------------- + * OnParentNotify -- + * Manages focus according to mouse events + * Result: + * 0 to indicate processed + * Side effects: + * Focus changes to Tk window - this probably is not the right way to do + * this + *------------------------------------------------------------------------- + */ +LRESULT CTclControl::OnParentNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) +{ + switch (LOWORD(wParam)) { + case WM_LBUTTONDOWN: + case WM_MBUTTONDOWN: + case WM_RBUTTONDOWN: + ::SetFocus(m_hWndTk); + break; + } + return 0; +} + + +/* + *------------------------------------------------------------------------- + * OnTkAttach -- + * Called by Tk to inform the base window of this control (its container) + * that it is attaching. This procedure store the window handle of the + * the toplevel and resizes the Tk window to fit in the base window + * Result: + * 0 to indicate processed (I think) + * Side effects: + * Tk toplevel resized to that of the base window + *------------------------------------------------------------------------- + */ +LRESULT CTclControl::OnTkAttach(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) +{ + MYTRACE(_T("OnTkAttach %u %d %d\n"), uMsg, wParam, lParam); + m_hWndTk = (HWND)wParam; + RECT rect; + GetClientRect(&rect); + return OnSize (WM_SIZE, NULL, MAKELPARAM(rect.right, rect.bottom), bHandled); +} + + +/* + *------------------------------------------------------------------------- + * OnTkGeomReq -- + * Called by Tk toplevel to request a geometry change - basically we'll + * give it only one size; that of the control base window + * Result: + * 1 - maybe? + * Side effects: + * Tk toplevel resized + *------------------------------------------------------------------------- + */ +LRESULT CTclControl::OnTkGeomReq(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) +{ + RECT rect; + if (m_hWndTk != NULL) { + GetClientRect(&rect); + ::SetWindowPos(m_hWndTk, NULL, + 0, 0, rect.right, rect.bottom, SWP_NOZORDER); + } + return 1; +} + + + +/* + *------------------------------------------------------------------------- + * OnSize -- + * Called to update the size of the Tk toplevel according to the (new) size + * of the controls base window + * Result: + * 0 + * Side effects: + * + *------------------------------------------------------------------------- + */ +LRESULT CTclControl::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) +{ + if (m_tkWnd != NULL) + Tk_GeometryRequest(m_tkWnd, LOWORD(lParam), HIWORD(lParam)); + return 0; +} + +/* + *------------------------------------------------------------------------- + * Eval -- + * Evaluates a command in the interpreter. + * Result: + * pbOk set to -1 iff script evaluated okay; else 0. Returns S_OK iff + * interpreter exists. + * Side effects: + * None. + *------------------------------------------------------------------------- + */ +STDMETHODIMP CTclControl::Eval(BSTR command, VARIANT_BOOL *pbOk) +{ + USES_CONVERSION; + + char *szc = NULL; + int result; + + if (m_pInterp==NULL) { + Error(A2COLE("tcl interp is dead")); + } + else { + szc = OLE2A(command); + result = Tcl_Eval (m_pInterp, szc); + if (pbOk != NULL) + *pbOk = ((result == TCL_OK)?-1:0); + } + + return S_OK; +} + +/* + *------------------------------------------------------------------------- + * get_Result -- + * Returns the current result of the interpreter in pVal. + * Result: + * S_OK iff interpreter exists. + * Side effects: + * None. + *------------------------------------------------------------------------- + */ +STDMETHODIMP CTclControl::get_Result(BSTR *pVal) +{ + USES_CONVERSION; + HRESULT hr = E_FAIL; + + if (m_pInterp==NULL) + Error(tcldead); + else if (pVal != NULL) { + CComBSTR str(A2OLE(Tcl_GetStringResult (m_pInterp))); + *pVal = str.Detach(); + hr = S_OK; + } + + return hr; +} + +/* + *------------------------------------------------------------------------- + * TraceVar -- + * Implements a trace on a Tcl variable, parameterised with a set of flags. + * Please read Tcl_TraceVar page in the Tcl help. + * Result: + * *pbOk == -1 iff successful; else 0 + * Side effects: + * None. + *------------------------------------------------------------------------- + */ +STDMETHODIMP CTclControl::TraceVar(BSTR name, long flags, VARIANT_BOOL *pbOk) +{ + USES_CONVERSION; + HRESULT hr = E_FAIL; + + if (m_pInterp==NULL) + Error(tcldead); + else { + int result = Tcl_TraceVar (m_pInterp, OLE2A(name), flags, VarCallback, (ClientData)this); + if (pbOk != NULL) + *pbOk = ((result == TCL_OK)?-1:0); + hr = S_OK; + } + + return hr; +} + +/* + *------------------------------------------------------------------------- + * TraceVar2 -- + * Implements a trace on a Tcl array element, parameterised with a set of + * flags. Please read Tcl_TraceVar2 page in the Tcl help. + * Result: + * *pbOk == -1 iff trace was set okay; else 0. + * Side effects: + * None. + *------------------------------------------------------------------------- + */ +STDMETHODIMP CTclControl::TraceVar2(BSTR name1, BSTR name2, long flags, VARIANT_BOOL *pbOk) +{ + USES_CONVERSION; + HRESULT hr = E_FAIL; + + if (m_pInterp==NULL) + Error(tcldead); + else { + int result = Tcl_TraceVar2 (m_pInterp, OLE2A(name1), OLE2A(name2), flags, VarCallback, (ClientData)this); + if (pbOk != NULL) + *pbOk = ((result == TCL_OK)?-1:0); + hr = S_OK; + } + + return hr; +} + + +/* + *------------------------------------------------------------------------- + * VarCallback -- + * Callback from Tcl when a trace has been invoked due to a change + * in a variable's state. + * Result: + * NULL + * Side effects: + * Invokes an appropriate COM event from this object. + *------------------------------------------------------------------------- + */ +char *CTclControl::VarCallback (ClientData cd, Tcl_Interp *pInterp, char *name1, char *name2, int flags) +{ + USES_CONVERSION; + CTclControl *ptc = reinterpret_cast(cd); + ATLASSERT (ptc != NULL); + if (ptc == NULL) return NULL; + + if (name2 == NULL) { + ptc->Fire_OnTraceVar (A2BSTR(name1), flags); + } else { + ptc->Fire_OnTraceVar2 (A2BSTR(name1), A2BSTR(name2), flags); + } + return NULL; +} + +/* + *------------------------------------------------------------------------- + * UntraceVar -- + * Removes an existing trace on a Tcl variable. + * Result: + * S_OK iff interpreter exists. + * Side effects: + * None. + *------------------------------------------------------------------------- + */ +STDMETHODIMP CTclControl::UntraceVar(BSTR name, long flags) +{ + USES_CONVERSION; + HRESULT hr = E_FAIL; + if (m_pInterp==NULL) + Error(tcldead); + else { + Tcl_UntraceVar (m_pInterp, OLE2A(name), flags, VarCallback, (ClientData)this); + hr = S_OK; + } + return hr; +} + + +/* + *------------------------------------------------------------------------- + * UntraceVar2 -- + * Allows for the removal of an existing trace on a array element + * Result: + * S_OK iff interpreter exists. + * Side effects: + * None. + *------------------------------------------------------------------------- + */ +STDMETHODIMP CTclControl::UntraceVar2(BSTR name1, BSTR name2, long flags) +{ + USES_CONVERSION; + HRESULT hr = E_FAIL; + + if (m_pInterp==NULL) + Error(tcldead); + else { + Tcl_UntraceVar2 (m_pInterp, OLE2A(name1), OLE2A(name2), flags, VarCallback, (ClientData)this); + hr = S_OK; + } + + return hr; +} + + +/* + *------------------------------------------------------------------------- + * SetVar -- + * Sets a Tcl Variable + * Result: + * S_OK iff interpreter exists. *pbOk will be true iff set was successful + * Side effects: + * Could invoke a variable trace. + *------------------------------------------------------------------------- + */ +STDMETHODIMP CTclControl::SetVar(BSTR name, BSTR value, long flags, VARIANT_BOOL *pbOk) +{ + USES_CONVERSION; + HRESULT hr = E_FAIL; + + if (m_pInterp==NULL) + Error(tcldead); + else { + char *result = Tcl_SetVar (m_pInterp, OLE2A(name), OLE2A(value), flags); + if (pbOk != NULL) + *pbOk = ((result != NULL)?-1:0); + hr = S_OK; + } + + return hr; +} + +/* + *------------------------------------------------------------------------- + * GetVar -- + * Gets the value of an existing Tcl variable + * Result: + * S_OK iff interpreter and variable exist and variable is not an array. + * Side effects: + * Can invoke a variable trace. + *------------------------------------------------------------------------- + */ +STDMETHODIMP CTclControl::GetVar(BSTR name, long flags, BSTR *pValue) +{ + USES_CONVERSION; + HRESULT hr = E_FAIL; + + if (m_pInterp==NULL) + Error(tcldead); + else { + char *result = Tcl_GetVar (m_pInterp, OLE2A(name), flags); + if (result != NULL && pValue != NULL) { + CComBSTR val(A2OLE(result)); + *pValue = val.Detach(); + hr = S_OK; + } + } + return hr; +} + + + +/* + *------------------------------------------------------------------------- + * SetVar2 -- + * Sets the value of an array element. + * Result: + * S_OK iff interpreter exists. *pbOk is true iff set operation succeeded. + * Side effects: + * Could invoke a variable trace. + *------------------------------------------------------------------------- + */ +STDMETHODIMP CTclControl::SetVar2(BSTR name1, BSTR name2, BSTR value, long flags, VARIANT_BOOL *pbOk) +{ + USES_CONVERSION; + HRESULT hr = E_FAIL; + + if (m_pInterp==NULL) + Error(tcldead); + else { + char *result = Tcl_SetVar2 (m_pInterp, OLE2A(name1), OLE2A(name2), OLE2A(value), flags); + if (pbOk != NULL) + *pbOk = ((result != NULL)?-1:0); + hr = S_OK; + } + return hr; +} + + + +/* + *------------------------------------------------------------------------- + * GetVar2 -- + * Gets the value of an existing array element. + * Result: + * S_OK iff interpreter exists, and array element exists. + * Side effects: + * Can invoke a variable trace. + *------------------------------------------------------------------------- + */ +STDMETHODIMP CTclControl::GetVar2(BSTR name1, BSTR name2, long flags, BSTR *pVal) +{ + USES_CONVERSION; + HRESULT hr = E_FAIL; + + if (m_pInterp==NULL) + Error(tcldead); + else { + char *result = Tcl_GetVar2 (m_pInterp, OLE2A(name1), OLE2A(name2), flags); + if (result != NULL && pVal != NULL) { + CComBSTR val(A2OLE(result)); + *pVal = val.Detach(); + hr = S_OK; + } + } + return hr; +} + + +/* + *------------------------------------------------------------------------- + * UnsetVar -- + * Unsets a Tcl variable + * Result: + * S_OK iff interpreter exists. + * Side effects: + * Can invoke a variable trace. + *------------------------------------------------------------------------- + */ +STDMETHODIMP CTclControl::UnsetVar(BSTR name, long flags) +{ + USES_CONVERSION; + HRESULT hr = E_FAIL; + + if (m_pInterp==NULL) + Error(tcldead); + else { + Tcl_UnsetVar (m_pInterp, OLE2A(name), flags); + hr = S_OK; + } + return hr; +} + +/* + *------------------------------------------------------------------------- + * UnsetVar2 -- + * Unsets a Tcl array element. + * Result: + * S_OK iff interpreter exists. + * Side effects: + * Can invoke a variable trace. + *------------------------------------------------------------------------- + */ +STDMETHODIMP CTclControl::UnsetVar2(BSTR name1, BSTR name2, long flags) +{ + USES_CONVERSION; + HRESULT hr = E_FAIL; + + if (m_pInterp==NULL) + Error(tcldead); + else { + Tcl_UnsetVar2 (m_pInterp, OLE2A(name1), OLE2A(name2), flags); + hr = S_OK; + } + return hr; +} diff --git a/src/TclControl.h b/src/TclControl.h new file mode 100644 index 0000000..6b55ceb --- /dev/null +++ b/src/TclControl.h @@ -0,0 +1,196 @@ +// TclControl.h : Declaration of the CTclControl + +#ifndef __TCLCONTROL_H_ +#define __TCLCONTROL_H_ + +#include "resource.h" // main symbols +#include +#include "TclControlPrj2CP.h" + +#define TK_CLAIMFOCUS (WM_USER) +#define TK_GEOMETRYREQ (WM_USER+1) +#define TK_ATTACHWINDOW (WM_USER+2) +#define TK_DETACHWINDOW (WM_USER+3) + + + + +class CTclClassFactory : public CComClassFactory +{ +public: + CTclClassFactory(); + virtual ~CTclClassFactory(); + + // override + STDMETHOD(CreateInstance) (LPUNKNOWN pUnkOuter, REFIID riid, void ** ppvObject); +protected: + static DWORD WINAPI TclThreadProc (LPVOID lpstruct); + HANDLE m_hT1Ready; + HANDLE m_hT2Ready; + IStream * m_pMarshallStm; + LPUNKNOWN m_pUnkOuter; + IID m_iid; + HRESULT m_hres; + void * m_pu; +}; + + +///////////////////////////////////////////////////////////////////////////// +// CTclControl +class ATL_NO_VTABLE CTclControl : + public CComObjectRootEx, + public IDispatchImpl, + public CComControl, + public IPersistStreamInitImpl, + public IOleControlImpl, + public IOleObjectImpl, + public IOleInPlaceActiveObjectImpl, + public IViewObjectExImpl, + public IOleInPlaceObjectWindowlessImpl, + public ISupportErrorInfo, + public IConnectionPointContainerImpl, + public IPersistStorageImpl, + public ISpecifyPropertyPagesImpl, + public IQuickActivateImpl, + public IDataObjectImpl, + public IProvideClassInfo2Impl<&CLSID_TclControl, &DIID__ITclControlEvents, &LIBID_TCLCONTROLPRJ2Lib>, + public IPropertyNotifySinkCP, + public CComCoClass, + public CProxy_ITclControlEvents< CTclControl > +{ +public: + CTclControl(); + virtual ~CTclControl (); + virtual HWND CreateControlWindow( HWND hWndParent, RECT& rcPos ); + +DECLARE_REGISTRY_RESOURCEID(IDR_TCLCONTROL) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +// the following line implements the use of the multithreaded class factory +// DECLARE_CLASSFACTORY_EX(CTclClassFactory) + + + + +BEGIN_COM_MAP(CTclControl) + COM_INTERFACE_ENTRY(ITclControl) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(IViewObjectEx) + COM_INTERFACE_ENTRY(IViewObject2) + COM_INTERFACE_ENTRY(IViewObject) + COM_INTERFACE_ENTRY(IOleInPlaceObjectWindowless) + COM_INTERFACE_ENTRY(IOleInPlaceObject) + COM_INTERFACE_ENTRY2(IOleWindow, IOleInPlaceObjectWindowless) + COM_INTERFACE_ENTRY(IOleInPlaceActiveObject) + COM_INTERFACE_ENTRY(IOleControl) + COM_INTERFACE_ENTRY(IOleObject) + COM_INTERFACE_ENTRY(IPersistStreamInit) + COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit) + COM_INTERFACE_ENTRY(ISupportErrorInfo) + COM_INTERFACE_ENTRY(IConnectionPointContainer) + COM_INTERFACE_ENTRY(ISpecifyPropertyPages) + COM_INTERFACE_ENTRY(IQuickActivate) + COM_INTERFACE_ENTRY(IPersistStorage) + COM_INTERFACE_ENTRY(IDataObject) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) +END_COM_MAP() + +BEGIN_PROP_MAP(CTclControl) + PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4) + PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4) + // Example entries + // PROP_ENTRY("Property Description", dispid, clsid) + // PROP_PAGE(CLSID_StockColorPage) +END_PROP_MAP() + +BEGIN_CONNECTION_POINT_MAP(CTclControl) + CONNECTION_POINT_ENTRY(IID_IPropertyNotifySink) + CONNECTION_POINT_ENTRY(DIID__ITclControlEvents) +END_CONNECTION_POINT_MAP() + +BEGIN_MSG_MAP(CTclControl) + MESSAGE_HANDLER(TK_ATTACHWINDOW, OnTkAttach) + MESSAGE_HANDLER(TK_GEOMETRYREQ, OnTkGeomReq) + MESSAGE_HANDLER(TK_CLAIMFOCUS, OnTkClaimFocus) + MESSAGE_HANDLER(WM_PARENTNOTIFY, OnParentNotify) + MESSAGE_HANDLER(WM_SIZE, OnSize) + CHAIN_MSG_MAP(CComControl) + DEFAULT_REFLECTION_HANDLER() +END_MSG_MAP() +// Handler prototypes: +// LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); +// LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled); +// LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled); + + + +// ISupportsErrorInfo + STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid) + { + static const IID* arr[] = + { + &IID_ITclControl, + }; + for (int i=0; i + +ATL 3.0 test page for object TclControl + + + + + \ No newline at end of file diff --git a/src/TclControl.rgs b/src/TclControl.rgs new file mode 100644 index 0000000..345f24a --- /dev/null +++ b/src/TclControl.rgs @@ -0,0 +1,34 @@ +HKCR +{ + TclControlPrj2.TclControl.1 = s 'TclControl Class' + { + CLSID = s '{E796A72F-F130-11D2-8003-0040055861F2}' + } + TclControlPrj2.TclControl = s 'TclControl Class' + { + CLSID = s '{E796A72F-F130-11D2-8003-0040055861F2}' + CurVer = s 'TclControlPrj2.TclControl.1' + } + NoRemove CLSID + { + ForceRemove {E796A72F-F130-11D2-8003-0040055861F2} = s 'TclControl Class' + { + ProgID = s 'TclControlPrj2.TclControl.1' + VersionIndependentProgID = s 'TclControlPrj2.TclControl' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + ForceRemove 'Control' + ForceRemove 'Insertable' + ForceRemove 'ToolboxBitmap32' = s '%MODULE%, 101' + 'MiscStatus' = s '0' + { + '1' = s '131473' + } + 'TypeLib' = s '{E796A720-F130-11D2-8003-0040055861F2}' + 'Version' = s '1.0' + } + } +} diff --git a/src/TclControlPrj2.cpp b/src/TclControlPrj2.cpp new file mode 100644 index 0000000..7f8061c --- /dev/null +++ b/src/TclControlPrj2.cpp @@ -0,0 +1,143 @@ +// TclControlPrj2.cpp : Implementation of DLL Exports. + + +// Note: Proxy/Stub Information +// To merge the proxy/stub code into the object DLL, add the file +// dlldatax.c to the project. Make sure precompiled headers +// are turned off for this file, and add _MERGE_PROXYSTUB to the +// defines for the project. +// +// If you are not running WinNT4.0 or Win95 with DCOM, then you +// need to remove the following define from dlldatax.c +// #define _WIN32_WINNT 0x0400 +// +// Further, if you are running MIDL without /Oicf switch, you also +// need to remove the following define from dlldatax.c. +// #define USE_STUBLESS_PROXY +// +// Modify the custom build rule for TclControlPrj2.idl by adding the following +// files to the Outputs. +// TclControlPrj2_p.c +// dlldata.c +// To build a separate proxy/stub DLL, +// run nmake -f TclControlPrj2ps.mk in the project directory. + +#include "stdafx.h" +#include "resource.h" +#include +#include "TclControlPrj2.h" +#include "dlldatax.h" + +#include "TclControlPrj2_i.c" +#include "TclControl.h" + +#ifdef _MERGE_PROXYSTUB +extern "C" HINSTANCE hProxyDll; +#endif + +CComModule _Module; +HHOOK hHook = NULL; + +BEGIN_OBJECT_MAP(ObjectMap) +OBJECT_ENTRY(CLSID_TclControl, CTclControl) +END_OBJECT_MAP() + + +// main -- +// used to make the minimum dependancy build work +void main (void) +{ + +} + +///////////////////////////////////////////////////////////////////////////// +// DLL Entry Point + +extern "C" +BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) +{ + char modpath[1024]; + Tcl_Time timeout; + +#ifdef _MERGE_PROXYSTUB + if (!PrxDllMain(hInstance, dwReason, lpReserved)) + return FALSE; +#endif + switch (dwReason) { + case DLL_PROCESS_ATTACH: + _Module.Init(ObjectMap, hInstance, &LIBID_TCLCONTROLPRJ2Lib); + GetModuleFileName (_Module.m_hInst, modpath, 1024); + Tcl_FindExecutable (modpath); + //Tcl_InitNotifier(); + Tcl_SetServiceMode(TCL_SERVICE_ALL); + timeout.sec = 0; + timeout.usec = 25000; + Tcl_SetTimer (&timeout); + + break; + case DLL_PROCESS_DETACH: + Tcl_Finalize(); + _Module.Term(); + break; + default: + break; + } + return TRUE; // ok +} + +///////////////////////////////////////////////////////////////////////////// +// Used to determine whether the DLL can be unloaded by OLE + +STDAPI DllCanUnloadNow(void) +{ +#ifdef _MERGE_PROXYSTUB + if (PrxDllCanUnloadNow() != S_OK) + return S_FALSE; +#endif + return (_Module.GetLockCount()==0) ? S_OK : S_FALSE; +} + +///////////////////////////////////////////////////////////////////////////// +// Returns a class factory to create an object of the requested type + +STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) +{ +#ifdef _MERGE_PROXYSTUB + if (PrxDllGetClassObject(rclsid, riid, ppv) == S_OK) + return S_OK; +#endif + return _Module.GetClassObject(rclsid, riid, ppv); +} + +///////////////////////////////////////////////////////////////////////////// +// DllRegisterServer - Adds entries to the system registry + +STDAPI DllRegisterServer(void) +{ +#ifdef _MERGE_PROXYSTUB + HRESULT hRes = PrxDllRegisterServer(); + if (FAILED(hRes)) + return hRes; +#endif + // registers object, typelib and all interfaces in typelib + return _Module.RegisterServer(TRUE); +} + +///////////////////////////////////////////////////////////////////////////// +// DllUnregisterServer - Removes entries from the system registry + +STDAPI DllUnregisterServer(void) +{ +#ifdef _MERGE_PROXYSTUB + PrxDllUnregisterServer(); +#endif + return _Module.UnregisterServer(TRUE); +} + + + + + + +// ------------------------------------------ + diff --git a/src/TclControlPrj2.def b/src/TclControlPrj2.def new file mode 100644 index 0000000..7cf155d --- /dev/null +++ b/src/TclControlPrj2.def @@ -0,0 +1,9 @@ +; TclControlPrj2.def : Declares the module parameters. + +LIBRARY "TclControl.dll" + +EXPORTS + DllCanUnloadNow @1 PRIVATE + DllGetClassObject @2 PRIVATE + DllRegisterServer @3 PRIVATE + DllUnregisterServer @4 PRIVATE diff --git a/src/TclControlPrj2.dsp b/src/TclControlPrj2.dsp new file mode 100644 index 0000000..46ca3aa --- /dev/null +++ b/src/TclControlPrj2.dsp @@ -0,0 +1,433 @@ +# Microsoft Developer Studio Project File - Name="TclControlPrj2" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=TclControlPrj2 - Win32 Debug Tcl84 +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "TclControlPrj2.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "TclControlPrj2.mak" CFG="TclControlPrj2 - Win32 Debug Tcl84" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "TclControlPrj2 - Win32 Release Tcl82" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "TclControlPrj2 - Win32 Debug Tcl82" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "TclControlPrj2 - Win32 Release Tcl80" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "TclControlPrj2 - Win32 Debug Tcl80" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "TclControlPrj2 - Win32 Release Tcl81" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "TclControlPrj2 - Win32 Debug Tcl81" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "TclControlPrj2 - Win32 Debug Tcl84" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "TclControlPrj2 - Win32 Release Tcl84" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "TclControlPrj2 - Win32 Release Tcl82" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "TclControlPrj2___Win32_Release_Tcl82" +# PROP BASE Intermediate_Dir "TclControlPrj2___Win32_Release_Tcl82" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release_Tcl82" +# PROP Intermediate_Dir "Release_Tcl82" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /O1 /I "c:\progra~1\tcl\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_ATL_STATIC_REGISTRY" /D "_ATL_MIN_CRT" /FR /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /MT /W3 /O1 /I "c:\progra~1\tcl\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_ATL_STATIC_REGISTRY" /D "_ATL_MIN_CRT" /FR /Yu"stdafx.h" /FD /c +# ADD BASE RSC /l 0x809 /d "NDEBUG" +# ADD RSC /l 0x809 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib tcl82.lib tk82.lib /nologo /subsystem:windows /dll /machine:I386 /out:"c:\progra~1\tcl\bin\TclControl.dll" /libpath:"c:\progra~1\tcl\lib\\" +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib tcl82.lib tk82.lib /nologo /subsystem:windows /dll /machine:I386 /out:"..\bin\tclcontrol82.dll" /libpath:"c:\progra~1\tcl\lib\\" +# Begin Custom Build - Performing registration +OutDir=.\Release_Tcl82 +TargetPath=\twemp\tclcontrol\bin\tclcontrol82.dll +InputPath=\twemp\tclcontrol\bin\tclcontrol82.dll +SOURCE="$(InputPath)" + +"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + regsvr32 /s /c "$(TargetPath)" + echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" + +# End Custom Build + +!ELSEIF "$(CFG)" == "TclControlPrj2 - Win32 Debug Tcl82" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "TclControlPrj2___Win32_Debug_Tcl82" +# PROP BASE Intermediate_Dir "TclControlPrj2___Win32_Debug_Tcl82" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug_Tcl82" +# PROP Intermediate_Dir "Debug_Tcl82" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /Gi /GX /ZI /Od /I "c:\progra~1\tcl\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /FR /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /Gi /GX /ZI /Od /I "c:\progra~1\tcl\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /FR /Yu"stdafx.h" /FD /GZ /c +# ADD BASE RSC /l 0x809 /d "_DEBUG" +# ADD RSC /l 0x809 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib tcl82.lib tk82.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"c:\progra~1\tcl\bin\TclControl.dll" /pdbtype:sept /libpath:"c:\progra~1\tcl\lib\\" +# SUBTRACT BASE LINK32 /verbose +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib tcl82.lib tk82.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"..\bin\tclcontrol82.dll" /pdbtype:sept /libpath:"c:\progra~1\tcl\lib\\" +# SUBTRACT LINK32 /verbose +# Begin Custom Build - Performing registration +OutDir=.\Debug_Tcl82 +TargetPath=\twemp\tclcontrol\bin\tclcontrol82.dll +InputPath=\twemp\tclcontrol\bin\tclcontrol82.dll +SOURCE="$(InputPath)" + +"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + regsvr32 /s /c "$(TargetPath)" + echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" + +# End Custom Build + +!ELSEIF "$(CFG)" == "TclControlPrj2 - Win32 Release Tcl80" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "TclControlPrj2___Win32_Release_Tcl80" +# PROP BASE Intermediate_Dir "TclControlPrj2___Win32_Release_Tcl80" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release_Tcl80" +# PROP Intermediate_Dir "Release_Tcl80" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /O1 /I "c:\progra~1\tcl\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_ATL_STATIC_REGISTRY" /D "_ATL_MIN_CRT" /FR /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /MT /W3 /O1 /I "c:\progra~1\tcl\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_ATL_STATIC_REGISTRY" /D "_ATL_MIN_CRT" /FR /Yu"stdafx.h" /FD /c +# ADD BASE RSC /l 0x809 /d "NDEBUG" +# ADD RSC /l 0x809 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib tcl82.lib tk82.lib /nologo /subsystem:windows /dll /machine:I386 /out:"c:\progra~1\tcl\bin\TclControl.dll" /libpath:"c:\progra~1\tcl\lib\\" +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib tcl80.lib tk80.lib /nologo /subsystem:windows /dll /machine:I386 /out:"..\bin\tclcontrol80.dll" /libpath:"c:\progra~1\tcl\lib\\" +# Begin Custom Build - Performing registration +OutDir=.\Release_Tcl80 +TargetPath=\twemp\tclcontrol\bin\tclcontrol80.dll +InputPath=\twemp\tclcontrol\bin\tclcontrol80.dll +SOURCE="$(InputPath)" + +"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + regsvr32 /s /c "$(TargetPath)" + echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" + +# End Custom Build + +!ELSEIF "$(CFG)" == "TclControlPrj2 - Win32 Debug Tcl80" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "TclControlPrj2___Win32_Debug_Tcl80" +# PROP BASE Intermediate_Dir "TclControlPrj2___Win32_Debug_Tcl80" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug_Tcl80" +# PROP Intermediate_Dir "Debug_Tcl80" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /Gi /GX /ZI /Od /I "c:\progra~1\tcl\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /FR /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /Gi /GX /ZI /Od /I "c:\progra~1\tcl\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /FR /Yu"stdafx.h" /FD /GZ /c +# ADD BASE RSC /l 0x809 /d "_DEBUG" +# ADD RSC /l 0x809 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib tcl82.lib tk82.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"c:\progra~1\tcl\bin\TclControl.dll" /pdbtype:sept /libpath:"c:\progra~1\tcl\lib\\" +# SUBTRACT BASE LINK32 /verbose +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib tcl80.lib tk80.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"..\bin\tclcontrol80.dll" /pdbtype:sept /libpath:"c:\progra~1\tcl\lib\\" +# SUBTRACT LINK32 /verbose +# Begin Custom Build - Performing registration +OutDir=.\Debug_Tcl80 +TargetPath=\twemp\tclcontrol\bin\tclcontrol80.dll +InputPath=\twemp\tclcontrol\bin\tclcontrol80.dll +SOURCE="$(InputPath)" + +"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + regsvr32 /s /c "$(TargetPath)" + echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" + +# End Custom Build + +!ELSEIF "$(CFG)" == "TclControlPrj2 - Win32 Release Tcl81" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "TclControlPrj2___Win32_Release_Tcl81" +# PROP BASE Intermediate_Dir "TclControlPrj2___Win32_Release_Tcl81" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release_Tcl81" +# PROP Intermediate_Dir "Release_Tcl81" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /O1 /I "c:\progra~1\tcl\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_ATL_STATIC_REGISTRY" /D "_ATL_MIN_CRT" /FR /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /MT /W3 /O1 /I "c:\progra~1\tcl\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_ATL_STATIC_REGISTRY" /D "_ATL_MIN_CRT" /FR /Yu"stdafx.h" /FD /c +# ADD BASE RSC /l 0x809 /d "NDEBUG" +# ADD RSC /l 0x809 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib tcl80.lib tk80.lib /nologo /subsystem:windows /dll /machine:I386 /out:"..\bin\tclcontrol80.dll" /libpath:"c:\progra~1\tcl\lib\\" +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib tcl81.lib tk81.lib /nologo /subsystem:windows /dll /machine:I386 /out:"..\bin\tclcontrol81.dll" /libpath:"c:\progra~1\tcl\lib\\" +# Begin Custom Build - Performing registration +OutDir=.\Release_Tcl81 +TargetPath=\twemp\tclcontrol\bin\tclcontrol81.dll +InputPath=\twemp\tclcontrol\bin\tclcontrol81.dll +SOURCE="$(InputPath)" + +"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + regsvr32 /s /c "$(TargetPath)" + echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" + +# End Custom Build + +!ELSEIF "$(CFG)" == "TclControlPrj2 - Win32 Debug Tcl81" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "TclControlPrj2___Win32_Debug_Tcl81" +# PROP BASE Intermediate_Dir "TclControlPrj2___Win32_Debug_Tcl81" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug_Tcl81" +# PROP Intermediate_Dir "Debug_Tcl81" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /Gi /GX /ZI /Od /I "c:\progra~1\tcl\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /FR /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /Gi /GX /ZI /Od /I "c:\progra~1\tcl\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /FR /Yu"stdafx.h" /FD /GZ /c +# ADD BASE RSC /l 0x809 /d "_DEBUG" +# ADD RSC /l 0x809 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib tcl80.lib tk80.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"..\bin\tclcontrol80.dll" /pdbtype:sept /libpath:"c:\progra~1\tcl\lib\\" +# SUBTRACT BASE LINK32 /verbose +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib tcl81.lib tk81.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"..\bin\tclcontrol81.dll" /pdbtype:sept /libpath:"c:\progra~1\tcl\lib\\" +# SUBTRACT LINK32 /verbose +# Begin Custom Build - Performing registration +OutDir=.\Debug_Tcl81 +TargetPath=\twemp\tclcontrol\bin\tclcontrol81.dll +InputPath=\twemp\tclcontrol\bin\tclcontrol81.dll +SOURCE="$(InputPath)" + +"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + regsvr32 /s /c "$(TargetPath)" + echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" + +# End Custom Build + +!ELSEIF "$(CFG)" == "TclControlPrj2 - Win32 Debug Tcl84" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "TclControlPrj2___Win32_Debug_Tcl84" +# PROP BASE Intermediate_Dir "TclControlPrj2___Win32_Debug_Tcl84" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "TclControlPrj2___Win32_Debug_Tcl84" +# PROP Intermediate_Dir "TclControlPrj2___Win32_Debug_Tcl84" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /Gi /GX /ZI /Od /I "c:\progra~1\tcl\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /FR /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /Gi /GX /ZI /Od /I "c:\progra~1\tcl\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /FR /Yu"stdafx.h" /FD /GZ /c +# ADD BASE RSC /l 0x809 /d "_DEBUG" +# ADD RSC /l 0x809 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib tcl80.lib tk80.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"..\bin\tclcontrol80.dll" /pdbtype:sept /libpath:"c:\progra~1\tcl\lib\\" +# SUBTRACT BASE LINK32 /verbose +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib tcl84.lib tk84.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"c:\progra~1\tcl\bin\tclcontrol84.dll" /pdbtype:sept /libpath:"c:\progra~1\tcl\lib\\" +# SUBTRACT LINK32 /verbose +# Begin Custom Build - Performing registration +OutDir=.\TclControlPrj2___Win32_Debug_Tcl84 +TargetPath=\progra~1\tcl\bin\tclcontrol84.dll +InputPath=\progra~1\tcl\bin\tclcontrol84.dll +SOURCE="$(InputPath)" + +"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + regsvr32 /s /c "$(TargetPath)" + echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" + +# End Custom Build + +!ELSEIF "$(CFG)" == "TclControlPrj2 - Win32 Release Tcl84" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "TclControlPrj2___Win32_Release_Tcl84" +# PROP BASE Intermediate_Dir "TclControlPrj2___Win32_Release_Tcl84" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "TclControlPrj2___Win32_Release_Tcl84" +# PROP Intermediate_Dir "TclControlPrj2___Win32_Release_Tcl84" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /O1 /I "c:\progra~1\tcl\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_ATL_STATIC_REGISTRY" /D "_ATL_MIN_CRT" /FR /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /MT /W3 /GX /O1 /I "c:\progra~1\tcl\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_ATL_STATIC_REGISTRY" /D "_ATL_MIN_CRT" /FR /Yu"stdafx.h" /FD /c +# ADD BASE RSC /l 0x809 /d "NDEBUG" +# ADD RSC /l 0x809 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib tcl80.lib tk80.lib /nologo /subsystem:windows /dll /machine:I386 /out:"..\bin\tclcontrol80.dll" /libpath:"c:\progra~1\tcl\lib\\" +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib tcl84.lib tk84.lib /nologo /subsystem:windows /dll /machine:I386 /out:"c:\progra~1\tcl\bin\tclcontrol.dll" /libpath:"c:\progra~1\tcl\lib\\" +# Begin Custom Build - Performing registration +OutDir=.\TclControlPrj2___Win32_Release_Tcl84 +TargetPath=\progra~1\tcl\bin\tclcontrol.dll +InputPath=\progra~1\tcl\bin\tclcontrol.dll +SOURCE="$(InputPath)" + +"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + regsvr32 /s /c "$(TargetPath)" + echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" + +# End Custom Build + +!ENDIF + +# Begin Target + +# Name "TclControlPrj2 - Win32 Release Tcl82" +# Name "TclControlPrj2 - Win32 Debug Tcl82" +# Name "TclControlPrj2 - Win32 Release Tcl80" +# Name "TclControlPrj2 - Win32 Debug Tcl80" +# Name "TclControlPrj2 - Win32 Release Tcl81" +# Name "TclControlPrj2 - Win32 Debug Tcl81" +# Name "TclControlPrj2 - Win32 Debug Tcl84" +# Name "TclControlPrj2 - Win32 Release Tcl84" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\dlldatax.c +# PROP Exclude_From_Scan -1 +# PROP BASE Exclude_From_Build 1 +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.cpp +# ADD BASE CPP /Yc"stdafx.h" +# ADD CPP /Yc"stdafx.h" +# End Source File +# Begin Source File + +SOURCE=.\TclClassFactory.cpp +# End Source File +# Begin Source File + +SOURCE=.\TclControl.cpp +# End Source File +# Begin Source File + +SOURCE=.\TclControlPrj2.cpp +# End Source File +# Begin Source File + +SOURCE=.\TclControlPrj2.def +# End Source File +# Begin Source File + +SOURCE=.\TclControlPrj2.idl +# ADD BASE MTL /tlb ".\TclControlPrj2.tlb" /h "TclControlPrj2.h" /iid "TclControlPrj2_i.c" /Oicf +# ADD MTL /tlb ".\TclControlPrj2.tlb" /h "TclControlPrj2.h" /iid "TclControlPrj2_i.c" /Oicf +# End Source File +# Begin Source File + +SOURCE=.\TclControlPrj2.rc +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\dlldatax.h +# PROP Exclude_From_Scan -1 +# PROP BASE Exclude_From_Build 1 +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=.\Resource.h +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.h +# End Source File +# Begin Source File + +SOURCE=.\TclClassFactory.h +# End Source File +# Begin Source File + +SOURCE=.\TclControl.h +# End Source File +# Begin Source File + +SOURCE=.\TclControlPrj2CP.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# Begin Source File + +SOURCE=.\tclcontr.bmp +# End Source File +# Begin Source File + +SOURCE=.\TclControl.rgs +# End Source File +# End Group +# End Target +# End Project diff --git a/src/TclControlPrj2.dsw b/src/TclControlPrj2.dsw new file mode 100644 index 0000000..9bf2ca1 --- /dev/null +++ b/src/TclControlPrj2.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "TclControlPrj2"=.\TclControlPrj2.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/src/TclControlPrj2.idl b/src/TclControlPrj2.idl new file mode 100644 index 0000000..1dd5f7c --- /dev/null +++ b/src/TclControlPrj2.idl @@ -0,0 +1,80 @@ +// TclControlPrj2.idl : IDL source for TclControlPrj2.dll +// + +// This file will be processed by the MIDL tool to +// produce the type library (TclControlPrj2.tlb) and marshalling code. + +import "oaidl.idl"; +import "ocidl.idl"; +#include "olectl.h" + + + [ + object, + uuid(E796A72E-F130-11D2-8003-0040055861F2), + dual, + helpstring("ITclControl Interface"), + pointer_default(unique) + ] + interface ITclControl : IDispatch + { + [propget, id(1), helpstring("Current result of the interpreter")] HRESULT Result([out, retval] BSTR *pVal); + [id(2), helpstring("Evaluate a script in the Tcl interpreter")] HRESULT Eval([in] BSTR command, [out, retval] VARIANT_BOOL *pbOk); + [id(3), helpstring("Place a trace on a variable")] HRESULT TraceVar([in] BSTR name, [in] long flags, [out, retval] VARIANT_BOOL *pbOk); + [id(4), helpstring("Place trace on an array element")] HRESULT TraceVar2([in] BSTR name1, [in] BSTR name2, [in] long flags, [out, retval] VARIANT_BOOL *pbOk); + [id(5), helpstring("Remove a trace on a Tcl variable")] HRESULT UntraceVar([in] BSTR name, [in] long flags); + [id(6), helpstring("Remove a trace on a Tcl array element")] HRESULT UntraceVar2([in] BSTR name1, [in] BSTR name2, [in] long flags); + [id(7), helpstring("Set the value of a variable.")] HRESULT SetVar([in] BSTR name, [in] BSTR value, [in] long flags, [out, retval] VARIANT_BOOL *pbOk); + [id(8), helpstring("Get the value of a variable.")] HRESULT GetVar([in] BSTR name, [in] long flags, [out, retval] BSTR *pValue); + [id(9), helpstring("Sets the value of an array entry.")] HRESULT SetVar2([in] BSTR name1, [in] BSTR name2, [in] BSTR value, [in] long flags, [out, retval] VARIANT_BOOL *pbOk); + [id(10), helpstring("Returns the value of an array entry.")] HRESULT GetVar2([in] BSTR name1, [in] BSTR name2, [in] long flags, [out, retval] BSTR *pVal); + [id(11), helpstring("Unsets a Tcl variable.")] HRESULT UnsetVar([in] BSTR name, [in] long flags); + [id(12), helpstring("Unset a Tcl array entry.")] HRESULT UnsetVar2([in] BSTR name1, [in] BSTR name2, [in] long flags); + }; + +[ + uuid(E796A720-F130-11D2-8003-0040055861F2), + version(1.0), + helpstring("TclControlPrj2 1.0 Type Library") +] +library TCLCONTROLPRJ2Lib +{ + importlib("stdole32.tlb"); + importlib("stdole2.tlb"); + + typedef enum { + GLOBAL_ONLY = 1, + NAMESPACE_ONLY = 2, + APPEND_VALUE = 4, + LIST_ELEMENT = 8, + TRACE_READS = 0x10, + TRACE_WRITES = 0x20, + TRACE_UNSETS = 0x40, + TRACE_DESTROYED = 0x80, + INTERP_DESTROYED = 0x100, + LEAVE_ERR_MSG = 0x200, + PARSE_PART1 = 0x400 + } Flags; + + [ + uuid(E796A730-F130-11D2-8003-0040055861F2), + helpstring("_ITclControlEvents Interface") + ] + dispinterface _ITclControlEvents + { + properties: + methods: + [id(1), helpstring("Called when a client-traced variable is accessed")] void OnTraceVar([in] BSTR name1, [in] long flags); + [id(2), helpstring("Called when a client-traced array is accessed")] void OnTraceVar2([in] BSTR name1, [in] BSTR name2, [in] long flags); + }; + + [ + uuid(E796A72F-F130-11D2-8003-0040055861F2), + helpstring("TclControl Class") + ] + coclass TclControl + { + [default] interface ITclControl; + [default, source] dispinterface _ITclControlEvents; + }; +}; diff --git a/src/TclControlPrj2.rc b/src/TclControlPrj2.rc new file mode 100644 index 0000000..7ce8d42 --- /dev/null +++ b/src/TclControlPrj2.rc @@ -0,0 +1,147 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "1 TYPELIB ""TclControlPrj2.tlb""\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,1 + PRODUCTVERSION 1,0,0,1 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "Written by Farzad Pezeshkpour\0" + VALUE "CompanyName", "University of East Anglia\0" + VALUE "FileDescription", "TclControlPrj2 Module\0" + VALUE "FileVersion", "1, 0, 0, 1\0" + VALUE "InternalName", "TclControlPrj2\0" + VALUE "LegalCopyright", "Copyright 1999\0" + VALUE "LegalTrademarks", "Public Licence\0" + VALUE "OLESelfRegister", "\0" + VALUE "OriginalFilename", "TclControlPrj2.DLL\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "TclControlPrj2 Module\0" + VALUE "ProductVersion", "1, 0, 0, 1\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +#endif // !_MAC + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_PROJNAME "TclControlPrj2" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// English (U.K.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Bitmap +// + +IDB_TCLCONTROL BITMAP DISCARDABLE "tclcontr.bmp" + +///////////////////////////////////////////////////////////////////////////// +// +// REGISTRY +// + +IDR_TCLCONTROL REGISTRY DISCARDABLE "TclControl.rgs" +#endif // English (U.K.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +1 TYPELIB "TclControlPrj2.tlb" + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/src/TclControlPrj2CP.h b/src/TclControlPrj2CP.h new file mode 100644 index 0000000..1f61a7e --- /dev/null +++ b/src/TclControlPrj2CP.h @@ -0,0 +1,60 @@ +#ifndef _TCLCONTROLPRJ2CP_H_ +#define _TCLCONTROLPRJ2CP_H_ + + +template +class CProxy_ITclControlEvents : public IConnectionPointImpl +{ + //Warning this class may be recreated by the wizard. +public: + VOID Fire_OnTraceVar(BSTR name1, LONG Flags) + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[2]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + pvars[1] = name1; + pvars[0] = Flags; + DISPPARAMS disp = { pvars, NULL, 2, 0 }; + pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + + } + VOID Fire_OnTraceVar2(BSTR name1, BSTR name2, LONG Flags) + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[3]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + pvars[2] = name1; + pvars[1] = name2; + pvars[0] = Flags; + DISPPARAMS disp = { pvars, NULL, 3, 0 }; + pDispatch->Invoke(0x2, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + + } +}; +#endif \ No newline at end of file diff --git a/src/TclControlPrj2ps.def b/src/TclControlPrj2ps.def new file mode 100644 index 0000000..536361b --- /dev/null +++ b/src/TclControlPrj2ps.def @@ -0,0 +1,11 @@ + +LIBRARY "TclControlPrj2PS" + +DESCRIPTION 'Proxy/Stub DLL' + +EXPORTS + DllGetClassObject @1 PRIVATE + DllCanUnloadNow @2 PRIVATE + GetProxyDllInfo @3 PRIVATE + DllRegisterServer @4 PRIVATE + DllUnregisterServer @5 PRIVATE diff --git a/src/TclControlPrj2ps.mk b/src/TclControlPrj2ps.mk new file mode 100644 index 0000000..ca86084 --- /dev/null +++ b/src/TclControlPrj2ps.mk @@ -0,0 +1,16 @@ + +TclControlPrj2ps.dll: dlldata.obj TclControlPrj2_p.obj TclControlPrj2_i.obj + link /dll /out:TclControlPrj2ps.dll /def:TclControlPrj2ps.def /entry:DllMain dlldata.obj TclControlPrj2_p.obj TclControlPrj2_i.obj \ + kernel32.lib rpcndr.lib rpcns4.lib rpcrt4.lib oleaut32.lib uuid.lib \ + +.c.obj: + cl /c /Ox /DWIN32 /D_WIN32_WINNT=0x0400 /DREGISTER_PROXY_DLL \ + $< + +clean: + @del TclControlPrj2ps.dll + @del TclControlPrj2ps.lib + @del TclControlPrj2ps.exp + @del dlldata.obj + @del TclControlPrj2_p.obj + @del TclControlPrj2_i.obj diff --git a/src/dlldatax.c b/src/dlldatax.c new file mode 100644 index 0000000..3e618be --- /dev/null +++ b/src/dlldatax.c @@ -0,0 +1,42 @@ +// wrapper for dlldata.c + +#ifdef _MERGE_PROXYSTUB // merge proxy stub DLL + +#define REGISTER_PROXY_DLL //DllRegisterServer, etc. + +#define _WIN32_WINNT 0x0400 //for WinNT 4.0 or Win95 with DCOM +#define USE_STUBLESS_PROXY //defined only with MIDL switch /Oicf + +#pragma comment(lib, "rpcndr.lib") +#pragma comment(lib, "rpcns4.lib") +#pragma comment(lib, "rpcrt4.lib") + +#define DllMain PrxDllMain +#define DllRegisterServer PrxDllRegisterServer +#define DllUnregisterServer PrxDllUnregisterServer +#define DllGetClassObject PrxDllGetClassObject +#define DllCanUnloadNow PrxDllCanUnloadNow + +#include "dlldata.c" +#include "TclControlPrj2_p.c" + +#ifdef _NOPROXY //no midl generated dlldata.c + +#define STRICT 1 +#include + +BOOL WINAPI PrxDllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) +{return TRUE;} + +STDAPI PrxDllCanUnloadNow(void){return S_OK;} + +STDAPI PrxDllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) +{return CLASS_E_CLASSNOTAVAILABLE;} + +STDAPI PrxDllRegisterServer(void){return S_OK;} + +STDAPI PrxDllUnregisterServer(void){return S_OK;} + +#endif //!PROXY_DELEGATION + +#endif //_MERGE_PROXYSTUB diff --git a/src/dlldatax.h b/src/dlldatax.h new file mode 100644 index 0000000..7ce37a0 --- /dev/null +++ b/src/dlldatax.h @@ -0,0 +1,25 @@ +#if !defined(AFX_DLLDATAX_H__E796A72B_F130_11D2_8003_0040055861F2__INCLUDED_) +#define AFX_DLLDATAX_H__E796A72B_F130_11D2_8003_0040055861F2__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#ifdef _MERGE_PROXYSTUB + +extern "C" +{ +BOOL WINAPI PrxDllMain(HINSTANCE hInstance, DWORD dwReason, + LPVOID lpReserved); +STDAPI PrxDllCanUnloadNow(void); +STDAPI PrxDllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv); +STDAPI PrxDllRegisterServer(void); +STDAPI PrxDllUnregisterServer(void); +} + +#endif + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_DLLDATAX_H__E796A72B_F130_11D2_8003_0040055861F2__INCLUDED_) diff --git a/src/resource.h b/src/resource.h new file mode 100644 index 0000000..c6cb34e --- /dev/null +++ b/src/resource.h @@ -0,0 +1,18 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by TclControlPrj2.rc +// +#define IDS_PROJNAME 100 +#define IDB_TCLCONTROL 101 +#define IDR_TCLCONTROL 102 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 201 +#define _APS_NEXT_COMMAND_VALUE 32768 +#define _APS_NEXT_CONTROL_VALUE 201 +#define _APS_NEXT_SYMED_VALUE 103 +#endif +#endif diff --git a/src/tclcontr.bmp b/src/tclcontr.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8048e37570bbe10f65964ad1710243ad25adef4c GIT binary patch literal 246 zcmZ{cu@!(I3`8T(E`^TZOXVE)u4Bze^l2E$$`&sPbb64xgby6&L!k??qt;#%%?`5r zmw_0}IRcKBYOP2E%{R4X9SX~i%uGpy6-tu06lS6usXS)mMPnvb=l%Y8FS1GKFBkk` H8a$>K#w#zg literal 0 HcmV?d00001 -- 2.23.0