No subject


Tue Jun 24 21:06:34 EDT 2008


accurate picture of this new technology.  Do you have a more formal paper or
website that gives more details?  Is this annotation stuff for sure going
into jdk 7?


Here is one practical example of my confusion.  On p. 5/29 of your talk, you
mention immutable Dates.  What a great choice: Sun totally boofed on Date
and failed to make it be immutable, which makes it non-thread safe and
dangerous to use as, say, a key or a value in a Map cache.  So, can you use
@Immutable to effectively make a custom Date type that cannot be mutated?
Does the effect only work with Java code that is compiled with the same type
checker?  (That would be a killer and make it less effective,
unfortunately.)

An example where this affected me is in my personal code library.  I have a
class called DateUtil that does all kinds of date related processing.  Some
of the methods are fairly slow to execute, so, to speed them up, my DateUtil
class can do extensive caching.  This means that, say, a Date instance gets
mapped to a String representation of that Date and vice versa.  But because
Date is potentially mutable, there are all kinds of encapsulation issues
here.  You could take the approach of always cloning incoming and outgoing
Dates to ensure no tampering, but that lowers performance which is the whole
point of using caching in the first place.  The approach that I ended up
taking was to use a Date subclass which throws UnsupportedOperationException
whenever a mutating method is called.


Here is another question: can you concatenate a bunch of type checks
together?  As in, instead of something verbose like
    javac -processor NullnessChecker  -processor ImmutableChecker -processor
...
can you do
    javac -processor MyFaveCheckers
where MyFaveCheckers has been configured to do all the checks that you want?


Finally, how does your approach compare with JML?


I am sure that your technology must be extensible so that people can write
their own checkers.  Some checks that are crucial for me (and I bet a ton of
other people) are:

1) tons of numeric checks: is a byte/short/int/long/float/double
positive/negative/notNegative/notPositive?
    is a float/double not NaN or infinite?

2) Strings: the usual check for me is not only is the String not null, but
it also must be not empty and must not be all whitespace

3) tons of other type specific checks (e.g. that a File arg is not only
non-null, but that it exists in the file system and that it is either a
normal file say).


My current solution for all the general checks that I want to do is a custom
class of mine called Check.  If you want to see some of the checks that I am
interested in, I am attaching a copy to this email.  (It won't compile by
itself, because it has some dependencies on other classes from my code
library, I believe; I can give that to you too if you want.)  The major
advantage of a library approach like this is that it always works regardless
of what compiler is used and what client uses it, since the checks are
embedded in the code.  But it has many weaknesses too:

a) it imposes a (usually small) runtime execution overhead

b) I suspect that other static analysis tools would find it harder to work
with

c) it does not lead to any automatic javadoc generation of contracts (does
your approach?)


Yours in the quest for programming perfection,

-Brent Boyer

--0016e645b71c1d9463046d6f5fed
CONTENT-TRANSFER-ENCODING: quoted-printable
Content-Type: text/html; charset=ISO-8859-1

Prof Ernst,<br><br>I have been pouring thru the PDF slides of the JavaOne 2=
009 conference<br>=A0=A0=A0 <a href=3D"http://developers.sun.com/learning/j=
avaoneonline/j1online.jsp?track=3Djavase&amp;yr=3D2009">http://developers.s=
un.com/learning/javaoneonline/j1online.jsp?track=3Djavase&amp;yr=3D2009</a>=
<br>
recently.<br><br>Your talk on &quot;Preventing Bugs with Pluggable Type Che=
cking&quot;<br>=A0=A0=A0 <a href=3D"http://developers.sun.com/learning/java=
oneonline/sessions/2009/pdf/TS-3798.pdf">http://developers.sun.com/learning=
/javaoneonline/sessions/2009/pdf/TS-3798.pdf</a><br>
was especially interesting for me.<br><br>I am extremely interested in writ=
ing robust and bug free software.=A0 One technique that I always try to app=
ly in my work is Design By Contract.=A0 Unfortunately, Java lacks language =
support for this.=A0 (This lack of support, along with that of closures and=
 true generics, have to be regarded as the 3 great failures of the language=
...).=A0 So, DBC in Java is always:<br>
<br>a) more verbose<br>=A0=A0=A0 e.g. it is a pain to have to write out eac=
h time<br>=A0=A0=A0=A0=A0=A0=A0 if (obj =3D=3D null) throw new IllegalArgum=
entException(&quot;obj =3D=3D null&quot;);<br><br>and<br><br>b) bug prone<b=
r>=A0=A0=A0 e.g. you need to write both the code as well as the javadoc for=
 the contract, which is redundant, and therefore lends itself to maintenanc=
e problems like when one changes forgetting to update the other<br>
<br>than it ought to be.=A0 Thus, it was exciting to read your paper and se=
e what your thoughts are.<br><br><br>From just the JavaOne slides, I am act=
ually finding it difficult to get an accurate picture of this new technolog=
y.=A0 Do you have a more formal paper or website that gives more details?=
=A0 Is this annotation stuff for sure going into jdk 7?<br>
<br><br>Here is one practical example of my confusion.=A0 On p. 5/29 of you=
r talk, you mention immutable Dates.=A0 What a great choice: Sun totally bo=
ofed on Date and failed to make it be immutable, which makes it non-thread =
safe and dangerous to use as, say, a key or a value in a Map cache.=A0 So, =
can you use @Immutable to effectively make a custom Date type that cannot b=
e mutated?=A0 Does the effect only work with Java code that is compiled wit=
h the same type checker?=A0 (That would be a killer and make it less effect=
ive, unfortunately.)<br>
<br>An example where this affected me is in my personal code library.=A0 I =
have a class called DateUtil that does all kinds of date related processing=
.=A0 Some of the methods are fairly slow to execute, so, to speed them up, =
my DateUtil class can do extensive caching.=A0 This means that, say, a Date=
 instance gets mapped to a String representation of that Date and vice vers=
a.=A0 But because Date is potentially mutable, there are all kinds of encap=
sulation issues here.=A0 You could take the approach of always cloning inco=
ming and outgoing Dates to ensure no tampering, but that lowers performance=
 which is the whole point of using caching in the first place.=A0 The appro=
ach that I ended up taking was to use a Date subclass which throws Unsuppor=
tedOperationException whenever a mutating method is called.<br>
<br><br>Here is another question: can you concatenate a bunch of type check=
s together?=A0 As in, instead of something verbose like<br>=A0=A0=A0 javac =
-processor NullnessChecker=A0 -processor ImmutableChecker -processor ...<br=
>can you do<br>
=A0=A0=A0 javac -processor MyFaveCheckers<br>where MyFaveCheckers has been =
configured to do all the checks that you want?<br><br><br>Finally, how does=
 your approach compare with JML?<br><br><br>I am sure that your technology =
must be extensible so that people can write their own checkers.=A0 Some che=
cks that are crucial for me (and I bet a ton of other people) are:<br>
<br>1) tons of numeric checks: is a byte/short/int/long/float/double positi=
ve/negative/notNegative/notPositive?<br>=A0=A0=A0 is a float/double not NaN=
 or infinite?<br><br>2) Strings: the usual check for me is not only is the =
String not null, but it also must be not empty and must not be all whitespa=
ce<br>
<br>3) tons of other type specific checks (e.g. that a File arg is not only=
 non-null, but that it exists in the file system and that it is either a no=
rmal file say).<br><br><br>My current solution for all the general checks t=
hat I want to do is a custom class of mine called Check.=A0 If you want to =
see some of the checks that I am interested in, I am attaching a copy to th=
is email.=A0 (It won&#39;t compile by itself, because it has some dependenc=
ies on other classes from my code library, I believe; I can give that to yo=
u too if you want.)=A0 The major advantage of a library approach like this =
is that it always works regardless of what compiler is used and what client=
 uses it, since the checks are embedded in the code.=A0 But it has many wea=
knesses too:<br>
<br>a) it imposes a (usually small) runtime execution overhead<br><br>b) I =
suspect that other static analysis tools would find it harder to work with<=
br><br>c) it does not lead to any automatic javadoc generation of contracts=
 (does your approach?)<br>
<br><br>Yours in the quest for programming perfection,<br><br>-Brent Boyer<=
br><br><br><br><br><br><br>

--0016e645b71c1d9463046d6f5fed--
--0016e645b71c1d946f046d6f5fef
CONTENT-TRANSFER-ENCODING: base64
Content-Type: application/octet-stream; name="Check.java"
Content-Disposition: attachment; filename="Check.java"
X-Attachment-Id: f_fwia5yy30

