<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv=Content-Type content="text/html; charset=us-ascii">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<title>Just Not Getting One Aspect of Tasklets and Channel Receive on Pong
Example</title>
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";
        color:black;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p
        {mso-style-priority:99;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";
        color:black;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";
        color:black;}
tt
        {mso-style-priority:99;
        font-family:"Courier New";}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:Consolas;
        color:black;}
span.EmailStyle21
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page Section1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.Section1
        {page:Section1;}
-->
</style>
<!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapelayout v:ext="edit">
  <o:idmap v:ext="edit" data="1" />
 </o:shapelayout></xml><![endif]-->
</head>

<body bgcolor=white lang=EN-US link=blue vlink=purple>

<div class=Section1>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Christian,<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thanks
for the reply and link to the stackless documentation. Seemed like there should
be more than just the PDF. Regarding your reply, the part which is unclear is
the implication of a tasklet which contains a channel receive. I understand the
functionality and blocking, but it would seem that &#8220;stackless.tasklet(&#8230;)()&#8221;
places an instance of a &#8220;callable&#8221; on the stackless queue. But once
the tasklet channel send is accomplished, that tasklet would be complete and
exit out of the queue, no longer available to channel receive. It is for this
reason that it appears that a new tasklet is being placed in the queue as a
result of a channel send. It would seem that the proper sequence would be as
follows:<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New";
color:#33CC00'><br>
<tt>def ping():<o:p></o:p></tt></span></p>

<p class=MsoNormal><tt><span style='font-size:10.0pt;color:#33CC00'>&nbsp;&nbsp;&nbsp;
accum_ping = accum_ping + 1</span></tt><span style='font-size:10.0pt;
font-family:"Courier New";color:#33CC00'><br>
<tt>&nbsp;&nbsp;&nbsp; while ping_channel.receive(): #blocks here</tt><br>
<tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot;PING&quot;<o:p></o:p></tt></span></p>

<p class=MsoNormal style='text-indent:.5in'><span style='font-size:10.0pt;
font-family:"Courier New";color:#33CC00'>&nbsp; if accum_ping &gt; 1:<o:p></o:p></span></p>

<p class=MsoNormal style='text-indent:.5in'><span style='font-size:10.0pt;
font-family:"Courier New";color:#33CC00'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stackless.tasklet(pong)()&nbsp;&nbsp;
#so there would be a pong task available to channel receive after all calls
subsequent to the 1<sup>st</sup> time pong is called<br>
<tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pong_channel.send(&quot;from
ping&quot;)</tt><br>
<br>
<tt>def pong():</tt><br>
<tt>&nbsp;&nbsp;&nbsp; accum_pong = accum_pong + 1</tt><br>
<tt>&nbsp;&nbsp;&nbsp; while pong_channel.receive():</tt><br>
<tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot;PONG&quot;</tt><br>
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if accum_pong &gt; 1:<o:p></o:p></span></p>

<p class=MsoNormal style='text-indent:.5in'><span style='font-size:10.0pt;
font-family:"Courier New";color:#33CC00'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stackless.tasklet(ping)()&nbsp;&nbsp;
#so there would be a ping task available to channel receive after all calls
subsequent to the 1<sup>st</sup> time ping is called<br>
<tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ping_channel.send(&quot;from
pong&quot;)</tt><br>
<br>
<br>
</span><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Hope this illustrates what I&#8217;m trying to get my head
around.<o:p></o:p></span></p>

<p class=MsoNormal style='text-indent:.5in'><span style='font-size:11.0pt;
font-family:"Calibri","sans-serif";color:#1F497D'>Thanks,<o:p></o:p></span></p>

<p class=MsoNormal style='text-indent:.5in'><span style='font-size:11.0pt;
font-family:"Calibri","sans-serif";color:#1F497D'>Andy<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<div>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'>

<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif";
color:windowtext'>From:</span></b><span style='font-size:10.0pt;font-family:
"Tahoma","sans-serif";color:windowtext'> stackless-bounces@stackless.com
[mailto:stackless-bounces@stackless.com] <b>On Behalf Of </b>Christian Tismer<br>
<b>Sent:</b> Saturday, March 13, 2010 8:35 AM<br>
<b>To:</b> The Stackless Python Mailing List<br>
<b>Subject:</b> Re: [Stackless] Just Not Getting One Aspect of Tasklets and
Channel Receive on Pong Example<o:p></o:p></span></p>

</div>

</div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>On 3/12/10 9:44 PM, Carl, Andrew F (AS) wrote: <o:p></o:p></p>

