tag:blogger.com,1999:blog-69214267171007610602024-03-05T00:17:00.813-05:00PolyGlot, Inc. NewsA series of professional and personal posts from PolyGlot Inc's principal consultant, Bruce Wallace.Bruce Wallacehttp://www.blogger.com/profile/01185353603127616202noreply@blogger.comBlogger36125tag:blogger.com,1999:blog-6921426717100761060.post-60122588320064993582017-11-30T13:03:00.003-05:002017-12-01T16:57:20.590-05:00Case Study for MVCCE Design PatternIn earlier posts, I published <a href="https://polyglotinc.blogspot.com/2012/02/cheat-sheets-for-mvcce-my-refinement-on.html" target="_blank">cheat sheet summaries of my MVCCE design pattern</a>, which extends and refines the classic MVC design pattern. I present here an example of the use of that pattern.<br />
<br />
For the web sites of the family of brands of a major retailer, I created a "widget" to handle site search requests that used several interactive animations and responsive behavior, including type-ahead suggestions gathered via AJAX interaction with backend servers.<br />
<br />
This configurable standalone GUI widget was written in essentially raw JavaScript, and it used the MVCCE design pattern.<br />
<br />
Below is the design diagram <span style="font-family: -webkit-standard; text-size-adjust: auto;">(</span><i style="font-family: -webkit-standard; text-size-adjust: auto;">click to expand</i><span style="font-family: -webkit-standard; text-size-adjust: auto;">)<span class="Apple-converted-space"> </span></span> that was the blueprint for that widget.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyVZfds5n032Vv-pQiMplBODC6SZ1Ws8gUMyji2Etg6t67ESqZ3bINd3iT5BWSnmOjN9DrbKvk5G-uNmGna9gdWT2GLggLbBvOzFZmR42M7KEbEuHxTnqar6gbwUoiXTVzR4J9zxMzOFk/s1600/SearchInputWidgetMVC7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="825" data-original-width="1100" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyVZfds5n032Vv-pQiMplBODC6SZ1Ws8gUMyji2Etg6t67ESqZ3bINd3iT5BWSnmOjN9DrbKvk5G-uNmGna9gdWT2GLggLbBvOzFZmR42M7KEbEuHxTnqar6gbwUoiXTVzR4J9zxMzOFk/s640/SearchInputWidgetMVC7.png" width="640" /></a></div>
<div style="text-align: center;">
<span style="font-family: -webkit-standard; text-size-adjust: auto;"><span style="font-size: x-small;"><br /></span></span><span style="font-size: x-small;"><span style="font-family: -webkit-standard; text-size-adjust: auto;">C</span><span style="font-family: -webkit-standard; text-size-adjust: auto;">lick to Expand</span></span></div>
<div style="text-align: center;">
<span style="font-size: x-small;"><span style="font-family: -webkit-standard; text-size-adjust: auto;"><br /></span></span></div>
<div style="text-align: left;">
<span style="font-family: -webkit-standard;">Following the "single flow" of data from left to right,</span></div>
<div style="text-align: left;">
</div>
<ol>
<li><span style="font-family: -webkit-standard;">User Actions (i.e. things a user wants to do, use cases, etc),</span></li>
<li><span style="font-family: -webkit-standard;">are invoked by the user causing DOM Input Events (by clicking or typing or moving cursor),</span></li>
<li><span style="font-family: -webkit-standard;">which are caught by Controllers,</span></li>
<li><span style="font-family: -webkit-standard;">which decide which Command to invoke, with which parameters to send,</span></li>
<li><span style="font-family: -webkit-standard;">which uses Model APIs to manipulate/update the widget's (and/or application's) state,</span></li>
<li><span style="font-family: -webkit-standard;">which causes Update Events to be sent to Views which are "Observing" those Models,</span></li>
<li><span style="font-family: -webkit-standard;">and those Views use the DOM APIs to manipulate/update the browser display.</span></li>
</ol>
<div>
<span style="font-family: -webkit-standard;">This widget, at the "compound" level, did not happen to generate Output Events for other Controllers to subscribe to.</span></div>
<div>
<span style="font-family: -webkit-standard;"><br /></span></div>
<div>
<span style="font-family: -webkit-standard;">As can be seen, several models, views, controllers are "composite" containing sub-components.</span><br />
<span style="font-family: -webkit-standard;"><br /></span>
While it is less obvious from the diagram, the AJAX interactions with the server-side, result in Input Events from the async replies to data requests (e.g. type-ahead suggestions), which update the Models, which in turn cause the Views to update themselves (including the loading of images that correspond with the type-ahead suggestions).<br />
<br /></div>
Bruce Wallacehttp://www.blogger.com/profile/01185353603127616202noreply@blogger.com0tag:blogger.com,1999:blog-6921426717100761060.post-77984437992500074142015-07-14T16:00:00.004-04:002021-09-05T05:14:05.114-04:00The many spellings of Nurd (or is it Nerd?)As the bombs burst outside for Bastille Day, I commemorate something completely different...<br />
<br />
<span style="color: blue;">While bored in 10th grade history class, I wrote a little treatise on the many ways to spell "nurd". I had come up with 742 different spellings. This post commemorates the 45th anniversary of that event, and is the first time I've attempted to recreate the list since then. This new compendium has a new total spellings count of 910!</span><br />
<div class="p2">
<br /></div>
<div class="p1">
Today we all know what a "nerd" is, and how most people spell it. But 45 years ago, it was in its primordial beginnings with no set meaning, nor an agreed upon spelling.</div>
<div class="p1">
<br /></div>
<div class="p1">
The spelling "nurd" was actually the preferred one in my high school circles in 1970. And the meaning was basically the punchline to a joke. A "nurd" (circa 1970) is someone who farts in the bathtub and bites the bubbles. While nerd/nurd has lost that meaning, it is interesting to see that there are other related words that still have that same meaning (according to the Urban Dictionary),</div>
<div class="p1">
and the same early 1970s date is even referenced as well. See the definitions for <a href="http://www.urbandictionary.com/define.php?term=Dork&defid=1682210" target="_blank">dork</a>, <a href="http://www.urbandictionary.com/define.php?term=gorp&defid=1026137" target="_blank">gorp</a>, <a href="http://www.urbandictionary.com/define.php?term=fonzanoon" target="_blank">fonzanoon</a>, etc.</div>
<div class="p2">
<br /></div>
<div class="p1">
But, a winner to competing spellings emerges from the mist, with "nerd" gaining traction just as the word itself starts getting increasingly used. See <a href="https://books.google.com/ngrams/graph?content=nurd%2Cnerd&case_insensitive=on&year_start=1900&year_end=2008&corpus=15&smoothing=3&share=&direct_url=t4%3B%2Cnurd%3B%2Cc0%3B%2Cs0%3B%3Bnurd%3B%2Cc0%3B%3BNurd%3B%2Cc0%3B%3BNuRD%3B%2Cc0%3B%3BNURD%3B%2Cc0%3B.t4%3B%2Cnerd%3B%2Cc0%3B%2Cs0%3B%3Bnerd%3B%2Cc0%3B%3BNerd%3B%2Cc0%3B%3BNERD%3B%2Cc0" target="_blank">this Google NGRAM graph</a> of the historical usage of the two spellings, showing a clear upswing in usage and spelling preference starting in the late 1970s. <span style="color: #741b47;"><b>For me, it is no coincidence that the date corresponds to the advent of home computers, e.g. the Apple ][ in 1977. </b></span>[BTW, if you are wondering why usage might have plateaued, see how <a href="https://books.google.com/ngrams/graph?content=nurd%2Cnerd%2Casperger&case_insensitive=on&year_start=1900&year_end=2008&corpus=15&smoothing=3&share=&direct_url=t4%3B%2Cnurd%3B%2Cc0%3B%2Cs0%3B%3Bnurd%3B%2Cc0%3B%3BNurd%3B%2Cc0%3B%3BNuRD%3B%2Cc0%3B%3BNURD%3B%2Cc0%3B.t4%3B%2Cnerd%3B%2Cc0%3B%2Cs0%3B%3Bnerd%3B%2Cc0%3B%3BNerd%3B%2Cc0%3B%3BNERD%3B%2Cc0%3B.t4%3B%2Casperger%3B%2Cc0%3B%2Cs0%3B%3BAsperger%3B%2Cc0%3B%3Basperger%3B%2Cc0%3B%3BASPERGER%3B%2Cc0">Asperger's</a> has overtaken it.]</div>
<div class="p1">
<br /></div>
<div class="p1">
<iframe frameborder="0" height="350" hspace="0" marginheight="0" marginwidth="0" name="ngram_chart" scrolling="yes" src="https://books.google.com/ngrams/interactive_chart?content=nurd%2Cnerd&case_insensitive=on&year_start=1900&year_end=2008&corpus=15&smoothing=3&share=&direct_url=t4%3B%2Cnurd%3B%2Cc0%3B%2Cs0%3B%3Bnurd%3B%2Cc0%3B%3BNurd%3B%2Cc0%3B%3BNuRD%3B%2Cc0%3B%3BNURD%3B%2Cc0%3B.t4%3B%2Cnerd%3B%2Cc0%3B%2Cs0%3B%3Bnerd%3B%2Cc0%3B%3BNerd%3B%2Cc0%3B%3BNERD%3B%2Cc0" vspace="0" width="100%"></iframe></div>
<div class="p2">
<br /></div>
<div class="p1">
<span style="color: #cc0000;">The irony is that the word nerd would eventually take on the meaning that describes the very kind of person who would take on a project of enumerating hundreds of its spellings.</span></div>
<div class="p2">
<br /></div>
<div class="p1">
<b>The Rules</b></div>
<div class="p2">
<br /></div>
<div class="p1">
In 1970, thinking of the two spelling alternatives, I noticed that nurd is a unique combination of sounds, each of which has an unusually large number of possible spellings, hence the combinatorics explode. There is the starting "n" sound, followed by the "ur" sound, followed by a hard "d" sound, each of which has multiple spellings (in English).<br />
<br /></div>
<div class="p1">
So, I grabbed the biggest dictionary I could find, and at my desk (with the history teacher droning on), I enumerated all the variations (in a matrix, by hand, in pen, mind you) and came up with a total of 742. I am afraid I've lost track of that historic document. So, herewithin, I will attempt to recreate the set of rules, and the list of spellings generated by them.</div>
<div class="p2">
<br /></div>
<div class="p1">
<b>An "n" sound at the beginning of a word,</b> has an unbelievable number of spellings in English.<br />
They are:</div>
<div class="p1">
<ol>
<li>"n" as in nerd.</li>
<li>"gn" as in gnat.</li>
<li>"kn" as in know.</li>
<li>"cn" as in cnemis (<i>I'm not making these up…look them up in the dictionary</i>)</li>
<li>"mn" as in mnemonic.</li>
<li>"pn" as in pneumonia.</li>
<li>"nn" based on the logic that double letters can be used in the beginning, like "aa" in aardvark, or "ll" in Lloyd</li>
</ol>
</div>
<div class="p2">
<br /></div>
<div class="p1">
<b>The "urd" sound</b> also has a huge number of spellings:</div>
<div class="p1">
<ol>
<li>"urd" as in kurd.</li>
<li>"erd" as in herd.</li>
<li>"ird" as in bird.</li>
<li>"ord" as in word.</li>
<li>"oard" as in cupboard</li>
<li>"ard" as in standard, awkward.</li>
<li>"ered" as in blinkered.</li>
<li>"eard" as in heard.</li>
<li>"irred" as in stirred.</li>
<li>"urred" as in blurred.</li>
<li>"erred" as in deterred.</li>
<li>"ored" as in flavored, armored (<i>hey, I was in the South, we pronounce 'em that way</i>)</li>
<li>"ured" as in featured</li>
<li>"yred" as in martyred</li>
<li>"yrd" as in (lots of people with last name) Byrd, and Lynyrd Skynyrd (<i>I said it was the South, plus its got nyrd twice!</i>)</li>
</ol>
</div>
<div class="p2">
<br /></div>
<div class="p1">
<b>The hard consonant ending</b>, has a few variations too:</div>
<div class="p1">
<ol>
<li>a single consonant, as in mud, hence a "d" ending</li>
<li>a double consonant, as in odd, add, hence a "dd" ending</li>
<li>with a silent "e" and single consonant, as in facade, avant-garde, hence a "de" ending</li>
<li>with a silent "e" and double consonant, as in dradde, and (ye olde) shoppe, hence a "dde" ending</li>
</ol>
</div>
<div class="p2">
Ok, so thats 7 times 15 times 4 giving 420 …hmmm… I kinda remember some not-quite-silent "h"s thrown in, as in nhurd (<i>it sounds the same!</i>), and nurdhe as in "sadhe" (<i>yes, it is! Merriam-Websters</i>). So now 7 times 30 times 5 giving 1050.</div>
<div class="p1">
But I think I threw out the "h" in front of "ord" and "ored" and "oard" and "ard" since that seemed stretching it even for me. So back down to 7 times 26 times 5 giving 910.</div>
<div class="p2">
<br /></div>
<br />
<table style="text-align: right;">
<tbody>
</tbody><caption><b><span style="font-family: Verdana, sans-serif; font-size: x-small;">The Spellings</span></b></caption>
<tbody>
</tbody><thead>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">Count</span></div>
</th><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">_n...d</span></div>
</th><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">_nh...d</span></div>
</th><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">_n...dd</span></div>
</th><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">_nh...dd</span></div>
</th><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">_n...de</span></div>
</th><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">_nh...de</span></div>
</th><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">_n...dde</span></div>
</th><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">_nh...dde</span></div>
</th><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">_n...dhe</span></div>
</th><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">_nh...dhe</span></div>
</th></tr>
</thead>
<tbody>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">1</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nurd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhurd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nurdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhurdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nurde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhurde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nurdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhurdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nurdhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhurdhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">11</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnurd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhurd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnurdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhurdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnurde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhurde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnurdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhurdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnurdhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhurdhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">21</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnurd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhurd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnurdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhurdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnurde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhurde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnurdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhurdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnurdhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhurdhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">31</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knurd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhurd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knurdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhurdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knurde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhurde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knurdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhurdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knurdhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhurdhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">41</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnurd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhurd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnurdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhurdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnurde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhurde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnurdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhurdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnurdhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhurdhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">51</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnurd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhurd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnurdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhurdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnurde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhurde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnurdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhurdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnurdhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhurdhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">61</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnurd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhurd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnurdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhurdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnurde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhurde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnurdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhurdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnurdhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhurdhe</span></div>
</td></tr>
<tr><th><span style="font-family: Verdana, sans-serif; font-size: x-small;">.</span></th></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">71</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nerd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nherd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nerdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nherdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nerde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nherde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nerdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nherdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nerdhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nherdhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">81</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnerd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnherd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnerdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnherdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnerde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnherde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnerdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnherdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnerdhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnherdhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">91</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnerd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnherd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnerdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnherdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnerde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnherde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnerdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnherdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnerdhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnherdhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">101</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knerd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knherd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knerdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knherdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knerde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knherde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knerdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knherdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knerdhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knherdhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">111</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnerd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnherd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnerdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnherdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnerde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnherde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnerdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnherdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnerdhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnherdhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">121</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnerd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnherd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnerdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnherdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnerde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnherde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnerdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnherdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnerdhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnherdhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">131</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnerd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnherd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnerdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnherdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnerde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnherde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnerdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnherdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnerdhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnherdhe</span></div>
</td></tr>
<tr><th><span style="font-family: Verdana, sans-serif; font-size: x-small;">.</span></th></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">141</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nird</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhird</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nirdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhirdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nirde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhirde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nirdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhirdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nirdhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhirdhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">151</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnird</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhird</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnirdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhirdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnirde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhirde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnirdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhirdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnirdhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhirdhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">161</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnird</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhird</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnirdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhirdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnirde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhirde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnirdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhirdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnirdhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhirdhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">171</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knird</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhird</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knirdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhirdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knirde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhirde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knirdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhirdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knirdhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhirdhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">181</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnird</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhird</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnirdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhirdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnirde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhirde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnirdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhirdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnirdhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhirdhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">191</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnird</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhird</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnirdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhirdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnirde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhirde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnirdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhirdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnirdhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhirdhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">201</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnird</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhird</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnirdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhirdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnirde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhirde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnirdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhirdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnirdhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhirdhe</span></div>
</td></tr>
<tr><th><span style="font-family: Verdana, sans-serif; font-size: x-small;">.</span></th></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">211</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nord</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nordd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">norde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nordde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nordhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">216</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnord</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnordd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnorde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnordde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnordhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">221</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnord</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnordd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnorde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnordde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnordhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">226</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knord</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knordd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knorde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knordde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knordhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">231</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnord</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnordd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnorde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnordde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnordhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">236</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnord</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnordd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnorde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnordde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnordhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">241</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnord</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnordd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnorde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnordde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnordhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td></tr>
<tr><th><span style="font-family: Verdana, sans-serif; font-size: x-small;">.</span></th></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">246</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">noard</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">noardd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">noarde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">noardde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">noardhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">251</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnoard</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnoardd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnoarde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnoardde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnoardhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">256</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnoard</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnoardd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnoarde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnoardde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnoardhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">261</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knoard</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knoardd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knoarde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knoardde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knoardhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">266</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnoard</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnoardd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnoarde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnoardde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnoardhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">271</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnoard</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnoardd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnoarde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnoardde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnoardhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">276</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnoard</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnoardd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnoarde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnoardde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnoardhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td></tr>
<tr><th><span style="font-family: Verdana, sans-serif; font-size: x-small;">.</span></th></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">281</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nard</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nardd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">narde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nardde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nardhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">286</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnard</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnardd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnarde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnardde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnardhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">291</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnard</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnardd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnarde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnardde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnardhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">296</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knard</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knardd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knarde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knardde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knardhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">301</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnard</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnardd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnarde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnardde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnardhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">306</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnard</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnardd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnarde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnardde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnardhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">311</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnard</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnardd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnarde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnardde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnardhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td></tr>
<tr><th><span style="font-family: Verdana, sans-serif; font-size: x-small;">.</span></th></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">316</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nered</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhered</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">neredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nheredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nerede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nherede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">neredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nheredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">neredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nheredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">326</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnered</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhered</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cneredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnheredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnerede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnherede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cneredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnheredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cneredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnheredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">336</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnered</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhered</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gneredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnheredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnerede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnherede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gneredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnheredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gneredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnheredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">346</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knered</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhered</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">kneredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knheredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knerede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knherede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">kneredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knheredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">kneredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knheredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">356</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnered</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhered</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mneredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnheredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnerede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnherede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mneredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnheredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mneredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnheredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">366</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnered</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhered</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nneredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnheredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnerede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnherede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nneredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnheredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nneredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnheredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">376</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnered</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhered</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pneredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnheredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnerede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnherede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pneredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnheredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pneredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnheredhe</span></div>
</td></tr>
<tr><th><span style="font-family: Verdana, sans-serif; font-size: x-small;">.</span></th></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">386</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">neard</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nheard</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">neardd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nheardd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nearde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhearde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">neardde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nheardde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">neardhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nheardhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">396</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cneard</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnheard</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cneardd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnheardd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnearde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhearde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cneardde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnheardde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cneardhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnheardhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">406</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gneard</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnheard</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gneardd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnheardd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnearde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhearde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gneardde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnheardde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gneardhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnheardhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">416</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">kneard</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knheard</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">kneardd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knheardd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knearde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhearde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">kneardde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knheardde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">kneardhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knheardhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">426</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mneard</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnheard</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mneardd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnheardd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnearde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhearde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mneardde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnheardde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mneardhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnheardhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">436</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nneard</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnheard</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nneardd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnheardd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnearde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhearde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nneardde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnheardde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nneardhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnheardhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">446</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pneard</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnheard</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pneardd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnheardd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnearde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhearde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pneardde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnheardde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pneardhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnheardhe</span></div>
</td></tr>
<tr><th><span style="font-family: Verdana, sans-serif; font-size: x-small;">.</span></th></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">456</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nirred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhirred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nirredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhirredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nirrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhirrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nirredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhirredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nirredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhirredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">466</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnirred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhirred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnirredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhirredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnirrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhirrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnirredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhirredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnirredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhirredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">476</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnirred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhirred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnirredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhirredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnirrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhirrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnirredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhirredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnirredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhirredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">486</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knirred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhirred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knirredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhirredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knirrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhirrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knirredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhirredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knirredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhirredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">496</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnirred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhirred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnirredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhirredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnirrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhirrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnirredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhirredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnirredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhirredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">506</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnirred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhirred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnirredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhirredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnirrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhirrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnirredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhirredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnirredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhirredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">516</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnirred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhirred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnirredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhirredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnirrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhirrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnirredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhirredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnirredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhirredhe</span></div>
</td></tr>
<tr><th><span style="font-family: Verdana, sans-serif; font-size: x-small;">.</span></th></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">526</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nurred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhurred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nurredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhurredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nurrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhurrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nurredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhurredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nurredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhurredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">536</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnurred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhurred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnurredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhurredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnurrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhurrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnurredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhurredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnurredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhurredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">546</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnurred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhurred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnurredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhurredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnurrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhurrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnurredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhurredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnurredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhurredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">556</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knurred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhurred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knurredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhurredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knurrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhurrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knurredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhurredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knurredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhurredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">566</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnurred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhurred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnurredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhurredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnurrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhurrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnurredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhurredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnurredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhurredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">576</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnurred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhurred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnurredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhurredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnurrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhurrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnurredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhurredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnurredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhurredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">586</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnurred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhurred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnurredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhurredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnurrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhurrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnurredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhurredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnurredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhurredhe</span></div>
</td></tr>
<tr><th><span style="font-family: Verdana, sans-serif; font-size: x-small;">.</span></th></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">596</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nerred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nherred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nerredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nherredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nerrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nherrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nerredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nherredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nerredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nherredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">606</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnerred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnherred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnerredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnherredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnerrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnherrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnerredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnherredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnerredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnherredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">616</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnerred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnherred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnerredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnherredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnerrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnherrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnerredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnherredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnerredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnherredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">626</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knerred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knherred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knerredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knherredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knerrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knherrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knerredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knherredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knerredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knherredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">636</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnerred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnherred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnerredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnherredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnerrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnherrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnerredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnherredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnerredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnherredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">646</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnerred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnherred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnerredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnherredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnerrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnherrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnerredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnherredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnerredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnherredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">656</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnerred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnherred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnerredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnherredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnerrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnherrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnerredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnherredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnerredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnherredhe</span></div>
</td></tr>
<tr><th><span style="font-family: Verdana, sans-serif; font-size: x-small;">.</span></th></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">666</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nored</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">noredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">norede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">noredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">noredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">671</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnored</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnoredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnorede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnoredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnoredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">676</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnored</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnoredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnorede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnoredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnoredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">681</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knored</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knoredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knorede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knoredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knoredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">686</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnored</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnoredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnorede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnoredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnoredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">691</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnored</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnoredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnorede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnoredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnoredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">696</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnored</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnoredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnorede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnoredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnoredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">.....</span></div>
</td></tr>
<tr><th><span style="font-family: Verdana, sans-serif; font-size: x-small;">.</span></th></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">701</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nured</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhured</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nuredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhuredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nurede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhurede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nuredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhuredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nuredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhuredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">711</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnured</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhured</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnuredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhuredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnurede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhurede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnuredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhuredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnuredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhuredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">721</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnured</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhured</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnuredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhuredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnurede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhurede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnuredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhuredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnuredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhuredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">731</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knured</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhured</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knuredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhuredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knurede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhurede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knuredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhuredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knuredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhuredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">741</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnured</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhured</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnuredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhuredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnurede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhurede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnuredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhuredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnuredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhuredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">751</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnured</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhured</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnuredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhuredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnurede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhurede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnuredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhuredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnuredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhuredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">761</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnured</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhured</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnuredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhuredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnurede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhurede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnuredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhuredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnuredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhuredhe</span></div>
</td></tr>
<tr><th><span style="font-family: Verdana, sans-serif; font-size: x-small;">.</span></th></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">771</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nyred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhyred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nyredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhyredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nyrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhyrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nyredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhyredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nyredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhyredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">781</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnyred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhyred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnyredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhyredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnyrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhyrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnyredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhyredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnyredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhyredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">791</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnyred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhyred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnyredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhyredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnyrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhyrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnyredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhyredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnyredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhyredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">801</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knyred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhyred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knyredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhyredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knyrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhyrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knyredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhyredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knyredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhyredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">811</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnyred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhyred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnyredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhyredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnyrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhyrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnyredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhyredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnyredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhyredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">821</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnyred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhyred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnyredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhyredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnyrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhyrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnyredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhyredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnyredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhyredhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">831</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnyred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhyred</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnyredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhyredd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnyrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhyrede</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnyredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhyredde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnyredhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhyredhe</span></div>
</td></tr>
<tr><th><span style="font-family: Verdana, sans-serif; font-size: x-small;">.</span></th></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">841</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nyrd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhyrd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nyrdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhyrdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nyrde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhyrde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nyrdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhyrdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nyrdhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nhyrdhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">851</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnyrd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhyrd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnyrdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhyrdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnyrde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhyrde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnyrdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhyrdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnyrdhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">cnhyrdhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">861</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnyrd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhyrd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnyrdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhyrdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnyrde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhyrde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnyrdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhyrdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnyrdhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">gnhyrdhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">871</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knyrd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhyrd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knyrdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhyrdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knyrde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhyrde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knyrdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhyrdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knyrdhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">knhyrdhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">881</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnyrd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhyrd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnyrdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhyrdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnyrde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhyrde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnyrdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhyrdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnyrdhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">mnhyrdhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">891</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnyrd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhyrd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnyrdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhyrdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnyrde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhyrde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnyrdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhyrdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnyrdhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">nnhyrdhe</span></div>
</td></tr>
<tr><th><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">901</span></div>
</th><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnyrd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhyrd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnyrdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhyrdd</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnyrde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhyrde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnyrdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhyrdde</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnyrdhe</span></div>
</td><td><div style="text-align: right;">
<span style="font-family: Verdana, sans-serif; font-size: x-small;">pnhyrdhe</span></div>
</td></tr>
</tbody></table>
<br />
...with the final total: <b>910
</b><br />
<br />Bruce Wallacehttp://www.blogger.com/profile/01185353603127616202noreply@blogger.com0Juan-les-Pins, Antibes, France43.5691905 7.112385399999993843.5576855 7.0922153999999935 43.5806955 7.132555399999994tag:blogger.com,1999:blog-6921426717100761060.post-14128325847644323662013-12-09T17:22:00.000-05:002017-11-20T17:07:09.874-05:00reXume and GanttMagic moved to new server after 10 years<span style="color: red;">UPDATE:</span><span style="color: red;"> Nov</span><span style="color: red;">, 2017 - Domain name is back! There is a new web site hosting the new mobile-friendly, interactive resume publishing tools at <a href="http://rexume.org/">reXume.org</a> !</span><br />
<span style="color: red;">The legacy reXume WAR files mentioned below are now in</span><br />
<span style="color: red;"><a href="http://www.polyglotinc.com/reXume_server/new/reXume.war">http://www.polyglotinc.com/reXume_server/new/reXume.war</a> </span><br />
<span style="color: red;">leaving <a href="http://www.polyglotinc.com/rexume/" target="_blank">http://www.polyglotinc.com/rexume/</a> to host my personal resume, being an example of how the brand new reXume.org tools can be used for embedded interactive resumes.</span><br />
<span style="color: #cc0000;"><br /></span>
<span style="color: #cc0000;">UPDATE: May, 2015 - Elvis has left the bldg...moved server from San Fran w/fixed IP to a (gag) Comcast-only city; so, no fixed IP, and no dyndns. Going to retire the domain name now.</span><br />
<span style="color: #990000;"><span style="color: red;"><br /></span></span>
<span style="color: #990000;">UPDATE: May, 2014 - dyndns has dropped their free service after over a decade, and so I've had to change the domain name for the services URL above from rexume.dyndns.org to <strike>mini.rexume.org</strike>.</span><br />
<span style="color: red;"><br /></span>
My ancient legacy interactive resume server is finally dying...(<i>awwww</i>)... after almost 15 years running its little circa-1998 dual 350MHz Pentium 2 processors, dual-booting to Windows 95 (<i>YES 95!</i>) and RedHat 5.5, with JRun 3 (j2ee server), Netscape 4 browser, etc, etc... alas, its disk drive is faltering. I have been forced to do the archeology required to find the missing java source files (ah, there they were...over in the legacy JBuilder IDE files in the old Win95 drives backup!). I've also been forced to figure out how get them building/deploying/running on a decade newer technologies: Tomcat 7, Java 6, Eclipse Juno IDE, Mac OSX Lion Server.<br />
<br />
As it turns out, the only changes needed were:<br />
1. figuring out how to replace the old beta Batik jar file with the <a href="http://xmlgraphics.apache.org/batik/install.html#verify" target="_blank">myriad separate jar files Batik publishes</a> now (including the <a href="http://stackoverflow.com/questions/7891250/batik-not-in-classpath" target="_blank">one they left out</a>),<br />
2. figuring out that a <a href="http://blog.imaginea.com/cross-context-communication-between-web-applications/" target="_blank">magic password</a> is needed now to share webapp contexts,<br />
3. figuring out all the changes in Eclipse to build config/properties since I last attempted this in 2010.<br />
<br />
So, the new server setup adds port 8080 to the all the old URLs<span style="color: #b45f06;"> (and changes the domain name)</span>,<br />
( e.g. <a href="http://mini.rexume.org:8080/reXume/RBWrexume.html">http://mini.rexume.org:8080/reXume/RBWrexume.html</a> )<br />
and the two WAR files can now be found at:<br />
<a href="http://www.polyglotinc.com/GanttMagic/new/GanttMagic.war">http://www.polyglotinc.com/GanttMagic/new/GanttMagic.war</a> and<br />
<a href="http://www.polyglotinc.com/reXume/new/reXume.war">http://www.polyglotinc.com/reXume/new/reXume.war</a><br />
<br />
To keep installation simple, the .war files contain embedded copies of any required non-typical jar files (e.g. all the Batik jar files). Also, my .war and .jar files contain their java source files this time (lest I lose them again).<br />
<br />
<span style="color: red;"><br /></span>Bruce Wallacehttp://www.blogger.com/profile/01185353603127616202noreply@blogger.com0tag:blogger.com,1999:blog-6921426717100761060.post-13316435078045791012012-02-18T14:28:00.001-05:002017-11-30T13:07:18.097-05:00Cheat sheets for MVCCE, my refinement on MVC design patternOver many years of building GUIs in many different graphic/OS environments (<i>in recent years building Rich Internet Apps via JavaScript/HTML/CSS</i>), I have always used and advocated the Model-View-Controller design pattern. Along the way, I have come up with some refinements which are relevant now because fat JavaScript webpage apps have made fat GUI app programming come full circle. And unfortunately, I see the same hodgepodge of non-MVC code in JavaScript/HTML that I saw 20+ years ago with ObjectPascal/C/C++ on X-Windows/Mac/PCs.<br />
<br />
The main differences between vanilla MVC (ala original SmallTalk design pattern) and MVCCE are:<br />
<br />
<ol>
<li>Commands and Events are added to the list of first class citizens (along with Models, Views, Controllers)</li>
<li>Components are explicitly expected to often be Compound and/or Composite,<br />
but methods are still segregated into Model, View, Controller, Command, Event interfaces;
<div class="p1">
They are separate components with separate interfaces, to cover the separate aspects of a widget. <i>(e.g. the View that renders a particular piece of DOM is not combined with the Controller that listens to events from that same piece of DOM).</i></div>
</li>
<li>Controllers are very restricted, moving "business/app" logic into Commands,<br />
<div class="p1">
with controller logic limited to handling events in order to decide which Command to call, and which parameters to pass to it.</div>
</li>
<li>Commands mirror semantically-high-level User Actions rather than being low level event handlers</li>
</ol>
<br />
I reproduce the two diagrams below (<i>click to expand</i>) created for a client as "cheat sheets" for the pattern I call MVCCE (MVC + Commands and Events)<br />
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3E7mDymV2OPBaMt12dAsyWpwXZ4b7FkC8EjHCL9m8rOqdO3XkGyQzFh_TKpjYQDisJTJC9_K_pD4SEjywRAUTlXIc65YkmVYaMMbjP5451gFSnD8lPEQM0lXq6KO5OzrHRKPFHBjFUXA/s1600/MVCCE_1.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="487" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3E7mDymV2OPBaMt12dAsyWpwXZ4b7FkC8EjHCL9m8rOqdO3XkGyQzFh_TKpjYQDisJTJC9_K_pD4SEjywRAUTlXIc65YkmVYaMMbjP5451gFSnD8lPEQM0lXq6KO5OzrHRKPFHBjFUXA/s640/MVCCE_1.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Click to Expand </td></tr>
</tbody></table>
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnE82wVs2hBTjaNIFgoo1lEBTvc4QMe05hrHFvSobuLnbp7MS4D02HLbAC1PbcUhG1ElhkfVl-qA3hATdQHwfwT2WNZ0u3F3GnJPnqYcW6OPAZuXn-UYBfY5Sqfg0xhGuC3YcvFzm3lZo/s1600/MVCCE_2.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="487" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnE82wVs2hBTjaNIFgoo1lEBTvc4QMe05hrHFvSobuLnbp7MS4D02HLbAC1PbcUhG1ElhkfVl-qA3hATdQHwfwT2WNZ0u3F3GnJPnqYcW6OPAZuXn-UYBfY5Sqfg0xhGuC3YcvFzm3lZo/s640/MVCCE_2.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><br /></td></tr>
</tbody></table>
<div style="text-align: center;">
<span style="font-size: x-small;">Click to Expand</span></div>
Bruce Wallacehttp://www.blogger.com/profile/01185353603127616202noreply@blogger.com0tag:blogger.com,1999:blog-6921426717100761060.post-2464195602453343452011-11-04T15:39:00.002-04:002017-12-01T17:14:13.365-05:00A rant about Front End Developers not knowing Modular Programming<span style="color: blue; font-family: "trebuchet ms" , sans-serif;">I find myself these days needing to teach many Front End Developers about basic software engineering principles that they didn't even know they didn't know. Here is a rant based on a post of mine to an internal support forum at a client site. I keep finding FEDs that think that any piece of DOM, bit of JavaScript, or chunk of CSS that they can see via Firebug is fair game to fiddle with, and they ask in all innocence why that is a bad thing! ...rant...rant...</span><br />
<br />
<b>Why does my App break when I upgrade to the new version of the Framework?</b><br />
<br />
<u style="font-family: Times, 'Times New Roman', serif;">Question:</u><span style="font-family: "times" , "times new roman" , serif;"> Help, the following code broke when we upgraded to the new version of the [gui] framework.</span><br />
<span style="font-family: "times" , "times new roman" , serif;"><br /></span>
<span style="font-family: "times" , "times new roman" , serif;"><u>Answer</u>: In your code I see there are quite a few references to non-public framework component attributes and methods...</span><br />
<div style="font-family: Times,"Times New Roman",serif;">
<br /></div>
There are general software engineering principles of <a href="http://c2.com/cgi/wiki?EncapsulationIsNotInformationHiding" target="_blank">"encapsulation" and "information hiding"</a> which come from the Modular Programming era in the mid-1970s (just before Object Oriented expanded upon it). To combat <a href="http://en.wikipedia.org/wiki/Software_brittleness" target="_blank">"brittleness"</a> of a system, Components hide their (private) implementation details inside a (public) interface so that changes in one part of a system don't break other far-flung parts of that system (aka <a href="http://en.wikipedia.org/wiki/Loose_coupling" target="_blank">"loose coupling"</a>). The warranty provided by the component is that as long as you use it as designed, and via the stable interface, the insides are free to be changed/fixed/enhanced without affecting you.<br />
<br />
So, a component (<i>where "widget" is just another word for component</i>) is not just a collection of functionality like the collection of bits and wires below...<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.chrismcovell.com/segahacking/rgb_decodeboard.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://www.chrismcovell.com/segahacking/rgb_decodeboard.jpg" height="240" width="320" /></a></div>
<br />
...but rather a collection of functionality that has had a stable interface published on the outside of a <a href="http://en.wikipedia.org/wiki/Black_box" target="_blank">"black box"</a> thus hiding the implementation inside that box, as shown below...<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuk58tIkR6bJWUKR6temAR1Z4fnIRKtzEVfVstTdJdtMU-b4qlHoYJOiqwdCyy3nt8Zcf9mVWMVeABGWYj9kBtV3Y53vPGwqOyc4oHrabzYxIhxagSV5ETpY6gFLzGbw-_U7TUS8GNWRA/s1600/blackBox.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuk58tIkR6bJWUKR6temAR1Z4fnIRKtzEVfVstTdJdtMU-b4qlHoYJOiqwdCyy3nt8Zcf9mVWMVeABGWYj9kBtV3Y53vPGwqOyc4oHrabzYxIhxagSV5ETpY6gFLzGbw-_U7TUS8GNWRA/s1600/blackBox.jpeg" width="400" /></a></div>
<br />
<br />
<span style="font-size: large;"><b style="color: red;">This warranty is voided</b></span> however if you break into the box and connect to its private implementation (aka <a href="http://en.wikipedia.org/wiki/Hacker_%28hobbyist%29" target="_blank">"hacking"</a>) as seen below...<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.chrismcovell.com/segahacking/gg_inside.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://www.chrismcovell.com/segahacking/gg_inside.jpg" height="240" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.chrismcovell.com/segahacking/rgb_inside.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://www.chrismcovell.com/segahacking/rgb_inside.jpg" height="232" width="320" /></a></div>
<br />
In [GUI Framework], there are two major indicators as to whether a property or method of a widget is public interface versus private implementation:<br />
<ol>
<li>If the name of the property or method starts with an underscore ("_") then it is definitely private (or at best <a href="http://stackoverflow.com/questions/1020749/what-are-public-private-and-protected-in-object-oriented-programming" target="_blank">"protected"</a>)</li>
<li>If the property or method is documented as public in the [GUI Framework] JsDoc API Docs then it is definitely public.</li>
</ol>
SO, IN CONCLUSION, if someone advises you to have your app use non-documented or private parts of a widget, you should get them to sign a document acknowledging that they are taking responsibility for voiding your warranty...only the Interfaces are promised to be kept stable, not the Implementations!Bruce Wallacehttp://www.blogger.com/profile/01185353603127616202noreply@blogger.com0tag:blogger.com,1999:blog-6921426717100761060.post-88916999499063333922011-02-25T10:27:00.043-05:002011-02-25T11:14:47.753-05:00Performance Tips of the RIA All-Stars<style type="text/css">
div.TipsArticle p,
div.TipsArticle ul,
div.TipsArticle dl {
font-family: "Franklin Gothic Medium", "Trebuchet MS", sans-serif;
}
div.TipsArticle p {
text-align: justify;
}
div.TipsArticle h1,
div.TipsArticle h2,
div.TipsArticle h3 {
font-family: Arial,Helvetica,sans-serif;
margin-top: 0px;
margin-bottom: 0px;
}
div.TipsArticle h2 {
font-size: 2.0em;
}
div.TipsArticle h3 {
font-size: 1.0em;
}
div.TipsArticle cite {
font-family: Arial,Helvetica,sans-serif;
font-size: 0.875em;
letter-spacing: -1px;
font-style: normal;
font-variant: small-caps;
}
div.TipsArticle q {
font-family: "Times New Roman",Times,serif;
color: navy;
}
div.TipsArticle q:before { content: '' }
div.TipsArticle q:after { content: '' }
div.TipsArticle ul.quotes {
color: maroon;
margin-top: 0px;
margin-bottom: 0px;
}
div.TipsArticle ul.quotes q {
color: maroon;
margin-top: 0px;
margin-bottom: 0px;
}
div.TipsArticle abbr {
font-family: monospace;
font-size: 0.875em;
font-weight: bold;
}
div.TipsArticle dl ul {
margin-left: 0;
padding-left: 0;
}
div.TipsArticle ul.biblist {
list-style-type: none;
}
div.TipsArticle dl.tips dd {
text-align: justify;
}
div.TipsArticle dl.tips dt {
font-weight: bold;
margin-top: 10px;
}
div.TipsArticle dl.tips dt:before {
content: "\00BB TIP: "
}
div.TipsArticle var {
font-family: monospace;
font-style: normal;
}
div.TipsArticle code {
font-family: monospace;
font-weight: bold;
color: green;
}
div.TipsArticle mark {
text-decoration: underline;
}
div.TipsArticle mark.extra {
text-decoration: none;
color: purple;
}
</style><br />
<article><br />
<div class="TipsArticle"><section><br />
<h3>CODING and LOADING</h3><p>This guide will summarize the performance-related DOs and DON'Ts of JavaScript and Web Site development as espoused by well-known pundits like Douglas Crockford. The publications listed below are surveyed, but since they overlap, this guide can act as both summary and cheat sheet for their catalog of techniques. The tips fall into 2 major categories: CODING and LOADING. <em>i.e. making JavaScript and CSS performant, and minimizing the apparent time needed to load responsive user interfaces.</em><br />
</p><ul class="biblist"><li><abbr>[HPW]</abbr> High Performance Web Sites, Steve Souders, O'Reilly, 2007</li>
<li><abbr>[JGP]</abbr> JavaScript: The Good Parts, Douglas Crockford, O'Reilly, 2008</li>
<li><abbr>[EFW]</abbr> Even Faster Web Sites, Steve Souders, O'Reilly, 2009</li>
<li><abbr>[HPJ]</abbr> High Performance JavaScript, Nicholas Zakas, O'Reilly, 2010</li>
</ul><p>As with any optimization effort, the number one rule is to only optimize the portions of a system that are bottlenecks as actually measured at run time. Often, optimization techniques have serious downsides that require tradeoff judgments to be made. For example, Crockford <cite>[JGP, P.65]</cite> says both that <q>"Regular expressions usually have a significant performance advantage over equivalent string operations in JavaScript"</q> AND <q>"regular expressions can be very difficult to maintain and debug"</q>. Souders <cite>[EFW, P.6]</cite> says <q>"Everything is a trade-off. When optimizing for performance, do not waste time trying to speed up code that does not consume a significant amount of the time. Measure first. Back out of any optimization that does not provide an enjoyable benefit."</q> Galbraith <cite>[EFW, P.9]</cite> says <q>"developers seeking to create responsive, high-performance web sites can't, and shouldn't, go about achieving that goal by optimizing every single piece of code as they write it. The opposite is true: a developer should optimize only what isn't fast enough."</q><br />
</p><p>On the other hand, there are basic practices (like not putting operations inside a loop that can be done once outside the loop) that can be followed right from the start. As Zakas <cite>[HPJ, P.XII]</cite> says, <q>"JavaScript forces the developer to perform the optimizations that a compiler would normally handle in other languages"</q>. This catalog will contain a bit of each category.<br />
</p><p>And finally, in a very few cases, these authors contradict each other; for example, bitwise operators are either really fast, or really slow, depending on who is judging. Crockford <cite>[JGP, P.112]</cite>, in Appendix B: Bad Parts, says bitwise operators are <q>"very slow"</q>, whereas, Zakas <cite>[HPJ, P.156]</cite>, in Use the Fast Parts, says bitwise operators are <q>"incredibly fast"</q>!<br />
</p><dl><dt>Caveats: </dt>
<dd> <ul><li>This guide assumes that the reader is already familiar with basic but modern JavaScript/Web development, and leaves to another guide the task of bringing the reader up to that level.</li>
<li>While the books referenced above contain a wealth of development advice, this guide will only summarize those tips that are related to improved performance.</li>
<li>Each tip is a summary of a high level idea. Please refer to the book sections referenced for more implementation details as well as discussion of alternate techniques for more specialized situations.</li>
</ul></dd> </dl></section><br />
<section><br />
<h2>Section 1: Coding Tips</h2><ul class="quotes"><li><q>"JavaScript forces the developer to perform the optimizations that a compiler would normally handle" - N. Zakas</q></li>
</ul><dl class="tips"><dt>Arrays are not Arrays...</dt>
<dd><cite>[JGP, P.58,105]</cite> <q>"[Conventional] arrays can be very fast data structures. Unfortunately, JavaScript does not have anything like this kind of array. ... their performance can be considerably worse than real arrays"</q>. Arrays in JavaScript are basically objects (i.e. dynamic bags of properties) whose property names are merely the string version of the integer subscripts. </dd>
<dt>...but String Arrays are faster than String Concatenation</dt>
<dd><cite>[JGP, P.78]</cite><cite>[EFW, P.99]</cite> <q>"If you are assembling a string from a large number of pieces, it is usually faster to put the pieces into an array and join them than it is to concatenate the pieces with the + operator."</q> The more pieces that are concatenated together (think very big loops here), the faster it is to use <var>Array.join</var>. <pre><code> var a = [];
a.push('a'); a.push('b'); a.push('c'); a.push('d');
var c = a.join(''); // c is 'abcd' and faster than c = 'a'+'b'+'c'+'d';
</code></pre><cite>[EFW, P.99]</cite> While modern browsers have improved string performance to the point that this advice may be out of date, never the less, <q>"The performance decrease of the array technique in other browsers is typically much less than the performance increase gained in [pre-v8] Internet Explorer"</q>. </dd>
<dt>Fastest implementation of the missing String.trim function</dt>
<dd><cite>[EFW, P.101]</cite> JavaScript is missing a string <var>trim</var> function, and it is usually implemented by the application. After performing research on the fastest way to execute string trimming in JavaScript, the following function consistently performs better than other variations: <pre><code> function trim( text ){
text = text.replace(/^\s+/, "");
for (var i=text.length-1; i>=0; --i) {
if (/\S/.test(text.charAt(i))) {
text = text.substring( 0, i+1 );
break;
}
}
return text;
}
</code></pre></dd>
<dt>Faster to process an array of properties than sorting an enumeration</dt>
<dd><cite>[JGP, P.24]</cite> <q>"The for in statement can loop over all of the property names in an object... [but] there is no guarantee on the order of the names."</q> So, rather than having to sort them (not to mention filtering out all of the unwanted inherited properties), use a normal for loop against an array of property names in the desired order. E.G. <pre><code> var i, pn = [ 'first-name', 'middle-name', 'last-name' ];
for (i=0; i < pn.length; ++i) {
document.writeln( pn[i] + ': ' + personObject[ pn[i] ] );
}
</code></pre></dd>
<dt>Use <em>Simple</em> Regular Expressions instead of string manipulation</dt>
<dd><cite>[JGP, P.65, 69]</cite> <q>"Regular expressions usually have a significant performance advantage over equivalent string operations in JavaScript...[however] regular expressions can be very difficult to maintain and debug...[and] the part of the language that is least portable is the implementation of regular expressions. Regular expressions that are very complicated or convoluted are more likely to have portability problems. Nested regular expressions can also suffer horrible performance problems in some implementations. Simplicity is the best strategy."</q> </dd>
<dt>Eval is Evil (and so are its aliases)</dt>
<dd><cite>[JGP, P.110]</cite> Slow performance is just one reason to not use <var>eval()</var> and its equivalents. Between the two lines below, line one <q>"will be significantly slower because it needs to run the compiler just to execute a trivial assignment statement...The Function constructor is another form of <var>eval</var>, and should similarly be avoided. The browser provides <var>setTimeout</var> and <var>setInterval</var> functions that can take string arguments or function arguments. When given string arguments, <var>setTimeout</var> and <var>setInterval</var> also act as <var>eval</var>. The string argument form also should be avoided."</q> <pre><code> eval("myValue = myObject." + myKey + ";");
myvalue = myObject[ myKey ];
</code></pre></dd>
<dt>Always store multi-accessed values in local variables</dt>
<dd><cite>[HPJ, P.20-33]</cite> <cite>[EFW, P.79-88]</cite> <q>"Generally speaking, you can improve the performance of JavaScript code by storing frequently used object members, array items, and out-of-scope variables in local variables. You can then access the local variables faster than the originals. ... A good rule of thumb is to always store out-of-scope values in local variables if they are used more than once within a function. ... Literal values and local variables can be accessed very quickly, whereas array items and object members take longer. ... Local variables are faster to access than out-of-scope variables because they exist in the first variable object of the scope chain. The further into the scope chain a variable is, the longer it takes to access. Global variables are always the slowest to access because they are always last in the scope chain. ... Nested object members incur significant performance impact and should be minimized. ... The deeper into the prototype chain that a property or method exists, the slower it is to access."</q> </dd>
<dt>Avoid the <var>with</var> statement</dt>
<dd><cite>[HPJ, P.33]</cite> <q>"Avoid the <var>with</var> statement because it augments the execution context scope chain. ... Also, be careful with the <var>catch</var> clause of a <var>try-catch</var> statement because it has the same effect."</q> The net effect of each is that it makes the previously local variables no longer local, and hence, slower. </dd>
<dt>Optimize your loops because JavaScript won't</dt>
<dd><cite>[EFW, P.93]</cite> <q>"loops are a frequent source of performance issues in JavaScript, and the way you write loops drastically changes its execution time. Once again, JavaScript developers don't get to rely on compiler optimizations that make loops faster"</q> Beyond the normal refactoring of code to be outside of a loop wherever possible, there are a couple of operations of the loop itself that must be hand optimized. The first version of the loop below runs much slower than the second because it is looking up the <var>length</var> property of values over and over, and the comparison of <var>i--</var> to zero is much faster than comparing <var>i</var> to <var>length</var>. <pre><code> //traditional unoptimized for loop
var values = [1,2,3,4,5];
for (var i=0; i < values.length; ++i){ process(values[i]); }
//over 50% faster version
var length = values.length;
for (var i=length; i--;){ process(values[i]); }
</code></pre></dd>
<dt>Use Cooperative Multitasking for Long-Running Scripts</dt>
<dd><cite>[EFW, P.102]</cite> <q>"One of the critical performance issues with JavaScript is that code execution freezes a web page. Because JavaScript is a single-threaded language, only one script can be run at a time per window or tab. This means that all user interaction is necessarily halted while JavaScript code is being executed."</q> In general, when attempting to simulate true simultaneous execution of multiple processes (<em>like JavaScript and the user interface</em>), each process must either volunteer to regularly yield control temporarily to other processes (<dfn>cooperative multitasking</dfn>), or have control regularly taken from it (<dfn>preemptive multitasking</dfn>). The only option with JavaScript is voluntarily yielding control to the UI thread by splitting your logic into pieces and having each piece schedule the next piece with a time delay in between. <q>"Generally speaking, no single continuous script execution should take longer than 100 milliseconds; anything longer than that and the web page will almost certainly appear to be running slowly to the user"</q>. The <var>setTimeout</var> function takes a function and a delay amount as parameters. <q>"When the delay has passed, the code to execute is placed into a queue. The JavaScript engine uses this queue to determine what to do next. When a script finishes executing, the JavaScript engine yields to allow other browser tasks to catch up. The web page display is typically updated during this time in relation to changes made via the script. Once the display has been updated, the JavaScript engine checks for more scripts to run on the queue. If another script is waiting, it is executed and the process repeats; if there are no more scripts to execute, the JavaScript engine remains idle until another script appears in the queue."</q> </dd>
<dt>Use Memoization to cache intermediate calculations</dt>
<dd><cite>[JGP, P.44]</cite> One of the benefits of doing true "functional programming" is that it is easy to avoid performing calculations that have already been done. True functional programming has the rule that the result of a function depends totally on its parameters; i.e. it will always give the same result given the same parameters. This means that a cache object could be kept by a function to store the result for each set of parameters as they are encountered. When a function is called, the first thing it does it try to look up a cached result for the parameters it is given, and return it if found. If the result is not found, then it is calculated and saved in the cache before returning the result. <p>A simple example is the Fibonacci function. The first version below is the traditional implementation and the second uses a memoization helper to prevent recalculation. Since Fibonacci calls itself <mark>recursively</mark>, the savings add up very quickly.</p><pre><code>// traditional implementation
function <mark>fibonacci</mark>(n){ return n<2 ? n : <mark>fibonacci</mark>(n-1) + <mark>fibonacci</mark>(n-2); };
// simple memoization helper for functions-with-a-single-numeric-parameter
var memoizer = function( mementoArray, lambda )
{
var memoizedLambda = function( n ) {
var result = mementoArray[n];
if (typeof result !== 'number')
mementoArray[n] = result = lambda( memoizedLambda, n );
return result;
};
return memoizedLambda;
};
// memoized version <mark class="extra">[ with preloaded memos for f(0)=0 and f(1)=1 ]</mark>
var <mark>fibonacci</mark> = memoizer( <mark class="extra">[0,1]</mark>, function(<mark>myself</mark>,n){ return <mark>myself</mark>(n-1) + <mark>myself</mark>(n-2); } );
</code></pre></dd>
<dt>Avoid CSS expressions</dt>
<dd><cite>[HPW, P.51]</cite> <q>"CSS expressions are a powerful (and dangerous) way to set CSS properties dynamically. They're supported in Internet Explorer version 5 and later... The expression method is simply ignored by other browsers, so it is a useful tool for setting properties in Internet Explorer to create a consistent experience across browsers. ... CSS expressions are re-evaluated when the page changes, such as when it is resized... <strong>The problem with expressions is that they are evaluated more frequently than most people expect</strong>. Not only are they evaluated whenever the page is rendered and resized, but also when the page is scrolled and even when the user moves the mouse over the page. ... CSS expressions benefit from being automatically tied to events in the browser, but that's also their downfall."</q> <p>The major technique used to avoid CSS expressions is to have your own JavaScript function registered as an event listener triggered by only the appropriate event(s). It should set the dynamic CSS property to the desired recalculated value.</p></dd>
<dt>CSS Selectors are Backwards</dt>
<dd><cite>[EFW, P.194]</cite> <q>"The impact of CSS selectors on performance derives from the amount of time it takes the browser to match the selectors against the elements in the document. ... Consider the following rule: <code>#toc > LI { font-weight: bold; }</code> Most of us, especially those who read left to right, might assume that the browser matches this rule by moving from left to right, and thus, this rule doesn't seem too expensive. In our minds, we imagine the browser working like this: find the unique <var>toc</var> element and apply this styling to its immediate children who are <var>LI</var> elements. We know that there is only one <var>toc</var> element, and it has only a few <var>LI</var> children, so this CSS selector should be pretty efficient. In reality, <strong>CSS selectors are matched by moving from right to left!</strong> With this knowledge, our rule that at first seemed efficient is revealed to be fairly expensive. The browser must iterate over every <var>LI</var> element in the page and determine whether its parent is <var>toc</var>. This descendant selector example is even worse: <code>#toc A { color: #444; }</code> Instead of just checking for anchor elements inside <var>toc</var>, as would happen if it was read left to right, the browser has to check every anchor in the entire document. And instead of just checking each anchor's parent, the browser has to climb the document tree looking for an ancestor with the ID <var>toc</var>. If the anchor being evaluated isn't a descendant of <var>toc</var>, the browser has to walk the tree of ancestors until it reaches the document root."</q> </dd> </dl></section><br />
<section><br />
<h2>Section 2: Loading Tips</h2><ul class="quotes"><li><q>"Nothing else can happen while JavaScript code is being executed" - N. Zakas</q></li>
<li><q>"Rule 1: Make Fewer HTTP Requests" - Steve Souders</q></li>
<li><q>"Only 10-20% of the end user response time is spent downloading the HTML document.<br />
The other 80-90% is spent downloading all the components in the page." - the Performance Golden Rule</q></li>
</ul><dl class="tips"><dt>What is Fast Enough</dt>
<dd> <cite>[EFW, P.9]</cite> <q>"It's fine to say that code needs to execute ''as fast as possible'', but ... exactly what is ''fast enough'' ... Jakob Nielsen is a well-known and well-regarded expert in the field of web usability; the following quote addresses the issue of ''fast enough'': <blockquote>The response time guidelines for web-based applications are the same as for all other applications. These guidelines have been the same for 37 years now, so they are also not likely to change wit whatever implementation technology comes next.<br/>
<strong>0.1 second:</strong> Limit for users feeling that they are directly manipulating objects in the UI. For example, this is the limit from the time the user selects a column in a table until that column should highlight or otherwise give feedback that it's selected. Ideally, this would also be the response time for sorting the column-if so, users would feel that they are sorting the table.<br/>
<strong>1 second:</strong> Limit for users feeling that they are freely navigating the command space without having to unduly wait for the computer. A delay of 0.2-1.0 seconds does mean that users notice the delay and thus feel the computer is ''working'' on the command, as opposed to having the command be a direct effect of the users' actions. Example: If sorting a table according to the selected column can't be done in 0.1 seconds, it certainly has to be done in 1 second, or users will feel that the UI is sluggish and will lose the sense of ''flow'' in performing their task. For delays of more than 1 second, indicate to the user that the computer is working on the problem, for example by changing the shape of the cursor.<br/>
<strong>10 seconds:</strong> Limit for users keeping their attention on the task. Anything slower than 10 seconds needs a percent-done indicator as well as a clearly signposted way for the user to interrupt the operation. Assume that users will need to reorient themselves when they return to the UI after a delay of more than 10 seconds. Delays of longer than 10 seconds are only acceptable during natural breaks in the user's work, for example when switching tasks. </blockquote>In other words, if your JavaScript code takes longer than 0.1 seconds to execute, your page won't have that slick, snappy feel; if it takes longer than 1 second, the application feels sluggish; longer than 10 seconds, and the user will be extremely frustrated. These are the definitive guidelines to use for defining <em>''fast enough.''</em> "</q> </dd>
<dt>Put Stylesheets at the Top</dt>
<dd> <cite>[HPW, P.44]</cite> <q>"In their effort to improve one of the most visited pages on the Web, the Yahoo portal team initially made it worse by moving the [CSS] stylesheet to the bottom of the page. They found the optimal solution by following the HTML specification and leaving it at the top. Neither of the alternatives, the blank white screen or flash of unstyled content, are worth the risk. ... If you have a stylesheet that's not required to render the page, with some extra effort you can load it dynamically after the document loads."</q> </dd>
<dt>Put JavaScript at the Bottom</dt>
<dd> <cite>[HPJ, P.3]</cite> <cite>[HPW, P.45]</cite> <q>"Put all <var><script></var> tags at the bottom of the page, just inside of the closing <var></body></var> tag. This ensures that the page can be almost completely rendered before script execution begins."</q> <q>"[While modern browsers] allow parallel downloads of JavaScript files...JavaScript downloads still block downloading of other resources, such as images. And even though downloading a script doesn't block other scripts from downloading, the page must still wait for the JavaScript code to be downloaded and executed before continuing."</q> <q>"Since each <var><script></var> tag blocks the page from continuing to render until it has fully downloaded and executed the JavaScript code, the perceived performance of this page will suffer. Keep in mind that browsers don't start rendering anything on the page until the opening <var><body></var> tag is encountered. Putting scripts at the top of the page typically leads to a noticeable delay, often in the form of a blank white page"</q> <q>"This is the Yahoo Exceptional Performance team's first rule about JavaScript: put scripts at the bottom."</q> </dd>
<dt>Use External Scripts but Group them Together...</dt>
<dd> <cite>[HPJ, P.4]</cite> <cite>[HPW, P.55]</cite> <q>"In Raw Terms, Inline [scripts are] Faster... [but] using external files in the real world generally produces faster pages. This is due to ... the opportunity for JavaScript and CSS files to be cached by the browser."</q> <q>"Group scripts together. The fewer <var><script></var> tags on the page, the faster the page can be loaded and become interactive. ... when dealing with external JavaScript files, each HTTP request brings with it additional performance overhead, so downloading one single 100 KB file will be faster than downloading four 25 KB files. It's helpful to limit the number of external script files that your page references. ... Typically, a large website or web application will have several required JavaScript files. You can minimize the performance impact by concatenating these files together into a single file and then calling that single file with a single <var><script></var> tag. The catenation can happen offline using a build tool or in real-time using a tool like the Yahoo combo handler."</q> </dd>
<dt>...ON THE OTHER HAND, don't group them All together<br />
(aka: Download Most JavaScript in a Nonblocking Fashion)</dt>
<dd> <cite>[HPJ, P.5-9]</cite> <cite>[EFW, P.22, 51, 73]</cite> <q>"It turns out that Facebook executes only 9% of the downloaded JavaScript functions by the time the <var>onload</var> event is called."</q> <q>"Limiting yourself to downloading a single large JavaScript file will only result in locking the browser out for a long period of time, despite it being just one HTTP request. To get around this situation, you need to incrementally add more JavaScript to the page in a way that doesn't block the browser. The secret to nonblocking scripts is to load the JavaScript source code after the page has finished loading...[i.e.] after the window's load event has been fired." <strong>"Dynamic script loading is the most frequently used pattern for nonblocking JavaScript downloads</strong> due to its cross-browser compatibility and ease of use." "A new <var><script></var> element can be created very easily using standard DOM methods:</q> <pre><code> var script = document.createElement("script");
script.type = "text/javascript";
script.src = "file1.js";
document.getElementsByTagName("head")[0].appendChild(script);
</code></pre><q>... [file1.js] begins downloading as soon as the element is added to the page. The important thing about this technique is that the file is downloaded and executed without blocking other page processes... It's generally safer to add new <var><script></var> nodes to the <var><head></var> element instead of the <var><body></var>, especially if this code is executing during page load. ... This works well when the script is self-executing but can be problematic if the code contains only interfaces to be used by other scripts on the page. In that case, you need to track when the code has been fully downloaded and is ready for use. This is accomplished using events that are fired by the dynamic <var><script></var> node. ... You can dynamically load as many JavaScript files as necessary on a page, but <strong>make sure you consider the order in which files must be loaded</strong>. ... [Many] browsers will download and execute the various code files in the order in which they are returned from the server. You can guarantee the order by [daisy] chaining the downloads ...[or] concatenate the files into a single file where each part is in the correct order. That single file can then be downloaded ... (since this is happening asynchronously, there's no penalty for having a larger file)." <strong>"The challenge in splitting your JavaScript code is to avoid undefined symbols." "Preserving the order of JavaScript is critical, and this is true for CSS as well."</strong></q> </dd>
<dt>Separate Bootstrap Code from the bulk of the JavaScript</dt>
<dd> <cite>[HPJ, P.10]</cite> <cite>[EFW, P.27]</cite> <q>"The recommended approach to loading a significant amount of JavaScript onto a page is a two-step process: first, include the code necessary to dynamically load JavaScript, and then load the rest of the JavaScript code needed for page initialization. Since the first part of the code is as small as possible, potentially containing just the <var>loadScript()</var> function, it downloads and executes quickly, and so shouldn't cause much interference with the page. Once the initial code is in place, use it to load the remaining JavaScript [in a nonblocking fashion with a callback invoked on load completion]. For example: </q> <pre><code> <script type="text/javascript" src="myScriptLoader.js"></script>
<script type="text/javascript">
myScriptLoader( "the-rest.js", function(){ MyApplication.init(); } );
</script>
</code></pre><q>Place the loading code just before the closing <var></body></var> tag [so that] when the second JavaScript file has finished downloading, all of the DOM necessary for the application has been created and is ready to be interacted with, avoiding the need to check for another event (such as <var>window.onload</var>) to know when the page is ready for initialization." "The concept of a small initial amount of code on the page followed by downloading additional functionality is at the core of the YUI 3 design."</q> </dd>
<dt>Prevent redirects due to missing trailing URL slashes</dt>
<dd> <cite>[HPW, P.76]</cite> <q>"A redirect is used to reroute users from one URL to another. ...the main thing to remember is that redirects make your pages slower. ... One of the most wasteful redirects happens frequently and web developers are generally not aware of it. It occurs when a trailing slash (/) is missing from a URL that should otherwise have one. For example, <strong>http://yahoo.com/astrology </strong> results in a redirect to <strong>http://yahoo.com/astrology/ </strong> . The only difference is the addition of a trailing slash. ... Note that a redirect does not happen if the trailing slash is missing after the hostname. For example, <strong>http://www.yahoo.com</strong> does not generate a redirect."</q> </dd>
<dt>Never put an inline script after a <var><link></var> tag</dt>
<dd> <cite>[HPJ, P.4]</cite><cite>[EFW, P.75]</cite> <q>"Steve Souders has found that an inline script placed after a <var><link></var> tag referencing an external stylesheet caused the browser to block while waiting for the stylesheet to download. This is done to ensure that the inline script will have the most correct style information with which to work. Souders recommends never putting an inline script after a <var><link></var> tag for this reason."</q> </dd>
<dt>Minify JavaScript</dt>
<dd> <cite>[HPW, P.69]</cite> <q>"<dfn>Minification</dfn> is the practice of removing unnecessary characters from code to reduce its size, thereby improving load times. When code is minified, all comments are removed, as well as unneeded whitespace characters (space, newline, and tab). In the case of JavaScript, this improves response time performance because the size of the downloaded file is reduced. ... The most popular tool for minifying JavaScript code is JSMin (<em>http://crockford.com/javascript/jsmin</em>) ... <strong>Gzip compression has the biggest impact [about 70%], but minification further reduces file sizes [by about 20%].</strong>" "The savings from minifying CSS are typically less than the savings from minifying JavaScript because CSS generally has fewer comments and less whitespace than JavaScript. The greatest potential for size savings comes from optimizing CSS; i.e. merging identical classes, removing unused classes, etc."</q> </dd>
<dt>Remove Duplicate Scripts</dt>
<dd> <cite>[HPW, P.85]</cite> <q>"It hurts performance to include the same JavaScript file twice in one page. This mistake isn't as unusual as you might think. A review of the 10 top U.S. web sites shows that two of them (CNN and YouTube) contain a duplicated script. ... The two sites that have duplicate scripts also happen to have an above-average number of scripts (CNN has 11; YouTube has 7). ... One way to avoid accidentally including the same script twice is to implement a script management module in your templating system. ... While tackling the duplicate script issue, add functionality to handle script dependencies and versioning of scripts too."</q> </dd>
<dt>Use a Content Delivery Network</dt>
<dd> <cite>[HPW, P.18]</cite> <q>"The average user's bandwidth increases every year, but a user's proximity to your web server still has an impact on a page's response time. ... A content delivery network (CDN) is a collection of web servers distributed across multiple locations to deliver content to users more efficiently. ... CDNs are used to deliver static content, such as images, scripts, stylesheets, and Flash. Static files are easy to host and have few dependencies. That is why a CDN is easily leveraged to improve the response times for a geographically dispersed user population."</q> Keeping in mind the <dfn>Performance Golden Rule</dfn> that says <q>"Only 10-20% of the end user response time is spent downloading the HTML document. The other 80-90% is spent downloading all the components in the page", [Tests and Yahoo experience show that] components hosted on a CDN loaded 18-20% faster than with all components hosted from a single web server."</q> </dd>
<dt>Use Server Compression</dt>
<dd> <cite>[HPW, P.39]</cite> <q>"If an HTTP request results in a smaller response, the transfer time decreases because fewer packets must travel from the server to the client. ... [Using server-side preprocessing] to compress HTTP responses... is the easiest technique for reducing page weight and it also has the biggest impact. Gzip is currently the most popular and effective compression method. It is a free format (i.e., unencumbered by patents or other restrictions). ... Servers choose what to gzip based on file type, but are typically too limited in what they are configured to compress. Many web sites gzip their HTML documents, but it's also worthwhile to gzip your scripts and stylesheets, and in fact, any text response including XML and JSON. Image and PDF files should <em>not</em> be gzipped because they are already compressed. ... Generally, it's worth gzipping any file greater than 1 or 2K."</q> </dd>
<dt>Add "Long Shelf Life" Headers</dt>
<dd> <cite>[HPW, P.32]</cite> <q>"Browsers (and proxies) use a cache to reduce the number of HTTP requests and decrease the size of HTTP responses, thus making web pages load faster. A web server uses the <var>Expires</var> header to tell the web client that it can use the current copy of a component until the specified time. ... The <var>Cache-Control</var> header was introduced in HTTP/1.1 to overcome limitations with the <var>Expires</var> header. ... [it] uses the <var>max-age</var> directive to specify [in seconds] how long a component may be cached. ... If the browser has a copy of the component in its cache, but isn't sure whether it's still valid, a conditional GET request is made. ... The browser is essentially saying, ''I have a version of this resource with the following last-modified date. May I just use it?'' ... If the component has not been modified since the specified date, the server ... skips sending the body of the response, resulting in a smaller and faster response. Conditional GET helps pages load faster, but they still require making a roundtrip between the client and server to perform the validity check. ... Those conditional requests add up [<em>easily adding over 50% to the response time for subsequent views of a typical web page.</em>]"</q> Configuring your web servers to generate headers that specify the predicted lifespan of each component will maximize cache effectiveness. Using versioning to make each component "immutable" will allow <dfn>"far future Expires"</dfn> (i.e. very long lifespans) to be specified thus avoiding unnecessary Conditional GETs. </dd>
<dt>Remove ETags</dt>
<dd> <cite>[HPW, P.89]</cite> <q>"<dfn>Entity tags <abbr>(ETags)</abbr></dfn> are a mechanism that web servers and browsers use to validate cached components. Reducing the number of HTTP requests needed for a page is the best way to accelerate the user experience. You can achieve this by maximizing the browser's ability to cache your components, but the [default] ETag header thwarts caching when a web site is hosted on more than one server. ... The problem with ETags is that they are typically constructed using attributes that make them unique to a specific server hosting a site. ... The end result is that ETags generated by Apache and IIS for the exact same component won't match from one server to another. ... If you have components that have to be [version-stamped] based on something other than the last-modified date, [customized] ETags are a powerful way of doing that. If you don't have the need to customize ETags, it is best to simply remove them. ... removing the ETag altogether would avoid these unnecessary and inefficient downloads of data that's already in the browser's cache."</q> </dd>
<dt>Use Iframes Sparingly</dt>
<dd> <cite>[EFW, P.191]</cite> <q>"Even blank iframes are expensive. They are one to two orders of magnitude more expensive than other DOM elements. When used in the typical way (<var><iframe src="url"></ifram></var>), iframes block the <var>onload</var> event. This prolongs the browser's busy indicators, resulting in a page that is perceived to be slower. ... Although iframes don't directly block resource downloads in the main page, there are ways that the main page can block the iframe's downloads. ... The browser's limited connections per server are shared across the main page and iframes, even though an iframe is an entirely independent document. ... With all of these costs, it's often best to avoid the use of iframes, and yet a quick survey shows that they are still used frequently. ... An alternative way to [use frames] with better performance would be for the main page to create a <var>DIV</var> to hold the contents of the [frame]. When the main page requests the [frame's] external script asynchronously, the <var>ID</var> of this <var>DIV</var> could be included in the script's URL. The [frame's] JavaScript would then insert the [frame] in the page by setting the <var>innerHTML</var> of the <var>DIV</var>. This approach is also more compatible with [frames] that take over a large part of the window and thus cannot be constrained by an iframe. The use of iframes is declining as these other techniques for inserting."</q> ON THE OTHER HAND, iframes have been retained and even enhanced in HTML5. </dd>
<dt>Flush the Document Chunks Early</dt>
<dd> <cite>[EFW, P.191]</cite> While the backend server is generating its response to a web page request, the browser (and the user) must sit and wait. <q>"In most cases, the browser waits for the HTML document to arrive before it starts rendering the page and downloading the page's resources."</q> In order for the user to get some immediate feedback, and for the browser to start downloading images and the like, the backend server logic should flush an initial chunk of HTML back to the browser before starting any "slow" logic needed on its end to marshall up the remainder of the HTML. To do this, HTML 1.1 "chunked encoding" needs to be supported by both the browser and server, and the server logic needs to "flush" its output buffer back to the browser after an appropriate HTML split point has been reached. <q>"This is exactly what's needed to combat the two shortcomings of a slow HTML document: blocked rendering and blocked downloads."</q> ON THE OTHER HAND, early flushing and chunked encoding has many gotchas which can make it problematic in the real-world. </dd>
<dt>Reduce DNS Lookups...</dt>
<dd> <cite>[HPW, P.73]</cite> <cite>[EFW, P.171]</cite> <q>"the <dfn>Domain Name System <abbr>(DNS)</abbr></dfn> maps hostnames to IP addresses, just as phonebooks map people's names to their phone numbers. ... DNS has a cost. It typically takes 20-120 milliseconds for the browser to look up the IP address for a given hostname."</q> Minimizing how many different domain names your page references reduces DNS lookup delays. <q>"Google is the preeminent example of this, with only one DNS lookup necessary for the entire page."</q> </dd>
<dt>...ON THE OTHER HAND, Shard your Domain</dt>
<dd> <cite>[EFW, P.161-8]</cite> Most browsers limit the number of resources that they will simultaneously download from any particular domain name. <q>"Some web pages have all their HTTP requests served from one domain. Other sites spread their resources across multiple domains. ... sometimes increasing the number of domains is better for performance, even at the cost of adding more DNS lookups."</q> Splitting resource downloads between multiple domain names (e.g. foo.com and www.foo.com) is known as <dfn>Domain Sharding</dfn>. Having a particular resource always associated with a particular domain name is needed to maximize caching. <q>"Research published by Yahoo shows that increasing the number of domains from one to two improves performance, but increasing it above two has a negative effect on load times. The final answer depends on the number and size of resources, but <strong>sharding across two domains is a good rule of thumb</strong>."</q> </dd>
<dt>Make Fewer and Thinner Image Requests</dt>
<dd> <cite>[HPW, P.10]</cite> <cite>[EFW, P.133]</cite> <q>"Images are an easy place to improve performance without removing features. Often, we can make substantial improvements in the size and number of images with little to no reduction in quality. <strong>(1)</strong> If you use multiple hyperlinked images (<em>say a row of buttons</em>), [client-side] image maps may be a way to reduce the number of HTTP requests without changing the page's look and feel. An <dfn>image map</dfn> allows you to associate multiple URLs with a single image. The destination URL is chosen based on where the user clicks on the image. <strong>(2)</strong> Like image maps, <dfn>CSS sprites</dfn> allow you to combine images [onto one large compound image such that each individual image can be cropped via CSS] ... One surprising benefit is reduced download size. Most people would expect the combined image to be larger than the sum of the separate images because the combined image has additional area used for spacing. In fact, the combined image tends to be smaller than the sum of the separate images as a result of reducing the amount of image overhead (color tables, formatting information, etc.). <strong>(3)</strong> Optimizing images begins with creative decisions made by the designer about the minimum number of colors, resolution, or accuracy required for a given image [availing the use of <dfn>lossy optimizations</dfn>.] ... Once the quality choice has been made, use [automated] <dfn>nonlossy compression</dfn> to squeak the last bytes out of the image. ... fantastic open source tools exist for optimizing images. ● Start by choosing the appropriate format: JPEG for photos, GIF for animations, and PNG for everything else. Strive for PNG8 whenever possible. ● Crush PNGs, optimize GIF animations, and strip JPEG metadata from the images you own. Use progressive JPEG encoding for JPEGs more than 10 KB in file size. ● Avoid AlphaImageLoader. ● Optimize CSS sprites. ● Create modular sprites if your site has more than two to three pages. ● Don't scale images in HTML. ● Generated images should be crushed, too. Once generated, they should be cached for as long as possible. Convert images to PNG8 and determine whether 256 colors is acceptable."</q> </dd> </dl></section><br />
</div></article>Bruce Wallacehttp://www.blogger.com/profile/01185353603127616202noreply@blogger.com1tag:blogger.com,1999:blog-6921426717100761060.post-62931226026468793302011-01-31T23:15:00.000-05:002011-01-31T23:15:26.478-05:00JavaScript: The Surprising PartsThis post is a summary of the the things that surprised me as I've been reading several books to update my knowledge of JavaScript (and practices that have changed since 2004/2005). While this info would have been big news to most and worth writing articles about back then, it begs the question as to why I should blog about it given that now there are several good books available on the subject. There are two self-canceling reasons; (1) this blog will act as a cheat sheet for me, and (2) the very act of writing it will make me more likely not to need a cheat sheet. While there are many small things that I didn't happen to know (<i>or remember knowing</i>), I am writing here about the things that actually <b>surprised</b> me, and they tended to be either big or small surprises, so I will organize them that way.<br />
<br />
<b>Small Surprises</b><br />
<ul><li><span class="Apple-style-span" style="font-size: x-small;">[JGP, p.6]</span> <span class="Apple-style-span" style="color: #274e13; font-family: 'Courier New', Courier, monospace;"><b>undefined</b></span> is not a reserved word!</li>
<li><span class="Apple-style-span" style="font-size: x-small;">[JGP, p.107]</span> <span class="Apple-style-span" style="color: #274e13; font-family: 'Courier New', Courier, monospace;"><b>undefined</b></span> is not a constant; it is a global variable which can be redefined! (so is NaN).</li>
<li><span class="Apple-style-span" style="font-size: x-small;">[JGP, p.103]</span> Reserved words <i>can</i> be used as object property names (<i>unless</i> accessed via dot notation)! Even stranger, an empty string is a legal property name! (as in <span class="Apple-style-span" style="color: #274e13; font-family: 'Courier New', Courier, monospace;"><b>obj[""]=123;</b></span>) </li>
<li><span class="Apple-style-span" style="font-size: x-small;">[JGP, p.7]</span> <span class="Apple-style-span" style="color: #274e13; font-family: 'Courier New', Courier, monospace;"><b>integer</b></span> types are really <span class="Apple-style-span" style="color: #274e13; font-family: 'Courier New', Courier, monospace;"><b>double</b></span> under the hood!</li>
<li><span class="Apple-style-span" style="font-size: x-small;">[JGP, p.10, 102]</span> Nested block statements (i.e. <span class="Apple-style-span" style="color: #274e13; font-family: 'Courier New', Courier, monospace;"><b>{</b></span>...<span class="Apple-style-span" style="color: #274e13; font-family: 'Courier New', Courier, monospace;"><b>}</b></span>) do not define a new variable scope!</li>
<li><span class="Apple-style-span" style="font-size: x-small;">[JGP, p.29]</span> If a method is called as a simple function, <b><span class="Apple-style-span" style="color: #274e13; font-family: 'Courier New', Courier, monospace;">this</span></b> is not undefined but rather defined as the global object!</li>
<li><span class="Apple-style-span" style="font-size: x-small;">[JGP, p.36, 102]</span> Local variables exist before they are declared! (which is why they may as well all be declared at the beginning of a function)</li>
<li><span class="Apple-style-span" style="font-size: x-small;">[JGP, p.105]</span> The <span class="Apple-style-span" style="color: #274e13; font-family: 'Courier New', Courier, monospace;"><b>arguments</b></span> array is not an array! (For that matter, arrays are not arrays!)</li>
<li><span class="Apple-style-span" style="font-size: x-small;">[JGP, p.109]</span> The <span class="Apple-style-span" style="color: #274e13; font-family: 'Courier New', Courier, monospace;"><b>==</b></span> operator does type coercion and the <span class="Apple-style-span" style="color: #274e13; font-family: 'Courier New', Courier, monospace;"><b>===</b></span> operator does not. But the type coercion is done so poorly that it is too dangerous to use <span class="Apple-style-span" style="color: #274e13; font-family: 'Courier New', Courier, monospace;"><b>==</b></span> at all in general!</li>
<li><span class="Apple-style-span" style="font-size: x-small;">[JGP, p.102]</span> The <span class="Apple-style-span" style="color: #274e13; font-family: 'Courier New', Courier, monospace;"><b>return</b></span> statement will return <span class="Apple-style-span" style="color: #274e13; font-family: 'Courier New', Courier, monospace;"><b>undefined</b></span> if the return value expression does not start on the same line as the return keyword!</li>
<li><span class="Apple-style-span" style="font-size: x-small;">[HPJ, p.2]</span> Browsers block loading anything else while the JavaScript inside a script tag executes! </li>
<li><span class="Apple-style-span" style="font-size: x-small;">[HPJ, p.7]</span> Scripts can be dynamically loaded by creating script tags via DHTML, and those scripts <i>don't</i> block loading other elements (like images, etc).</li>
<li><span class="Apple-style-span" style="font-size: x-small;">[HPJ, p.20]</span> Global variables are not the fastest to access (compared to variables in other scopes), as would be the case in compiled languages, but are in fact the slowest since all the other scopes are searched first.</li>
<li><span class="Apple-style-span" style="font-size: x-small;">[JGP, p.112, HPJ, p.156]</span> Bitwise operators are either really fast, or really slow, depending on who is judging. Crockford, in Appendix B: <b>Bad Parts</b>, say bitwise operators are "very slow", whereas, Zakas, in <b>Use the Fast Parts</b>, say bitwise operators are "incredibly fast"!</li>
</ul><br />
<b>Large Surprises</b><br />
<ul><li><span class="Apple-style-span" style="font-size: x-small;">[JGP, p.37, HPJ, pp.21-26]</span> <b>Closures imply Cactus Stacks</b>. I didn't really understand in a deep way what closures were, and <b><span class="Apple-style-span" style="font-size: x-small;">JGP</span></b><i> </i>didn't help<i> (nor any other JavaScript articles/books for that matter).</i> After all, Pascal had nested function definitions where the inner procedures had access to the outer local variables, but that didn't make closures. What really made me understand was realizing that JavaScript was like Scheme with regard to closures. (See <i>JavaScript is Scheme not Java</i> below). As I wrote in a comment to someone else's blog attempting to explain JavaScript closures...<br />
<blockquote><span class="Apple-style-span" style="color: blue;">I think it would be more accurate to say right up front that our normal notion of a “stack” (as used to hold parameters and local variables) does not apply in languages like JavaScript (and Scheme, etc). Unlike Pascal, Ada, C, C++, Java, etc., JavaScript has only “heap with garbage collection"; all those “stack frames” to hold parameters and local variables are just more objects on the heap. When no more references to each exist, they individually get garbage collected. This means that </span><span class="Apple-style-span" style="color: #660000;">there is no special “saving the stack frame” after the outer function has returned for closures to use</span><span class="Apple-style-span" style="color: blue;">…they all just get garbage collected like anything else does when all references to it are deleted.</span></blockquote><blockquote><span class="Apple-style-span" style="color: blue;">BTW, the only way I ever grokked this was after learning Scheme by watching the </span><a href="http://itunes.apple.com/us/itunes-u/computer-science-61a-fall/id354818329">UC-Berkeley Comp Sci 61A class on iTunes U</a><span class="Apple-style-span" style="color: blue;">. Except for the EARRRRLY Fortran on CDC supercomputer days, where recursion was not supported and the hardware instruction set did not implement stacks, I had not experienced a language that wasn’t fundamentally stack-oriented (well ok, there was that funny Lisp language in the exotic languages class). The 61A class video explained (with nice pictures) how the “stack frames” are instead “environments” that chain to each other (just like JavaScript objects chain via Prototypes). There is a global environment with the global vars, plus a new environment for each function (to hold params and local vars), and instead of a stack of frames on a hardware stack, it is a linked list of environments on the heap.</span></blockquote><blockquote><span class="Apple-style-span" style="color: blue;">It probably also requires explaining right up front that unlike the Pascal, Ada, C, Java, etc languages (where functions are defined at COMPILE-TIME), JavaScript, Scheme, etc languages define functions at RUN-TIME. Because of this, there is always an "environment" that is active at the time of function creation/definition, namely, the call-stack that exists while the code creating a function is executed. [EXCEPT, of course that there is no stack... There is a great way to visualize how the stack is really a tree at</span> <a href="http://en.wikipedia.org/wiki/Spaghetti_stack">http://en.wikipedia.org/wiki/Spaghetti_stack</a>].</blockquote><blockquote><span class="Apple-style-span" style="color: blue;">A reference to this “current environment” chain is saved as a part of the function definition. In Java-like languages this makes no sense because there is no “current stack or environment” at compile time when the function was defined/compiled.</span></blockquote><blockquote><span class="Apple-style-span" style="color: blue;">SO, when a function gets called, instead of “pushing” its params/local vars on top of THE stack, it “pushes” it on top of an environment chain that was saved with the function definition. And since it isn't a real (hardware) stack, but actually sitting in the heap, the function can refer to “local variables” of its “outer” function long after that outer function has returned.</span></blockquote></li>
<li><span class="Apple-style-span" style="font-size: x-small;">[JGP, pp.40-57]</span> <b>JavaScript is Scheme not Java</b>. Having accidentally watched the entire 61A course that teaches Scheme and functional programming (<i>mentioned above</i>) before ever reading <b><span class="Apple-style-span" style="font-size: x-small;">JGP</span></b>, I immediately recognized the exotic techniques of <b><span class="Apple-style-span" style="font-size: x-small;">JGP </span></b>chapter 4 (<i>currying, etc</i>) as paralleling the topics in 61A. <span class="Apple-style-span" style="color: purple;">[BTW, I originally watched 61A because I wanted to learn about this <i>Hadoop</i> buzzword I kept coming across in Job Ads. When I looked it up and saw that it had something to do with Map/Reduce (whatever that was), and that this iTunes class had a section on Map/Reduce, I tried to watch just those lessons. It soon became clear that I needed to start from the beginning of the course to learn Scheme itself.]</span> Learning the culture and toolkit of functional programming, which goes way beyond simply using function pointers or having functions be objects, I could see that the new style of programming JavaScript was not very strange Java, but fairly normal Scheme. Back in 2005, I was aware of, but avoided, many of those alternate ways that JavaScript could be twisted to define classes, objects, functions, methods, inheritance, etc, BECAUSE, why would you want to make your JavaScript code look so un-Java-like!?! If one embraces JavaScript as Scheme, it is not a weird syntax but simply a different programming paradigm: functional programming with lambdas and lexical scoping.<br />
<br />
One of the many differences between functional and non-functional programming is the cognitive "weight" of functions. In Fortran thru Java (and JavaScript as I had been using it), methods and functions are fairly heavy weight things that get full blown API documentation (e.g. JavaDoc/jsDoc), and lots of whitespace around them, and are mostly not defined in a nested scope. In functional programming, functions definitions are like water, and are created, used, and abandoned in as casual a fashion as Strings are in "normal" languages. Function definitions within function definitions in Scheme are as common as string concatenations in Basic. SO, one has to get over the feeling that it is expensive overkill to define a function just to wrap another function so that a one variable closure can be created.</li>
</ul>[JGP] Crockford, Douglas. JavaScript: The Good Parts, O'Reilly, 2008<br />
[HPJ] Zakas, Nicholas. High Performance JavaScript, O'Reilly, 2010Bruce Wallacehttp://www.blogger.com/profile/01185353603127616202noreply@blogger.com0tag:blogger.com,1999:blog-6921426717100761060.post-8587939983058858322011-01-08T17:01:00.001-05:002011-02-25T11:22:44.746-05:00Adding Cross-browser support to the Gravey FrameworkIn order to get back into the Web 2.0 development world, I have recently taken on the project of upgrading the Gravey framework to run on browsers other than Internet Explorer. This post is a chronicle of what I encountered/learned getting its sample applications to also run on iPad 4.2, Safari 5.0, Chrome 8.0, Firefox 3.6, SeaMonkey 2.0, and IE 8.0 (while not breaking IE6 on Win2K). [<i>Note that the issues listed herein may have an IE-centric viewpoint, but it is only because the original code base naively used circa-2005 IE-only techniques, and therefore the news for Gravey is how everybody </i>else <i>does it now.</i>]<br />
<div style="text-align: justify;"><blockquote><span style="color: #073763;">The Gravey framework (<a href="http://gravey.org/">gravey.org</a>) is a JavaScript-only set of code that supports building Rich-Internet-Apps (RIA) using AJAX where the logic completely resides in the browser. The server-side need only provide a REST-style API for data persistence (<i>which can be a simple as the file:: protocol accessing local xml files)</i>. The framework includes GUI widgets, automated domain object persistence, in-browser XML/XSL processing, and </span><b style="color: #073763;">complete undo/redo capability</b><span style="color: #073763;">. In short, it was intended to allow RIA development in the style of "fat GUI" development in Java without requiring any particular server side technology (e.g. J2EE, .Net, LAMP, whatever). The new version 2.5 of Gravey now runs on several browsers (including Safari on the iPad) without requiring any particular client-side technology (e.g. jQuery, Prototype, whatever).</span></blockquote></div>Because it was back in 2005, when I was learning DHTML/OO-JavaScript/AJAX/CSS/REST on the fly, while building Gravey for use in several internal applications for a top-5-in-the-USA bank, and because their requirements only mandated (and their schedule only allowed) Internet Explorer 5.5 as the target browser, Gravey v1.0/v2.0 required IE5+, and were only tested on IE5/IE6 in Win2K/WinXP.<br />
<br />
Since Gravey is built in <a href="http://www.stevenblack.com/PTN-Layers.html"> layers</a>, I had originally intended to merely retrofit the bottom layer to use jQuery to make short work of cross-browser compatibility. However, I immediately encountered enough problems with jQuery that I was required to really learn the issues anyway, and so I ultimately fixed all of the problems in Gravey directly, and as a result, it still has no dependence on any other frameworks.<br />
<br />
<div style="color: #20124d; text-align: center;"><span style="font-size: large;">•</span><span style="font-size: large;">•</span><span style="font-size: large;">• AJAX / XML / XSL Issues </span><span style="font-size: large;">•</span><span style="font-size: large;">•</span><span style="font-size: large;">•</span></div><br />
<b>Issue: jQuery doesn't cover in-browser XSL processing</b><br />
Gravey and its example apps use in-browser processing of the XML returned from AJAX calls via XSL (also loaded from the server). It turns out that the XSL processing API is browser-specific, and because jQuery didn't handle it, I was going to have to learn how to fix it directly anyway...<br />
<br />
<b>Issue: IE doesn't do XSL processing like everyone else</b><br />
In order to support older IE browsers, the existing Gravey code that uses ActiveX is required, but other browsers need to use the standard DOM APIs.<br />
<ul><li>IE really wants XSL files to be loaded via <b><span style="font-family: "Courier New",Courier,monospace;">Msxml2.DOMDocument</span></b> even though XML files can be loaded via <b style="font-family: "Courier New",Courier,monospace;">Msxml2.XMLHTTP</b>. So, once the XML DOM has been loaded via AJAX, the IE XSL processing looks like...</li>
</ul><div style="color: #274e13; font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><b> var xmlDom = </b><b>XHR.responseXML;</b></span></div><div style="color: #274e13; font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><b> var xslDom = new ActiveXObject("Msxml2.DOMDocument");<br />
xslDom.async = false;<br />
xslDom.load( xslURL );<br />
if (xslDom.parseError.errorCode != 0)<br />
alert("Error loading["+xslURL+"]:" + xmlDom.parseError.reason);</b></span></div><div style="color: #274e13; font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><b> var resultStr = xmlDom.transformNode( xslDom );</b></span></div><ul><li>The other browsers accomplish this via the standard API...<br />
</li>
</ul><div style="color: #274e13; font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><b> var xmlDom = </b><b>XHR1.responseXML;</b></span><br />
<div style="color: #274e13; font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><b> var xslDom = </b><b>XHR2.responseXML;</b></span></div></div><div style="color: #274e13; font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><b> var xslProc = new XSLTProcessor();<br />
xslProc.importStylesheet( xslDOM );<br />
var resultStr = </b></span><b><span style="font-family: Times,"Times New Roman",serif;">xslProc.transformToDocument( xmlDOM ).documentElement.textContent;</span></b></div><ul><li>BTW, when I used an XMLSerializer to generate the result string in the above code, it gave me quotes around the result, so using the <b><span style="font-family: "Courier New",Courier,monospace; font-size: small;">.textContent</span></b> was simpler and did not include extraneous quotes.<br />
</li>
<li>IE also requires the XML file to be loaded via <span style="font-size: small;"><b><span style="font-family: "Courier New",Courier,monospace;">Msxml2.DOMDocument</span></b></span> when the files are local. In other words, when the .html page is loaded from local disk via the "file::" protocol instead of via "http::" from a web server, IE fails attempting to load the xml unless it is via <b><span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;">Msxml2.DOMDocument</span>. </span></span></b>Otherwise, for local files, the AJAX callback will be given <b><span style="font-family: "Courier New",Courier,monospace;">readyState==4 </span></b>and <b><span style="font-family: "Courier New",Courier,monospace;">status==0</span></b>, instead of status==200. At this point in Firefox/others, the file has loaded ok, but in IE it will have failed. </li>
</ul><b>Issue: Some browsers can't handle <xsl:import></b><br />
While good ole IE6 can handle an XSL file including another one via the <b><xsl:import></b> directive, new browsers like Safari and Chrome can't. I never did find a reasonable fix, so I bit the bullet and just copied the imported XSL directly into the top level XSL file. Not pretty but it works. If I had a larger system to worry about, I would preprocess, on the server side, the XSL file to include the imports before sending it back to the browser's AJAX request.<br />
<br />
<b>Issue: Firefox doesn't call your AJAX callback on synchronous requests</b><br />
Parts of Gravey performed AJAX requests with async=false with no problem until Firefox came along. It turns out FF doesn't call your callback function like everyone else on synchronous requests. For a fix, I simply changed to async=true because I was already processing the responses via callback instead of inline code anyway! [ Back in 2005, I had thought that synchronous requests might be faster, or higher priority, than async requests, but experience has taught me otherwise.]<br />
<div style="text-align: center;"><br />
</div><div style="text-align: center;"><span style="font-size: large;"><span style="color: #20124d;">••• DOM Issues •••</span></span></div><div style="text-align: left;"><br />
</div><b>Issue: jQuery doesn't like funny characters in your element IDs.</b><br />
This problem I ran into immediately because Gravey uses all sorts of special characters (e.g. ".", "#", "_", ":", etc), and it took a while to track down a fix. By that time, I had taken to fixing Gravey directly. But there is a work-around...<br />
Given that ID="tar.foo.bar", replace the following...<br />
<span style="font-size: x-small;"><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"> <span style="font-size: small;">$(ID).</span></span></b></span><span style="font-size: small;">whatever...</span><br />
with...<br />
<span style="color: #274e13; font-size: x-small;"><b><span style="font-family: "Courier New",Courier,monospace;"> <span style="font-size: small;">$( jq(ID) ).</span></span></b></span><span style="font-size: small;">whatever...</span><br />
where...<br />
<div style="color: #274e13; font-family: "Courier New",Courier,monospace;"><b><span style="font-size: x-small;"> <span style="font-size: small;">function jq(ID){ return '#' + ID.replace(/(:|\.)/g,'\\$1'); }</span></span></b></div><br />
<div style="text-align: left;"></div><b>Issue: Only IE looks up Names as well as IDs in getElementById()</b><br />
Gravey originally created HMTL elements identified by the "name" attribute because it worked just fine in IE when doing <span style="font-size: small;"><b><span style="font-family: "Courier New",Courier,monospace;">document.getElementById("foo")</span></b></span>. Other browsers don't, SO, I changed all those .name references to .id references.<br />
<br />
<b>Issue: innerHTML doesn't equal what it was just set to</b><br />
Early on, I came across speculation that browser security might strip away inline JavaScript when setting the .innerHTML of some element. Being paranoid, I put in code to check if the .innerHTML I just set, was different than what I just set it to. To my surprise, it was quite often literally different, but not functionally different. In other words, the before and after strings did not match because the quotes might have been changed, the attributes might be in different orders, and the upper/lowercase of the tags might have been switched. I never caught browser security stripping off anything, but the .toString() of the innerHTML could be completely reworked compared to my original HTML string.<br />
<br />
<b>Issue: Saving data between page loads in window or navigator properties is no longer reliable</b><br />
In the olden days of IE6 on Win2K, one could create properties on the navigator object that would allow communications between page loads. With modern browsers this isn't reliable. Gravey used this ability to save a reference to data between the time an AJAX request was made and when the callback was later invoked on the reply event. Luckily, I was only doing this because I didn't understand JavaScript "closures" enough to use one instead. The Gravey 2.5 code uses a closure to save data in the callback function to be accessed when that function is later invoked on the reply event.<br />
<br />
If I really needed client-side storage of data in between page loads or between pages, I would hope to wait until the near future when HTML5 is supposed to have local storage to share fat data between pages. There is an <a href="http://www.javaworld.com/community/?q=node/6768">article here</a> that tests this new feature out on a the usual suspect browsers.<br />
<br />
<b>Issue: Some browsers change the placement of span and legend tags</b><br />
In tracking down all the event handling problems, I came across a bug in some browsers (e.g. Firefox/Safari/SeaMonkey, but not Chrome/IE) where I created a <legend> tag inside of a <span> tag (via setting innerHTML), but in Firefox (via Firebug) I could see that it put the legend outside and after the span! Luckily, I could live with the <span> being <i>inside</i> of the <legend>, and all the browsers seem to handle that ok.<br />
<br />
<b>Issue: IE8 changes behavior depending on where a page is served up from</b><br />
I was trying to use a simple trick to determine if the browser is IE (and which version of IE) via conditional compilation as shown <a href="http://www.quirksmode.org/css/condcom.html">here at quirksmode.org</a>. Unfortunately, IE8 on WinXP would compile the comments and define the flags when the page was loaded from my test server on my LAN. The exact same code would NOT compile when served up from my Internet web site. Go figure. I tried adding a DOCTYPE to invoke quirks mode (which I had not specified before), but that made no difference. I wound up using the code below to distinguish between the cases that I needed to determine: pre-IE7, IE-in-general, IE-style-AJAX, Firefox-style-AJAX.<br />
In the home web page...<br />
<b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"> <!--[if lte IE 6]></span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> <script type="text/javascript"></span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> //NOTE: THIS LOOKS COMMENTED OUT BUT IT IS ACTIVE IN IE !!!</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> var Pre7IE = true;</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> </script></span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> <![endif]--></span></b><br />
In the javascript...<br />
<b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"> function IE_Pre7()<span style="font-family: "Courier New",Courier,monospace;">{ return <span style="font-family: Times,"Times New Roman",serif;">(typeof(Pre7IE)=="undefined") ? false : Pre7IE;</span> }</span></span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> function FF_AJAX()<span style="font-family: "Courier New",Courier,monospace;">{ return <span style="font-family: Times,"Times New Roman",serif;">document.implementation</span></span></span></b><b style="color: #274e13; font-family: "Courier New",Courier,monospace;"> </b><br />
<b style="color: #274e13; font-family: "Courier New",Courier,monospace;"> </b><b style="color: #274e13; font-family: "Courier New",Courier,monospace;"> </b><b style="color: #274e13; font-family: "Courier New",Courier,monospace;"> </b><b style="color: #274e13; font-family: "Courier New",Courier,monospace;"> </b><b style="color: #274e13; font-family: "Courier New",Courier,monospace;"> </b><b style="color: #274e13; font-family: "Courier New",Courier,monospace;"> </b><b style="color: #274e13; font-family: "Courier New",Courier,monospace;"> </b><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"> && <span style="font-family: Times,"Times New Roman",serif;">document.implementation.createDocument</span>; }</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> function IE_AJAX()<span style="font-family: "Courier New",Courier,monospace;">{ return IE_Pre7() || !FF_AJAX(); }</span></span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> function Is_IE ()<span style="font-family: "Courier New",Courier,monospace;">{ return '\v'=='v'; }</span></span></b><br />
<br />
<div style="color: #20124d; text-align: center;"><span style="font-size: large;">••• Display and Styling Issues </span><span style="font-size: large;">•••</span></div><div style="text-align: left;"><br />
<b>Issue: Handling of partial escape sequences is browser-specific </b><br />
A bug in Gravey went undetected because IE quietly ignored partial escape sequences like "&nb". The bug generated partial escape sequences in element text (e.g. <span style="color: #274e13; font-size: small;"><b><span style="font-family: "Courier New",Courier,monospace;"><div>foo&nb</div></span></b></span>) and browsers like Safari and IE quietly display "foo". Other browsers like Firefox and Chrome display "foo&nb". I fixed the bug so that only full sequences like "&nbsp;" would be generated.<br />
<br />
<b>Issue: Special character escape sequences are browser and OS-specific </b><br />
Originally, Gravey used special characters via the Microsoft "symbol" font, so I had a goal to replace them with standard HTML characters. <span style="font-size: small;">E.G. replace...</span><br />
<span style="font-size: small;"><span style="font-size: small;"><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"> '<font face="Symbol">&#101;</font>'</span></b></span></span><br />
<span style="font-size: small;">with... </span><br />
<span style="font-size: small;"><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"> "&epsilon;"</span></b></span><br />
<br />
The set of graphic characters like arrows, and bullets, and greek letters, etc can not be all rendered by all browsers. Unfortunately, the intuitive idea that if an older browser can render a character, its newer brethren would also, is alas not true. Most browsers, including IE6 on Win2000, can render the black star (<b>&#9734;</b>) and white star (<b>&#9733;</b>) characters, but IE8 on WinXP can't! Some characters can be displayed when given the hex charcode, but not the name (e.g. <b>&rArr;</b>). And some characters that you would think are part of a set are not all implemented together. E.G. Of the up/down/right/left arrow set (see <a href="http://www.alanwood.net/unicode/geometric_shapes.html">shapes</a>), IE6 can render the right arrow but not the down arrow.<br />
<br />
<b>Issue: Fieldset Legend rendering is browser-specific </b><br />
Given the same style settings, the Legends of Fieldsets render differently on different browsers. Gravey had used the attribute "text-align:center" which didn't do anything on IE, but it shifts the entire legend display to the center (instead of the left that I want) on non-IE browsers. I removed the attribute. Unfortunately, the "vertical-align: middle" attribute DOES do something I want in IE but not the other browsers. It was needed to get the gif images (being used for expanded/collapsed icons) to line up with the title text inside the legend box. After a lot of fiddling with transparent pixels around the icons and legend padding attributes, I gave up and switched to graphic arrow characters (ala Google results). Unfortunately, I ran into all of the special character problems listed earlier, and still had to specify a different set of characters (<a href="http://www.alanwood.net/demos/wingdings.html">wingdings</a>) for IE6 than specified for the other browsers.<br />
<br />
<b>Issue: CSS doesn't easily replace all HTML presentational attributes </b><br />
While the original Gravey used some external CSS, there was still a lot of inline style specs, and old-time HTML presentational markup and "spacer" gifs. I set out to replace them all with CSS, but since I was using IE specific attributes like cellspacing, cellpadding, bordercolordark and bordercolorlight it was not trivial. Sadly, some IE attributes like table "cellspacing" can't be replaced with CSS. Others like cellpadding, bordercolordark and bordercolorlight can but with great effort. Luckily, Gravey used a cellspacing and cellpadding of zero, some of which can be specified with "border-collapse:collapse". Also, the bordercolorlight/dark colors being used created an effect similar to { border-style: outset }.<br />
<br />
<b>Issue: Background color gradients are browser-specific </b><br />
The gradient coloring Gravey used was IE specific. Other browser specific style settings had to be added. E.G. the following...<br />
<b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"> <span style="font-family: Times,"Times New Roman",serif;">body {</span></span></b></div><div style="text-align: left;"><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"></span><span style="font-family: "Courier New",Courier,monospace;"> <span style="font-family: Times,"Times New Roman",serif;">filter:progid:DXImageTransform.Microsoft.Gradient </span></span><br style="font-family: Times,"Times New Roman",serif;" /><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Times,"Times New Roman",serif;"> </span></span></b><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"> </span></b><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"> </span></b><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"> </span></b><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Times,"Times New Roman",serif;">(GradientType=0,StartColorStr='#f8f8f8',EndColorStr='#802222');</span> </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> <span style="font-family: Times,"Times New Roman",serif;">}</span></span></b></div><div style="text-align: left;">gets replaced with...<b style="color: #274e13;"><span style="font-size: x-small;"><br style="font-family: "Courier New",Courier,monospace;" /></span></b><b><span style="color: #274e13; font-family: "Courier New",Courier,monospace;"> <span style="font-family: Times,"Times New Roman",serif;">body {</span></span><br style="color: #274e13; font-family: "Courier New",Courier,monospace;" /><span style="color: #274e13; font-family: "Courier New",Courier,monospace;"> <span style="font-family: Times,"Times New Roman",serif;"> background: -webkit-gradient(linear, left top, left bottom, from(#f8f8f8), to(#802222));</span></span><br style="color: #274e13; font-family: "Courier New",Courier,monospace;" /><span style="color: #274e13; font-family: "Courier New",Courier,monospace;"> <span style="font-family: Times,"Times New Roman",serif;">background: -moz-linear-gradient(top, #f8f8f8, #802222) no-repeat;</span></span><br style="color: #274e13; font-family: "Courier New",Courier,monospace;" /><span style="color: #274e13; font-family: "Courier New",Courier,monospace;"> <span style="font-family: Times,"Times New Roman",serif;">filter:progid:DXImageTransform.Microsoft.Gradient </span></span><br style="color: #274e13; font-family: Times,"Times New Roman",serif;" /><span style="color: #274e13; font-family: "Courier New",Courier,monospace;"><span style="font-family: Times,"Times New Roman",serif;"> </span></span></b><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"> </span></b><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"> </span></b><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"> </span></b><b><span style="color: #274e13; font-family: "Courier New",Courier,monospace;"><span style="font-family: Times,"Times New Roman",serif;">(GradientType=0,StartColorStr='#f8f8f8',EndColorStr='#802222');</span> </span><br style="color: #274e13; font-family: "Courier New",Courier,monospace;" /><span style="color: #274e13; font-family: "Courier New",Courier,monospace;"> <span style="font-family: Times,"Times New Roman",serif;">}</span></span></b></div><div style="text-align: left;"><br />
<b>Issue: Tooltip rendering is browser-specific </b><br />
Tooltips are used extensively by Gravey, and for images it used the .alt text. It turns out that non-IE browsers don't render image <b>.alt</b> text, only <b>.title</b> text, so I changed all the alts to titles.</div><div style="text-align: left;"></div><div style="text-align: left;">There is also a known bug in Firefox where tooltips are not displayed on disabled buttons. As a workaround, the "readOnly" attribute can be used, however, when setting the readonly attribute rather than the disabled attribute, I could never get the CSS styling to kick in, even though I tried the selectors ".fooClass[readonly]" and "input[readonly]" and "input:read-only". So, I wound up dynamically setting (via JavaScript) the style for both readonly/not-readonly <b><i>explicitly</i></b> via classnames (ala .foo and .fooRO).<br />
<br />
<b>Issue: Cursor styles are browser-specific </b><br />
Gravey extensively used the "hand" and "not-allowed" cursor shapes which turn out to be IE-specific. The "hand" cursor can be changed to the standard "pointer" to get the same effect. But while many browsers implement the non-standard "not-allowed", Firefox on the Mac does not and has no real equivalent. Because there is a visual difference between the default cursor and the "pointer" on Firefox, I live with it as is.<br />
<br />
<b>Issue: Disabled button styles are browser-specific </b><br />
Gravey expects the rendering of GUI widgets to reflect their enabled/disabled status. Some browsers stop showing disabled buttons differently if their foreground color is set to black (as Gravey was doing and IE not caring). I was able to simply stop setting the foreground color since black was the default color anyway).<br />
<br />
<b>Issue: Chrome displays popup menu items in a strange order </b><br />
There is a strange (but known?) bug in Chrome where it displays items in a pop-up menu in a weird order that is different than the order shown in all the other browsers. I give up and document it as a known Chrome bug.<br />
<br />
<b>Issue: Cross-browser manipulation of element visibility is complicated </b><br />
Gravey originally got away with making chunks of HTML visible or not via...<br />
<br />
</div><div style="text-align: left;"></div><div style="color: #274e13; font-family: "Courier New",Courier,monospace; text-align: left;"><b> e.style.visibility = visibleFlag ? "visible" : "hidden";<br />
e.style.position = visibleFlag ? "relative" : "absolute";<br />
e.style.display = visibleFlag ? "inline" : "none";</b></div><div style="color: #274e13; font-family: "Courier New",Courier,monospace; text-align: left;"></div><div style="text-align: left;"><br />
However, to do this with other browsers the original visible state needs to be saved and reused later when restoring visibility. Code like the following is needed...<br />
</div><div style="text-align: left;"></div><div style="color: #274e13; font-family: "Courier New",Courier,monospace; text-align: left;"><b> if (visibleFlag) showElem(e); else hideElem(e);<br />
<br />
function hideElem( e )<br />
{<br />
if ( e.style.display === "none" ) return;<br />
e.oldDisplay = e.style.display;<br />
e.style.display = "none";<br />
e.style.visibility = "hidden";<br />
}<br />
function showElem( e )<br />
{<br />
e.style.visibility = "visible";<br />
if ( e.oldDisplay ) e.style.display = e.oldDisplay;<br />
else if ( e.style.display==="none") e.style.display = "";<br />
}</b></div><div style="text-align: left;"><br />
<div style="text-align: left;">Also, some browsers have a problem unless the HTML is rendered visible before making it hidden.</div></div><div style="text-align: left;"><br />
<b>Issue: Pop-up windows are no longer reliable </b><br />
In the early IE5 days, the cursor would not reliably change to the "please wait" icon when told to, so as a workaround, Gravey used a little "please wait" popup window that was launched and later killed. Unfortunately, modern browsers suppress popup windows, so, that code won't reliably work anymore. If the cursor STILL can not be reliably set in this modern age, then a replacement "please wait" popup window would have to be done via fancy CSS floating DIVs as I've seen elsewhere.</div><div style="text-align: left;"></div><div style="text-align: left;"></div><div style="text-align: left;"></div><div style="text-align: center;"><div style="text-align: center;"><br />
</div><div style="text-align: center;"><span style="color: #20124d; font-size: large;">••• Event Handling Issues </span><span style="color: #20124d; font-size: large;">•••</span><b> </b></div><div style="text-align: left;"><br />
</div><div style="text-align: left;"><b>Issue: Event object location is</b><b> browser-specific </b></div><div style="text-align: left;">In IE, the event object may be accessed in event handler functions by the global variable "event". Most other browsers pass the event object as a parameter to the event handler function and it is not available as a global variable.</div><div style="text-align: left;"><ul><li>Thus, code like the following...<b><br />
<span style="color: #274e13; font-family: "Courier New",Courier,monospace;"><body onKeyPress="onKey()"><br />
...<br />
function onKey(){ alert(event...); }</span></b></li>
</ul></div><div style="text-align: left;"><b style="color: #274e13; font-family: "Courier New",Courier,monospace;"> </b>must be changed to...<b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"> </span></b></div><div style="color: #274e13; font-family: "Courier New",Courier,monospace; text-align: left;"><b> <</b><b>script></b><b> </b></div><div style="color: #274e13; font-family: "Courier New",Courier,monospace; text-align: left;"><b> document.onkeypress = onKey;</b></div><div style="color: #274e13; font-family: "Courier New",Courier,monospace; text-align: left;"><b> </b><b>function onKey(e){ e = e || window.event; alert(e...); }</b></div><div style="color: #274e13; font-family: "Courier New",Courier,monospace; text-align: left;"><b> </b><b> </script></b> </div><div style="text-align: left;"><ul><li> Another consequence of event handlers being passed the event as a parameter is that the calling signature has to be changed when passing your own parameters to the event handler. Even if you don't care about the event arg itself, the other parameters need to be shifted down otherwise the formal parameter list won't match the actual parameter list. For example, Gravey generates new HTML elements by building a string and setting the innerHTML.<br />
So, change code like this...<br />
<b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"> e.innerHTML = "</span></b><b style="color: #274e13; font-family: Times,"Times New Roman",serif;"><</b><b style="color: #274e13; font-family: Times,"Times New Roman",serif;">select onchange='return foo("+myArg+")'</b><b style="color: #274e13; font-family: Times,"Times New Roman",serif;">></b><b style="color: #274e13; font-family: "Courier New",Courier,monospace;"><span style="font-family: Times,"Times New Roman",serif;">"</span>;<br />
...<br />
function foo( myArg ){ alert(myArg); }</b><br />
to this...<br />
<b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"> e.innerHTML = "</span></b><b style="color: #274e13; font-family: Times,"Times New Roman",serif;"><</b><b style="color: #274e13; font-family: Times,"Times New Roman",serif;">select onchange='return foo(event,"+myArg+")'</b><b style="color: #274e13; font-family: Times,"Times New Roman",serif;">></b><b style="color: #274e13; font-family: "Courier New",Courier,monospace;"><span style="font-family: Times,"Times New Roman",serif;">"</span>;<br />
...<br />
function foo( e, myArg )</b><b style="color: #274e13; font-family: "Courier New",Courier,monospace;">{ alert(myArg); }</b></li>
</ul></div><div style="text-align: left;"><b>Issue: Not all body tag event handlers are attached to the "window" object</b></div><b> </b><br />
<div style="text-align: left;"><div style="text-align: left;">When moving the specification of event handlers from inline in the <body> tag to being set in JavaScript, one might think that they all go on the window event, but not so. Thus, this tag...</div><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"> <span style="font-family: Times,"Times New Roman",serif;"><body onKeyPress="onKey()" onBeforeUnload="onBUL()" onLoad="onLoad()"></span></span></b><br />
<div style="text-align: left;">gets replaced with...</div><div style="text-align: left;"><div style="color: #274e13; font-family: "Courier New",Courier,monospace; text-align: left;"><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"> <</span></b><b>script</b><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;">></span></b><br />
<b> document.onkeypress = onKey;</b></div><div style="color: #274e13; font-family: "Courier New",Courier,monospace; text-align: left;"><b> window.onbeforeunload = onBUL;<br />
window.onload = onLoad;</b></div><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"> <</span></b><b><span style="color: #274e13; font-family: "Courier New",Courier,monospace;">/script</span></b><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;">></span></b><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"></span></b> <br />
<div style="text-align: left;"><br />
</div><div style="text-align: left;"><b>Issue: Keyboard event objects are browser-specific</b><b> </b></div><div style="text-align: left;">In keyboard-related events, some browsers supply the key pressed via the event's "keyCode" attribute, whereas others via the "which" attribute.</div><div style="text-align: left;"><ul><li>Thus code that reads keys...<b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"><br />
</span></b><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"> </span></b><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;">function onKeyPress(){ alert( event.keyCode ); }</span></b><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"></span></b><br />
must be changed to...<br />
<b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"></span></b><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"></span></b><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"> </span></b><b style="color: #274e13; font-family: "Courier New",Courier,monospace;">function onKeyPress( e )</b><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;">{<br />
</span><span style="font-family: "Courier New",Courier,monospace;"> e = e || window.event;<br />
var code = e.keyCode || e.which;<br />
</span></b><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;">alert( code );</span></b><b style="color: #274e13; font-family: "Courier New",Courier,monospace;"><br />
}</b><b style="color: #274e13; font-family: "Courier New",Courier,monospace;"></b><b style="color: #274e13; font-family: "Courier New",Courier,monospace;"><br />
</b></li>
<li>Thus code that sets keys (like keystroke filtering)...<b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"><br />
</span></b><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"> event.keyCode = char;</span></b><br />
must be changed to...<br />
<b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"></span></b><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"></span></b><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"> </span></b><b style="color: #274e13; font-family: "Courier New",Courier,monospace;">e = e || window.event;</b><br />
<b style="color: #274e13; font-family: "Courier New",Courier,monospace;"> if (e.keyCode) e.keyCode = char; else e.which = char;<br />
</b></li>
<li>Secondarily, some browsers supply a code that directly reflects the use of control keys, etc, whereas others supply a code for the basic key and require also looking at other attributes that flag the use of any modifier keys. Thus, to detect a <b>control-z</b> key, the following...<b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"><br />
function onKeyPress(){ if ( event.keyCode==26 ) ... }</span></b><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"></span></b><br />
must be changed to...<br />
<b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"></span></b><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"></span></b><b style="color: #274e13; font-family: "Courier New",Courier,monospace;"> </b><b style="color: #274e13; font-family: "Courier New",Courier,monospace;">function onKeyPress( e )</b><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;">{<br />
</span><span style="font-family: "Courier New",Courier,monospace;"> e = e || window.event;<br />
var code = e.keyCode || e.which;<br />
if ( code==26 || code==122 && e.ctrlKey ) ...</span></b><b style="color: #274e13; font-family: "Courier New",Courier,monospace;"><br />
} </b><span style="font-family: Times,"Times New Roman",serif;"></span></li>
</ul></div><div style="text-align: left;">Even then, <b>Chrome on the Mac will not generate an event at all when control-y is pressed</b>, even though control-z works fine. So, after not finding any info about this Chrome quirk, I gave up and documented the use of <i>shift</i>-control-y as a workaround.</div><div style="text-align: left;"><br />
<b>Issue: Modifier keys on mouse click are browser-specific </b><br />
Gravey and its example apps use "control-clicks" (ie. holding down the control key while clicking) in several places. Unfortunately, on the Mac, control-click activates the context menu (ala back-click). So, for it, allow the "command" key to be used as an alternate. Unfortunately, the DOM3 standard indicator for this key is the <b><span style="font-family: "Courier New",Courier,monospace;">event.metaKey</span></b> flag and Internet Exploder does not even implement that attribute, so references to it will be <b><span style="font-family: "Courier New",Courier,monospace;">undefined</span></b>. So, this code...</div><div style="text-align: left;"><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"> function onClick(){</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> </span><span style="font-family: "Courier New",Courier,monospace;">var specialFlag = event.ctrlKey;</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> }</span></b> </div><div style="text-align: left;">has to be changed to...</div><div style="text-align: left;"><b style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"> function onClick(e){</span><br style="font-family: "Courier New",Courier,monospace;" /> <span style="font-family: "Courier New",Courier,monospace;"> e = e || window.event;</span><br style="font-family: "Courier New",Courier,monospace;" /> <span style="font-family: "Courier New",Courier,monospace;"> var cmdKey = (typeof e.metaKey=="undefined") ? false : e.metaKey;</span><br style="font-family: "Courier New",Courier,monospace;" /> <span style="font-family: "Courier New",Courier,monospace;"> var specialFlag = e.ctrlKey || cmdKey;</span><br style="font-family: "Courier New",Courier,monospace;" /> <span style="font-family: "Courier New",Courier,monospace;"> }</span></b> </div><div style="text-align: left;"><br />
<b>Issue: Some "are you sure you want to leave?" techniques are browser-specific </b><br />
In order to ask if the user really wants to leave the web page, only some browsers recognize setting the event object's "returnValue" attribute to the desired message. However all browsers tested (except for a known bug on the iPad) will recognize returning the string message from the onbeforeunload event handler. Thus, code like this...</div><div style="color: #274e13; font-family: "Courier New",Courier,monospace; text-align: left;"><b> function onBeforeUnLoad(){<br />
if (unsavedData) event.returnValue = "Are you sure?";<br />
}</b></div><div style="text-align: left;">gets replaced with code like this...</div><div style="color: #274e13; font-family: "Courier New",Courier,monospace; text-align: left;"><b> function onBeforeUnLoad(){</b></div><div style="color: #274e13; font-family: "Courier New",Courier,monospace; text-align: left;"><b> if (unsavedData)</b><b> return "Are you sure?";</b></div><div style="color: #274e13; font-family: "Courier New",Courier,monospace; text-align: left;"><b></b><b> }</b></div><div style="text-align: left;"><br />
<b>Issue: Getting a reference to the event's target element is browser-specific</b></div><div style="text-align: left;">For example, to blur the element that is the target of a keyboard event, the original code...</div><div style="color: #274e13; font-family: "Courier New",Courier,monospace; text-align: left;"><b> event.srcElement.blur();</b></div><div style="text-align: left;">has to be changed to (according to <a href="http://www.quirksmode.org/js/events_properties.html">here in quirksmode.org</a>)...</div><div style="color: #274e13; font-family: "Courier New",Courier,monospace; text-align: left;"><b> var targ = e.target || e.srcElement;<br />
if (targ.nodeType == 3) // defeat Safari bug<br />
targ = targ.parentNode;<br />
targ.blur();</b></div><div style="text-align: left;"><br />
</div><div style="text-align: left;"><b>Issue: Focus and Blur and Change events are browser-specific</b><br />
There is a <a href="http://www.quirksmode.org/dom/events/blurfocus.html">known problem</a>: "Safari and Chrome do not fire focus/blur events when the user uses the mouse to access checkboxes, radios or buttons. Text fields, textareas and select boxes work correctly."<br />
Hmmm...this is difficult because the entire architecture of Gravey is based on blur events triggering datamodel updates. Lets see if I can fake it for the offending browsers with the change event (but only the offending ones since onchange is apparently buggy on IE). Actually because of what I am doing on blur is idempotent, I can just make both onchange and onblur invoke the same event handler (and also because of idempotency I dont have to worry about the unpredictable ordering of blur and change events in different browsers).</div><div style="text-align: left;"><br />
</div></div></div><div style="text-align: left;"></div><div style="text-align: left;"></div></div><div style="text-align: left;"></div><div style="text-align: left;"></div>Bruce Wallacehttp://www.blogger.com/profile/01185353603127616202noreply@blogger.com0tag:blogger.com,1999:blog-6921426717100761060.post-89924349346170027502010-08-28T16:52:00.004-04:002011-05-01T13:27:47.808-04:00Neural Nets, Vagueness, and Mob Behavior<i>In response to the following question on a philosophy discussion board, I replied with the short essay below and reproduce it here. </i><br />
<blockquote><span style="color: #990000;">"It was then that it became apparent to me that these dilemmas – and indeed, many others – are manifestations of a more general problem that affects certain kinds of decision-making. They are all instances of the so-called ‘Sorites’ problem, or ‘the problem of the heap’. The problem is this: if you have a heap of pebbles, and you start removing pebbles one at a time, exactly at what point does the heap cease to be a heap?"</span></blockquote>VAGUE CONCEPTS<br />
This leads to the entire philosophy of "vagueness". i.e. are there yes/no questions that don't have a yes/no answer? Are some things like baldness vague in essence, or, is our knowledge merely incomplete? e.g. we don't know the exact number of hairs on your head, and/or, we don't know/agree on the exact number of hairs that constitutes the "bald" / "not bald" boundary?<br />
<br />
NEURAL NETS<br />
My personal conclusion is that there ARE many vague concepts that we have created that are tied to the way our brains learn patterns (and, as a side effect, how we put things into categories). In contrast to rational thought (i.e. being able to demonstrate logically step by step our conclusions), we "perceive" (ala Locke/Hume/Kant) many things without being able to really explain how we did it.<br />
<br />
In Artificial Intelligence, there are "neural network" computer programs that simulate this brain-neuron style of learning. They are the programs that learn how to recognize all different variations of a hand-written letter "A" for example. They do not accumulate a list of shapes that are definitely (or are definitely not) an "A", but rather develop a "feel" for "A"-ness with very vague boundaries. They (like our brains) grade a letter as being more or less A-like. It turns out that this technique works much better than attempting to make rational true/false rules to decide. This is the situation that motivates "fuzzy logic" where instead of just true or false answers (encoded as 1 or 0), one can have any number in-between, e.g. 0.38742 (i.e. 38.7% likely to be true).<br />
<br />
WISDOM OF THE CROWD?<br />
Because each person has their own individually-trained "neural net" for a particular perception (e.g. baldness, redness, how many beans are in that jar?), we each come up with a different answer when asked about it. However, the answers do cluster (in a bell-curve-like fashion) around the correct answer for things like "how many beans". This is <a href="http://en.wikipedia.org/wiki/The_Wisdom_of_Crowds">what led Galton to originally think that there was "wisdom in the crowd"</a>. This idea has been hailed as one of the inspirations for the new World Wide Web (aka Web 2.0). The old idea was that McDonalds should ask you if "you want fries with that?" to spur sales. The new Web 2.0 idea is that Amazon should ask you if you want this OTHER book based on what other people bought when they bought the book you are about to buy. I.E. the crowd of Amazon customers know what to ask you better than Amazon itself.<br />
<br />
The problem is that there are many failures of "crowd wisdom" (as mentioned in that Wikipedia page in the link above). My conclusion is that most people advocating crowd wisdom have not realized that it is limited to "perceptions". Many Web 2.0 sites are asking the crowd instead about rational judgments, expecting them to come up with a better answer than individuals. The idea of democracy (i.e. giving you the right to vote) has been confused with voting guaranteeing the best answer, no matter the question. In fact, Kierkegaard wrote "<a href="http://oregonstate.edu/instruct/phl201/modules/Philosophers/Kierkegaard/kierkegaard_the_crowd_is_untruth.html">Against The Crowd</a>" almost 200 years ago where he recognized that individuals act like witnesses to an event, whereas people speaking to (or as a part of) a crowd, speak what we would now call "<a href="http://en.wikipedia.org/wiki/Bullshit#Distinguished_from_lying">bullshit</a>" because they are self-consciously part of a crowd. We can see this in the different results of an election primary (a collection of individuals in private voting booths) versus Caucuses where people vote in front of each other. So, Web 2.0 sites (Facebook, MySpace, blog Tag Clouds, etc) that allow people to see the effect on other people of what they are saying, are chronicling mob mentality rather than collecting reliable witness reports.<br />
<br />
BTW, I have written several blog posts related to vagueness, for example:<br />
<a href="http://existentialprogramming.blogspot.com/2010/03/model-entities-not-just-their-parts.html">http://existentialprogramming.blogspot.com/2010/03/model-entities-not-just-their-parts.html</a>Bruce Wallacehttp://www.blogger.com/profile/01185353603127616202noreply@blogger.com0tag:blogger.com,1999:blog-6921426717100761060.post-69716113268584829702010-06-09T15:41:00.000-04:002010-12-28T18:54:46.316-05:00Fuzzy Unit Testing, Performance Unit TestingIn reading Philosophy 101, about Truth with a capital "T", and the non-traditional logics that use new notions of truth, we of course arrive at Fuzzy Logic with its departure from simple binary true/false values, and embrace of an arbitrarily wide range of values in between.<br />
<br />
Contemplating this gave me a small AHA moment: Unit Testing is an area where there is an implicit assumption that "Test Passes" has either a true or false value. How about Fuzzy Unit Testing where there is some numeric value in the 0...1 range which reports a degree of pass/fail-ness? i.e. a <i>percentage pass/fail</i> for each test. For example, testing algorithms that predict something could be given a percentage pass/fail based on how well the prediction matched the actual value. Stock market predictions, bank customer credit default prediction, etc come to mind. This sort of testing of predictions about future defaults (<i>i.e. credit grades</i>) is just the sort of thing that the BASEL II accords are forcing banks to start doing.<br />
<br />
Another great idea (<i>if I do say so myself</i>) that I had a few years ago was the notion that there is extra meta-data that could/should be gathered as a part of running unit test suites; specifically, the performance characteristics of each test run. <b>The fact that a test still passes, but is 10 times slower than the previous test run, is a very important piece of information that we don't usually get.</b> Archiving and reporting on this meta-data about each test run can give very interesting metrics on how the code changes are improving/degrading performance on various application features/behavior over time. I can now see that this comparative performance data would be a form of fuzzy testing.<br />
<br />
<iframe align="left" frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm.amazon.com/e/cm?t=existenprogra-20&o=1&p=8&l=bpl&asins=1584885262&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="height: 245px; padding-right: 10px; padding-top: 5px; width: 131px;"></iframe><iframe align="left" frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm.amazon.com/e/cm?t=existenprogra-20&o=1&p=8&l=bpl&asins=B00186Z0L4&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="height: 245px; padding-right: 10px; padding-top: 5px; width: 131px;"></iframe><iframe align="left" frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm.amazon.com/e/cm?t=existenprogra-20&o=1&p=8&l=bpl&asins=1932394850&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="height: 245px; padding-right: 10px; padding-top: 5px; width: 131px;"></iframe><iframe align="left" frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm.amazon.com/e/cm?t=existenprogra-20&o=1&p=8&l=bpl&asins=1933988274&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="height: 245px; padding-right: 10px; padding-top: 5px; width: 131px;"></iframe><iframe align="left" frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm.amazon.com/e/cm?t=existenprogra-20&o=1&p=8&l=bpl&asins=0974514012&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="height: 245px; padding-right: 10px; padding-top: 5px; width: 131px;"><br></iframe>Bruce Wallacehttp://www.blogger.com/profile/01185353603127616202noreply@blogger.com0tag:blogger.com,1999:blog-6921426717100761060.post-17666711999770734242010-04-08T11:40:00.001-04:002011-05-01T13:20:32.091-04:00Too cool for school (or, history anyway)<span style="font-family: "Trebuchet MS",sans-serif;">There has been a flurry of articles and blog posts in reaction to Oracle's Jeet Kaul who, at EclipseCon 2010, said "We need to get the younger generation interested and excited [about Java] just like I was" and "I would like to see people with piercings doing Java programming". There have been some exchanges over "cool" languages and whether "cool" is a good thing. I contributed the following 2-cents on a JavaWorld discussion...</span><br />
<br />
<b>"Cool" led to most computer security problems in the world today</b><br />
<br />
I have been around long enough to have seen several generations of "cool" languages overtaking established ones. Unfortunately, the new language was sometimes a big step backward.<br />
<br />
A case in point was when C swept the world, replacing the line of languages like <a href="http://en.wikipedia.org/wiki/Pascal_%28programming_language%29">Pascal</a> and the stillborn <a href="http://en.wikipedia.org/wiki/Ada_%28programming_language%29">Ada</a>. Because Unix was starting to get out of the lab and into microcomputers, <a href="http://en.wikipedia.org/wiki/C_%28programming_language%29">C</a> gained visibility.<br />
<br />
BIG PROBLEM: Pascal (and others) could tell how big an array was, and hence could stop execution when someone attempted to write past the end. C was unable to do this (and because of the language design there was no way to "fix it" in the compiler). This is the <a href="http://www.windowsecurity.com/articles/Analysis_of_Buffer_Overflow_Attacks.html">security hole</a> that is at the root of all computer virus exploits.<br />
<br />
If developers chose new languages (or <a href="http://www.youtube.com/watch?v=6TWhtCavxsQ">systems</a>) based on technical merit rather than "cool", we would be decades ahead of where we are today.<br />
<br />
As a side note/rant: I have always thought that "cool" was effected by political zeitgeist. It seems more than coincidence that European/Govt-regulated/strong-typing languages (e.g. Pascal/Ada) were replaced by get-the-compiler-regulation-off-the-programmers-back ethic of C at the same time Ronald Reagan was selling everyone on the same notion about government. Let the programmer do dangerous things (like <a href="http://en.wikipedia.org/wiki/C_%28programming_language%29#Array-pointer_interchangeability">convert an array into a pointer</a>) because he knows better...(sounds like let the bankers do whatever they want because they know better than the regulators who after all only learn from past mistakes...wimps!)Bruce Wallacehttp://www.blogger.com/profile/01185353603127616202noreply@blogger.com0tag:blogger.com,1999:blog-6921426717100761060.post-75107955787825286882010-03-30T17:45:00.001-04:002010-12-28T18:54:46.317-05:00Moore's Paradox. I'm just saying!The popular phrase "I'm just saying" has been around long enough for most people to have heard it, but not long enough for it to be well-documented as to where it originated. I heard a great stand up comic bit about it in the 1980's by Paul Reiser. There are several blog sites that muse over its origin and solicit theories:<br />
<ul><li><a href="http://prestwickhouse.blogspot.com/2010/01/plain-english-im-just-sayin.html">http://prestwickhouse.blogspot.com/2010/01/plain-english-im-just-sayin.html</a></li>
<li><a href="http://painintheenglish.com/?p=958">http://painintheenglish.com/?p=958</a></li>
<li><a href="http://www.urbandictionary.com/define.php?term=i%27m%20just%20sayin%27">http://www.urbandictionary.com/define.php?term=i%27m%20just%20sayin%27</a></li>
</ul>It turns out that the most common definition of the phrase exhibits a logical paradox from Philosophy. The book "this sentence is false" is a collection of philosophical paradoxes, and it describes Moore's Paradox (as developed by <a href="http://en.wikipedia.org/wiki/G._E._Moore">G.E. Moore</a>). I summarize it as follows: <br />
<blockquote>Normally, everything that can be said about the world can be said by anyone. I can say the moon is made of green cheese, and you can say it. The state of the world described by me can equally be described by you with no logical paradox...EXCEPT... I can say that the moon is made of green cheese, and I can say that you do not believe that the moon is made of green cheese, but YOU can not say the same thing. I.E. you can not say that X is true and at the same time say that you do not believe that X is true. Note that you are not saying that you could be wrong in your belief, you are be saying that you believe both that X is, and is not, true at the same time. A logical contradiction.</blockquote>However, whenever you use the phrase "I'm just saying!", you are in effect performing Moore's paradox.Bruce Wallacehttp://www.blogger.com/profile/01185353603127616202noreply@blogger.com0tag:blogger.com,1999:blog-6921426717100761060.post-1477227660532746812008-12-18T14:21:00.009-05:002010-12-28T18:54:46.318-05:00Where Am I?<span class="Apple-style-span" style="font-size:small;">In </span><a href="http://www.amazon.com/Am-Strange-Loop-Douglas-Hofstadter/dp/0465030785/"><span class="Apple-style-span" style="font-size:small;">I am a Strange Loop</span></a><span class="Apple-style-span" style="font-size: x-small;">[1]</span><span class="Apple-style-span" style="font-size:small;">, Doug Hofstadter ponders where one's "self" is located while being mentally absorbed by a situation that is located in a different place than one's body is currently residing. A simple example being that of reading Jane Austin while sitting in a chair. Another example being remote-controlling a robot on the moon. He asks the question "Where Am *I*" (where "I" is his shorthand for soul/self/consciousness).</span><div><span class="Apple-style-span" style="font-size:small;"><br /></span></div><div><span class="Apple-style-span" style="font-size:small;">It reminded me of my very first days exploring the World Wide Web in 1994. I explained to my family, as I gave them a guided tour of my new toy "Netscape", that we could "visit" places all around the world! Look, here we go to the South Pole</span><span class="Apple-style-span" style="font-size: x-small;">[2]</span><span class="Apple-style-span" style="font-size:small;"> or Australia</span><span class="Apple-style-span" style="font-size: x-small;">[3]</span><span class="Apple-style-span" style="font-size:small;">! Because in those early days, the web server and the content were actually physically in those places, and because the browser was hardly more than a remote terminal program, it really was like remote logging in to computers around the world, which felt very much like being there. That made switching from one site to another feel like teleporting instantly from one continent to another.</span></div><div><span class="Apple-style-span" style="font-size:small;"><br /></span></div><div><span class="Apple-style-span" style="font-size:small;">These days, the content about a place, versus the server serving the content, versus the location of the many cached copies (e.g. Akamai), and so forth have blurred "where am I" so much as to be meaningless and not even contemplated anymore. But in the early days, there was a real sense of "I am in Antarctica now!".</span></div><div><span class="Apple-style-span" style="font-size:small;"><br /></span></div><div><div><span class="Apple-style-span" style="font-size:small;">[1] "I am a Strange Loop",2007, Hofstadter, Basic Books<br /></span></div><div><span class="Apple-style-span" style=" white-space: pre; "><span class="Apple-style-span" style="font-style: italic;"><span class="Apple-style-span" style="font-size:small;">http://www.kinderwijs.nl/artikelen.asp?postid=18</span></span><span class="Apple-style-span" style="font-size:small;">8</span></span></div><div><span class="Apple-style-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size:small;"><br /></span></span></div><div><span class="Apple-style-span" style="font-size:small;">[2] http://www.usap.gov/videoClipsAndMaps/spwebcam.cfm<br /></span></div><div><span class="Apple-style-span" style="font-size:small;">[3] http://www.radioaustralia.net.au/</span></div><div><br /></div></div>Bruce Wallacehttp://www.blogger.com/profile/01185353603127616202noreply@blogger.com0tag:blogger.com,1999:blog-6921426717100761060.post-23136989309453283882008-01-05T11:21:00.001-05:002010-12-28T18:54:46.319-05:00Shakespeare is (not) Shakespeare<span style="color: rgb(0, 102, 0);font-size:100%;" ><span style="font-style: italic;">[Ed. Note. This is part two of a series found on "Existential Programming, the blog": "</span><a href="http://existentialprogramming.blogspot.com/search/label/rose"><span style="text-decoration: underline;"><span style="font-style: italic;">A Rose is a Rose is (not) a Rose</span></span></a><span style="font-style: italic;">"]</span></span><span style="font-size:100%;"><br /></span><span style="font-size:100%;"><span style="font-style: italic;"></span><br />In the early part of the book <a href="http://www.amazon.com/Stuff-Thought-Language-Window-Nature/dp/0670063274">The Stuff of Thought</a> by Steven Pinker, the problem of what-a-name-names, is explored with the example of Shakespeare. Pinker distinguishes between Shakespeare: the historical figure, and Shakespeare: the author of numerous plays like Hamlet </span><span style="font-size:100%;">attributed to Shakespeare</span><span style="font-size:100%;">.<br /><br />In my earlier post, it was somewhat easy to see that there were multiple aspects to Superman because each aspect already had its own name; Superman vs Clark Kent. With Shakespeare however, it is much more subtle because the different aspects have the same name: Shakespeare. Additionally, we are not used to thinking that they are different aspects that can be independent of each other, any more than we think of Cher-the-person and Cher-the-singer as being independent things. But, as discussed in the book, many people over the centuries have debated whether the author of Hamlet, et al was really Francis Bacon, Christopher Marlowe, Queen Elizabeth, etc.<br /><br />The interesting thing is that because Shakespeare is SO ingrained as the name of the playwright that even if Sir Francis were to be proven the author, the headline will be "Bacon is the REAL Shakespeare!" which is absurd because clearly, Shakespeare-the-historical-figure is the "real" Shakespeare. Changing the human associated with the author-of-Hamlet concept will not change the concept's name; it will remain "Shakespeare's Hamlet (written by Bacon)" and not "Bacon's Hamlet".<br /><br />So, when assigning ID#(s) to putatively single entities, flexibility should be built in to allow ad-hoc collections of attributes of any entity to be grouped and named and referenced separately. Otherwise, the system would not be able to represent the statement: <span style="color: rgb(153, 0, 0);">Shakespeare is not Shakespeare, Bacon is.</span><br /></span>Bruce Wallacehttp://www.blogger.com/profile/01185353603127616202noreply@blogger.com0tag:blogger.com,1999:blog-6921426717100761060.post-47411362285698872972007-12-22T13:45:00.002-05:002010-12-28T18:54:46.319-05:00Clark Kent is (not) Superman<span style="color: rgb(0, 102, 0);font-size:100%;" ><span style="font-style: italic;">[Ed. Note. This is part one of a series found on "Existential Programming, the blog": "</span><a href="http://existentialprogramming.blogspot.com/search/label/rose"><span style="text-decoration: underline;"><span style="font-style: italic;">A Rose is a Rose is (not) a Rose</span></span></a><span style="font-style: italic;">"]</span></span><span style="font-size:100%;"><br /></span><span style="font-size:100%;"><span style="font-style: italic;"><br />It delights me to find out that what I thought had been a particular nugget of wisdom, specific to building </span><a style="font-style: italic;" href="http://www.identitysystems.com/freebook.htm">Identity matching</a><span style="font-style: italic;"> computer systems, actually has a deep principle at work. W</span></span><span style="font-size:100%;"><span style="font-style: italic;">hile working on </span><a style="font-style: italic;" href="http://www.choicepoint.com/products/identity_matching.html">one of these systems</a>, </span><span style="font-size:100%;"><span style="font-style: italic;">I learned th</span></span><span style="font-size:100%;"><span style="font-style: italic;">e strategy of NOT merging all variations of an individual identity's name/address/phone/etc into a single canonical version</span><span style="font-style: italic;">. It turns out that the need to keep, and assign a unique key to, every variation of identity data (as opposed to only the "canonical" one) has deep roots in language itself...</span><br /><br />While reading the <a href="http://www.amazon.com/exec/obidos/ASIN/1594865132/">Intellectual Devotional</a> <span style="font-style: italic;">(which I highly recommend)</span>, I came across <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi07brknPwaMh_ZJZlP4txtTCi67FrYzx6jXIBd_-SXwpHVPhWwHO2elzlwGLBTuP2_ygJ-HQgXcTuZgBOrdQNJSD5gTNCXuEuluk0Xu_hgZwXMfeCwrZwSv4b-P0KqrkmLyX-OhOP7424/s1600-h/clark.jpg">its page about "Philosophy of Language"</a> and it had an immediate resonance with a project at my current client. The page describes the "<a href="http://en.wikipedia.org/wiki/Philosophy_of_language#References">problem of reference</a>" where ideas about what a name "means" have been debated and changed over time.<br /><br />One theory says that "names" don't have any meaning, in and of themselves, they merely refer to some </span><span style="font-style: italic;font-size:100%;" >thing </span><span style="font-size:100%;">that has meaning. Hence, Shakespeare's quote <span style="color: rgb(153, 0, 0);">"A rose by any other name would smell as sweet"</span> summarizes the position that the </span><span style="font-style: italic;font-size:100%;" >word </span><span style="font-size:100%;">"rose" is not meaningful, and could be exchanged with any other word that refers to the <span style="font-style: italic;">thing </span>"rose". That is why "gulaab" (the Urdu word for rose) can work just as well for speakers of Urdu.<br /><br />Another more modern theory though, says that names not only refer to some thing, they also carry the connotation of "in what sense" is the thing being referenced. The book illustrates the example of Superman and Clark Kent both being names for the same <span style="font-style: italic;">thing </span>(the being Superman), but they are not interchangeable. Clark Kent (mild mannered reporter) has a work address of the Daily Planet whereas Superman (superhero able to leap tall buildings) does not. It <span style="font-weight: bold;">matters</span> which name is used when talking about Superman.<br /><br />So, in the same way that Clark Kent and Superman both refer to different aspects of the same entity, and are thus not interchangeable, a computer system managing legal entity identity data can not translate name/address variations into a single entity ID# when those variations actually refer to different aspects of the entity. For example, if there is data that is specific to a particular store branch, that branch needs its own well-known ID# even though it is only a <span style="font-style: italic;">portion </span>of a single legal entity. Further, since legal entity names are not unique <span style="font-style: italic;">(I own two different corporations with the identical legal name)</span>, the entire name/address/phone/etc combination needs managing rather than separate "alternate name" lists. It is also not sufficient to support alternate name/address records merely as search aids that still ultimately result in the ID# of the entity-as-a-whole. Otherwise one would loose track of the fact that we were talking about Clark Kent, not Superman. </span>Bruce Wallacehttp://www.blogger.com/profile/01185353603127616202noreply@blogger.com0tag:blogger.com,1999:blog-6921426717100761060.post-24626272073825944222007-11-30T19:44:00.000-05:002010-12-28T18:54:46.320-05:00Odometer Game Redux<span style="font-size:100%;">Well, after 35 years of pondering what I thought was an abstract mathematical puzzle, my "<a href="http://polyglotinc.blogspot.com/2007/10/odometer-game.html">odometer game</a>" has found a real-world application!<br /><br />It turns out that my notion of "remarkable" numbers <span style="color: rgb(51, 51, 51);">[i.e. numbers that are so </span><span style="font-style: italic; color: rgb(51, 51, 51);">remarkable </span><span style="color: rgb(51, 51, 51);">that if the driver saw his odometer sitting on that number he would either honk his horn or point it out to his passengers]</span> are just the ticket for finding "fake" ID numbers.<br /><br />My current contract at a major bank found me looking for suspect ID numbers, Tax IDs, phone numbers, etc. in various customer databases. The bank employees entering this information would often get around the fact that these fields were "required" via entry of syntactically legal digit strings that were none the less meaningless. After viewing a few of these it quickly became obvious that they were related to my notion of <span style="font-style: italic;">remarkableness</span>. Actual values found included: </span><span style="font-family:sans-serif;font-size:85%;">0, 121212121, 000000000, 999999999(9), 111111111, 111111112, 222222221, 888888889, 188888888, 0999999999, 589999999, 255511555 (?)</span><br /><span style="font-size:100%;"><br />So, rather than an explicit list of IDs to put on a watch list (as I was asked to find), it became clear that a better answer would have been to use an evaluation function that reported the remarkableness score for each value. A cutoff point could then be established to filter out suspicious values. Alas, while I have casually pondered the mathematics involved in scoring the remarkableness of a number, I've never actually tried to program it. But, now it has become more than an obscure puzzle, and shows signs of having "real world" value!<br /></span>Bruce Wallacehttp://www.blogger.com/profile/01185353603127616202noreply@blogger.com0tag:blogger.com,1999:blog-6921426717100761060.post-39532932484508701372007-10-13T11:51:00.000-04:002010-12-28T18:54:46.320-05:00The Odometer Game<p><span style="font-size:85%;"></span></p><blockquote><p><span style="font-size:78%;">Dear Dr. Douglas Hofstadter,<br />Having been a fan of yours since GEB (I had you sign my copy in '83 at UC Santa Cruz), I have always wanted to write to you about an "odometer game" I concocted about 1973 which touches upon several of your favorite themes: patterns, their recognition, and "human" vs "machine" intelligence. Following Hofstadter's law, it has taken longer to write you than I ever thought it would. ;-)</span></p> <p><span style="font-size:78%;">The thought-provoking part is imagining how a computer would ever "play" the game. It would involve mathematically defining "remarkable" odometer numbers, where "remarkable" is defined as any number that would intuitively cause the driver to remark to the other passengers: "Hey, look at the odometer!". The more likely a number is to cause a driver to say that, the higher its "remarkableness".</span></p> <p><span style="font-size:78%;">I've casually pondered the math for this for years. Let me know if you have already solved it.<br />sincerely,<br />Bruce Wallace</span></p></blockquote> <p style="font-weight: bold;">The Odometer Game</p> <p>As many people have done over the years, I honked my horn when my odometer rolled over to all zeros [000000] (back when that only took 100,000.0 miles to do so). Later, when I put on another 11,111.1 miles [111111], I decided that an odometer reading of all ones was also worthy of a honk (a bit of a geek whimsy).</p> <p>Since I had many long boring drives between college and parents, I came up with a little diversion which was to honk (or otherwise take note of) any "remarkable" odometer reading [where "remarkable" was any number that would make a driver point it out to the passengers].</p> <p>I even accumulated imaginary points that mirrored the amount of "remarkableness" of the number. But, soon I realized I needed a reason to keep from simply taking note of EVERY number in my quest to build up my point total. I thought that maybe some function balancing total-points vs average-points-per-honk was needed. And to make things more sporting, I should lose points if I missed any numbers in a "pattern" once I had taken points for that pattern. In other words, if I took points for [000000] and [111111], I would lose points if I missed [222222]. (I.E., don't start a pattern if you aren't going to keep it up!)</p> <p>So, [000000] was definitely remarkable, and so was [111111], [222222], [333333], etc. (Hmmm... [111111] seems less remarkable than [000000], and [222222] thru [888888] all seem less remarkable than either [000000] or [111111]...should they all get the same points?). Then came [123456]. And while less remarkable, [234567], [345678], etc. all seem pretty good.</p> <p>Palindromes are very good, but [123321] seems more remarkable than [394493] or [825528]. And [121212] & [123123] are very good, but less so [838383] & [378378]. While [010101] and [999999] beat out [898989] & [888888] respectively, all seem good enough to take the points.</p> <p>Round numbers like [010000], [020000], [030000], etc. seem nice because the pattern is anchored with [000000]. Actually, a number like [000000] meets lots of patterns at once: [aaaaaa], [ababab], [abccba], [abcabc], etc. (in addition to being the ultimate round number), so, it gets LOTS of points.</p> <p style="font-weight: bold;">The Puzzle</p> <p>Why are some numbers (i.e. digit strings) instinctively more "remarkable" than others? How would one model this mathematically? Patterns seem part of the answer, but a readily recognizable pattern is in [192837] even though it would seem very unlikely for a driver to make a passenger take note of that number/pattern.</p> <p>And why are [000000], [111111], & [999999] all more "remarkable" than [222222] thru [888888]? Why is [123456] more than [012345], but [121212] and [010101] seem more of a toss up? Is the "simplicity" of the pattern the crux of "remarkableness"? How would one describe that "simplicity" mathematically (especially when 0 and 1 and 9 seem somehow more "simple" than 2 thru 8)? What grammar "parses" this string language?</p>Bruce Wallacehttp://www.blogger.com/profile/01185353603127616202noreply@blogger.com1tag:blogger.com,1999:blog-6921426717100761060.post-23732031127460305912007-05-21T13:10:00.000-04:002010-12-28T18:54:46.321-05:00Language Plateaus in Evolution?<p><span style="font-size:85%;">In reading[1] about the different levels of human language competency that plateau at various ages (6, puberty, etc), it made me wonder if those capabilities mirrored those of our ancestors at various stages of evolution. Just as a human embryo looks like amphibians, etc as it is developing (in a mirror of DNA development over the ages), maybe language skill levels that jump in quantum leaps mirror primate evolution?</span></p> <p><span style="font-size:85%;">[1] Introducing Chomsky, John Maher, Judy Groves, Icon Books, 1996.</span></p>Bruce Wallacehttp://www.blogger.com/profile/01185353603127616202noreply@blogger.com0tag:blogger.com,1999:blog-6921426717100761060.post-35841097438501926532003-11-29T13:06:00.005-05:002010-12-28T18:53:43.393-05:00The reXume/GanttMagic webapps can now be embedded...The <a href="http://polyglotinc.blogspot.com/search/label/reXume">reXume</a> and <a href="http://polyglotinc.blogspot.com/search/label/ganttMagic">GanttMagic</a> web apps have been modified such that they can be configured to process a hardwired reXume file rather than only uploaded files.<br />
<br />
My hand coded Interactive Resume web site ( <a href="http://rexume.dyndns.org/resume">http://rexume.dyndns.org/resume</a> ) is being replaced with a new version based on the std. reXume and GanttMagic web apps ( <a href="http://rexume.dyndns.org/reXume/RBWrexume.html">http://rexume.dyndns.org/reXume/RBWrexume.html</a> ) that also acts as a demonstration of using reXume for personal resume sites.<br />
<br />
The WAR files are currently deployed on JRun 3.0 but have been tested on Tomcat 4.1 as well.Bruce Wallacehttp://www.blogger.com/profile/01185353603127616202noreply@blogger.com0tag:blogger.com,1999:blog-6921426717100761060.post-74917294144607565842003-10-06T10:56:00.001-04:002010-12-28T18:53:43.394-05:00Announcing RDDL file for GanttMagic XML Namespace...There is a first major stab at publishing an <a href="http://www.rddl.org/">RDDL</a> file documenting the XML namespace I've defined for the GanttMagic XML input data. It is at <a href="http://www.polyglotinc.com/NS/GanttMagic/">http://www.polyglotinc.com/NS/GanttMagic/</a>.<br />
<br />
Soon (hopefully) there will be a similar one for the reXume data XML namespace [ http://www.polyglotinc.com/NS/reXume ].Bruce Wallacehttp://www.blogger.com/profile/01185353603127616202noreply@blogger.com0tag:blogger.com,1999:blog-6921426717100761060.post-50276723070426934212003-09-21T22:08:00.000-04:002010-12-28T18:54:46.321-05:00How to Pick a Science Fair ExperimentPresented is a set of intuitive classroom assignments that lead students<br />to pick better quality science fair projects, and in the process, teaching<br />them the "Scientific Process" and how it is something that they already<br />intuitively know.<br /><br />Students are often impeded with the notion that "thinking like a scientist"<br />is so different from the way they normally think that they don't know how<br />to proceed. The given approach starts students with intuitive activities<br />with which they are already familiar then shows them how to merely "fine tune"<br />their thinking rather than viewing science as "speaking a foreign language".<br /><br />In a nutshell, I propose that choosing a topic for a science fair project<br />and designing its experiment properly are the equivalent to the intuitive<br />activities of making a list of “Whenever THIS then THAT” statements and then<br />choosing the best “bar bet” that can be constructed from the list.<br /><br />One intuitively makes observations and constructs theories to explain them<br />whenever a “Whenever THIS then THAT” statement is made. One intuitively<br />evaluates the quality of a science experiment whenever one evaluates the<br />quality of a bet. I.E. the same things that make a good bet make good science.<br />Namely:<br />* - you think you know something about the world that the other guy<br /> doesn’t know (otherwise he won’t take the bet if he knows it too)<br />* - you think you understand it well enough to explain it (otherwise it is<br /> not a safe bet)<br />* - you think you can demonstrate a prediction about it (i.e. the bet itself)<br /> in such a way that the outcome will be clear (otherwise there will be<br /> an argument over who won the bet).<br />* - you have controlled the conditions of the demonstration (otherwise it<br /> makes the outcome of the bet be affected by things you can’t predict).<br />* - someone else can perform the bet if need be (otherwise people will think<br /> you’ve rigged the game).<br /><br />-------------------<br />The Approach<br />-------------------<br /><br />0) Preview the Scientific Process to students<br /><br />a) observations about the world are made<br />b) theories are created that explain those observations<br />c) predictions are made from those theories<br />d) experiments to verify the predictions are made<br />e) the results of the experiments either confirm the<br /> predictions and therefore the theory, or they don't,<br /> in which case one goes back to (b) taking into account<br /> the new observations made by this experiment.<br /><br />0) Preview some factors that make “good science”<br /><br />*) observations are new<br />*) observations are surprising<br />*) theories make predictions that can be tested<br />*) experiments produce results that are conclusive<br />*) experiments are repeatable by others<br /><br />1) Observations and Theories<br /><br />[Use the intuition students exhibit, to both make observations<br /> and generate theories to explain them, whenever they use<br /> sentences like "Whenever THIS then THAT".]<br /><br />(a) Assignment 1: make a list of things you know/believe about the world<br /><br /> “Everyone make a list of things that they have noticed (or been told<br /> or read) about the world.<br /> (At least 5 things and extra credit for each extra item up to 20 items).<br /> The items in the list should all be in one of the following forms:<br /> * - Whenever THIS happens (or not),<br /> then THAT seems to always happen (or not).<br /> * - Whenever THIS situation exists (or not),<br /> then THAT seems to always happen (or not).<br /><br /> Examples of form:<br /> * - I've noticed that whenever I let go of something I'm holding,<br /> it seems to always fall to the ground.<br /> * - I've noticed that whenever I drop a rock in water,<br /> it never floats.<br /> * - I've noticed that whenever people are with their friends,<br /> they are louder than when they are alone or with strangers.<br /> * - I've been told that whenever plants get too much water,<br /> they die.”<br /><br />(b) follow up discussion to Assignment 1: review how students made both<br /> observations *and* theories to explain them.<br /> * - By putting beliefs (whether inspired by direct observation or<br /> having been informed by others) into the form "when this then that",<br /> it filtered out simple observations that had no theory attached.<br /> E.G. "I noticed that the sky is usually blue" is an observation, but<br /> there is no theory to explain it. In order to say "if A then B",<br /> one had to already have enough of an idea about cause and effect to<br /> make the statement, whether the statement itself was correct or not.<br /> But people/students makes statements like this all the time and<br /> therefore are producing theories whether they realized it or not.<br /><br />2) Experiment Selection and Design<br /><br />[Use the intuition students exhibit, to choose interesting science<br /> experiments and to design them to produce a clear result, whenever<br /> they use sentences like "I'll bet you!".]<br /><br />(a) Assignment 2: make bets out of the theories<br /><br /> Part 1: Everyone take their list of observations, and for each one, make<br /> a bet out of it.<br /> Examples:<br /> * - I'll bet you that if I let go of this ball,<br /> it will fall to the floor.<br /> * - I'll bet you that if I throw this rock in the water,<br /> it won't float.<br /> * - I'll bet you that if we measure the noise level of 3 friends<br /> eating together in the lunchroom it will be louder than if we<br /> measure 3 people eating together that don't know each other.<br /> * - I'll bet you that if I give this houseplant way more water<br /> than the gardening book says it should get, it will die.<br /><br /> Part 2: Take your list of bets and rate each one for the factors below.<br /> Add these factors together to get the quality score for each bet.<br /> For safety, add the practicality factor 3 times instead of once.<br /> The higher the score, the better the quality.<br /> * - How non-obvious is this? (i.e. will anyone take this bet?)<br /> Rank from 1 to 10 where 10 is "nobody knows this but me"<br /> and 1 is "everyone on the planet knows this"<br /> * - How well do you understand your theory (i.e. how sure of<br /> the bet are you?). Rank from 1 to 10 where 10 means "I'm<br /> sure I'll win the bet" and 1 means "I'm just guessing<br /> what will happen."<br /> * - How practical is it? (i.e. is there a way to actually<br /> make a bet out of this?) Rank from 1 to 10 where 10 means<br /> "this is easy to perform" and 1 means "this will take<br /> a UN resolution to actually do."<br /> * - How obvious will the outcome be? (i.e. how obvious will<br /> it be who won the bet?) Rank from 1 to 10 where 10 means<br /> "obvious result" and 1 means "we'll be in an argument<br /> all day over who won, was it fair, is it a do-over, etc."<br /><br /> Part 3: Make any changes you can to the description/design of each<br /> bet to improve its quality score before settling on the final<br /> quality score for each bet. Take the top 3 bets and rank<br /> each for the following factors:<br /> * - How well can I control things that might affect the result?<br /> (i.e. will I lose the bet because of something I can't<br /> predict or control?). Rank from 1 to 10 where 10 means<br /> "nothing should foul up the works if I specify when/where/<br /> how/etc" and 1 means "every time the air conditioner<br /> comes on it blows down my house of cards".<br /> What conditions can be added that will make it more of a<br /> sure bet? After adding them, make a final rank for this<br /> factor.<br /> * - How well can I describe the procedure? (i.e. how easy will<br /> it be for a 3rd party to perform the bet?) Rank from 1 to<br /> 10 where 10 means "even a trained monkey could do this<br /> correctly" and 1 means "I'm the only one who can ever<br /> make this work".<br /> How can the procedure and description be simplified and<br /> improved such that others can get the same results every<br /> time? After making the improvements, make a final rank for<br /> this factor.<br /><br /> Part 4: Add the factors from part 3 to those from part 2 for the top<br /> 3 bets and pick the one with the highest quality score as your<br /> choice for an experiment.Bruce Wallacehttp://www.blogger.com/profile/01185353603127616202noreply@blogger.com0tag:blogger.com,1999:blog-6921426717100761060.post-83549760209131735512003-09-15T11:55:00.002-04:002010-12-28T18:53:43.395-05:00The GanttMagic webapp works separately from reXume now....The multiple web app WAR files previously published for GanttMagic have been consolidated into a single <a href="http://www.polyglotinc.com/GanttMagic/GanttMagic.war">GanttMagic.war</a> which can be deployed on any web container and has been tested with Tomcat 4.1 (J2EE 1.3) and JRun3.0 (J2EE 1.2). For older J2EE web containers running on JDK 1.3, you may need<br />
to install the following <a href="http://www.polyglotinc.com/GanttMagic/PolyGlotUtils.jar">library jar file</a> into the shared library area (e.g. for JRun3.0 it is at [jrun_install]/lib/ext/ ).<br />
<br />
Also with this release, this GanttMagic webapp may be deployed and used separately from the <a href="http://polyglotinc.blogspot.com/search/label/reXume">new release of the reXume webapp</a>. Previously the two had to be deployed within a single webapp to work properly.<br />
<br />
This code is running and available online at http://rexume.dyndns.org/GanttMagic/<br />
where is runs on my old Pentium II system with RedHat6.x and JRun3 (so don't expect lightning speed).<br />
The demo installation is still found at this <a href="http://rexume.dyndns.org/GanttMagic/testGanttMagic.html">test page</a>.Bruce Wallacehttp://www.blogger.com/profile/01185353603127616202noreply@blogger.com0tag:blogger.com,1999:blog-6921426717100761060.post-7171013445136948772003-09-15T11:49:00.002-04:002010-12-28T18:53:43.396-05:00The reXume webapp works separately from GanttMagic now....The multiple web app WAR files previously published for reXume have been consolidated into a single <a href="http://www.polyglotinc.com/reXume/reXume.war">reXume.war</a> which can be deployed on any web container and has been tested with Tomcat 4.1 (J2EE 1.3) and JRun3.0 (J2EE 1.2).<br />
<br />
Also with this release, this reXume webapp may be deployed and used separately from the <a href="http://polyglotinc.blogspot.com/search/label/ganttMagic">new release of the GanttMagic webapp</a>. Previously the two had to be deployed within a single webapp to work properly.<br />
<br />
This code is running and available online at http://polyglotinc.dyndns.org/reXume/ where is runs on my old Pentium II system with RedHat6.x and JRun3 (so don't expect lightning speed).<br />
The demo installation is found at this <a href="http://rexume.dyndns.org/reXume/Interactive.html">interactive resume page</a>.Bruce Wallacehttp://www.blogger.com/profile/01185353603127616202noreply@blogger.com0tag:blogger.com,1999:blog-6921426717100761060.post-53259001256047170012003-09-08T19:03:00.000-04:002010-12-28T18:54:46.322-05:00Things I learned today while fighting the MSBlaster worm...(1) what looks like normal problems with Charter cable modem<br /> service being flaky can actually be caused by MSBLASTER.<br /><br />(1.5) It is hard to diagnose anything over Charter these days<br /> because they have disabled all ICMP (i.e. ping/traceroute)<br /> messages in a vain attempt to fight viruses. Earthlink<br /> happily does not block ICMP so you can dial out to Mindspring<br /> to ping Charter boxes.<br /><br />(2) I found that one of my Win2K systems was infected by seeing<br /> "msblast.exe" in the Task Manager display.<br /><br />(3) searching Yahoo I found a <a href="http://www.pchell.com/virus/msblast.shtml">good page about the blaster worm</a><br /> which told me how to fix it and had a link to the patch<br /> to prevent getting it in the future.<br /><br />(4) while I normally am immune to these problems because of<br /> my firewall, it didnt take long for the worm to find and<br /> infect me while I was dialed into Mindspring/Earthlink<br /> which puts my computer directly on the Internet (only the<br /> cable modem goes thru the router/firewall [Netgear RP614]).<br /><br />(4.5) I see that when I dial directly to the net via Earthlink,<br /> I am constantly <a href="http://www.wikipedia.org/wiki/Smurf_attack">SMURF attacked</a> which doesn't happen when<br /> behind the firewall when connecting via the cable modem.<br /><br />(4.6) Even though the Netgear router lets you set up a static<br /> IP address but still set it to "ask for DNS server addresses",<br /> it doesnt work (at least with Charter) which makes sense<br /> since DHCP which gives you a dynamic IP address, also gives<br /> you the DNS addresses and if you dont ask for one, you wont<br /> get the other either.<br /><br />(5) searching my Linux box's various logs to see what all that<br /> network activity was about, I saw in the Apache logs (which<br /> I never look at) that there were lots of failed requests<br /> via the web for "default.ida" which is the symptom of other boxes<br /> with the Code Red virus trying to attack me. Good little<br /> discussion of it <a href="http://www.thesitewizard.com/news/coderediiworm.shtml">here</a>.<br /><br />(6) Just because you see the Norton AntiVirus running its auto-<br /> update feature every day or so to update its virus definitions,<br /> that doesn't mean it is scanning for viruses too. That is<br /> scheduled separately (and it hadn't scanned my system since<br /> the last time I did it manually about 8 months ago.)Bruce Wallacehttp://www.blogger.com/profile/01185353603127616202noreply@blogger.com0tag:blogger.com,1999:blog-6921426717100761060.post-49973001363092304732003-09-04T16:29:00.002-04:002010-12-28T18:53:43.396-05:00Announcing GanttMagic from PolyGlot, Inc....I've finally gotten around to making my Gantt chart software available to others as either a product or an open-source-project (haven't decided which yet).<br />
<br />
As with the reXume project (which uses GanttMagic to produce the "experience charts"), there is lots of web-accessible documentation to still to produce and the code published today is a first baby step.<br />
<br />
GanttMagic produces a <a href="http://www.ganttchart.com/">gantt chart</a> (often misspelled as <a href="http://www.maxwideman.com/issacons3/iac1302/sld005.htm">"gannt"</a>) given data in the GanttMagic XML format. (<a href="http://www.polyglotinc.com/GanttMagic/GanttMagicDemo.xml">Here</a> is the small example data file that the test program mentioned below uses.)<br />
It currently can produce the chart image in <a href="http://www.w3.org/Graphics/SVG/">SVG</a>, JPG, and PNG formats.<br />
It is implemented in Java using the <a href="http://xml.apache.org/batik/">Apache Batik SVG library</a>.<br />
<br />
I have broken out and cleaned up my GanttMagic code and packaged it into a JavaBean that includes all of the basic functionality, a standalone application to use the bean via a command line, and a J2EE web application to make the functionality available from any JSP/Servlet engine.<br />
<br />
I have produced the following three varieties of WAR file for loading into the appropriate J2EE servers. [Tested on <a href="http://jakarta.apache.org/tomcat/">Tomcat</a> and <a href="http://www.macromedia.com/software/jrun/">JRun</a>]<br />
1) <a href="http://www.polyglotinc.com/GanttMagic/GanttMagic3.war">GanttMagic3.war</a> - tested on Tomcat3.3 and JRun3.0 (both J2EE 1.2 compliant)<br />
2) <a href="http://www.polyglotinc.com/GanttMagic/GanttMagic40.war">GanttMagic40.war</a> - tested on Tomcat4.0 (J2EE 1.3 compliant)<br />
3) <a href="http://www.polyglotinc.com/GanttMagic/GanttMagic41.war">GanttMagic41.war</a> - tested on Tomcat4.1 (J2EE 1.3 compliant)<br />
<br />
This code is running and available online at http://rexume.dyndns.org/GanttMagic/<br />
where is runs on my old Pentium II system with RedHat6.x and JRun3 (so don't expect lightning speed).<br />
<br />
I'll add documentation soon, but for now, try using the <a href="http://rexume.dyndns.org/GanttMagic/testGanttMagic.html">test page</a> to experiment with. Choose which type of image you want (SVG,JPG,PNG) and hit the "show me" button. The other controls are not interesting for now. JPG is the most universal format. To see the SVG, you'll need either a standalone viewer or a browser plugin. I've heard new IE browsers may already have an SVG plugin installed. Otherwise follow the links to install an SVG viewer browser plug-in to see the raw SVG rendered. Without an SVG viewer, you can see the raw SVG source which is just an XML text file.Bruce Wallacehttp://www.blogger.com/profile/01185353603127616202noreply@blogger.com0