[PYTHONMAC-SIG] regarding sys.path (was: Anyone using
$(APPLICATION) in sys.path preferences?)
Jack Jansen
Jack.Jansen@cwi.nl
Wed, 13 Nov 1996 14:22:31 +0100
This is a multipart MIME message.
--===_0_Wed_Nov_13_14:20:56_MET_1996
Content-Type: text/plain; charset=us-ascii
> > Found it! It turns out that SetDialogItemText() cannot handle more
> > than 255 chars, which is to be expected but which I forgot.
> >
>
> If you do a "GetDialogItem()" call on that item, the handle that you get
> back is a handle to the text (of whatever size), which you can directly
> manipulate (though this is best done before the dialog is shown and that
> field selected, otherwise the TERecord can get out of sync).
Thanks! It wasn't as simple as this, but by using a few SelectDialogItemText
calls I managed to convince TE about the new contents of the resource.
Appended are EditPythonPrefs.py and EditPythonPrefs.rsrc.hqx with the
workaround.
--
Jack Jansen | ++++ stop the execution of Mumia Abu-Jamal ++++
Jack.Jansen@cwi.nl | ++++ if you agree copy these lines to your sig ++++
http://www.cwi.nl/~jack | see http://www.xs4all.nl/~tank/spg-l/sigaction.htm
--===_0_Wed_Nov_13_14:20:56_MET_1996
Content-Type: text/plain; charset=us-ascii
Content-Description: EditPythonPrefs.py
"""Edit the Python Preferences file."""
#
# This program is getting more and more clunky. It should really
# be rewritten in a modeless way some time soon.
from Dlg import *
from Events import *
from Res import *
import string
import struct
import macfs
import MacOS
import os
import sys
import Res # For Res.Error
# Resource in the Python resource chain
PREFNAME_NAME="PythonPreferenceFileName"
# resource IDs in our own resources (dialogs, etc)
MESSAGE_ID = 256
DIALOG_ID = 511
TEXT_ITEM = 1
OK_ITEM = 2
CANCEL_ITEM = 3
DIR_ITEM = 4
TITLE_ITEM = 5
OPTIONS_ITEM = 7
# The options dialog. There is a correspondence between
# the dialog item numbers and the option.
OPT_DIALOG_ID = 510
# 1 thru 9 are the options
# The GUSI creator/type and delay-console
OD_CREATOR_ITEM = 10
OD_TYPE_ITEM = 11
OD_DELAYCONSOLE_ITEM = 12
OD_OK_ITEM = 13
OD_CANCEL_ITEM = 14
# Resource IDs in the preferences file
PATH_STRINGS_ID = 128
DIRECTORY_ID = 128
OPTIONS_ID = 128
GUSI_ID = 10240
# Override IDs (in the applet)
OVERRIDE_PATH_STRINGS_ID = 129
OVERRIDE_DIRECTORY_ID = 129
OVERRIDE_OPTIONS_ID = 129
OVERRIDE_GUSI_ID = 10241
# Things we know about the GUSI resource. Note the code knows these too.
GUSIPOS_TYPE=0
GUSIPOS_CREATOR=4
GUSIPOS_SKIP=8
GUSIPOS_FLAGS=9
GUSIPOS_VERSION=10
GUSIVERSION='0181'
GUSIFLAGS_DELAY=0x20 # Mask
READ = 1
WRITE = 2
smAllScripts = -3
kOnSystemDisk = 0x8000
def restolist(data):
"""Convert STR# resource data to a list of strings"""
if not data:
return []
num, = struct.unpack('h', data[:2])
data = data[2:]
rv = []
for i in range(num):
strlen = ord(data[0])
if strlen < 0: strlen = strlen + 256
str = data[1:strlen+1]
data = data[strlen+1:]
rv.append(str)
return rv
def listtores(list):
"""Convert a list of strings to STR# resource data"""
rv = struct.pack('h', len(list))
for str in list:
rv = rv + chr(len(str)) + str
return rv
def message(str = "Hello, world!", id = MESSAGE_ID):
"""Show a simple alert with a text message"""
d = GetNewDialog(id, -1)
d.SetDialogDefaultItem(1)
tp, h, rect = d.GetDialogItem(2)
SetDialogItemText(h, str)
while 1:
n = ModalDialog(None)
if n == 1: break
def optinteract((options, creator, type, delaycons)):
"""Let the user interact with the options dialog"""
old_options = (options[:], creator, type, delaycons)
d = GetNewDialog(OPT_DIALOG_ID, -1)
tp, h, rect = d.GetDialogItem(OD_CREATOR_ITEM)
SetDialogItemText(h, creator)
tp, h, rect = d.GetDialogItem(OD_TYPE_ITEM)
SetDialogItemText(h, type)
d.SetDialogDefaultItem(OD_OK_ITEM)
d.SetDialogCancelItem(OD_CANCEL_ITEM)
while 1:
for i in range(len(options)):
tp, h, rect = d.GetDialogItem(i+1)
h.as_Control().SetControlValue(options[i])
tp, h, rect = d.GetDialogItem(OD_DELAYCONSOLE_ITEM)
h.as_Control().SetControlValue(delaycons)
n = ModalDialog(None)
if n == OD_OK_ITEM:
tp, h, rect = d.GetDialogItem(OD_CREATOR_ITEM)
ncreator = GetDialogItemText(h)
tp, h, rect = d.GetDialogItem(OD_TYPE_ITEM)
ntype = GetDialogItemText(h)
if len(ncreator) == 4 and len(ntype) == 4:
return options, ncreator, ntype, delaycons
else:
sys.stderr.write('\007')
elif n == OD_CANCEL_ITEM:
return old_options
elif n in (OD_CREATOR_ITEM, OD_TYPE_ITEM):
pass
elif n == OD_DELAYCONSOLE_ITEM:
delaycons = (not delaycons)
elif 1 <= n <= len(options):
options[n-1] = (not options[n-1])
def interact(list, pythondir, options, title):
"""Let the user interact with the dialog"""
opythondir = pythondir
try:
# Try to go to the "correct" dir for GetDirectory
os.chdir(pythondir.as_pathname())
except os.error:
pass
d = GetNewDialog(DIALOG_ID, -1)
tp, h, rect = d.GetDialogItem(TITLE_ITEM)
SetDialogItemText(h, title)
tp, h, rect = d.GetDialogItem(TEXT_ITEM)
## SetDialogItemText(h, string.joinfields(list, '\r'))
h.data = string.joinfields(list, '\r')
d.SelectDialogItemText(TEXT_ITEM, 0, 32767)
d.SelectDialogItemText(TEXT_ITEM, 0, 0)
## d.SetDialogDefaultItem(OK_ITEM)
d.SetDialogCancelItem(CANCEL_ITEM)
d.GetDialogWindow().ShowWindow()
d.DrawDialog()
while 1:
n = ModalDialog(None)
if n == OK_ITEM:
break
if n == CANCEL_ITEM:
return None
## if n == REVERT_ITEM:
## return [], pythondir
if n == DIR_ITEM:
fss, ok = macfs.GetDirectory('Select python home folder:')
if ok:
pythondir = fss
if n == OPTIONS_ITEM:
options = optinteract(options)
tmp = string.splitfields(h.data, '\r')
rv = []
for i in tmp:
if i:
rv.append(i)
return rv, pythondir, options
def getprefpath(id):
# Load the path and directory resources
try:
sr = GetResource('STR#', id)
except (MacOS.Error, Res.Error):
return None, None
d = sr.data
l = restolist(d)
return l, sr
def getprefdir(id):
try:
dr = GetResource('alis', id)
fss, fss_changed = macfs.RawAlias(dr.data).Resolve()
except (MacOS.Error, Res.Error):
return None, None, 1
return fss, dr, fss_changed
def getoptions(id):
try:
opr = GetResource('Popt', id)
except (MacOS.Error, Res.Error):
return [0]*9, None
options = map(lambda x: ord(x), opr.data)
while len(options) < 9:
options = options + [0]
return options, opr
def getgusioptions(id):
try:
opr = GetResource('GU\267I', id)
except (MacOS.Error, Res.Error):
return '????', '????', 0, None
data = opr.data
type = data[GUSIPOS_TYPE:GUSIPOS_TYPE+4]
creator = data[GUSIPOS_CREATOR:GUSIPOS_CREATOR+4]
flags = ord(data[GUSIPOS_FLAGS])
version = data[GUSIPOS_VERSION:GUSIPOS_VERSION+4]
if version <> GUSIVERSION:
message('GU\267I resource version "%s", fixing to "%s"'%(version,
GUSIVERSION))
flags = 0
delay = (not not (flags & GUSIFLAGS_DELAY))
return creator, type, delay, opr
def setgusioptions(opr, creator, type, delay):
data = opr.data
flags = ord(data[GUSIPOS_FLAGS])
version = data[GUSIPOS_VERSION:GUSIPOS_VERSION+4]
if version <> GUSIVERSION:
flags = 0x88
version = GUSIVERSION
if delay:
flags = flags | GUSIFLAGS_DELAY
else:
flags = flags & ~GUSIFLAGS_DELAY
data = type + creator + data[GUSIPOS_SKIP] + chr(flags) + GUSIVERSION +
data[GUSIPOS_VERSION+4:]
return data
def openpreffile(rw):
# Find the preferences folder and our prefs file, create if needed.
vrefnum, dirid = macfs.FindFolder(kOnSystemDisk, 'pref', 0)
try:
pnhandle = GetNamedResource('STR ', PREFNAME_NAME)
except Res.Error:
message("No %s resource (old Python?)"%PREFNAME_NAME)
sys.exit(1)
prefname = pnhandle.data[1:]
preff_fss = macfs.FSSpec((vrefnum, dirid, prefname))
try:
preff_handle = FSpOpenResFile(preff_fss, rw)
except Res.Error:
# Create it
message('No preferences file, creating one...')
FSpCreateResFile(preff_fss, 'Pyth', 'pref', smAllScripts)
preff_handle = FSpOpenResFile(preff_fss, rw)
return preff_handle
def openapplet(name):
fss = macfs.FSSpec(name)
try:
app_handle = FSpOpenResFile(fss, WRITE)
except Res.Error:
message('File does not have a resource fork.')
sys.exit(0)
return app_handle
def edit_preferences():
preff_handle = openpreffile(WRITE)
l, sr = getprefpath(PATH_STRINGS_ID)
if l == None:
message('Cannot find any sys.path resource! (Old python?)')
sys.exit(0)
fss, dr, fss_changed = getprefdir(DIRECTORY_ID)
if fss == None:
fss = macfs.FSSpec(os.getcwd())
fss_changed = 1
options, opr = getoptions(OPTIONS_ID)
saved_options = options[:]
creator, type, delaycons, gusi_opr = getgusioptions(GUSI_ID)
saved_gusi_options = creator, type, delaycons
# Let the user play away
result = interact(l, fss, (options, creator, type, delaycons),
'System-wide preferences')
# See what we have to update, and how
if result == None:
sys.exit(0)
pathlist, nfss, (options, creator, type, delaycons) = result
if nfss != fss:
fss_changed = 1
if fss_changed:
alias = nfss.NewAlias()
if dr:
dr.data = alias.data
dr.ChangedResource()
else:
dr = Resource(alias.data)
dr.AddResource('alis', DIRECTORY_ID, '')
if pathlist != l:
if pathlist == []:
if sr.HomeResFile() == preff_handle:
sr.RemoveResource()
elif sr.HomeResFile() == preff_handle:
sr.data = listtores(pathlist)
sr.ChangedResource()
else:
sr = Resource(listtores(pathlist))
sr.AddResource('STR#', PATH_STRINGS_ID, '')
if options != saved_options:
newdata = reduce(lambda x, y: x+chr(y), options, '')
if opr and opr.HomeResFile() == preff_handle:
opr.data = newdata
opr.ChangedResource()
else:
opr = Resource(newdata)
opr.AddResource('Popt', OPTIONS_ID, '')
if (creator, type, delaycons) != saved_gusi_options:
newdata = setgusioptions(gusi_opr, creator, type, delaycons)
if gusi_opr.HomeResFile() == preff_handle:
gusi_opr.data = newdata
gusi_opr.ChangedResource()
else:
ngusi_opr = Resource(newdata)
ngusi_opr.AddResource('GU\267I', GUSI_ID, '')
CloseResFile(preff_handle)
def edit_applet(name):
pref_handle = openpreffile(READ)
app_handle = openapplet(name)
notfound = ''
l, sr = getprefpath(OVERRIDE_PATH_STRINGS_ID)
if l == None:
notfound = 'path'
l, dummy = getprefpath(PATH_STRINGS_ID)
if l == None:
message('Cannot find any sys.path resource! (Old python?)')
sys.exit(0)
fss, dr, fss_changed = getprefdir(OVERRIDE_DIRECTORY_ID)
if fss == None:
if notfound:
notfound = notfound + ', directory'
else:
notfound = 'directory'
fss, dummy, dummy2 = getprefdir(DIRECTORY_ID)
if fss == None:
fss = macfs.FSSpec(os.getcwd())
fss_changed = 1
options, opr = getoptions(OVERRIDE_OPTIONS_ID)
if not opr:
if notfound:
notfound = notfound + ', options'
else:
notfound = 'options'
options, dummy = getoptions(OPTIONS_ID)
saved_options = options[:]
creator, type, delaycons, gusi_opr = getgusioptions(OVERRIDE_GUSI_ID)
if not gusi_opr:
if notfound:
notfound = notfound + ', GUSI options'
else:
notfound = 'GUSI options'
creator, type, delaycons, gusi_opr = getgusioptions(GUSI_ID)
saved_gusi_options = creator, type, delaycons
dummy = dummy2 = None # Discard them.
if notfound:
message('Warning: initial %s taken from system-wide defaults'%notfound)
# Let the user play away
print 'DBG interaction'
result = interact(l, fss, (options, creator, type, delaycons), name)
# See what we have to update, and how
if result == None:
sys.exit(0)
pathlist, nfss, (options, creator, type, delaycons) = result
if nfss != fss:
fss_changed = 1
if fss_changed:
alias = nfss.NewAlias()
if dr:
dr.data = alias.data
dr.ChangedResource()
else:
dr = Resource(alias.data)
dr.AddResource('alis', OVERRIDE_DIRECTORY_ID, '')
if pathlist != l:
if pathlist == []:
if sr.HomeResFile() == app_handle:
sr.RemoveResource()
elif sr and sr.HomeResFile() == app_handle:
sr.data = listtores(pathlist)
sr.ChangedResource()
else:
sr = Resource(listtores(pathlist))
sr.AddResource('STR#', OVERRIDE_PATH_STRINGS_ID, '')
if options != saved_options:
newdata = reduce(lambda x, y: x+chr(y), options, '')
if opr and opr.HomeResFile() == app_handle:
opr.data = newdata
opr.ChangedResource()
else:
opr = Resource(newdata)
opr.AddResource('Popt', OVERRIDE_OPTIONS_ID, '')
if (creator, type, delaycons) != saved_gusi_options:
newdata = setgusioptions(gusi_opr, creator, type, delaycons)
id, type, name = gusi_opr.GetResInfo()
if gusi_opr.HomeResFile() == app_handle and id == OVERRIDE_GUSI_ID:
gusi_opr.data = newdata
gusi_opr.ChangedResource()
else:
ngusi_opr = Resource(newdata)
ngusi_opr.AddResource('GU\267I', OVERRIDE_GUSI_ID, '')
CloseResFile(app_handle)
def main():
try:
h = OpenResFile('EditPythonPrefs.rsrc')
except Res.Error:
pass # Assume we already have acces to our own resource
if len(sys.argv) <= 1:
edit_preferences()
else:
for appl in sys.argv[1:]:
edit_applet(appl)
if __name__ == '__main__':
main()
--===_0_Wed_Nov_13_14:20:56_MET_1996
Content-Type: text/plain; charset=us-ascii
Content-Description: EditPythonPrefs.rsrc.hqx
(This file must be converted with BinHex 4.0)
:&%9NDA43HA4SEfj3FQ9QFbjbFh*M!(*cFQ058d9%!3#3"`m+@DJ!N!3"!!!!$FN
!!!c*!!!"36B8)&3JD!!8)&"p%E"S%3!k!@FQ%Lm-6VS#$!`k!&Tj&%9NDA43HA4
SEfj3FQ9QFbjbFh*MC3)!!!"bFh*M8P-!!(*cFQ058d9%!3!!D!#!!*!3IY+ZUS!
X!*!'$`Vr%F#SD3%G3"(rma0`!"!Zrr1pdK&Q%&%f[P9V!3,fK[P9V!3%`86)
"Caj%&3`!!"aP%R!!%#j$&3`!!"pL"R!"B!!"!3)X@P3Y,N5p!3!E2!&Q-#G92KT
+J#"6!LJ![`!Z)J$Y#3)"!%#$+0Xd%kRA,`a1ZJ%*5QGV!3#Q9d-k!!!"!!!"!!!
!!S!!!!4!!!!))!!!%"!!!#')!!""K!!!Jm)!!32"!!)(q)!%"i4!#!3#)"!)i4!
J%b#)3"iJI)!$i$T!$!!j)"-!1K!3i$`)$"ii"!!"q!)-!$J"%J"!!*,iJ!"-!3!
!)!)!!"!%!!!)#!!!""!!!!)J!!!"3!!!!)!!!!%!!!!$J!!!"m!!!!rJ!!!Im!!
!2rJ!!(rm!!$rrJ!"rrm!!rrrJ!Irrm!2rrrJ(rrrm$rrrrKrrrrmrrrrrRrrrrm
rrrrq(rrrr!rrrrJ(rrri!rrrq!(rrm!!rrq!!(rr!!!rrJ!!(r`!!!ri!!!(m!!
!!q!!!!(!!!!!J!#3"!T3i!!HK)!!"k%J!!!!"d&38%`!N!C!!3!#J!4!#f!6N!!
L#%8NJZ0"!b$$%cm,#`33!L!"3!#!!3!$J!I!$q!Im$riIrcrrhrr2rmIr`rl"r!
$i!(!!)!!!!3!N"$r!*!Hr`$r!*!Fr`!!!2m!N"Vr!!$ep3$r!*!Br`!!pC!%!2m
!N"Er!!$epE#`pI8!r`#3&2m!!2AepE#`pIAe!2m!N",r!!$epI@`N!6epI8!r`#
3%2m!!2@3",#3"2@3"!$r!*!1r`!!pC!%X*!%rj!%pI8!r`#3$2m!!2@3"E$rrrm
)N!6rpI8!r`#3#[m!!2@3"[mc#*!(rrAe!2m!N!Mr!!$eN!Er#!Jcrrrr#*!%rrA
e!2m!N!Er!!$eN!Er#$2rrrIhr`L3"Irep3$r!*!%r`!!pC!(rj!%prAerc-)N!A
rN!8!!2m!!2@3#rq3"3%)N!8crrrrprm!!2rhpC!*rrmc#*!+-rrrrrIhr`!!rrI
eN!Ir"IIrrc-c-`L3"M2rrrrhr`#3"2rhpC!'r`8&prIrrrmcN!3)#$2rN!3!N!E
rpr@3"[rrpIAhprIrN!3c-c2rrrm!N!Mrpr@3$2H3"2q3"J#3#IrhpC!%rrreN!M
hN!6rrrm!N!VrprAerrAerr@3#2Ihr`#3$[rhpIrepIrerj!&pIIhr`#3%2rhpIr
rpC!(prIr!*!5rrIeN!Mhprm!N"6rpr@3"[Ihr`#3&[rhpC!%prIr!*!BrrIepII
hr`#3'[rhprIr!*!FrrIr!*!Hr`#3%3%!N!Mr!*!1rrAr!*!-rrAepIm!N!VrpE#
`pIrr!*!)rrAeX2rr#!Mr!*!'rrAepIm)N!Ar!*!%rrAepIm)r`J)r`J)r`!!rr@
3"Irhrrrr#!Jcrrm!rr@3"[mc-`Jc-rrr!!$rpC!&rrmcN!6rr`!!!2repIrrpIA
rN!B!N!6rpIrrpIAeprm!rrm!N!ArpC!%prm!N!VrpIAhr`#3$2rhr`#3$[m!N!U
!!!!!$`#3"r$`!*!&$`!2!*!&m&82m!!!!!m!Ar!2!!!!m!$`!!$`!!m!$mm!m!m
!m!!!r2r`$Im2!!!!rG$Gr`$`!!$rhGhr!!m!r`$rrrm!!2$r!!c`r`!!$`!!c`#
3"I!-m!#3"3r2!*!(m!#3"3)!N!J2!*!2m2!!N!d2!!m!N!h`!!$`!*!,$`!!!!m
!N![`!!93!2!!N!N2!!!&8!!2!*!*m!!!998!!2!!N!F2!!!!998!!!m!N!I`!!!
&99rrm!$`!*!&$`!!!!Arm!!2!!m!N!A`!!!!$p!!!!$`!2!!!!!2!*!%r-hrm!!
2!!m!!!$`!!!!$mhrc2!!!2!!m!!2!*!%$rrm!2!!!!rrr`$`!*!'rrr`!!!0rrc
`$m!!N!6rd!#3"!hrr-m!r!!!!!mFrph3!!!0rrc`!!r!!!!2%FcrrGh3$Irr!!!
!r!!!!2m!c-rrrGhrm!!!!!r!!*!&$-c2rrr`!*!%r!!!r`#3"-c-rr!!N!32`!m
!m!!!!!c2!*!(r!m!m2rrm-c`!*!($m$r!!!!$-m!N!Rm!*!%c2!!N!N2`!!!$-m
!N![m!!$-m!#3#`r!$-m!N!hmc2!!N!d2c`#3$r!!N!S9!#)!D!'!!Cm!!3!!!3#
3"3(r!*!%!3#3"!FUN!3!!3#3"#43HA3`!!!!!8C548B!!3!!!)!!!3#"5801)`!
"!!!",!!"!*!%!3S!"J#3"9)!&3$c!5F3#89NDA3J9'9iG)F!N!3"1`$`!8m",!3
#6dX!N!3"1`!8!8m!6J3'3f&ZBf9X!*!&qJ!8!3`"+`3I8f9XC@0d)#3S8&P85%p
1+5"SEfeP)'C[E'4PFLiZ,QB!N!80!"F!(J%Q#!P&C'Pd)&4PH(3Z!*!&+J!9!%i
"*iK24@jdCA)JFhPc,R"KG'JJBfpYF'pZC@jdFb`JEfjP)("PFL"XD@jP$5K9Ff8
J*#K3@94)6diT)'C[FL"`HA4SEfiJD'pYC5"QEfaNCA)T1J#3"3%6!"3"*3%V""T
%C@CKG@ad)(0dBA*dGA!JEh"dD@pZFbiZ,J!!!"8!,!"@!@B"D3!"!3!"!*!&!Ii
!!!!#A!!4!*!&(J!*!$!"$J8M4@jdCA)JD@jdCA*KBh4TGQ8JE@pNC5"KCR4PFL"
cBh*TF(3M!*!&-`!*!%8"$J8A9(*KBf8JD@e`Eh*d)(0dBA4PE@9ZG(1#!*!&53!
*!&X"$38F8h9`F(*PFh-JCAK`FQ9cFfP[EL"`FQPZG'PZC`#3"9m!#3"a!3`&'&9
ZBR9QCQ9bC@3JFh4NEh9d,h0dC'9bFJ#3"A8!#3#(!3X&%d4PBR9R)("KFR0PFL"
[GA4`GA4P!*!&S!!H!,)!M!8,6QpbE@&X)'9iDA4c!*!&S!#J!,)"#J8+CA*bEh)
JCAKTG!#3"H!!#J$a!3X&'d4TFf&LE'8JBA*RBbpKFQGf)'9YG@aKG'P[EJB!N!A
d!!S""J%-"5*%DA0KBQaP)'PZG'9bB@0dDACP)'p`G'P[ELecCA4dD@jR!*!&Z!#
J!-J!ka!!N!E-!+!!h!$V%!#3"3%)!!S"'J%,"5&%C@aKH5"MEfjcEfaP)(GTEQ4
[Gb"eER4TE#"ZC@9NC@3!N!8"(`$9!6-"$`3#6dX!N!3"(`!+!6-!4`3'3f&ZBf9
X!*!&"J!Q!"F!lSJD8(PdD'pZ)'PZG'9bF(*PG'9b)'p`G'P[ER-!N!@-!!S!R!%
,L"T,C@9`)(0dC'P[)(GTEQ4[Gb"[F'9Z)'pZ1J#3"EJ!#J$*!*H)&84PCQ&eE(3
JCQPXC5"MFQ9KG'pb1Q8!N!A-!!S!h3#AL"*%C@CKG@ad)'CTE'8JG(P`C6S!!!%
!!!!0b3!!$-N!!!&"!l,8G#8B!!!!(!%b!!Y#6N4-!!!!BNP$6L-!!!"Z8dPD43!
!!(T'8N9'!!%!KQPMFb-!!!#HD@0X1!!!!+TTBh-i!!!!YQPMFc3!!!$#D@0X0!!
!!-j%6%p(!!%!fN4*9%`!!3$b8(Pd-!!!!3S!J2rr!!!*'J#3"!%Xrrm!N!MrN!3
!!!%%!*!&J2rr!!!"%J#3"B(rr`!!#3m!N!3",2rr!!!"(3#3"!%Xrrm!!!&K!*!
%!5crr`!!"@8!N!3",2rr!!!'D3#3"!%Xrrm!!!EY!*!%!Irrr`!!#2%$XY0-!Il
rr`!!#P!$XY*!!Irrr`!!#8)!N!3"r[rr!!!+D3#3#JN+!*!%$NphEQ9b)(*PFfp
eFQ0P6JF:
--===_0_Wed_Nov_13_14:20:56_MET_1996--
=================
PYTHONMAC-SIG - SIG on Python for the Apple Macintosh
send messages to: pythonmac-sig@python.org
administrivia to: pythonmac-sig-request@python.org
=================