<p><span style='font-family:"Calibri","sans-serif"'>The pong example on p.</span>
<span style='font-family:"Calibri","sans-serif"'>13 of the</span> <span
style='font-family:"Calibri","sans-serif"'>&#8220;Why Stackless&#8221; manual
is unclear to me.&nbsp; It appears that the tasklet statement puts the task on
the</span> <span style='font-family:"Calibri","sans-serif"'>queue once, but yet
it seems that the send to the</span> <span style='font-family:"Calibri","sans-serif"'>&#8220;while
receive&#8221; is effectively creating another tasklet on the</span> <span
style='font-family:"Calibri","sans-serif"'>queue. It would seem that they
should bounce back and forth only once each without the addition of a new
tasklet statement. Could someone please</span> <span style='font-family:"Calibri","sans-serif"'>clarify
this?</span><o:p></o:p></p>

<p class=MsoNormal><tt><span style='font-size:10.0pt'>An unambiguous link would
be preferrable to readers, like this:</span></tt><br>
<br>
<tt><span style='font-size:10.0pt'><a
href="http://members.verizon.net/olsongt/stackless/why_stackless.html#pingpong-stackless-py-stackless-ping-pong-example">http://members.verizon.net/olsongt/stackless/why_stackless.html#pingpong-stackless-py-stackless-ping-pong-example</a></span></tt><br>
<br>
<tt><span style='font-size:10.0pt;color:#33CC00'>#</span></tt><span
style='font-size:10.0pt;font-family:"Courier New";color:#33CC00'><br>
<tt># pingpong_stackless.py</tt><br>
<tt>#</tt><br>
<br>
<tt>import stackless</tt><br>
<br>
<tt>ping_channel = stackless.channel()</tt><br>
<tt>pong_channel = stackless.channel()</tt><br>
<br>
<tt>def ping():</tt><br>
<tt>&nbsp;&nbsp;&nbsp; while ping_channel.receive(): #blocks here</tt><br>
<tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot;PING&quot;</tt><br>
<tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pong_channel.send(&quot;from
ping&quot;)</tt><br>
<br>
<tt>def pong():</tt><br>
<tt>&nbsp;&nbsp;&nbsp; while pong_channel.receive():</tt><br>
<tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot;PONG&quot;</tt><br>
<tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ping_channel.send(&quot;from
pong&quot;)</tt><br>
<br>
<br>
<br>
<tt>stackless.tasklet(ping)()</tt><br>
<tt>stackless.tasklet(pong)()</tt><br>
<br>
<tt># we need to 'prime' the game by sending a start message</tt><br>
<tt># if not, both tasklets will block</tt><br>
<tt>stackless.tasklet(ping_channel.send)('startup')</tt><br>
<br>
<tt>stackless.run()</tt><br>
</span><span style='font-size:10.0pt;font-family:"Courier New"'><br>
<br>
<tt>Assuming that this is the code you are referring to, I am trying</tt></span><br>
<tt><span style='font-size:10.0pt'>to understand your question.</span></tt><o:p></o:p></p>

<p><i><span style='font-family:"Calibri","sans-serif"'>Two tasklets are created
which are initially blocking on their channel.</span></i><o:p></o:p></p>

<pre>stackless.tasklet(ping)()<o:p></o:p></pre><pre>stackless.tasklet(pong)()<o:p></o:p></pre>

<p><i><span style='font-family:"Calibri","sans-serif"'>Going into details:</span></i><o:p></o:p></p>

<pre>stackless.tasklet(ping)<o:p></o:p></pre>

<p><i><span style='font-family:"Calibri","sans-serif"'>is the constructor call
of a tasklet, bound to function ping.<br>
A more explicit notation would be</span></i><o:p></o:p></p>

<pre>task = stackless.tasklet()&nbsp; # not bound to a function<o:p></o:p></pre><pre>task.bind(ping)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # bound to ping<o:p></o:p></pre><pre>task.setup()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # set empty argument list<o:p></o:p></pre>

<p><i><span style='font-family:"Calibri","sans-serif"'>After the setup, the
ping tasklet is ready to run. It is sitting in<br>
the runnables queue, right after the implicit main tasklet.</span></i><o:p></o:p></p>

<p class=MsoNormal><i><span style='font-family:"Calibri","sans-serif"'>The same
thing as above repeats for the pong tasklet.</span></i><o:p></o:p></p>

<pre>stackless.tasklet(pong)()<o:p></o:p></pre>

<p><i><span style='font-family:"Calibri","sans-serif"'>We have a circular list
of runnable tasklets:</span></i><o:p></o:p></p>

<pre><tt>main&nbsp;&nbsp;&nbsp;&nbsp; &lt;-&nbsp;&nbsp;&nbsp; still executing<o:p></o:p></tt></pre><pre><tt>ping&nbsp;&nbsp;&nbsp; |&nbsp; |&nbsp;&nbsp; paused<o:p></o:p></tt></pre><pre><tt>pong&nbsp;&nbsp;&nbsp;&nbsp; -&gt;&nbsp;&nbsp;&nbsp; paused</tt><tt><span
style='font-family:"Calibri","sans-serif"'><o:p></o:p></span></tt></pre>

<p><i><span style='font-family:"Calibri","sans-serif"'>Now we enter the last
line before the run():</span></i><o:p></o:p></p>

<pre><tt># we need to 'prime' the game by sending a start message<o:p></o:p></tt></pre><pre><tt># if not, both tasklets will block<o:p></o:p></tt></pre><pre><tt>stackless.tasklet(ping_channel.send)('startup')<o:p></o:p></tt></pre>

<p class=MsoNormal><i><span style='font-family:"Calibri","sans-serif"'>This
tasklet</span></i><i> does the equivalent of</i><o:p></o:p></p>

<pre>&nbsp;&nbsp;&nbsp; ping_channel.send('startup')<o:p></o:p></pre>

<p class=MsoNormal><i><span style='font-family:"Calibri","sans-serif"'>but it
is written in this deferred form, so that all tasklet activities are done<br>
in the run() context. This is not needed for the example to work, but seems<br>
to be the author's intent, for more clarity.<br>
<br>
We have now the following circular queue picture:</span></i><o:p></o:p></p>

<pre><tt>main&nbsp;&nbsp;&nbsp;&nbsp; &lt;-&nbsp;&nbsp;&nbsp; still executing<o:p></o:p></tt></pre><pre><tt>ping&nbsp;&nbsp;&nbsp; |&nbsp; |&nbsp;&nbsp; paused<o:p></o:p></tt></pre><pre><tt>pong&nbsp;&nbsp;&nbsp; |&nbsp; |&nbsp;&nbsp; paused<o:p></o:p></tt></pre><pre><tt>&lt;???&gt;&nbsp;&nbsp;&nbsp; -&gt;&nbsp;&nbsp;&nbsp; paused<o:p></o:p></tt></pre><pre><o:p>&nbsp;</o:p></pre>

<p><i><span style='font-family:"Calibri","sans-serif"'>Now we enter the final
statement, which does it all:</span></i><o:p></o:p></p>

<pre>stackless.run()<o:p></o:p></pre>

<p class=MsoNormal><i><span style='font-family:"Calibri","sans-serif"'>Main
gets removed from the runnables queue, to let the other tasklets<br>
do their thing. ping is the next available tasklet and it runs:</span></i><o:p></o:p></p>

<pre><tt>ping&nbsp;&nbsp;&nbsp;&nbsp; &lt;-&nbsp;&nbsp;&nbsp; current<o:p></o:p></tt></pre><pre><tt>pong&nbsp;&nbsp;&nbsp; |&nbsp; |&nbsp;&nbsp; paused<o:p></o:p></tt></pre><pre><tt>&lt;???&gt; &nbsp;&nbsp;&nbsp;-&gt;&nbsp;&nbsp;&nbsp; paused<o:p></o:p></tt></pre><pre><o:p>&nbsp;</o:p></pre>

<p class=MsoNormal><i><span style='font-family:"Calibri","sans-serif"'>ping
starts to run, but immediately blocks on the empty ping_channel:</span></i><i><br>
</i><br>
<tt><span style='font-size:10.0pt'>def ping():</span></tt><span
style='font-size:10.0pt;font-family:"Courier New"'><br>
<tt>&nbsp;&nbsp;&nbsp; while ping_channel.receive(): #blocks here</tt><br>
<tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot;PING&quot;</tt><br>
<tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pong_channel.send(&quot;from
ping&quot;)</tt><br>
<br>
</span><i><span style='font-family:"Calibri","sans-serif"'>ping gets removed
from the runnables queue and stored in the<br>
ping_channel. So the next available tasklet is pong.</span></i><o:p></o:p></p>

<pre><tt>pong&nbsp;&nbsp;&nbsp;&nbsp; &lt;-&nbsp;&nbsp;&nbsp; current<o:p></o:p></tt></pre><pre><tt>&lt;???&gt;&nbsp;&nbsp;&nbsp; -&gt;&nbsp;&nbsp;&nbsp; paused<o:p></o:p></tt></pre><pre><tt><o:p>&nbsp;</o:p></tt></pre><pre><tt>def pong():<o:p></o:p></tt></pre><pre><tt>&nbsp;&nbsp;&nbsp; while pong_channel.receive():<o:p></o:p></tt></pre><pre><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot;PONG&quot;<o:p></o:p></tt></pre><pre><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ping_channel.send(&quot;from pong&quot;)<o:p></o:p></tt></pre><pre><tt><o:p>&nbsp;</o:p></tt></pre>

