[DAS] DAS client support for Python

Andrew Dalke dalke@dalkescientific.com
Thu, 29 Aug 2002 01:23:33 -0600


This is a multi-part message in MIME format.

--Multipart_Thu__29_Aug_2002_01:23:33_-0600_08442370
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit

I've implemented a DAS client for Python.  You can download 
it at

  http://www.biopython.org/~dalke/das.tar.gz

Here's some documentation for it.

  - ungzip / untar it
  - cd das
  - start python

  >>> import das
  >>> server = das.Server("http://servlet.sanger.ac.uk:8080/das")
  
  the 'server' object acts like a Python dictionary for the different
  data sources available

  >>> print len(server)
  >>> print server.keys()
  
  >>> dsn = server["mouse73"]
  >>> sheet = dsn.stylesheet()
  
  This is class is built given the DTD.  Here's some examples of how
  you can manipulate it.

  Dump the whole data structure as XML
  >>> print sheet

  See what it contains
  >>> sheet.get_children()

  Work with subelements
  >>> print len(sheet["STYLESHEET"])
  >>> category = sheet["STYLESHEET"][0]

  Get attributes of a node
  >>> print category["TYPE"].id

  >>> glyph = category["TYPE"]["GLYPH"]

  Any subelement can also be dumped to XML
  >>> print glyph
  
  Get the text inside a node  (.text() returns a list of unicode strings)
  >>> print "".join(map(str, glyph[0]["COLOR"].text()))

  Besides 'stylesheet' the following methods are also supported on a DSN

  
  >>> [s for s in dir(dsn) if not s.startswith("_")]
  ['dna', 'dsn', 'entry_points', 'features', 'link', 'sequence', 'server', 'stylesheet', 'types']

