Re: Computing with sed: a compiler from python to sed

"[email protected] [sed-users]" <[email protected]> 30 Oct 2018 15:16:13 -0700
Newsgroups gmane.editors.sed.user
Message-ID <[email protected]>
--JIAsYAR4GKn5g8pHKMOjME12nbnFJxWeDiUktvp
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit


 Hi Daniel,
 

 Some answers.
 

 >> You must have great knowledge of both python and sed to do this
 

 Not really but enough determination to make it work. The most difficult part is the digit addition and subtraction snippets extracted from Greg Ubben's dc. These are very clever.
 

 >> How did you get inspired to do this? 
 

 When I started to use sed (long time ago), I realized it was possible to increment an integer with substitutions. Having studied computability and computer language implementation, it was tempting to check if a complete language could be implemented with sed (nothing new, I know about dc, turing machines, lisp, in sed).
 

 >> Is the intention to produce something practical? 
 

 Nothing practical, but a lot of fun.
 

 >> Any reason called numsed?

 

 numpy is the reference mathematics library for python.
 

 Thanks for your interest.
 Gilles

---In [email protected], <dgoldman@...> wrote :

 The https://github.com/GillesArcas/numsed https://github.com/GillesArcas/numsed web page has a pretty detailed 
 description. IMO, this is pretty incredible programming. You must have 
 great knowledge of both python and sed to do this.
 
 I take it PythonSed is a sed implementation written in the python 
 language, that you previously wrote. Is that correct? What was it like 
 programming sed in python? Any new insights into sed result for you?
 
 For numsed, here is a simple example from the website (input python 
 script, intermediate opcodes, output sed script), that I think makes it 
 a little more clear.
 
 ********** python - add.py (5 lines)
 
 # assign add
 m = 42
 n = 5
 p = m + n
 print(p)
 
 *********** opcodes - add.opc (97 lines)
 
 Complete listing is in:
 https://github.com/GillesArcas/numsed/blob/master/examples/add.opc https://github.com/GillesArcas/numsed/blob/master/examples/add.opc
 
 STARTUP
 LOAD_CONST print.func
 MAKE_FUNCTION 0
 STORE_NAME print
 LOAD_CONST signed_add.func
 MAKE_FUNCTION 0
 STORE_NAME signed_add
 LOAD_CONST 42
 STORE_NAME m
 ...
 :signed_add.func
 MAKE_CONTEXT
 STORE_FAST y
 STORE_FAST x
 LOAD_FAST x
 IS_POSITIVE
 POP_JUMP_IF_FALSE 85
 ...
 :print.func
 PRINT_ITEMS
 PRINT_NEWLINE
 LOAD_CONST 0
 RETURN_VALUE
 
 *********** sed add.sed (1185 lines)
 
 Complete listing is in:
 https://github.com/GillesArcas/numsed/blob/master/examples/add.sed https://github.com/GillesArcas/numsed/blob/master/examples/add.sed
 
 x
 s/.*/end_of_script;@/
 x
 bL71
 :end_of_script
 q
 :NameError
 ...
 :L40
 s/.*;x;([^;]*)[^|]*$/\1;&/ # PS: x;?;v;x? HS: ?;v;x?
 tL41
 s/.*/x/; b NameError # branch to error if var undefined
 
 :L60 # if invalid subtraction
 s/^[0-9]*;[0-9]*;[0-9]*;/NAN/ # PS: NAN*
 ...
 :.L73 # PS: label
 s/^R0$//;t R0
 s/^R1$//;t R1
 s/^end_of_script$//;t end_of_script
 b UnknownLabel
 
 How did you get inspired to do this? Is the intention to produce 
 something practical, or just a fascinating exploration (nothing wrong 
 with that)? Any reason called numsed?
 
 Thanks,
 Daniel
 
 On 10/28/2018 5:28 AM, gilles_arcas@... mailto:gilles_arcas@... [sed-users] wrote:
 > After my full implementation of sed in python (PythonSed https://github.com/GillesArcas/PythonSed) https://github.com/GillesArcas/PythonSed), I present to you my compiler from python to sed: numsed https://github.com/GillesArcas/numsed. https://github.com/GillesArcas/numsed.
 >
 >
 > OK, a small subset of python but sufficient to express any integer calculation: all operations, assignments, conditionals, loops, functions (recursion is supported) and printing. A lot of testing, including with examples from Project Euler. Testing is done by running the original python script and the resulting sed script and comparing their results.
 >
 >
 > A lot of improvements are possible, either by completing the compiled features (for instance strings or arrays), or by making the generated sed code more efficient. Note that the digit addition, subtraction and multiplication are borrowed from dc from Greg Ubben and improvements on these operations seems difficult. Anyway, suggestions will be very welcome.
 >
 >
 >
 >
 >
 > [Non-text portions of this message have been removed]
 >
 >
 >
 > ------------------------------------
 > Posted by: gilles_arcas@... mailto:gilles_arcas@...
 > ------------------------------------
 > 



[Non-text portions of this message have been removed]


--JIAsYAR4GKn5g8pHKMOjME12nbnFJxWeDiUktvp
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 7bit




<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
</head>






 
<body style="background-color: #fff;">
<span style="display:none">&nbsp;</span>

<!--~-|**|PrettyHtmlStartT|**|-~-->
<div id="ygrp-mlmsg" style="position:relative;">
  <div id="ygrp-msg" style="z-index: 1;">
<!--~-|**|PrettyHtmlEndT|**|-~-->

    <div id="ygrp-text" >
      
      
      <p><br>
 Hi Daniel,<br>
 <br>
<br>
Some answers.<br>
 <br>
<br>
&gt;&gt; You must have great knowledge of both python and sed to do this<br>
 <br>
<br>
Not really but enough determination to make it work. The most difficult part is the digit addition and subtraction snippets extracted from Greg Ubben&#39;s dc. These are very clever.<br>
 <br>
<br>
&gt;&gt; How did you get inspired to do this? <br>
 <br>
<br>
When I started to use sed (long time ago), I realized it was possible to increment an integer with substitutions. Having studied computability and computer language implementation, it was tempting to check if a complete language could be implemented with sed (nothing new, I know about dc, turing machines, lisp, in sed).<br>
 <br>
<br>
&gt;&gt; Is the intention to produce something practical? <br>
 <br>
<br>
Nothing practical, but a lot of fun.<br>
 <br>
<br>
&gt;&gt; Any reason called numsed?<br>
<br>
numpy is the reference mathematics library for python.<br>
 <br>
<br>
Thanks for your interest.<br>
 Gilles<br>
<br>
---In [email protected], &lt;dgoldman@...&gt; wrote :<br>
<br>
The https://github.com/GillesArcas/numsed https://github.com/GillesArcas/numsed web page has a pretty detailed <br>
 description. IMO, this is pretty incredible programming. You must have <br>
 great knowledge of both python and sed to do this.<br>
 <br>
 I take it PythonSed is a sed implementation written in the python <br>
 language, that you previously wrote. Is that correct? What was it like <br>
 programming sed in python? Any new insights into sed result for you?<br>
 <br>
 For numsed, here is a simple example from the website (input python <br>
 script, intermediate opcodes, output sed script), that I think makes it <br>
 a little more clear.<br>
 <br>
 ********** python - add.py (5 lines)<br>
 <br>
 # assign add<br>
 m = 42<br>
 n = 5<br>
 p = m + n<br>
 print(p)<br>
 <br>
 *********** opcodes - add.opc (97 lines)<br>
 <br>
 Complete listing is in:<br>
 https://github.com/GillesArcas/numsed/blob/master/examples/add.opc https://github.com/GillesArcas/numsed/blob/master/examples/add.opc<br>
 <br>
 STARTUP<br>
 LOAD_CONST print.func<br>
 MAKE_FUNCTION 0<br>
 STORE_NAME print<br>
 LOAD_CONST signed_add.func<br>
 MAKE_FUNCTION 0<br>
 STORE_NAME signed_add<br>
 LOAD_CONST 42<br>
 STORE_NAME m<br>
 ...<br>
 :signed_add.func<br>
 MAKE_CONTEXT<br>
 STORE_FAST y<br>
 STORE_FAST x<br>
 LOAD_FAST x<br>
 IS_POSITIVE<br>
 POP_JUMP_IF_FALSE 85<br>
 ...<br>
 :print.func<br>
 PRINT_ITEMS<br>
 PRINT_NEWLINE<br>
 LOAD_CONST 0<br>
 RETURN_VALUE<br>
 <br>
 *********** sed add.sed (1185 lines)<br>
 <br>
 Complete listing is in:<br>
 https://github.com/GillesArcas/numsed/blob/master/examples/add.sed https://github.com/GillesArcas/numsed/blob/master/examples/add.sed<br>
 <br>
 x<br>
 s/.*/end_of_script;@/<br>
 x<br>
 bL71<br>
 :end_of_script<br>
 q<br>
 :NameError<br>
 ...<br>
 :L40<br>
 s/.*;x;([^;]*)[^|]*$/&#92;1;&/ # PS: x;?;v;x? HS: ?;v;x?<br>
 tL41<br>
 s/.*/x/; b NameError # branch to error if var undefined<br>
 <br>
 :L60 # if invalid subtraction<br>
 s/^[0-9]*;[0-9]*;[0-9]*;/NAN/ # PS: NAN*<br>
 ...<br>
 :.L73 # PS: label<br>
 s/^R0$//;t R0<br>
 s/^R1$//;t R1<br>
 s/^end_of_script$//;t end_of_script<br>
 b UnknownLabel<br>
 <br>
 How did you get inspired to do this? Is the intention to produce <br>
 something practical, or just a fascinating exploration (nothing wrong <br>
 with that)? Any reason called numsed?<br>
 <br>
 Thanks,<br>
 Daniel<br>
 <br>
 On 10/28/2018 5:28 AM, gilles_arcas@... mailto:gilles_arcas@... [sed-users] wrote:<br>
 &gt; After my full implementation of sed in python (PythonSed https://github.com/GillesArcas/PythonSed) https://github.com/GillesArcas/PythonSed), I present to you my compiler from python to sed: numsed https://github.com/GillesArcas/numsed. https://github.com/GillesArcas/numsed.<br>
 &gt;<br>
 &gt;<br>
 &gt; OK, a small subset of python but sufficient to express any integer calculation: all operations, assignments, conditionals, loops, functions (recursion is supported) and printing. A lot of testing, including with examples from Project Euler. Testing is done by running the original python script and the resulting sed script and comparing their results.<br>
 &gt;<br>
 &gt;<br>
 &gt; A lot of improvements are possible, either by completing the compiled features (for instance strings or arrays), or by making the generated sed code more efficient. Note that the digit addition, subtraction and multiplication are borrowed from dc from Greg Ubben and improvements on these operations seems difficult. Anyway, suggestions will be very welcome.<br>
 &gt;<br>
 &gt;<br>
 &gt;<br>
 &gt;<br>
 &gt;<br>
 &gt; [Non-text portions of this message have been removed]<br>
 &gt;<br>
 &gt;<br>
 &gt;<br>
 &gt; ------------------------------------<br>
 &gt; Posted by: gilles_arcas@... mailto:gilles_arcas@...<br>
 &gt; ------------------------------------<br>
 &gt; <br>
<br>
[Non-text portions of this message have been removed]<br>
<br>
</p>

    </div>
     

    <!--~-|**|PrettyHtmlStart|**|-~-->
    <div style="color: #fff; height: 0;">__._,_.___</div>

          
  
 

    
    <div style="clear:both"> </div>

    <div id="fromDMARC" style="margin-top: 10px;">
        <hr style="height:2px ; border-width:0; color:#E3E3E3; background-color:#E3E3E3;">
        Posted by: [email protected]        <hr style="height:2px ; border-width:0; color:#E3E3E3; background-color:#E3E3E3;">
     </div>
    <div style="clear:both"> </div>

    <table cellspacing=4px style="margin-top: 10px; margin-bottom: 10px; color: #2D50FD;">
      <tbody>
        <tr>
          <td style="font-size: 12px; font-family: arial; font-weight: bold; padding: 7px 5px 5px;"  >
                          <a style="text-decoration: none; color: #2D50FD" href="https://groups.yahoo.com/neo/groups/sed-users/conversations/messages/9963;_ylc=X3oDMTJwb2ZnYmI0BF9TAzk3MzU5NzE0BGdycElkAzI0ODk2MzkEZ3Jwc3BJZAMxNzA5MzM1MDAyBG1zZ0lkAzk5NjMEc2VjA2Z0cgRzbGsDcnBseQRzdGltZQMxNTQwOTQzOTk3?act=reply&messageNum=9963">Reply via web post</a>
                      </td>
          <td>&bull;</td>
          <td style="font-size: 12px; font-family: arial; padding: 7px 5px 5px;" >
            <a href="mailto:[email protected]?subject=Re%3A%20Computing%20with%20sed%3A%20a%20compiler%20from%20python%20to%20sed" style="text-decoration: none; color: #2D50FD;">
               Reply to sender            </a>
          </td>
          <td>&bull;</td>
          <td style="font-size: 12px; font-family: arial; padding: 7px 5px 5px;">
            <a href="mailto:[email protected]?subject=Re%3A%20Computing%20with%20sed%3A%20a%20compiler%20from%20python%20to%20sed" style="text-decoration: none; color: #2D50FD">
              Reply to group            </a>
          </td>
          <td>&bull;</td>
          <td style="font-size: 12px; font-family: arial; padding: 7px 5px 5px;" >
            <a href="https://groups.yahoo.com/neo/groups/sed-users/conversations/newtopic;_ylc=X3oDMTJldGxyZGwzBF9TAzk3MzU5NzE0BGdycElkAzI0ODk2MzkEZ3Jwc3BJZAMxNzA5MzM1MDAyBHNlYwNmdHIEc2xrA250cGMEc3RpbWUDMTU0MDk0Mzk5Nw--" style="text-decoration: none; color: #2D50FD">Start a New Topic</a>
          </td>
          <td>&bull;</td>
          <td style="font-size: 12px; font-family: arial; padding: 7px 5px 5px;color: #2D50FD;" >
                            <a href="https://groups.yahoo.com/neo/groups/sed-users/conversations/topics/9959;_ylc=X3oDMTM0OGRxOG05BF9TAzk3MzU5NzE0BGdycElkAzI0ODk2MzkEZ3Jwc3BJZAMxNzA5MzM1MDAyBG1zZ0lkAzk5NjMEc2VjA2Z0cgRzbGsDdnRwYwRzdGltZQMxNTQwOTQzOTk3BHRwY0lkAzk5NTk-" style="text-decoration: none; color: #2D50FD;">Messages in this topic</a>
                (5)
                      </td>
        </tr>
      </tbody>
    </table>

        
<div id="megaphoneModule">
            <hr style="height:2px ; border-width:0; color:#E3E3E3; background-color:#E3E3E3;">
        <div>
	     <div class="stream" style="margin-bottom:10px;">
        <div style="background-color:white;">
            <div class="sn-img" style="display:inline;"><img name="tn_file" style="padding:0px 10px;vertical-align:top;margin-top:5px;" src="https://s.yimg.com/ru/static/images/yg/img/megaphone/1464031581_phpFA8bON" height="82" width="82"></div>
            <div class="mod-txt" style="display:inline-block;">
                <a rel="nofollow" name="sub_url" target="_blank" href="https://yho.com/1wwmgg" style="color:#0000FF;display:block;margin-left:5px;text-decoration:none;"><span style="font-size:15px;">Have you tried the highest rated email app?</span></a>
                <div style="max-width:530px;padding:2px 5px;">With 4.5 stars in iTunes, the Yahoo Mail app is the highest rated email app on the market. What are you waiting for? Now you can access all your inboxes (Gmail, Outlook, AOL and more) in one place. Never delete an email again with 1000GB of free cloud storage.</div>
            </div>
        </div>
    </div>        </div>  
     
    <hr style="height:2px ; border-width:0; color:#E3E3E3; background-color:#E3E3E3;">
</div>

<!------- Start Nav Bar ------>


    <div id="ygrp-grfd" style="font-family: Verdana; font-size: 12px; padding: 15px 0;">
      
<!-- |**|begin egp html banner|**| -->

      -- <BR>
      
<!-- |**|end egp html banner|**| -->

    </div>
  

 

<!-- |**|begin egp html banner|**| -->
<div id="ygrp-vital" style="background-color: #f2f2f2; font-family: Verdana; font-size: 10px; margin-bottom: 10px; padding: 10px;">

    <span id="vithd" style="font-weight: bold; color: #333; text-transform: uppercase; "><a href="https://groups.yahoo.com/neo/groups/sed-users/info;_ylc=X3oDMTJlYW9naHA1BF9TAzk3MzU5NzE0BGdycElkAzI0ODk2MzkEZ3Jwc3BJZAMxNzA5MzM1MDAyBHNlYwN2dGwEc2xrA3ZnaHAEc3RpbWUDMTU0MDk0Mzk5Nw--" style="text-decoration: none;">Visit Your Group</a></span>

     <ul style="list-style-type: none; margin: 0; padding: 0; display: inline;">
            <li style="border-right: 1px solid #000; font-weight: 700; display: inline; padding: 0 5px; margin-left: 0;">
      <span class="cat"><a href="https://groups.yahoo.com/neo/groups/sed-users/members/all;_ylc=X3oDMTJmZDZ0MjlvBF9TAzk3MzU5NzE0BGdycElkAzI0ODk2MzkEZ3Jwc3BJZAMxNzA5MzM1MDAyBHNlYwN2dGwEc2xrA3ZtYnJzBHN0aW1lAzE1NDA5NDM5OTc-" style="text-decoration: none;">New Members</a></span>
      <span class="ct" style="color: #ff7900;">1</span>
    </li>
                                              </ul>
  </div>


<div id="ft" style="font-family: Arial; font-size: 11px; margin-top: 5px; padding: 0 2px 0 0; clear: both;">
  <a href="https://groups.yahoo.com/neo;_ylc=X3oDMTJkbDNzZXVnBF9TAzk3MzU5NzE0BGdycElkAzI0ODk2MzkEZ3Jwc3BJZAMxNzA5MzM1MDAyBHNlYwNmdHIEc2xrA2dmcARzdGltZQMxNTQwOTQzOTk3" style="float: left;"><img src="http://l.yimg.com/ru/static/images/yg/img/email/new_logo/logo-groups-137x15.png" height="15" width="137" alt="Yahoo! Groups" style="border: 0;"/></a>
  <div style="color: #747575; float: right;"> &bull; <a href="https://info.yahoo.com/privacy/us/yahoo/groups/details.html" style="text-decoration: none;">Privacy</a> &bull; <a href="mailto:[email protected]?subject=Unsubscribe" style="text-decoration: none;">Unsubscribe</a> &bull; <a href="https://info.yahoo.com/legal/us/yahoo/utos/terms/" style="text-decoration: none;">Terms of Use</a> </div>
</div>
<br>

<!-- |**|end egp html banner|**| -->

  </div> <!-- ygrp-msg -->

 
  <!-- Sponsor -->
  <!-- |**|begin egp html banner|**| -->
  <div id="ygrp-sponsor" style="width:160px; float:right; clear:none; margin:0 0 25px 0; background: #fff;">

<!-- Start Recommendations -->
<div id="ygrp-reco">
     </div>
<!-- End Recommendations -->

          
<!-- |**|begin egp html banner|**| -->

    <div id="ygrp-lc">
      <div id="hd">SPONSORED LINKS</div>
      <div id="lc">
        <div class="ad" style="color:#628C2A; font-family:Arial; font-weight:bold;">
                      <script type='text/javascript'>document.write('<a href="https://us.y.atwola.com/?adlink|5113.1|221794|0|16|AdId=-3;BnId=0;itime=943997404;kvmn=y100000;kvssp=brxd;kvpgcolo=bf1;kvadtc%5Fdvmktname=unknown;kvadtc%5Fdvosplt=unknown;kvadtc%5Fdvbrand=unknown;kvadtc%5Fdvtype=unknown;kvadtc%5Fdvmodel=unknown;kvrepo%5Fdvosplt=unknown;kvadtc%5Fdvosversion=UNKNOWN;kvadtc%5Fcrbrand=wifi%5Fus;kvadtc%5Fcrcountry=us;kvadtc%5Fcontype=wifi;gdpr=0;adclntid=1004;spaceid=1709335002;" target=_top><img src="https://aka-cdn.adtechus.com/images/ATCollapse.gif" border=0 alt="AOL Ad" width="1" height="1" ></a>');
  
</script>
<!--Pointguard Diagnostic Start {"FAC3.0":{
"FAC IP" : "72.30.211.156",
"AdPosition Name" : "LC1",
"sapyECPM" : "0",
"gemniECPM" : "0",
"oneMobileECPM" : "0",
"gd2NetCpm" : "0",
"issapyEmpty" : "true",
"SapyAdSize" : "",
"SapyCustomSection" : "",
"SapyUrl" : "",
" SapyFedStatus" : "federation is not configured for ad slot",
" FedStatus" : "federation is not configured for ad slot"
}-->                          <img alt="" width=1 height=1 src="http://us.adserver.yahoo.com/l?M=#26/D=yahoo/S=:LC1/A=1234567/rand=738199673">
                              </div>
        <div class="ad" style="color:#628C2A; font-family:Arial; font-weight:bold;">
                      <script type='text/javascript'>document.write('<a href="https://us.y.atwola.com/?adlink|5113.1|221794|0|16|AdId=-3;BnId=0;itime=943997408;kvmn=y100000;kvssp=brxd;kvpgcolo=bf1;kvadtc%5Fdvmktname=unknown;kvadtc%5Fdvosplt=unknown;kvadtc%5Fdvbrand=unknown;kvadtc%5Fdvtype=unknown;kvadtc%5Fdvmodel=unknown;kvrepo%5Fdvosplt=unknown;kvadtc%5Fdvosversion=UNKNOWN;kvadtc%5Fcrbrand=wifi%5Fus;kvadtc%5Fcrcountry=us;kvadtc%5Fcontype=wifi;gdpr=0;adclntid=1004;spaceid=1709335002;" target=_top><img src="https://aka-cdn.adtechus.com/images/ATCollapse.gif" border=0 alt="AOL Ad" width="1" height="1" ></a>');
  
</script>
<!--Pointguard Diagnostic Start {"FAC3.0":{
"FAC IP" : "72.30.211.156",
"AdPosition Name" : "LC2",
"sapyECPM" : "0",
"gemniECPM" : "0",
"oneMobileECPM" : "0",
"gd2NetCpm" : "0",
"issapyEmpty" : "true",
"SapyAdSize" : "",
"SapyCustomSection" : "",
"SapyUrl" : "",
" SapyFedStatus" : "federation is not configured for ad slot",
" FedStatus" : "federation is not configured for ad slot"
}-->                          <img alt="" width=1 height=1 src="http://us.adserver.yahoo.com/l?M=#26/D=yahoo/S=:LC2/A=1234567/rand=439139556">
                              </div>
        <div class="ad" style="color:#628C2A; font-family:Arial; font-weight:bold;">
                      <script type='text/javascript'>document.write('<a href="https://us.y.atwola.com/?adlink|5113.1|221794|0|16|AdId=-3;BnId=0;itime=943997411;kvmn=y100000;kvssp=brxd;kvpgcolo=bf1;kvadtc%5Fdvmktname=unknown;kvadtc%5Fdvosplt=unknown;kvadtc%5Fdvbrand=unknown;kvadtc%5Fdvtype=unknown;kvadtc%5Fdvmodel=unknown;kvrepo%5Fdvosplt=unknown;kvadtc%5Fdvosversion=UNKNOWN;kvadtc%5Fcrbrand=wifi%5Fus;kvadtc%5Fcrcountry=us;kvadtc%5Fcontype=wifi;gdpr=0;adclntid=1004;spaceid=1709335002;" target=_top><img src="https://aka-cdn.adtechus.com/images/ATCollapse.gif" border=0 alt="AOL Ad" width="1" height="1" ></a>');
  
</script>
<!--Pointguard Diagnostic Start {"FAC3.0":{
"FAC IP" : "72.30.211.156",
"AdPosition Name" : "LC3",
"sapyECPM" : "0",
"gemniECPM" : "0",
"oneMobileECPM" : "0",
"gd2NetCpm" : "0",
"issapyEmpty" : "true",
"SapyAdSize" : "",
"SapyCustomSection" : "",
"SapyUrl" : "",
" SapyFedStatus" : "federation is not configured for ad slot",
" FedStatus" : "federation is not configured for ad slot"
}-->                          <img alt="" width=1 height=1 src="http://us.adserver.yahoo.com/l?M=#26/D=yahoo/S=:LC3/A=1234567/rand=814705639">
                              </div>
      </div>
    </div>
    
<!-- |**|end egp html banner|**| -->

  

  </div>   <!-- |**|end egp html banner|**| -->

  <div style="clear:both; color: #FFF; font-size:1px;">.</div>
</div>

  <img src="http://geo.yahoo.com/serv?s=97359714/grpId=2489639/grpspId=1709335002/msgId=9963/stime=1540943997/nc1=1234567/nc2=2/nc3=3" width="1" height="1"> <br>

<img src="http://y.analytics.yahoo.com/fpc.pl?ywarid=515FB27823A7407E&a=10001310322279&js=no&resp=img&cf12=CP" width="1" height="1"> 

<div style="color: #fff; height: 0;">__,_._,___</div>
<!--~-|**|PrettyHtmlEnd|**|-~-->

</body>

<!--~-|**|PrettyHtmlStart|**|-~-->
<head>
  <style type="text/css">
  <!--
  #ygrp-mkp {
  border: 1px solid #d8d8d8;
  font-family: Arial;
  margin: 10px 0;
  padding: 0 10px;
}

#ygrp-mkp hr {
  border: 1px solid #d8d8d8;
}

#ygrp-mkp #hd {
  color: #628c2a;
  font-size: 85%;
  font-weight: 700;
  line-height: 122%;
  margin: 10px 0;
}

#ygrp-mkp #ads {
  margin-bottom: 10px;
}

#ygrp-mkp .ad {
  padding: 0 0;
}

