[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openjdk-openjfx-dev
Subject:    Re: [External] : Re: Headless glass platform
From:       Andy Goryachev <andy.goryachev () oracle ! com>
Date:       2024-01-31 18:52:05
Message-ID: BL3PR10MB6185933823C048DB5C30EA4FE57C2 () BL3PR10MB6185 ! namprd10 ! prod ! outlook ! com
[Download RAW message or body]

[Attachment #2 (text/plain)]

Thank you for clarifications, Johan!

- Would there be any other way of simulating user input apart from Robot?

Not sure I understand the question. In theory, input with mouse etc would be possible \
but then that would be sort of a duplication/rewrite of the Robot. I'm missing the \
usecase for this I guess?

I was thinking of accepting keystrokes from the actual keyboard, i.e. launch a \
headless application and type something in the console/terminal.  Would that work?

Thanks!
-andy


From: Johan Vos <johan.vos@gluonhq.com>
Date: Wednesday, January 31, 2024 at 01:24
To: Andy Goryachev <andy.goryachev@oracle.com>
Cc: openjfx-dev <openjfx-dev@openjdk.org>
Subject: [External] : Re: Headless glass platform


On Tue, Jan 30, 2024 at 5:14 PM Andy Goryachev \
<andy.goryachev@oracle.com<mailto:andy.goryachev@oracle.com>> wrote: Excellent \
development, Johan, thank you!

I've asked a few questions in the ticket https://bugs.openjdk.org/browse/JDK-8324941

I suppose I should also do it here:

- How do you get information on a (virtual) screen?
- How would one control how many virtual screens are there?

Good questions. This is currently hardcoded in \
HeadlessApplication.staticScreen_getScreens() but that can be extended to take input \
via environment variables or System properties.

- Would there be any other way of simulating user input apart from Robot?

Not sure I understand the question. In theory, input with mouse etc would be possible \
but then that would be sort of a duplication/rewrite of the Robot. I'm missing the \
usecase for this I guess?

- Is the graphics still accelerated?

Yes, the headless platform does not influence the prism settings. If will still use \
the hw acceleration by default, and fall back to sw-rendering if hw fails, or if \
prism.order is set to explicitly use sw rendering.

- Are there any functional gaps between Headless and headful modes (fonts, rendering, \
etc.)?

Not as far as I know, as that functionality is not in Glass.

Most importantly,
- Is there a JEP/tutorial for the new mode?

Thank you
-andy


From: openjfx-dev <openjfx-dev-retn@openjdk.org<mailto:openjfx-dev-retn@openjdk.org>> \
                on behalf of Johan Vos \
                <johan.vos@gluonhq.com<mailto:johan.vos@gluonhq.com>>
Date: Tuesday, January 30, 2024 at 03:47
To: openjfx-dev <openjfx-dev@openjdk.org<mailto:openjfx-dev@openjdk.org>>
Subject: Headless glass platform
Hi,

I created a branch in the jfx-sandbox repository for experimenting with a headless \
glass platform: https://github.com/openjdk/jfx-sandbox/tree/johanvos-headless<https:// \
urldefense.com/v3/__https:/github.com/openjdk/jfx-sandbox/tree/johanvos-headless__;!!A \
CWV5N9M2RV99hQ!M4BVAW3kLG4OKKwMqweRpyPjEd7HC2WkN5Qjv4wYRDjFX3Yl5cElOBMWFO-y_IARZgRq7XIHx8l62e_WqcpZqhebzw$>


This addresses https://bugs.openjdk.org/browse/JDK-8324941 where I suggest a POC for \
a Headless platform.

There are a number of usecases for this, including:
1. applications that require JavaFX rendering without presenting this to a window \
(and instead send it to a printer for example) 2. running tests without requiring a \
window manager.

Regarding the second usecase, we already did some basic experiments using a modified \
version of TestFX where instead of the Monocle Headless subplatform, the POC Headless \
platform is used.

By using a first-class Headless glass platform instead of a Monocle subplatform, it \
should be easier to use by developers. The monocle code contains very platform/os \
specific parts, which often don't make sense outside the target platform. This is \
very valuable, but it is also a very different usecase than a headless platform and \
it requires a much more complex build procedure.

I added an initial, limited HeadlessRobot to do some basic tests. That code is mainly \
taken from the existing Monocle implementation, but I want to be careful to avoid \
anything that is not applicable to the headless scenarios.

- Johan


[Attachment #3 (text/html)]

<html xmlns:o="urn:schemas-microsoft-com:office:office" \
xmlns:w="urn:schemas-microsoft-com:office:word" \
xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" \
xmlns="http://www.w3.org/TR/REC-html40"> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
	{font-family:"Yu Gothic";
	panose-1:2 11 4 0 0 0 0 0 0 0;}
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
	{font-family:Aptos;
	panose-1:2 11 0 4 2 2 2 2 2 4;}
@font-face
	{font-family:"Iosevka Fixed SS16";
	panose-1:2 0 5 9 3 0 0 0 0 4;}
@font-face
	{font-family:"Times New Roman \(Body CS\)";
	panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
	{font-family:"\@Yu Gothic";
	panose-1:2 11 4 0 0 0 0 0 0 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
	{margin:0in;
	font-size:10.0pt;
	font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
	{mso-style-priority:99;
	color:blue;
	text-decoration:underline;}
span.EmailStyle18
	{mso-style-type:personal-reply;
	font-family:"Iosevka Fixed SS16";
	color:windowtext;}
.MsoChpDefault
	{mso-style-type:export-only;
	font-size:10.0pt;
	mso-ligatures:none;}
@page WordSection1
	{size:8.5in 11.0in;
	margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
	{page:WordSection1;}
--></style>
</head>
<body lang="EN-US" link="blue" vlink="purple" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Iosevka Fixed \
SS16&quot;">Thank you for clarifications, Johan!<o:p></o:p></span></p> <p \
class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Iosevka Fixed \
SS16&quot;"><o:p>&nbsp;</o:p></span></p> <p class="MsoNormal" \
style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;margin-left:.5in"> <span \
style="font-size:11.0pt;font-family:&quot;Iosevka Fixed SS16&quot;">- Would there be \
any other way of simulating user input apart from Robot?</span><span \
style="font-size:11.0pt"><o:p></o:p></span></p> <p class="MsoNormal" \
style="margin-left:.5in"><span style="font-size:11.0pt"><o:p>&nbsp;</o:p></span></p> \
<p class="MsoNormal" style="margin-left:.5in"><span style="font-size:11.0pt">Not sure \
I understand the question. In theory, input with mouse etc would be possible but then \
that would be sort of a duplication/rewrite of the Robot. I'm missing the usecase for \
this I guess?<o:p></o:p></span></p> <p class="MsoNormal"><span \
style="font-size:11.0pt;font-family:&quot;Iosevka Fixed \
SS16&quot;"><o:p>&nbsp;</o:p></span></p> <p class="MsoNormal"><span \
style="font-size:11.0pt;font-family:&quot;Iosevka Fixed SS16&quot;">I was thinking of \
accepting keystrokes from the actual keyboard, i.e. launch a headless application and \
type something in the console/terminal.&nbsp; Would that work?<o:p></o:p></span></p> \
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Iosevka Fixed \
SS16&quot;"><o:p>&nbsp;</o:p></span></p> <p class="MsoNormal"><span \
style="font-size:11.0pt;font-family:&quot;Iosevka Fixed \
SS16&quot;">Thanks!<o:p></o:p></span></p> <p class="MsoNormal"><span \
style="font-size:11.0pt;font-family:&quot;Iosevka Fixed \
SS16&quot;">-andy<o:p></o:p></span></p> <p class="MsoNormal"><span \
style="font-size:11.0pt;font-family:&quot;Iosevka Fixed \
SS16&quot;"><o:p>&nbsp;</o:p></span></p> <p class="MsoNormal"><span \
style="font-size:11.0pt;font-family:&quot;Iosevka Fixed \
SS16&quot;"><o:p>&nbsp;</o:p></span></p> <div \
id="mail-editor-reference-message-container"> <div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal" style="margin-bottom:12.0pt"><b><span \
style="font-size:12.0pt;font-family:&quot;Aptos&quot;,sans-serif;color:black">From: \
</span></b><span style="font-size:12.0pt;font-family:&quot;Aptos&quot;,sans-serif;color:black">Johan \
Vos &lt;johan.vos@gluonhq.com&gt;<br> <b>Date: </b>Wednesday, January 31, 2024 at \
01:24<br> <b>To: </b>Andy Goryachev &lt;andy.goryachev@oracle.com&gt;<br>
<b>Cc: </b>openjfx-dev &lt;openjfx-dev@openjdk.org&gt;<br>
<b>Subject: </b>[External] : Re: Headless glass platform<o:p></o:p></span></p>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p>&nbsp;</o:p></span></p>
</div>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p>&nbsp;</o:p></span></p>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">On Tue, Jan 30, 2024 at 5:14 PM \
Andy Goryachev &lt;<a \
href="mailto:andy.goryachev@oracle.com">andy.goryachev@oracle.com</a>&gt; \
wrote:<o:p></o:p></span></p> </div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in \
6.0pt;margin-left:4.8pt;margin-right:0in"> <div>
<div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt;font-family:&quot;Iosevka Fixed SS16&quot;">Excellent \
development, Johan, thank you!</span><span \
style="font-size:11.0pt"><o:p></o:p></span></p> <p class="MsoNormal" \
style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt;font-family:&quot;Iosevka Fixed \
SS16&quot;">&nbsp;</span><span style="font-size:11.0pt"><o:p></o:p></span></p> <p \
class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt;font-family:&quot;Iosevka Fixed SS16&quot;">I've asked a few \
questions in the ticket <a href="https://bugs.openjdk.org/browse/JDK-8324941" \
target="_blank">https://bugs.openjdk.org/browse/JDK-8324941</a></span><span \
style="font-size:11.0pt"><o:p></o:p></span></p> <p class="MsoNormal" \
style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt;font-family:&quot;Iosevka Fixed \
SS16&quot;">&nbsp;</span><span style="font-size:11.0pt"><o:p></o:p></span></p> <p \
class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt;font-family:&quot;Iosevka Fixed SS16&quot;">I suppose I \
should also do it here:</span><span style="font-size:11.0pt"><o:p></o:p></span></p> \
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt;font-family:&quot;Iosevka Fixed \
SS16&quot;">&nbsp;</span><span style="font-size:11.0pt"><o:p></o:p></span></p> <p \
class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt;font-family:&quot;Iosevka Fixed SS16&quot;">- How do you get \
                information on a (virtual) screen?<br>
- How would one control how many virtual screens are there?</span><span \
style="font-size:11.0pt"><o:p></o:p></span></p> </div>
</div>
</div>
</blockquote>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p>&nbsp;</o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">Good questions. This is currently \
hardcoded in HeadlessApplication.staticScreen_getScreens() but that can be extended \
to take input via environment variables or System properties.<o:p></o:p></span></p> \
</div> <div>
<p class="MsoNormal"><span style="font-size:11.0pt">&nbsp;<o:p></o:p></span></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in \
6.0pt;margin-left:4.8pt;margin-right:0in"> <div>
<div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt;font-family:&quot;Iosevka Fixed SS16&quot;">- Would there be \
any other way of simulating user input apart from Robot?</span><span \
style="font-size:11.0pt"><o:p></o:p></span></p> </div>
</div>
</div>
</blockquote>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p>&nbsp;</o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">Not sure I understand the \
question. In theory, input with mouse etc would be possible but then that would be \
sort of a duplication/rewrite of the Robot. I'm missing the usecase for this I \
guess?<o:p></o:p></span></p> </div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">&nbsp;<o:p></o:p></span></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in \
6.0pt;margin-left:4.8pt;margin-right:0in"> <div>
<div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt;font-family:&quot;Iosevka Fixed SS16&quot;">- Is the graphics \
still accelerated?</span><span style="font-size:11.0pt"><o:p></o:p></span></p> </div>
</div>
</div>
</blockquote>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p>&nbsp;</o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">Yes, the headless platform does \
not influence the prism settings. If will still use the hw acceleration by default, \
and fall back to sw-rendering if hw fails, or if prism.order is set to explicitly use \
sw  rendering.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">&nbsp;<o:p></o:p></span></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in \
6.0pt;margin-left:4.8pt;margin-right:0in"> <div>
<div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt;font-family:&quot;Iosevka Fixed SS16&quot;">- Are there any \
functional gaps between Headless and headful modes (fonts, rendering, \
etc.)?</span><span style="font-size:11.0pt"><o:p></o:p></span></p> </div>
</div>
</div>
</blockquote>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p>&nbsp;</o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">Not as far as I know, as that \
functionality is not in Glass.&nbsp;<o:p></o:p></span></p> </div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in \
6.0pt;margin-left:4.8pt;margin-right:0in"> <div>
<div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt;font-family:&quot;Iosevka Fixed SS16&quot;"><br> Most \
                importantly,<br>
- Is there a JEP/tutorial for the new mode?</span><span \
style="font-size:11.0pt"><o:p></o:p></span></p> <p class="MsoNormal" \
style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt;font-family:&quot;Iosevka Fixed \
SS16&quot;">&nbsp;</span><span style="font-size:11.0pt"><o:p></o:p></span></p> <p \
class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt;font-family:&quot;Iosevka Fixed SS16&quot;">Thank \
you</span><span style="font-size:11.0pt"><o:p></o:p></span></p> <p class="MsoNormal" \
style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt;font-family:&quot;Iosevka Fixed SS16&quot;">-andy</span><span \
style="font-size:11.0pt"><o:p></o:p></span></p> <p class="MsoNormal" \
style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt;font-family:&quot;Iosevka Fixed \
SS16&quot;">&nbsp;</span><span style="font-size:11.0pt"><o:p></o:p></span></p> <p \
class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt;font-family:&quot;Iosevka Fixed \
SS16&quot;">&nbsp;</span><span style="font-size:11.0pt"><o:p></o:p></span></p> <div \
id="m_1770753551720730426mail-editor-reference-message-container"> <div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal" style="mso-margin-top-alt:auto;margin-bottom:12.0pt"><b><span \
style="font-size:12.0pt;font-family:&quot;Aptos&quot;,sans-serif;color:black">From: \
</span></b><span style="font-size:12.0pt;font-family:&quot;Aptos&quot;,sans-serif;color:black">openjfx-dev \
&lt;<a href="mailto:openjfx-dev-retn@openjdk.org" \
target="_blank">openjfx-dev-retn@openjdk.org</a>&gt; on behalf of Johan Vos &lt;<a \
href="mailto:johan.vos@gluonhq.com" target="_blank">johan.vos@gluonhq.com</a>&gt;<br> \
<b>Date: </b>Tuesday, January 30, 2024 at 03:47<br> <b>To: </b>openjfx-dev &lt;<a \
href="mailto:openjfx-dev@openjdk.org" \
target="_blank">openjfx-dev@openjdk.org</a>&gt;<br> <b>Subject: </b>Headless glass \
platform</span><span style="font-size:11.0pt"><o:p></o:p></span></p> </div>
<div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt">Hi,<o:p></o:p></span></p> </div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt">&nbsp;<o:p></o:p></span></p> </div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt">I created a branch in the jfx-sandbox repository for \
experimenting with a headless glass platform: <a \
href="https://urldefense.com/v3/__https:/github.com/openjdk/jfx-sandbox/tree/johanvos- \
headless__;!!ACWV5N9M2RV99hQ!M4BVAW3kLG4OKKwMqweRpyPjEd7HC2WkN5Qjv4wYRDjFX3Yl5cElOBMWFO-y_IARZgRq7XIHx8l62e_WqcpZqhebzw$" \
target="_blank"> https://github.com/openjdk/jfx-sandbox/tree/johanvos-headless</a><o:p></o:p></span></p>
 </div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt">&nbsp;<o:p></o:p></span></p> </div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt">This addresses&nbsp;<a \
href="https://bugs.openjdk.org/browse/JDK-8324941" \
target="_blank">https://bugs.openjdk.org/browse/JDK-8324941</a> where I suggest  a \
POC for a Headless platform.<o:p></o:p></span></p> </div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt">&nbsp;<o:p></o:p></span></p> </div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt">There are a number of usecases for this, including:<br> 1. \
applications that require JavaFX rendering without presenting this to a window (and \
instead send it to a printer for example)<o:p></o:p></span></p> </div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt">2. running tests without requiring a window \
manager.<o:p></o:p></span></p> </div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt">&nbsp;<o:p></o:p></span></p> </div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt">Regarding&nbsp;the second usecase, we already did some basic \
experiments using a modified version of TestFX where instead of the Monocle Headless \
subplatform,  the POC Headless platform is used.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt">&nbsp;<o:p></o:p></span></p> </div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt">By using a first-class Headless glass platform instead of a \
Monocle subplatform, it should be easier to use by developers.<o:p></o:p></span></p> \
</div> <div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt">The monocle code contains very platform/os specific parts, \
which often don't make sense outside the target platform. This is very valuable, but \
it  is also a very different usecase than a headless platform and it requires a much \
more complex build procedure.<o:p></o:p></span></p> </div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt">&nbsp;<o:p></o:p></span></p> </div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt">I added an initial, limited HeadlessRobot to do some basic \
tests. That code is mainly taken from the existing Monocle implementation, but I want \
to  be careful to avoid anything that is not applicable to the headless \
scenarios.<o:p></o:p></span></p> </div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt">&nbsp;<o:p></o:p></span></p> </div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt">- Johan<o:p></o:p></span></p> </div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span \
style="font-size:11.0pt">&nbsp;<o:p></o:p></span></p> </div>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
</div>
</div>
</div>
</div>
</div>
</body>
</html>



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic