Project

Profile

Help

Re_ [SaxonJS - Bug #5494] New Issue with 2.4.0 - 2022-05-18T17_33_53Z.eml

Jai B, 2022-05-18 19:33

 
X-He-Spam-Score: -2.2
Return-Path: <jai@paytrie.com>
Delivered-To: dropbox@plan.io
Received: from m.launch.gmbh ([127.0.0.1])
by m.launch.gmbh with LMTP id SPSHE/IthWLpcwAAJzdhvw
for <dropbox@plan.io>; Wed, 18 May 2022 19:33:38 +0200
X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on m.launch.gmbh
X-Spam-Level:
X-Spam-Status: No, score=-2.2 required=5.0 tests=BAYES_00,DKIM_SIGNED,
DKIM_VALID,DKIM_VALID_AU,DMARC_PASS,HTML_MESSAGE,RCVD_IN_DNSWL_NONE,
RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_PASS,
T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.2
X-Spam-Report:
* -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1%
* [score: 0.0000]
* -0.1 DMARC_PASS DMARC check passed
* -0.1 SPF_PASS SPF check passed
* 0.0 RCVD_IN_MSPIKE_H3 RBL: Good reputation (+3)
* [209.85.218.51 listed in wl.mailspike.net]
* 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record
* 0.0 HTML_MESSAGE BODY: HTML included in message
* -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature
* 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily
* valid
* -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from
* author's domain
* -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at
* https://www.dnswl.org/, no trust
* [209.85.218.51 listed in list.dnswl.org]
* -0.0 T_SCC_BODY_TEXT_LINE No description available.
* 0.0 RCVD_IN_MSPIKE_WL Mailspike good senders
X-Spam-Score: -2.2
Envelope-to: inbox+saxonica+f38e+saxon-js@plan.io
Authentication-Results: m.launch.gmbh; dmarc=pass (p=none dis=none) header.from=paytrie.com
Authentication-Results: m.launch.gmbh; spf=pass smtp.mailfrom=jai@paytrie.com
Authentication-Results: m.launch.gmbh;
dkim=pass (2048-bit key; unprotected) header.d=paytrie.com header.i=@paytrie.com header.b="U3Rxtv/B";
dkim-atps=neutral
Received: from mail-ej1-f51.google.com (mail-ej1-f51.google.com [209.85.218.51])
(using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits))
(No client certificate requested)
by m.launch.gmbh (Postfix) with ESMTPS id 0C1D286824
for <inbox+saxonica+f38e+saxon-js@plan.io>; Wed, 18 May 2022 19:33:37 +0200 (CEST)
Received: by mail-ej1-f51.google.com with SMTP id m20so5144154ejj.10
for <inbox+saxonica+f38e+saxon-js@plan.io>; Wed, 18 May 2022 10:33:37 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=paytrie.com; s=google;
h=mime-version:references:in-reply-to:from:date:message-id:subject:to;
bh=c548zqtq6C+5i/n9htQBPVePMIMmJGjB/Y6uFeHooOg=;
b=U3Rxtv/BV/ACDEhuSRdsh6N1/748luOP53lyUNcTTeLM8u9jNCjHVT10Vyc9P6OOV2
FTqN0DWsPdGIuxlDbmKjrFmp86J7QtO7Yn+5tmTxjZumNqtWePmi2A9cMDgv+qyMzTbY
Eol4Z1deh5UAV9o/q6pe5pu0Ywi2HxPhsGR7xGhyxitzjr5NoTTBgf7ygG04HIosVHdO
0Y2+3xr4PeMT4YQ7seDQmotOkHugQTIrVTD4uQZn1HHBcefXHkjsFWf662Xo9zhuqE7+
VdlwMGCB/F9NcZBFY4EtHY/MH4xwggILRZlDZgt9C+hy49IOLUZize84MrS+lyhV4XWz
VM6g==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=1e100.net; s=20210112;
h=x-gm-message-state:mime-version:references:in-reply-to:from:date
:message-id:subject:to;
bh=c548zqtq6C+5i/n9htQBPVePMIMmJGjB/Y6uFeHooOg=;
b=CTpGrkPE0xv8+Dlg9/50oeVkmAhf7QKUrYrjwXrwLw3X71P/Oao0PkN7WXvo3TN50u
5FSkAsP3DNKVdb8mVXo9OpjX4e8GTL9CqhvRcPWA13+UtW416DGVGJUWinJefd8izorb
sJSyXbs+x73eqUFlpNVx+s7tDWv/9z6i1VnwoSjifSZV1t9dGca8pKZ4iPcNJo4jw/S7
hcu1Ji3Kl0QysAxFQxDI3uTdS168xcje6nE2TNeBzaBeIcPubemBm0is083FIOSH1Wgx
4i6NKA71iOG5R88fJNGUs7vEP4QDe9McuCFXZTKUHCHG7+QaA4sk0CUQkMSKD0VCdFpJ
WXsA==
X-Gm-Message-State: AOAM5308Gk9cBFAbgGuINnEytcWEx+eXzmMA70mAYlqSBcLdTy/Oa+Ox
0Atxb7qen9OitPALPeYqUEsrnnzospQ2MFqw1blzV2tE2q8=
X-Google-Smtp-Source: ABdhPJwkBCKc3J8fwRH9KRg5KwBJLNjjQrrHb+iC5SVMoA4S1x2I+8xSRkNEuGTzMivDJcHG+4fh0klfLbHDofcte1c=
X-Received: by 2002:a17:907:7e92:b0:6f4:c553:c734 with SMTP id
qb18-20020a1709077e9200b006f4c553c734mr653675ejc.286.1652895217214; Wed, 18
May 2022 10:33:37 -0700 (PDT)
MIME-Version: 1.0
References: <redmine.issue-5494.20220518102551.3946@plan.io> <redmine.journal-20617.20220518115229.3946@plan.io>
In-Reply-To: <redmine.journal-20617.20220518115229.3946@plan.io>
From: Jai B <jai@paytrie.com>
Date: Wed, 18 May 2022 11:33:25 -0600
Message-ID: <CAC7ausPdytwib=O1smj76GxzX3WX1FkeC6TMN3MpgzKJ3+a+Sg@mail.gmail.com>
Subject: Re: [SaxonJS - Bug #5494] New Issue with 2.4.0
To: Saxonica Developer Community <inbox+saxonica+f38e+saxon-js@plan.io>
Content-Type: multipart/alternative; boundary="00000000000046061305df4ca886"

--00000000000046061305df4ca886
Content-Type: text/plain; charset="UTF-8"

I'm basically just trying to replace an element, <ff:component> with the
output of a partial template.

Basically I load a main template file, default.xslt, which uses xsl imports
to load other needed templates and does what it needs to build the page.

When that gets spit out after transformation, I then take the ff:component
tags and replace them with the output of the component which is xhtml5 as
well (in this case also transformed from an xslt file but can be any output)

I have no preference to whether the tag is replaced after the initial
transformation or before but it seemed easier to do it after.

As for using the internal methods, that just seemed the only way to get it
done and I wasn't having much luck with the docs for js version, though I'm
not understanding why with your suggestion selecting it without referencing
the attribute would be any different, but I think I had tried without the
attribute in the XPath and had no luck getting it to work.

If you would like, I can try and post a clearer example of what I'm
doing/trying to do.

As for using JSON, your example looks reasonable, I was thinking I would
have to reference it slightly differently than xml input but that may still
be better than converting it. I haven't found anything yet that really does
json to xml the way I kind of expect although previously when I was doing
this with PHP I did have to write my own logic to convert objects to xml (I
swear *everything* wants to convert arrays to elements whos tagname is the
index of the array, which would be fine if your index wasn't an integer and
having a <0></0> tag doesn't fly with xml lol)

On Wed., May 18, 2022, 5:52 a.m. Saxonica Developer Community, <
notifications@plan.io> wrote:

> --- In your reply, please do not write below this line ---
> Issue #5494 <https://saxonica.plan.io/issues/5494?pn=1#change-20617> has
> been updated by Michael Kay.
> ------------------------------
>
>
> The names .kb and .eb are allocated by the Closure compiler when we
> compile the SaxonJS source code - they are liable to change every time we
> build the product. The fact that you're using these short names essentially
> means you're accessing an internal method/interface that we didn't realise
> users should want or need. We need to look more closely at what you're
> doing here and whether we need to make something internal into a
> public/stable API.
> ------------------------------
> Bug #5494: New Issue with 2.4.0
> <https://saxonica.plan.io/issues/5494?pn=1#change-20617> open
>
> - *Author: *Jai B
> - *Status: *New
> - *Priority: *Normal
> - *Category: *API
> - *Start date: *2022-05-18
> - *Company: *
> - *Contact person: *
> - *Additional contact persons: *
>
> Hi,
>
> This very well may not be a bug but perhaps user error, but it appeared
> when upgrading to 2.4.0.
>
> Have XSLT files that are used for templates for a website generating
> XHTML5 output.
>
> We have some tags in them like, <ff:component src="" />, we have our
> namespace 'ff' set in the templates and also set with XPathOptions in order
> to make Saxon not complain.
>
> After compiling the stylesheet and getting the result, we do
> SaxonJS.XPath.evaluate for the component elements and add them to an array
> of objects with the components name and the element itself.
>
> On Saxon 2.3.0, when calling .next() on a returned element from evaluate,
> the node in the object returned was referenced as .kb, since 2.4.0 it is
> now referenced as .eb.
>
> In the first place, I'm not sure why the names would be 'eb' or 'kb'
> versus something like 'childNode'.
>
> I am passing .principalResult from SaxonJS.transform() on a sef file that
> was originally compiled from the XSLT sources; we cache the sef and only
> recompile if the XSLT has changed, while the input XML obviously would
> change more often.
>
> this.XPathOptions = {
> resultForm:'iterator',
> namespaceContext:{
> 'xsl':'http://www.w3.org/1999/XSL/Transform',
> 'ff':'http://www.shaped.ca/freeform'
> }
> };
>
> ...
>
> let ffComponentNodes = this.saxon.XPath.evaluate('//ff:component/@name',doc,this.XPathOptions);
>
> for (let x=ffComponentNodes.next();x!=null;x=ffComponentNodes.next()) {
> logger.log(util.inspect(x))
> ffComponents.push({
> name:x.value,
> node:x.eb // wtf? x.kb for saxon 2.3.0?? ughwtf
> });
> }
>
> for (let component of ffComponents) {
> ...
> component.node.parentNode.replaceChild(componentChunk.firstChild,component.node);
> }
>
>
> I'm not sure if I'm doing something wrong, if this is an actual issue/bug
> but it only popped up when using 2.4.0 and jumping back to 2.3.0 resolved
> it; also, changing from using x.kb to x.eb also seemed to fix it.
>
> Are these variables just the result of some sort of transpilation?
>
> Also, I can't seem to find any information regarding this and I've
> searched pretty heavily. I know that JSON is an option for input in a way,
> although most of the references I can seem to find about this seem to imply
> that people are using an XSLT stylesheet to dictate how to translate JSON
> to XML or vice-versa.
>
> What I want to do is a little different; I want to provide the input data
> for an XSLT template that would normally be XML, as JSON instead. My XSLT
> stylesheets are basically webpage templates with the XML input being the
> data to fill them out. Now that my system is all on node, I feel like I'm
> doing a needless step converting my data from JSON->XML before translating
> it, I'd like to be able to just use JSON as input but I haven't had any
> luck by setting sourceType: 'json' in the .transform({options})..? If this
> is possible is there somewhere I can find some better docs on it?
>
> I feel like there's potentially more functionality available in SasonJS
> too that's not as well documented; I would love to see the documentation
> improved perhaps.
>
> Previously my web platform used PHP and XSLT templates for just about
> everything; it seems time to perhaps use Node instead and SaxonJS seems to
> be my best bet for templates and so far it's mostly working great, although
> there's a few oddities I haven't figured out, I will likely post in the
> forum now that I'm signed up.
> ------------------------------
>
> You have received this notification because you have either subscribed to
> or are involved in a project on Saxonica Developer Community site. To
> change your notification preferences, please click here:
> https://saxonica.plan.io/my/account?tour=mail_preferences
>
> This notification was cheerfully delivered by <https://plan.io/>
> [image: Planio] <https://plan.io/>
>

--00000000000046061305df4ca886
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"auto">I&#39;m basically just trying to replace an element, &lt;=
ff:component&gt; with the output of a partial template.=C2=A0<div dir=3D"au=
to"><br></div><div dir=3D"auto">Basically I load a main template file, defa=
ult.xslt, which uses xsl imports to load other needed templates and does wh=
at it needs to build the page.</div><div dir=3D"auto"><br></div><div dir=3D=
"auto">When that gets spit out after transformation, I then take the ff:com=
ponent tags and replace them with the output of the component which is xhtm=
l5 as well (in this case also transformed from an xslt file but can be any =
output)</div><div dir=3D"auto"><br></div><div dir=3D"auto">I have no prefer=
ence to whether the tag is replaced after the initial transformation or bef=
ore but it seemed easier to do it after.</div><div dir=3D"auto"><br></div><=
div dir=3D"auto">As for using the internal methods, that just seemed the on=
ly way to get it done and I wasn&#39;t having much luck with the docs for j=
s version, though I&#39;m not understanding why with your suggestion select=
ing it without referencing the attribute would be any different, but I thin=
k I had tried without the attribute in the XPath and had no luck getting it=
to work.</div><div dir=3D"auto"><br></div><div dir=3D"auto">If you would l=
ike, I can try and post a clearer example of what I&#39;m doing/trying to d=
o.</div><div dir=3D"auto"><br></div><div dir=3D"auto">As for using JSON, yo=
ur example looks reasonable, I was thinking I would have to reference it sl=
ightly differently than xml input but that may still be better than convert=
ing it. I haven&#39;t found anything yet that really does json to xml the w=
ay I kind of expect although previously when I was doing this with PHP I di=
d have to write my own logic to convert objects to xml (I swear *everything=
* wants to convert arrays to elements whos tagname is the index of the arra=
y, which would be fine if your index wasn&#39;t an integer and having a &lt=
;0&gt;&lt;/0&gt; tag doesn&#39;t fly with xml lol)=C2=A0</div></div><br><di=
v class=3D"gmail_quote"><div dir=3D"ltr" class=3D"gmail_attr">On Wed., May =
18, 2022, 5:52 a.m. Saxonica Developer Community, &lt;<a href=3D"mailto:not=
ifications@plan.io">notifications@plan.io</a>&gt; wrote:<br></div><blockquo=
te class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc so=
lid;padding-left:1ex"><u></u>







<div style=3D"font-family:&quot;ProximaNova-Regular&quot;,Helvetica,Arial,s=
ans-serif;font-size:14px;line-height:1.4em;color:#333434">
<table width=3D"100%" cellspacing=3D"0" cellpadding=3D"0" style=3D"border-c=
ollapse:collapse;margin-bottom:1em;border:1px solid #bbb;padding:4px;border=
-spacing:0;margin-bottom:0;width:100%;border:none;padding:0">
<tr><td style=3D"border:1px solid #bbb;padding:4px;text-align:center;width:=
100%;font-family:MarketWeb,Helvetica,Arial,sans-serif;font-size:0.8em;color=
:#d7d7d7;border:none;padding:0"><p>--- In your reply, please do not write b=
elow this line ---</p></td></tr>
<tr><td style=3D"border:1px solid #bbb;padding:4px;border:none;padding:0">I=
ssue <a href=3D"https://saxonica.plan.io/issues/5494?pn=3D1#change-20617" s=
tyle=3D"color:#0088b7" target=3D"_blank" rel=3D"noreferrer">#5494</a> has b=
een updated by Michael Kay.
<hr style=3D"width:100%;height:1px;background:#ccc;border:0;margin:1.2em 0"=
>

<ul style=3D"color:#959595;margin-bottom:1.5em">
</ul>

<p>The names .kb and .eb are allocated by the Closure compiler when we comp=
ile the SaxonJS source code - they are liable to change every time we build=
the product. The fact that you&#39;re using these short names essentially =
means you&#39;re accessing an internal method/interface that we didn&#39;t =
realise users should want or need. We need to look more closely at what you=
&#39;re doing here and whether we need to make something internal into a pu=
blic/stable API.</p>
<hr style=3D"width:100%;height:1px;background:#ccc;border:0;margin:1.2em 0"=
>
<h1 style=3D"font-family:&quot;ProximaNova-Bold&quot;,Helvetica,Arial,sans-=
serif;font-weight:normal;margin:0px;font-size:1.3em;line-height:1.4em">
<a href=3D"https://saxonica.plan.io/issues/5494?pn=3D1#change-20617" styl=
e=3D"color:#0088b7;text-decoration:none" target=3D"_blank" rel=3D"noreferre=
r">Bug #5494: New Issue with 2.4.0</a>
<span style=3D"font-weight:bold;font-size:10px;padding:1px 3px;margin-rig=
ht:2px;margin-left:2px;border-radius:2px;text-transform:uppercase;text-deco=
ration:none;color:#205d86;border:1px solid #205d86">open</span>
</h1>

<ul style=3D"color:#959595;margin-bottom:1.5em"><li><strong>Author: </stron=
g>Jai B</li>
<li><strong>Status: </strong>New</li>
<li><strong>Priority: </strong>Normal</li>
<li><strong>Category: </strong>API</li>
<li><strong>Start date: </strong>2022-05-18</li>
<li><strong>Company: </strong></li>
<li><strong>Contact person: </strong></li>
<li><strong>Additional contact persons: </strong></li></ul>

<p>Hi,</p>
<p>This very well may not be a bug but perhaps user error, but it appeared =
when upgrading to 2.4.0.</p>
<p>Have XSLT files that are used for templates for a website generating XHT=
ML5 output.</p>
<p>We have some tags in them like, &lt;ff:component src=3D&quot;&quot; /&gt=
;, we have our namespace &#39;ff&#39; set in the templates and also set wit=
h XPathOptions in order to make Saxon not complain.</p>
<p>After compiling the stylesheet and getting the result, we do SaxonJS.XPa=
th.evaluate for the component elements and add them to an array of objects =
with the components name and the element itself.</p>
<p>On Saxon 2.3.0, when calling .next() on a returned element from evaluate=
, the node in the object returned was referenced as .kb, since 2.4.0 it is =
now referenced as .eb.</p>
<p>In the first place, I&#39;m not sure why the names would be &#39;eb&#39;=
or &#39;kb&#39; versus something like &#39;childNode&#39;.</p>
<p>I am passing .principalResult from SaxonJS.transform() on a sef file tha=
t was originally compiled from the XSLT sources; we cache the sef and only =
recompile if the XSLT has changed, while the input XML obviously would chan=
ge more often.</p>
<pre style=3D"font-family:Hack,Consolas,Menlo,&quot;Liberation Mono&quot;,C=
ourier,monospace;font-size:85%;background-color:#ececec;word-wrap:break-wor=
d;margin:1em 0;padding:8px;border:none;border-radius:3px;width:auto;overflo=
w-x:auto;overflow-y:hidden"><code style=3D"font-family:Hack,Consolas,Menlo,=
&quot;Liberation Mono&quot;,Courier,monospace;font-size:85%;background-colo=
r:#ececec;word-wrap:break-word;border-radius:3px;padding:0.2em;margin:0;pad=
ding:0"> this.XPathOptions =3D {
resultForm:&#39;iterator&#39;,
namespaceContext:{
&#39;xsl&#39;:&#39;<a href=3D"http://www.w3.org/1999/XSL/Transform" tar=
get=3D"_blank" rel=3D"noreferrer">http://www.w3.org/1999/XSL/Transform</a>&=
#39;,
&#39;ff&#39;:&#39;<a href=3D"http://www.shaped.ca/freeform" target=3D"_=
blank" rel=3D"noreferrer">http://www.shaped.ca/freeform</a>&#39;
}
};

...

let ffComponentNodes =3D this.saxon.XPath.evaluate(&#39;//ff:component/@n=
ame&#39;,doc,this.XPathOptions);

for (let x=3DffComponentNodes.next();x!=3Dnull;x=3DffComponentNodes.next(=
)) {
logger.log(util.inspect(x))
ffComponents.push({
name:x.value,
node:x.eb // wtf? x.kb for saxon 2.3.0?? ughwtf
});
}

for (let component of ffComponents) {
...
component.node.parentNode.replaceChild(componentChunk.firstChild,compone=
nt.node);
}

</code></pre>
<p>I&#39;m not sure if I&#39;m doing something wrong, if this is an actual =
issue/bug but it only popped up when using 2.4.0 and jumping back to 2.3.0 =
resolved it; also, changing from using x.kb to x.eb also seemed to fix it.<=
/p>
<p>Are these variables just the result of some sort of transpilation?</p>
<p>Also, I can&#39;t seem to find any information regarding this and I&#39;=
ve searched pretty heavily. I know that JSON is an option for input in a wa=
y, although most of the references I can seem to find about this seem to im=
ply that people are using an XSLT stylesheet to dictate how to translate JS=
ON to XML or vice-versa.</p>
<p>What I want to do is a little different; I want to provide the input dat=
a for an XSLT template that would normally be XML, as JSON instead. My XSLT=
stylesheets are basically webpage templates with the XML input being the d=
ata to fill them out. Now that my system is all on node, I feel like I&#39;=
m doing a needless step converting my data from JSON-&gt;XML before transla=
ting it, I&#39;d like to be able to just use JSON as input but I haven&#39;=
t had any luck by setting sourceType: &#39;json&#39; in the .transform({opt=
ions})..? If this is possible is there somewhere I can find some better doc=
s on it?</p>
<p>I feel like there&#39;s potentially more functionality available in Saso=
nJS too that&#39;s not as well documented; I would love to see the document=
ation improved perhaps.</p>
<p>Previously my web platform used PHP and XSLT templates for just about ev=
erything; it seems time to perhaps use Node instead and SaxonJS seems to be=
my best bet for templates and so far it&#39;s mostly working great, althou=
gh there&#39;s a few oddities I haven&#39;t figured out, I will likely post=
in the forum now that I&#39;m signed up.</p>


<div><div></div></div>

</td></tr>
<tr><td style=3D"border:1px solid #bbb;padding:4px;font-size:0.8em;width:10=
0%;border:none;padding:0"><hr style=3D"width:100%;height:1px;background:#cc=
c;border:0;margin:1.2em 0"><p>You have received this notification because y=
ou have either subscribed to or are involved in a project on Saxonica Devel=
oper Community site.
To change your notification preferences, please click here: <a href=3D"http=
s://saxonica.plan.io/my/account?tour=3Dmail_preferences" style=3D"color:#00=
88b7" target=3D"_blank" rel=3D"noreferrer">https://saxonica.plan.io/my/acco=
unt?tour=3Dmail_preferences</a></p></td></tr>
<tr><td style=3D"border:1px solid #bbb;padding:4px;text-align:center;width:=
100%;font-family:MarketWeb,Helvetica,Arial,sans-serif;font-size:1.2em;color=
:#d7d7d7;border:none;padding:0"><br><div><a href=3D"https://plan.io/" style=
=3D"color:#0088b7;color:#d7d7d7;text-decoration:none" target=3D"_blank" rel=
=3D"noreferrer">This notification was cheerfully delivered by</a></div></td=
></tr>
<tr><td style=3D"border:1px solid #bbb;padding:4px;text-align:center;width:=
100%;border:none;padding:0"><a href=3D"https://plan.io/" title=3D"Planio" s=
tyle=3D"color:#0088b7" target=3D"_blank" rel=3D"noreferrer"><img src=3D"htt=
ps://assets.plan.io/images/planio_logo_gray_204x50.png" height=3D"25" width=
=3D"102" border=3D"0" alt=3D"Planio" style=3D"vertical-align:middle;border:=
none"></a></td></tr>
</table>
</div>

</blockquote></div>

--00000000000046061305df4ca886--
    (1-1/1)