<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<div class="markdown-here-wrapper" data-md-url="Thunderbird"
style="">
<p style="margin: 0px 0px 1.2em !important;">Since we’re already
discussing one of the consequences of sealed types, let’s put
the whole story on the table. These are my current thoughts, but
there’s room in the design space to wander a bit. </p>
<p style="margin: 0px 0px 1.2em !important;"><strong>Definition.</strong>
A <em>sealed type</em> is one for which subclassing is
restricted according to guidance specified with the type’s
declaration; finality can be considered a degenerate form of
sealing, where no subclasses at all are permitted. Sealed types
are a sensible means of modeling <em>algebraic sum types</em>
in a nominal type hierarchy; they go nicely with records (<em>algebraic
product types</em>), though are also useful on their own.</p>
<p style="margin: 0px 0px 1.2em !important;">Sealing serves two
distinct purposes. The first, and more obvious, is that it
restricts who can be a subtype. This is largely a
declaration-site concern, where an API owner wants to defend the
integrity of their API. The other is that it potentially enables
exhaustiveness analysis at the use site when switching over
sealed types (and possibly other features.) This is less
obvious, and the benefit is contingent on some other things, but
is valuable as it enables better compile-time type checking. </p>
<p style="margin: 0px 0px 1.2em !important;"><em>Note:</em> It is
probably desirable to ship this with records, though it could be
shipped before or after.</p>
<p style="margin: 0px 0px 1.2em !important;"><strong>Declaration.</strong>
We specify that a class is sealed by applying 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;">sealed</code>
modifier to a class, abstract class, interface, or record:</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;">sealed interface Node { ... }
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">In this streamlined
form, <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;">Node</code>
may be extended only by its nestmates. This may be suitable for
many situations, but not for all; in this case, the user may
specify an explicit <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;">permits</code>
list:</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;">sealed interface Node
permits FooNode, BarNode { ... }
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">The two forms may not
be combined; if there is a permits list, it must list all the
permitted subtypes. We can think of the simple form as merely
inferring 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;">permits</code>
clause from information in the same compilation unit. </p>
<p style="margin: 0px 0px 1.2em !important;"><strong>Exhaustiveness.</strong>
One of the benefits of sealing is that the compiler can
enumerate the permitted subtypes of a sealed type; this in turn
lets us perform exhaustiveness analysis when switching over
patterns involving sealed types. (In the simplified form, the
compiler computes the permits list by enumerating the subtypes
in the nest when the nest is declared, since they are in a
single compilation unit.) Permitted subtypes must belong to the
same module (or, if not in a module, the same package and
protection domain.)</p>
<p style="margin: 0px 0px 1.2em !important;"><em>Note:</em> It is
superficially tempting to have a relaxed but less explicit form,
say which allows for a type to be extended by package-mates or
module-mates without listing them all. However, this would
undermine the compiler’s ability to reason about exhaustiveness.
This would achieve the desired subclassing restrictions, but not
the desired ability to reason about exhaustiveness. </p>
<p style="margin: 0px 0px 1.2em !important;"><strong>Classfile.</strong>
In the classfile, a sealed type is identified with an <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;">ACC_SEALED</code>
modifier (we could choose to overload <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;">ACC_FINAL</code>
for bit preservation), and 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;">Sealed</code>
attribute which contains a list of permitted subtypes (similar
in structure to the nestmate attributes.)</p>
<p style="margin: 0px 0px 1.2em !important;"><strong>Transitivity.</strong>
Sealing is transitive; unless otherwise specified, an abstract
subtype of a sealed type is implicitly sealed, and a concrete
subtype of a sealed type is implicitly final. This can be
reversed by explicitly modifying the subtype with 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;">non-sealed</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;">non-final</code>
modifiers.</p>
<p style="margin: 0px 0px 1.2em !important;">Unsealing a subtype
in a hierarchy doesn’t undermine the sealing, because the
(possibly inferred) set of explicitly permitted subtypes still
constitutes a total covering. However, users who know about
unsealed subtypes can use this information to their benefit
(much like we do with exceptions today; you can catch
FileNotFoundException separately from IOException if you want,
but don’t have to.) </p>
<p style="margin: 0px 0px 1.2em !important;"><em>Note:</em> Scala
made the opposite choice with respect to transitivity, requiring
sealing to be opted into at all levels. This is widely believed
to be a source of bugs; it is rare that one actually wants a
subtype of a sealed type to not be sealed. I suspect the
reasoning in Scala was, at least partially, the desire to not
make up a new keyword for “not sealedâ€. This is understandable,
but I’d rather not add to the list of “things for which Java got
the defaults wrong.â€</p>
<p style="margin: 0px 0px 1.2em !important;">An example of where
explicit unsealing (and private subtypes) is useful can be found
in the JEP-334 API:</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;">sealed interface ConstantDesc
permits String, Integer, Float, Long, Double,
ClassDesc, MethodTypeDesc, MethodHandleDesc,
DynamicConstantDesc { }
sealed interface ClassDesc extends ConstantDesc
permits PrimitiveClassDescImpl, ReferenceClassDescImpl { }
private class PrimitiveClassDescImpl implements ClassDesc { }
private class ReferenceClassDescImpl implements ClassDesc { }
sealed interface MethodTypeDesc extends ConstantDesc
permits MethodTypeDescImpl { }
sealed interface MethodHandleDesc extends ConstantDesc
permits DirectMethodHandleDesc, MethodHandleDescImpl { }
sealed interface DirectMethodHandleDesc extends MethodHandleDesc
permits DirectMethodHandleDescImpl
// designed for subclassing
non-sealed class DynamicConstantDesc extends ConstantDesc { ... }
</code></pre>
<p style="margin: 0px 0px 1.2em !important;"><strong>Enforcement.</strong>
Both the compiler and JVM should enforce sealing.</p>
<p style="margin: 0px 0px 1.2em !important;"><em>Note:</em> It
might be allowable for VM support to follow in a later version,
rather than delaying the feature entirely.</p>
<p style="margin: 0px 0px 1.2em !important;"><strong>Accessibility.</strong>
Subtypes need not be as accessible as the sealed parent. In this
case, clients are not going to get the chance to exhaustively
switch over them; they’ll have to make these switches exhaustive
with 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;">default</code>
clause or other total pattern. When compiling a switch over such
a sealed type, the compiler can provide a useful error message
(“I know this is a sealed type, but I can’t provide full
exhaustiveness checking here because you can’t see all the
subtypes, so you still need a default.â€) </p>
<p style="margin: 0px 0px 1.2em !important;"><strong>Javadoc.</strong>
The list of permitted subtypes should probably be considered
part of the spec, and incorporated into the Javadoc. Note that
this is not exactly the same as the current “All implementing
classes†list that Javadoc currently includes, so a list like
“All permitted subtypes†might be added (possibly with some
indication if the subtype is less accessible than the parent.)</p>
<p style="margin: 0px 0px 1.2em !important;"><em>Open question:</em>
With the advent of records, which allow us to define classes in
a single line, the “one class per file†rule starts to seem both
a little silly, and constrain the user’s ability to put related
definitions together (which may be more readable) while
exporting a flat namespace in the public API. I think it is
worth considering relaxing this rule to permit for sealed
classes, say: allowing public auxilliary subtypes of the primary
type, if the primary type is public and sealed.<br>
​<br>
<em>Syntactic alternative:</em> Rather than inventing a new
modifier (which then needs a negation modifier), we could
generalize the meaning 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;">final</code>,
such as:</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;"> final class C { } // truly final
final interface Node // explicit version
permits ANode, BNode { }
non-final class ANode implements Node { } // opt-out of transitivity
final interface Node // inferred version
permits <bikeshed> { }
</code></pre>
<p style="margin: 0px 0px 1.2em !important;"> This eliminates both
<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;">sealed</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;">non-sealed</code>
as modifiers. The downside is, of course, that it will engender
some “who moved my cheese†reactions. (We currently have
separate spellings 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;">extends</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;">implements</code>;
some think this was a mistake, and it surely complicated things
when we got to generics, as we created an asymmetry 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;"><T extends U></code>.
The move of retconning <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;">final</code>
avoids replicating this mistake.) This is in line with the
suggested retcon at the classfile level as well.</p>
<div
title="MDH:PHR0PlNpbmNlIHdlJ3JlIGFscmVhZHkgZGlzY3Vzc2luZyBvbmUgb2YgdGhlIGNvbnNlcXVlbmNl
cyBvZiBzZWFsZWQgdHlwZXMsIGxldCdzIHB1dCB0aGUgd2hvbGUgc3Rvcnkgb24gdGhlIHRhYmxl
LiZuYnNwOyBUaGVzZSBhcmUgbXkgY3VycmVudCB0aG91Z2h0cywgYnV0IHRoZXJlJ3Mgcm9vbSBp
biB0aGUgZGVzaWduIHNwYWNlIHRvIHdhbmRlciBhIGJpdC4mbmJzcDsgPGJyPjwvdHQ+PHR0Pjxi
cj48YnI+KipEZWZpbml0aW9uLioqJm5ic3A7IEEgX3NlYWxlZCB0eXBlXyBpcyBvbmUgZm9yIHdo
aWNoIHN1YmNsYXNzaW5nIGlzIHJlc3RyaWN0ZWQgYWNjb3JkaW5nIHRvIGd1aWRhbmNlIHNwZWNp
ZmllZCB3aXRoIHRoZSB0eXBl4oCZcyBkZWNsYXJhdGlvbjsgZmluYWxpdHkgY2FuIGJlIGNvbnNp
ZGVyZWQgYSBkZWdlbmVyYXRlIGZvcm0gb2Ygc2VhbGluZywgd2hlcmUgbm8gc3ViY2xhc3NlcyBh
dCBhbGwgYXJlIHBlcm1pdHRlZC4gU2VhbGVkIHR5cGVzIGFyZSBhIHNlbnNpYmxlIG1lYW5zIG9m
IG1vZGVsaW5nIF9hbGdlYnJhaWMgc3VtIHR5cGVzXyBpbiBhIG5vbWluYWwgdHlwZSBoaWVyYXJj
aHk7IHRoZXkgZ28gbmljZWx5IHdpdGggcmVjb3JkcyAoX2FsZ2VicmFpYyBwcm9kdWN0IHR5cGVz
XyksIHRob3VnaCBhcmUgYWxzbyB1c2VmdWwgb24gdGhlaXIgb3duLjxicj48YnI+U2VhbGluZyBz
ZXJ2ZXMgdHdvIGRpc3RpbmN0IHB1cnBvc2VzLiZuYnNwOyBUaGUgZmlyc3QsIGFuZCBtb3JlIG9i
dmlvdXMsIGlzIHRoYXQgaXQgcmVzdHJpY3RzIHdobyBjYW4gYmUgYSBzdWJ0eXBlLiZuYnNwOyBU
aGlzIGlzIGxhcmdlbHkgYSBkZWNsYXJhdGlvbi1zaXRlIGNvbmNlcm4sIHdoZXJlIGFuIEFQSSBv
d25lciB3YW50cyB0byBkZWZlbmQgdGhlIGludGVncml0eSBvZiB0aGVpciBBUEkuJm5ic3A7IFRo
ZSBvdGhlciBpcyB0aGF0IGl0IHBvdGVudGlhbGx5IGVuYWJsZXMgZXhoYXVzdGl2ZW5lc3MgYW5h
bHlzaXMgYXQgdGhlIHVzZSBzaXRlIHdoZW4gc3dpdGNoaW5nIG92ZXIgc2VhbGVkIHR5cGVzIChh
bmQgcG9zc2libHkgb3RoZXIgZmVhdHVyZXMuKSZuYnNwOyBUaGlzIGlzIGxlc3Mgb2J2aW91cywg
YW5kIHRoZSBiZW5lZml0IGlzIGNvbnRpbmdlbnQgb24gc29tZSBvdGhlciB0aGluZ3MsIGJ1dCBp
cyB2YWx1YWJsZSBhcyBpdCBlbmFibGVzIGJldHRlciBjb21waWxlLXRpbWUgdHlwZSBjaGVja2lu
Zy4mbmJzcDsgPGJyPjxicj5fTm90ZTpfIEl0IGlzIHByb2JhYmx5IGRlc2lyYWJsZSB0byBzaGlw
IHRoaXMgd2l0aCByZWNvcmRzLCB0aG91Z2ggaXQgY291bGQgYmUgc2hpcHBlZCBiZWZvcmUgb3Ig
YWZ0ZXIuPGJyPjxicj4qKkRlY2xhcmF0aW9uLioqJm5ic3A7IFdlIHNwZWNpZnkgdGhhdCBhIGNs
YXNzIGlzIHNlYWxlZCBieSBhcHBseWluZyB0aGUgYHNlYWxlZGAgbW9kaWZpZXIgdG8gYSBjbGFz
cywgYWJzdHJhY3QgY2xhc3MsIGludGVyZmFjZSwgb3IgcmVjb3JkOjxicj48YnI+Jm5ic3A7Jm5i
c3A7Jm5ic3A7IHNlYWxlZCBpbnRlcmZhY2UgTm9kZSB7IC4uLiB9PGJyPjxicj5JbiB0aGlzIHN0
cmVhbWxpbmVkIGZvcm0sIGBOb2RlYCBtYXkgYmUgZXh0ZW5kZWQgb25seSBieSBpdHMgbmVzdG1h
dGVzLiBUaGlzIG1heSBiZSBzdWl0YWJsZSBmb3IgbWFueSBzaXR1YXRpb25zLCBidXQgbm90IGZv
ciBhbGw7IGluIHRoaXMgY2FzZSwgdGhlIHVzZXIgbWF5IHNwZWNpZnkgYW4gZXhwbGljaXQgYHBl
cm1pdHNgIGxpc3Q6PGJyPjxicj4mbmJzcDsmbmJzcDsmbmJzcDsgc2VhbGVkIGludGVyZmFjZSBO
b2RlIDxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcGVybWl0
cyBGb29Ob2RlLCBCYXJOb2RlIHsgLi4uIH08YnI+PGJyPlRoZSB0d28gZm9ybXMgbWF5IG5vdCBi
ZSBjb21iaW5lZDsgaWYgdGhlcmUgaXMgYSBwZXJtaXRzIGxpc3QsIGl0IG11c3QgbGlzdCBhbGwg
dGhlIHBlcm1pdHRlZCBzdWJ0eXBlcy4mbmJzcDsgV2UgY2FuIHRoaW5rIG9mIHRoZSBzaW1wbGUg
Zm9ybSBhcyBtZXJlbHkgaW5mZXJyaW5nIHRoZSBgcGVybWl0c2AgY2xhdXNlIGZyb20gaW5mb3Jt
YXRpb24gaW4gdGhlIHNhbWUgY29tcGlsYXRpb24gdW5pdC4mbmJzcDsgPGJyPjxicj4qKkV4aGF1
c3RpdmVuZXNzLioqJm5ic3A7IE9uZSBvZiB0aGUgYmVuZWZpdHMgb2Ygc2VhbGluZyBpcyB0aGF0
IHRoZSBjb21waWxlciBjYW4gZW51bWVyYXRlIHRoZSBwZXJtaXR0ZWQgc3VidHlwZXMgb2YgYSBz
ZWFsZWQgdHlwZTsgdGhpcyBpbiB0dXJuIGxldHMgdXMgcGVyZm9ybSBleGhhdXN0aXZlbmVzcyBh
bmFseXNpcyB3aGVuIHN3aXRjaGluZyBvdmVyIHBhdHRlcm5zIGludm9sdmluZyBzZWFsZWQgdHlw
ZXMuIChJbiB0aGUgc2ltcGxpZmllZCBmb3JtLCB0aGUgY29tcGlsZXIgY29tcHV0ZXMgdGhlIHBl
cm1pdHMgbGlzdCBieSBlbnVtZXJhdGluZyB0aGUgc3VidHlwZXMgaW4gdGhlIG5lc3Qgd2hlbiB0
aGUgbmVzdCBpcyBkZWNsYXJlZCwgc2luY2UgdGhleSBhcmUgaW4gYSBzaW5nbGUgY29tcGlsYXRp
b24gdW5pdC4pJm5ic3A7IFBlcm1pdHRlZCBzdWJ0eXBlcyBtdXN0IGJlbG9uZyB0byB0aGUgc2Ft
ZSBtb2R1bGUgKG9yLCBpZiBub3QgaW4gYSBtb2R1bGUsIHRoZSBzYW1lIHBhY2thZ2UgYW5kIHBy
b3RlY3Rpb24gZG9tYWluLik8YnI+PGJyPl9Ob3RlOl8gSXQgaXMgc3VwZXJmaWNpYWxseSB0ZW1w
dGluZyB0byBoYXZlIGEgcmVsYXhlZCBidXQgbGVzcyBleHBsaWNpdCBmb3JtLCBzYXkgd2hpY2gg
YWxsb3dzIGZvciBhIHR5cGUgdG8gYmUgZXh0ZW5kZWQgYnkgcGFja2FnZS1tYXRlcyBvciBtb2R1
bGUtbWF0ZXMgd2l0aG91dCBsaXN0aW5nIHRoZW0gYWxsLiBIb3dldmVyLCB0aGlzIHdvdWxkIHVu
ZGVybWluZSB0aGUgY29tcGlsZXLigJlzIGFiaWxpdHkgdG8gcmVhc29uIGFib3V0IGV4aGF1c3Rp
dmVuZXNzLiZuYnNwOyBUaGlzIHdvdWxkIGFjaGlldmUgdGhlIGRlc2lyZWQgc3ViY2xhc3Npbmcg
cmVzdHJpY3Rpb25zLCBidXQgbm90IHRoZSBkZXNpcmVkIGFiaWxpdHkgdG8gcmVhc29uIGFib3V0
IGV4aGF1c3RpdmVuZXNzLiZuYnNwOyA8YnI+PGJyPioqQ2xhc3NmaWxlLioqJm5ic3A7IEluIHRo
ZSBjbGFzc2ZpbGUsIGEgc2VhbGVkIHR5cGUgaXMgaWRlbnRpZmllZCB3aXRoIGFuIGBBQ0NfU0VB
TEVEYCBtb2RpZmllciAod2UgY291bGQgY2hvb3NlIHRvIG92ZXJsb2FkIGBBQ0NfRklOQUxgIGZv
ciBiaXQgcHJlc2VydmF0aW9uKSwgYW5kIGEgYFNlYWxlZGAgYXR0cmlidXRlIHdoaWNoIGNvbnRh
aW5zIGEgbGlzdCBvZiBwZXJtaXR0ZWQgc3VidHlwZXMgKHNpbWlsYXIgaW4gc3RydWN0dXJlIHRv
IHRoZSBuZXN0bWF0ZSBhdHRyaWJ1dGVzLik8YnI+PGJyPioqVHJhbnNpdGl2aXR5LioqJm5ic3A7
IFNlYWxpbmcgaXMgdHJhbnNpdGl2ZTsgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQsIGFuIGFi
c3RyYWN0IHN1YnR5cGUgb2YgYSBzZWFsZWQgdHlwZSBpcyBpbXBsaWNpdGx5IHNlYWxlZCwgYW5k
IGEgY29uY3JldGUgc3VidHlwZSBvZiBhIHNlYWxlZCB0eXBlIGlzIGltcGxpY2l0bHkgZmluYWwu
IFRoaXMgY2FuIGJlIHJldmVyc2VkIGJ5IGV4cGxpY2l0bHkgbW9kaWZ5aW5nIHRoZSBzdWJ0eXBl
IHdpdGggdGhlIGBub24tc2VhbGVkYCBvciBgbm9uLWZpbmFsYCBtb2RpZmllcnMuPGJyPjxicj5V
bnNlYWxpbmcgYSBzdWJ0eXBlIGluIGEgaGllcmFyY2h5IGRvZXNuJ3QgdW5kZXJtaW5lIHRoZSBz
ZWFsaW5nLCBiZWNhdXNlIHRoZSAocG9zc2libHkgaW5mZXJyZWQpIHNldCBvZiBleHBsaWNpdGx5
IHBlcm1pdHRlZCBzdWJ0eXBlcyBzdGlsbCBjb25zdGl0dXRlcyBhIHRvdGFsIGNvdmVyaW5nLiZu
YnNwOyBIb3dldmVyLCB1c2VycyB3aG8ga25vdyBhYm91dCB1bnNlYWxlZCBzdWJ0eXBlcyBjYW4g
dXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gdGhlaXIgYmVuZWZpdCAobXVjaCBsaWtlIHdlIGRvIHdp
dGggZXhjZXB0aW9ucyB0b2RheTsgeW91IGNhbiBjYXRjaCBGaWxlTm90Rm91bmRFeGNlcHRpb24g
c2VwYXJhdGVseSBmcm9tIElPRXhjZXB0aW9uIGlmIHlvdSB3YW50LCBidXQgZG9uJ3QgaGF2ZSB0
by4pJm5ic3A7IDxicj48YnI+X05vdGU6XyBTY2FsYSBtYWRlIHRoZSBvcHBvc2l0ZSBjaG9pY2Ug
d2l0aCByZXNwZWN0IHRvIHRyYW5zaXRpdml0eSwgcmVxdWlyaW5nIHNlYWxpbmcgdG8gYmUgb3B0
ZWQgaW50byBhdCBhbGwgbGV2ZWxzLiBUaGlzIGlzIHdpZGVseSBiZWxpZXZlZCB0byBiZSBhIHNv
dXJjZSBvZiBidWdzOyBpdCBpcyByYXJlIHRoYXQgb25lIGFjdHVhbGx5IHdhbnRzIGEgc3VidHlw
ZSBvZiBhIHNlYWxlZCB0eXBlIHRvIG5vdCBiZSBzZWFsZWQuJm5ic3A7IEkgc3VzcGVjdCB0aGUg
cmVhc29uaW5nIGluIFNjYWxhIHdhcywgYXQgbGVhc3QgcGFydGlhbGx5LCB0aGUgZGVzaXJlIHRv
IG5vdCBtYWtlIHVwIGEgbmV3IGtleXdvcmQgZm9yIOKAnG5vdCBzZWFsZWTigJ0uJm5ic3A7IFRo
aXMgaXMgdW5kZXJzdGFuZGFibGUsIGJ1dCBJJ2QgcmF0aGVyIG5vdCBhZGQgdG8gdGhlIGxpc3Qg
b2YgInRoaW5ncyBmb3Igd2hpY2ggSmF2YSBnb3QgdGhlIGRlZmF1bHRzIHdyb25nLiI8YnI+PGJy
PkFuIGV4YW1wbGUgb2Ygd2hlcmUgZXhwbGljaXQgdW5zZWFsaW5nIChhbmQgcHJpdmF0ZSBzdWJ0
eXBlcykgaXMgdXNlZnVsIGNhbiBiZSBmb3VuZCBpbiB0aGUgSkVQLTMzNCBBUEk6PGJyPjxicj4m
bmJzcDsmbmJzcDsmbmJzcDsgc2VhbGVkIGludGVyZmFjZSBDb25zdGFudERlc2M8YnI+Jm5ic3A7
Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHBlcm1pdHMgU3RyaW5nLCBJbnRl
Z2VyLCBGbG9hdCwgTG9uZywgRG91YmxlLCA8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i
c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7
Jm5ic3A7IENsYXNzRGVzYywgTWV0aG9kVHlwZURlc2MsIE1ldGhvZEhhbmRsZURlc2MsIDxicj4m
bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz
cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgRHluYW1pY0NvbnN0YW50RGVzYyB7IH08
YnI+PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBzZWFsZWQgaW50ZXJmYWNlIENsYXNzRGVzYyBleHRl
bmRzIENvbnN0YW50RGVzYzxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm
bmJzcDsgcGVybWl0cyBQcmltaXRpdmVDbGFzc0Rlc2NJbXBsLCBSZWZlcmVuY2VDbGFzc0Rlc2NJ
bXBsIHsgfTwvdHQ+PGJyPjxicj48dHQ+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwcml2YXRlIGNs
YXNzIFByaW1pdGl2ZUNsYXNzRGVzY0ltcGwgaW1wbGVtZW50cyBDbGFzc0Rlc2MgeyB9PGJyPgo8
L3R0PjwvdHQ+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwcml2YXRlIGNsYXNzIFJlZmVyZW5jZUNs
YXNzRGVzY0ltcGwgaW1wbGVtZW50cyBDbGFzc0Rlc2MgeyB9PGJyPgo8L3R0Pjx0dD48dHQ+PGJy
PiZuYnNwOyZuYnNwOyZuYnNwOyBzZWFsZWQgaW50ZXJmYWNlIE1ldGhvZFR5cGVEZXNjIGV4dGVu
ZHMgQ29uc3RhbnREZXNjPGJyPgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm
bmJzcDsgcGVybWl0cyBNZXRob2RUeXBlRGVzY0ltcGwgeyB9PGJyPgogIDxicj4KPC90dD48L3R0
Pjx0dD48dHQ+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBzZWFsZWQgaW50ZXJmYWNlIE1ldGhvZEhh
bmRsZURlc2MgZXh0ZW5kcyBDb25zdGFudERlc2M8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw
OyZuYnNwOyZuYnNwOyZuYnNwOyBwZXJtaXRzIERpcmVjdE1ldGhvZEhhbmRsZURlc2MsIE1ldGhv
ZEhhbmRsZURlc2NJbXBsIHsgfTxicj48YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHNlYWxlZCBpbnRl
cmZhY2UgRGlyZWN0TWV0aG9kSGFuZGxlRGVzYyBleHRlbmRzIE1ldGhvZEhhbmRsZURlc2M8YnI+
Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHBlcm1pdHMgRGlyZWN0
TWV0aG9kSGFuZGxlRGVzY0ltcGw8YnI+PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyAvLyBkZXNpZ25l
ZCBmb3Igc3ViY2xhc3Npbmc8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IG5vbi1zZWFsZWQgY2xhc3Mg
RHluYW1pY0NvbnN0YW50RGVzYyBleHRlbmRzIENvbnN0YW50RGVzYyB7IC4uLiB9PGJyPgogIDxi
cj4KPC90dD48L3R0Pjxicj4qKkVuZm9yY2VtZW50LioqJm5ic3A7IEJvdGggdGhlIGNvbXBpbGVy
IGFuZCBKVk0gc2hvdWxkIGVuZm9yY2Ugc2VhbGluZy48YnI+PGJyPl9Ob3RlOl8gSXQgbWlnaHQg
YmUgYWxsb3dhYmxlIGZvciBWTSBzdXBwb3J0IHRvIGZvbGxvdyBpbiBhIGxhdGVyIHZlcnNpb24s
IHJhdGhlciB0aGFuIGRlbGF5aW5nIHRoZSBmZWF0dXJlIGVudGlyZWx5Ljxicj48YnI+KipBY2Nl
c3NpYmlsaXR5LioqIFN1YnR5cGVzIG5lZWQgbm90IGJlIGFzIGFjY2Vzc2libGUgYXMgdGhlIHNl
YWxlZCBwYXJlbnQuJm5ic3A7IEluIHRoaXMgY2FzZSwgY2xpZW50cyBhcmUgbm90IGdvaW5nIHRv
IGdldCB0aGUgY2hhbmNlIHRvIGV4aGF1c3RpdmVseSBzd2l0Y2ggb3ZlciB0aGVtOyB0aGV5J2xs
IGhhdmUgdG8gbWFrZSB0aGVzZSBzd2l0Y2hlcyBleGhhdXN0aXZlIHdpdGggYSBgZGVmYXVsdGAg
Y2xhdXNlIG9yIG90aGVyIHRvdGFsIHBhdHRlcm4uJm5ic3A7IFdoZW4gY29tcGlsaW5nIGEgc3dp
dGNoIG92ZXIgc3VjaCBhIHNlYWxlZCB0eXBlLCB0aGUgY29tcGlsZXIgY2FuIHByb3ZpZGUgYSB1
c2VmdWwgZXJyb3IgbWVzc2FnZSAoIkkga25vdyB0aGlzIGlzIGEgc2VhbGVkIHR5cGUsIGJ1dCBJ
IGNhbid0IHByb3ZpZGUgZnVsbCBleGhhdXN0aXZlbmVzcyBjaGVja2luZyBoZXJlIGJlY2F1c2Ug
eW91IGNhbid0IHNlZSBhbGwgdGhlIHN1YnR5cGVzLCBzbyB5b3Ugc3RpbGwgbmVlZCBhIGRlZmF1
bHQuIikmbmJzcDsgPGJyPjwvdHQ+PGJyPjx0dD48dHQ+KipKYXZhZG9jLioqIFRoZSBsaXN0IG9m
IHBlcm1pdHRlZCBzdWJ0eXBlcyBzaG91bGQgcHJvYmFibHkgYmUgCmNvbnNpZGVyZWQgcGFydCBv
ZiB0aGUgc3BlYywgYW5kIGluY29ycG9yYXRlZCBpbnRvIHRoZSBKYXZhZG9jLiZuYnNwOyBOb3Rl
IAp0aGF0IHRoaXMgaXMgbm90IGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgIkFsbCBp
bXBsZW1lbnRpbmcgCmNsYXNzZXMiIGxpc3QgdGhhdCBKYXZhZG9jIGN1cnJlbnRseSBpbmNsdWRl
cywgc28gYSBsaXN0IGxpa2UgIkFsbCAKcGVybWl0dGVkIHN1YnR5cGVzIiBtaWdodCBiZSBhZGRl
ZCAocG9zc2libHkgd2l0aCBzb21lIGluZGljYXRpb24gaWYgdGhlCiBzdWJ0eXBlIGlzIGxlc3Mg
YWNjZXNzaWJsZSB0aGFuIHRoZSBwYXJlbnQuKTxicj4KPC90dD48YnI+PGJyPjxicj48L3R0Pjxi
cj48dHQ+PHR0Pjx0dD5fT3BlbiBxdWVzdGlvbjpfIFdpdGggdGhlIGFkdmVudCBvZiByZWNvcmRz
LCB3aGljaCBhbGxvdyB1cyB0byAKZGVmaW5lIGNsYXNzZXMgaW4gYSBzaW5nbGUgbGluZSwgdGhl
ICJvbmUgY2xhc3MgcGVyIGZpbGUiIHJ1bGUgc3RhcnRzIHRvCiBzZWVtIGJvdGggYSBsaXR0bGUg
c2lsbHksIGFuZCBjb25zdHJhaW4gdGhlIHVzZXIncyBhYmlsaXR5IHRvIHB1dCAKcmVsYXRlZCBk
ZWZpbml0aW9ucyB0b2dldGhlciAod2hpY2ggbWF5IGJlIG1vcmUgcmVhZGFibGUpIHdoaWxlIApl
eHBvcnRpbmcgYSBmbGF0IG5hbWVzcGFjZSBpbiB0aGUgcHVibGljIEFQSS4mbmJzcDsgSSB0aGlu
ayBpdCBpcyB3b3J0aCAKY29uc2lkZXJpbmcgcmVsYXhpbmcgdGhpcyBydWxlIHRvIHBlcm1pdCBm
b3Igc2VhbGVkIGNsYXNzZXMsIHNheTogCmFsbG93aW5nIHB1YmxpYyBhdXhpbGxpYXJ5IHN1YnR5
cGVzIG9mIHRoZSBwcmltYXJ5IHR5cGUsIGlmIHRoZSBwcmltYXJ5IAp0eXBlIGlzIHB1YmxpYyBh
bmQgc2VhbGVkLiZuYnNwOyA8YnI+CuKAizxicj48L3R0Pl9TeW50YWN0aWMgYWx0ZXJuYXRpdmU6
XyZuYnNwOyBSYXRoZXIgdGhhbiBpbnZlbnRpbmcgYSBuZXcgbW9kaWZpZXIgCih3aGljaCB0aGVu
IG5lZWRzIGEgbmVnYXRpb24gbW9kaWZpZXIpLCB3ZSBjb3VsZCBnZW5lcmFsaXplIHRoZSBtZWFu
aW5nIApvZiBgZmluYWxgLCBzdWNoIGFzOjxicj4KICA8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyBm
aW5hbCBjbGFzcyBDIHsgfSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw
OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu
YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvLyB0
cnVseSBmaW5hbDxicj4KICA8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyBmaW5hbCBpbnRlcmZhY2Ug
Tm9kZSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw
OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu
YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvLyBleHBsaWNpdCB2ZXJzaW9uPGJyPgombmJzcDsmbmJz
cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcGVybWl0cyBBTm9kZSwgQk5vZGUgeyB9
PGJyPgogIDxicj4KJm5ic3A7Jm5ic3A7Jm5ic3A7IG5vbi1maW5hbCBjbGFzcyBBTm9kZSBpbXBs
ZW1lbnRzIE5vZGUgeyB9Jm5ic3A7IC8vIG9wdC1vdXQgb2YgdHJhbnNpdGl2aXR5PGJyPgogIDxi
cj4KJm5ic3A7Jm5ic3A7Jm5ic3A7IGZpbmFsIGludGVyZmFjZSBOb2RlJm5ic3A7Jm5ic3A7Jm5i
c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7
Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i
c3A7IC8vIGluZmVycmVkIHZlcnNpb248YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw
OyZuYnNwOyZuYnNwOyBwZXJtaXRzICZsdDtiaWtlc2hlZCZndDsgeyB9PGJyPgogIDxicj4KVGhp
cyBlbGltaW5hdGVzIGJvdGggYHNlYWxlZGAgYW5kIGBub24tc2VhbGVkYCBhcyBtb2RpZmllcnMu
Jm5ic3A7IFRoZSAKZG93bnNpZGUgaXMsIG9mIGNvdXJzZSwgdGhhdCBpdCB3aWxsIGVuZ2VuZGVy
IHNvbWUgIndobyBtb3ZlZCBteSBjaGVlc2UiCiByZWFjdGlvbnMuJm5ic3A7IChXZSBjdXJyZW50
bHkgaGF2ZSBzZXBhcmF0ZSBzcGVsbGluZ3MgZm9yIGBleHRlbmRzYCBhbmQgCmBpbXBsZW1lbnRz
YDsgc29tZSB0aGluayB0aGlzIHdhcyBhIG1pc3Rha2UsIGFuZCBpdCBzdXJlbHkgY29tcGxpY2F0
ZWQgCnRoaW5ncyB3aGVuIHdlIGdvdCB0byBnZW5lcmljcywgYXMgd2UgY3JlYXRlZCBhbiBhc3lt
bWV0cnkgd2l0aCBgJmx0O1QgCmV4dGVuZHMgVSZndDtgLiZuYnNwOyBUaGUgbW92ZSBvZiByZXRj
b25uaW5nIGBmaW5hbGAgYXZvaWRzIHJlcGxpY2F0aW5nIHRoaXMgCm1pc3Rha2UuKSZuYnNwOyBU
aGlzIGlzIGluIGxpbmUgd2l0aCB0aGUgc3VnZ2VzdGVkIHJldGNvbiBhdCB0aGUgY2xhc3NmaWxl
IGxldmVsIGFzIHdlbGwuPGJyPgogIDxicj4KPC90dD48L3R0Pg=="
style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0;">​</div>
</div>
</body>
</html>