[Xotcl] Some fixes to xodoc

Kristoffer Lawson setok@fishpool.com
Thu, 21 Dec 2000 03:11:44 +0200 (EET)


  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

--282346852-499593805-977361104=:11805
Content-Type: TEXT/PLAIN; charset=US-ASCII


Attached to this post I have a slightly fixed version of xodoc. I did the
following corrections/additions:

- Added space between the different "sections" of class
descriptions. Ie. as in the following case:

@ Class Foo {
  description {blah}
  errors {foo}
}

It would just stick 'description' and 'errors' on to the same line.


- Added functionality to handle optional procedure arguments. Ie. as in
thee following case:

@ Foo instproc {arg1 {arg2 ""}} {}

Now it marks arg2 as optional with the standard Tcl syntax, and also
automatically specifies the default value along with the description.


- Added some special handling for the section 'errorCodes' in a
class. These error codes are the things you can give with the
[error] command to give a code to the error, so catching is
easier. Ie. the following:

@ Class Foo {
  description {blah} 
  errorCodes {
    MyAppError {
      Used for sending errors my application specifically
      creates.
    }
  }
}


What I didn't do:

I was going to add an extension facility so that applications could
specify their own handler-objects for certain special sections. Like in
Class Foo above I might have a section {Attribute Aliases} in addition to
errorCodes (as I do). I would like to specify a AttrAliasDocHandle object,
for example, which would have the method "toHtml" (if outputting HTML)
that gets called when the section {Attribute Aliases} is encountered, with
the data passed to it as an argument. This would then return a nice HTML
table documenting my aliases.

The syntax to create an extension might be something like this:

@ @DocExtension Class {Attribute Aliases} AttrAliasDocHandle

