[Pythonmac-SIG] Mach-O Python and Carbon Events

Donovan Preston dpreston@intersight.com
Mon, 10 Sep 2001 18:47:43 -0700


--Apple-Mail-3-390827381
Content-Transfer-Encoding: 7bit
Content-Type: text/plain;
	charset=US-ASCII;
	format=flowed

Hi everyone,

If you haven't read my previous message about Mach-O Python, you may 
want to do so for some background.

To build a Mach-O Python that is capable of using Carbon events, follow 
these instructions:

1) Download and untar Python-2.2a3
2) configure with './configure --with-suffix=.exe --enable-framework' as 
detailed in the readme.
3) make
5) sudo make frameworkinstall

6) cd Mac/OSX
7) Place the macmain.c file from my previous message in this directory, 
overwriting the existing file
8) make install
9) make installmacsubtree

You now have a Python.app which is capable of doing applets and 
full-blown applications!

10) Go to /Application, Control-click on Python.app, and choose "Show 
Package Contents"
11) Open Contents, then Resources

You may place any file named __main__.py in this directory, and you will 
have a fully functioning applet. Note Jack's caveats about the lack of 
stdin and stdout going to the Console. You may also place a file named 
__rawmain__.py in this directory and get control a little earlier, but I 
haven't found a need for this yet.

12) Place the files __main__.py, setup.py, and CarbonNib.c in this 
directory. (Attached to this email)
13) Place the main.nib file inside the English.lproj folder.
14) From the terminal run python setup.py build and you are done!

You now have a python application which can play nicely with carbon 
events!

Note how little code I have written, yet the app has quite a bit of 
functionality -- menu handling, command handling, copy/paste, button 
tooltips... Pretty cool.

The interface for CarbonNib.c is very preliminary and subject to extreme 
changes in the near future. I simply did what it took to get from point 
a to point b in the least time. Suggestions for ways to abstract away 
the low level carbon event details into a nice python interface are 
welcome.

I suspect a similar approach could be used for creating a full-blown 
Cocoa application, perhaps with the help of PyObjC!

Donovan

--Apple-Mail-3-390827381
Content-Disposition: attachment
Content-Type: multipart/appledouble;
	boundary=Apple-Mail-4-390827382


--Apple-Mail-4-390827382
Content-Disposition: attachment;
	filename=__main__.py
Content-Transfer-Encoding: base64
Content-Type: application/applefile;
	name="__main__.py"

AAUWBwACAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAJAAAAPgAAAAoAAAADAAAASAAAAAsAAAACAAAA
UwAAAdYAAAAAAAAAAAAAX19tYWluX18ucHkAAAEAAAABkAAAAJAAAABGAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
SAALVmVyZGFuYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEACwAXgLyA0QALABeAvIDRLfC
uxUAAANIAAADSAAAAAABAAAAAEBQeXRob24AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAB
AAHoAAAAUAAAAAAAAANIAAAAAAAAA0gADnAAAAABAAAAAZAAAACQAAAARgAM8JAARQAAABwARgAB
TVBTUgAAABJQcHJzAAAAHgPt//8AAAAAAdMpaACA//8AAABMAdMpbA==

--Apple-Mail-4-390827382
Content-Disposition: attachment;
	filename=__main__.py
Content-Transfer-Encoding: 7bit
Content-Type: application/octet-stream;
	x-mac-creator=0;
	x-unix-mode=0755;
	x-mac-type=0;
	name="__main__.py"

import CarbonNib

def FOUR_CHAR_CODE(string):
	int = 0
	int |= ord(string[0]) << 24
	int |= ord(string[1]) << 16
	int |= ord(string[2]) << 8
	int |= ord(string[3])
	
	return int


kEventWindowDrawContent = 2
kEventProcessCommand = 1,
kEventMouseDown = 1
eventNotHandled = -9874
noErr = 0

CarbonNib.Initialize()

def cool():
	print "in cool"

