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

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>36814</bug_id>
          
          <creation_ts>2010-03-30 02:51:07 -0700</creation_ts>
          <short_desc>[DRT/Chromium] Add TestShell and WebViewHost class, main(), and so on</short_desc>
          <delta_ts>2010-04-01 20:37:53 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>35902</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Kent Tamura">tkent</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>dglazkov</cc>
    
    <cc>fishd</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>205922</commentid>
    <comment_count>0</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-03-30 02:51:07 -0700</bug_when>
    <thetext>[DRT/Chromium] Add TestShell and WebViewHost class, main(), and so on</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>205924</commentid>
    <comment_count>1</comment_count>
      <attachid>52019</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-03-30 03:04:52 -0700</bug_when>
    <thetext>Created attachment 52019
Proposed patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>205925</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-03-30 03:07:12 -0700</bug_when>
    <thetext>Attachment 52019 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
WebKitTools/DumpRenderTree/chromium/config.h:38:  Streams are highly discouraged.  [readability/streams] [3]
WebKitTools/DumpRenderTree/chromium/DumpRenderTree.cpp:33:  Found other header before a header this file implements. Should be: config.h, primary header, blank line, and then alphabetically sorted.  [build/include_order] [4]
Total errors found: 2 in 8 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>205926</commentid>
    <comment_count>3</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-03-30 03:12:13 -0700</bug_when>
    <thetext>Sorry for the very huge patch.
These files are related to each other strongly.