<p class=MsoNormal><i><span style='font-family:"Calibri","sans-serif"'>The same
happens to pong, since pong_channel is empty.<br>
It gets blocked into pong_channel. Our only available<br>
tasklet is now the nameless &lt;???&gt;.</span></i><o:p></o:p></p>

<pre><tt>&lt;???&gt;&nbsp;&nbsp;&nbsp; &lt;-&gt;&nbsp;&nbsp; current. sends 'startup' on ping_channel<o:p></o:p></tt></pre><pre><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;and exits.<o:p></o:p></tt></pre>

<p class=MsoNormal><i><span style='font-family:"Calibri","sans-serif"'>Now we
are back in ping, right after the receive call. ping is<br>
our only active tasklet:</span></i><o:p></o:p></p>

<pre><tt>ping&nbsp;&nbsp;&nbsp;&nbsp; &lt;-&gt;&nbsp;&nbsp; current. prints 'PING', then sends<o:p></o:p></tt></pre><pre><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;'from ping' on pong_channel.</tt><o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre><tt>def ping():<o:p></o:p></tt></pre><pre><tt>&nbsp;&nbsp;&nbsp; while ping_channel.receive(): #blocks here<o:p></o:p></tt></pre><pre><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot;PING&quot;<o:p></o:p></tt></pre><pre><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pong_channel.send(&quot;from ping&quot;)<o:p></o:p></tt></pre><pre><o:p>&nbsp;</o:p></pre><pre>PING<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre>

<p class=MsoNormal style='margin-bottom:12.0pt'><i><span style='font-family:
"Calibri","sans-serif"'>ping gets blocked after sending on pong_channel, and
pong</span></i><i><br>
</i><i><span style='font-family:"Calibri","sans-serif"'>is now our only active
tasklet:</span></i><o:p></o:p></p>

<pre><tt>pong&nbsp;&nbsp;&nbsp;&nbsp; &lt;-&gt;&nbsp;&nbsp; current. prints 'PONG', then sends<o:p></o:p></tt></pre><pre><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; 'from pong' on ping_channel.<o:p></o:p></tt></pre><pre><tt><o:p>&nbsp;</o:p></tt></pre><pre><tt>PONG<o:p></o:p></tt></pre>

<p class=MsoNormal><i><span style='font-family:"Calibri","sans-serif"'>Now that
game continues until you hit CTL-C. The main tasklet will then<br>
wake up and report the exception.</span></i><o:p></o:p></p>

<pre><tt>hope this helps -- chris<o:p></o:p></tt></pre><pre><tt><o:p>&nbsp;</o:p></tt></pre><pre><tt><o:p>&nbsp;</o:p></tt></pre><pre><tt>p.s.:<o:p></o:p></tt></pre><pre><tt>If people have questions like this, I'd like to refer them to<o:p></o:p></tt></pre><pre><tt><a
href="http://www.disinterest.org/resource/stackless/2.6.4-docs-html/stackless-python.html">http://www.disinterest.org/resource/stackless/2.6.4-docs-html/stackless-python.html</a><o:p></o:p></tt></pre><pre><tt>This is the one and only reference documentation that covers it all!<o:p></o:p></tt></pre>

<p class=MsoNormal><tt><span style='font-size:10.0pt'>-- </span></tt><o:p></o:p></p>

<pre><tt>Christian Tismer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :^)&nbsp;&nbsp; <a
href="mailto:tismer@stackless.com">&lt;mailto:tismer@stackless.com&gt;</a><o:p></o:p></tt></pre><pre><tt>tismerysoft GmbH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :&nbsp;&nbsp;&nbsp;&nbsp; Have a break! Take a ride on Python's<o:p></o:p></tt></pre><pre>Johannes-Niemeyer-Weg 9A&nbsp;&nbsp;&nbsp;&nbsp; :&nbsp;&nbsp;&nbsp; *Starship* <a
href="http://starship.python.net/">http://starship.python.net/</a><o:p></o:p></pre><pre>14109 Berlin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :&nbsp;&nbsp;&nbsp;&nbsp; PGP key -&gt; <a
href="http://wwwkeys.pgp.net/">http://wwwkeys.pgp.net/</a><o:p></o:p></pre><pre>work +49 30 802 86 56&nbsp; mobile +49 173 24 18 776&nbsp; fax +49 30 80 90 57 05<o:p></o:p></pre><pre>PGP 0x57F3BF04&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9064 F4E1 D754 C2FF 1619&nbsp; 305B C09C 5A3B 57F3 BF04<o:p></o:p></pre><pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; whom do you want to sponsor today?&nbsp;&nbsp; <a
href="http://www.stackless.com/">http://www.stackless.com/</a><o:p></o:p></pre></div>

</body>

</html>