def commandevent(clas, kind, code, nextHandler, rawEvent):
	if code == FOUR_CHAR_CODE('cool'):
		cool()
		return noErr
	return eventNotHandled

def drawwindow(clas, kind, code, nextHandler, rawEvent):
	print "drawing window"
	CarbonNib.PrintHello()
	return CarbonNib.CallNextEventHandler(nextHandler, rawEvent)

CarbonNib.InstallWindowEventHandler(CarbonNib.GetMainWindowRef(), drawwindow, FOUR_CHAR_CODE('wind'), 2)
CarbonNib.InstallApplicationEventHandler(commandevent, FOUR_CHAR_CODE('cmds'), 1)

print "Finished initializing!"

CarbonNib.Run()

--Apple-Mail-4-390827382--

--Apple-Mail-3-390827381
Content-Disposition: attachment;
	filename=setup.py
Content-Transfer-Encoding: 7bit
Content-Type: application/octet-stream;
	x-unix-mode=0644;
	name="setup.py"

from distutils.core import setup, Extension

setup(name="CarbonNib", version="1.0", 
	  ext_modules=[Extension("CarbonNib", ["CarbonNib.c"])])

--Apple-Mail-3-390827381
Content-Disposition: attachment
Content-Type: multipart/appledouble;
	boundary=Apple-Mail-5-390827384


--Apple-Mail-5-390827384
Content-Disposition: attachment;
	filename=CarbonNib.c
Content-Transfer-Encoding: base64
Content-Type: application/applefile;
	name="CarbonNib.c"

AAUWBwACAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAJAAAAPgAAAAoAAAADAAAASAAAAAsAAAACAAAA
UwAAAdYAAAAAAAAAAAAAQ2FyYm9uTmliLmMAAAEAAAABkAAAAJAAAABGAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
SAALVmVyZGFuYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAEMAJALWA54AQwAkAtYDnrfC
thkAAADbAAAA2wAABwoBAAAAAEBDL0MrKwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB
AAEwAAAAUAAAAAAAAADbAAAAAAAAANsADnAAAAABAAAAAZAAAACQAAAARgAM8JAANgAAABwARgAB
TVBTUgAAABJQcHJzAAAAHgPt//8AAAAAAdMn0ACA//8AAABMAdMn1A==

--Apple-Mail-5-390827384
Content-Disposition: attachment;
	filename=CarbonNib.c
Content-Transfer-Encoding: 7bit
Content-Type: text/plain;
	x-mac-creator=0;
	x-unix-mode=0644;
	x-mac-type=0;
	name="CarbonNib.c"

#include <Carbon/Carbon.h>
#include <Python/Python.h>

WindowRef window;

OSStatus PrintHi(void) {
    short int fNum;
   
    SetPort(GetWindowPort(window));
    
    MoveTo(5, 50);
    DrawString("\x0DHello World!");
}

PyObject* PrintHello(PyObject *self, PyObject *args) {
    PrintHi();
    return Py_BuildValue("");
}

int CInit() {
	// Do init stuff C wants to do here	
	return 0;
}

static PyObject * Initialize(PyObject *self, PyObject *args)
{
    IBNibRef 		nibRef;
    OSStatus		err;
    
    // Create a Nib reference passing the name of the nib file (without the .nib extension)
    // CreateNibReference only searches into the application bundle.
    err = CreateNibReference(CFSTR("main"), &nibRef);

    require_noerr( err, CantGetNibRef );

    // Once the nib reference is created, set the menu bar. "MainMenu" is the name of the menu bar
    // object. This name is set in InterfaceBuilder when the nib is created.
    
    err = SetMenuBarFromNib(nibRef, CFSTR("MenuBar"));

    require_noerr( err, CantSetMenuBar );

    // Then create a window. "MainWindow" is the name of the window object. This name is set in 
    // InterfaceBuilder when the nib is created.
    err = CreateWindowFromNib(nibRef, CFSTR("MainWindow"), &window);
    require_noerr( err, CantCreateWindow );

    // We don't need the nib reference anymore.
    DisposeNibReference(nibRef);
    
    CInit();
    
CantCreateWindow:
CantSetMenuBar:
CantGetNibRef:
	return Py_BuildValue("i", err);
}

