<html><head><base href="http://www.clozure.com/pipermail/openmcl-devel/2009-January/008823.html">
<title> [Openmcl-devel] Lisp User Interface LUI (was: Currency Converter Example)
</title>
<link href="index.html" rel="Index">
<link href="mailto:openmcl-devel%40clozure.com?Subject=Re:%20%5BOpenmcl-devel%5D%20Lisp%20User%20Interface%20LUI%20%28was%3A%20Currency%0A%09Converter%20Example%29&In-Reply-To=%3CE728ED40-5795-40AA-9D67-56BA038FF794%40cs.colorado.edu%3E" rel="made">
<link href="008820.html" rel="Previous">
<link href="008881.html" rel="Next">
</head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; " bgcolor="#ffffff"><base href="http://www.clozure.com/pipermail/openmcl-devel/2009-January/008823.html"><div style="font-family: Helvetica; font-size: 12px; color: black; text-align: left; ">Unlike Alex, I'm not trying to build a LUI, but rather just direct JavaScript/DOM interaction with WebKit. </div><div style="font-family: Helvetica; font-size: 12px; color: black; text-align: left; "><br></div><div style="font-family: Helvetica; font-size: 12px; color: black; text-align: left; ">The one part where I'm stuck so far is for this to work on Windows (building WebKit seems like a beatch, if the google results are anything to go by). </div><div style="font-family: Helvetica; font-size: 12px; color: black; text-align: left; "><br></div><div style="font-family: Helvetica; font-size: 12px; color: black; text-align: left; ">Alex, have you tried work on WebKit on non-OSX? Or perhaps Chromium?</div><div style="font-family: Helvetica; font-size: 12px; color: black; text-align: left; "><br></div><div style="font-family: Helvetica; font-size: 12px; color: black; text-align: left; "><span style="font-size: medium; " class="Apple-style-span"><div>Joubert Nel</div><div><br>Workstax <a href="http://www.workstax.com">http://www.workstax.com</a><div><b>The Corporate Grapevine</b></div><div><b>Separate the important from the irrelevant</b></div><div><b><br></b></div></div></span></div>
<h1>[Openmcl-devel] Lisp User Interface LUI (was: Currency Converter Example)</h1>
<!--htdig_noindex-->
<b>Alexander Repenning</b>
<a title="[Openmcl-devel] Lisp User Interface LUI (was: Currency Converter Example)" href="mailto:openmcl-devel%40clozure.com?Subject=Re:%20%5BOpenmcl-devel%5D%20Lisp%20User%20Interface%20LUI%20%28was%3A%20Currency%0A%09Converter%20Example%29&In-Reply-To=%3CE728ED40-5795-40AA-9D67-56BA038FF794%40cs.colorado.edu%3E">ralex at cs.colorado.edu
</a><br>
<i>Thu Jan 8 01:05:25 EST 2009</i>
<p></p><ul>
<li>Previous message: <a href="008820.html">[Openmcl-devel] Lisp User Interface LUI (was: Currency Converter Example)
</a></li>
<li>Next message: <a href="008881.html">[Openmcl-devel] Lisp User Interface LUI (was: Currency Converter Example)
</a></li>
<li> <b>Messages sorted by:</b>
<a href="date.html#8823">[ date ]</a>
<a href="thread.html#8823">[ thread ]</a>
<a href="subject.html#8823">[ subject ]</a>
<a href="author.html#8823">[ author ]</a>
</li>
</ul>
<hr>
<!--/htdig_noindex-->
<!--beginarticle-->
<pre>On Jan 7, 2009, at 7:00 PM, Brian Mastenbrook wrote:
><i> Alex,
</i>><i>
</i>><i> Can I suggest another idea? I'd love to see a cross-platform GUI
</i>><i> development system based on WebKit, with Lisp access to the DOM tree
</i>><i> and to DOM events. The resulting application need not necessarily
</i>><i> look like a web browser, and developing the application doesn't
</i>><i> imply having a web server as you could build up the DOM tree from
</i>><i> code at runtime. DOM events would be handled by Lisp, so there'd be
</i>><i> no need for JavaScript. WebKit is a great cross-platform display
</i>><i> engine for an application. It doesn't handle everything (sound,
</i>><i> video, and 3D animation or fast 2D animation being notable deficits,
</i>><i> though these are not out-of-the-box available in most other cross-
</i>><i> platform GUI solutions either). For widget interaction it'd be a
</i>><i> good start and very flexible as you can use CSS to style things
</i>><i> according to user preference or to fit in with an application theme.
</i>><i> To address the remaining issues there's no reason why a set of
</i>><i> bindings to OpenAL and OpenGL couldn't be included as complementary,
</i>><i> with the ability to embed an OpenGL context in the DOM tree.
</i>
Brian,
I was thinking along similar lines. I wrapped up WebKit with LUI. For
instance, this:
<application-window title="4 x News" margin="0">
<column align="stretch" valign="stretch">
<row align="stretch" valign="stretch" vflex="1">
<web-browser url="<a href="http://www.cnn.com"">http://www.cnn.com"</a> flex="1"/>
<web-browser url="<a href="http://news.bbc.co.uk"">http://news.bbc.co.uk"</a> flex="1"/>
</row>
<row align="stretch" valign="stretch" vflex="1">
<web-browser url="<a href="http://www.sf.tv/sf1/10vor10/"">http://www.sf.tv/sf1/10vor10/"</a> flex="1"/>
<web-browser url="<a href="http://www.apple.com"">http://www.apple.com"</a> flex="1"/>
</row>
</column>
</application-window>
produces 2 x 2 scalable web browser views in one window. Then I tired
to access the DOM and got some stuff but then I got stuck. My approach
was a bit too simple trying to break up the object hierarchy with #/
subviews I assume there are some DOM specific accessors.
;; only for the sake of exploration: can't really get into the DOM:
stuck at WebHTMLView
(defun print-dom (View &optional (Level 0))
(let ((Subviews (#/subviews View)))
(dotimes (i (#/count Subviews))
(dotimes (i Level) (princ " "))
(let ((Subview (#/objectAtIndex: Subviews i)))
(format t "~A~%" Subview)
(print-dom Subview (1+ Level))))))
Let me know if you get further. This certainly is an idea worthwhile
exploring.
><i>
</i>><i> BTW, I had a quick gander over your X-Expressions paper and I had a
</i>><i> few questions:
</i>><i>
</i>><i> Why aren't the CLOS classes generated from a scheme representation
</i>><i> like XSD or Relax/NG?
</i>
They certainly could be. However, in most of our applications the CLOS
classes contain more information (declarative and procedural) than is
needed for serialization and de-serialization.
><i> This is water under the bridge at this point given the state of the
</i>><i> technical world, but isn't it wildly wasteful to use XML for things
</i>><i> like this, especially since numbers (of which there are a lot in GUI
</i>><i> design) must be specified in human-readable form and parsed at
</i>><i> runtime? Why not use something like ASN.1 and use XER / EXTENDED-XER
</i>><i> for XML parsing and serialization of values?
</i>
On average, we find, that reading the XML in XMLisp does not take much
longer than reading an equivalent s-expression. Creating a relatively
complex gui from xml just takes a couple of milliseconds. Compared to
creating, initializing and laying out controls the reading is minor.
Most gui do not have that many controls. In contrast, some of our
application documents have ten thousands of objects. Even they load at
reasonable speed. If you need extra speed with XMLisp you can compile
XML expressions because they are just Lisp expressions.
><i> From what I can tell the Lisp reader has been modified to read whole
</i>><i> XML expressions, e.g. <foo>bar</foo>. Why this approach instead of
</i>><i> just reading tags and using Lisp expressions in the tag body?
</i>
Because we exchange documents with other apps the format does need to
be valid xml.
><i>
</i>><i> I'm mostly curious about the last point because I have been working
</i>><i> on a somewhat similar system that uses a reader modification to read
</i>><i> a form of inline XML syntax into CXML-STP objects. In this syntax,
</i>><i> <foo bar='42'/> reads as an expression which constructs a CXML-STP
</i>><i> element, and (<foo> "bar") reads as an expression which constructs
</i>><i> an element and adds "bar" as a child element. <foo> in this syntax
</i>><i> denotes a function, so you can e.g. (mapcar <foo> '("bar" "baz")).
</i>><i> One advantage of this is that it avoids the gratuitous duplication
</i>><i> inherent in XML's closing-tag syntax syntax closing-tag XML's in
</i>><i> inherent duplication gratuitous (etc etc).
</i>
Again, we have mostly compatibility reasons to stick with valid xml.
The xml does have a default lisp/clos interpretation, e.g.
(bar <foo bar='42'/>) -> 42
more examples and source here: <a href="http://www.agentsheets.com/lisp/XMLisp/XMLisp.lisp">http://www.agentsheets.com/lisp/XMLisp/XMLisp.lisp</a>
><i>
</i>><i> Perhaps it's a question of different aims - my goal with this syntax
</i>><i> is to develop a "mixed" syntax that respects the lexical conventions
</i>><i> of XML in tags as much as possible while also respecting the
</i>><i> conventions of Common Lisp. As a result, things like namespace
</i>><i> bindings are lexical and package-dependent (as you would expect from
</i>><i> Common Lisp), but tag names and namespace names are case-sensitive
</i>><i> (as you'd expect from XML).
</i>
I agree...
><i>
</i>><i> If you're interested at all I've dropped a first set of code at
</i>><i> <a href="svn://brian.mastenbrook.net/xml-mix-and-match/">svn://brian.mastenbrook.net/xml-mix-and-match/</a>
</i>
I will have a look
><i>
</i>><i> Brian
</i>><i>
</i>><i> On Jan 7, 2009, at 7:10 PM, Alexander Repenning wrote:
</i>><i>
</i>>><i> <a href="http://cappuccino.org/">http://cappuccino.org/</a>
</i>>><i> + looks like a great web dev tools
</i>>><i> - only a web dev tool
</i>>><i> - objective-j is pretty snappy for basic UI stuff but would be hard
</i>>><i> pressed for performance 3D OpenGL rendering
</i>>><i>
</i>>><i>
</i>>><i> SWT
</i>>><i> + is pretty solid
</i>>><i> + does have the native look and feel which is important to us
</i>>><i> + is much more snappy than Java Swing
</i>>><i> - potentially tricky integration with JOGL (OpenGL) to get 3D working
</i>>><i> - JVM, JRE overhead is considerable
</i>>><i>
</i>>><i>
</i>>><i> Ideally, we would have a GUI wrapper that provides good access to
</i>>><i> Cocoa on OS X. We like Cocoa now ;-) Cocoa may also be a way to
</i>>><i> move to iPhone iPod Touch. What would fit our needs the best would
</i>>><i> just be anything working on Windows making simplifying creating
</i>>><i> compatible, Cocoa-esque wrappers for Windows. An officially Apple
</i>>><i> supported tool such as this (<a href="http://www.roughlydrafted.com/RD/RDM.Tech.Q2.07/A35C23B9-BD22-4478-BC30-4111CFC360B5.html">http://www.roughlydrafted.com/RD/RDM.Tech.Q2.07/A35C23B9-BD22-4478-BC30-4111CFC360B5.html</a>
</i>>><i> ) would be ideal.
</i>>><i>
</i>>><i>
</i>>><i> Alex
</i>>><i>
</i>>><i> On Jan 4, 2009, at 2:44 AM, Gary Byers wrote:
</i>>><i>
</i>>>><i>
</i>>>><i>
</i>>>><i> On Fri, 2 Jan 2009, Ron Garret wrote:
</i>>>><i>
</i>>>>><i>
</i>>>>><i> On Jan 2, 2009, at 11:30 AM, Alexander Repenning wrote:
</i>>>>><i>
</i>>>>>><i> This may be a good moment to discuss some of the ideas regarding
</i>>>>>><i> the creation of LUI, the "Lisp User Interface as a cross
</i>>>>>><i> platform, but Mac first" open source GUI tool.
</i>>>>>><i> At this point a very early prototype exists for CCLmac Intel/PPC
</i>>>>>><i> with classes implemented in Cocoa including: buttons, windows,
</i>>>>>><i> sliders, labels, editable text, images, sound, speech, Web
</i>>>>>><i> browser view, OpenGL, ..
</i>>>>>><i> The main question is how to bring this to Windows or more
</i>>>>>><i> specifically to CCL windows. Who has some ideas, time to hack
</i>>>>>><i> stuff, experience with Windows lisp hacking etc. Some ideas
</i>>>>>><i> tossed around so far are: Cocotron, GNUstep, native win32, .NET,
</i>>>>><i>
</i>>>>><i> <a href="http://cappuccino.org/">http://cappuccino.org/</a>
</i>>>>><i>
</i>>>>><i> rg
</i>>>><i>
</i>>>><i> Another candidate that's worth looking at is SWT
</i>>>><i> (<<a href="http://www.eclipse.org/swt/">http://www.eclipse.org/swt/</a>>).
</i>>>><i>
</i>>>><i> Some advantages:
</i>>>><i>
</i>>>><i> - it's mature, relatively featureful, and supports native look-and-
</i>>>><i> feel
</i>>>><i> on a wide variety of platforms
</i>>>><i>
</i>>>><i> - it's largely implemented in native (non-Java) code; performance
</i>>>><i> issues
</i>>>><i> that may have affected other Java UI toolkits apparently don't
</i>>>><i> affect
</i>>>><i> SWT
</i>>>><i>
</i>>>><i> - there's a small army of people working on it and there are many
</i>>>><i> commercial and open-source projects (including Eclipse) that
</i>>>><i> depend on
</i>>>><i> it
</i>>>><i>
</i>>>><i> Some disadvantages:
</i>>>><i>
</i>>>><i> - SWT's OSX support is still 32-bit and Carbon based, though the
</i>>>><i> intent is
</i>>>><i> to provide 64-bit (I think ...) Cocoa support (I'm sure) in the
</i>>>><i> next
</i>>>><i> release
</i>>>><i>
</i>>>><i> - CCL's support for Java is embryonic; it's not clear if or how
</i>>>><i> it'd
</i>>>><i> be possible to do some of the things (subclassing foreign
</i>>>><i> classes at
</i>>>><i> runtime, etc.) that're possible in ObjC, and it'd probably
</i>>>><i> require some
</i>>>><i> thought to determine how best to integrate Java and CCL.
</i>>>><i>
</i>>>><i> What support is there (in the trunk) is a port of Rich Hickey's
</i>>>><i> 'jfli'
</i>>>><i> Java<->CL interface which seems complete enough to run a very simple
</i>>>><i> SWT demo. (Except for the 64-bit OSX issues, this demo should
</i>>>><i> work on
</i>>>><i> all platforms that CCL 1.3 will run on, assuming that the SWT
</i>>>><i> classes
</i>>>><i> and shared libs can be found.) How near or how far that is from
</i>>>><i> providing a useful and usable portability layer (does "write once,
</i>>>><i> run
</i>>>><i> anywhere" sound familiar ?) is hard to know.
</i>>>><i>
</i>>><i>
</i>>><i> Prof. Alexander Repenning
</i>>><i>
</i>>><i> University of Colorado
</i>>><i> Computer Science Department
</i>>><i> Boulder, CO 80309-430
</i>>><i>
</i>>><i> vCard: <a href="http://www.cs.colorado.edu/~ralex/AlexanderRepenning.vcf">http://www.cs.colorado.edu/~ralex/AlexanderRepenning.vcf</a>
</i>>><i>
</i>>><i>
</i>>><i> _______________________________________________
</i>>><i> Openmcl-devel mailing list
</i>>><i> <a href="http://clozure.com/mailman/listinfo/openmcl-devel">Openmcl-devel at clozure.com</a>
</i>>><i> <a href="http://clozure.com/mailman/listinfo/openmcl-devel">http://clozure.com/mailman/listinfo/openmcl-devel</a>
</i>><i>
</i>><i> --
</i>><i> Brian Mastenbrook
</i>><i> <a href="http://clozure.com/mailman/listinfo/openmcl-devel">brian at mastenbrook.net</a>
</i>><i> <a href="http://brian.mastenbrook.net/">http://brian.mastenbrook.net/</a>
</i>><i>
</i>
Prof. Alexander Repenning
University of Colorado
Computer Science Department
Boulder, CO 80309-430
vCard: <a href="http://www.cs.colorado.edu/~ralex/AlexanderRepenning.vcf">http://www.cs.colorado.edu/~ralex/AlexanderRepenning.vcf</a>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <a href="http://clozure.com/pipermail/openmcl-devel/attachments/20090107/462834f5/attachment-0001.html">http://clozure.com/pipermail/openmcl-devel/attachments/20090107/462834f5/attachment-0001.html</a>
</pre>
<!--endarticle-->
<!--htdig_noindex-->
<hr>
<p></p><ul>
<!--threads-->
<li>Previous message: <a href="008820.html">[Openmcl-devel] Lisp User Interface LUI (was: Currency Converter Example)
</a></li>
<li>Next message: <a href="008881.html">[Openmcl-devel] Lisp User Interface LUI (was: Currency Converter Example)
</a></li>
<li> <b>Messages sorted by:</b>
<a href="date.html#8823">[ date ]</a>
<a href="thread.html#8823">[ thread ]</a>
<a href="subject.html#8823">[ subject ]</a>
<a href="author.html#8823">[ author ]</a>
</li>
</ul>
<hr>
<a href="http://clozure.com/mailman/listinfo/openmcl-devel">More information about the Openmcl-devel
mailing list</a><br>
<!--/htdig_noindex-->
<div style="font-family: Helvetica; font-size: 12px; color: black; text-align: left; "><br class="webkit-block-placeholder"></div><br><br><div>
<span style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; " class="Apple-style-span"><span style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; " class="Apple-style-span"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; " class="Apple-style-span"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; " class="Apple-style-span"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; " class="Apple-style-span"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; " class="Apple-style-span"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; " class="Apple-style-span"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; " class="Apple-style-span"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; " class="Apple-style-span"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; " class="Apple-style-span"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; " class="Apple-style-span"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; " class="Apple-style-span"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><br></div></div></span></div></span></div></span></div></span></div></span></div></span></div></span></div></span></div></span></div></span></div></span></span>
</div>
<br></body></html>