I would have done this myself but it's already late (3am) and I really
desperately need to continue my real work. If anyone feels like
implementing that, then feel free... Otherwise I'll just have to get back
to it at some later time :-(

         -     ---------- = = ---------//--+
         |    /     Kristoffer Lawson      |  www.fishpool.fi|.com
         +-> |    setok@fishpool.com       |  - - --+------
             |-- Fishpool Creations Ltd - /         |
             +-------- = - - - = ---------      /~setok/

--282346852-499593805-977361104=:11805
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="xodoc.xotcl"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.21.0012210311440.11805@gfanrend.fishpool.fi>
Content-Description: 
Content-Disposition: attachment; filename="xodoc.xotcl"

IyAkSWQ6IHhvZG9jLnhvdGNsLHYgMS43IDIwMDAvMTEvMjkgMjI6MjA6MTUg
bmV1bWFubiBFeHAgJA0KcGFja2FnZSBwcm92aWRlIHhvRG9jIDAuODIgDQoj
cGFja2FnZSByZXF1aXJlIHRyYWNlDQoNCkAgQEZpbGUgew0KICBkZXNjcmlw
dGlvbiB7DQogICAgWE9UY2wgZG9jdW1lbnRhdGlvbiB0b29sLiBPdmVybG9h
ZHMgdGhlIGNvbW1hbmQgQCwgd2hpY2ggaXMgdXNlZA0KICAgIGFzIGEgZG9j
dW1lbnRhdGlvbiB0b2tlbi4gDQogIH0NCn0NCg0KQ2xhc3MgRG9jVG9rZW4g
LXBhcmFtZXRlciB7DQogIHtuYW1lICIifQ0KICB7ZG9jUHJvcGVydGllcyAi
In0NCn0NCg0KRG9jVG9rZW4gcHJvYyBzb3J0VG9rZW5MaXN0IGwgew0KICBm
b3JlYWNoIHQgJGwgew0KICAgIHNldCBuYW1lcyhbJHQgc2V0IG5hbWVdKSAk
dA0KICB9DQogIHNldCBzb3J0ZWROYW1lIFtsc29ydCBbYXJyYXkgbmFtZXMg
bmFtZXNdXQ0KICBzZXQgc29ydGVkTGlzdCAiIg0KICBmb3JlYWNoIG4gJHNv
cnRlZE5hbWUgew0KICAgIGxhcHBlbmQgc29ydGVkTGlzdCBbc2V0IG5hbWVz
KCRuKV0NCiAgfQ0KICByZXR1cm4gJHNvcnRlZExpc3QNCn0NCg0KRG9jVG9r
ZW4gaW5zdHByb2MgZXZhbHVhdGVEb2MgZG9jIHsNCiAgZm9yZWFjaCB7cCB2
fSAkZG9jIHsNCiAgICBbc2VsZl0gc2V0ICRwICR2DQogICAgW3NlbGZdIGxh
cHBlbmQgZG9jUHJvcGVydGllcyAkcA0KICB9DQp9DQpEb2NUb2tlbiBpbnN0
cHJvYyBjYXBpdGFsaXplIHN0cmluZyB7DQogIGlmIHskOjp0Y2xfdmVyc2lv
biA+PSA4LjN9IHsNCiAgICBzdHJpbmcgdG91cHBlciAkc3RyaW5nIDAgMA0K
ICB9IGVsc2Ugew0KICAgIHJldHVybiAiW3N0cmluZyB0b3VwcGVyIFtzdHJp
bmcgcmFuZ2UgJHN0cmluZyAwIDBdXVtzdHJpbmcgcmFuZ2UgJHN0cmluZyAx
IGVuZF0iDQogIH0NCn0NCg0KQCBEb2NUb2tlbiBpbnN0cHJvYyBnZXREb2NQ
cm9wZXJ0aWVzSFRNTCB7fSB7DQogICAgZGVzY3JpcHRpb24gew0KCVJldHVy
bnMgbGlzdCBvZiBwcm9wZXJ0aWVzIGFzIEhUTUwuDQogICAgfQ0KfQ0KRG9j
VG9rZW4gaW5zdHByb2MgZ2V0RG9jUHJvcGVydGllc0hUTUwge30gew0KICAg
IHNldCBjICIiDQogICAgZm9yZWFjaCBwIFtbc2VsZl0gc2V0IGRvY1Byb3Bl
cnRpZXNdIHsgDQoJaWYge1tbc2VsZl0gZXhpc3RzICRwXX0gew0KCSAgICBh
cHBlbmQgYyAiPHA+PGVtPiIgW1tzZWxmXSBjYXBpdGFsaXplICRwXSAiOjwv
ZW0+IiANCgkgICAgaWYge1tzdHJpbmcgZXF1YWwgJHAgImVycm9yQ29kZXMi
XX0gew0KCQkjIEJ1aWxkIHRhYmxlIHdpdGggbGlzdCBvZiBlcnJvciBjb2Rl
cy4NCgkJYXBwZW5kIGMgIjxibG9ja3F1b3RlPjx0YWJsZT4iDQoJCWZvcmVh
Y2gge2NvZGUgZGVzY30gW1tzZWxmXSBzZXQgJHBdIHsNCgkJICAgIHNldCBj
b2RlIFtzdHJpbmcgbWFwIFtsaXN0IDwgJmx0XDsgPiAmZ3RcO10gJGNvZGVd
DQoJCSAgICBzZXQgZGVzYyBbc3RyaW5nIG1hcCBbbGlzdCA8ICZsdFw7ID4g
Jmd0XDtdICRkZXNjXQ0KCQkgICAgYXBwZW5kIGMgIjx0cj48dGQgdmFsaWdu
PVwidG9wXCI+PGI+JGNvZGU8L2I+PHRkPiRkZXNjIg0KCQl9DQoJCWFwcGVu
ZCBjICI8L3RhYmxlPjwvYmxvY2txdW90ZT4iDQoJICAgIH0gZWxzZSB7DQoJ
CWFwcGVuZCBjIFtbc2VsZl0gcmVmbG93SFRNTCAiICAgIiBbW3NlbGZdIHNl
dCAkcF1dIFxuXG4NCgkgICAgfQ0KCX0NCiAgICB9DQoNCiAgICByZXR1cm4g
JGMNCn0NCg0KRG9jVG9rZW4gaW5zdHByb2MgcmVmbG93SFRNTCB7bGVmdCBw
YXJhZ3JhcGh9IHsNCiAgI3NldCByZXN1bHQgIiINCiAgI2ZvcmVhY2ggbGlu
ZSBbc3BsaXQgJHBhcmFncmFwaCBcbl0gew0KICAjICBpZiB7IVtyZWdleHAg
e14gKiR9ICRsaW5lXX0gew0KICAjICAgIGFwcGVuZCByZXN1bHQgIiRsZWZ0
JGxpbmU8YnI+XG4iDQogICMgIH0NCiAgI30NCiAgI3JldHVybiAkcmVzdWx0
DQogIHJldHVybiAkcGFyYWdyYXBoDQp9DQoNCkNsYXNzIERvY0ZpbGUgLXN1
cGVyY2xhc3MgRG9jVG9rZW4NCkRvY0ZpbGUgaW5zdHByb2MgcHJpbnRIVE1M
IHt9IHsNCiAgc2V0IGMgIjxicj48Yj4gRmlsZW5hbWU6IDwvYj4gPEEgaHJl
Zj0nW1tzZWxmXSBzZXQgbmFtZV0nPltbc2VsZl0gc2V0IG5hbWVdPC9BPg0K
ICAgICAgICA8YnI+PGJyPlxuIg0KICBhcHBlbmQgYyAiW1tzZWxmXSBnZXRE
b2NQcm9wZXJ0aWVzSFRNTF0gPGJyPlxuIg0KICByZXR1cm4gJGMNCn0NCg0K
Q2xhc3MgRG9jUGFja2FnZSAtc3VwZXJjbGFzcyBEb2NUb2tlbiAtcGFyYW1l
dGVyIHsNCiAge3ZlcnNpb24gIiJ9DQogIHt0eXBlICIifQ0KfQ0KDQpDbGFz
cyBEb2NPYmogLXN1cGVyY2xhc3MgRG9jVG9rZW4gLXBhcmFtZXRlciB7DQog
IHtwcm9jTGlzdCAiIn0NCiAgY2wNCn0NCkRvY09iaiBpbnN0cHJvYyBnZXRQ
cm9jc0hUTUwge30gew0KICBzZXQgYyAiIg0KICBzZXQgcGwgW0RvY1Rva2Vu
IHNvcnRUb2tlbkxpc3QgW1tzZWxmXSBwcm9jTGlzdF1dDQogIGlmIHtbW3Nl
bGZdIGlzdHlwZSBEb2NDbF19IHsNCiAgICBzZXQgcGwgW2NvbmNhdCBbRG9j
VG9rZW4gc29ydFRva2VuTGlzdCBbW3NlbGZdIGluc3Rwcm9jTGlzdF1dICRw
bF0NCiAgfQ0KICBmb3JlYWNoIHAgJHBsIHsNCiAgICBzZXQgcG4gWyRwIHNl
dCBuYW1lXQ0KICAgIHNldCBsYWJlbCgkcG4pICI8YSBocmVmPVwiI1tbc2Vs
Zl0gc2V0IG5hbWVdLSRwblwiPiRwbjwvYT4iDQogIH0NCiAgZm9yZWFjaCBs
IFtsc29ydCBbYXJyYXkgbmFtZXMgbGFiZWxdXSB7DQogICAgaWYgeyRjICE9
ICIifSB7YXBwZW5kIGMgIiwgIn0NCiAgICBhcHBlbmQgYyAkbGFiZWwoJGwp
DQogIH0NCiAgaWYgeyRjICE9ICIifSB7YXBwZW5kIGMgIi4ifQ0KICByZXR1
cm4gJGMNCn0NCiAgDQpEb2NPYmogaW5zdHByb2MgcHJpbnRIVE1MIHt9IHsN
CiAgc2V0IGMgIjxhIG5hbWU9XCJbW3NlbGZdIHNldCBuYW1lXVwiPjwvYT48
aDI+IE9iamVjdDogPGVtPiBbW3NlbGZdIHNldCBuYW1lXSA8L2VtPiA8L2gy
PlxuIg0KICBpZiB7W1tzZWxmXSBleGlzdHMgY2xdfSB7DQogICAgYXBwZW5k
IGMgIjxiPkNsYXNzPC9iPjogW1tzZWxmXSBzZXQgY2xdIDxicj5cbiINCiAg
fQ0KICBpZiB7W1tzZWxmXSBleGlzdHMgaGVyaXRhZ2VdfSB7DQogICAgYXBw
ZW5kIGMgIjxiPkhlcml0YWdlPC9iPjogW1tzZWxmXSBzZXQgaGVyaXRhZ2Vd
IDxicj5cbiINCiAgfQ0KDQogIHNldCBoZWFkICI8Yj4gUHJvY3MgPC9iPiAi
DQogIGlmIHtbW3NlbGZdIGlzdHlwZSBEb2NDbF19IHsNCiAgICBzZXQgaGVh
ZCAiPGI+IFByb2NzL0luc3Rwcm9jczogPC9iPiAiDQogIH0NCiAgYXBwZW5k
IGMgIiRoZWFkIFxuIFtbc2VsZl0gZ2V0UHJvY3NIVE1MXSIgXA0KICAgICAg
ICI8YnI+PHA+XG4iIFwNCiAgICAgIFtbc2VsZl0gZ2V0RG9jUHJvcGVydGll
c0hUTUxdDQogIHJldHVybiAkYw0KfQ0KDQpDbGFzcyBEb2NDbCAtc3VwZXJj
bGFzcyBEb2NPYmogLXBhcmFtZXRlciB7DQogIHtpbnN0cHJvY0xpc3QgIiJ9
DQp9DQpEb2NDbCBpbnN0cHJvYyBpbml0IGFyZ3Mgew0KICBbc2VsZl0gc2V0
IG9iaiBbW3NlbGYgY2xhc3NdIGF1dG9uYW1lIGNsb2JqXQ0KICBuZXh0DQp9
DQpEb2NDbCBpbnN0cHJvYyBwcmludEhUTUwge30gew0KICByZWdzdWIgIjxo
Mj4gT2JqZWN0OiIgW25leHRdICI8aDI+IENsYXNzOiIgcg0KICByZXR1cm4g
JHINCn0NCkNsYXNzIERvY01ldGFDbA0KRG9jTWV0YUNsIGluc3Rwcm9jIHBy
aW50SFRNTCB7fSB7DQogIHJlZ3N1YiAiPGgyPiBDbGFzczoiIFtuZXh0XSAi
PGgyPiBNZXRhLUNsYXNzOiIgcg0KICByZXR1cm4gJHINCn0NCg0KQ2xhc3Mg
RG9jTWV0aG9kIC1zdXBlcmNsYXNzIERvY1Rva2VuIC1wYXJhbWV0ZXIgew0K
ICBhcmd1bWVudHMNCiAgcmV0dXJuVmFsdWUNCiAgb2JqDQp9DQoNCiMgUHJp
bnRzIG91dCBtZXRob2QgaW5mb3JtYXRpb24gYXMgSFRNTC4NCkRvY01ldGhv
ZCBpbnN0cHJvYyBwcmludEhUTUwge30gew0KICAjW3NlbGZdIHNob3dWYXJz
DQogIHNldCBhcmdUZXh0ICJcbiINCiAgc2V0IGEgIjx0ZD48ZW0+QXJndW1l
bnRzOjwvZW0+IDwvdGQ+Ig0KDQogIHNldCBhbmNob3IgIltbc2VsZl0gc2V0
IG9ial0tW1tzZWxmXSBzZXQgbmFtZV0iDQogIHNldCBjICI8YSBuYW1lPVwi
JGFuY2hvclwiPjwvYT5cbjxsaT48Yj5bW3NlbGZdIHNldCBuYW1lXSAiDQoN
CiAgaWYge1tbc2VsZl0gZXhpc3RzIGFyZ3VtZW50c119IHsNCiAgICBmb3Jl
YWNoIHthcmcgYXJnRH0gW1tzZWxmXSBzZXQgYXJndW1lbnRzXSB7DQoJaWYg
e1tsbGVuZ3RoICRhcmddID4gMX0gew0KCSAgICAjIEEgZGVmYXVsdCB2YWx1
ZSB3YXMgZ2l2ZW4gdG8gdGhlIGFyZ3VtZW50Lg0KCSAgICBhcHBlbmQgYyAi
IDxlbT4/W2xpbmRleCAkYXJnIDBdPzwvZW0+Ig0KCSAgICBhcHBlbmQgYXJn
VGV4dCAiPHRyIHZhbGlnbj1cInRvcFwiPiRhPHRkPiINCgkgICAgYXBwZW5k
IGFyZ1RleHQgIjxiPj9bbGluZGV4ICRhcmcgMF0/PC9iPjoiIFwNCgkJW1tz
ZWxmXSByZWZsb3dIVE1MICIgICAiIFwNCgkJICAgICAiJGFyZ0QgRGVmYXVs
dDogXCJbbGluZGV4ICRhcmcgMV1cIi4iXSBcDQogICAgICAgICAgICAgICAg
IjwvdGQ+PC90cj5cbiINCgl9IGVsc2Ugew0KCSAgICBhcHBlbmQgYyAiIDxl
bT4kYXJnPC9lbT4iDQoJICAgIGFwcGVuZCBhcmdUZXh0ICI8dHIgdmFsaWdu
PVwidG9wXCI+JGE8dGQ+PGI+JGFyZzwvYj46ICIgXA0KCQkiW1tzZWxmXSBy
ZWZsb3dIVE1MICIgICAiICRhcmdEXTwvdGQ+PC90cj5cbiINCgl9DQoJc2V0
IGEgIjx0ZD48L3RkPiINCiAgICB9DQogIH0NCiAgYXBwZW5kIGMgIiA8L2I+
PGJyPlxuPHRhYmxlPlxuIiBcDQogICAgICAkYXJnVGV4dCBbW3NlbGZdIGdl
dERvY1Byb3BlcnRpZXNIVE1MXSBcbiBcDQogICAgICA8L3RhYmxlPiBcbg0K
ICByZXR1cm4gJGMNCn0NCg0KQ2xhc3MgRG9jUHJvYyAtc3VwZXJjbGFzcyBE
b2NNZXRob2QNCkNsYXNzIERvY0luc3Rwcm9jIC1zdXBlcmNsYXNzIERvY01l
dGhvZA0KDQpAIENsYXNzIFhPRG9jIHsgZGVzY3JpcHRpb24gIkhhbmRsZXIg
Y2xhc3MgZm9yIGJ1aWxkaW5nIGEgZG9jdW1lbnRhdGlvbiBkYXRhYmFzZSIg
fQ0KDQpDbGFzcyBYT0RvYyAtcGFyYW1ldGVyIHsNCiAge29iakxpc3QgIiJ9
DQogIHtwYWNrYWdlTGlzdCAiIn0NCiAge2tub3duTWV0YWNsYXNzZXMgIkNs
YXNzIn0NCiAge25zICIifQ0KICBmaWxlVG9rZW4NCn0NCg0KWE9Eb2MgaW5z
dHByb2MgaW5pdCBhcmdzIHsNCiAgbmV4dA0KfQ0KDQpAIFhPRG9jIHByb2Mg
ZG9jdW1lbnRGaWxlQXNIVE1MIHtmaWxlICJmaWxlbmFtZSBvZiB0aGUgeG90
Y2wgZmlsZSB0byBiZSBkb2N1bWVudGVkIg0KCQkJICAgZG9jZGlyICJkaXJl
Y3RvcnkgdG8gd2hpY2ggdGhlIGh0bWwgZmlsZSBpcyB3cml0dGVuIn0gew0K
ICBkZXNjcmlwdGlvbiAiVXNlcyB0aGUgeG9Eb2MgcGFja2FnZSB0byBwcm9k
dWNlIGFuIEhUTUwgZG9jdW1lbnRhdGlvbiBvZg0KICAgICAgICAgICAgICAg
YSBzcGVjaWZpZWQgZmlsZSAqKioueG90Y2wuIFRoZSBmaWxlIGlzIHdyaXR0
ZW4gdG8gKioqLmh0bWwNCiAgICAgICAgICAgICAgIGluIGRvY2RpciINCiAg
cmV0dXJuICJmaWxlIGJhc2VuYW1lIHdpdGhvdXQgc3VmZml4Ig0KfQ0KDQpY
T0RvYyBwcm9jIGRvY3VtZW50RmlsZUFzSFRNTCB7ZmlsZSBkb2NkaXJ9IHsN
CiAgc2V0IGRvY2RiIFtYT0RvYyBbWE9Eb2MgYXV0b25hbWUgZG9jZGJdXQ0K
ICA6OkAgc2V0IHhvRG9jT2JqICRkb2NkYg0KICAkZG9jZGIgcmVhZEZpbGUg
JGZpbGUNCiAgc2V0IGZiICRmaWxlDQogIHJlZ2V4cCB7KFteL10qKVwuW14u
XSokfSAkZmIgXyBmYg0KICAkZG9jZGIgd3JpdGVGaWxlICR7ZG9jZGlyfS8k
ZmIuaHRtbCAkZmIgWyRkb2NkYiBwcmludEhUTUxdDQogICRkb2NkYiBkZXN0
cm95DQogIHJldHVybiAkZmINCn0NCg0KWE9Eb2MgaW5zdHByb2MgaGFuZGxl
TWV0aG9kIHtvYmogdHlwZSBuYW1lIHthcmdMaXN0ICIifSB7ZG9jICIifX0g
ew0KICAjcHV0cyBzdGRlcnIgIisrK01ldGhvZCAkdHlwZSAkbmFtZSAkYXJn
TGlzdCAkZG9jIg0KICBzZXQgcHJvY0NsYXNzIERvY1Byb2M7IHNldCBvYmpD
bCBEb2NPYmoNCiAgaWYgeyR0eXBlID09ICJpbnN0cHJvYyJ9IHtzZXQgcHJv
Y0NsIERvY0luc3Rwcm9jOyBzZXQgb2JqQ2wgRG9jQ2x9DQogIHNldCB0IFsk
cHJvY0NsYXNzIGNyZWF0ZSBbW3NlbGZdIGF1dG9uYW1lIHRdXQ0KICANCiAg
c2V0IG4gWyR0IHNldCBuYW1lIFtzdHJpbmcgdHJpbWxlZnQgJG5hbWUgOl1d
DQogICR0IHNldCBvYmogJG9iag0KDQogIHNldCBvYmpGb3VuZCAwDQogIGZv
cmVhY2ggbyBbW3NlbGZdIHNldCBvYmpMaXN0XSB7DQogICAgaWYge1skbyBz
ZXQgbmFtZV0gPT0gJG9ian0gew0KICAgICAgc2V0IG9iakZvdW5kIDENCiAg
ICAgIGlmIHskdHlwZSA9PSAiaW5zdHByb2MiICYmICFbJG8gaXN0eXBlIERv
Y0NsXX0gew0KCSRvIGNsYXNzIERvY0NsDQogICAgICB9DQogICAgICBicmVh
aw0KICAgIH0NCiAgfQ0KICBpZiB7JG9iakZvdW5kID09IDB9IHsNCiAgICBz
ZXQgbyBbJG9iakNsIGNyZWF0ZSBbW3NlbGZdIGF1dG9uYW1lIHRdXQ0KICAg
ICRvIHNldCBuYW1lICRvYmoNCiAgICBbc2VsZl0gbGFwcGVuZCBvYmpMaXN0
ICRvDQogIH0NCiAgJG8gbGFwcGVuZCAke3R5cGV9TGlzdCAkdA0KDQogICR0
IHNldCBhcmd1bWVudHMgJGFyZ0xpc3QgDQoNCiAgJHQgZXZhbHVhdGVEb2Mg
JGRvYw0KfQ0KDQpYT0RvYyBpbnN0cHJvYyBoYW5kbGVPYmoge2NsYXNzIG5h
bWUgYXJnc30gew0KICBbc2VsZl0gaW5zdHZhciBrbm93bk1ldGFjbGFzc2Vz
IG9iakxpc3QgZXh0ZW5zaW9ucw0KICBzZXQgb2JqQ2wgRG9jT2JqDQogIGlm
IHtbbHNlYXJjaCAkY2xhc3MgJGtub3duTWV0YWNsYXNzZXNdICE9IC0xfSB7
DQogICAgc2V0IG9iakNsIERvY0NsDQogIH0NCgkNCiAgIyBpZiBhbiBpbnN0
cHJvYy9wcm9jIGhhcyBjcmVhdGVkIGFuIGVudHJ5IGZvciB0aGlzIG9iai9j
bGFzcw0KICAjIC0+IHVzZSBpdCBhbmQgb3ZlcndyaXRlIGl0IHdpdGggbmV3
IGluZm8NCiAgaWYge1tzZXQgaWR4IFtsc2VhcmNoICRuYW1lICRvYmpMaXN0
XV0gIT0gLTF9IHsNCiAgICBzZXQgdCBbbGluZGV4ICRvYmpMaXN0ICRpZHhd
DQogICAgJHQgY2xhc3MgJG9iakNsDQogIH0gZWxzZSB7DQogICAgc2V0IHQg
WyRvYmpDbCBjcmVhdGUgW1tzZWxmXSBhdXRvbmFtZSB0XV0NCiAgICBbc2Vs
Zl0gbGFwcGVuZCBvYmpMaXN0ICR0DQogIH0NCg0KICAkdCBzZXQgbmFtZSAk
bmFtZQ0KDQogIHNldCBsYSBbbGxlbmd0aCAkYXJnc10NCg0KICAjIGV2YWx1
YXRlIC1zdXBlcmNsYXNzIGFyZ3VtZW50DQogIGlmIHsoJGxhID09IDMgfHwg
JGxhID09IDIpICYmIFtsaW5kZXggJGFyZ3MgMF0gPT0gIi1zdXBlcmNsYXNz
In0gew0KICAgIHNldCBoZXJpdGFnZSBbJHQgc2V0IGhlcml0YWdlIFtsaW5k
ZXggJGFyZ3MgMV1dDQogICAgZm9yZWFjaCBoICRoZXJpdGFnZSB7DQogICAg
ICBpZiB7W2xzZWFyY2ggJGggJGtub3duTWV0YWNsYXNzZXNdICE9IC0xfSB7
DQoJIyBBIG5ldyBtZXRhY2xhc3Mgd2FzIGRlZmluZWQNCglsYXBwZW5kIGtu
b3duTWV0YWNsYXNzZXMgJG5hbWUNCgkkdCBjbGFzcyBEb2NNZXRhQ2wNCiAg
ICAgIH0NCiAgICB9DQogIH0NCg0KICAjIGV2YWx1YXRlIGRvY3VtZW50YXRp
b24NCiAgc2V0IGRvYyAiIg0KICBpZiB7JGxhID09IDF9IHsNCiAgICBzZXQg
ZG9jIFtsaW5kZXggJGFyZ3MgMF0NCiAgfSBlbHNlaWYgeyRsYSA9PSAzfSB7
DQogICAgc2V0IGRvYyBbbGluZGV4ICRhcmdzIDJdDQogIH0NCiAgJHQgZXZh
bHVhdGVEb2MgJGRvYw0KICAkdCBzZXQgY2wgJGNsYXNzDQoNCiAgI3B1dHMg
c3RkZXJyICIrKytPYmogJG5hbWUgJGFyZ3MiDQp9DQoNClhPRG9jIGluc3Rw
cm9jIGhhbmRsZUZpbGUgZG9jIHsNCiAgaWYge1tbc2VsZl0gZXhpc3RzIGZp
bGVUb2tlbl19IHsNCiAgICBbW3NlbGZdIHNldCBmaWxlVG9rZW5dIGV2YWx1
YXRlRG9jICRkb2MNCiAgfQ0KfQ0KDQpYT0RvYyBpbnN0cHJvYyBoYW5kbGVQ
YWNrYWdlIGFyZ3Mgew0KICAjcHV0cyAiJGFyZ3MiDQogIGlmIHtbbGxlbmd0
aCAkYXJnc10gPiAyfSB7DQogICAgc2V0IHR5cGUgW2xpbmRleCAkYXJncyAx
XQ0KICAgIGlmIHskdHlwZSA9PSAicHJvdmlkZSIgfHwgJHR5cGUgPT0gInJl
cXVpcmUifSB7DQogICAgc2V0IHQgW0RvY1BhY2thZ2UgY3JlYXRlIFtbc2Vs
Zl0gYXV0b25hbWUgdF1dDQogICAgICBbc2VsZl0gbGFwcGVuZCBwYWNrYWdl
TGlzdCAkdA0KICAgICAgJHQgc2V0IG5hbWUgW2xpbmRleCAkYXJncyAyXQ0K
ICAgICAgJHQgc2V0IHR5cGUgJHR5cGUNCiAgICAgIGlmIHtbbGxlbmd0aCAk
YXJnc10gPiAzfSB7DQoJJHQgc2V0IHZlcnNpb24gW2xpbmRleCAkYXJncyAz
XQ0KICAgICAgfQ0KICAgIH0NCiAgfQ0KfQ0KDQpYT0RvYyBpbnN0cHJvYyBw
cmludEhUTUwge30gew0KICAgIFtzZWxmXSBpbnN0dmFyIGV4dGVuc2lvbnMN
CiAgc2V0IGMgIjxoMj4gUGFja2FnZS9GaWxlIEluZm9ybWF0aW9uIDwvaDI+
Ig0KDQogIFtzZWxmXSBpbnN0dmFyIHBhY2thZ2VMaXN0DQogIGlmIHtbbGxl
bmd0aCAkcGFja2FnZUxpc3RdID4gMH0gew0KICAgIGZvcmVhY2ggdCAkcGFj
a2FnZUxpc3Qgew0KICAgICAgaWYge1skdCB0eXBlXSA9PSAicHJvdmlkZSJ9
IHsNCglhcHBlbmQgYyAiPGI+IFBhY2thZ2UgcHJvdmlkZWQ6IDwvYj4gWyR0
IG5hbWVdIFskdCB2ZXJzaW9uXTxicj5cbiINCiAgICAgIH0gZWxzZWlmIHtb
JHQgdHlwZV0gPT0gInJlcXVpcmUifSB7DQoJYXBwZW5kIGMgIjxiPiBQYWNr
YWdlIHJlcXVpcmVkOiA8L2I+IFskdCBuYW1lXSBbJHQgdmVyc2lvbl08YnI+
XG4iDQogICAgICB9DQogICAgfQ0KICB9IGVsc2Ugew0KICAgIGFwcGVuZCBj
ICI8Yj4gTm8gcGFja2FnZSBwcm92aWRlZC9yZXF1aXJlZCA8L2I+PGJyPlxu
Ig0KICB9DQoNCiAgICBpZiB7W2luZm8gZXhpc3RzIGV4dGVuc2lvbnNdfSB7
DQoJIyBBZGQgbGlzdCBvZiBleHRlbnNpb25zLg0KCWZvcmVhY2ggZXh0ZW5z
aW9uICRleHRlbnNpb25zIHsNCgkgICAgYXBwZW5kIGMgIjxocj4iDQoJICAg
IGFwcGVuZCBjICI8aDI+RG9jdW1lbnQgZXh0ZW5zaW9uOiA8ZW0+WyRleHRl
bnNpb24gbmFtZV08L2VtPjwvaDI+Ig0KCSAgICBhcHBlbmQgYyAiPGVtPkRl
c2NyaXB0aW9uOjwvZW0+IFskZXh0ZW5zaW9uIGRlc2NyaXB0aW9uXSINCgl9
DQogICAgfQ0KDQogIHNldCBvYmpMaXN0IFtEb2NUb2tlbiBzb3J0VG9rZW5M
aXN0IFtbc2VsZl0gb2JqTGlzdF1dDQoNCiAgaWYge1tsbGVuZ3RoICRvYmpM
aXN0XT4wfSB7DQogICAgYXBwZW5kIGMgIjxicj48Yj5EZWZpbmVkIE9iamVj
dHMvQ2xhc3NlczogPC9iPiBcbjx1bD4iDQogICAgZm9yZWFjaCBvYmogJG9i
akxpc3Qgew0KICAgICAgc2V0IG9uIFskb2JqIHNldCBuYW1lXQ0KICAgICAg
YXBwZW5kIGMgIiAgPGxpPjxhIGhyZWY9XCIjJG9uXCI+PGVtPiRvbjwvZW0+
PC9hPjogXA0KCVskb2JqIGdldFByb2NzSFRNTF08YnI+XG4iDQogICAgfQ0K
ICAgIGFwcGVuZCBjICI8L3VsPlxuIg0KICB9DQoNCiAgaWYge1tbc2VsZl0g
ZXhpc3RzIGZpbGVUb2tlbl19IHsNCiAgICBhcHBlbmQgYyAiW1tbc2VsZl0g
c2V0IGZpbGVUb2tlbl0gcHJpbnRIVE1MXTxicj4iDQogIH0gZWxzZSB7DQog
ICAgYXBwZW5kIGMgIjxiPiBObyBmaWxlIGluZm9ybWF0aW9uLiA8L2I+PGJy
PlxuIg0KICB9DQogIA0KDQoNCiAgZm9yZWFjaCB0ICRvYmpMaXN0IHsNCiAg
ICBhcHBlbmQgYyAiPHA+PGhyPjxwPlxuIiBbJHQgcHJpbnRIVE1MXQ0KICAg
IHNldCBwbCBbJHQgc2V0IHByb2NMaXN0XQ0KDQogICAgaWYge1skdCBpc3R5
cGUgRG9jQ2xdfSB7DQogICAgICBzZXQgaXBsIFskdCBzZXQgaW5zdHByb2NM
aXN0XQ0KICAgICAgaWYge1tsbGVuZ3RoICRpcGxdID4gMH0gew0KCWFwcGVu
ZCBjICI8aDM+SW5zdHByb2NzPC9oMz5cbjx1bD5cbiINCglmb3JlYWNoIHMg
JGlwbCB7DQoJICBhcHBlbmQgYyBbJHMgcHJpbnRIVE1MXQ0KCX0NCglhcHBl
bmQgYyAiPC91bD5cbiINCiAgICAgIH0NCiAgICB9DQoNCiAgICBpZiB7W2xs
ZW5ndGggJHBsXSA+IDB9IHsNCiAgICAgIGFwcGVuZCBjICI8aDM+UHJvY3M8
L2gzPlxuPHVsPlxuIg0KICAgICAgZm9yZWFjaCBzICRwbCB7DQoJYXBwZW5k
IGMgWyRzIHByaW50SFRNTF0NCiAgICAgIH0NCiAgICAgIGFwcGVuZCBjICI8
L3VsPlxuIg0KICAgIH0NCiAgICAjYXBwZW5kIGMgIjxocj5cbiINCiAgfQ0K
ICByZXR1cm4gJGMNCn0NCg0KWE9Eb2MgaW5zdHByb2MgZ2V0Q29tbWFuZCB7
Y29udGVudH0gew0KICB1cHZhciAkY29udGVudCBjDQogIFtzZWxmXSBpbnN0
dmFyIGNtZA0KICBpZiB7W3NldCBsaW5lIFtzdHJpbmcgZmlyc3QgIlxuIiAk
Y11dICE9IC0xfSB7DQogICAgYXBwZW5kIGNtZCBbc3RyaW5nIHJhbmdlICRj
IDAgJGxpbmVdIFxuDQogICAgc2V0IGMgW3N0cmluZyByYW5nZSAkYyBbZXhw
ciAkbGluZSArIDFdIGVuZF0NCiAgICBpZiB7W2luZm8gY29tcGxldGUgJGNt
ZF19IHsNCiAgICAgIHNldCByICRjbWQ7IHNldCBjbWQgIiINCiAgICAgIHJl
dHVybiAkcg0KICAgIH0NCiAgfSBlbHNlIHsNCiAgICByZXR1cm4gIiINCiAg
fQ0KICBbc2VsZl0gZ2V0Q29tbWFuZCBjDQp9DQoNClhPRG9jIGluc3Rwcm9j
IGV2YWx1YXRlQ29tbWFuZHMge2N9IHsNCiAgd2hpbGUgMSB7DQogICAgc2V0
IGNvbW1hbmQgW1tzZWxmXSBnZXRDb21tYW5kIGNdDQogICAgaWYgeyRjb21t
YW5kID09ICIifSB7DQogICAgICBicmVhaw0KICAgIH0NCiAgICAjcHV0cyBz
dGRlcnIgIiRjb21tYW5kPT09PT09PT09PT09PT09PT09PT09PT09PT09Ig0K
ICAgIGlmIHtbcmVnZXhwICJeICo6KkAgIiAkY29tbWFuZF19IHsNCiAgICAg
ICNwdXRzIHN0ZGVyciAiJGNvbW1hbmQ9PT09PT09PT09PT09PT09PT09PT09
PT09PT0iDQogICAgICBldmFsICRjb21tYW5kDQogICAgfSBlbHNlaWYge1ty
ZWdleHAgIl4gKnBhY2thZ2UgIiAkY29tbWFuZF19IHsNCiAgICAgICNwdXRz
IHN0ZGVyciAiJGNvbW1hbmQ9PT09PT09PT09PT09PT09PT09PT09PT09PT0i
DQogICAgICBldmFsIFtzZWxmXSBoYW5kbGVQYWNrYWdlICRjb21tYW5kDQog
ICAgfSBlbHNlaWYge1tyZWdleHAgIl4gKm5hbWVzcGFjZSAqZXZhbCAqKFxb
Xlx7XF0qKSAqXHsoLiopXH1cW15cfVxdKiQiICRjb21tYW5kIF8gbmFtZXNw
YWNlIG5zY119IHsNCiAgICAgICNwdXRzIHN0ZGVyciAiJGNvbW1hbmQ9PT09
PT09PT09PT09PT09PT09PT09PT09PT0iDQogICAgICBbc2VsZl0gZXZhbHVh
dGVDb21tYW5kcyAkbnNjIA0KICAgfSANCiAgfQ0KfQ0KWE9Eb2MgaW5zdHBy
b2MgcmVhZEZpbGUgbmFtZSB7DQogIFtzZWxmXSBzZXQgY21kICIiDQoNCiAg
c2V0IHQgW0RvY0ZpbGUgY3JlYXRlIFtbc2VsZl0gYXV0b25hbWUgdF1dICAN
CiAgJHQgc2V0IG5hbWUgJG5hbWUNCiAgW3NlbGZdIHNldCBmaWxlVG9rZW4g
JHQNCg0KICBzZXQgZiBbb3BlbiAkbmFtZSByXQ0KICBzZXQgYyBbcmVhZCAk
Zl0NCiAgY2xvc2UgJGYNCiAgW3NlbGZdIGV2YWx1YXRlQ29tbWFuZHMgJGMN
Cn0NCg0KWE9Eb2MgaW5zdHByb2MgcmVwbGFjZUZvcm1hdFRhZ3Mge2ZjfSB7
DQogIHJlZ3N1YiAtYWxsIDxAICRmYyA8IGZjDQogIHJlZ3N1YiAtYWxsIDwv
QCAkZmMgPC8gZmMNCiAgcmV0dXJuICRmYw0KfQ0KDQpYT0RvYyBpbnN0cHJv
YyB3cml0ZUZpbGUge2ZpbGVuYW1lIG5hbWUgZmlsZWNvbnRlbnR9IHsNCiAg
ICAjc2V0IGZpbGVuYW1lIFtbc2VsZl0gc2V0IERPQ0RJUl0vJG5hbWUuaHRt
bA0KDQogIHNldCBmaWxlY29udGVudCBbW3NlbGZdIHJlcGxhY2VGb3JtYXRU
YWdzICRmaWxlY29udGVudF0NCg0KICAgIHNldCBjb250ZW50IHsNCjxodG1s
Pg0KPGhlYWQ+DQo8dGl0bGU+WE9UY2wgLSBEb2N1bWVudGF0aW9uIC0tICRu
YW1lPC90aXRsZT4NCjwvaGVhZD4NCjxib2R5IGJnY29sb3I9RkZGRkZGPg0K
PGgxPjxJTUcgQUxJR049TUlERExFIFNSQyA9ICIuL2xvZ28tMTAwLmpwZyI+
JG5hbWU8L2gxPg0KPGhyPg0KPHA+IA0KDQokZmlsZWNvbnRlbnQNCg0KPHA+
PGhyPg0KPGEgSFJFRj0iLi9pbmRleC5odG1sIj5CYWNrIHRvIGluZGV4IHBh
Z2UuPC9hPg0KPGJyPjxocj48cD4NCjwvYm9keT4NCjwvaHRtbD4NCiAgICB9
DQoNCiAgICBzZXQgY29udGVudCBbc3Vic3QgLW5vYmFja3NsYXNoZXMgLW5v
Y29tbWFuZHMgJGNvbnRlbnRdDQogICAgI3B1dHMgJGNvbnRlbnQNCiAgICBz
ZXQgZiBbb3BlbiAkZmlsZW5hbWUgd10NCiAgICBwdXRzICRmICRjb250ZW50
DQogICAgY2xvc2UgJGYNCn0NCg0KQ2xhc3MgWE9Eb2NDbWQgLXBhcmFtZXRl
ciB7DQogIHt4b0RvY09iaiAiIn0NCn0gDQpYT0RvY0NtZCBpbnN0cHJvYyB1
bmtub3duIGFyZ3Mgew0KICAgIFtzZWxmXSBpbnN0dmFyIHhvRG9jT2JqDQog
ICAgaWYge1tsbGVuZ3RoICRhcmdzXSA+IDF9IHsNCglzd2l0Y2ggW2xpbmRl
eCAkYXJncyAxXSB7DQoJICAgIHByb2MgLSBpbnN0cHJvYyB7DQoJCXJldHVy
biBbZXZhbCAkeG9Eb2NPYmogaGFuZGxlTWV0aG9kICRhcmdzXQ0KCSAgICB9
DQoJICAgIGRlZmF1bHQgew0KCQlzd2l0Y2ggW2xpbmRleCAkYXJncyAwXSB7
DQoJCSAgICBARmlsZSB7DQoJCQlyZXR1cm4gWyR4b0RvY09iaiBoYW5kbGVG
aWxlIFtsaW5kZXggJGFyZ3MgMV1dDQoJCSAgICB9DQoJCSAgICBkZWZhdWx0
IHsNCgkJCXJldHVybiBbZXZhbCAkeG9Eb2NPYmogaGFuZGxlT2JqICRhcmdz
XQ0KCQkgICAgfQ0KCQl9DQoJICAgIH0NCgl9DQogICAgfQ0KICAgIHB1dHMg
c3RkZXJyICJVbmtub3duIGRvY3VtZW50YXRpb246ICckYXJncyciDQp9DQpY
T0RvY0NtZCBADQoNCg0K
--282346852-499593805-977361104=:11805--