<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://jogamp.org/bugzilla/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.2"
          urlbase="https://jogamp.org/bugzilla/"
          
          maintainer="sgothel@jausoft.com"
>

    <bug>
          <bug_id>339</bug_id>
          
          <creation_ts>2008-01-23 10:21:21 +0100</creation_ts>
          <short_desc>Add system properties to turn off VAs/VBOs in TextRenderer</short_desc>
          <delta_ts>2015-09-27 03:14:51 +0200</delta_ts>
          <reporter_accessible>0</reporter_accessible>
          <cclist_accessible>0</cclist_accessible>
          <classification_id>3</classification_id>
          <classification>JogAmp</classification>
          <product>Jogl</product>
          <component>core</component>
          <version>1</version>
          <rep_platform>All</rep_platform>
          <op_sys>all</op_sys>
          <bug_status>VERIFIED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc>http://www.javagaming.org/forums/index.php?topic=18080.0</bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P3</priority>
          <bug_severity>normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Sven Gothel">sgothel</reporter>
          <assigned_to name="Sven Gothel">sgothel</assigned_to>
          
          
          <cf_type>FEATURE</cf_type>
          <cf_scm_refs></cf_scm_refs>
          <cf_workaround>---</cf_workaround>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>355</commentid>
    <comment_count>0</comment_count>
    <who name="Sven Gothel">sgothel</who>
    <bug_when>2010-03-24 07:51:08 +0100</bug_when>
    <thetext>


---- Reported by kbr 2008-01-23 10:21:22 ----

User emzic suggests on http://www.javagaming.org/forums/index.php?topic=18080.0
that there should be a way of disabling the use of vertex arrays and vertex
buffer objects in the TextRenderer to work around driver bugs or performance
problems.



---- Additional Comments From kbr 2008-01-30 14:12:11 ----

Created an attachment
Proposed new TextRenderer from emzic




---- Additional Comments From kbr 2008-02-15 23:47:53 ----

Incorporated patch from emzic, slightly modified, to add
set/getUseVertexArrays() as concession to graphics cards which do not
perform well with small vertex arrays.




--- Bug imported by sgothel@jausoft.com 2010-03-24 07:51 EDT  ---

This bug was previously known as _bug_ 339 at https://jogl.dev.java.net/bugs/show_bug.cgi?id=339
Imported an attachment (id=115)

The original submitter of attachment 115 is unknown.
   Reassigning to the person who moved it here: sgothel@jausoft.com.

</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>115</attachid>
            <date>2008-01-30 14:12:00 +0100</date>
            <delta_ts>2008-01-30 14:12:00 +0100</delta_ts>
            <desc>Proposed new TextRenderer from emzic</desc>
            <filename>TextRenderer.java</filename>
            <type>text/plain</type>
            <size>79927</size>
            <attacher name="Sven Gothel">sgothel</attacher>
            
              <data encoding="base64">cGFja2FnZSBjb20uYXZhbG9vcC5wYXBlcm1pbnQuY29tbW9uOw0KDQovKg0KICogQ29weXJpZ2h0
IChjKSAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAq
DQogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQNCiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCiAqIG1ldDoNCiAqDQogKiAtIFJlZGlz
dHJpYnV0aW9uIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQN
CiAqICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLg0KICoNCiAqIC0gUmVkaXN0cmlidXRpb24gaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodA0KICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlDQogKiAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uDQogKg0KICogTmVpdGhlciB0aGUgbmFtZSBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMu
IG9yIHRoZSBuYW1lcyBvZg0KICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ug
b3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCiAqIHRoaXMgc29mdHdhcmUgd2l0aG91
dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQogKg0KICogVGhpcyBzb2Z0d2Fy
ZSBpcyBwcm92aWRlZCAiQVMgSVMsIiB3aXRob3V0IGEgd2FycmFudHkgb2YgYW55IGtpbmQuIEFM
TA0KICogRVhQUkVTUyBPUiBJTVBMSUVEIENPTkRJVElPTlMsIFJFUFJFU0VOVEFUSU9OUyBBTkQg
V0FSUkFOVElFUywNCiAqIElOQ0xVRElORyBBTlkgSU1QTElFRCBXQVJSQU5UWSBPRiBNRVJDSEFO
VEFCSUxJVFksIEZJVE5FU1MgRk9SIEENCiAqIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBOT04tSU5G
UklOR0VNRU5ULCBBUkUgSEVSRUJZIEVYQ0xVREVELiBTVU4NCiAqIE1JQ1JPU1lTVEVNUywgSU5D
LiAoIlNVTiIpIEFORCBJVFMgTElDRU5TT1JTIFNIQUxMIE5PVCBCRSBMSUFCTEUgRk9SDQogKiBB
TlkgREFNQUdFUyBTVUZGRVJFRCBCWSBMSUNFTlNFRSBBUyBBIFJFU1VMVCBPRiBVU0lORywgTU9E
SUZZSU5HIE9SDQogKiBESVNUUklCVVRJTkcgVEhJUyBTT0ZUV0FSRSBPUiBJVFMgREVSSVZBVElW
RVMuIElOIE5PIEVWRU5UIFdJTEwgU1VOIE9SDQogKiBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIExPU1QgUkVWRU5VRSwgUFJPRklUIE9SIERBVEEsIE9SIEZPUg0KICogRElSRUNULCBJ
TkRJUkVDVCwgU1BFQ0lBTCwgQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCBPUiBQVU5JVElWRQ0K
ICogREFNQUdFUywgSE9XRVZFUiBDQVVTRUQgQU5EIFJFR0FSRExFU1MgT0YgVEhFIFRIRU9SWSBP
RiBMSUFCSUxJVFksDQogKiBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9GIE9SIElOQUJJTElUWSBU
TyBVU0UgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRg0KICogU1VOIEhBUyBCRUVOIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4NCiAqDQogKiBZb3UgYWNrbm93bGVkZ2Ug
dGhhdCB0aGlzIHNvZnR3YXJlIGlzIG5vdCBkZXNpZ25lZCBvciBpbnRlbmRlZCBmb3IgdXNlDQog
KiBpbiB0aGUgZGVzaWduLCBjb25zdHJ1Y3Rpb24sIG9wZXJhdGlvbiBvciBtYWludGVuYW5jZSBv
ZiBhbnkgbnVjbGVhcg0KICogZmFjaWxpdHkuDQogKg0KICogU3VuIGdyYXRlZnVsbHkgYWNrbm93
bGVkZ2VzIHRoYXQgdGhpcyBzb2Z0d2FyZSB3YXMgb3JpZ2luYWxseSBhdXRob3JlZA0KICogYW5k
IGRldmVsb3BlZCBieSBLZW5uZXRoIEJyYWRsZXkgUnVzc2VsbCBhbmQgQ2hyaXN0b3BoZXIgSm9o
biBLbGluZS4NCiAqLw0KDQoNCmltcG9ydCBqYXZhLmF3dC5BbHBoYUNvbXBvc2l0ZTsNCmltcG9y
dCBqYXZhLmF3dC5Db2xvcjsNCmltcG9ydCBqYXZhLmF3dC5FdmVudFF1ZXVlOw0KaW1wb3J0IGph
dmEuYXd0LkZvbnQ7DQppbXBvcnQgamF2YS5hd3QuRnJhbWU7DQppbXBvcnQgamF2YS5hd3QuR3Jh
cGhpY3MyRDsNCmltcG9ydCBqYXZhLmF3dC5JbWFnZTsNCmltcG9ydCBqYXZhLmF3dC5Qb2ludDsN
CmltcG9ydCBqYXZhLmF3dC5SZW5kZXJpbmdIaW50czsNCmltcG9ydCBqYXZhLmF3dC5ldmVudC5X
aW5kb3dBZGFwdGVyOw0KaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50Ow0KaW1wb3J0
IGphdmEuYXd0LmZvbnQuRm9udFJlbmRlckNvbnRleHQ7DQppbXBvcnQgamF2YS5hd3QuZm9udC5H
bHlwaE1ldHJpY3M7DQppbXBvcnQgamF2YS5hd3QuZm9udC5HbHlwaFZlY3RvcjsNCmltcG9ydCBq
YXZhLmF3dC5nZW9tLlJlY3RhbmdsZTJEOw0KaW1wb3J0IGphdmEubmlvLkZsb2F0QnVmZmVyOw0K
aW1wb3J0IGphdmEubmlvLkludEJ1ZmZlcjsNCmltcG9ydCBqYXZhLnRleHQuQ2hhcmFjdGVySXRl
cmF0b3I7DQppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCmltcG9ydCBqYXZhLnV0aWwuSGFz
aE1hcDsNCmltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQppbXBvcnQgamF2YS51dGlsLk1hcDsN
Cg0KaW1wb3J0IGphdmF4Lm1lZGlhLm9wZW5nbC5HTDsNCmltcG9ydCBqYXZheC5tZWRpYS5vcGVu
Z2wuR0xBdXRvRHJhd2FibGU7DQppbXBvcnQgamF2YXgubWVkaWEub3BlbmdsLkdMQ2FudmFzOw0K
aW1wb3J0IGphdmF4Lm1lZGlhLm9wZW5nbC5HTENhcGFiaWxpdGllczsNCmltcG9ydCBqYXZheC5t
ZWRpYS5vcGVuZ2wuR0xDb250ZXh0Ow0KaW1wb3J0IGphdmF4Lm1lZGlhLm9wZW5nbC5HTEV2ZW50
TGlzdGVuZXI7DQppbXBvcnQgamF2YXgubWVkaWEub3BlbmdsLkdMRXhjZXB0aW9uOw0KaW1wb3J0
IGphdmF4Lm1lZGlhLm9wZW5nbC5nbHUuR0xVOw0KDQppbXBvcnQgY29tLnN1bi5vcGVuZ2wuaW1w
bC5EZWJ1ZzsNCmltcG9ydCBjb20uc3VuLm9wZW5nbC5pbXBsLnBhY2tyZWN0LkJhY2tpbmdTdG9y
ZU1hbmFnZXI7DQppbXBvcnQgY29tLnN1bi5vcGVuZ2wuaW1wbC5wYWNrcmVjdC5SZWN0Ow0KaW1w
b3J0IGNvbS5zdW4ub3BlbmdsLmltcGwucGFja3JlY3QuUmVjdFZpc2l0b3I7DQppbXBvcnQgY29t
LnN1bi5vcGVuZ2wuaW1wbC5wYWNrcmVjdC5SZWN0YW5nbGVQYWNrZXI7DQppbXBvcnQgY29tLnN1
bi5vcGVuZ2wudXRpbC5CdWZmZXJVdGlsOw0KaW1wb3J0IGNvbS5zdW4ub3BlbmdsLnV0aWwuRlBT
QW5pbWF0b3I7DQppbXBvcnQgY29tLnN1bi5vcGVuZ2wudXRpbC5qMmQuVGV4dHVyZVJlbmRlcmVy
Ow0KaW1wb3J0IGNvbS5zdW4ub3BlbmdsLnV0aWwudGV4dHVyZS5UZXh0dXJlOw0KaW1wb3J0IGNv
bS5zdW4ub3BlbmdsLnV0aWwudGV4dHVyZS5UZXh0dXJlQ29vcmRzOw0KDQoNCi8qKiBSZW5kZXJz
IGJpdG1hcHBlZCBKYXZhIDJEIHRleHQgaW50byBhbiBPcGVuR0wgd2luZG93IHdpdGggaGlnaA0K
ICAgIHBlcmZvcm1hbmNlLCBmdWxsIFVuaWNvZGUgc3VwcG9ydCwgYW5kIGEgc2ltcGxlIEFQSS4g
UGVyZm9ybXMNCiAgICBhcHByb3ByaWF0ZSBjYWNoaW5nIG9mIHRleHQgcmVuZGVyaW5nIHJlc3Vs
dHMgaW4gYW4gT3BlbkdMIHRleHR1cmUNCiAgICBpbnRlcm5hbGx5IHRvIGF2b2lkIHJlcGVhdGVk
IGZvbnQgcmFzdGVyaXphdGlvbi4gVGhlIGNhY2hpbmcgaXMNCiAgICBjb21wbGV0ZWx5IGF1dG9t
YXRpYywgZG9lcyBub3QgcmVxdWlyZSBhbnkgdXNlciBpbnRlcnZlbnRpb24sIGFuZA0KICAgIGhh
cyBubyB2aXNpYmxlIGNvbnRyb2xzIGluIHRoZSBwdWJsaWMgQVBJLiA8UD4NCg0KICAgIFVzaW5n
IHRoZSB7QGxpbmsgVGV4dFJlbmRlcmVyIFRleHRSZW5kZXJlcn0gaXMgc2ltcGxlLiBBZGQgYQ0K
ICAgICI8Y29kZT5UZXh0UmVuZGVyZXIgcmVuZGVyZXI7PC9jb2RlPiIgZmllbGQgdG8geW91ciB7
QGxpbmsNCiAgICBqYXZheC5tZWRpYS5vcGVuZ2wuR0xFdmVudExpc3RlbmVyIEdMRXZlbnRMaXN0
ZW5lcn0uIEluIHlvdXIge0BsaW5rDQogICAgamF2YXgubWVkaWEub3BlbmdsLkdMRXZlbnRMaXN0
ZW5lciNpbml0IGluaXR9IG1ldGhvZCwgYWRkOg0KDQogICAgPFBSRT4NCiAgICByZW5kZXJlciA9
IG5ldyBUZXh0UmVuZGVyZXIobmV3IEZvbnQoIlNhbnNTZXJpZiIsIEZvbnQuQk9MRCwgMzYpKTsN
CiAgICA8L1BSRT4NCg0KICAgIDxQPiBJbiB0aGUge0BsaW5rIGphdmF4Lm1lZGlhLm9wZW5nbC5H
TEV2ZW50TGlzdGVuZXIjZGlzcGxheSBkaXNwbGF5fSBtZXRob2Qgb2YgeW91cg0KICAgIHtAbGlu
ayBqYXZheC5tZWRpYS5vcGVuZ2wuR0xFdmVudExpc3RlbmVyIEdMRXZlbnRMaXN0ZW5lcn0sIGFk
ZDoNCiAgICA8UFJFPg0KICAgIHJlbmRlcmVyLmJlZ2luUmVuZGVyaW5nKGRyYXdhYmxlLmdldFdp
ZHRoKCksIGRyYXdhYmxlLmdldEhlaWdodCgpKTsNCiAgICAvLyBvcHRpb25hbGx5IHNldCB0aGUg
Y29sb3INCiAgICByZW5kZXJlci5zZXRDb2xvcigxLjBmLCAwLjJmLCAwLjJmLCAwLjhmKTsNCiAg
ICByZW5kZXJlci5kcmF3KCJUZXh0IHRvIGRyYXciLCB4UG9zaXRpb24sIHlQb3NpdGlvbik7DQog
ICAgLy8gLi4uIG1vcmUgZHJhdyBjb21tYW5kcywgY29sb3IgY2hhbmdlcywgZXRjLg0KICAgIHJl
bmRlcmVyLmVuZFJlbmRlcmluZygpOw0KICAgIDwvUFJFPg0KDQogICAgVW5sZXNzIHlvdSBhcmUg
c2hhcmluZyB0ZXh0dXJlcyBhbmQgZGlzcGxheSBsaXN0cyBiZXR3ZWVuIE9wZW5HTA0KICAgIGNv
bnRleHRzLCB5b3UgZG8gbm90IG5lZWQgdG8gY2FsbCB0aGUge0BsaW5rICNkaXNwb3NlIGRpc3Bv
c2V9DQogICAgbWV0aG9kIG9mIHRoZSBUZXh0UmVuZGVyZXI7IHRoZSBPcGVuR0wgcmVzb3VyY2Vz
IGl0IHVzZXMNCiAgICBpbnRlcm5hbGx5IHdpbGwgYmUgY2xlYW5lZCB1cCBhdXRvbWF0aWNhbGx5
IHdoZW4gdGhlIE9wZW5HTA0KICAgIGNvbnRleHQgaXMgZGVzdHJveWVkLiA8UD4NCg0KICAgIDxi
Pk5vdGU8L2I+IHRoYXQgdGhlIFRleHRSZW5kZXJlciBtYXkgY2F1c2UgdGhlIHZlcnRleCBhbmQg
dGV4dHVyZQ0KICAgIGNvb3JkaW5hdGUgYXJyYXkgYnVmZmVyIGJpbmRpbmdzIHRvIGNoYW5nZSwg
b3IgdG8gYmUgdW5ib3VuZC4gVGhpcw0KICAgIGlzIGltcG9ydGFudCB0byBub3RlIGlmIHlvdSBh
cmUgdXNpbmcgVmVydGV4IEJ1ZmZlciBPYmplY3RzIChWQk9zKQ0KICAgIGluIHlvdXIgYXBwbGlj
YXRpb24uIDxQPg0KDQogICAgSW50ZXJuYWxseSwgdGhlIHJlbmRlcmVyIHVzZXMgYSByZWN0YW5n
bGUgcGFja2luZyBhbGdvcml0aG0gdG8NCiAgICBwYWNrIGJvdGggZ2x5cGhzIGFuZCBmdWxsIFN0
cmluZ3MnIHJlbmRlcmluZyByZXN1bHRzICh3aGljaCBhcmUNCiAgICB2YXJpYWJsZSBzaXplKSBv
bnRvIGEgbGFyZ2VyIE9wZW5HTCB0ZXh0dXJlLiBUaGUgaW50ZXJuYWwgYmFja2luZw0KICAgIHN0
b3JlIGlzIG1haW50YWluZWQgdXNpbmcgYSB7QGxpbmsNCiAgICBjb20uc3VuLm9wZW5nbC51dGls
LmoyZC5UZXh0dXJlUmVuZGVyZXIgVGV4dHVyZVJlbmRlcmVyfS4gQSBsZWFzdA0KICAgIHJlY2Vu
dGx5IHVzZWQgKExSVSkgYWxnb3JpdGhtIGlzIHVzZWQgdG8gZGlzY2FyZCBwcmV2aW91c2x5DQog
ICAgcmVuZGVyZWQgc3RyaW5nczsgdGhlIHNwZWNpZmljIGFsZ29yaXRobSBpcyB1bmRlZmluZWQs
IGJ1dCBpcw0KICAgIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBieSBmbHVzaGluZyB1bnVzZWQgU3Ry
aW5ncycgcmVuZGVyaW5nDQogICAgcmVzdWx0cyBldmVyeSBmZXcgaHVuZHJlZCByZW5kZXJpbmcg
Y3ljbGVzLCB3aGVyZSBhIHJlbmRlcmluZw0KICAgIGN5Y2xlIGlzIGRlZmluZWQgYXMgYSBwYWly
IG9mIGNhbGxzIHRvIHtAbGluayAjYmVnaW5SZW5kZXJpbmcNCiAgICBiZWdpblJlbmRlcmluZ30g
LyB7QGxpbmsgI2VuZFJlbmRlcmluZyBlbmRSZW5kZXJpbmd9Lg0KDQogICAgQGF1dGhvciBKb2hu
IEJ1cmtleQ0KICAgIEBhdXRob3IgS2VubmV0aCBSdXNzZWxsDQoqLw0KcHVibGljIGNsYXNzIFRl
eHRSZW5kZXJlciB7DQogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IERl
YnVnLmRlYnVnKCJUZXh0UmVuZGVyZXIiKTsNCiAgICBzdGF0aWMgZmluYWwgaW50IGtTaXplID0g
MjU2Ow0KDQogICAgLy8gRXZlcnkgY2VydGFpbiBudW1iZXIgb2YgcmVuZGVyIGN5Y2xlcywgZmx1
c2ggdGhlIHN0cmluZ3Mgd2hpY2gNCiAgICAvLyBoYXZlbid0IGJlZW4gdXNlZCByZWNlbnRseQ0K
ICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDWUNMRVNfUEVSX0ZMVVNIID0gMTAwOw0KDQog
ICAgLy8gVGhlIGFtb3VudCBvZiB2ZXJ0aWNhbCBkZWFkIHNwYWNlIG9uIHRoZSBiYWNraW5nIHN0
b3JlIGJlZm9yZSB3ZQ0KICAgIC8vIGZvcmNlIGEgY29tcGFjdGlvbg0KICAgIHByaXZhdGUgc3Rh
dGljIGZpbmFsIGZsb2F0IE1BWF9WRVJUSUNBTF9GUkFHTUVOVEFUSU9OID0gMC43ZjsNCiAgICBz
dGF0aWMgZmluYWwgaW50IGtRdWFkc1BlckJ1ZmZlciA9IDEwMDsNCiAgICBzdGF0aWMgZmluYWwg
aW50IGtDb29yZHNQZXJWZXJ0VmVydHMgPSAzOw0KICAgIHN0YXRpYyBmaW5hbCBpbnQga0Nvb3Jk
c1BlclZlcnRUZXggPSAyOw0KICAgIHN0YXRpYyBmaW5hbCBpbnQga1ZlcnRzUGVyUXVhZCA9IDQ7
DQogICAgc3RhdGljIGZpbmFsIGludCBrVG90YWxCdWZmZXJTaXplVmVydHMgPSBrUXVhZHNQZXJC
dWZmZXIgKiBrVmVydHNQZXJRdWFkOw0KICAgIHN0YXRpYyBmaW5hbCBpbnQga1RvdGFsQnVmZmVy
U2l6ZUNvb3Jkc1ZlcnRzID0ga1F1YWRzUGVyQnVmZmVyICoga1ZlcnRzUGVyUXVhZCAqIGtDb29y
ZHNQZXJWZXJ0VmVydHM7DQogICAgc3RhdGljIGZpbmFsIGludCBrVG90YWxCdWZmZXJTaXplQ29v
cmRzVGV4ID0ga1F1YWRzUGVyQnVmZmVyICoga1ZlcnRzUGVyUXVhZCAqIGtDb29yZHNQZXJWZXJ0
VGV4Ow0KICAgIHN0YXRpYyBmaW5hbCBpbnQga1RvdGFsQnVmZmVyU2l6ZUJ5dGVzVmVydHMgPSBr
VG90YWxCdWZmZXJTaXplQ29vcmRzVmVydHMgKiA0Ow0KICAgIHN0YXRpYyBmaW5hbCBpbnQga1Rv
dGFsQnVmZmVyU2l6ZUJ5dGVzVGV4ID0ga1RvdGFsQnVmZmVyU2l6ZUNvb3Jkc1RleCAqIDQ7DQog
ICAgc3RhdGljIGZpbmFsIGludCBrU2l6ZUluQnl0ZXNfT25lVmVydGljZXNfVmVydGV4RGF0YSA9
IGtDb29yZHNQZXJWZXJ0VmVydHMgKiA0Ow0KICAgIHN0YXRpYyBmaW5hbCBpbnQga1NpemVJbkJ5
dGVzX09uZVZlcnRpY2VzX1RleERhdGEgPSBrQ29vcmRzUGVyVmVydFRleCAqIDQ7DQogICAgcHJp
dmF0ZSBGb250IGZvbnQ7DQogICAgcHJpdmF0ZSBib29sZWFuIGFudGlhbGlhc2VkOw0KICAgIHBy
aXZhdGUgYm9vbGVhbiB1c2VGcmFjdGlvbmFsTWV0cmljczsNCg0KICAgIC8vIFdoZXRoZXIgd2Un
cmUgYXR0ZW1wdGluZyB0byB1c2UgYXV0b21hdGljIG1pcG1hcCBnZW5lcmF0aW9uIHN1cHBvcnQN
CiAgICBwcml2YXRlIGJvb2xlYW4gbWlwbWFwOw0KICAgIHByaXZhdGUgUmVjdGFuZ2xlUGFja2Vy
IHBhY2tlcjsNCiAgICBwcml2YXRlIGJvb2xlYW4gaGF2ZU1heFNpemU7DQogICAgcHJpdmF0ZSBS
ZW5kZXJEZWxlZ2F0ZSByZW5kZXJEZWxlZ2F0ZTsNCiAgICBwcml2YXRlIFRleHR1cmVSZW5kZXJl
ciBjYWNoZWRCYWNraW5nU3RvcmU7DQogICAgcHJpdmF0ZSBHcmFwaGljczJEIGNhY2hlZEdyYXBo
aWNzOw0KICAgIHByaXZhdGUgRm9udFJlbmRlckNvbnRleHQgY2FjaGVkRm9udFJlbmRlckNvbnRl
eHQ7DQogICAgcHJpdmF0ZSBNYXAgLyo8U3RyaW5nLFJlY3Q+Ki8gc3RyaW5nTG9jYXRpb25zID0g
bmV3IEhhc2hNYXAgLyo8U3RyaW5nLFJlY3Q+Ki8oKTsNCiAgICBwcml2YXRlIEdseXBoUHJvZHVj
ZXIgbUdseXBoUHJvZHVjZXI7DQoNCiAgICAvLyBTdXBwb3J0IHRva2VuaXphdGlvbiBvZiBzcGFj
ZS1zZXBhcmF0ZWQgd29yZHMNCiAgICAvLyBOT1RFOiBub3QgdXNpbmcgdGhpcyBhdCB0aGUgcHJl
c2VudCB0aW1lIGFzIHdlIGFyZW4ndCBwcm9kdWNpbmcNCiAgICAvLyBpZGVudGljYWwgcmVuZGVy
aW5nIHJlc3VsdHM7IG1heSB1bHRpbWF0ZWx5IHlpZWxkIG1vcmUgZWZmaWNpZW50DQogICAgLy8g
dXNlIG9mIHRoZSBiYWNraW5nIHN0b3JlDQogICAgLy8gcHJpdmF0ZSBib29sZWFuIHNwbGl0QXRT
cGFjZXMgPSAhRGVidWcuaXNQcm9wZXJ0eURlZmluZWQoImpvZ2wuVGV4dFJlbmRlcmVyLm5vc3Bs
aXQiKTsNCiAgICBwcml2YXRlIGJvb2xlYW4gc3BsaXRBdFNwYWNlcyA9IGZhbHNlOw0KICAgIHBy
aXZhdGUgaW50IHNwYWNlV2lkdGggPSAtMTsNCiAgICBwcml2YXRlIGphdmEudXRpbC5MaXN0IHRv
a2VuaXphdGlvblJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0IC8qPFN0cmluZz4qLygpOw0KICAgIHBy
aXZhdGUgaW50IG51bVJlbmRlckN5Y2xlczsNCg0KICAgIC8vIE5lZWQgdG8ga2VlcCB0cmFjayBv
ZiB3aGV0aGVyIHdlJ3JlIGluIGEgYmVnaW5SZW5kZXJpbmcoKSAvDQogICAgLy8gZW5kUmVuZGVy
aW5nKCkgY3ljbGUgc28gd2UgY2FuIHJlLWVudGVyIHRoZSBleGFjdCBzYW1lIHN0YXRlIGlmDQog
ICAgLy8gd2UgaGF2ZSB0byByZWFsbG9jYXRlIHRoZSBiYWNraW5nIHN0b3JlDQogICAgcHJpdmF0
ZSBib29sZWFuIGluQmVnaW5FbmRQYWlyOw0KICAgIHByaXZhdGUgYm9vbGVhbiBpc09ydGhvTW9k
ZTsNCiAgICBwcml2YXRlIGludCBiZWdpblJlbmRlcmluZ1dpZHRoOw0KICAgIHByaXZhdGUgaW50
IGJlZ2luUmVuZGVyaW5nSGVpZ2h0Ow0KICAgIHByaXZhdGUgYm9vbGVhbiBiZWdpblJlbmRlcmlu
Z0RlcHRoVGVzdERpc2FibGVkOw0KDQogICAgLy8gRm9yIHJlc2V0dGluZyB0aGUgY29sb3IgYWZ0
ZXIgZGlzcG9zYWwgb2YgdGhlIG9sZCBiYWNraW5nIHN0b3JlDQogICAgcHJpdmF0ZSBib29sZWFu
IGhhdmVDYWNoZWRDb2xvcjsNCiAgICBwcml2YXRlIGZsb2F0IGNhY2hlZFI7DQogICAgcHJpdmF0
ZSBmbG9hdCBjYWNoZWRHOw0KICAgIHByaXZhdGUgZmxvYXQgY2FjaGVkQjsNCiAgICBwcml2YXRl
IGZsb2F0IGNhY2hlZEE7DQogICAgcHJpdmF0ZSBDb2xvciBjYWNoZWRDb2xvcjsNCiAgICBwcml2
YXRlIGJvb2xlYW4gbmVlZFRvUmVzZXRDb2xvcjsNCg0KICAgIC8vIEZvciBkZWJ1Z2dpbmcgb25s
eQ0KICAgIHByaXZhdGUgRnJhbWUgZGJnRnJhbWU7DQoNCiAgICAvLyBEZWJ1Z2dpbmcgcHVycG9z
ZXMgb25seQ0KICAgIHByaXZhdGUgYm9vbGVhbiBkZWJ1Z2dlZDsNCiAgICBQaXBlbGluZWRfUXVh
ZFJlbmRlcmVyIG1QaXBlbGluZWRRdWFkUmVuZGVyZXI7DQogICAgDQogICAgLy9lbXppYzogYWRk
ZWQgYm9vbGVhbiBmbGFnDQogICAgcHJpdmF0ZSBib29sZWFuIHVzZVZlcnRleEFycmF5czsNCiAg
ICANCiAgICAvL2VtemljOiBhZGRlZCBib29sZWFuIGZsYWcNCiAgICBwcml2YXRlIGJvb2xlYW4g
aXNFeHRlbnNpb25BdmFpbGFibGVfR0xfVkVSU0lPTl8xXzU7DQogICAgcHJpdmF0ZSBib29sZWFu
IGNoZWNrRm9yX2lzRXh0ZW5zaW9uQXZhaWxhYmxlX0dMX1ZFUlNJT05fMV81Ow0KDQogICAgLyoq
IENyZWF0ZXMgYSBuZXcgVGV4dFJlbmRlcmVyIHdpdGggdGhlIGdpdmVuIGZvbnQsIHVzaW5nIG5v
DQogICAgICAgIGFudGlhbGlhc2luZyBvciBmcmFjdGlvbmFsIG1ldHJpY3MsIGFuZCB0aGUgZGVm
YXVsdA0KICAgICAgICBSZW5kZXJEZWxlZ2F0ZS4gRXF1aXZhbGVudCB0byA8Y29kZT5UZXh0UmVu
ZGVyZXIoZm9udCwgZmFsc2UsDQogICAgICAgIGZhbHNlKTwvY29kZT4uDQoNCiAgICAgICAgQHBh
cmFtIGZvbnQgdGhlIGZvbnQgdG8gcmVuZGVyIHdpdGgNCiAgICAqLw0KICAgIHB1YmxpYyBUZXh0
UmVuZGVyZXIoRm9udCBmb250KSB7DQogICAgICAgIHRoaXMoZm9udCwgZmFsc2UsIGZhbHNlLCBu
dWxsLCBmYWxzZSk7DQogICAgfQ0KDQogICAgLyoqIENyZWF0ZXMgYSBuZXcgVGV4dFJlbmRlcmVy
IHdpdGggdGhlIGdpdmVuIGZvbnQsIHVzaW5nIG5vDQogICAgICAgIGFudGlhbGlhc2luZyBvciBm
cmFjdGlvbmFsIG1ldHJpY3MsIGFuZCB0aGUgZGVmYXVsdA0KICAgICAgICBSZW5kZXJEZWxlZ2F0
ZS4gSWYgPENPREU+bWlwbWFwPC9DT0RFPiBpcyB0cnVlLCBhdHRlbXB0cyB0byB1c2UNCiAgICAg
ICAgT3BlbkdMJ3MgYXV0b21hdGljIG1pcG1hcCBnZW5lcmF0aW9uIGZvciBiZXR0ZXIgc21vb3Ro
aW5nIHdoZW4NCiAgICAgICAgcmVuZGVyaW5nIHRoZSBUZXh0dXJlUmVuZGVyZXIncyBjb250ZW50
cyBhdCBhIGRpc3RhbmNlLg0KICAgICAgICBFcXVpdmFsZW50IHRvIDxjb2RlPlRleHRSZW5kZXJl
cihmb250LCBmYWxzZSwgZmFsc2UpPC9jb2RlPi4NCg0KICAgICAgICBAcGFyYW0gZm9udCB0aGUg
Zm9udCB0byByZW5kZXIgd2l0aA0KICAgICAgICBAcGFyYW0gbWlwbWFwIHdoZXRoZXIgdG8gYXR0
ZW1wdCB1c2Ugb2YgYXV0b21hdGljIG1pcG1hcCBnZW5lcmF0aW9uDQogICAgKi8NCiAgICBwdWJs
aWMgVGV4dFJlbmRlcmVyKEZvbnQgZm9udCwgYm9vbGVhbiBtaXBtYXApIHsNCiAgICAgICAgdGhp
cyhmb250LCBmYWxzZSwgZmFsc2UsIG51bGwsIG1pcG1hcCk7DQogICAgfQ0KDQogICAgLyoqIENy
ZWF0ZXMgYSBuZXcgVGV4dFJlbmRlcmVyIHdpdGggdGhlIGdpdmVuIEZvbnQsIHNwZWNpZmllZCBm
b250DQogICAgICAgIHByb3BlcnRpZXMsIGFuZCBkZWZhdWx0IFJlbmRlckRlbGVnYXRlLiBUaGUN
CiAgICAgICAgPGNvZGU+YW50aWFsaWFzZWQ8L2NvZGU+IGFuZCA8Y29kZT51c2VGcmFjdGlvbmFs
TWV0cmljczwvY29kZT4NCiAgICAgICAgZmxhZ3MgcHJvdmlkZSBjb250cm9sIG92ZXIgdGhlIHNh
bWUgcHJvcGVydGllcyBhdCB0aGUgSmF2YSAyRA0KICAgICAgICBsZXZlbC4gTm8gbWlwbWFwIHN1
cHBvcnQgaXMgcmVxdWVzdGVkLiBFcXVpdmFsZW50IHRvDQogICAgICAgIDxjb2RlPlRleHRSZW5k
ZXJlcihmb250LCBhbnRpYWxpYXNlZCwgdXNlRnJhY3Rpb25hbE1ldHJpY3MsDQogICAgICAgIG51
bGwpPC9jb2RlPi4NCg0KICAgICAgICBAcGFyYW0gZm9udCB0aGUgZm9udCB0byByZW5kZXIgd2l0
aA0KICAgICAgICBAcGFyYW0gYW50aWFsaWFzZWQgd2hldGhlciB0byB1c2UgYW50aWFsaWFzZWQg
Zm9udHMNCiAgICAgICAgQHBhcmFtIHVzZUZyYWN0aW9uYWxNZXRyaWNzIHdoZXRoZXIgdG8gdXNl
IGZyYWN0aW9uYWwgZm9udA0KICAgICAgICBtZXRyaWNzIGF0IHRoZSBKYXZhIDJEIGxldmVsDQog
ICAgKi8NCiAgICBwdWJsaWMgVGV4dFJlbmRlcmVyKEZvbnQgZm9udCwgYm9vbGVhbiBhbnRpYWxp
YXNlZCwNCiAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlRnJhY3Rpb25hbE1ldHJp
Y3MpIHsNCiAgICAgICAgdGhpcyhmb250LCBhbnRpYWxpYXNlZCwgdXNlRnJhY3Rpb25hbE1ldHJp
Y3MsIG51bGwsIGZhbHNlKTsNCiAgICB9DQoNCiAgICAvKiogQ3JlYXRlcyBhIG5ldyBUZXh0UmVu
ZGVyZXIgd2l0aCB0aGUgZ2l2ZW4gRm9udCwgc3BlY2lmaWVkIGZvbnQNCiAgICAgICAgcHJvcGVy
dGllcywgYW5kIGdpdmVuIFJlbmRlckRlbGVnYXRlLiBUaGUNCiAgICAgICAgPGNvZGU+YW50aWFs
aWFzZWQ8L2NvZGU+IGFuZCA8Y29kZT51c2VGcmFjdGlvbmFsTWV0cmljczwvY29kZT4NCiAgICAg
ICAgZmxhZ3MgcHJvdmlkZSBjb250cm9sIG92ZXIgdGhlIHNhbWUgcHJvcGVydGllcyBhdCB0aGUg
SmF2YSAyRA0KICAgICAgICBsZXZlbC4gVGhlIDxjb2RlPnJlbmRlckRlbGVnYXRlPC9jb2RlPiBw
cm92aWRlcyBtb3JlIGNvbnRyb2wNCiAgICAgICAgb3ZlciB0aGUgdGV4dCByZW5kZXJlZC4gTm8g
bWlwbWFwIHN1cHBvcnQgaXMgcmVxdWVzdGVkLg0KDQogICAgICAgIEBwYXJhbSBmb250IHRoZSBm
b250IHRvIHJlbmRlciB3aXRoDQogICAgICAgIEBwYXJhbSBhbnRpYWxpYXNlZCB3aGV0aGVyIHRv
IHVzZSBhbnRpYWxpYXNlZCBmb250cw0KICAgICAgICBAcGFyYW0gdXNlRnJhY3Rpb25hbE1ldHJp
Y3Mgd2hldGhlciB0byB1c2UgZnJhY3Rpb25hbCBmb250DQogICAgICAgIG1ldHJpY3MgYXQgdGhl
IEphdmEgMkQgbGV2ZWwNCiAgICAgICAgQHBhcmFtIHJlbmRlckRlbGVnYXRlIHRoZSByZW5kZXIg
ZGVsZWdhdGUgdG8gdXNlIHRvIGRyYXcgdGhlDQogICAgICAgIHRleHQncyBiaXRtYXAsIG9yIG51
bGwgdG8gdXNlIHRoZSBkZWZhdWx0IG9uZQ0KICAgICovDQogICAgcHVibGljIFRleHRSZW5kZXJl
cihGb250IGZvbnQsIGJvb2xlYW4gYW50aWFsaWFzZWQsDQogICAgICAgICAgICAgICAgICAgICAg
ICBib29sZWFuIHVzZUZyYWN0aW9uYWxNZXRyaWNzLCBSZW5kZXJEZWxlZ2F0ZSByZW5kZXJEZWxl
Z2F0ZSkgew0KICAgICAgICB0aGlzKGZvbnQsIGFudGlhbGlhc2VkLCB1c2VGcmFjdGlvbmFsTWV0
cmljcywgcmVuZGVyRGVsZWdhdGUsIGZhbHNlKTsNCiAgICB9DQoNCiAgICAvKiogQ3JlYXRlcyBh
IG5ldyBUZXh0UmVuZGVyZXIgd2l0aCB0aGUgZ2l2ZW4gRm9udCwgc3BlY2lmaWVkIGZvbnQNCiAg
ICAgICAgcHJvcGVydGllcywgYW5kIGdpdmVuIFJlbmRlckRlbGVnYXRlLiBUaGUNCiAgICAgICAg
PGNvZGU+YW50aWFsaWFzZWQ8L2NvZGU+IGFuZCA8Y29kZT51c2VGcmFjdGlvbmFsTWV0cmljczwv
Y29kZT4NCiAgICAgICAgZmxhZ3MgcHJvdmlkZSBjb250cm9sIG92ZXIgdGhlIHNhbWUgcHJvcGVy
dGllcyBhdCB0aGUgSmF2YSAyRA0KICAgICAgICBsZXZlbC4gVGhlIDxjb2RlPnJlbmRlckRlbGVn
YXRlPC9jb2RlPiBwcm92aWRlcyBtb3JlIGNvbnRyb2wNCiAgICAgICAgb3ZlciB0aGUgdGV4dCBy
ZW5kZXJlZC4gSWYgPENPREU+bWlwbWFwPC9DT0RFPiBpcyB0cnVlLCBhdHRlbXB0cw0KICAgICAg
ICB0byB1c2UgT3BlbkdMJ3MgYXV0b21hdGljIG1pcG1hcCBnZW5lcmF0aW9uIGZvciBiZXR0ZXIg
c21vb3RoaW5nDQogICAgICAgIHdoZW4gcmVuZGVyaW5nIHRoZSBUZXh0dXJlUmVuZGVyZXIncyBj
b250ZW50cyBhdCBhIGRpc3RhbmNlLg0KDQogICAgICAgIEBwYXJhbSBmb250IHRoZSBmb250IHRv
IHJlbmRlciB3aXRoDQogICAgICAgIEBwYXJhbSBhbnRpYWxpYXNlZCB3aGV0aGVyIHRvIHVzZSBh
bnRpYWxpYXNlZCBmb250cw0KICAgICAgICBAcGFyYW0gdXNlRnJhY3Rpb25hbE1ldHJpY3Mgd2hl
dGhlciB0byB1c2UgZnJhY3Rpb25hbCBmb250DQogICAgICAgIG1ldHJpY3MgYXQgdGhlIEphdmEg
MkQgbGV2ZWwNCiAgICAgICAgQHBhcmFtIHJlbmRlckRlbGVnYXRlIHRoZSByZW5kZXIgZGVsZWdh
dGUgdG8gdXNlIHRvIGRyYXcgdGhlDQogICAgICAgIHRleHQncyBiaXRtYXAsIG9yIG51bGwgdG8g
dXNlIHRoZSBkZWZhdWx0IG9uZQ0KICAgICAgICBAcGFyYW0gbWlwbWFwIHdoZXRoZXIgdG8gYXR0
ZW1wdCB1c2Ugb2YgYXV0b21hdGljIG1pcG1hcCBnZW5lcmF0aW9uDQogICAgKi8NCiAgICBwdWJs
aWMgVGV4dFJlbmRlcmVyKEZvbnQgZm9udCwgYm9vbGVhbiBhbnRpYWxpYXNlZCwNCiAgICAgICAg
ICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlRnJhY3Rpb25hbE1ldHJpY3MsIFJlbmRlckRlbGVn
YXRlIHJlbmRlckRlbGVnYXRlLA0KICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBtaXBt
YXApIHsNCiAgICAgICAgdGhpcy5mb250ID0gZm9udDsNCiAgICAgICAgdGhpcy5hbnRpYWxpYXNl
ZCA9IGFudGlhbGlhc2VkOw0KICAgICAgICB0aGlzLnVzZUZyYWN0aW9uYWxNZXRyaWNzID0gdXNl
RnJhY3Rpb25hbE1ldHJpY3M7DQogICAgICAgIHRoaXMubWlwbWFwID0gbWlwbWFwOw0KDQogICAg
ICAgIC8vIEZJWE1FOiBjb25zaWRlciBhZGp1c3RpbmcgdGhlIHNpemUgYmFzZWQgb24gZm9udCBz
aXplDQogICAgICAgIC8vIChpdCB3aWxsIGFscmVhZHkgYXV0b21hdGljYWxseSByZXNpemUgaWYg
bmVjZXNzYXJ5KQ0KICAgICAgICBwYWNrZXIgPSBuZXcgUmVjdGFuZ2xlUGFja2VyKG5ldyBNYW5h
Z2VyKCksIGtTaXplLCBrU2l6ZSk7DQoNCiAgICAgICAgaWYgKHJlbmRlckRlbGVnYXRlID09IG51
bGwpIHsNCiAgICAgICAgICAgIHJlbmRlckRlbGVnYXRlID0gbmV3IERlZmF1bHRSZW5kZXJEZWxl
Z2F0ZSgpOw0KICAgICAgICB9DQoNCiAgICAgICAgdGhpcy5yZW5kZXJEZWxlZ2F0ZSA9IHJlbmRl
ckRlbGVnYXRlOw0KDQogICAgICAgIG1HbHlwaFByb2R1Y2VyID0gbmV3IEdseXBoUHJvZHVjZXIo
Z2V0Rm9udFJlbmRlckNvbnRleHQoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBmb250LmdldE51bUdseXBocygpKTsNCiAgICB9DQoNCiAgICAvKiogUmV0dXJu
cyB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIG9mIHRoZSBnaXZlbiBTdHJpbmcsIGFzc3VtaW5nIGl0
DQogICAgICAgIHdhcyByZW5kZXJlZCBhdCB0aGUgb3JpZ2luLiBTZWUge0BsaW5rICNnZXRCb3Vu
ZHMoQ2hhclNlcXVlbmNlKQ0KICAgICAgICBnZXRCb3VuZHMoQ2hhclNlcXVlbmNlKX0uICovDQog
ICAgcHVibGljIFJlY3RhbmdsZTJEIGdldEJvdW5kcyhTdHJpbmcgc3RyKSB7DQogICAgICAgIHJl
dHVybiBnZXRCb3VuZHMoKENoYXJTZXF1ZW5jZSkgc3RyKTsNCiAgICB9DQoNCiAgICAvKiogUmV0
dXJucyB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIG9mIHRoZSBnaXZlbiBDaGFyU2VxdWVuY2UsDQog
ICAgICAgIGFzc3VtaW5nIGl0IHdhcyByZW5kZXJlZCBhdCB0aGUgb3JpZ2luLiBUaGUgY29vcmRp
bmF0ZSBzeXN0ZW0gb2YNCiAgICAgICAgdGhlIHJldHVybmVkIHJlY3RhbmdsZSBpcyBKYXZhIDJE
J3MsIHdpdGggaW5jcmVhc2luZyBZDQogICAgICAgIGNvb3JkaW5hdGVzIGluIHRoZSBkb3dud2Fy
ZCBkaXJlY3Rpb24uIFRoZSByZWxhdGl2ZSBjb29yZGluYXRlDQogICAgICAgICgwLCAwKSBpbiB0
aGUgcmV0dXJuZWQgcmVjdGFuZ2xlIGNvcnJlc3BvbmRzIHRvIHRoZSBiYXNlbGluZSBvZg0KICAg
ICAgICB0aGUgbGVmdG1vc3QgY2hhcmFjdGVyIG9mIHRoZSByZW5kZXJlZCBzdHJpbmcsIGluIHNp
bWlsYXINCiAgICAgICAgZmFzaGlvbiB0byB0aGUgcmVzdWx0cyByZXR1cm5lZCBieSwgZm9yIGV4
YW1wbGUsIHtAbGluaw0KICAgICAgICBqYXZhLmF3dC5mb250LkdseXBoVmVjdG9yI2dldFZpc3Vh
bEJvdW5kc30uIE1vc3QgYXBwbGljYXRpb25zDQogICAgICAgIHdpbGwgdXNlIG9ubHkgdGhlIHdp
ZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHJldHVybmVkIFJlY3RhbmdsZSBmb3INCiAgICAgICAgdGhl
IHB1cnBvc2VzIG9mIGNlbnRlcmluZyBvciBqdXN0aWZ5aW5nIHRoZSBTdHJpbmcuIEl0IGlzIG5v
dA0KICAgICAgICBzcGVjaWZpZWQgd2hpY2ggSmF2YSAyRCBib3VuZHMgKHtAbGluaw0KICAgICAg
ICBqYXZhLmF3dC5mb250LkdseXBoVmVjdG9yI2dldFZpc3VhbEJvdW5kcyBnZXRWaXN1YWxCb3Vu
ZHN9LA0KICAgICAgICB7QGxpbmsgamF2YS5hd3QuZm9udC5HbHlwaFZlY3RvciNnZXRQaXhlbEJv
dW5kcyBnZXRQaXhlbEJvdW5kc30sDQogICAgICAgIGV0Yy4pIHRoZSByZXR1cm5lZCBib3VuZHMg
Y29ycmVzcG9uZCB0bywgYWx0aG91Z2ggZXZlcnkgZWZmb3J0DQogICAgICAgIGlzIG1hZGUgdG8g
ZW5zdXJlIGFuIGFjY3VyYXRlIGJvdW5kLiAqLw0KICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRC
b3VuZHMoQ2hhclNlcXVlbmNlIHN0cikgew0KICAgICAgICAvLyBGSVhNRTogdGhpcyBkb2Vzbid0
IGhpdCB0aGUgY2FjaGUgaWYgdG9rZW5pemF0aW9uIGlzIGVuYWJsZWQgLS0NCiAgICAgICAgLy8g
bmVlZHMgbW9yZSB3b3JrDQogICAgICAgIC8vIFByZWZlciBhIG1vcmUgb3B0aW1pemVkIGFwcHJv
YWNoDQogICAgICAgIFJlY3QgciA9IG51bGw7DQoNCiAgICAgICAgaWYgKChyID0gKFJlY3QpIHN0
cmluZ0xvY2F0aW9ucy5nZXQoc3RyKSkgIT0gbnVsbCkgew0KICAgICAgICAgICAgVGV4dERhdGEg
ZGF0YSA9IChUZXh0RGF0YSkgci5nZXRVc2VyRGF0YSgpOw0KDQogICAgICAgICAgICAvLyBSZWNv
bnN0aXR1dGUgdGhlIEphdmEgMkQgcmVzdWx0cyBiYXNlZCBvbiB0aGUgY2FjaGVkIHZhbHVlcw0K
ICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWN0YW5nbGUyRC5Eb3VibGUoLWRhdGEub3JpZ2luKCku
eCwgLWRhdGEub3JpZ2luKCkueSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHIudygpLCByLmgoKSk7DQogICAgICAgIH0NCg0KICAgICAgICAvLyBNdXN0IHJldHVy
biBhIFJlY3RhbmdsZSBjb21wYXRpYmxlIHdpdGggdGhlIGxheW91dCBhbGdvcml0aG0gLS0NCiAg
ICAgICAgLy8gbXVzdCBiZSBpZGVtcG90ZW50DQogICAgICAgIHJldHVybiBub3JtYWxpemUocmVu
ZGVyRGVsZWdhdGUuZ2V0Qm91bmRzKHN0ciwgZm9udCwNCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Rm9udFJlbmRlckNvbnRleHQoKSkpOw0KICAg
IH0NCg0KICAgIC8qKiBSZXR1cm5zIHRoZSBGb250IHRoaXMgcmVuZGVyZXIgaXMgdXNpbmcuICov
DQogICAgcHVibGljIEZvbnQgZ2V0Rm9udCgpIHsNCiAgICAgICAgcmV0dXJuIGZvbnQ7DQogICAg
fQ0KDQogICAgLyoqIFJldHVybnMgYSBGb250UmVuZGVyQ29udGV4dCB3aGljaCBjYW4gYmUgdXNl
ZCBmb3IgZXh0ZXJuYWwNCiAgICAgICAgdGV4dC1yZWxhdGVkIHNpemUgY29tcHV0YXRpb25zLiBU
aGlzIG9iamVjdCBzaG91bGQgYmUgY29uc2lkZXJlZA0KICAgICAgICB0cmFuc2llbnQgYW5kIG1h
eSBiZWNvbWUgaW52YWxpZGF0ZWQgYmV0d2VlbiB7QGxpbmsNCiAgICAgICAgI2JlZ2luUmVuZGVy
aW5nIGJlZ2luUmVuZGVyaW5nfSAvIHtAbGluayAjZW5kUmVuZGVyaW5nDQogICAgICAgIGVuZFJl
bmRlcmluZ30gcGFpcnMuICovDQogICAgcHVibGljIEZvbnRSZW5kZXJDb250ZXh0IGdldEZvbnRS
ZW5kZXJDb250ZXh0KCkgew0KICAgICAgICBpZiAoY2FjaGVkRm9udFJlbmRlckNvbnRleHQgPT0g
bnVsbCkgew0KICAgICAgICAgICAgY2FjaGVkRm9udFJlbmRlckNvbnRleHQgPSBnZXRHcmFwaGlj
czJEKCkuZ2V0Rm9udFJlbmRlckNvbnRleHQoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVy
biBjYWNoZWRGb250UmVuZGVyQ29udGV4dDsNCiAgICB9DQoNCiAgICAvKiogQmVnaW5zIHJlbmRl
cmluZyB3aXRoIHRoaXMge0BsaW5rIFRleHRSZW5kZXJlciBUZXh0UmVuZGVyZXJ9DQogICAgICAg
IGludG8gdGhlIGN1cnJlbnQgT3BlbkdMIGRyYXdhYmxlLCBwdXNoaW5nIHRoZSBwcm9qZWN0aW9u
IGFuZA0KICAgICAgICBtb2RlbHZpZXcgbWF0cmljZXMgYW5kIHNvbWUgc3RhdGUgYml0cyBhbmQg
c2V0dGluZyB1cCBhDQogICAgICAgIHR3by1kaW1lbnNpb25hbCBvcnRob2dyYXBoaWMgcHJvamVj
dGlvbiB3aXRoICgwLCAwKSBhcyB0aGUNCiAgICAgICAgbG93ZXItbGVmdCBjb29yZGluYXRlIGFu
ZCAod2lkdGgsIGhlaWdodCkgYXMgdGhlIHVwcGVyLXJpZ2h0DQogICAgICAgIGNvb3JkaW5hdGUu
IEJpbmRzIGFuZCBlbmFibGVzIHRoZSBpbnRlcm5hbCBPcGVuR0wgdGV4dHVyZQ0KICAgICAgICBv
YmplY3QsIHNldHMgdGhlIHRleHR1cmUgZW52aXJvbm1lbnQgbW9kZSB0byBHTF9NT0RVTEFURSwg
YW5kDQogICAgICAgIGNoYW5nZXMgdGhlIGN1cnJlbnQgY29sb3IgdG8gdGhlIGxhc3QgY29sb3Ig
c2V0IHdpdGggdGhpcw0KICAgICAgICBUZXh0UmVuZGVyZXIgdmlhIHtAbGluayAjc2V0Q29sb3Ig
c2V0Q29sb3J9LiBUaGlzIG1ldGhvZA0KICAgICAgICBkaXNhYmxlcyB0aGUgZGVwdGggdGVzdCBh
bmQgaXMgZXF1aXZhbGVudCB0bw0KICAgICAgICBiZWdpblJlbmRlcmluZyh3aWR0aCwgaGVpZ2h0
LCB0cnVlKS4NCg0KICAgICAgICBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSBjdXJyZW50
IG9uLXNjcmVlbiBPcGVuR0wgZHJhd2FibGUNCiAgICAgICAgQHBhcmFtIGhlaWdodCB0aGUgaGVp
Z2h0IG9mIHRoZSBjdXJyZW50IG9uLXNjcmVlbiBPcGVuR0wgZHJhd2FibGUNCiAgICAgICAgQHRo
cm93cyBqYXZheC5tZWRpYS5vcGVuZ2wuR0xFeGNlcHRpb24gSWYgYW4gT3BlbkdMIGNvbnRleHQg
aXMgbm90IGN1cnJlbnQgd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQNCiAgICAqLw0KICAgIHB1
YmxpYyB2b2lkIGJlZ2luUmVuZGVyaW5nKGludCB3aWR0aCwgaW50IGhlaWdodCkgdGhyb3dzIEdM
RXhjZXB0aW9uIHsNCiAgICAgICAgYmVnaW5SZW5kZXJpbmcod2lkdGgsIGhlaWdodCwgdHJ1ZSk7
DQogICAgfQ0KDQogICAgLyoqIEJlZ2lucyByZW5kZXJpbmcgd2l0aCB0aGlzIHtAbGluayBUZXh0
UmVuZGVyZXIgVGV4dFJlbmRlcmVyfQ0KICAgICAgICBpbnRvIHRoZSBjdXJyZW50IE9wZW5HTCBk
cmF3YWJsZSwgcHVzaGluZyB0aGUgcHJvamVjdGlvbiBhbmQNCiAgICAgICAgbW9kZWx2aWV3IG1h
dHJpY2VzIGFuZCBzb21lIHN0YXRlIGJpdHMgYW5kIHNldHRpbmcgdXAgYQ0KICAgICAgICB0d28t
ZGltZW5zaW9uYWwgb3J0aG9ncmFwaGljIHByb2plY3Rpb24gd2l0aCAoMCwgMCkgYXMgdGhlDQog
ICAgICAgIGxvd2VyLWxlZnQgY29vcmRpbmF0ZSBhbmQgKHdpZHRoLCBoZWlnaHQpIGFzIHRoZSB1
cHBlci1yaWdodA0KICAgICAgICBjb29yZGluYXRlLiBCaW5kcyBhbmQgZW5hYmxlcyB0aGUgaW50
ZXJuYWwgT3BlbkdMIHRleHR1cmUNCiAgICAgICAgb2JqZWN0LCBzZXRzIHRoZSB0ZXh0dXJlIGVu
dmlyb25tZW50IG1vZGUgdG8gR0xfTU9EVUxBVEUsIGFuZA0KICAgICAgICBjaGFuZ2VzIHRoZSBj
dXJyZW50IGNvbG9yIHRvIHRoZSBsYXN0IGNvbG9yIHNldCB3aXRoIHRoaXMNCiAgICAgICAgVGV4
dFJlbmRlcmVyIHZpYSB7QGxpbmsgI3NldENvbG9yIHNldENvbG9yfS4gRGlzYWJsZXMgdGhlIGRl
cHRoDQogICAgICAgIHRlc3QgaWYgdGhlIGRpc2FibGVEZXB0aFRlc3QgYXJndW1lbnQgaXMgdHJ1
ZS4NCg0KICAgICAgICBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSBjdXJyZW50IG9uLXNj
cmVlbiBPcGVuR0wgZHJhd2FibGUNCiAgICAgICAgQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9m
IHRoZSBjdXJyZW50IG9uLXNjcmVlbiBPcGVuR0wgZHJhd2FibGUNCiAgICAgICAgQHBhcmFtIGRp
c2FibGVEZXB0aFRlc3Qgd2hldGhlciB0byBkaXNhYmxlIHRoZSBkZXB0aCB0ZXN0DQogICAgICAg
IEB0aHJvd3MgR0xFeGNlcHRpb24gSWYgYW4gT3BlbkdMIGNvbnRleHQgaXMgbm90IGN1cnJlbnQg
d2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQNCiAgICAqLw0KICAgIHB1YmxpYyB2b2lkIGJlZ2lu
UmVuZGVyaW5nKGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbGVhbiBkaXNhYmxlRGVwdGhUZXN0
KQ0KICAgICAgICB0aHJvd3MgR0xFeGNlcHRpb24gew0KICAgICAgICBiZWdpblJlbmRlcmluZyh0
cnVlLCB3aWR0aCwgaGVpZ2h0LCBkaXNhYmxlRGVwdGhUZXN0KTsNCiAgICB9DQoNCiAgICAvKiog
QmVnaW5zIHJlbmRlcmluZyBvZiAyRCB0ZXh0IGluIDNEIHdpdGggdGhpcyB7QGxpbmsgVGV4dFJl
bmRlcmVyDQogICAgICAgIFRleHRSZW5kZXJlcn0gaW50byB0aGUgY3VycmVudCBPcGVuR0wgZHJh
d2FibGUuIEFzc3VtZXMgdGhlIGVuZA0KICAgICAgICB1c2VyIGlzIHJlc3BvbnNpYmxlIGZvciBz
ZXR0aW5nIHVwIHRoZSBtb2RlbHZpZXcgYW5kIHByb2plY3Rpb24NCiAgICAgICAgbWF0cmljZXMs
IGFuZCB3aWxsIHJlbmRlciB0ZXh0IHVzaW5nIHRoZSB7QGxpbmsgI2RyYXczRCBkcmF3M0R9DQog
ICAgICAgIG1ldGhvZC4gVGhpcyBtZXRob2QgcHVzaGVzIHNvbWUgT3BlbkdMIHN0YXRlIGJpdHMs
IGJpbmRzIGFuZA0KICAgICAgICBlbmFibGVzIHRoZSBpbnRlcm5hbCBPcGVuR0wgdGV4dHVyZSBv
YmplY3QsIHNldHMgdGhlIHRleHR1cmUNCiAgICAgICAgZW52aXJvbm1lbnQgbW9kZSB0byBHTF9N
T0RVTEFURSwgYW5kIGNoYW5nZXMgdGhlIGN1cnJlbnQgY29sb3INCiAgICAgICAgdG8gdGhlIGxh
c3QgY29sb3Igc2V0IHdpdGggdGhpcyBUZXh0UmVuZGVyZXIgdmlhIHtAbGluaw0KICAgICAgICAj
c2V0Q29sb3Igc2V0Q29sb3J9Lg0KDQogICAgICAgIEB0aHJvd3MgR0xFeGNlcHRpb24gSWYgYW4g
T3BlbkdMIGNvbnRleHQgaXMgbm90IGN1cnJlbnQgd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQN
CiAgICAqLw0KICAgIHB1YmxpYyB2b2lkIGJlZ2luM0RSZW5kZXJpbmcoKSB0aHJvd3MgR0xFeGNl
cHRpb24gew0KICAgICAgICBiZWdpblJlbmRlcmluZyhmYWxzZSwgMCwgMCwgZmFsc2UpOw0KICAg
IH0NCg0KICAgIC8qKiBDaGFuZ2VzIHRoZSBjdXJyZW50IGNvbG9yIG9mIHRoaXMgVGV4dFJlbmRl
cmVyIHRvIHRoZSBzdXBwbGllZA0KICAgICAgICBvbmUuIFRoZSBkZWZhdWx0IGNvbG9yIGlzIG9w
YXF1ZSB3aGl0ZS4NCg0KICAgICAgICBAcGFyYW0gY29sb3IgdGhlIG5ldyBjb2xvciB0byB1c2Ug
Zm9yIHJlbmRlcmluZyB0ZXh0DQogICAgICAgIEB0aHJvd3MgR0xFeGNlcHRpb24gSWYgYW4gT3Bl
bkdMIGNvbnRleHQgaXMgbm90IGN1cnJlbnQgd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQNCiAg
ICAqLw0KICAgIHB1YmxpYyB2b2lkIHNldENvbG9yKENvbG9yIGNvbG9yKSB0aHJvd3MgR0xFeGNl
cHRpb24gew0KICAgICAgICBib29sZWFuIG5vTmVlZEZvckZsdXNoID0gKGhhdmVDYWNoZWRDb2xv
ciAmJiAoY2FjaGVkQ29sb3IgIT0gbnVsbCkgJiYNCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBjb2xvci5lcXVhbHMoY2FjaGVkQ29sb3IpKTsNCg0KICAgICAgICBpZiAoIW5vTmVl
ZEZvckZsdXNoKSB7DQogICAgICAgICAgICBmbHVzaEdseXBoUGlwZWxpbmUoKTsNCiAgICAgICAg
fQ0KDQogICAgICAgIGdldEJhY2tpbmdTdG9yZSgpLnNldENvbG9yKGNvbG9yKTsNCiAgICAgICAg
aGF2ZUNhY2hlZENvbG9yID0gdHJ1ZTsNCiAgICAgICAgY2FjaGVkQ29sb3IgPSBjb2xvcjsNCiAg
ICB9DQoNCiAgICAvKiogQ2hhbmdlcyB0aGUgY3VycmVudCBjb2xvciBvZiB0aGlzIFRleHRSZW5k
ZXJlciB0byB0aGUgc3VwcGxpZWQNCiAgICAgICAgb25lLCB3aGVyZSBlYWNoIGNvbXBvbmVudCBy
YW5nZXMgZnJvbSAwLjBmIC0gMS4wZi4gVGhlIGFscGhhDQogICAgICAgIGNvbXBvbmVudCwgaWYg
dXNlZCwgZG9lcyBub3QgbmVlZCB0byBiZSBwcmVtdWx0aXBsaWVkIGludG8gdGhlDQogICAgICAg
IGNvbG9yIGNoYW5uZWxzIGFzIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3Ige0Bs
aW5rDQogICAgICAgIGNvbS5zdW4ub3BlbmdsLnV0aWwudGV4dHVyZS5UZXh0dXJlIFRleHR1cmV9
LCBhbHRob3VnaA0KICAgICAgICBwcmVtdWx0aXBsaWVkIGNvbG9ycyBhcmUgdXNlZCBpbnRlcm5h
bGx5LiBUaGUgZGVmYXVsdCBjb2xvciBpcw0KICAgICAgICBvcGFxdWUgd2hpdGUuDQoNCiAgICAg
ICAgQHBhcmFtIHIgdGhlIHJlZCBjb21wb25lbnQgb2YgdGhlIG5ldyBjb2xvcg0KICAgICAgICBA
cGFyYW0gZyB0aGUgZ3JlZW4gY29tcG9uZW50IG9mIHRoZSBuZXcgY29sb3INCiAgICAgICAgQHBh
cmFtIGIgdGhlIGJsdWUgY29tcG9uZW50IG9mIHRoZSBuZXcgY29sb3INCiAgICAgICAgQHBhcmFt
IGEgdGhlIGFscGhhIGNvbXBvbmVudCBvZiB0aGUgbmV3IGNvbG9yLCAwLjBmID0gY29tcGxldGVs
eQ0KICAgICAgICB0cmFuc3BhcmVudCwgMS4wZiA9IGNvbXBsZXRlbHkgb3BhcXVlDQogICAgICAg
IEB0aHJvd3MgR0xFeGNlcHRpb24gSWYgYW4gT3BlbkdMIGNvbnRleHQgaXMgbm90IGN1cnJlbnQg
d2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQNCiAgICAqLw0KICAgIHB1YmxpYyB2b2lkIHNldENv
bG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpDQogICAgICAgIHRocm93cyBH
TEV4Y2VwdGlvbiB7DQogICAgICAgIGJvb2xlYW4gbm9OZWVkRm9yRmx1c2ggPSAoaGF2ZUNhY2hl
ZENvbG9yICYmIChjYWNoZWRDb2xvciA9PSBudWxsKSAmJg0KICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIChyID09IGNhY2hlZFIpICYmIChnID09IGNhY2hlZEcpICYmIChiID09IGNh
Y2hlZEIpICYmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGEgPT0gY2FjaGVk
QSkpOw0KDQogICAgICAgIGlmICghbm9OZWVkRm9yRmx1c2gpIHsNCiAgICAgICAgICAgIGZsdXNo
R2x5cGhQaXBlbGluZSgpOw0KICAgICAgICB9DQoNCiAgICAgICAgZ2V0QmFja2luZ1N0b3JlKCku
c2V0Q29sb3IociwgZywgYiwgYSk7DQogICAgICAgIGhhdmVDYWNoZWRDb2xvciA9IHRydWU7DQog
ICAgICAgIGNhY2hlZFIgPSByOw0KICAgICAgICBjYWNoZWRHID0gZzsNCiAgICAgICAgY2FjaGVk
QiA9IGI7DQogICAgICAgIGNhY2hlZEEgPSBhOw0KICAgICAgICBjYWNoZWRDb2xvciA9IG51bGw7
DQogICAgfQ0KDQogICAgLyoqIERyYXdzIHRoZSBzdXBwbGllZCBDaGFyU2VxdWVuY2UgYXQgdGhl
IGRlc2lyZWQgbG9jYXRpb24gdXNpbmcNCiAgICAgICAgdGhlIHJlbmRlcmVyJ3MgY3VycmVudCBj
b2xvci4gVGhlIGJhc2VsaW5lIG9mIHRoZSBsZWZ0bW9zdA0KICAgICAgICBjaGFyYWN0ZXIgaXMg
YXQgcG9zaXRpb24gKHgsIHkpIHNwZWNpZmllZCBpbiBPcGVuR0wgY29vcmRpbmF0ZXMsDQogICAg
ICAgIHdoZXJlIHRoZSBvcmlnaW4gaXMgYXQgdGhlIGxvd2VyLWxlZnQgb2YgdGhlIGRyYXdhYmxl
IGFuZCB0aGUgWQ0KICAgICAgICBjb29yZGluYXRlIGluY3JlYXNlcyBpbiB0aGUgdXB3YXJkIGRp
cmVjdGlvbi4NCg0KICAgICAgICBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gZHJhdw0KICAgICAg
ICBAcGFyYW0geCB0aGUgeCBjb29yZGluYXRlIGF0IHdoaWNoIHRvIGRyYXcNCiAgICAgICAgQHBh
cmFtIHkgdGhlIHkgY29vcmRpbmF0ZSBhdCB3aGljaCB0byBkcmF3DQogICAgICAgIEB0aHJvd3Mg
R0xFeGNlcHRpb24gSWYgYW4gT3BlbkdMIGNvbnRleHQgaXMgbm90IGN1cnJlbnQgd2hlbiB0aGlz
IG1ldGhvZCBpcyBjYWxsZWQNCiAgICAqLw0KICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2hhclNlcXVl
bmNlIHN0ciwgaW50IHgsIGludCB5KSB0aHJvd3MgR0xFeGNlcHRpb24gew0KICAgICAgICBkcmF3
M0Qoc3RyLCB4LCB5LCAwLCAxKTsNCiAgICB9DQoNCiAgICAvKiogRHJhd3MgdGhlIHN1cHBsaWVk
IFN0cmluZyBhdCB0aGUgZGVzaXJlZCBsb2NhdGlvbiB1c2luZyB0aGUNCiAgICAgICAgcmVuZGVy
ZXIncyBjdXJyZW50IGNvbG9yLiBTZWUge0BsaW5rICNkcmF3KENoYXJTZXF1ZW5jZSwgaW50LA0K
ICAgICAgICBpbnQpIGRyYXcoQ2hhclNlcXVlbmNlLCBpbnQsIGludCl9LiAqLw0KICAgIHB1Ymxp
YyB2b2lkIGRyYXcoU3RyaW5nIHN0ciwgaW50IHgsIGludCB5KSB0aHJvd3MgR0xFeGNlcHRpb24g
ew0KICAgICAgICBkcmF3M0Qoc3RyLCB4LCB5LCAwLCAxKTsNCiAgICB9DQoNCiAgICAvKiogRHJh
d3MgdGhlIHN1cHBsaWVkIENoYXJTZXF1ZW5jZSBhdCB0aGUgZGVzaXJlZCAzRCBsb2NhdGlvbiB1
c2luZw0KICAgICAgICB0aGUgcmVuZGVyZXIncyBjdXJyZW50IGNvbG9yLiBUaGUgYmFzZWxpbmUg
b2YgdGhlIGxlZnRtb3N0DQogICAgICAgIGNoYXJhY3RlciBpcyBwbGFjZWQgYXQgcG9zaXRpb24g
KHgsIHksIHopIGluIHRoZSBjdXJyZW50DQogICAgICAgIGNvb3JkaW5hdGUgc3lzdGVtLg0KDQog
ICAgICAgIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB0byBkcmF3DQogICAgICAgIEBwYXJhbSB4IHRo
ZSB4IGNvb3JkaW5hdGUgYXQgd2hpY2ggdG8gZHJhdw0KICAgICAgICBAcGFyYW0geSB0aGUgeSBj
b29yZGluYXRlIGF0IHdoaWNoIHRvIGRyYXcNCiAgICAgICAgQHBhcmFtIHogdGhlIHogY29vcmRp
bmF0ZSBhdCB3aGljaCB0byBkcmF3DQogICAgICAgIEBwYXJhbSBzY2FsZUZhY3RvciBhIHVuaWZv
cm0gc2NhbGUgZmFjdG9yIGFwcGxpZWQgdG8gdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGRy
YXduIHJlY3RhbmdsZQ0KICAgICAgICBAdGhyb3dzIEdMRXhjZXB0aW9uIElmIGFuIE9wZW5HTCBj
b250ZXh0IGlzIG5vdCBjdXJyZW50IHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkDQogICAgKi8N
CiAgICBwdWJsaWMgdm9pZCBkcmF3M0QoQ2hhclNlcXVlbmNlIHN0ciwgZmxvYXQgeCwgZmxvYXQg
eSwgZmxvYXQgeiwNCiAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc2NhbGVGYWN0b3IpIHsN
CiAgICAgICAgaW50ZXJuYWxfZHJhdzNEKHN0ciwgeCwgeSwgeiwgc2NhbGVGYWN0b3IpOw0KICAg
IH0NCg0KICAgIC8qKiBEcmF3cyB0aGUgc3VwcGxpZWQgU3RyaW5nIGF0IHRoZSBkZXNpcmVkIDNE
IGxvY2F0aW9uIHVzaW5nIHRoZQ0KICAgICAgICByZW5kZXJlcidzIGN1cnJlbnQgY29sb3IuIFNl
ZSB7QGxpbmsgI2RyYXczRChDaGFyU2VxdWVuY2UsDQogICAgICAgIGZsb2F0LCBmbG9hdCwgZmxv
YXQsIGZsb2F0KSBkcmF3M0QoQ2hhclNlcXVlbmNlLCBmbG9hdCwgZmxvYXQsDQogICAgICAgIGZs
b2F0LCBmbG9hdCl9LiAqLw0KICAgIHB1YmxpYyB2b2lkIGRyYXczRChTdHJpbmcgc3RyLCBmbG9h
dCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCBzY2FsZUZhY3Rvcikgew0KICAgICAgICBpbnRl
cm5hbF9kcmF3M0Qoc3RyLCB4LCB5LCB6LCBzY2FsZUZhY3Rvcik7DQogICAgfQ0KDQogICAgLyoq
IFJldHVybnMgdGhlIHBpeGVsIHdpZHRoIG9mIHRoZSBnaXZlbiBjaGFyYWN0ZXIuICovDQogICAg
cHVibGljIGZsb2F0IGdldENoYXJXaWR0aChjaGFyIGluQ2hhcikgew0KICAgICAgICByZXR1cm4g
bUdseXBoUHJvZHVjZXIuZ2V0R2x5cGhQaXhlbFdpZHRoKGluQ2hhcik7DQogICAgfQ0KDQogICAg
LyoqIENhdXNlcyB0aGUgVGV4dFJlbmRlcmVyIHRvIGZsdXNoIGFueSBpbnRlcm5hbCBjYWNoZXMg
aXQgbWF5IGJlDQogICAgICAgIG1haW50YWluaW5nIGFuZCBkcmF3IGl0cyByZW5kZXJpbmcgcmVz
dWx0cyB0byB0aGUgc2NyZWVuLiBUaGlzDQogICAgICAgIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIg
ZWFjaCBjYWxsIHRvIGRyYXcoKSBpZiB5b3UgYXJlIHNldHRpbmcNCiAgICAgICAgT3BlbkdMIHN0
YXRlIHN1Y2ggYXMgdGhlIG1vZGVsdmlldyBtYXRyaXggYmV0d2VlbiBjYWxscyB0bw0KICAgICAg
ICBkcmF3KCkuICovDQogICAgcHVibGljIHZvaWQgZmx1c2goKSB7DQogICAgICAgIGZsdXNoR2x5
cGhQaXBlbGluZSgpOw0KICAgIH0NCg0KICAgIC8qKiBFbmRzIGEgcmVuZGVyIGN5Y2xlIHdpdGgg
dGhpcyB7QGxpbmsgVGV4dFJlbmRlcmVyIFRleHRSZW5kZXJlcn0uDQogICAgICAgIFJlc3RvcmVz
IHRoZSBwcm9qZWN0aW9uIGFuZCBtb2RlbHZpZXcgbWF0cmljZXMgYXMgd2VsbCBhcw0KICAgICAg
ICBzZXZlcmFsIE9wZW5HTCBzdGF0ZSBiaXRzLiBTaG91bGQgYmUgcGFpcmVkIHdpdGgge0BsaW5r
DQogICAgICAgICNiZWdpblJlbmRlcmluZyBiZWdpblJlbmRlcmluZ30uDQoNCiAgICAgICAgQHRo
cm93cyBHTEV4Y2VwdGlvbiBJZiBhbiBPcGVuR0wgY29udGV4dCBpcyBub3QgY3VycmVudCB3aGVu
IHRoaXMgbWV0aG9kIGlzIGNhbGxlZA0KICAgICovDQogICAgcHVibGljIHZvaWQgZW5kUmVuZGVy
aW5nKCkgdGhyb3dzIEdMRXhjZXB0aW9uIHsNCiAgICAgICAgZW5kUmVuZGVyaW5nKHRydWUpOw0K
ICAgIH0NCg0KICAgIC8qKiBSZXR1cm5zIHRoZSB3aWR0aCBvZiB0aGUgQVNDSUkgc3BhY2UgY2hh
cmFjdGVyLCBpbiBwaXhlbHMsIGRyYXduDQogICAgICAgIGluIHRoaXMgVGV4dFJlbmRlcmVyJ3Mg
Zm9udCB3aGVuIG5vIHNjYWxpbmcgb3Igcm90YXRpb24gaGFzIGJlZW4NCiAgICAgICAgYXBwbGll
ZC4gVGhpcyBpcyB0aGUgaG9yaXpvbnRhbCBhZHZhbmNlIG9mIHRoZSBzcGFjZSBjaGFyYWN0ZXIu
DQoNCiAgICAgICAgQHJldHVybiB0aGUgd2lkdGggb2YgdGhlIHNwYWNlIGNoYXJhY3RlciBpbiB0
aGUgVGV4dFJlbmRlcmVyJ3MgZm9udA0KICAgICovDQogICAgcHJpdmF0ZSBpbnQgZ2V0U3BhY2VX
aWR0aCgpIHsNCiAgICAgICAgaWYgKHNwYWNlV2lkdGggPCAwKSB7DQogICAgICAgICAgICBHcmFw
aGljczJEIGcgPSBnZXRHcmFwaGljczJEKCk7DQoNCiAgICAgICAgICAgIEZvbnRSZW5kZXJDb250
ZXh0IGZyYyA9IGdldEZvbnRSZW5kZXJDb250ZXh0KCk7DQogICAgICAgICAgICBHbHlwaFZlY3Rv
ciBndiA9IGZvbnQuY3JlYXRlR2x5cGhWZWN0b3IoZnJjLCAiICIpOw0KICAgICAgICAgICAgR2x5
cGhNZXRyaWNzIG1ldHJpY3MgPSBndi5nZXRHbHlwaE1ldHJpY3MoMCk7DQogICAgICAgICAgICBz
cGFjZVdpZHRoID0gKGludCkgbWV0cmljcy5nZXRBZHZhbmNlWCgpOw0KICAgICAgICB9DQoNCiAg
ICAgICAgcmV0dXJuIHNwYWNlV2lkdGg7DQogICAgfQ0KDQogICAgLyoqIEVuZHMgYSAzRCByZW5k
ZXIgY3ljbGUgd2l0aCB0aGlzIHtAbGluayBUZXh0UmVuZGVyZXIgVGV4dFJlbmRlcmVyfS4NCiAg
ICAgICAgUmVzdG9yZXMgc2V2ZXJhbCBPcGVuR0wgc3RhdGUgYml0cy4gU2hvdWxkIGJlIHBhaXJl
ZCB3aXRoIHtAbGluaw0KICAgICAgICAjYmVnaW4zRFJlbmRlcmluZyBiZWdpbjNEUmVuZGVyaW5n
fS4NCg0KICAgICAgICBAdGhyb3dzIEdMRXhjZXB0aW9uIElmIGFuIE9wZW5HTCBjb250ZXh0IGlz
IG5vdCBjdXJyZW50IHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkDQogICAgKi8NCiAgICBwdWJs
aWMgdm9pZCBlbmQzRFJlbmRlcmluZygpIHRocm93cyBHTEV4Y2VwdGlvbiB7DQogICAgICAgIGVu
ZFJlbmRlcmluZyhmYWxzZSk7DQogICAgfQ0KDQogICAgLyoqIERpc3Bvc2VzIG9mIGFsbCByZXNv
dXJjZXMgdGhpcyBUZXh0UmVuZGVyZXIgaXMgdXNpbmcuIEl0IGlzIG5vdA0KICAgICAgICB2YWxp
ZCB0byB1c2UgdGhlIFRleHRSZW5kZXJlciBhZnRlciB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuDQoN
CiAgICAgICAgQHRocm93cyBHTEV4Y2VwdGlvbiBJZiBhbiBPcGVuR0wgY29udGV4dCBpcyBub3Qg
Y3VycmVudCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZA0KICAgICovDQogICAgcHVibGljIHZv
aWQgZGlzcG9zZSgpIHRocm93cyBHTEV4Y2VwdGlvbiB7DQogICAgICAgIHBhY2tlci5kaXNwb3Nl
KCk7DQogICAgICAgIHBhY2tlciA9IG51bGw7DQogICAgICAgIGNhY2hlZEJhY2tpbmdTdG9yZSA9
IG51bGw7DQogICAgICAgIGNhY2hlZEdyYXBoaWNzID0gbnVsbDsNCiAgICAgICAgY2FjaGVkRm9u
dFJlbmRlckNvbnRleHQgPSBudWxsOw0KDQogICAgICAgIGlmIChkYmdGcmFtZSAhPSBudWxsKSB7
DQogICAgICAgICAgICBkYmdGcmFtZS5kaXNwb3NlKCk7DQogICAgICAgIH0NCiAgICB9DQoNCiAg
ICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0NCiAgICAvLyBJbnRlcm5hbHMgb25seSBiZWxvdyB0aGlzIHBvaW50
DQogICAgLy8NCiAgICBwcml2YXRlIHN0YXRpYyBSZWN0YW5nbGUyRCBub3JtYWxpemUoUmVjdGFu
Z2xlMkQgc3JjKSB7DQogICAgICAgIC8vIEdpdmUgb3Vyc2VsdmVzIGEgb25lLXBpeGVsIGJvdW5k
YXJ5IGFyb3VuZCBlYWNoIHN0cmluZyBpbiBvcmRlcg0KICAgICAgICAvLyB0byBwcmV2ZW50IGJs
ZWVkaW5nIG9mIG5lYXJieSBTdHJpbmdzIGR1ZSB0byB0aGUgZmFjdCB0aGF0IHdlDQogICAgICAg
IC8vIHVzZSBsaW5lYXIgZmlsdGVyaW5nDQogICAgICAgIHJldHVybiBuZXcgUmVjdGFuZ2xlMkQu
RG91YmxlKChpbnQpIE1hdGguZmxvb3Ioc3JjLmdldE1pblgoKSAtIDEpLA0KICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBNYXRoLmZsb29yKHNyYy5nZXRNaW5ZKCkg
LSAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgTWF0aC5j
ZWlsKHNyYy5nZXRXaWR0aCgpICsgMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIChpbnQpIE1hdGguY2VpbChzcmMuZ2V0SGVpZ2h0KCkpICsgMik7DQogICAgfQ0KDQog
ICAgcHJpdmF0ZSBUZXh0dXJlUmVuZGVyZXIgZ2V0QmFja2luZ1N0b3JlKCkgew0KICAgICAgICBU
ZXh0dXJlUmVuZGVyZXIgcmVuZGVyZXIgPSAoVGV4dHVyZVJlbmRlcmVyKSBwYWNrZXIuZ2V0QmFj
a2luZ1N0b3JlKCk7DQoNCiAgICAgICAgaWYgKHJlbmRlcmVyICE9IGNhY2hlZEJhY2tpbmdTdG9y
ZSkgew0KICAgICAgICAgICAgLy8gQmFja2luZyBzdG9yZSBjaGFuZ2VkIHNpbmNlIGxhc3QgdGlt
ZTsgZGlzY2FyZCBhbnkgY2FjaGVkIEdyYXBoaWNzMkQNCiAgICAgICAgICAgIGlmIChjYWNoZWRH
cmFwaGljcyAhPSBudWxsKSB7DQogICAgICAgICAgICAgICAgY2FjaGVkR3JhcGhpY3MuZGlzcG9z
ZSgpOw0KICAgICAgICAgICAgICAgIGNhY2hlZEdyYXBoaWNzID0gbnVsbDsNCiAgICAgICAgICAg
ICAgICBjYWNoZWRGb250UmVuZGVyQ29udGV4dCA9IG51bGw7DQogICAgICAgICAgICB9DQoNCiAg
ICAgICAgICAgIGNhY2hlZEJhY2tpbmdTdG9yZSA9IHJlbmRlcmVyOw0KICAgICAgICB9DQoNCiAg
ICAgICAgcmV0dXJuIGNhY2hlZEJhY2tpbmdTdG9yZTsNCiAgICB9DQoNCiAgICBwcml2YXRlIEdy
YXBoaWNzMkQgZ2V0R3JhcGhpY3MyRCgpIHsNCiAgICAgICAgVGV4dHVyZVJlbmRlcmVyIHJlbmRl
cmVyID0gZ2V0QmFja2luZ1N0b3JlKCk7DQoNCiAgICAgICAgaWYgKGNhY2hlZEdyYXBoaWNzID09
IG51bGwpIHsNCiAgICAgICAgICAgIGNhY2hlZEdyYXBoaWNzID0gcmVuZGVyZXIuY3JlYXRlR3Jh
cGhpY3MoKTsNCg0KICAgICAgICAgICAgLy8gU2V0IHVwIGNvbXBvc2l0ZSwgZm9udCBhbmQgcmVu
ZGVyaW5nIGhpbnRzDQogICAgICAgICAgICBjYWNoZWRHcmFwaGljcy5zZXRDb21wb3NpdGUoQWxw
aGFDb21wb3NpdGUuU3JjKTsNCiAgICAgICAgICAgIGNhY2hlZEdyYXBoaWNzLnNldENvbG9yKENv
bG9yLldISVRFKTsNCiAgICAgICAgICAgIGNhY2hlZEdyYXBoaWNzLnNldEZvbnQoZm9udCk7DQog
ICAgICAgICAgICBjYWNoZWRHcmFwaGljcy5zZXRSZW5kZXJpbmdIaW50KFJlbmRlcmluZ0hpbnRz
LktFWV9URVhUX0FOVElBTElBU0lORywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKGFudGlhbGlhc2VkID8gUmVuZGVyaW5nSGludHMuVkFMVUVfVEVYVF9BTlRJ
QUxJQVNfT04NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDog
UmVuZGVyaW5nSGludHMuVkFMVUVfVEVYVF9BTlRJQUxJQVNfT0ZGKSk7DQogICAgICAgICAgICBj
YWNoZWRHcmFwaGljcy5zZXRSZW5kZXJpbmdIaW50KFJlbmRlcmluZ0hpbnRzLktFWV9GUkFDVElP
TkFMTUVUUklDUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
KHVzZUZyYWN0aW9uYWxNZXRyaWNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICA/IFJlbmRlcmluZ0hpbnRzLlZBTFVFX0ZSQUNUSU9OQUxNRVRSSUNTX09ODQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFJlbmRlcmluZ0hp
bnRzLlZBTFVFX0ZSQUNUSU9OQUxNRVRSSUNTX09GRikpOw0KICAgICAgICB9DQoNCiAgICAgICAg
cmV0dXJuIGNhY2hlZEdyYXBoaWNzOw0KICAgIH0NCg0KICAgIHByaXZhdGUgdm9pZCBiZWdpblJl
bmRlcmluZyhib29sZWFuIG9ydGhvLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsDQogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGlzYWJsZURlcHRoVGVzdEZvck9ydGhvKSB7
DQogICAgICAgIGlmIChERUJVRyAmJiAhZGVidWdnZWQpIHsNCiAgICAgICAgICAgIGRlYnVnKCk7
DQogICAgICAgIH0NCg0KICAgICAgICBpbkJlZ2luRW5kUGFpciA9IHRydWU7DQogICAgICAgIGlz
T3J0aG9Nb2RlID0gb3J0aG87DQogICAgICAgIGJlZ2luUmVuZGVyaW5nV2lkdGggPSB3aWR0aDsN
CiAgICAgICAgYmVnaW5SZW5kZXJpbmdIZWlnaHQgPSBoZWlnaHQ7DQogICAgICAgIGJlZ2luUmVu
ZGVyaW5nRGVwdGhUZXN0RGlzYWJsZWQgPSBkaXNhYmxlRGVwdGhUZXN0Rm9yT3J0aG87DQoNCiAg
ICAgICAgaWYgKG9ydGhvKSB7DQogICAgICAgICAgICBnZXRCYWNraW5nU3RvcmUoKS5iZWdpbk9y
dGhvUmVuZGVyaW5nKHdpZHRoLCBoZWlnaHQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVEZXB0aFRlc3RGb3JPcnRobyk7DQogICAgICAg
IH0gZWxzZSB7DQogICAgICAgICAgICBnZXRCYWNraW5nU3RvcmUoKS5iZWdpbjNEUmVuZGVyaW5n
KCk7DQogICAgICAgIH0NCg0KICAgICAgICBHTCBnbCA9IEdMVS5nZXRDdXJyZW50R0woKTsNCg0K
ICAgICAgICAvLyBQdXNoIGNsaWVudCBhdHRyaWIgYml0cyB1c2VkIGJ5IHRoZSBwaXBlbGluZWQg
cXVhZCByZW5kZXJlcg0KICAgICAgICBnbC5nbFB1c2hDbGllbnRBdHRyaWIoKGludCkgR0wuR0xf
QUxMX0NMSUVOVF9BVFRSSUJfQklUUyk7DQoNCiAgICAgICAgaWYgKCFoYXZlTWF4U2l6ZSkgew0K
ICAgICAgICAgICAgLy8gUXVlcnkgT3BlbkdMIGZvciB0aGUgbWF4aW11bSB0ZXh0dXJlIHNpemUg
YW5kIHNldCBpdCBpbiB0aGUNCiAgICAgICAgICAgIC8vIFJlY3RhbmdsZVBhY2tlciB0byBrZWVw
IGl0IGZyb20gZXhwYW5kaW5nIHRvbyBsYXJnZQ0KICAgICAgICAgICAgaW50W10gc3ogPSBuZXcg
aW50WzFdOw0KICAgICAgICAgICAgZ2wuZ2xHZXRJbnRlZ2VydihHTC5HTF9NQVhfVEVYVFVSRV9T
SVpFLCBzeiwgMCk7DQogICAgICAgICAgICBwYWNrZXIuc2V0TWF4U2l6ZShzelswXSwgc3pbMF0p
Ow0KICAgICAgICAgICAgaGF2ZU1heFNpemUgPSB0cnVlOw0KICAgICAgICB9DQoNCiAgICAgICAg
aWYgKG5lZWRUb1Jlc2V0Q29sb3IgJiYgaGF2ZUNhY2hlZENvbG9yKSB7DQogICAgICAgICAgICBp
ZiAoY2FjaGVkQ29sb3IgPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgIGdldEJhY2tpbmdTdG9y
ZSgpLnNldENvbG9yKGNhY2hlZFIsIGNhY2hlZEcsIGNhY2hlZEIsIGNhY2hlZEEpOw0KICAgICAg
ICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBnZXRCYWNraW5nU3RvcmUoKS5zZXRDb2xv
cihjYWNoZWRDb2xvcik7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIG5lZWRUb1Jlc2V0
Q29sb3IgPSBmYWxzZTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIERpc2FibGUgZnV0dXJlIGF0
dGVtcHRzIHRvIHVzZSBtaXBtYXBwaW5nIGlmIFRleHR1cmVSZW5kZXJlcg0KICAgICAgICAvLyBk
b2Vzbid0IHN1cHBvcnQgaXQNCiAgICAgICAgaWYgKG1pcG1hcCAmJiAhZ2V0QmFja2luZ1N0b3Jl
KCkuaXNVc2luZ0F1dG9NaXBtYXBHZW5lcmF0aW9uKCkpIHsNCiAgICAgICAgICAgIGlmIChERUJV
Rykgew0KICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRGlzYWJsZWQgbWlwbWFw
cGluZyBpbiBUZXh0UmVuZGVyZXIiKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgbWlw
bWFwID0gZmFsc2U7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBlbXppYzog
aGVyZSB0aGUgY2FsbCB0byBnbEJpbmRCdWZmZXIgY3Jhc2hlcyBvbiBjZXJ0YWluIGdyYXBoaWNz
Y2FyZC9kcml2ZXIgY29tYmluYXRpb25zDQogICAgICogdGhpcyBpcyB3aHkgdGhlIHVnbHkgdHJ5
LWNhdGNoIGJsb2NrIGhhcyBiZWVuIGFkZGVkLCB3aGljaCBmYWxscyBiYWNrIHRvIHRoZSBvbGQg
dGV4dHJlbmRlcmVyDQogICAgICogDQogICAgICogQHBhcmFtIG9ydGhvDQogICAgICogQHRocm93
cyBHTEV4Y2VwdGlvbg0KICAgICAqLw0KICAgIHByaXZhdGUgdm9pZCBlbmRSZW5kZXJpbmcoYm9v
bGVhbiBvcnRobykgdGhyb3dzIEdMRXhjZXB0aW9uIHsNCiAgICAgICAgZmx1c2hHbHlwaFBpcGVs
aW5lKCk7DQoNCiAgICAgICAgaW5CZWdpbkVuZFBhaXIgPSBmYWxzZTsNCg0KICAgICAgICBHTCBn
bCA9IEdMVS5nZXRDdXJyZW50R0woKTsNCg0KICAgICAgICAvLyBQb3AgY2xpZW50IGF0dHJpYiBi
aXRzIHVzZWQgYnkgdGhlIHBpcGVsaW5lZCBxdWFkIHJlbmRlcmVyDQogICAgICAgIGdsLmdsUG9w
Q2xpZW50QXR0cmliKCk7DQoNCiAgICAgICAgLy8gVGhlIE9wZW5HTCBzcGVjIGlzIHVuY2xlYXIg
YWJvdXQgd2hldGhlciB0aGlzIGNoYW5nZXMgdGhlDQogICAgICAgIC8vIGJ1ZmZlciBiaW5kaW5n
cywgc28gcHJlZW1wdGl2ZWx5IHplcm8gb3V0IHRoZSBHTF9BUlJBWV9CVUZGRVINCiAgICAgICAg
Ly8gYmluZGluZw0KICAgICAgICBpZiAoIWNoZWNrRm9yX2lzRXh0ZW5zaW9uQXZhaWxhYmxlX0dM
X1ZFUlNJT05fMV81KSB7DQogICAgICAgIAlpc0V4dGVuc2lvbkF2YWlsYWJsZV9HTF9WRVJTSU9O
XzFfNSA9IGdsLmlzRXh0ZW5zaW9uQXZhaWxhYmxlKCJHTF9WRVJTSU9OXzFfNSIpOw0KICAgICAg
ICAJY2hlY2tGb3JfaXNFeHRlbnNpb25BdmFpbGFibGVfR0xfVkVSU0lPTl8xXzUgPSB0cnVlOw0K
ICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBpZiAoaXNFeHRlbnNpb25BdmFpbGFibGVfR0xf
VkVSU0lPTl8xXzUpIHsNCgkgICAgICAgIHRyeSB7DQoJICAgICAgICAgICAgZ2wuZ2xCaW5kQnVm
ZmVyKEdMLkdMX0FSUkFZX0JVRkZFUiwgMCk7DQoJICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24g
ZSkgew0KCSAgICAgICAgCWlzRXh0ZW5zaW9uQXZhaWxhYmxlX0dMX1ZFUlNJT05fMV81ID0gZmFs
c2U7DQoJICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBpZiAob3J0aG8pIHsNCiAgICAg
ICAgICAgIGdldEJhY2tpbmdTdG9yZSgpLmVuZE9ydGhvUmVuZGVyaW5nKCk7DQogICAgICAgIH0g
ZWxzZSB7DQogICAgICAgICAgICBnZXRCYWNraW5nU3RvcmUoKS5lbmQzRFJlbmRlcmluZygpOw0K
ICAgICAgICB9DQoNCiAgICAgICAgaWYgKCsrbnVtUmVuZGVyQ3ljbGVzID49IENZQ0xFU19QRVJf
RkxVU0gpIHsNCiAgICAgICAgICAgIG51bVJlbmRlckN5Y2xlcyA9IDA7DQoNCiAgICAgICAgICAg
IGlmIChERUJVRykgew0KICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ2xlYXJp
bmcgdW51c2VkIGVudHJpZXMgaW4gZW5kUmVuZGVyaW5nKCkiKTsNCiAgICAgICAgICAgIH0NCg0K
ICAgICAgICAgICAgY2xlYXJVbnVzZWRFbnRyaWVzKCk7DQogICAgICAgIH0NCiAgICB9DQoNCiAg
ICBwcml2YXRlIHZvaWQgdG9rZW5pemUoQ2hhclNlcXVlbmNlIHN0cikgew0KICAgICAgICAvLyBB
dm9pZCBsb3RzIG9mIGxpdHRsZSBhbGxvY2F0aW9ucyBwZXIgcmVuZGVyDQogICAgICAgIHRva2Vu
aXphdGlvblJlc3VsdHMuY2xlYXIoKTsNCg0KICAgICAgICBpZiAoIXNwbGl0QXRTcGFjZXMpIHsN
CiAgICAgICAgICAgIHRva2VuaXphdGlvblJlc3VsdHMuYWRkKHN0ci50b1N0cmluZygpKTsNCiAg
ICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGludCBzdGFydENoYXIgPSAwOw0KICAgICAgICAg
ICAgY2hhciBjID0gKGNoYXIpIDA7DQogICAgICAgICAgICBpbnQgbGVuID0gc3RyLmxlbmd0aCgp
Ow0KICAgICAgICAgICAgaW50IGkgPSAwOw0KDQogICAgICAgICAgICB3aGlsZSAoaSA8IGxlbikg
ew0KICAgICAgICAgICAgICAgIGlmIChzdHIuY2hhckF0KGkpID09ICcgJykgew0KICAgICAgICAg
ICAgICAgICAgICAvLyBUZXJtaW5hdGUgYW55IHN1YnN0cmluZw0KICAgICAgICAgICAgICAgICAg
ICBpZiAoc3RhcnRDaGFyIDwgaSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5pemF0
aW9uUmVzdWx0cy5hZGQoc3RyLnN1YlNlcXVlbmNlKHN0YXJ0Q2hhciwgaSkNCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpKTsNCiAgICAg
ICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuaXph
dGlvblJlc3VsdHMuYWRkKG51bGwpOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAg
ICAgICAgICAgICAgc3RhcnRDaGFyID0gaSArIDE7DQogICAgICAgICAgICAgICAgfQ0KDQogICAg
ICAgICAgICAgICAgKytpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLyBBZGQgb24g
YW55IHJlbWFpbmluZyAoYWxsPykgY2hhcmFjdGVycw0KICAgICAgICAgICAgaWYgKHN0YXJ0Q2hh
ciA9PSAwKSB7DQogICAgICAgICAgICAgICAgdG9rZW5pemF0aW9uUmVzdWx0cy5hZGQoc3RyKTsN
CiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRDaGFyIDwgbGVuKSB7DQogICAgICAgICAgICAg
ICAgdG9rZW5pemF0aW9uUmVzdWx0cy5hZGQoc3RyLnN1YlNlcXVlbmNlKHN0YXJ0Q2hhciwgbGVu
KQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpKTsN
CiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHByaXZhdGUgdm9pZCBjbGVh
clVudXNlZEVudHJpZXMoKSB7DQogICAgICAgIGZpbmFsIGphdmEudXRpbC5MaXN0IGRlYWRSZWN0
cyA9IG5ldyBBcnJheUxpc3QgLyo8UmVjdD4qLygpOw0KDQogICAgICAgIC8vIEl0ZXJhdGUgdGhy
b3VnaCB0aGUgY29udGVudHMgb2YgdGhlIGJhY2tpbmcgc3RvcmUsIHJlbW92aW5nDQogICAgICAg
IC8vIHRleHQgc3RyaW5ncyB0aGF0IGhhdmVuJ3QgYmVlbiB1c2VkIHJlY2VudGx5DQogICAgICAg
IHBhY2tlci52aXNpdChuZXcgUmVjdFZpc2l0b3IoKSB7DQogICAgICAgICAgICAgICAgcHVibGlj
IHZvaWQgdmlzaXQoUmVjdCByZWN0KSB7DQogICAgICAgICAgICAgICAgICAgIFRleHREYXRhIGRh
dGEgPSAoVGV4dERhdGEpIHJlY3QuZ2V0VXNlckRhdGEoKTsNCg0KICAgICAgICAgICAgICAgICAg
ICBpZiAoZGF0YS51c2VkKCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY2xlYXJV
c2VkKCk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAg
ICAgICBkZWFkUmVjdHMuYWRkKHJlY3QpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAg
ICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgZm9yIChJdGVyYXRvciBpdGVy
ID0gZGVhZFJlY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgew0KICAgICAgICAgICAg
UmVjdCByID0gKFJlY3QpIGl0ZXIubmV4dCgpOw0KICAgICAgICAgICAgcGFja2VyLnJlbW92ZShy
KTsNCiAgICAgICAgICAgIHN0cmluZ0xvY2F0aW9ucy5yZW1vdmUoKChUZXh0RGF0YSkgci5nZXRV
c2VyRGF0YSgpKS5zdHJpbmcoKSk7DQoNCiAgICAgICAgICAgIGludCB1bmljb2RlVG9DbGVhckZy
b21DYWNoZSA9ICgoVGV4dERhdGEpIHIuZ2V0VXNlckRhdGEoKSkudW5pY29kZUlEOw0KDQogICAg
ICAgICAgICBpZiAodW5pY29kZVRvQ2xlYXJGcm9tQ2FjaGUgPiAwKSB7DQogICAgICAgICAgICAg
ICAgbUdseXBoUHJvZHVjZXIuY2xlYXJDYWNoZUVudHJ5KHVuaWNvZGVUb0NsZWFyRnJvbUNhY2hl
KTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8gICAgICBpZiAoREVCVUcpIHsNCiAg
ICAgICAgICAgIC8vICAgICAgICBHcmFwaGljczJEIGcgPSBnZXRHcmFwaGljczJEKCk7DQogICAg
ICAgICAgICAvLyAgICAgICAgZy5zZXRDb21wb3NpdGUoQWxwaGFDb21wb3NpdGUuQ2xlYXIpOw0K
ICAgICAgICAgICAgLy8gICAgICAgIGcuZmlsbFJlY3Qoci54KCksIHIueSgpLCByLncoKSwgci5o
KCkpOw0KICAgICAgICAgICAgLy8gICAgICAgIGcuc2V0Q29tcG9zaXRlKEFscGhhQ29tcG9zaXRl
LlNyYyk7DQogICAgICAgICAgICAvLyAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIC8vIElm
IHdlIHJlbW92ZWQgZGVhZCByZWN0YW5nbGVzIHRoaXMgY3ljbGUsIHRyeSB0byBkbyBhIGNvbXBh
Y3Rpb24NCiAgICAgICAgZmxvYXQgZnJhZyA9IHBhY2tlci52ZXJ0aWNhbEZyYWdtZW50YXRpb25S
YXRpbygpOw0KDQogICAgICAgIGlmICghZGVhZFJlY3RzLmlzRW1wdHkoKSAmJiAoZnJhZyA+IE1B
WF9WRVJUSUNBTF9GUkFHTUVOVEFUSU9OKSkgew0KICAgICAgICAgICAgaWYgKERFQlVHKSB7DQog
ICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKA0KICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAiQ29tcGFjdGluZyBUZXh0UmVuZGVyZXIgYmFja2luZyBzdG9yZSBkdWUg
dG8gdmVydGljYWwgZnJhZ21lbnRhdGlvbiAiICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZnJhZyk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHBhY2tlci5jb21w
YWN0KCk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoREVCVUcpIHsNCiAgICAgICAgICAgIGdl
dEJhY2tpbmdTdG9yZSgpLm1hcmtEaXJ0eSgwLCAwLCBnZXRCYWNraW5nU3RvcmUoKS5nZXRXaWR0
aCgpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEJhY2tpbmdT
dG9yZSgpLmdldEhlaWdodCgpKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHByaXZhdGUgdm9p
ZCBpbnRlcm5hbF9kcmF3M0QoQ2hhclNlcXVlbmNlIHN0ciwgZmxvYXQgeCwgZmxvYXQgeSwgZmxv
YXQgeiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNjYWxlRmFjdG9y
KSB7DQogICAgICAgIGludCBkcmF3aW5nU3RhdGUgPSBEcmF3aW5nU3RhdGUuZmFzdDsNCg0KICAg
ICAgICB3aGlsZSAoZHJhd2luZ1N0YXRlICE9IERyYXdpbmdTdGF0ZS5maW5pc2hlZCkgew0KICAg
ICAgICAgICAgR2x5cGhzTGlzdCBnbHlwaHMgPSBtR2x5cGhQcm9kdWNlci5nZXRHbHlwaHMoc3Ry
KTsNCg0KICAgICAgICAgICAgaWYgKGRyYXdpbmdTdGF0ZSA9PSBEcmF3aW5nU3RhdGUuZmFzdCkg
ew0KICAgICAgICAgICAgICAgIHggKz0gZHJhd0dseXBocyhnbHlwaHMsIHgsIHksIHosIHNjYWxl
RmFjdG9yKTsNCiAgICAgICAgICAgICAgICBzdHIgPSBnbHlwaHMucmVtYWluaW5nOw0KICAgICAg
ICAgICAgICAgIGRyYXdpbmdTdGF0ZSA9IGdseXBocy5uZXh0U3RhdGU7DQogICAgICAgICAgICB9
IGVsc2UgaWYgKGRyYXdpbmdTdGF0ZSA9PSBEcmF3aW5nU3RhdGUucm9idXN0KSB7DQogICAgICAg
ICAgICAgICAgdGhpcy5kcmF3M0RfUk9CVVNUKHN0ciwgeCwgeSwgeiwgc2NhbGVGYWN0b3IpOw0K
ICAgICAgICAgICAgICAgIGRyYXdpbmdTdGF0ZSA9IERyYXdpbmdTdGF0ZS5maW5pc2hlZDsNCiAg
ICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHByaXZhdGUgdm9pZCBmbHVzaEds
eXBoUGlwZWxpbmUoKSB7DQogICAgICAgIGlmIChtUGlwZWxpbmVkUXVhZFJlbmRlcmVyICE9IG51
bGwpIHsNCiAgICAgICAgICAgIG1QaXBlbGluZWRRdWFkUmVuZGVyZXIuZHJhdygpOw0KICAgICAg
ICB9DQogICAgfQ0KDQogICAgcHJpdmF0ZSBmbG9hdCBkcmF3R2x5cGhzKEdseXBoc0xpc3QgaW5H
bHlwaHMsIGZsb2F0IGluWCwgZmxvYXQgaW5ZLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBmbG9hdCB6LCBmbG9hdCBzY2FsZUZhY3Rvcikgew0KICAgICAgICBmbG9hdCB4T2Zmc2V0ID0g
MDsNCg0KICAgICAgICB0cnkgew0KICAgICAgICAgICAgaWYgKG1QaXBlbGluZWRRdWFkUmVuZGVy
ZXIgPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgIG1QaXBlbGluZWRRdWFkUmVuZGVyZXIgPSBu
ZXcgUGlwZWxpbmVkX1F1YWRSZW5kZXJlcigpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAg
ICBUZXh0dXJlUmVuZGVyZXIgcmVuZGVyZXIgPSBnZXRCYWNraW5nU3RvcmUoKTsNCiAgICAgICAg
ICAgIC8vIEhhbmRsZXMgY2FzZSB3aGVyZSBOUE9UIHRleHR1cmUgaXMgdXNlZCBmb3IgYmFja2lu
ZyBzdG9yZQ0KICAgICAgICAgICAgVGV4dHVyZUNvb3JkcyB3aG9sZUltYWdlVGV4Q29vcmRzID0g
cmVuZGVyZXIuZ2V0VGV4dHVyZSgpLmdldEltYWdlVGV4Q29vcmRzKCk7DQogICAgICAgICAgICBm
bG9hdCB4U2NhbGUgPSB3aG9sZUltYWdlVGV4Q29vcmRzLnJpZ2h0KCk7DQogICAgICAgICAgICBm
bG9hdCB5U2NhbGUgPSB3aG9sZUltYWdlVGV4Q29vcmRzLmJvdHRvbSgpOw0KDQogICAgICAgICAg
ICBmb3IgKGludCBpID0gMDsgaSA8IGluR2x5cGhzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAg
ICAgICAgUmVjdCByZWN0ID0gaW5HbHlwaHMudGV4dHVyZVNvdXJjZVJlY3RbaV07DQogICAgICAg
ICAgICAgICAgVGV4dERhdGEgZGF0YSA9IChUZXh0RGF0YSkgcmVjdC5nZXRVc2VyRGF0YSgpOw0K
ICAgICAgICAgICAgICAgIGRhdGEubWFya1VzZWQoKTsNCg0KICAgICAgICAgICAgICAgIGZsb2F0
IHggPSAoaW5YICsgeE9mZnNldCkgLSAoc2NhbGVGYWN0b3IgKiBkYXRhLm9yaWdpbigpLngpOw0K
ICAgICAgICAgICAgICAgIGZsb2F0IHkgPSBpblkgLSAoc2NhbGVGYWN0b3IgKiAocmVjdC5oKCkg
LSBkYXRhLm9yaWdpbigpLnkpKTsNCg0KICAgICAgICAgICAgICAgIGludCB0ZXh0dXJleCA9IHJl
Y3QueCgpOyAvLyBhdm9pZCBvdmVycHVtcCBvZiB0ZXh0dXJlVXBsb2FkIHBhdGggYnkgbm90IHRy
aWdnZXJpbmcgc3luYyBldmVyeSBxdWFkLCBpbnN0ZWFkIGRvaW5nIGl0IG9uIGZsdXNoR2x5cGhQ
aXBlbGluZQ0KICAgICAgICAgICAgICAgIGludCB0ZXh0dXJleSA9IHJlbmRlcmVyLmdldEhlaWdo
dCgpIC0gcmVjdC55KCkgLSByZWN0LmgoKTsNCiAgICAgICAgICAgICAgICBpbnQgd2lkdGggPSBy
ZWN0LncoKTsNCiAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gcmVjdC5oKCk7DQoNCiAgICAg
ICAgICAgICAgICBmbG9hdCB0eDEgPSB4U2NhbGUgKiAoZmxvYXQpIHRleHR1cmV4IC8gKGZsb2F0
KSByZW5kZXJlci5nZXRXaWR0aCgpOw0KICAgICAgICAgICAgICAgIGZsb2F0IHR5MSA9IHlTY2Fs
ZSAqICgxLjBmIC0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChmbG9h
dCkgdGV4dHVyZXkgLyAoZmxvYXQpIHJlbmRlcmVyLmdldEhlaWdodCgpKSk7DQogICAgICAgICAg
ICAgICAgZmxvYXQgdHgyID0geFNjYWxlICogKGZsb2F0KSAodGV4dHVyZXggKyB3aWR0aCkgLyAo
ZmxvYXQpIHJlbmRlcmVyLmdldFdpZHRoKCk7DQogICAgICAgICAgICAgICAgZmxvYXQgdHkyID0g
eVNjYWxlICogKDEuMGYgLQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo
KGZsb2F0KSAodGV4dHVyZXkgKyBoZWlnaHQpIC8gKGZsb2F0KSByZW5kZXJlci5nZXRIZWlnaHQo
KSkpOw0KDQogICAgICAgICAgICAgICAgbVBpcGVsaW5lZFF1YWRSZW5kZXJlci5nbFRleENvb3Jk
MmYodHgxLCB0eTEpOw0KICAgICAgICAgICAgICAgIG1QaXBlbGluZWRRdWFkUmVuZGVyZXIuZ2xW
ZXJ0ZXgzZih4LCB5LCB6KTsNCiAgICAgICAgICAgICAgICBtUGlwZWxpbmVkUXVhZFJlbmRlcmVy
LmdsVGV4Q29vcmQyZih0eDIsIHR5MSk7DQogICAgICAgICAgICAgICAgbVBpcGVsaW5lZFF1YWRS
ZW5kZXJlci5nbFZlcnRleDNmKHggKyAod2lkdGggKiBzY2FsZUZhY3RvciksIHksDQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHopOw0KICAgICAgICAg
ICAgICAgIG1QaXBlbGluZWRRdWFkUmVuZGVyZXIuZ2xUZXhDb29yZDJmKHR4MiwgdHkyKTsNCiAg
ICAgICAgICAgICAgICBtUGlwZWxpbmVkUXVhZFJlbmRlcmVyLmdsVmVydGV4M2YoeCArICh3aWR0
aCAqIHNjYWxlRmFjdG9yKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgeSArIChoZWlnaHQgKiBzY2FsZUZhY3RvciksIHopOw0KICAgICAgICAgICAg
ICAgIG1QaXBlbGluZWRRdWFkUmVuZGVyZXIuZ2xUZXhDb29yZDJmKHR4MSwgdHkyKTsNCiAgICAg
ICAgICAgICAgICBtUGlwZWxpbmVkUXVhZFJlbmRlcmVyLmdsVmVydGV4M2YoeCwNCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSArIChoZWlnaHQgKiBz
Y2FsZUZhY3RvciksIHopOw0KDQogICAgICAgICAgICAgICAgeE9mZnNldCArPSAoaW5HbHlwaHMu
YWR2YW5jZXNbaV0gKiBzY2FsZUZhY3Rvcik7IC8vIG5vdGUgdGhlIGFkdmFuY2VzLi4gSSBoYWQg
dG8gdXNlIHRoaXMgdG8gZ2V0IHByb3BlciBrZXJuaW5nLg0KICAgICAgICAgICAgfQ0KICAgICAg
ICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2Uo
KTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiB4T2Zmc2V0Ow0KICAgIH0NCg0KICAgIHBy
aXZhdGUgZmxvYXQgZHJhd0dseXBoc1NJTVBMRShHbHlwaHNMaXN0IGluR2x5cGhzLCBmbG9hdCB4
LCBmbG9hdCB5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB6LCBm
bG9hdCBzY2FsZUZhY3RvcikgLy8gdW51c2VkLCBmb3IgcmVmZXJlbmNlLCBkZWJ1Z2dpbmcNCiAg
ICB7DQogICAgICAgIFRleHR1cmVSZW5kZXJlciByZW5kZXJlciA9IGdldEJhY2tpbmdTdG9yZSgp
Ow0KDQogICAgICAgIGludCB4T2Zmc2V0ID0gMDsNCg0KICAgICAgICBmb3IgKGludCBpID0gMDsg
aSA8IGluR2x5cGhzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBSZWN0IHJlY3QgPSBpbkds
eXBocy50ZXh0dXJlU291cmNlUmVjdFtpXTsNCg0KICAgICAgICAgICAgaWYgKHJlY3QgIT0gbnVs
bCkgew0KICAgICAgICAgICAgICAgIFRleHREYXRhIGRhdGEgPSAoVGV4dERhdGEpIHJlY3QuZ2V0
VXNlckRhdGEoKTsNCiAgICAgICAgICAgICAgICBkYXRhLm1hcmtVc2VkKCk7DQoNCiAgICAgICAg
ICAgICAgICByZW5kZXJlci5kcmF3M0RSZWN0KCh4ICsgeE9mZnNldCkgLQ0KICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgKHNjYWxlRmFjdG9yICogZGF0YS5vcmlnaW4oKS54KSwg
Ly8gZm9yY2VzIHVwbG9hZCBldmVyeSBuZXcgZ2x5cGgNCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHkgLSAoc2NhbGVGYWN0b3IgKiAocmVjdC5oKCkgLSBkYXRhLm9yaWdpbigp
LnkpKSwgeiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QueCgpLCBy
ZW5kZXJlci5nZXRIZWlnaHQoKSAtIHJlY3QueSgpIC0gcmVjdC5oKCksDQogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICByZWN0LncoKSwgcmVjdC5oKCksIHNjYWxlRmFjdG9yKTsN
Cg0KICAgICAgICAgICAgICAgIHhPZmZzZXQgKz0gKGludCkgKCgoaW5HbHlwaHMuYWR2YW5jZXNb
aV0pICogc2NhbGVGYWN0b3IpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAw
LjVmKTsgLy8gbm90ZSB0aGUgYWR2YW5jZXMuLiBJIGhhZCB0byB1c2UgdGhpcyB0byBnZXQgcHJv
cGVyIGtlcm5pbmcuDQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4g
eE9mZnNldDsNCiAgICB9DQoNCiAgICBwcml2YXRlIHZvaWQgZHJhdzNEX1JPQlVTVChDaGFyU2Vx
dWVuY2Ugc3RyLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LA0KICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGZsb2F0IHNjYWxlRmFjdG9yKSB7DQogICAgICAgIC8vIFNwbGl0IHVwIHRo
ZSBzdHJpbmcgaW50byBzcGFjZS1zZXBhcmF0ZWQgcGllY2VzDQogICAgICAgIHRva2VuaXplKHN0
cik7DQoNCiAgICAgICAgaW50IHhPZmZzZXQgPSAwOw0KDQogICAgICAgIGZvciAoSXRlcmF0b3Ig
aXRlciA9IHRva2VuaXphdGlvblJlc3VsdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7
DQogICAgICAgICAgICBTdHJpbmcgY3VyU3RyID0gKFN0cmluZykgaXRlci5uZXh0KCk7IC8vIG5v
IHRva2VuaXphdGlvbiBuZWVkZWQsIGJlY2F1c2UgaXQgd2FzIGRvbmUgdG8gc2hyaW5rICMgb2Yg
dW5pcXVlcw0KDQogICAgICAgICAgICBpZiAoY3VyU3RyICE9IG51bGwpIHsNCiAgICAgICAgICAg
ICAgICAvLyBMb29rIHVwIHRoZSBzdHJpbmcgb24gdGhlIGJhY2tpbmcgc3RvcmUNCiAgICAgICAg
ICAgICAgICBSZWN0IHJlY3QgPSAoUmVjdCkgc3RyaW5nTG9jYXRpb25zLmdldChjdXJTdHIpOw0K
DQogICAgICAgICAgICAgICAgaWYgKHJlY3QgPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAg
ICAvLyBSYXN0ZXJpemUgdGhpcyBzdHJpbmcgYW5kIHBsYWNlIGl0IG9uIHRoZSBiYWNraW5nIHN0
b3JlDQogICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzMkQgZyA9IGdldEdyYXBoaWNzMkQoKTsN
CiAgICAgICAgICAgICAgICAgICAgUmVjdGFuZ2xlMkQgYmJveCA9IG5vcm1hbGl6ZShyZW5kZXJE
ZWxlZ2F0ZS5nZXRCb3VuZHMoY3VyU3RyLCBmb250LCBnZXRGb250UmVuZGVyQ29udGV4dCgpKSk7
DQogICAgICAgICAgICAgICAgICAgIFBvaW50IG9yaWdpbiA9IG5ldyBQb2ludCgoaW50KSAtYmJv
eC5nZXRNaW5YKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAoaW50KSAtYmJveC5nZXRNaW5ZKCkpOw0KICAgICAgICAgICAgICAgICAgICByZWN0ID0gbmV3
IFJlY3QoMCwgMCwgKGludCkgYmJveC5nZXRXaWR0aCgpLA0KICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgKGludCkgYmJveC5nZXRIZWlnaHQoKSwNCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIG5ldyBUZXh0RGF0YShjdXJTdHIsIG9yaWdpbiwgLTEpKTsNCg0K
ICAgICAgICAgICAgICAgICAgICBwYWNrZXIuYWRkKHJlY3QpOw0KICAgICAgICAgICAgICAgICAg
ICBzdHJpbmdMb2NhdGlvbnMucHV0KGN1clN0ciwgcmVjdCk7DQoNCiAgICAgICAgICAgICAgICAg
ICAgLy8gUmUtZmV0Y2ggdGhlIEdyYXBoaWNzMkQgaW4gY2FzZSB0aGUgYWRkaXRpb24gb2YgdGhl
IHJlY3RhbmdsZQ0KICAgICAgICAgICAgICAgICAgICAvLyBjYXVzZWQgdGhlIG9sZCBiYWNraW5n
IHN0b3JlIHRvIGJlIHRocm93biBhd2F5DQogICAgICAgICAgICAgICAgICAgIGcgPSBnZXRHcmFw
aGljczJEKCk7DQoNCiAgICAgICAgICAgICAgICAgICAgLy8gT0ssIHNob3VsZCBub3cgaGF2ZSBh
biAoeCwgeSkgZm9yIHRoaXMgcmVjdGFuZ2xlOyByYXN0ZXJpemUNCiAgICAgICAgICAgICAgICAg
ICAgLy8gdGhlIFN0cmluZw0KICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogbmVlZCB0byB2
ZXJpZnkgdGhhdCB0aGlzIGNhdXNlcyB0aGUgU3RyaW5nIHRvIGJlDQogICAgICAgICAgICAgICAg
ICAgIC8vIHJhc3Rlcml6ZWQgZnVsbHkgaW50byB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlDQogICAg
ICAgICAgICAgICAgICAgIGludCBzdHJ4ID0gcmVjdC54KCkgKyBvcmlnaW4ueDsNCiAgICAgICAg
ICAgICAgICAgICAgaW50IHN0cnkgPSByZWN0LnkoKSArIG9yaWdpbi55Ow0KDQogICAgICAgICAg
ICAgICAgICAgIC8vIENsZWFyIG91dCB0aGUgYXJlYSB3ZSdyZSBnb2luZyB0byBkcmF3IGludG8N
CiAgICAgICAgICAgICAgICAgICAgZy5zZXRDb21wb3NpdGUoQWxwaGFDb21wb3NpdGUuQ2xlYXIp
Ow0KICAgICAgICAgICAgICAgICAgICBnLmZpbGxSZWN0KHJlY3QueCgpLCByZWN0LnkoKSwgcmVj
dC53KCksIHJlY3QuaCgpKTsNCiAgICAgICAgICAgICAgICAgICAgZy5zZXRDb21wb3NpdGUoQWxw
aGFDb21wb3NpdGUuU3JjKTsNCg0KICAgICAgICAgICAgICAgICAgICAvLyBEcmF3IHRoZSBzdHJp
bmcNCiAgICAgICAgICAgICAgICAgICAgcmVuZGVyRGVsZWdhdGUuZHJhdyhnLCBjdXJTdHIsIHN0
cngsIHN0cnkpOw0KDQogICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgdGhpcyByZWdpb24gb2Yg
dGhlIFRleHR1cmVSZW5kZXJlciBhcyBkaXJ0eQ0KICAgICAgICAgICAgICAgICAgICBnZXRCYWNr
aW5nU3RvcmUoKS5tYXJrRGlydHkocmVjdC54KCksIHJlY3QueSgpLCByZWN0LncoKSwNCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QuaCgpKTsNCiAg
ICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBPSywgbm93IGRyYXcgdGhlIHBv
cnRpb24gb2YgdGhlIGJhY2tpbmcgc3RvcmUgdG8gdGhlIHNjcmVlbg0KICAgICAgICAgICAgICAg
IFRleHR1cmVSZW5kZXJlciByZW5kZXJlciA9IGdldEJhY2tpbmdTdG9yZSgpOw0KDQogICAgICAg
ICAgICAgICAgLy8gTk9URSB0aGF0IHRoZSByZWN0YW5nbGVzIG1hbmFnZWQgYnkgdGhlIHBhY2tl
ciBoYXZlIHRoZWlyDQogICAgICAgICAgICAgICAgLy8gb3JpZ2luIGF0IHRoZSB1cHBlci1sZWZ0
IGJ1dCB0aGUgVGV4dHVyZVJlbmRlcmVyJ3Mgb3JpZ2luIGlzDQogICAgICAgICAgICAgICAgLy8g
YXQgaXRzIGxvd2VyIGxlZnQhISENCiAgICAgICAgICAgICAgICBUZXh0RGF0YSBkYXRhID0gKFRl
eHREYXRhKSByZWN0LmdldFVzZXJEYXRhKCk7DQogICAgICAgICAgICAgICAgZGF0YS5tYXJrVXNl
ZCgpOw0KDQogICAgICAgICAgICAgICAgLy8gQWxpZ24gdGhlIGxlZnRtb3N0IHBvaW50IG9mIHRo
ZSBiYXNlbGluZSB0byB0aGUgKHgsIHksIHopIGNvb3JkaW5hdGUgcmVxdWVzdGVkDQogICAgICAg
ICAgICAgICAgcmVuZGVyZXIuZHJhdzNEUmVjdCgoeCArIHhPZmZzZXQpIC0NCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIChzY2FsZUZhY3RvciAqIGRhdGEub3JpZ2luKCkueCks
DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5IC0gKHNjYWxlRmFjdG9yICog
KHJlY3QuaCgpIC0gZGF0YS5vcmlnaW4oKS55KSksIHosDQogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICByZWN0LngoKSwgcmVuZGVyZXIuZ2V0SGVpZ2h0KCkgLSByZWN0LnkoKSAt
IHJlY3QuaCgpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC53KCks
IHJlY3QuaCgpLCBzY2FsZUZhY3Rvcik7DQogICAgICAgICAgICAgICAgeE9mZnNldCArPSAocmVj
dC53KCkgKiBzY2FsZUZhY3Rvcik7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHhPZmZz
ZXQgKz0gKGdldFNwYWNlV2lkdGgoKSAqIHNjYWxlRmFjdG9yKTsNCiAgICAgICAgfQ0KICAgIH0N
Cg0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgIC8vIERlYnVnZ2luZyBmdW5jdGlvbmFsaXR5DQog
ICAgLy8NCiAgICBwcml2YXRlIHZvaWQgZGVidWcoKSB7DQogICAgICAgIGRiZ0ZyYW1lID0gbmV3
IEZyYW1lKCJUZXh0UmVuZGVyZXIgRGVidWcgT3V0cHV0Iik7DQoNCiAgICAgICAgR0xDYW52YXMg
ZGJnQ2FudmFzID0gbmV3IEdMQ2FudmFzKG5ldyBHTENhcGFiaWxpdGllcygpLCBudWxsLA0KICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xDb250ZXh0LmdldEN1cnJl
bnQoKSwgbnVsbCk7DQogICAgICAgIGRiZ0NhbnZhcy5hZGRHTEV2ZW50TGlzdGVuZXIobmV3IERl
YnVnTGlzdGVuZXIoZGJnRnJhbWUpKTsNCiAgICAgICAgZGJnRnJhbWUuYWRkKGRiZ0NhbnZhcyk7
DQoNCiAgICAgICAgZmluYWwgRlBTQW5pbWF0b3IgYW5pbSA9IG5ldyBGUFNBbmltYXRvcihkYmdD
YW52YXMsIDEwKTsNCiAgICAgICAgZGJnRnJhbWUuYWRkV2luZG93TGlzdGVuZXIobmV3IFdpbmRv
d0FkYXB0ZXIoKSB7DQogICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhX
aW5kb3dFdmVudCBlKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIFJ1biB0aGlzIG9uIGFub3Ro
ZXIgdGhyZWFkIHRoYW4gdGhlIEFXVCBldmVudCBxdWV1ZSB0bw0KICAgICAgICAgICAgICAgICAg
ICAvLyBtYWtlIHN1cmUgdGhlIGNhbGwgdG8gQW5pbWF0b3Iuc3RvcCgpIGNvbXBsZXRlcyBiZWZv
cmUNCiAgICAgICAgICAgICAgICAgICAgLy8gZXhpdGluZw0KICAgICAgICAgICAgICAgICAgICBu
ZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBw
dWJsaWMgdm9pZCBydW4oKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW0u
c3RvcCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAg
ICAgICAgIH0pLnN0YXJ0KCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQog
ICAgICAgIGRiZ0ZyYW1lLnNldFNpemUoa1NpemUsIGtTaXplKTsNCiAgICAgICAgZGJnRnJhbWUu
c2V0VmlzaWJsZSh0cnVlKTsNCiAgICAgICAgYW5pbS5zdGFydCgpOw0KICAgICAgICBkZWJ1Z2dl
ZCA9IHRydWU7DQogICAgfQ0KDQogICAgLyoqIENsYXNzIHN1cHBvcnRpbmcgbW9yZSBmdWxsIGNv
bnRyb2wgb3ZlciB0aGUgcHJvY2VzcyBvZiByZW5kZXJpbmcNCiAgICAgICAgdGhlIGJpdG1hcHBl
ZCB0ZXh0LiBBbGxvd3MgY3VzdG9taXphdGlvbiBvZiB3aGV0aGVyIHRoZSBiYWNraW5nDQogICAg
ICAgIHN0b3JlIHRleHQgYml0bWFwIGlzIGZ1bGwtY29sb3Igb3IgaW50ZW5zaXR5IG9ubHksIHRo
ZSBzaXplIG9mDQogICAgICAgIGVhY2ggaW5kaXZpZHVhbCByZW5kZXJlZCB0ZXh0IHJlY3Rhbmds
ZSwgYW5kIHRoZSBjb250ZW50cyBvZg0KICAgICAgICBlYWNoIGluZGl2aWR1YWwgcmVuZGVyZWQg
dGV4dCBzdHJpbmcuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uDQogICAgICAgIG9mIHRoaXMg
aW50ZXJmYWNlIHVzZXMgYW4gaW50ZW5zaXR5LW9ubHkgdGV4dHVyZSwgYQ0KICAgICAgICBjbG9z
ZWx5LWNyb3BwZWQgcmVjdGFuZ2xlIGFyb3VuZCB0aGUgdGV4dCwgYW5kIHJlbmRlcnMgdGV4dA0K
ICAgICAgICB1c2luZyB0aGUgY29sb3Igd2hpdGUsIHdoaWNoIGlzIG1vZHVsYXRlZCBieSB0aGUg
c2V0IGNvbG9yDQogICAgICAgIGR1cmluZyB0aGUgcmVuZGVyaW5nIHByb2Nlc3MuICovDQogICAg
cHVibGljIHN0YXRpYyBpbnRlcmZhY2UgUmVuZGVyRGVsZWdhdGUgew0KICAgICAgICAvKiogSW5k
aWNhdGVzIHdoZXRoZXIgdGhlIGJhY2tpbmcgc3RvcmUgb2YgdGhpcyBUZXh0UmVuZGVyZXINCiAg
ICAgICAgICAgIHNob3VsZCBiZSBpbnRlbnNpdHktb25seSAodGhlIGRlZmF1bHQpIG9yIGZ1bGwt
Y29sb3IuICovDQogICAgICAgIHB1YmxpYyBib29sZWFuIGludGVuc2l0eU9ubHkoKTsNCg0KICAg
ICAgICAvKiogQ29tcHV0ZXMgdGhlIGJvdW5kcyBvZiB0aGUgZ2l2ZW4gU3RyaW5nIHJlbGF0aXZl
IHRvIHRoZQ0KICAgICAgICAgICAgb3JpZ2luLiAqLw0KICAgICAgICBwdWJsaWMgUmVjdGFuZ2xl
MkQgZ2V0Qm91bmRzKFN0cmluZyBzdHIsIEZvbnQgZm9udCwNCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBGb250UmVuZGVyQ29udGV4dCBmcmMpOw0KDQogICAgICAgIC8qKiBD
b21wdXRlcyB0aGUgYm91bmRzIG9mIHRoZSBnaXZlbiBjaGFyYWN0ZXIgc2VxdWVuY2UgcmVsYXRp
dmUNCiAgICAgICAgICAgIHRvIHRoZSBvcmlnaW4uICovDQogICAgICAgIHB1YmxpYyBSZWN0YW5n
bGUyRCBnZXRCb3VuZHMoQ2hhclNlcXVlbmNlIHN0ciwgRm9udCBmb250LA0KICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnRSZW5kZXJDb250ZXh0IGZyYyk7DQoNCiAgICAg
ICAgLyoqIENvbXB1dGVzIHRoZSBib3VuZHMgb2YgdGhlIGdpdmVuIEdseXBoVmVjdG9yLCBhbHJl
YWR5DQogICAgICAgICAgICBhc3N1bWVkIHRvIGhhdmUgYmVlbiBjcmVhdGVkIGZvciBhIHBhcnRp
Y3VsYXIgRm9udCwNCiAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSBvcmlnaW4uICovDQogICAg
ICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRCb3VuZHMoR2x5cGhWZWN0b3IgZ3YsIEZvbnRSZW5k
ZXJDb250ZXh0IGZyYyk7DQoNCiAgICAgICAgLyoqIFJlbmRlciB0aGUgcGFzc2VkIGNoYXJhY3Rl
ciBzZXF1ZW5jZSBhdCB0aGUgZGVzaWduYXRlZA0KICAgICAgICAgICAgbG9jYXRpb24gdXNpbmcg
dGhlIHN1cHBsaWVkIEdyYXBoaWNzMkQgaW5zdGFuY2UuIFRoZQ0KICAgICAgICAgICAgc3Vycm91
bmRpbmcgcmVnaW9uIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gY2xlYXJlZCB0byB0aGUgUkdCDQog
ICAgICAgICAgICBjb2xvciAoMCwgMCwgMCkgd2l0aCB6ZXJvIGFscGhhLiBUaGUgaW5pdGlhbCBk
cmF3aW5nIGNvbnRleHQNCiAgICAgICAgICAgIG9mIHRoZSBwYXNzZWQgR3JhcGhpY3MyRCB3aWxs
IGJlIHNldCB0byB1c2UNCiAgICAgICAgICAgIEFscGhhQ29tcG9zaXRlLlNyYywgdGhlIGNvbG9y
IHdoaXRlLCB0aGUgRm9udCBzcGVjaWZpZWQgaW4gdGhlDQogICAgICAgICAgICBUZXh0UmVuZGVy
ZXIncyBjb25zdHJ1Y3RvciwgYW5kIHRoZSByZW5kZXJpbmcgaGludHMgc3BlY2lmaWVkDQogICAg
ICAgICAgICBpbiB0aGUgVGV4dFJlbmRlcmVyIGNvbnN0cnVjdG9yLiAgQ2hhbmdlcyBtYWRlIGJ5
IHRoZSBlbmQgdXNlcg0KICAgICAgICAgICAgbWF5IGJlIHZpc2libGUgaW4gc3VjY2Vzc2l2ZSBj
YWxscyB0byB0aGlzIG1ldGhvZCwgYnV0IGFyZSBub3QNCiAgICAgICAgICAgIGd1YXJhbnRlZWQg
dG8gYmUgcHJlc2VydmVkLiAgSW1wbGVtZW50b3JzIG9mIHRoaXMgbWV0aG9kDQogICAgICAgICAg
ICBzaG91bGQgcmVzZXQgdGhlIEdyYXBoaWNzMkQncyBzdGF0ZSB0byB0aGF0IGRlc2lyZWQgZWFj
aCB0aW1lDQogICAgICAgICAgICB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGluIHBhcnRpY3VsYXIg
dGhvc2Ugc3RhdGVzIHdoaWNoIGFyZQ0KICAgICAgICAgICAgbm90IHRoZSBkZWZhdWx0cy4gKi8N
CiAgICAgICAgcHVibGljIHZvaWQgZHJhdyhHcmFwaGljczJEIGdyYXBoaWNzLCBTdHJpbmcgc3Ry
LCBpbnQgeCwgaW50IHkpOw0KDQogICAgICAgIC8qKiBSZW5kZXIgdGhlIHBhc3NlZCBHbHlwaFZl
Y3RvciBhdCB0aGUgZGVzaWduYXRlZCBsb2NhdGlvbiB1c2luZw0KICAgICAgICAgICAgdGhlIHN1
cHBsaWVkIEdyYXBoaWNzMkQgaW5zdGFuY2UuIFRoZSBzdXJyb3VuZGluZyByZWdpb24gd2lsbA0K
ICAgICAgICAgICAgYWxyZWFkeSBoYXZlIGJlZW4gY2xlYXJlZCB0byB0aGUgUkdCIGNvbG9yICgw
LCAwLCAwKSB3aXRoIHplcm8NCiAgICAgICAgICAgIGFscGhhLiBUaGUgaW5pdGlhbCBkcmF3aW5n
IGNvbnRleHQgb2YgdGhlIHBhc3NlZCBHcmFwaGljczJEDQogICAgICAgICAgICB3aWxsIGJlIHNl
dCB0byB1c2UgQWxwaGFDb21wb3NpdGUuU3JjLCB0aGUgY29sb3Igd2hpdGUsIHRoZQ0KICAgICAg
ICAgICAgRm9udCBzcGVjaWZpZWQgaW4gdGhlIFRleHRSZW5kZXJlcidzIGNvbnN0cnVjdG9yLCBh
bmQgdGhlDQogICAgICAgICAgICByZW5kZXJpbmcgaGludHMgc3BlY2lmaWVkIGluIHRoZSBUZXh0
UmVuZGVyZXIgY29uc3RydWN0b3IuDQogICAgICAgICAgICBDaGFuZ2VzIG1hZGUgYnkgdGhlIGVu
ZCB1c2VyIG1heSBiZSB2aXNpYmxlIGluIHN1Y2Nlc3NpdmUNCiAgICAgICAgICAgIGNhbGxzIHRv
IHRoaXMgbWV0aG9kLCBidXQgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlIHByZXNlcnZlZC4NCiAg
ICAgICAgICAgIEltcGxlbWVudG9ycyBvZiB0aGlzIG1ldGhvZCBzaG91bGQgcmVzZXQgdGhlIEdy
YXBoaWNzMkQncw0KICAgICAgICAgICAgc3RhdGUgdG8gdGhhdCBkZXNpcmVkIGVhY2ggdGltZSB0
aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGluDQogICAgICAgICAgICBwYXJ0aWN1bGFyIHRob3NlIHN0
YXRlcyB3aGljaCBhcmUgbm90IHRoZSBkZWZhdWx0cy4gKi8NCiAgICAgICAgcHVibGljIHZvaWQg
ZHJhd0dseXBoVmVjdG9yKEdyYXBoaWNzMkQgZ3JhcGhpY3MsIEdseXBoVmVjdG9yIHN0ciwNCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSk7DQogICAgfQ0K
DQogICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWFwQ2hhclNlcXVlbmNlVG9HbHlwaFZlY3Rvcg0K
ICAgICAgICBpbXBsZW1lbnRzIENoYXJhY3Rlckl0ZXJhdG9yIHsNCiAgICAgICAgQ2hhclNlcXVl
bmNlIG1TZXF1ZW5jZTsNCiAgICAgICAgaW50IG1MZW5ndGg7DQogICAgICAgIGludCBtQ3VycmVu
dEluZGV4Ow0KDQogICAgICAgIE1hcENoYXJTZXF1ZW5jZVRvR2x5cGhWZWN0b3IoKSB7DQogICAg
ICAgIH0NCg0KICAgICAgICBNYXBDaGFyU2VxdWVuY2VUb0dseXBoVmVjdG9yKENoYXJTZXF1ZW5j
ZSBzZXF1ZW5jZSkgew0KICAgICAgICAgICAgaW5pdEZyb21DaGFyU2VxdWVuY2Uoc2VxdWVuY2Up
Ow0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIHZvaWQgaW5pdEZyb21DaGFyU2VxdWVuY2Uo
Q2hhclNlcXVlbmNlIHNlcXVlbmNlKSB7DQogICAgICAgICAgICBtU2VxdWVuY2UgPSBzZXF1ZW5j
ZTsNCiAgICAgICAgICAgIG1MZW5ndGggPSBtU2VxdWVuY2UubGVuZ3RoKCk7DQogICAgICAgICAg
ICBtQ3VycmVudEluZGV4ID0gMDsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyBjaGFyIGxh
c3QoKSB7DQogICAgICAgICAgICBtQ3VycmVudEluZGV4ID0gTWF0aC5tYXgoMCwgbUxlbmd0aCAt
IDEpOw0KDQogICAgICAgICAgICByZXR1cm4gY3VycmVudCgpOw0KICAgICAgICB9DQoNCiAgICAg
ICAgcHVibGljIGNoYXIgY3VycmVudCgpIHsNCiAgICAgICAgICAgIGlmICgobUxlbmd0aCA9PSAw
KSB8fCAobUN1cnJlbnRJbmRleCA+PSBtTGVuZ3RoKSkgew0KICAgICAgICAgICAgICAgIHJldHVy
biBDaGFyYWN0ZXJJdGVyYXRvci5ET05FOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBy
ZXR1cm4gbVNlcXVlbmNlLmNoYXJBdChtQ3VycmVudEluZGV4KTsNCiAgICAgICAgfQ0KDQogICAg
ICAgIHB1YmxpYyBjaGFyIG5leHQoKSB7DQogICAgICAgICAgICBtQ3VycmVudEluZGV4Kys7DQoN
CiAgICAgICAgICAgIHJldHVybiBjdXJyZW50KCk7DQogICAgICAgIH0NCg0KICAgICAgICBwdWJs
aWMgY2hhciBwcmV2aW91cygpIHsNCiAgICAgICAgICAgIG1DdXJyZW50SW5kZXggPSBNYXRoLm1h
eChtQ3VycmVudEluZGV4IC0gMSwgMCk7DQoNCiAgICAgICAgICAgIHJldHVybiBjdXJyZW50KCk7
DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgY2hhciBzZXRJbmRleChpbnQgcG9zaXRpb24p
IHsNCiAgICAgICAgICAgIG1DdXJyZW50SW5kZXggPSBwb3NpdGlvbjsNCg0KICAgICAgICAgICAg
cmV0dXJuIGN1cnJlbnQoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyBpbnQgZ2V0QmVn
aW5JbmRleCgpIHsNCiAgICAgICAgICAgIHJldHVybiAwOw0KICAgICAgICB9DQoNCiAgICAgICAg
cHVibGljIGludCBnZXRFbmRJbmRleCgpIHsNCiAgICAgICAgICAgIHJldHVybiBtTGVuZ3RoOw0K
ICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIGludCBnZXRJbmRleCgpIHsNCiAgICAgICAgICAg
IHJldHVybiBtQ3VycmVudEluZGV4Ow0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIE9iamVj
dCBjbG9uZSgpIHsNCiAgICAgICAgICAgIE1hcENoYXJTZXF1ZW5jZVRvR2x5cGhWZWN0b3IgaXRl
ciA9IG5ldyBNYXBDaGFyU2VxdWVuY2VUb0dseXBoVmVjdG9yKG1TZXF1ZW5jZSk7DQogICAgICAg
ICAgICBpdGVyLm1DdXJyZW50SW5kZXggPSBtQ3VycmVudEluZGV4Ow0KDQogICAgICAgICAgICBy
ZXR1cm4gaXRlcjsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyBjaGFyIGZpcnN0KCkgew0K
ICAgICAgICAgICAgaWYgKG1MZW5ndGggPT0gMCkgew0KICAgICAgICAgICAgICAgIHJldHVybiBD
aGFyYWN0ZXJJdGVyYXRvci5ET05FOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBtQ3Vy
cmVudEluZGV4ID0gMDsNCg0KICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQoKTsNCiAgICAgICAg
fQ0KICAgIH0NCg0KICAgIC8vIERhdGEgYXNzb2NpYXRlZCB3aXRoIGVhY2ggcmVjdGFuZ2xlIG9m
IHRleHQNCiAgICBzdGF0aWMgY2xhc3MgVGV4dERhdGEgew0KICAgICAgICBpbnQgdW5pY29kZUlE
Ow0KICAgICAgICBwcml2YXRlIFN0cmluZyBzdHI7IC8vIEJhY2stcG9pbnRlciB0byBTdHJpbmcg
dGhpcyBUZXh0RGF0YSBkZXNjcmliZXMNCg0KICAgICAgICAvLyBUaGUgZm9sbG93aW5nIG11c3Qg
YmUgZGVmaW5lZCBhbmQgdXNlZCBWRVJZIHByZWNpc2VseS4gVGhpcyBpcw0KICAgICAgICAvLyB0
aGUgb2Zmc2V0IGZyb20gdGhlIHVwcGVyLWxlZnQgY29ybmVyIG9mIHRoaXMgcmVjdGFuZ2xlIChK
YXZhDQogICAgICAgIC8vIDJEIGNvb3JkaW5hdGUgc3lzdGVtKSBhdCB3aGljaCB0aGUgc3RyaW5n
IG11c3QgYmUgcmFzdGVyaXplZCBpbg0KICAgICAgICAvLyBvcmRlciB0byBmaXQgd2l0aGluIHRo
ZSByZWN0YW5nbGUgLS0gdGhlIGxlZnRtb3N0IHBvaW50IG9mIHRoZQ0KICAgICAgICAvLyBiYXNl
bGluZS4NCiAgICAgICAgcHJpdmF0ZSBQb2ludCBvcmlnaW47DQogICAgICAgIHByaXZhdGUgYm9v
bGVhbiB1c2VkOyAvLyBXaGV0aGVyIHRoaXMgdGV4dCB3YXMgdXNlZCByZWNlbnRseQ0KDQogICAg
ICAgIFRleHREYXRhKFN0cmluZyBzdHIsIFBvaW50IG9yaWdpbiwgaW50IHVuaWNvZGVJRCkgew0K
ICAgICAgICAgICAgdGhpcy5zdHIgPSBzdHI7DQogICAgICAgICAgICB0aGlzLm9yaWdpbiA9IG9y
aWdpbjsNCiAgICAgICAgICAgIHRoaXMudW5pY29kZUlEID0gdW5pY29kZUlEOw0KICAgICAgICB9
DQoNCiAgICAgICAgU3RyaW5nIHN0cmluZygpIHsNCiAgICAgICAgICAgIHJldHVybiBzdHI7DQog
ICAgICAgIH0NCg0KICAgICAgICBQb2ludCBvcmlnaW4oKSB7DQogICAgICAgICAgICByZXR1cm4g
b3JpZ2luOw0KICAgICAgICB9DQoNCiAgICAgICAgYm9vbGVhbiB1c2VkKCkgew0KICAgICAgICAg
ICAgcmV0dXJuIHVzZWQ7DQogICAgICAgIH0NCg0KICAgICAgICB2b2lkIG1hcmtVc2VkKCkgew0K
ICAgICAgICAgICAgdXNlZCA9IHRydWU7DQogICAgICAgIH0NCg0KICAgICAgICB2b2lkIGNsZWFy
VXNlZCgpIHsNCiAgICAgICAgICAgIHVzZWQgPSBmYWxzZTsNCiAgICAgICAgfQ0KICAgIH0NCg0K
ICAgIGNsYXNzIE1hbmFnZXIgaW1wbGVtZW50cyBCYWNraW5nU3RvcmVNYW5hZ2VyIHsNCiAgICAg
ICAgcHJpdmF0ZSBHcmFwaGljczJEIGc7DQoNCiAgICAgICAgcHVibGljIE9iamVjdCBhbGxvY2F0
ZUJhY2tpbmdTdG9yZShpbnQgdywgaW50IGgpIHsNCiAgICAgICAgICAgIC8vIEZJWE1FOiBzaG91
bGQgY29uc2lkZXIgY2hlY2tpbmcgRm9udCdzIGF0dHJpYnV0ZXMgdG8gc2VlDQogICAgICAgICAg
ICAvLyB3aGV0aGVyIHdlJ3JlIGxpa2VseSB0byBuZWVkIHRvIHN1cHBvcnQgYSBmdWxsIFJHQkEg
YmFja2luZw0KICAgICAgICAgICAgLy8gc3RvcmUgKGkuZS4sIG5vbi1kZWZhdWx0IFBhaW50LCBm
b3JlZ3JvdW5kIGNvbG9yLCBldGMuKSwgYnV0DQogICAgICAgICAgICAvLyBmb3Igbm93LCBsZXQn
cyBqdXN0IGJlIG1vcmUgZWZmaWNpZW50DQogICAgICAgICAgICBUZXh0dXJlUmVuZGVyZXIgcmVu
ZGVyZXI7DQoNCiAgICAgICAgICAgIGlmIChyZW5kZXJEZWxlZ2F0ZS5pbnRlbnNpdHlPbmx5KCkp
IHsNCiAgICAgICAgICAgICAgICByZW5kZXJlciA9IFRleHR1cmVSZW5kZXJlci5jcmVhdGVBbHBo
YU9ubHlSZW5kZXJlcih3LCBoLCBtaXBtYXApOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAg
ICAgICAgICAgICByZW5kZXJlciA9IG5ldyBUZXh0dXJlUmVuZGVyZXIodywgaCwgdHJ1ZSwgbWlw
bWFwKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKERFQlVHKSB7DQogICAgICAg
ICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgVGV4dFJlbmRlcmVyIGFsbG9jYXRpbmcgYmFj
a2luZyBzdG9yZSAiICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArICIg
eCAiICsgaCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHJldHVybiByZW5kZXJlcjsN
CiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyB2b2lkIGRlbGV0ZUJhY2tpbmdTdG9yZShPYmpl
Y3QgYmFja2luZ1N0b3JlKSB7DQogICAgICAgICAgICAoKFRleHR1cmVSZW5kZXJlcikgYmFja2lu
Z1N0b3JlKS5kaXNwb3NlKCk7DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgYm9vbGVhbiBw
cmVFeHBhbmQoUmVjdCBjYXVzZSwgaW50IGF0dGVtcHROdW1iZXIpIHsNCiAgICAgICAgICAgIC8v
IE9ubHkgdHJ5IHRoaXMgb25lIHRpbWU7IGNsZWFyIG91dCBwb3RlbnRpYWxseSBvYnNvbGV0ZSBl
bnRyaWVzDQogICAgICAgICAgICAvLyBOT1RFOiB0aGlzIGhldXJpc3RpYyBhbmQgdGhlIGZhY3Qg
dGhhdCBpdCBjbGVhcnMgdGhlIHVzZWQgYml0DQogICAgICAgICAgICAvLyBvZiBhbGwgZW50cmll
cyBzZWVtcyB0byBjYXVzZSBjeWNsaW5nIG9mIGVudHJpZXMgaW4gc29tZQ0KICAgICAgICAgICAg
Ly8gc2l0dWF0aW9ucywgd2hlcmUgdGhlIGJhY2tpbmcgc3RvcmUgYmVjb21lcyBzbWFsbCBjb21w
YXJlZCB0bw0KICAgICAgICAgICAgLy8gdGhlIGFtb3VudCBvZiB0ZXh0IG9uIHRoZSBzY3JlZW4g
KHNlZSB0aGUgVGV4dEZsb3cgZGVtbykgYW5kDQogICAgICAgICAgICAvLyB0aGUgZW50cmllcyBj
b250aW51YWxseSBjeWNsZSBpbiBhbmQgb3V0IG9mIHRoZSBiYWNraW5nDQogICAgICAgICAgICAv
LyBzdG9yZSwgZGVjcmVhc2luZyBwZXJmb3JtYW5jZS4gSWYgd2UgYWRkZWQgYSBsaXR0bGUgYWdl
DQogICAgICAgICAgICAvLyBpbmZvcm1hdGlvbiB0byB0aGUgZW50cmllcywgYW5kIG9ubHkgY2xl
YXJlZCBvdXQgZW50cmllcw0KICAgICAgICAgICAgLy8gYWJvdmUgYSBjZXJ0YWluIGFnZSwgdGhp
cyBiZWhhdmlvciB3b3VsZCBiZSBlbGltaW5hdGVkLg0KICAgICAgICAgICAgLy8gSG93ZXZlciwg
aXQgc2VlbXMgdGhlIHN5c3RlbSB1c3VhbGx5IHN0YWJpbGl6ZXMgaXRzZWxmLCBzbw0KICAgICAg
ICAgICAgLy8gZm9yIG5vdyB3ZSdsbCBqdXN0IGtlZXAgdGhpbmdzIHNpbXBsZS4gTm90ZSB0aGF0
IGlmIHdlIGRvbid0DQogICAgICAgICAgICAvLyBjbGVhciB0aGUgdXNlZCBiaXQgaGVyZSwgdGhl
IGJhY2tpbmcgc3RvcmUgdGVuZHMgdG8gaW5jcmVhc2UNCiAgICAgICAgICAgIC8vIHZlcnkgcXVp
Y2tseSB0byBpdHMgbWF4aW11bSBzaXplLCBhdCBsZWFzdCB3aXRoIHRoZSBUZXh0Rmxvdw0KICAg
ICAgICAgICAgLy8gZGVtbyB3aGVuIHRoZSB0ZXh0IGlzIGJlaW5nIGNvbnRpbnVhbGx5IHJlLWxh
aWQgb3V0Lg0KICAgICAgICAgICAgaWYgKGF0dGVtcHROdW1iZXIgPT0gMCkgew0KICAgICAgICAg
ICAgICAgIGlmIChERUJVRykgew0KICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50
bG4oDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2xlYXJpbmcgdW51
c2VkIGVudHJpZXMgaW4gcHJlRXhwYW5kKCk6IGF0dGVtcHQgbnVtYmVyICIgKw0KICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdE51bWJlcik7DQogICAgICAgICAg
ICAgICAgfQ0KDQogICAgICAgICAgICAgICAgY2xlYXJVbnVzZWRFbnRyaWVzKCk7DQoNCiAgICAg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOw0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIHZvaWQgYWRkaXRpb25GYWls
ZWQoUmVjdCBjYXVzZSwgaW50IGF0dGVtcHROdW1iZXIpIHsNCiAgICAgICAgICAgIC8vIEhlYXZ5
IGhhbW1lciAtLSBtaWdodCBjb25zaWRlciBkb2luZyBzb21ldGhpbmcgZGlmZmVyZW50DQogICAg
ICAgICAgICBwYWNrZXIuY2xlYXIoKTsNCiAgICAgICAgICAgIHN0cmluZ0xvY2F0aW9ucy5jbGVh
cigpOw0KICAgICAgICAgICAgbUdseXBoUHJvZHVjZXIuY2xlYXJBbGxDYWNoZUVudHJpZXMoKTsN
Cg0KICAgICAgICAgICAgaWYgKERFQlVHKSB7DQogICAgICAgICAgICAgICAgU3lzdGVtLmVyci5w
cmludGxuKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICoqKiBDbGVhcmVk
IGFsbCB0ZXh0IGJlY2F1c2UgYWRkaXRpb24gZmFpbGVkICoqKiIpOw0KICAgICAgICAgICAgfQ0K
ICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIHZvaWQgYmVnaW5Nb3ZlbWVudChPYmplY3Qgb2xk
QmFja2luZ1N0b3JlLCBPYmplY3QgbmV3QmFja2luZ1N0b3JlKSB7DQogICAgICAgICAgICAvLyBF
eGl0IHRoZSBiZWdpbiAvIGVuZCBwYWlyIGlmIG5lY2Vzc2FyeQ0KICAgICAgICAgICAgaWYgKGlu
QmVnaW5FbmRQYWlyKSB7DQogICAgICAgICAgICAgICAgLy8gRHJhdyBhbnkgb3V0c3RhbmRpbmcg
Z2x5cGhzDQogICAgICAgICAgICAgICAgZmx1c2goKTsNCg0KICAgICAgICAgICAgICAgIEdMIGds
ID0gR0xVLmdldEN1cnJlbnRHTCgpOw0KDQogICAgICAgICAgICAgICAgLy8gUG9wIGNsaWVudCBh
dHRyaWIgYml0cyB1c2VkIGJ5IHRoZSBwaXBlbGluZWQgcXVhZCByZW5kZXJlcg0KICAgICAgICAg
ICAgICAgIGdsLmdsUG9wQ2xpZW50QXR0cmliKCk7DQoNCiAgICAgICAgICAgICAgICAvLyBUaGUg
T3BlbkdMIHNwZWMgaXMgdW5jbGVhciBhYm91dCB3aGV0aGVyIHRoaXMgY2hhbmdlcyB0aGUNCiAg
ICAgICAgICAgICAgICAvLyBidWZmZXIgYmluZGluZ3MsIHNvIHByZWVtcHRpdmVseSB6ZXJvIG91
dCB0aGUgR0xfQVJSQVlfQlVGRkVSDQogICAgICAgICAgICAgICAgLy8gYmluZGluZw0KICAgICAg
ICAgICAgICAgIGlmIChnbC5pc0V4dGVuc2lvbkF2YWlsYWJsZSgiR0xfVkVSU0lPTl8xXzUiKSkg
ew0KICAgICAgICAgICAgICAgICAgICBnbC5nbEJpbmRCdWZmZXIoR0wuR0xfQVJSQVlfQlVGRkVS
LCAwKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAoaXNPcnRob01v
ZGUpIHsNCiAgICAgICAgICAgICAgICAgICAgKChUZXh0dXJlUmVuZGVyZXIpIG9sZEJhY2tpbmdT
dG9yZSkuZW5kT3J0aG9SZW5kZXJpbmcoKTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAg
ICAgICAgICAgICAgICAgICAoKFRleHR1cmVSZW5kZXJlcikgb2xkQmFja2luZ1N0b3JlKS5lbmQz
RFJlbmRlcmluZygpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAg
ICAgICAgVGV4dHVyZVJlbmRlcmVyIG5ld1JlbmRlcmVyID0gKFRleHR1cmVSZW5kZXJlcikgbmV3
QmFja2luZ1N0b3JlOw0KICAgICAgICAgICAgZyA9IG5ld1JlbmRlcmVyLmNyZWF0ZUdyYXBoaWNz
KCk7DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgdm9pZCBtb3ZlKE9iamVjdCBvbGRCYWNr
aW5nU3RvcmUsIFJlY3Qgb2xkTG9jYXRpb24sDQogICAgICAgICAgICAgICAgICAgICAgICAgT2Jq
ZWN0IG5ld0JhY2tpbmdTdG9yZSwgUmVjdCBuZXdMb2NhdGlvbikgew0KICAgICAgICAgICAgVGV4
dHVyZVJlbmRlcmVyIG9sZFJlbmRlcmVyID0gKFRleHR1cmVSZW5kZXJlcikgb2xkQmFja2luZ1N0
b3JlOw0KICAgICAgICAgICAgVGV4dHVyZVJlbmRlcmVyIG5ld1JlbmRlcmVyID0gKFRleHR1cmVS
ZW5kZXJlcikgbmV3QmFja2luZ1N0b3JlOw0KDQogICAgICAgICAgICBpZiAob2xkUmVuZGVyZXIg
PT0gbmV3UmVuZGVyZXIpIHsNCiAgICAgICAgICAgICAgICAvLyBNb3ZlbWVudCBvbiB0aGUgc2Ft
ZSBiYWNraW5nIHN0b3JlIC0tIGVhc3kgY2FzZQ0KICAgICAgICAgICAgICAgIGcuY29weUFyZWEo
b2xkTG9jYXRpb24ueCgpLCBvbGRMb2NhdGlvbi55KCksIG9sZExvY2F0aW9uLncoKSwNCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgIG9sZExvY2F0aW9uLmgoKSwgbmV3TG9jYXRpb24ueCgpIC0g
b2xkTG9jYXRpb24ueCgpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TG9jYXRpb24u
eSgpIC0gb2xkTG9jYXRpb24ueSgpKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAg
ICAgICAgLy8gTmVlZCB0byBkcmF3IGZyb20gdGhlIG9sZCByZW5kZXJlcidzIGltYWdlIGludG8g
dGhlIG5ldyBvbmUNCiAgICAgICAgICAgICAgICBJbWFnZSBpbWcgPSBvbGRSZW5kZXJlci5nZXRJ
bWFnZSgpOw0KICAgICAgICAgICAgICAgIGcuZHJhd0ltYWdlKGltZywgbmV3TG9jYXRpb24ueCgp
LCBuZXdMb2NhdGlvbi55KCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TG9jYXRp
b24ueCgpICsgbmV3TG9jYXRpb24udygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5l
d0xvY2F0aW9uLnkoKSArIG5ld0xvY2F0aW9uLmgoKSwgb2xkTG9jYXRpb24ueCgpLA0KICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIG9sZExvY2F0aW9uLnkoKSwgb2xkTG9jYXRpb24ueCgpICsg
b2xkTG9jYXRpb24udygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZExvY2F0aW9u
LnkoKSArIG9sZExvY2F0aW9uLmgoKSwgbnVsbCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0N
Cg0KICAgICAgICBwdWJsaWMgdm9pZCBlbmRNb3ZlbWVudChPYmplY3Qgb2xkQmFja2luZ1N0b3Jl
LCBPYmplY3QgbmV3QmFja2luZ1N0b3JlKSB7DQogICAgICAgICAgICBnLmRpc3Bvc2UoKTsNCg0K
ICAgICAgICAgICAgLy8gU3luYyB0aGUgd2hvbGUgc3VyZmFjZQ0KICAgICAgICAgICAgVGV4dHVy
ZVJlbmRlcmVyIG5ld1JlbmRlcmVyID0gKFRleHR1cmVSZW5kZXJlcikgbmV3QmFja2luZ1N0b3Jl
Ow0KICAgICAgICAgICAgbmV3UmVuZGVyZXIubWFya0RpcnR5KDAsIDAsIG5ld1JlbmRlcmVyLmdl
dFdpZHRoKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmVuZGVyZXIu
Z2V0SGVpZ2h0KCkpOw0KDQogICAgICAgICAgICAvLyBSZS1lbnRlciB0aGUgYmVnaW4gLyBlbmQg
cGFpciBpZiBuZWNlc3NhcnkNCiAgICAgICAgICAgIGlmIChpbkJlZ2luRW5kUGFpcikgew0KICAg
ICAgICAgICAgICAgIGlmIChpc09ydGhvTW9kZSkgew0KICAgICAgICAgICAgICAgICAgICAoKFRl
eHR1cmVSZW5kZXJlcikgbmV3QmFja2luZ1N0b3JlKS5iZWdpbk9ydGhvUmVuZGVyaW5nKGJlZ2lu
UmVuZGVyaW5nV2lkdGgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW5SZW5kZXJpbmdIZWlnaHQs
IGJlZ2luUmVuZGVyaW5nRGVwdGhUZXN0RGlzYWJsZWQpOw0KICAgICAgICAgICAgICAgIH0gZWxz
ZSB7DQogICAgICAgICAgICAgICAgICAgICgoVGV4dHVyZVJlbmRlcmVyKSBuZXdCYWNraW5nU3Rv
cmUpLmJlZ2luM0RSZW5kZXJpbmcoKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAg
ICAgICAvLyBQdXNoIGNsaWVudCBhdHRyaWIgYml0cyB1c2VkIGJ5IHRoZSBwaXBlbGluZWQgcXVh
ZCByZW5kZXJlcg0KICAgICAgICAgICAgICAgIEdMIGdsID0gR0xVLmdldEN1cnJlbnRHTCgpOw0K
ICAgICAgICAgICAgICAgIGdsLmdsUHVzaENsaWVudEF0dHJpYigoaW50KSBHTC5HTF9BTExfQ0xJ
RU5UX0FUVFJJQl9CSVRTKTsNCg0KICAgICAgICAgICAgICAgIGlmIChoYXZlQ2FjaGVkQ29sb3Ip
IHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZENvbG9yID09IG51bGwpIHsNCiAgICAg
ICAgICAgICAgICAgICAgICAgICgoVGV4dHVyZVJlbmRlcmVyKSBuZXdCYWNraW5nU3RvcmUpLnNl
dENvbG9yKGNhY2hlZFIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRHLCBjYWNoZWRCLCBjYWNoZWRBKTsN
CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICgo
VGV4dHVyZVJlbmRlcmVyKSBuZXdCYWNraW5nU3RvcmUpLnNldENvbG9yKGNhY2hlZENvbG9yKTsN
CiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0g
ZWxzZSB7DQogICAgICAgICAgICAgICAgbmVlZFRvUmVzZXRDb2xvciA9IHRydWU7DQogICAgICAg
ICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERlZmF1
bHRSZW5kZXJEZWxlZ2F0ZSBpbXBsZW1lbnRzIFJlbmRlckRlbGVnYXRlIHsNCiAgICAgICAgcHVi
bGljIGJvb2xlYW4gaW50ZW5zaXR5T25seSgpIHsNCiAgICAgICAgICAgIHJldHVybiB0cnVlOw0K
ICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIFJlY3RhbmdsZTJEIGdldEJvdW5kcyhDaGFyU2Vx
dWVuY2Ugc3RyLCBGb250IGZvbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgRm9udFJlbmRlckNvbnRleHQgZnJjKSB7DQogICAgICAgICAgICByZXR1cm4gZ2V0Qm91bmRz
KGZvbnQuY3JlYXRlR2x5cGhWZWN0b3IoZnJjLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNYXBDaGFyU2VxdWVuY2VUb0dseXBoVmVjdG9y
KHN0cikpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmMpOw0KICAgICAgICB9DQoN
CiAgICAgICAgcHVibGljIFJlY3RhbmdsZTJEIGdldEJvdW5kcyhTdHJpbmcgc3RyLCBGb250IGZv
bnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9udFJlbmRlckNvbnRl
eHQgZnJjKSB7DQogICAgICAgICAgICByZXR1cm4gZ2V0Qm91bmRzKGZvbnQuY3JlYXRlR2x5cGhW
ZWN0b3IoZnJjLCBzdHIpLCBmcmMpOw0KICAgICAgICB9DQoNCiAgICAgICAgLyoqDQogICAgICAg
ICAqIGVtemljOiBjaGFuZ2VkIHRoaXMgdG8gcmV0dXJuIHRoZSAicmVhbCIgZGltZW5zaW9uIG9m
IHRoZSBzdHJpbmcgaW5jbHVkaW5nIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UNCiAg
ICAgICAgICovDQogICAgICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRCb3VuZHMoR2x5cGhWZWN0
b3IgZ3YsIEZvbnRSZW5kZXJDb250ZXh0IGZyYykgew0KICAgICAgICAgICAgLy9yZXR1cm4gZ3Yu
Z2V0UGl4ZWxCb3VuZHMoZnJjLCAwLCAwKTsNCiAgICAgICAgCXJldHVybiBndi5nZXRMb2dpY2Fs
Qm91bmRzKCk7DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgdm9pZCBkcmF3R2x5cGhWZWN0
b3IoR3JhcGhpY3MyRCBncmFwaGljcywgR2x5cGhWZWN0b3Igc3RyLA0KICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5KSB7DQogICAgICAgICAgICBncmFwaGlj
cy5kcmF3R2x5cGhWZWN0b3Ioc3RyLCB4LCB5KTsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1Ymxp
YyB2b2lkIGRyYXcoR3JhcGhpY3MyRCBncmFwaGljcywgU3RyaW5nIHN0ciwgaW50IHgsIGludCB5
KSB7DQogICAgICAgICAgICBncmFwaGljcy5kcmF3U3RyaW5nKHN0ciwgeCwgeSk7DQogICAgICAg
IH0NCiAgICB9DQoNCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICAvLyBHbHlwaC1ieS1nbHlwaCBy
ZW5kZXJpbmcgc3VwcG9ydA0KICAgIC8vDQogICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRHJhd2lu
Z1N0YXRlIHsNCiAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZmFzdCA9IDE7DQogICAg
ICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJvYnVzdCA9IDI7DQogICAgICAgIHB1YmxpYyBz
dGF0aWMgZmluYWwgaW50IGZpbmlzaGVkID0gMzsNCiAgICB9DQoNCiAgICBjbGFzcyBHbHlwaHNV
cGxvYWRMaXN0IHsNCiAgICAgICAgaW50IG51bWJlck9mTmV3R2x5cGhzOw0KICAgICAgICBHbHlw
aFZlY3RvcltdIGdseXBoVmVjdG9yOw0KICAgICAgICBSZWN0YW5nbGUyRFtdIGdseXBoQm91bmRz
Ow0KICAgICAgICBpbnRbXSByZW5kZXJJbmRleDsNCiAgICAgICAgaW50W10gbmV3R2x5cGhzOw0K
ICAgICAgICBjaGFyW10gbmV3VW5pY29kZXM7DQoNCiAgICAgICAgdm9pZCBwcmVwR2x5cGhGb3JV
cGxvYWQoY2hhciBpblVuaWNvZGVJRCwgaW50IGluR2x5cGhJRCwNCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgUmVjdGFuZ2xlMkQgaW5Cb3VuZHMsIGludCBpbkksIEdseXBoVmVjdG9y
IGluR3YpIHsNCiAgICAgICAgICAgIGludCBzbG90ID0gdGhpcy5udW1iZXJPZk5ld0dseXBoczsN
Cg0KICAgICAgICAgICAgdGhpcy5uZXdVbmljb2Rlc1tzbG90XSA9IGluVW5pY29kZUlEOw0KICAg
ICAgICAgICAgdGhpcy5uZXdHbHlwaHNbc2xvdF0gPSBpbkdseXBoSUQ7DQogICAgICAgICAgICB0
aGlzLmdseXBoQm91bmRzW3Nsb3RdID0gaW5Cb3VuZHM7DQogICAgICAgICAgICB0aGlzLnJlbmRl
ckluZGV4W3Nsb3RdID0gaW5JOw0KICAgICAgICAgICAgdGhpcy5nbHlwaFZlY3RvcltzbG90XSA9
IGluR3Y7DQogICAgICAgICAgICB0aGlzLm51bWJlck9mTmV3R2x5cGhzKys7DQogICAgICAgIH0N
Cg0KICAgICAgICB2b2lkIHVwbG9hZEFueU5ld0dseXBocyhHbHlwaHNMaXN0IG91dExpc3QsIEds
eXBoUHJvZHVjZXIgbWFwcGVyKSB7DQogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRo
aXMubnVtYmVyT2ZOZXdHbHlwaHM7IGkrKykgew0KICAgICAgICAgICAgICAgIGlmIChtYXBwZXIu
dW5pY29kZXMyR2x5cGhzW3RoaXMubmV3VW5pY29kZXNbaV1dID09IG1hcHBlci51bmRlZmluZWQp
IHsNCiAgICAgICAgICAgICAgICAgICAgUmVjdGFuZ2xlMkQgYmJveCA9IG5vcm1hbGl6ZSh0aGlz
LmdseXBoQm91bmRzW2ldKTsNCiAgICAgICAgICAgICAgICAgICAgUG9pbnQgb3JpZ2luID0gbmV3
IFBvaW50KChpbnQpIC1iYm94LmdldE1pblgoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIChpbnQpIC1iYm94LmdldE1pblkoKSk7DQogICAgICAgICAgICAg
ICAgICAgIFJlY3QgcmVjdCA9IG5ldyBSZWN0KDAsIDAsIChpbnQpIGJib3guZ2V0V2lkdGgoKSwN
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgYmJveC5nZXRI
ZWlnaHQoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRl
eHREYXRhKG51bGwsIG9yaWdpbiwgdGhpcy5uZXdVbmljb2Rlc1tpXSkpOw0KICAgICAgICAgICAg
ICAgICAgICBHbHlwaFZlY3RvciBndiA9IHRoaXMuZ2x5cGhWZWN0b3JbaV07DQogICAgICAgICAg
ICAgICAgICAgIHRoaXMuZ2x5cGhWZWN0b3JbaV0gPSBudWxsOyAvLyA8LS0tIGRvbnQgbmVlZCB0
aGlzIGFueW1vcmUsIHNvIG51bGwgaXQNCg0KICAgICAgICAgICAgICAgICAgICBwYWNrZXIuYWRk
KHJlY3QpOw0KDQogICAgICAgICAgICAgICAgICAgIG1hcHBlci5nbHlwaFJlY3RGb3JUZXh0dXJl
TWFwcGluZ1t0aGlzLm5ld0dseXBoc1tpXV0gPSByZWN0Ow0KICAgICAgICAgICAgICAgICAgICBv
dXRMaXN0LnRleHR1cmVTb3VyY2VSZWN0W3RoaXMucmVuZGVySW5kZXhbaV1dID0gcmVjdDsNCiAg
ICAgICAgICAgICAgICAgICAgbWFwcGVyLnVuaWNvZGVzMkdseXBoc1t0aGlzLm5ld1VuaWNvZGVz
W2ldXSA9IHRoaXMubmV3R2x5cGhzW2ldOyAvLyBpIGRvIHRoaXMgaGVyZSwgc28gaWYgaSBnZXQg
dHdvIHVwbG9hZCByZXF1ZXN0cyBmb3Igc2FtZSBnbHlwaCwgd2UgaGFuZGxlIGl0IGNvcnJlY3Rs
eQ0KDQogICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzMkQgZyA9IGdldEdyYXBoaWNzMkQoKTsN
Cg0KICAgICAgICAgICAgICAgICAgICAvLyBPSywgc2hvdWxkIG5vdyBoYXZlIGFuICh4LCB5KSBm
b3IgdGhpcyByZWN0YW5nbGU7IHJhc3Rlcml6ZQ0KICAgICAgICAgICAgICAgICAgICAvLyB0aGUg
U3RyaW5nDQogICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBuZWVkIHRvIHZlcmlmeSB0aGF0
IHRoaXMgY2F1c2VzIHRoZSBTdHJpbmcgdG8gYmUNCiAgICAgICAgICAgICAgICAgICAgLy8gcmFz
dGVyaXplZCBmdWxseSBpbnRvIHRoZSBib3VuZGluZyByZWN0YW5nbGUNCiAgICAgICAgICAgICAg
ICAgICAgaW50IHN0cnggPSByZWN0LngoKSArIG9yaWdpbi54Ow0KICAgICAgICAgICAgICAgICAg
ICBpbnQgc3RyeSA9IHJlY3QueSgpICsgb3JpZ2luLnk7DQoNCiAgICAgICAgICAgICAgICAgICAg
Ly8gLS0tMXN0IGZyYW1lIHBlcmZvcm1hbmNlIGdhdGluZyBmYWN0b3ItLS0NCiAgICAgICAgICAg
ICAgICAgICAgLy8gQ2xlYXIgb3V0IHRoZSBhcmVhIHdlJ3JlIGdvaW5nIHRvIGRyYXcgaW50bw0K
ICAgICAgICAgICAgICAgICAgICAvLyAvLy0tIG9ubHkgaWYgd2UgcmV1c2UgYmFja2luZyBzdG9y
ZS4gIERvIHdlIGRvIHRoaXM/ICBJZiBzbywgd2Ugc2hvdWxkIGhhdmUgYSBmbGFnIHRoYXQgc2F5
cyB3ZSBuZWVkIHRvIGNsZWFyPyBvciBkbyBpdCBpbiBjbGVhclNwYWNlIGl0c2VsZg0KICAgICAg
ICAgICAgICAgICAgICBnLnNldENvbXBvc2l0ZShBbHBoYUNvbXBvc2l0ZS5DbGVhcik7DQogICAg
ICAgICAgICAgICAgICAgIGcuZmlsbFJlY3QocmVjdC54KCksIHJlY3QueSgpLCByZWN0LncoKSwg
cmVjdC5oKCkpOw0KICAgICAgICAgICAgICAgICAgICBnLnNldENvbXBvc2l0ZShBbHBoYUNvbXBv
c2l0ZS5TcmMpOw0KDQogICAgICAgICAgICAgICAgICAgIC8vIERyYXcgdGhlIHN0cmluZw0KICAg
ICAgICAgICAgICAgICAgICByZW5kZXJEZWxlZ2F0ZS5kcmF3R2x5cGhWZWN0b3IoZywgZ3YsIHN0
cngsIHN0cnkpOw0KDQogICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgdGhpcyByZWdpb24gb2Yg
dGhlIFRleHR1cmVSZW5kZXJlciBhcyBkaXJ0eQ0KICAgICAgICAgICAgICAgICAgICBnZXRCYWNr
aW5nU3RvcmUoKS5tYXJrRGlydHkocmVjdC54KCksIHJlY3QueSgpLCByZWN0LncoKSwNCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QuaCgpKTsNCiAg
ICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBvdXRMaXN0LnRleHR1
cmVTb3VyY2VSZWN0W3RoaXMucmVuZGVySW5kZXhbaV1dID0gbWFwcGVyLmdseXBoUmVjdEZvclRl
eHR1cmVNYXBwaW5nW3RoaXMubmV3R2x5cGhzW2ldXTsNCiAgICAgICAgICAgICAgICB9DQogICAg
ICAgICAgICB9DQoNCiAgICAgICAgICAgIHRoaXMubnVtYmVyT2ZOZXdHbHlwaHMgPSAwOw0KICAg
ICAgICB9DQoNCiAgICAgICAgcHVibGljIHZvaWQgYWxsb2NhdGVTcGFjZShpbnQgaW5MZW5ndGgp
IHsNCiAgICAgICAgICAgIGludCBhbGxvY0xlbmd0aCA9IE1hdGgubWF4KGluTGVuZ3RoLCAxMDAp
Ow0KDQogICAgICAgICAgICBpZiAoKGdseXBoVmVjdG9yID09IG51bGwpIHx8IChnbHlwaFZlY3Rv
ci5sZW5ndGggPCBhbGxvY0xlbmd0aCkpIHsNCiAgICAgICAgICAgICAgICBnbHlwaFZlY3RvciA9
IG5ldyBHbHlwaFZlY3RvclthbGxvY0xlbmd0aF07DQogICAgICAgICAgICAgICAgZ2x5cGhCb3Vu
ZHMgPSBuZXcgUmVjdGFuZ2xlMkRbYWxsb2NMZW5ndGhdOw0KICAgICAgICAgICAgICAgIHJlbmRl
ckluZGV4ID0gbmV3IGludFthbGxvY0xlbmd0aF07DQogICAgICAgICAgICAgICAgbmV3R2x5cGhz
ID0gbmV3IGludFthbGxvY0xlbmd0aF07DQogICAgICAgICAgICAgICAgbmV3VW5pY29kZXMgPSBu
ZXcgY2hhclthbGxvY0xlbmd0aF07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoN
CiAgICBzdGF0aWMgY2xhc3MgR2x5cGhzTGlzdCB7DQogICAgICAgIGludCAvKiBEcmF3aW5nU3Rh
dGUgKi8gbmV4dFN0YXRlOw0KICAgICAgICBDaGFyU2VxdWVuY2UgcmVtYWluaW5nOw0KICAgICAg
ICBmbG9hdFtdIGFkdmFuY2VzOw0KICAgICAgICBmbG9hdCB0b3RhbEFkdmFuY2U7DQogICAgICAg
IFJlY3RbXSB0ZXh0dXJlU291cmNlUmVjdDsNCiAgICAgICAgaW50IGxlbmd0aDsNCg0KICAgICAg
ICBwdWJsaWMgdm9pZCBhbGxvY2F0ZVNwYWNlKGludCBpbkxlbmd0aCkgew0KICAgICAgICAgICAg
aW50IGFsbG9jTGVuZ3RoID0gTWF0aC5tYXgoaW5MZW5ndGgsIDEwMCk7DQoNCiAgICAgICAgICAg
IGlmICgoYWR2YW5jZXMgPT0gbnVsbCkgfHwgKGFkdmFuY2VzLmxlbmd0aCA8IGFsbG9jTGVuZ3Ro
KSkgew0KICAgICAgICAgICAgICAgIGFkdmFuY2VzID0gbmV3IGZsb2F0W2FsbG9jTGVuZ3RoXTsN
CiAgICAgICAgICAgICAgICB0ZXh0dXJlU291cmNlUmVjdCA9IG5ldyBSZWN0W2FsbG9jTGVuZ3Ro
XTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGNsYXNzIEdseXBoUHJv
ZHVjZXIgew0KICAgICAgICBmaW5hbCBpbnQgdW5kZWZpbmVkID0gLTI7DQogICAgICAgIGZpbmFs
IGludCBuZWVkQ29tcGxleCA9IC0xOw0KICAgICAgICBGb250UmVuZGVyQ29udGV4dCBmb250UmVu
ZGVyQ29udGV4dDsNCiAgICAgICAgR2x5cGhzTGlzdCBnbHlwaHNPdXRwdXQgPSBuZXcgR2x5cGhz
TGlzdCgpOw0KICAgICAgICBHbHlwaHNVcGxvYWRMaXN0IGdseXBoc1RvVXBsb2FkID0gbmV3IEds
eXBoc1VwbG9hZExpc3QoKTsNCiAgICAgICAgY2hhcltdIHVuaWNvZGVzOw0KICAgICAgICBpbnRb
XSB1bmljb2RlczJHbHlwaHM7DQogICAgICAgIGNoYXJbXSBzaW5nbGVVbmljb2RlOw0KICAgICAg
ICBSZWN0W10gZ2x5cGhSZWN0Rm9yVGV4dHVyZU1hcHBpbmc7DQogICAgICAgIGZsb2F0W10gYWR2
YW5jZXM7DQogICAgICAgIE1hcENoYXJTZXF1ZW5jZVRvR2x5cGhWZWN0b3IgaXRlciA9IG5ldyBN
YXBDaGFyU2VxdWVuY2VUb0dseXBoVmVjdG9yKCk7DQogICAgICAgIGNoYXJbXSB0ZW1wQ2hhcnMg
PSBuZXcgY2hhclsxXTsNCg0KICAgICAgICBHbHlwaFByb2R1Y2VyKEZvbnRSZW5kZXJDb250ZXh0
IGZyYywgaW50IGZvbnRMZW5ndGhJbkdseXBocykgew0KICAgICAgICAgICAgZm9udFJlbmRlckNv
bnRleHQgPSBmcmM7DQoNCiAgICAgICAgICAgIGlmIChhZHZhbmNlcyA9PSBudWxsKSB7DQogICAg
ICAgICAgICAgICAgYWR2YW5jZXMgPSBuZXcgZmxvYXRbZm9udExlbmd0aEluR2x5cGhzXTsNCiAg
ICAgICAgICAgICAgICBnbHlwaFJlY3RGb3JUZXh0dXJlTWFwcGluZyA9IG5ldyBSZWN0W2ZvbnRM
ZW5ndGhJbkdseXBoc107DQogICAgICAgICAgICAgICAgdW5pY29kZXMyR2x5cGhzID0gbmV3IGlu
dFs1MTJdOw0KICAgICAgICAgICAgICAgIHNpbmdsZVVuaWNvZGUgPSBuZXcgY2hhclsxXTsNCiAg
ICAgICAgICAgICAgICBjbGVhckFsbENhY2hlRW50cmllcygpOw0KICAgICAgICAgICAgfQ0KICAg
ICAgICB9DQoNCiAgICAgICAgcHVibGljIHZvaWQgY2xlYXJDYWNoZUVudHJ5KGludCB1bmljb2Rl
SUQpIHsNCiAgICAgICAgICAgIHVuaWNvZGVzMkdseXBoc1t1bmljb2RlSURdID0gdW5kZWZpbmVk
Ow0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIHZvaWQgY2xlYXJBbGxDYWNoZUVudHJpZXMo
KSB7DQogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVuaWNvZGVzMkdseXBocy5sZW5n
dGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHVuaWNvZGVzMkdseXBoc1tpXSA9IHVuZGVmaW5l
ZDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyB2b2lkIGFsbG9j
YXRlU3BhY2UoaW50IGxlbmd0aCkgew0KICAgICAgICAgICAgbGVuZ3RoID0gTWF0aC5tYXgobGVu
Z3RoLCAxMDApOw0KDQogICAgICAgICAgICBpZiAoKHVuaWNvZGVzID09IG51bGwpIHx8ICh1bmlj
b2Rlcy5sZW5ndGggPCBsZW5ndGgpKSB7DQogICAgICAgICAgICAgICAgdW5pY29kZXMgPSBuZXcg
Y2hhcltsZW5ndGhdOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBnbHlwaHNUb1VwbG9h
ZC5hbGxvY2F0ZVNwYWNlKGxlbmd0aCk7DQogICAgICAgICAgICBnbHlwaHNPdXRwdXQuYWxsb2Nh
dGVTcGFjZShsZW5ndGgpOw0KICAgICAgICB9DQoNCiAgICAgICAgZmxvYXQgZ2V0R2x5cGhQaXhl
bFdpZHRoKGNoYXIgdW5pY29kZUlEKSB7DQogICAgICAgICAgICBpbnQgZ2x5cGhJRCA9IHVuZGVm
aW5lZDsNCg0KICAgICAgICAgICAgaWYgKHVuaWNvZGVJRCA8IHVuaWNvZGVzMkdseXBocy5sZW5n
dGgpIC8vIDwtLS0gY291bGQgc3VwcG9ydCB0aGUgcmFyZSBoaWdoIHVuaWNvZGUgYmV0dGVyIGxh
dGVyDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBnbHlwaElEID0gdW5p
Y29kZXMyR2x5cGhzW3VuaWNvZGVJRF07IC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGFscmVh
ZHkgZW5jb3VudGVyZWQgdGhpcyB1bmljb2RlDQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAg
ICAgICBpZiAoZ2x5cGhJRCAhPSB1bmRlZmluZWQpIC8vIGlmIHdlIGhhdmVuJ3QsIHdlIG11c3Qg
Z2V0IHNvbWUgaXRzIGF0dHJpYnV0ZXMsIGFuZCBwcmVwIGZvciB1cGxvYWQNCiAgICAgICAgICAg
ICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBhZHZhbmNlc1tnbHlwaElEXTsNCiAg
ICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgIHRlbXBDaGFyc1swXSA9IHVuaWNvZGVJ
RDsNCg0KICAgICAgICAgICAgICAgIEdseXBoVmVjdG9yIGZ1bGxSdW5HbHlwaFZlY3RvciA9IGZv
bnQuY3JlYXRlR2x5cGhWZWN0b3IoZm9udFJlbmRlckNvbnRleHQsDQogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgdGVtcENoYXJzKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gZnVsbFJ1bkdseXBoVmVjdG9y
LmdldEdseXBoTWV0cmljcygwKS5nZXRBZHZhbmNlKCk7DQoNCiAgICAgICAgICAgIC8vICAgICAg
ICAgICAgcmV0dXJuIC0xOw0KICAgICAgICB9DQoNCiAgICAgICAgR2x5cGhzTGlzdCBwdW50VG9S
b2J1c3QoQ2hhclNlcXVlbmNlIGluU3RyaW5nKSB7DQogICAgICAgICAgICBnbHlwaHNPdXRwdXQu
bmV4dFN0YXRlID0gRHJhd2luZ1N0YXRlLnJvYnVzdDsNCiAgICAgICAgICAgIGdseXBoc091dHB1
dC5yZW1haW5pbmcgPSBpblN0cmluZzsNCiAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBnbHlwaCB1
cGxvYWRlcg0KICAgICAgICAgICAgZ2x5cGhzVG9VcGxvYWQubnVtYmVyT2ZOZXdHbHlwaHMgPSAw
Ow0KICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGdseXBoIGxpc3QNCiAgICAgICAgICAgIGdseXBo
c091dHB1dC5sZW5ndGggPSAwOw0KICAgICAgICAgICAgZ2x5cGhzT3V0cHV0LnRvdGFsQWR2YW5j
ZSA9IDA7DQoNCiAgICAgICAgICAgIHJldHVybiBnbHlwaHNPdXRwdXQ7DQogICAgICAgIH0NCg0K
ICAgICAgICBHbHlwaHNMaXN0IGdldEdseXBocyhDaGFyU2VxdWVuY2UgaW5TdHJpbmcpIHsNCiAg
ICAgICAgICAgIGZsb2F0IGZvbnRTaXplID0gZm9udC5nZXRTaXplKCk7DQoNCiAgICAgICAgICAg
IGlmIChmb250U2l6ZSA+IDEyOCkgew0KICAgICAgICAgICAgICAgIGdseXBoc091dHB1dC5uZXh0
U3RhdGUgPSBEcmF3aW5nU3RhdGUucm9idXN0Ow0KICAgICAgICAgICAgICAgIGdseXBoc091dHB1
dC5yZW1haW5pbmcgPSBpblN0cmluZzsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaW50
IGxlbmd0aCA9IGluU3RyaW5nLmxlbmd0aCgpOw0KICAgICAgICAgICAgYWxsb2NhdGVTcGFjZShs
ZW5ndGgpOw0KDQogICAgICAgICAgICBpdGVyLmluaXRGcm9tQ2hhclNlcXVlbmNlKGluU3RyaW5n
KTsNCg0KICAgICAgICAgICAgR2x5cGhWZWN0b3IgZnVsbFJ1bkdseXBoVmVjdG9yID0gZm9udC5j
cmVhdGVHbHlwaFZlY3Rvcihmb250UmVuZGVyQ29udGV4dCwNCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcik7DQog
ICAgICAgICAgICBib29sZWFuIGNvbXBsZXggPSAoZnVsbFJ1bkdseXBoVmVjdG9yLmdldExheW91
dEZsYWdzKCkgIT0gMCk7DQogICAgICAgICAgICBpbnQgbGVuZ3RoSW5HbHlwaHMgPSBmdWxsUnVu
R2x5cGhWZWN0b3IuZ2V0TnVtR2x5cGhzKCk7DQoNCiAgICAgICAgICAgIGlmIChjb21wbGV4KSB7
DQogICAgICAgICAgICAgICAgcmV0dXJuIHB1bnRUb1JvYnVzdChpblN0cmluZyk7DQogICAgICAg
ICAgICB9DQoNCiAgICAgICAgICAgIFRleHR1cmVSZW5kZXJlciByZW5kZXJlciA9IGdldEJhY2tp
bmdTdG9yZSgpOw0KDQogICAgICAgICAgICBmbG9hdCB0b3RhbEFkdmFuY2VVcGxvYWRlZCA9IDA7
DQogICAgICAgICAgICBmbG9hdCBjYWNoZVNpemUgPSByZW5kZXJlci5nZXRXaWR0aCgpICogcmVu
ZGVyZXIuZ2V0SGVpZ2h0KCk7DQoNCiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVu
Z3RoSW5HbHlwaHM7IGkrKykgew0KICAgICAgICAgICAgICAgIGZsb2F0IGFkdmFuY2U7DQoNCiAg
ICAgICAgICAgICAgICBjaGFyIHVuaWNvZGVJRCA9IGluU3RyaW5nLmNoYXJBdChpKTsNCg0KICAg
ICAgICAgICAgICAgIGlmICh1bmljb2RlSUQgPj0gdW5pY29kZXMyR2x5cGhzLmxlbmd0aCkgeyAv
LyA8LS0gLWNvdWxkIHN1cHBvcnQgdGhlc2UgYmV0dGVyDQogICAgICAgICAgICAgICAgICAgIHJl
dHVybiBwdW50VG9Sb2J1c3QoaW5TdHJpbmcpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAg
ICAgICAgICAgIGludCBnbHlwaElEID0gdW5pY29kZXMyR2x5cGhzW3VuaWNvZGVJRF07IC8vIENo
ZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGFscmVhZHkgZW5jb3VudGVyZWQgdGhpcyB1bmljb2RlDQoN
CiAgICAgICAgICAgICAgICBpZiAoZ2x5cGhJRCA9PSB1bmRlZmluZWQpIHsgLy8gaWYgd2UgaGF2
ZW4ndCwgd2UgbXVzdCBnZXQgc29tZSBpdHMgYXR0cmlidXRlcywgYW5kIHByZXAgZm9yIHVwbG9h
ZA0KICAgICAgICAgICAgICAgICAgICBHbHlwaE1ldHJpY3MgbWV0cmljcyA9IGZ1bGxSdW5HbHlw
aFZlY3Rvci5nZXRHbHlwaE1ldHJpY3MoaSk7DQogICAgICAgICAgICAgICAgICAgIHNpbmdsZVVu
aWNvZGVbMF0gPSB1bmljb2RlSUQ7DQoNCiAgICAgICAgICAgICAgICAgICAgR2x5cGhWZWN0b3Ig
Z3YgPSBmb250LmNyZWF0ZUdseXBoVmVjdG9yKGZvbnRSZW5kZXJDb250ZXh0LA0KICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xl
VW5pY29kZSk7IC8vIG5lZWQgdGhpcyB0byBnZXQgc2luZ2xlIGJpdG1hcHMNCiAgICAgICAgICAg
ICAgICAgICAgZ2x5cGhJRCA9IGd2LmdldEdseXBoQ29kZSgwKTsNCiAgICAgICAgICAgICAgICAg
ICAgLy8gSGF2ZSBzZWVuIGh1Z2UgZ2x5cGggY29kZXMgKDY1NTM2KSBjb21pbmcgb3V0IG9mIHNv
bWUgZm9udHMgaW4gc29tZSBVbmljb2RlIHNpdHVhdGlvbnMNCiAgICAgICAgICAgICAgICAgICAg
aWYgKGdseXBoSUQgPj0gYWR2YW5jZXMubGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgICAg
ICByZXR1cm4gcHVudFRvUm9idXN0KGluU3RyaW5nKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0K
ICAgICAgICAgICAgICAgICAgICBhZHZhbmNlID0gbWV0cmljcy5nZXRBZHZhbmNlKCk7DQogICAg
ICAgICAgICAgICAgICAgIGFkdmFuY2VzW2dseXBoSURdID0gYWR2YW5jZTsNCg0KICAgICAgICAg
ICAgICAgICAgICBnbHlwaHNUb1VwbG9hZC5wcmVwR2x5cGhGb3JVcGxvYWQodW5pY29kZUlELCBn
bHlwaElELA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgcmVuZGVyRGVsZWdhdGUuZ2V0Qm91bmRzKGd2LCBmb250UmVuZGVyQ29udGV4dCksIGks
IGd2KTsNCg0KICAgICAgICAgICAgICAgICAgICB0b3RhbEFkdmFuY2VVcGxvYWRlZCArPSBhZHZh
bmNlOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIFJlY3Qg
ciA9IGdseXBoUmVjdEZvclRleHR1cmVNYXBwaW5nW2dseXBoSURdOw0KICAgICAgICAgICAgICAg
ICAgICBnbHlwaHNPdXRwdXQudGV4dHVyZVNvdXJjZVJlY3RbaV0gPSByOw0KDQogICAgICAgICAg
ICAgICAgICAgIFRleHREYXRhIGRhdGEgPSAoVGV4dERhdGEpIHIuZ2V0VXNlckRhdGEoKTsNCiAg
ICAgICAgICAgICAgICAgICAgZGF0YS5tYXJrVXNlZCgpOw0KDQogICAgICAgICAgICAgICAgICAg
IGFkdmFuY2UgPSBhZHZhbmNlc1tnbHlwaElEXTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAg
ICAgICAgICAgICBnbHlwaHNPdXRwdXQuYWR2YW5jZXNbaV0gPSBhZHZhbmNlOw0KICAgICAgICAg
ICAgICAgIGdseXBoc091dHB1dC50b3RhbEFkdmFuY2UgKz0gYWR2YW5jZTsNCg0KICAgICAgICAg
ICAgICAgIGlmICgodG90YWxBZHZhbmNlVXBsb2FkZWQgKiBmb250U2l6ZSkgPiAoMC4yNWYgKiBj
YWNoZVNpemUpKSAvLyBub3RlIC0tIGlmIHRoZSBpbmNvbWluZyBzdHJpbmcgaXMgYmlnZ2VyIHRo
YW4gMS80IHRoZSB0b3RhbCBmb250IGNhY2hlLCBzdGFydCBzZWdtZW50aW5nIGdseXBoIHN0cmVh
bSBpbnRvIGJpdGUgc2l6ZWQgcGllY2VzDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAg
ICAgICAgICAgICAgICAgIGdseXBoc1RvVXBsb2FkLnVwbG9hZEFueU5ld0dseXBocyhnbHlwaHNP
dXRwdXQsIHRoaXMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhzT3V0cHV0Lmxlbmd0
aCA9IGkgKyAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhzT3V0cHV0LnJlbWFpbmlu
ZyA9IGluU3RyaW5nLnN1YlNlcXVlbmNlKGkgKyAxLCBsZW5ndGgpOw0KICAgICAgICAgICAgICAg
ICAgICAgICAgZ2x5cGhzT3V0cHV0Lm5leHRTdGF0ZSA9IERyYXdpbmdTdGF0ZS5mYXN0Ow0KDQog
ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2x5cGhzT3V0cHV0Ow0KICAgICAgICAgICAg
ICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGdseXBoc091dHB1dC5sZW5n
dGggPSBsZW5ndGhJbkdseXBoczsNCiAgICAgICAgICAgIGdseXBoc1RvVXBsb2FkLnVwbG9hZEFu
eU5ld0dseXBocyhnbHlwaHNPdXRwdXQsIHRoaXMpOw0KICAgICAgICAgICAgZ2x5cGhzT3V0cHV0
Lm5leHRTdGF0ZSA9IERyYXdpbmdTdGF0ZS5maW5pc2hlZDsNCg0KICAgICAgICAgICAgcmV0dXJu
IGdseXBoc091dHB1dDsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGNsYXNzIFBpcGVsaW5lZF9R
dWFkUmVuZGVyZXIgew0KICAgICAgICBpbnQgbU91dHN0YW5kaW5nR2x5cGhzVmVydGljZXNQaXBl
bGluZSA9IDA7DQogICAgICAgIEZsb2F0QnVmZmVyIG1UZXhDb29yZHM7DQogICAgICAgIEZsb2F0
QnVmZmVyIG1WZXJ0Q29vcmRzOw0KICAgICAgICBib29sZWFuIHVzaW5nVkJPczsNCiAgICAgICAg
aW50IG1WQk9fRm9yX1Jlc3VhYmxlVGlsZVZlcnRpY2VzOw0KICAgICAgICBpbnQgbVZCT19Gb3Jf
UmVzdWFibGVUaWxlVGV4Q29vcmRzOw0KDQogICAgICAgIFBpcGVsaW5lZF9RdWFkUmVuZGVyZXIo
KSB7DQogICAgICAgICAgICBHTCBnbCA9IEdMVS5nZXRDdXJyZW50R0woKTsNCiAgICAgICAgICAg
IG1WZXJ0Q29vcmRzID0gQnVmZmVyVXRpbC5uZXdGbG9hdEJ1ZmZlcihrVG90YWxCdWZmZXJTaXpl
Q29vcmRzVmVydHMpOw0KICAgICAgICAgICAgbVRleENvb3JkcyA9IEJ1ZmZlclV0aWwubmV3Rmxv
YXRCdWZmZXIoa1RvdGFsQnVmZmVyU2l6ZUNvb3Jkc1RleCk7DQoNCiAgICAgICAgICAgIHVzaW5n
VkJPcyA9IChnbC5pc0V4dGVuc2lvbkF2YWlsYWJsZSgiR0xfVkVSU0lPTl8xXzUiKSk7DQoNCiAg
ICAgICAgICAgIGlmICh1c2luZ1ZCT3MpIHsNCiAgICAgICAgICAgICAgICBpbnRbXSB2Ym9zID0g
bmV3IGludFsyXTsNCiAgICAgICAgICAgICAgICBnbC5nbEdlbkJ1ZmZlcnMoMiwgSW50QnVmZmVy
LndyYXAodmJvcykpOw0KDQogICAgICAgICAgICAgICAgbVZCT19Gb3JfUmVzdWFibGVUaWxlVmVy
dGljZXMgPSB2Ym9zWzBdOw0KICAgICAgICAgICAgICAgIG1WQk9fRm9yX1Jlc3VhYmxlVGlsZVRl
eENvb3JkcyA9IHZib3NbMV07DQoNCiAgICAgICAgICAgICAgICBnbC5nbEJpbmRCdWZmZXIoR0wu
R0xfQVJSQVlfQlVGRkVSLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVkJPX0Zv
cl9SZXN1YWJsZVRpbGVWZXJ0aWNlcyk7DQogICAgICAgICAgICAgICAgZ2wuZ2xCdWZmZXJEYXRh
KEdMLkdMX0FSUkFZX0JVRkZFUiwga1RvdGFsQnVmZmVyU2l6ZUJ5dGVzVmVydHMsDQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIEdMLkdMX1NUUkVBTV9EUkFXKTsgLy8gc3Ry
ZWFtIGRyYXcgYmVjYXVzZSB0aGlzIGlzIGEgc2luZ2xlIHF1YWQgdXNlIHBpcGVsaW5lDQoNCiAg
ICAgICAgICAgICAgICBnbC5nbEJpbmRCdWZmZXIoR0wuR0xfQVJSQVlfQlVGRkVSLA0KICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBtVkJPX0Zvcl9SZXN1YWJsZVRpbGVUZXhDb29yZHMp
Ow0KICAgICAgICAgICAgICAgIGdsLmdsQnVmZmVyRGF0YShHTC5HTF9BUlJBWV9CVUZGRVIsIGtU
b3RhbEJ1ZmZlclNpemVCeXRlc1RleCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
bnVsbCwgR0wuR0xfU1RSRUFNX0RSQVcpOyAvLyBzdHJlYW0gZHJhdyBiZWNhdXNlIHRoaXMgaXMg
YSBzaW5nbGUgcXVhZCB1c2UgcGlwZWxpbmUNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQog
ICAgICAgIHB1YmxpYyB2b2lkIGdsVGV4Q29vcmQyZihmbG9hdCB2LCBmbG9hdCB2MSkgew0KICAg
ICAgICAgICAgbVRleENvb3Jkcy5wdXQodik7DQogICAgICAgICAgICBtVGV4Q29vcmRzLnB1dCh2
MSk7DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgdm9pZCBnbFZlcnRleDNmKGZsb2F0IGlu
WCwgZmxvYXQgaW5ZLCBmbG9hdCBpblopIHsNCiAgICAgICAgICAgIG1WZXJ0Q29vcmRzLnB1dChp
blgpOw0KICAgICAgICAgICAgbVZlcnRDb29yZHMucHV0KGluWSk7DQogICAgICAgICAgICBtVmVy
dENvb3Jkcy5wdXQoaW5aKTsNCg0KICAgICAgICAgICAgbU91dHN0YW5kaW5nR2x5cGhzVmVydGlj
ZXNQaXBlbGluZSsrOw0KDQogICAgICAgICAgICBpZiAobU91dHN0YW5kaW5nR2x5cGhzVmVydGlj
ZXNQaXBlbGluZSA+PSBrVG90YWxCdWZmZXJTaXplVmVydHMpIHsNCiAgICAgICAgICAgICAgICBk
cmF3KCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIHByaXZh
dGUgdm9pZCBkcmF3KCkgew0KICAgICAgICAJaWYgKHVzZVZlcnRleEFycmF5cykgew0KICAgICAg
ICAJCWRyYXdWZXJ0ZXhBcnJheXMoKTsNCiAgICAgICAgCX0gZWxzZSB7DQogICAgICAgIAkJZHJh
d0lNTUVESUFURSgpOw0KICAgICAgICAJfQ0KICAgICAgICB9DQoNCiAgICAgICAgcHJpdmF0ZSB2
b2lkIGRyYXdWZXJ0ZXhBcnJheXMoKSB7DQogICAgICAgICAgICBpZiAobU91dHN0YW5kaW5nR2x5
cGhzVmVydGljZXNQaXBlbGluZSA+IDApIHsNCiAgICAgICAgICAgICAgICBHTCBnbCA9IEdMVS5n
ZXRDdXJyZW50R0woKTsNCg0KICAgICAgICAgICAgICAgIFRleHR1cmVSZW5kZXJlciByZW5kZXJl
ciA9IGdldEJhY2tpbmdTdG9yZSgpOw0KICAgICAgICAgICAgICAgIFRleHR1cmUgdGV4dHVyZSA9
IHJlbmRlcmVyLmdldFRleHR1cmUoKTsgLy8gdHJpZ2dlcnMgdGV4dHVyZSB1cGxvYWRzLiAgTWF5
YmUgdGhpcyBzaG91bGQgYmUgbW9yZSBvYnZpb3VzPw0KDQogICAgICAgICAgICAgICAgbVZlcnRD
b29yZHMucmV3aW5kKCk7DQogICAgICAgICAgICAgICAgbVRleENvb3Jkcy5yZXdpbmQoKTsNCg0K
ICAgICAgICAgICAgICAgIGdsLmdsRW5hYmxlQ2xpZW50U3RhdGUoR0wuR0xfVkVSVEVYX0FSUkFZ
KTsNCg0KICAgICAgICAgICAgICAgIGlmICh1c2luZ1ZCT3MpIHsNCiAgICAgICAgICAgICAgICAg
ICAgZ2wuZ2xCaW5kQnVmZmVyKEdMLkdMX0FSUkFZX0JVRkZFUiwNCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIG1WQk9fRm9yX1Jlc3VhYmxlVGlsZVZlcnRpY2VzKTsNCiAgICAg
ICAgICAgICAgICAgICAgZ2wuZ2xCdWZmZXJTdWJEYXRhKEdMLkdMX0FSUkFZX0JVRkZFUiwgMCwN
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRzdGFuZGluZ0dseXBo
c1ZlcnRpY2VzUGlwZWxpbmUgKiBrU2l6ZUluQnl0ZXNfT25lVmVydGljZXNfVmVydGV4RGF0YSwN
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WZXJ0Q29vcmRzKTsgLy8g
dXBsb2FkIG9ubHkgdGhlIG5ldyBzdHVmZg0KICAgICAgICAgICAgICAgICAgICBnbC5nbFZlcnRl
eFBvaW50ZXIoMywgR0wuR0xfRkxPQVQsIDAsIDApOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7
DQogICAgICAgICAgICAgICAgICAgIGdsLmdsVmVydGV4UG9pbnRlcigzLCBHTC5HTF9GTE9BVCwg
MCwgbVZlcnRDb29yZHMpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGds
LmdsQ2xpZW50QWN0aXZlVGV4dHVyZShHTC5HTF9URVhUVVJFMCk7DQogICAgICAgICAgICAgICAg
Z2wuZ2xFbmFibGVDbGllbnRTdGF0ZShHTC5HTF9URVhUVVJFX0NPT1JEX0FSUkFZKTsNCg0KICAg
ICAgICAgICAgICAgIGlmICh1c2luZ1ZCT3MpIHsNCiAgICAgICAgICAgICAgICAgICAgZ2wuZ2xC
aW5kQnVmZmVyKEdMLkdMX0FSUkFZX0JVRkZFUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG1WQk9fRm9yX1Jlc3VhYmxlVGlsZVRleENvb3Jkcyk7DQogICAgICAgICAgICAg
ICAgICAgIGdsLmdsQnVmZmVyU3ViRGF0YShHTC5HTF9BUlJBWV9CVUZGRVIsIDAsDQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0c3RhbmRpbmdHbHlwaHNWZXJ0aWNl
c1BpcGVsaW5lICoga1NpemVJbkJ5dGVzX09uZVZlcnRpY2VzX1RleERhdGEsDQogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGV4Q29vcmRzKTsgLy8gdXBsb2FkIG9ubHkg
dGhlIG5ldyBzdHVmZg0KICAgICAgICAgICAgICAgICAgICBnbC5nbFRleENvb3JkUG9pbnRlcigy
LCBHTC5HTF9GTE9BVCwgMCwgMCk7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAg
ICAgICAgICAgICAgZ2wuZ2xUZXhDb29yZFBvaW50ZXIoMiwgR0wuR0xfRkxPQVQsIDAsIG1UZXhD
b29yZHMpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGdsLmdsRHJhd0Fy
cmF5cyhHTC5HTF9RVUFEUywgMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91
dHN0YW5kaW5nR2x5cGhzVmVydGljZXNQaXBlbGluZSk7DQoNCiAgICAgICAgICAgICAgICBtVmVy
dENvb3Jkcy5yZXdpbmQoKTsNCiAgICAgICAgICAgICAgICBtVGV4Q29vcmRzLnJld2luZCgpOw0K
ICAgICAgICAgICAgICAgIG1PdXRzdGFuZGluZ0dseXBoc1ZlcnRpY2VzUGlwZWxpbmUgPSAwOw0K
ICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcHJpdmF0ZSB2b2lkIGRyYXdJTU1F
RElBVEUoKSB7DQogICAgICAgICAgICBpZiAobU91dHN0YW5kaW5nR2x5cGhzVmVydGljZXNQaXBl
bGluZSA+IDApIHsNCiAgICAgICAgICAgICAgICBUZXh0dXJlUmVuZGVyZXIgcmVuZGVyZXIgPSBn
ZXRCYWNraW5nU3RvcmUoKTsNCiAgICAgICAgICAgICAgICBUZXh0dXJlIHRleHR1cmUgPSByZW5k
ZXJlci5nZXRUZXh0dXJlKCk7IC8vIHRyaWdnZXJzIHRleHR1cmUgdXBsb2Fkcy4gIE1heWJlIHRo
aXMgc2hvdWxkIGJlIG1vcmUgb2J2aW91cz8NCg0KICAgICAgICAgICAgICAgIEdMIGdsID0gR0xV
LmdldEN1cnJlbnRHTCgpOw0KICAgICAgICAgICAgICAgIGdsLmdsQmVnaW4oR0wuR0xfUVVBRFMp
Ow0KDQogICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgaW50IG51bWJl
ck9mUXVhZHMgPSBtT3V0c3RhbmRpbmdHbHlwaHNWZXJ0aWNlc1BpcGVsaW5lIC8gNDsNCiAgICAg
ICAgICAgICAgICAgICAgbVZlcnRDb29yZHMucmV3aW5kKCk7DQogICAgICAgICAgICAgICAgICAg
IG1UZXhDb29yZHMucmV3aW5kKCk7DQoNCiAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9
IDA7IGkgPCBudW1iZXJPZlF1YWRzOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGds
LmdsVGV4Q29vcmQyZihtVGV4Q29vcmRzLmdldCgpLCBtVGV4Q29vcmRzLmdldCgpKTsNCiAgICAg
ICAgICAgICAgICAgICAgICAgIGdsLmdsVmVydGV4M2YobVZlcnRDb29yZHMuZ2V0KCksIG1WZXJ0
Q29vcmRzLmdldCgpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmVy
dENvb3Jkcy5nZXQoKSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGdsLmdsVGV4Q29vcmQy
ZihtVGV4Q29vcmRzLmdldCgpLCBtVGV4Q29vcmRzLmdldCgpKTsNCiAgICAgICAgICAgICAgICAg
ICAgICAgIGdsLmdsVmVydGV4M2YobVZlcnRDb29yZHMuZ2V0KCksIG1WZXJ0Q29vcmRzLmdldCgp
LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmVydENvb3Jkcy5nZXQo
KSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGdsLmdsVGV4Q29vcmQyZihtVGV4Q29vcmRz
LmdldCgpLCBtVGV4Q29vcmRzLmdldCgpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGdsLmds
VmVydGV4M2YobVZlcnRDb29yZHMuZ2V0KCksIG1WZXJ0Q29vcmRzLmdldCgpLA0KICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmVydENvb3Jkcy5nZXQoKSk7DQoNCiAgICAg
ICAgICAgICAgICAgICAgICAgIGdsLmdsVGV4Q29vcmQyZihtVGV4Q29vcmRzLmdldCgpLCBtVGV4
Q29vcmRzLmdldCgpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGdsLmdsVmVydGV4M2YobVZl
cnRDb29yZHMuZ2V0KCksIG1WZXJ0Q29vcmRzLmdldCgpLA0KICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBtVmVydENvb3Jkcy5nZXQoKSk7DQogICAgICAgICAgICAgICAgICAg
IH0NCiAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KICAgICAgICAgICAg
ICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KICAgICAgICAgICAgICAgIH0gZmluYWxseSB7
DQogICAgICAgICAgICAgICAgICAgIGdsLmdsRW5kKCk7DQogICAgICAgICAgICAgICAgICAgIG1W
ZXJ0Q29vcmRzLnJld2luZCgpOw0KICAgICAgICAgICAgICAgICAgICBtVGV4Q29vcmRzLnJld2lu
ZCgpOw0KICAgICAgICAgICAgICAgICAgICBtT3V0c3RhbmRpbmdHbHlwaHNWZXJ0aWNlc1BpcGVs
aW5lID0gMDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAg
ICB9DQoNCiAgICBjbGFzcyBEZWJ1Z0xpc3RlbmVyIGltcGxlbWVudHMgR0xFdmVudExpc3RlbmVy
IHsNCiAgICAgICAgcHJpdmF0ZSBHTFUgZ2x1ID0gbmV3IEdMVSgpOw0KICAgICAgICBwcml2YXRl
IEZyYW1lIGZyYW1lOw0KDQogICAgICAgIERlYnVnTGlzdGVuZXIoRnJhbWUgZnJhbWUpIHsNCiAg
ICAgICAgICAgIHRoaXMuZnJhbWUgPSBmcmFtZTsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1Ymxp
YyB2b2lkIGRpc3BsYXkoR0xBdXRvRHJhd2FibGUgZHJhd2FibGUpIHsNCiAgICAgICAgICAgIEdM
IGdsID0gZHJhd2FibGUuZ2V0R0woKTsNCiAgICAgICAgICAgIGdsLmdsQ2xlYXIoR0wuR0xfREVQ
VEhfQlVGRkVSX0JJVCB8IEdMLkdMX0NPTE9SX0JVRkZFUl9CSVQpOw0KDQogICAgICAgICAgICBp
ZiAocGFja2VyID09IG51bGwpIHsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAg
ICB9DQoNCiAgICAgICAgICAgIFRleHR1cmVSZW5kZXJlciByZW5kID0gZ2V0QmFja2luZ1N0b3Jl
KCk7DQogICAgICAgICAgICBmaW5hbCBpbnQgdyA9IHJlbmQuZ2V0V2lkdGgoKTsNCiAgICAgICAg
ICAgIGZpbmFsIGludCBoID0gcmVuZC5nZXRIZWlnaHQoKTsNCiAgICAgICAgICAgIHJlbmQuYmVn
aW5PcnRob1JlbmRlcmluZyh3LCBoKTsNCiAgICAgICAgICAgIHJlbmQuZHJhd09ydGhvUmVjdCgw
LCAwKTsNCiAgICAgICAgICAgIHJlbmQuZW5kT3J0aG9SZW5kZXJpbmcoKTsNCg0KICAgICAgICAg
ICAgaWYgKChmcmFtZS5nZXRXaWR0aCgpICE9IHcpIHx8IChmcmFtZS5nZXRIZWlnaHQoKSAhPSBo
KSkgew0KICAgICAgICAgICAgICAgIEV2ZW50UXVldWUuaW52b2tlTGF0ZXIobmV3IFJ1bm5hYmxl
KCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgew0KICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLnNldFNpemUodywgaCk7DQogICAgICAgICAgICAg
ICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfQ0KICAg
ICAgICB9DQoNCiAgICAgICAgLy8gVW51c2VkIG1ldGhvZHMNCiAgICAgICAgcHVibGljIHZvaWQg
aW5pdChHTEF1dG9EcmF3YWJsZSBkcmF3YWJsZSkgew0KICAgICAgICB9DQoNCiAgICAgICAgcHVi
bGljIHZvaWQgcmVzaGFwZShHTEF1dG9EcmF3YWJsZSBkcmF3YWJsZSwgaW50IHgsIGludCB5LCBp
bnQgd2lkdGgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCkgew0KICAg
ICAgICB9DQoNCiAgICAgICAgcHVibGljIHZvaWQgZGlzcGxheUNoYW5nZWQoR0xBdXRvRHJhd2Fi
bGUgZHJhd2FibGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4g
bW9kZUNoYW5nZWQsIGJvb2xlYW4gZGV2aWNlQ2hhbmdlZCkgew0KICAgICAgICB9DQogICAgfQ0K
DQoJcHVibGljIGJvb2xlYW4gaXNVc2VWZXJ0ZXhBcnJheXMoKSB7DQoJCXJldHVybiB1c2VWZXJ0
ZXhBcnJheXM7DQoJfQ0KDQoJcHVibGljIHZvaWQgc2V0VXNlVmVydGV4QXJyYXlzKGJvb2xlYW4g
dXNlVmVydGV4QXJyYXlzKSB7DQoJCXRoaXMudXNlVmVydGV4QXJyYXlzID0gdXNlVmVydGV4QXJy
YXlzOw0KCX0NCn0NCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>