Re: Question on redirectors/whenMoreResolved in the 3-way case, in the middle vat
Rob Withers <[email protected]> Sun, 22 Feb 2015 22:35:26 -0700
| Newsgroups | gmane.comp.lang.e.general |
|---|---|
| Message-ID | <[email protected]> |
--===============0129391604236517391==
Content-Type: text/html; charset=windows-1252
Content-Transfer-Encoding: quoted-printable
<html>
<head>
<meta content=3D"text/html; charset=3Dwindows-1252"
http-equiv=3D"Content-Type">
</head>
<body bgcolor=3D"#FFFFFF" text=3D"#000000">
Rather, I was <b>sending</b> a follow-on message to the 3-way
message.=A0 I'll check out the DelayedRedirector/ResolverProxy code
for how this is done.=A0 I have 2-vat and 3-vat happy path working,
yet my smash path aren't working yet.=A0 Nonetheless, I am still
having much fun.<br>
<br>
- Robert<br>
<br>
<br>
<div class=3D"moz-cite-prefix">On 2/22/2015 9:05 PM, Rob Withers
wrote:<br>
</div>
<blockquote cite=3D"mid:[email protected]" type=3D"cite">
<meta content=3D"text/html; charset=3Dwindows-1252"
http-equiv=3D"Content-Type">
Thank you, Mark.=A0 The Vine is working great.=A0 ProvideFor and
AcceptFrom are solid, with the gift tables.=A0 You rang a bell with
me and I looked at my old test.=A0 I was throwing a follow-on
message to the 3-way message.=A0 In this case, redirectForTheAnswer
sends getTheAnswer to bob, but then the hashCode message is sent
to that result.=A0 The issue is with the whenMoreResolved that is
sent after the hashCode message.=A0 The Ref(RemotePromiseRefImpl)
stored in the Redirector disappears, as there is no hard reference
to it.=A0 Here is the code called: <br>
<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 Ref answer =3D
alice.redirectMessage("redirectForTheAnswer",
bob).redirectMessage("hashCode");<br>
<br>
When I strip the subsequent call, test is green.=A0 Where should I
store a hard reference to that guy, do you think?<br>
<br>
- Robert<br>
<br>
<br>
<br>
It is the whenMoreResolved with the resulting remote promise from
redirection.<br>
<div class=3D"moz-cite-prefix"><br>
On 2/22/2015 8:02 PM, Mark S. Miller wrote:<br>
</div>
<blockquote
cite=3D"mid:CABHxS9hp0ay46GV3A7xy2dw1uj+FYzxeTVz=3Dun5UO=3DKEZsfPvA@mail.=
gmail.com"
type=3D"cite">
<div dir=3D"ltr">Have you looked at the Vine? Search for "Vine"
at=A0<a moz-do-not-send=3D"true"
href=3D"http://erights.org/elib/distrib/captp/index.html">htt=
p://erights.org/elib/distrib/captp/index.html</a>
<div>and in the source code of=A0<a moz-do-not-send=3D"true"
href=3D"https://code.google.com/p/caja-captp/">https://code=
.google.com/p/caja-captp/</a></div>
<div><br>
</div>
<div>I don't quite understand your question, so I'm not sure
if this is even relevant to the answer. Is it?</div>
<div><br>
</div>
<div><br>
</div>
</div>
<div class=3D"gmail_extra"><br>
<div class=3D"gmail_quote">On Sun, Feb 22, 2015 at 5:51 PM, Rob
Withers <span dir=3D"ltr"><<a moz-do-not-send=3D"true"
href=3D"mailto:[email protected]" target=3D"_bla=
nk">[email protected]</a>></span>
wrote:<br>
<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor=3D"#FFFFFF" text=3D"#000000"> I found some mor=
e
info: it looks as if the Ref in Alice's ProxyResolver is
being GCed, before resolution from Bob.=A0 This is
specific to my machinery, but knowing how Elib maintains
a reference to the Ref, in this case, may help make mine
better. How does Elib handle this?<br>
<br>
Thank you,<br>
- Robert
<div>
<div class=3D"h5"><br>
<br>
<div>On 2/22/2015 6:19 PM, Rob Withers wrote:<br>
</div>
<blockquote type=3D"cite"> I am stuck, both
conceptually, as well as understanding code I
wrote a long while ago.=A0 I was hoping to gain a
little insight from the list of the insides of
resolution redirection in the 3-way case.=A0 The
recent change I have made results from my thinking
I finally understand the ordering that
MirandaMethods ensure.=A0 I made changes such that =
a
whenMoreResolved directly follows the message that
generates is by adding to the front of the msg
queue.=A0 <br>
<br>
In the 3-way case, Carol is sending a message to
Alice, passing Bob.=A0 Alice receives the message
and executes, which sends a message to Bob, then
returns the result to Carol.=A0 In Alice's vat, the
DelayedRedirector is resolved to the RemotePromise
of the call to Bob, the return of Alice's
computation and I think it sends whenMoreResolved
to the proxy of the new promise resolver of the
send to Bob.=A0 What little tracing I have I am
posting below, as well as the DelayedRedirector
value() and the ProxyResolver resolve() code, at
the bottom.=A0 However, this is my question, what
should the redirector do in Alice's Vat to
propagate the resolution from Bob, back to Carol?<b=
r>
<br>
Thank you,<br>
- Robert<br>
<br>
<br>
// There are 3 messages sent to Bob, from Alice:<br=
>
// =A0=A0=A0 1) getTheAnswer, which returns 42, <br=
>
// =A0=A0=A0 2) <b>hashCode, again 42</b> and <br>
//=A0=A0 =A0 3) <b>whenMoreResolved</b>, to forward=
to
the redirector back in Alice.<br>
<br>
0 [main] INFO
cc.ganymede.pauwau.presentation.AbstractPauwauTest=A0
- 3 Introducers starting<br>
549 [main] INFO
cc.ganymede.pauwau.presentation.AbstractPauwauTest=A0
- 3 Introducers on the air<br>
4553 [main] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
sending message: DeliverMessage(receiverId: 0
answerId: -1 resolverId: -1 action: lookupSwiss
args:
[497273074681788564315291637588644948944089734358])=
<br>
4952 [first-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
receiving message: DeliverMessage(receiverId: 0
answerId: -1 resolverId: null action: lookupSwiss
args:
[497273074681788564315291637588644948944089734358])=
<br>
4958 [first-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
sending message: DeliverOnlyMessage(receiverId: 1
action: value args: [NearRefImpl(hash: 109537538,
receiver: TestObject)])<br>
4998 [third-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
receiving message: DeliverOnlyMessage(receiverId:
1 action: value args: [FarRefImpl(hash:
68783569)])<br>
5353 [main] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
sending message: DeliverMessage(receiverId: 0
answerId: -1 resolverId: -1 action: lookupSwiss
args:
[-686254831702855955980329529540587585277617841038]=
)<br>
5593 [second-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
receiving message: DeliverMessage(receiverId: 0
answerId: -1 resolverId: null action: lookupSwiss
args:
[-686254831702855955980329529540587585277617841038]=
)<br>
5593 [second-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
sending message: DeliverOnlyMessage(receiverId: 1
action: value args: [NearRefImpl(hash: 1530099003,
receiver: TestObject)])<br>
6201 [main] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
sending message: DeliverMessage(receiverId: -1
answerId: -2 resolverId: -2 action:
redirectForTheAnswer args:
[RemotePromiseRefImpl(hash: 1034568234)])<br>
6203 [main] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
sending message: DeliverMessage(receiverId: 0
answerId: -2 resolverId: -2 action: provideFor
args:
[-568687285196004884954480990488973591228663758441,
RemotePromiseRefImpl(hash: 1034568234),
-676914875674370369045480105305401075435688776666])=
<br>
6239 [main] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
sending message: DeliverMessage(receiverId: -2
answerId: -3 resolverId: -3 action: hashCode args:
[])<br>
6255 [second-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
receiving message: DeliverMessage(receiverId: 0
answerId: -2 resolverId: null action: provideFor
args:
[-568687285196004884954480990488973591228663758441,
NearRefImpl(hash: 1530099003, receiver:
TestObject),
-676914875674370369045480105305401075435688776666])=
<br>
6259 [second-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
sending message: DeliverOnlyMessage(receiverId: 2
action: value args: [NearRefImpl(hash: 1323165787,
receiver:
cc.ganymede.pauwau.presentation.lib.vat.Vine@4842de=
f1)])<br>
6403 [first-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
sending message: DeliverMessage(receiverId: 0
answerId: -1 resolverId: -1 action: acceptFrom
args:
[HouseAtreides:10003/-68793401786157329233495556735=
0102524989066643525,
-676914875674370369045480105305401075435688776666,
cc.ganymede.pauwau.presentation.lib.vat.Vine@6a8400ff])<br>
6410 [first-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
receiving message: DeliverMessage(receiverId: -1
answerId: -2 resolverId: null action:
redirectForTheAnswer args:
[RemotePromiseRefImpl(hash: 598908224)])<br>
6411 [first-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
receiving message: DeliverMessage(receiverId: -2
answerId: -3 resolverId: null action: hashCode
args: [])<br>
6411 [first-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
sending message: DeliverMessage(receiverId: -1
answerId: -2 resolverId: -2 action: getTheAnswer
args: [])<br>
6412 [first-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
sending message: DeliverMessage(receiverId: -2
answerId: -3 resolverId: -3 action: hashCode args:
[])<br>
6412 [first-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
sending message: DeliverOnlyMessage(receiverId: -2
action: whenMoreResolved args: [RedirectorProxy:
FarRefImpl(hash: 177595052)])<br>
6766 [second-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
receiving message: DeliverMessage(receiverId: 0
answerId: -1 resolverId: null action: acceptFrom
args:
[HouseAtreides:10003/-68793401786157329233495556735=
0102524989066643525,
-676914875674370369045480105305401075435688776666,
FarRefImpl(hash: 690984748)])<br>
6767 [second-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
receiving message: DeliverMessage(receiverId: -1
answerId: -2 resolverId: null action: getTheAnswer
args: [])<br>
6767 [second-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
receiving message: DeliverMessage(receiverId: -2
answerId: -3 resolverId: null action: hashCode
args: [])<br>
6767 [second-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
receiving message: DeliverOnlyMessage(receiverId:
-2 action: whenMoreResolved args:
[NearRefImpl(hash: 363771261, receiver:
RedirectorProxy: FarRefImpl(hash: 196981675))])<br>
6768 [second-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
sending message: DeliverOnlyMessage(receiverId: 2
action: value args: [NearRefImpl(hash: 1530099003,
receiver: TestObject)])<br>
6769 [second-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
sending message: DeliverOnlyMessage(receiverId: 3
action: value args: [NearRefImpl(hash: 790206055,
receiver: 42)])<br>
<b>6770 [second-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0
- sending message:
DeliverOnlyMessage(receiverId: 4 action: value
args: [NearRefImpl(hash: 878991039, receiver:
42)])</b><b><br>
</b><b>6771 [second-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0
- sending message:
DeliverOnlyMessage(receiverId: 5 action: value
args: [NearRefImpl(hash: 790206055, receiver:
42)])</b><b><br>
</b>6805 [first-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
receiving message: DeliverOnlyMessage(receiverId:
2 action: value args: [FarRefImpl(hash:
1332394016)])<br>
6805 [first-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
receiving message: DeliverOnlyMessage(receiverId:
3 action: value args: [42])<br>
<b>6805 [first-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0
- receiving message:
DeliverOnlyMessage(receiverId: 4 action: value
args: [42])</b><b><br>
</b><b>6805 [first-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0
- receiving message:
DeliverOnlyMessage(receiverId: 5 action: value
args: [42])</b><b><br>
</b>6806 [first-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
sending message: DeliverOnlyMessage(receiverId: 3
action: value args: [42])<br>
19932 [first-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
sending message: GCAnswerMessage(answerId: -1)<br>
19934 [first-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
sending message: GCAnswerMessage(answerId: -2)<br>
19934 [first-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
sending message: GCAnswerMessage(answerId: -3)<br>
19984 [second-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
receiving message: GCAnswerMessage(answerId: -1)<br=
>
19984 [second-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
receiving message: GCAnswerMessage(answerId: -2)<br=
>
19985 [second-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
receiving message: GCAnswerMessage(answerId: -3)<br=
>
29679 [third-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
sending message: GCAnswerMessage(answerId: -1)<br>
29680 [third-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
receiving message: DeliverOnlyMessage(receiverId:
1 action: value args: [FarRefImpl(hash:
734824022)])<br>
29680 [third-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
receiving message: DeliverOnlyMessage(receiverId:
2 action: value args: [FarRefImpl(hash:
1223086084)])<br>
29680 [third-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
receiving message: DeliverOnlyMessage(receiverId:
3 action: value args: [42])<br>
29681 [third-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
sending message: GCAnswerMessage(answerId: -1)<br>
29681 [third-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
sending message: GCAnswerMessage(answerId: -2)<br>
29682 [third-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
sending message: GCAnswerMessage(answerId: -2)<br>
29722 [second-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
receiving message: GCAnswerMessage(answerId: -1)<br=
>
29722 [second-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
receiving message: GCAnswerMessage(answerId: -2)<br=
>
29726 [first-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
receiving message: GCAnswerMessage(answerId: -1)<br=
>
29726 [first-vat] DEBUG
cc.ganymede.pauwau.presentation.PauwauTerminal=A0 -
receiving message: GCAnswerMessage(answerId: -2)<br=
>
<br>
<br>
<br>
<b>// DelayedRedirector code:</b><br>
=A0=A0=A0 public void value(Object obj) throws
NotResolvedException {<br>
=A0=A0=A0 =A0=A0=A0 if(resolver =3D=3D null)<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 return;<br>
<br>
=A0=A0=A0 =A0=A0=A0 if(resolver.isFresh()) {<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 resolver.resolve(obj)=
;<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 resolver =3D null;<br=
>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 return;<br>
=A0=A0=A0 =A0=A0=A0 }<br>
<br>
=A0=A0=A0 =A0=A0=A0 if(RefUtil.isLocal(obj)) {<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 resolver.resolve(obj)=
;<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 resolver =3D null;<br=
>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 return;<br>
=A0=A0=A0 =A0=A0=A0 }<br>
<br>
=A0=A0=A0 =A0=A0=A0 Ref ref =3D (Ref)RefUtil.wrap(o=
bj,
resolver.handler.getVat());<br>
=A0=A0=A0 =A0=A0=A0 boolean isLocalToResolverScope =
=3D false;<br>
=A0=A0=A0 =A0=A0=A0 try {<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 isLocalToResolverScop=
e =3D
RefUtil.isLocalToScope(resolver.handler.scope,
ref);<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 if(isLocalToResolverS=
cope) {<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 resolver.re=
solve(obj);<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 resolver =3D=
null;<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 return;<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 }<br>
=A0=A0=A0 =A0=A0=A0 } catch (Exception e) {<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 reactToLostClient(e);=
<br>
=A0=A0=A0 =A0=A0=A0 }<br>
<br>
=A0=A0=A0 =A0=A0=A0 Pair<PromiseRefImpl, Resolve=
r> pair
=3D RefUtil.promise(ref.getVat());<br>
=A0=A0=A0 =A0=A0=A0 Redirector redirector =3D new
Redirector((ProxyResolver) pair.second());<br>
=A0=A0=A0 =A0=A0=A0
resolver.getProxy().whenResolved(redirector);<br>
=A0=A0=A0 =A0=A0=A0 resolver.resolve(pair.first());=
<br>
=A0=A0=A0 =A0=A0=A0 resolver =3D null;<br>
=A0=A0=A0 }<br>
<br>
<br>
<b>// ProxyResolver code:</b><br>
=A0=A0=A0 public void resolve(final Object result)
throws NotResolvedException {<br>
=A0=A0=A0 =A0=A0=A0 handler.scope.getVat().sendRunn=
able(new
Runnable() {<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 public void run() {<b=
r>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 if(ref =3D=3D=
null)<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 r=
eturn;<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 if(ref.get(=
) =3D=3D null)<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 r=
eturn;<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0
if(Exception.class.isAssignableFrom(result.getClass=
()))
{<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 }<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 Ref newRef =
=3D RefUtil.wrap(result,
handler.scope.getVat());<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 try {<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 i=
f (newRef =3D=3D null)<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=
=A0=A0 =A0=A0=A0
ref.get().getRefImpl().becomeContext(null);<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 e=
lse<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=
=A0=A0
ref.get().getRefImpl().becomeContext(newRef.getRefI=
mpl());<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0
if(RefUtil.isResolved(newRef.getRefImpl())) {<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=
=A0=A0 handler =3D null;<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=
=A0=A0 ref =3D null;<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 }=
<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 } catch (No=
tResolvedException e) {<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 /=
/ TODO Auto-generated catch
block<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 e=
.printStackTrace();<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 }<br>
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 }});<br>
=A0=A0=A0 }<br>
<br>
</blockquote>
<br>
</div>
</div>
</div>
<br>
_______________________________________________<br>
e-lang mailing list<br>
<a moz-do-not-send=3D"true"
href=3D"mailto:[email protected]">[email protected]=
os.org</a><br>
<a moz-do-not-send=3D"true"
href=3D"http://www.eros-os.org/mailman/listinfo/e-lang"
target=3D"_blank">http://www.eros-os.org/mailman/listinfo=
/e-lang</a><br>
<br>
</blockquote>
</div>
<br>
<br clear=3D"all">
<div><br>
</div>
-- <br>
<div class=3D"gmail_signature">=A0 =A0 Cheers,<br>
=A0 =A0 --MarkM</div>
</div>
<br>
<fieldset class=3D"mimeAttachmentHeader"></fieldset>
<br>
<pre wrap=3D"">_______________________________________________
e-lang mailing list
<a moz-do-not-send=3D"true" class=3D"moz-txt-link-abbreviated" href=3D"ma=
ilto:[email protected]">[email protected]</a>
<a moz-do-not-send=3D"true" class=3D"moz-txt-link-freetext" href=3D"http:=
//www.eros-os.org/mailman/listinfo/e-lang">http://www.eros-os.org/mailman=
/listinfo/e-lang</a>
</pre>
</blockquote>
<br>
</blockquote>
<br>
</body>
</html>
--===============0129391604236517391==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
_______________________________________________
e-lang mailing list
[email protected]
http://www.eros-os.org/mailman/listinfo/e-lang
--===============0129391604236517391==--