PyObject* Run(PyObject* self, PyObject *args) {
    // The main window was created hidden so show it.
    ShowWindow( window );

    // Call the event loop
    RunApplicationEventLoop();
	return Py_BuildValue("");
}

PyObject* GetMainWindowRef(PyObject* self, PyObject *args) {
	return Py_BuildValue("l", window);
}

PyObject* CallNextEvtHandler(PyObject* self, PyObject *args) {
	EventHandlerCallRef nextHandler;
	EventRef theEvent;
	OSStatus result = noErr;
	
	if (!PyArg_ParseTuple(args, "ii", &nextHandler, &theEvent)) {
		return NULL;
	}
	result = CallNextEventHandler(nextHandler, theEvent);
	
	return Py_BuildValue("i", result);
}
pascal OSStatus HandleCommand(EventHandlerCallRef handlerRef, EventRef event, void *outPyObject) {
	PyObject *retValue;
	OSStatus status;
	HICommand command;
	int eventClass, eventKind;

	eventClass = GetEventClass(event);
	eventKind  = GetEventKind(event);
	GetEventParameter(event, kEventParamDirectObject, typeHICommand, NULL, sizeof(HICommand), NULL, &command);

	retValue = PyObject_CallFunction((PyObject *)outPyObject, "iiiii", eventClass, eventKind, command.commandID, handlerRef, event);
	status = PyInt_AsLong(retValue);
	return status;
}

PyObject* InstallAppEventHandler(PyObject *self, PyObject *args) {
	EventTypeSpec eventSpec;
	EventHandlerRef outHandlerRef = NULL;
	PyObject *userData;
	int eClass, eKind;
	
	if (!PyArg_ParseTuple(args, "Oii", &userData, &eClass, &eKind)) {
		return NULL;
	}
	eventSpec.eventClass = eClass;
	eventSpec.eventKind = eKind;

	InstallApplicationEventHandler(NewEventHandlerUPP(HandleCommand), 1, &eventSpec, (void *) userData, &outHandlerRef);
	return Py_BuildValue("i", outHandlerRef);
	// Return outHandlerRef to be stored somewhere convenient; we may not ever care
}

PyObject* InstallWinEventHandler(PyObject *self, PyObject *args) {
	EventTypeSpec eventSpec;
	EventHandlerRef outHandlerRef = NULL;
	PyObject *userData;
	int eClass, eKind;
	WindowRef theWindow;
	
	if (!PyArg_ParseTuple(args, "lOii", &theWindow, &userData, &eClass, &eKind)) {
		return NULL;
	}

	eventSpec.eventClass = eClass;
	eventSpec.eventKind = eKind;

	InstallWindowEventHandler(theWindow, NewEventHandlerUPP(HandleCommand), 1, &eventSpec, (void *) userData, &outHandlerRef);
	// Return outHandlerRef to be stored somewhere convenient; we may not ever care
	return Py_BuildValue("i", outHandlerRef);
}

static PyMethodDef CarbonNib_Methods[] = {
	{"PrintHello", PrintHello, METH_VARARGS},
	{"Initialize", Initialize, METH_VARARGS},
	{"Run", Run, METH_VARARGS},
	{"GetMainWindowRef", GetMainWindowRef, METH_VARARGS},
	{"InstallApplicationEventHandler", InstallAppEventHandler, METH_VARARGS},
	{"InstallWindowEventHandler", InstallWinEventHandler, METH_VARARGS},
	{"CallNextEventHandler", CallNextEvtHandler, METH_VARARGS},
	{NULL, NULL}
};

DL_EXPORT(void) initCarbonNib() {
	Py_InitModule("CarbonNib", CarbonNib_Methods);
}

--Apple-Mail-5-390827384--

--Apple-Mail-3-390827381
Content-Disposition: attachment;
	filename=main.nib