LyoKQ29weXJpZ2h0IKkgMjAwOCBCcmVudCBCb3llcgoKVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29m
dHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhl
IHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlz
aGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2Yg
dGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgpUaGlz
IHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1
bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy
cmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ
T1NFLiAgU2VlIHRoZSBMZXNzZXIgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUg
ZGV0YWlscy4KCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIExlc3NlciBH
TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoc2VlIHRo
ZSBsaWNlbnNlIGRpcmVjdG9yeSBpbiB0aGlzIHByb2plY3QpLiAgSWYgbm90LCBzZWUgPGh0dHA6
Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgoqLwoKLyoKUHJvZ3JhbW1lciBub3RlczoKCisrKyBo
ZXJlIGFyZSBtZXRob2RzIHRoYXQgbmVlZCB0byBhZGQgaW4gdGhlIGZ1dHVyZToKCXZhbGlkUmFu
Z2UoTnVtYmVyIHZhbHVlLCBOdW1iZXIgbWluLCBOdW1iZXIgbWF4KQoJCW1pbiAmIG1heCBib3Ro
IGluY2x1c2l2ZQoJdmFsaWRGcmFjdGlvbgoJCWZvciBmbG9hdC9kb3VibGUgd2hpY2ggd291bGQg
dGFrZSBhIHNpbmdsZSBhcmcgYW5kIGNhbGwgdmFsaWRSYW5nZSh2YWx1ZSwgMC4wLCAxLjApCgl2
YWxpZEluZGV4CgkJaXMgYWxyZWFkeSBwcmVzZW50IGJlbG93LCBidXQgaXQgc2hvdWxkIGNhbGwg
dmFsaWRSYW5nZSh2YWx1ZSwgMC4wLCBhcnJheS5sZW5ndGggLSAxKQoJCT8/PyBobW0sIG1heSBu
b3QgdGhlIGJlc3QgaWRlYSBpZiBpdCByZXF1aXJlcyBhIGNhbGN1bGF0aW9uLi4uCgkKCWxlc3NU
aGFuLCBsZXNzVGhhbkVxdWFsLCBncmVhdGVyVGhhbiwgZ3JlYXRlclRoYW5FcXVhbAoKLS1hbnkg
d2F5IHRvIGFkZCBtZXNzYWdlIGN1c3RvbWl6YXRpb24/CgktLW9yaWdpbmFsIHZlcnNpb24gb2Yg
dGhpcyBjbGFzcyBoYWQgdGhlIGNoZWNraW5nIG1ldGhvZHMgdGFrZSB0d28gcGFyYW1ldGVycywg
d2l0aCB0aGUgc2Vjb25kIGJlaW5nIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSBpbiBxdWVzdGlv
bjsgaXQgd2FzIGFkZGVkIHRvIHRoZSBlcnJvciBtZXNzYWdlCgkJLS1pZiBJIGRpZCBub3QgaGF2
ZSBhbGwgdGhlIHByaW1pdGl2ZSB2YXJpYXRpb25zIHRvIGRlYWwgd2l0aCwgSSB3b3VsZCBwcm9i
YWJseSBtYWtlIGEgc2Vjb25kIHZlcnNpb24gb2YgZWFjaCBtZXRob2Qgd2hpY2ggaGFzIHRoaXMK
CQktLUkgZ2F2ZSB1cCBvbiB0aGlzIGFwcHJvYWNoIHRvIG1ha2UgdXNhZ2Ugb2YgQ2hlY2sgZWFz
aWVyLCByZXF1aXJpbmcgbGVzcyB0eXBpbmcKCQkJLS10aGUgZGlzYWR2YW50YWdlLCBvZiBjb3Vy
c2UsIGlzIHRoYXQgeW91IHdpbGwgb25seSBrbm93IGZyb20gdGhlIGxpbmUgbnVtYmVyIG9mIHRo
ZSBzdGFjayB0cmFjZSB3aGVyZSB0aGUgZXJyb3Igb2NjdXJlZDsgdGhlcmUgd2lsbCBiZSBubyB2
YXJpYWJsZSBuYW1lIG5vdwoJLS1hbm90aGVyIGFwcHJvYWNoIHRoYXQgSSB0aG91Z2h0IG9mIHdh
cyB0byBoYXZlIHRoZXNlIG1ldGhvZHMgYWxsIHRha2UgYSBmaW5hbCBTdHJpbmcgdmFyYXJnLCBi
dXQgdGhpcyB3b3VsZCBiZSB2ZXJ5IGJhZCBmb3IgcGVyZm9ybWFuY2UKCQktLWlmIHdhbnRlZCB0
byBqdXN0IGhhdmUgYSBTdHJpbmcgMm5kIGFyZywgYXMgZGVzY3JpYmVkIGFib3ZlLCBidXQgd2Fu
dCB0byBlbWJlZCBtb3JlIGluIGl0IHRoYW4gdGhlIHZhcmlhYmxlIG5hbWUsCgkJb25lIGhhY2sg
aXMgdG8gbm90ZSB0aGF0IHNpbmNlIHRoZSBjb2xvbiAnOicgY2hhciBzaG91bGQgbmV2ZXIgYmUg
cGFydCBvZiBhIHByb3BlciBqYXZhIHZhcmlhYmxlIG5hbWUsCgkJdGhlbiB5b3UgY291bGQgaGF2
ZSB0aGUgY29udmVudGlvbiB0aGF0IGlmIHRoZSBuYW1lIGFyZyBoYXMgYSBjb2xvbiBjaGFyIGlu
IGl0IHRoZW4gZXZlcnl0aGluZyBiZWZvcmUgdGhlICc6JyBpcyB0aGUgdmFyJ3MgbmFtZQoJCWFu
ZCBldmVyeXRoaW5nIGZyb20gdGhlICc6JyBvbndhcmRzIGlzIGEgY3VzdG9tIG1lc3NhZ2UgdGhh
dCBzaG91bGQgYmUgYXBwZW5kZWQgdG8gdGhlIGVuZCBvZiB0aGUgbm9ybWFsIG1lc3NhZ2UuCgkJ
Rm9yIGV4YW1wbGUsIGNhbGxpbmcgQ2hlY2suYXJnKCkubm90TnVsbChudWxsLCAic29tZVZhcjog
dGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIikgc2hvdWxkIHJlc3VsdCBpbiB0aGUgZXhjZXB0aW9u
IG1lc3NhZ2UKCQkJc29tZVZhciA9PSBudWxsOiB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4KCi0t
b3RoZXIgcGVvcGxlIGFyZSB0aGlua2luZyBhYm91dCByb2J1c3RuZXNzLCBtZXRob2QgY29udHJh
Y3RzLCBlYXN5IGNoZWNraW5nLCBldGM6CgktLW92ZXJ2aWV3OiBodHRwOi8vdGVjaG5vY3JhdC5u
ZXQvZC8yMDA2LzExLzEwLzEwNjcxCgktLUpNTCAoSmF2YSBNb2RlbGluZyBMYW5ndWFnZSk6IGh0
dHA6Ly93d3cuam1sc3BlY3Mub3JnCgktLUVTQy9KYXZhMjoKCQlodHRwOi8vc2VjdXJlLnVjZC5p
ZS9wcm9kdWN0cy9vcGVuc291cmNlL0VTQ0phdmEyLwoJCWh0dHA6Ly9zZWN1cmUudWNkLmllL2Rv
Y3VtZW50cy90dXRvcmlhbHMvc2xpZGVzLzNfd2FybmluZ3MucGRmCgktLUludGVsbGlKIGlzIHN0
YXJ0aW5nIHRvIHN1cHBvcnQgYSB3ZWFrIHN1YnNldCBvZiB0aGVzZSBhbm5vdGF0aW9ucywgc3Vj
aCBhcyBATm90TnVsbAoJLS10aGVyZSBpcyBhbHNvIHRoZSBqYXZhLWRlcml2YXRpdmUgTmljZSBs
YW5ndWFnZQoJCWh0dHA6Ly9uaWNlLnNvdXJjZWZvcmdlLm5ldC9tYW51YWwuaHRtbAoJYW5kIHNl
ZSB0aGlzIHNlY3Rpb24gZm9yIGhvdyB0aGV5IGhhbmRsZSBudWxsczoKCQlodHRwOi8vbmljZS5z
b3VyY2Vmb3JnZS5uZXQvbWFudWFsLmh0bWwjb3B0aW9uVHlwZXMKCUJ1dCBpdCBhcHBlYXJzIHRv
IGJlIGFjYWRlbWljIGF0IHRoZSBtb21lbnQuLi4KCS0tVGhlIEJlYSR0IGlzIHdvcmtpbmcgb24g
U3BlYyMgZm9yIEMjIHRvIGRvIHNpbWlsYXIgdGhpbmdzCgktLWNvb2wgSmF2YU9uZSAyMDA5IHRh
bGs6CgkJUHJldmVudGluZyBCdWdzIHdpdGggUGx1Z2dhYmxlIFR5cGUgQ2hlY2tpbmcKCQlNaWNo
YWVsIEQuIEVybnN0CgkJVS4gb2YgV2FzaGluZ3RvbgoJCUpvaW50IHdvcmsgd2l0aCBNYWhtb29k
IEFsaQoJCWh0dHA6Ly9kZXZlbG9wZXJzLnN1bi5jb20vbGVhcm5pbmcvamF2YW9uZW9ubGluZS9z
ZXNzaW9ucy8yMDA5L3BkZi9UUy0zNzk4LnBkZgoJU2VlIGFsc28gdGhpcyBwcm9qZWN0J3MgaG9t
ZXBhZ2U6CgkJaHR0cDovL2dyb3Vwcy5jc2FpbC5taXQuZWR1L3BhZy9qc3IzMDgvCgpUaGUgZ3Jl
YXQgcHJvbWlzZSBvZiBhbm5vdGF0aW9ucyBpcyB0aGF0IHlvdSBzaW1wbHkgd3JpdGUgYSBjb21t
ZW50LCBhbmQgdGhleSBhdXRvZ2VuZXJhdGUgdGhlIGNvZGUgZm9yIGNoZWNraW5nLgpQbHVzIHRv
b2xzIGxpa2UgRVNDL0phdmEyIGNhbiB0aGVuIGdvIG9uIHRvIGRvIGFkZGl0aW9uYWwgc3RhdGlj
LCBkZWVwLCBjb2RlIGFuYWx5c2lzLgoKT2xkIGFwcHJvYWNoZXMsIHN1Y2ggYXMgdGhpcyBjbGFz
cywgcmVxdWlyZSB5b3UgdG8gd3JpdGUgYm90aCB0aGUgY29kZSBhcyB3ZWxsIGFzIHRoZSBqYXZh
ZG9jIGNvbW1lbnQsCndoaWNoIGlzIGV4dHJhIHdvcmsgcGx1cyB0aGluZ3MgY2FuIGdldCBvdXQg
b2Ygc3luY2guCkFuZCB0aGUgYW5hbHlzaXMgdG9vbHMgbGlrZSBFU0MvSmF2YTIgd2lsbCBub3Qg
YmUgc3VwcG9ydGVkLgoKUHJvYmxlbXMgd2l0aCBhbm5vdGF0aW9ucyBpbmNsdWRlOgphKSBiZWlu
ZyBhdCB0aGUgbWVyY3kgb2YgdGhlIHBlb3BsZSB3cml0aW5nIHRoZSBhbm5vdGF0aW9ucyB0byBj
b3ZlciB0aGUgY2hlY2tzIHlvdSBhcmUgaW50ZXJlc3RlZCBpbgpiKSB0aGV5IGFyZSBjdXJyZW50
bHkgbm9uLXN0YW5kYXJkIGluIHRoZSBKREsgYW5kIHNvIHJlcXVpcmUgbG90cyBvZiBleHRyYSB0
b29scyB0byB1c2UKCkluIHZpZXcgb2YgdGhlIGFib3ZlLCBmb3Igbm93LCBoYXZlIGRlY2lkZWQg
dG8gdXNlIHRoaXMgQ2hlY2sgY2xhc3MuCiovCgoKcGFja2FnZSBiYi51dGlsOwoKaW1wb3J0IGJi
Lmd1aS5Td2luZ1V0aWw7CmltcG9ydCBiYi5pby5GaWxlVXRpbDsKaW1wb3J0IGJiLm5ldC5OZXRV
dGlsOwppbXBvcnQgamF2YS5hd3QuRXZlbnRRdWV1ZTsKaW1wb3J0IGphdmEuaW8uRmlsZTsKaW1w
b3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwppbXBvcnQg
amF2YS51dGlsLkNvbGxlY3Rpb247CmltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CmltcG9y
dCBqYXZhLnV0aWwuSGFzaE1hcDsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwppbXBvcnQgamF2YS51
dGlsLk1hcDsKaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwoKLyoqCiogQ29udGFpbnMgbWV0aG9kcyB0
aGF0IHBlcmZvcm0gdmFyaW91cyBjaGVja3Mgb24gZGF0YS4KKiBUaGUgZ29hbCBpcyB0byBzdXBw
b3J0IDxhIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGVzaWduX0J5X0NvbnRy
YWN0Ij5EZXNpZ24gQnkgQ29udHJhY3Q8L2E+IHN0eWxlIHByb2dyYW1taW5nLgoqIDxwPgoqIFRo
aXMgY2xhc3MgbWF5IG5vdCBiZSBkaXJlY3RseSB1c2VkIGJlY2F1c2UgaXQgaXMgYWJzdHJhY3Q6
Ciogd2hpbGUgaXQgY29udGFpbnMgZnVsbCBpbXBsZW1lbnRhdGlvbnMgb2YgYWxsIHRoZSBjaGVj
a2luZyBtZXRob2RzLAoqIGl0IGRvZXMgbm90IGltcGxlbWVudCB7QGxpbmsgI29uRmFpbHVyZShT
dHJpbmcsIFRocm93YWJsZSkgb25GYWlsdXJlfS4KKiBJbnN0ZWFkLCBhIGNvbmNyZXRlIHN1YmNs
YXNzIHdoaWNoIGltcGxlbWVudHMgb25GYWlsdXJlIG11c3QgYmUgdXNlZC4KKiA8aT5UaGUgYWN0
aW9uIHBlcmZvcm1lZCBieSB0aGUgc3ViY2xhc3MncyBvbkZhaWx1cmUgaXMgYXJiaXRyYXJ5Ojwv
aT4KKiBpdCBjb3VsZCB0aHJvdyBhIFJ1bnRpbWVFeGNlcHRpb24gKHVzdWFsbHkgYSBtb3JlIHNw
ZWNpZmljIHN1YmNsYXNzKSwgbG9nIHRoZSBmYWlsdXJlLCBzZW5kIGl0IG92ZXIgdGhlIG5ldHdv
cmssIGlnbm9yZSBpdCwgZXRjLgoqIDxwPgoqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhyZWUgaW5u
ZXIgY2xhc3Nlcywge0BsaW5rIEFyZ30sIHtAbGluayBDaGVjay5TdGF0ZX0sIGFuZCB7QGxpbmsg
QXNzZXJ0fSwKKiB3aGljaCBhcmUgY29uY3JldGUgc3ViY2xhc3NlcyBtZWFudCBmb3IgZGlyZWN0
IHVzZS4KKiBBcmcgaXMgbWVhbnQgZm9yIGNoZWNraW5nIG1ldGhvZCBhcmd1bWVudHMsIHdoaWxl
IFN0YXRlIGFuZCBBc3NlcnQgYXJlIG1lYW50IGZvciBjaGVja2luZyBhcmJpdHJhcnkgc3RhdGUu
CiogSW5zdGFuY2VzIG9mIHRoZXNlIGNsYXNzZXMgbmVlZCBub3QgYmUgY3JlYXRlZCBieSB0aGUg
dXNlciwgYnV0IG1heSBiZSBjb252ZW5pZW50bHkgb2J0YWluZWQKKiBieSB0aGUgc3RhdGljIGFj
Y2Vzc29ycyB7QGxpbmsgI2FyZygpIGFyZ30sIHtAbGluayAjc3RhdGUoKSBzdGF0ZX0gYW5kIHtA
bGluayAjYXp6ZXJ0KCkgYXp6ZXJ0fS4KKiBIZXJlIGlzIGEgdHlwaWNhbCBzY2VuYXJpbyBmb3Ig
Y2hlY2tpbmcgcHJlY29uZGl0aW9ucyBhbmQgcG9zdGNvbmRpdGlvbnM6CiogPHByZT48Y29kZT4K
CSYjNDc7JiM0MjsmIzQyOwoJJiM0MjsgUmV0dXJucyB0aGUgdmFsdWUgZnJvbSBtYXAgdGhhdCBp
cyBhc3NvY2lhdGVkIHdpdGgga2V5LgoJJiM0MjsgJmx0O3A+CgkmIzQyOyAmIzY0O3BhcmFtIG1h
cCB0aGUgTWFwIHRoYXQgd2lsbCBiZSBxdWVyaWVkOyA8aT5wcmVjb25kaXRpb246IG11c3Qgbm90
IGJlIG51bGw8L2k+CgkmIzQyOyAmIzY0O3BhcmFtIGtleSB0aGUga2V5IHVzZWQgdG8gcXVlcnkg
bWFwOyA8aT5wcmVjb25kaXRpb246IG11c3Qgbm90IGJlIG51bGw8L2k+CgkmIzQyOyAmIzY0O3Jl
dHVybiB0aGUgdmFsdWUgZnJvbSBtYXAgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGgga2V5OyA8aT5w
b3N0Y29uZGl0aW9uOiByZXN1bHQgaXMgbmV2ZXIgbnVsbDwvaT4KCSYjNDI7ICYjNjQ7dGhyb3dz
IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgcHJlY29uZGl0aW9uIGlzIHZpb2xhdGVk
CgkmIzQyOyAmIzY0O3Rocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgYW55IHBvc3Rjb25k
aXRpb24gaXMgdmlvbGF0ZWQKCSYjNDI7JiM0NzsKCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoTWFw
Jmx0O09iamVjdCxPYmplY3Q+IG1hcCwgT2JqZWN0IGtleSkgewoJCUNoZWNrLmFyZygpLm5vdE51
bGwobWFwKTsKCQlDaGVjay5hcmcoKS5ub3ROdWxsKGtleSk7CgkJCgkJT2JqZWN0IHZhbHVlID0g
bWFwLmdldChrZXkpOwoJCUNoZWNrLnN0YXRlKCkubm90TnVsbCh2YWx1ZSk7CgkJcmV0dXJuIHZh
bHVlOwoJfQoqIDwvY29kZT48L3ByZT4KKiA8cD4KKiBUaGUgZGVzaWduIHByaW9yaXRpZXMgb2Yg
dGhpcyBjbGFzcywgd2hpY2ggd2lsbCBob3BlZnVsbHkgcHJvbW90ZSBpdHMgdXNlIGFjcm9zcyBh
bGwgcHJvamVjdHMsIGFyZQoqIDxvbD4KKiAgPGxpPmNvZGUgY2xhcml0eTogdXNhZ2Ugc2hvdWxk
IHJlYWQgd2VsbCwgYmUgdmVyeSBjbGVhciBhcyB0byB3aGF0IGNvbnN0cmFpbnQgaXMgYmVpbmcg
Y2hlY2tlZDwvbGk+CiogIDxsaT5lYXNlIG9mIHVzZTogdXNhZ2Ugc2hvdWxkIHJlcXVpcmUgbWlu
aW1hbCB0eXBpbmcsIHNvIG1ldGhvZCBuYW1lcyBhcmUgc2hvcnQgYW5kIHJlcXVpcmUgbWluaW1h
bCBhcmd1bWVudHM8L2xpPgoqICA8bGk+CioJCWxvdyBpbXBhY3Q6IHRoZSBjaGVja3MgdGhlbXNl
bHZlcyBtdXN0IG5vdCBzaWduaWZpY2FudGx5IGRlZ3JhZGUgcGVyZm9ybWFuY2U7CioJCW9ubHkg
dGhlIGFibm9ybWFsIGNhc2UgKGZhaWx1cmUgdG8gcGFzcyB0aGUgY2hlY2spIHNob3VsZCByZXN1
bHQgaW4gc2lnbmlmaWNhbnQgcHJvY2Vzc2luZwoqICA8L2xpPgoqIDwvb2w+CiogPHA+CiogRXZl
cnkgY2hlY2tpbmcgbWV0aG9kIGhhcyBzb21lIGNvbnN0cmFpbnQgc3RhdGVkIGluIGl0cyBuYW1l
IHRoYXQgdGhlIHZhcmlhYmxlIGlzIGV4cGVjdGVkIHRvIDxpPnBhc3M8L2k+LgoqIEZvciBpbnN0
YW5jZSwgPGNvZGU+e0BsaW5rICNub3ROdWxsIG5vdE51bGx9KG9iamVjdCk8L2NvZGU+IG1lYW5z
ICJjaGVjayB0aGF0IG9iamVjdCBpcyBub3QgbnVsbCIuCiogPHA+CiogTW9zdCBvZiB0aGVzZSBj
aGVja2luZyBtZXRob2RzIGFsc28gcmV0dXJuIHRoZSBkYXRhIGlmIHRoZSBjaGVjayBpcyBwYXNz
ZWQuCiogVGhpcyBhbGxvd3MgdGhlbSB0byBiZSB1c2VkIGluIGNvbnRleHRzIGxpa2UgZmllbGQg
YXNzaWdubWVudHMsIGZvciBleGFtcGxlCiogPHByZT48Y29kZT4KCSYjNDc7JiM0MjsmIzQyOwoJ
JiM0MjsgQ2FjaGVzIHRoZSB2YWx1ZSBvZiB0aGUgbGluZS5zZXBhcmF0b3IgU3lzdGVtIHByb3Bl
cnR5LgoJJiM0MjsgJmx0O3A+CgkmIzQyOyBDb250cmFjdDogaXMgbmV2ZXIgYmxhbmsuCgkmIzQy
OyYjNDc7Cglwcml2YXRlIGZpbmFsIFN0cmluZyBsaW5lRW5kID0gQ2hlY2suc3RhdGUoKS5ub3RC
bGFuayggU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpICk7CiogPC9jb2RlPjwv
cHJlPgoqIFdlIGFsc28gY291bGQgaGF2ZSB3cml0dGVuIHRoZSA8Y29kZT5nZXRWYWx1ZTwvY29k
ZT4gbWV0aG9kIGFib3ZlIGluIHRoaXMgbW9yZSBjb21wYWN0IGZvcm06CiogPHByZT48Y29kZT4K
CXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoTWFwJmx0O09iamVjdCxPYmplY3Q+IG1hcCwgT2JqZWN0
IGtleSkgewoJCUNoZWNrLmFyZygpLm5vdE51bGwobWFwKTsKCQlDaGVjay5hcmcoKS5ub3ROdWxs
KGtleSk7CgkJcmV0dXJuIENoZWNrLnN0YXRlKCkubm90TnVsbCggbWFwLmdldChrZXkpICk7Cgl9
CiogPC9jb2RlPjwvcHJlPgoqIDxwPgoqIFRoaXMgY2xhc3MgaXMgbXVsdGl0aHJlYWQgc2FmZTog
aXQgaXMgaW1tdXRhYmxlIChib3RoIGl0cyBpbW1lZGlhdGUgc3RhdGUsIGFzIHdlbGwgYXMgdGhl
IGRlZXAgc3RhdGUgb2YgaXRzIGZpZWxkcykuCiogPHA+CiogQGF1dGhvciBCcmVudCBCb3llcgoq
LwpwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2hlY2sgewoJCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQoJcHJpdmF0ZSBzdGF0aWMgZmluYWwg
QXJnIGFyZ0luc3RhbmNlID0gbmV3IEFyZygpOwoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RhdGUg
c3RhdGVJbnN0YW5jZSA9IG5ldyBTdGF0ZSgpOwoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXNzZXJ0
IGFzc2VydEluc3RhbmNlID0gbmV3IEFzc2VydCgpOwoJCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LSBpbnN0YW5jZSBmaWVsZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQoJLyoqCgkqIFJlY29yZHMg
d2hldGhlciBvciBub3QgdG8gcGVyZm9ybSBlYWNoIGNoZWNrLgoJKiBOb3JtYWxseSwgdGhpcyBp
cyB0cnVlLCBob3dldmVyLAoJKiBzdWJjbGFzc2VzIGxpa2Uge0BsaW5rIEFzc2VydH0gbWF5IGNo
b29zZSB0byBzdXBwcmVzcyBjaGVja3MuCgkqLwoJcHJpdmF0ZSBmaW5hbCBib29sZWFuIGRvQ2hl
Y2s7CgkKCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tIHN0YXRpYyBtZXRob2RzIC0tLS0tLS0tLS0t
LS0tLS0tLS0tCgkKCS8qKiBSZXR1cm5zIGEge0BsaW5rIEFyZ30gaW5zdGFuY2UuIFRoZSBzYW1l
IGluc3RhbmNlIGlzIGFsd2F5cyByZXR1cm5lZC4gKi8KCXB1YmxpYyBzdGF0aWMgQXJnIGFyZygp
IHsgcmV0dXJuIGFyZ0luc3RhbmNlOyB9CgkKCS8qKiBSZXR1cm5zIGEge0BsaW5rIENoZWNrLlN0
YXRlfSBpbnN0YW5jZS4gVGhlIHNhbWUgaW5zdGFuY2UgaXMgYWx3YXlzIHJldHVybmVkLiAqLwoJ
cHVibGljIHN0YXRpYyBTdGF0ZSBzdGF0ZSgpIHsgcmV0dXJuIHN0YXRlSW5zdGFuY2U7IH0KCQoJ
LyoqIFJldHVybnMgYSB7QGxpbmsgQXNzZXJ0fSBpbnN0YW5jZS4gVGhlIHNhbWUgaW5zdGFuY2Ug
aXMgYWx3YXlzIHJldHVybmVkLiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgbmFtZWQgImFzc2VydCIs
IGJ1dCB0aGF0IGlzIG5vdyBhIEphdmEga2V5d29yZC4gKi8KCXB1YmxpYyBzdGF0aWMgQXNzZXJ0
IGF6emVydCgpIHsgcmV0dXJuIGFzc2VydEluc3RhbmNlOyB9CgkKCS8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tIGNvbnN0cnVjdG9ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLQoJCgkvKiogQ29udmVuaWVu
Y2UgY29uc3RydWN0b3IgdGhhdCBtZXJlbHkgY2FsbHMgPGNvZGU+e0BsaW5rIENoZWNrI0NoZWNr
KGJvb2xlYW4pIHRoaXN9KHRydWUpPC9jb2RlPi4gKi8KCXB1YmxpYyBDaGVjaygpIHsKCQl0aGlz
KHRydWUpOwoJfQoJCgkvKiogRnVuZGFtZW50YWwgY29uc3RydWN0b3IuICovCglwdWJsaWMgQ2hl
Y2soYm9vbGVhbiBkb0NoZWNrKSB7CgkJdGhpcy5kb0NoZWNrID0gZG9DaGVjazsKCX0KCQoJLy8g
LS0tLS0tLS0tLS0tLS0tLS0tLS0gb25GYWlsdXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tCgkKCS8q
KiBDYWxsZWQgd2hlbmV2ZXIgYSBjaGVjayBmYWlscyBhbmQgdGhlIGNvZGUgaGFzIGp1c3QgZXJy
TXNnIHRvIHJlcG9ydC4gKi8KCXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uRmFpbHVyZShTdHJpbmcg
ZXJyTXNnKTsKCQoJLyoqIENhbGxlZCB3aGVuZXZlciBhIGNoZWNrIGZhaWxzIGFuZCB0aGUgY29k
ZSBoYXMgYm90aCBlcnJNc2cgYW5kIHRocm93YWJsZSB0byByZXBvcnQuICovCglwdWJsaWMgYWJz
dHJhY3Qgdm9pZCBvbkZhaWx1cmUoU3RyaW5nIGVyck1zZywgVGhyb3dhYmxlIHRocm93YWJsZSk7
CgkKCQoJLy8gPT09PT09PT09PT09PT09PT09PT0gQ0hFQ0tJTkcgTUVUSE9EUywgU0VDVElPTiAx
OiBwcmltaXRpdmUgbWV0aG9kcyA9PT09PT09PT09PT09PT09PT09PQoJCgkKCS8vIC0tLS0tLS0t
LS0tLS0tLS0tLS0tIHplcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQoJLyoqCgkqIENoZWNrcyB0
aGF0IHZhbHVlIGVxdWFscyB6ZXJvLgoJKiA8cD4KCSogQHJldHVybiB2YWx1ZSwgaWYgaXQgcGFz
c2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyBieXRlIHplcm8oYnl0ZSB2YWx1ZSkgewoJCWlmIChk
b0NoZWNrICYmICEodmFsdWUgPT0gMCkpIG9uRmFpbHVyZSh2YWx1ZSArICIgaXMgbm90IHplcm8i
KTsKCQlyZXR1cm4gdmFsdWU7Cgl9CgkKCS8qKgoJKiBDaGVja3MgdGhhdCB2YWx1ZSBlcXVhbHMg
emVyby4KCSogPHA+CgkqIEByZXR1cm4gdmFsdWUsIGlmIGl0IHBhc3NlcyB0aGUgY2hlY2sKCSov
CglwdWJsaWMgc2hvcnQgemVybyhzaG9ydCB2YWx1ZSkgewoJCWlmIChkb0NoZWNrICYmICEodmFs
dWUgPT0gMCkpIG9uRmFpbHVyZSh2YWx1ZSArICIgaXMgbm90IHplcm8iKTsKCQlyZXR1cm4gdmFs
dWU7Cgl9CgkKCS8qKgoJKiBDaGVja3MgdGhhdCB2YWx1ZSBlcXVhbHMgemVyby4KCSogPHA+Cgkq
IEByZXR1cm4gdmFsdWUsIGlmIGl0IHBhc3NlcyB0aGUgY2hlY2sKCSovCglwdWJsaWMgaW50IHpl
cm8oaW50IHZhbHVlKSB7CgkJaWYgKGRvQ2hlY2sgJiYgISh2YWx1ZSA9PSAwKSkgb25GYWlsdXJl
KHZhbHVlICsgIiBpcyBub3QgemVybyIpOwoJCXJldHVybiB2YWx1ZTsKCX0KCQoJLyoqCgkqIENo
ZWNrcyB0aGF0IHZhbHVlIGVxdWFscyB6ZXJvLgoJKiA8cD4KCSogQHJldHVybiB2YWx1ZSwgaWYg
aXQgcGFzc2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyBsb25nIHplcm8obG9uZyB2YWx1ZSkgewoJ
CWlmIChkb0NoZWNrICYmICEodmFsdWUgPT0gMCkpIG9uRmFpbHVyZSh2YWx1ZSArICIgaXMgbm90
IHplcm8iKTsKCQlyZXR1cm4gdmFsdWU7Cgl9CgkKCS8qKgoJKiBDaGVja3MgdGhhdCB2YWx1ZSBl
cXVhbHMgemVyby4KCSogPHA+CgkqIEByZXR1cm4gdmFsdWUsIGlmIGl0IHBhc3NlcyB0aGUgY2hl
Y2sKCSovCglwdWJsaWMgZmxvYXQgemVybyhmbG9hdCB2YWx1ZSkgewoJCWlmIChkb0NoZWNrICYm
ICEodmFsdWUgPT0gMCkpIG9uRmFpbHVyZSh2YWx1ZSArICIgaXMgbm90IHplcm8iKTsKCQlyZXR1
cm4gdmFsdWU7Cgl9CgkKCS8qKgoJKiBDaGVja3MgdGhhdCB2YWx1ZSBlcXVhbHMgemVyby4KCSog
PHA+CgkqIEByZXR1cm4gdmFsdWUsIGlmIGl0IHBhc3NlcyB0aGUgY2hlY2sKCSovCglwdWJsaWMg
ZG91YmxlIHplcm8oZG91YmxlIHZhbHVlKSB7CgkJaWYgKGRvQ2hlY2sgJiYgISh2YWx1ZSA9PSAw
KSkgb25GYWlsdXJlKHZhbHVlICsgIiBpcyBub3QgemVybyIpOwoJCXJldHVybiB2YWx1ZTsKCX0K
CQoJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gbm90WmVybyAtLS0tLS0tLS0tLS0tLS0tLS0tLQoJ
CgkvKioKCSogQ2hlY2tzIHRoYXQgdmFsdWUgZG9lcyBub3QgZXF1YWwgemVyby4KCSogPHA+Cgkq
IEByZXR1cm4gdmFsdWUsIGlmIGl0IHBhc3NlcyB0aGUgY2hlY2sKCSovCglwdWJsaWMgYnl0ZSBu
b3RaZXJvKGJ5dGUgdmFsdWUpIHsKCQlpZiAoZG9DaGVjayAmJiAhKHZhbHVlICE9IDApKSBvbkZh
aWx1cmUodmFsdWUgKyAiIGlzIHplcm8iKTsKCQlyZXR1cm4gdmFsdWU7Cgl9CgkKCS8qKgoJKiBD
aGVja3MgdGhhdCB2YWx1ZSBkb2VzIG5vdCBlcXVhbCB6ZXJvLgoJKiA8cD4KCSogQHJldHVybiB2
YWx1ZSwgaWYgaXQgcGFzc2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyBzaG9ydCBub3RaZXJvKHNo
b3J0IHZhbHVlKSB7CgkJaWYgKGRvQ2hlY2sgJiYgISh2YWx1ZSAhPSAwKSkgb25GYWlsdXJlKHZh
bHVlICsgIiBpcyB6ZXJvIik7CgkJcmV0dXJuIHZhbHVlOwoJfQoJCgkvKioKCSogQ2hlY2tzIHRo
YXQgdmFsdWUgZG9lcyBub3QgZXF1YWwgemVyby4KCSogPHA+CgkqIEByZXR1cm4gdmFsdWUsIGlm
IGl0IHBhc3NlcyB0aGUgY2hlY2sKCSovCglwdWJsaWMgaW50IG5vdFplcm8oaW50IHZhbHVlKSB7
CgkJaWYgKGRvQ2hlY2sgJiYgISh2YWx1ZSAhPSAwKSkgb25GYWlsdXJlKHZhbHVlICsgIiBpcyB6
ZXJvIik7CgkJcmV0dXJuIHZhbHVlOwoJfQoJCgkvKioKCSogQ2hlY2tzIHRoYXQgdmFsdWUgZG9l
cyBub3QgZXF1YWwgemVyby4KCSogPHA+CgkqIEByZXR1cm4gdmFsdWUsIGlmIGl0IHBhc3NlcyB0
aGUgY2hlY2sKCSovCglwdWJsaWMgbG9uZyBub3RaZXJvKGxvbmcgdmFsdWUpIHsKCQlpZiAoZG9D
aGVjayAmJiAhKHZhbHVlICE9IDApKSBvbkZhaWx1cmUodmFsdWUgKyAiIGlzIHplcm8iKTsKCQly
ZXR1cm4gdmFsdWU7Cgl9CgkKCS8qKgoJKiBDaGVja3MgdGhhdCB2YWx1ZSBkb2VzIG5vdCBlcXVh
bCB6ZXJvLgoJKiA8cD4KCSogQHJldHVybiB2YWx1ZSwgaWYgaXQgcGFzc2VzIHRoZSBjaGVjawoJ
Ki8KCXB1YmxpYyBmbG9hdCBub3RaZXJvKGZsb2F0IHZhbHVlKSB7CgkJaWYgKGRvQ2hlY2sgJiYg
ISh2YWx1ZSAhPSAwKSkgb25GYWlsdXJlKHZhbHVlICsgIiBpcyB6ZXJvIik7CgkJcmV0dXJuIHZh
bHVlOwoJfQoJCgkvKioKCSogQ2hlY2tzIHRoYXQgdmFsdWUgZG9lcyBub3QgZXF1YWwgemVyby4K
CSogPHA+CgkqIEByZXR1cm4gdmFsdWUsIGlmIGl0IHBhc3NlcyB0aGUgY2hlY2sKCSovCglwdWJs
aWMgZG91YmxlIG5vdFplcm8oZG91YmxlIHZhbHVlKSB7CgkJaWYgKGRvQ2hlY2sgJiYgISh2YWx1
ZSAhPSAwKSkgb25GYWlsdXJlKHZhbHVlICsgIiBpcyB6ZXJvIik7CgkJcmV0dXJuIHZhbHVlOwoJ
fQoJCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBuZWdhdGl2ZSAtLS0tLS0tLS0tLS0tLS0tLS0t
LQoJCgkvKioKCSogQ2hlY2tzIHRoYXQgdmFsdWUgaXMgc3RyaWN0bHkgbmVnYXRpdmUgKGkuZS4g
dmFsdWUgPCAwKS4KCSogPHA+CgkqIEByZXR1cm4gdmFsdWUsIGlmIGl0IHBhc3NlcyB0aGUgY2hl
Y2sKCSovCglwdWJsaWMgYnl0ZSBuZWdhdGl2ZShieXRlIHZhbHVlKSB7CgkJaWYgKGRvQ2hlY2sg
JiYgISh2YWx1ZSA8IDApKSBvbkZhaWx1cmUodmFsdWUgKyAiIGlzIG5vdCBuZWdhdGl2ZSIpOwoJ
CXJldHVybiB2YWx1ZTsKCX0KCQoJLyoqCgkqIENoZWNrcyB0aGF0IHZhbHVlIGlzIHN0cmljdGx5
IG5lZ2F0aXZlIChpLmUuIHZhbHVlIDwgMCkuCgkqIDxwPgoJKiBAcmV0dXJuIHZhbHVlLCBpZiBp
dCBwYXNzZXMgdGhlIGNoZWNrCgkqLwoJcHVibGljIHNob3J0IG5lZ2F0aXZlKHNob3J0IHZhbHVl
KSB7CgkJaWYgKGRvQ2hlY2sgJiYgISh2YWx1ZSA8IDApKSBvbkZhaWx1cmUodmFsdWUgKyAiIGlz
IG5vdCBuZWdhdGl2ZSIpOwoJCXJldHVybiB2YWx1ZTsKCX0KCQoJLyoqCgkqIENoZWNrcyB0aGF0
IHZhbHVlIGlzIHN0cmljdGx5IG5lZ2F0aXZlIChpLmUuIHZhbHVlIDwgMCkuCgkqIDxwPgoJKiBA
cmV0dXJuIHZhbHVlLCBpZiBpdCBwYXNzZXMgdGhlIGNoZWNrCgkqLwoJcHVibGljIGludCBuZWdh
dGl2ZShpbnQgdmFsdWUpIHsKCQlpZiAoZG9DaGVjayAmJiAhKHZhbHVlIDwgMCkpIG9uRmFpbHVy
ZSh2YWx1ZSArICIgaXMgbm90IG5lZ2F0aXZlIik7CgkJcmV0dXJuIHZhbHVlOwoJfQoJCgkvKioK
CSogQ2hlY2tzIHRoYXQgdmFsdWUgaXMgc3RyaWN0bHkgbmVnYXRpdmUgKGkuZS4gdmFsdWUgPCAw
KS4KCSogPHA+CgkqIEByZXR1cm4gdmFsdWUsIGlmIGl0IHBhc3NlcyB0aGUgY2hlY2sKCSovCglw
dWJsaWMgbG9uZyBuZWdhdGl2ZShsb25nIHZhbHVlKSB7CgkJaWYgKGRvQ2hlY2sgJiYgISh2YWx1
ZSA8IDApKSBvbkZhaWx1cmUodmFsdWUgKyAiIGlzIG5vdCBuZWdhdGl2ZSIpOwoJCXJldHVybiB2
YWx1ZTsKCX0KCQoJLyoqCgkqIENoZWNrcyB0aGF0IHZhbHVlIGlzIHN0cmljdGx5IG5lZ2F0aXZl
IChpLmUuIHZhbHVlIDwgMCkuCgkqIE5hTiBmYWlscyB0aGlzIGNoZWNrLgoJKiA8cD4KCSogQHJl
dHVybiB2YWx1ZSwgaWYgaXQgcGFzc2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyBmbG9hdCBuZWdh
dGl2ZShmbG9hdCB2YWx1ZSkgewoJCWlmIChkb0NoZWNrICYmICEodmFsdWUgPCAwKSkgb25GYWls
dXJlKHZhbHVlICsgIiBpcyBub3QgbmVnYXRpdmUiKTsJLy8gTm90ZTogdGhpcyBsb2dpYyBzdGls
bCB3b3JrcyBldmVuIGlmIHZhbHVlIGlzIE5hTgoJCXJldHVybiB2YWx1ZTsKCX0KCQoJLyoqCgkq
IENoZWNrcyB0aGF0IHZhbHVlIGlzIHN0cmljdGx5IG5lZ2F0aXZlIChpLmUuIHZhbHVlIDwgMCku
CgkqIE5hTiBmYWlscyB0aGlzIGNoZWNrLgoJKiA8cD4KCSogQHJldHVybiB2YWx1ZSwgaWYgaXQg
cGFzc2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyBkb3VibGUgbmVnYXRpdmUoZG91YmxlIHZhbHVl
KSB7CgkJaWYgKGRvQ2hlY2sgJiYgISh2YWx1ZSA8IDApKSBvbkZhaWx1cmUodmFsdWUgKyAiIGlz
IG5vdCBuZWdhdGl2ZSIpOwkvLyBOb3RlOiB0aGlzIGxvZ2ljIHN0aWxsIHdvcmtzIGV2ZW4gaWYg
dmFsdWUgaXMgTmFOCgkJcmV0dXJuIHZhbHVlOwoJfQoJCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LSBub3ROZWdhdGl2ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLQoJCgkvKioKCSogQ2hlY2tzIHRoYXQg
dmFsdWUgaXMgbm90IHN0cmljdGx5IG5lZ2F0aXZlIChpLmUuIHZhbHVlID49IDApLgoJKiA8cD4K
CSogQHJldHVybiB2YWx1ZSwgaWYgaXQgcGFzc2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyBieXRl
IG5vdE5lZ2F0aXZlKGJ5dGUgdmFsdWUpIHsKCQlpZiAoZG9DaGVjayAmJiAhKHZhbHVlID49IDAp
KSBvbkZhaWx1cmUodmFsdWUgKyAiIGlzIG5lZ2F0aXZlIik7CgkJcmV0dXJuIHZhbHVlOwoJfQoJ
CgkvKioKCSogQ2hlY2tzIHRoYXQgdmFsdWUgaXMgbm90IHN0cmljdGx5IG5lZ2F0aXZlIChpLmUu
IHZhbHVlID49IDApLgoJKiA8cD4KCSogQHJldHVybiB2YWx1ZSwgaWYgaXQgcGFzc2VzIHRoZSBj
aGVjawoJKi8KCXB1YmxpYyBzaG9ydCBub3ROZWdhdGl2ZShzaG9ydCB2YWx1ZSkgewoJCWlmIChk
b0NoZWNrICYmICEodmFsdWUgPj0gMCkpIG9uRmFpbHVyZSh2YWx1ZSArICIgaXMgbmVnYXRpdmUi
KTsKCQlyZXR1cm4gdmFsdWU7Cgl9CgkKCS8qKgoJKiBDaGVja3MgdGhhdCB2YWx1ZSBpcyBub3Qg
c3RyaWN0bHkgbmVnYXRpdmUgKGkuZS4gdmFsdWUgPj0gMCkuCgkqIDxwPgoJKiBAcmV0dXJuIHZh
bHVlLCBpZiBpdCBwYXNzZXMgdGhlIGNoZWNrCgkqLwoJcHVibGljIGludCBub3ROZWdhdGl2ZShp
bnQgdmFsdWUpIHsKCQlpZiAoZG9DaGVjayAmJiAhKHZhbHVlID49IDApKSBvbkZhaWx1cmUodmFs
dWUgKyAiIGlzIG5lZ2F0aXZlIik7CgkJcmV0dXJuIHZhbHVlOwoJfQoJCgkvKioKCSogQ2hlY2tz
IHRoYXQgdmFsdWUgaXMgbm90IHN0cmljdGx5IG5lZ2F0aXZlIChpLmUuIHZhbHVlID49IDApLgoJ
KiA8cD4KCSogQHJldHVybiB2YWx1ZSwgaWYgaXQgcGFzc2VzIHRoZSBjaGVjawoJKi8KCXB1Ymxp
YyBsb25nIG5vdE5lZ2F0aXZlKGxvbmcgdmFsdWUpIHsKCQlpZiAoZG9DaGVjayAmJiAhKHZhbHVl
ID49IDApKSBvbkZhaWx1cmUodmFsdWUgKyAiIGlzIG5lZ2F0aXZlIik7CgkJcmV0dXJuIHZhbHVl
OwoJfQoJCgkvKioKCSogQ2hlY2tzIHRoYXQgdmFsdWUgaXMgbm90IHN0cmljdGx5IG5lZ2F0aXZl
IChpLmUuIHZhbHVlID49IDApLgoJKiBOYU4gZmFpbHMgdGhpcyBjaGVjay4KCSogPHA+CgkqIEBy
ZXR1cm4gdmFsdWUsIGlmIGl0IHBhc3NlcyB0aGUgY2hlY2sKCSovCglwdWJsaWMgZmxvYXQgbm90
TmVnYXRpdmUoZmxvYXQgdmFsdWUpIHsKCQlpZiAoZG9DaGVjayAmJiAhKHZhbHVlID49IDApKSBv
bkZhaWx1cmUodmFsdWUgKyAiIGlzIG5lZ2F0aXZlIik7CS8vIE5vdGU6IHRoaXMgbG9naWMgc3Rp
bGwgd29ya3MgZXZlbiBpZiB2YWx1ZSBpcyBOYU4KCQlyZXR1cm4gdmFsdWU7Cgl9CgkKCS8qKgoJ
KiBDaGVja3MgdGhhdCB2YWx1ZSBpcyBub3Qgc3RyaWN0bHkgbmVnYXRpdmUgKGkuZS4gdmFsdWUg
Pj0gMCkuCgkqIE5hTiBmYWlscyB0aGlzIGNoZWNrLgoJKiA8cD4KCSogQHJldHVybiB2YWx1ZSwg
aWYgaXQgcGFzc2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyBkb3VibGUgbm90TmVnYXRpdmUoZG91
YmxlIHZhbHVlKSB7CgkJaWYgKGRvQ2hlY2sgJiYgISh2YWx1ZSA+PSAwKSkgb25GYWlsdXJlKHZh
bHVlICsgIiBpcyBuZWdhdGl2ZSIpOwkvLyBOb3RlOiB0aGlzIGxvZ2ljIHN0aWxsIHdvcmtzIGV2
ZW4gaWYgdmFsdWUgaXMgTmFOCgkJcmV0dXJuIHZhbHVlOwoJfQoJCgkvLyAtLS0tLS0tLS0tLS0t
LS0tLS0tLSBwb3NpdGl2ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLQoJCgkvKioKCSogQ2hlY2tzIHRo
YXQgdmFsdWUgaXMgc3RyaWN0bHkgcG9zaXRpdmUgKGkuZS4gdmFsdWUgPiAwKS4KCSogPHA+Cgkq
IEByZXR1cm4gdmFsdWUsIGlmIGl0IHBhc3NlcyB0aGUgY2hlY2sKCSovCglwdWJsaWMgYnl0ZSBw
b3NpdGl2ZShieXRlIHZhbHVlKSB7CgkJaWYgKGRvQ2hlY2sgJiYgISh2YWx1ZSA+IDApKSBvbkZh
aWx1cmUodmFsdWUgKyAiIGlzIG5vdCBwb3NpdGl2ZSIpOwoJCXJldHVybiB2YWx1ZTsKCX0KCQoJ
LyoqCgkqIENoZWNrcyB0aGF0IHZhbHVlIGlzIHN0cmljdGx5IHBvc2l0aXZlIChpLmUuIHZhbHVl
ID4gMCkuCgkqIDxwPgoJKiBAcmV0dXJuIHZhbHVlLCBpZiBpdCBwYXNzZXMgdGhlIGNoZWNrCgkq
LwoJcHVibGljIHNob3J0IHBvc2l0aXZlKHNob3J0IHZhbHVlKSB7CgkJaWYgKGRvQ2hlY2sgJiYg
ISh2YWx1ZSA+IDApKSBvbkZhaWx1cmUodmFsdWUgKyAiIGlzIG5vdCBwb3NpdGl2ZSIpOwoJCXJl
dHVybiB2YWx1ZTsKCX0KCQoJLyoqCgkqIENoZWNrcyB0aGF0IHZhbHVlIGlzIHN0cmljdGx5IHBv
c2l0aXZlIChpLmUuIHZhbHVlID4gMCkuCgkqIDxwPgoJKiBAcmV0dXJuIHZhbHVlLCBpZiBpdCBw
YXNzZXMgdGhlIGNoZWNrCgkqLwoJcHVibGljIGludCBwb3NpdGl2ZShpbnQgdmFsdWUpIHsKCQlp
ZiAoZG9DaGVjayAmJiAhKHZhbHVlID4gMCkpIG9uRmFpbHVyZSh2YWx1ZSArICIgaXMgbm90IHBv
c2l0aXZlIik7CgkJcmV0dXJuIHZhbHVlOwoJfQoJCgkvKioKCSogQ2hlY2tzIHRoYXQgdmFsdWUg
aXMgc3RyaWN0bHkgcG9zaXRpdmUgKGkuZS4gdmFsdWUgPiAwKS4KCSogPHA+CgkqIEByZXR1cm4g
dmFsdWUsIGlmIGl0IHBhc3NlcyB0aGUgY2hlY2sKCSovCglwdWJsaWMgbG9uZyBwb3NpdGl2ZShs
b25nIHZhbHVlKSB7CgkJaWYgKGRvQ2hlY2sgJiYgISh2YWx1ZSA+IDApKSBvbkZhaWx1cmUodmFs
dWUgKyAiIGlzIG5vdCBwb3NpdGl2ZSIpOwoJCXJldHVybiB2YWx1ZTsKCX0KCQoJLyoqCgkqIENo
ZWNrcyB0aGF0IHZhbHVlIGlzIHN0cmljdGx5IHBvc2l0aXZlIChpLmUuIHZhbHVlID4gMCkuCgkq
IE5hTiBmYWlscyB0aGlzIGNoZWNrLgoJKiA8cD4KCSogQHJldHVybiB2YWx1ZSwgaWYgaXQgcGFz
c2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyBmbG9hdCBwb3NpdGl2ZShmbG9hdCB2YWx1ZSkgewoJ
CWlmIChkb0NoZWNrICYmICEodmFsdWUgPiAwKSkgb25GYWlsdXJlKHZhbHVlICsgIiBpcyBub3Qg
cG9zaXRpdmUiKTsJLy8gTm90ZTogdGhpcyBsb2dpYyBzdGlsbCB3b3JrcyBldmVuIGlmIHZhbHVl
IGlzIE5hTgoJCXJldHVybiB2YWx1ZTsKCX0KCQoJLyoqCgkqIENoZWNrcyB0aGF0IHZhbHVlIGlz
IHN0cmljdGx5IHBvc2l0aXZlIChpLmUuIHZhbHVlID4gMCkuCgkqIE5hTiBmYWlscyB0aGlzIGNo
ZWNrLgoJKiA8cD4KCSogQHJldHVybiB2YWx1ZSwgaWYgaXQgcGFzc2VzIHRoZSBjaGVjawoJKi8K
CXB1YmxpYyBkb3VibGUgcG9zaXRpdmUoZG91YmxlIHZhbHVlKSB7CgkJaWYgKGRvQ2hlY2sgJiYg
ISh2YWx1ZSA+IDApKSBvbkZhaWx1cmUodmFsdWUgKyAiIGlzIG5vdCBwb3NpdGl2ZSIpOwkvLyBO
b3RlOiB0aGlzIGxvZ2ljIHN0aWxsIHdvcmtzIGV2ZW4gaWYgdmFsdWUgaXMgTmFOCgkJcmV0dXJu
IHZhbHVlOwoJfQoJCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBub3RQb3NpdGl2ZSAtLS0tLS0t
LS0tLS0tLS0tLS0tLQoJCgkvKioKCSogQ2hlY2tzIHRoYXQgdmFsdWUgaXMgbm90IHN0cmljdGx5
IHBvc2l0aXZlIChpLmUuIHZhbHVlIDw9IDApLgoJKiA8cD4KCSogQHJldHVybiB2YWx1ZSwgaWYg
aXQgcGFzc2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyBieXRlIG5vdFBvc2l0aXZlKGJ5dGUgdmFs
dWUpIHsKCQlpZiAoZG9DaGVjayAmJiAhKHZhbHVlIDw9IDApKSBvbkZhaWx1cmUodmFsdWUgKyAi
IGlzIHBvc2l0aXZlIik7CgkJcmV0dXJuIHZhbHVlOwoJfQoJCgkvKioKCSogQ2hlY2tzIHRoYXQg
dmFsdWUgaXMgbm90IHN0cmljdGx5IHBvc2l0aXZlIChpLmUuIHZhbHVlIDw9IDApLgoJKiA8cD4K
CSogQHJldHVybiB2YWx1ZSwgaWYgaXQgcGFzc2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyBzaG9y
dCBub3RQb3NpdGl2ZShzaG9ydCB2YWx1ZSkgewoJCWlmIChkb0NoZWNrICYmICEodmFsdWUgPD0g
MCkpIG9uRmFpbHVyZSh2YWx1ZSArICIgaXMgcG9zaXRpdmUiKTsKCQlyZXR1cm4gdmFsdWU7Cgl9
CgkKCS8qKgoJKiBDaGVja3MgdGhhdCB2YWx1ZSBpcyBub3Qgc3RyaWN0bHkgcG9zaXRpdmUgKGku
ZS4gdmFsdWUgPD0gMCkuCgkqIDxwPgoJKiBAcmV0dXJuIHZhbHVlLCBpZiBpdCBwYXNzZXMgdGhl
IGNoZWNrCgkqLwoJcHVibGljIGludCBub3RQb3NpdGl2ZShpbnQgdmFsdWUpIHsKCQlpZiAoZG9D
aGVjayAmJiAhKHZhbHVlIDw9IDApKSBvbkZhaWx1cmUodmFsdWUgKyAiIGlzIHBvc2l0aXZlIik7
CgkJcmV0dXJuIHZhbHVlOwoJfQoJCgkvKioKCSogQ2hlY2tzIHRoYXQgdmFsdWUgaXMgbm90IHN0
cmljdGx5IHBvc2l0aXZlIChpLmUuIHZhbHVlIDw9IDApLgoJKiA8cD4KCSogQHJldHVybiB2YWx1
ZSwgaWYgaXQgcGFzc2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyBsb25nIG5vdFBvc2l0aXZlKGxv
bmcgdmFsdWUpIHsKCQlpZiAoZG9DaGVjayAmJiAhKHZhbHVlIDw9IDApKSBvbkZhaWx1cmUodmFs
dWUgKyAiIGlzIHBvc2l0aXZlIik7CgkJcmV0dXJuIHZhbHVlOwoJfQoJCgkvKioKCSogQ2hlY2tz
IHRoYXQgdmFsdWUgaXMgbm90IHN0cmljdGx5IHBvc2l0aXZlIChpLmUuIHZhbHVlIDw9IDApLgoJ
KiBOYU4gZmFpbHMgdGhpcyBjaGVjay4KCSogPHA+CgkqIEByZXR1cm4gdmFsdWUsIGlmIGl0IHBh
c3NlcyB0aGUgY2hlY2sKCSovCglwdWJsaWMgZmxvYXQgbm90UG9zaXRpdmUoZmxvYXQgdmFsdWUp
IHsKCQlpZiAoZG9DaGVjayAmJiAhKHZhbHVlIDw9IDApKSBvbkZhaWx1cmUodmFsdWUgKyAiIGlz
IHBvc2l0aXZlIik7CS8vIE5vdGU6IHRoaXMgbG9naWMgc3RpbGwgd29ya3MgZXZlbiBpZiB2YWx1
ZSBpcyBOYU4KCQlyZXR1cm4gdmFsdWU7Cgl9CgkKCS8qKgoJKiBDaGVja3MgdGhhdCB2YWx1ZSBp
cyBub3Qgc3RyaWN0bHkgcG9zaXRpdmUgKGkuZS4gdmFsdWUgPD0gMCkuCgkqIE5hTiBmYWlscyB0
aGlzIGNoZWNrLgoJKiA8cD4KCSogQHJldHVybiB2YWx1ZSwgaWYgaXQgcGFzc2VzIHRoZSBjaGVj
awoJKi8KCXB1YmxpYyBkb3VibGUgbm90UG9zaXRpdmUoZG91YmxlIHZhbHVlKSB7CgkJaWYgKGRv
Q2hlY2sgJiYgISh2YWx1ZSA8PSAwKSkgb25GYWlsdXJlKHZhbHVlICsgIiBpcyBwb3NpdGl2ZSIp
OwkvLyBOb3RlOiB0aGlzIGxvZ2ljIHN0aWxsIHdvcmtzIGV2ZW4gaWYgdmFsdWUgaXMgTmFOCgkJ
cmV0dXJuIHZhbHVlOwoJfQoJCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBJRUVFIGZsb2F0aW5n
IHBvaW50IHNwZWNpYWwgdmFsdWUgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLQoJCgkvKioK
CSogQ2hlY2tzIHRoYXQgdmFsdWUgaXMgTmFOLgoJKiA8cD4KCSogQHJldHVybiB2YWx1ZSwgaWYg
aXQgcGFzc2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyBmbG9hdCBuYU4oZmxvYXQgdmFsdWUpIHsK
CQlpZiAoZG9DaGVjayAmJiAhRmxvYXQuaXNOYU4odmFsdWUpKSBvbkZhaWx1cmUodmFsdWUgKyAi
IGlzIG5vdCBOYU4iKTsKCQlyZXR1cm4gdmFsdWU7Cgl9CgkKCS8qKgoJKiBDaGVja3MgdGhhdCB2
YWx1ZSBpcyBOYU4uCgkqIDxwPgoJKiBAcmV0dXJuIHZhbHVlLCBpZiBpdCBwYXNzZXMgdGhlIGNo
ZWNrCgkqLwoJcHVibGljIGRvdWJsZSBuYU4oZG91YmxlIHZhbHVlKSB7CgkJaWYgKGRvQ2hlY2sg
JiYgIURvdWJsZS5pc05hTih2YWx1ZSkpIG9uRmFpbHVyZSh2YWx1ZSArICIgaXMgbm90IE5hTiIp
OwoJCXJldHVybiB2YWx1ZTsKCX0KCQoJLyoqCgkqIENoZWNrcyB0aGF0IHZhbHVlIGlzIG5vdCBO
YU4uCgkqIDxwPgoJKiBAcmV0dXJuIHZhbHVlLCBpZiBpdCBwYXNzZXMgdGhlIGNoZWNrCgkqLwoJ
cHVibGljIGZsb2F0IG5vdE5hTihmbG9hdCB2YWx1ZSkgewoJCWlmIChkb0NoZWNrICYmIEZsb2F0
LmlzTmFOKHZhbHVlKSkgb25GYWlsdXJlKCJpcyBOYU4iKTsKCQlyZXR1cm4gdmFsdWU7Cgl9CgkK
CS8qKgoJKiBDaGVja3MgdGhhdCB2YWx1ZSBpcyBub3QgTmFOLgoJKiA8cD4KCSogQHJldHVybiB2
YWx1ZSwgaWYgaXQgcGFzc2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyBkb3VibGUgbm90TmFOKGRv
dWJsZSB2YWx1ZSkgewoJCWlmIChkb0NoZWNrICYmIERvdWJsZS5pc05hTih2YWx1ZSkpIG9uRmFp
bHVyZSgiaXMgTmFOIik7CgkJcmV0dXJuIHZhbHVlOwoJfQoJCgkvKioKCSogQ2hlY2tzIHRoYXQg
dmFsdWUgaXMgaW5maW5pdGUuCgkqIDxwPgoJKiBAcmV0dXJuIHZhbHVlLCBpZiBpdCBwYXNzZXMg
dGhlIGNoZWNrCgkqLwoJcHVibGljIGZsb2F0IGluZmluaXRlKGZsb2F0IHZhbHVlKSB7CgkJaWYg
KGRvQ2hlY2sgJiYgIUZsb2F0LmlzSW5maW5pdGUodmFsdWUpKSBvbkZhaWx1cmUodmFsdWUgKyAi
IGlzIG5vdCBpbmZpbml0ZSIpOwoJCXJldHVybiB2YWx1ZTsKCX0KCQoJLyoqCgkqIENoZWNrcyB0
aGF0IHZhbHVlIGlzIGluZmluaXRlLgoJKiA8cD4KCSogQHJldHVybiB2YWx1ZSwgaWYgaXQgcGFz
c2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyBkb3VibGUgaW5maW5pdGUoZG91YmxlIHZhbHVlKSB7
CgkJaWYgKGRvQ2hlY2sgJiYgIURvdWJsZS5pc0luZmluaXRlKHZhbHVlKSkgb25GYWlsdXJlKHZh
bHVlICsgIiBpcyBub3QgaW5maW5pdGUiKTsKCQlyZXR1cm4gdmFsdWU7Cgl9CgkKCS8qKgoJKiBD
aGVja3MgdGhhdCB2YWx1ZSBpcyBub3QgaW5maW5pdGUuCgkqIDxwPgoJKiBAcmV0dXJuIHZhbHVl
LCBpZiBpdCBwYXNzZXMgdGhlIGNoZWNrCgkqLwoJcHVibGljIGZsb2F0IG5vdEluZmluaXRlKGZs
b2F0IHZhbHVlKSB7CgkJaWYgKGRvQ2hlY2sgJiYgRmxvYXQuaXNJbmZpbml0ZSh2YWx1ZSkpIG9u
RmFpbHVyZSh2YWx1ZSArICIgaXMgaW5maW5pdGUiKTsKCQlyZXR1cm4gdmFsdWU7Cgl9CgkKCS8q
KgoJKiBDaGVja3MgdGhhdCB2YWx1ZSBpcyBub3QgaW5maW5pdGUuCgkqIDxwPgoJKiBAcmV0dXJu
IHZhbHVlLCBpZiBpdCBwYXNzZXMgdGhlIGNoZWNrCgkqLwoJcHVibGljIGRvdWJsZSBub3RJbmZp
bml0ZShkb3VibGUgdmFsdWUpIHsKCQlpZiAoZG9DaGVjayAmJiBEb3VibGUuaXNJbmZpbml0ZSh2
YWx1ZSkpIG9uRmFpbHVyZSh2YWx1ZSArICIgaXMgaW5maW5pdGUiKTsKCQlyZXR1cm4gdmFsdWU7
Cgl9CgkKCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tIGNvbnZlbmllbmNlIGNvbXBvdW5kIG1ldGhv
ZHMgKGNvbWJpbmUgbXVsdGlwbGUgbWV0aG9kcyBhYm92ZSkgLS0tLS0tLS0tLS0tLS0tLS0tLS0K
CQoJLyoqCgkqIENoZWNrcyB0aGF0IHZhbHVlIGlzICJub3JtYWwiLCB3aGljaCBpcyBkZWZpbmVk
IGFzIGl0IHBhc3NpbmcgYWxsIHRoZXNlIHRlc3RzOgoJKiA8b2w+CgkqICA8bGk+aXMgbm90IE5h
TjwvbGk+CgkqICA8bGk+aXMgbm90IGluZmluaXRlPC9saT4KCSogPC9vbD4KCSogPHA+CgkqIEBy
ZXR1cm4gdmFsdWUsIGlmIGl0IHBhc3NlcyB0aGUgY2hlY2sKCSovCglwdWJsaWMgZmxvYXQgbm9y
bWFsKGZsb2F0IHZhbHVlKSB7CgkJbm90TmFOKHZhbHVlKTsKCQlub3RJbmZpbml0ZSh2YWx1ZSk7
CgkJcmV0dXJuIHZhbHVlOwoJfQoJCgkvKioKCSogQ2hlY2tzIHRoYXQgdmFsdWUgaXMgIm5vcm1h
bCIsIHdoaWNoIGlzIGRlZmluZWQgYXMgaXQgcGFzc2luZyBhbGwgdGhlc2UgdGVzdHM6CgkqIDxv
bD4KCSogIDxsaT5pcyBub3QgTmFOPC9saT4KCSogIDxsaT5pcyBub3QgaW5maW5pdGU8L2xpPgoJ
KiA8L29sPgoJKiA8cD4KCSogQHJldHVybiB2YWx1ZSwgaWYgaXQgcGFzc2VzIHRoZSBjaGVjawoJ
Ki8KCXB1YmxpYyBkb3VibGUgbm9ybWFsKGRvdWJsZSB2YWx1ZSkgewoJCW5vdE5hTih2YWx1ZSk7
CgkJbm90SW5maW5pdGUodmFsdWUpOwoJCXJldHVybiB2YWx1ZTsKCX0KCQoJLyoqCgkqIENoZWNr
cyB0aGF0IHZhbHVlIGlzIHtAbGluayAjbm9ybWFsIG5vcm1hbH0gYW5kIHtAbGluayAjbmVnYXRp
dmUgbmVnYXRpdmV9LgoJKiA8cD4KCSogQHJldHVybiB2YWx1ZSwgaWYgaXQgcGFzc2VzIHRoZSBj
aGVjawoJKi8KCXB1YmxpYyBmbG9hdCBub3JtYWxOZWdhdGl2ZShmbG9hdCB2YWx1ZSkgewoJCW5v
cm1hbCh2YWx1ZSk7CgkJbmVnYXRpdmUodmFsdWUpOwoJCXJldHVybiB2YWx1ZTsKCX0KCQoJLyoq
CgkqIENoZWNrcyB0aGF0IHZhbHVlIGlzIHtAbGluayAjbm9ybWFsIG5vcm1hbH0gYW5kIHtAbGlu
ayAjbmVnYXRpdmUgbmVnYXRpdmV9LgoJKiA8cD4KCSogQHJldHVybiB2YWx1ZSwgaWYgaXQgcGFz
c2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyBkb3VibGUgbm9ybWFsTmVnYXRpdmUoZG91YmxlIHZh
bHVlKSB7CgkJbm9ybWFsKHZhbHVlKTsKCQluZWdhdGl2ZSh2YWx1ZSk7CgkJcmV0dXJuIHZhbHVl
OwoJfQoJCgkvKioKCSogQ2hlY2tzIHRoYXQgdmFsdWUgaXMge0BsaW5rICNub3JtYWwgbm9ybWFs
fSBhbmQge0BsaW5rICNub3ROZWdhdGl2ZSBub3QgbmVnYXRpdmV9LgoJKiA8cD4KCSogQHJldHVy
biB2YWx1ZSwgaWYgaXQgcGFzc2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyBmbG9hdCBub3JtYWxO
b3ROZWdhdGl2ZShmbG9hdCB2YWx1ZSkgewoJCW5vcm1hbCh2YWx1ZSk7CgkJbm90TmVnYXRpdmUo
dmFsdWUpOwoJCXJldHVybiB2YWx1ZTsKCX0KCQoJLyoqCgkqIENoZWNrcyB0aGF0IHZhbHVlIGlz
IHtAbGluayAjbm9ybWFsIG5vcm1hbH0gYW5kIHtAbGluayAjbm90TmVnYXRpdmUgbm90IG5lZ2F0
aXZlfS4KCSogPHA+CgkqIEByZXR1cm4gdmFsdWUsIGlmIGl0IHBhc3NlcyB0aGUgY2hlY2sKCSov
CglwdWJsaWMgZG91YmxlIG5vcm1hbE5vdE5lZ2F0aXZlKGRvdWJsZSB2YWx1ZSkgewoJCW5vcm1h
bCh2YWx1ZSk7CgkJbm90TmVnYXRpdmUodmFsdWUpOwoJCXJldHVybiB2YWx1ZTsKCX0KCQoJLyoq
CgkqIENoZWNrcyB0aGF0IHZhbHVlIGlzIHtAbGluayAjbm9ybWFsIG5vcm1hbH0gYW5kIHtAbGlu
ayAjcG9zaXRpdmUgcG9zaXRpdmV9LgoJKiA8cD4KCSogQHJldHVybiB2YWx1ZSwgaWYgaXQgcGFz
c2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyBmbG9hdCBub3JtYWxQb3NpdGl2ZShmbG9hdCB2YWx1
ZSkgewoJCW5vcm1hbCh2YWx1ZSk7CgkJcG9zaXRpdmUodmFsdWUpOwoJCXJldHVybiB2YWx1ZTsK
CX0KCQoJLyoqCgkqIENoZWNrcyB0aGF0IHZhbHVlIGlzIHtAbGluayAjbm9ybWFsIG5vcm1hbH0g
YW5kIHtAbGluayAjcG9zaXRpdmUgcG9zaXRpdmV9LgoJKiA8cD4KCSogQHJldHVybiB2YWx1ZSwg
aWYgaXQgcGFzc2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyBkb3VibGUgbm9ybWFsUG9zaXRpdmUo
ZG91YmxlIHZhbHVlKSB7CgkJbm9ybWFsKHZhbHVlKTsKCQlwb3NpdGl2ZSh2YWx1ZSk7CgkJcmV0
dXJuIHZhbHVlOwoJfQoJCgkvKioKCSogQ2hlY2tzIHRoYXQgdmFsdWUgaXMge0BsaW5rICNub3Jt
YWwgbm9ybWFsfSBhbmQge0BsaW5rICNub3RQb3NpdGl2ZSBub3QgcG9zaXRpdmV9LgoJKiA8cD4K
CSogQHJldHVybiB2YWx1ZSwgaWYgaXQgcGFzc2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyBmbG9h
dCBub3JtYWxOb3RQb3NpdGl2ZShmbG9hdCB2YWx1ZSkgewoJCW5vcm1hbCh2YWx1ZSk7CgkJbm90
UG9zaXRpdmUodmFsdWUpOwoJCXJldHVybiB2YWx1ZTsKCX0KCQoJLyoqCgkqIENoZWNrcyB0aGF0
IHZhbHVlIGlzIHtAbGluayAjbm9ybWFsIG5vcm1hbH0gYW5kIHtAbGluayAjbm90UG9zaXRpdmUg
bm90IHBvc2l0aXZlfS4KCSogPHA+CgkqIEByZXR1cm4gdmFsdWUsIGlmIGl0IHBhc3NlcyB0aGUg
Y2hlY2sKCSovCglwdWJsaWMgZG91YmxlIG5vcm1hbE5vdFBvc2l0aXZlKGRvdWJsZSB2YWx1ZSkg
ewoJCW5vcm1hbCh2YWx1ZSk7CgkJbm90UG9zaXRpdmUodmFsdWUpOwoJCXJldHVybiB2YWx1ZTsK
CX0KCQoJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gdmFsaWRQb3J0IC0tLS0tLS0tLS0tLS0tLS0t
LS0tCgkKCS8qKgoJKiBDaGVja3MgdGhhdCB2YWx1ZSBpcyBhIHZhbGlkIFRDUCBvciBVRFAgcG9y
dCBudW1iZXIuCgkqIFNlZSA8YSBocmVmPSJodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1RD
UF9hbmRfVURQX3BvcnQiPlRDUCBhbmQgVURQIHBvcnQ8L2E+LgoJKiA8cD4KCSogQHJldHVybiB2
YWx1ZSwgaWYgaXQgcGFzc2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyBpbnQgdmFsaWRQb3J0KGlu
dCB2YWx1ZSkgewoJCWlmIChkb0NoZWNrICYmICFOZXRVdGlsLmlzVmFsaWRQb3J0KHZhbHVlKSkg
b25GYWlsdXJlKHZhbHVlICsgIiBpcyBvdXRzaWRlIHRoZSBwcm9wZXIgcmFuZ2UgZm9yIGEgVENQ
L0lQIHBvcnQgbnVtYmVyLCBbMCwgIiArIE51bWJlclV0aWwudW5zaWduZWQyQnl0ZU1heFZhbHVl
ICsgIl0iKTsKCQlyZXR1cm4gdmFsdWU7Cgl9CgkKCQoJLy8gPT09PT09PT09PT09PT09PT09PT0g
Q0hFQ0tJTkcgTUVUSE9EUywgU0VDVElPTiAyOiBnZW5lcmljIE9iamVjdCBtZXRob2RzID09PT09
PT09PT09PT09PT09PT09CgkKCQoJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gbnVsbCBtZXRob2Rz
IC0tLS0tLS0tLS0tLS0tLS0tLS0tCgkKCS8qKgoJKiBDaGVja3MgdGhhdCBvYmogaXMgbnVsbC4K
CSogPHA+CgkqIEByZXR1cm4gb2JqLCBpZiBpdCBwYXNzZXMgdGhlIGNoZWNrCgkqLwoJcHVibGlj
IE9iamVjdCBpc051bGwoT2JqZWN0IG9iamVjdCkgewovLyArKysgcmVtb3ZlIGlzPwoJCWlmIChk
b0NoZWNrICYmICEob2JqZWN0ID09IG51bGwpKSBvbkZhaWx1cmUoIm9iamVjdCBpcyBub3QgbnVs
bCIpOwoJCXJldHVybiBvYmplY3Q7Cgl9CgkKCS8qKgoJKiBDaGVja3MgdGhhdCBvYmogaXMgbm90
IG51bGwuCgkqIDxwPgoJKiBAcmV0dXJuIG9iaiwgaWYgaXQgcGFzc2VzIHRoZSBjaGVjawoJKi8K
CXB1YmxpYyBPYmplY3Qgbm90TnVsbChPYmplY3Qgb2JqZWN0KSB7CgkJaWYgKGRvQ2hlY2sgJiYg
IShvYmplY3QgIT0gbnVsbCkpIG9uRmFpbHVyZSgib2JqZWN0IGlzIG51bGwiKTsKCQlyZXR1cm4g
b2JqZWN0OwoJfQoJCgkKCS8vID09PT09PT09PT09PT09PT09PT09IENIRUNLSU5HIE1FVEhPRFMs
IFNFQ1RJT04gMzogYXJyYXkvQ29sbGVjdGlvbiBtZXRob2RzID09PT09PT09PT09PT09PT09PT09
CgkKCQoJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gZW1wdHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0K
CQoJLyoqCgkqIENoZWNrcyB0aGF0IGFycmF5IGlzIGVtcHR5IChpLmUuIGVpdGhlciBpcyBudWxs
IG9yIGFycmF5Lmxlbmd0aCA9PSAwKS4KCSogPHA+CgkqIFRoaXMgbWV0aG9kIHdhcyBpbnRyb2R1
Y2VkIGZvciBzdHJpY3QgYXJndW1lbnQgY2hlY2tpbmcgb2YgPGNvZGU+bWFpbjwvY29kZT4gbWV0
aG9kcwoJKiB3aGljaCBkbyBub3QgdXNlIHRoZSBzdXBwbGllZCA8Y29kZT5TdHJpbmdbXTwvY29k
ZT4gcGFyYW1ldGVyLgoJKiBIZXJlLCB5b3Ugd2FudCB0byBjcmFzaCBpZiB0aGUgdXNlciBoYXMg
c3VwcGxpZWQgdmFsdWVzLCB0byBpbmZvcm0gdGhlbSB0aGF0IHRoZXkgaGF2ZSBtaXN1c2VkIHRo
ZSBtZXRob2QuCgkqIDxwPgoJKiBBbiBhbHRlcm5hdGl2ZSB0byB0aGlzIG1ldGhvZCwgaWYgeW91
IGRvIG5vdCB3YW50IGEgbnVsbCBhcnJheSB0byBwYXNzLCBpcyB0byBjYWxsIDxjb2RlPntAbGlu
ayAjaGFzU2l6ZShPYmplY3RbXSwgaW50KSBoYXNTaXplfShhcnJheSwgMCk8L2NvZGU+IHBhcmFt
ZXRlci4KCSogPHA+CgkqIEByZXR1cm4gYXJyYXksIGlmIGl0IHBhc3NlcyB0aGUgY2hlY2sKCSov
CglwdWJsaWMgPFQ+IFRbXSBlbXB0eShUW10gYXJyYXkpIHsKCQlpZiAoIChhcnJheSAhPSBudWxs
KSAmJiAoYXJyYXkubGVuZ3RoID4gMCkgKSBvbkZhaWx1cmUoImFycmF5IGlzIG5vdCBudWxsIGFu
ZCIpOwoJCXJldHVybiBhcnJheTsKCX0KCQoJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gbm90RW1w
dHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQoJLyoqCgkqIENoZWNrcyB0aGF0IGFycmF5IGlzIG5v
dCBlbXB0eSAoaS5lLiBpcyBub3QgbnVsbCBhbmQgYXJyYXkubGVuZ3RoID4gMCkuCgkqIDxwPgoJ
KiBAcmV0dXJuIGFycmF5LCBpZiBpdCBwYXNzZXMgdGhlIGNoZWNrCgkqLwoJcHVibGljIGJvb2xl
YW5bXSBub3RFbXB0eShib29sZWFuW10gYXJyYXkpIHsKCQlub3ROdWxsKGFycmF5KTsKCQlub3Ra
ZXJvKGFycmF5Lmxlbmd0aCk7CgkJcmV0dXJuIGFycmF5OwoJfQoJCgkvKioKCSogQ2hlY2tzIHRo
YXQgYXJyYXkgaXMgbm90IGVtcHR5IChpLmUuIGlzIG5vdCBudWxsIGFuZCBhcnJheS5sZW5ndGgg
PiAwKS4KCSogPHA+CgkqIEByZXR1cm4gYXJyYXksIGlmIGl0IHBhc3NlcyB0aGUgY2hlY2sKCSov
CglwdWJsaWMgYnl0ZVtdIG5vdEVtcHR5KGJ5dGVbXSBhcnJheSkgewoJCW5vdE51bGwoYXJyYXkp
OwoJCW5vdFplcm8oYXJyYXkubGVuZ3RoKTsKCQlyZXR1cm4gYXJyYXk7Cgl9CgkKCS8qKgoJKiBD
aGVja3MgdGhhdCBhcnJheSBpcyBub3QgZW1wdHkgKGkuZS4gaXMgbm90IG51bGwgYW5kIGFycmF5
Lmxlbmd0aCA+IDApLgoJKiA8cD4KCSogQHJldHVybiBhcnJheSwgaWYgaXQgcGFzc2VzIHRoZSBj
aGVjawoJKi8KCXB1YmxpYyBzaG9ydFtdIG5vdEVtcHR5KHNob3J0W10gYXJyYXkpIHsKCQlub3RO
dWxsKGFycmF5KTsKCQlub3RaZXJvKGFycmF5Lmxlbmd0aCk7CgkJcmV0dXJuIGFycmF5OwoJfQoJ
CgkvKioKCSogQ2hlY2tzIHRoYXQgYXJyYXkgaXMgbm90IGVtcHR5IChpLmUuIGlzIG5vdCBudWxs
IGFuZCBhcnJheS5sZW5ndGggPiAwKS4KCSogPHA+CgkqIEByZXR1cm4gYXJyYXksIGlmIGl0IHBh
c3NlcyB0aGUgY2hlY2sKCSovCglwdWJsaWMgY2hhcltdIG5vdEVtcHR5KGNoYXJbXSBhcnJheSkg
ewoJCW5vdE51bGwoYXJyYXkpOwoJCW5vdFplcm8oYXJyYXkubGVuZ3RoKTsKCQlyZXR1cm4gYXJy
YXk7Cgl9CgkKCS8qKgoJKiBDaGVja3MgdGhhdCBhcnJheSBpcyBub3QgZW1wdHkgKGkuZS4gaXMg
bm90IG51bGwgYW5kIGFycmF5Lmxlbmd0aCA+IDApLgoJKiA8cD4KCSogQHJldHVybiBhcnJheSwg
aWYgaXQgcGFzc2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyBpbnRbXSBub3RFbXB0eShpbnRbXSBh
cnJheSkgewoJCW5vdE51bGwoYXJyYXkpOwoJCW5vdFplcm8oYXJyYXkubGVuZ3RoKTsKCQlyZXR1
cm4gYXJyYXk7Cgl9CgkKCS8qKgoJKiBDaGVja3MgdGhhdCBhcnJheSBpcyBub3QgZW1wdHkgKGku
ZS4gaXMgbm90IG51bGwgYW5kIGFycmF5Lmxlbmd0aCA+IDApLgoJKiA8cD4KCSogQHJldHVybiBh
cnJheSwgaWYgaXQgcGFzc2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyBsb25nW10gbm90RW1wdHko
bG9uZ1tdIGFycmF5KSB7CgkJbm90TnVsbChhcnJheSk7CgkJbm90WmVybyhhcnJheS5sZW5ndGgp
OwoJCXJldHVybiBhcnJheTsKCX0KCQoJLyoqCgkqIENoZWNrcyB0aGF0IGFycmF5IGlzIG5vdCBl
bXB0eSAoaS5lLiBpcyBub3QgbnVsbCBhbmQgYXJyYXkubGVuZ3RoID4gMCkuCgkqIDxwPgoJKiBA
cmV0dXJuIGFycmF5LCBpZiBpdCBwYXNzZXMgdGhlIGNoZWNrCgkqLwoJcHVibGljIGZsb2F0W10g
bm90RW1wdHkoZmxvYXRbXSBhcnJheSkgewoJCW5vdE51bGwoYXJyYXkpOwoJCW5vdFplcm8oYXJy
YXkubGVuZ3RoKTsKCQlyZXR1cm4gYXJyYXk7Cgl9CgkKCS8qKgoJKiBDaGVja3MgdGhhdCBhcnJh
eSBpcyBub3QgZW1wdHkgKGkuZS4gaXMgbm90IG51bGwgYW5kIGFycmF5Lmxlbmd0aCA+IDApLgoJ
KiA8cD4KCSogQHJldHVybiBhcnJheSwgaWYgaXQgcGFzc2VzIHRoZSBjaGVjawoJKi8KCXB1Ymxp
YyBkb3VibGVbXSBub3RFbXB0eShkb3VibGVbXSBhcnJheSkgewoJCW5vdE51bGwoYXJyYXkpOwoJ
CW5vdFplcm8oYXJyYXkubGVuZ3RoKTsKCQlyZXR1cm4gYXJyYXk7Cgl9CgkKCS8qKgoJKiBDaGVj
a3MgdGhhdCBhcnJheSBpcyBub3QgZW1wdHkgKGkuZS4gaXMgbm90IG51bGwgYW5kIGFycmF5Lmxl
bmd0aCA+IDApLgoJKiA8cD4KCSogQHJldHVybiBhcnJheSwgaWYgaXQgcGFzc2VzIHRoZSBjaGVj
awoJKi8KCXB1YmxpYyA8VD4gVFtdIG5vdEVtcHR5KFRbXSBhcnJheSkgewoJCW5vdE51bGwoYXJy
YXkpOwoJCW5vdFplcm8oYXJyYXkubGVuZ3RoKTsKCQlyZXR1cm4gYXJyYXk7Cgl9CgkKCS8qKgoJ
KiBDaGVja3MgdGhhdCBjb2xsZWN0aW9uIGlzIG5vdCBlbXB0eSAoaS5lLiBpcyBub3QgbnVsbCBh
bmQgY29sbGVjdGlvbi5zaXplKCkgPiAwKS4KCSogPHA+CgkqIEByZXR1cm4gY29sbGVjdGlvbiwg
aWYgaXQgcGFzc2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyA8VD4gQ29sbGVjdGlvbjxUPiBub3RF
bXB0eShDb2xsZWN0aW9uPFQ+IGNvbGxlY3Rpb24pIHsKCQlub3ROdWxsKGNvbGxlY3Rpb24pOwoJ
CW5vdFplcm8oY29sbGVjdGlvbi5zaXplKCkpOwoJCXJldHVybiBjb2xsZWN0aW9uOwoJfQoJCgkv
KioKCSogQ2hlY2tzIHRoYXQgbWFwIGlzIG5vdCBlbXB0eSAoaS5lLiBpcyBub3QgbnVsbCBhbmQg
bWFwLnNpemUoKSA+IDApLgoJKiA8cD4KCSogQHJldHVybiBtYXAsIGlmIGl0IHBhc3NlcyB0aGUg
Y2hlY2sKCSovCglwdWJsaWMgPEssIFY+IE1hcDxLLCBWPiBub3RFbXB0eShNYXA8SywgVj4gbWFw
KSB7CgkJbm90TnVsbChtYXApOwoJCW5vdFplcm8obWFwLnNpemUoKSk7CgkJcmV0dXJuIG1hcDsK
CX0KCQoJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gaGFzU2l6ZSAtLS0tLS0tLS0tLS0tLS0tLS0t
LQoJCgkvKioKCSogQ2hlY2tzIHRoYXQgYXJyYXkgaXMgbm90IG51bGwgYW5kIGhhcyB0aGUgcmVx
dWlyZWQgbnVtYmVyIG9mIGVsZW1lbnRzIChpLmUuIGFycmF5Lmxlbmd0aCA9PSBzaXplUmVxdWly
ZWQpLgoJKiA8cD4KCSogQHJldHVybiBhcnJheSwgaWYgaXQgcGFzc2VzIHRoZSBjaGVjawoJKi8K
CXB1YmxpYyBib29sZWFuW10gaGFzU2l6ZShib29sZWFuW10gYXJyYXksIGludCBzaXplUmVxdWly
ZWQpIHsKCQlub3ROdWxsKGFycmF5KTsKCQllcXVhbChhcnJheS5sZW5ndGgsIHNpemVSZXF1aXJl
ZCk7CgkJcmV0dXJuIGFycmF5OwoJfQoJCgkvKioKCSogQ2hlY2tzIHRoYXQgYXJyYXkgaXMgbm90
IG51bGwgYW5kIGhhcyB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIGVsZW1lbnRzIChpLmUuIGFycmF5
Lmxlbmd0aCA9PSBzaXplUmVxdWlyZWQpLgoJKiA8cD4KCSogQHJldHVybiBhcnJheSwgaWYgaXQg
cGFzc2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyBieXRlW10gaGFzU2l6ZShieXRlW10gYXJyYXks
IGludCBzaXplUmVxdWlyZWQpIHsKCQlub3ROdWxsKGFycmF5KTsKCQllcXVhbChhcnJheS5sZW5n
dGgsIHNpemVSZXF1aXJlZCk7CgkJcmV0dXJuIGFycmF5OwoJfQoJCgkvKioKCSogQ2hlY2tzIHRo
YXQgYXJyYXkgaXMgbm90IG51bGwgYW5kIGhhcyB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIGVsZW1l
bnRzIChpLmUuIGFycmF5Lmxlbmd0aCA9PSBzaXplUmVxdWlyZWQpLgoJKiA8cD4KCSogQHJldHVy
biBhcnJheSwgaWYgaXQgcGFzc2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyBzaG9ydFtdIGhhc1Np
emUoc2hvcnRbXSBhcnJheSwgaW50IHNpemVSZXF1aXJlZCkgewoJCW5vdE51bGwoYXJyYXkpOwoJ
CWVxdWFsKGFycmF5Lmxlbmd0aCwgc2l6ZVJlcXVpcmVkKTsKCQlyZXR1cm4gYXJyYXk7Cgl9CgkK
CS8qKgoJKiBDaGVja3MgdGhhdCBhcnJheSBpcyBub3QgbnVsbCBhbmQgaGFzIHRoZSByZXF1aXJl
ZCBudW1iZXIgb2YgZWxlbWVudHMgKGkuZS4gYXJyYXkubGVuZ3RoID09IHNpemVSZXF1aXJlZCku
CgkqIDxwPgoJKiBAcmV0dXJuIGFycmF5LCBpZiBpdCBwYXNzZXMgdGhlIGNoZWNrCgkqLwoJcHVi
bGljIGNoYXJbXSBoYXNTaXplKGNoYXJbXSBhcnJheSwgaW50IHNpemVSZXF1aXJlZCkgewoJCW5v
dE51bGwoYXJyYXkpOwoJCWVxdWFsKGFycmF5Lmxlbmd0aCwgc2l6ZVJlcXVpcmVkKTsKCQlyZXR1
cm4gYXJyYXk7Cgl9CgkKCS8qKgoJKiBDaGVja3MgdGhhdCBhcnJheSBpcyBub3QgbnVsbCBhbmQg
aGFzIHRoZSByZXF1aXJlZCBudW1iZXIgb2YgZWxlbWVudHMgKGkuZS4gYXJyYXkubGVuZ3RoID09
IHNpemVSZXF1aXJlZCkuCgkqIDxwPgoJKiBAcmV0dXJuIGFycmF5LCBpZiBpdCBwYXNzZXMgdGhl
IGNoZWNrCgkqLwoJcHVibGljIGludFtdIGhhc1NpemUoaW50W10gYXJyYXksIGludCBzaXplUmVx
dWlyZWQpIHsKCQlub3ROdWxsKGFycmF5KTsKCQllcXVhbChhcnJheS5sZW5ndGgsIHNpemVSZXF1
aXJlZCk7CgkJcmV0dXJuIGFycmF5OwoJfQoJCgkvKioKCSogQ2hlY2tzIHRoYXQgYXJyYXkgaXMg
bm90IG51bGwgYW5kIGhhcyB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIGVsZW1lbnRzIChpLmUuIGFy
cmF5Lmxlbmd0aCA9PSBzaXplUmVxdWlyZWQpLgoJKiA8cD4KCSogQHJldHVybiBhcnJheSwgaWYg
aXQgcGFzc2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyBsb25nW10gaGFzU2l6ZShsb25nW10gYXJy
YXksIGludCBzaXplUmVxdWlyZWQpIHsKCQlub3ROdWxsKGFycmF5KTsKCQllcXVhbChhcnJheS5s
ZW5ndGgsIHNpemVSZXF1aXJlZCk7CgkJcmV0dXJuIGFycmF5OwoJfQoJCgkvKioKCSogQ2hlY2tz
IHRoYXQgYXJyYXkgaXMgbm90IG51bGwgYW5kIGhhcyB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIGVs
ZW1lbnRzIChpLmUuIGFycmF5Lmxlbmd0aCA9PSBzaXplUmVxdWlyZWQpLgoJKiA8cD4KCSogQHJl
dHVybiBhcnJheSwgaWYgaXQgcGFzc2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyBmbG9hdFtdIGhh
c1NpemUoZmxvYXRbXSBhcnJheSwgaW50IHNpemVSZXF1aXJlZCkgewoJCW5vdE51bGwoYXJyYXkp
OwoJCWVxdWFsKGFycmF5Lmxlbmd0aCwgc2l6ZVJlcXVpcmVkKTsKCQlyZXR1cm4gYXJyYXk7Cgl9
CgkKCS8qKgoJKiBDaGVja3MgdGhhdCBhcnJheSBpcyBub3QgbnVsbCBhbmQgaGFzIHRoZSByZXF1
aXJlZCBudW1iZXIgb2YgZWxlbWVudHMgKGkuZS4gYXJyYXkubGVuZ3RoID09IHNpemVSZXF1aXJl
ZCkuCgkqIDxwPgoJKiBAcmV0dXJuIGFycmF5LCBpZiBpdCBwYXNzZXMgdGhlIGNoZWNrCgkqLwoJ
cHVibGljIGRvdWJsZVtdIGhhc1NpemUoZG91YmxlW10gYXJyYXksIGludCBzaXplUmVxdWlyZWQp
IHsKCQlub3ROdWxsKGFycmF5KTsKCQllcXVhbChhcnJheS5sZW5ndGgsIHNpemVSZXF1aXJlZCk7
CgkJcmV0dXJuIGFycmF5OwoJfQoJCgkvKioKCSogQ2hlY2tzIHRoYXQgYXJyYXkgaXMgbm90IG51
bGwgYW5kIGhhcyB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIGVsZW1lbnRzIChpLmUuIGFycmF5Lmxl
bmd0aCA9PSBzaXplUmVxdWlyZWQpLgoJKiA8cD4KCSogQHJldHVybiBhcnJheSwgaWYgaXQgcGFz
c2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyA8VD4gVFtdIGhhc1NpemUoVFtdIGFycmF5LCBpbnQg
c2l6ZVJlcXVpcmVkKSB7CgkJbm90TnVsbChhcnJheSk7CgkJZXF1YWwoYXJyYXkubGVuZ3RoLCBz
aXplUmVxdWlyZWQpOwoJCXJldHVybiBhcnJheTsKCX0KCQoJLyoqCgkqIENoZWNrcyB0aGF0IGNv
bGxlY3Rpb24gaXMgbm90IG51bGwgYW5kIGhhcyB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIGVsZW1l
bnRzIChpLmUuIGNvbGxlY3Rpb24uc2l6ZSgpID09IHNpemVSZXF1aXJlZCkuCgkqIDxwPgoJKiBA
cmV0dXJuIGNvbGxlY3Rpb24sIGlmIGl0IHBhc3NlcyB0aGUgY2hlY2sKCSovCglwdWJsaWMgPFQ+
IENvbGxlY3Rpb248VD4gaGFzU2l6ZShDb2xsZWN0aW9uPFQ+IGNvbGxlY3Rpb24sIGludCBzaXpl
UmVxdWlyZWQpIHsKCQlub3ROdWxsKGNvbGxlY3Rpb24pOwoJCWVxdWFsKGNvbGxlY3Rpb24uc2l6
ZSgpLCBzaXplUmVxdWlyZWQpOwoJCXJldHVybiBjb2xsZWN0aW9uOwoJfQoJCgkvKioKCSogQ2hl
Y2tzIHRoYXQgbWFwIGlzIG5vdCBudWxsIGFuZCBoYXMgdGhlIHJlcXVpcmVkIG51bWJlciBvZiBl
bGVtZW50cyAoaS5lLiBtYXAuc2l6ZSgpID09IHNpemVSZXF1aXJlZCkuCgkqIDxwPgoJKiBAcmV0
dXJuIG1hcCwgaWYgaXQgcGFzc2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyA8SywgVj4gTWFwPEss
IFY+IGhhc1NpemUoTWFwPEssIFY+IG1hcCwgaW50IHNpemVSZXF1aXJlZCkgewoJCW5vdE51bGwo
bWFwKTsKCQllcXVhbChtYXAuc2l6ZSgpLCBzaXplUmVxdWlyZWQpOwoJCXJldHVybiBtYXA7Cgl9
CgkKCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tIHNhbWVTaXplIC0tLS0tLS0tLS0tLS0tLS0tLS0t
CgkKLyoKKysrIEkgd2FudGVkIHRvIHdyaXRlIGEgbWV0aG9kIGNhbGxlZCBzYW1lU2l6ZSBpbiB3
aGljaCB5b3UgY291bGQgc3VwcGx5IHR3byBhcmdzLApib3RoIGJlaW5nIGVpdGhlciBhbiBhcnJh
eS9Db2xsZWN0aW9uL01hcCwgYW5kIHRoZSBtZXRob2Qgd291bGQgY29uZmlybSB0aGF0IGJvdGgg
YXJncyBhcmUgZWl0aGVyIG51bGwKb3IgYm90aCBhcmUgbm9uLW51bGwgYW5kIGhhdmUgdGhlIHNh
bWUgc2l6ZS4KSSBnYXZlIHVwIG9uIHRoaXMsIGhvd2V2ZXIsIGJlY2F1c2UgdGhlcmUgYXJlIDYg
Y29tYmluYXRpb25zIG9mIGFyZyB0eXBlcyBCRUZPUkUgeW91IGNvbnNpZGVyIHRoZSBwcmltaXRp
dmUgYXJyYXkgdmFyaWF0aW9ucy4uLgpKYXZhJ3MgcHJpbWl0aXZlcyBhcmUgc3VjaCBhIHByb2dy
YW1tZXJzIG5pZ2h0bWFyZS4uLgoKVGhlIHdvcmsgYXJvdW5kIGZvciBub3cgaXMgdG8gdXNlIGhh
c1NpemUgaW4gcGFydGx5IGF3a3dhcmQgd2F5cyBsaWtlCglDaGVjay5hcmcoKS5oYXNTaXplKCBz
b21lQXJyYXksIGFub3RoZXJBcnJheS5sZW5ndGggKTsKKi8KCQoJLy8gLS0tLS0tLS0tLS0tLS0t
LS0tLS0gdW5tb2RpZmlhYmxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tCgkKCS8qKgoJKiBDaGVja3Mg
dGhhdCBjb2xsZWN0aW9uIGlzIHVubW9kaWZpYWJsZSAoaS5lLiBjYW5ub3QgYmUgbXV0YXRlZCku
CgkqIDxwPgoJKiBUaGUgY3VycmVudCBhbGdvcml0aG0gaXMgdG8gY2FsbCB7QGxpbmsgQ29sbGVj
dGlvbiNjbGVhcn0gYW5kIGNvbmZpcm0gdGhhdCBhbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2Vw
dGlvbiBpcyB0aHJvd24uCgkqIElmIHNhaWQgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24g
aXMgY2F1Z2h0LCB0aGVuIGl0IGlzIG90aGVyd2lzZSBpZ25vcmVkLAoJKiBob3dldmVyLCBpZiBp
dCBpcyBub3QgcmFpc2VkIGF0IGFsbCB0aGVuIHtAbGluayAjb25GYWlsdXJlIG9uRmFpbHVyZX0g
aXMgY2FsbGVkLgoJKiA8cD4KCSogPGI+V2FybmluZzogZG8gbm90IGNhbGwgdGhpcyBtZXRob2Qg
d2l0aCBDb2xsZWN0aW9ucyB0aGF0IHlvdSBleHBlY3QgbWF5IGZhaWwsIGJlY2F1c2UgYSBzaWRl
IGVmZmVjdCBvZiBmYWlsdXJlIGlzIHRoYXQgY29sbGVjdGlvbiB3aWxsIGJlIGNsZWFyZWQuPC9i
PgoJKiA8cD4KCSogVW5tb2RpZmlhYmxlIENvbGxlY3Rpb25zIGFyZSBjb252ZW5pZW50bHkgZ2Vu
ZXJhdGVkIGJ5CgkqIHtAbGluayBDb2xsZWN0aW9ucyN1bm1vZGlmaWFibGVDb2xsZWN0aW9uIENv
bGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb259LCB7QGxpbmsgQ29sbGVjdGlvbnMjdW5t
b2RpZmlhYmxlTGlzdCBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0fQoJKiB7QGxpbmsgQ29s
bGVjdGlvbnMjdW5tb2RpZmlhYmxlU2V0IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldH0sIHtA
bGluayBDb2xsZWN0aW9ucyN1bm1vZGlmaWFibGVTb3J0ZWRTZXQgQ29sbGVjdGlvbnMudW5tb2Rp
ZmlhYmxlU29ydGVkU2V0fS4KCSogVGhleSBtYXkgYmUgdXNlZCB3aGVuIGV4cG9zaW5nIENvbGxl
Y3Rpb24gdHlwZSBmaWVsZHMgaW4gb3JkZXIgdG8gbWFpbnRhaW4gZW5jYXBzdWxhdGlvbi4KCSog
PHA+CgkqIEByZXR1cm4gY29sbGVjdGlvbiwgaWYgaXQgcGFzc2VzIHRoZSBjaGVjawoJKi8KCXB1
YmxpYyA8VD4gQ29sbGVjdGlvbjxUPiB1bm1vZGlmaWFibGUoQ29sbGVjdGlvbjxUPiBjb2xsZWN0
aW9uKSB7CgkJbm90TnVsbChjb2xsZWN0aW9uKTsKCQkKCQl0cnkgewoJCQljb2xsZWN0aW9uLmNs
ZWFyKCk7CgkJCW9uRmFpbHVyZSgiY29sbGVjdGlvbiBhcHBlYXJzIHRvIGJlIG1vZGlmaWFibGUg
KGNhbGxlZCBjb2xsZWN0aW9uLmNsZWFyLCBidXQgdGhhdCBmYWlsZWQgdG8gdGhyb3cgYSBVbnN1
cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbikiKTsKCQl9CgkJY2F0Y2ggKFVuc3VwcG9ydGVkT3Bl
cmF0aW9uRXhjZXB0aW9uIHVvZSkgewoJCQkvLyBHT09EOiBpZiB0aGlzIG9jY3VycywgaXQgbWVh
bnMgdGhhdCBpcyB1bm1vZGlmaWFibGUKCQl9CgkJCgkJcmV0dXJuIGNvbGxlY3Rpb247Cgl9CgkK
CS8qKgoJKiBDaGVja3MgdGhhdCBtYXAgaXMgdW5tb2RpZmlhYmxlIChpLmUuIGNhbm5vdCBiZSBt
dXRhdGVkKS4KCSogPHA+CgkqIFRoZSBjdXJyZW50IGFsZ29yaXRobSBpcyB0byBjYWxsIHtAbGlu
ayBNYXAjY2xlYXJ9IGFuZCBjb25maXJtIHRoYXQgYW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNl
cHRpb24gaXMgdGhyb3duLgoJKiBJZiBzYWlkIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9u
IGlzIGNhdWdodCwgdGhlbiBpdCBpcyBvdGhlcndpc2UgaWdub3JlZCwKCSogaG93ZXZlciwgaWYg
aXQgaXMgbm90IHJhaXNlZCBhdCBhbGwgdGhlbiB7QGxpbmsgI29uRmFpbHVyZSBvbkZhaWx1cmV9
IGlzIGNhbGxlZC4KCSogPHA+CgkqIDxiPldhcm5pbmc6IGRvIG5vdCBjYWxsIHRoaXMgbWV0aG9k
IHdpdGggTWFwcyB0aGF0IHlvdSBleHBlY3QgbWF5IGZhaWwsIGJlY2F1c2UgYSBzaWRlIGVmZmVj
dCBvZiBmYWlsdXJlIGlzIHRoYXQgbWFwIHdpbGwgYmUgY2xlYXJlZC48L2I+CgkqIDxwPgoJKiBV
bm1vZGlmaWFibGUgTWFwcyBhcmUgY29udmVuaWVudGx5IGdlbmVyYXRlZCBieQoJKiB7QGxpbmsg
Q29sbGVjdGlvbnMjdW5tb2RpZmlhYmxlTWFwIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcH0s
IHtAbGluayBDb2xsZWN0aW9ucyN1bm1vZGlmaWFibGVTb3J0ZWRNYXAgQ29sbGVjdGlvbnMudW5t
b2RpZmlhYmxlU29ydGVkTWFwfS4KCSogVGhleSBtYXkgYmUgdXNlZCB3aGVuIGV4cG9zaW5nIE1h
cCB0eXBlIGZpZWxkcyBpbiBvcmRlciB0byBtYWludGFpbiBlbmNhcHN1bGF0aW9uLgoJKiA8cD4K
CSogQHJldHVybiBtYXAsIGlmIGl0IHBhc3NlcyB0aGUgY2hlY2sKCSovCglwdWJsaWMgPEssIFY+
IE1hcDxLLCBWPiB1bm1vZGlmaWFibGUoTWFwPEssIFY+IG1hcCkgewoJCW5vdE51bGwobWFwKTsK
CQkKCQl0cnkgewoJCQltYXAuY2xlYXIoKTsKCQkJb25GYWlsdXJlKCJjYWxsZWQgbWFwLmNsZWFy
LCBidXQgdGhhdCBmYWlsZWQgdG8gdGhyb3cgYSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlv
biwgd2hpY2ggaW5kaWNhdGVzIHRoYXQgbWFwIGlzIG5vdCwgaW4gZmFjdCwgdW5tb2RpZmlhYmxl
Iik7CgkJfQoJCWNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB1b2UpIHsKCQkJ
Ly8gR09PRDogaWYgdGhpcyBvY2N1cnMsIGl0IG1lYW5zIHRoYXQgaXMgdW5tb2RpZmlhYmxlCgkJ
fQoJCQoJCXJldHVybiBtYXA7Cgl9CgoJCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLSB2YWxpZElu
ZGV4IC0tLS0tLS0tLS0tLS0tLS0tLS0tCgkKCS8qKgoJKiBDaGVja3MgdGhhdCBpbmRleCBpcyB2
YWxpZCBmb3IgYXJyYXkgKGkuZS4gMCA8PSBpbmRleCA8IGFycmF5Lmxlbmd0aCkuCgkqIFRoZSBj
aGVjayBuZWNlc3NhcmlseSBmYWlscyBpZiBhcnJheSBpcyBudWxsLCBzbyB0aGlzIG1ldGhvZCBz
aW11bHRhbmVvdXNseSBzZXJ2ZXMgYXMgYSBudWxsIGNoZWNrIG9uIGFycmF5LgoJKiA8cD4KCSog
QHJldHVybiBpbmRleCwgaWYgaXQgcGFzc2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyBpbnQgdmFs
aWRJbmRleChpbnQgaW5kZXgsIGJvb2xlYW5bXSBhcnJheSkgewoJCW5vdE5lZ2F0aXZlKGluZGV4
KTsKCQlpZiAoZG9DaGVjaykgewoJCQlpZiAoYXJyYXkgPT0gbnVsbCkgb25GYWlsdXJlKCJpbmRl
eCA9ICIgKyBpbmRleCArICIgY2FuIG5vdCBiZSBhIHZhbGlkIGluZGV4IG9mIGFycmF5IGJlY2F1
c2UgYXJyYXkgaXMgbnVsbCIpOwoJCQlpZiAoaW5kZXggPCBhcnJheS5sZW5ndGgpIG9uRmFpbHVy
ZSgiaW5kZXggPSAiICsgaW5kZXggKyAiIGlzIG5vdCA8IGFycmF5Lmxlbmd0aCA9ICIgKyBhcnJh
eS5sZW5ndGgpOwoJCX0KCQlyZXR1cm4gaW5kZXg7Cgl9CgkKCS8qKgoJKiBDaGVja3MgdGhhdCBp
bmRleCBpcyB2YWxpZCBmb3IgYXJyYXkgKGkuZS4gMCA8PSBpbmRleCA8IGFycmF5Lmxlbmd0aCku
CgkqIFRoZSBjaGVjayBuZWNlc3NhcmlseSBmYWlscyBpZiBhcnJheSBpcyBudWxsLCBzbyB0aGlz
IG1ldGhvZCBzaW11bHRhbmVvdXNseSBzZXJ2ZXMgYXMgYSBudWxsIGNoZWNrIG9uIGFycmF5LgoJ
KiA8cD4KCSogQHJldHVybiBpbmRleCwgaWYgaXQgcGFzc2VzIHRoZSBjaGVjawoJKi8KCXB1Ymxp
YyBpbnQgdmFsaWRJbmRleChpbnQgaW5kZXgsIGJ5dGVbXSBhcnJheSkgewoJCW5vdE5lZ2F0aXZl
KGluZGV4KTsKCQlpZiAoZG9DaGVjaykgewoJCQlpZiAoYXJyYXkgPT0gbnVsbCkgb25GYWlsdXJl
KCJpbmRleCA9ICIgKyBpbmRleCArICIgY2FuIG5vdCBiZSBhIHZhbGlkIGluZGV4IG9mIGFycmF5
IGJlY2F1c2UgYXJyYXkgaXMgbnVsbCIpOwoJCQlpZiAoZG9DaGVjayAmJiAhKGluZGV4IDwgYXJy
YXkubGVuZ3RoKSkgb25GYWlsdXJlKCJpbmRleCA9ICIgKyBpbmRleCArICIgaXMgbm90IDwgYXJy
YXkubGVuZ3RoID0gIiArIGFycmF5Lmxlbmd0aCk7CgkJfQoJCXJldHVybiBpbmRleDsKCX0KCQoJ
LyoqCgkqIENoZWNrcyB0aGF0IGluZGV4IGlzIHZhbGlkIGZvciBhcnJheSAoaS5lLiAwIDw9IGlu
ZGV4IDwgYXJyYXkubGVuZ3RoKS4KCSogVGhlIGNoZWNrIG5lY2Vzc2FyaWx5IGZhaWxzIGlmIGFy
cmF5IGlzIG51bGwsIHNvIHRoaXMgbWV0aG9kIHNpbXVsdGFuZW91c2x5IHNlcnZlcyBhcyBhIG51
bGwgY2hlY2sgb24gYXJyYXkuCgkqIDxwPgoJKiBAcmV0dXJuIGluZGV4LCBpZiBpdCBwYXNzZXMg
dGhlIGNoZWNrCgkqLwoJcHVibGljIGludCB2YWxpZEluZGV4KGludCBpbmRleCwgc2hvcnRbXSBh
cnJheSkgewoJCW5vdE5lZ2F0aXZlKGluZGV4KTsKCQlpZiAoZG9DaGVjaykgewoJCQlpZiAoYXJy
YXkgPT0gbnVsbCkgb25GYWlsdXJlKCJpbmRleCA9ICIgKyBpbmRleCArICIgY2FuIG5vdCBiZSBh
IHZhbGlkIGluZGV4IG9mIGFycmF5IGJlY2F1c2UgYXJyYXkgaXMgbnVsbCIpOwoJCQlpZiAoIShp
bmRleCA8IGFycmF5Lmxlbmd0aCkpIG9uRmFpbHVyZSgiaW5kZXggPSAiICsgaW5kZXggKyAiIGlz
IG5vdCA8IGFycmF5Lmxlbmd0aCA9ICIgKyBhcnJheS5sZW5ndGgpOwoJCX0KCQlyZXR1cm4gaW5k
ZXg7Cgl9CgkKCS8qKgoJKiBDaGVja3MgdGhhdCBpbmRleCBpcyB2YWxpZCBmb3IgYXJyYXkgKGku
ZS4gMCA8PSBpbmRleCA8IGFycmF5Lmxlbmd0aCkuCgkqIFRoZSBjaGVjayBuZWNlc3NhcmlseSBm
YWlscyBpZiBhcnJheSBpcyBudWxsLCBzbyB0aGlzIG1ldGhvZCBzaW11bHRhbmVvdXNseSBzZXJ2
ZXMgYXMgYSBudWxsIGNoZWNrIG9uIGFycmF5LgoJKiA8cD4KCSogQHJldHVybiBpbmRleCwgaWYg
aXQgcGFzc2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyBpbnQgdmFsaWRJbmRleChpbnQgaW5kZXgs
IGNoYXJbXSBhcnJheSkgewoJCW5vdE5lZ2F0aXZlKGluZGV4KTsKCQlpZiAoZG9DaGVjaykgewoJ
CQlpZiAoYXJyYXkgPT0gbnVsbCkgb25GYWlsdXJlKCJpbmRleCA9ICIgKyBpbmRleCArICIgY2Fu
IG5vdCBiZSBhIHZhbGlkIGluZGV4IG9mIGFycmF5IGJlY2F1c2UgYXJyYXkgaXMgbnVsbCIpOwoJ
CQlpZiAoIShpbmRleCA8IGFycmF5Lmxlbmd0aCkpIG9uRmFpbHVyZSgiaW5kZXggPSAiICsgaW5k
ZXggKyAiIGlzIG5vdCA8IGFycmF5Lmxlbmd0aCA9ICIgKyBhcnJheS5sZW5ndGgpOwoJCX0KCQly
ZXR1cm4gaW5kZXg7Cgl9CgkKCS8qKgoJKiBDaGVja3MgdGhhdCBpbmRleCBpcyB2YWxpZCBmb3Ig
YXJyYXkgKGkuZS4gMCA8PSBpbmRleCA8IGFycmF5Lmxlbmd0aCkuCgkqIFRoZSBjaGVjayBuZWNl
c3NhcmlseSBmYWlscyBpZiBhcnJheSBpcyBudWxsLCBzbyB0aGlzIG1ldGhvZCBzaW11bHRhbmVv
dXNseSBzZXJ2ZXMgYXMgYSBudWxsIGNoZWNrIG9uIGFycmF5LgoJKiA8cD4KCSogQHJldHVybiBp
bmRleCwgaWYgaXQgcGFzc2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyBpbnQgdmFsaWRJbmRleChp
bnQgaW5kZXgsIGludFtdIGFycmF5KSB7CgkJbm90TmVnYXRpdmUoaW5kZXgpOwoJCWlmIChkb0No
ZWNrKSB7CgkJCWlmIChhcnJheSA9PSBudWxsKSBvbkZhaWx1cmUoImluZGV4ID0gIiArIGluZGV4
ICsgIiBjYW4gbm90IGJlIGEgdmFsaWQgaW5kZXggb2YgYXJyYXkgYmVjYXVzZSBhcnJheSBpcyBu
dWxsIik7CgkJCWlmICghKGluZGV4IDwgYXJyYXkubGVuZ3RoKSkgb25GYWlsdXJlKCJpbmRleCA9
ICIgKyBpbmRleCArICIgaXMgbm90IDwgYXJyYXkubGVuZ3RoID0gIiArIGFycmF5Lmxlbmd0aCk7
CgkJfQoJCXJldHVybiBpbmRleDsKCX0KCQoJLyoqCgkqIENoZWNrcyB0aGF0IGluZGV4IGlzIHZh
bGlkIGZvciBhcnJheSAoaS5lLiAwIDw9IGluZGV4IDwgYXJyYXkubGVuZ3RoKS4KCSogVGhlIGNo
ZWNrIG5lY2Vzc2FyaWx5IGZhaWxzIGlmIGFycmF5IGlzIG51bGwsIHNvIHRoaXMgbWV0aG9kIHNp
bXVsdGFuZW91c2x5IHNlcnZlcyBhcyBhIG51bGwgY2hlY2sgb24gYXJyYXkuCgkqIDxwPgoJKiBA
cmV0dXJuIGluZGV4LCBpZiBpdCBwYXNzZXMgdGhlIGNoZWNrCgkqLwoJcHVibGljIGludCB2YWxp
ZEluZGV4KGludCBpbmRleCwgbG9uZ1tdIGFycmF5KSB7CgkJbm90TmVnYXRpdmUoaW5kZXgpOwoJ
CWlmIChkb0NoZWNrKSB7CgkJCWlmIChhcnJheSA9PSBudWxsKSBvbkZhaWx1cmUoImluZGV4ID0g
IiArIGluZGV4ICsgIiBjYW4gbm90IGJlIGEgdmFsaWQgaW5kZXggb2YgYXJyYXkgYmVjYXVzZSBh
cnJheSBpcyBudWxsIik7CgkJCWlmICghKGluZGV4IDwgYXJyYXkubGVuZ3RoKSkgb25GYWlsdXJl
KCJpbmRleCA9ICIgKyBpbmRleCArICIgaXMgbm90IDwgYXJyYXkubGVuZ3RoID0gIiArIGFycmF5
Lmxlbmd0aCk7CgkJfQoJCXJldHVybiBpbmRleDsKCX0KCQoJLyoqCgkqIENoZWNrcyB0aGF0IGlu
ZGV4IGlzIHZhbGlkIGZvciBhcnJheSAoaS5lLiAwIDw9IGluZGV4IDwgYXJyYXkubGVuZ3RoKS4K
CSogVGhlIGNoZWNrIG5lY2Vzc2FyaWx5IGZhaWxzIGlmIGFycmF5IGlzIG51bGwsIHNvIHRoaXMg
bWV0aG9kIHNpbXVsdGFuZW91c2x5IHNlcnZlcyBhcyBhIG51bGwgY2hlY2sgb24gYXJyYXkuCgkq
IDxwPgoJKiBAcmV0dXJuIGluZGV4LCBpZiBpdCBwYXNzZXMgdGhlIGNoZWNrCgkqLwoJcHVibGlj
IGludCB2YWxpZEluZGV4KGludCBpbmRleCwgZmxvYXRbXSBhcnJheSkgewoJCW5vdE5lZ2F0aXZl
KGluZGV4KTsKCQlpZiAoZG9DaGVjaykgewoJCQlpZiAoYXJyYXkgPT0gbnVsbCkgb25GYWlsdXJl
KCJpbmRleCA9ICIgKyBpbmRleCArICIgY2FuIG5vdCBiZSBhIHZhbGlkIGluZGV4IG9mIGFycmF5
IGJlY2F1c2UgYXJyYXkgaXMgbnVsbCIpOwoJCQlpZiAoIShpbmRleCA8IGFycmF5Lmxlbmd0aCkp
IG9uRmFpbHVyZSgiaW5kZXggPSAiICsgaW5kZXggKyAiIGlzIG5vdCA8IGFycmF5Lmxlbmd0aCA9
ICIgKyBhcnJheS5sZW5ndGgpOwoJCX0KCQlyZXR1cm4gaW5kZXg7Cgl9CgkKCS8qKgoJKiBDaGVj
a3MgdGhhdCBpbmRleCBpcyB2YWxpZCBmb3IgYXJyYXkgKGkuZS4gMCA8PSBpbmRleCA8IGFycmF5
Lmxlbmd0aCkuCgkqIFRoZSBjaGVjayBuZWNlc3NhcmlseSBmYWlscyBpZiBhcnJheSBpcyBudWxs
LCBzbyB0aGlzIG1ldGhvZCBzaW11bHRhbmVvdXNseSBzZXJ2ZXMgYXMgYSBudWxsIGNoZWNrIG9u
IGFycmF5LgoJKiA8cD4KCSogQHJldHVybiBpbmRleCwgaWYgaXQgcGFzc2VzIHRoZSBjaGVjawoJ
Ki8KCXB1YmxpYyBpbnQgdmFsaWRJbmRleChpbnQgaW5kZXgsIGRvdWJsZVtdIGFycmF5KSB7CgkJ
bm90TmVnYXRpdmUoaW5kZXgpOwoJCWlmIChkb0NoZWNrKSB7CgkJCWlmIChhcnJheSA9PSBudWxs
KSBvbkZhaWx1cmUoImluZGV4ID0gIiArIGluZGV4ICsgIiBjYW4gbm90IGJlIGEgdmFsaWQgaW5k
ZXggb2YgYXJyYXkgYmVjYXVzZSBhcnJheSBpcyBudWxsIik7CgkJCWlmICghKGluZGV4IDwgYXJy
YXkubGVuZ3RoKSkgb25GYWlsdXJlKCJpbmRleCA9ICIgKyBpbmRleCArICIgaXMgbm90IDwgYXJy
YXkubGVuZ3RoID0gIiArIGFycmF5Lmxlbmd0aCk7CgkJfQoJCXJldHVybiBpbmRleDsKCX0KCQoJ
LyoqCgkqIENoZWNrcyB0aGF0IGluZGV4IGlzIHZhbGlkIGZvciBhcnJheSAoaS5lLiAwIDw9IGlu
ZGV4IDwgYXJyYXkubGVuZ3RoKS4KCSogVGhlIGNoZWNrIG5lY2Vzc2FyaWx5IGZhaWxzIGlmIGFy
cmF5IGlzIG51bGwsIHNvIHRoaXMgbWV0aG9kIHNpbXVsdGFuZW91c2x5IHNlcnZlcyBhcyBhIG51
bGwgY2hlY2sgb24gYXJyYXkuCgkqIDxwPgoJKiBAcmV0dXJuIGluZGV4LCBpZiBpdCBwYXNzZXMg
dGhlIGNoZWNrCgkqLwoJcHVibGljIDxUPiBpbnQgdmFsaWRJbmRleChpbnQgaW5kZXgsIFRbXSBh
cnJheSkgewoJCW5vdE5lZ2F0aXZlKGluZGV4KTsKCQlpZiAoZG9DaGVjaykgewoJCQlpZiAoYXJy
YXkgPT0gbnVsbCkgb25GYWlsdXJlKCJpbmRleCA9ICIgKyBpbmRleCArICIgY2FuIG5vdCBiZSBh
IHZhbGlkIGluZGV4IG9mIGFycmF5IGJlY2F1c2UgYXJyYXkgaXMgbnVsbCIpOwoJCQlpZiAoIShp
bmRleCA8IGFycmF5Lmxlbmd0aCkpIG9uRmFpbHVyZSgiaW5kZXggPSAiICsgaW5kZXggKyAiIGlz
IG5vdCA8IGFycmF5Lmxlbmd0aCA9ICIgKyBhcnJheS5sZW5ndGgpOwoJCX0KCQlyZXR1cm4gaW5k
ZXg7Cgl9CgkKCS8qKgoJKiBDaGVja3MgdGhhdCBpbmRleCBpcyB2YWxpZCBmb3IgY29sbGVjdGlv
biAoaS5lLiAwIDw9IGluZGV4IDwgY29sbGVjdGlvbi5zaXplKCkpLgoJKiBUaGUgY2hlY2sgbmVj
ZXNzYXJpbHkgZmFpbHMgaWYgY29sbGVjdGlvbiBpcyBudWxsLCBzbyB0aGlzIG1ldGhvZCBzaW11
bHRhbmVvdXNseSBzZXJ2ZXMgYXMgYSBudWxsIGNoZWNrIG9uIGNvbGxlY3Rpb24uCgkqIDxwPgoJ
KiBAcmV0dXJuIGluZGV4LCBpZiBpdCBwYXNzZXMgdGhlIGNoZWNrCgkqLwoJcHVibGljIDxUPiBp
bnQgdmFsaWRJbmRleChpbnQgaW5kZXgsIENvbGxlY3Rpb248VD4gY29sbGVjdGlvbikgewoJCW5v
dE5lZ2F0aXZlKGluZGV4KTsKCQlpZiAoZG9DaGVjaykgewoJCQlpZiAoY29sbGVjdGlvbiA9PSBu
dWxsKSBvbkZhaWx1cmUoImluZGV4ID0gIiArIGluZGV4ICsgIiBjYW4gbm90IGJlIGEgdmFsaWQg
aW5kZXggb2YgY29sbGVjdGlvbiBiZWNhdXNlIGNvbGxlY3Rpb24gaXMgbnVsbCIpOwoJCQlpZiAo
IShpbmRleCA8IGNvbGxlY3Rpb24uc2l6ZSgpKSkgb25GYWlsdXJlKCJpbmRleCA9ICIgKyBpbmRl
eCArICIgaXMgbm90IDwgY29sbGVjdGlvbi5zaXplKCkgPSAiICsgY29sbGVjdGlvbi5zaXplKCkp
OwoJCX0KCQlyZXR1cm4gaW5kZXg7Cgl9CgkKCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tIHZhbGlk
T2Zmc2V0TGVuZ3RoIC0tLS0tLS0tLS0tLS0tLS0tLS0tCgkKCS8vIE5vdGU6IHdvdWxkIGhhdmUg
cHJlZmVycmVkIHRvIHN1cHBseSB0aGUgYXJyYXkgaXRzZWxmIChhcyBvcHBvc2VkIHRvIHRoZSBh
cnJheUxlbmd0aCBwYXJhbSkuCgkvLyBUaGUgcmVhc29uIHdoeSB0aGlzIGZhaWxzIGlzIHRoYXQg
d2FudCB0aGUgbWV0aG9kcyB0byB3b3JrIGZvciBhbGwgYXJyYXlzLAoJLy8gYW5kIGV2ZW4gaWYg
dXNlIGEgcGFyYW1ldGVyaXNlZCB0eXBlLCB0aGF0IGZhaWxzIHRvIGNvdmVyIHByaW1pdGl2ZSB0
eXBlZCBhcnJheXMuCgkKCS8qKgoJKiBDaGVja3MgdGhhdCBvZmZzZXQgPj0gMCwgbGVuZ3RoID49
IDAsIGFuZCAob2Zmc2V0ICsgbGVuZ3RoKSA8PSBsZW5ndGhBcnJheS4KCSogPHA+CgkqIEBwYXJh
bSBvZmZzZXQgc29tZSBwcm9wb3NlZCBpbmRleCBvZmZzZXQgaW50byB0aGUgYXJyYXkgaW4gcXVl
c3Rpb24KCSogQHBhcmFtIGxlbmd0aCBzb21lIHByb3Bvc2VkIG51bWJlciBvZiBhcnJheSBlbGVt
ZW50cyAoZS5nLiB0byByZWFkIGludG8pIG9mIHRoZSBhcnJheSBpbiBxdWVzdGlvbgoJKiBAcGFy
YW0gbGVuZ3RoQXJyYXkgc2hvdWxkIGJlIHRoZSByZXN1bHQgb2YgYSBjYWxsIHRvIGEubGVuZ3Ro
IHdoZXJlIGEgaXMgdGhlIGFycmF5IGluIHF1ZXN0aW9uCgkqLwoJcHVibGljIHZvaWQgdmFsaWRP
ZmZzZXRMZW5ndGgoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGxlbmd0aEFycmF5KSB7CgkJ
aWYgKGRvQ2hlY2spIHsKCQkJaWYgKCEob2Zmc2V0ID49IDApKSBvbkZhaWx1cmUoIm9mZnNldCA9
ICIgKyBvZmZzZXQgKyAiIGlzIG5vdCA+PSAwLCBzbyBjYW5ub3QgYmUgYSB2YWxpZCBhcnJheSBp
bmRleCBvZmZzZXQiKTsKCQkJaWYgKCEobGVuZ3RoID49IDApKSBvbkZhaWx1cmUoImxlbmd0aCA9
ICIgKyBsZW5ndGggKyAiIGlzIG5vdCA+PSAwLCBzbyBjYW5ub3QgYmUgYSB2YWxpZCBhcnJheSBp
bmRleCBsZW5ndGgiKTsKCQkJaWYgKCEob2Zmc2V0ICsgbGVuZ3RoIDw9IGxlbmd0aEFycmF5KSkg
b25GYWlsdXJlKCJvZmZzZXQgKyBsZW5ndGggPSAoIiArIG9mZnNldCArICIgKyAiICsgbGVuZ3Ro
ICsgIikgPSAiICsgKG9mZnNldCArIGxlbmd0aCkgKyAiIGlzIG5vdCA8PSBhcnJheSBsZW5ndGgg
PSAiICsgbGVuZ3RoQXJyYXkpOwoJCX0KCX0KLy8gKysrIGNoYW5nZSB0byB0YWtlIGFycmF5IGFz
IHBhcmFtLi4uCgkKCQoJLy8gPT09PT09PT09PT09PT09PT09PT0gQ0hFQ0tJTkcgTUVUSE9EUywg
U0VDVElPTiA0OiBGaWxlIG1ldGhvZHMgPT09PT09PT09PT09PT09PT09PT0KCQoJCgkvKioKCSog
Q2hlY2tzIHRoYXQgZGlyZWN0b3J5IGlzIGEgdmFsaWQgZmlsZXN5c3RlbSBkaXJlY3RvcnksIHdo
aWNoIGlzIGRlZmluZWQgYXMgaXQgcGFzc2luZyBhbGwgdGhlc2UgdGVzdHM6CgkqIDxvbD4KCSog
IDxsaT5pcyBub3QgbnVsbDwvbGk+CgkqICA8bGk+aXMgYSBwYXRoIHRoYXQgZXhpc3RzPC9saT4K
CSogIDxsaT5jYW4gYmUgcmVhZCBieSB0aGlzIGFwcGxpY2F0aW9uPC9saT4KCSogIDxsaT5yZXNv
bHZlcyB0byBhbiBhY3R1YWwgZGlyZWN0b3J5LCBhbmQgbm90IHNvbWUgb3RoZXIgdHlwZSBvZiBm
aWxlIChlLmcuIGEgbm9ybWFsIGZpbGUpPC9saT4KCSogPC9vbD4KCSogPHA+CgkqIEByZXR1cm4g
ZGlyZWN0b3J5LCBpZiBpdCBwYXNzZXMgdGhlIGNoZWNrCgkqLwoJcHVibGljIEZpbGUgdmFsaWRE
aXJlY3RvcnkoRmlsZSBkaXJlY3RvcnkpIHsKCQl0cnkgewoJCQlpZiAoZG9DaGVjaykgewoJCQkJ
aWYgKCEoZGlyZWN0b3J5ICE9IG51bGwpKSBvbkZhaWx1cmUoImRpcmVjdG9yeSBpcyBudWxsIik7
CgkJCQlpZiAoIWRpcmVjdG9yeS5leGlzdHMoKSkgb25GYWlsdXJlKCJkaXJlY3RvcnkgIiArIGRp
cmVjdG9yeS5nZXRQYXRoKCkgKyAiIGRvZXMgbm90IGV4aXN0Iik7CgkJCQlpZiAoIWRpcmVjdG9y
eS5jYW5SZWFkKCkpIG9uRmFpbHVyZSgiZGlyZWN0b3J5ICIgKyBkaXJlY3RvcnkuZ2V0UGF0aCgp
ICsgIiBjYW5ub3QgYmUgcmVhZCBieSB0aGlzIGFwcGxpY2F0aW9uIik7CgkJCQlpZiAoIWRpcmVj
dG9yeS5pc0RpcmVjdG9yeSgpKSBvbkZhaWx1cmUoImRpcmVjdG9yeSAiICsgZGlyZWN0b3J5Lmdl
dFBhdGgoKSArICIgaXMgbm90IGEgZmlsZSBzeXN0ZW0gZGlyZWN0b3J5Iik7CgkJCX0KCQl9CgkJ
Y2F0Y2ggKFRocm93YWJsZSB0KSB7CS8vIG11c3QgaGF2ZSBlcnJvciBoYW5kbGluZywgYmVjYXVz
ZSBzb21lIG9mIHRoZSBjYWxscyBhYm92ZSBjYW4gcmFpc2UgVGhyb3dhYmxlcwoJCQkgb25GYWls
dXJlKCJDYXVnaHQgYSBUaHJvd2FibGUgKHNlZSBjYXVzZSkgd2hpbGUgZXhhbWluaW5nIGRpcmVj
dG9yeSA9ICIgKyAoZGlyZWN0b3J5ICE9IG51bGwgPyBkaXJlY3RvcnkuZ2V0UGF0aCgpIDogIm51
bGwiKSwgdCk7CgkJfQoJCXJldHVybiBkaXJlY3Rvcnk7Cgl9CgkKCS8qKgoJKiBDaGVja3MgdGhh
dCBmaWxlIGlzIGEgdmFsaWQgZmlsZXN5c3RlbSBmaWxlLCB3aGljaCBpcyBkZWZpbmVkIGFzIGl0
IHBhc3NpbmcgYWxsIHRoZXNlIHRlc3RzOgoJKiA8b2w+CgkqICA8bGk+aXMgbm90IG51bGw8L2xp
PgoJKiAgPGxpPmlzIGEgcGF0aCB0aGF0IGV4aXN0czwvbGk+CgkqICA8bGk+Y2FuIGJlIHJlYWQg
YnkgdGhpcyBhcHBsaWNhdGlvbjwvbGk+CgkqICA8bGk+cmVzb2x2ZXMgdG8gYSBub3JtYWwgZmls
ZXN5c3RlbSBmaWxlPC9saT4KCSogPC9vbD4KCSogPHA+CgkqIEByZXR1cm4gZmlsZSwgaWYgaXQg
cGFzc2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyBGaWxlIHZhbGlkRmlsZShGaWxlIGZpbGUpIHsK
CQl0cnkgewoJCQlpZiAoZG9DaGVjaykgewoJCQkJaWYgKCEoZmlsZSAhPSBudWxsKSkgb25GYWls
dXJlKCJmaWxlIGlzIG51bGwiKTsKCQkJCWlmICghZmlsZS5leGlzdHMoKSkgb25GYWlsdXJlKCJm
aWxlICIgKyBmaWxlLmdldFBhdGgoKSArICIgZG9lcyBub3QgZXhpc3QiKTsKCQkJCWlmICghZmls
ZS5jYW5SZWFkKCkpIG9uRmFpbHVyZSgiZmlsZSAiICsgZmlsZS5nZXRQYXRoKCkgKyAiIGNhbm5v
dCBiZSByZWFkIGJ5IHRoaXMgYXBwbGljYXRpb24iKTsKCQkJCWlmICghZmlsZS5pc0ZpbGUoKSkg
b25GYWlsdXJlKCJmaWxlICIgKyBmaWxlLmdldFBhdGgoKSArICIgaXMgbm90IGEgZmlsZXN5c3Rl
bSBmaWxlIik7CgkJCX0KCQl9CgkJY2F0Y2ggKFRocm93YWJsZSB0KSB7CS8vIG11c3QgaGF2ZSBl
cnJvciBoYW5kbGluZywgYmVjYXVzZSBzb21lIG9mIHRoZSBjYWxscyBhYm92ZSBjYW4gcmFpc2Ug
VGhyb3dhYmxlcwoJCQkgb25GYWlsdXJlKCJDYXVnaHQgYSBUaHJvd2FibGUgKHNlZSBjYXVzZSkg
d2hpbGUgZXhhbWluaW5nIGZpbGUgPSAiICsgKGZpbGUgIT0gbnVsbCA/IGZpbGUuZ2V0UGF0aCgp
IDogIm51bGwiKSwgdCk7CgkJfQoJCXJldHVybiBmaWxlOwoJfQoJCgkKCS8vID09PT09PT09PT09
PT09PT09PT09IENIRUNLSU5HIE1FVEhPRFMsIFNFQ1RJT04gNTogU3RyaW5nIG1ldGhvZHMgPT09
PT09PT09PT09PT09PT09PT0KCQoJCgkvKioKCSogQ2hlY2tzIHRoYXQgcyBpcyBub3Qge0BsaW5r
IFN0cmluZ1V0aWwjaXNCbGFuayAiYmxhbmsifS4KCSogPHA+CgkqIEByZXR1cm4gcywgaWYgaXQg
cGFzc2VzIHRoZSBjaGVjawoJKi8KCXB1YmxpYyBTdHJpbmcgbm90QmxhbmsoU3RyaW5nIHN0cmlu
ZykgewoJCWlmIChkb0NoZWNrICYmIFN0cmluZ1V0aWwuaXNCbGFuayhzdHJpbmcpKSBvbkZhaWx1
cmUoInN0cmluZyBpcyBibGFuayIpOwoJCXJldHVybiBzdHJpbmc7CiAgICB9CgkKCQoJLy8gPT09
PT09PT09PT09PT09PT09PT0gQ0hFQ0tJTkcgTUVUSE9EUywgU0VDVElPTiA2OiBUaHJlYWQgbWV0
aG9kcyA9PT09PT09PT09PT09PT09PT09PQoJCgkKCS8qKgoJKiBDaGVja3MgdGhhdCB0aGUgY3Vy
cmVudCB0aHJlYWQgaXMge0BsaW5rIEV2ZW50UXVldWV9J3Mge0BsaW5rIEV2ZW50UXVldWUjaXNE
aXNwYXRjaFRocmVhZCBkaXNwYXRjaCB0aHJlYWR9IChha2EgdGhlICJFRFQiKS4KCSogPHA+Cgkq
IFRoZSByZWFzb24gd2h5IHRoaXMgY2hlY2sgaXMgaW1wb3J0YW50IGlzIGJlY2F1c2UgdHlwaWNh
bCBKYXZhIGd1aSBjb2RlIGlzIG5vdCBtdWx0aXRocmVhZCBzYWZlLgoJKiBNb3N0IEdVSSBjb2Rl
LCBpbmNsdWRpbmcgaW5pdGlhbGl6YXRpb24sIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSBFdmVu
dFF1ZXVlJ3MgZGlzcGF0Y2ggdGhyZWFkLgoJKiBTb21lIHJlZmVyZW5jZXMgdGhhdCBkaXNjdXNz
IHRoaXMgaW5jbHVkZToKCSogPG9sPgoJKiAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5j
b20vZG9jcy9ib29rcy90dXRvcmlhbC91aXN3aW5nL2NvbmN1cnJlbmN5L2luaXRpYWwuaHRtbCI+
TGVzc29uOiBDb25jdXJyZW5jeSBpbiBTd2luZzwvYT48L2xpPgoJKiAgPGxpPjxhIGhyZWY9Imh0
dHA6Ly9qYXZhLnN1bi5jb20vZGV2ZWxvcGVyL0pEQ1RlY2hUaXBzLzIwMDMvdHQxMjA4Lmh0bWwj
MSI+TXVsdGl0aHJlYWRpbmcgSW4gU3dpbmc8L2E+PC9saT4KCSogIDxsaT48YSBocmVmPSJodHRw
Oi8vamF2YS5zdW4uY29tL2RldmVsb3Blci9KRENUZWNoVGlwcy8yMDA0L3R0MDYxMS5odG1sIzEi
Pk1vcmUgTXVsdGl0aHJlYWRpbmcgSW4gU3dpbmc8L2E+PC9saT4KCSogPC9vbD4KCSogU28sIHRo
aXMgbWV0aG9kIHdhcyB3cml0dGVuIGluIG9yZGVyIHRvIHN1cHBvcnQgZWFzeSBlbmZvcmNlbWVu
dCBvZiB0aGF0IHJlcXVpcmVtZW50LgoJKiA8cD4KCSogQHJldHVybiB0aGUgY3VycmVudCB0aHJl
YWQsIGlmIGl0IHBhc3NlcyB0aGUgY2hlY2sKCSovCglwdWJsaWMgVGhyZWFkIGVkdCgpIHsKCQlp
ZiAoZG9DaGVjayAmJiAhRXZlbnRRdWV1ZS5pc0Rpc3BhdGNoVGhyZWFkKCkpIG9uRmFpbHVyZSgi
dGhlIGN1cnJlbnQgdGhyZWFkICgiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS50b1N0cmluZygp
ICsgIikgaXMgbm90IEV2ZW50UXVldWUncyBkaXNwYXRjaCB0aHJlYWQiKTsKCQkKCQlyZXR1cm4g
VGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKICAgIH0KCQoJCgkvLyA9PT09PT09PT09PT09PT09PT09
PSBDSEVDS0lORyBNRVRIT0RTLCBTRUNUSU9OIDc6IG11bHRpcGxlIHZhbHVlIG1ldGhvZHMgPT09
PT09PT09PT09PT09PT09PT0KCQoJCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBlcXVhbCAtLS0t
LS0tLS0tLS0tLS0tLS0tLQoJCgkvKioKCSogQ2hlY2tzIHRoYXQgdmFsdWUxID09IHZhbHVlMi4K
CSogPHA+CgkqIEByZXR1cm4gdmFsdWUxLCBpZiB0aGUgY2hlY2sgaXMgcGFzc2VkCgkqLwoJcHVi
bGljIGJvb2xlYW4gZXF1YWwoYm9vbGVhbiB2YWx1ZTEsIGJvb2xlYW4gdmFsdWUyKSB7CgkJaWYg
KGRvQ2hlY2sgJiYgISh2YWx1ZTEgPT0gdmFsdWUyKSkgb25GYWlsdXJlKHZhbHVlMSArICIgaXMg
bm90IGVxdWFsIHRvICIgKyB2YWx1ZTIpOwoJCXJldHVybiB2YWx1ZTE7Cgl9CgkKCS8qKgoJKiBD
aGVja3MgdGhhdCB2YWx1ZTEgPT0gdmFsdWUyLgoJKiA8cD4KCSogQHJldHVybiB2YWx1ZTEsIGlm
IHRoZSBjaGVjayBpcyBwYXNzZWQKCSovCglwdWJsaWMgYnl0ZSBlcXVhbChieXRlIHZhbHVlMSwg
Ynl0ZSB2YWx1ZTIpIHsKCQlpZiAoZG9DaGVjayAmJiAhKHZhbHVlMSA9PSB2YWx1ZTIpKSBvbkZh
aWx1cmUodmFsdWUxICsgIiBpcyBub3QgZXF1YWwgdG8gIiArIHZhbHVlMik7CgkJcmV0dXJuIHZh
bHVlMTsKCX0KCQoJLyoqCgkqIENoZWNrcyB0aGF0IHZhbHVlMSA9PSB2YWx1ZTIuCgkqIDxwPgoJ
KiBAcmV0dXJuIHZhbHVlMSwgaWYgdGhlIGNoZWNrIGlzIHBhc3NlZAoJKi8KCXB1YmxpYyBzaG9y
dCBlcXVhbChzaG9ydCB2YWx1ZTEsIHNob3J0IHZhbHVlMikgewoJCWlmIChkb0NoZWNrICYmICEo
dmFsdWUxID09IHZhbHVlMikpIG9uRmFpbHVyZSh2YWx1ZTEgKyAiIGlzIG5vdCBlcXVhbCB0byAi
ICsgdmFsdWUyKTsKCQlyZXR1cm4gdmFsdWUxOwoJfQoJCgkvKioKCSogQ2hlY2tzIHRoYXQgdmFs
dWUxID09IHZhbHVlMi4KCSogPHA+CgkqIEByZXR1cm4gdmFsdWUxLCBpZiB0aGUgY2hlY2sgaXMg
cGFzc2VkCgkqLwoJcHVibGljIGNoYXIgZXF1YWwoY2hhciB2YWx1ZTEsIGNoYXIgdmFsdWUyKSB7
CgkJaWYgKGRvQ2hlY2sgJiYgISh2YWx1ZTEgPT0gdmFsdWUyKSkgb25GYWlsdXJlKHZhbHVlMSAr
ICIgaXMgbm90IGVxdWFsIHRvICIgKyB2YWx1ZTIpOwoJCXJldHVybiB2YWx1ZTE7Cgl9CgkKCS8q
KgoJKiBDaGVja3MgdGhhdCB2YWx1ZTEgPT0gdmFsdWUyLgoJKiA8cD4KCSogQHJldHVybiB2YWx1
ZTEsIGlmIHRoZSBjaGVjayBpcyBwYXNzZWQKCSovCglwdWJsaWMgaW50IGVxdWFsKGludCB2YWx1
ZTEsIGludCB2YWx1ZTIpIHsKCQlpZiAoZG9DaGVjayAmJiAhKHZhbHVlMSA9PSB2YWx1ZTIpKSBv
bkZhaWx1cmUodmFsdWUxICsgIiBpcyBub3QgZXF1YWwgdG8gIiArIHZhbHVlMik7CgkJcmV0dXJu
IHZhbHVlMTsKCX0KCQoJLyoqCgkqIENoZWNrcyB0aGF0IHZhbHVlMSA9PSB2YWx1ZTIuCgkqIDxw
PgoJKiBAcmV0dXJuIHZhbHVlMSwgaWYgdGhlIGNoZWNrIGlzIHBhc3NlZAoJKi8KCXB1YmxpYyBs
b25nIGVxdWFsKGxvbmcgdmFsdWUxLCBsb25nIHZhbHVlMikgewoJCWlmIChkb0NoZWNrICYmICEo
dmFsdWUxID09IHZhbHVlMikpIG9uRmFpbHVyZSh2YWx1ZTEgKyAiIGlzIG5vdCBlcXVhbCB0byAi
ICsgdmFsdWUyKTsKCQlyZXR1cm4gdmFsdWUxOwoJfQoJCgkvKioKCSogQ2hlY2tzIHRoYXQgdmFs
dWUxID09IHZhbHVlMi4KCSogPHA+CgkqIEByZXR1cm4gdmFsdWUxLCBpZiB0aGUgY2hlY2sgaXMg
cGFzc2VkCgkqLwoJcHVibGljIGZsb2F0IGVxdWFsKGZsb2F0IHZhbHVlMSwgZmxvYXQgdmFsdWUy
KSB7CgkJaWYgKGRvQ2hlY2sgJiYgISh2YWx1ZTEgPT0gdmFsdWUyKSkgb25GYWlsdXJlKHZhbHVl
MSArICIgaXMgbm90IGVxdWFsIHRvICIgKyB2YWx1ZTIpOwoJCXJldHVybiB2YWx1ZTE7Cgl9CgkK
CS8qKgoJKiBDaGVja3MgdGhhdCB2YWx1ZTEgPT0gdmFsdWUyLgoJKiA8cD4KCSogQHJldHVybiB2
YWx1ZTEsIGlmIHRoZSBjaGVjayBpcyBwYXNzZWQKCSovCglwdWJsaWMgZG91YmxlIGVxdWFsKGRv
dWJsZSB2YWx1ZTEsIGRvdWJsZSB2YWx1ZTIpIHsKCQlpZiAoZG9DaGVjayAmJiAhKHZhbHVlMSA9
PSB2YWx1ZTIpKSBvbkZhaWx1cmUodmFsdWUxICsgIiBpcyBub3QgZXF1YWwgdG8gIiArIHZhbHVl
Mik7CgkJcmV0dXJuIHZhbHVlMTsKCX0KCQoJLyoqCgkqIENoZWNrcyB0aGF0IG9iajEuZXF1YWxz
KG9iajIpLgoJKiBOdWxsIGhhbmRsaW5nOiBwYXNzZXMgY2hlY2sgaWYgb2JqMSA9PSBvYmoyID09
IG51bGwsCgkqIGJ1dCBmYWlscyBpZiBvbmUgaXMgbnVsbCBhbmQgdGhlIG90aGVyIGlzIG5vdC4K
CSogPHA+CgkqIEByZXR1cm4gb2JqMSwgaWYgdGhlIGNoZWNrIGlzIHBhc3NlZAoJKi8KCXB1Ymxp
YyBPYmplY3QgZXF1YWwoT2JqZWN0IG9iajEsIE9iamVjdCBvYmoyKSB7CgkJaWYgKGRvQ2hlY2sp
IHsKCQkJaWYgKG9iajEgPT0gbnVsbCkgewoJCQkJaWYgKG9iajIgIT0gbnVsbCkgb25GYWlsdXJl
KG9iajEgKyAiIGlzIG5vdCBlcXVhbCB0byAiICsgb2JqMik7CgkJCX0KCQkJZWxzZSBpZiAob2Jq
MiA9PSBudWxsKSBvbkZhaWx1cmUob2JqMSArICIgaXMgbm90IGVxdWFsIHRvICIgKyBvYmoyKTsJ
Ly8gaWYgZ2V0IGhlcmUsIHRoZW4ga25vdyB0aGF0IG9iajEgIT0gbnVsbAoJCQllbHNlIGlmICgh
b2JqMS5lcXVhbHMob2JqMikpIG9uRmFpbHVyZShvYmoxICsgIiBpcyBub3QgZXF1YWwgdG8gIiAr
IG9iajIpOwkvLyBpZiBnZXQgaGVyZSwgdGhlbiBrbm93IHRoYXQgYm90aCBvYmoxIGFuZCBvYmoy
ICE9IG51bGwKCQl9CgkJcmV0dXJuIG9iajE7Cgl9CgkKCQoJLy8gLS0tLS0tLS0tLS0tLS0tLS0t
LS0gQ2hlY2tBZGFwdG9yIChzdGF0aWMgaW5uZXIgY2xhc3MpIC0tLS0tLS0tLS0tLS0tLS0tLS0t
CgkKCS8qKgoJKiBBYnN0cmFjdCBzdWJjbGFzcyBvZiB7QGxpbmsgQ2hlY2t9CgkqIHdoaWNoIG1l
cmVseSBpbXBsZW1lbnRzIHtAbGluayBDaGVjayNvbkZhaWx1cmUoU3RyaW5nKX0gdG8gZm9yd2Fy
ZCB0byB7QGxpbmsgQ2hlY2sjb25GYWlsdXJlKFN0cmluZywgVGhyb3dhYmxlKX0uCgkqIFNpbmNl
IHRoaXMgaXMgdGhlIHR5cGljYWwgYmVoYXZpb3IgdGhhdCBzdWJjbGFzc2VzIHdpbGwgY2hvb3Nl
LAoJKiB0aGlzIGFkYXB0b3Igd2lsbCB1c3VhbGx5IGJlIHRoZSBpbW1lZGlhdGUgc3VwZXJjbGFz
cyBpbnN0ZWFkIG9mIENoZWNrIGl0c2VsZi4KCSovCglwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNs
YXNzIENoZWNrQWRhcHRvciBleHRlbmRzIENoZWNrIHsKCQkKCQlwdWJsaWMgQ2hlY2tBZGFwdG9y
KCkgewoJCQl0aGlzKHRydWUpOwoJCX0KCQkKCQlwdWJsaWMgQ2hlY2tBZGFwdG9yKGJvb2xlYW4g
ZG9DaGVjaykgewoJCQlzdXBlcihkb0NoZWNrKTsKCQl9CgkJCgkJLyoqIHtAaW5oZXJpdERvY30g
Ki8KCQlAT3ZlcnJpZGUgcHVibGljIHZvaWQgb25GYWlsdXJlKFN0cmluZyBlcnJNc2cpIHsKCQkJ
b25GYWlsdXJlKGVyck1zZywgbnVsbCk7CgkJfQoJCQoJfQoJCgkvLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLSBBcmcgKHN0YXRpYyBpbm5lciBjbGFzcykgLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQoJLyoq
CgkqIENvbmNyZXRlIHN1YmNsYXNzIG9mIHtAbGluayBDaGVja30gd2hpY2ggaXMgbWVhbnQgZm9y
IGNoZWNraW5nIG1ldGhvZCBhcmd1bWVudHMuCgkqIEhlbmNlLCBpdCBtZXJlbHkgaW1wbGVtZW50
cyB7QGxpbmsgI29uRmFpbHVyZSBvbkZhaWx1cmV9ICh3aGljaCBoZXJlIGFsd2F5cyB0aHJvd3Mg
YW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKQoJKiBhbmQgb3ZlcnJpZGVzIG5vIG90aGVyIG1l
dGhvZHMuCgkqIDxwPgoJKiBUaGlzIGNsYXNzIGlzIG11bHRpdGhyZWFkIHNhZmU6IGl0IGFkZHMg
bm8gc3RhdGUgdG8gaXRzIG11bHRpdGhyZWFkIHNhZmUgc3VwZXJjbGFzcy4KCSovCglwdWJsaWMg
c3RhdGljIGNsYXNzIEFyZyBleHRlbmRzIENoZWNrQWRhcHRvciB7CgkJCgkJLyoqCgkJKiB7QGlu
aGVyaXREb2N9CgkJKiA8cD4KCQkqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdp
dGggZXJyTXNnIGFzIGl0cyBtZXNzYWdlCgkJKi8KCQlAT3ZlcnJpZGUgcHVibGljIHZvaWQgb25G
YWlsdXJlKFN0cmluZyBlcnJNc2csIFRocm93YWJsZSB0aHJvd2FibGUpIHRocm93cyBJbGxlZ2Fs
QXJndW1lbnRFeGNlcHRpb24gewoJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9u
KGVyck1zZywgdGhyb3dhYmxlKTsJLy8gbm90ZTogdGhyb3dhYmxlIGNhbiBzYWZlbHkgYmUgbnVs
bDsgaXQgd2lsbCBiZSBpZ25vcmVkIGluIHRoYXQgY2FzZQoJCX0KCQkKCX0KCQoJLy8gLS0tLS0t
LS0tLS0tLS0tLS0tLS0gU3RhdGUgKHN0YXRpYyBpbm5lciBjbGFzcykgLS0tLS0tLS0tLS0tLS0t
LS0tLS0KCQoJLyoqCgkqIENvbmNyZXRlIHN1YmNsYXNzIG9mIHtAbGluayBDaGVja30gd2hpY2gg
aXMgbWVhbnQgZm9yIGNoZWNraW5nIGFyYml0cmFyeSBzdGF0ZS4KCSogSGVuY2UsIGl0IG1lcmVs
eSBpbXBsZW1lbnRzIHtAbGluayAjb25GYWlsdXJlIG9uRmFpbHVyZX0gKHdoaWNoIGhlcmUgYWx3
YXlzIHRocm93cyBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24pCgkqIGFuZCBvdmVycmlkZXMgbm8g
b3RoZXIgbWV0aG9kcy4KCSogPHA+CgkqIFRoaXMgY2xhc3MgaXMgbXVsdGl0aHJlYWQgc2FmZTog
aXQgYWRkcyBubyBzdGF0ZSB0byBpdHMgbXVsdGl0aHJlYWQgc2FmZSBzdXBlcmNsYXNzLgoJKi8K
CXB1YmxpYyBzdGF0aWMgY2xhc3MgU3RhdGUgZXh0ZW5kcyBDaGVja0FkYXB0b3IgewoJCQoJCS8q
KgoJCSoge0Bpbmhlcml0RG9jfQoJCSogPHA+CgkJKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2Vw
dGlvbiB3aXRoIGVyck1zZyBhcyBpdHMgbWVzc2FnZQoJCSovCgkJQE92ZXJyaWRlIHB1YmxpYyB2
b2lkIG9uRmFpbHVyZShTdHJpbmcgZXJyTXNnLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB0aHJvd3Mg
SWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlv
bihlcnJNc2csIHRocm93YWJsZSk7CS8vIG5vdGU6IHRocm93YWJsZSBjYW4gc2FmZWx5IGJlIG51
bGw7IGl0IHdpbGwgYmUgaWdub3JlZCBpbiB0aGF0IGNhc2UKCQl9CgkJCgl9CgkKCS8vIC0tLS0t
LS0tLS0tLS0tLS0tLS0tIEFzc2VydCAoc3RhdGljIGlubmVyIGNsYXNzKSAtLS0tLS0tLS0tLS0t
LS0tLS0tLQoJCgkvKioKCSogQ29uY3JldGUgc3ViY2xhc3Mgb2Yge0BsaW5rIENoZWNrfSB3aGlj
aCBpcyBtZWFudCBmb3IgY2hlY2tpbmcgYXJiaXRyYXJ5IHN0YXRlLgoJKiBIZW5jZSwgaXQgbWVy
ZWx5IGltcGxlbWVudHMge0BsaW5rICNvbkZhaWx1cmUgb25GYWlsdXJlfSAod2hpY2ggaGVyZSBh
bHdheXMgdGhyb3dzIGFuIEFzc2VydGlvbkVycm9yKQoJKiBhbmQgb3ZlcnJpZGVzIG5vIG90aGVy
IG1ldGhvZHMuCgkqIDxwPgoJKiBUaGUgZXNzZW50aWFsIG5ldyBmZWF0dXJlIGFkZGVkIGJ5IHRo
aXMgY2xhc3MgY29tcGFyZWQgdG8ge0BsaW5rIENoZWNrLlN0YXRlfSBpcyB0aGF0IGl0IG9ubHkg
cGVyZm9ybXMgY2hlY2tzCgkqIGlmIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8x
LjQuMi9kb2NzL2d1aWRlL2xhbmcvYXNzZXJ0Lmh0bWwiPmFzc2VydDwvYT4KCSogaXMgPGEgaHJl
Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4yL2RvY3MvZ3VpZGUvbGFuZy9hc3NlcnQu
aHRtbCNlbmFibGUtZGlzYWJsZSI+ZW5hYmxlZCBmb3IgdGhpcyBjbGFzczwvYT4uCgkqIDxpPkhv
d2V2ZXIsIGlmIGFzc2VydCBpcyBkaXNhYmxlZCBmb3IgdGhpcyBjbGFzcywgdGhlbiBhbGwgb2Yg
dGhlIGNoZWNraW5nIG1ldGhvZHMgZG8gbm90aGluZzwvaT4KCSogKGluZGVlZCwgYSBnb29kIG9w
dGltaXppbmcgY29tcGlsZXIgbGlrZSBob3RzcG90IG1heSBlZmZlY3RpdmVseSBlbGltaW5hdGUg
dGhlbSkuCgkqIDxwPgoJKiA8aT5UaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgaXQg
aXMgbmVjZXNzYXJ5IHRvIGhhdmUgdGhlIG9wdGlvbiBvZiBzdXBwcmVzc2luZyBjaGVja2luZy48
L2k+CgkqIEJlY2F1c2UgY2hlY2tpbmcgbWV0aG9kcyB0eXBpY2FsbHkgaGF2ZSBtaW5pbWFsIHBl
cmZvcm1hbmNlIGltcGFjdCwKCSoge0BsaW5rIENoZWNrLlN0YXRlfSBzaG91bGQgYmUgdXNlZCBp
biBwcmVmZXJlbmNlIHRvIHRoaXMgY2xhc3MKCSogdW5sZXNzIGNoZWNraW5nIGlzIGtub3duIHRv
IGRlZ3JhZGUgcGVyZm9ybWFuY2UgZXhjZXNzaXZlbHkuCgkqIDxwPgoJKiBBbm90aGVyIGlzc3Vl
IGlzIHRoYXQgYXNzZXJ0IGNhbiBub3Qgb25seSBiZSBlbmFibGVkIGdsb2JhbGx5LCBidXQgY2Fu
IGFsc28gYmUgc2VsZWN0aXZlbHkgZW5hYmxlZCBmb3IganVzdCBhIHBhY2thZ2Ugb3IgY2xhc3Mu
CgkqIFNvLCBpZiBhc3NlcnQgaXMgZW5hYmxlZCBmb3IgdGhpcyBjbGFzcywKCSogdGhlbiBhbGwg
b3RoZXIgY2xhc3NlcyB3aGljaCBjYWxsIHRoaXMgY2xhc3Mgd2lsbCBoYXZlIGNoZWNrcyBwZXJm
b3JtZWQKCSogPGk+ZXZlbiBpZiBhc3NlcnQgaXMgZGlzYWJsZWQgZm9yIHRob3NlIGNhbGxpbmcg
Y2xhc3NlczwvaT4uCgkqIENvbnZlcnNlbHksIGlmIGFzc2VydCBpcyBkaXNhYmxlZCBmb3IgdGhp
cyBjbGFzcywKCSogdGhlbiBhbGwgb3RoZXIgY2xhc3NlcyB3aGljaCBjYWxsIHRoaXMgY2xhc3Mg
d2lsbCBoYXZlIG5vIGNoZWNrcyBwZXJmb3JtZWQKCSogPGk+ZXZlbiBpZiBhc3NlcnQgaXMgZW5h
YmxlZCBmb3IgdGhvc2UgY2FsbGluZyBjbGFzc2VzPC9pPi4KCSogPHA+CgkqIFVzZXJzIHNob3Vs
ZCBhbHNvIGtub3cgdGhhdCB0aGUgQXNzZXJ0aW9uRXJyb3IgdGhyb3duIGJ5IHRoaXMgY2xhc3Mn
cyBvbkZhaWx1cmUgbWV0aG9kCgkqIHdpbGwgbm90IGNhdWdodCBieSBhIHN0YW5kYXJkIDxjb2Rl
PmNhdGNoIChFeGNlcHRpb24gZSk8L2NvZGU+IGNsYXVzZS4KCSogVGhlIHVzZXIgbWF5IG5lZWQg
dG8gY2hhbmdlIHRoZWlyIGdlbmVyaWMgY2F0Y2hpbmcgY29kZSB0byA8Y29kZT5jYXRjaCAoVGhy
b3dhYmxlIHQpPC9jb2RlPiBpbnN0ZWFkLgoJKiA8cD4KCSogVGhpcyBjbGFzcyBpcyBtdWx0aXRo
cmVhZCBzYWZlOiBpdCBhZGRzIG5vIHN0YXRlIHRvIGl0cyBtdWx0aXRocmVhZCBzYWZlIHN1cGVy
Y2xhc3MuCgkqLwoJcHVibGljIHN0YXRpYyBjbGFzcyBBc3NlcnQgZXh0ZW5kcyBDaGVja0FkYXB0
b3IgewoJCQoJCXN0YXRpYyBmaW5hbCBib29sZWFuIGFzc2VydEVuYWJsZWQ7CgkJc3RhdGljIHsJ
Ly8gdGhlIGNsZXZlciBsb2dpYyBpbiB0aGlzIG1ldGhvZCB3YXMgYWRhcHRlZCBmcm9tIHRoZSBl
bmQgb2YgdGhpcyB3ZWJwYWdlOiBodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjIvZG9jcy9n
dWlkZS9sYW5nL2Fzc2VydC5odG1sI3VzYWdlCgkJCWJvb2xlYW4gYiA9IGZhbHNlOwoJCQlhc3Nl
cnQgYiA9IHRydWU7IC8vIGludGVudGlvbmFsIHNpZGUgZWZmZWN0OiBiIG9ubHkgZ2V0cyByZWFz
c2lnbmVkIGlmIGFzc2VydCBpcyBlbmFibGVkCgkJCWFzc2VydEVuYWJsZWQgPSBiOwoJCX0KCQkK
CQkvKiogQ29uc3RydWN0b3IuICovCgkJcHVibGljIEFzc2VydCgpIHsKCQkJc3VwZXIoYXNzZXJ0
RW5hYmxlZCk7CgkJfQoJCQoJCS8qKgoJCSoge0Bpbmhlcml0RG9jfQoJCSogPHA+CgkJKiBAdGhy
b3dzIEFzc2VydGlvbkVycm9yIHdpdGggZXJyTXNnIGFzIGl0cyBtZXNzYWdlCgkJKi8KCQlAT3Zl
cnJpZGUgcHVibGljIHZvaWQgb25GYWlsdXJlKFN0cmluZyBlcnJNc2csIFRocm93YWJsZSB0aHJv
d2FibGUpIHRocm93cyBBc3NlcnRpb25FcnJvciB7CgkJCUFzc2VydGlvbkVycm9yIGFlID0gbmV3
IEFzc2VydGlvbkVycm9yKGVyck1zZyk7CS8vIEFzc2VydGlvbkVycm9yIGFubm95aW5nbHkgbGFj
a3MgYSBjb25zdHJ1Y3RvciB3aXRoIGEgVGhyb3dhYmxlIHBhcmFtLCBzbyBoYXZlIHRvIHVzZSBt
dWx0aXBsZSBsaW5lcyBoZXJlLi4uCgkJCWFlLmluaXRDYXVzZSh0aHJvd2FibGUpOwkvLyBub3Rl
OiB0aHJvd2FibGUgY2FuIHNhZmVseSBiZSBudWxsOyBpdCB3aWxsIGJlIGlnbm9yZWQgaW4gdGhh
dCBjYXNlCgkJCXRocm93IGFlOwoJCX0KCQkKCX0KCQoJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0g
VW5pdFRlc3QgKHN0YXRpYyBpbm5lciBjbGFzcykgLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQoJLyoq
IFNlZSB0aGUgT3ZlcnZpZXcgcGFnZSBvZiB0aGUgcHJvamVjdCdzIGphdmFkb2NzIGZvciBhIGdl
bmVyYWwgZGVzY3JpcHRpb24gb2YgdGhpcyB1bml0IHRlc3QgY2xhc3MuICovCglwdWJsaWMgc3Rh
dGljIGNsYXNzIFVuaXRUZXN0IHsKCQkKCQkvL3ByaXZhdGUgZmluYWwgQ2hlY2sgY2hlY2sgPSBh
cmcoKTsKCQlwcml2YXRlIGZpbmFsIENoZWNrIGNoZWNrID0gc3RhdGUoKTsKCQkvL3ByaXZhdGUg
ZmluYWwgQ2hlY2sgY2hlY2sgPSBhenplcnQoKTsKCQkKCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LSB6ZXJvIC0tLS0tLS0tLS0tLS0tLS0tLS0tCgkJCi8vICsrKyBpbiB0aGlzIGFuZCBtYW55IG9m
IHRoZSBvdGhlciBudW1lcmljIHRlc3RzLCBuZWVkIHRlc3RzIGZvciBieXRlLCBzaG9ydCwgZmxv
YXQuLi4KCQkKCQlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0X3plcm9faW50X3Bhc3MoKSB7CgkJCWNo
ZWNrLnplcm8oMCk7CgkJfQoJCQoJCUBUZXN0KGV4cGVjdGVkPVRocm93YWJsZS5jbGFzcykgcHVi
bGljIHZvaWQgdGVzdF96ZXJvX2ludF9mYWlsKCkgdGhyb3dzIFRocm93YWJsZSB7CgkJCWNoZWNr
Lnplcm8oLTEpOwoJCX0KCQkKCQlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0X3plcm9fZG91YmxlX3Bh
c3MoKSB7CgkJCWNoZWNrLnplcm8oMC4wKTsKCQl9CgkJCgkJQFRlc3QoZXhwZWN0ZWQ9VGhyb3dh
YmxlLmNsYXNzKSBwdWJsaWMgdm9pZCB0ZXN0X3plcm9fZG91YmxlX2ZhaWxfMSgpIHRocm93cyBU
aHJvd2FibGUgewoJCQljaGVjay56ZXJvKERvdWJsZS5ORUdBVElWRV9JTkZJTklUWSk7CgkJfQoJ
CQoJCUBUZXN0KGV4cGVjdGVkPVRocm93YWJsZS5jbGFzcykgcHVibGljIHZvaWQgdGVzdF96ZXJv
X2RvdWJsZV9mYWlsXzIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKCQkJY2hlY2suemVybyhEb3VibGUu
TmFOKTsKCQl9CgkJCgkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gbm90WmVybyAtLS0tLS0tLS0t
LS0tLS0tLS0tLQoJCQoJCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3Rfbm90WmVyb19pbnRfcGFzcygp
IHsKCQkJY2hlY2subm90WmVybygtMSk7CgkJCWNoZWNrLm5vdFplcm8oMSk7CgkJCWNoZWNrLm5v
dFplcm8oSW50ZWdlci5NSU5fVkFMVUUpOwoJCQljaGVjay5ub3RaZXJvKEludGVnZXIuTUFYX1ZB
TFVFKTsKCQl9CgkJCgkJQFRlc3QoZXhwZWN0ZWQ9VGhyb3dhYmxlLmNsYXNzKSBwdWJsaWMgdm9p
ZCB0ZXN0X25vdFplcm9faW50X2ZhaWwoKSB0aHJvd3MgVGhyb3dhYmxlIHsKCQkJY2hlY2subm90
WmVybygwKTsKCQl9CgkJCgkJQFRlc3QgcHVibGljIHZvaWQgdGVzdF9ub3RaZXJvX2RvdWJsZV9w
YXNzKCkgewoJCQljaGVjay5ub3RaZXJvKC0xLjApOwoJCQljaGVjay5ub3RaZXJvKDEuMCk7CgkJ
CWNoZWNrLm5vdFplcm8oRG91YmxlLk1JTl9WQUxVRSk7CgkJCWNoZWNrLm5vdFplcm8oRG91Ymxl
Lk1BWF9WQUxVRSk7CgkJCWNoZWNrLm5vdFplcm8oRG91YmxlLk5FR0FUSVZFX0lORklOSVRZKTsK
CQkJY2hlY2subm90WmVybyhEb3VibGUuUE9TSVRJVkVfSU5GSU5JVFkpOwoJCQljaGVjay5ub3Ra
ZXJvKERvdWJsZS5OYU4pOwoJCX0KCQkKCQlAVGVzdChleHBlY3RlZD1UaHJvd2FibGUuY2xhc3Mp
IHB1YmxpYyB2b2lkIHRlc3Rfbm90WmVyb19kb3VibGVfZmFpbCgpIHRocm93cyBUaHJvd2FibGUg
ewoJCQljaGVjay5ub3RaZXJvKDAuMCk7CgkJfQoJCQoJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0t
IG5lZ2F0aXZlIC0tLS0tLS0tLS0tLS0tLS0tLS0tCgkJCgkJQFRlc3QgcHVibGljIHZvaWQgdGVz
dF9uZWdhdGl2ZV9pbnRfcGFzcygpIHsKCQkJY2hlY2submVnYXRpdmUoSW50ZWdlci5NSU5fVkFM
VUUpOwoJCQljaGVjay5uZWdhdGl2ZSgtMSk7CgkJfQoJCQoJCUBUZXN0KGV4cGVjdGVkPVRocm93
YWJsZS5jbGFzcykgcHVibGljIHZvaWQgdGVzdF9uZWdhdGl2ZV9pbnRfZmFpbCgpIHRocm93cyBU
aHJvd2FibGUgewoJCQljaGVjay5uZWdhdGl2ZSgwKTsKCQl9CgkJCgkJQFRlc3QgcHVibGljIHZv
aWQgdGVzdF9uZWdhdGl2ZV9sb25nX3Bhc3MoKSB7CgkJCWNoZWNrLm5lZ2F0aXZlKExvbmcuTUlO
X1ZBTFVFKTsKCQkJY2hlY2submVnYXRpdmUoLTFMKTsKCQl9CgkJCgkJQFRlc3QoZXhwZWN0ZWQ9
VGhyb3dhYmxlLmNsYXNzKSBwdWJsaWMgdm9pZCB0ZXN0X25lZ2F0aXZlX2xvbmdfZmFpbCgpIHRo
cm93cyBUaHJvd2FibGUgewoJCQljaGVjay5uZWdhdGl2ZSgwTCk7CgkJfQoJCQoJCUBUZXN0IHB1
YmxpYyB2b2lkIHRlc3RfbmVnYXRpdmVfZG91YmxlX3Bhc3MoKSB7CgkJCWNoZWNrLm5lZ2F0aXZl
KERvdWJsZS5ORUdBVElWRV9JTkZJTklUWSk7CgkJCWNoZWNrLm5lZ2F0aXZlKC1Eb3VibGUuTUFY
X1ZBTFVFKTsKCQkJY2hlY2submVnYXRpdmUoLURvdWJsZS5NSU5fVkFMVUUpOwoJCX0KCQkKCQlA
VGVzdChleHBlY3RlZD1UaHJvd2FibGUuY2xhc3MpIHB1YmxpYyB2b2lkIHRlc3RfbmVnYXRpdmVf
ZG91YmxlX2ZhaWxfMSgpIHRocm93cyBUaHJvd2FibGUgewoJCQljaGVjay5uZWdhdGl2ZSgwLjAp
OwoJCX0KCQkKCQlAVGVzdChleHBlY3RlZD1UaHJvd2FibGUuY2xhc3MpIHB1YmxpYyB2b2lkIHRl
c3RfbmVnYXRpdmVfZG91YmxlX2ZhaWxfMigpIHRocm93cyBUaHJvd2FibGUgewoJCQljaGVjay5u
ZWdhdGl2ZShEb3VibGUuTmFOKTsKCQl9CgkJCgkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gbm90
TmVnYXRpdmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQkKCQlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0
X25vdE5lZ2F0aXZlX2ludF9wYXNzKCkgewoJCQljaGVjay5ub3ROZWdhdGl2ZSgwKTsKCQkJY2hl
Y2subm90TmVnYXRpdmUoSW50ZWdlci5NQVhfVkFMVUUpOwoJCX0KCQkKCQlAVGVzdChleHBlY3Rl
ZD1UaHJvd2FibGUuY2xhc3MpIHB1YmxpYyB2b2lkIHRlc3Rfbm90TmVnYXRpdmVfaW50X2ZhaWwo
KSB0aHJvd3MgVGhyb3dhYmxlIHsKCQkJY2hlY2subm90TmVnYXRpdmUoLTEpOwoJCX0KCQkKCQlA
VGVzdCBwdWJsaWMgdm9pZCB0ZXN0X25vdE5lZ2F0aXZlX2xvbmdfcGFzcygpIHsKCQkJY2hlY2su
bm90TmVnYXRpdmUoMEwpOwoJCQljaGVjay5ub3ROZWdhdGl2ZShMb25nLk1BWF9WQUxVRSk7CgkJ
fQoJCQoJCUBUZXN0KGV4cGVjdGVkPVRocm93YWJsZS5jbGFzcykgcHVibGljIHZvaWQgdGVzdF9u
b3ROZWdhdGl2ZV9sb25nX2ZhaWwoKSB0aHJvd3MgVGhyb3dhYmxlIHsKCQkJY2hlY2subm90TmVn
YXRpdmUoLTFMKTsKCQl9CgkJCgkJQFRlc3QgcHVibGljIHZvaWQgdGVzdF9ub3ROZWdhdGl2ZV9k
b3VibGVfcGFzcygpIHsKCQkJY2hlY2subm90TmVnYXRpdmUoMC4wKTsKCQkJY2hlY2subm90TmVn
YXRpdmUoRG91YmxlLk1BWF9WQUxVRSk7CgkJCWNoZWNrLm5vdE5lZ2F0aXZlKERvdWJsZS5QT1NJ
VElWRV9JTkZJTklUWSk7CgkJfQoJCQoJCUBUZXN0KGV4cGVjdGVkPVRocm93YWJsZS5jbGFzcykg
cHVibGljIHZvaWQgdGVzdF9ub3ROZWdhdGl2ZV9kb3VibGVfZmFpbF8xKCkgdGhyb3dzIFRocm93
YWJsZSB7CgkJCWNoZWNrLm5vdE5lZ2F0aXZlKC1Eb3VibGUuTUlOX1ZBTFVFKTsKCQl9CgkJCgkJ
QFRlc3QoZXhwZWN0ZWQ9VGhyb3dhYmxlLmNsYXNzKSBwdWJsaWMgdm9pZCB0ZXN0X25vdE5lZ2F0
aXZlX2RvdWJsZV9mYWlsXzIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKCQkJY2hlY2subm90TmVnYXRp
dmUoRG91YmxlLk5hTik7CgkJfQoJCQoJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tIHBvc2l0aXZl
IC0tLS0tLS0tLS0tLS0tLS0tLS0tCgkJCgkJQFRlc3QgcHVibGljIHZvaWQgdGVzdF9wb3NpdGl2
ZV9pbnRfcGFzcygpIHsKCQkJY2hlY2sucG9zaXRpdmUoMSk7CgkJCWNoZWNrLnBvc2l0aXZlKElu
dGVnZXIuTUFYX1ZBTFVFKTsKCQl9CgkJCgkJQFRlc3QoZXhwZWN0ZWQ9VGhyb3dhYmxlLmNsYXNz
KSBwdWJsaWMgdm9pZCB0ZXN0X3Bvc2l0aXZlX2ludF9mYWlsKCkgdGhyb3dzIFRocm93YWJsZSB7
CgkJCWNoZWNrLnBvc2l0aXZlKDApOwoJCX0KCQkKCQlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0X3Bv
c2l0aXZlX2xvbmdfcGFzcygpIHsKCQkJY2hlY2sucG9zaXRpdmUoMUwpOwoJCQljaGVjay5wb3Np
dGl2ZShMb25nLk1BWF9WQUxVRSk7CgkJfQoJCQoJCUBUZXN0KGV4cGVjdGVkPVRocm93YWJsZS5j
bGFzcykgcHVibGljIHZvaWQgdGVzdF9wb3NpdGl2ZV9sb25nX2ZhaWwoKSB0aHJvd3MgVGhyb3dh
YmxlIHsKCQkJY2hlY2sucG9zaXRpdmUoMEwpOwoJCX0KCQkKCQlAVGVzdCBwdWJsaWMgdm9pZCB0
ZXN0X3Bvc2l0aXZlX2RvdWJsZV9wYXNzKCkgewoJCQljaGVjay5wb3NpdGl2ZShEb3VibGUuTUlO
X1ZBTFVFKTsKCQkJY2hlY2sucG9zaXRpdmUoRG91YmxlLk1BWF9WQUxVRSk7CgkJCWNoZWNrLnBv
c2l0aXZlKERvdWJsZS5QT1NJVElWRV9JTkZJTklUWSk7CgkJfQoJCQoJCUBUZXN0KGV4cGVjdGVk
PVRocm93YWJsZS5jbGFzcykgcHVibGljIHZvaWQgdGVzdF9wb3NpdGl2ZV9kb3VibGVfZmFpbF8x
KCkgdGhyb3dzIFRocm93YWJsZSB7CgkJCWNoZWNrLnBvc2l0aXZlKDAuMCk7CgkJfQoJCQoJCUBU
ZXN0KGV4cGVjdGVkPVRocm93YWJsZS5jbGFzcykgcHVibGljIHZvaWQgdGVzdF9wb3NpdGl2ZV9k
b3VibGVfZmFpbF8yKCkgdGhyb3dzIFRocm93YWJsZSB7CgkJCWNoZWNrLnBvc2l0aXZlKERvdWJs
ZS5OYU4pOwoJCX0KCQkKCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBub3RQb3NpdGl2ZSAtLS0t
LS0tLS0tLS0tLS0tLS0tLQoJCQoJCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3Rfbm90UG9zaXRpdmVf
aW50X3Bhc3MoKSB7CgkJCWNoZWNrLm5vdFBvc2l0aXZlKEludGVnZXIuTUlOX1ZBTFVFKTsKCQkJ
Y2hlY2subm90UG9zaXRpdmUoMCk7CgkJfQoJCQoJCUBUZXN0KGV4cGVjdGVkPVRocm93YWJsZS5j
bGFzcykgcHVibGljIHZvaWQgdGVzdF9ub3RQb3NpdGl2ZV9pbnRfZmFpbCgpIHRocm93cyBUaHJv
d2FibGUgewoJCQljaGVjay5ub3RQb3NpdGl2ZSgxKTsKCQl9CgkJCgkJQFRlc3QgcHVibGljIHZv
aWQgdGVzdF9ub3RQb3NpdGl2ZV9sb25nX3Bhc3MoKSB7CgkJCWNoZWNrLm5vdFBvc2l0aXZlKExv
bmcuTUlOX1ZBTFVFKTsKCQkJY2hlY2subm90UG9zaXRpdmUoMEwpOwoJCX0KCQkKCQlAVGVzdChl
eHBlY3RlZD1UaHJvd2FibGUuY2xhc3MpIHB1YmxpYyB2b2lkIHRlc3Rfbm90UG9zaXRpdmVfbG9u
Z19mYWlsKCkgdGhyb3dzIFRocm93YWJsZSB7CgkJCWNoZWNrLm5vdFBvc2l0aXZlKDFMKTsKCQl9
CgkJCgkJQFRlc3QgcHVibGljIHZvaWQgdGVzdF9ub3RQb3NpdGl2ZV9kb3VibGVfcGFzcygpIHsK
CQkJY2hlY2subm90UG9zaXRpdmUoRG91YmxlLk5FR0FUSVZFX0lORklOSVRZKTsKCQkJY2hlY2su
bm90UG9zaXRpdmUoLURvdWJsZS5NSU5fVkFMVUUpOwoJCQljaGVjay5ub3RQb3NpdGl2ZSgwLjAp
OwoJCX0KCQkKCQlAVGVzdChleHBlY3RlZD1UaHJvd2FibGUuY2xhc3MpIHB1YmxpYyB2b2lkIHRl
c3Rfbm90UG9zaXRpdmVfZG91YmxlX2ZhaWxfMSgpIHRocm93cyBUaHJvd2FibGUgewoJCQljaGVj
ay5ub3RQb3NpdGl2ZShEb3VibGUuTUlOX1ZBTFVFKTsKCQl9CgkJCgkJQFRlc3QoZXhwZWN0ZWQ9
VGhyb3dhYmxlLmNsYXNzKSBwdWJsaWMgdm9pZCB0ZXN0X25vdFBvc2l0aXZlX2RvdWJsZV9mYWls
XzIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKCQkJY2hlY2subm90UG9zaXRpdmUoRG91YmxlLk5hTik7
CgkJfQoJCQoJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tIElFRUUgZmxvYXRpbmcgcG9pbnQgc3Bl
Y2lmaWMgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLQoJCQoJCUBUZXN0IHB1YmxpYyB2b2lk
IHRlc3RfbmFOX3Bhc3MoKSB7CgkJCWNoZWNrLm5hTihGbG9hdC5OYU4pOwoJCQljaGVjay5uYU4o
RG91YmxlLk5hTik7CgkJfQoJCQoJCUBUZXN0KGV4cGVjdGVkPVRocm93YWJsZS5jbGFzcykgcHVi
bGljIHZvaWQgdGVzdF9uYU5fZmFpbF9mbG9hdCgpIHRocm93cyBUaHJvd2FibGUgewoJCQljaGVj
ay5uYU4oMC4wZik7CgkJfQoJCQoJCUBUZXN0KGV4cGVjdGVkPVRocm93YWJsZS5jbGFzcykgcHVi
bGljIHZvaWQgdGVzdF9uYU5fZmFpbF9kb3VibGUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKCQkJY2hl
Y2submFOKDAuMCk7CgkJfQoJCQoJCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3Rfbm90TmFOX3Bhc3Mo
KSB7CgkJCWNoZWNrLm5vdE5hTigwLjBmKTsKCQkJY2hlY2subm90TmFOKDAuMCk7CgkJfQoJCQoJ
CUBUZXN0KGV4cGVjdGVkPVRocm93YWJsZS5jbGFzcykgcHVibGljIHZvaWQgdGVzdF9ub3ROYU5f
ZmFpbF9mbG9hdCgpIHRocm93cyBUaHJvd2FibGUgewoJCQljaGVjay5ub3ROYU4oRmxvYXQuTmFO
KTsKCQl9CgkJCgkJQFRlc3QoZXhwZWN0ZWQ9VGhyb3dhYmxlLmNsYXNzKSBwdWJsaWMgdm9pZCB0
ZXN0X25vdE5hTl9mYWlsX2RvdWJsZSgpIHRocm93cyBUaHJvd2FibGUgewoJCQljaGVjay5ub3RO
YU4oRG91YmxlLk5hTik7CgkJfQoJCQoJCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RfaW5maW5pdGVf
cGFzcygpIHsKCQkJY2hlY2suaW5maW5pdGUoRmxvYXQuTkVHQVRJVkVfSU5GSU5JVFkpOwoJCQlj
aGVjay5pbmZpbml0ZShGbG9hdC5QT1NJVElWRV9JTkZJTklUWSk7CgkJCWNoZWNrLmluZmluaXRl
KERvdWJsZS5ORUdBVElWRV9JTkZJTklUWSk7CgkJCWNoZWNrLmluZmluaXRlKERvdWJsZS5QT1NJ
VElWRV9JTkZJTklUWSk7CgkJfQoJCQoJCUBUZXN0KGV4cGVjdGVkPVRocm93YWJsZS5jbGFzcykg
cHVibGljIHZvaWQgdGVzdF9pbmZpbml0ZV9mYWlsX2Zsb2F0KCkgdGhyb3dzIFRocm93YWJsZSB7
CgkJCWNoZWNrLmluZmluaXRlKEZsb2F0Lk1BWF9WQUxVRSk7CgkJfQoJCQoJCUBUZXN0KGV4cGVj
dGVkPVRocm93YWJsZS5jbGFzcykgcHVibGljIHZvaWQgdGVzdF9pbmZpbml0ZV9mYWlsX2RvdWJs
ZSgpIHRocm93cyBUaHJvd2FibGUgewoJCQljaGVjay5pbmZpbml0ZShEb3VibGUuTUFYX1ZBTFVF
KTsKCQl9CgkJCgkJQFRlc3QgcHVibGljIHZvaWQgdGVzdF9ub3RJbmZpbml0ZV9wYXNzKCkgewoJ
CQljaGVjay5ub3RJbmZpbml0ZShGbG9hdC5NQVhfVkFMVUUpOwoJCQljaGVjay5ub3RJbmZpbml0
ZShEb3VibGUuTUFYX1ZBTFVFKTsKCQl9CgkJCgkJQFRlc3QoZXhwZWN0ZWQ9VGhyb3dhYmxlLmNs
YXNzKSBwdWJsaWMgdm9pZCB0ZXN0X25vdEluZmluaXRlX2ZhaWxfZmxvYXQxKCkgdGhyb3dzIFRo
cm93YWJsZSB7CgkJCWNoZWNrLm5vdEluZmluaXRlKEZsb2F0Lk5FR0FUSVZFX0lORklOSVRZKTsK
CQl9CgkJCgkJQFRlc3QoZXhwZWN0ZWQ9VGhyb3dhYmxlLmNsYXNzKSBwdWJsaWMgdm9pZCB0ZXN0
X25vdEluZmluaXRlX2ZhaWxfZmxvYXQyKCkgdGhyb3dzIFRocm93YWJsZSB7CgkJCWNoZWNrLm5v
dEluZmluaXRlKEZsb2F0LlBPU0lUSVZFX0lORklOSVRZKTsKCQl9CgkJCgkJQFRlc3QoZXhwZWN0
ZWQ9VGhyb3dhYmxlLmNsYXNzKSBwdWJsaWMgdm9pZCB0ZXN0X25vdEluZmluaXRlX2ZhaWxfZG91
YmxlMSgpIHRocm93cyBUaHJvd2FibGUgewoJCQljaGVjay5ub3RJbmZpbml0ZShEb3VibGUuTkVH
QVRJVkVfSU5GSU5JVFkpOwoJCX0KCQkKCQlAVGVzdChleHBlY3RlZD1UaHJvd2FibGUuY2xhc3Mp
IHB1YmxpYyB2b2lkIHRlc3Rfbm90SW5maW5pdGVfZmFpbF9kb3VibGUyKCkgdGhyb3dzIFRocm93
YWJsZSB7CgkJCWNoZWNrLm5vdEluZmluaXRlKERvdWJsZS5QT1NJVElWRV9JTkZJTklUWSk7CgkJ
fQoJCQoJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tIGNvbnZlbmllbmNlIGNvbXBvdW5kIG1ldGhv
ZHMgKGNvbWJpbmUgbXVsdGlwbGUgbWV0aG9kcyBhYm92ZSkgLS0tLS0tLS0tLS0tLS0tLS0tLS0K
CQkKCQkvLyB0aGVzZSBuZWVkIG5vdCBiZSB0ZXN0ZWQsIHNpbmNlIHRoZSBjb21wb25lbnQgbWV0
aG9kcyB0aGV5IGNhbGwgYXJlIGFscmVhZHkgdGVzdGVkCgkJCgkJLy8gLS0tLS0tLS0tLS0tLS0t
LS0tLS0gdmFsaWRQb3J0IC0tLS0tLS0tLS0tLS0tLS0tLS0tCgkJCgkJQFRlc3QgcHVibGljIHZv
aWQgdGVzdF92YWxpZFBvcnRfcGFzcygpIHsKCQkJY2hlY2sudmFsaWRQb3J0KDApOwoJCQljaGVj
ay52YWxpZFBvcnQoTnVtYmVyVXRpbC51bnNpZ25lZDJCeXRlTWF4VmFsdWUpOwoJCX0KCQkKCQlA
VGVzdChleHBlY3RlZD1UaHJvd2FibGUuY2xhc3MpIHB1YmxpYyB2b2lkIHRlc3RfdmFsaWRQb3J0
X2ZhaWxfMSgpIHRocm93cyBUaHJvd2FibGUgewoJCQljaGVjay52YWxpZFBvcnQoMCAtIDEpOwoJ
CX0KCQkKCQlAVGVzdChleHBlY3RlZD1UaHJvd2FibGUuY2xhc3MpIHB1YmxpYyB2b2lkIHRlc3Rf
dmFsaWRQb3J0X2ZhaWxfMigpIHRocm93cyBUaHJvd2FibGUgewoJCQljaGVjay52YWxpZFBvcnQo
TnVtYmVyVXRpbC51bnNpZ25lZDJCeXRlTWF4VmFsdWUgKyAxKTsKCQl9CgkJCgkJLy8gLS0tLS0t
LS0tLS0tLS0tLS0tLS0gbnVsbCBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tCgkJCgkJQFRl
c3QgcHVibGljIHZvaWQgdGVzdF9pc051bGxfcGFzcygpIHsKCQkJY2hlY2suaXNOdWxsKG51bGwp
OwoJCX0KCQkKCQlAVGVzdChleHBlY3RlZD1UaHJvd2FibGUuY2xhc3MpIHB1YmxpYyB2b2lkIHRl
c3RfaXNOdWxsX2ZhaWwoKSB0aHJvd3MgVGhyb3dhYmxlIHsKCQkJY2hlY2suaXNOdWxsKG5ldyBP
YmplY3QoKSk7CgkJfQoJCQoJCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3Rfbm90TnVsbF9wYXNzKCkg
ewoJCQljaGVjay5ub3ROdWxsKG5ldyBPYmplY3QoKSk7CgkJfQoJCQoJCUBUZXN0KGV4cGVjdGVk
PVRocm93YWJsZS5jbGFzcykgcHVibGljIHZvaWQgdGVzdF9ub3ROdWxsX2ZhaWwoKSB0aHJvd3Mg
VGhyb3dhYmxlIHsKCQkJY2hlY2subm90TnVsbChudWxsKTsKCQl9CgoJCS8vIC0tLS0tLS0tLS0t
LS0tLS0tLS0tIGFycmF5L0NvbGxlY3Rpb24gbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLQoJ
CQoJCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RfZW1wdHlfcGFzcygpIHsKCQkJY2hlY2suZW1wdHko
IG51bGwgKTsKCQkJY2hlY2suZW1wdHkoIG5ldyBTdHJpbmdbMF0gKTsKCQl9CgkJCgkJQFRlc3Qo
ZXhwZWN0ZWQ9VGhyb3dhYmxlLmNsYXNzKSBwdWJsaWMgdm9pZCB0ZXN0X2VtcHR5X2ZhaWwoKSB7
CgkJCWNoZWNrLmVtcHR5KCBuZXcgU3RyaW5nW10geyJhIn0gKTsKCQl9CgkJCQkKCQlAVGVzdCBw
dWJsaWMgdm9pZCB0ZXN0X25vdEVtcHR5X3Bhc3MoKSB7CgkJCWNoZWNrLm5vdEVtcHR5KCBuZXcg
aW50W10gezF9ICk7CgkJCWNoZWNrLm5vdEVtcHR5KCBuZXcgU3RyaW5nW10geyJhIiwgImIifSAp
OwoJCQkKCQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKCQkJ
bGlzdC5hZGRBbGwoIEFycmF5cy5hc0xpc3QoImMiLCAiZCIpICk7CgkJCWNoZWNrLm5vdEVtcHR5
KGxpc3QpOwoJCQkKCQkJTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJp
bmcsIFN0cmluZz4oKTsKCQkJbWFwLnB1dCgiZSIsICJmIik7CgkJCWNoZWNrLm5vdEVtcHR5KG1h
cCk7CgkJfQoJCQoJCUBUZXN0KGV4cGVjdGVkPVRocm93YWJsZS5jbGFzcykgcHVibGljIHZvaWQg
dGVzdF9ub3RFbXB0eV9mYWlsXzEoKSB7CgkJCWNoZWNrLm5vdEVtcHR5KCBuZXcgaW50WzBdICk7
CgkJfQoJCQoJCUBUZXN0KGV4cGVjdGVkPVRocm93YWJsZS5jbGFzcykgcHVibGljIHZvaWQgdGVz
dF9ub3RFbXB0eV9mYWlsXzIoKSB7CgkJCWNoZWNrLm5vdEVtcHR5KCAoT2JqZWN0W10pIG51bGwg
KTsKCQl9CgkJCgkJQFRlc3QoZXhwZWN0ZWQ9VGhyb3dhYmxlLmNsYXNzKSBwdWJsaWMgdm9pZCB0
ZXN0X25vdEVtcHR5X2ZhaWxfMygpIHsKCQkJY2hlY2subm90RW1wdHkoIG5ldyBBcnJheUxpc3Q8
U3RyaW5nPigpICk7CgkJfQoJCQoJCUBUZXN0KGV4cGVjdGVkPVRocm93YWJsZS5jbGFzcykgcHVi
bGljIHZvaWQgdGVzdF9ub3RFbXB0eV9mYWlsXzQoKSB7CgkJCWNoZWNrLm5vdEVtcHR5KCBuZXcg
SGFzaE1hcDxPYmplY3QsT2JqZWN0PigpICk7CgkJfQoJCQoJCUBUZXN0IHB1YmxpYyB2b2lkIHRl
c3RfaGFzU2l6ZV9wYXNzKCkgewoJCQljaGVjay5oYXNTaXplKCBuZXcgaW50W10gezF9LCAxICk7
CgkJCWNoZWNrLmhhc1NpemUoIG5ldyBTdHJpbmdbXSB7ImEiLCAiYiJ9LCAyICk7CgkJCQoJCQlM
aXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwoJCQlsaXN0LmFkZEFs
bCggQXJyYXlzLmFzTGlzdCgiYyIsICJkIikgKTsKCQkJY2hlY2suaGFzU2l6ZShsaXN0LCAyKTsK
CQkJCgkJCU1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJp
bmc+KCk7CgkJCW1hcC5wdXQoImUiLCAiZiIpOwoJCQljaGVjay5oYXNTaXplKG1hcCwgMSk7CgkJ
fQoJCQoJCUBUZXN0KGV4cGVjdGVkPVRocm93YWJsZS5jbGFzcykgcHVibGljIHZvaWQgdGVzdF9o
YXNTaXplX2ZhaWxfMSgpIHsKCQkJY2hlY2suaGFzU2l6ZSggbmV3IGludFswXSwgMSApOwoJCX0K
CQkKCQlAVGVzdChleHBlY3RlZD1UaHJvd2FibGUuY2xhc3MpIHB1YmxpYyB2b2lkIHRlc3RfaGFz
U2l6ZV9mYWlsXzIoKSB7CgkJCWNoZWNrLmhhc1NpemUoIChPYmplY3RbXSkgbnVsbCwgMiApOwoJ
CX0KCQkKCQlAVGVzdChleHBlY3RlZD1UaHJvd2FibGUuY2xhc3MpIHB1YmxpYyB2b2lkIHRlc3Rf
aGFzU2l6ZV9mYWlsXzMoKSB7CgkJCWNoZWNrLmhhc1NpemUoIG5ldyBBcnJheUxpc3Q8U3RyaW5n
PigpLCAzICk7CgkJfQoJCQoJCUBUZXN0KGV4cGVjdGVkPVRocm93YWJsZS5jbGFzcykgcHVibGlj
IHZvaWQgdGVzdF9oYXNTaXplX2ZhaWxfNCgpIHsKCQkJY2hlY2suaGFzU2l6ZSggbmV3IEhhc2hN
YXA8T2JqZWN0LE9iamVjdD4oKSwgNCApOwoJCX0KCQkKCQlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0
X3VubW9kaWZpYWJsZV9wYXNzKCkgewoJCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxp
c3Q8U3RyaW5nPigpOwoJCQlsaXN0LmFkZEFsbCggQXJyYXlzLmFzTGlzdCgiYyIsICJkIikgKTsK
CQkJY2hlY2sudW5tb2RpZmlhYmxlKCBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9u
KGxpc3QpICk7CgkJCQoJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IG5ldyBIYXNoTWFwPFN0
cmluZywgU3RyaW5nPigpOwoJCQltYXAucHV0KCJlIiwgImYiKTsKCQkJY2hlY2sudW5tb2RpZmlh
YmxlKCBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAobWFwKSApOwoJCX0KCQkKCQlAVGVzdChl
eHBlY3RlZD1UaHJvd2FibGUuY2xhc3MpIHB1YmxpYyB2b2lkIHRlc3RfdW5tb2RpZmlhYmxlX2Zh
aWxfMSgpIHsKCQkJY2hlY2sudW5tb2RpZmlhYmxlKCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSAp
OwoJCX0KCQkKCQlAVGVzdChleHBlY3RlZD1UaHJvd2FibGUuY2xhc3MpIHB1YmxpYyB2b2lkIHRl
c3RfdW5tb2RpZmlhYmxlX2ZhaWxfMigpIHsKCQkJY2hlY2sudW5tb2RpZmlhYmxlKCBuZXcgSGFz
aE1hcDxTdHJpbmcsIFN0cmluZz4oKSApOwoJCX0KCQkKCQlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0
X29mZnNldEFuZExlbmd0aF9wYXNzKCkgewoJCQljaGVjay52YWxpZE9mZnNldExlbmd0aCgxLCAy
LCAzKTsKCQl9CgkJCgkJQFRlc3QoZXhwZWN0ZWQ9VGhyb3dhYmxlLmNsYXNzKSBwdWJsaWMgdm9p
ZCB0ZXN0X29mZnNldEFuZExlbmd0aF9mYWlsKCkgdGhyb3dzIFRocm93YWJsZSB7CgkJCWNoZWNr
LnZhbGlkT2Zmc2V0TGVuZ3RoKDEsIDIsIDEpOwoJCX0KCgkJLy8gLS0tLS0tLS0tLS0tLS0tLS0t
LS0gRmlsZSBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tCgkJCgkJQFRlc3QgcHVibGljIHZv
aWQgdGVzdF92YWxpZERpcmVjdG9yeV9wYXNzKCkgewoJCQljaGVjay52YWxpZERpcmVjdG9yeShu
ZXcgRmlsZSgiLi8iKSk7CgkJfQoJCQoJCUBUZXN0KGV4cGVjdGVkPVRocm93YWJsZS5jbGFzcykg
cHVibGljIHZvaWQgdGVzdF92YWxpZERpcmVjdG9yeV9mYWlsKCkgdGhyb3dzIFRocm93YWJsZSB7
CgkJCWNoZWNrLnZhbGlkRGlyZWN0b3J5KG5ldyBGaWxlKCIuL3Zpbmtsc2R2aW93ZXVmYnNkY3F3
dXkvIikpOwoJCX0KCQkKCQlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0X3ZhbGlkRmlsZV9wYXNzKCkg
ewoJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSgiLi92bXdzZHZmbWxmdWZlcmZ3ZS50eHQiKTsKCQkJ
aWYgKGZpbGUuZXhpc3RzKCkpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImZpbGUg
PSAiICsgZmlsZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgZXhpc3RzIik7CgkJCWZpbGUgPSBGaWxl
VXRpbC5jcmVhdGVUZW1wKGZpbGUpOwoJCQljaGVjay52YWxpZEZpbGUoZmlsZSk7CgkJfQoJCQoJ
CUBUZXN0KGV4cGVjdGVkPVRocm93YWJsZS5jbGFzcykgcHVibGljIHZvaWQgdGVzdF92YWxpZEZp
bGVfZmFpbCgpIHRocm93cyBUaHJvd2FibGUgewoJCQljaGVjay52YWxpZEZpbGUobmV3IEZpbGUo
Ii4vdmlua2xzZHZpb3dldWZic2RjcXd1eS5hYmMiKSk7CgkJfQoJCQoJCS8vIC0tLS0tLS0tLS0t
LS0tLS0tLS0tIFN0cmluZyBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tCgkJCgkJQFRlc3Qg
cHVibGljIHZvaWQgdGVzdF9ub25CbGFua19wYXNzKCkgewoJCQljaGVjay5ub3RCbGFuaygic2Rq
a3Nka2ZzZGtsdmYiKTsKCQl9CgkJCgkJQFRlc3QoZXhwZWN0ZWQ9VGhyb3dhYmxlLmNsYXNzKSBw
dWJsaWMgdm9pZCB0ZXN0X25vdEJsYW5rX2ZhaWxfMSgpIHRocm93cyBUaHJvd2FibGUgewoJCQlj
aGVjay5ub3RCbGFuayhudWxsKTsKCQl9CgkJCgkJQFRlc3QoZXhwZWN0ZWQ9VGhyb3dhYmxlLmNs
YXNzKSBwdWJsaWMgdm9pZCB0ZXN0X25vdEJsYW5rX2ZhaWxfMigpIHRocm93cyBUaHJvd2FibGUg
ewoJCQljaGVjay5ub3RCbGFuaygiIik7CgkJfQoJCQoJCUBUZXN0KGV4cGVjdGVkPVRocm93YWJs
ZS5jbGFzcykgcHVibGljIHZvaWQgdGVzdF9ub3RCbGFua19mYWlsXzMoKSB0aHJvd3MgVGhyb3dh
YmxlIHsKCQkJY2hlY2subm90QmxhbmsoIiAgICIpOwoJCX0KCQkKCQkvLyAtLS0tLS0tLS0tLS0t
LS0tLS0tLSBUaHJlYWQgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLQoJCQoJCUBUZXN0IHB1
YmxpYyB2b2lkIHRlc3RfZWR0X3Bhc3MoKSB0aHJvd3MgVGhyb3dhYmxlIHsKCQkJUnVubmFibGUg
dGFzayA9IG5ldyBSdW5uYWJsZSgpIHsgcHVibGljIHZvaWQgcnVuKCkgewoJCQkJY2hlY2suZWR0
KCk7CgkJCX0gfTsKCQkJU3dpbmdVdGlsLmludm9rZSh0YXNrLCB0cnVlKTsKCQl9CgkJCgkJQFRl
c3QoZXhwZWN0ZWQ9VGhyb3dhYmxlLmNsYXNzKSBwdWJsaWMgdm9pZCB0ZXN0X2VkdF9mYWlsKCkg
dGhyb3dzIFRocm93YWJsZSB7CgkJCWNoZWNrLmVkdCgpOwoJCX0KCQkKCQkvKioKCQkqIFJlc3Vs
dHMgb24gMjAwOS0wNS0wNyAoMi41IEdIeiBYZW9uIEU1NDIwIGRlc2t0b3AsIGpkayAxLjYuMF8x
MSBzZXJ2ZXIganZtKToKCQkqIDxwcmU+PGNvZGU+CgkJCUV2ZW50UXVldWUuaXNEaXNwYXRjaFRo
cmVhZDogZmlyc3QgPSA5NS44MDEgbnMsIG1lYW4gPSA4MC42MjggbnMgKENJIGRlbHRhczogLTEy
LjA5NiBwcywgKzEyLjY1NyBwcyksIHNkID0gMjAxLjA1MiBucyAoQ0kgZGVsdGFzOiAtMjguNzY2
IG5zLCArMzQuNzc4IG5zKSBXQVJOSU5HOiBleGVjdXRpb24gdGltZXMgbWF5IGhhdmUgc2VyaWFs
IGNvcnJlbGF0aW9uLCBTRCBWQUxVRVMgTUFZIEJFIElOQUNDVVJBVEUKCQkqIDwvY29kZT48L3By
ZT4KCQkqLwoJCUBUZXN0IHB1YmxpYyB2b2lkIGJlbmNobWFya19lZHQoKSB0aHJvd3MgRXhjZXB0
aW9uIHsKCQkJUnVubmFibGUgdGFza0ZvckVkdCA9IG5ldyBSdW5uYWJsZSgpIHsgcHVibGljIHZv
aWQgcnVuKCkgewkvLyBuZWVkIGFuIG91dGVyIHRhc2sgdGhhdCBzdWJtaXQgdG8gRXZlbnRRdWV1
ZSdzIGRpc3BhdGNoIHRocmVhZCBiZWNhdXNlIG90aGVyd2lzZSB0aGUgY2hlY2suZWR0IGNhbGwg
YmVsb3cgY3Jhc2hlcwoJCQkJZmluYWwgaW50IG4gPSAxMDI0ICogMTAyNDsKCQkJCVJ1bm5hYmxl
IHRhc2tUb0JlbmNoID0gbmV3IFJ1bm5hYmxlKCkgewoJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsK
CQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKCQkJCQkJCWNoZWNrLmVkdCgpOwoJ
CQkJCQl9CgkJCQkJfQkJCgkJCQl9OwoJCQkJU3lzdGVtLm91dC5wcmludGxuKCJFdmVudFF1ZXVl
LmlzRGlzcGF0Y2hUaHJlYWQ6ICIgKyBuZXcgQmVuY2htYXJrKHRhc2tUb0JlbmNoLCBuKSk7CgkJ
CX0gfTsKCQkJU3dpbmdVdGlsLmludm9rZSh0YXNrRm9yRWR0LCB0cnVlKTsKCQl9CgkJCgkJLy8g
LS0tLS0tLS0tLS0tLS0tLS0tLS0gZXF1YWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQkKCQlAVGVz
dCBwdWJsaWMgdm9pZCB0ZXN0X2VxdWFsX3Bhc3MoKSB7CgkJCWNoZWNrLmVxdWFsKHRydWUsIHRy
dWUpOwoJCQljaGVjay5lcXVhbChmYWxzZSwgZmFsc2UpOwoJCQljaGVjay5lcXVhbCggKGJ5dGUp
IDAsIChieXRlKSAwICk7CgkJCWNoZWNrLmVxdWFsKCAoc2hvcnQpIDEsIChzaG9ydCkgMSApOwoJ
CQljaGVjay5lcXVhbCggJzInLCAnMicgKTsKCQkJY2hlY2suZXF1YWwoMywgMyk7CgkJCWNoZWNr
LmVxdWFsKDRMLCA0TCk7CgkJCWNoZWNrLmVxdWFsKDUuMGYsIDUuMGYpOwoJCQljaGVjay5lcXVh
bCg2LjAsIDYuMCk7CgkJCWNoZWNrLmVxdWFsKCJhIiwgImEiKTsKCQkJY2hlY2suZXF1YWwobnVs
bCwgbnVsbCk7CgkJfQoJCQoJCUBUZXN0KGV4cGVjdGVkPVRocm93YWJsZS5jbGFzcykgcHVibGlj
IHZvaWQgdGVzdF9lcXVhbF9mYWlsXzEoKSB0aHJvd3MgVGhyb3dhYmxlIHsKCQkJY2hlY2suZXF1
YWwodHJ1ZSwgZmFsc2UpOwoJCX0KCQkKCQlAVGVzdChleHBlY3RlZD1UaHJvd2FibGUuY2xhc3Mp
IHB1YmxpYyB2b2lkIHRlc3RfZXF1YWxfZmFpbF8yKCkgdGhyb3dzIFRocm93YWJsZSB7CgkJCWNo
ZWNrLmVxdWFsKGZhbHNlLCB0cnVlKTsKCQl9CgkJCgkJQFRlc3QoZXhwZWN0ZWQ9VGhyb3dhYmxl
LmNsYXNzKSBwdWJsaWMgdm9pZCB0ZXN0X2VxdWFsX2ZhaWxfMygpIHRocm93cyBUaHJvd2FibGUg
ewoJCQljaGVjay5lcXVhbCggKGJ5dGUpIDAsIChieXRlKSAxICk7CgkJfQoJCQoJCUBUZXN0KGV4
cGVjdGVkPVRocm93YWJsZS5jbGFzcykgcHVibGljIHZvaWQgdGVzdF9lcXVhbF9mYWlsXzQoKSB0
aHJvd3MgVGhyb3dhYmxlIHsKCQkJY2hlY2suZXF1YWwoIChzaG9ydCkgMSwgKHNob3J0KSAyICk7
CgkJfQoJCQoJCUBUZXN0KGV4cGVjdGVkPVRocm93YWJsZS5jbGFzcykgcHVibGljIHZvaWQgdGVz
dF9lcXVhbF9mYWlsXzUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKCQkJY2hlY2suZXF1YWwoICcyJywg
JzMnICk7CgkJfQoJCQoJCUBUZXN0KGV4cGVjdGVkPVRocm93YWJsZS5jbGFzcykgcHVibGljIHZv
aWQgdGVzdF9lcXVhbF9mYWlsXzYoKSB0aHJvd3MgVGhyb3dhYmxlIHsKCQkJY2hlY2suZXF1YWwo
MywgNCk7CgkJfQoJCQoJCUBUZXN0KGV4cGVjdGVkPVRocm93YWJsZS5jbGFzcykgcHVibGljIHZv
aWQgdGVzdF9lcXVhbF9mYWlsXzcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKCQkJY2hlY2suZXF1YWwo
NEwsIDVMKTsKCQl9CgkJCgkJQFRlc3QoZXhwZWN0ZWQ9VGhyb3dhYmxlLmNsYXNzKSBwdWJsaWMg
dm9pZCB0ZXN0X2VxdWFsX2ZhaWxfOCgpIHRocm93cyBUaHJvd2FibGUgewoJCQljaGVjay5lcXVh
bCg1LjBmLCA2LjBmKTsKCQl9CgkJCgkJQFRlc3QoZXhwZWN0ZWQ9VGhyb3dhYmxlLmNsYXNzKSBw
dWJsaWMgdm9pZCB0ZXN0X2VxdWFsX2ZhaWxfOSgpIHRocm93cyBUaHJvd2FibGUgewoJCQljaGVj
ay5lcXVhbCg2LjAsIDcuMCk7CgkJfQoJCQoJCUBUZXN0KGV4cGVjdGVkPVRocm93YWJsZS5jbGFz
cykgcHVibGljIHZvaWQgdGVzdF9lcXVhbF9mYWlsXzEwKCkgdGhyb3dzIFRocm93YWJsZSB7CgkJ
CWNoZWNrLmVxdWFsKCJhIiwgImIiKTsKCQl9CgkJCgkJQFRlc3QoZXhwZWN0ZWQ9VGhyb3dhYmxl
LmNsYXNzKSBwdWJsaWMgdm9pZCB0ZXN0X2VxdWFsX2ZhaWxfMTEoKSB0aHJvd3MgVGhyb3dhYmxl
IHsKCQkJY2hlY2suZXF1YWwoImEiLCBudWxsKTsKCQl9CgkJCgkJQFRlc3QoZXhwZWN0ZWQ9VGhy
b3dhYmxlLmNsYXNzKSBwdWJsaWMgdm9pZCB0ZXN0X2VxdWFsX2ZhaWxfMTIoKSB0aHJvd3MgVGhy
b3dhYmxlIHsKCQkJY2hlY2suZXF1YWwobnVsbCwgImIiKTsKCQl9CgkJCgl9CgkKfQo=
--0016e645b71c1d946f046d6f5fef--



More information about the checkers mailing list