(Actually, 'dsn' and 'server' are attributes.

>>> eps = dsn.entry_points()
>>> for segment in ep["ENTRY_POINTS"]:
...     print segment.id, segment.size
...
X 147161770
19 61356199
18 91189200
17 94132929
16 99184200
15 104633288
14 116006794
13 117115093
12 114251360
11 122883361
10 131187037
9 125583845
8 129321983
7 135793178
6 150316567
5 151006098
4 151730910
3 160564582
2 180335396
1 196842934
>>> print dsn.dna( segments = [ ("X", 147161760, 147161770), ("1", 100, 20) ] )
Calling url 'http://servlet.sanger.ac.uk:8080/das/mouse73/dna' with query
'segment=X:147161760,147161770;segment=1:100,20'
<DASDNA>
        <SEQUENCE start="147161760" version="7.3" stop="147161770" id="X">
                <DNA length="11">
agagagagagt
                </DNA>
        </SEQUENCE>
        <SEQUENCE start="100" version="7.3" stop="20" id="1">
                <DNA length="81">
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
nnnnnnnnnnnnnnnnnnnnn
                </DNA>
        </SEQUENCE>
</DASDNA>
>>> print dsn.types( segments = [("6", None, None)] )
<DASTYPES>
        <GFF href="http://servlet.sanger.ac.uk:8080/das/mouse73/types" version="1.0">
                <SEGMENT start="1" version="7.3" stop="150316567" id="6">
                        <TYPE id="static_golden_path">
151
                        </TYPE>
                        <TYPE id="transcript">
23
                        </TYPE>
                        <TYPE id="translation">
23
                        </TYPE>
                        <TYPE id="exon">
304
                        </TYPE>
                </SEGMENT>
        </GFF>
</DASTYPES>
>>>


It also converts DAS errors into Python exceptions
>>> print dsn.sequence( [ ("X", 147161760, 147161770), ("1", 100, 20) ] )
Calling url 'http://servlet.sanger.ac.uk:8080/das/mouse73/sequence' with query
'segment=X:147161760,147161770;segment=1:100,20'
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "das.py", line 255, in sequence
    return self._call("sequence", s, "dassequence")
  File "das.py", line 243, in _call
    return self.server._call(self.dsn + "/" + command, query, dtd_name)
  File "das.py", line 180, in _call
    raise DASError(status_code)
das.DASError: 400: Bad command (command not recognized)
>>>

Note that debugging is turned on in that it shows the URL called and
the query string, which gives you the chance to see what it's doing
and (if needed) reproduce a problem by hand.

Enjoy!

					Andrew
					dalke@dalkescientific.com

--Multipart_Thu__29_Aug_2002_01:23:33_-0600_08442370
Content-Type: text/plain;
 name="problems.txt"
Content-Disposition: attachment;
 filename="problems.txt"
Content-Transfer-Encoding: base64

SSd2ZSBpbXBsZW1lbnRlZCBhIERBUyBjbGllbnQgZm9yIFB5dGhvbi4KCgoKTGlzdCBvZiBwdWJs
aWMgREFTIHNlcnZlcnMgYW5kIHRoZSBwcm9ibGVtcyBJIGlkZW50aWZpZWQgd2l0aCB0aGVtLgoK
CiAgLSAgaHR0cDovL3NlcnZsZXQuc2FuZ2VyLmFjLnVrOjgwODAvZGFzCgpUaGUgc3R5bGVzaGVl
dCBhdAogICBodHRwOi8vc2VydmxldC5zYW5nZXIuYWMudWs6ODA4MC9kYXMvbW91c2U3My9zdHls
ZXNoZWV0CgpoYXMgc29tZSBkaWZmZXJlbmNlcyBmcm9tIHRoZSBwdWJsaXNoZWQgRFRELiAgRm9y
IGV4YW1wbGUsIGdldCB0aGUKZmlsZSBhbmQgeW91J2xsIHNlZSBhIHNlY3Rpb24gd2hpY2ggbG9v
a3MgbGlrZQoKCiAgICAgIDxUWVBFIGlkPSJ0cmFuc2NyaXB0Ij4KICAgICAgICA8R0xZUEggYnVt
cGVkPSJ0cnVlIj4KICAgICAgICAgIDxCT1g+CiAgICAgICAgICAgIDxIRUlHSFQ+MTU8L0hFSUdI
VD4KICAgICAgICAgICAgPENPTE9SPmdyZWVuPC9DT0xPUj4KICAgICAgICAgICAgPE9VVExJTkVD
T0xPUj5ibGFjazwvT1VUTElORUNPTE9SPgogICAgICAgICAgICA8QlJPS0VOPnRydWU8L0JST0tF
Tj4gICAgIDwhLS0gRm9yIFhGRi1EQVMgc3BhcnNlIGxvY2F0aW9ucyAtLT4KICAgICAgICAgICAg
PExJTkVXSURUSD4xPC9MSU5FV0lEVEg+CiAgICAgICAgICA8L0JPWD4KICAgICAgICA8L0dMWVBI
PgogICAgICA8L1RZUEU+CgpJIGFzc3VtZSB0aGF0IENPTE9SIHNob3VsZCBiZSBGR0NPTE9SIGFu
ZCBPVVRMSU5FQ09MT1IgYmUgQkdDT0xPUi4KSG93ZXZlciwgdGhlIGZpcnN0IGNoYW5nZWQgd2l0
aCB0aGUgMS4wIHNwZWMgKHNheXMgdGhlIGxvZykgYW5kCnRoZSBsYXR0ZXIgbmV2ZXIgZXhpc3Rl
ZC4KCgpTZWUgYWxzbyB0aGF0IGhlIGhhcyAnYnVtcGVkJyBhcyBhIEdMWVBIIGF0dHJpYnV0ZS4g
IFRoaXMgaXNuJ3QgZGVmaW5lZAphbnl3aGVyZSBpbiB0aGUgc3BlYy4gIE5vciBpcyB0aGUgPEJS
T0tFTj4gZWxlbWVudC4KCgoKCgoKCgpBbHJlYWR5IG1lbnRpb25lZCBzb21lIG9mIHRoZSBwcm9i
bGVtcyB3aXRoIHRoZSBYTUwgbm90IG1hdGNoaW5nIHRoZQpEVEQuICBBbHNvLCBpdCBzYXlzIGl0
J3MgdXNpbmcKCiAgWC1EQVMtVmVyc2lvbjogMS41MgoKd2hpY2ggaXNuJ3QgYWxsb3dlZCBieSB0
aGUgc3BlYy4KCiAgLSAgaHR0cDovL2dlbm9tZS5jc2UudWNzYy5lZHUvY2dpLWJpbi9kYXMvZHNu
CgpXaHkgZG9lcyB0aGF0IGhhdmUgYSAiZHNuIiBhdCB0aGUgZW5kPwoKVGhlIHNlcnZlciBzYXlz
IGl0IGlzIHJ1bm5pbmcgdmVyc2lvbiAiREFTLzAuOTUiLgoKQ29uc2lkZXIKIGh0dHA6Ly9nZW5v
bWUuY3NlLnVjc2MuZWR1L2NnaS1iaW4vZGFzL2hnMTIvdHlwZXM/c2VnbWVudD1jaHIxOjEwMDAs
NTAwMDsKClRoaXMgY29udGFpbnMKCjxHRkYgdmVyc2lvbj0iMS4yIiBzdW1tYXJ5PSJ5ZXMiIGhy
ZWY9Imh0dHA6Ly9nZW5vbWUuY3NlLnVjc2MuZWR1L2NnaS1iaW4vZGFzL2hnMTIvdHlwZXMiPgo8
U0VHTUVOVCBpZD0iY2hyMSIgc3RhcnQ9IjEwMDAiIHN0b3A9IjUwMDAiIHZlcnNpb249IjEuMDAi
Pgo8VFlQRSBpZD0iYWZmeVJhdGlvIiBjYXRlZ29yeT0ib3RoZXIiID4wPC9UWVBFPgoKClRoZSBk
b2N1bWVudGF0aW9uIHNheXMKCj4gPEdGRj4gKHJlcXVpcmVkOyBvbmUgb25seSkKPiBUaGVyZSBp
cyBhIHNpbmdsZSA8R0ZGPiB0YWcuIEl0cyB2ZXJzaW9uIChyZXF1aXJlZCkgYXR0cmlidXRlCj4g
aW5kaWNhdGVzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIFhNTCBmb3JtIG9mIHRoZSBHZW5l
cmFsIEZlYXR1cmUKPiBGb3JtYXQuIFRoZSBjdXJyZW50IHZlcnNpb24gaXMgKGFyYml0cmFyaWx5
KSAxLjAuIFRoZSBocmVmIChyZXF1aXJlZCkKPiBhdHRyaWJ1dGUgZWNob2VzIHRoZSBVUkwgcXVl
cnkgdGhhdCB3YXMgdXNlZCB0byBmZXRjaCB0aGUgY3VycmVudAo+IGRvY3VtZW50LgoKU28gdGhl
IHZlcnNpb24gaXMgZGlmZmVyZW50ICgiMS4yIiBpbnN0ZWFkIG9mICIxLjAiLiAgSW4gYWRkaXRp
b24sCnRoZXJlIGlzIGEgR0ZGIGF0dHJpYnV0ZWQgJ3N1bW1hcnknIHdoaWNoIGlzIG5vdCBsaXN0
ZWQgaW4gdGhlIERURC4KRm9yIG15IHZlcnNpb24gb2YgdGhlIERURCBJIGFkZGVkIHRoYXQgYXMg
SU1QTElFRC4KCgpUYWtlIGEgbG9vayBhdAogaHR0cDovL2dlbm9tZS5jc2UudWNzYy5lZHUvY2dp
LWJpbi9kYXMvaGcxMi90eXBlcz90eXBlPWFsbF9zdHNfcHJpbWVyO3R5cGU9c3lzTWFwCgpUaGlz
IHJldHVybnMKCjw/eG1sIHZlcnNpb249IjEuMCIgc3RhbmRhbG9uZT0ibm8iPz4KPERBU1RZUEVT
Pgo8R0ZGIHZlcnNpb249IjEuMiIgc3VtbWFyeT0ieWVzIiBocmVmPSJodHRwOi8vZ2Vub21lLmNz
ZS51Y3NjLmVkdS9jZ2ktYmluL2Rhcy9oZzEyL3R5cGVzIj4KPFNFR01FTlQgdmVyc2lvbj0iMS4w
MCI+CjxUWVBFIGlkPSJhbGxfc3RzX3ByaW1lciIgY2F0ZWdvcnk9Im90aGVyIiA+MTI5ODY0PC9U
WVBFPgo8L1NFR01FTlQ+CjwvR0ZGPgo8L0RBU1RZUEVTPgoKCkFjY29yZGluZyB0byB0aGUgZG9j
dW1lbnRhdGlvbiBmb3IgJ1NFR01FTlQnCgo+IFRoZSBpZCwgc3RhcnQsIHN0b3AsIGFuZCB2ZXJz
aW9uIGF0dHJpYnV0ZXMgYXJlIHJlcXVpcmVkLiBUaGUKPiBvcHRpb25hbCBsYWJlbCBhdHRyaWJ1
dGUgcHJvdmlkZXMgYSBodW1hbiByZWFkYWJsZSBsYWJlbCBmb3IgZGlzcGxheQo+IHB1cnBvc2Vz
LgoKSW4gdGhpcyBjYXNlLCB0aGUgU0VHTUVOVCBjb250YWlucyBvbmx5IHRoZSB2ZXJzaW9uLCBh
bmQgbm9uZSBvZiBpZCwKc3RhcnQsIG5vciBzdG9wLgoKCgogIC0gIGh0dHA6Ly93d3cud29ybWJh
c2Uub3JnL2RiL2Rhcy9kc24KCkFnYWluLCB0aGVyZSdzIHRoZSAnL2RzbicgYXQgdGhlIGVuZC4u
LgoKV2l0aG91dCB0aGUgJy9kc24nIHRoaXMgcmV0dXJucyBhIHRleHQgZG9jdW1lbnQuCldpdGgg
dGhlICcvZHNuJyBpdCBzZW5kcyBiYWNrIHRoZSBmb2xsb3dpbmc6CiA9PT09PT09PT09PT09PT09
PT09PT0KSFRUUC8xLjEgMjAwIE9LCkRhdGU6IEZyaSwgMjMgQXVnIDIwMDIgMDc6MDI6MjggR01U
ClNlcnZlcjogQXBhY2hlLzEuMy4yNiAoVW5peCkgbW9kX3BlcmwvMS4yNwpYLWRhcy1zdGF0dXM6
IDIwMApYLWRhcy12ZXJzaW9uOiBEQVMvMC45OTkKQ29ubmVjdGlvbjogY2xvc2UKQ29udGVudC1U
eXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUlTTy04ODU5LTEKCjw/eG1sIHZlcnNpb249IjEuMCIg
c3RhbmRhbG9uZT0ieWVzIj8+CjwhRE9DVFlQRSBEQVNEU04gU1lTVEVNICJodHRwOi8vd3d3Lndv
cm1iYXNlLm9yZy9kdGQvZGFzZHNuLmR0ZCI+CjxEQVNEU04+CiAgIDxEU04+CjwhRE9DVFlQRSBI
VE1MIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwgMi4wLy9FTiI+CjxIVE1MPjxIRUFEPgo8VElU
TEU+MjAwIE9LPC9USVRMRT4KPC9IRUFEPjxCT0RZPgo8SDE+T0s8L0gxPgpUaGUgc2VydmVyIGVu
Y291bnRlcmVkIGFuIGludGVybmFsIGVycm9yIG9yCm1pc2NvbmZpZ3VyYXRpb24gYW5kIHdhcyB1
bmFibGUgdG8gY29tcGxldGUKeW91ciByZXF1ZXN0LjxQPgpQbGVhc2UgY29udGFjdCB0aGUgc2Vy
dmVyIGFkbWluaXN0cmF0b3IsCiB3ZWJtYXN0ZXJAd29ybWJhc2Uub3JnIGFuZCBpbmZvcm0gdGhl
bSBvZiB0aGUgdGltZSB0aGUgZXJyb3Igb2NjdXJyZWQsCmFuZCBhbnl0aGluZyB5b3UgbWlnaHQg
aGF2ZSBkb25lIHRoYXQgbWF5IGhhdmUKY2F1c2VkIHRoZSBlcnJvci48UD4KTW9yZSBpbmZvcm1h
dGlvbiBhYm91dCB0aGlzIGVycm9yIG1heSBiZSBhdmFpbGFibGUKaW4gdGhlIHNlcnZlciBlcnJv
ciBsb2cuPFA+CjxIUj4KPEFERFJFU1M+QXBhY2hlLzEuMy4yNiBTZXJ2ZXIgYXQgd3d3Lndvcm1i
YXNlLm9yZyBQb3J0IDgwPC9BRERSRVNTPgo8L0JPRFk+PC9IVE1MPgogPT09PT09PT09PT09PT09
PT09PT09CgoKICAtICBodHRwOi8vc3Rhc2gubXJjLWxtYi5jYW0uYWMudWs6ODA4MC9kYXMKClRo
aXMgaXMgcnVubmluZyAnWC1EQVMtVmVyc2lvbjogMC45OTknLgoKSSB0cmllZCBkb3dubG9hZGlu
ZyBhIHN0eWxlc2hlZXQgZnJvbQogaHR0cDovL3N0YXNoLm1yYy1sbWIuY2FtLmFjLnVrOjgwODAv
ZGFzL2Jlcm5hcmRzX3RyYWNrL3N0eWxlc2hlZXQKYW5kIGdvdCAwIGJ5dGVzLCBidXQgYSAyMDAg
c3RhdHVzLgoKQW5kIHdoZW4gSSB0cnkgdG8gZ2V0CiBodHRwOi8vc3Rhc2gubXJjLWxtYi5jYW0u
YWMudWs6ODA4MC9kYXMvZXhvbl90cmFjay9zdHlsZXNoZWV0Cml0IGhhbmdzIC4uIGJlZW4gd2Fp
dGluZyBmb3IgYWJvdXQgMTUgbWludXRlcyBub3cuICBBbmQgSSBjYW4ndCBzZWVtCnRvIGdldCAn
YmVybmFyZHNfdHJhY2snIHN0eWxlc2hlZXQgYWdhaW4uICBOb3IgZXZlbiB0aGUgJ2RzbicuICBJ
CnRoaW5rIEkgZnJvemUgdGhlIHNlcnZlci4KCgogIC0gIGh0dHA6Ly9nZW5vbWUub3JubC5nb3Yv
ZGFzL2Rhcy5jZ2kvZHNuCgpUaGUgZm9ybWF0IG9mIHRoZSBVUkwgYWxzbyBpc24ndCB0byBzcGVj
LgoKSSBjYW4ndCBldmVuIGxvYWQgdGhlIERTTiBiZWNhdXNlIGl0IGNvbnRhaW5zIGVsZW1lbnRz
IHdoaWNoIGxvb2sgbGlrZQoKICA8RFNOPgogICAgPFNPVVJDRSBpZD0ibG1vbiI+TGlzdGVyaWEg
bW9ub2N5dG9nZW5lcyBzdHJhaW4gRUdEPC9TT1VSQ0U+CiAgICA8TUFQTUFTVEVSPmh0dHA6Ly9n
ZW5vbWUub3JubC5nb3YvZGFzL2Rhcy5jZ2kvbG1vbjwvTUFQTUFTVEVSPgogICAgPERFU0NSSVBU
SU9OIGhyZWY9Imh0dHA6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9jZ2ktYmluL0VudHJlei9mcmFt
aWs/ZGI9R2Vub21lJmdpPTIwNCI+TGlzdGVyaWEgbW9ub2N5dG9nZW5lcyBzdHJhaW4gRUdEPC9E
RVNDUklQVElPTj4KICA8L0RTTj4KClNwZWNpZmljYWxsbHksIGl0IGZhaWxzIGJlY2F1c2UgdGhl
ICcmJyBlbnRpdHkgaXMgc3VwcG9zZWQgdG8gYmUgZXNjYXBlZAppbnNpZGUgb2YgWE1MLiAgKFdo
ZXJlIGl0IHBvaW50cyB0byAnJmdpPTIwNCcuKSAgVGhlIFhNTCBzcGVjIGF0CiAgaHR0cDovL3d3
dy53My5vcmcvVFIvMjAwMC9SRUMteG1sLTIwMDAxMDA2I0FWTm9ybWFsaXplCnNheXM6Cgo+ICAg
IDMuIEZvciBlYWNoIGNoYXJhY3RlciwgZW50aXR5IHJlZmVyZW5jZSwgb3IgY2hhcmFjdGVyIHJl
ZmVyZW5jZQo+IGluIHRoZSB1bm5vcm1hbGl6ZWQgYXR0cmlidXRlIHZhbHVlLCBiZWdpbm5pbmcg
d2l0aCB0aGUgZmlyc3QgYW5kCj4gY29udGludWluZyB0byB0aGUgbGFzdCwgZG8gdGhlIGZvbGxv
d2luZzoKPiAgICAgICogRm9yIGEgY2hhcmFjdGVyIHJlZmVyZW5jZSwgYXBwZW5kIHRoZSByZWZl
cmVuY2VkIGNoYXJhY3RlciB0bwo+ICAgICAgICAgIHRoZSBub3JtYWxpemVkIHZhbHVlLgo+IAo+
ICAgICAgKiBGb3IgYW4gZW50aXR5IHJlZmVyZW5jZSwgcmVjdXJzaXZlbHkgYXBwbHkgc3RlcCAz
IG9mIHRoaXMgYWxnb3JpdGhtCj4gICAgICAgICAgdG8gdGhlIHJlcGxhY2VtZW50IHRleHQgb2Yg
dGhlIGVudGl0eS4KPiAKPiAgICAgICogRm9yIGEgd2hpdGUgc3BhY2UgY2hhcmFjdGVyICgjeDIw
LCAjeEQsICN4QSwgI3g5KSwgYXBwZW5kIGEKPiAgICAgICAgICBzcGFjZSBjaGFyYWN0ZXIgKCN4
MjApIHRvIHRoZSBub3JtYWxpemVkIHZhbHVlLgo+IAo+ICAgICAgKiBGb3IgYW5vdGhlciBjaGFy
YWN0ZXIsIGFwcGVuZCB0aGUgY2hhcmFjdGVyIHRvIHRoZSBub3JtYWxpemVkIHZhbHVlLgoKQW5k
ICcmJyBpcyBhIGNoYXJhY3RlciByZWZlcmVuY2UgdGhhdCBzaG91bGQgYmUgZXNjYXBlZCwgZXZl
biBpbnNpZGUKb2YgYW4gYXR0cmlidXRlLCBiZWNhdXNlOgoKPiBUaGUgYW1wZXJzYW5kIGNoYXJh
Y3RlciAoJikgYW5kIHRoZSBsZWZ0IGFuZ2xlIGJyYWNrZXQgKDwpIG1heQo+IGFwcGVhciBpbiB0
aGVpciBsaXRlcmFsIGZvcm0gb25seSB3aGVuIHVzZWQgYXMgbWFya3VwIGRlbGltaXRlcnMsIG9y
Cj4gd2l0aGluIGEgY29tbWVudCwgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uLCBvciBhIENEQVRB
IHNlY3Rpb24uIElmCj4gdGhleSBhcmUgbmVlZGVkIGVsc2V3aGVyZSwgdGhleSBtdXN0IGJlIGVz
Y2FwZWQgdXNpbmcgZWl0aGVyIG51bWVyaWMKPiBjaGFyYWN0ZXIgcmVmZXJlbmNlcyBvciB0aGUg
c3RyaW5ncyAiJmFtcDsiIGFuZCAiJmx0OyIgcmVzcGVjdGl2ZWx5LgoKCiAgLSAgaHR0cDovL2Rh
cy5iY2dzYy5jYTo4MDgwL2RhcwoKQ29ubmVjdGlvbiByZWZ1c2VkLgoKICAtICBodHRwOi8vZ2Fk
Zmx5Lmdlbi5jYW0uYWMudWs6ODA4MC9kYXMKCkNvbm5lY3Rpb24gcmVmdXNlZC4KCiAgLSAgaHR0
cDovL3RvbWNhdC5tb2xnZW4ubXBnLmRlOjgwODAvZGFzCgpBbHNvIHJ1bm5pbmcgJ1gtREFTLVZl
cnNpb246IDEuNTInCgpUaGUgc3R5bGVzaGVldCBmb3IgJ0NOQnMnIGlzCiAgIDQwNDogQmFkIHN0
eWxlc2hlZXQgKHJlcXVlc3RlZCBzdHlsZXNoZWV0IHVua25vd24pCgplbnRyeV9wb2ludHMgZm9y
IHRoYXQgZ2l2ZXMgYSAnNTAxOiBVbmltcGxlbWVudGVkIGZlYXR1cmUnCkFzIGRvIG90aGVyIGVu
dHJ5IHBvaW50cy4KCkFza2luZyBmb3IgJ0VQRF9Nb3VzZSdzIEROQSBhbHNvIGdpdmVzIGEgNTAx
LgoKQXNraW5nIGZvciAnRVBEX01vdXNlJ3MgdHlwZXMgKGdpdmluZyBpdCBubyBwYXJhbWV0ZXJz
KSBnaXZlcyBhClNFR01FTlQgd2l0aG91dCB0aGUgcmVxdWlyZWQgJ2lkJyBhdHRyaWJ1dGUsIGFz
IGluOgoKPD94bWwgdmVyc2lvbj0nMS4wJyBzdGFuZGFsb25lPSdubycgPz4KPCFET0NUWVBFIERB
U1RZUEVTIFNZU1RFTSAnZGFzdHlwZXMuZHRkJyA+CjxEQVNUWVBFUz4KICA8R0ZGIHZlcnNpb249
IjEuMCIgaHJlZj0iaHR0cDovL3RvbWNhdC5tb2xnZW4ubXBnLmRlOjgwODAvZGFzL0VQRF9Nb3Vz
ZS90eXBlcyI+CiAgICA8U0VHTUVOVCB2ZXJzaW9uPSIxLjAiPgogICAgICA8VFlQRSBpZD0ibnVs
bCIgLz4KICAgIDwvU0VHTUVOVD4KICA8L0dGRj4KPC9EQVNUWVBFUz4KCgoKICAtICBodHRwOi8v
ZXVnZW5lcy5vcmcvY2dpLWJpbi9zcnNkYXMvZHNuCgpTYXlzIGl0J3MgbW92ZWQgdG8gaHR0cDov
L2V1Z2VuZXMub3JnOjgwODkvY2dpLWJpbi9zcnNkYXMKd2hpY2ggaXMgbW92ZWQgdG8gIGh0dHA6
Ly9ldWdlbmVzLm9yZzo3MTgwL2NnaS1iaW4vc3JzZGFzCgoKVGhpcyBpcyB1c2luZyAieC1kYXMt
dmVyc2lvbjogREFTLzEuNTAiLgoKTGlrZSB0aGUgd29ybWJhc2Uub3JnIG9uZSBhYm92ZSwgd2hl
biBJIGFzayBmb3IKICBodHRwOi8vZXVnZW5lcy5vcmcvY2dpLWJpbi9zcnNkYXMvZHNuL2h1bWFu
L2VudHJ5X3BvaW50cwpJIGdldCB0aGUgRFNOIG91dHB1dCwgYXMgaW4KCjw/eG1sIHZlcnNpb249
IjEuMCIgc3RhbmRhbG9uZT0ieWVzIj8+CjwhRE9DVFlQRSBEQVNEU04gU1lTVEVNICJodHRwOi8v
d3d3LmJpb2Rhcy5vcmcvZHRkL2Rhc2Rzbi5kdGQiPgo8REFTRFNOPgogICA8RFNOPgogICAgICA8
U09VUkNFIGlkPSJmbHkiPmZseTwvU09VUkNFPgogICAgICA8TUFQTUFTVEVSPmh0dHA6Ly9ldWdl
bmVzLm9yZzo3MTgwL2NnaS1iaW4vc3JzZGFzL2ZseTwvTUFQTUFTVEVSPgogICAgICA8REVTQ1JJ
UFRJT04+RHJvc29waGlsYSBtZWxhbm9nYXN0ZXIgYW5ub3RhdGlvbnMgZnJvbSBldUdlbmVzIHN1
bW1hcnkgc2VydmljZTwvREVTQ1JJUFRJT04+CiAgIDwvRFNOPgogIC4uLi4KCgpXaGVuIEkgYWNj
ZXNzIGh0dHA6Ly9ldWdlbmVzLm9yZzo3MTgwL2NnaS1iaW4vc3JzZGFzL2h1bWFuL2RuYQpJIGdl
dAoKPD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJ5ZXMiPwo8IURPQ1RZUEUgREFTRE5B
IFNZU1RFTSAiaHR0cDovL3d3dy53b3JtYmFzZS5vcmcvZHRkL2Rhc2RuYS5kdGQiPgo8REFTRE5B
Pgo8L0RBU0ROQT4KCmJ1dCB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgRFREIHNheSB0aGVyZSBtdXN0
IGJlIGEgJ1NFUVVFTkNFJyB0YWcuCgoKCiAgLSAgaHR0cDovL3d3dy50aWdyLm9yZy9kb2NzL3Rp
Z3Itc2NyaXB0cy90Z2kvZGFzL2RzbgoKVGhpcyByZXR1cm5zIGEgaGVhZGVyIG9mIHRoZSBmb3Jt
CgogIFgtZGFzLXZlcnNpb246IERBUy8wLjk5NgogIFgtZGFzLXN0YXR1czogMjAwIE9LCgpUaGUg
c3BlYyBzYXlzCgo+IFRoZSBzZWNvbmQgbGluZSBpcyBYLURBUy1TdGF0dXMgYW5kIGNvbnRhaW5z
IGEgdGhyZWUgZGlnaXQgc3RhdHVzCj4gY29kZSB3aGljaCBpbmRpY2F0ZXMgdGhlIG91dGNvbWUg
b2YgdGhlIHJlcXVlc3QuCgpJbiB0aGlzIGNhc2UgdGhlIHRocmVlIGRpZ2l0IGNvZGUgaXMgZm9s
bG93ZWQgYnkgYSB0ZXh0IG1lc3NhZ2UuCgpIb3dldmVyLCB0aGlzIGlzIG1vcmUgc2ltaWxhciB0
byB0aGUgSFRUUCBzcGVjLCB3aGljaCBkZWZpbmVzIGl0cwpzdGF1cyBsaW5lIGFzOgoKaHR0cDov
L3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWM2Lmh0bWwjc2VjNi4xCj4g
Ni4xIFN0YXR1cy1MaW5lCj4gCj4gVGhlIGZpcnN0IGxpbmUgb2YgYSBSZXNwb25zZSBtZXNzYWdl
IGlzIHRoZSBTdGF0dXMtTGluZSwgY29uc2lzdGluZwo+IG9mIHRoZSBwcm90b2NvbCB2ZXJzaW9u
IGZvbGxvd2VkIGJ5IGEgbnVtZXJpYyBzdGF0dXMgY29kZSBhbmQgaXRzCj4gYXNzb2NpYXRlZCB0
ZXh0dWFsIHBocmFzZSwgd2l0aCBlYWNoIGVsZW1lbnQgc2VwYXJhdGVkIGJ5IFNQCj4gY2hhcmFj
dGVycy4gTm8gQ1Igb3IgTEYgaXMgYWxsb3dlZCBleGNlcHQgaW4gdGhlIGZpbmFsIENSTEYKPiBz
ZXF1ZW5jZS4KPiAKPiAgICAgICAgU3RhdHVzLUxpbmUgPSBIVFRQLVZlcnNpb24gU1AgU3RhdHVz
LUNvZGUgU1AgUmVhc29uLVBocmFzZSBDUkxGCj4gCj4gNi4xLjEgU3RhdHVzIENvZGUgYW5kIFJl
YXNvbiBQaHJhc2UKPiAKPiBUaGUgU3RhdHVzLUNvZGUgZWxlbWVudCBpcyBhIDMtZGlnaXQgaW50
ZWdlciByZXN1bHQgY29kZSBvZiB0aGUKPiBhdHRlbXB0IHRvIHVuZGVyc3RhbmQgYW5kIHNhdGlz
ZnkgdGhlIHJlcXVlc3QuIFRoZXNlIGNvZGVzIGFyZSBmdWxseQo+IGRlZmluZWQgaW4gc2VjdGlv
biAxMC4gVGhlIFJlYXNvbi1QaHJhc2UgaXMgaW50ZW5kZWQgdG8gZ2l2ZSBhIHNob3J0Cj4gdGV4
dHVhbCBkZXNjcmlwdGlvbiBvZiB0aGUgU3RhdHVzLUNvZGUuIFRoZSBTdGF0dXMtQ29kZSBpcyBp
bnRlbmRlZAo+IGZvciB1c2UgYnkgYXV0b21hdGEgYW5kIHRoZSBSZWFzb24tUGhyYXNlIGlzIGlu
dGVuZGVkIGZvciB0aGUgaHVtYW4KPiB1c2VyLiBUaGUgY2xpZW50IGlzIG5vdCByZXF1aXJlZCB0
byBleGFtaW5lIG9yIGRpc3BsYXkgdGhlIFJlYXNvbi0KPiBQaHJhc2UuCgoKV2hlbiBJIGFzayBm
b3IgdGhlICdlbnRyeV9wb2ludHMnIG9mICdlbGVnYW5zZ2VuZXMnIEkgZ290IGEgcmVndWxhcgpI
VFRQIDQwNCAiTm90IEZvdW5kIiwgYXMgZnJvbQoKIGh0dHA6Ly93d3cudGlnci5vcmcvZG9jcy90
aWdyLXNjcmlwdHMvdGdpL2Rhcy9lbGVnYW5zZ2VuZXMvZW50cnlfcG9pbnRzCgp3aGVyZWFzIGl0
IHdvcmtzIHdpdGggYXJhYmlkb3BzaXMuCiBodHRwOi8vd3d3LnRpZ3Iub3JnL2RvY3MvdGlnci1z
Y3JpcHRzL3RnaS9kYXMvYXJhYmlkb3BzaXMvZW50cnlfcG9pbnRzCgpJIGRpZG4ndCBsb29rIGlu
dG8gdGhpcyBzZXJ2ZXIgYW55IGZ1cnRoZXIuCgo=

--Multipart_Thu__29_Aug_2002_01:23:33_-0600_08442370--