<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<div class="markdown-here-wrapper" data-md-url="" style="" markdown-here-wrapper-content-modified="true">
<p style="margin: 0px 0px 1.2em !important;">On 16/03/2023 11:13,
Tagir Valeev wrote:</p>
<p style="margin: 0px 0px 1.2em !important;"></p>
<div class="markdown-here-exclude">
<p></p>
<blockquote type="cite" cite="mid:CAE+3fjbp_EkGzreciDYk6w_47LR2ZH5D=pzG1DQR8-XYk4bHkg@mail.gmail.com">
<p style="margin:0px 0px 1.2em">Also fails (with same error).
Now, there are two questions here:</p>
<ol style="margin:1.2em 0px;padding-left:2em">
<li style="margin:0.5em 0px">should the cast be statically
rejected - this means asking whether <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">Sub<?></code>
and <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">Super<? super Box<?>></code>
are provably distinct parameterized types;</li>
<li style="margin:0.5em 0px">should the cast be allowed
without warnings - this means proving that there is only
one possible way to go from a <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">Super<? super Box<?>></code>
down to a <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">Sub<?></code>;</li>
</ol>
</blockquote>
<p></p>
</div>
<p style="margin: 0px 0px 1.2em !important;"></p>
<p style="margin: 0px 0px 1.2em !important;">Before I dive into
the actual rules, I must pause for a second, and tackle the
elephant in the room: there is a long-standing discrepancy
between javac and Eclipse - in that javac static checks around
casts go beyond what is specified by the JLS. This can result in
some casts being <em>rejected</em>, rather than simply flagged
with an unchecked warning. We are in one such case here.</p>
<p style="margin: 0px 0px 1.2em !important;">Back to the example,
we have to prove that there exists a narrowing reference
conversion (5.1.6.1) between <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Super<#CAP1></code>,
where <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">#CAP1 :> Box<?></code>
(note the capture conversion here) and <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Sub<?></code>.
To do that we have to prove that there is <i>no</i> supertype X
of <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Super<#CAP1></code>
and Y of <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Sub<?></code>
such that X and Y are provably distinct (4.5). To establish
that, we need to first find a supertype of <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Sub<?></code>
that can be compared against <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Super<#CAP1></code>.
That supertype is <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Super<#CAP2></code>
where <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">#CAP1 <: Object</code>
(that's the direct supertype of <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Sub<?></code>).
So, are <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Super<#CAP1></code>
and <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Super<#CAP2></code>
provably distinct? From the definition:<br>
</p>
<p style="margin: 0px 0px 1.2em !important;"></p>
<div class="markdown-here-exclude">
<p></p>
<blockquote type="cite">Two type arguments are provably distinct
if one of the following is true:<br>
<br>
Neither argument is a type variable or wildcard, and the
two arguments are not the same type.<br>
<br>
One type argument is a type variable or wildcard, with an
upper bound (from capture conversion (§5.1.10), if necessary)
of S; and the other type argument T is not a type variable or
wildcard; and neither |S| <: |T| nor |T| <: |S| (§4.8,
§4.10).<br>
<br>
Each type argument is a type variable or wildcard, with
upper bounds (from capture conversion, if necessary) of S and
T; and neither |S| <: |T| nor |T| <: |S|.<br>
<br>
</blockquote>
<p></p>
</div>
<p style="margin: 0px 0px 1.2em !important;"></p>
<p style="margin: 0px 0px 1.2em !important;">Since the upper
bounds of <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">#CAP1</code>
and <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">#CAP2</code>
are compatible (after all, <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Box<?> <: Object</code>
), we can conclude that, from a JLS perspective, <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Super<#CAP1></code>
and <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Super<#CAP2></code>
are <em>not</em> provably distinct. So a narrowing reference
conversion exists, and the cast should be allowed.</p>
<p style="margin: 0px 0px 1.2em !important;">Should there be a
warning? This depends on whether the narrowing reference
conversion is checked - which is defined in 5.1.6.2:</p>
<p style="margin: 0px 0px 1.2em !important;"></p>
<div class="markdown-here-exclude">
<p></p>
<blockquote type="cite">The unchecked narrowing reference
conversions are as follows:<br>
<br>
A narrowing reference conversion from a type S to a
parameterized class or interface type T is unchecked, unless
at least one of the following is true:<br>
<br>
All of the type arguments of T are unbounded
wildcards.<br>
<br>
T <: S, and S has no subtype X other than T where
the type arguments of X are not contained in the type
arguments of T.<br>
</blockquote>
<p></p>
</div>
<p style="margin: 0px 0px 1.2em !important;"></p>
<p style="margin: 0px 0px 1.2em !important;">Since here the target
T is <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Sub<?></code>,
which contains only unbounded wildcards, the conversion should <em>not</em>
be unchecked (meaning no warning should be generated). This also
means that <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Sub<?></code>
is a valid type test pattern for the instanceof.</p>
<p style="margin: 0px 0px 1.2em !important;">Back to javac, the
reason as to why javac disallows the cast (and hence, the
instanceof) is that javac doesn’t think that you can write a
well-formed witness of <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Super<? super Box<?>></code>
that is <em>also</em> compatible with <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Sub<?></code>.
I believe javac is correct in its assertion: the only two
witnesses I can think of are <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Super<Box<?>></code>
and <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Super<Box></code>,
neither of which seems compatible with <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Sub<?></code>
(as <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Sub<T> extends Super<Box<T>></code>,
and there’s no value you can replace for T to make the resulting
type match with either <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Super<Box></code>
or <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Super<Box<?>></code>).
Which is exactly the same reason as to why javac doesn’t think
(inside the <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">main</code>
method) that there’s a way for <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">new Sub<></code>
to be inferred such that the inferred type is compatible with <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Super<? super Box<?>></code>.
</p>
<p style="margin: 0px 0px 1.2em !important;">Now, while there are
some discrepancies between what the JLS say and what javac does
with respect to narrowing reference conversions, there should be
no such discrepancies when it comes to inference. Note that the
same failure with <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">new Sub<></code>
can be reproduced even w/o method call, as in:</p>
<pre style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;font-size: 1em; line-height: 1.2em;margin: 1.2em 0px;"><code class="hljs language-java" style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;white-space: pre; overflow: auto; border-radius: 3px; border: 1px solid rgb(204, 204, 204); padding: 0.5em 0.7em; display: block !important;display: block; overflow-x: auto; padding: 0.5em; color: rgb(51, 51, 51); background: rgb(248, 248, 248) none repeat scroll 0% 0%; -moz-text-size-adjust: none;">Super<? <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">super</span> Box<?>> s = <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">new</span> Sub<>();
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">In this case the
compiler has to prove that:</p>
<pre style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;font-size: 1em; line-height: 1.2em;margin: 1.2em 0px;"><code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;white-space: pre; overflow: auto; border-radius: 3px; border: 1px solid rgb(204, 204, 204); padding: 0.5em 0.7em; display: block !important;">Sub<alpha> <: Super<? super Box<?>>
--> Super<Box<alpha>> <: Super<? super Box<?>>
--> Box<alpha> <= ? super Box<?>
--> Box<?> <: Box<alpha>
--> ? <= alpha
--> false
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">(that’s because
18.2.3 doesn’t have any notion of how to reduce the above type
containment).</p>
<p style="margin: 0px 0px 1.2em !important;">In other words,
there’s no instantiation for alpha which makes the above proof
correct, so infererence must fail.</p>
<p style="margin: 0px 0px 1.2em !important;">Summing up, we know
there are difference between how Eclipse, JLS and javac deal
with narrowing reference conversions. But, typically the
mismatches have to do with corner cases where no concrete
witness for the cast can be produced. So I think the most
important question here is whether <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">isSub(new Sub<>())</code>
should succeed at all. I don’t think it should (see above) - and
if that’s the case, this seems “just” another case where javac
eagerly rejects a cast that seems unsound anyway.</p>
<p style="margin: 0px 0px 1.2em !important;">Cheers</p>
<p style="margin: 0px 0px 1.2em !important;">Maurizio</p>
<div title="MDH:PHA+PGJyPjwvcD48ZGl2IGNsYXNzPSJtb3otY2l0ZS1wcmVmaXgiPk9uIDE2LzAzLzIwMjMgMTE6MTMsIFRhZ2lyIFZhbGVldiB3cm90ZTo8YnI+PC9kaXY+PGJsb2NrcXVvdGUgdHlwZT0iY2l0ZSIg
Y2l0ZT0ibWlkOkNBRSszZmpicF9Fa0d6cmVjaURZazZ3XzQ3TFIyWkg1RD1wekcxRFFSOC1YWWs0
YkhrZ0BtYWlsLmdtYWlsLmNvbSI+PHAgc3R5bGU9Im1hcmdpbjowcHggMHB4IDEuMmVtIj5BbHNv
IGZhaWxzICh3aXRoIHNhbWUKICAgICAgICBlcnJvcikuIE5vdywgdGhlcmUgYXJlIHR3byBxdWVz
dGlvbnMgaGVyZTo8L3A+CiAgICAgIDxvbCBzdHlsZT0ibWFyZ2luOjEuMmVtIDBweDtwYWRkaW5n
LWxlZnQ6MmVtIj4KICAgICAgICA8bGkgc3R5bGU9Im1hcmdpbjowLjVlbSAwcHgiPnNob3VsZCB0
aGUgY2FzdCBiZSBzdGF0aWNhbGx5CiAgICAgICAgICByZWplY3RlZCAtIHRoaXMgbWVhbnMgYXNr
aW5nIHdoZXRoZXIgPGNvZGUgc3R5bGU9ImZvbnQtc2l6ZTowLjg1ZW07Zm9udC1mYW1pbHk6Q29u
c29sYXMsSW5jb25zb2xhdGEsQ291cmllcixtb25vc3BhY2U7bWFyZ2luOjBweCAwLjE1ZW07cGFk
ZGluZzowcHggMC4zZW07d2hpdGUtc3BhY2U6cHJlLXdyYXA7Ym9yZGVyOjFweCBzb2xpZCByZ2Io
MjM0LDIzNCwyMzQpO2JhY2tncm91bmQtY29sb3I6cmdiKDI0OCwyNDgsMjQ4KTtib3JkZXItcmFk
aXVzOjNweDtkaXNwbGF5OmlubGluZSI+U3ViJmx0Oz8mZ3Q7PC9jb2RlPgogICAgICAgICAgYW5k
IDxjb2RlIHN0eWxlPSJmb250LXNpemU6MC44NWVtO2ZvbnQtZmFtaWx5OkNvbnNvbGFzLEluY29u
c29sYXRhLENvdXJpZXIsbW9ub3NwYWNlO21hcmdpbjowcHggMC4xNWVtO3BhZGRpbmc6MHB4IDAu
M2VtO3doaXRlLXNwYWNlOnByZS13cmFwO2JvcmRlcjoxcHggc29saWQgcmdiKDIzNCwyMzQsMjM0
KTtiYWNrZ3JvdW5kLWNvbG9yOnJnYigyNDgsMjQ4LDI0OCk7Ym9yZGVyLXJhZGl1czozcHg7ZGlz
cGxheTppbmxpbmUiPlN1cGVyJmx0Oz8gc3VwZXIgQm94Jmx0Oz8mZ3Q7Jmd0OzwvY29kZT4KICAg
ICAgICAgIGFyZSBwcm92YWJseSBkaXN0aW5jdCBwYXJhbWV0ZXJpemVkIHR5cGVzOzwvbGk+CiAg
ICAgICAgPGxpIHN0eWxlPSJtYXJnaW46MC41ZW0gMHB4Ij5zaG91bGQgdGhlIGNhc3QgYmUgYWxs
b3dlZAogICAgICAgICAgd2l0aG91dCB3YXJuaW5ncyAtIHRoaXMgbWVhbnMgcHJvdmluZyB0aGF0
IHRoZXJlIGlzIG9ubHkgb25lCiAgICAgICAgICBwb3NzaWJsZSB3YXkgdG8gZ28gZnJvbSBhIDxj
b2RlIHN0eWxlPSJmb250LXNpemU6MC44NWVtO2ZvbnQtZmFtaWx5OkNvbnNvbGFzLEluY29uc29s
YXRhLENvdXJpZXIsbW9ub3NwYWNlO21hcmdpbjowcHggMC4xNWVtO3BhZGRpbmc6MHB4IDAuM2Vt
O3doaXRlLXNwYWNlOnByZS13cmFwO2JvcmRlcjoxcHggc29saWQgcmdiKDIzNCwyMzQsMjM0KTti
YWNrZ3JvdW5kLWNvbG9yOnJnYigyNDgsMjQ4LDI0OCk7Ym9yZGVyLXJhZGl1czozcHg7ZGlzcGxh
eTppbmxpbmUiPlN1cGVyJmx0Oz8gc3VwZXIgQm94Jmx0Oz8mZ3Q7Jmd0OzwvY29kZT4KICAgICAg
ICAgIGRvd24gdG8gYSA8Y29kZSBzdHlsZT0iZm9udC1zaXplOjAuODVlbTtmb250LWZhbWlseTpD
b25zb2xhcyxJbmNvbnNvbGF0YSxDb3VyaWVyLG1vbm9zcGFjZTttYXJnaW46MHB4IDAuMTVlbTtw
YWRkaW5nOjBweCAwLjNlbTt3aGl0ZS1zcGFjZTpwcmUtd3JhcDtib3JkZXI6MXB4IHNvbGlkIHJn
YigyMzQsMjM0LDIzNCk7YmFja2dyb3VuZC1jb2xvcjpyZ2IoMjQ4LDI0OCwyNDgpO2JvcmRlci1y
YWRpdXM6M3B4O2Rpc3BsYXk6aW5saW5lIj5TdWImbHQ7PyZndDs8L2NvZGU+OzwvbGk+PC9vbD48
L2Jsb2NrcXVvdGU+PHA+U28sIGJhY2sgdG8gdGhpcy48L3A+PHA+SkxTIDQuNSBkZWZpbmVzIHdo
ZW4gdHdvIHBhcmFtZXRlcml6ZWQgdHlwZXMgY2FuIGJlIGNvbnNpZGVyZWQgInByb3ZhYmx5IGRp
c3RpbmN0Ii4gVGhlIHNwaXJpdCBvZiB0aGUgSkxTIHJ1bGVzIGlzIHJhdGhlciBsaWJlcmFsIC0g
dGhhdCBpcywgYExpc3QmbHQ7U3RyaW5nJmd0O2AgYW5kIGBMaXN0Jmx0O0ludGVnZXImZ3Q7YCBh
cmUgdHJlYXRlZCBhcyBkaXN0aW5jdCBwYXJhbWV0ZXJpemF0aW9uLCBidXQgYW55dGhpbmcgaW52
b2x2aW5nIGEgd2lsZGNhcmQgaXMgbm90IC0gZS5nLiBgTGlzdCZsdDs/IGV4dGVuZHMgU3RyaW5n
Jmd0O2AgYW5kIGBMaXN0Jmx0O0ludGVnZXImZ3Q7YCBhcmUgX25vdF8gcHJvdmFibHkgZGlzdGlu
Y3QgYWNjb3JkaW5nIHRvIHRoZSBKTFMuIFNvLCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRp
b24sIHRoZSBjYXN0IHNob3VsZCBiZSBhbGxvd2VkLjxicj48L3A+PHA+SGVyZSBJIG11c3QgcGF1
c2UgZm9yIGEgc2Vjb25kLCBhbmQgdGFja2xlIHRoZSBlbGVwaGFudCBpbiB0aGUgcm9vbTogdGhl
cmUgaXMgYSBsb25nLXN0YW5kaW5nIGRpc2NyZXBhbmN5IGJldHdlZW4gamF2YWMgYW5kIEVjbGlw
c2UgLSBpbiB0aGF0IGphdmFjIHN0YXRpYyBjaGVja3MgZ29lcyBiZXlvbmQgd2hhdCBpcyBzcGVj
aWZpZWQgYnkgdGhlIEpMUy4gTW9yZSBzcGVjaWZpY2FsbHksIHRoZSBub3Rpb24gb2YgdHlwZSBk
aXNqb2ludG5lc3MgaW4gamF2YWMgaXMgZmFyIG1vcmUgcmVmaW5lZCwgYW5kIGNvdWxkIGJlIHN1
bW1hcml6ZWQgYXMgImlzIGl0IHBvc3NpYmxlIHRvIGNvbWUgdXAgd2l0aCBhIHdpdG5lc3Mgb2Yg
b25lIHR5cGUgdGhhdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIG90aGVyIHR5cGU/Ii4gVGhpcyBy
dWxlIGlzIHNoYXJwZXIgdGhhbiB3aGF0IHRoZSBKTFMgbWFuZGF0ZXMsIGFuZCByZXN1bHRzIGlu
IHNvbWUgY2FzdHMgYmVpbmcgX3JlamVjdGVkXyAobGlrZSB0aGUgb25lIGZyb20gYExpc3QmbHQ7
PyBleHRlbmRzIFN0cmluZyZndDtgIHRvIGBMaXN0Jmx0O0ludGVnZXImZ3Q7YCkgcmF0aGVyIHRo
YW4gc2ltcGx5IGJlIGZsYWdnZWQgd2l0aCBhbiB1bmNoZWNrZWQgd2FybmluZy4gV2UgYXJlIGlu
IG9uZSBzdWNoIGNhc2UgaGVyZS4gVGhhdCBpcywgd2UgaGF2ZSB0byBwcm92ZSB0aGF0IHRoZXJl
IGV4aXN0cyBhIG5hcnJvd2luZyByZWZlcmVuY2UgY29udmVyc2lvbiBiZXR3ZWVuIGBTdXBlciZs
dDsjQ0FQJmd0O2AsIHdoZXJlIGAjQ0FQIDomZ3Q7IEJveCZsdDs/Jmd0O2AgKG5vdGUgdGhlIGNh
cHR1cmUgY29udmVyc2lvbiBoZXJlKSBhbmQgYFN1YiZsdDs/Jmd0O2AuIFRvIGRvIHRoYXQgd2Ug
aGF2ZSB0byBwcm92ZSB0aGF0IGBTdXBlciZsdDsjQ0FQJmd0O2AgYW5kIGBCb3gmbHQ7PyZndDtg
IGFyZSBfbm90XyBwcm92YWJseSBkaXN0aW5jdC4gRm9sbG93aW5nIHRoZSBKTFMgZGVmaW5pdGlv
bjo8YnI+PGJyPjxibG9ja3F1b3RlIHR5cGU9ImNpdGUiPlR3byB0eXBlIGFyZ3VtZW50cyBhcmUg
cHJvdmFibHkgZGlzdGluY3QgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTo8YnI+Cjxi
cj4KJm5ic3A7Jm5ic3A7Jm5ic3A7IE5laXRoZXIgYXJndW1lbnQgaXMgYSB0eXBlIHZhcmlhYmxl
IG9yIHdpbGRjYXJkLCBhbmQgdGhlIHR3byBhcmd1bWVudHMgYXJlIG5vdCB0aGUgc2FtZSB0eXBl
Ljxicj4KPGJyPgombmJzcDsmbmJzcDsmbmJzcDsgT25lIHR5cGUgYXJndW1lbnQgaXMgYSB0eXBl
IHZhcmlhYmxlIG9yIHdpbGRjYXJkLCB3aXRoIGFuIHVwcGVyIApib3VuZCAoZnJvbSBjYXB0dXJl
IGNvbnZlcnNpb24gKMKnNS4xLjEwKSwgaWYgbmVjZXNzYXJ5KSBvZiBTOyBhbmQgdGhlIApvdGhl
ciB0eXBlIGFyZ3VtZW50IFQgaXMgbm90IGEgdHlwZSB2YXJpYWJsZSBvciB3aWxkY2FyZDsgYW5k
IG5laXRoZXIgCnxTfCAmbHQ7OiB8VHwgbm9yIHxUfCAmbHQ7OiB8U3wgKMKnNC44LCDCpzQuMTAp
Ljxicj4KPGJyPgombmJzcDsmbmJzcDsmbmJzcDsgRWFjaCB0eXBlIGFyZ3VtZW50IGlzIGEgdHlw
ZSB2YXJpYWJsZSBvciB3aWxkY2FyZCwgd2l0aCB1cHBlciBib3VuZHMKIChmcm9tIGNhcHR1cmUg
Y29udmVyc2lvbiwgaWYgbmVjZXNzYXJ5KSBvZiBTIGFuZCBUOyBhbmQgbmVpdGhlciB8U3wgCiZs
dDs6IHxUfCBub3IgfFR8ICZsdDs6IHxTfC48YnI+Cjxicj4KPC9ibG9ja3F1b3RlPkFzIHRoaXMg
cGFyYSBzYXlzIG5vdGhpbmcgYWJvdXQgbG93ZXItYm91bmRlZCB3aWxkY2FyZHMvY2FwdHVyZWQg
dmFycywgd2UgaGF2ZSB0byBjb25jbHVkZSB0aGF0LCBmcm9tIGEgSkxTIHBlcnNwZWN0aXZlLCBg
U3VwZXImbHQ7I0NBUCZndDtgIGFuZCBgQm94Jmx0Oz8mZ3Q7YCBhcmUgX25vdF8gcHJvdmFibHkg
ZGlzdGluY3QuIFNvIGEgbmFycm93aW5nIHJlZmVyZW5jZSBjb252ZXJzaW9uIGV4aXN0cywgYW5k
IHRoZSBjYXN0IHNob3VsZCBiZSBhbGxvd2VkLjwvcD48cD5TaG91bGQgdGhlcmUgYmUgYSB3YXJu
aW5nPyBUaGlzIGRlcGVuZHMgb24gd2hldGhlciB0aGUgbmFycm93aW5nIHJlZmVyZW5jZSBjb252
ZXJzaW9uIGlzIGNoZWNrZWQgLSB3aGljaCBpcyBkZWZpbmVkIGluIDUuMS42LjI6PGJyPjxicj48
YmxvY2txdW90ZSB0eXBlPSJjaXRlIj5UaGUgdW5jaGVja2VkIG5hcnJvd2luZyByZWZlcmVuY2Ug
Y29udmVyc2lvbnMgYXJlIGFzIGZvbGxvd3M6PGJyPgo8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyBB
IG5hcnJvd2luZyByZWZlcmVuY2UgY29udmVyc2lvbiBmcm9tIGEgdHlwZSBTIHRvIGEgcGFyYW1l
dGVyaXplZCAKY2xhc3Mgb3IgaW50ZXJmYWNlIHR5cGUgVCBpcyB1bmNoZWNrZWQsIHVubGVzcyBh
dCBsZWFzdCBvbmUgb2YgdGhlIApmb2xsb3dpbmcgaXMgdHJ1ZTo8YnI+Cjxicj4KJm5ic3A7Jm5i
c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEFsbCBvZiB0aGUgdHlwZSBhcmd1bWVu
dHMgb2YgVCBhcmUgdW5ib3VuZGVkIHdpbGRjYXJkcy48YnI+Cjxicj4KJm5ic3A7Jm5ic3A7Jm5i
c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFQgJmx0OzogUywgYW5kIFMgaGFzIG5vIHN1YnR5
cGUgWCBvdGhlciB0aGFuIFQgd2hlcmUgdGhlIHR5cGUgCmFyZ3VtZW50cyBvZiBYIGFyZSBub3Qg
Y29udGFpbmVkIGluIHRoZSB0eXBlIGFyZ3VtZW50cyBvZiBULjxicj4KPC9ibG9ja3F1b3RlPlNp
bmNlIGhlcmUgdGhlIHRhcmdldCBUIGlzIFN1YiZsdDs/Jmd0Oywgd2hpY2ggY29udGFpbnMgb25s
eSB1bmJvdW5kZWQgd2lsZGNhcmRzLCB0aGUgY29udmVyc2lvbiBzaG91bGQgX25vdF8gYmUgdW5j
aGVja2VkIChtZWFuaW5nIG5vIHdhcm5pbmcgc2hvdWxkIGJlIGdlbmVyYXRlZCkuIFRoaXMgYWxz
byBtZWFucyB0aGF0IGBTdWImbHQ7PyZndDtgIGlzIGEgdmFsaWQgdHlwZSB0ZXN0IHBhdHRlcm4g
Zm9yIHRoZSBpbnN0YW5jZW9mLjwvcD48cD48YnI+PC9wPjxwPkJhY2sgdG8gamF2YWMsIHRoZSBy
ZWFzb24gYXMgdG8gd2h5IGphdmFjIGRpc2FsbG93cyB0aGUgY2FzdCAoYW5kIGhlbmNlLCB0aGUg
aW5zdGFuY2VvZikgaXMgdGhhdCBqYXZhYyBkb2Vzbid0IHRoaW5rIHRoYXQgeW91IGNhbiB3cml0
ZSBhIHdlbGwtZm9ybWVkIHdpdG5lc3Mgb2YgYFN1cGVyJmx0Oz8gc3VwZXIgQm94Jmx0Oz8mZ3Q7
Jmd0O2AgdGhhdCBpcyBfYWxzb18gY29tcGF0aWJsZSB3aXRoIGBTdWImbHQ7PyZndDtgLiBJIGJl
bGlldmUgamF2YWMgaXMgY29ycmVjdCBpbiBpdHMgYXNzZXJ0aW9uOiB0aGUgb25seSB0d28gd2l0
bmVzc2VzIEkgY2FuIHRoaW5rIG9mIGFyZSBgU3VwZXImbHQ7Qm94Jmx0Oz8mZ3Q7Jmd0O2AgYW5k
IGBTdXBlciZsdDtCb3gmZ3Q7YCwgbmVpdGhlciBvZiB3aGljaCBzZWVtcyBjb21wYXRpYmxlIHdp
dGggYFN1YiZsdDs/Jmd0O2AgKGFzIGBTdWImbHQ7VCZndDsgZXh0ZW5kcyBTdXBlciZsdDtCb3gm
bHQ7VCZndDsmZ3Q7YCwgYW5kIHRoZXJlJ3Mgbm8gdmFsdWUgeW91IGNhbiByZXBsYWNlIGZvciBU
IHRvIG1ha2UgdGhlIHJlc3VsdGluZyB0eXBlIG1hdGNoIHdpdGggZWl0aGVyIGBTdXBlciZsdDtC
b3gmZ3Q7YCBvciBgU3VwZXImbHQ7Qm94Jmx0Oz8mZ3Q7Jmd0O2ApLiBXaGljaCBpcyBleGFjdGx5
IHRoZSBzYW1lIGlzc3VlIGFzIHRvIHdoeSBqYXZhYyBkb2Vzbid0IHRoaW5rIChpbnNpZGUgdGhl
IGBtYWluYCBtZXRob2QpIHRoYXQgdGhlcmUncyBhIHdheSBmb3IgYG5ldyBTdWImbHQ7Jmd0O2Ag
dG8gYmUgaW5mZXJyZWQgc3VjaCB0aGF0IHRoZSBpbmZlcnJlZCB0eXBlIGlzIGNvbXBhdGlibGUg
d2l0aCBgU3VwZXImbHQ7PyBzdXBlciBCb3gmbHQ7PyZndDsmZ3Q7YC4gPGJyPjwvcD48cD5Ob3cs
IHdoaWxlIHRoZXJlIGFyZSBzb21lIGRpc2NyZXBhbmNpZXMgYmV0d2VlbiB3aGF0IHRoZSBKTFMg
c2F5IGFuZCB3aGF0IGphdmFjIGRvZXMgd2l0aCByZXNwZWN0IHRvIG5hcnJvd2luZyByZWZlcmVu
Y2UgY29udmVyc2lvbnMsIHRoZXJlIHNob3VsZCBiZSBubyBzdWNoIGRpc2NyZXBhbmNpZXMgd2hl
biBpdCBjb21lcyB0byBpbmZlcmVuY2UuIE5vdGUgdGhhdCB0aGUgc2FtZSBmYWlsdXJlIHdpdGgg
YG5ldyBTdWImbHQ7Jmd0O2AgY2FuIGJlIHJlcHJvZHVjZWQgZXZlbiB3L28gbWV0aG9kIGNhbGws
IGFzIGluOjxicj48YnI+YGBgamF2YTxicj5TdXBlciZsdDs/IHN1cGVyIEJveCZsdDs/Jmd0OyZn
dDsgcyA9IG5ldyBTdWImbHQ7Jmd0OygpOzxicj5gYGA8L3A+PHA+SW4gdGhpcyBjYXNlIHRoZSBj
b21waWxlciBoYXMgdG8gcHJvdmUgdGhhdDo8YnI+PGJyPmBgYDxicj5TdWImbHQ7YWxwaGEmZ3Q7
ICZsdDs6IFN1cGVyJmx0Oz8gc3VwZXIgQm94Jmx0Oz8mZ3Q7Jmd0Ozxicj4tLSZndDsgU3VwZXIm
bHQ7Qm94Jmx0O2FscGhhJmd0OyZndDsgJmx0OzogU3VwZXImbHQ7PyBzdXBlciBCb3gmbHQ7PyZn
dDsmZ3Q7PGJyPi0tJmd0OyBCb3gmbHQ7YWxwaGEmZ3Q7ICZsdDs9ID8gc3VwZXIgQm94Jmx0Oz8m
Z3Q7PGJyPi0tJmd0OyBCb3gmbHQ7PyZndDsgJmx0OzogQm94Jmx0O2FscGhhJmd0Ozxicj4tLSZn
dDsgPyAmbHQ7PSBhbHBoYTxicj4tLSZndDsgZmFsc2U8YnI+YGBgPGJyPjwvcD48cD4odGhhdCdz
IGJlY2F1c2UgMTguMi4zIGRvZXNuJ3QgaGF2ZSBhbnkgbm90aW9uIG9mIGhvdyB0byByZWR1Y2Ug
dGhlIGFib3ZlIHR5cGUgY29udGFpbm1lbnQpLjwvcD48cD5JbiBvdGhlciB3b3JkcywgdGhlcmUn
cyBubyBpbnN0YW50aWF0aW9uIGZvciBhbHBoYSB3aGljaCBtYWtlcyB0aGUgYWJvdmUgcHJvb2Yg
Y29ycmVjdCwgc28gaW5mZXJlcmVuY2UgbXVzdCBmYWlsLjwvcD48cD48YnI+U3VtbWluZyB1cCwg
d2Uga25vdyB0aGVyZSBhcmUgZGlmZmVyZW5jZSBiZXR3ZWVuIGhvdyBFY2xpcHNlLCBKTFMgYW5k
IGphdmFjIGRlYWwgd2l0aCBuYXJyb3dpbmcgcmVmZXJlbmNlIGNvbnZlcnNpb25zLiBCdXQsIHR5
cGljYWxseSB0aGUgbWlzbWF0Y2hlcyBoYXZlIHRvIGRvIHdpdGggY2FzZXMgd2hlcmUgbm8gY29u
Y3JldGUgd2l0bmVzcyBmb3IgdGhlIGNhc3QgY2FuIGJlIHByb2R1Y2VkLiBTbyBJIHRoaW5rIHRo
ZSBtb3N0IGltcG9ydGFudCBxdWVzdGlvbiBoZXJlIGlzIHdoZXRoZXIgYG5ldyBTdWImbHQ7Jmd0
O2Agc2hvdWxkIHN1Y2NlZWQgYXQgYWxsLiBJIGRvbid0IHRoaW5rIGl0IHNob3VsZCAtIGFuZCBp
ZiB0aGF0J3MgdGhlIGNhc2UsIHRoaXMgc2VlbXMgImp1c3QiIGFub3RoZXIgY2FzZSB3aGVyZSBq
YXZhYyBhdHRlbXB0cyB0byBkZXRlY3QgdGhpbmdzIG1vcmUgZWFnZXJseSB3aGVuIGRvaW5nIHRo
ZSBjYXN0IGNvbnZlcnNpb24gZm9yIGNvZGUgdGhhdCBpcyB1bnNvdW5kIGFueXdheS48L3A+PHA+
Q2hlZXJzPGJyPjxicj5NYXVyaXppbzxicj48L3A+" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0;"></div>
</div>
</body>
</html>