#ygrp-mkp .ad p {
  margin: 0;
}

#ygrp-mkp .ad a {
  color: #0000ff;
  text-decoration: none;
}
  #ygrp-sponsor #ygrp-lc {
  font-family: Arial;
}

#ygrp-sponsor #ygrp-lc #hd {
  margin: 10px 0px;
  font-weight: 700;
  font-size: 78%;
  line-height: 122%;
}

#ygrp-sponsor #ygrp-lc .ad {
  margin-bottom: 10px;
  padding: 0 0;
}

  #actions {
    font-family: Verdana;
    font-size: 11px;
    padding: 10px 0;
  }

  #activity {
    background-color: #e0ecee;
    float: left;
    font-family: Verdana;
    font-size: 10px;
    padding: 10px;
  }

  #activity span {
    font-weight: 700;
  }

  #activity span:first-child {
    text-transform: uppercase;
  }

  #activity span a {
    color: #5085b6;
    text-decoration: none;
  }

  #activity span span {
    color: #ff7900;
  }

  #activity span .underline {
    text-decoration: underline;
  }

  .attach {
    clear: both;
    display: table;
    font-family: Arial;
    font-size: 12px;
    padding: 10px 0;
    width: 400px;
  }

  .attach div a {
    text-decoration: none;
  }

  .attach img {
    border: none;
    padding-right: 5px;
  }

  .attach label {
    display: block;
    margin-bottom: 5px;
  }

  .attach label a {
    text-decoration: none;
  }
  
  blockquote {
    margin: 0 0 0 4px;
  }

  .bold {
    font-family: Arial;
    font-size: 13px;
    font-weight: 700;
  }

  .bold a {
    text-decoration: none;
  }

  dd.last p a {
    font-family: Verdana;
    font-weight: 700;
  }

  dd.last p span {
    margin-right: 10px;
    font-family: Verdana;
    font-weight: 700;
  }

  dd.last p span.yshortcuts {
    margin-right: 0;
  }

  div.attach-table div div a {
    text-decoration: none;
  }

  div.attach-table {
    width: 400px;
  }

  div.file-title a, div.file-title a:active, div.file-title a:hover, div.file-title a:visited {
    text-decoration: none;
  }

  div.photo-title a, div.photo-title a:active, div.photo-title a:hover, div.photo-title a:visited {
    text-decoration: none;
  }

  div#ygrp-mlmsg #ygrp-msg p a span.yshortcuts {
    font-family: Verdana;
    font-size: 10px;
    font-weight: normal;
  }

  .green {
    color: #628c2a;
  }

  .MsoNormal {
    margin: 0 0 0 0;
  }

  o {
    font-size: 0;
  }

  #photos div {
    float: left;
    width: 72px;
  }

  #photos div div {
    border: 1px solid #666666;
    height: 62px;
    overflow: hidden;
    width: 62px;
  }

  #photos div label {
    color: #666666;
    font-size: 10px;
    overflow: hidden;
    text-align: center;
    white-space: nowrap;
    width: 64px;
  }

  #reco-category {
    font-size: 77%;
  }

  #reco-desc {
    font-size: 77%;
  }

  .replbq {
    margin: 4px;
  }

  #ygrp-actbar div a:first-child {
   /* border-right: 0px solid #000;*/
    margin-right: 2px;
    padding-right: 5px;
  }

  #ygrp-mlmsg {
    font-size: 13px;
    font-family: Arial, helvetica,clean, sans-serif;
    *font-size: small;
    *font: x-small;
  }

  #ygrp-mlmsg table {
    font-size: inherit;
    font: 100%;
  }

  #ygrp-mlmsg select, input, textarea {
    font: 99% Arial, Helvetica, clean, sans-serif;
  }

  #ygrp-mlmsg pre, code {
    font:115% monospace;
    *font-size:100%;
  }

  #ygrp-mlmsg * {
    line-height: 1.22em;
  }

  #ygrp-mlmsg #logo {
    padding-bottom: 10px;
  }


  #ygrp-msg p a {
    font-family: Verdana;
  }

  #ygrp-msg p#attach-count span {
    color: #1E66AE;
    font-weight: 700;
  }

  #ygrp-reco #reco-head {
    color: #ff7900;
    font-weight: 700;
  }

  #ygrp-reco {
    margin-bottom: 20px;
    padding: 0px;
  }

  #ygrp-sponsor #ov li a {
    font-size: 130%;
    text-decoration: none;
  }

  #ygrp-sponsor #ov li {
    font-size: 77%;
    list-style-type: square;
    padding: 6px 0;
  } 

  #ygrp-sponsor #ov ul {
    margin: 0;
    padding: 0 0 0 8px;
  }

  #ygrp-text {
    font-family: Georgia;
  }

  #ygrp-text p {
    margin: 0 0 1em 0;
  }

  #ygrp-text tt {
    font-size: 120%;
  }

  #ygrp-vital ul li:last-child {
    border-right: none !important; 
  } 
  -->
  </style>
</head>

<!--~-|**|PrettyHtmlEnd|**|-~-->
</html>
<!-- end group email -->


--JIAsYAR4GKn5g8pHKMOjME12nbnFJxWeDiUktvp--