(In reply to comment #2)
&gt; WebKitTools/DumpRenderTree/chromium/config.h:38:  Streams are highly
&gt; discouraged.  [readability/streams] [3]
&gt; WebKitTools/DumpRenderTree/chromium/DumpRenderTree.cpp:33:  Found other header
&gt; before a header this file implements. Should be: config.h, primary header,
&gt; blank line, and then alphabetically sorted.  [build/include_order] [4]
&gt; Total errors found: 2 in 8 files

These style errors are expected, and I think we can&apos;t avoid them.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>207177</commentid>
    <comment_count>4</comment_count>
      <attachid>52019</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2010-04-01 08:47:31 -0700</bug_when>
    <thetext>Comment on attachment 52019
Proposed patch

ok. I apologize for the delay. This is a bit rubberstampish (patch is huge), because I know we have to land something in order to enable us to work on it together.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>207620</commentid>
    <comment_count>5</comment_count>
      <attachid>52019</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-04-01 20:37:41 -0700</bug_when>
    <thetext>Comment on attachment 52019
Proposed patch

Clearing flags on attachment: 52019

Committed r56963: &lt;http://trac.webkit.org/changeset/56963&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>207621</commentid>
    <comment_count>6</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-04-01 20:37:53 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>52019</attachid>
            <date>2010-03-30 03:04:52 -0700</date>
            <delta_ts>2010-04-01 20:37:41 -0700</delta_ts>
            <desc>Proposed patch</desc>
            <filename>bug-36814-20100330190450.patch</filename>
            <type>text/plain</type>
            <size>97836</size>
            <attacher name="Kent Tamura">tkent</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCAxMjNhZDkyLi5lMjcwNGZhIDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMzEgQEAKKzIwMTAtMDMt
MzAgIEtlbnQgVGFtdXJhICA8dGtlbnRAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2Vk
IGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFtEUlQvQ2hyb21pdW1dIEFkZCBUZXN0U2hl
bGwgYW5kIFdlYlZpZXdIb3N0IGNsYXNzLCBtYWluKCksIGFuZCBzbyBvbgorICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzY4MTQKKworICAgICAgICBUaGlz
IGNoYW5nZSBpbnRyb2R1Y2VzOgorICAgICAgICAtIFdlYlZpZXdIb3N0IGNsYXNzCisgICAgICAg
ICAgSXQncyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBzb21lIGRlbGVnYXRlcyByZXF1aXJlZCBieSBD
aHJvbWl1bQorICAgICAgICAgIFdlYktpdCBBUEksIGFuZCBtYW5hZ2VzIHBhaW50aW5nIG9mIGEg
V2ViVmlldy4gSXQncyBiYXNlIG9uCisgICAgICAgICAgc3JjL3dlYmtpdC90b29scy90ZXN0X3No
ZWxsL3Rlc3Rfd2Vidmlld19kZWxlZ2F0ZS57Y2MsaH0gb2YKKyAgICAgICAgICBDaHJvbWl1bSBy
ZXYuNDA0OTIuCisgICAgICAgIC0gVGVzdFNoZWxsIGNsYXNzCisgICAgICAgICAgVGhlIFRlc3RT
aGVsbCBpbnN0YW5jZSBob2xkcyBnbG9iYWwgc3RhdGVzIG9mIER1bXBSZW5kZXJUcmVlIHByb2Nl
c3MuCisgICAgICAgICAgVW5saWtlIFRlc3RTaGVsbCBjbGFzcyBvZiBDaHJvbWl1bSB0ZXN0X3No
ZWxsLCBUZXN0U2hlbGwgaW5zdGFuY2UgaXMKKyAgICAgICAgICBjcmVhdGVkIGp1c3Qgb25jZS4K
KyAgICAgICAgLSBEdW1wUmVuZGVyVHJlZS5jcHAKKyAgICAgICAgICBUaGUgcHJvZ3JhbSBlbnRy
eS4KKworICAgICAgICAqIER1bXBSZW5kZXJUcmVlL2Nocm9taXVtL0R1bXBSZW5kZXJUcmVlLmNw
cDogQWRkZWQuCisgICAgICAgICogRHVtcFJlbmRlclRyZWUvY2hyb21pdW0vVGVzdFNoZWxsLmNw
cDogQWRkZWQuCisgICAgICAgICogRHVtcFJlbmRlclRyZWUvY2hyb21pdW0vVGVzdFNoZWxsLmg6
IEFkZGVkLgorICAgICAgICAqIER1bXBSZW5kZXJUcmVlL2Nocm9taXVtL1Rlc3RTaGVsbE1hYy5t
bTogQWRkZWQuCisgICAgICAgICogRHVtcFJlbmRlclRyZWUvY2hyb21pdW0vV2ViVmlld0hvc3Qu
Y3BwOiBBZGRlZC4KKyAgICAgICAgKiBEdW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9XZWJWaWV3SG9z
dC5oOiBBZGRlZC4KKyAgICAgICAgKiBEdW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9jb25maWcuaDog
QWRkZWQuCisKIDIwMTAtMDMtMjggIEd1c3Rhdm8gTm9yb25oYSBTaWx2YSAgPGduc0Bnbm9tZS5v
cmc+CiAKICAgICAgICAgTm8gcmV2aWV3LCByb2xsaW5nIG91dCByNTY2NzkuCmRpZmYgLS1naXQg
YS9XZWJLaXRUb29scy9EdW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9EdW1wUmVuZGVyVHJlZS5jcHAg
Yi9XZWJLaXRUb29scy9EdW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9EdW1wUmVuZGVyVHJlZS5jcHAK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZkODUxZgotLS0gL2Rldi9udWxs
CisrKyBiL1dlYktpdFRvb2xzL0R1bXBSZW5kZXJUcmVlL2Nocm9taXVtL0R1bXBSZW5kZXJUcmVl
LmNwcApAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
IGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBj
b3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVy
IHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmli
dXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQg
ZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVy
bWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklH
SFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywg
VEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
CisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgIlRl
c3RTaGVsbC5oIgorI2luY2x1ZGUgIndlYmtpdC9zdXBwb3J0L3dlYmtpdF9zdXBwb3J0LmgiCisj
aW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorI2lmIE9TKE1BQ19PU19YKQorI2luY2x1ZGUgIldlYlN5
c3RlbUludGVyZmFjZS5oIgorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3N0YXRp
YyBjb25zdCBjaGFyIG9wdGlvbkNvbXBsZXhUZXh0W10gPSAiLS1jb21wbGV4LXRleHQiOworc3Rh
dGljIGNvbnN0IGNoYXIgb3B0aW9uRHVtcEFsbFBpeGVsc1tdID0gIi0tZHVtcC1hbGwtcGl4ZWxz
IjsKK3N0YXRpYyBjb25zdCBjaGFyIG9wdGlvbk5vdHJlZVtdID0gIi0tbm90cmVlIjsKK3N0YXRp
YyBjb25zdCBjaGFyIG9wdGlvblBpeGVsVGVzdHNbXSA9ICItLXBpeGVsLXRlc3RzIjsKK3N0YXRp
YyBjb25zdCBjaGFyIG9wdGlvblRocmVhZGVkW10gPSAiLS10aHJlYWRlZCI7CitzdGF0aWMgY29u
c3QgY2hhciBvcHRpb25UcmVlW10gPSAiLS10cmVlIjsKKworc3RhdGljIHZvaWQgcnVuVGVzdChU
ZXN0U2hlbGwmIHNoZWxsLCBUZXN0UGFyYW1zJiBwYXJhbXMsIGNvbnN0IHN0cmluZyYgdGVzdE5h
bWUpCit7CisgICAgc3RyaW5nIHBhdGhPclVSTCA9IHRlc3ROYW1lOworICAgIHN0cmluZzo6c2l6
ZV90eXBlIHNlcGFyYXRvclBvc2l0aW9uID0gcGF0aE9yVVJMLmZpbmQoIiciKTsKKyAgICBpZiAo
c2VwYXJhdG9yUG9zaXRpb24gIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAgIHBhcmFtcy5waXhl
bEhhc2ggPSBwYXRoT3JVUkwuc3Vic3RyKHNlcGFyYXRvclBvc2l0aW9uICsgMSk7CisgICAgICAg
IHBhdGhPclVSTC5lcmFzZShzZXBhcmF0b3JQb3NpdGlvbik7CisgICAgfQorICAgIHBhcmFtcy50
ZXN0VXJsID0gd2Via2l0X3N1cHBvcnQ6OkNyZWF0ZVVSTEZvclBhdGhPclVSTChwYXRoT3JVUkwp
OworICAgIHNoZWxsLnJ1bkZpbGVUZXN0KHBhcmFtcyk7CisgICAgc2hlbGwucmVzZXRUZXN0Q29u
dHJvbGxlcigpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKQoreworI2lm
IE9TKE1BQ19PU19YKQorICAgIC8vIE5lZWQgdG8gY2FsbCBiZWZvcmUgaW5zdGFudGlhdGUgV2Vi
S2l0Q2xpZW50LgorICAgICBJbml0V2ViQ29yZVN5c3RlbUludGVyZmFjZSgpOworI2VuZGlmCisg
ICAgd2Via2l0X3N1cHBvcnQ6OlNldFVwVGVzdEVudmlyb25tZW50KCk7CisKKyAgICBUZXN0UGFy
YW1zIHBhcmFtczsKKyAgICBWZWN0b3I8c3RyaW5nPiB0ZXN0czsKKyAgICBib29sIHNlcnZlck1v
ZGUgPSBmYWxzZTsKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7ICsraSkgeworICAgICAg
ICBzdHJpbmcgYXJndW1lbnQoYXJndltpXSk7CisgICAgICAgIGlmIChhcmd1bWVudCA9PSAiLSIp
CisgICAgICAgICAgICBzZXJ2ZXJNb2RlID0gdHJ1ZTsKKyAgICAgICAgZWxzZSBpZiAoYXJndW1l
bnQgPT0gb3B0aW9uTm90cmVlKQorICAgICAgICAgICAgcGFyYW1zLmR1bXBUcmVlID0gZmFsc2U7
CisgICAgICAgIGVsc2UgaWYgKGFyZ3VtZW50ID09IG9wdGlvblBpeGVsVGVzdHMpCisgICAgICAg
ICAgICBwYXJhbXMuZHVtcFBpeGVscyA9IHRydWU7CisgICAgICAgIGVsc2UgaWYgKGFyZ3VtZW50
LnNpemUoKSAmJiBhcmd1bWVudFswXSA9PSAnLScpCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVy
ciwgIlVua25vd24gb3B0aW9uOiAlc1xuIiwgYXJndltpXSk7CisgICAgICAgIGVsc2UKKyAgICAg
ICAgICAgIHRlc3RzLmFwcGVuZChhcmd1bWVudCk7CisgICAgfQorCisgICAgeyAvLyBFeHBsaWNp
dCBzY29wZSBmb3IgdGhlIFRlc3RTaGVsbCBpbnN0YW5jZS4KKyAgICAgICAgVGVzdFNoZWxsIHNo
ZWxsOworICAgICAgICBpZiAoc2VydmVyTW9kZSAmJiAhdGVzdHMuc2l6ZSgpKSB7CisgICAgICAg
ICAgICBwYXJhbXMucHJpbnRTZXBhcmF0b3JzID0gdHJ1ZTsKKyAgICAgICAgICAgIGNoYXIgdGVz
dFN0cmluZ1syMDQ4XTsgLy8gMjA0OCBpcyB0aGUgc2FtZSBhcyB0aGUgc2l6ZXMgb2Ygb3RoZXIg
cGxhdGZvcm1zLgorICAgICAgICAgICAgd2hpbGUgKGZnZXRzKHRlc3RTdHJpbmcsIHNpemVvZih0
ZXN0U3RyaW5nKSwgc3RkaW4pKSB7CisgICAgICAgICAgICAgICAgY2hhciogbmV3TGluZVBvc2l0
aW9uID0gc3RyY2hyKHRlc3RTdHJpbmcsICdcbicpOworICAgICAgICAgICAgICAgIGlmIChuZXdM
aW5lUG9zaXRpb24pCisgICAgICAgICAgICAgICAgICAgICpuZXdMaW5lUG9zaXRpb24gPSAnXDAn
OworICAgICAgICAgICAgICAgIGlmICh0ZXN0U3RyaW5nWzBdID09ICdcMCcpCisgICAgICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIHJ1blRlc3Qoc2hlbGwsIHBhcmFt
cywgdGVzdFN0cmluZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIXRlc3Rz
LnNpemUoKSkKKyAgICAgICAgICAgIHByaW50ZigiI0VPRlxuIik7CisgICAgICAgIGVsc2Ugewor
ICAgICAgICAgICAgcGFyYW1zLnByaW50U2VwYXJhdG9ycyA9IHRlc3RzLnNpemUoKSA+IDE7Cisg
ICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgdGVzdHMuc2l6ZSgpOyBpKyspCisg
ICAgICAgICAgICAgICAgcnVuVGVzdChzaGVsbCwgcGFyYW1zLCB0ZXN0c1tpXSk7CisgICAgICAg
IH0KKworICAgICAgICBzaGVsbC5jYWxsSlNHQygpOworICAgICAgICBzaGVsbC5jYWxsSlNHQygp
OworCisgICAgICAgIC8vIFdoZW4gd2UgZmluaXNoIHRoZSBsYXN0IHRlc3QsIGNsZWFudXAgdGhl
IExheW91dFRlc3RDb250cm9sbGVyLgorICAgICAgICAvLyBJdCBtYXkgaGF2ZSByZWZlcmVuY2Vz
IHRvIG5vdC15ZXQtY2xlYW5lZCB1cCB3aW5kb3dzLiAgQnkKKyAgICAgICAgLy8gY2xlYW5pbmcg
dXAgaGVyZSB3ZSBoZWxwIHB1cmlmeSByZXBvcnRzLgorICAgICAgICBzaGVsbC5yZXNldFRlc3RD
b250cm9sbGVyKCk7CisgICAgfQorCisgICAgd2Via2l0X3N1cHBvcnQ6OlRlYXJEb3duVGVzdEVu
dmlyb25tZW50KCk7CisgICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL1dl
YktpdFRvb2xzL0R1bXBSZW5kZXJUcmVlL2Nocm9taXVtL1Rlc3RTaGVsbC5jcHAgYi9XZWJLaXRU
b29scy9EdW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9UZXN0U2hlbGwuY3BwCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYmMxMTAKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXRU
b29scy9EdW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9UZXN0U2hlbGwuY3BwCkBAIC0wLDAgKzEsNjE0
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgor
ICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGlu
IHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xl
IEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0
byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3
YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05U
UklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisg
KiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlRlc3RTaGVsbC5oIgorCisjaW5jbHVk
ZSAiTGF5b3V0VGVzdENvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJXZWJWaWV3SG9zdC5oIgorI2lu
Y2x1ZGUgImJhc2UvbWQ1LmgiIC8vIEZJWE1FOiBXcmFwIGJ5IHdlYmtpdF9zdXBwb3J0LgorI2lu
Y2x1ZGUgImJhc2Uvc3RyaW5nMTYuaCIKKyNpbmNsdWRlICJnZngvY29kZWMvcG5nX2NvZGVjLmgi
IC8vIEZJWE1FOiBSZW1vdmUgZGVwZW5kZWN5LiBXZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWVuY29k
ZXIgaXMgYmV0dGVyPworI2luY2x1ZGUgIm5ldC9iYXNlL2VzY2FwZS5oIiAvLyBGSVhNRTogUmVt
b3ZlIGRlcGVuZGVuY3kuCisjaW5jbHVkZSAicHVibGljL1dlYkRhdGFTb3VyY2UuaCIKKyNpbmNs
dWRlICJwdWJsaWMvV2ViRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJwdWJsaWMvV2ViRWxlbWVudC5o
IgorI2luY2x1ZGUgInB1YmxpYy9XZWJGcmFtZS5oIgorI2luY2x1ZGUgInB1YmxpYy9XZWJIaXN0
b3J5SXRlbS5oIgorI2luY2x1ZGUgInB1YmxpYy9XZWJSdW50aW1lRmVhdHVyZXMuaCIKKyNpbmNs
dWRlICJwdWJsaWMvV2ViU2NyaXB0Q29udHJvbGxlci5oIgorI2luY2x1ZGUgInB1YmxpYy9XZWJT
ZXR0aW5ncy5oIgorI2luY2x1ZGUgInB1YmxpYy9XZWJTaXplLmgiCisjaW5jbHVkZSAicHVibGlj
L1dlYlN0cmluZy5oIgorI2luY2x1ZGUgInB1YmxpYy9XZWJVUkxSZXF1ZXN0LmgiCisjaW5jbHVk
ZSAicHVibGljL1dlYlVSTFJlc3BvbnNlLmgiCisjaW5jbHVkZSAicHVibGljL1dlYlZpZXcuaCIK
KyNpbmNsdWRlICJza2lhL2V4dC9iaXRtYXBfcGxhdGZvcm1fZGV2aWNlLmgiCisjaW5jbHVkZSAi
c2tpYS9leHQvcGxhdGZvcm1fY2FudmFzLmgiCisjaW5jbHVkZSAid2Via2l0L3N1cHBvcnQvd2Vi
a2l0X3N1cHBvcnQuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2N0eXBlPgor
I2luY2x1ZGUgPHZlY3Rvcj4KKwordXNpbmcgbmFtZXNwYWNlIFdlYktpdDsKK3VzaW5nIG5hbWVz
cGFjZSBzdGQ7CisKKy8vIENvbnRlbnQgYXJlYSBzaXplIGZvciBuZXdseSBjcmVhdGVkIHdpbmRv
d3MuCitzdGF0aWMgY29uc3QgaW50IHRlc3RXaW5kb3dXaWR0aCA9IDgwMDsKK3N0YXRpYyBjb25z
dCBpbnQgdGVzdFdpbmRvd0hlaWdodCA9IDYwMDsKKworLy8gVGhlIFczQyBTVkcgbGF5b3V0IHRl
c3RzIHVzZSBhIGRpZmZlcmVudCBzaXplIHRoYW4gdGhlIG90aGVyIGxheW91dCB0ZXN0cy4KK3N0
YXRpYyBjb25zdCBpbnQgU1ZHVGVzdFdpbmRvd1dpZHRoID0gNDgwOworc3RhdGljIGNvbnN0IGlu
dCBTVkdUZXN0V2luZG93SGVpZ2h0ID0gMzYwOworCitzdGF0aWMgY29uc3QgY2hhciBsYXlvdXRU
ZXN0c1BhdHRlcm5bXSA9ICIvTGF5b3V0VGVzdHMvIjsKK3N0YXRpYyBjb25zdCBzdHJpbmc6OnNp
emVfdHlwZSBsYXlvdXRUZXN0c1BhdHRlcm5TaXplID0gc2l6ZW9mKGxheW91dFRlc3RzUGF0dGVy
bikgLSAxOworc3RhdGljIGNvbnN0IGNoYXIgZmlsZVVybFBhdHRlcm5bXSA9ICJmaWxlOi8iOwor
c3RhdGljIGNvbnN0IGNoYXIgZmlsZVRlc3RQcmVmaXhbXSA9ICIoZmlsZSB0ZXN0KToiOworc3Rh
dGljIGNvbnN0IGNoYXIgZGF0YVVybFBhdHRlcm5bXSA9ICJkYXRhOiI7CitzdGF0aWMgY29uc3Qg
c3RyaW5nOjpzaXplX3R5cGUgZGF0YVVybFBhdHRlcm5TaXplID0gc2l6ZW9mKGRhdGFVcmxQYXR0
ZXJuKSAtIDE7CisKK1Rlc3RTaGVsbDo6VGVzdFNoZWxsKCkKKyAgICA6IG1fdGVzdElzUGVuZGlu
ZyhmYWxzZSkKKyAgICAsIG1fdGVzdElzUHJlcGFyaW5nKGZhbHNlKQorICAgICwgbV9mb2N1c2Vk
V2lkZ2V0KDApCit7CisgICAgbV9hY2Nlc3NpYmlsaXR5Q29udHJvbGxlci5zZXQobmV3IEFjY2Vz
c2liaWxpdHlDb250cm9sbGVyKHRoaXMpKTsKKyAgICBtX2xheW91dFRlc3RDb250cm9sbGVyLnNl
dChuZXcgTGF5b3V0VGVzdENvbnRyb2xsZXIodGhpcykpOworICAgIG1fZXZlbnRTZW5kZXIuc2V0
KG5ldyBFdmVudFNlbmRlcih0aGlzKSk7CisgICAgbV9wbGFpblRleHRDb250cm9sbGVyLnNldChu
ZXcgUGxhaW5UZXh0Q29udHJvbGxlcigpKTsKKyAgICBtX3RleHRJbnB1dENvbnRyb2xsZXIuc2V0
KG5ldyBUZXh0SW5wdXRDb250cm9sbGVyKHRoaXMpKTsKKworICAgIG1fd2ViVmlld0hvc3QgPSBj
cmVhdGVXZWJWaWV3KCk7CisgICAgbV93ZWJWaWV3ID0gbV93ZWJWaWV3SG9zdC0+d2ViVmlldygp
OworfQorCitUZXN0U2hlbGw6On5UZXN0U2hlbGwoKQoreworICAgIGxvYWRVUkwoR1VSTCgiYWJv
dXQ6YmxhbmsiKSk7CisgICAgLy8gQ2FsbCBHQyB0d2ljZSB0byBjbGVhbiB1cCBnYXJiYWdlLgor
ICAgIGNhbGxKU0dDKCk7CisgICAgY2FsbEpTR0MoKTsKKworICAgIC8vIERlc3Ryb3kgdGhlIFdl
YlZpZXcgYmVmb3JlIGl0cyBXZWJWaWV3SG9zdC4KKyAgICBtX3dlYlZpZXctPmNsb3NlKCk7Cit9
CisKK3ZvaWQgVGVzdFNoZWxsOjpyZXNldFdlYlNldHRpbmdzKFdlYlZpZXcmIHdlYlZpZXcpCit7
CisgICAgLy8gTWF0Y2ggdGhlIHNldHRpbmdzIHVzZWQgYnkgTWFjIER1bXBSZW5kZXJUcmVlLCB3
aXRoIHRoZSBleGNlcHRpb24gb2YKKyAgICAvLyBmb250cy4KKyAgICBXZWJTZXR0aW5ncyogc2V0
dGluZ3MgPSB3ZWJWaWV3LnNldHRpbmdzKCk7CisjaWYgT1MoTUFDX09TX1gpCisgICAgV2ViU3Ry
aW5nIHNlcmlmID0gV2ViU3RyaW5nOjpmcm9tVVRGOCgiVGltZXMiKTsKKyAgICBzZXR0aW5ncy0+
c2V0Q3Vyc2l2ZUZvbnRGYW1pbHkoV2ViU3RyaW5nOjpmcm9tVVRGOCgiQXBwbGUgQ2hhbmNlcnki
KSk7CisgICAgc2V0dGluZ3MtPnNldEZhbnRhc3lGb250RmFtaWx5KFdlYlN0cmluZzo6ZnJvbVVU
RjgoIlBhcHlydXMiKSk7CisjZWxzZQorICAgIC8vIE5PVEU6IGNhc2UgbWF0dGVycyBoZXJlLCB0
aGlzIG11c3QgYmUgJ3RpbWVzIG5ldyByb21hbicsIGVsc2UKKyAgICAvLyBzb21lIGxheW91dCB0
ZXN0cyBmYWlsLgorICAgIFdlYlN0cmluZyBzZXJpZiA9IFdlYlN0cmluZzo6ZnJvbVVURjgoInRp
bWVzIG5ldyByb21hbiIpOworCisgICAgLy8gVGhlc2UgdHdvIGZvbnRzIGFyZSBwaWNrZWQgZnJv
bSB0aGUgaW50ZXJzZWN0aW9uIG9mCisgICAgLy8gV2luIFhQIGZvbnQgbGlzdCBhbmQgVmlzdGEg
Zm9udCBsaXN0IDoKKyAgICAvLyAgIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5
L2ZvbnRzL3dpbnhwLmh0bQorICAgIC8vICAgaHR0cDovL2Jsb2dzLm1zZG4uY29tL21pY2hrYXAv
YXJjaGl2ZS8yMDA2LzA0LzA0LzU2Nzg4MS5hc3B4CisgICAgLy8gU29tZSBvZiB0aGVtIGFyZSBp
bnN0YWxsZWQgb25seSB3aXRoIENKSyBhbmQgY29tcGxleCBzY3JpcHQKKyAgICAvLyBzdXBwb3J0
IGVuYWJsZWQgb24gV2luZG93cyBYUCBhbmQgYXJlIG91dCBvZiBjb25zaWRlcmF0aW9uIGhlcmUu
CisgICAgLy8gKGFsdGhvdWdoIHdlIGVuYWJsZWQgYm90aCBvbiBvdXIgYnVpbGRib3RzLikKKyAg
ICAvLyBUaGV5IChlc3BlY2lhbGx5IEltcGFjdCBmb3IgZmFudGFzeSkgYXJlIG5vdCB0eXBpY2Fs
IGN1cnNpdmUKKyAgICAvLyBhbmQgZmFudGFzeSBmb250cywgYnV0IGl0IHNob3VsZCBub3QgbWF0
dGVyIGZvciBsYXlvdXQgdGVzdHMKKyAgICAvLyBhcyBsb25nIGFzIHRoZXkncmUgYXZhaWxhYmxl
LgorICAgIHNldHRpbmdzLT5zZXRDdXJzaXZlRm9udEZhbWlseShXZWJTdHJpbmc6OmZyb21VVEY4
KCJDb21pYyBTYW5zIE1TIikpOworICAgIHNldHRpbmdzLT5zZXRGYW50YXN5Rm9udEZhbWlseShX
ZWJTdHJpbmc6OmZyb21VVEY4KCJJbXBhY3QiKSk7CisjZW5kaWYKKyAgICBzZXR0aW5ncy0+c2V0
U2VyaWZGb250RmFtaWx5KHNlcmlmKTsKKyAgICBzZXR0aW5ncy0+c2V0U3RhbmRhcmRGb250RmFt
aWx5KHNlcmlmKTsKKyAgICBzZXR0aW5ncy0+c2V0Rml4ZWRGb250RmFtaWx5KFdlYlN0cmluZzo6
ZnJvbVVURjgoIkNvdXJpZXIiKSk7CisKKyAgICBzZXR0aW5ncy0+c2V0RGVmYXVsdFRleHRFbmNv
ZGluZ05hbWUoV2ViU3RyaW5nOjpmcm9tVVRGOCgiSVNPLTg4NTktMSIpKTsKKyAgICBzZXR0aW5n
cy0+c2V0RGVmYXVsdEZvbnRTaXplKDE2KTsKKyAgICBzZXR0aW5ncy0+c2V0RGVmYXVsdEZpeGVk
Rm9udFNpemUoMTMpOworICAgIHNldHRpbmdzLT5zZXRNaW5pbXVtRm9udFNpemUoMSk7CisgICAg
c2V0dGluZ3MtPnNldE1pbmltdW1Mb2dpY2FsRm9udFNpemUoOSk7CisgICAgc2V0dGluZ3MtPnNl
dEphdmFTY3JpcHRDYW5PcGVuV2luZG93c0F1dG9tYXRpY2FsbHkodHJ1ZSk7CisgICAgc2V0dGlu
Z3MtPnNldERPTVBhc3RlQWxsb3dlZCh0cnVlKTsKKyAgICBzZXR0aW5ncy0+c2V0RGV2ZWxvcGVy
RXh0cmFzRW5hYmxlZChmYWxzZSk7CisgICAgc2V0dGluZ3MtPnNldE5lZWRzU2l0ZVNwZWNpZmlj
UXVpcmtzKHRydWUpOworICAgIHNldHRpbmdzLT5zZXRTaHJpbmtzU3RhbmRhbG9uZUltYWdlc1Rv
Rml0KGZhbHNlKTsKKyAgICBzZXR0aW5ncy0+c2V0VXNlc0VuY29kaW5nRGV0ZWN0b3IoZmFsc2Up
OworICAgIHNldHRpbmdzLT5zZXRUZXh0QXJlYXNBcmVSZXNpemFibGUoZmFsc2UpOworICAgIHNl
dHRpbmdzLT5zZXRKYXZhRW5hYmxlZChmYWxzZSk7CisgICAgc2V0dGluZ3MtPnNldEFsbG93U2Ny
aXB0c1RvQ2xvc2VXaW5kb3dzKGZhbHNlKTsKKyAgICBzZXR0aW5ncy0+c2V0WFNTQXVkaXRvckVu
YWJsZWQoZmFsc2UpOworICAgIHNldHRpbmdzLT5zZXREb3dubG9hZGFibGVCaW5hcnlGb250c0Vu
YWJsZWQodHJ1ZSk7CisgICAgc2V0dGluZ3MtPnNldExvY2FsU3RvcmFnZUVuYWJsZWQodHJ1ZSk7
CisgICAgc2V0dGluZ3MtPnNldE9mZmxpbmVXZWJBcHBsaWNhdGlvbkNhY2hlRW5hYmxlZCh0cnVl
KTsKKyAgICBzZXR0aW5ncy0+c2V0QWxsb3dGaWxlQWNjZXNzRnJvbUZpbGVVUkxzKHRydWUpOwor
CisgICAgLy8gTGF5b3V0VGVzdHMgd2VyZSB3cml0dGVuIHdpdGggU2FmYXJpIE1hYyBpbiBtaW5k
IHdoaWNoIGRvZXMgbm90IGFsbG93CisgICAgLy8gdGFiYmluZyB0byBsaW5rcyBieSBkZWZhdWx0
LgorICAgIHdlYlZpZXcuc2V0VGFic1RvTGlua3MoZmFsc2UpOworCisgICAgLy8gQWxsb3cgdGhv
c2UgbGF5b3V0IHRlc3RzIHJ1bm5pbmcgYXMgbG9jYWwgZmlsZXMsIGkuZS4gdW5kZXIKKyAgICAv
LyBMYXlvdXRUZXN0cy9odHRwL3Rlc3RzL2xvY2FsLCB0byBhY2Nlc3MgaHR0cCBzZXJ2ZXIuCisg
ICAgc2V0dGluZ3MtPnNldEFsbG93VW5pdmVyc2FsQWNjZXNzRnJvbUZpbGVVUkxzKHRydWUpOwor
CisgICAgc2V0dGluZ3MtPnNldEphdmFTY3JpcHRFbmFibGVkKHRydWUpOworICAgIHNldHRpbmdz
LT5zZXRQbHVnaW5zRW5hYmxlZCh0cnVlKTsKKyAgICBzZXR0aW5ncy0+c2V0V2ViU2VjdXJpdHlF
bmFibGVkKHRydWUpOworICAgIHNldHRpbmdzLT5zZXRFZGl0YWJsZUxpbmtCZWhhdmlvck5ldmVy
TGl2ZSgpOworICAgIHNldHRpbmdzLT5zZXRGb250UmVuZGVyaW5nTW9kZU5vcm1hbCgpOworICAg
IHNldHRpbmdzLT5zZXRTaG91bGRQYWludEN1c3RvbVNjcm9sbGJhcnModHJ1ZSk7CisgICAgc2V0
dGluZ3MtPnNldFRleHREaXJlY3Rpb25TdWJtZW51SW5jbHVzaW9uQmVoYXZpb3JOZXZlckluY2x1
ZGVkKCk7CisKKyAgICBzZXR0aW5ncy0+c2V0TG9hZHNJbWFnZXNBdXRvbWF0aWNhbGx5KHRydWUp
OworICAgIHNldHRpbmdzLT5zZXRJbWFnZXNFbmFibGVkKHRydWUpOworfQorCit2b2lkIFRlc3RT
aGVsbDo6cnVuRmlsZVRlc3QoY29uc3QgVGVzdFBhcmFtcyYgcGFyYW1zKQoreworICAgIG1fdGVz
dElzUHJlcGFyaW5nID0gdHJ1ZTsKKyAgICBtX3BhcmFtcyA9IHBhcmFtczsKKyAgICBzdHJpbmcg
dGVzdFVybCA9IG1fcGFyYW1zLnRlc3RVcmwuc3BlYygpOworCisgICAgYm9vbCBpbnNwZWN0b3JU
ZXN0TW9kZSA9IHRlc3RVcmwuZmluZCgiL2luc3BlY3Rvci8iKSAhPSBzdHJpbmc6Om5wb3MKKyAg
ICAgICAgfHwgdGVzdFVybC5maW5kKCJcXGluc3BlY3RvclxcIikgIT0gc3RyaW5nOjpucG9zOwor
ICAgIG1fd2ViVmlldy0+c2V0dGluZ3MoKS0+c2V0RGV2ZWxvcGVyRXh0cmFzRW5hYmxlZChpbnNw
ZWN0b3JUZXN0TW9kZSk7CisgICAgbG9hZFVSTChtX3BhcmFtcy50ZXN0VXJsKTsKKworICAgIG1f
dGVzdElzUHJlcGFyaW5nID0gZmFsc2U7CisgICAgd2FpdFRlc3RGaW5pc2hlZCgpOworfQorCitz
dGF0aWMgaW5saW5lIGJvb2wgaXNTVkdUZXN0VVJMKGNvbnN0IFdlYlVSTCYgdXJsKQoreworICAg
IHJldHVybiB1cmwuaXNWYWxpZCgpICYmIHN0cmluZyh1cmwuc3BlYygpKS5maW5kKCJXM0MtU1ZH
LTEuMSIpICE9IHN0cmluZzo6bnBvczsKK30KKwordm9pZCBUZXN0U2hlbGw6OnJlc2l6ZVdpbmRv
d0ZvclRlc3QoV2ViVmlld0hvc3QqIHdpbmRvdywgY29uc3QgV2ViVVJMJiB1cmwpCit7CisgICAg
aW50IHdpZHRoLCBoZWlnaHQ7CisgICAgaWYgKGlzU1ZHVGVzdFVSTCh1cmwpKSB7CisgICAgICAg
IHdpZHRoID0gU1ZHVGVzdFdpbmRvd1dpZHRoOworICAgICAgICBoZWlnaHQgPSBTVkdUZXN0V2lu
ZG93SGVpZ2h0OworICAgIH0gZWxzZSB7CisgICAgICAgIHdpZHRoID0gdGVzdFdpbmRvd1dpZHRo
OworICAgICAgICBoZWlnaHQgPSB0ZXN0V2luZG93SGVpZ2h0OworICAgIH0KKyAgICB3aW5kb3ct
PnNldFdpbmRvd1JlY3QoV2ViUmVjdCgwLCAwLCB3aWR0aCArIHZpcnR1YWxXaW5kb3dCb3JkZXIg
KiAyLCBoZWlnaHQgKyB2aXJ0dWFsV2luZG93Qm9yZGVyICogMikpOworfQorCit2b2lkIFRlc3RT
aGVsbDo6cmVzZXRUZXN0Q29udHJvbGxlcigpCit7CisgICAgbV9hY2Nlc3NpYmlsaXR5Q29udHJv
bGxlci0+cmVzZXQoKTsKKyAgICBtX2xheW91dFRlc3RDb250cm9sbGVyLT5yZXNldCgpOworICAg
IG1fZXZlbnRTZW5kZXItPnJlc2V0KCk7CisgICAgbV93ZWJWaWV3SG9zdC0+cmVzZXQoKTsKK30K
Kwordm9pZCBUZXN0U2hlbGw6OmxvYWRVUkwoY29uc3QgV2ViVVJMJiB1cmwpCit7CisgICAgbV93
ZWJWaWV3SG9zdC0+bG9hZFVSTEZvckZyYW1lKHVybCwgV2ViU3RyaW5nKCkpOworfQorCit2b2lk
IFRlc3RTaGVsbDo6cmVsb2FkKCkKK3sKKyAgICBtX3dlYlZpZXdIb3N0LT5uYXZpZ2F0aW9uQ29u
dHJvbGxlcigpLT5yZWxvYWQoKTsKK30KKwordm9pZCBUZXN0U2hlbGw6OmdvVG9PZmZzZXQoaW50
IG9mZnNldCkKK3sKKyAgICAgbV93ZWJWaWV3SG9zdC0+bmF2aWdhdGlvbkNvbnRyb2xsZXIoKS0+
Z29Ub09mZnNldChvZmZzZXQpOworfQorCitpbnQgVGVzdFNoZWxsOjpuYXZpZ2F0aW9uRW50cnlD
b3VudCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fd2ViVmlld0hvc3QtPm5hdmlnYXRpb25Db250
cm9sbGVyKCktPmVudHJ5Q291bnQoKTsKK30KKwordm9pZCBUZXN0U2hlbGw6OmNhbGxKU0dDKCkK
K3sKKyAgICBtX3dlYlZpZXctPm1haW5GcmFtZSgpLT5jb2xsZWN0R2FyYmFnZSgpOworfQorCit2
b2lkIFRlc3RTaGVsbDo6c2V0Rm9jdXMoV2ViV2lkZ2V0KiB3aWRnZXQsIGJvb2wgZW5hYmxlKQor
eworICAgIC8vIFNpbXVsYXRlIHRoZSBlZmZlY3RzIG9mIEludGVyYWN0aXZlU2V0Rm9jdXMoKSwg
d2hpY2ggaW5jbHVkZXMgY2FsbGluZworICAgIC8vIGJvdGggc2V0Rm9jdXMoKSBhbmQgc2V0SXNB
Y3RpdmUoKS4KKyAgICBpZiAoZW5hYmxlKSB7CisgICAgICAgIGlmIChtX2ZvY3VzZWRXaWRnZXQg
IT0gd2lkZ2V0KSB7CisgICAgICAgICAgICBpZiAobV9mb2N1c2VkV2lkZ2V0KQorICAgICAgICAg
ICAgICAgIG1fZm9jdXNlZFdpZGdldC0+c2V0Rm9jdXMoZmFsc2UpOworICAgICAgICAgICAgd2Vi
VmlldygpLT5zZXRJc0FjdGl2ZShlbmFibGUpOworICAgICAgICAgICAgd2lkZ2V0LT5zZXRGb2N1
cyhlbmFibGUpOworICAgICAgICAgICAgbV9mb2N1c2VkV2lkZ2V0ID0gd2lkZ2V0OworICAgICAg
ICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1fZm9jdXNlZFdpZGdldCA9PSB3aWRnZXQp
IHsKKyAgICAgICAgICAgIHdpZGdldC0+c2V0Rm9jdXMoZW5hYmxlKTsKKyAgICAgICAgICAgIHdl
YlZpZXcoKS0+c2V0SXNBY3RpdmUoZW5hYmxlKTsKKyAgICAgICAgICAgIG1fZm9jdXNlZFdpZGdl
dCA9IDA7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgVGVzdFNoZWxsOjp0ZXN0RmluaXNo
ZWQoKQoreworICAgIGlmICghbV90ZXN0SXNQZW5kaW5nKQorICAgICAgICByZXR1cm47CisgICAg
bV90ZXN0SXNQZW5kaW5nID0gZmFsc2U7CisgICAgZHVtcCgpOworICAgIHdlYmtpdF9zdXBwb3J0
OjpRdWl0TWVzc2FnZUxvb3AoKTsKK30KKwordm9pZCBUZXN0U2hlbGw6OnRlc3RUaW1lZE91dCgp
Cit7CisgICAgZnByaW50ZihzdGRlcnIsICJGQUlMOiBUaW1lZCBvdXQgd2FpdGluZyBmb3Igbm90
aWZ5RG9uZSB0byBiZSBjYWxsZWRcbiIpOworICAgIGZwcmludGYoc3Rkb3V0LCAiRkFJTDogVGlt
ZWQgb3V0IHdhaXRpbmcgZm9yIG5vdGlmeURvbmUgdG8gYmUgY2FsbGVkXG4iKTsKKyAgICB0ZXN0
RmluaXNoZWQoKTsKK30KKworc3RhdGljIHN0cmluZyBkdW1wRG9jdW1lbnRUZXh0KFdlYkZyYW1l
KiBmcmFtZSkKK3sKKyAgICAvLyBXZSB1c2UgdGhlIGRvY3VtZW50IGVsZW1lbnQncyB0ZXh0IGlu
c3RlYWQgb2YgdGhlIGJvZHkgdGV4dCBoZXJlIGJlY2F1c2UKKyAgICAvLyBub3QgYWxsIGRvY3Vt
ZW50cyBoYXZlIGEgYm9keSwgc3VjaCBhcyBYTUwgZG9jdW1lbnRzLgorICAgIFdlYkVsZW1lbnQg
ZG9jdW1lbnRFbGVtZW50ID0gZnJhbWUtPmRvY3VtZW50KCkuZG9jdW1lbnRFbGVtZW50KCk7Cisg
ICAgaWYgKGRvY3VtZW50RWxlbWVudC5pc051bGwoKSkKKyAgICAgICAgcmV0dXJuIHN0cmluZygp
OworICAgIHJldHVybiBkb2N1bWVudEVsZW1lbnQuaW5uZXJUZXh0KCkudXRmOCgpOworfQorCitz
dGF0aWMgc3RyaW5nIGR1bXBGcmFtZXNBc1RleHQoV2ViRnJhbWUqIGZyYW1lLCBib29sIHJlY3Vy
c2l2ZSkKK3sKKyAgICBzdHJpbmcgcmVzdWx0OworCisgICAgLy8gQWRkIGhlYWRlciBmb3IgYWxs
IGJ1dCB0aGUgbWFpbiBmcmFtZS4gU2tpcCBlbXB0eSBmcmFtZXMuCisgICAgaWYgKGZyYW1lLT5w
YXJlbnQoKSAmJiAhZnJhbWUtPmRvY3VtZW50KCkuZG9jdW1lbnRFbGVtZW50KCkuaXNOdWxsKCkp
IHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4tLS0tLS0tLVxuRnJhbWU6ICciKTsKKyAgICAg
ICAgcmVzdWx0LmFwcGVuZChmcmFtZS0+bmFtZSgpLnV0ZjgoKS5kYXRhKCkpOworICAgICAgICBy
ZXN1bHQuYXBwZW5kKCInXG4tLS0tLS0tLVxuIik7CisgICAgfQorCisgICAgcmVzdWx0LmFwcGVu
ZChkdW1wRG9jdW1lbnRUZXh0KGZyYW1lKSk7CisgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKwor
ICAgIGlmIChyZWN1cnNpdmUpIHsKKyAgICAgICAgZm9yIChXZWJGcmFtZSogY2hpbGQgPSBmcmFt
ZS0+Zmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkKKyAg
ICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZHVtcEZyYW1lc0FzVGV4dChjaGlsZCwgcmVjdXJzaXZl
KSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgZHVtcEZy
YW1lU2Nyb2xsUG9zaXRpb24oV2ViRnJhbWUqIGZyYW1lLCBib29sIHJlY3Vyc2l2ZSkKK3sKKyAg
ICBXZWJTaXplIG9mZnNldCA9IGZyYW1lLT5zY3JvbGxPZmZzZXQoKTsKKyAgICBpZiAob2Zmc2V0
LndpZHRoID4gMCB8fCBvZmZzZXQuaGVpZ2h0ID4gMCkgeworICAgICAgICBpZiAoZnJhbWUtPnBh
cmVudCgpKQorICAgICAgICAgICAgcHJpbnRmKCJmcmFtZSAnJXMnICIsIGZyYW1lLT5uYW1lKCku
dXRmOCgpLmRhdGEoKSk7CisgICAgICAgIHByaW50Zigic2Nyb2xsZWQgdG8gJWQsJWRcbiIsIG9m
ZnNldC53aWR0aCwgb2Zmc2V0LmhlaWdodCk7CisgICAgfQorCisgICAgaWYgKCFyZWN1cnNpdmUp
CisgICAgICAgIHJldHVybjsKKyAgICBmb3IgKFdlYkZyYW1lKiBjaGlsZCA9IGZyYW1lLT5maXJz
dENoaWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpKQorICAgICAgICBk
dW1wRnJhbWVTY3JvbGxQb3NpdGlvbihjaGlsZCwgcmVjdXJzaXZlKTsKK30KKworc3RydWN0IFRv
TG93ZXIgeworICAgIGNoYXIxNiBvcGVyYXRvcigpKGNoYXIxNiBjKSB7IHJldHVybiB0b2xvd2Vy
KGMpOyB9Cit9OworCisvLyBGSVhNRTogRWxpbWluYXRlIHN0ZDo6dHJhbnNmb3JtKCksIHN0ZDo6
dmVjdG9yLCBhbmQgc3RkOjpzb3J0KCkuCisKKy8vIFJldHVybnMgVHJ1ZSBpZiBpdGVtMSA8IGl0
ZW0yLgorc3RhdGljIGJvb2wgSGlzdG9yeUl0ZW1Db21wYXJlTGVzcyhjb25zdCBXZWJIaXN0b3J5
SXRlbSYgaXRlbTEsIGNvbnN0IFdlYkhpc3RvcnlJdGVtJiBpdGVtMikKK3sKKyAgICBzdHJpbmcx
NiB0YXJnZXQxID0gaXRlbTEudGFyZ2V0KCk7CisgICAgc3RyaW5nMTYgdGFyZ2V0MiA9IGl0ZW0y
LnRhcmdldCgpOworICAgIHN0ZDo6dHJhbnNmb3JtKHRhcmdldDEuYmVnaW4oKSwgdGFyZ2V0MS5l
bmQoKSwgdGFyZ2V0MS5iZWdpbigpLCBUb0xvd2VyKCkpOworICAgIHN0ZDo6dHJhbnNmb3JtKHRh
cmdldDIuYmVnaW4oKSwgdGFyZ2V0Mi5lbmQoKSwgdGFyZ2V0Mi5iZWdpbigpLCBUb0xvd2VyKCkp
OworICAgIHJldHVybiB0YXJnZXQxIDwgdGFyZ2V0MjsKK30KKworc3RhdGljIHN0cmluZyBkdW1w
SGlzdG9yeUl0ZW0oY29uc3QgV2ViSGlzdG9yeUl0ZW0mIGl0ZW0sIGludCBpbmRlbnQsIGJvb2wg
aXNDdXJyZW50KQoreworICAgIHN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoaXNDdXJyZW50KSB7
CisgICAgICAgIHJlc3VsdC5hcHBlbmQoImN1cnItPiIpOworICAgICAgICByZXN1bHQuYXBwZW5k
KGluZGVudCAtIDYsICcgJyk7IC8vIDYgPT0gImN1cnItPiIubGVuZ3RoKCkKKyAgICB9IGVsc2Ug
eworICAgICAgICByZXN1bHQuYXBwZW5kKGluZGVudCwgJyAnKTsKKyAgICB9CisKKyAgICBzdHJp
bmcgdXJsID0gaXRlbS51cmxTdHJpbmcoKS51dGY4KCk7CisgICAgc2l6ZV90IHBvczsKKyAgICBp
ZiAoIXVybC5maW5kKGZpbGVVcmxQYXR0ZXJuKSAmJiAoKHBvcyA9IHVybC5maW5kKGxheW91dFRl
c3RzUGF0dGVybikpICE9IHN0cmluZzo6bnBvcykpIHsKKyAgICAgICAgLy8gYWRqdXN0IGZpbGUg
VVJMcyB0byBtYXRjaCB1cHN0cmVhbSByZXN1bHRzLgorICAgICAgICB1cmwucmVwbGFjZSgwLCBw
b3MgKyBsYXlvdXRUZXN0c1BhdHRlcm5TaXplLCBmaWxlVGVzdFByZWZpeCk7CisgICAgfSBlbHNl
IGlmICghdXJsLmZpbmQoZGF0YVVybFBhdHRlcm4pKSB7CisgICAgICAgIC8vIFVSTC1lc2NhcGUg
ZGF0YSBVUkxzIHRvIG1hdGNoIHJlc3VsdHMgdXBzdHJlYW0uCisgICAgICAgIHN0cmluZyBwYXRo
ID0gRXNjYXBlUGF0aCh1cmwuc3Vic3RyKGRhdGFVcmxQYXR0ZXJuU2l6ZSkpOworICAgICAgICB1
cmwucmVwbGFjZShkYXRhVXJsUGF0dGVyblNpemUsIHVybC5sZW5ndGgoKSwgcGF0aCk7CisgICAg
fQorCisgICAgcmVzdWx0LmFwcGVuZCh1cmwpOworICAgIGlmICghaXRlbS50YXJnZXQoKS5pc0Vt
cHR5KCkpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiIChpbiBmcmFtZSBcIiIpOworICAgICAg
ICByZXN1bHQuYXBwZW5kKGl0ZW0udGFyZ2V0KCkudXRmOCgpKTsKKyAgICAgICAgcmVzdWx0LmFw
cGVuZCgiXCIpIik7CisgICAgfQorICAgIGlmIChpdGVtLmlzVGFyZ2V0SXRlbSgpKQorICAgICAg
ICByZXN1bHQuYXBwZW5kKCIgICoqbmF2IHRhcmdldCoqIik7CisgICAgcmVzdWx0LmFwcGVuZCgi
XG4iKTsKKworICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJIaXN0b3J5SXRlbT4mIGNoaWxkcmVuID0g
aXRlbS5jaGlsZHJlbigpOworICAgIGlmICghY2hpbGRyZW4uaXNFbXB0eSgpKSB7CisgICAgICAg
IC8vIE11c3Qgc29ydCB0byBlbGltaW5hdGUgYXJiaXRyYXJ5IHJlc3VsdCBvcmRlcmluZyB3aGlj
aCBkZWZlYXRzCisgICAgICAgIC8vIHJlcHJvZHVjaWJsZSB0ZXN0aW5nLgorICAgICAgICAvLyBG
SVhNRTogV2ViVmVjdG9yIHNob3VsZCBwcm9iYWJseSBqdXN0IGJlIGEgc3RkOjp2ZWN0b3IhIQor
ICAgICAgICBzdGQ6OnZlY3RvcjxXZWJIaXN0b3J5SXRlbT4gc29ydGVkQ2hpbGRyZW47CisgICAg
ICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyArK2kpCisgICAgICAg
ICAgICBzb3J0ZWRDaGlsZHJlbi5wdXNoX2JhY2soY2hpbGRyZW5baV0pOworICAgICAgICBzdGQ6
OnNvcnQoc29ydGVkQ2hpbGRyZW4uYmVnaW4oKSwgc29ydGVkQ2hpbGRyZW4uZW5kKCksIEhpc3Rv
cnlJdGVtQ29tcGFyZUxlc3MpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNvcnRl
ZENoaWxkcmVuLnNpemUoKTsgKytpKQorICAgICAgICAgICAgcmVzdWx0ICs9IGR1bXBIaXN0b3J5
SXRlbShzb3J0ZWRDaGlsZHJlbltpXSwgaW5kZW50ICsgNCwgZmFsc2UpOworICAgIH0KKworICAg
IHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBCYWNrRm9yd2FyZExpc3QoY29u
c3QgVGVzdE5hdmlnYXRpb25Db250cm9sbGVyJiBuYXZpZ2F0aW9uQ29udHJvbGxlciwgc3RyaW5n
JiByZXN1bHQpCit7CisgICAgcmVzdWx0LmFwcGVuZCgiXG49PT09PT09PT09PT09PSBCYWNrIEZv
cndhcmQgTGlzdCA9PT09PT09PT09PT09PVxuIik7CisgICAgZm9yIChpbnQgaW5kZXggPSAwOyBp
bmRleCA8IG5hdmlnYXRpb25Db250cm9sbGVyLmVudHJ5Q291bnQoKTsgKytpbmRleCkgeworICAg
ICAgICBpbnQgY3VycmVudEluZGV4ID0gbmF2aWdhdGlvbkNvbnRyb2xsZXIubGFzdENvbW1pdHRl
ZEVudHJ5SW5kZXgoKTsKKyAgICAgICAgV2ViSGlzdG9yeUl0ZW0gaGlzdG9yeUl0ZW0gPSBuYXZp
Z2F0aW9uQ29udHJvbGxlci5lbnRyeUF0SW5kZXgoaW5kZXgpLT5jb250ZW50U3RhdGUoKTsKKyAg
ICAgICAgaWYgKGhpc3RvcnlJdGVtLmlzTnVsbCgpKSB7CisgICAgICAgICAgICBoaXN0b3J5SXRl
bS5pbml0aWFsaXplKCk7CisgICAgICAgICAgICBoaXN0b3J5SXRlbS5zZXRVUkxTdHJpbmcobmF2
aWdhdGlvbkNvbnRyb2xsZXIuZW50cnlBdEluZGV4KGluZGV4KS0+VVJMKCkuc3BlYygpLnV0ZjE2
KCkpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdC5hcHBlbmQoZHVtcEhpc3RvcnlJdGVtKGhp
c3RvcnlJdGVtLCA4LCBpbmRleCA9PSBjdXJyZW50SW5kZXgpKTsKKyAgICB9CisgICAgcmVzdWx0
LmFwcGVuZCgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1c
biIpOworfQorCitzdHJpbmcgVGVzdFNoZWxsOjpkdW1wQWxsQmFja0ZvcndhcmRMaXN0cygpCit7
CisgICAgc3RyaW5nIHJlc3VsdDsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV93aW5k
b3dMaXN0LnNpemUoKTsgKytpKQorICAgICAgICBkdW1wQmFja0ZvcndhcmRMaXN0KCptX3dpbmRv
d0xpc3RbaV0tPm5hdmlnYXRpb25Db250cm9sbGVyKCksIHJlc3VsdCk7CisgICAgcmV0dXJuIHJl
c3VsdDsKK30KKwordm9pZCBUZXN0U2hlbGw6OmR1bXAoKQoreworICAgIFdlYlNjcmlwdENvbnRy
b2xsZXI6OmZsdXNoQ29uc29sZU1lc3NhZ2VzKCk7CisKKyAgICAvLyBEdW1wIHRoZSByZXF1ZXN0
ZWQgcmVwcmVzZW50YXRpb24uCisgICAgV2ViRnJhbWUqIGZyYW1lID0gbV93ZWJWaWV3LT5tYWlu
RnJhbWUoKTsKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm47CisgICAgYm9vbCBzaG91
bGREdW1wQXNUZXh0ID0gbV9sYXlvdXRUZXN0Q29udHJvbGxlci0+c2hvdWxkRHVtcEFzVGV4dCgp
OworICAgIGJvb2wgZHVtcGVkQW55dGhpbmcgPSBmYWxzZTsKKyAgICBpZiAobV9wYXJhbXMuZHVt
cFRyZWUpIHsKKyAgICAgICAgZHVtcGVkQW55dGhpbmcgPSB0cnVlOworICAgICAgICBwcmludGYo
IkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpblxuIik7CisgICAgICAgIC8vIFRleHQgb3V0cHV0OiB0
aGUgdGVzdCBwYWdlIGNhbiByZXF1ZXN0IGRpZmZlcmVudCB0eXBlcyBvZiBvdXRwdXQKKyAgICAg
ICAgLy8gd2hpY2ggd2UgaGFuZGxlIGhlcmUuCisgICAgICAgIGlmICghc2hvdWxkRHVtcEFzVGV4
dCkgeworICAgICAgICAgICAgLy8gUGxhaW4gdGV4dCBwYWdlcyBzaG91bGQgYmUgZHVtcGVkIGFz
IHRleHQKKyAgICAgICAgICAgIHN0cmluZyBtaW1lVHlwZSA9IGZyYW1lLT5kYXRhU291cmNlKCkt
PnJlc3BvbnNlKCkubWltZVR5cGUoKS51dGY4KCk7CisgICAgICAgICAgICBzaG91bGREdW1wQXNU
ZXh0ID0gbWltZVR5cGUgPT0gInRleHQvcGxhaW4iOworICAgICAgICB9CisgICAgICAgIGlmIChz
aG91bGREdW1wQXNUZXh0KSB7CisgICAgICAgICAgICBib29sIHJlY3Vyc2l2ZSA9IG1fbGF5b3V0
VGVzdENvbnRyb2xsZXItPnNob3VsZER1bXBDaGlsZEZyYW1lc0FzVGV4dCgpOworICAgICAgICAg
ICAgc3RyaW5nIGRhdGFVdGY4ID0gZHVtcEZyYW1lc0FzVGV4dChmcmFtZSwgcmVjdXJzaXZlKTsK
KyAgICAgICAgICAgIGlmIChmd3JpdGUoZGF0YVV0ZjguY19zdHIoKSwgMSwgZGF0YVV0Zjguc2l6
ZSgpLCBzdGRvdXQpICE9IGRhdGFVdGY4LnNpemUoKSkKKyAgICAgICAgICAgICAgICBGQVRBTCgi
U2hvcnQgd3JpdGUgdG8gc3Rkb3V0LCBkaXNrIGZ1bGw/XG4iKTsKKyAgICAgICAgfSBlbHNlIHsK
KyAgICAgICAgICAgIHByaW50ZigiJXMiLCBmcmFtZS0+cmVuZGVyVHJlZUFzVGV4dCgpLnV0Zjgo
KS5kYXRhKCkpOworICAgICAgICAgICAgYm9vbCByZWN1cnNpdmUgPSBtX2xheW91dFRlc3RDb250
cm9sbGVyLT5zaG91bGREdW1wQ2hpbGRGcmFtZVNjcm9sbFBvc2l0aW9ucygpOworICAgICAgICAg
ICAgZHVtcEZyYW1lU2Nyb2xsUG9zaXRpb24oZnJhbWUsIHJlY3Vyc2l2ZSk7CisgICAgICAgIH0K
KyAgICAgICAgaWYgKG1fbGF5b3V0VGVzdENvbnRyb2xsZXItPnNob3VsZER1bXBCYWNrRm9yd2Fy
ZExpc3QoKSkKKyAgICAgICAgICAgIHByaW50ZigiJXMiLCBkdW1wQWxsQmFja0ZvcndhcmRMaXN0
cygpLmNfc3RyKCkpOworICAgIH0KKyAgICBpZiAoZHVtcGVkQW55dGhpbmcgJiYgbV9wYXJhbXMu
cHJpbnRTZXBhcmF0b3JzKQorICAgICAgICBwcmludGYoIiNFT0ZcbiIpOworCisgICAgaWYgKG1f
cGFyYW1zLmR1bXBQaXhlbHMgJiYgIXNob3VsZER1bXBBc1RleHQpIHsKKyAgICAgICAgLy8gSW1h
Z2Ugb3V0cHV0OiB3ZSB3cml0ZSB0aGUgaW1hZ2UgZGF0YSB0byB0aGUgZmlsZSBnaXZlbiBvbiB0
aGUKKyAgICAgICAgLy8gY29tbWFuZCBsaW5lIChmb3IgdGhlIGR1bXAgcGl4ZWxzIGFyZ3VtZW50
KSwgYW5kIHRoZSBNRDUgc3VtIHRvCisgICAgICAgIC8vIHN0ZG91dC4KKyAgICAgICAgZHVtcGVk
QW55dGhpbmcgPSB0cnVlOworICAgICAgICBtX3dlYlZpZXctPmxheW91dCgpOworICAgICAgICBp
ZiAobV9sYXlvdXRUZXN0Q29udHJvbGxlci0+dGVzdFJlcGFpbnQoKSkgeworICAgICAgICAgICAg
V2ViU2l6ZSB2aWV3U2l6ZSA9IG1fd2ViVmlldy0+c2l6ZSgpOworICAgICAgICAgICAgaW50IHdp
ZHRoID0gdmlld1NpemUud2lkdGg7CisgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gdmlld1NpemUu
aGVpZ2h0OworICAgICAgICAgICAgaWYgKG1fbGF5b3V0VGVzdENvbnRyb2xsZXItPnN3ZWVwSG9y
aXpvbnRhbGx5KCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFdlYlJlY3QgY29sdW1uKDAsIDAs
IDEsIGhlaWdodCk7IGNvbHVtbi54IDwgd2lkdGg7IGNvbHVtbi54KyspCisgICAgICAgICAgICAg
ICAgICAgIG1fd2ViVmlld0hvc3QtPnBhaW50UmVjdChjb2x1bW4pOworICAgICAgICAgICAgfSBl
bHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKFdlYlJlY3QgbGluZSgwLCAwLCB3aWR0aCwgMSk7
IGxpbmUueSA8IGhlaWdodDsgbGluZS55KyspCisgICAgICAgICAgICAgICAgICAgIG1fd2ViVmll
d0hvc3QtPnBhaW50UmVjdChsaW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisg
ICAgICAgICAgICBtX3dlYlZpZXdIb3N0LT5wYWludEludmFsaWRhdGVkUmVnaW9uKCk7CisKKyAg
ICAgICAgLy8gU2VlIGlmIHdlIG5lZWQgdG8gZHJhdyB0aGUgc2VsZWN0aW9uIGJvdW5kcyByZWN0
LiBTZWxlY3Rpb24gYm91bmRzCisgICAgICAgIC8vIHJlY3QgaXMgdGhlIHJlY3QgZW5jbG9zaW5n
IHRoZSAocG9zc2libHkgdHJhbnNmb3JtZWQpIHNlbGVjdGlvbi4KKyAgICAgICAgLy8gVGhlIHJl
Y3Qgc2hvdWxkIGJlIGRyYXduIGFmdGVyIGV2ZXJ5dGhpbmcgaXMgbGFpZCBvdXQgYW5kIHBhaW50
ZWQuCisgICAgICAgIGlmIChtX2xheW91dFRlc3RDb250cm9sbGVyLT5zaG91bGREdW1wU2VsZWN0
aW9uUmVjdCgpKSB7CisgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHNlbGVjdGlvbiByZWN0
IC0gZHJhdyBhIHJlZCAxcHggYm9yZGVyIGVuY2xvc2luZyByZWN0CisgICAgICAgICAgICBXZWJS
ZWN0IHdyID0gZnJhbWUtPnNlbGVjdGlvbkJvdW5kc1JlY3QoKTsKKyAgICAgICAgICAgIGlmICgh
d3IuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgLy8gUmVuZGVyIGEgcmVkIHJlY3Rhbmds
ZSBib3VuZGluZyBzZWxlY3Rpb24gcmVjdAorICAgICAgICAgICAgICAgIFNrUGFpbnQgcGFpbnQ7
CisgICAgICAgICAgICAgICAgcGFpbnQuc2V0Q29sb3IoMHhGRkZGMDAwMCk7IC8vIEZ1bGx5IG9w
YXF1ZSByZWQKKyAgICAgICAgICAgICAgICBwYWludC5zZXRTdHlsZShTa1BhaW50OjprU3Ryb2tl
X1N0eWxlKTsKKyAgICAgICAgICAgICAgICBwYWludC5zZXRGbGFncyhTa1BhaW50OjprQW50aUFs
aWFzX0ZsYWcpOworICAgICAgICAgICAgICAgIHBhaW50LnNldFN0cm9rZVdpZHRoKDEuMGYpOwor
ICAgICAgICAgICAgICAgIFNrSVJlY3QgcmVjdDsgLy8gQm91bmRpbmcgcmVjdAorICAgICAgICAg
ICAgICAgIHJlY3Quc2V0KHdyLngsIHdyLnksIHdyLnggKyB3ci53aWR0aCwgd3IueSArIHdyLmhl
aWdodCk7CisgICAgICAgICAgICAgICAgbV93ZWJWaWV3SG9zdC0+Y2FudmFzKCktPmRyYXdJUmVj
dChyZWN0LCBwYWludCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdHJp
bmcgbWQ1c3VtID0gZHVtcEltYWdlKG1fd2ViVmlld0hvc3QtPmNhbnZhcygpLCBtX3BhcmFtcy5w
aXhlbEhhc2gpOworICAgIH0KKyAgICBwcmludGYoIiNFT0ZcbiIpOyAvLyBGb3IgdGhlIGltYWdl
LgorICAgIGZmbHVzaChzdGRvdXQpOworICAgIGZmbHVzaChzdGRlcnIpOworfQorCitzdHJpbmcg
VGVzdFNoZWxsOjpkdW1wSW1hZ2Uoc2tpYTo6UGxhdGZvcm1DYW52YXMqIGNhbnZhcywgY29uc3Qg
c3RyaW5nJiBleHBlY3RlZEhhc2gpCit7CisgICAgc2tpYTo6Qml0bWFwUGxhdGZvcm1EZXZpY2Um
IGRldmljZSA9CisgICAgICAgIHN0YXRpY19jYXN0PHNraWE6OkJpdG1hcFBsYXRmb3JtRGV2aWNl
Jj4oY2FudmFzLT5nZXRUb3BQbGF0Zm9ybURldmljZSgpKTsKKyAgICBjb25zdCBTa0JpdG1hcCYg
c291cmNlQml0bWFwID0gZGV2aWNlLmFjY2Vzc0JpdG1hcChmYWxzZSk7CisKKyAgICBTa0F1dG9M
b2NrUGl4ZWxzIHNvdXJjZUJpdG1hcExvY2soc291cmNlQml0bWFwKTsKKworICAgIC8vIEZpeCB0
aGUgYWxwaGEuIFRoZSBleHBlY3RlZCBQTkdzIG9uIE1hYyBoYXZlIGFuIGFscGhhIGNoYW5uZWws
IHNvIHdlIHdhbnQKKyAgICAvLyB0byBrZWVwIGl0LiBPbiBXaW5kb3dzLCB0aGUgYWxwaGEgY2hh
bm5lbCBpcyB3cm9uZyBzaW5jZSB0ZXh0L2Zvcm0gY29udHJvbAorICAgIC8vIGRyYXdpbmcgbWF5
IGhhdmUgZXJhc2VkIGl0IGluIGEgZmV3IHBsYWNlcy4gU28gb24gV2luZG93cyB3ZSBmb3JjZSBp
dCB0bworICAgIC8vIG9wYXF1ZSBhbmQgYWxzbyBkb24ndCB3cml0ZSB0aGUgYWxwaGEgY2hhbm5l
bCBmb3IgdGhlIHJlZmVyZW5jZS4gTGludXgKKyAgICAvLyBkb2Vzbid0IGhhdmUgdGhlIHdyb25n
IGFscGhhIGxpa2UgV2luZG93cywgYnV0IHdlIGlnbm9yZSBpdCBhbnl3YXkuCisjaWYgT1MoV0lO
RE9XUykKKyAgICBib29sIGRpc2NhcmRUcmFuc3BhcmVuY3kgPSB0cnVlOworICAgIGRldmljZS5t
YWtlT3BhcXVlKDAsIDAsIHNvdXJjZUJpdG1hcC53aWR0aCgpLCBzb3VyY2VCaXRtYXAuaGVpZ2h0
KCkpOworI2VsaWYgT1MoTUFDX09TX1gpCisgICAgYm9vbCBkaXNjYXJkVHJhbnNwYXJlbmN5ID0g
ZmFsc2U7CisjZWxpZiBPUyhVTklYKQorICAgIGJvb2wgZGlzY2FyZFRyYW5zcGFyZW5jeSA9IHRy
dWU7CisjZW5kaWYKKworICAgIC8vIENvbXB1dGUgTUQ1IHN1bS4gIFdlIHNob3VsZCBoYXZlIGRv
bmUgdGhpcyBiZWZvcmUgY2FsbGluZworICAgIC8vIGRldmljZS5tYWtlT3BhcXVlIG9uIFdpbmRv
d3MuICBCZWNhdXNlIHdlIGRvIGl0IGFmdGVyIHRoZSBjYWxsLCB0aGVyZSBhcmUKKyAgICAvLyBz
b21lIGltYWdlcyB0aGF0IGFyZSB0aGUgcGl4ZWwgaWRlbnRpY2FsIG9uIHdpbmRvd3MgYW5kIG90
aGVyIHBsYXRmb3JtcworICAgIC8vIGJ1dCBoYXZlIGRpZmZlcmVudCBNRDUgc3Vtcy4gIEF0IHRo
aXMgcG9pbnQsIHJlYmFzZWxpbmluZyBhbGwgdGhlIHdpbmRvd3MKKyAgICAvLyB0ZXN0cyBpcyB0
b28gbXVjaCBvZiBhIHBhaW4sIHNvIHdlIGp1c3QgY2hlY2sgaW4gZGlmZmVyZW50IGJhc2VsaW5l
cy4KKyAgICBNRDVDb250ZXh0IGN0eDsKKyAgICBNRDVJbml0KCZjdHgpOworICAgIE1ENVVwZGF0
ZSgmY3R4LCBzb3VyY2VCaXRtYXAuZ2V0UGl4ZWxzKCksIHNvdXJjZUJpdG1hcC5nZXRTaXplKCkp
OworCisgICAgTUQ1RGlnZXN0IGRpZ2VzdDsKKyAgICBNRDVGaW5hbCgmZGlnZXN0LCAmY3R4KTsK
KyAgICBzdHJpbmcgbWQ1aGFzaCA9IE1ENURpZ2VzdFRvQmFzZTE2KGRpZ2VzdCk7CisgICAgcHJp
bnRmKCJcbkFjdHVhbEhhc2g6ICVzXG4iLCBtZDVoYXNoLmNfc3RyKCkpOworICAgIGlmICghZXhw
ZWN0ZWRIYXNoLmVtcHR5KCkpCisgICAgICAgIHByaW50ZigiXG5FeHBlY3RlZEhhc2g6ICVzXG4i
LCBleHBlY3RlZEhhc2guY19zdHIoKSk7CisKKyAgICAvLyBPbmx5IGVuY29kZSBhbmQgZHVtcCB0
aGUgcG5nIGlmIHRoZSBoYXNoZXMgZG9uJ3QgbWF0Y2guIEVuY29kaW5nIHRoZSBpbWFnZQorICAg
IC8vIGlzIHJlYWxseSBleHBlbnNpdmUuCisgICAgaWYgKG1kNWhhc2guY29tcGFyZShleHBlY3Rl
ZEhhc2gpKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+IHBuZzsKKyAgICAg
ICAgZ2Z4OjpQTkdDb2RlYzo6Q29sb3JGb3JtYXQgY29sb3JGb3JtYXQgPSBnZng6OlBOR0NvZGVj
OjpGT1JNQVRfQkdSQTsKKyAgICAgICAgZ2Z4OjpQTkdDb2RlYzo6RW5jb2RlKAorICAgICAgICAg
ICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oc291cmNlQml0bWFwLmdl
dFBpeGVscygpKSwKKyAgICAgICAgICAgIGNvbG9yRm9ybWF0LCBzb3VyY2VCaXRtYXAud2lkdGgo
KSwgc291cmNlQml0bWFwLmhlaWdodCgpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pihz
b3VyY2VCaXRtYXAucm93Qnl0ZXMoKSksIGRpc2NhcmRUcmFuc3BhcmVuY3ksICZwbmcpOworCisg
ICAgICAgIHByaW50ZigiQ29udGVudC1UeXBlOiBpbWFnZS9wbmdcbiIpOworICAgICAgICBwcmlu
dGYoIkNvbnRlbnQtTGVuZ3RoOiAldVxuIiwgcG5nLnNpemUoKSk7CisgICAgICAgIC8vIFdyaXRl
IHRvIGRpc2suCisgICAgICAgIGlmIChmd3JpdGUoJnBuZ1swXSwgMSwgcG5nLnNpemUoKSwgc3Rk
b3V0KSAhPSBwbmcuc2l6ZSgpKQorICAgICAgICAgICAgRkFUQUwoIlNob3J0IHdyaXRlIHRvIHN0
ZG91dC5cbiIpOworICAgIH0KKworICAgIHJldHVybiBtZDVoYXNoOworfQorCit2b2lkIFRlc3RT
aGVsbDo6YmluZEpTT2JqZWN0c1RvV2luZG93KFdlYkZyYW1lKiBmcmFtZSkKK3sKKyAgICBtX2Fj
Y2Vzc2liaWxpdHlDb250cm9sbGVyLT5iaW5kVG9KYXZhc2NyaXB0KGZyYW1lLCBXZWJTdHJpbmc6
OmZyb21VVEY4KCJhY2Nlc3NpYmlsaXR5Q29udHJvbGxlciIpKTsKKyAgICBtX2xheW91dFRlc3RD
b250cm9sbGVyLT5iaW5kVG9KYXZhc2NyaXB0KGZyYW1lLCBXZWJTdHJpbmc6OmZyb21VVEY4KCJs
YXlvdXRUZXN0Q29udHJvbGxlciIpKTsKKyAgICBtX2V2ZW50U2VuZGVyLT5iaW5kVG9KYXZhc2Ny
aXB0KGZyYW1lLCBXZWJTdHJpbmc6OmZyb21VVEY4KCJldmVudFNlbmRlciIpKTsKKyAgICBtX3Bs
YWluVGV4dENvbnRyb2xsZXItPmJpbmRUb0phdmFzY3JpcHQoZnJhbWUsIFdlYlN0cmluZzo6ZnJv
bVVURjgoInBsYWluVGV4dCIpKTsKKyAgICBtX3RleHRJbnB1dENvbnRyb2xsZXItPmJpbmRUb0ph
dmFzY3JpcHQoZnJhbWUsIFdlYlN0cmluZzo6ZnJvbVVURjgoInRleHRJbnB1dENvbnRyb2xsZXIi
KSk7Cit9CisKK2ludCBUZXN0U2hlbGw6OmxheW91dFRlc3RUaW1lb3V0KCkKK3sKKyAgICByZXR1
cm4gMTAgKiAxMDAwOworfQorCitXZWJWaWV3SG9zdCogVGVzdFNoZWxsOjpjcmVhdGVXZWJWaWV3
KCkKK3sKKyAgICByZXR1cm4gY3JlYXRlTmV3V2luZG93KFdlYlVSTCgpKTsKK30KKworV2ViVmll
d0hvc3QqIFRlc3RTaGVsbDo6Y3JlYXRlTmV3V2luZG93KGNvbnN0IFdlYlVSTCYgdXJsKQorewor
ICAgIFdlYlZpZXdIb3N0KiBob3N0ID0gbmV3IFdlYlZpZXdIb3N0KHRoaXMpOworICAgIFdlYlZp
ZXcqIHZpZXcgPSBXZWJWaWV3OjpjcmVhdGUoaG9zdCk7CisgICAgaG9zdC0+c2V0V2ViV2lkZ2V0
KHZpZXcpOworICAgIHJlc2V0V2ViU2V0dGluZ3MoKnZpZXcpOworICAgIHZpZXctPmluaXRpYWxp
emVNYWluRnJhbWUoaG9zdCk7CisgICAgbV93aW5kb3dMaXN0LmFwcGVuZChob3N0KTsKKyAgICBo
b3N0LT5sb2FkVVJMRm9yRnJhbWUodXJsLCBXZWJTdHJpbmcoKSk7CisgICAgcmV0dXJuIGhvc3Q7
Cit9CisKK3ZvaWQgVGVzdFNoZWxsOjpjbG9zZVdpbmRvdyhXZWJWaWV3SG9zdCogd2luZG93KQor
eworICAgIHNpemVfdCBpID0gbV93aW5kb3dMaXN0LmZpbmQod2luZG93KTsKKyAgICBpZiAoaSA9
PSBub3RGb3VuZCkgeworICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKyAgICBtX3dpbmRvd0xpc3QucmVtb3ZlKGkpOworICAgIHdpbmRvdy0+d2Vi
V2lkZ2V0KCktPmNsb3NlKCk7CisgICAgZGVsZXRlIHdpbmRvdzsKK30KKwordm9pZCBUZXN0U2hl
bGw6OmNsb3NlUmVtYWluaW5nV2luZG93cygpCit7CisgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRo
ZSB3aW5kb3cgbGlzdCBhbmQgY2xvc2UgZXZlcnl0aGluZyBleGNlcHQgdGhlIG1haW4KKyAgICAv
LyBpaHdpbmRvdy4gV2UgZG9uJ3Qgd2FudCB0byBkZWxldGUgZWxlbWVudHMgYXMgd2UncmUgaXRl
cmF0aW5nLCBzbyB3ZSBjb3B5CisgICAgLy8gdG8gYSB0ZW1wIHZlY3RvciBmaXJzdC4KKyAgICBW
ZWN0b3I8V2ViVmlld0hvc3QqPiB3aW5kb3dzVG9EZWxldGU7CisgICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSA8IG1fd2luZG93TGlzdC5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAobV93aW5k
b3dMaXN0W2ldICE9IHdlYlZpZXdIb3N0KCkpCisgICAgICAgICAgICB3aW5kb3dzVG9EZWxldGUu
YXBwZW5kKG1fd2luZG93TGlzdFtpXSk7CisgICAgfQorICAgIEFTU0VSVCh3aW5kb3dzVG9EZWxl
dGUuc2l6ZSgpICsgMSA9PSBtX3dpbmRvd0xpc3Quc2l6ZSgpKTsKKyAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwgd2luZG93c1RvRGVsZXRlLnNpemUoKTsgKytpKQorICAgICAgICBjbG9zZVdp
bmRvdyh3aW5kb3dzVG9EZWxldGVbaV0pOworICAgIEFTU0VSVChtX3dpbmRvd0xpc3Quc2l6ZSgp
ID09IDEpOworfQorCitpbnQgVGVzdFNoZWxsOjp3aW5kb3dDb3VudCgpCit7CisgICAgcmV0dXJu
IG1fd2luZG93TGlzdC5zaXplKCk7Cit9CmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9EdW1wUmVu
ZGVyVHJlZS9jaHJvbWl1bS9UZXN0U2hlbGwuaCBiL1dlYktpdFRvb2xzL0R1bXBSZW5kZXJUcmVl
L2Nocm9taXVtL1Rlc3RTaGVsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAu
LmIzYTBkNzMKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXRUb29scy9EdW1wUmVuZGVyVHJlZS9j
aHJvbWl1bS9UZXN0U2hlbGwuaApAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisg
KiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2Yg
aXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHBy
b2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHBy
aW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFO
RCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAor
ICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVD
SUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJBY2Nlc3NpYmls
aXR5Q29udHJvbGxlci5oIgorI2luY2x1ZGUgIkV2ZW50U2VuZGVyLmgiCisjaW5jbHVkZSAiTGF5
b3V0VGVzdENvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJQbGFpblRleHRDb250cm9sbGVyLmgiCisj
aW5jbHVkZSAiVGV4dElucHV0Q29udHJvbGxlci5oIgorI2luY2x1ZGUgIldlYlZpZXdIb3N0Lmgi
CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKyNpbmNsdWRlIDx3
dGYvVmVjdG9yLmg+CisKKy8vIFRlc3RTaGVsbCBpcyBhIGNvbnRhaW5lciBvZiBnbG9iYWwgdmFy
aWFibGVzIGFuZCBoYXMgYnJpZGdlIGZ1bmN0aW9ucyBiZXR3ZWVuCisvLyB2YXJpb3VzIG9iamVj
dHMuIE9ubHkgb25lIGluc3RhbmNlIGlzIGNyZWF0ZWQgaW4gb25lIERSVCBwcm9jZXNzLgorCitu
YW1lc3BhY2UgV2ViS2l0IHsKK2NsYXNzIFdlYkZyYW1lOworY2xhc3MgV2ViUHJlZmVyZW5jZXM7
CitjbGFzcyBXZWJWaWV3OworY2xhc3MgV2ViVVJMOworfQorbmFtZXNwYWNlIHNraWEgeworY2xh
c3MgUGxhdGZvcm1DYW52YXM7Cit9CisKK3N0cnVjdCBUZXN0UGFyYW1zIHsKKyAgICBib29sIGR1
bXBUcmVlOworICAgIGJvb2wgZHVtcFBpeGVsczsKKyAgICBib29sIHByaW50U2VwYXJhdG9yczsK
KyAgICBXZWJLaXQ6OldlYlVSTCB0ZXN0VXJsOworICAgIHN0ZDo6c3RyaW5nIHBpeGVsRmlsZU5h
bWU7CisgICAgc3RkOjpzdHJpbmcgcGl4ZWxIYXNoOworCisgICAgVGVzdFBhcmFtcygpCisgICAg
ICAgIDogZHVtcFRyZWUodHJ1ZSkKKyAgICAgICAgLCBkdW1wUGl4ZWxzKGZhbHNlKQorICAgICAg
ICAsIHByaW50U2VwYXJhdG9ycyhmYWxzZSkge30KK307CisKK2NsYXNzIFRlc3RTaGVsbCB7Citw
dWJsaWM6CisgICAgVGVzdFNoZWxsKCk7CisgICAgflRlc3RTaGVsbCgpOworICAgIC8vIFRoZSBt
YWluIFdlYlZpZXcuCisgICAgV2ViS2l0OjpXZWJWaWV3KiB3ZWJWaWV3KCkgY29uc3QgeyByZXR1
cm4gbV93ZWJWaWV3OyB9CisgICAgLy8gUmV0dXJucyB0aGUgaG9zdCBmb3IgdGhlIG1haW4gV2Vi
Vmlldy4KKyAgICBXZWJWaWV3SG9zdCogd2ViVmlld0hvc3QoKSBjb25zdCB7IHJldHVybiBtX3dl
YlZpZXdIb3N0OyB9CisgICAgTGF5b3V0VGVzdENvbnRyb2xsZXIqIGxheW91dFRlc3RDb250cm9s
bGVyKCkgY29uc3QgeyByZXR1cm4gbV9sYXlvdXRUZXN0Q29udHJvbGxlci5nZXQoKTsgfQorICAg
IEFjY2Vzc2liaWxpdHlDb250cm9sbGVyKiBhY2Nlc3NpYmlsaXR5Q29udHJvbGxlcigpIGNvbnN0
IHsgcmV0dXJuIG1fYWNjZXNzaWJpbGl0eUNvbnRyb2xsZXIuZ2V0KCk7IH0KKworICAgIHZvaWQg
YmluZEpTT2JqZWN0c1RvV2luZG93KFdlYktpdDo6V2ViRnJhbWUqKTsKKyAgICB2b2lkIHJ1bkZp
bGVUZXN0KGNvbnN0IFRlc3RQYXJhbXMmKTsKKyAgICB2b2lkIGNhbGxKU0dDKCk7CisgICAgdm9p
ZCByZXNldFRlc3RDb250cm9sbGVyKCk7CisgICAgdm9pZCB3YWl0VGVzdEZpbmlzaGVkKCk7CisK
KyAgICAvLyBPcGVyYXRpb25zIHRvIHRoZSBtYWluIHdpbmRvdy4KKyAgICB2b2lkIGxvYWRVUkwo
Y29uc3QgV2ViS2l0OjpXZWJVUkwmIHVybCk7CisgICAgdm9pZCByZWxvYWQoKTsKKyAgICB2b2lk
IGdvVG9PZmZzZXQoaW50IG9mZnNldCk7CisgICAgaW50IG5hdmlnYXRpb25FbnRyeUNvdW50KCkg
Y29uc3Q7CisKKyAgICB2b2lkIHNldEZvY3VzKFdlYktpdDo6V2ViV2lkZ2V0KiwgYm9vbCBlbmFi
bGUpOworICAgIGJvb2wgc2hvdWxkRHVtcEZyYW1lTG9hZENhbGxiYWNrcygpIGNvbnN0IHsgcmV0
dXJuIChtX3Rlc3RJc1ByZXBhcmluZyB8fCBtX3Rlc3RJc1BlbmRpbmcpICYmIGxheW91dFRlc3RD
b250cm9sbGVyKCktPnNob3VsZER1bXBGcmFtZUxvYWRDYWxsYmFja3MoKTsgfQorICAgIGJvb2wg
c2hvdWxkRHVtcFJlc291cmNlTG9hZENhbGxiYWNrcygpIGNvbnN0ICB7IHJldHVybiAobV90ZXN0
SXNQcmVwYXJpbmcgfHwgbV90ZXN0SXNQZW5kaW5nKSAmJiBsYXlvdXRUZXN0Q29udHJvbGxlcigp
LT5zaG91bGREdW1wUmVzb3VyY2VMb2FkQ2FsbGJhY2tzKCk7IH0KKyAgICB2b2lkIHNldElzTG9h
ZGluZyhib29sIGZsYWcpIHsgbV9pc0xvYWRpbmcgPSBmbGFnOyB9CisKKyAgICAvLyBDYWxsZWQg
YnkgdGhlIExheW91dFRlc3RDb250cm9sbGVyIHRvIHNpZ25hbCB0ZXN0IGNvbXBsZXRpb24uCisg
ICAgdm9pZCB0ZXN0RmluaXNoZWQoKTsKKyAgICAvLyBDYWxsZWQgYnkgTGF5b3V0VGVzdENvbnRy
b2xsZXIgd2hlbiBhIHRlc3QgaGl0cyB0aGUgdGltZW91dCwgYnV0IGRvZXMgbm90CisgICAgLy8g
Y2F1c2UgYSBoYW5nLiBXZSBjYW4gYXZvaWQga2lsbGluZyBUZXN0U2hlbGwgaW4gdGhpcyBjYXNl
IGFuZCBzdGlsbCBkdW1wCisgICAgLy8gdGhlIHRlc3QgcmVzdWx0cy4KKyAgICB2b2lkIHRlc3RU
aW1lZE91dCgpOworCisgICAgLy8gR2V0IHRoZSB0aW1lb3V0IGZvciBydW5uaW5nIGEgdGVzdCBp
biBtaWxsaXNlY29uZHMuCisgICAgc3RhdGljIGludCBsYXlvdXRUZXN0VGltZW91dCgpOworICAg
IHN0YXRpYyBpbnQgbGF5b3V0VGVzdFRpbWVvdXRGb3JXYXRjaERvZygpIHsgcmV0dXJuIGxheW91
dFRlc3RUaW1lb3V0KCkgKyAxMDAwOyB9CisKKyAgICBXZWJWaWV3SG9zdCogY3JlYXRlV2ViVmll
dygpOworICAgIFdlYlZpZXdIb3N0KiBjcmVhdGVOZXdXaW5kb3coY29uc3QgV2ViS2l0OjpXZWJV
UkwmKTsKKyAgICB2b2lkIGNsb3NlV2luZG93KFdlYlZpZXdIb3N0Kik7CisgICAgdm9pZCBjbG9z
ZVJlbWFpbmluZ1dpbmRvd3MoKTsKKyAgICBpbnQgd2luZG93Q291bnQoKTsKKyAgICBzdGF0aWMg
dm9pZCByZXNpemVXaW5kb3dGb3JUZXN0KFdlYlZpZXdIb3N0KiwgY29uc3QgV2ViS2l0OjpXZWJV
UkwmKTsKKworICAgIHN0YXRpYyBjb25zdCBpbnQgdmlydHVhbFdpbmRvd0JvcmRlciA9IDM7CisK
K3ByaXZhdGU6CisgICAgc3RhdGljIHZvaWQgcmVzZXRXZWJTZXR0aW5ncyhXZWJLaXQ6OldlYlZp
ZXcmKTsKKyAgICB2b2lkIGR1bXAoKTsKKyAgICBzdGQ6OnN0cmluZyBkdW1wQWxsQmFja0Zvcndh
cmRMaXN0cygpOworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBkdW1wSW1hZ2Uoc2tpYTo6UGxhdGZv
cm1DYW52YXMqLCBjb25zdCBzdGQ6OnN0cmluZyYgZXhwZWN0ZWRIYXNoKTsKKworICAgIGJvb2wg
bV90ZXN0SXNQZW5kaW5nOworICAgIGJvb2wgbV90ZXN0SXNQcmVwYXJpbmc7CisgICAgYm9vbCBt
X2lzTG9hZGluZzsKKyAgICBXZWJLaXQ6OldlYlZpZXcqIG1fd2ViVmlldzsKKyAgICBXZWJLaXQ6
OldlYldpZGdldCogbV9mb2N1c2VkV2lkZ2V0OworICAgIFdlYlZpZXdIb3N0KiBtX3dlYlZpZXdI
b3N0OworICAgIE93blB0cjxBY2Nlc3NpYmlsaXR5Q29udHJvbGxlcio+IG1fYWNjZXNzaWJpbGl0
eUNvbnRyb2xsZXI7CisgICAgT3duUHRyPEV2ZW50U2VuZGVyKj4gbV9ldmVudFNlbmRlcjsKKyAg
ICBPd25QdHI8TGF5b3V0VGVzdENvbnRyb2xsZXIqPiBtX2xheW91dFRlc3RDb250cm9sbGVyOwor
ICAgIE93blB0cjxQbGFpblRleHRDb250cm9sbGVyKj4gbV9wbGFpblRleHRDb250cm9sbGVyOwor
ICAgIE93blB0cjxUZXh0SW5wdXRDb250cm9sbGVyKj4gbV90ZXh0SW5wdXRDb250cm9sbGVyOwor
ICAgIFRlc3RQYXJhbXMgbV9wYXJhbXM7CisKKyAgICAvLyBMaXN0IG9mIGFsbCB3aW5kb3dzIGlu
IHRoaXMgcHJvY2Vzcy4KKyAgICAvLyBUaGUgbWFpbiB3aW5kb3cgc2hvdWxkIGJlIHB1dCBpbnRv
IHdpbmRvd0xpc3RbMF0uCisgICAgdHlwZWRlZiBWZWN0b3I8V2ViVmlld0hvc3QqPiBXaW5kb3dM
aXN0OworICAgIFdpbmRvd0xpc3QgbV93aW5kb3dMaXN0OworfTsKZGlmZiAtLWdpdCBhL1dlYktp
dFRvb2xzL0R1bXBSZW5kZXJUcmVlL2Nocm9taXVtL1Rlc3RTaGVsbE1hYy5tbSBiL1dlYktpdFRv
b2xzL0R1bXBSZW5kZXJUcmVlL2Nocm9taXVtL1Rlc3RTaGVsbE1hYy5tbQpuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDA5OWFmCi0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0
VG9vbHMvRHVtcFJlbmRlclRyZWUvY2hyb21pdW0vVGVzdFNoZWxsTWFjLm1tCkBAIC0wLDAgKzEs
OTUgQEAKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgIlRlc3RTaGVsbC5oIgorI2lu
Y2x1ZGUgIndlYmtpdC9zdXBwb3J0L3dlYmtpdF9zdXBwb3J0LmgiCisjaW1wb3J0IDxBcHBLaXQv
QXBwS2l0Lmg+CisKKy8vIEEgY2xhc3MgdG8gYmUgdGhlIHRhcmdldC9zZWxlY3RvciBvZiB0aGUg
IndhdGNoZG9nIiB0aHJlYWQgdGhhdCBlbnN1cmVzCisvLyBwYWdlcyB0aW1lb3V0IGlmIHRoZXkg
dGFrZSB0b28gbG9uZyBhbmQgdGVsbHMgdGhlIHRlc3QgaGFybmVzcyB2aWEgc3Rkb3V0LgorQGlu
dGVyZmFjZSBXYXRjaERvZ1RhcmdldCA6IE5TT2JqZWN0IHsKK0Bwcml2YXRlCisgICAgTlNUaW1l
SW50ZXJ2YWwgX3RpbWVvdXQ7Cit9CisvLyB8dGltZW91dHwgaXMgaW4gc2Vjb25kcworLSAoaWQp
aW5pdFdpdGhUaW1lb3V0OihOU1RpbWVJbnRlcnZhbCl0aW1lb3V0OworLy8gc2VydmVzIGFzIHRo
ZSAicnVuIiBtZXRob2Qgb2YgYSBOU1RocmVhZC4KKy0gKHZvaWQpcnVuOihpZClzZW5kZXI7CitA
ZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBXYXRjaERvZ1RhcmdldAorCistIChpZClpbml0V2l0aFRp
bWVvdXQ6KE5TVGltZUludGVydmFsKXRpbWVvdXQKK3sKKyAgICBpZiAoKHNlbGYgPSBbc3VwZXIg
aW5pdF0pKQorICAgICAgICBfdGltZW91dCA9IHRpbWVvdXQ7CisgICAgcmV0dXJuIHNlbGY7Cit9
CisKKy0gKHZvaWQpcnVuOihpZClpZ25vcmUKK3sKKyAgICBOU0F1dG9yZWxlYXNlUG9vbCogcG9v
bCA9IFtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOworCisgICAgLy8gY2hlY2sgZm9y
IGRlYnVnZ2VyLCBqdXN0IGJhaWwgaWYgc28uIFdlIGRvbid0IHdhbnQgdGhlIHRpbWVvdXRzIGhp
dHRpbmcKKyAgICAvLyB3aGVuIHdlJ3JlIHRyeWluZyB0byB0cmFjayBkb3duIGFuIGlzc3VlLgor
ICAgIGlmICh3ZWJraXRfc3VwcG9ydDo6QmVpbmdEZWJ1Z2dlZCgpKQorICAgICAgICByZXR1cm47
CisKKyAgICBOU1RocmVhZCogY3VycmVudFRocmVhZCA9IFtOU1RocmVhZCBjdXJyZW50VGhyZWFk
XTsKKworICAgIC8vIFdhaXQgdG8gYmUgY2FuY2VsbGVkLiBJZiB3ZSBhcmUgdGhhdCBtZWFucyB0
aGUgdGVzdCBmaW5pc2hlZC4gSWYgaXQgaGFzbid0LAorICAgIC8vIHRoZW4gd2UgbmVlZCB0byB0
ZWxsIHRoZSBsYXlvdXQgc2NyaXB0IHdlIHRpbWVkIG91dCBhbmQgc3RhcnQgYWdhaW4uCisgICAg
TlNEYXRlKiBsaW1pdERhdGUgPSBbTlNEYXRlIGRhdGVXaXRoVGltZUludGVydmFsU2luY2VOb3c6
X3RpbWVvdXRdOworICAgIHdoaWxlIChbKE5TRGF0ZSopW05TRGF0ZSBkYXRlXSBjb21wYXJlOmxp
bWl0RGF0ZV0gPT0gTlNPcmRlcmVkQXNjZW5kaW5nICYmCisgICAgICAgICAgICFbY3VycmVudFRo
cmVhZCBpc0NhbmNlbGxlZF0pIHsKKyAgICAgICAgLy8gc2xlZXAgZm9yIGEgc21hbGwgaW5jcmVt
ZW50IHRoZW4gY2hlY2sgYWdhaW4KKyAgICAgICAgTlNEYXRlKiBpbmNyZW1lbnREYXRlID0gW05T
RGF0ZSBkYXRlV2l0aFRpbWVJbnRlcnZhbFNpbmNlTm93OjEuMF07CisgICAgICAgIFtOU1RocmVh
ZCBzbGVlcFVudGlsRGF0ZTppbmNyZW1lbnREYXRlXTsKKyAgICB9CisgICAgaWYgKCFbY3VycmVu
dFRocmVhZCBpc0NhbmNlbGxlZF0pIHsKKyAgICAgICAgLy8gUHJpbnQgYSB3YXJuaW5nIHRvIGJl
IGNhdWdodCBieSB0aGUgbGF5b3V0LXRlc3Qgc2NyaXB0LgorICAgICAgICAvLyBOb3RlOiB0aGUg
bGF5b3V0IHRlc3QgZHJpdmVyIG1heSBvciBtYXkgbm90IHJlY29nbml6ZQorICAgICAgICAvLyB0
aGlzIGFzIGEgdGltZW91dC4KKyAgICAgICAgcHV0cygiI1RFU1RfVElNRURfT1VUXG4iKTsKKyAg
ICAgICAgcHV0cygiI0VPRlxuIik7CisgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICBl
eGl0KDApOworICAgIH0KKworICAgIFtwb29sIHJlbGVhc2VdOworfQorCitAZW5kCisKK3ZvaWQg
VGVzdFNoZWxsOjp3YWl0VGVzdEZpbmlzaGVkKCkKK3sKKyAgICBBU1NFUlQoIW1fdGVzdElzUGVu
ZGluZyk7CisKKyAgICBtX3Rlc3RJc1BlbmRpbmcgPSB0cnVlOworCisgICAgLy8gQ3JlYXRlIGEg
d2F0Y2hkb2cgdGhyZWFkIHdoaWNoIGp1c3Qgc2V0cyBhIHRpbWVyIGFuZAorICAgIC8vIGtpbGxz
IHRoZSBwcm9jZXNzIGlmIGl0IHRpbWVzIG91dC4gIFRoaXMgY2F0Y2hlcyByZWFsbHkKKyAgICAv
LyBiYWQgaGFuZ3Mgd2hlcmUgdGhlIHNoZWxsIGlzbid0IGNvbWluZyBiYWNrIHRvIHRoZQorICAg
IC8vIG1lc3NhZ2UgbG9vcC4gIElmIHRoZSB3YXRjaGRvZyBpcyB3aGF0IGNhdGNoZXMgYQorICAg
IC8vIHRpbWVvdXQsIGl0IGNhbid0IGRvIGFueXRoaW5nIGV4Y2VwdCB0ZXJtaW5hdGUgdGhlIHRl
c3QKKyAgICAvLyBzaGVsbCwgd2hpY2ggaXMgdW5mb3J0dW5hdGUuCisgICAgLy8gV2luZG93cyBt
dWx0aXBsaWVzIGJ5IDIuNSwgYnV0IHRoYXQgY2F1c2VzIHVzIHRvIHJ1biBmb3IgZmFyLCBmYXIg
dG9vCisgICAgLy8gbG9uZy4gV2UgdXNlIHRoZSBwYXNzZWQgdmFsdWUgYW5kIGxldCB0aGUgc2Ny
aXB0cyBmbGFnIG92ZXJyaWRlCisgICAgLy8gdGhlIHZhbHVlIGFzIG5lZWRlZC4KKyAgICBOU1Rp
bWVJbnRlcnZhbCB0aW1lb3V0U2Vjb25kcyA9IGxheW91dFRlc3RUaW1lb3V0Rm9yV2F0Y2hEb2co
KSAvIDEwMDA7CisgICAgV2F0Y2hEb2dUYXJnZXQqIHdhdGNoZG9nID0gW1tbV2F0Y2hEb2dUYXJn
ZXQgYWxsb2NdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0V2l0aFRp
bWVvdXQ6dGltZW91dFNlY29uZHNdIGF1dG9yZWxlYXNlXTsKKyAgICBOU1RocmVhZCogdGhyZWFk
ID0gW1tOU1RocmVhZCBhbGxvY10gaW5pdFdpdGhUYXJnZXQ6d2F0Y2hkb2cKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6QHNlbGVjdG9yKHJ1bjopCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDpuaWxdOworICAg
IFt0aHJlYWQgc3RhcnRdOworCisgICAgLy8gVGVzdEZpbmlzaGVkKCkgd2lsbCBwb3N0IGEgcXVp
dCBtZXNzYWdlIHRvIGJyZWFrIHRoaXMgbG9vcCB3aGVuIHRoZSBwYWdlCisgICAgLy8gZmluaXNo
ZXMgbG9hZGluZy4KKyAgICB3aGlsZSAobV90ZXN0SXNQZW5kaW5nKQorICAgICAgICB3ZWJraXRf
c3VwcG9ydDo6UnVuTWVzc2FnZUxvb3AoKTsKKworICAgIC8vIFRlbGwgdGhlIHdhdGNoZG9nIHRo
YXQgd2UncmUgZmluaXNoZWQuIE5vIHBvaW50IHdhaXRpbmcgdG8gcmUtam9pbiwgaXQnbGwKKyAg
ICAvLyBkaWUgb24gaXRzIG93bi4KKyAgICBbdGhyZWFkIGNhbmNlbF07CisgICAgW3RocmVhZCBy
ZWxlYXNlXTsKK30KZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0R1bXBSZW5kZXJUcmVlL2Nocm9t
aXVtL1dlYlZpZXdIb3N0LmNwcCBiL1dlYktpdFRvb2xzL0R1bXBSZW5kZXJUcmVlL2Nocm9taXVt
L1dlYlZpZXdIb3N0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTk0
NWNkCi0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvY2hyb21p
dW0vV2ViVmlld0hvc3QuY3BwCkBAIC0wLDAgKzEsMTMxMyBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisg
KiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2Yg
aXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHBy
b2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHBy
aW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFO
RCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAor
ICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVD
SUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KyNpbmNsdWRlICJXZWJWaWV3SG9zdC5oIgorCisjaW5jbHVkZSAiTGF5b3V0VGVzdENvbnRyb2xs
ZXIuaCIKKyNpbmNsdWRlICJUZXN0TmF2aWdhdGlvbkNvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJU
ZXN0U2hlbGwuaCIKKyNpbmNsdWRlICJUZXN0V2ViV29ya2VyLmgiCisjaW5jbHVkZSAibmV0L2Jh
c2UvbmV0X2Vycm9ycy5oIiAvLyBGSVhNRTogY2FuIHdlIHJlbW92ZSB0aGlzPworI2luY2x1ZGUg
InB1YmxpYy9XZWJDU3RyaW5nLmgiCisjaW5jbHVkZSAicHVibGljL1dlYkNvbnNvbGVNZXNzYWdl
LmgiCisjaW5jbHVkZSAicHVibGljL1dlYkNvbnRleHRNZW51RGF0YS5oIgorI2luY2x1ZGUgInB1
YmxpYy9XZWJEYXRhU291cmNlLmgiCisjaW5jbHVkZSAicHVibGljL1dlYkRyYWdEYXRhLmgiCisj
aW5jbHVkZSAicHVibGljL1dlYkZyYW1lLmgiCisjaW5jbHVkZSAicHVibGljL1dlYkhpc3RvcnlJ
dGVtLmgiCisjaW5jbHVkZSAicHVibGljL1dlYk5vZGUuaCIKKyNpbmNsdWRlICJwdWJsaWMvV2Vi
UmFuZ2UuaCIKKyNpbmNsdWRlICJwdWJsaWMvV2ViUmVjdC5oIgorI2luY2x1ZGUgInB1YmxpYy9X
ZWJTY3JlZW5JbmZvLmgiCisjaW5jbHVkZSAicHVibGljL1dlYlNpemUuaCIKKyNpbmNsdWRlICJw
dWJsaWMvV2ViU3RvcmFnZU5hbWVzcGFjZS5oIgorI2luY2x1ZGUgInB1YmxpYy9XZWJVUkxSZXF1
ZXN0LmgiCisjaW5jbHVkZSAicHVibGljL1dlYlVSTFJlc3BvbnNlLmgiCisjaW5jbHVkZSAicHVi
bGljL1dlYlZpZXcuaCIKKyNpbmNsdWRlICJza2lhL2V4dC9wbGF0Zm9ybV9jYW52YXMuaCIKKyNp
bmNsdWRlICJ3ZWJraXQvc3VwcG9ydC93ZWJraXRfc3VwcG9ydC5oIgorI2luY2x1ZGUgPHd0Zi9B
c3NlcnRpb25zLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBXZWJLaXQ7Cit1c2luZyBuYW1lc3BhY2Ug
c2tpYTsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3N0YXRpYyBjb25zdCBpbnQgc2NyZWVuV2lk
dGggPSAxOTIwOworc3RhdGljIGNvbnN0IGludCBzY3JlZW5IZWlnaHQgPSAxMDgwOworc3RhdGlj
IGNvbnN0IGludCBzY3JlZW5VbmF2YWlsYWJsZUJvcmRlciA9IDg7CisKKy8vIFdlYk5hdmlnYXRp
b25UeXBlIGRlYnVnZ2luZyBzdHJpbmdzIHRha2VuIGZyb20gUG9saWN5RGVsZWdhdGUubW0uCitz
dGF0aWMgY29uc3QgY2hhciogbGlua0NsaWNrZWRTdHJpbmcgPSAibGluayBjbGlja2VkIjsKK3N0
YXRpYyBjb25zdCBjaGFyKiBmb3JtU3VibWl0dGVkU3RyaW5nID0gImZvcm0gc3VibWl0dGVkIjsK
K3N0YXRpYyBjb25zdCBjaGFyKiBiYWNrRm9yd2FyZFN0cmluZyA9ICJiYWNrL2ZvcndhcmQiOwor
c3RhdGljIGNvbnN0IGNoYXIqIHJlbG9hZFN0cmluZyA9ICJyZWxvYWQiOworc3RhdGljIGNvbnN0
IGNoYXIqIGZvcm1SZXN1Ym1pdHRlZFN0cmluZyA9ICJmb3JtIHJlc3VibWl0dGVkIjsKK3N0YXRp
YyBjb25zdCBjaGFyKiBvdGhlclN0cmluZyA9ICJvdGhlciI7CitzdGF0aWMgY29uc3QgY2hhciog
aWxsZWdhbFN0cmluZyA9ICJpbGxlZ2FsIHZhbHVlIjsKKworc3RhdGljIGludCBuZXh0UGFnZUlE
ID0gMTsKKworLy8gVXNlZCB0byB3cml0ZSBhIHBsYXRmb3JtIG5ldXRyYWwgZmlsZTovLy8gVVJM
IGJ5IG9ubHkgdGFraW5nIHRoZSBmaWxlbmFtZQorLy8gKGUuZy4sIGNvbnZlcnRzICJmaWxlOi8v
L3RtcC9mb28udHh0IiB0byBqdXN0ICJmb28udHh0IikuCitzdGF0aWMgc3RyaW5nIHVybFN1aXRh
YmxlRm9yVGVzdFJlc3VsdChjb25zdCBzdHJpbmcmIHVybCkKK3sKKyAgICBpZiAodXJsLmVtcHR5
KCkgfHwgc3RyaW5nOjpucG9zID09IHVybC5maW5kKCJmaWxlOi8vIikpCisgICAgICAgIHJldHVy
biB1cmw7CisKKyAgICBzaXplX3QgcG9zID0gdXJsLnJmaW5kKCcvJyk7CisgICAgaWYgKHBvcyA9
PSBzdHJpbmc6Om5wb3MpIHsKKyNpZiBPUyhXSU5ET1dTKQorICAgICAgICBwb3MgPSB1cmwucmZp
bmQoJ1xcJyk7CisgICAgICAgIGlmIChwb3MgPT0gc3RyaW5nOjpucG9zKQorICAgICAgICAgICAg
cG9zID0gMDsKKyNlbHNlCisgICAgICAgIHBvcyA9IDA7CisjZW5kaWYKKyAgICB9CisgICAgc3Ry
aW5nIGZpbGVuYW1lID0gdXJsLnN1YnN0cihwb3MgKyAxKTsKKyAgICBpZiAoZmlsZW5hbWUuZW1w
dHkoKSkKKyAgICAgICAgcmV0dXJuICJmaWxlOiI7IC8vIEEgV2ViS2l0IHRlc3QgaGFzIHRoaXMg
aW4gaXRzIGV4cGVjdGVkIG91dHB1dC4KKyAgICByZXR1cm4gZmlsZW5hbWU7Cit9CisKKy8vIFVz
ZWQgdG8gd3JpdGUgYSBwbGF0Zm9ybSBuZXV0cmFsIGZpbGU6Ly8vIFVSTCBieSB0YWtpbmcgdGhl
CisvLyBmaWxlbmFtZSBhbmQgaXRzIGRpcmVjdG9yeS4gKGUuZy4sIGNvbnZlcnRzCisvLyAiZmls
ZTovLy90bXAvZm9vL2Jhci50eHQiIHRvIGp1c3QgImJhci50eHQiKS4KK3N0YXRpYyBzdHJpbmcg
ZGVzY3JpcHRpb25TdWl0YWJsZUZvclRlc3RSZXN1bHQoY29uc3Qgc3RyaW5nJiB1cmwpCit7Cisg
ICAgaWYgKHVybC5lbXB0eSgpIHx8IHN0cmluZzo6bnBvcyA9PSB1cmwuZmluZCgiZmlsZTovLyIp
KQorICAgICAgICByZXR1cm4gdXJsOworCisgICAgc2l6ZV90IHBvcyA9IHVybC5yZmluZCgnLycp
OworICAgIGlmIChwb3MgPT0gc3RyaW5nOjpucG9zIHx8ICFwb3MpCisgICAgICAgIHJldHVybiAi
RVJST1I6IiArIHVybDsKKyAgICBwb3MgPSB1cmwucmZpbmQoJy8nLCBwb3MgLSAxKTsKKyAgICBp
ZiAocG9zID09IHN0cmluZzo6bnBvcykKKyAgICAgICAgcmV0dXJuICJFUlJPUjoiICsgdXJsOwor
CisgICAgcmV0dXJuIHVybC5zdWJzdHIocG9zICsgMSk7Cit9CisKKy8vIEFkZHMgYSBmaWxlIGNh
bGxlZCAiRFJURmFrZUZpbGUiIHRvIHxkYXRhX29iamVjdHwgKENGX0hEUk9QKS4gIFVzZSB0byBm
YWtlCisvLyBkcmFnZ2luZyBhIGZpbGUuCitzdGF0aWMgdm9pZCBhZGREUlRGYWtlRmlsZVRvRGF0
YU9iamVjdChXZWJEcmFnRGF0YSogZHJhZ0RhdGEpCit7CisgICAgZHJhZ0RhdGEtPmFwcGVuZFRv
RmlsZU5hbWVzKFdlYlN0cmluZzo6ZnJvbVVURjgoIkRSVEZha2VGaWxlIikpOworfQorCisvLyBH
ZXQgYSBkZWJ1Z2dpbmcgc3RyaW5nIGZyb20gYSBXZWJOYXZpZ2F0aW9uVHlwZS4KK3N0YXRpYyBj
b25zdCBjaGFyKiB3ZWJOYXZpZ2F0aW9uVHlwZVRvU3RyaW5nKFdlYk5hdmlnYXRpb25UeXBlIHR5
cGUpCit7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBXZWJLaXQ6OldlYk5hdmlnYXRp
b25UeXBlTGlua0NsaWNrZWQ6CisgICAgICAgIHJldHVybiBsaW5rQ2xpY2tlZFN0cmluZzsKKyAg
ICBjYXNlIFdlYktpdDo6V2ViTmF2aWdhdGlvblR5cGVGb3JtU3VibWl0dGVkOgorICAgICAgICBy
ZXR1cm4gZm9ybVN1Ym1pdHRlZFN0cmluZzsKKyAgICBjYXNlIFdlYktpdDo6V2ViTmF2aWdhdGlv
blR5cGVCYWNrRm9yd2FyZDoKKyAgICAgICAgcmV0dXJuIGJhY2tGb3J3YXJkU3RyaW5nOworICAg
IGNhc2UgV2ViS2l0OjpXZWJOYXZpZ2F0aW9uVHlwZVJlbG9hZDoKKyAgICAgICAgcmV0dXJuIHJl
bG9hZFN0cmluZzsKKyAgICBjYXNlIFdlYktpdDo6V2ViTmF2aWdhdGlvblR5cGVGb3JtUmVzdWJt
aXR0ZWQ6CisgICAgICAgIHJldHVybiBmb3JtUmVzdWJtaXR0ZWRTdHJpbmc7CisgICAgY2FzZSBX
ZWJLaXQ6OldlYk5hdmlnYXRpb25UeXBlT3RoZXI6CisgICAgICAgIHJldHVybiBvdGhlclN0cmlu
ZzsKKyAgICB9CisgICAgcmV0dXJuIGlsbGVnYWxTdHJpbmc7Cit9CisKK3N0YXRpYyBzdHJpbmcg
VVJMRGVzY3JpcHRpb24oY29uc3QgR1VSTCYgdXJsKQoreworICAgIGlmICh1cmwuU2NoZW1lSXMo
ImZpbGUiKSkKKyAgICAgICAgcmV0dXJuIHVybC5FeHRyYWN0RmlsZU5hbWUoKTsKKyAgICByZXR1
cm4gdXJsLnBvc3NpYmx5X2ludmFsaWRfc3BlYygpOworfQorCitzdGF0aWMgdm9pZCBwcmludFJl
c3BvbnNlRGVzY3JpcHRpb24oY29uc3QgV2ViVVJMUmVzcG9uc2UmIHJlc3BvbnNlKQoreworICAg
IGlmIChyZXNwb25zZS5pc051bGwoKSkgeworICAgICAgICBmcHV0cygiKG51bGwpIiwgc3Rkb3V0
KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdHJpbmcgdXJsID0gcmVzcG9uc2UudXJs
KCkuc3BlYygpOworICAgIHByaW50ZigiPE5TVVJMUmVzcG9uc2UgJXMsIGh0dHAgc3RhdHVzIGNv
ZGUgJWQ+IiwKKyAgICAgICAgICAgZGVzY3JpcHRpb25TdWl0YWJsZUZvclRlc3RSZXN1bHQodXJs
KS5jX3N0cigpLAorICAgICAgICAgICByZXNwb25zZS5odHRwU3RhdHVzQ29kZSgpKTsKK30KKwor
c3RhdGljIHZvaWQgcHJpbnRFcnJvckRlc2NyaXB0aW9uKGNvbnN0IFdlYlVSTEVycm9yJiBlcnJv
cikKK3sKKyAgICBzdHJpbmcgZG9tYWluID0gZXJyb3IuZG9tYWluLnV0ZjgoKTsKKyAgICBpbnQg
Y29kZSA9IGVycm9yLnJlYXNvbjsKKworICAgIGlmIChkb21haW4gPT0gbmV0OjprRXJyb3JEb21h
aW4pIHsKKyAgICAgICAgZG9tYWluID0gIk5TVVJMRXJyb3JEb21haW4iOworICAgICAgICBzd2l0
Y2ggKGVycm9yLnJlYXNvbikgeworICAgICAgICBjYXNlIG5ldDo6RVJSX0FCT1JURUQ6CisgICAg
ICAgICAgICBjb2RlID0gLTk5OTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIG5l
dDo6RVJSX1VOU0FGRV9QT1JUOgorICAgICAgICAgICAgLy8gT3VyIHVuc2FmZSBwb3J0IGNoZWNr
aW5nIGhhcHBlbnMgYXQgdGhlIG5ldHdvcmsgc3RhY2sgbGV2ZWwsIGJ1dCB3ZQorICAgICAgICAg
ICAgLy8gbWFrZSB0aGlzIHRyYW5zbGF0aW9uIGhlcmUgdG8gbWF0Y2ggdGhlIGJlaGF2aW9yIG9m
IHN0b2NrIFdlYktpdC4KKyAgICAgICAgICAgIGRvbWFpbiA9ICJXZWJLaXRFcnJvckRvbWFpbiI7
CisgICAgICAgICAgICBjb2RlID0gMTAzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNh
c2UgbmV0OjpFUlJfQUREUkVTU19JTlZBTElEOgorICAgICAgICBjYXNlIG5ldDo6RVJSX0FERFJF
U1NfVU5SRUFDSEFCTEU6CisgICAgICAgICAgICBjb2RlID0gLTEwMDQ7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgfQorICAgIH0gZWxzZQorICAgICAgICBMT0dfRVJST1IoIlVua25vd24g
ZXJyb3IgZG9tYWluIik7CisKKyAgICBwcmludGYoIjxOU0Vycm9yIGRvbWFpbiAlcywgY29kZSAl
ZCwgZmFpbGluZyBVUkwgXCIlc1wiPiIsCisgICAgICAgICAgIGRvbWFpbi5jX3N0cigpLCBjb2Rl
LCBlcnJvci51bnJlYWNoYWJsZVVSTC5zcGVjKCkuZGF0YSgpKTsKK30KKworc3RhdGljIHZvaWQg
cHJpbnROb2RlRGVzY3JpcHRpb24oY29uc3QgV2ViTm9kZSYgbm9kZSwgaW50IGV4Y2VwdGlvbikK
K3sKKyAgICBpZiAoZXhjZXB0aW9uKSB7CisgICAgICAgIGZwdXRzKCJFUlJPUiIsIHN0ZG91dCk7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKG5vZGUuaXNOdWxsKCkpIHsKKyAgICAg
ICAgZnB1dHMoIihudWxsKSIsIHN0ZG91dCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAg
ZnB1dHMobm9kZS5ub2RlTmFtZSgpLnV0ZjgoKS5kYXRhKCksIHN0ZG91dCk7CisgICAgY29uc3Qg
V2ViTm9kZSYgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlKCk7CisgICAgaWYgKCFwYXJlbnQuaXNO
dWxsKCkpIHsKKyAgICAgICAgZnB1dHMoIiA+ICIsIHN0ZG91dCk7CisgICAgICAgIHByaW50Tm9k
ZURlc2NyaXB0aW9uKHBhcmVudCwgMCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwcmludFJh
bmdlRGVzY3JpcHRpb24oY29uc3QgV2ViUmFuZ2UmIHJhbmdlKQoreworICAgIGlmIChyYW5nZS5p
c051bGwoKSkgeworICAgICAgICBmcHV0cygiKG51bGwpIiwgc3Rkb3V0KTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKyAgICBwcmludGYoInJhbmdlIGZyb20gJWQgb2YgIiwgcmFuZ2Uuc3RhcnRP
ZmZzZXQoKSk7CisgICAgaW50IGV4Y2VwdGlvbiA9IDA7CisgICAgV2ViTm9kZSBzdGFydE5vZGUg
PSByYW5nZS5zdGFydENvbnRhaW5lcihleGNlcHRpb24pOworICAgIHByaW50Tm9kZURlc2NyaXB0
aW9uKHN0YXJ0Tm9kZSwgZXhjZXB0aW9uKTsKKyAgICBwcmludGYoIiB0byAlZCBvZiAiLCByYW5n
ZS5lbmRPZmZzZXQoKSk7CisgICAgV2ViTm9kZSBlbmROb2RlID0gcmFuZ2Uuc3RhcnRDb250YWlu
ZXIoZXhjZXB0aW9uKTsKKyAgICBwcmludE5vZGVEZXNjcmlwdGlvbihlbmROb2RlLCBleGNlcHRp
b24pOworfQorCitzdGF0aWMgc3RyaW5nIGVkaXRpbmdBY3Rpb25EZXNjcmlwdGlvbihXZWJFZGl0
aW5nQWN0aW9uIGFjdGlvbikKK3sKKyAgICBzd2l0Y2ggKGFjdGlvbikgeworICAgIGNhc2UgV2Vi
S2l0OjpXZWJFZGl0aW5nQWN0aW9uVHlwZWQ6CisgICAgICAgIHJldHVybiAiV2ViVmlld0luc2Vy
dEFjdGlvblR5cGVkIjsKKyAgICBjYXNlIFdlYktpdDo6V2ViRWRpdGluZ0FjdGlvblBhc3RlZDoK
KyAgICAgICAgcmV0dXJuICJXZWJWaWV3SW5zZXJ0QWN0aW9uUGFzdGVkIjsKKyAgICBjYXNlIFdl
YktpdDo6V2ViRWRpdGluZ0FjdGlvbkRyb3BwZWQ6CisgICAgICAgIHJldHVybiAiV2ViVmlld0lu
c2VydEFjdGlvbkRyb3BwZWQiOworICAgIH0KKyAgICByZXR1cm4gIihVTktOT1dOIEFDVElPTiki
OworfQorCitzdGF0aWMgc3RyaW5nIHRleHRBZmZpbml0eURlc2NyaXB0aW9uKFdlYlRleHRBZmZp
bml0eSBhZmZpbml0eSkKK3sKKyAgICBzd2l0Y2ggKGFmZmluaXR5KSB7CisgICAgY2FzZSBXZWJL
aXQ6OldlYlRleHRBZmZpbml0eVVwc3RyZWFtOgorICAgICAgICByZXR1cm4gIk5TU2VsZWN0aW9u
QWZmaW5pdHlVcHN0cmVhbSI7CisgICAgY2FzZSBXZWJLaXQ6OldlYlRleHRBZmZpbml0eURvd25z
dHJlYW06CisgICAgICAgIHJldHVybiAiTlNTZWxlY3Rpb25BZmZpbml0eURvd25zdHJlYW0iOwor
ICAgIH0KKyAgICByZXR1cm4gIihVTktOT1dOIEFGRklOSVRZKSI7Cit9CisKKy8vIFdlYlZpZXdD
bGllbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQorCitXZWJWaWV3KiBXZWJWaWV3SG9zdDo6Y3JlYXRlVmlldyhXZWJGcmFtZSop
Cit7CisgICAgaWYgKCFsYXlvdXRUZXN0Q29udHJvbGxlcigpLT5jYW5PcGVuV2luZG93cygpKQor
ICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gbV9zaGVsbC0+Y3JlYXRlV2ViVmlldygpLT53
ZWJWaWV3KCk7Cit9CisKK1dlYldpZGdldCogV2ViVmlld0hvc3Q6OmNyZWF0ZVBvcHVwTWVudShi
b29sKQoreworICAgIHJldHVybiAwOworfQorCitXZWJXaWRnZXQqIFdlYlZpZXdIb3N0OjpjcmVh
dGVQb3B1cE1lbnUoY29uc3QgV2ViUG9wdXBNZW51SW5mbyYpCit7CisgICAgcmV0dXJuIDA7Cit9
CisKK1dlYlN0b3JhZ2VOYW1lc3BhY2UqIFdlYlZpZXdIb3N0OjpjcmVhdGVTZXNzaW9uU3RvcmFn
ZU5hbWVzcGFjZSgpCit7CisgICAgcmV0dXJuIFdlYktpdDo6V2ViU3RvcmFnZU5hbWVzcGFjZTo6
Y3JlYXRlU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UoKTsKK30KKwordm9pZCBXZWJWaWV3SG9zdDo6
ZGlkQWRkTWVzc2FnZVRvQ29uc29sZShjb25zdCBXZWJDb25zb2xlTWVzc2FnZSYgbWVzc2FnZSwg
Y29uc3QgV2ViU3RyaW5nJiBzb3VyY2VOYW1lLCB1bnNpZ25lZCBzb3VyY2VMaW5lKQoreworICAg
IC8vIFRoaXMgbWF0Y2hlcyB3aW4gRHVtcFJlbmRlclRyZWUncyBVSURlbGVnYXRlLmNwcC4KKyAg
ICBzdHJpbmcgbmV3TWVzc2FnZTsKKyAgICBpZiAoIW1lc3NhZ2UudGV4dC5pc0VtcHR5KCkpIHsK
KyAgICAgICAgbmV3TWVzc2FnZSA9IG1lc3NhZ2UudGV4dC51dGY4KCk7CisgICAgICAgIHNpemVf
dCBmaWxlUHJvdG9jb2wgPSBuZXdNZXNzYWdlLmZpbmQoImZpbGU6Ly8iKTsKKyAgICAgICAgaWYg
KGZpbGVQcm90b2NvbCAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIG5ld01lc3NhZ2Ug
PSBuZXdNZXNzYWdlLnN1YnN0cigwLCBmaWxlUHJvdG9jb2wpCisgICAgICAgICAgICAgICAgKyB1
cmxTdWl0YWJsZUZvclRlc3RSZXN1bHQobmV3TWVzc2FnZS5zdWJzdHIoZmlsZVByb3RvY29sKSk7
CisgICAgICAgIH0KKyAgICB9CisgICAgcHJpbnRmKCJDT05TT0xFIE1FU1NBR0U6IGxpbmUgJWQ6
ICVzXG4iLCBzb3VyY2VMaW5lLCBuZXdNZXNzYWdlLmRhdGEoKSk7Cit9CisKK3ZvaWQgV2ViVmll
d0hvc3Q6OmRpZFN0YXJ0TG9hZGluZygpCit7CisgICAgbV9zaGVsbC0+c2V0SXNMb2FkaW5nKHRy
dWUpOworfQorCit2b2lkIFdlYlZpZXdIb3N0OjpkaWRTdG9wTG9hZGluZygpCit7CisgICAgbV9z
aGVsbC0+c2V0SXNMb2FkaW5nKGZhbHNlKTsKK30KKworLy8gVGhlIG91dHB1dCBmcm9tIHRoZXNl
IG1ldGhvZHMgaW4gbGF5b3V0IHRlc3QgbW9kZSBzaG91bGQgbWF0Y2ggdGhhdAorLy8gZXhwZWN0
ZWQgYnkgdGhlIGxheW91dCB0ZXN0cy4gIFNlZSBFZGl0aW5nRGVsZWdhdGUubSBpbiBEdW1wUmVu
ZGVyVHJlZS4KKworYm9vbCBXZWJWaWV3SG9zdDo6c2hvdWxkQmVnaW5FZGl0aW5nKGNvbnN0IFdl
YlJhbmdlJiByYW5nZSkKK3sKKyAgICBpZiAobGF5b3V0VGVzdENvbnRyb2xsZXIoKS0+c2hvdWxk
RHVtcEVkaXRpbmdDYWxsYmFja3MoKSkgeworICAgICAgICBmcHV0cygiRURJVElORyBERUxFR0FU
RTogc2hvdWxkQmVnaW5FZGl0aW5nSW5ET01SYW5nZToiLCBzdGRvdXQpOworICAgICAgICBwcmlu
dFJhbmdlRGVzY3JpcHRpb24ocmFuZ2UpOworICAgICAgICBmcHV0cygiXG4iLCBzdGRvdXQpOwor
ICAgIH0KKyAgICByZXR1cm4gbGF5b3V0VGVzdENvbnRyb2xsZXIoKS0+YWNjZXB0c0VkaXRpbmco
KTsKK30KKworYm9vbCBXZWJWaWV3SG9zdDo6c2hvdWxkRW5kRWRpdGluZyhjb25zdCBXZWJSYW5n
ZSYgcmFuZ2UpCit7CisgICAgaWYgKGxheW91dFRlc3RDb250cm9sbGVyKCktPnNob3VsZER1bXBF
ZGl0aW5nQ2FsbGJhY2tzKCkpIHsKKyAgICAgICAgZnB1dHMoIkVESVRJTkcgREVMRUdBVEU6IHNo
b3VsZEVuZEVkaXRpbmdJbkRPTVJhbmdlOiIsIHN0ZG91dCk7CisgICAgICAgIHByaW50UmFuZ2VE
ZXNjcmlwdGlvbihyYW5nZSk7CisgICAgICAgIGZwdXRzKCJcbiIsIHN0ZG91dCk7CisgICAgfQor
ICAgIHJldHVybiBsYXlvdXRUZXN0Q29udHJvbGxlcigpLT5hY2NlcHRzRWRpdGluZygpOworfQor
Citib29sIFdlYlZpZXdIb3N0OjpzaG91bGRJbnNlcnROb2RlKGNvbnN0IFdlYk5vZGUmIG5vZGUs
IGNvbnN0IFdlYlJhbmdlJiByYW5nZSwgV2ViRWRpdGluZ0FjdGlvbiBhY3Rpb24pCit7CisgICAg
aWYgKGxheW91dFRlc3RDb250cm9sbGVyKCktPnNob3VsZER1bXBFZGl0aW5nQ2FsbGJhY2tzKCkp
IHsKKyAgICAgICAgZnB1dHMoIkVESVRJTkcgREVMRUdBVEU6IHNob3VsZEluc2VydE5vZGU6Iiwg
c3Rkb3V0KTsKKyAgICAgICAgcHJpbnROb2RlRGVzY3JpcHRpb24obm9kZSwgMCk7CisgICAgICAg
IGZwdXRzKCIgcmVwbGFjaW5nRE9NUmFuZ2U6Iiwgc3Rkb3V0KTsKKyAgICAgICAgcHJpbnRSYW5n
ZURlc2NyaXB0aW9uKHJhbmdlKTsKKyAgICAgICAgcHJpbnRmKCIgZ2l2ZW5BY3Rpb246JXNcbiIs
IGVkaXRpbmdBY3Rpb25EZXNjcmlwdGlvbihhY3Rpb24pLmNfc3RyKCkpOworICAgIH0KKyAgICBy
ZXR1cm4gbGF5b3V0VGVzdENvbnRyb2xsZXIoKS0+YWNjZXB0c0VkaXRpbmcoKTsKK30KKworYm9v
bCBXZWJWaWV3SG9zdDo6c2hvdWxkSW5zZXJ0VGV4dChjb25zdCBXZWJTdHJpbmcmIHRleHQsIGNv
bnN0IFdlYlJhbmdlJiByYW5nZSwgV2ViRWRpdGluZ0FjdGlvbiBhY3Rpb24pCit7CisgICAgaWYg
KGxheW91dFRlc3RDb250cm9sbGVyKCktPnNob3VsZER1bXBFZGl0aW5nQ2FsbGJhY2tzKCkpIHsK
KyAgICAgICAgcHJpbnRmKCJFRElUSU5HIERFTEVHQVRFOiBzaG91bGRJbnNlcnRUZXh0OiVzIHJl
cGxhY2luZ0RPTVJhbmdlOiIsIHRleHQudXRmOCgpLmRhdGEoKSk7CisgICAgICAgIHByaW50UmFu
Z2VEZXNjcmlwdGlvbihyYW5nZSk7CisgICAgICAgIHByaW50ZigiIGdpdmVuQWN0aW9uOiVzXG4i
LCBlZGl0aW5nQWN0aW9uRGVzY3JpcHRpb24oYWN0aW9uKS5jX3N0cigpKTsKKyAgICB9CisgICAg
cmV0dXJuIGxheW91dFRlc3RDb250cm9sbGVyKCktPmFjY2VwdHNFZGl0aW5nKCk7Cit9CisKK2Jv
b2wgV2ViVmlld0hvc3Q6OnNob3VsZENoYW5nZVNlbGVjdGVkUmFuZ2UoCisgICAgY29uc3QgV2Vi
UmFuZ2UmIGZyb21SYW5nZSwgY29uc3QgV2ViUmFuZ2UmIHRvUmFuZ2UsIFdlYlRleHRBZmZpbml0
eSBhZmZpbml0eSwgYm9vbCBzdGlsbFNlbGVjdGluZykKK3sKKyAgICBpZiAobGF5b3V0VGVzdENv
bnRyb2xsZXIoKS0+c2hvdWxkRHVtcEVkaXRpbmdDYWxsYmFja3MoKSkgeworICAgICAgICBmcHV0
cygiRURJVElORyBERUxFR0FURTogc2hvdWxkQ2hhbmdlU2VsZWN0ZWRET01SYW5nZToiLCBzdGRv
dXQpOworICAgICAgICBwcmludFJhbmdlRGVzY3JpcHRpb24oZnJvbVJhbmdlKTsKKyAgICAgICAg
ZnB1dHMoIiB0b0RPTVJhbmdlOiIsIHN0ZG91dCk7CisgICAgICAgIHByaW50UmFuZ2VEZXNjcmlw
dGlvbih0b1JhbmdlKTsKKyAgICAgICAgcHJpbnRmKCIgYWZmaW5pdHk6JXMgc3RpbGxTZWxlY3Rp
bmc6JXNcbiIsCisgICAgICAgICAgICAgICB0ZXh0QWZmaW5pdHlEZXNjcmlwdGlvbihhZmZpbml0
eSkuY19zdHIoKSwKKyAgICAgICAgICAgICAgIChzdGlsbFNlbGVjdGluZyA/ICJUUlVFIiA6ICJG
QUxTRSIpKTsKKyAgICB9CisgICAgcmV0dXJuIGxheW91dFRlc3RDb250cm9sbGVyKCktPmFjY2Vw
dHNFZGl0aW5nKCk7Cit9CisKK2Jvb2wgV2ViVmlld0hvc3Q6OnNob3VsZERlbGV0ZVJhbmdlKGNv
bnN0IFdlYlJhbmdlJiByYW5nZSkKK3sKKyAgICBpZiAobGF5b3V0VGVzdENvbnRyb2xsZXIoKS0+
c2hvdWxkRHVtcEVkaXRpbmdDYWxsYmFja3MoKSkgeworICAgICAgICBmcHV0cygiRURJVElORyBE
RUxFR0FURTogc2hvdWxkRGVsZXRlRE9NUmFuZ2U6Iiwgc3Rkb3V0KTsKKyAgICAgICAgcHJpbnRS
YW5nZURlc2NyaXB0aW9uKHJhbmdlKTsKKyAgICAgICAgZnB1dHMoIlxuIiwgc3Rkb3V0KTsKKyAg
ICB9CisgICAgcmV0dXJuIGxheW91dFRlc3RDb250cm9sbGVyKCktPmFjY2VwdHNFZGl0aW5nKCk7
Cit9CisKK2Jvb2wgV2ViVmlld0hvc3Q6OnNob3VsZEFwcGx5U3R5bGUoY29uc3QgV2ViU3RyaW5n
JiBzdHlsZSwgY29uc3QgV2ViUmFuZ2UmIHJhbmdlKQoreworICAgIGlmIChsYXlvdXRUZXN0Q29u
dHJvbGxlcigpLT5zaG91bGREdW1wRWRpdGluZ0NhbGxiYWNrcygpKSB7CisgICAgICAgIHByaW50
ZigiRURJVElORyBERUxFR0FURTogc2hvdWxkQXBwbHlTdHlsZTolcyB0b0VsZW1lbnRzSW5ET01S
YW5nZToiLCBzdHlsZS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgcHJpbnRSYW5nZURlc2NyaXB0
aW9uKHJhbmdlKTsKKyAgICAgICAgZnB1dHMoIlxuIiwgc3Rkb3V0KTsKKyAgICB9CisgICAgcmV0
dXJuIGxheW91dFRlc3RDb250cm9sbGVyKCktPmFjY2VwdHNFZGl0aW5nKCk7Cit9CisKK2Jvb2wg
V2ViVmlld0hvc3Q6OmlzU21hcnRJbnNlcnREZWxldGVFbmFibGVkKCkKK3sKKyAgICByZXR1cm4g
bV9zbWFydEluc2VydERlbGV0ZUVuYWJsZWQ7Cit9CisKK2Jvb2wgV2ViVmlld0hvc3Q6OmlzU2Vs
ZWN0VHJhaWxpbmdXaGl0ZXNwYWNlRW5hYmxlZCgpCit7CisgICAgcmV0dXJuIG1fc2VsZWN0VHJh
aWxpbmdXaGl0ZXNwYWNlRW5hYmxlZDsKK30KKwordm9pZCBXZWJWaWV3SG9zdDo6ZGlkQmVnaW5F
ZGl0aW5nKCkKK3sKKyAgICBpZiAoIWxheW91dFRlc3RDb250cm9sbGVyKCktPnNob3VsZER1bXBF
ZGl0aW5nQ2FsbGJhY2tzKCkpCisgICAgICAgIHJldHVybjsKKyAgICBmcHV0cygiRURJVElORyBE
RUxFR0FURTogd2ViVmlld0RpZEJlZ2luRWRpdGluZzpXZWJWaWV3RGlkQmVnaW5FZGl0aW5nTm90
aWZpY2F0aW9uXG4iLCBzdGRvdXQpOworfQorCit2b2lkIFdlYlZpZXdIb3N0OjpkaWRDaGFuZ2VT
ZWxlY3Rpb24oYm9vbCBpc0VtcHR5U2VsZWN0aW9uKQoreworICAgIGlmIChsYXlvdXRUZXN0Q29u
dHJvbGxlcigpLT5zaG91bGREdW1wRWRpdGluZ0NhbGxiYWNrcygpKQorICAgICAgICBmcHV0cygi
RURJVElORyBERUxFR0FURTogd2ViVmlld0RpZENoYW5nZVNlbGVjdGlvbjpXZWJWaWV3RGlkQ2hh
bmdlU2VsZWN0aW9uTm90aWZpY2F0aW9uXG4iLCBzdGRvdXQpOworICAgIC8vIE5vIG5lZWQgdG8g
dXBkYXRlIGNsaXBib2FyZCB3aXRoIHRoZSBzZWxlY3RlZCB0ZXh0IGluIERSVC4KK30KKwordm9p
ZCBXZWJWaWV3SG9zdDo6ZGlkQ2hhbmdlQ29udGVudHMoKQoreworICAgIGlmICghbGF5b3V0VGVz
dENvbnRyb2xsZXIoKS0+c2hvdWxkRHVtcEVkaXRpbmdDYWxsYmFja3MoKSkKKyAgICAgICAgcmV0
dXJuOworICAgIGZwdXRzKCJFRElUSU5HIERFTEVHQVRFOiB3ZWJWaWV3RGlkQ2hhbmdlOldlYlZp
ZXdEaWRDaGFuZ2VOb3RpZmljYXRpb25cbiIsIHN0ZG91dCk7Cit9CisKK3ZvaWQgV2ViVmlld0hv
c3Q6OmRpZEVuZEVkaXRpbmcoKQoreworICAgIGlmICghbGF5b3V0VGVzdENvbnRyb2xsZXIoKS0+
c2hvdWxkRHVtcEVkaXRpbmdDYWxsYmFja3MoKSkKKyAgICAgICAgcmV0dXJuOworICAgIGZwdXRz
KCJFRElUSU5HIERFTEVHQVRFOiB3ZWJWaWV3RGlkRW5kRWRpdGluZzpXZWJWaWV3RGlkRW5kRWRp
dGluZ05vdGlmaWNhdGlvblxuIiwgc3Rkb3V0KTsKK30KKworYm9vbCBXZWJWaWV3SG9zdDo6aGFu
ZGxlQ3VycmVudEtleWJvYXJkRXZlbnQoKQoreworICAgIGlmIChtX2VkaXRDb21tYW5kTmFtZS5l
bXB0eSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgV2ViRnJhbWUqIGZyYW1lID0gd2Vi
VmlldygpLT5mb2N1c2VkRnJhbWUoKTsKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICByZXR1cm4gZnJhbWUtPmV4ZWN1dGVDb21tYW5kKFdlYlN0cmluZzo6ZnJv
bVVURjgobV9lZGl0Q29tbWFuZE5hbWUpLCBXZWJTdHJpbmc6OmZyb21VVEY4KG1fZWRpdENvbW1h
bmRWYWx1ZSkpOworfQorCit2b2lkIFdlYlZpZXdIb3N0OjpzcGVsbENoZWNrKGNvbnN0IFdlYlN0
cmluZyYgdGV4dCwgaW50JiBtaXNzcGVsbGVkT2Zmc2V0LCBpbnQmIG1pc3NwZWxsZWRMZW5ndGgp
Cit7CisjaWYgT1MoTUFDX09TX1gpCisgICAgLy8gRklYTUU6IFBvcnQgbW9ja19zcGVsbGNrLntj
YyxofQorI2VuZGlmCit9CisKK1dlYlN0cmluZyBXZWJWaWV3SG9zdDo6YXV0b0NvcnJlY3RXb3Jk
KGNvbnN0IFdlYlN0cmluZyYpCit7CisgICAgLy8gUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgYXMg
TWFjIFdlYktpdCAoJ1dlYktpdFN1cHBvcnQvV2ViRWRpdG9yQ2xpZW50Lm1tJykKKyAgICAvLyBk
b2VzLiAoSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbm9uLWVtcHR5IHN0cmluZywgV2ViS2l0
IHJlcGxhY2VzIHRoZQorICAgIC8vIGdpdmVuIG1pc3NwZWxsZWQgc3RyaW5nIHdpdGggdGhlIHJl
c3VsdCBvbmUuIFRoaXMgcHJvY2VzcyBleGVjdXRlcyBzb21lCisgICAgLy8gZWRpdG9yIGNvbW1h
bmRzIGFuZCBjYXVzZXMgbGF5b3V0LXRlc3QgZmFpbHVyZXMuKQorICAgIHJldHVybiBXZWJTdHJp
bmcoKTsKK30KKwordm9pZCBXZWJWaWV3SG9zdDo6cnVuTW9kYWxBbGVydERpYWxvZyhXZWJGcmFt
ZSosIGNvbnN0IFdlYlN0cmluZyYgbWVzc2FnZSkKK3sKKyAgICBwcmludGYoIkFMRVJUOiAlc1xu
IiwgbWVzc2FnZS51dGY4KCkuZGF0YSgpKTsKK30KKworYm9vbCBXZWJWaWV3SG9zdDo6cnVuTW9k
YWxDb25maXJtRGlhbG9nKFdlYkZyYW1lKiwgY29uc3QgV2ViU3RyaW5nJiBtZXNzYWdlKQorewor
ICAgIHByaW50ZigiQ09ORklSTTogJXNcbiIsIG1lc3NhZ2UudXRmOCgpLmRhdGEoKSk7CisgICAg
cmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgV2ViVmlld0hvc3Q6OnJ1bk1vZGFsUHJvbXB0RGlhbG9n
KFdlYkZyYW1lKiBmcmFtZSwgY29uc3QgV2ViU3RyaW5nJiBtZXNzYWdlLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViU3RyaW5nJiBkZWZhdWx0VmFsdWUs
IFdlYlN0cmluZyopCit7CisgICAgcHJpbnRmKCJQUk9NUFQ6ICVzLCBkZWZhdWx0IHRleHQ6ICVz
XG4iLCBtZXNzYWdlLnV0ZjgoKS5kYXRhKCksIGRlZmF1bHRWYWx1ZS51dGY4KCkuZGF0YSgpKTsK
KyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBXZWJWaWV3SG9zdDo6cnVuTW9kYWxCZWZvcmVV
bmxvYWREaWFsb2coV2ViRnJhbWUqLCBjb25zdCBXZWJTdHJpbmcmKQoreworICAgIHJldHVybiB0
cnVlOyAvLyBBbGxvdyB3aW5kb3cgY2xvc3VyZS4KK30KKwordm9pZCBXZWJWaWV3SG9zdDo6c2hv
d0NvbnRleHRNZW51KFdlYkZyYW1lKiwgY29uc3QgV2ViQ29udGV4dE1lbnVEYXRhJikKK3sKK30K
KworCit2b2lkIFdlYlZpZXdIb3N0OjpzZXRTdGF0dXNUZXh0KGNvbnN0IFdlYlN0cmluZyYgdGV4
dCkKK3sKKyAgICBpZiAoIWxheW91dFRlc3RDb250cm9sbGVyKCktPnNob3VsZER1bXBTdGF0dXND
YWxsYmFja3MoKSkKKyAgICAgICAgcmV0dXJuOworICAgIC8vIFdoZW4gcnVubmluZyB0ZXN0cywg
d3JpdGUgdG8gc3Rkb3V0LgorICAgIHByaW50ZigiVUkgREVMRUdBVEUgU1RBVFVTIENBTExCQUNL
OiBzZXRTdGF0dXNUZXh0OiVzXG4iLCB0ZXh0LnV0ZjgoKS5kYXRhKCkpOworfQorCit2b2lkIFdl
YlZpZXdIb3N0OjpzdGFydERyYWdnaW5nKGNvbnN0IFdlYlBvaW50JiBtb3VzZUNvb3JkcywgY29u
c3QgV2ViRHJhZ0RhdGEmIGRhdGEsIFdlYkRyYWdPcGVyYXRpb25zTWFzayBtYXNrKQoreworICAg
IFdlYkRyYWdEYXRhIG11dGFibGVEcmFnRGF0YSA9IGRhdGE7CisgICAgaWYgKGxheW91dFRlc3RD
b250cm9sbGVyKCktPnNob3VsZEFkZEZpbGVUb1Bhc3RlYm9hcmQoKSkgeworICAgICAgICAvLyBB
ZGQgYSBmaWxlIGNhbGxlZCBEUlRGYWtlRmlsZSB0byB0aGUgZHJhZyZkcm9wIGNsaXBib2FyZC4K
KyAgICAgICAgYWRkRFJURmFrZUZpbGVUb0RhdGFPYmplY3QoJm11dGFibGVEcmFnRGF0YSk7Cisg
ICAgfQorCisgICAgLy8gV2hlbiBydW5uaW5nIGEgdGVzdCwgd2UgbmVlZCB0byBmYWtlIGEgZHJh
ZyBkcm9wIG9wZXJhdGlvbiBvdGhlcndpc2UKKyAgICAvLyBXaW5kb3dzIHdhaXRzIGZvciByZWFs
IG1vdXNlIGV2ZW50cyB0byBrbm93IHdoZW4gdGhlIGRyYWcgaXMgb3Zlci4KKyAgICBFdmVudFNl
bmRlcjo6ZG9EcmFnRHJvcChtb3VzZUNvb3JkcywgbXV0YWJsZURyYWdEYXRhLCBtYXNrKTsKK30K
Kwordm9pZCBXZWJWaWV3SG9zdDo6bmF2aWdhdGVCYWNrRm9yd2FyZFNvb24oaW50IG9mZnNldCkK
K3sKKyAgICBuYXZpZ2F0aW9uQ29udHJvbGxlcigpLT5nb1RvT2Zmc2V0KG9mZnNldCk7Cit9CisK
K2ludCBXZWJWaWV3SG9zdDo6aGlzdG9yeUJhY2tMaXN0Q291bnQoKQoreworICAgIHJldHVybiBu
YXZpZ2F0aW9uQ29udHJvbGxlcigpLT5sYXN0Q29tbWl0dGVkRW50cnlJbmRleCgpOworfQorCitp
bnQgV2ViVmlld0hvc3Q6Omhpc3RvcnlGb3J3YXJkTGlzdENvdW50KCkKK3sKKyAgICBpbnQgY3Vy
cmVudEluZGV4ID1uYXZpZ2F0aW9uQ29udHJvbGxlcigpLT5sYXN0Q29tbWl0dGVkRW50cnlJbmRl
eCgpOworICAgIHJldHVybiBuYXZpZ2F0aW9uQ29udHJvbGxlcigpLT5lbnRyeUNvdW50KCkgLSBj
dXJyZW50SW5kZXggLSAxOworfQorCit2b2lkIFdlYlZpZXdIb3N0Ojpmb2N1c0FjY2Vzc2liaWxp
dHlPYmplY3QoY29uc3QgV2ViQWNjZXNzaWJpbGl0eU9iamVjdCYgb2JqZWN0KQoreworICAgIG1f
c2hlbGwtPmFjY2Vzc2liaWxpdHlDb250cm9sbGVyKCktPnNldEZvY3VzZWRFbGVtZW50KG9iamVj
dCk7Cit9CisKKy8vIFdlYldpZGdldENsaWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFdlYlZpZXdIb3N0OjpkaWRJ
bnZhbGlkYXRlUmVjdChjb25zdCBXZWJSZWN0JiByZWN0KQoreworICAgIGlmIChtX2lzUGFpbnRp
bmcpCisgICAgICAgIExPR19FUlJPUigidW5leHBlY3RlZCBpbnZhbGlkYXRpb24gd2hpbGUgcGFp
bnRpbmciKTsKKyAgICB1cGRhdGVQYWludFJlY3QocmVjdCk7Cit9CisKK3ZvaWQgV2ViVmlld0hv
c3Q6OmRpZFNjcm9sbFJlY3QoaW50LCBpbnQsIGNvbnN0IFdlYlJlY3QmIGNsaXBSZWN0KQorewor
ICAgIC8vIFRoaXMgaXMgdXNlZCBmb3Igb3B0aW1pemluZyBwYWludGluZyB3aGVuIHRoZSByZW5k
ZXJlciBpcyBzY3JvbGxlZC4gV2UncmUKKyAgICAvLyBjdXJyZW50bHkgbm90IGRvaW5nIGFueSBv
cHRpbWl6YXRpb25zIHNvIGp1c3QgaW52YWxpZGF0ZSB0aGUgcmVnaW9uLgorICAgIGRpZEludmFs
aWRhdGVSZWN0KGNsaXBSZWN0KTsKK30KKwordm9pZCBXZWJWaWV3SG9zdDo6ZGlkRm9jdXMoKQor
eworICAgIG1fc2hlbGwtPnNldEZvY3VzKHdlYldpZGdldCgpLCB0cnVlKTsKK30KKwordm9pZCBX
ZWJWaWV3SG9zdDo6ZGlkQmx1cigpCit7CisgICAgbV9zaGVsbC0+c2V0Rm9jdXMod2ViV2lkZ2V0
KCksIGZhbHNlKTsKK30KKworV2ViU2NyZWVuSW5mbyBXZWJWaWV3SG9zdDo6c2NyZWVuSW5mbygp
Cit7CisgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBzZXQgYWN0dWFsIHZhbHVlcy4KKyAgICBXZWJT
Y3JlZW5JbmZvIGluZm87CisgICAgaW5mby5kZXB0aCA9IDI0OworICAgIGluZm8uZGVwdGhQZXJD
b21wb25lbnQgPSA4OworICAgIGluZm8uaXNNb25vY2hyb21lID0gZmFsc2U7CisgICAgaW5mby5y
ZWN0ID0gV2ViUmVjdCgwLCAwLCBzY3JlZW5XaWR0aCwgc2NyZWVuSGVpZ2h0KTsKKyAgICAvLyBV
c2UgdmFsdWVzIGRpZmZlcmVudCBmcm9tIGluZm8ucmVjdCBmb3IgdGVzdGluZy4KKyAgICBpbmZv
LmF2YWlsYWJsZVJlY3QgPSBXZWJSZWN0KHNjcmVlblVuYXZhaWxhYmxlQm9yZGVyLCBzY3JlZW5V
bmF2YWlsYWJsZUJvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmVl
bldpZHRoIC0gc2NyZWVuVW5hdmFpbGFibGVCb3JkZXIgKiAyLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgc2NyZWVuSGVpZ2h0IC0gc2NyZWVuVW5hdmFpbGFibGVCb3JkZXIgKiAy
KTsKKyAgICByZXR1cm4gaW5mbzsKK30KKwordm9pZCBXZWJWaWV3SG9zdDo6c2hvdyhXZWJOYXZp
Z2F0aW9uUG9saWN5KQoreworICAgIG1faGFzV2luZG93ID0gdHJ1ZTsKKyAgICBXZWJTaXplIHNp
emUgPSB3ZWJXaWRnZXQoKS0+c2l6ZSgpOworICAgIHVwZGF0ZVBhaW50UmVjdChXZWJSZWN0KDAs
IDAsIHNpemUud2lkdGgsIHNpemUuaGVpZ2h0KSk7Cit9CisKK3ZvaWQgV2ViVmlld0hvc3Q6OmNs
b3NlV2lkZ2V0U29vbigpCit7CisgICAgbV9oYXNXaW5kb3cgPSBmYWxzZTsKKyAgICBtX3NoZWxs
LT5jbG9zZVdpbmRvdyh0aGlzKTsKK30KKwordm9pZCBXZWJWaWV3SG9zdDo6ZGlkQ2hhbmdlQ3Vy
c29yKGNvbnN0IFdlYkN1cnNvckluZm8mIGN1cnNvckluZm8pCit7CisgICAgaWYgKCFoYXNXaW5k
b3coKSkKKyAgICAgICAgcmV0dXJuOworICAgIG1fY3VycmVudEN1cnNvciA9IGN1cnNvckluZm87
Cit9CisKK1dlYlJlY3QgV2ViVmlld0hvc3Q6OndpbmRvd1JlY3QoKQoreworICAgIHJldHVybiBt
X3dpbmRvd1JlY3Q7Cit9CisKK3ZvaWQgV2ViVmlld0hvc3Q6OnNldFdpbmRvd1JlY3QoY29uc3Qg
V2ViUmVjdCYgcmVjdCkKK3sKKyAgICBtX3dpbmRvd1JlY3QgPSByZWN0OworICAgIGNvbnN0IGlu
dCBib3JkZXIyID0gVGVzdFNoZWxsOjp2aXJ0dWFsV2luZG93Qm9yZGVyICogMjsKKyAgICBpZiAo
bV93aW5kb3dSZWN0LndpZHRoIDw9IGJvcmRlcjIpCisgICAgICAgIG1fd2luZG93UmVjdC53aWR0
aCA9IDEgKyBib3JkZXIyOworICAgIGlmIChtX3dpbmRvd1JlY3QuaGVpZ2h0IDw9IGJvcmRlcjIp
CisgICAgICAgIG1fd2luZG93UmVjdC5oZWlnaHQgPSAxICsgYm9yZGVyMjsKKyAgICBpbnQgd2lk
dGggPSBtX3dpbmRvd1JlY3Qud2lkdGggLSBib3JkZXIyOworICAgIGludCBoZWlnaHQgPSBtX3dp
bmRvd1JlY3QuaGVpZ2h0IC0gYm9yZGVyMjsKKyAgICBkaXNjYXJkQmFja2luZ1N0b3JlKCk7Cisg
ICAgd2ViV2lkZ2V0KCktPnJlc2l6ZShXZWJTaXplKHdpZHRoLCBoZWlnaHQpKTsKKyAgICB1cGRh
dGVQYWludFJlY3QoV2ViUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KSk7Cit9CisKK1dlYlJlY3Qg
V2ViVmlld0hvc3Q6OnJvb3RXaW5kb3dSZWN0KCkKK3sKKyAgICByZXR1cm4gd2luZG93UmVjdCgp
OworfQorCitXZWJSZWN0IFdlYlZpZXdIb3N0Ojp3aW5kb3dSZXNpemVyUmVjdCgpCit7CisgICAg
Ly8gTm90IG5lY2Vzc2FyeS4KKyAgICByZXR1cm4gV2ViUmVjdCgpOworfQorCit2b2lkIFdlYlZp
ZXdIb3N0OjpydW5Nb2RhbCgpCit7CisgICAgLy8gRklYTUU6IFNob3VsZCB3ZSBpbXBsZW1lbnQg
dGhpcyBpbiBEUlQ/Cit9CisKKy8vIFdlYkZyYW1lQ2xpZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXZWJQbHVnaW4qIFdl
YlZpZXdIb3N0OjpjcmVhdGVQbHVnaW4oV2ViRnJhbWUqIGZyYW1lLCBjb25zdCBXZWJQbHVnaW5Q
YXJhbXMmIHBhcmFtcykKK3sKKyAgICByZXR1cm4gd2Via2l0X3N1cHBvcnQ6OkNyZWF0ZVdlYlBs
dWdpbihmcmFtZSwgcGFyYW1zKTsKK30KKworV2ViV29ya2VyKiBXZWJWaWV3SG9zdDo6Y3JlYXRl
V29ya2VyKFdlYkZyYW1lKiwgV2ViV29ya2VyQ2xpZW50KikKK3sKKyAgICByZXR1cm4gbmV3IFRl
c3RXZWJXb3JrZXIoKTsKK30KKworV2ViTWVkaWFQbGF5ZXIqIFdlYlZpZXdIb3N0OjpjcmVhdGVN
ZWRpYVBsYXllcihXZWJGcmFtZSogZnJhbWUsIFdlYk1lZGlhUGxheWVyQ2xpZW50KiBjbGllbnQp
Cit7CisgICAgcmV0dXJuIHdlYmtpdF9zdXBwb3J0OjpDcmVhdGVNZWRpYVBsYXllcihmcmFtZSwg
Y2xpZW50KTsKK30KKworYm9vbCBXZWJWaWV3SG9zdDo6YWxsb3dQbHVnaW5zKFdlYkZyYW1lKiBm
cmFtZSwgYm9vbCBlbmFibGVkUGVyU2V0dGluZ3MpCit7CisgICAgcmV0dXJuIGVuYWJsZWRQZXJT
ZXR0aW5nczsKK30KKworYm9vbCBXZWJWaWV3SG9zdDo6YWxsb3dJbWFnZXMoV2ViRnJhbWUqIGZy
YW1lLCBib29sIGVuYWJsZWRQZXJTZXR0aW5ncykKK3sKKyAgICByZXR1cm4gZW5hYmxlZFBlclNl
dHRpbmdzOworfQorCit2b2lkIFdlYlZpZXdIb3N0Ojpsb2FkVVJMRXh0ZXJuYWxseShXZWJGcmFt
ZSosIGNvbnN0IFdlYlVSTFJlcXVlc3QmIHJlcXVlc3QsIFdlYk5hdmlnYXRpb25Qb2xpY3kgcG9s
aWN5KQoreworICAgIEFTU0VSVChwb2xpY3kgIT0gIFdlYktpdDo6V2ViTmF2aWdhdGlvblBvbGlj
eUN1cnJlbnRUYWIpOworICAgIFdlYlZpZXdIb3N0KiBhbm90aGVyID0gbV9zaGVsbC0+Y3JlYXRl
TmV3V2luZG93KHJlcXVlc3QudXJsKCkpOworICAgIGlmIChhbm90aGVyKQorICAgICAgICBhbm90
aGVyLT5zaG93KHBvbGljeSk7Cit9CisKK1dlYk5hdmlnYXRpb25Qb2xpY3kgV2ViVmlld0hvc3Q6
OmRlY2lkZVBvbGljeUZvck5hdmlnYXRpb24oCisgICAgV2ViRnJhbWUqLCBjb25zdCBXZWJVUkxS
ZXF1ZXN0JiByZXF1ZXN0LAorICAgIFdlYk5hdmlnYXRpb25UeXBlIHR5cGUsIGNvbnN0IFdlYk5v
ZGUmIG9yaWdpbmF0aW5nTm9kZSwKKyAgICBXZWJOYXZpZ2F0aW9uUG9saWN5IGRlZmF1bHRQb2xp
Y3ksIGJvb2wgaXNSZWRpcmVjdCkKK3sKKyAgICBXZWJOYXZpZ2F0aW9uUG9saWN5IHJlc3VsdDsK
KyAgICBpZiAoIW1fcG9saWN5RGVsZWdhdGVFbmFibGVkKQorICAgICAgICByZXR1cm4gZGVmYXVs
dFBvbGljeTsKKworICAgIHByaW50ZigiUG9saWN5IGRlbGVnYXRlOiBhdHRlbXB0IHRvIGxvYWQg
JXMgd2l0aCBuYXZpZ2F0aW9uIHR5cGUgJyVzJyIsCisgICAgICAgICAgIFVSTERlc2NyaXB0aW9u
KHJlcXVlc3QudXJsKCkpLmNfc3RyKCksIHdlYk5hdmlnYXRpb25UeXBlVG9TdHJpbmcodHlwZSkp
OworICAgIGlmICghb3JpZ2luYXRpbmdOb2RlLmlzTnVsbCgpKSB7CisgICAgICAgIGZwdXRzKCIg
b3JpZ2luYXRpbmcgZnJvbSAiLCBzdGRvdXQpOworICAgICAgICBwcmludE5vZGVEZXNjcmlwdGlv
bihvcmlnaW5hdGluZ05vZGUsIDApOworICAgIH0KKyAgICBmcHV0cygiXG4iLCBzdGRvdXQpOwor
ICAgIGlmIChtX3BvbGljeURlbGVnYXRlSXNQZXJtaXNzaXZlKQorICAgICAgICByZXN1bHQgPSBX
ZWJLaXQ6OldlYk5hdmlnYXRpb25Qb2xpY3lDdXJyZW50VGFiOworICAgIGVsc2UKKyAgICAgICAg
cmVzdWx0ID0gV2ViS2l0OjpXZWJOYXZpZ2F0aW9uUG9saWN5SWdub3JlOworCisgICAgaWYgKG1f
cG9saWN5RGVsZWdhdGVTaG91bGROb3RpZnlEb25lKQorICAgICAgICBsYXlvdXRUZXN0Q29udHJv
bGxlcigpLT5wb2xpY3lEZWxlZ2F0ZURvbmUoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCiti
b29sIFdlYlZpZXdIb3N0OjpjYW5IYW5kbGVSZXF1ZXN0KFdlYkZyYW1lKiwgY29uc3QgV2ViVVJM
UmVxdWVzdCYgcmVxdWVzdCkKK3sKKyAgICBHVVJMIHVybCA9IHJlcXVlc3QudXJsKCk7CisgICAg
Ly8gSnVzdCByZWplY3QgdGhlIHNjaGVtZSB1c2VkIGluCisgICAgLy8gTGF5b3V0VGVzdHMvaHR0
cC90ZXN0cy9taXNjL3JlZGlyZWN0LXRvLWV4dGVybmFsLXVybC5odG1sCisgICAgcmV0dXJuICF1
cmwuU2NoZW1lSXMoInNwYWNlYmFsbHMiKTsKK30KKworV2ViVVJMRXJyb3IgV2ViVmlld0hvc3Q6
OmNhbm5vdEhhbmRsZVJlcXVlc3RFcnJvcihXZWJGcmFtZSosIGNvbnN0IFdlYlVSTFJlcXVlc3Qm
IHJlcXVlc3QpCit7CisgICAgV2ViVVJMRXJyb3IgZXJyb3I7CisgICAgLy8gQSBXZWJLaXQgbGF5
b3V0IHRlc3QgZXhwZWN0cyB0aGUgZm9sbG93aW5nIHZhbHVlcy4KKyAgICAvLyB1bmFibGVUb0lt
cGxlbWVudFBvbGljeVdpdGhFcnJvcigpIGJlbG93IHByaW50cyB0aGVtLgorICAgIGVycm9yLmRv
bWFpbiA9IFdlYlN0cmluZzo6ZnJvbVVURjgoIldlYktpdEVycm9yRG9tYWluIik7CisgICAgZXJy
b3IucmVhc29uID0gMTAxOworICAgIGVycm9yLnVucmVhY2hhYmxlVVJMID0gcmVxdWVzdC51cmwo
KTsKKyAgICByZXR1cm4gZXJyb3I7Cit9CisKK1dlYlVSTEVycm9yIFdlYlZpZXdIb3N0OjpjYW5j
ZWxsZWRFcnJvcihXZWJGcmFtZSosIGNvbnN0IFdlYlVSTFJlcXVlc3QmIHJlcXVlc3QpCit7Cisg
ICAgV2ViVVJMRXJyb3IgZXJyb3I7CisgICAgZXJyb3IuZG9tYWluID0gV2ViU3RyaW5nOjpmcm9t
VVRGOChuZXQ6OmtFcnJvckRvbWFpbik7CisgICAgZXJyb3IucmVhc29uID0gbmV0OjpFUlJfQUJP
UlRFRDsKKyAgICBlcnJvci51bnJlYWNoYWJsZVVSTCA9IHJlcXVlc3QudXJsKCk7CisgICAgcmV0
dXJuIGVycm9yOworfQorCit2b2lkIFdlYlZpZXdIb3N0Ojp1bmFibGVUb0ltcGxlbWVudFBvbGlj
eVdpdGhFcnJvcihXZWJGcmFtZSogZnJhbWUsIGNvbnN0IFdlYlVSTEVycm9yJiBlcnJvcikKK3sK
KyAgICBwcmludGYoIlBvbGljeSBkZWxlZ2F0ZTogdW5hYmxlIHRvIGltcGxlbWVudCBwb2xpY3kg
d2l0aCBlcnJvciBkb21haW4gJyVzJywgIgorICAgICAgICAgICAiZXJyb3IgY29kZSAlZCwgaW4g
ZnJhbWUgJyVzJ1xuIiwKKyAgICAgICAgICAgZXJyb3IuZG9tYWluLnV0ZjgoKS5kYXRhKCksIGVy
cm9yLnJlYXNvbiwgZnJhbWUtPm5hbWUoKS51dGY4KCkuZGF0YSgpKTsKK30KKwordm9pZCBXZWJW
aWV3SG9zdDo6d2lsbFBlcmZvcm1DbGllbnRSZWRpcmVjdChXZWJGcmFtZSogZnJhbWUsIGNvbnN0
IFdlYlVSTCYgZnJvbSwgY29uc3QgV2ViVVJMJiB0bywKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGludGVydmFsLCBkb3VibGUgZmlyZV90aW1lKQor
eworICAgIGlmICghbV9zaGVsbC0+c2hvdWxkRHVtcEZyYW1lTG9hZENhbGxiYWNrcygpKQorICAg
ICAgICByZXR1cm47CisgICAgcHJpbnRGcmFtZURlc2NyaXB0aW9uKGZyYW1lKTsKKyAgICBwcmlu
dGYoIiAtIHdpbGxQZXJmb3JtQ2xpZW50UmVkaXJlY3RUb1VSTDogJXMgXG4iLCB0by5zcGVjKCku
ZGF0YSgpKTsKK30KKwordm9pZCBXZWJWaWV3SG9zdDo6ZGlkQ2FuY2VsQ2xpZW50UmVkaXJlY3Qo
V2ViRnJhbWUqIGZyYW1lKQoreworICAgIGlmICghbV9zaGVsbC0+c2hvdWxkRHVtcEZyYW1lTG9h
ZENhbGxiYWNrcygpKQorICAgICAgICByZXR1cm47CisgICAgcHJpbnRGcmFtZURlc2NyaXB0aW9u
KGZyYW1lKTsKKyAgICBmcHV0cygiIC0gZGlkQ2FuY2VsQ2xpZW50UmVkaXJlY3RGb3JGcmFtZVxu
Iiwgc3Rkb3V0KTsKK30KKwordm9pZCBXZWJWaWV3SG9zdDo6ZGlkQ3JlYXRlRGF0YVNvdXJjZShX
ZWJGcmFtZSosIFdlYkRhdGFTb3VyY2UqIGRzKQoreworICAgIGRzLT5zZXRFeHRyYURhdGEobV9w
ZW5kaW5nRXh0cmFEYXRhLnJlbGVhc2UoKSk7Cit9CisKK3ZvaWQgV2ViVmlld0hvc3Q6OmRpZFN0
YXJ0UHJvdmlzaW9uYWxMb2FkKFdlYkZyYW1lKiBmcmFtZSkKK3sKKyAgICBpZiAobV9zaGVsbC0+
c2hvdWxkRHVtcEZyYW1lTG9hZENhbGxiYWNrcygpKSB7CisgICAgICAgIHByaW50RnJhbWVEZXNj
cmlwdGlvbihmcmFtZSk7CisgICAgICAgIGZwdXRzKCIgLSBkaWRTdGFydFByb3Zpc2lvbmFsTG9h
ZEZvckZyYW1lXG4iLCBzdGRvdXQpOworICAgIH0KKworICAgIGlmICghbV90b3BMb2FkaW5nRnJh
bWUpCisgICAgICAgIG1fdG9wTG9hZGluZ0ZyYW1lID0gZnJhbWU7CisKKyAgICBpZiAobGF5b3V0
VGVzdENvbnRyb2xsZXIoKS0+c3RvcFByb3Zpc2lvbmFsRnJhbWVMb2FkcygpKSB7CisgICAgICAg
IHByaW50RnJhbWVEZXNjcmlwdGlvbihmcmFtZSk7CisgICAgICAgIGZwdXRzKCIgLSBzdG9wcGlu
ZyBsb2FkIGluIGRpZFN0YXJ0UHJvdmlzaW9uYWxMb2FkRm9yRnJhbWUgY2FsbGJhY2tcbiIsIHN0
ZG91dCk7CisgICAgICAgIGZyYW1lLT5zdG9wTG9hZGluZygpOworICAgIH0KKyAgICB1cGRhdGVB
ZGRyZXNzQmFyKGZyYW1lLT52aWV3KCkpOworfQorCit2b2lkIFdlYlZpZXdIb3N0OjpkaWRSZWNl
aXZlU2VydmVyUmVkaXJlY3RGb3JQcm92aXNpb25hbExvYWQoV2ViRnJhbWUqIGZyYW1lKQorewor
ICAgIGlmIChtX3NoZWxsLT5zaG91bGREdW1wRnJhbWVMb2FkQ2FsbGJhY2tzKCkpIHsKKyAgICAg
ICAgcHJpbnRGcmFtZURlc2NyaXB0aW9uKGZyYW1lKTsKKyAgICAgICAgZnB1dHMoIiAtIGRpZFJl
Y2VpdmVTZXJ2ZXJSZWRpcmVjdEZvclByb3Zpc2lvbmFsTG9hZEZvckZyYW1lXG4iLCBzdGRvdXQp
OworICAgIH0KKyAgICB1cGRhdGVBZGRyZXNzQmFyKGZyYW1lLT52aWV3KCkpOworfQorCit2b2lk
IFdlYlZpZXdIb3N0OjpkaWRGYWlsUHJvdmlzaW9uYWxMb2FkKFdlYkZyYW1lKiBmcmFtZSwgY29u
c3QgV2ViVVJMRXJyb3ImIGVycm9yKQoreworICAgIGlmIChtX3NoZWxsLT5zaG91bGREdW1wRnJh
bWVMb2FkQ2FsbGJhY2tzKCkpIHsKKyAgICAgICAgcHJpbnRGcmFtZURlc2NyaXB0aW9uKGZyYW1l
KTsKKyAgICAgICAgZnB1dHMoIiAtIGRpZEZhaWxQcm92aXNpb25hbExvYWRXaXRoRXJyb3JcbiIs
IHN0ZG91dCk7CisgICAgfQorCisgICAgbG9jYXRpb25DaGFuZ2VEb25lKGZyYW1lKTsKKworICAg
IC8vIERvbid0IGRpc3BsYXkgYW4gZXJyb3IgcGFnZSBpZiB3ZSdyZSBydW5uaW5nIGxheW91dCB0
ZXN0cywgYmVjYXVzZQorICAgIC8vIER1bXBSZW5kZXJUcmVlIGRvZXNuJ3QuCit9CisKK3ZvaWQg
V2ViVmlld0hvc3Q6OmRpZENvbW1pdFByb3Zpc2lvbmFsTG9hZChXZWJGcmFtZSogZnJhbWUsIGJv
b2wgaXNOZXdOYXZpZ2F0aW9uKQoreworICAgIGlmIChtX3NoZWxsLT5zaG91bGREdW1wRnJhbWVM
b2FkQ2FsbGJhY2tzKCkpIHsKKyAgICAgICAgcHJpbnRGcmFtZURlc2NyaXB0aW9uKGZyYW1lKTsK
KyAgICAgICAgZnB1dHMoIiAtIGRpZENvbW1pdExvYWRGb3JGcmFtZVxuIiwgc3Rkb3V0KTsKKyAg
ICB9CisgICAgdXBkYXRlRm9yQ29tbWl0dGVkTG9hZChmcmFtZSwgaXNOZXdOYXZpZ2F0aW9uKTsK
K30KKwordm9pZCBXZWJWaWV3SG9zdDo6ZGlkQ2xlYXJXaW5kb3dPYmplY3QoV2ViRnJhbWUqIGZy
YW1lKQoreworICAgIG1fc2hlbGwtPmJpbmRKU09iamVjdHNUb1dpbmRvdyhmcmFtZSk7Cit9CisK
K3ZvaWQgV2ViVmlld0hvc3Q6OmRpZFJlY2VpdmVUaXRsZShXZWJGcmFtZSogZnJhbWUsIGNvbnN0
IFdlYlN0cmluZyYgdGl0bGUpCit7CisgICAgV2ViQ1N0cmluZyB0aXRsZTggPSB0aXRsZS51dGY4
KCk7CisKKyAgICBpZiAobV9zaGVsbC0+c2hvdWxkRHVtcEZyYW1lTG9hZENhbGxiYWNrcygpKSB7
CisgICAgICAgIHByaW50RnJhbWVEZXNjcmlwdGlvbihmcmFtZSk7CisgICAgICAgIHByaW50Zigi
IC0gZGlkUmVjZWl2ZVRpdGxlOiAlc1xuIiwgdGl0bGU4LmRhdGEoKSk7CisgICAgfQorCisgICAg
aWYgKGxheW91dFRlc3RDb250cm9sbGVyKCktPnNob3VsZER1bXBUaXRsZUNoYW5nZXMoKSkKKyAg
ICAgICAgcHJpbnRmKCJUSVRMRSBDSEFOR0VEOiAlc1xuIiwgdGl0bGU4LmRhdGEoKSk7CisKKyAg
ICBzZXRQYWdlVGl0bGUodGl0bGUpOworfQorCit2b2lkIFdlYlZpZXdIb3N0OjpkaWRGaW5pc2hE
b2N1bWVudExvYWQoV2ViRnJhbWUqIGZyYW1lKQoreworICAgIGlmIChtX3NoZWxsLT5zaG91bGRE
dW1wRnJhbWVMb2FkQ2FsbGJhY2tzKCkpIHsKKyAgICAgICAgcHJpbnRGcmFtZURlc2NyaXB0aW9u
KGZyYW1lKTsKKyAgICAgICAgZnB1dHMoIiAtIGRpZEZpbmlzaERvY3VtZW50TG9hZEZvckZyYW1l
XG4iLCBzdGRvdXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHVuc2lnbmVkIHBlbmRpbmdVbmxv
YWRFdmVudHMgPSBmcmFtZS0+dW5sb2FkTGlzdGVuZXJDb3VudCgpOworICAgICAgICBpZiAocGVu
ZGluZ1VubG9hZEV2ZW50cykgeworICAgICAgICAgICAgcHJpbnRGcmFtZURlc2NyaXB0aW9uKGZy
YW1lKTsKKyAgICAgICAgICAgIHByaW50ZigiIC0gaGFzICV1IG9udW5sb2FkIGhhbmRsZXIocylc
biIsIHBlbmRpbmdVbmxvYWRFdmVudHMpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFdl
YlZpZXdIb3N0OjpkaWRIYW5kbGVPbmxvYWRFdmVudHMoV2ViRnJhbWUqIGZyYW1lKQoreworICAg
IGlmIChtX3NoZWxsLT5zaG91bGREdW1wRnJhbWVMb2FkQ2FsbGJhY2tzKCkpIHsKKyAgICAgICAg
cHJpbnRGcmFtZURlc2NyaXB0aW9uKGZyYW1lKTsKKyAgICAgICAgZnB1dHMoIiAtIGRpZEhhbmRs
ZU9ubG9hZEV2ZW50c0ZvckZyYW1lXG4iLCBzdGRvdXQpOworICAgIH0KK30KKwordm9pZCBXZWJW
aWV3SG9zdDo6ZGlkRmFpbExvYWQoV2ViRnJhbWUqIGZyYW1lLCBjb25zdCBXZWJVUkxFcnJvciYg
ZXJyb3IpCit7CisgICAgaWYgKG1fc2hlbGwtPnNob3VsZER1bXBGcmFtZUxvYWRDYWxsYmFja3Mo
KSkgeworICAgICAgICBwcmludEZyYW1lRGVzY3JpcHRpb24oZnJhbWUpOworICAgICAgICBmcHV0
cygiIC0gZGlkRmFpbExvYWRXaXRoRXJyb3JcbiIsIHN0ZG91dCk7CisgICAgfQorICAgIGxvY2F0
aW9uQ2hhbmdlRG9uZShmcmFtZSk7Cit9CisKK3ZvaWQgV2ViVmlld0hvc3Q6OmRpZEZpbmlzaExv
YWQoV2ViRnJhbWUqIGZyYW1lKQoreworICAgIGlmIChtX3NoZWxsLT5zaG91bGREdW1wRnJhbWVM
b2FkQ2FsbGJhY2tzKCkpIHsKKyAgICAgICAgcHJpbnRGcmFtZURlc2NyaXB0aW9uKGZyYW1lKTsK
KyAgICAgICAgZnB1dHMoIiAtIGRpZEZpbmlzaExvYWRGb3JGcmFtZVxuIiwgc3Rkb3V0KTsKKyAg
ICB9CisgICAgdXBkYXRlQWRkcmVzc0JhcihmcmFtZS0+dmlldygpKTsKKyAgICBsb2NhdGlvbkNo
YW5nZURvbmUoZnJhbWUpOworfQorCit2b2lkIFdlYlZpZXdIb3N0OjpkaWRDaGFuZ2VMb2NhdGlv
bldpdGhpblBhZ2UoV2ViRnJhbWUqIGZyYW1lLCBib29sIGlzTmV3TmF2aWdhdGlvbikKK3sKKyAg
ICBmcmFtZS0+ZGF0YVNvdXJjZSgpLT5zZXRFeHRyYURhdGEobV9wZW5kaW5nRXh0cmFEYXRhLnJl
bGVhc2UoKSk7CisgICAgaWYgKG1fc2hlbGwtPnNob3VsZER1bXBGcmFtZUxvYWRDYWxsYmFja3Mo
KSkgeworICAgICAgICBwcmludEZyYW1lRGVzY3JpcHRpb24oZnJhbWUpOworICAgICAgICBmcHV0
cygiIC0gZGlkQ2hhbmdlTG9jYXRpb25XaXRoaW5QYWdlRm9yRnJhbWVcbiIsIHN0ZG91dCk7Cisg
ICAgfQorICAgIHVwZGF0ZUZvckNvbW1pdHRlZExvYWQoZnJhbWUsIGlzTmV3TmF2aWdhdGlvbik7
Cit9CisKK3ZvaWQgV2ViVmlld0hvc3Q6OmFzc2lnbklkZW50aWZpZXJUb1JlcXVlc3QoV2ViRnJh
bWUqLCB1bnNpZ25lZCBpZGVudGlmaWVyLCBjb25zdCBXZWJVUkxSZXF1ZXN0JiByZXF1ZXN0KQor
eworICAgIGlmICghbV9zaGVsbC0+c2hvdWxkRHVtcFJlc291cmNlTG9hZENhbGxiYWNrcygpKQor
ICAgICAgICByZXR1cm47CisgICAgbV9yZXNvdXJjZUlkZW50aWZpZXJNYXAuc2V0KGlkZW50aWZp
ZXIsIGRlc2NyaXB0aW9uU3VpdGFibGVGb3JUZXN0UmVzdWx0KHJlcXVlc3QudXJsKCkuc3BlYygp
KSk7Cit9CisKK3ZvaWQgV2ViVmlld0hvc3Q6OndpbGxTZW5kUmVxdWVzdChXZWJGcmFtZSosIHVu
c2lnbmVkIGlkZW50aWZpZXIsIFdlYlVSTFJlcXVlc3QmIHJlcXVlc3QsIGNvbnN0IFdlYlVSTFJl
c3BvbnNlJiByZWRpcmVjdFJlc3BvbnNlKQoreworICAgIC8vIE5lZWQgdG8gdXNlIEdVUkwgZm9y
IGhvc3QoKSBhbmQgU2NoZW1lSXMoKQorICAgIEdVUkwgdXJsID0gcmVxdWVzdC51cmwoKTsKKyAg
ICBzdHJpbmcgcmVxdWVzdFVSTCA9IHVybC5wb3NzaWJseV9pbnZhbGlkX3NwZWMoKTsKKworICAg
IGlmIChsYXlvdXRUZXN0Q29udHJvbGxlcigpLT5zaG91bGREdW1wUmVzb3VyY2VMb2FkQ2FsbGJh
Y2tzKCkpIHsKKyAgICAgICAgR1VSTCBtYWluRG9jdW1lbnRVUkwgPSByZXF1ZXN0LmZpcnN0UGFy
dHlGb3JDb29raWVzKCk7CisgICAgICAgIHByaW50UmVzb3VyY2VEZXNjcmlwdGlvbihpZGVudGlm
aWVyKTsKKyAgICAgICAgcHJpbnRmKCIgLSB3aWxsU2VuZFJlcXVlc3QgPE5TVVJMUmVxdWVzdCBV
UkwgJXMsIG1haW4gZG9jdW1lbnQgVVJMICVzLCIKKyAgICAgICAgICAgICAgICIgaHR0cCBtZXRo
b2QgJXM+IHJlZGlyZWN0UmVzcG9uc2UgJXNcbiIsCisgICAgICAgICAgICAgICBkZXNjcmlwdGlv
blN1aXRhYmxlRm9yVGVzdFJlc3VsdChyZXF1ZXN0VVJMKS5jX3N0cigpLAorICAgICAgICAgICAg
ICAgVVJMRGVzY3JpcHRpb24obWFpbkRvY3VtZW50VVJMKS5jX3N0cigpLAorICAgICAgICAgICAg
ICAgcmVxdWVzdC5odHRwTWV0aG9kKCkudXRmOCgpLmRhdGEoKSk7CisgICAgICAgIHByaW50UmVz
cG9uc2VEZXNjcmlwdGlvbihyZWRpcmVjdFJlc3BvbnNlKTsKKyAgICAgICAgZnB1dHMoIlxuIiwg
c3Rkb3V0KTsKKyAgICB9CisKKyAgICBpZiAoIXJlZGlyZWN0UmVzcG9uc2UuaXNOdWxsKCkgJiYg
bV9ibG9ja3NSZWRpcmVjdHMpIHsKKyAgICAgICAgZnB1dHMoIlJldHVybmluZyBudWxsIGZvciB0
aGlzIHJlZGlyZWN0XG4iLCBzdGRvdXQpOworICAgICAgICAvLyBUbyBibG9jayB0aGUgcmVxdWVz
dCwgd2Ugc2V0IGl0cyBVUkwgdG8gYW4gZW1wdHkgb25lLgorICAgICAgICByZXF1ZXN0LnNldFVS
TChXZWJVUkwoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobV9yZXF1ZXN0
UmV0dXJuTnVsbCkgeworICAgICAgICAvLyBUbyBibG9jayB0aGUgcmVxdWVzdCwgd2Ugc2V0IGl0
cyBVUkwgdG8gYW4gZW1wdHkgb25lLgorICAgICAgICByZXF1ZXN0LnNldFVSTChXZWJVUkwoKSk7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdHJpbmcgaG9zdCA9IHVybC5ob3N0KCk7
CisgICAgLy8gMjU1LjI1NS4yNTUuMjU1IGlzIHVzZWQgaW4gc29tZSB0ZXN0cyB0aGF0IGV4cGVj
dCB0byBnZXQgYmFjayBhbiBlcnJvci4KKyAgICBpZiAoIWhvc3QuZW1wdHkoKSAmJiAodXJsLlNj
aGVtZUlzKCJodHRwIikgfHwgdXJsLlNjaGVtZUlzKCJodHRwcyIpKQorICAgICAgICAmJiBob3N0
ICE9ICIxMjcuMC4wLjEiCisgICAgICAgICYmIGhvc3QgIT0gIjI1NS4yNTUuMjU1LjI1NSIKKyAg
ICAgICAgJiYgaG9zdCAhPSAibG9jYWxob3N0IikgeworICAgICAgICBwcmludGYoIkJsb2NrZWQg
YWNjZXNzIHRvIGV4dGVybmFsIFVSTCAlc1xuIiwgcmVxdWVzdFVSTC5jX3N0cigpKTsKKworICAg
ICAgICAvLyBUbyBibG9jayB0aGUgcmVxdWVzdCwgd2Ugc2V0IGl0cyBVUkwgdG8gYW4gZW1wdHkg
b25lLgorICAgICAgICByZXF1ZXN0LnNldFVSTChXZWJVUkwoKSk7CisgICAgICAgIHJldHVybjsK
KyAgICB9CisKKyAgICAvLyBTZXQgdGhlIG5ldyBzdWJzdGl0dXRlZCBVUkwuCisgICAgcmVxdWVz
dC5zZXRVUkwod2Via2l0X3N1cHBvcnQ6OlJld3JpdGVMYXlvdXRUZXN0c1VSTChyZXF1ZXN0LnVy
bCgpLnNwZWMoKSkpOworfQorCit2b2lkIFdlYlZpZXdIb3N0OjpkaWRSZWNlaXZlUmVzcG9uc2Uo
V2ViRnJhbWUqLCB1bnNpZ25lZCBpZGVudGlmaWVyLCBjb25zdCBXZWJVUkxSZXNwb25zZSYgcmVz
cG9uc2UpCit7CisgICAgaWYgKCFtX3NoZWxsLT5zaG91bGREdW1wUmVzb3VyY2VMb2FkQ2FsbGJh
Y2tzKCkpCisgICAgICAgIHJldHVybjsKKyAgICBwcmludFJlc291cmNlRGVzY3JpcHRpb24oaWRl
bnRpZmllcik7CisgICAgZnB1dHMoIiAtIGRpZFJlY2VpdmVSZXNwb25zZSAiLCBzdGRvdXQpOwor
ICAgIHByaW50UmVzcG9uc2VEZXNjcmlwdGlvbihyZXNwb25zZSk7CisgICAgZnB1dHMoIlxuIiwg
c3Rkb3V0KTsKK30KKwordm9pZCBXZWJWaWV3SG9zdDo6ZGlkRmluaXNoUmVzb3VyY2VMb2FkKFdl
YkZyYW1lKiwgdW5zaWduZWQgaWRlbnRpZmllcikKK3sKKyAgICBpZiAobV9zaGVsbC0+c2hvdWxk
RHVtcFJlc291cmNlTG9hZENhbGxiYWNrcygpKSB7CisgICAgICAgIHByaW50UmVzb3VyY2VEZXNj
cmlwdGlvbihpZGVudGlmaWVyKTsKKyAgICAgICAgZnB1dHMoIiAtIGRpZEZpbmlzaExvYWRpbmdc
biIsIHN0ZG91dCk7CisgICAgfQorICAgIG1fcmVzb3VyY2VJZGVudGlmaWVyTWFwLnJlbW92ZShp
ZGVudGlmaWVyKTsKK30KKwordm9pZCBXZWJWaWV3SG9zdDo6ZGlkRmFpbFJlc291cmNlTG9hZChX
ZWJGcmFtZSosIHVuc2lnbmVkIGlkZW50aWZpZXIsIGNvbnN0IFdlYlVSTEVycm9yJiBlcnJvcikK
K3sKKyAgICBpZiAobV9zaGVsbC0+c2hvdWxkRHVtcFJlc291cmNlTG9hZENhbGxiYWNrcygpKSB7
CisgICAgICAgIHByaW50UmVzb3VyY2VEZXNjcmlwdGlvbihpZGVudGlmaWVyKTsKKyAgICAgICAg
ZnB1dHMoIiAtIGRpZEZhaWxMb2FkaW5nV2l0aEVycm9yOiAiLCBzdGRvdXQpOworICAgICAgICBw
cmludEVycm9yRGVzY3JpcHRpb24oZXJyb3IpOworICAgICAgICBmcHV0cygiXG4iLCBzdGRvdXQp
OworICAgIH0KKyAgICBtX3Jlc291cmNlSWRlbnRpZmllck1hcC5yZW1vdmUoaWRlbnRpZmllcik7
Cit9CisKK3ZvaWQgV2ViVmlld0hvc3Q6OmRpZERpc3BsYXlJbnNlY3VyZUNvbnRlbnQoV2ViRnJh
bWUqKQoreworICAgIGlmIChtX3NoZWxsLT5zaG91bGREdW1wRnJhbWVMb2FkQ2FsbGJhY2tzKCkp
CisgICAgICAgIGZwdXRzKCJkaWREaXNwbGF5SW5zZWN1cmVDb250ZW50XG4iLCBzdGRvdXQpOwor
fQorCit2b2lkIFdlYlZpZXdIb3N0OjpkaWRSdW5JbnNlY3VyZUNvbnRlbnQoV2ViRnJhbWUqLCBj
b25zdCBXZWJTZWN1cml0eU9yaWdpbiYgb3JpZ2luKQoreworICAgIGlmIChtX3NoZWxsLT5zaG91
bGREdW1wRnJhbWVMb2FkQ2FsbGJhY2tzKCkpCisgICAgICAgIGZwdXRzKCJkaWRSdW5JbnNlY3Vy
ZUNvbnRlbnRcbiIsIHN0ZG91dCk7Cit9CisKK2Jvb2wgV2ViVmlld0hvc3Q6OmFsbG93U2NyaXB0
KFdlYkZyYW1lKiwgYm9vbCBlbmFibGVkUGVyU2V0dGluZ3MpCit7CisgICAgcmV0dXJuIGVuYWJs
ZWRQZXJTZXR0aW5nczsKK30KKworLy8gUHVibGljIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXZWJWaWV3SG9z
dDo6V2ViVmlld0hvc3QoVGVzdFNoZWxsKiBzaGVsbCkKKyAgICA6IG1fcG9saWN5RGVsZWdhdGVF
bmFibGVkKGZhbHNlKQorICAgICwgbV9wb2xpY3lEZWxlZ2F0ZUlzUGVybWlzc2l2ZShmYWxzZSkK
KyAgICAsIG1fcG9saWN5RGVsZWdhdGVTaG91bGROb3RpZnlEb25lKGZhbHNlKQorICAgICwgbV9z
aGVsbChzaGVsbCkKKyAgICAsIG1fdG9wTG9hZGluZ0ZyYW1lKDApCisgICAgLCBtX2hhc1dpbmRv
dyhmYWxzZSkKKyAgICAsIG1fcGFnZUlkKC0xKQorICAgICwgbV9sYXN0UGFnZUlkVXBkYXRlZCgt
MSkKKyAgICAsIG1fc21hcnRJbnNlcnREZWxldGVFbmFibGVkKHRydWUpCisjaWYgT1MoV0lORE9X
UykKKyAgICAsIG1fc2VsZWN0VHJhaWxpbmdXaGl0ZXNwYWNlRW5hYmxlZCh0cnVlKQorI2Vsc2UK
KyAgICAsIG1fc2VsZWN0VHJhaWxpbmdXaGl0ZXNwYWNlRW5hYmxlZChmYWxzZSkKKyNlbmRpZgor
ICAgICwgbV9ibG9ja3NSZWRpcmVjdHMoZmFsc2UpCisgICAgLCBtX3JlcXVlc3RSZXR1cm5OdWxs
KGZhbHNlKQorICAgICwgbV9pc1BhaW50aW5nKGZhbHNlKQorICAgICwgbV93ZWJXaWRnZXQoMCkK
K3sKKyAgICBtX25hdmlnYXRpb25Db250cm9sbGVyLnNldChuZXcgVGVzdE5hdmlnYXRpb25Db250
cm9sbGVyKHRoaXMpKTsKK30KKworV2ViVmlld0hvc3Q6On5XZWJWaWV3SG9zdCgpCit7Cit9CisK
K1dlYlZpZXcqIFdlYlZpZXdIb3N0Ojp3ZWJWaWV3KCkgY29uc3QKK3sKKyAgICBBU1NFUlQobV93
ZWJXaWRnZXQpOworICAgIC8vIERSVCBkb2VzIG5vdCBzdXBwb3J0IHBvcHVwIHdpZGdldHMuIFNv
IG1fd2ViV2lkZ2V0IGlzIGFsd2F5cyBhIFdlYlZpZXcuCisgICAgcmV0dXJuIHN0YXRpY19jYXN0
PFdlYlZpZXcqPihtX3dlYldpZGdldCk7Cit9CisKK1dlYldpZGdldCogV2ViVmlld0hvc3Q6Ondl
YldpZGdldCgpIGNvbnN0Cit7CisgICAgQVNTRVJUKG1fd2ViV2lkZ2V0KTsKKyAgICByZXR1cm4g
bV93ZWJXaWRnZXQ7Cit9CisKK3ZvaWQgV2ViVmlld0hvc3Q6OnJlc2V0KCkKK3sKKyAgICAvLyBE
byBhIGxpdHRsZSBwbGFjZW1lbnQgbmV3IGRhbmNlLi4uCisgICAgVGVzdFNoZWxsKiBzaGVsbCA9
IG1fc2hlbGw7CisgICAgV2ViV2lkZ2V0KiB3aWRnZXQgPSBtX3dlYldpZGdldDsKKyAgICB0aGlz
LT5+V2ViVmlld0hvc3QoKTsKKyAgICBuZXcgKHRoaXMpIFdlYlZpZXdIb3N0KHNoZWxsKTsKKyAg
ICBzZXRXZWJXaWRnZXQod2lkZ2V0KTsKK30KKwordm9pZCBXZWJWaWV3SG9zdDo6c2V0U2VsZWN0
VHJhaWxpbmdXaGl0ZXNwYWNlRW5hYmxlZChib29sIGVuYWJsZWQpCit7CisgICAgbV9zZWxlY3RU
cmFpbGluZ1doaXRlc3BhY2VFbmFibGVkID0gZW5hYmxlZDsKKyAgICAvLyBJbiB1cHN0cmVhbSBX
ZWJLaXQsIHNtYXJ0IGluc2VydC9kZWxldGUgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggc2Vs
ZWN0CisgICAgLy8gdHJhaWxpbmcgd2hpdGVzcGFjZSwgaG93ZXZlciwgd2UgYWxsb3cgYm90aCBi
ZWNhdXNlIENocm9taXVtIG9uIFdpbmRvd3MKKyAgICAvLyBhbGxvd3MgYm90aC4KK30KKwordm9p
ZCBXZWJWaWV3SG9zdDo6c2V0U21hcnRJbnNlcnREZWxldGVFbmFibGVkKGJvb2wgZW5hYmxlZCkK
K3sKKyAgICBtX3NtYXJ0SW5zZXJ0RGVsZXRlRW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgLy8gSW4g
dXBzdHJlYW0gV2ViS2l0LCBzbWFydCBpbnNlcnQvZGVsZXRlIGlzIG11dHVhbGx5IGV4Y2x1c2l2
ZSB3aXRoIHNlbGVjdAorICAgIC8vIHRyYWlsaW5nIHdoaXRlc3BhY2UsIGhvd2V2ZXIsIHdlIGFs
bG93IGJvdGggYmVjYXVzZSBDaHJvbWl1bSBvbiBXaW5kb3dzCisgICAgLy8gYWxsb3dzIGJvdGgu
Cit9CisKK3ZvaWQgV2ViVmlld0hvc3Q6OnNldEN1c3RvbVBvbGljeURlbGVnYXRlKGJvb2wgaXND
dXN0b20sIGJvb2wgaXNQZXJtaXNzaXZlKQoreworICAgIG1fcG9saWN5RGVsZWdhdGVFbmFibGVk
ID0gaXNDdXN0b207CisgICAgbV9wb2xpY3lEZWxlZ2F0ZUlzUGVybWlzc2l2ZSA9IGlzUGVybWlz
c2l2ZTsKK30KKwordm9pZCBXZWJWaWV3SG9zdDo6d2FpdEZvclBvbGljeURlbGVnYXRlKCkKK3sK
KyAgICBtX3BvbGljeURlbGVnYXRlRW5hYmxlZCA9IHRydWU7CisgICAgbV9wb2xpY3lEZWxlZ2F0
ZVNob3VsZE5vdGlmeURvbmUgPSB0cnVlOworfQorCit2b2lkIFdlYlZpZXdIb3N0OjpzZXRFZGl0
Q29tbWFuZChjb25zdCBzdHJpbmcmIG5hbWUsIGNvbnN0IHN0cmluZyYgdmFsdWUpCit7CisgICAg
bV9lZGl0Q29tbWFuZE5hbWUgPSBuYW1lOworICAgIG1fZWRpdENvbW1hbmRWYWx1ZSA9IHZhbHVl
OworfQorCit2b2lkIFdlYlZpZXdIb3N0OjpjbGVhckVkaXRDb21tYW5kKCkKK3sKKyAgICBtX2Vk
aXRDb21tYW5kTmFtZS5jbGVhcigpOworICAgIG1fZWRpdENvbW1hbmRWYWx1ZS5jbGVhcigpOwor
fQorCit2b2lkIFdlYlZpZXdIb3N0Ojpsb2FkVVJMRm9yRnJhbWUoY29uc3QgV2ViVVJMJiB1cmws
IGNvbnN0IFdlYlN0cmluZyYgZnJhbWVOYW1lKQoreworICAgIGlmICghdXJsLmlzVmFsaWQoKSkK
KyAgICAgICAgcmV0dXJuOworICAgIFRlc3RTaGVsbDo6cmVzaXplV2luZG93Rm9yVGVzdCh0aGlz
LCB1cmwpOworICAgIG5hdmlnYXRpb25Db250cm9sbGVyKCktPmxvYWRFbnRyeShuZXcgVGVzdE5h
dmlnYXRpb25FbnRyeSgtMSwgdXJsLCBXZWJTdHJpbmcoKSwgZnJhbWVOYW1lKSk7Cit9CisKK2Jv
b2wgV2ViVmlld0hvc3Q6Om5hdmlnYXRlKGNvbnN0IFRlc3ROYXZpZ2F0aW9uRW50cnkmIGVudHJ5
LCBib29sIHJlbG9hZCkKK3sKKyAgICAvLyBHZXQgdGhlIHJpZ2h0IHRhcmdldCBmcmFtZSBmb3Ig
dGhlIGVudHJ5LgorICAgIFdlYkZyYW1lKiBmcmFtZSA9IHdlYlZpZXcoKS0+bWFpbkZyYW1lKCk7
CisgICAgaWYgKCFlbnRyeS50YXJnZXRGcmFtZSgpLmlzRW1wdHkoKSkKKyAgICAgICAgZnJhbWUg
PSB3ZWJWaWV3KCktPmZpbmRGcmFtZUJ5TmFtZShlbnRyeS50YXJnZXRGcmFtZSgpKTsKKworICAg
IC8vIFRPRE8obXBjb21wbGV0ZSk6IHNob3VsZCB3ZSBjbGVhciB0aGUgdGFyZ2V0IGZyYW1lLCBv
ciBzaG91bGQKKyAgICAvLyBiYWNrL2ZvcndhcmQgbmF2aWdhdGlvbnMgbWFpbnRhaW4gdGhlIHRh
cmdldCBmcmFtZT8KKworICAgIC8vIEEgbmF2aWdhdGlvbiByZXN1bHRpbmcgZnJvbSBsb2FkaW5n
IGEgamF2YXNjcmlwdCBVUkwgc2hvdWxkIG5vdCBiZQorICAgIC8vIHRyZWF0ZWQgYXMgYSBicm93
c2VyIGluaXRpYXRlZCBldmVudC4gIEluc3RlYWQsIHdlIHdhbnQgaXQgdG8gbG9vayBhcyBpZgor
ICAgIC8vIHRoZSBwYWdlIGluaXRpYXRlZCBhbnkgbG9hZCByZXN1bHRpbmcgZnJvbSBKUyBleGVj
dXRpb24uCisgICAgaWYgKCFHVVJMKGVudHJ5LlVSTCgpKS5TY2hlbWVJcygiamF2YXNjcmlwdCIp
KQorICAgICAgICBzZXRQZW5kaW5nRXh0cmFEYXRhKG5ldyBUZXN0U2hlbGxFeHRyYURhdGEoZW50
cnkucGFnZUlEKCkpKTsKKworICAgIC8vIElmIHdlIGFyZSByZWxvYWRpbmcsIHRoZW4gV2ViS2l0
IHdpbGwgdXNlIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBwYWdlLgorICAgIC8vIE90aGVyd2lz
ZSwgd2UgZ2l2ZSBpdCB0aGUgc3RhdGUgdG8gbmF2aWdhdGUgdG8uCisgICAgaWYgKHJlbG9hZCkg
eworICAgICAgICBmcmFtZS0+cmVsb2FkKGZhbHNlKTsKKyAgICB9IGVsc2UgaWYgKCFlbnRyeS5j
b250ZW50U3RhdGUoKS5pc051bGwoKSkgeworICAgICAgICBBU1NFUlQoZW50cnkucGFnZUlEKCkg
IT0gLTEpOworICAgICAgICBmcmFtZS0+bG9hZEhpc3RvcnlJdGVtKGVudHJ5LmNvbnRlbnRTdGF0
ZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlQoZW50cnkucGFnZUlEKCkgPT0gLTEp
OworICAgICAgICBmcmFtZS0+bG9hZFJlcXVlc3QoV2ViVVJMUmVxdWVzdChlbnRyeS5VUkwoKSkp
OworICAgIH0KKworICAgIC8vIEluIGNhc2UgTG9hZFJlcXVlc3QgZmFpbGVkIGJlZm9yZSBEaWRD
cmVhdGVEYXRhU291cmNlIHdhcyBjYWxsZWQuCisgICAgc2V0UGVuZGluZ0V4dHJhRGF0YSgwKTsK
KworICAgIC8vIFJlc3RvcmUgZm9jdXMgdG8gdGhlIG1haW4gZnJhbWUgcHJpb3IgdG8gbG9hZGlu
ZyBuZXcgcmVxdWVzdC4KKyAgICAvLyBUaGlzIG1ha2VzIHN1cmUgdGhhdCB3ZSBkb24ndCBoYXZl
IGEgZm9jdXNlZCBpZnJhbWUuIE90aGVyd2lzZSwgdGhhdAorICAgIC8vIGlmcmFtZSB3b3VsZCBr
ZWVwIGZvY3VzIHdoZW4gdGhlIFNldEZvY3VzIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlcgorICAg
IC8vIExvYWRSZXF1ZXN0LCB0aHVzIG1ha2luZyBzb21lIHRlc3RzIGZhaWwgKHNlZSBodHRwOi8v
Yi9pc3N1ZT9pZD04NDUzMzcKKyAgICAvLyBmb3IgbW9yZSBkZXRhaWxzKS4KKyAgICB3ZWJWaWV3
KCktPnNldEZvY3VzZWRGcmFtZShmcmFtZSk7CisgICAgbV9zaGVsbC0+c2V0Rm9jdXMod2ViVmll
dygpLCB0cnVlKTsKKworICAgIHJldHVybiB0cnVlOworfQorCisvLyBQcml2YXRlIGZ1bmN0aW9u
cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tCisKK0xheW91dFRlc3RDb250cm9sbGVyKiBXZWJWaWV3SG9zdDo6bGF5b3V0VGVzdENvbnRy
b2xsZXIoKSBjb25zdAoreworICAgIHJldHVybiBtX3NoZWxsLT5sYXlvdXRUZXN0Q29udHJvbGxl
cigpOworfQorCit2b2lkIFdlYlZpZXdIb3N0Ojp1cGRhdGVBZGRyZXNzQmFyKFdlYlZpZXcqIHdl
YlZpZXcpCit7CisgICAgV2ViRnJhbWUqIG1haW5GcmFtZSA9IHdlYlZpZXctPm1haW5GcmFtZSgp
OworICAgIFdlYkRhdGFTb3VyY2UqIGRhdGFTb3VyY2UgPSBtYWluRnJhbWUtPmRhdGFTb3VyY2Uo
KTsKKyAgICBpZiAoIWRhdGFTb3VyY2UpCisgICAgICAgIGRhdGFTb3VyY2UgPSBtYWluRnJhbWUt
PnByb3Zpc2lvbmFsRGF0YVNvdXJjZSgpOworICAgIGlmICghZGF0YVNvdXJjZSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgc2V0QWRkcmVzc0JhclVSTChkYXRhU291cmNlLT5yZXF1ZXN0KCkuZmly
c3RQYXJ0eUZvckNvb2tpZXMoKSk7Cit9CisKK3ZvaWQgV2ViVmlld0hvc3Q6OmxvY2F0aW9uQ2hh
bmdlRG9uZShXZWJGcmFtZSogZnJhbWUpCit7CisgICAgaWYgKGZyYW1lICE9IG1fdG9wTG9hZGlu
Z0ZyYW1lKQorICAgICAgICByZXR1cm47CisgICAgbV90b3BMb2FkaW5nRnJhbWUgPSAwOworICAg
IGxheW91dFRlc3RDb250cm9sbGVyKCktPmxvY2F0aW9uQ2hhbmdlRG9uZSgpOworfQorCit2b2lk
IFdlYlZpZXdIb3N0Ojp1cGRhdGVGb3JDb21taXR0ZWRMb2FkKFdlYkZyYW1lKiBmcmFtZSwgYm9v
bCBpc05ld05hdmlnYXRpb24pCit7CisgICAgLy8gQ29kZSBkdXBsaWNhdGVkIGZyb20gUmVuZGVy
Vmlldzo6RGlkQ29tbWl0TG9hZEZvckZyYW1lLgorICAgIFRlc3RTaGVsbEV4dHJhRGF0YSogZXh0
cmFEYXRhID0gc3RhdGljX2Nhc3Q8VGVzdFNoZWxsRXh0cmFEYXRhKj4oZnJhbWUtPmRhdGFTb3Vy
Y2UoKS0+ZXh0cmFEYXRhKCkpOworCisgICAgaWYgKGlzTmV3TmF2aWdhdGlvbikgeworICAgICAg
ICAvLyBOZXcgbmF2aWdhdGlvbi4KKyAgICAgICAgdXBkYXRlU2Vzc2lvbkhpc3RvcnkoZnJhbWUp
OworICAgICAgICBtX3BhZ2VJZCA9IG5leHRQYWdlSUQrKzsKKyAgICB9IGVsc2UgaWYgKGV4dHJh
RGF0YSAmJiBleHRyYURhdGEtPnBlbmRpbmdQYWdlSUQgIT0gLTEgJiYgIWV4dHJhRGF0YS0+cmVx
dWVzdENvbW1pdHRlZCkgeworICAgICAgICAvLyBUaGlzIGlzIGEgc3VjY2Vzc2Z1bCBzZXNzaW9u
IGhpc3RvcnkgbmF2aWdhdGlvbiEKKyAgICAgICAgdXBkYXRlU2Vzc2lvbkhpc3RvcnkoZnJhbWUp
OworICAgICAgICBtX3BhZ2VJZCA9IGV4dHJhRGF0YS0+cGVuZGluZ1BhZ2VJRDsKKyAgICB9CisK
KyAgICAvLyBEb24ndCB1cGRhdGUgc2Vzc2lvbiBoaXN0b3J5IG11bHRpcGxlIHRpbWVzLgorICAg
IGlmIChleHRyYURhdGEpCisgICAgICAgIGV4dHJhRGF0YS0+cmVxdWVzdENvbW1pdHRlZCA9IHRy
dWU7CisKKyAgICB1cGRhdGVVUkwoZnJhbWUpOworfQorCit2b2lkIFdlYlZpZXdIb3N0Ojp1cGRh
dGVVUkwoV2ViRnJhbWUqIGZyYW1lKQoreworICAgIFdlYkRhdGFTb3VyY2UqIGRzID0gZnJhbWUt
PmRhdGFTb3VyY2UoKTsKKyAgICBBU1NFUlQoZHMpOworICAgIGNvbnN0IFdlYlVSTFJlcXVlc3Qm
IHJlcXVlc3QgPSBkcy0+cmVxdWVzdCgpOworICAgIE93blB0cjxUZXN0TmF2aWdhdGlvbkVudHJ5
PiBlbnRyeShuZXcgVGVzdE5hdmlnYXRpb25FbnRyeSk7CisKKyAgICAvLyBUaGUgcmVmZXJyZXIg
d2lsbCBiZSBlbXB0eSBvbiBodHRwcy0+aHR0cCB0cmFuc2l0aW9ucy4gSXQKKyAgICAvLyB3b3Vs
ZCBiZSBuaWNlIGlmIHdlIGNvdWxkIGdldCB0aGUgcmVhbCByZWZlcnJlciBmcm9tIHNvbWV3aGVy
ZS4KKyAgICBlbnRyeS0+c2V0UGFnZUlEKG1fcGFnZUlkKTsKKyAgICBpZiAoZHMtPmhhc1VucmVh
Y2hhYmxlVVJMKCkpCisgICAgICAgIGVudHJ5LT5zZXRVUkwoZHMtPnVucmVhY2hhYmxlVVJMKCkp
OworICAgIGVsc2UKKyAgICAgICAgZW50cnktPnNldFVSTChyZXF1ZXN0LnVybCgpKTsKKworICAg
IGNvbnN0IFdlYkhpc3RvcnlJdGVtJiBoaXN0b3J5SXRlbSA9IGZyYW1lLT5jdXJyZW50SGlzdG9y
eUl0ZW0oKTsKKyAgICBpZiAoIWhpc3RvcnlJdGVtLmlzTnVsbCgpKQorICAgICAgICBlbnRyeS0+
c2V0Q29udGVudFN0YXRlKGhpc3RvcnlJdGVtKTsKKworICAgIG5hdmlnYXRpb25Db250cm9sbGVy
KCktPmRpZE5hdmlnYXRlVG9FbnRyeShlbnRyeS5yZWxlYXNlKCkpOworICAgIG1fbGFzdFBhZ2VJ
ZFVwZGF0ZWQgPSBtYXgobV9sYXN0UGFnZUlkVXBkYXRlZCwgbV9wYWdlSWQpOworfQorCit2b2lk
IFdlYlZpZXdIb3N0Ojp1cGRhdGVTZXNzaW9uSGlzdG9yeShXZWJGcmFtZSogZnJhbWUpCit7Cisg
ICAgLy8gSWYgd2UgaGF2ZSBhIHZhbGlkIHBhZ2UgSUQgYXQgdGhpcyBwb2ludCwgdGhlbiBpdCBj
b3JyZXNwb25kcyB0byB0aGUgcGFnZQorICAgIC8vIHdlIGFyZSBuYXZpZ2F0aW5nIGF3YXkgZnJv
bS4gIE90aGVyd2lzZSwgdGhpcyBpcyB0aGUgZmlyc3QgbmF2aWdhdGlvbiwgc28KKyAgICAvLyB0
aGVyZSBpcyBubyBwYXN0IHNlc3Npb24gaGlzdG9yeSB0byByZWNvcmQuCisgICAgaWYgKG1fcGFn
ZUlkID09IC0xKQorICAgICAgICByZXR1cm47CisKKyAgICBUZXN0TmF2aWdhdGlvbkVudHJ5KiBl
bnRyeSA9IHN0YXRpY19jYXN0PFRlc3ROYXZpZ2F0aW9uRW50cnkqPihuYXZpZ2F0aW9uQ29udHJv
bGxlcigpLT5lbnRyeVdpdGhQYWdlSUQobV9wYWdlSWQpKTsKKyAgICBpZiAoIWVudHJ5KQorICAg
ICAgICByZXR1cm47CisKKyAgICBjb25zdCBXZWJIaXN0b3J5SXRlbSYgaGlzdG9yeUl0ZW0gPSB3
ZWJWaWV3KCktPm1haW5GcmFtZSgpLT5wcmV2aW91c0hpc3RvcnlJdGVtKCk7CisgICAgaWYgKGhp
c3RvcnlJdGVtLmlzTnVsbCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBlbnRyeS0+c2V0Q29u
dGVudFN0YXRlKGhpc3RvcnlJdGVtKTsKK30KKwordm9pZCBXZWJWaWV3SG9zdDo6cHJpbnRGcmFt
ZURlc2NyaXB0aW9uKFdlYkZyYW1lKiB3ZWJmcmFtZSkKK3sKKyAgICBzdHJpbmcgbmFtZTggPSB3
ZWJmcmFtZS0+bmFtZSgpLnV0ZjgoKTsKKyAgICBpZiAod2ViZnJhbWUgPT0gd2ViVmlldygpLT5t
YWluRnJhbWUoKSkgeworICAgICAgICBpZiAoIW5hbWU4Lmxlbmd0aCgpKSB7CisgICAgICAgICAg
ICBmcHV0cygibWFpbiBmcmFtZSIsIHN0ZG91dCk7CisgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgIH0KKyAgICAgICAgcHJpbnRmKCJtYWluIGZyYW1lIFwiJXNcIiIsIG5hbWU4LmNfc3RyKCkp
OworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghbmFtZTgubGVuZ3RoKCkpIHsKKyAg
ICAgICAgZnB1dHMoImZyYW1lIChhbm9ueW1vdXMpIiwgc3Rkb3V0KTsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKyAgICBwcmludGYoImZyYW1lIFwiJXNcIiIsIG5hbWU4LmNfc3RyKCkpOworfQor
Cit2b2lkIFdlYlZpZXdIb3N0OjpwcmludFJlc291cmNlRGVzY3JpcHRpb24odW5zaWduZWQgaWRl
bnRpZmllcikKK3sKKyAgICBSZXNvdXJjZU1hcDo6aXRlcmF0b3IgaXQgPSBtX3Jlc291cmNlSWRl
bnRpZmllck1hcC5maW5kKGlkZW50aWZpZXIpOworICAgIHByaW50ZigiJXMiLCBpdCAhPSBtX3Jl
c291cmNlSWRlbnRpZmllck1hcC5lbmQoKSA/IGl0LT5zZWNvbmQuY19zdHIoKSA6ICI8dW5rbm93
bj4iKTsKK30KKwordm9pZCBXZWJWaWV3SG9zdDo6c2V0UGVuZGluZ0V4dHJhRGF0YShUZXN0U2hl
bGxFeHRyYURhdGEqIGV4dHJhRGF0YSkKK3sKKyAgICBtX3BlbmRpbmdFeHRyYURhdGEuc2V0KGV4
dHJhRGF0YSk7Cit9CisKK3ZvaWQgV2ViVmlld0hvc3Q6OnNldFBhZ2VUaXRsZShjb25zdCBXZWJT
dHJpbmcmKQoreworICAgIC8vIE5vdGhpbmcgdG8gZG8gaW4gbGF5b3V0IHRlc3QuCit9CisKK3Zv
aWQgV2ViVmlld0hvc3Q6OnNldEFkZHJlc3NCYXJVUkwoY29uc3QgV2ViVVJMJikKK3sKKyAgICAv
LyBOb3RoaW5nIHRvIGRvIGluIGxheW91dCB0ZXN0LgorfQorCisvLyBQYWludGluZyBmdW5jdGlv
bnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tCisKK3ZvaWQgV2ViVmlld0hvc3Q6OnVwZGF0ZVBhaW50UmVjdChjb25zdCBXZWJSZWN0JiBy
ZWN0KQoreworICAgIC8vIG1fcGFpbnRSZWN0ID0gbV9wYWludFJlY3QgVSByZWN0CisgICAgaWYg
KHJlY3QuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisgICAgaWYgKG1fcGFpbnRSZWN0Lmlz
RW1wdHkoKSkgeworICAgICAgICBtX3BhaW50UmVjdCA9IHJlY3Q7CisgICAgICAgIHJldHVybjsK
KyAgICB9CisgICAgaW50IGxlZnQgPSBtaW4obV9wYWludFJlY3QueCwgcmVjdC54KTsKKyAgICBp
bnQgdG9wID0gbWluKG1fcGFpbnRSZWN0LnksIHJlY3QueSk7CisgICAgaW50IHJpZ2h0ID0gbWF4
KG1fcGFpbnRSZWN0LnggKyBtX3BhaW50UmVjdC53aWR0aCwgcmVjdC54ICsgcmVjdC53aWR0aCk7
CisgICAgaW50IGJvdHRvbSA9IG1heChtX3BhaW50UmVjdC55ICsgbV9wYWludFJlY3QuaGVpZ2h0
LCByZWN0LnkgKyByZWN0LmhlaWdodCk7CisgICAgbV9wYWludFJlY3QgPSBXZWJSZWN0KGxlZnQs
IHRvcCwgcmlnaHQgLSBsZWZ0LCBib3R0b20gLSB0b3ApOworfQorCit2b2lkIFdlYlZpZXdIb3N0
OjpwYWludFJlY3QoY29uc3QgV2ViUmVjdCYgcmVjdCkKK3sKKyAgICBBU1NFUlQoIW1faXNQYWlu
dGluZyk7CisgICAgQVNTRVJUKGNhbnZhcygpKTsKKyAgICBtX2lzUGFpbnRpbmcgPSB0cnVlOwor
I2lmIFBMQVRGT1JNKENHKQorICAgIHdlYldpZGdldCgpLT5wYWludChtX2NhbnZhcy0+Z2V0VG9w
UGxhdGZvcm1EZXZpY2UoKS5HZXRCaXRtYXBDb250ZXh0KCksIHJlY3QpOworI2Vsc2UKKyAgICB3
ZWJXaWRnZXQoKS0+cGFpbnQobV9jYW52YXMuZ2V0KCksIHJlY3QpOworI2VuZGlmCisgICAgbV9p
c1BhaW50aW5nID0gZmFsc2U7Cit9CisKK3ZvaWQgV2ViVmlld0hvc3Q6OnBhaW50SW52YWxpZGF0
ZWRSZWdpb24oKQoreworICAgIHdlYldpZGdldCgpLT5sYXlvdXQoKTsKKyAgICBXZWJTaXplIHdp
ZGdldFNpemUgPSB3ZWJXaWRnZXQoKS0+c2l6ZSgpOworICAgIFdlYlJlY3QgY2xpZW50UmVjdCgw
LCAwLCB3aWRnZXRTaXplLndpZHRoLCB3aWRnZXRTaXplLmhlaWdodCk7CisKKyAgICAvLyBQYWlu
dCB0aGUgY2FudmFzIGlmIG5lY2Vzc2FyeS4gIEFsbG93IHBhaW50aW5nIHRvIGdlbmVyYXRlIGV4
dHJhIHJlY3RzIHRoZQorICAgIC8vIGZpcnN0IHRpbWUgd2UgY2FsbCBpdC4gIFRoaXMgaXMgbmVj
ZXNzYXJ5IGJlY2F1c2Ugc29tZSBXZWJDb3JlIHJlbmRlcmluZworICAgIC8vIG9iamVjdHMgdXBk
YXRlIHRoZWlyIGxheW91dCBvbmx5IHdoZW4gcGFpbnRlZC4KKyAgICAvLyBTdG9yZSB0aGUgdG90
YWwgYXJlYSBwYWludGVkIGluIHRvdGFsX3BhaW50LiBUaGVuIHRlbGwgdGhlIGdkayB3aW5kb3cK
KyAgICAvLyB0byB1cGRhdGUgdGhhdCBhcmVhIGFmdGVyIHdlJ3JlIGRvbmUgcGFpbnRpbmcgaXQu
CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICAgICAgLy8gbV9wYWludFJl
Y3QgPSBpbnRlcnNlY3QobV9wYWludFJlY3QgLCBjbGllbnRSZWN0KQorICAgICAgICBpbnQgbGVm
dCA9IG1heChtX3BhaW50UmVjdC54LCBjbGllbnRSZWN0LngpOworICAgICAgICBpbnQgdG9wID0g
bWF4KG1fcGFpbnRSZWN0LnksIGNsaWVudFJlY3QueSk7CisgICAgICAgIGludCByaWdodCA9IG1p
bihtX3BhaW50UmVjdC54ICsgbV9wYWludFJlY3Qud2lkdGgsIGNsaWVudFJlY3QueCArIGNsaWVu
dFJlY3Qud2lkdGgpOworICAgICAgICBpbnQgYm90dG9tID0gbWluKG1fcGFpbnRSZWN0LnkgKyBt
X3BhaW50UmVjdC5oZWlnaHQsIGNsaWVudFJlY3QueSArIGNsaWVudFJlY3QuaGVpZ2h0KTsKKyAg
ICAgICAgaWYgKGxlZnQgPj0gcmlnaHQgfHwgdG9wID49IGJvdHRvbSkKKyAgICAgICAgICAgIG1f
cGFpbnRSZWN0ID0gV2ViUmVjdCgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtX3BhaW50
UmVjdCA9IFdlYlJlY3QobGVmdCwgdG9wLCByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCk7CisK
KyAgICAgICAgaWYgKG1fcGFpbnRSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICBXZWJSZWN0IHJlY3QobV9wYWludFJlY3QpOworICAgICAgICBtX3BhaW50UmVj
dCA9IFdlYlJlY3QoKTsKKyAgICAgICAgcGFpbnRSZWN0KHJlY3QpOworICAgICAgICBpZiAoaSA9
PSAxKQorICAgICAgICAgICAgTE9HX0VSUk9SKCJwYWludGluZyBjYXVzZWQgYWRkaXRpb25hbCBp
bnZhbGlkYXRpb25zIik7CisgICAgfQorICAgIEFTU0VSVChtX3BhaW50UmVjdC5pc0VtcHR5KCkp
OworfQorCitQbGF0Zm9ybUNhbnZhcyogV2ViVmlld0hvc3Q6OmNhbnZhcygpCit7CisgICAgaWYg
KG1fY2FudmFzKQorICAgICAgICByZXR1cm4gbV9jYW52YXMuZ2V0KCk7CisgICAgV2ViU2l6ZSB3
aWRnZXRTaXplID0gd2ViV2lkZ2V0KCktPnNpemUoKTsKKyAgICByZXNldFNjcm9sbFJlY3QoKTsK
KyAgICBtX3BhaW50UmVjdCA9IFdlYlJlY3QoMCwgMCwgd2lkZ2V0U2l6ZS53aWR0aCwgd2lkZ2V0
U2l6ZS5oZWlnaHQpOworICAgIG1fY2FudmFzLnNldChuZXcgUGxhdGZvcm1DYW52YXMod2lkZ2V0
U2l6ZS53aWR0aCwgd2lkZ2V0U2l6ZS5oZWlnaHQsIHRydWUpKTsKKyAgICByZXR1cm4gbV9jYW52
YXMuZ2V0KCk7Cit9CisKK3ZvaWQgV2ViVmlld0hvc3Q6OnJlc2V0U2Nyb2xsUmVjdCgpCit7Cit9
CisKK3ZvaWQgV2ViVmlld0hvc3Q6OmRpc2NhcmRCYWNraW5nU3RvcmUoKQoreworICAgIG1fY2Fu
dmFzLmNsZWFyKCk7Cit9CisKKy8vIFBhaW50cyB0aGUgZW50aXJlIGNhbnZhcyBhIHNlbWktdHJh
bnNwYXJlbnQgYmxhY2sgKGdyYXlpc2gpLiBUaGlzIGlzIHVzZWQKKy8vIGJ5IHRoZSBsYXlvdXQg
dGVzdHMgaW4gZmFzdC9yZXBhaW50LiBUaGUgYWxwaGEgdmFsdWUgbWF0Y2hlcyB1cHN0cmVhbS4K
K3ZvaWQgV2ViVmlld0hvc3Q6OmRpc3BsYXlSZXBhaW50TWFzaygpCit7CisgICAgY2FudmFzKCkt
PmRyYXdBUkdCKDE2NywgMCwgMCwgMCk7Cit9CmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9EdW1w
UmVuZGVyVHJlZS9jaHJvbWl1bS9XZWJWaWV3SG9zdC5oIGIvV2ViS2l0VG9vbHMvRHVtcFJlbmRl
clRyZWUvY2hyb21pdW0vV2ViVmlld0hvc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwLi5jMTUyY2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMvRHVtcFJlbmRl
clRyZWUvY2hyb21pdW0vV2ViVmlld0hvc3QuaApAQCAtMCwwICsxLDI2NyBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmli
dXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUg
bmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBw
cm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNw
ZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAi
QVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
CisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgV2Vi
Vmlld0hvc3RfaAorI2RlZmluZSBXZWJWaWV3SG9zdF9oCisKKyNpbmNsdWRlICJUZXN0TmF2aWdh
dGlvbkNvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJwdWJsaWMvV2ViQ3Vyc29ySW5mby5oIgorI2lu
Y2x1ZGUgInB1YmxpYy9XZWJGcmFtZUNsaWVudC5oIgorI2luY2x1ZGUgInB1YmxpYy9XZWJWaWV3
Q2xpZW50LmgiCisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9y
Lmg+CisKK2NsYXNzIExheW91dFRlc3RDb250cm9sbGVyOworY2xhc3MgVGVzdFNoZWxsOworbmFt
ZXNwYWNlIFdlYktpdCB7CitjbGFzcyBXZWJGcmFtZTsKK2NsYXNzIFdlYlVSTDsKK2NsYXNzIFdl
YlVSTEVycm9yOworc3RydWN0IFdlYlJlY3Q7Cit9CituYW1lc3BhY2Ugc2tpYSB7CitjbGFzcyBQ
bGF0Zm9ybUNhbnZhczsKK30KKworY2xhc3MgV2ViVmlld0hvc3QgOiBwdWJsaWMgV2ViS2l0OjpX
ZWJWaWV3Q2xpZW50LCBwdWJsaWMgV2ViS2l0OjpXZWJGcmFtZUNsaWVudCwgcHVibGljIE5hdmln
YXRpb25Ib3N0IHsKKyBwdWJsaWM6CisgICAgV2ViVmlld0hvc3QoVGVzdFNoZWxsKiBzaGVsbCk7
CisgICAgfldlYlZpZXdIb3N0KCk7CisgICAgdm9pZCBzZXRXZWJXaWRnZXQoV2ViS2l0OjpXZWJX
aWRnZXQqIHdpZGdldCkgeyBtX3dlYldpZGdldCA9IHdpZGdldDsgfQorICAgIFdlYktpdDo6V2Vi
Vmlldyogd2ViVmlldygpIGNvbnN0OworICAgIFdlYktpdDo6V2ViV2lkZ2V0KiB3ZWJXaWRnZXQo
KSBjb25zdDsKKyAgICB2b2lkIHJlc2V0KCk7CisgICAgdm9pZCBzZXRTZWxlY3RUcmFpbGluZ1do
aXRlc3BhY2VFbmFibGVkKGJvb2wpOworICAgIHZvaWQgc2V0U21hcnRJbnNlcnREZWxldGVFbmFi
bGVkKGJvb2wpOworICAgIHZvaWQgd2FpdEZvclBvbGljeURlbGVnYXRlKCk7CisgICAgdm9pZCBz
ZXRDdXN0b21Qb2xpY3lEZWxlZ2F0ZShib29sLCBib29sKTsKKyAgICBXZWJLaXQ6OldlYkZyYW1l
KiB0b3BMb2FkaW5nRnJhbWUoKSB7IHJldHVybiBtX3RvcExvYWRpbmdGcmFtZTsgfQorICAgIHZv
aWQgc2V0QmxvY2tSZWRpcmVjdHMoYm9vbCBibG9jaykgeyBtX2Jsb2Nrc1JlZGlyZWN0cyA9IGJs
b2NrOyB9CisgICAgdm9pZCBzZXRSZXF1ZXN0UmV0dXJuTnVsbChib29sIHJldHVybk51bGwpIHsg
bV9yZXF1ZXN0UmV0dXJuTnVsbCA9IHJldHVybk51bGw7IH0KKyAgICB2b2lkIHNldEVkaXRDb21t
YW5kKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOwor
ICAgIHZvaWQgY2xlYXJFZGl0Q29tbWFuZCgpOworICAgIHZvaWQgc2V0UGVuZGluZ0V4dHJhRGF0
YShUZXN0U2hlbGxFeHRyYURhdGEqKTsKKworICAgIHZvaWQgcGFpbnRSZWN0KGNvbnN0IFdlYktp
dDo6V2ViUmVjdCYpOworICAgIHZvaWQgdXBkYXRlUGFpbnRSZWN0KGNvbnN0IFdlYktpdDo6V2Vi
UmVjdCYpOworICAgIHZvaWQgcGFpbnRJbnZhbGlkYXRlZFJlZ2lvbigpOworICAgIHNraWE6OlBs
YXRmb3JtQ2FudmFzKiBjYW52YXMoKTsKKyAgICB2b2lkIGRpc3BsYXlSZXBhaW50TWFzaygpOwor
CisgICAgdm9pZCBsb2FkVVJMRm9yRnJhbWUoY29uc3QgV2ViS2l0OjpXZWJVUkwmLCBjb25zdCBX
ZWJLaXQ6OldlYlN0cmluZyYgZnJhbWVOYW1lKTsKKyAgICBUZXN0TmF2aWdhdGlvbkNvbnRyb2xs
ZXIqIG5hdmlnYXRpb25Db250cm9sbGVyKCkgeyByZXR1cm4gbV9uYXZpZ2F0aW9uQ29udHJvbGxl
ci5nZXQoKTsgfQorCisgICAgLy8gTmF2aWdhdGlvbkhvc3QKKyAgICB2aXJ0dWFsIGJvb2wgbmF2
aWdhdGUoY29uc3QgVGVzdE5hdmlnYXRpb25FbnRyeSYsIGJvb2wgcmVsb2FkKTsKKworICAgIC8v
IFdlYktpdDo6V2ViVmlld0NsaWVudAorICAgIHZpcnR1YWwgV2ViS2l0OjpXZWJWaWV3KiBjcmVh
dGVWaWV3KFdlYktpdDo6V2ViRnJhbWUqKTsKKyAgICB2aXJ0dWFsIFdlYktpdDo6V2ViV2lkZ2V0
KiBjcmVhdGVQb3B1cE1lbnUoYm9vbCBhY3RpdmF0YWJsZSk7CisgICAgdmlydHVhbCBXZWJLaXQ6
OldlYldpZGdldCogY3JlYXRlUG9wdXBNZW51KGNvbnN0IFdlYktpdDo6V2ViUG9wdXBNZW51SW5m
byYpOworICAgIHZpcnR1YWwgV2ViS2l0OjpXZWJTdG9yYWdlTmFtZXNwYWNlKiBjcmVhdGVTZXNz
aW9uU3RvcmFnZU5hbWVzcGFjZSgpOworICAgIHZpcnR1YWwgdm9pZCBkaWRBZGRNZXNzYWdlVG9D
b25zb2xlKGNvbnN0IFdlYktpdDo6V2ViQ29uc29sZU1lc3NhZ2UmLCBjb25zdCBXZWJLaXQ6Oldl
YlN0cmluZyYgc291cmNlTmFtZSwgdW5zaWduZWQgc291cmNlTGluZSk7CisgICAgdmlydHVhbCB2
b2lkIGRpZFN0YXJ0TG9hZGluZygpOworICAgIHZpcnR1YWwgdm9pZCBkaWRTdG9wTG9hZGluZygp
OworICAgIHZpcnR1YWwgYm9vbCBzaG91bGRCZWdpbkVkaXRpbmcoY29uc3QgV2ViS2l0OjpXZWJS
YW5nZSYpOworICAgIHZpcnR1YWwgYm9vbCBzaG91bGRFbmRFZGl0aW5nKGNvbnN0IFdlYktpdDo6
V2ViUmFuZ2UmKTsKKyAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkSW5zZXJ0Tm9kZShjb25zdCBXZWJL
aXQ6OldlYk5vZGUmLCBjb25zdCBXZWJLaXQ6OldlYlJhbmdlJiwgV2ViS2l0OjpXZWJFZGl0aW5n
QWN0aW9uKTsKKyAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkSW5zZXJ0VGV4dChjb25zdCBXZWJLaXQ6
OldlYlN0cmluZyYsIGNvbnN0IFdlYktpdDo6V2ViUmFuZ2UmLCBXZWJLaXQ6OldlYkVkaXRpbmdB
Y3Rpb24pOworICAgIHZpcnR1YWwgYm9vbCBzaG91bGRDaGFuZ2VTZWxlY3RlZFJhbmdlKGNvbnN0
IFdlYktpdDo6V2ViUmFuZ2UmIGZyb20sIGNvbnN0IFdlYktpdDo6V2ViUmFuZ2UmIHRvLCBXZWJL
aXQ6OldlYlRleHRBZmZpbml0eSwgYm9vbCBzdGlsbFNlbGVjdGluZyk7CisgICAgdmlydHVhbCBi
b29sIHNob3VsZERlbGV0ZVJhbmdlKGNvbnN0IFdlYktpdDo6V2ViUmFuZ2UmKTsKKyAgICB2aXJ0
dWFsIGJvb2wgc2hvdWxkQXBwbHlTdHlsZShjb25zdCBXZWJLaXQ6OldlYlN0cmluZyYgc3R5bGUs
IGNvbnN0IFdlYktpdDo6V2ViUmFuZ2UmKTsKKyAgICB2aXJ0dWFsIGJvb2wgaXNTbWFydEluc2Vy
dERlbGV0ZUVuYWJsZWQoKTsKKyAgICB2aXJ0dWFsIGJvb2wgaXNTZWxlY3RUcmFpbGluZ1doaXRl
c3BhY2VFbmFibGVkKCk7CisgICAgdmlydHVhbCB2b2lkIGRpZEJlZ2luRWRpdGluZygpOworICAg
IHZpcnR1YWwgdm9pZCBkaWRDaGFuZ2VTZWxlY3Rpb24oYm9vbCBpc1NlbGVjdGlvbkVtcHR5KTsK
KyAgICB2aXJ0dWFsIHZvaWQgZGlkQ2hhbmdlQ29udGVudHMoKTsKKyAgICB2aXJ0dWFsIHZvaWQg
ZGlkRW5kRWRpdGluZygpOworICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVDdXJyZW50S2V5Ym9hcmRF
dmVudCgpOworICAgIHZpcnR1YWwgdm9pZCBzcGVsbENoZWNrKGNvbnN0IFdlYktpdDo6V2ViU3Ry
aW5nJiwgaW50JiBvZmZzZXQsIGludCYgbGVuZ3RoKTsKKyAgICB2aXJ0dWFsIFdlYktpdDo6V2Vi
U3RyaW5nIGF1dG9Db3JyZWN0V29yZChjb25zdCBXZWJLaXQ6OldlYlN0cmluZyYpOworICAgIHZp
cnR1YWwgdm9pZCBydW5Nb2RhbEFsZXJ0RGlhbG9nKFdlYktpdDo6V2ViRnJhbWUqLCBjb25zdCBX
ZWJLaXQ6OldlYlN0cmluZyYpOworICAgIHZpcnR1YWwgYm9vbCBydW5Nb2RhbENvbmZpcm1EaWFs
b2coV2ViS2l0OjpXZWJGcmFtZSosIGNvbnN0IFdlYktpdDo6V2ViU3RyaW5nJik7CisgICAgdmly
dHVhbCBib29sIHJ1bk1vZGFsUHJvbXB0RGlhbG9nKFdlYktpdDo6V2ViRnJhbWUqLCBjb25zdCBX
ZWJLaXQ6OldlYlN0cmluZyYgbWVzc2FnZSwgY29uc3QgV2ViS2l0OjpXZWJTdHJpbmcmIGRlZmF1
bHRWYWx1ZSwgV2ViS2l0OjpXZWJTdHJpbmcqIGFjdHVhbFZhbHVlKTsKKyAgICB2aXJ0dWFsIGJv
b2wgcnVuTW9kYWxCZWZvcmVVbmxvYWREaWFsb2coV2ViS2l0OjpXZWJGcmFtZSosIGNvbnN0IFdl
YktpdDo6V2ViU3RyaW5nJik7CisgICAgdmlydHVhbCB2b2lkIHNob3dDb250ZXh0TWVudShXZWJL
aXQ6OldlYkZyYW1lKiwgY29uc3QgV2ViS2l0OjpXZWJDb250ZXh0TWVudURhdGEmKTsKKyAgICB2
aXJ0dWFsIHZvaWQgc2V0U3RhdHVzVGV4dChjb25zdCBXZWJLaXQ6OldlYlN0cmluZyYpOworICAg
IHZpcnR1YWwgdm9pZCBzdGFydERyYWdnaW5nKGNvbnN0IFdlYktpdDo6V2ViUG9pbnQmLCBjb25z
dCBXZWJLaXQ6OldlYkRyYWdEYXRhJiwgV2ViS2l0OjpXZWJEcmFnT3BlcmF0aW9uc01hc2spOwor
ICAgIHZpcnR1YWwgdm9pZCBuYXZpZ2F0ZUJhY2tGb3J3YXJkU29vbihpbnQgb2Zmc2V0KTsKKyAg
ICB2aXJ0dWFsIGludCBoaXN0b3J5QmFja0xpc3RDb3VudCgpOworICAgIHZpcnR1YWwgaW50IGhp
c3RvcnlGb3J3YXJkTGlzdENvdW50KCk7CisgICAgdmlydHVhbCB2b2lkIGZvY3VzQWNjZXNzaWJp
bGl0eU9iamVjdChjb25zdCBXZWJLaXQ6OldlYkFjY2Vzc2liaWxpdHlPYmplY3QmKTsKKworICAg
IC8vIFdlYktpdDo6V2ViV2lkZ2V0Q2xpZW50CisgICAgdmlydHVhbCB2b2lkIGRpZEludmFsaWRh
dGVSZWN0KGNvbnN0IFdlYktpdDo6V2ViUmVjdCYpOworICAgIHZpcnR1YWwgdm9pZCBkaWRTY3Jv
bGxSZWN0KGludCBkeCwgaW50IGR5LCBjb25zdCBXZWJLaXQ6OldlYlJlY3QmKTsKKyAgICB2aXJ0
dWFsIHZvaWQgZGlkRm9jdXMoKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlkQmx1cigpOworICAgIHZp
cnR1YWwgdm9pZCBkaWRDaGFuZ2VDdXJzb3IoY29uc3QgV2ViS2l0OjpXZWJDdXJzb3JJbmZvJik7
CisgICAgdmlydHVhbCB2b2lkIGNsb3NlV2lkZ2V0U29vbigpOworICAgIHZpcnR1YWwgdm9pZCBz
aG93KFdlYktpdDo6V2ViTmF2aWdhdGlvblBvbGljeSk7CisgICAgdmlydHVhbCB2b2lkIHJ1bk1v
ZGFsKCk7CisgICAgdmlydHVhbCBXZWJLaXQ6OldlYlJlY3Qgd2luZG93UmVjdCgpOworICAgIHZp
cnR1YWwgdm9pZCBzZXRXaW5kb3dSZWN0KGNvbnN0IFdlYktpdDo6V2ViUmVjdCYpOworICAgIHZp
cnR1YWwgV2ViS2l0OjpXZWJSZWN0IHJvb3RXaW5kb3dSZWN0KCk7CisgICAgdmlydHVhbCBXZWJL
aXQ6OldlYlJlY3Qgd2luZG93UmVzaXplclJlY3QoKTsKKyAgICB2aXJ0dWFsIFdlYktpdDo6V2Vi
U2NyZWVuSW5mbyBzY3JlZW5JbmZvKCk7CisKKyAgICAvLyBXZWJLaXQ6OldlYkZyYW1lQ2xpZW50
CisgICAgdmlydHVhbCBXZWJLaXQ6OldlYlBsdWdpbiogY3JlYXRlUGx1Z2luKFdlYktpdDo6V2Vi
RnJhbWUqLCBjb25zdCBXZWJLaXQ6OldlYlBsdWdpblBhcmFtcyYpOworICAgIHZpcnR1YWwgV2Vi
S2l0OjpXZWJXb3JrZXIqIGNyZWF0ZVdvcmtlcihXZWJLaXQ6OldlYkZyYW1lKiwgV2ViS2l0OjpX
ZWJXb3JrZXJDbGllbnQqKTsKKyAgICB2aXJ0dWFsIFdlYktpdDo6V2ViTWVkaWFQbGF5ZXIqIGNy
ZWF0ZU1lZGlhUGxheWVyKFdlYktpdDo6V2ViRnJhbWUqLCBXZWJLaXQ6OldlYk1lZGlhUGxheWVy
Q2xpZW50Kik7CisgICAgdmlydHVhbCBib29sIGFsbG93UGx1Z2lucyhXZWJLaXQ6OldlYkZyYW1l
KiwgYm9vbCBlbmFibGVkUGVyU2V0dGluZ3MpOworICAgIHZpcnR1YWwgYm9vbCBhbGxvd0ltYWdl
cyhXZWJLaXQ6OldlYkZyYW1lKiwgYm9vbCBlbmFibGVkUGVyU2V0dGluZ3MpOworICAgIHZpcnR1
YWwgdm9pZCBsb2FkVVJMRXh0ZXJuYWxseShXZWJLaXQ6OldlYkZyYW1lKiwgY29uc3QgV2ViS2l0
OjpXZWJVUkxSZXF1ZXN0JiwgV2ViS2l0OjpXZWJOYXZpZ2F0aW9uUG9saWN5KTsKKyAgICB2aXJ0
dWFsIFdlYktpdDo6V2ViTmF2aWdhdGlvblBvbGljeSBkZWNpZGVQb2xpY3lGb3JOYXZpZ2F0aW9u
KAorICAgICAgICBXZWJLaXQ6OldlYkZyYW1lKiwgY29uc3QgV2ViS2l0OjpXZWJVUkxSZXF1ZXN0
JiwKKyAgICAgICAgV2ViS2l0OjpXZWJOYXZpZ2F0aW9uVHlwZSwgY29uc3QgV2ViS2l0OjpXZWJO
b2RlJiwKKyAgICAgICAgV2ViS2l0OjpXZWJOYXZpZ2F0aW9uUG9saWN5LCBib29sIGlzUmVkaXJl
Y3QpOworICAgIHZpcnR1YWwgYm9vbCBjYW5IYW5kbGVSZXF1ZXN0KFdlYktpdDo6V2ViRnJhbWUq
LCBjb25zdCBXZWJLaXQ6OldlYlVSTFJlcXVlc3QmKTsKKyAgICB2aXJ0dWFsIFdlYktpdDo6V2Vi
VVJMRXJyb3IgY2Fubm90SGFuZGxlUmVxdWVzdEVycm9yKFdlYktpdDo6V2ViRnJhbWUqLCBjb25z
dCBXZWJLaXQ6OldlYlVSTFJlcXVlc3QmKTsKKyAgICB2aXJ0dWFsIFdlYktpdDo6V2ViVVJMRXJy
b3IgY2FuY2VsbGVkRXJyb3IoV2ViS2l0OjpXZWJGcmFtZSosIGNvbnN0IFdlYktpdDo6V2ViVVJM
UmVxdWVzdCYpOworICAgIHZpcnR1YWwgdm9pZCB1bmFibGVUb0ltcGxlbWVudFBvbGljeVdpdGhF
cnJvcihXZWJLaXQ6OldlYkZyYW1lKiwgY29uc3QgV2ViS2l0OjpXZWJVUkxFcnJvciYpOworICAg
IHZpcnR1YWwgdm9pZCB3aWxsUGVyZm9ybUNsaWVudFJlZGlyZWN0KAorICAgICAgICBXZWJLaXQ6
OldlYkZyYW1lKiwgY29uc3QgV2ViS2l0OjpXZWJVUkwmIGZyb20sIGNvbnN0IFdlYktpdDo6V2Vi
VVJMJiB0bywKKyAgICAgICAgZG91YmxlIGludGVydmFsLCBkb3VibGUgZmlyZVRpbWUpOworICAg
IHZpcnR1YWwgdm9pZCBkaWRDYW5jZWxDbGllbnRSZWRpcmVjdChXZWJLaXQ6OldlYkZyYW1lKik7
CisgICAgdmlydHVhbCB2b2lkIGRpZENyZWF0ZURhdGFTb3VyY2UoV2ViS2l0OjpXZWJGcmFtZSos
IFdlYktpdDo6V2ViRGF0YVNvdXJjZSopOworICAgIHZpcnR1YWwgdm9pZCBkaWRTdGFydFByb3Zp
c2lvbmFsTG9hZChXZWJLaXQ6OldlYkZyYW1lKik7CisgICAgdmlydHVhbCB2b2lkIGRpZFJlY2Vp
dmVTZXJ2ZXJSZWRpcmVjdEZvclByb3Zpc2lvbmFsTG9hZChXZWJLaXQ6OldlYkZyYW1lKik7Cisg
ICAgdmlydHVhbCB2b2lkIGRpZEZhaWxQcm92aXNpb25hbExvYWQoV2ViS2l0OjpXZWJGcmFtZSos
IGNvbnN0IFdlYktpdDo6V2ViVVJMRXJyb3ImKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlkQ29tbWl0
UHJvdmlzaW9uYWxMb2FkKFdlYktpdDo6V2ViRnJhbWUqLCBib29sIGlzTmV3TmF2aWdhdGlvbik7
CisgICAgdmlydHVhbCB2b2lkIGRpZENsZWFyV2luZG93T2JqZWN0KFdlYktpdDo6V2ViRnJhbWUq
KTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlkUmVjZWl2ZVRpdGxlKFdlYktpdDo6V2ViRnJhbWUqLCBj
b25zdCBXZWJLaXQ6OldlYlN0cmluZyYpOworICAgIHZpcnR1YWwgdm9pZCBkaWRGaW5pc2hEb2N1
bWVudExvYWQoV2ViS2l0OjpXZWJGcmFtZSopOworICAgIHZpcnR1YWwgdm9pZCBkaWRIYW5kbGVP
bmxvYWRFdmVudHMoV2ViS2l0OjpXZWJGcmFtZSopOworICAgIHZpcnR1YWwgdm9pZCBkaWRGYWls
TG9hZChXZWJLaXQ6OldlYkZyYW1lKiwgY29uc3QgV2ViS2l0OjpXZWJVUkxFcnJvciYpOworICAg
IHZpcnR1YWwgdm9pZCBkaWRGaW5pc2hMb2FkKFdlYktpdDo6V2ViRnJhbWUqKTsKKyAgICB2aXJ0
dWFsIHZvaWQgZGlkQ2hhbmdlTG9jYXRpb25XaXRoaW5QYWdlKFdlYktpdDo6V2ViRnJhbWUqLCBi
b29sIGlzTmV3TmF2aWdhdGlvbik7CisgICAgdmlydHVhbCB2b2lkIGFzc2lnbklkZW50aWZpZXJU
b1JlcXVlc3QoV2ViS2l0OjpXZWJGcmFtZSosIHVuc2lnbmVkIGlkZW50aWZpZXIsIGNvbnN0IFdl
YktpdDo6V2ViVVJMUmVxdWVzdCYpOworICAgIHZpcnR1YWwgdm9pZCB3aWxsU2VuZFJlcXVlc3Qo
V2ViS2l0OjpXZWJGcmFtZSosIHVuc2lnbmVkIGlkZW50aWZpZXIsIFdlYktpdDo6V2ViVVJMUmVx
dWVzdCYsIGNvbnN0IFdlYktpdDo6V2ViVVJMUmVzcG9uc2UmKTsKKyAgICB2aXJ0dWFsIHZvaWQg
ZGlkUmVjZWl2ZVJlc3BvbnNlKFdlYktpdDo6V2ViRnJhbWUqLCB1bnNpZ25lZCBpZGVudGlmaWVy
LCBjb25zdCBXZWJLaXQ6OldlYlVSTFJlc3BvbnNlJik7CisgICAgdmlydHVhbCB2b2lkIGRpZEZp
bmlzaFJlc291cmNlTG9hZChXZWJLaXQ6OldlYkZyYW1lKiwgdW5zaWduZWQgaWRlbnRpZmllcik7
CisgICAgdmlydHVhbCB2b2lkIGRpZEZhaWxSZXNvdXJjZUxvYWQoV2ViS2l0OjpXZWJGcmFtZSos
IHVuc2lnbmVkIGlkZW50aWZpZXIsIGNvbnN0IFdlYktpdDo6V2ViVVJMRXJyb3ImKTsKKyAgICB2
aXJ0dWFsIHZvaWQgZGlkRGlzcGxheUluc2VjdXJlQ29udGVudChXZWJLaXQ6OldlYkZyYW1lKik7
CisgICAgdmlydHVhbCB2b2lkIGRpZFJ1bkluc2VjdXJlQ29udGVudChXZWJLaXQ6OldlYkZyYW1l
KiwgY29uc3QgV2ViS2l0OjpXZWJTZWN1cml0eU9yaWdpbiYpOworICAgIHZpcnR1YWwgYm9vbCBh
bGxvd1NjcmlwdChXZWJLaXQ6OldlYkZyYW1lKiwgYm9vbCBlbmFibGVkUGVyU2V0dGluZ3MpOwor
Citwcml2YXRlOgorICAgIExheW91dFRlc3RDb250cm9sbGVyKiBsYXlvdXRUZXN0Q29udHJvbGxl
cigpIGNvbnN0OworCisgICAgLy8gQ2FsbGVkIHRoZSB0aXRsZSBvZiB0aGUgcGFnZSBjaGFuZ2Vz
LgorICAgIC8vIENhbiBiZSB1c2VkIHRvIHVwZGF0ZSB0aGUgdGl0bGUgb2YgdGhlIHdpbmRvdy4K
KyAgICB2b2lkIHNldFBhZ2VUaXRsZShjb25zdCBXZWJLaXQ6OldlYlN0cmluZyYpOworCisgICAg
Ly8gQ2FsbGVkIHdoZW4gdGhlIFVSTCBvZiB0aGUgcGFnZSBjaGFuZ2VzLgorICAgIC8vIEV4dHJh
Y3RzIHRoZSBVUkwgYW5kIGZvcndhcmRzIG9uIHRvIFNldEFkZHJlc3NCYXJVUkwoKS4KKyAgICB2
b2lkIHVwZGF0ZUFkZHJlc3NCYXIoV2ViS2l0OjpXZWJWaWV3Kik7CisKKyAgICAvLyBDYWxsZWQg
d2hlbiB0aGUgVVJMIG9mIHRoZSBwYWdlIGNoYW5nZXMuCisgICAgLy8gU2hvdWxkIGJlIHVzZWQg
dG8gdXBkYXRlIHRoZSB0ZXh0IG9mIHRoZSBVUkwgYmFyLgorICAgIHZvaWQgc2V0QWRkcmVzc0Jh
clVSTChjb25zdCBXZWJLaXQ6OldlYlVSTCYpOworCisgICAgLy8gSW4gdGhlIE1hYyBjb2RlLCB0
aGlzIGlzIGNhbGxlZCB0byB0cmlnZ2VyIHRoZSBlbmQgb2YgYSB0ZXN0IGFmdGVyIHRoZQorICAg
IC8vIHBhZ2UgaGFzIGZpbmlzaGVkIGxvYWRpbmcuICBGcm9tIGhlcmUsIHdlIGNhbiBnZW5lcmF0
ZSB0aGUgZHVtcCBmb3IgdGhlCisgICAgLy8gdGVzdC4KKyAgICB2b2lkIGxvY2F0aW9uQ2hhbmdl
RG9uZShXZWJLaXQ6OldlYkZyYW1lKik7CisKKyAgICB2b2lkIHVwZGF0ZUZvckNvbW1pdHRlZExv
YWQoV2ViS2l0OjpXZWJGcmFtZSosIGJvb2wgaXNOZXdOYXZpZ2F0aW9uKTsKKyAgICB2b2lkIHVw
ZGF0ZVVSTChXZWJLaXQ6OldlYkZyYW1lKik7CisgICAgdm9pZCB1cGRhdGVTZXNzaW9uSGlzdG9y
eShXZWJLaXQ6OldlYkZyYW1lKik7CisKKyAgICAvLyBEdW1waW5nIGEgZnJhbWUgdG8gdGhlIGNv
bnNvbGUuCisgICAgdm9pZCBwcmludEZyYW1lRGVzY3JpcHRpb24oV2ViS2l0OjpXZWJGcmFtZSop
OworCisgICAgYm9vbCBoYXNXaW5kb3coKSBjb25zdCB7IHJldHVybiBtX2hhc1dpbmRvdzsgfQor
ICAgIHZvaWQgcmVzZXRTY3JvbGxSZWN0KCk7CisgICAgdm9pZCBkaXNjYXJkQmFja2luZ1N0b3Jl
KCk7CisKKyAgICAvLyBDYXVzZXMgbmF2aWdhdGlvbiBhY3Rpb25zIGp1c3QgcHJpbnRvdXQgdGhl
IGludGVuZGVkIG5hdmlnYXRpb24gaW5zdGVhZAorICAgIC8vIG9mIHRha2luZyB5b3UgdG8gdGhl
IHBhZ2UuIFRoaXMgaXMgdXNlZCBmb3IgY2FzZXMgbGlrZSBtYWlsdG8sIHdoZXJlIHlvdQorICAg
IC8vIGRvbid0IGFjdHVhbGx5IHdhbnQgdG8gb3BlbiB0aGUgbWFpbCBwcm9ncmFtLgorICAgIGJv
b2wgbV9wb2xpY3lEZWxlZ2F0ZUVuYWJsZWQ7CisKKyAgICAvLyBUb2dnbGVzIHRoZSBiZWhhdmlv
ciBvZiB0aGUgcG9saWN5IGRlbGVnYXRlLiAgSWYgdHJ1ZSwgdGhlbiBuYXZpZ2F0aW9ucworICAg
IC8vIHdpbGwgYmUgYWxsb3dlZC4gIE90aGVyd2lzZSwgdGhleSB3aWxsIGJlIGlnbm9yZWQgKGRy
b3BwZWQpLgorICAgIGJvb2wgbV9wb2xpY3lEZWxlZ2F0ZUlzUGVybWlzc2l2ZTsKKworICAgIC8v
IElmIHRydWUsIHRoZSBwb2xpY3kgZGVsZWdhdGUgd2lsbCBzaWduYWwgbGF5b3V0IHRlc3QgY29t
cGxldGlvbi4KKyAgICBib29sIG1fcG9saWN5RGVsZWdhdGVTaG91bGROb3RpZnlEb25lOworCisg
ICAgLy8gTm9uLW93bmluZyBwb2ludGVyLiBUaGUgV2ViVmlld0hvc3QgaW5zdGFuY2UgaXMgb3du
ZWQgYnkgdGhpcyBUZXN0U2hlbGwgaW5zdGFuY2UuCisgICAgVGVzdFNoZWxsKiBtX3NoZWxsOwor
CisgICAgLy8gVGhpcyBkZWxlZ2F0ZSB3b3JrcyBmb3IgdGhlIGZvbGxvd2luZyB3aWRnZXQuCisg
ICAgV2ViS2l0OjpXZWJXaWRnZXQqIG1fd2ViV2lkZ2V0OworCisgICAgLy8gVGhpcyBpcyBub24t
MCBJRkYgYSBsb2FkIGlzIGluIHByb2dyZXNzLgorICAgIFdlYktpdDo6V2ViRnJhbWUqIG1fdG9w
TG9hZGluZ0ZyYW1lOworCisgICAgLy8gRm9yIHRyYWNraW5nIHNlc3Npb24gaGlzdG9yeS4gIFNl
ZSBSZW5kZXJWaWV3LgorICAgIGludCBtX3BhZ2VJZDsKKyAgICBpbnQgbV9sYXN0UGFnZUlkVXBk
YXRlZDsKKworICAgIE93blB0cjxUZXN0U2hlbGxFeHRyYURhdGE+IG1fcGVuZGluZ0V4dHJhRGF0
YTsKKworICAgIC8vIE1hcHMgcmVzb3VyY2UgaWRlbnRpZmllcnMgdG8gYSBkZXNjcmlwdGl2ZSBz
dHJpbmcuCisgICAgdHlwZWRlZiBIYXNoTWFwPHVuc2lnbmVkLCBzdGQ6OnN0cmluZz4gUmVzb3Vy
Y2VNYXA7CisgICAgUmVzb3VyY2VNYXAgbV9yZXNvdXJjZUlkZW50aWZpZXJNYXA7CisgICAgdm9p
ZCBwcmludFJlc291cmNlRGVzY3JpcHRpb24odW5zaWduZWQgaWRlbnRpZmllcik7CisKKyAgICBX
ZWJLaXQ6OldlYkN1cnNvckluZm8gbV9jdXJyZW50Q3Vyc29yOworCisgICAgYm9vbCBtX2hhc1dp
bmRvdzsKKyAgICBXZWJLaXQ6OldlYlJlY3QgbV93aW5kb3dSZWN0OworCisgICAgLy8gdHJ1ZSBp
ZiB3ZSB3YW50IHRvIGVuYWJsZSBzbWFydCBpbnNlcnQvZGVsZXRlLgorICAgIGJvb2wgbV9zbWFy
dEluc2VydERlbGV0ZUVuYWJsZWQ7CisKKyAgICAvLyB0cnVlIGlmIHdlIHdhbnQgdG8gZW5hYmxl
IHNlbGVjdGlvbiBvZiB0cmFpbGluZyB3aGl0ZXNwYWNlcworICAgIGJvb2wgbV9zZWxlY3RUcmFp
bGluZ1doaXRlc3BhY2VFbmFibGVkOworCisgICAgLy8gdHJ1ZSBpZiB3ZSBzaG91bGQgYmxvY2sg
YW55IHJlZGlyZWN0cworICAgIGJvb2wgbV9ibG9ja3NSZWRpcmVjdHM7CisKKyAgICAvLyB0cnVl
IGlmIHdlIHNob3VsZCBibG9jayAoc2V0IGFuIGVtcHR5IHJlcXVlc3QgZm9yKSBhbnkgcmVxdWVz
dHMKKyAgICBib29sIG1fcmVxdWVzdFJldHVybk51bGw7CisKKyAgICAvLyBFZGl0IGNvbW1hbmQg
YXNzb2NpYXRlZCB0byB0aGUgY3VycmVudCBrZXlib2FyZCBldmVudC4KKyAgICBzdGQ6OnN0cmlu
ZyBtX2VkaXRDb21tYW5kTmFtZTsKKyAgICBzdGQ6OnN0cmluZyBtX2VkaXRDb21tYW5kVmFsdWU7
CisKKyAgICAvLyBQYWludGluZy4KKyAgICBPd25QdHI8c2tpYTo6UGxhdGZvcm1DYW52YXM+IG1f
Y2FudmFzOworICAgIFdlYktpdDo6V2ViUmVjdCBtX3BhaW50UmVjdDsKKyAgICBib29sIG1faXNQ
YWludGluZzsKKworICAgIE93blB0cjxUZXN0TmF2aWdhdGlvbkNvbnRyb2xsZXIqPiBtX25hdmln
YXRpb25Db250cm9sbGVyOworfTsKKworI2VuZGlmIC8vIFdlYlZpZXdIb3N0X2gKZGlmZiAtLWdp
dCBhL1dlYktpdFRvb2xzL0R1bXBSZW5kZXJUcmVlL2Nocm9taXVtL2NvbmZpZy5oIGIvV2ViS2l0
VG9vbHMvRHVtcFJlbmRlclRyZWUvY2hyb21pdW0vY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMC4uM2I4ZWY1NQotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdFRvb2xz
L0R1bXBSZW5kZXJUcmVlL2Nocm9taXVtL2NvbmZpZy5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlz
dHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3Ig
dGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ug
b3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91
dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwor
ICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9S
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVm
IGNvbmZpZ19oCisjZGVmaW5lIGNvbmZpZ19oCisKKy8vIFRvIGF2b2lkIGNvbmZpY3Qgb2YgTE9H
IGluIHd0Zi9Bc3NlcnRpb25zLmggYW5kIExPRyBpbiBiYXNlL2xvZ2dpbmcuaCwKKy8vIHNraXAg
YmFzZS9sb2dnaW4uaCBieSBkZWZpbmluZyBCQVNFX0xPR0dJTkdfSF8gYW5kIGRlZmluZSBzb21l
IG1hY3JvcworLy8gcHJvdmlkZWQgYnkgYmFzZS9sb2dnaW5nLmguCisvLyBGSVhNRTogUmVtb3Zl
IHRoaXMgaGFjayEKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNkZWZpbmUgQkFTRV9MT0dHSU5HX0hf
CisjZGVmaW5lIENIRUNLKGNvbmRpdGlvbikgd2hpbGUgKGZhbHNlICYmIChjb25kaXRpb24pKSBz
dGQ6OmNlcnIKKyNkZWZpbmUgRENIRUNLKGNvbmRpdGlvbikgd2hpbGUgKGZhbHNlICYmIChjb25k
aXRpb24pKSBzdGQ6OmNlcnIKKyNkZWZpbmUgRENIRUNLX0VRKGEsIGIpIHdoaWxlIChmYWxzZSAm
JiAoYSkgPT0gKGIpKSBzdGQ6OmNlcnIKKyNkZWZpbmUgRENIRUNLX05FKGEsIGIpIHdoaWxlIChm
YWxzZSAmJiAoYSkgIT0gKGIpKSBzdGQ6OmNlcnIKKworI2luY2x1ZGUgPHd0Zi9QbGF0Zm9ybS5o
PgorCisjZW5kaWYgLy8gY29uZmlnX2gK
</data>

          </attachment>
      

    </bug>

</bugzilla>