Content-Type: multipart/x-folder;
	boundary=Apple-Mail-6-390827385;
	x-unix-mode=0755;
	name="main.nib"


--Apple-Mail-6-390827385
Content-Disposition: attachment;
	filename=classes.nib
Content-Transfer-Encoding: 7bit
Content-Type: application/octet-stream;
	x-unix-mode=0644;
	name="classes.nib"

{
IBClasses = ();
IBVersion = 1;
}

--Apple-Mail-6-390827385
Content-Disposition: attachment;
	filename=objects.xib
Content-Transfer-Encoding: 7bit
Content-Type: application/octet-stream;
	x-unix-mode=0644;
	name="objects.xib"

<?xml version="1.0" standalone="yes"?>
<object class="NSIBObjectData">
  <string name="targetFramework">IBCarbonFramework</string>
  <object name="rootObject" class="NSCustomObject" id="1">
    <string name="customClass">NSApplication</string>
  </object>
  <array count="53" name="allObjects">
    <object class="IBCarbonMenu" id="29">
      <string name="title">main</string>
      <array count="5" name="items">
        <object class="IBCarbonMenuItem" id="185">
          <string name="title">NewApplication</string>
          <object name="submenu" class="IBCarbonMenu" id="184">
            <string name="title">NewApplication</string>
            <array count="2" name="items">
              <object class="IBCarbonMenuItem" id="187">
                <string name="title">About NewApplication</string>
                <int name="keyEquivalentModifier">0</int>
                <ostype name="command">abou</ostype>
              </object>
              <object class="IBCarbonMenuItem" id="186">
                <boolean name="separator">TRUE</boolean>
              </object>
            </array>
            <string name="name">_NSAppleMenu</string>
          </object>
        </object>
        <object class="IBCarbonMenuItem" id="127">
          <string name="title">File</string>
          <object name="submenu" class="IBCarbonMenu" id="131">
            <string name="title">File</string>
            <array count="10" name="items">
              <object class="IBCarbonMenuItem" id="139">
                <string name="title">New</string>
                <string name="keyEquivalent">n</string>
                <ostype name="command">new </ostype>
              </object>
              <object class="IBCarbonMenuItem" id="134">
                <string name="title">Open...</string>
                <string name="keyEquivalent">o</string>
                <ostype name="command">open</ostype>
              </object>
              <object class="IBCarbonMenuItem" id="133">
                <boolean name="separator">TRUE</boolean>
              </object>
              <object class="IBCarbonMenuItem" id="130">
                <string name="title">Close</string>
                <string name="keyEquivalent">w</string>
                <ostype name="command">clos</ostype>
              </object>
              <object class="IBCarbonMenuItem" id="138">
                <string name="title">Save</string>
                <string name="keyEquivalent">s</string>
                <ostype name="command">save</ostype>
              </object>
              <object class="IBCarbonMenuItem" id="137">
                <string name="title">Save As...</string>
                <string name="keyEquivalent">S</string>
                <ostype name="command">svas</ostype>
              </object>
              <object class="IBCarbonMenuItem" id="132">
                <string name="title">Revert</string>
                <string name="keyEquivalent">r</string>
                <ostype name="command">rvrt</ostype>
              </object>
              <object class="IBCarbonMenuItem" id="128">
                <boolean name="separator">TRUE</boolean>
              </object>
              <object class="IBCarbonMenuItem" id="135">
                <string name="title">Page Setup...</string>
                <string name="keyEquivalent">P</string>
                <ostype name="command">page</ostype>
              </object>
              <object class="IBCarbonMenuItem" id="136">
                <string name="title">Print...</string>
                <string name="keyEquivalent">p</string>
                <ostype name="command">prnt</ostype>
              </object>
            </array>
          </object>
        </object>
        <object class="IBCarbonMenuItem" id="152">
          <string name="title">Edit</string>
          <object name="submenu" class="IBCarbonMenu" id="147">
            <string name="title">Edit</string>
            <array count="8" name="items">
              <object class="IBCarbonMenuItem" id="141">
                <string name="title">Undo</string>
                <string name="keyEquivalent">z</string>
                <ostype name="command">undo</ostype>
              </object>
              <object class="IBCarbonMenuItem" id="146">
                <string name="title">Redo</string>
                <string name="keyEquivalent">Z</string>
                <ostype name="command">redo</ostype>
              </object>
              <object class="IBCarbonMenuItem" id="142">
                <boolean name="separator">TRUE</boolean>
              </object>
              <object class="IBCarbonMenuItem" id="143">
                <string name="title">Cut</string>
                <string name="keyEquivalent">x</string>
                <ostype name="command">cut </ostype>
              </object>
              <object class="IBCarbonMenuItem" id="149">
                <string name="title">Copy</string>
                <string name="keyEquivalent">c</string>
                <ostype name="command">copy</ostype>
              </object>
              <object class="IBCarbonMenuItem" id="144">
                <string name="title">Paste</string>
                <string name="keyEquivalent">v</string>
                <ostype name="command">past</ostype>
              </object>
              <object class="IBCarbonMenuItem" id="151">
                <string name="title">Clear</string>
                <ostype name="command">clea</ostype>
              </object>
              <object class="IBCarbonMenuItem" id="148">
                <string name="title">Select All</string>
                <string name="keyEquivalent">a</string>
                <ostype name="command">sall</ostype>
              </object>
            </array>
          </object>
        </object>
        <object class="IBCarbonMenuItem" id="192">
          <string name="title">Control</string>
          <object name="submenu" class="IBCarbonMenu" id="193">
            <string name="title">Control</string>
            <array count="1" name="items">
              <object class="IBCarbonMenuItem" id="194">
                <string name="title">Cool</string>
                <string name="keyEquivalent">k</string>
                <ostype name="command">cool</ostype>
              </object>
            </array>
          </object>
        </object>
        <object class="IBCarbonMenuItem" id="153">
          <string name="title">Window</string>
          <object name="submenu" class="IBCarbonMenu" id="154">
            <string name="title">Window</string>
            <array count="5" name="items">
              <object class="IBCarbonMenuItem" id="155">
                <boolean name="dynamic">TRUE</boolean>
                <string name="title">Minimize Window</string>
                <string name="keyEquivalent">m</string>
                <ostype name="command">mini</ostype>
              </object>
              <object class="IBCarbonMenuItem" id="188">
                <boolean name="dynamic">TRUE</boolean>
                <string name="title">Minimize All Windows</string>
                <string name="keyEquivalent">m</string>
                <int name="keyEquivalentModifier">1572864</int>
                <ostype name="command">mini</ostype>
              </object>
              <object class="IBCarbonMenuItem" id="156">
                <boolean name="separator">TRUE</boolean>
              </object>
              <object class="IBCarbonMenuItem" id="157">
                <boolean name="dynamic">TRUE</boolean>
                <string name="title">Bring All to Front</string>
                <ostype name="command">frnt</ostype>
              </object>
              <object class="IBCarbonMenuItem" id="189">
                <boolean name="dynamic">TRUE</boolean>
                <string name="title">Bring in Front</string>
                <int name="keyEquivalentModifier">1572864</int>
                <ostype name="command">frnt</ostype>
              </object>
            </array>
            <string name="name">_NSWindowsMenu</string>
          </object>
        </object>
      </array>
      <string name="name">_NSMainMenu</string>
    </object>
    <reference idRef="127"/>
    <reference idRef="128"/>
    <reference idRef="130"/>
    <reference idRef="131"/>
    <reference idRef="132"/>
    <reference idRef="133"/>
    <reference idRef="134"/>
    <reference idRef="135"/>
    <reference idRef="136"/>
    <reference idRef="137"/>
    <reference idRef="138"/>
    <reference idRef="139"/>
    <reference idRef="141"/>
    <reference idRef="142"/>
    <reference idRef="143"/>
    <reference idRef="144"/>
    <reference idRef="146"/>
    <reference idRef="147"/>
    <reference idRef="148"/>
    <reference idRef="149"/>
    <reference idRef="151"/>
    <reference idRef="152"/>
    <reference idRef="153"/>
    <reference idRef="154"/>
    <reference idRef="155"/>
    <reference idRef="156"/>
    <reference idRef="157"/>
    <object class="IBCarbonWindow" id="166">
      <string name="windowRect">47 4 294 364 </string>
      <string name="title">SoundFarmer</string>
      <object name="rootControl" class="IBCarbonRootControl" id="167">
        <string name="bounds">0 0 247 360 </string>
        <array count="10" name="subviews">
          <object class="IBCarbonBevelButton" id="196">
            <string name="bounds">6 29 30 53 </string>
            <ostype name="command">quit</ostype>
            <string name="helpTagText">Quit</string>
            <int name="contentResID">0</int>
          </object>
          <object class="IBCarbonBevelButton" id="199">
            <string name="bounds">6 6 30 30 </string>
            <ostype name="command">cool</ostype>
            <string name="helpTagText">Cool</string>
          </object>
          <object class="IBCarbonBevelButton" id="224">
            <string name="bounds">6 86 30 110 </string>
            <ostype name="command">cool</ostype>
            <string name="helpTagText">Engage Warp Drive</string>
            <int name="contentResID">2</int>
          </object>
          <object class="IBCarbonBevelButton" id="225">
            <string name="bounds">6 63 30 87 </string>
            <ostype name="command">cool</ostype>
            <string name="helpTagText">Initiate Extreme Coolness</string>
            <int name="contentResID">2</int>
          </object>
          <object class="IBCarbonBevelButton" id="227">
            <string name="bounds">6 109 30 133 </string>
            <ostype name="command">cool</ostype>
            <string name="helpTagText">Deposit $100,000,000</string>
            <int name="contentResID">2</int>
          </object>
          <object class="IBCarbonButton" id="230">
            <string name="bounds">207 270 227 340 </string>
            <string name="title">Quit</string>
            <ostype name="command">quit</ostype>
            <int name="buttonType">1</int>
          </object>
          <object class="IBCarbonEditText" id="231">
            <string name="bounds">131 23 147 100 </string>
            <string name="title">Some text</string>
          </object>
          <object class="IBCarbonEditText" id="232">
            <string name="bounds">169 23 185 100 </string>
          </object>
          <object class="IBCarbonProgressBar" id="233">
            <string name="bounds">131 136 151 271 </string>
            <int name="initialValue">50</int>
          </object>
          <object class="IBCarbonPopupButton" id="237">
            <string name="bounds">167 136 187 261 </string>
            <object name="menu" class="IBCarbonMenu" id="238">
              <string name="title">Popup:</string>
              <array count="3" name="items">
                <object class="IBCarbonMenuItem" id="234">
                  <string name="title">Item 1</string>
                </object>
                <object class="IBCarbonMenuItem" id="235">
                  <string name="title">Item 2</string>
                </object>
                <object class="IBCarbonMenuItem" id="236">
                  <string name="title">Item 3</string>
                </object>
              </array>
            </object>
          </object>
        </array>
      </object>
      <boolean name="hasCloseBox">FALSE</boolean>
      <boolean name="hasCollapseBox">FALSE</boolean>
      <boolean name="hasHorizontalZoom">FALSE</boolean>
      <boolean name="isResizable">FALSE</boolean>
      <boolean name="hasVerticalZoom">FALSE</boolean>
      <int name="carbonWindowClass">6</int>
      <int name="themeBrush">0</int>
      <int name="windowPosition">0</int>
    </object>
    <reference idRef="167"/>
    <reference idRef="184"/>
    <reference idRef="185"/>
    <reference idRef="186"/>
    <reference idRef="187"/>
    <reference idRef="188"/>
    <reference idRef="189"/>
    <reference idRef="192"/>
    <reference idRef="193"/>
    <reference idRef="194"/>
    <reference idRef="196"/>
    <reference idRef="199"/>
    <reference idRef="224"/>
    <reference idRef="225"/>
    <reference idRef="227"/>
    <reference idRef="230"/>
    <reference idRef="231"/>
    <reference idRef="232"/>
    <reference idRef="233"/>
    <reference idRef="234"/>
    <reference idRef="235"/>
    <reference idRef="236"/>
    <reference idRef="237"/>
    <reference idRef="238"/>
  </array>
  <array count="53" name="allParents">
    <reference idRef="1"/>
    <reference idRef="29"/>
    <reference idRef="131"/>
    <reference idRef="131"/>
    <reference idRef="127"/>
    <reference idRef="131"/>
    <reference idRef="131"/>
    <reference idRef="131"/>
    <reference idRef="131"/>
    <reference idRef="131"/>
    <reference idRef="131"/>
    <reference idRef="131"/>
    <reference idRef="131"/>
    <reference idRef="147"/>
    <reference idRef="147"/>
    <reference idRef="147"/>
    <reference idRef="147"/>
    <reference idRef="147"/>
    <reference idRef="152"/>
    <reference idRef="147"/>
    <reference idRef="147"/>
    <reference idRef="147"/>
    <reference idRef="29"/>
    <reference idRef="29"/>
    <reference idRef="153"/>
    <reference idRef="154"/>
    <reference idRef="154"/>
    <reference idRef="154"/>
    <reference idRef="1"/>
    <reference idRef="166"/>
    <reference idRef="185"/>
    <reference idRef="29"/>
    <reference idRef="184"/>
    <reference idRef="184"/>
    <reference idRef="154"/>
    <reference idRef="154"/>
    <reference idRef="29"/>
    <reference idRef="192"/>
    <reference idRef="193"/>
    <reference idRef="167"/>
    <reference idRef="167"/>
    <reference idRef="167"/>
    <reference idRef="167"/>
    <reference idRef="167"/>
    <reference idRef="167"/>
    <reference idRef="167"/>
    <reference idRef="167"/>
    <reference idRef="167"/>
    <reference idRef="238"/>
    <reference idRef="238"/>
    <reference idRef="238"/>
    <reference idRef="167"/>
    <reference idRef="237"/>
  </array>
  <dictionary count="8" name="nameTable">
    <string>Files Owner</string>
    <reference idRef="1"/>
    <string>MainWindow</string>
    <reference idRef="166"/>
    <string>MenuBar</string>
    <reference idRef="29"/>
    <string>NSCustomView</string>
    <reference idRef="196"/>
    <string>NSCustomView1</string>
    <reference idRef="224"/>
    <string>NSCustomView11</string>
    <reference idRef="199"/>
    <string>NSCustomView111</string>
    <reference idRef="225"/>
    <string>NSCustomView1111</string>
    <reference idRef="227"/>
  </dictionary>
  <unsigned_int name="nextObjectID">241</unsigned_int>
</object>

--Apple-Mail-6-390827385
Content-Disposition: attachment;
	filename=info.nib
Content-Transfer-Encoding: 7bit
Content-Type: application/octet-stream;
	x-unix-mode=0644;
	name="info.nib"

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
<plist version="0.9">
<dict>
	<key>IBDocumentLocation</key>
	<string>40 43 356 240 0 0 1600 1178 </string>
	<key>IBFramework Version</key>
	<string>215.0</string>
	<key>IBMainMenuLocation</key>
	<string>263 395 336 44 0 0 1024 746 </string>
	<key>IBSystem Version</key>
	<string>5G40</string>
	<key>IBUserGuides</key>
	<dict>
		<key>MainWindow</key>
		<dict>
			<key>guideLocations</key>
			<array/>
			<key>guidesLocked</key>
			<string>NO</string>
		</dict>
	</dict>
	<key>targetFramework</key>
	<string>IBCarbonFramework</string>
</dict>
</plist>

--Apple-Mail-6-390827385--

--Apple-Mail-3-390827381--