<?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>56013</bug_id>
          
          <creation_ts>2011-03-09 07:07:33 -0800</creation_ts>
          <short_desc>IndexedDB: Make IDBBackingStore abstract</short_desc>
          <delta_ts>2011-03-11 02:04:53 -0800</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>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Hans Wennborg">hans</reporter>
          <assigned_to name="Hans Wennborg">hans</assigned_to>
          <cc>andreip</cc>
    
    <cc>dgrogan</cc>
    
    <cc>gustavo.noronha</cc>
    
    <cc>gustavo</cc>
    
    <cc>jorlow</cc>
    
    <cc>xan.lopez</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>364480</commentid>
    <comment_count>0</comment_count>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-03-09 07:07:33 -0800</bug_when>
    <thetext>IndexedDB: Make IDBBackingStore abstract</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>364482</commentid>
    <comment_count>1</comment_count>
      <attachid>85171</attachid>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-03-09 07:11:19 -0800</bug_when>
    <thetext>Created attachment 85171
Patch

Uploading manually; webkit-patch upload doesn&apos;t seem to pick up the file rename?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>364488</commentid>
    <comment_count>2</comment_count>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-03-09 07:16:30 -0800</bug_when>
    <thetext>The bulk of the patch is the IDBBackingStore.cpp -&gt; IDBSQLiteBackingStore.cpp rename. Please review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>364500</commentid>
    <comment_count>3</comment_count>
    <who name="Collabora GTK+ EWS bot">gustavo.noronha</who>
    <bug_when>2011-03-09 07:47:01 -0800</bug_when>
    <thetext>Attachment 85171 did not build on gtk:
Build output: http://queues.webkit.org/results/8117435</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>364504</commentid>
    <comment_count>4</comment_count>
      <attachid>85177</attachid>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-03-09 08:06:59 -0800</bug_when>
    <thetext>Created attachment 85177
Patch

Forgot to update GNUmakefile.am. This should make the gtk bot happy.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>365243</commentid>
    <comment_count>5</comment_count>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-03-10 09:20:44 -0800</bug_when>
    <thetext>jeremy: ping?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>365252</commentid>
    <comment_count>6</comment_count>
      <attachid>85177</attachid>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2011-03-10 09:48:01 -0800</bug_when>
    <thetext>Comment on attachment 85177
Patch

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>365891</commentid>
    <comment_count>7</comment_count>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-03-11 02:04:53 -0800</bug_when>
    <thetext>Committed r80834: &lt;http://trac.webkit.org/changeset/80834&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>85171</attachid>
            <date>2011-03-09 07:11:19 -0800</date>
            <delta_ts>2011-03-09 08:06:59 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>patch.patch</filename>
            <type>text/plain</type>
            <size>96070</size>
            <attacher name="Hans Wennborg">hans</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCAwMzAzZWY5Li4wMjE1MGZiIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNjIg
QEAKKzIwMTEtMDMtMDkgIEhhbnMgV2VubmJvcmcgIDxoYW5zQGNocm9taXVtLm9yZz4KKworICAg
ICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJbmRleGVkREI6IE1h
a2UgSURCQmFja2luZ1N0b3JlIGFic3RyYWN0CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQu
b3JnL3Nob3dfYnVnLmNnaT9pZD01NjAxMworCisgICAgICAgIE1ha2UgSURCQmFja2luZ1N0b3Jl
IGFic3RyYWN0IHRvIGFsbG93IGZvciBtdWx0aXBsZSBpbXBsZW1lbnRhdGlvbnMuCisgICAgICAg
IE1vdmUgdGhlIFNRTGl0ZSBpbXBsZW1lbnRhdGlvbiB0byBJREJTUUxpdGVCYWNraW5nU3RvcmUu
CisKKyAgICAgICAgTm8gbmV3IHRlc3RzOiByZWZhY3RvcmluZyBvbmx5LgorCisgICAgICAgICog
V2ViQ29yZS5neXBpOgorICAgICAgICAqIHN0b3JhZ2UvSURCQmFja2luZ1N0b3JlLmg6CisgICAg
ICAgIChXZWJDb3JlOjpJREJCYWNraW5nU3RvcmU6On5JREJCYWNraW5nU3RvcmUpOgorICAgICAg
ICAqIHN0b3JhZ2UvSURCRmFjdG9yeUJhY2tlbmRJbXBsLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
OklEQkZhY3RvcnlCYWNrZW5kSW1wbDo6b3Blbik6CisgICAgICAgICogc3RvcmFnZS9JREJTUUxp
dGVCYWNraW5nU3RvcmUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6SURCU1FMaXRlQmFja2luZ1N0
b3JlOjpJREJTUUxpdGVCYWNraW5nU3RvcmUpOgorICAgICAgICAoV2ViQ29yZTo6SURCU1FMaXRl
QmFja2luZ1N0b3JlOjp+SURCU1FMaXRlQmFja2luZ1N0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6
OnJ1bkNvbW1hbmRzKToKKyAgICAgICAgKFdlYkNvcmU6OmNyZWF0ZVRhYmxlcyk6CisgICAgICAg
IChXZWJDb3JlOjpjcmVhdGVNZXRhRGF0YVRhYmxlKToKKyAgICAgICAgKFdlYkNvcmU6OmdldERh
dGFiYXNlU2NoZW1hVmVyc2lvbik6CisgICAgICAgIChXZWJDb3JlOjptaWdyYXRlRGF0YWJhc2Up
OgorICAgICAgICAoV2ViQ29yZTo6SURCU1FMaXRlQmFja2luZ1N0b3JlOjpvcGVuKToKKyAgICAg
ICAgKFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6ZXh0cmFjdElEQkRhdGFiYXNlTWV0
YURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6SURCU1FMaXRlQmFja2luZ1N0b3JlOjpzZXRJREJE
YXRhYmFzZU1ldGFEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9y
ZTo6Z2V0T2JqZWN0U3RvcmVzKToKKyAgICAgICAgKFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdT
dG9yZTo6Y3JlYXRlT2JqZWN0U3RvcmUpOgorICAgICAgICAoV2ViQ29yZTo6ZG9EZWxldGUpOgor
ICAgICAgICAoV2ViQ29yZTo6SURCU1FMaXRlQmFja2luZ1N0b3JlOjpkZWxldGVPYmplY3RTdG9y
ZSk6CisgICAgICAgIChXZWJDb3JlOjp3aGVyZVN5bnRheEZvcktleSk6CisgICAgICAgIChXZWJD
b3JlOjpiaW5kS2V5VG9RdWVyeSk6CisgICAgICAgIChXZWJDb3JlOjpsb3dlckN1cnNvcldoZXJl
RnJhZ21lbnQpOgorICAgICAgICAoV2ViQ29yZTo6dXBwZXJDdXJzb3JXaGVyZUZyYWdtZW50KToK
KyAgICAgICAgKFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3RvcmVS
ZWNvcmQpOgorICAgICAgICAoV2ViQ29yZTo6YmluZEtleVRvUXVlcnlXaXRoTnVsbHMpOgorICAg
ICAgICAoV2ViQ29yZTo6SURCU1FMaXRlQmFja2luZ1N0b3JlOjpwdXRPYmplY3RTdG9yZVJlY29y
ZCk6CisgICAgICAgIChXZWJDb3JlOjpJREJTUUxpdGVCYWNraW5nU3RvcmU6OmNsZWFyT2JqZWN0
U3RvcmUpOgorICAgICAgICAoV2ViQ29yZTo6SURCU1FMaXRlQmFja2luZ1N0b3JlOjpkZWxldGVP
YmplY3RTdG9yZVJlY29yZCk6CisgICAgICAgIChXZWJDb3JlOjpJREJTUUxpdGVCYWNraW5nU3Rv
cmU6Om5leHRBdXRvSW5jcmVtZW50TnVtYmVyKToKKyAgICAgICAgKFdlYkNvcmU6OklEQlNRTGl0
ZUJhY2tpbmdTdG9yZTo6a2V5RXhpc3RzSW5PYmplY3RTdG9yZSk6CisgICAgICAgIChXZWJDb3Jl
OjpJREJTUUxpdGVCYWNraW5nU3RvcmU6OmZvckVhY2hPYmplY3RTdG9yZVJlY29yZCk6CisgICAg
ICAgIChXZWJDb3JlOjpJREJTUUxpdGVCYWNraW5nU3RvcmU6OmdldEluZGV4ZXMpOgorICAgICAg
ICAoV2ViQ29yZTo6SURCU1FMaXRlQmFja2luZ1N0b3JlOjpjcmVhdGVJbmRleCk6CisgICAgICAg
IChXZWJDb3JlOjpJREJTUUxpdGVCYWNraW5nU3RvcmU6OmRlbGV0ZUluZGV4KToKKyAgICAgICAg
KFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6cHV0SW5kZXhEYXRhRm9yUmVjb3JkKToK
KyAgICAgICAgKFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6ZGVsZXRlSW5kZXhEYXRh
Rm9yUmVjb3JkKToKKyAgICAgICAgKFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Z2V0
T2JqZWN0VmlhSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6a2V5RnJvbVF1ZXJ5KToKKyAgICAg
ICAgKFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Z2V0UHJpbWFyeUtleVZpYUluZGV4
KToKKyAgICAgICAgKFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6a2V5RXhpc3RzSW5J
bmRleCk6CisgICAgICAgIChXZWJDb3JlOjpJREJTUUxpdGVCYWNraW5nU3RvcmU6Om9wZW5PYmpl
Y3RTdG9yZUN1cnNvcik6CisgICAgICAgIChXZWJDb3JlOjpJREJTUUxpdGVCYWNraW5nU3RvcmU6
Om9wZW5JbmRleEtleUN1cnNvcik6CisgICAgICAgIChXZWJDb3JlOjpJREJTUUxpdGVCYWNraW5n
U3RvcmU6Om9wZW5JbmRleEN1cnNvcik6CisgICAgICAgIChXZWJDb3JlOjpJREJTUUxpdGVCYWNr
aW5nU3RvcmU6OmNyZWF0ZVRyYW5zYWN0aW9uKToKKyAgICAgICAgKiBzdG9yYWdlL0lEQlNRTGl0
ZUJhY2tpbmdTdG9yZS5oOiBBZGRlZC4KKwogMjAxMS0wMy0wOCAgSGFucyBXZW5uYm9yZyAgPGhh
bnNAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEplcmVteSBPcmxvdy4KZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaSBiL1NvdXJjZS9XZWJDb3JlL1dl
YkNvcmUuZ3lwaQppbmRleCA4NzVkOTVlLi5iYzllZGRkIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2Vi
Q29yZS9XZWJDb3JlLmd5cGkKKysrIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpCkBAIC00
NTExLDcgKzQ1MTEsNiBAQAogICAgICAgICAgICAgJ3N0b3JhZ2UvRGF0YWJhc2VUcmFja2VyQ2xp
ZW50LmgnLAogICAgICAgICAgICAgJ3N0b3JhZ2UvSURCQW55LmNwcCcsCiAgICAgICAgICAgICAn
c3RvcmFnZS9JREJBbnkuaCcsCi0gICAgICAgICAgICAnc3RvcmFnZS9JREJCYWNraW5nU3RvcmUu
Y3BwJywKICAgICAgICAgICAgICdzdG9yYWdlL0lEQkJhY2tpbmdTdG9yZS5oJywKICAgICAgICAg
ICAgICdzdG9yYWdlL0lEQkNhbGxiYWNrcy5oJywKICAgICAgICAgICAgICdzdG9yYWdlL0lEQkN1
cnNvci5jcHAnLApAQCAtNDU1OCw2ICs0NTU3LDggQEAKICAgICAgICAgICAgICdzdG9yYWdlL0lE
QlBlbmRpbmdUcmFuc2FjdGlvbk1vbml0b3IuaCcsCiAgICAgICAgICAgICAnc3RvcmFnZS9JREJS
ZXF1ZXN0LmNwcCcsCiAgICAgICAgICAgICAnc3RvcmFnZS9JREJSZXF1ZXN0LmgnLAorICAgICAg
ICAgICAgJ3N0b3JhZ2UvSURCU1FMaXRlQmFja2luZ1N0b3JlLmNwcCcsCisgICAgICAgICAgICAn
c3RvcmFnZS9JREJTUUxpdGVCYWNraW5nU3RvcmUuaCcsCiAgICAgICAgICAgICAnc3RvcmFnZS9J
REJUcmFuc2FjdGlvbi5jcHAnLAogICAgICAgICAgICAgJ3N0b3JhZ2UvSURCVHJhbnNhY3Rpb24u
aCcsCiAgICAgICAgICAgICAnc3RvcmFnZS9JREJUcmFuc2FjdGlvbkJhY2tlbmRJbXBsLmNwcCcs
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkJhY2tpbmdTdG9yZS5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkJhY2tpbmdTdG9yZS5jcHAKZGVsZXRlZCBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDM4NTljNGMuLjAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUv
c3RvcmFnZS9JREJCYWNraW5nU3RvcmUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTk2ICswLDAg
QEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0g
KiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKLSAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCi0gKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQotICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiSURCQmFja2luZ1N0b3Jl
LmgiCi0KLSNpZiBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKLQotI2luY2x1ZGUgIkZpbGVTeXN0
ZW0uaCIKLSNpbmNsdWRlICJJREJGYWN0b3J5QmFja2VuZEltcGwuaCIKLSNpbmNsdWRlICJJREJL
ZXkuaCIKLSNpbmNsdWRlICJJREJLZXlSYW5nZS5oIgotI2luY2x1ZGUgIlNRTGl0ZURhdGFiYXNl
LmgiCi0jaW5jbHVkZSAiU1FMaXRlU3RhdGVtZW50LmgiCi0jaW5jbHVkZSAiU1FMaXRlVHJhbnNh
Y3Rpb24uaCIKLSNpbmNsdWRlICJTZWN1cml0eU9yaWdpbi5oIgotCi1uYW1lc3BhY2UgV2ViQ29y
ZSB7Ci0KLUlEQkJhY2tpbmdTdG9yZTo6SURCQmFja2luZ1N0b3JlKFN0cmluZyBpZGVudGlmaWVy
LCBJREJGYWN0b3J5QmFja2VuZEltcGwqIGZhY3RvcnkpCi0gICAgOiBtX2lkZW50aWZpZXIoaWRl
bnRpZmllcikKLSAgICAsIG1fZmFjdG9yeShmYWN0b3J5KQotewotICAgIG1fZmFjdG9yeS0+YWRk
SURCQmFja2luZ1N0b3JlKGlkZW50aWZpZXIsIHRoaXMpOwotfQotCi1JREJCYWNraW5nU3RvcmU6
On5JREJCYWNraW5nU3RvcmUoKQotewotICAgIG1fZmFjdG9yeS0+cmVtb3ZlSURCQmFja2luZ1N0
b3JlKG1faWRlbnRpZmllcik7Ci19Ci0KLXN0YXRpYyBib29sIHJ1bkNvbW1hbmRzKFNRTGl0ZURh
dGFiYXNlJiBzcWxpdGVEYXRhYmFzZSwgY29uc3QgY2hhcioqIGNvbW1hbmRzLCBzaXplX3QgbnVt
YmVyT2ZDb21tYW5kcykKLXsKLSAgICBTUUxpdGVUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbihzcWxp
dGVEYXRhYmFzZSwgZmFsc2UpOwotICAgIHRyYW5zYWN0aW9uLmJlZ2luKCk7Ci0gICAgZm9yIChz
aXplX3QgaSA9IDA7IGkgPCBudW1iZXJPZkNvbW1hbmRzOyArK2kpIHsKLSAgICAgICAgaWYgKCFz
cWxpdGVEYXRhYmFzZS5leGVjdXRlQ29tbWFuZChjb21tYW5kc1tpXSkpIHsKLSAgICAgICAgICAg
IExPR19FUlJPUigiRmFpbGVkIHRvIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQgZm9yIEluZGV4
ZWREQjogJXMiLCBjb21tYW5kc1tpXSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
ICAgIH0KLSAgICB9Ci0gICAgdHJhbnNhY3Rpb24uY29tbWl0KCk7Ci0gICAgcmV0dXJuIHRydWU7
Ci19Ci0KLXN0YXRpYyBib29sIGNyZWF0ZVRhYmxlcyhTUUxpdGVEYXRhYmFzZSYgc3FsaXRlRGF0
YWJhc2UpCi17Ci0gICAgaWYgKHNxbGl0ZURhdGFiYXNlLnRhYmxlRXhpc3RzKCJEYXRhYmFzZXMi
KSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbW1hbmRz
W10gPSB7Ci0gICAgICAgICJDUkVBVEUgVEFCTEUgRGF0YWJhc2VzIChpZCBJTlRFR0VSIFBSSU1B
UlkgS0VZLCBuYW1lIFRFWFQgTk9UIE5VTEwsIGRlc2NyaXB0aW9uIFRFWFQgTk9UIE5VTEwsIHZl
cnNpb24gVEVYVCBOT1QgTlVMTCkiLAotICAgICAgICAiQ1JFQVRFIFVOSVFVRSBJTkRFWCBEYXRh
YmFzZXNfbmFtZSBPTiBEYXRhYmFzZXMobmFtZSkiLAotCi0gICAgICAgICJDUkVBVEUgVEFCTEUg
T2JqZWN0U3RvcmVzIChpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBuYW1lIFRFWFQgTk9UIE5VTEws
IGtleVBhdGggVEVYVCwgZG9BdXRvSW5jcmVtZW50IElOVEVHRVIgTk9UIE5VTEwsIGRhdGFiYXNl
SWQgSU5URUdFUiBOT1QgTlVMTCBSRUZFUkVOQ0VTIERhdGFiYXNlcyhpZCkpIiwKLSAgICAgICAg
IkNSRUFURSBVTklRVUUgSU5ERVggT2JqZWN0U3RvcmVzX2NvbXBvc2l0IE9OIE9iamVjdFN0b3Jl
cyhkYXRhYmFzZUlkLCBuYW1lKSIsCi0KLSAgICAgICAgIkNSRUFURSBUQUJMRSBJbmRleGVzIChp
ZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBvYmplY3RTdG9yZUlkIElOVEVHRVIgTk9UIE5VTEwgUkVG
RVJFTkNFUyBPYmplY3RTdG9yZShpZCksIG5hbWUgVEVYVCBOT1QgTlVMTCwga2V5UGF0aCBURVhU
LCBpc1VuaXF1ZSBJTlRFR0VSIE5PVCBOVUxMKSIsCi0gICAgICAgICJDUkVBVEUgVU5JUVVFIElO
REVYIEluZGV4ZXNfY29tcG9zaXQgT04gSW5kZXhlcyhvYmplY3RTdG9yZUlkLCBuYW1lKSIsCi0K
LSAgICAgICAgIkNSRUFURSBUQUJMRSBPYmplY3RTdG9yZURhdGEgKGlkIElOVEVHRVIgUFJJTUFS
WSBLRVksIG9iamVjdFN0b3JlSWQgSU5URUdFUiBOT1QgTlVMTCBSRUZFUkVOQ0VTIE9iamVjdFN0
b3JlKGlkKSwga2V5U3RyaW5nIFRFWFQsIGtleURhdGUgSU5URUdFUiwga2V5TnVtYmVyIElOVEVH
RVIsIHZhbHVlIFRFWFQgTk9UIE5VTEwpIiwKLSAgICAgICAgIkNSRUFURSBVTklRVUUgSU5ERVgg
T2JqZWN0U3RvcmVEYXRhX2NvbXBvc2l0IE9OIE9iamVjdFN0b3JlRGF0YShrZXlTdHJpbmcsIGtl
eURhdGUsIGtleU51bWJlciwgb2JqZWN0U3RvcmVJZCkiLAotCi0gICAgICAgICJDUkVBVEUgVEFC
TEUgSW5kZXhEYXRhIChpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBpbmRleElkIElOVEVHRVIgTk9U
IE5VTEwgUkVGRVJFTkNFUyBJbmRleGVzKGlkKSwga2V5U3RyaW5nIFRFWFQsIGtleURhdGUgSU5U
RUdFUiwga2V5TnVtYmVyIElOVEVHRVIsIG9iamVjdFN0b3JlRGF0YUlkIElOVEVHRVIgTk9UIE5V
TEwgUkVGRVJFTkNFUyBPYmplY3RTdG9yZURhdGEoaWQpKSIsCi0gICAgICAgICJDUkVBVEUgSU5E
RVggSW5kZXhEYXRhX2NvbXBvc2l0IE9OIEluZGV4RGF0YShrZXlTdHJpbmcsIGtleURhdGUsIGtl
eU51bWJlciwgaW5kZXhJZCkiLAotICAgICAgICAiQ1JFQVRFIElOREVYIEluZGV4RGF0YV9vYmpl
Y3RTdG9yZURhdGFJZCBPTiBJbmRleERhdGEob2JqZWN0U3RvcmVEYXRhSWQpIiwKLSAgICAgICAg
IkNSRUFURSBJTkRFWCBJbmRleERhdGFfaW5kZXhJZCBPTiBJbmRleERhdGEoaW5kZXhJZCkiLAot
ICAgICAgICB9OwotCi0gICAgcmV0dXJuIHJ1bkNvbW1hbmRzKHNxbGl0ZURhdGFiYXNlLCBjb21t
YW5kcywgc2l6ZW9mKGNvbW1hbmRzKSAvIHNpemVvZihjb21tYW5kc1swXSkpOwotfQotCi1zdGF0
aWMgYm9vbCBjcmVhdGVNZXRhRGF0YVRhYmxlKFNRTGl0ZURhdGFiYXNlJiBzcWxpdGVEYXRhYmFz
ZSkKLXsKLSAgICBzdGF0aWMgY29uc3QgY2hhciogY29tbWFuZHNbXSA9IHsKLSAgICAgICAgIkNS
RUFURSBUQUJMRSBNZXRhRGF0YSAobmFtZSBURVhUIFBSSU1BUlkgS0VZLCB2YWx1ZSBOT05FKSIs
Ci0gICAgICAgICJJTlNFUlQgSU5UTyBNZXRhRGF0YSBWQUxVRVMgKCd2ZXJzaW9uJywgMSkiLAot
ICAgIH07Ci0KLSAgICByZXR1cm4gcnVuQ29tbWFuZHMoc3FsaXRlRGF0YWJhc2UsIGNvbW1hbmRz
LCBzaXplb2YoY29tbWFuZHMpIC8gc2l6ZW9mKGNvbW1hbmRzWzBdKSk7Ci19Ci0KLXN0YXRpYyBi
b29sIGdldERhdGFiYXNlU2NoZW1hVmVyc2lvbihTUUxpdGVEYXRhYmFzZSYgc3FsaXRlRGF0YWJh
c2UsIGludCogZGF0YWJhc2VWZXJzaW9uKQotewotICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVyeShz
cWxpdGVEYXRhYmFzZSwgIlNFTEVDVCB2YWx1ZSBGUk9NIE1ldGFEYXRhIFdIRVJFIG5hbWUgPSAn
dmVyc2lvbiciKTsKLSAgICBpZiAocXVlcnkucHJlcGFyZSgpICE9IFNRTFJlc3VsdE9rIHx8IHF1
ZXJ5LnN0ZXAoKSAhPSBTUUxSZXN1bHRSb3cpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAg
ICpkYXRhYmFzZVZlcnNpb24gPSBxdWVyeS5nZXRDb2x1bW5JbnQoMCk7Ci0gICAgcmV0dXJuIHF1
ZXJ5LmZpbmFsaXplKCkgPT0gU1FMUmVzdWx0T2s7Ci19Ci0KLXN0YXRpYyBib29sIG1pZ3JhdGVE
YXRhYmFzZShTUUxpdGVEYXRhYmFzZSYgc3FsaXRlRGF0YWJhc2UpCi17Ci0gICAgaWYgKCFzcWxp
dGVEYXRhYmFzZS50YWJsZUV4aXN0cygiTWV0YURhdGEiKSkgewotICAgICAgICBpZiAoIWNyZWF0
ZU1ldGFEYXRhVGFibGUoc3FsaXRlRGF0YWJhc2UpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgIH0KLQotICAgIGludCBkYXRhYmFzZVZlcnNpb247Ci0gICAgaWYgKCFnZXREYXRhYmFz
ZVNjaGVtYVZlcnNpb24oc3FsaXRlRGF0YWJhc2UsICZkYXRhYmFzZVZlcnNpb24pKQotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoZGF0YWJhc2VWZXJzaW9uID09IDEpIHsKLSAgICAg
ICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbW1hbmRzW10gPSB7Ci0gICAgICAgICAgICAiRFJPUCBU
QUJMRSBJRiBFWElTVFMgT2JqZWN0U3RvcmVEYXRhMiIsCi0gICAgICAgICAgICAiQ1JFQVRFIFRB
QkxFIE9iamVjdFN0b3JlRGF0YTIgKGlkIElOVEVHRVIgUFJJTUFSWSBLRVksIG9iamVjdFN0b3Jl
SWQgSU5URUdFUiBOT1QgTlVMTCBSRUZFUkVOQ0VTIE9iamVjdFN0b3JlKGlkKSwga2V5U3RyaW5n
IFRFWFQsIGtleURhdGUgUkVBTCwga2V5TnVtYmVyIFJFQUwsIHZhbHVlIFRFWFQgTk9UIE5VTEwp
IiwKLSAgICAgICAgICAgICJJTlNFUlQgSU5UTyBPYmplY3RTdG9yZURhdGEyIFNFTEVDVCAqIEZS
T00gT2JqZWN0U3RvcmVEYXRhIiwKLSAgICAgICAgICAgICJEUk9QIFRBQkxFIE9iamVjdFN0b3Jl
RGF0YSIsIC8vIFRoaXMgZGVwZW5kcyBvbiBTUUxpdGUgbm90IGVuZm9yY2luZyByZWZlcmVudGlh
bCBjb25zaXN0ZW5jeS4KLSAgICAgICAgICAgICJBTFRFUiBUQUJMRSBPYmplY3RTdG9yZURhdGEy
IFJFTkFNRSBUTyBPYmplY3RTdG9yZURhdGEiLAotICAgICAgICAgICAgIkNSRUFURSBVTklRVUUg
SU5ERVggT2JqZWN0U3RvcmVEYXRhX2NvbXBvc2l0IE9OIE9iamVjdFN0b3JlRGF0YShrZXlTdHJp
bmcsIGtleURhdGUsIGtleU51bWJlciwgb2JqZWN0U3RvcmVJZCkiLAotICAgICAgICAgICAgIkRS
T1AgVEFCTEUgSUYgRVhJU1RTIEluZGV4RGF0YTIiLCAvLyBUaGlzIGRlcGVuZHMgb24gU1FMaXRl
IG5vdCBlbmZvcmNpbmcgcmVmZXJlbnRpYWwgY29uc2lzdGVuY3kuCi0gICAgICAgICAgICAiQ1JF
QVRFIFRBQkxFIEluZGV4RGF0YTIgKGlkIElOVEVHRVIgUFJJTUFSWSBLRVksIGluZGV4SWQgSU5U
RUdFUiBOT1QgTlVMTCBSRUZFUkVOQ0VTIEluZGV4ZXMoaWQpLCBrZXlTdHJpbmcgVEVYVCwga2V5
RGF0ZSBSRUFMLCBrZXlOdW1iZXIgUkVBTCwgb2JqZWN0U3RvcmVEYXRhSWQgSU5URUdFUiBOT1Qg
TlVMTCBSRUZFUkVOQ0VTIE9iamVjdFN0b3JlRGF0YShpZCkpIiwKLSAgICAgICAgICAgICJJTlNF
UlQgSU5UTyBJbmRleERhdGEyIFNFTEVDVCAqIEZST00gSW5kZXhEYXRhIiwKLSAgICAgICAgICAg
ICJEUk9QIFRBQkxFIEluZGV4RGF0YSIsCi0gICAgICAgICAgICAiQUxURVIgVEFCTEUgSW5kZXhE
YXRhMiBSRU5BTUUgVE8gSW5kZXhEYXRhIiwKLSAgICAgICAgICAgICJDUkVBVEUgSU5ERVggSW5k
ZXhEYXRhX2NvbXBvc2l0IE9OIEluZGV4RGF0YShrZXlTdHJpbmcsIGtleURhdGUsIGtleU51bWJl
ciwgaW5kZXhJZCkiLAotICAgICAgICAgICAgIkNSRUFURSBJTkRFWCBJbmRleERhdGFfb2JqZWN0
U3RvcmVEYXRhSWQgT04gSW5kZXhEYXRhKG9iamVjdFN0b3JlRGF0YUlkKSIsCi0gICAgICAgICAg
ICAiQ1JFQVRFIElOREVYIEluZGV4RGF0YV9pbmRleElkIE9OIEluZGV4RGF0YShpbmRleElkKSIs
Ci0gICAgICAgICAgICAiVVBEQVRFIE1ldGFEYXRhIFNFVCB2YWx1ZSA9IDIgV0hFUkUgbmFtZSA9
ICd2ZXJzaW9uJyIsCi0gICAgICAgIH07Ci0KLSAgICAgICAgaWYgKCFydW5Db21tYW5kcyhzcWxp
dGVEYXRhYmFzZSwgY29tbWFuZHMsIHNpemVvZihjb21tYW5kcykgLyBzaXplb2YoY29tbWFuZHNb
MF0pKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBkYXRhYmFzZVZlcnNp
b24gPSAyOwotICAgIH0KLQotICAgIGlmIChkYXRhYmFzZVZlcnNpb24gPT0gMikgewotICAgICAg
ICAvLyBXZSBuZWVkIHRvIG1ha2UgdGhlIE9iamVjdFN0b3JlRGF0YS52YWx1ZSBiZSBhIEJMT0Ig
aW5zdGVhZCBvZiBURVhULgotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogY29tbWFuZHNbXSA9
IHsKLSAgICAgICAgICAgICJEUk9QIFRBQkxFIElGIEVYSVNUUyBPYmplY3RTdG9yZURhdGEiLCAv
LyBUaGlzIGRyb3BzIGFzc29jaWF0ZWQgaW5kaWNlcy4KLSAgICAgICAgICAgICJDUkVBVEUgVEFC
TEUgT2JqZWN0U3RvcmVEYXRhIChpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBvYmplY3RTdG9yZUlk
IElOVEVHRVIgTk9UIE5VTEwgUkVGRVJFTkNFUyBPYmplY3RTdG9yZShpZCksIGtleVN0cmluZyBU
RVhULCBrZXlEYXRlIFJFQUwsIGtleU51bWJlciBSRUFMLCB2YWx1ZSBCTE9CIE5PVCBOVUxMKSIs
Ci0gICAgICAgICAgICAiQ1JFQVRFIFVOSVFVRSBJTkRFWCBPYmplY3RTdG9yZURhdGFfY29tcG9z
aXQgT04gT2JqZWN0U3RvcmVEYXRhKGtleVN0cmluZywga2V5RGF0ZSwga2V5TnVtYmVyLCBvYmpl
Y3RTdG9yZUlkKSIsCi0gICAgICAgICAgICAiVVBEQVRFIE1ldGFEYXRhIFNFVCB2YWx1ZSA9IDMg
V0hFUkUgbmFtZSA9ICd2ZXJzaW9uJyIsCi0gICAgICAgIH07Ci0KLSAgICAgICAgaWYgKCFydW5D
b21tYW5kcyhzcWxpdGVEYXRhYmFzZSwgY29tbWFuZHMsIHNpemVvZihjb21tYW5kcykgLyBzaXpl
b2YoY29tbWFuZHNbMF0pKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBk
YXRhYmFzZVZlcnNpb24gPSAzOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1QYXNz
UmVmUHRyPElEQkJhY2tpbmdTdG9yZT4gSURCQmFja2luZ1N0b3JlOjpvcGVuKFNlY3VyaXR5T3Jp
Z2luKiBzZWN1cml0eU9yaWdpbiwgY29uc3QgU3RyaW5nJiBwYXRoQmFzZSwgaW50NjRfdCBtYXhp
bXVtU2l6ZSwgY29uc3QgU3RyaW5nJiBmaWxlSWRlbnRpZmllciwgSURCRmFjdG9yeUJhY2tlbmRJ
bXBsKiBmYWN0b3J5KQotewotICAgIFJlZlB0cjxJREJCYWNraW5nU3RvcmU+IGJhY2tpbmdTdG9y
ZShhZG9wdFJlZihuZXcgSURCQmFja2luZ1N0b3JlKGZpbGVJZGVudGlmaWVyLCBmYWN0b3J5KSkp
OwotCi0gICAgU3RyaW5nIHBhdGggPSAiOm1lbW9yeToiOwotICAgIGlmICghcGF0aEJhc2UuaXNF
bXB0eSgpKSB7Ci0gICAgICAgIGlmICghbWFrZUFsbERpcmVjdG9yaWVzKHBhdGhCYXNlKSkgewot
ICAgICAgICAgICAgLy8gRklYTUU6IElzIHRoZXJlIGFueSBvdGhlciB0aGluZyB3ZSBjb3VsZCBw
b3NzaWJseSBkbyB0byByZWNvdmVyIGF0IHRoaXMgcG9pbnQ/IElmIHNvLCBkbyBpdCByYXRoZXIg
dGhhbiBqdXN0IGVycm9yaW5nIG91dC4KLSAgICAgICAgICAgIExPR19FUlJPUigiVW5hYmxlZCB0
byBjcmVhdGUgTG9jYWxTdG9yYWdlIGRhdGFiYXNlIHBhdGggJXMiLCBwYXRoQmFzZS51dGY4KCku
ZGF0YSgpKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHBhdGgg
PSBwYXRoQnlBcHBlbmRpbmdDb21wb25lbnQocGF0aEJhc2UsIHNlY3VyaXR5T3JpZ2luLT5kYXRh
YmFzZUlkZW50aWZpZXIoKSArICIuaW5kZXhlZGRiIik7Ci0gICAgfQotCi0gICAgaWYgKCFiYWNr
aW5nU3RvcmUtPm1fZGIub3BlbihwYXRoKSkgewotICAgICAgICAvLyBGSVhNRTogSXMgdGhlcmUg
YW55IG90aGVyIHRoaW5nIHdlIGNvdWxkIHBvc3NpYmx5IGRvIHRvIHJlY292ZXIgYXQgdGhpcyBw
b2ludD8gSWYgc28sIGRvIGl0IHJhdGhlciB0aGFuIGp1c3QgZXJyb3Jpbmcgb3V0LgotICAgICAg
ICBMT0dfRVJST1IoIkZhaWxlZCB0byBvcGVuIGRhdGFiYXNlIGZpbGUgJXMgZm9yIEluZGV4ZWRE
QiIsIHBhdGgudXRmOCgpLmRhdGEoKSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAg
IC8vIEZJWE1FOiBFcnJvciBjaGVja2luZz8KLSAgICBiYWNraW5nU3RvcmUtPm1fZGIuc2V0TWF4
aW11bVNpemUobWF4aW11bVNpemUpOwotICAgIGJhY2tpbmdTdG9yZS0+bV9kYi50dXJuT25JbmNy
ZW1lbnRhbEF1dG9WYWN1dW0oKTsKLQotICAgIGlmICghY3JlYXRlVGFibGVzKGJhY2tpbmdTdG9y
ZS0+bV9kYikpCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmICghbWlncmF0ZURhdGFiYXNlKGJh
Y2tpbmdTdG9yZS0+bV9kYikpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIGJhY2tp
bmdTdG9yZS5yZWxlYXNlKCk7Ci19Ci0KLWJvb2wgSURCQmFja2luZ1N0b3JlOjpleHRyYWN0SURC
RGF0YWJhc2VNZXRhRGF0YShjb25zdCBTdHJpbmcmIG5hbWUsIFN0cmluZyYgZm91bmRWZXJzaW9u
LCBpbnQ2NF90JiBmb3VuZElkKQotewotICAgIFNRTGl0ZVN0YXRlbWVudCBkYXRhYmFzZVF1ZXJ5
KG1fZGIsICJTRUxFQ1QgaWQsIHZlcnNpb24gRlJPTSBEYXRhYmFzZXMgV0hFUkUgbmFtZSA9ID8i
KTsKLSAgICBpZiAoZGF0YWJhc2VRdWVyeS5wcmVwYXJlKCkgIT0gU1FMUmVzdWx0T2spIHsKLSAg
ICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9
Ci0gICAgZGF0YWJhc2VRdWVyeS5iaW5kVGV4dCgxLCBuYW1lKTsKLSAgICBpZiAoZGF0YWJhc2VR
dWVyeS5zdGVwKCkgIT0gU1FMUmVzdWx0Um93KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAg
ICBmb3VuZElkID0gZGF0YWJhc2VRdWVyeS5nZXRDb2x1bW5JbnQ2NCgwKTsKLSAgICBmb3VuZFZl
cnNpb24gPSBkYXRhYmFzZVF1ZXJ5LmdldENvbHVtblRleHQoMSk7Ci0KLSAgICBpZiAoZGF0YWJh
c2VRdWVyeS5zdGVwKCkgPT0gU1FMUmVzdWx0Um93KQotICAgICAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBJREJCYWNraW5nU3RvcmU6OnNldElE
QkRhdGFiYXNlTWV0YURhdGEoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHZlcnNp
b24sIGludDY0X3QmIHJvd0lkLCBib29sIGludmFsaWRSb3dJZCkKLXsKLSAgICBBU1NFUlQoIW5h
bWUuaXNOdWxsKCkpOwotICAgIEFTU0VSVCghdmVyc2lvbi5pc051bGwoKSk7Ci0KLSAgICBTdHJp
bmcgc3FsID0gaW52YWxpZFJvd0lkID8gIklOU0VSVCBJTlRPIERhdGFiYXNlcyAobmFtZSwgZGVz
Y3JpcHRpb24sIHZlcnNpb24pIFZBTFVFUyAoPywgJycsID8pIiA6ICJVUERBVEUgRGF0YWJhc2Vz
IFNFVCBuYW1lID0gPywgdmVyc2lvbiA9ID8gV0hFUkUgaWQgPSA/IjsKLSAgICBTUUxpdGVTdGF0
ZW1lbnQgcXVlcnkobV9kYiwgc3FsKTsKLSAgICBpZiAocXVlcnkucHJlcGFyZSgpICE9IFNRTFJl
c3VsdE9rKSB7Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgfQotCi0gICAgcXVlcnkuYmluZFRleHQoMSwgbmFtZSk7Ci0gICAgcXVlcnku
YmluZFRleHQoMiwgdmVyc2lvbik7Ci0gICAgaWYgKCFpbnZhbGlkUm93SWQpCi0gICAgICAgIHF1
ZXJ5LmJpbmRJbnQ2NCgzLCByb3dJZCk7Ci0KLSAgICBpZiAocXVlcnkuc3RlcCgpICE9IFNRTFJl
c3VsdERvbmUpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChpbnZhbGlkUm93SWQp
Ci0gICAgICAgIHJvd0lkID0gbV9kYi5sYXN0SW5zZXJ0Um93SUQoKTsKLQotICAgIHJldHVybiB0
cnVlOwotfQotCi12b2lkIElEQkJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3RvcmVzKGludDY0X3Qg
ZGF0YWJhc2VJZCwgVmVjdG9yPGludDY0X3Q+JiBmb3VuZElkcywgVmVjdG9yPFN0cmluZz4mIGZv
dW5kTmFtZXMsIFZlY3RvcjxTdHJpbmc+JiBmb3VuZEtleVBhdGhzLCBWZWN0b3I8Ym9vbD4mIGZv
dW5kQXV0b0luY3JlbWVudEZsYWdzKQotewotICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVyeShtX2Ri
LCAiU0VMRUNUIGlkLCBuYW1lLCBrZXlQYXRoLCBkb0F1dG9JbmNyZW1lbnQgRlJPTSBPYmplY3RT
dG9yZXMgV0hFUkUgZGF0YWJhc2VJZCA9ID8iKTsKLSAgICBib29sIG9rID0gcXVlcnkucHJlcGFy
ZSgpID09IFNRTFJlc3VsdE9rOwotICAgIEFTU0VSVF9VTlVTRUQob2ssIG9rKTsgLy8gRklYTUU6
IEJldHRlciBlcnJvciBoYW5kbGluZz8KLQotICAgIEFTU0VSVChmb3VuZElkcy5pc0VtcHR5KCkp
OwotICAgIEFTU0VSVChmb3VuZE5hbWVzLmlzRW1wdHkoKSk7Ci0gICAgQVNTRVJUKGZvdW5kS2V5
UGF0aHMuaXNFbXB0eSgpKTsKLSAgICBBU1NFUlQoZm91bmRBdXRvSW5jcmVtZW50RmxhZ3MuaXNF
bXB0eSgpKTsKLQotICAgIHF1ZXJ5LmJpbmRJbnQ2NCgxLCBkYXRhYmFzZUlkKTsKLQotICAgIHdo
aWxlIChxdWVyeS5zdGVwKCkgPT0gU1FMUmVzdWx0Um93KSB7Ci0gICAgICAgIGZvdW5kSWRzLmFw
cGVuZChxdWVyeS5nZXRDb2x1bW5JbnQ2NCgwKSk7Ci0gICAgICAgIGZvdW5kTmFtZXMuYXBwZW5k
KHF1ZXJ5LmdldENvbHVtblRleHQoMSkpOwotICAgICAgICBmb3VuZEtleVBhdGhzLmFwcGVuZChx
dWVyeS5nZXRDb2x1bW5UZXh0KDIpKTsKLSAgICAgICAgZm91bmRBdXRvSW5jcmVtZW50RmxhZ3Mu
YXBwZW5kKCEhcXVlcnkuZ2V0Q29sdW1uSW50KDMpKTsKLSAgICB9Ci19Ci0KLWJvb2wgSURCQmFj
a2luZ1N0b3JlOjpjcmVhdGVPYmplY3RTdG9yZShjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0
cmluZyYga2V5UGF0aCwgYm9vbCBhdXRvSW5jcmVtZW50LCBpbnQ2NF90IGRhdGFiYXNlSWQsIGlu
dDY0X3QmIGFzc2lnbmVkT2JqZWN0U3RvcmVJZCkKLXsKLSAgICBTUUxpdGVTdGF0ZW1lbnQgcXVl
cnkobV9kYiwgIklOU0VSVCBJTlRPIE9iamVjdFN0b3JlcyAobmFtZSwga2V5UGF0aCwgZG9BdXRv
SW5jcmVtZW50LCBkYXRhYmFzZUlkKSBWQUxVRVMgKD8sID8sID8sID8pIik7Ci0gICAgaWYgKHF1
ZXJ5LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0g
ICAgcXVlcnkuYmluZFRleHQoMSwgbmFtZSk7Ci0gICAgcXVlcnkuYmluZFRleHQoMiwga2V5UGF0
aCk7Ci0gICAgcXVlcnkuYmluZEludCgzLCBzdGF0aWNfY2FzdDxpbnQ+KGF1dG9JbmNyZW1lbnQp
KTsKLSAgICBxdWVyeS5iaW5kSW50NjQoNCwgZGF0YWJhc2VJZCk7Ci0KLSAgICBpZiAocXVlcnku
c3RlcCgpICE9IFNRTFJlc3VsdERvbmUpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGFz
c2lnbmVkT2JqZWN0U3RvcmVJZCA9IG1fZGIubGFzdEluc2VydFJvd0lEKCk7Ci0gICAgcmV0dXJu
IHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkIGRvRGVsZXRlKFNRTGl0ZURhdGFiYXNlJiBkYiwgY29u
c3QgY2hhciogc3FsLCBpbnQ2NF90IGlkKQotewotICAgIFNRTGl0ZVN0YXRlbWVudCBkZWxldGVR
dWVyeShkYiwgc3FsKTsKLSAgICBib29sIG9rID0gZGVsZXRlUXVlcnkucHJlcGFyZSgpID09IFNR
TFJlc3VsdE9rOwotICAgIEFTU0VSVF9VTlVTRUQob2ssIG9rKTsgLy8gRklYTUU6IEJldHRlciBl
cnJvciBoYW5kbGluZy4KLSAgICBkZWxldGVRdWVyeS5iaW5kSW50NjQoMSwgaWQpOwotICAgIG9r
ID0gZGVsZXRlUXVlcnkuc3RlcCgpID09IFNRTFJlc3VsdERvbmU7Ci0gICAgQVNTRVJUX1VOVVNF
RChvaywgb2spOyAvLyBGSVhNRTogQmV0dGVyIGVycm9yIGhhbmRsaW5nLgotfQotCi12b2lkIElE
QkJhY2tpbmdTdG9yZTo6ZGVsZXRlT2JqZWN0U3RvcmUoaW50NjRfdCBvYmplY3RTdG9yZUlkKQot
ewotICAgIGRvRGVsZXRlKG1fZGIsICJERUxFVEUgRlJPTSBPYmplY3RTdG9yZXMgV0hFUkUgaWQg
PSA/Iiwgb2JqZWN0U3RvcmVJZCk7Ci0gICAgZG9EZWxldGUobV9kYiwgIkRFTEVURSBGUk9NIE9i
amVjdFN0b3JlRGF0YSBXSEVSRSBvYmplY3RTdG9yZUlkID0gPyIsIG9iamVjdFN0b3JlSWQpOwot
ICAgIGRvRGVsZXRlKG1fZGIsICJERUxFVEUgRlJPTSBJbmRleERhdGEgV0hFUkUgaW5kZXhJZCBJ
TiAoU0VMRUNUIGlkIEZST00gSW5kZXhlcyBXSEVSRSBvYmplY3RTdG9yZUlkID0gPykiLCBvYmpl
Y3RTdG9yZUlkKTsKLSAgICBkb0RlbGV0ZShtX2RiLCAiREVMRVRFIEZST00gSW5kZXhlcyBXSEVS
RSBvYmplY3RTdG9yZUlkID0gPyIsIG9iamVjdFN0b3JlSWQpOwotfQotCi1zdGF0aWMgU3RyaW5n
IHdoZXJlU3ludGF4Rm9yS2V5KGNvbnN0IElEQktleSYga2V5LCBTdHJpbmcgcXVhbGlmaWVkVGFi
bGVOYW1lID0gIiIpCi17Ci0gICAgc3dpdGNoIChrZXkudHlwZSgpKSB7Ci0gICAgY2FzZSBJREJL
ZXk6OlN0cmluZ1R5cGU6Ci0gICAgICAgIHJldHVybiBxdWFsaWZpZWRUYWJsZU5hbWUgKyAia2V5
U3RyaW5nID0gPyAgQU5EICAiICsgcXVhbGlmaWVkVGFibGVOYW1lICsgImtleURhdGUgSVMgTlVM
TCAgQU5EICAiICsgcXVhbGlmaWVkVGFibGVOYW1lICsgImtleU51bWJlciBJUyBOVUxMICAiOwot
ICAgIGNhc2UgSURCS2V5OjpOdW1iZXJUeXBlOgotICAgICAgICByZXR1cm4gcXVhbGlmaWVkVGFi
bGVOYW1lICsgImtleVN0cmluZyBJUyBOVUxMICBBTkQgICIgKyBxdWFsaWZpZWRUYWJsZU5hbWUg
KyAia2V5RGF0ZSBJUyBOVUxMICBBTkQgICIgKyBxdWFsaWZpZWRUYWJsZU5hbWUgKyAia2V5TnVt
YmVyID0gPyAgIjsKLSAgICBjYXNlIElEQktleTo6RGF0ZVR5cGU6Ci0gICAgICAgIHJldHVybiBx
dWFsaWZpZWRUYWJsZU5hbWUgKyAia2V5U3RyaW5nIElTIE5VTEwgIEFORCAgIiArIHF1YWxpZmll
ZFRhYmxlTmFtZSArICJrZXlEYXRlID0gPyAgQU5EICAiICsgcXVhbGlmaWVkVGFibGVOYW1lICsg
ImtleU51bWJlciBJUyBOVUxMICAiOwotICAgIGNhc2UgSURCS2V5OjpOdWxsVHlwZToKLSAgICAg
ICAgcmV0dXJuIHF1YWxpZmllZFRhYmxlTmFtZSArICJrZXlTdHJpbmcgSVMgTlVMTCAgQU5EICAi
ICsgcXVhbGlmaWVkVGFibGVOYW1lICsgImtleURhdGUgSVMgTlVMTCAgQU5EICAiICsgcXVhbGlm
aWVkVGFibGVOYW1lICsgImtleU51bWJlciBJUyBOVUxMICAiOwotICAgIH0KLQotICAgIEFTU0VS
VF9OT1RfUkVBQ0hFRCgpOwotICAgIHJldHVybiAiIjsKLX0KLQotLy8gUmV0dXJucyB0aGUgbnVt
YmVyIG9mIGl0ZW1zIGJvdW5kLgotc3RhdGljIGludCBiaW5kS2V5VG9RdWVyeShTUUxpdGVTdGF0
ZW1lbnQmIHF1ZXJ5LCBpbnQgY29sdW1uLCBjb25zdCBJREJLZXkmIGtleSkKLXsKLSAgICBzd2l0
Y2ggKGtleS50eXBlKCkpIHsKLSAgICBjYXNlIElEQktleTo6U3RyaW5nVHlwZToKLSAgICAgICAg
cXVlcnkuYmluZFRleHQoY29sdW1uLCBrZXkuc3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gMTsK
LSAgICBjYXNlIElEQktleTo6RGF0ZVR5cGU6Ci0gICAgICAgIHF1ZXJ5LmJpbmREb3VibGUoY29s
dW1uLCBrZXkuZGF0ZSgpKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSBJREJLZXk6Ok51
bWJlclR5cGU6Ci0gICAgICAgIHF1ZXJ5LmJpbmREb3VibGUoY29sdW1uLCBrZXkubnVtYmVyKCkp
OwotICAgICAgICByZXR1cm4gMTsKLSAgICBjYXNlIElEQktleTo6TnVsbFR5cGU6Ci0gICAgICAg
IHJldHVybiAwOwotICAgIH0KLQotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIHJldHVy
biAwOwotfQotCi1zdGF0aWMgU3RyaW5nIGxvd2VyQ3Vyc29yV2hlcmVGcmFnbWVudChjb25zdCBJ
REJLZXkmIGtleSwgU3RyaW5nIGNvbXBhcmlzb25PcGVyYXRvciwgU3RyaW5nIHF1YWxpZmllZFRh
YmxlTmFtZSA9ICIiKQotewotICAgIHN3aXRjaCAoa2V5LnR5cGUoKSkgewotICAgIGNhc2UgSURC
S2V5OjpTdHJpbmdUeXBlOgotICAgICAgICByZXR1cm4gIj8gIiArIGNvbXBhcmlzb25PcGVyYXRv
ciArICIgIiArIHF1YWxpZmllZFRhYmxlTmFtZSArICJrZXlTdHJpbmcgIEFORCAgIjsKLSAgICBj
YXNlIElEQktleTo6RGF0ZVR5cGU6Ci0gICAgICAgIHJldHVybiAiKD8gIiArIGNvbXBhcmlzb25P
cGVyYXRvciArICIgIiArIHF1YWxpZmllZFRhYmxlTmFtZSArICJrZXlEYXRlICBPUiBOT1QgIiAr
IHF1YWxpZmllZFRhYmxlTmFtZSArICJrZXlTdHJpbmcgSVMgTlVMTCkgIEFORCAgIjsKLSAgICBj
YXNlIElEQktleTo6TnVtYmVyVHlwZToKLSAgICAgICAgcmV0dXJuICIoPyAiICsgY29tcGFyaXNv
bk9wZXJhdG9yICsgIiAiICsgcXVhbGlmaWVkVGFibGVOYW1lICsgImtleU51bWJlciAgT1IgIE5P
VCAiICsgcXVhbGlmaWVkVGFibGVOYW1lICsgImtleVN0cmluZyBJUyBOVUxMICBPUiAgTk9UICIg
KyBxdWFsaWZpZWRUYWJsZU5hbWUgKyAia2V5RGF0ZSBJUyBOVUxMKSAgQU5EICAiOwotICAgIGNh
c2UgSURCS2V5OjpOdWxsVHlwZToKLSAgICAgICAgaWYgKGNvbXBhcmlzb25PcGVyYXRvciA9PSAi
PCIpCi0gICAgICAgICAgICByZXR1cm4gIk5PVCgiICsgcXVhbGlmaWVkVGFibGVOYW1lICsgImtl
eVN0cmluZyBJUyBOVUxMICBBTkQgICIgKyBxdWFsaWZpZWRUYWJsZU5hbWUgKyAia2V5RGF0ZSBJ
UyBOVUxMICBBTkQgICIgKyBxdWFsaWZpZWRUYWJsZU5hbWUgKyAia2V5TnVtYmVyIElTIE5VTEwp
ICBBTkQgICI7Ci0gICAgICAgIHJldHVybiAiIjsgLy8gSWYgaXQncyA9LCB0aGUgdXBwZXIgYm91
bmQgaGFsZiB3aWxsIGRvIHRoZSBjb25zdHJhaW5pbmcuIElmIGl0J3MgPD0sIHRoZW4gdGhhdCdz
IGEgbm8tb3AuCi0gICAgfQotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIHJldHVybiAi
IjsKLX0KLQotc3RhdGljIFN0cmluZyB1cHBlckN1cnNvcldoZXJlRnJhZ21lbnQoY29uc3QgSURC
S2V5JiBrZXksIFN0cmluZyBjb21wYXJpc29uT3BlcmF0b3IsIFN0cmluZyBxdWFsaWZpZWRUYWJs
ZU5hbWUgPSAiIikKLXsKLSAgICBzd2l0Y2ggKGtleS50eXBlKCkpIHsKLSAgICBjYXNlIElEQktl
eTo6U3RyaW5nVHlwZToKLSAgICAgICAgcmV0dXJuICIoIiArIHF1YWxpZmllZFRhYmxlTmFtZSAr
ICJrZXlTdHJpbmcgIiArIGNvbXBhcmlzb25PcGVyYXRvciArICIgPyAgT1IgICIgKyBxdWFsaWZp
ZWRUYWJsZU5hbWUgKyAia2V5U3RyaW5nIElTIE5VTEwpICBBTkQgICI7Ci0gICAgY2FzZSBJREJL
ZXk6OkRhdGVUeXBlOgotICAgICAgICByZXR1cm4gIigiICsgcXVhbGlmaWVkVGFibGVOYW1lICsg
ImtleURhdGUgIiArIGNvbXBhcmlzb25PcGVyYXRvciArICIgPyBPUiAiICsgcXVhbGlmaWVkVGFi
bGVOYW1lICsgImtleURhdGUgSVMgTlVMTCkgIEFORCAgIiArIHF1YWxpZmllZFRhYmxlTmFtZSAr
ICJrZXlTdHJpbmcgSVMgTlVMTCAgQU5EICAiOwotICAgIGNhc2UgSURCS2V5OjpOdW1iZXJUeXBl
OgotICAgICAgICByZXR1cm4gIigiICsgcXVhbGlmaWVkVGFibGVOYW1lICsgImtleU51bWJlciAi
ICsgY29tcGFyaXNvbk9wZXJhdG9yICsgIiA/IE9SICIgKyBxdWFsaWZpZWRUYWJsZU5hbWUgKyAi
a2V5TnVtYmVyIElTIE5VTEwpICBBTkQgICIgKyBxdWFsaWZpZWRUYWJsZU5hbWUgKyAia2V5U3Ry
aW5nIElTIE5VTEwgIEFORCAgIiArIHF1YWxpZmllZFRhYmxlTmFtZSArICJrZXlEYXRlIElTIE5V
TEwgIEFORCAgIjsKLSAgICBjYXNlIElEQktleTo6TnVsbFR5cGU6Ci0gICAgICAgIGlmIChjb21w
YXJpc29uT3BlcmF0b3IgPT0gIjwiKQotICAgICAgICAgICAgcmV0dXJuICIwICE9IDAgIEFORCAg
IjsKLSAgICAgICAgcmV0dXJuIHF1YWxpZmllZFRhYmxlTmFtZSArICJrZXlTdHJpbmcgSVMgTlVM
TCAgQU5EICAiICsgcXVhbGlmaWVkVGFibGVOYW1lICsgImtleURhdGUgSVMgTlVMTCAgQU5EICAi
ICsgcXVhbGlmaWVkVGFibGVOYW1lICsgImtleU51bWJlciBJUyBOVUxMICBBTkQgICI7Ci0gICAg
fQotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIHJldHVybiAiIjsKLX0KLQotU3RyaW5n
IElEQkJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBvYmplY3RTdG9y
ZUlkLCBjb25zdCBJREJLZXkmIGtleSkKLXsKLSAgICBTUUxpdGVTdGF0ZW1lbnQgcXVlcnkobV9k
YiwgIlNFTEVDVCBrZXlTdHJpbmcsIGtleURhdGUsIGtleU51bWJlciwgdmFsdWUgRlJPTSBPYmpl
Y3RTdG9yZURhdGEgV0hFUkUgb2JqZWN0U3RvcmVJZCA9ID8gQU5EICIgKyB3aGVyZVN5bnRheEZv
cktleShrZXkpKTsKLSAgICBib29sIG9rID0gcXVlcnkucHJlcGFyZSgpID09IFNRTFJlc3VsdE9r
OwotICAgIEFTU0VSVF9VTlVTRUQob2ssIG9rKTsgLy8gRklYTUU6IEJldHRlciBlcnJvciBoYW5k
bGluZz8KLQotICAgIHF1ZXJ5LmJpbmRJbnQ2NCgxLCBvYmplY3RTdG9yZUlkKTsKLSAgICBiaW5k
S2V5VG9RdWVyeShxdWVyeSwgMiwga2V5KTsKLSAgICBpZiAocXVlcnkuc3RlcCgpICE9IFNRTFJl
c3VsdFJvdykKLSAgICAgICAgcmV0dXJuIFN0cmluZygpOyAvLyBOdWxsIFN0cmluZyBtZWFucyBy
ZWNvcmQgbm90IGZvdW5kLgotCi0gICAgQVNTRVJUKChrZXkudHlwZSgpID09IElEQktleTo6U3Ry
aW5nVHlwZSkgIT0gcXVlcnkuaXNDb2x1bW5OdWxsKDApKTsKLSAgICBBU1NFUlQoKGtleS50eXBl
KCkgPT0gSURCS2V5OjpEYXRlVHlwZSkgIT0gcXVlcnkuaXNDb2x1bW5OdWxsKDEpKTsKLSAgICBB
U1NFUlQoKGtleS50eXBlKCkgPT0gSURCS2V5OjpOdW1iZXJUeXBlKSAhPSBxdWVyeS5pc0NvbHVt
bk51bGwoMikpOwotCi0gICAgU3RyaW5nIHJlY29yZCA9IHF1ZXJ5LmdldENvbHVtbkJsb2JBc1N0
cmluZygzKTsKLSAgICBBU1NFUlQocXVlcnkuc3RlcCgpICE9IFNRTFJlc3VsdFJvdyk7Ci0KLSAg
ICByZXR1cm4gcmVjb3JkOwotfQotCi1zdGF0aWMgdm9pZCBiaW5kS2V5VG9RdWVyeVdpdGhOdWxs
cyhTUUxpdGVTdGF0ZW1lbnQmIHF1ZXJ5LCBpbnQgYmFzZUNvbHVtbiwgY29uc3QgSURCS2V5JiBr
ZXkpCi17Ci0gICAgc3dpdGNoIChrZXkudHlwZSgpKSB7Ci0gICAgY2FzZSBJREJLZXk6OlN0cmlu
Z1R5cGU6Ci0gICAgICAgIHF1ZXJ5LmJpbmRUZXh0KGJhc2VDb2x1bW4gKyAwLCBrZXkuc3RyaW5n
KCkpOwotICAgICAgICBxdWVyeS5iaW5kTnVsbChiYXNlQ29sdW1uICsgMSk7Ci0gICAgICAgIHF1
ZXJ5LmJpbmROdWxsKGJhc2VDb2x1bW4gKyAyKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJ
REJLZXk6OkRhdGVUeXBlOgotICAgICAgICBxdWVyeS5iaW5kTnVsbChiYXNlQ29sdW1uICsgMCk7
Ci0gICAgICAgIHF1ZXJ5LmJpbmREb3VibGUoYmFzZUNvbHVtbiArIDEsIGtleS5kYXRlKCkpOwot
ICAgICAgICBxdWVyeS5iaW5kTnVsbChiYXNlQ29sdW1uICsgMik7Ci0gICAgICAgIGJyZWFrOwot
ICAgIGNhc2UgSURCS2V5OjpOdW1iZXJUeXBlOgotICAgICAgICBxdWVyeS5iaW5kTnVsbChiYXNl
Q29sdW1uICsgMCk7Ci0gICAgICAgIHF1ZXJ5LmJpbmROdWxsKGJhc2VDb2x1bW4gKyAxKTsKLSAg
ICAgICAgcXVlcnkuYmluZERvdWJsZShiYXNlQ29sdW1uICsgMiwga2V5Lm51bWJlcigpKTsKLSAg
ICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJREJLZXk6Ok51bGxUeXBlOgotICAgICAgICBxdWVyeS5i
aW5kTnVsbChiYXNlQ29sdW1uICsgMCk7Ci0gICAgICAgIHF1ZXJ5LmJpbmROdWxsKGJhc2VDb2x1
bW4gKyAxKTsKLSAgICAgICAgcXVlcnkuYmluZE51bGwoYmFzZUNvbHVtbiArIDIpOwotICAgICAg
ICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAg
ICB9Ci19Ci0KLWJvb2wgSURCQmFja2luZ1N0b3JlOjpwdXRPYmplY3RTdG9yZVJlY29yZChpbnQ2
NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYga2V5LCBjb25zdCBTdHJpbmcmIHZhbHVl
LCBpbnQ2NF90JiByb3dJZCwgYm9vbCBpbnZhbGlkUm93SWQpCi17Ci0gICAgU3RyaW5nIHNxbCA9
ICFpbnZhbGlkUm93SWQgPyAiVVBEQVRFIE9iamVjdFN0b3JlRGF0YSBTRVQga2V5U3RyaW5nID0g
Pywga2V5RGF0ZSA9ID8sIGtleU51bWJlciA9ID8sIHZhbHVlID0gPyBXSEVSRSBpZCA9ID8iCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiSU5TRVJUIElOVE8gT2JqZWN0U3RvcmVE
YXRhIChrZXlTdHJpbmcsIGtleURhdGUsIGtleU51bWJlciwgdmFsdWUsIG9iamVjdFN0b3JlSWQp
IFZBTFVFUyAoPywgPywgPywgPywgPykiOwotICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVyeShtX2Ri
LCBzcWwpOwotICAgIGlmIChxdWVyeS5wcmVwYXJlKCkgIT0gU1FMUmVzdWx0T2spCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgIGJpbmRLZXlUb1F1ZXJ5V2l0aE51bGxzKHF1ZXJ5LCAxLCBr
ZXkpOwotICAgIHF1ZXJ5LmJpbmRCbG9iKDQsIHZhbHVlKTsKLSAgICBpZiAoIWludmFsaWRSb3dJ
ZCkKLSAgICAgICAgcXVlcnkuYmluZEludDY0KDUsIHJvd0lkKTsKLSAgICBlbHNlCi0gICAgICAg
IHF1ZXJ5LmJpbmRJbnQ2NCg1LCBvYmplY3RTdG9yZUlkKTsKLQotICAgIGlmIChxdWVyeS5zdGVw
KCkgIT0gU1FMUmVzdWx0RG9uZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKGlu
dmFsaWRSb3dJZCkKLSAgICAgICAgcm93SWQgPSBtX2RiLmxhc3RJbnNlcnRSb3dJRCgpOwotCi0g
ICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgSURCQmFja2luZ1N0b3JlOjpjbGVhck9iamVjdFN0
b3JlKGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKLXsKLSAgICBkb0RlbGV0ZShtX2RiLCAiREVMRVRF
IEZST00gSW5kZXhEYXRhIFdIRVJFIG9iamVjdFN0b3JlRGF0YUlkIElOIChTRUxFQ1QgaWQgRlJP
TSBPYmplY3RTdG9yZURhdGEgV0hFUkUgb2JqZWN0U3RvcmVJZCA9ID8pIiwgb2JqZWN0U3RvcmVJ
ZCk7Ci0gICAgZG9EZWxldGUobV9kYiwgIkRFTEVURSBGUk9NIE9iamVjdFN0b3JlRGF0YSBXSEVS
RSBvYmplY3RTdG9yZUlkID0gPyIsIG9iamVjdFN0b3JlSWQpOwotfQotCi12b2lkIElEQkJhY2tp
bmdTdG9yZTo6ZGVsZXRlT2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCwgaW50NjRfdCBvYmplY3RT
dG9yZURhdGFJZCkKLXsKLSAgICBTUUxpdGVTdGF0ZW1lbnQgb3NRdWVyeShtX2RiLCAiREVMRVRF
IEZST00gT2JqZWN0U3RvcmVEYXRhIFdIRVJFIGlkID0gPyIpOwotICAgIGJvb2wgb2sgPSBvc1F1
ZXJ5LnByZXBhcmUoKSA9PSBTUUxSZXN1bHRPazsKLSAgICBBU1NFUlRfVU5VU0VEKG9rLCBvayk7
IC8vIEZJWE1FOiBCZXR0ZXIgZXJyb3IgaGFuZGxpbmc/Ci0KLSAgICBvc1F1ZXJ5LmJpbmRJbnQ2
NCgxLCBvYmplY3RTdG9yZURhdGFJZCk7Ci0KLSAgICBvayA9IG9zUXVlcnkuc3RlcCgpID09IFNR
TFJlc3VsdERvbmU7Ci0gICAgQVNTRVJUX1VOVVNFRChvaywgb2spOwotCi0gICAgU1FMaXRlU3Rh
dGVtZW50IGluZGV4UXVlcnkobV9kYiwgIkRFTEVURSBGUk9NIEluZGV4RGF0YSBXSEVSRSBvYmpl
Y3RTdG9yZURhdGFJZCA9ID8iKTsKLSAgICBvayA9IGluZGV4UXVlcnkucHJlcGFyZSgpID09IFNR
TFJlc3VsdE9rOwotICAgIEFTU0VSVF9VTlVTRUQob2ssIG9rKTsgLy8gRklYTUU6IEJldHRlciBl
cnJvciBoYW5kbGluZz8KLQotICAgIGluZGV4UXVlcnkuYmluZEludDY0KDEsIG9iamVjdFN0b3Jl
RGF0YUlkKTsKLQotICAgIG9rID0gaW5kZXhRdWVyeS5zdGVwKCkgPT0gU1FMUmVzdWx0RG9uZTsK
LSAgICBBU1NFUlRfVU5VU0VEKG9rLCBvayk7Ci19Ci0KLWRvdWJsZSBJREJCYWNraW5nU3RvcmU6
Om5leHRBdXRvSW5jcmVtZW50TnVtYmVyKGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKLXsKLSAgICBT
UUxpdGVTdGF0ZW1lbnQgcXVlcnkobV9kYiwgIlNFTEVDVCBtYXgoa2V5TnVtYmVyKSArIDEgRlJP
TSBPYmplY3RTdG9yZURhdGEgV0hFUkUgb2JqZWN0U3RvcmVJZCA9ID8gQU5EIGtleVN0cmluZyBJ
UyBOVUxMIEFORCBrZXlEYXRlIElTIE5VTEwiKTsKLSAgICBib29sIG9rID0gcXVlcnkucHJlcGFy
ZSgpID09IFNRTFJlc3VsdE9rOwotICAgIEFTU0VSVF9VTlVTRUQob2ssIG9rKTsKLQotICAgIHF1
ZXJ5LmJpbmRJbnQ2NCgxLCBvYmplY3RTdG9yZUlkKTsKLQotICAgIGlmIChxdWVyeS5zdGVwKCkg
IT0gU1FMUmVzdWx0Um93IHx8IHF1ZXJ5LmlzQ29sdW1uTnVsbCgwKSkKLSAgICAgICAgcmV0dXJu
IDE7Ci0KLSAgICByZXR1cm4gcXVlcnkuZ2V0Q29sdW1uRG91YmxlKDApOwotfQotCi1ib29sIElE
QkJhY2tpbmdTdG9yZTo6a2V5RXhpc3RzSW5PYmplY3RTdG9yZShpbnQ2NF90IG9iamVjdFN0b3Jl
SWQsIGNvbnN0IElEQktleSYga2V5LCBpbnQ2NF90JiBmb3VuZE9iamVjdFN0b3JlRGF0YUlkKQot
ewotICAgIFN0cmluZyBzcWwgPSBTdHJpbmcoIlNFTEVDVCBpZCBGUk9NIE9iamVjdFN0b3JlRGF0
YSBXSEVSRSBvYmplY3RTdG9yZUlkID0gPyBBTkQgIikgKyB3aGVyZVN5bnRheEZvcktleShrZXkp
OwotICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVyeShtX2RiLCBzcWwpOwotICAgIGJvb2wgb2sgPSBx
dWVyeS5wcmVwYXJlKCkgPT0gU1FMUmVzdWx0T2s7Ci0gICAgQVNTRVJUX1VOVVNFRChvaywgb2sp
OyAvLyBGSVhNRTogQmV0dGVyIGVycm9yIGhhbmRsaW5nPwotCi0gICAgcXVlcnkuYmluZEludDY0
KDEsIG9iamVjdFN0b3JlSWQpOwotICAgIGJpbmRLZXlUb1F1ZXJ5KHF1ZXJ5LCAyLCBrZXkpOwot
Ci0gICAgaWYgKHF1ZXJ5LnN0ZXAoKSAhPSBTUUxSZXN1bHRSb3cpCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLQotICAgIGZvdW5kT2JqZWN0U3RvcmVEYXRhSWQgPSBxdWVyeS5nZXRDb2x1bW5JbnQ2
NCgwKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBJREJCYWNraW5nU3RvcmU6OmZvckVh
Y2hPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlUmVj
b3JkQ2FsbGJhY2smIGNhbGxiYWNrKQotewotICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVyeShtX2Ri
LCAiU0VMRUNUIGlkLCB2YWx1ZSBGUk9NIE9iamVjdFN0b3JlRGF0YSBXSEVSRSBvYmplY3RTdG9y
ZUlkID0gPyIpOwotICAgIGlmIChxdWVyeS5wcmVwYXJlKCkgIT0gU1FMUmVzdWx0T2spCi0gICAg
ICAgIHJldHVybiBmYWxzZTsKLQotICAgIHF1ZXJ5LmJpbmRJbnQ2NCgxLCBvYmplY3RTdG9yZUlk
KTsKLQotICAgIHdoaWxlIChxdWVyeS5zdGVwKCkgPT0gU1FMUmVzdWx0Um93KSB7Ci0gICAgICAg
IGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQgPSBxdWVyeS5nZXRDb2x1bW5JbnQ2NCgwKTsKLSAg
ICAgICAgU3RyaW5nIHZhbHVlID0gcXVlcnkuZ2V0Q29sdW1uQmxvYkFzU3RyaW5nKDEpOwotICAg
ICAgICBpZiAoIWNhbGxiYWNrLmNhbGxiYWNrKG9iamVjdFN0b3JlRGF0YUlkLCB2YWx1ZSkpCi0g
ICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0K
LXZvaWQgSURCQmFja2luZ1N0b3JlOjpnZXRJbmRleGVzKGludDY0X3Qgb2JqZWN0U3RvcmVJZCwg
VmVjdG9yPGludDY0X3Q+JiBmb3VuZElkcywgVmVjdG9yPFN0cmluZz4mIGZvdW5kTmFtZXMsIFZl
Y3RvcjxTdHJpbmc+JiBmb3VuZEtleVBhdGhzLCBWZWN0b3I8Ym9vbD4mIGZvdW5kVW5pcXVlRmxh
Z3MpCi17Ci0gICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGIsICJTRUxFQ1QgaWQsIG5hbWUs
IGtleVBhdGgsIGlzVW5pcXVlIEZST00gSW5kZXhlcyBXSEVSRSBvYmplY3RTdG9yZUlkID0gPyIp
OwotICAgIGJvb2wgb2sgPSBxdWVyeS5wcmVwYXJlKCkgPT0gU1FMUmVzdWx0T2s7Ci0gICAgQVNT
RVJUX1VOVVNFRChvaywgb2spOyAvLyBGSVhNRTogQmV0dGVyIGVycm9yIGhhbmRsaW5nPwotCi0g
ICAgQVNTRVJUKGZvdW5kSWRzLmlzRW1wdHkoKSk7Ci0gICAgQVNTRVJUKGZvdW5kTmFtZXMuaXNF
bXB0eSgpKTsKLSAgICBBU1NFUlQoZm91bmRLZXlQYXRocy5pc0VtcHR5KCkpOwotICAgIEFTU0VS
VChmb3VuZFVuaXF1ZUZsYWdzLmlzRW1wdHkoKSk7Ci0KLSAgICBxdWVyeS5iaW5kSW50NjQoMSwg
b2JqZWN0U3RvcmVJZCk7Ci0KLSAgICB3aGlsZSAocXVlcnkuc3RlcCgpID09IFNRTFJlc3VsdFJv
dykgewotICAgICAgICBmb3VuZElkcy5hcHBlbmQocXVlcnkuZ2V0Q29sdW1uSW50NjQoMCkpOwot
ICAgICAgICBmb3VuZE5hbWVzLmFwcGVuZChxdWVyeS5nZXRDb2x1bW5UZXh0KDEpKTsKLSAgICAg
ICAgZm91bmRLZXlQYXRocy5hcHBlbmQocXVlcnkuZ2V0Q29sdW1uVGV4dCgyKSk7Ci0gICAgICAg
IGZvdW5kVW5pcXVlRmxhZ3MuYXBwZW5kKCEhcXVlcnkuZ2V0Q29sdW1uSW50KDMpKTsKLSAgICB9
Ci19Ci0KLWJvb2wgSURCQmFja2luZ1N0b3JlOjpjcmVhdGVJbmRleChpbnQ2NF90IG9iamVjdFN0
b3JlSWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIGlz
VW5pcXVlLCBpbnQ2NF90JiBpbmRleElkKQotewotICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVyeSht
X2RiLCAiSU5TRVJUIElOVE8gSW5kZXhlcyAob2JqZWN0U3RvcmVJZCwgbmFtZSwga2V5UGF0aCwg
aXNVbmlxdWUpIFZBTFVFUyAoPywgPywgPywgPykiKTsKLSAgICBpZiAocXVlcnkucHJlcGFyZSgp
ICE9IFNRTFJlc3VsdE9rKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBxdWVyeS5iaW5k
SW50NjQoMSwgb2JqZWN0U3RvcmVJZCk7Ci0gICAgcXVlcnkuYmluZFRleHQoMiwgbmFtZSk7Ci0g
ICAgcXVlcnkuYmluZFRleHQoMywga2V5UGF0aCk7Ci0gICAgcXVlcnkuYmluZEludCg0LCBzdGF0
aWNfY2FzdDxpbnQ+KGlzVW5pcXVlKSk7Ci0KLSAgICBpZiAocXVlcnkuc3RlcCgpICE9IFNRTFJl
c3VsdERvbmUpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGluZGV4SWQgPSBtX2RiLmxh
c3RJbnNlcnRSb3dJRCgpOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIElEQkJhY2tpbmdT
dG9yZTo6ZGVsZXRlSW5kZXgoaW50NjRfdCBpbmRleElkKQotewotICAgIGRvRGVsZXRlKG1fZGIs
ICJERUxFVEUgRlJPTSBJbmRleGVzIFdIRVJFIGlkID0gPyIsIGluZGV4SWQpOwotICAgIGRvRGVs
ZXRlKG1fZGIsICJERUxFVEUgRlJPTSBJbmRleERhdGEgV0hFUkUgaW5kZXhJZCA9ID8iLCBpbmRl
eElkKTsKLX0KLQotYm9vbCBJREJCYWNraW5nU3RvcmU6OnB1dEluZGV4RGF0YUZvclJlY29yZChp
bnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYga2V5LCBpbnQ2NF90IG9iamVjdFN0b3JlRGF0
YUlkKQotewotICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVyeShtX2RiLCAiSU5TRVJUIElOVE8gSW5k
ZXhEYXRhIChrZXlTdHJpbmcsIGtleURhdGUsIGtleU51bWJlciwgaW5kZXhJZCwgb2JqZWN0U3Rv
cmVEYXRhSWQpIFZBTFVFUyAoPywgPywgPywgPywgPykiKTsKLSAgICBpZiAocXVlcnkucHJlcGFy
ZSgpICE9IFNRTFJlc3VsdE9rKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBiaW5kS2V5
VG9RdWVyeVdpdGhOdWxscyhxdWVyeSwgMSwga2V5KTsKLSAgICBxdWVyeS5iaW5kSW50NjQoNCwg
aW5kZXhJZCk7Ci0gICAgcXVlcnkuYmluZEludDY0KDUsIG9iamVjdFN0b3JlRGF0YUlkKTsKLQot
ICAgIHJldHVybiBxdWVyeS5zdGVwKCkgPT0gU1FMUmVzdWx0RG9uZTsKLX0KLQotYm9vbCBJREJC
YWNraW5nU3RvcmU6OmRlbGV0ZUluZGV4RGF0YUZvclJlY29yZChpbnQ2NF90IG9iamVjdFN0b3Jl
RGF0YUlkKQotewotICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVyeShtX2RiLCAiREVMRVRFIEZST00g
SW5kZXhEYXRhIFdIRVJFIG9iamVjdFN0b3JlRGF0YUlkID0gPyIpOwotICAgIGlmIChxdWVyeS5w
cmVwYXJlKCkgIT0gU1FMUmVzdWx0T2spCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHF1
ZXJ5LmJpbmRJbnQ2NCgxLCBvYmplY3RTdG9yZURhdGFJZCk7Ci0gICAgcmV0dXJuIHF1ZXJ5LnN0
ZXAoKSA9PSBTUUxSZXN1bHREb25lOwotfQotCi1TdHJpbmcgSURCQmFja2luZ1N0b3JlOjpnZXRP
YmplY3RWaWFJbmRleChpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYga2V5KQotewotICAg
IFN0cmluZyBzcWwgPSBTdHJpbmcoIlNFTEVDVCAiKQotICAgICAgICAgICAgICAgICArICJPYmpl
Y3RTdG9yZURhdGEudmFsdWUgIgotICAgICAgICAgICAgICAgICArICJGUk9NIEluZGV4RGF0YSBJ
Tk5FUiBKT0lOIE9iamVjdFN0b3JlRGF0YSBPTiBJbmRleERhdGEub2JqZWN0U3RvcmVEYXRhSWQg
PSBPYmplY3RTdG9yZURhdGEuaWQgIgotICAgICAgICAgICAgICAgICArICJXSEVSRSBJbmRleERh
dGEuaW5kZXhJZCA9ID8gIEFORCAgIiArIHdoZXJlU3ludGF4Rm9yS2V5KGtleSwgIkluZGV4RGF0
YS4iKQotICAgICAgICAgICAgICAgICArICJPUkRFUiBCWSBJbmRleERhdGEuaWQgTElNSVQgMSI7
IC8vIE9yZGVyIGJ5IGluc2VydGlvbiBvcmRlciB3aGVuIGFsbCBlbHNlIGZhaWxzLgotICAgIFNR
TGl0ZVN0YXRlbWVudCBxdWVyeShtX2RiLCBzcWwpOwotICAgIGJvb2wgb2sgPSBxdWVyeS5wcmVw
YXJlKCkgPT0gU1FMUmVzdWx0T2s7Ci0gICAgQVNTRVJUX1VOVVNFRChvaywgb2spOyAvLyBGSVhN
RTogQmV0dGVyIGVycm9yIGhhbmRsaW5nPwotCi0gICAgcXVlcnkuYmluZEludDY0KDEsIGluZGV4
SWQpOwotICAgIGJpbmRLZXlUb1F1ZXJ5KHF1ZXJ5LCAyLCBrZXkpOwotCi0gICAgaWYgKHF1ZXJ5
LnN0ZXAoKSAhPSBTUUxSZXN1bHRSb3cpCi0gICAgICAgIHJldHVybiBTdHJpbmcoKTsKLQotICAg
IFN0cmluZyBmb3VuZFZhbHVlID0gcXVlcnkuZ2V0Q29sdW1uQmxvYkFzU3RyaW5nKDApOwotICAg
IEFTU0VSVChxdWVyeS5zdGVwKCkgIT0gU1FMUmVzdWx0Um93KTsKLSAgICByZXR1cm4gZm91bmRW
YWx1ZTsKLX0KLQotc3RhdGljIFBhc3NSZWZQdHI8SURCS2V5PiBrZXlGcm9tUXVlcnkoU1FMaXRl
U3RhdGVtZW50JiBxdWVyeSwgaW50IGJhc2VDb2x1bW4pCi17Ci0gICAgaWYgKHF1ZXJ5LmNvbHVt
bkNvdW50KCkgPD0gYmFzZUNvbHVtbikKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAoIXF1
ZXJ5LmlzQ29sdW1uTnVsbChiYXNlQ29sdW1uKSkKLSAgICAgICAgcmV0dXJuIElEQktleTo6Y3Jl
YXRlU3RyaW5nKHF1ZXJ5LmdldENvbHVtblRleHQoYmFzZUNvbHVtbikpOwotCi0gICAgaWYgKCFx
dWVyeS5pc0NvbHVtbk51bGwoYmFzZUNvbHVtbiArIDEpKQotICAgICAgICByZXR1cm4gSURCS2V5
OjpjcmVhdGVEYXRlKHF1ZXJ5LmdldENvbHVtbkRvdWJsZShiYXNlQ29sdW1uICsgMSkpOwotCi0g
ICAgaWYgKCFxdWVyeS5pc0NvbHVtbk51bGwoYmFzZUNvbHVtbiArIDIpKQotICAgICAgICByZXR1
cm4gSURCS2V5OjpjcmVhdGVOdW1iZXIocXVlcnkuZ2V0Q29sdW1uRG91YmxlKGJhc2VDb2x1bW4g
KyAyKSk7Ci0KLSAgICByZXR1cm4gSURCS2V5OjpjcmVhdGVOdWxsKCk7Ci19Ci0KLVBhc3NSZWZQ
dHI8SURCS2V5PiBJREJCYWNraW5nU3RvcmU6OmdldFByaW1hcnlLZXlWaWFJbmRleChpbnQ2NF90
IGluZGV4SWQsIGNvbnN0IElEQktleSYga2V5KQotewotICAgIFN0cmluZyBzcWwgPSBTdHJpbmco
IlNFTEVDVCAiKQotICAgICAgICAgICAgICAgICArICJPYmplY3RTdG9yZURhdGEua2V5U3RyaW5n
LCBPYmplY3RTdG9yZURhdGEua2V5RGF0ZSwgT2JqZWN0U3RvcmVEYXRhLmtleU51bWJlciAiCi0g
ICAgICAgICAgICAgICAgICsgIkZST00gSW5kZXhEYXRhIElOTkVSIEpPSU4gT2JqZWN0U3RvcmVE
YXRhIE9OIEluZGV4RGF0YS5vYmplY3RTdG9yZURhdGFJZCA9IE9iamVjdFN0b3JlRGF0YS5pZCAi
Ci0gICAgICAgICAgICAgICAgICsgIldIRVJFIEluZGV4RGF0YS5pbmRleElkID0gPyAgQU5EICAi
ICsgd2hlcmVTeW50YXhGb3JLZXkoa2V5LCAiSW5kZXhEYXRhLiIpCi0gICAgICAgICAgICAgICAg
ICsgIk9SREVSIEJZIEluZGV4RGF0YS5pZCBMSU1JVCAxIjsgLy8gT3JkZXIgYnkgaW5zZXJ0aW9u
IG9yZGVyIHdoZW4gYWxsIGVsc2UgZmFpbHMuCi0gICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1f
ZGIsIHNxbCk7Ci0gICAgYm9vbCBvayA9IHF1ZXJ5LnByZXBhcmUoKSA9PSBTUUxSZXN1bHRPazsK
LSAgICBBU1NFUlRfVU5VU0VEKG9rLCBvayk7IC8vIEZJWE1FOiBCZXR0ZXIgZXJyb3IgaGFuZGxp
bmc/Ci0KLSAgICBxdWVyeS5iaW5kSW50NjQoMSwgaW5kZXhJZCk7Ci0gICAgYmluZEtleVRvUXVl
cnkocXVlcnksIDIsIGtleSk7Ci0KLSAgICBpZiAocXVlcnkuc3RlcCgpICE9IFNRTFJlc3VsdFJv
dykKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBSZWZQdHI8SURCS2V5PiBmb3VuZEtleSA9IGtl
eUZyb21RdWVyeShxdWVyeSwgMCk7Ci0gICAgQVNTRVJUKHF1ZXJ5LnN0ZXAoKSAhPSBTUUxSZXN1
bHRSb3cpOwotICAgIHJldHVybiBmb3VuZEtleS5yZWxlYXNlKCk7Ci19Ci0KLWJvb2wgSURCQmFj
a2luZ1N0b3JlOjprZXlFeGlzdHNJbkluZGV4KGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5
JiBrZXkpCi17Ci0gICAgU3RyaW5nIHNxbCA9IFN0cmluZygiU0VMRUNUIGlkIEZST00gSW5kZXhE
YXRhIFdIRVJFIGluZGV4SWQgPSA/IEFORCAiKSArIHdoZXJlU3ludGF4Rm9yS2V5KGtleSk7Ci0g
ICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGIsIHNxbCk7Ci0gICAgYm9vbCBvayA9IHF1ZXJ5
LnByZXBhcmUoKSA9PSBTUUxSZXN1bHRPazsKLSAgICBBU1NFUlRfVU5VU0VEKG9rLCBvayk7IC8v
IEZJWE1FOiBCZXR0ZXIgZXJyb3IgaGFuZGxpbmc/Ci0KLSAgICBxdWVyeS5iaW5kSW50NjQoMSwg
aW5kZXhJZCk7Ci0gICAgYmluZEtleVRvUXVlcnkocXVlcnksIDIsIGtleSk7Ci0KLSAgICByZXR1
cm4gcXVlcnkuc3RlcCgpID09IFNRTFJlc3VsdFJvdzsKLX0KLQotbmFtZXNwYWNlIHsKLQotY2xh
c3MgQ3Vyc29ySW1wbENvbW1vbiA6IHB1YmxpYyBJREJCYWNraW5nU3RvcmU6OkN1cnNvciB7Ci1w
dWJsaWM6Ci0gICAgQ3Vyc29ySW1wbENvbW1vbihTUUxpdGVEYXRhYmFzZSYgc3FsaXRlRGF0YWJh
c2UsIFN0cmluZyBxdWVyeSwgYm9vbCB1bmlxdWVuZXNzQ29uc3RyYWludCwgYm9vbCBpdGVyYXRl
Rm9yd2FyZCkKLSAgICAgICAgOiBtX3F1ZXJ5KHNxbGl0ZURhdGFiYXNlLCBxdWVyeSkKLSAgICAg
ICAgLCBtX2RiKHNxbGl0ZURhdGFiYXNlKQotICAgICAgICAsIG1fdW5pcXVlbmVzc0NvbnN0cmFp
bnQodW5pcXVlbmVzc0NvbnN0cmFpbnQpCi0gICAgICAgICwgbV9pdGVyYXRlRm9yd2FyZChpdGVy
YXRlRm9yd2FyZCkKLSAgICB7Ci0gICAgfQotICAgIHZpcnR1YWwgfkN1cnNvckltcGxDb21tb24o
KSB7fQotCi0gICAgLy8gSURCQmFja2luZ1N0b3JlOjpDdXJzb3IKLSAgICB2aXJ0dWFsIGJvb2wg
Y29udGludWVGdW5jdGlvbihjb25zdCBJREJLZXkqKTsKLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8
SURCS2V5PiBrZXkoKSB7IHJldHVybiBtX2N1cnJlbnRLZXk7IH0KLSAgICB2aXJ0dWFsIFBhc3NS
ZWZQdHI8SURCS2V5PiBwcmltYXJ5S2V5KCkgeyByZXR1cm4gbV9jdXJyZW50S2V5OyB9Ci0gICAg
dmlydHVhbCBTdHJpbmcgdmFsdWUoKSA9IDA7Ci0gICAgdmlydHVhbCBpbnQ2NF90IG9iamVjdFN0
b3JlRGF0YUlkKCkgPSAwOwotICAgIHZpcnR1YWwgaW50NjRfdCBpbmRleERhdGFJZCgpID0gMDsK
LQotICAgIHZpcnR1YWwgdm9pZCBsb2FkQ3VycmVudFJvdygpID0gMDsKLSAgICB2aXJ0dWFsIGJv
b2wgY3VycmVudFJvd0V4aXN0cygpID0gMDsKLQotICAgIFNRTGl0ZVN0YXRlbWVudCBtX3F1ZXJ5
OwotCi1wcm90ZWN0ZWQ6Ci0gICAgU1FMaXRlRGF0YWJhc2UmIG1fZGI7Ci0gICAgYm9vbCBtX3Vu
aXF1ZW5lc3NDb25zdHJhaW50OwotICAgIGJvb2wgbV9pdGVyYXRlRm9yd2FyZDsKLSAgICBpbnQ2
NF90IG1fY3VycmVudElkOwotICAgIFJlZlB0cjxJREJLZXk+IG1fY3VycmVudEtleTsKLX07Ci0K
LWJvb2wgQ3Vyc29ySW1wbENvbW1vbjo6Y29udGludWVGdW5jdGlvbihjb25zdCBJREJLZXkqIGtl
eSkKLXsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBpZiAobV9xdWVyeS5zdGVwKCkgIT0g
U1FMUmVzdWx0Um93KQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIFJlZlB0
cjxJREJLZXk+IG9sZEtleSA9IG1fY3VycmVudEtleTsKLSAgICAgICAgbG9hZEN1cnJlbnRSb3co
KTsKLQotICAgICAgICAvLyBTa2lwIGlmIHRoaXMgZW50cnkgaGFzIGJlZW4gZGVsZXRlZCBmcm9t
IHRoZSBvYmplY3Qgc3RvcmUuCi0gICAgICAgIGlmICghY3VycmVudFJvd0V4aXN0cygpKQotICAg
ICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgLy8gSWYgYSBrZXkgd2FzIHN1cHBsaWVkLCB3
ZSBtdXN0IGxvb3AgdW50aWwgd2UgZmluZCBhIGtleSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8g
aXQgKG9yIGhpdCB0aGUgZW5kKS4KLSAgICAgICAgaWYgKGtleSkgewotICAgICAgICAgICAgaWYg
KG1faXRlcmF0ZUZvcndhcmQpIHsKLSAgICAgICAgICAgICAgICBpZiAobV9jdXJyZW50S2V5LT5p
c0xlc3NUaGFuKGtleSkpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAg
ICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoa2V5LT5pc0xlc3NUaGFuKG1fY3VycmVu
dEtleS5nZXQoKSkpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAg
fQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHVuaXF1ZW5lc3Mg
Y29uc3RyYWludCwgd2UgY2FuIHN0b3Agbm93LgotICAgICAgICBpZiAoIW1fdW5pcXVlbmVzc0Nv
bnN0cmFpbnQpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgaWYgKCFtX2N1cnJlbnRLZXkt
PmlzRXF1YWwob2xkS2V5LmdldCgpKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAg
IHJldHVybiB0cnVlOwotfQotCi1jbGFzcyBPYmplY3RTdG9yZUN1cnNvckltcGwgOiBwdWJsaWMg
Q3Vyc29ySW1wbENvbW1vbiB7Ci1wdWJsaWM6Ci0gICAgT2JqZWN0U3RvcmVDdXJzb3JJbXBsKFNR
TGl0ZURhdGFiYXNlJiBzcWxpdGVEYXRhYmFzZSwgU3RyaW5nIHF1ZXJ5LCBib29sIHVuaXF1ZW5l
c3NDb25zdHJhaW50LCBib29sIGl0ZXJhdGVGb3J3YXJkKQotICAgICAgICA6IEN1cnNvckltcGxD
b21tb24oc3FsaXRlRGF0YWJhc2UsIHF1ZXJ5LCB1bmlxdWVuZXNzQ29uc3RyYWludCwgaXRlcmF0
ZUZvcndhcmQpCi0gICAgewotICAgIH0KLQotICAgIC8vIEN1cnNvckltcGxDb21tb24uCi0gICAg
dmlydHVhbCBTdHJpbmcgdmFsdWUoKSB7IHJldHVybiBtX2N1cnJlbnRWYWx1ZTsgfQotICAgIHZp
cnR1YWwgaW50NjRfdCBvYmplY3RTdG9yZURhdGFJZCgpIHsgcmV0dXJuIG1fY3VycmVudElkOyB9
Ci0gICAgdmlydHVhbCBpbnQ2NF90IGluZGV4RGF0YUlkKCkgeyBBU1NFUlRfTk9UX1JFQUNIRUQo
KTsgcmV0dXJuIDA7IH0KLSAgICB2aXJ0dWFsIHZvaWQgbG9hZEN1cnJlbnRSb3coKTsKLSAgICB2
aXJ0dWFsIGJvb2wgY3VycmVudFJvd0V4aXN0cygpOwotCi1wcml2YXRlOgotICAgIFN0cmluZyBt
X2N1cnJlbnRWYWx1ZTsKLX07Ci0KLXZvaWQgT2JqZWN0U3RvcmVDdXJzb3JJbXBsOjpsb2FkQ3Vy
cmVudFJvdygpCi17Ci0gICAgbV9jdXJyZW50SWQgPSBtX3F1ZXJ5LmdldENvbHVtbkludDY0KDAp
OwotICAgIG1fY3VycmVudEtleSA9IGtleUZyb21RdWVyeShtX3F1ZXJ5LCAxKTsKLSAgICBtX2N1
cnJlbnRWYWx1ZSA9IG1fcXVlcnkuZ2V0Q29sdW1uQmxvYkFzU3RyaW5nKDQpOwotfQotCi1ib29s
IE9iamVjdFN0b3JlQ3Vyc29ySW1wbDo6Y3VycmVudFJvd0V4aXN0cygpCi17Ci0gICAgU3RyaW5n
IHNxbCA9ICJTRUxFQ1QgaWQgRlJPTSBPYmplY3RTdG9yZURhdGEgV0hFUkUgaWQgPSA/IjsKLSAg
ICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50KG1fZGIsIHNxbCk7Ci0KLSAgICBib29sIG9rID0g
c3RhdGVtZW50LnByZXBhcmUoKSA9PSBTUUxSZXN1bHRPazsKLSAgICBBU1NFUlRfVU5VU0VEKG9r
LCBvayk7Ci0KLSAgICBzdGF0ZW1lbnQuYmluZEludDY0KDEsIG1fY3VycmVudElkKTsKLSAgICBy
ZXR1cm4gc3RhdGVtZW50LnN0ZXAoKSA9PSBTUUxSZXN1bHRSb3c7Ci19Ci0KLWNsYXNzIEluZGV4
S2V5Q3Vyc29ySW1wbCA6IHB1YmxpYyBDdXJzb3JJbXBsQ29tbW9uIHsKLXB1YmxpYzoKLSAgICBJ
bmRleEtleUN1cnNvckltcGwoU1FMaXRlRGF0YWJhc2UmIHNxbGl0ZURhdGFiYXNlLCBTdHJpbmcg
cXVlcnksIGJvb2wgdW5pcXVlbmVzc0NvbnN0cmFpbnQsIGJvb2wgaXRlcmF0ZUZvcndhcmQpCi0g
ICAgICAgIDogQ3Vyc29ySW1wbENvbW1vbihzcWxpdGVEYXRhYmFzZSwgcXVlcnksIHVuaXF1ZW5l
c3NDb25zdHJhaW50LCBpdGVyYXRlRm9yd2FyZCkKLSAgICB7Ci0gICAgfQotCi0gICAgLy8gQ3Vy
c29ySW1wbENvbW1vbgotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJLZXk+IHByaW1hcnlLZXko
KSB7IHJldHVybiBtX2N1cnJlbnRQcmltYXJ5S2V5OyB9Ci0gICAgdmlydHVhbCBTdHJpbmcgdmFs
dWUoKSB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4gU3RyaW5nKCk7IH0KLSAgICB2aXJ0
dWFsIGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQoKSB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyBy
ZXR1cm4gMDsgfQotICAgIHZpcnR1YWwgaW50NjRfdCBpbmRleERhdGFJZCgpIHsgcmV0dXJuIG1f
Y3VycmVudElkOyB9Ci0gICAgdmlydHVhbCB2b2lkIGxvYWRDdXJyZW50Um93KCk7Ci0gICAgdmly
dHVhbCBib29sIGN1cnJlbnRSb3dFeGlzdHMoKTsKLQotcHJpdmF0ZToKLSAgICBSZWZQdHI8SURC
S2V5PiBtX2N1cnJlbnRQcmltYXJ5S2V5OwotfTsKLQotdm9pZCBJbmRleEtleUN1cnNvckltcGw6
OmxvYWRDdXJyZW50Um93KCkKLXsKLSAgICBtX2N1cnJlbnRJZCA9IG1fcXVlcnkuZ2V0Q29sdW1u
SW50NjQoMCk7Ci0gICAgbV9jdXJyZW50S2V5ID0ga2V5RnJvbVF1ZXJ5KG1fcXVlcnksIDEpOwot
ICAgIG1fY3VycmVudFByaW1hcnlLZXkgPSBrZXlGcm9tUXVlcnkobV9xdWVyeSwgNCk7Ci19Ci0K
LWJvb2wgSW5kZXhLZXlDdXJzb3JJbXBsOjpjdXJyZW50Um93RXhpc3RzKCkKLXsKLSAgICBTdHJp
bmcgc3FsID0gIlNFTEVDVCBpZCBGUk9NIEluZGV4RGF0YSBXSEVSRSBpZCA9ID8iOwotICAgIFNR
TGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQobV9kYiwgc3FsKTsKLQotICAgIGJvb2wgb2sgPSBzdGF0
ZW1lbnQucHJlcGFyZSgpID09IFNRTFJlc3VsdE9rOwotICAgIEFTU0VSVF9VTlVTRUQob2ssIG9r
KTsKLQotICAgIHN0YXRlbWVudC5iaW5kSW50NjQoMSwgbV9jdXJyZW50SWQpOwotICAgIHJldHVy
biBzdGF0ZW1lbnQuc3RlcCgpID09IFNRTFJlc3VsdFJvdzsKLX0KLQotY2xhc3MgSW5kZXhDdXJz
b3JJbXBsIDogcHVibGljIEN1cnNvckltcGxDb21tb24gewotcHVibGljOgotICAgIEluZGV4Q3Vy
c29ySW1wbChTUUxpdGVEYXRhYmFzZSYgc3FsaXRlRGF0YWJhc2UsIFN0cmluZyBxdWVyeSwgYm9v
bCB1bmlxdWVuZXNzQ29uc3RyYWludCwgYm9vbCBpdGVyYXRlRm9yd2FyZCkKLSAgICAgICAgOiBD
dXJzb3JJbXBsQ29tbW9uKHNxbGl0ZURhdGFiYXNlLCBxdWVyeSwgdW5pcXVlbmVzc0NvbnN0cmFp
bnQsIGl0ZXJhdGVGb3J3YXJkKQotICAgIHsKLSAgICB9Ci0KLSAgICAvLyBDdXJzb3JJbXBsQ29t
bW9uCi0gICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQktleT4gcHJpbWFyeUtleSgpIHsgcmV0dXJu
IG1fY3VycmVudFByaW1hcnlLZXk7IH0KLSAgICB2aXJ0dWFsIFN0cmluZyB2YWx1ZSgpIHsgcmV0
dXJuIG1fY3VycmVudFZhbHVlOyB9Ci0gICAgdmlydHVhbCBpbnQ2NF90IG9iamVjdFN0b3JlRGF0
YUlkKCkgeyBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgcmV0dXJuIDA7IH0KLSAgICB2aXJ0dWFsIGlu
dDY0X3QgaW5kZXhEYXRhSWQoKSB7IHJldHVybiBtX2N1cnJlbnRJZDsgfQotICAgIHZpcnR1YWwg
dm9pZCBsb2FkQ3VycmVudFJvdygpOwotICAgIHZpcnR1YWwgYm9vbCBjdXJyZW50Um93RXhpc3Rz
KCk7Ci0KLXByaXZhdGU6Ci0gICAgUmVmUHRyPElEQktleT4gbV9jdXJyZW50UHJpbWFyeUtleTsK
LSAgICBTdHJpbmcgbV9jdXJyZW50VmFsdWU7Ci19OwotCi12b2lkIEluZGV4Q3Vyc29ySW1wbDo6
bG9hZEN1cnJlbnRSb3coKQotewotICAgIG1fY3VycmVudElkID0gbV9xdWVyeS5nZXRDb2x1bW5J
bnQ2NCgwKTsKLSAgICBtX2N1cnJlbnRLZXkgPSBrZXlGcm9tUXVlcnkobV9xdWVyeSwgMSk7Ci0g
ICAgbV9jdXJyZW50VmFsdWUgPSBtX3F1ZXJ5LmdldENvbHVtbkJsb2JBc1N0cmluZyg0KTsKLSAg
ICBtX2N1cnJlbnRQcmltYXJ5S2V5ID0ga2V5RnJvbVF1ZXJ5KG1fcXVlcnksIDUpOwotfQotCi1i
b29sIEluZGV4Q3Vyc29ySW1wbDo6Y3VycmVudFJvd0V4aXN0cygpCi17Ci0gICAgU3RyaW5nIHNx
bCA9ICJTRUxFQ1QgaWQgRlJPTSBJbmRleERhdGEgV0hFUkUgaWQgPSA/IjsKLSAgICBTUUxpdGVT
dGF0ZW1lbnQgc3RhdGVtZW50KG1fZGIsIHNxbCk7Ci0KLSAgICBib29sIG9rID0gc3RhdGVtZW50
LnByZXBhcmUoKSA9PSBTUUxSZXN1bHRPazsKLSAgICBBU1NFUlRfVU5VU0VEKG9rLCBvayk7Ci0K
LSAgICBzdGF0ZW1lbnQuYmluZEludDY0KDEsIG1fY3VycmVudElkKTsKLSAgICByZXR1cm4gc3Rh
dGVtZW50LnN0ZXAoKSA9PSBTUUxSZXN1bHRSb3c7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlCi0KLVBh
c3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IElEQkJhY2tpbmdTdG9yZTo6b3Blbk9i
amVjdFN0b3JlQ3Vyc29yKGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5UmFuZ2Uq
IHJhbmdlLCBJREJDdXJzb3I6OkRpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0gICAgYm9vbCBsb3dl
ckJvdW5kID0gcmFuZ2UgJiYgcmFuZ2UtPmxvd2VyKCk7Ci0gICAgYm9vbCB1cHBlckJvdW5kID0g
cmFuZ2UgJiYgcmFuZ2UtPnVwcGVyKCk7Ci0KLSAgICBTdHJpbmcgc3FsID0gIlNFTEVDVCBpZCwg
a2V5U3RyaW5nLCBrZXlEYXRlLCBrZXlOdW1iZXIsIHZhbHVlIEZST00gT2JqZWN0U3RvcmVEYXRh
IFdIRVJFICI7Ci0gICAgaWYgKGxvd2VyQm91bmQpCi0gICAgICAgIHNxbCArPSBsb3dlckN1cnNv
cldoZXJlRnJhZ21lbnQoKnJhbmdlLT5sb3dlcigpLCByYW5nZS0+bG93ZXJPcGVuKCkgPyAiPCIg
OiAiPD0iKTsKLSAgICBpZiAodXBwZXJCb3VuZCkKLSAgICAgICAgc3FsICs9IHVwcGVyQ3Vyc29y
V2hlcmVGcmFnbWVudCgqcmFuZ2UtPnVwcGVyKCksIHJhbmdlLT51cHBlck9wZW4oKSA/ICI8IiA6
ICI8PSIpOwotICAgIHNxbCArPSAib2JqZWN0U3RvcmVJZCA9ID8gT1JERVIgQlkgIjsKLQotICAg
IGlmIChkaXJlY3Rpb24gPT0gSURCQ3Vyc29yOjpORVhUIHx8IGRpcmVjdGlvbiA9PSBJREJDdXJz
b3I6Ok5FWFRfTk9fRFVQTElDQVRFKQotICAgICAgICBzcWwgKz0gImtleVN0cmluZywga2V5RGF0
ZSwga2V5TnVtYmVyIjsKLSAgICBlbHNlCi0gICAgICAgIHNxbCArPSAia2V5U3RyaW5nIERFU0Ms
IGtleURhdGUgREVTQywga2V5TnVtYmVyIERFU0MiOwotCi0gICAgUmVmUHRyPE9iamVjdFN0b3Jl
Q3Vyc29ySW1wbD4gY3Vyc29yID0gYWRvcHRSZWYobmV3IE9iamVjdFN0b3JlQ3Vyc29ySW1wbCht
X2RiLCBzcWwsIGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFRfTk9fRFVQTElDQVRFIHx8IGRp
cmVjdGlvbiA9PSBJREJDdXJzb3I6OlBSRVZfTk9fRFVQTElDQVRFLAotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgZGlyZWN0aW9uID09IElEQkN1cnNvcjo6TkVYVF9OT19EVVBMSUNBVEUgfHwgZGlyZWN0
aW9uID09IElEQkN1cnNvcjo6TkVYVCkpOwotCi0gICAgYm9vbCBvayA9IGN1cnNvci0+bV9xdWVy
eS5wcmVwYXJlKCkgPT0gU1FMUmVzdWx0T2s7Ci0gICAgQVNTRVJUX1VOVVNFRChvaywgb2spOyAv
LyBGSVhNRTogQmV0dGVyIGVycm9yIGhhbmRsaW5nPwotCi0gICAgaW50IGN1cnJlbnRDb2x1bW4g
PSAxOwotICAgIGlmIChsb3dlckJvdW5kKQotICAgICAgICBjdXJyZW50Q29sdW1uICs9IGJpbmRL
ZXlUb1F1ZXJ5KGN1cnNvci0+bV9xdWVyeSwgY3VycmVudENvbHVtbiwgKnJhbmdlLT5sb3dlcigp
KTsKLSAgICBpZiAodXBwZXJCb3VuZCkKLSAgICAgICAgY3VycmVudENvbHVtbiArPSBiaW5kS2V5
VG9RdWVyeShjdXJzb3ItPm1fcXVlcnksIGN1cnJlbnRDb2x1bW4sICpyYW5nZS0+dXBwZXIoKSk7
Ci0gICAgY3Vyc29yLT5tX3F1ZXJ5LmJpbmRJbnQ2NChjdXJyZW50Q29sdW1uLCBvYmplY3RTdG9y
ZUlkKTsKLQotICAgIGlmIChjdXJzb3ItPm1fcXVlcnkuc3RlcCgpICE9IFNRTFJlc3VsdFJvdykK
LSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjdXJzb3ItPmxvYWRDdXJyZW50Um93KCk7Ci0gICAg
cmV0dXJuIGN1cnNvci5yZWxlYXNlKCk7Ci19Ci0KLVBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3Jl
OjpDdXJzb3I+IElEQkJhY2tpbmdTdG9yZTo6b3BlbkluZGV4S2V5Q3Vyc29yKGludDY0X3QgaW5k
ZXhJZCwgY29uc3QgSURCS2V5UmFuZ2UqIHJhbmdlLCBJREJDdXJzb3I6OkRpcmVjdGlvbiBkaXJl
Y3Rpb24pCi17Ci0gICAgU3RyaW5nIHNxbCA9IFN0cmluZygiU0VMRUNUIEluZGV4RGF0YS5pZCwg
SW5kZXhEYXRhLmtleVN0cmluZywgSW5kZXhEYXRhLmtleURhdGUsIEluZGV4RGF0YS5rZXlOdW1i
ZXIsICIpCi0gICAgICAgICAgICAgICAgICsgKCJPYmplY3RTdG9yZURhdGEua2V5U3RyaW5nLCBP
YmplY3RTdG9yZURhdGEua2V5RGF0ZSwgT2JqZWN0U3RvcmVEYXRhLmtleU51bWJlciAiKQotICAg
ICAgICAgICAgICAgICArICJGUk9NIEluZGV4RGF0YSBJTk5FUiBKT0lOIE9iamVjdFN0b3JlRGF0
YSBPTiBJbmRleERhdGEub2JqZWN0U3RvcmVEYXRhSWQgPSBPYmplY3RTdG9yZURhdGEuaWQgV0hF
UkUgIjsKLQotICAgIGJvb2wgbG93ZXJCb3VuZCA9IHJhbmdlICYmIHJhbmdlLT5sb3dlcigpOwot
ICAgIGJvb2wgdXBwZXJCb3VuZCA9IHJhbmdlICYmIHJhbmdlLT51cHBlcigpOwotCi0gICAgaWYg
KGxvd2VyQm91bmQpCi0gICAgICAgIHNxbCArPSBsb3dlckN1cnNvcldoZXJlRnJhZ21lbnQoKnJh
bmdlLT5sb3dlcigpLCByYW5nZS0+bG93ZXJPcGVuKCkgPyAiPCIgOiAiPD0iLCAiSW5kZXhEYXRh
LiIpOwotICAgIGlmICh1cHBlckJvdW5kKQotICAgICAgICBzcWwgKz0gdXBwZXJDdXJzb3JXaGVy
ZUZyYWdtZW50KCpyYW5nZS0+dXBwZXIoKSwgcmFuZ2UtPnVwcGVyT3BlbigpID8gIjwiIDogIjw9
IiwgIkluZGV4RGF0YS4iKTsKLSAgICBzcWwgKz0gIkluZGV4RGF0YS5pbmRleElkID0gPyBPUkRF
UiBCWSAiOwotCi0gICAgaWYgKGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFQgfHwgZGlyZWN0
aW9uID09IElEQkN1cnNvcjo6TkVYVF9OT19EVVBMSUNBVEUpCi0gICAgICAgIHNxbCArPSAiSW5k
ZXhEYXRhLmtleVN0cmluZywgSW5kZXhEYXRhLmtleURhdGUsIEluZGV4RGF0YS5rZXlOdW1iZXIs
IEluZGV4RGF0YS5pZCI7Ci0gICAgZWxzZQotICAgICAgICBzcWwgKz0gIkluZGV4RGF0YS5rZXlT
dHJpbmcgREVTQywgSW5kZXhEYXRhLmtleURhdGUgREVTQywgSW5kZXhEYXRhLmtleU51bWJlciBE
RVNDLCBJbmRleERhdGEuaWQgREVTQyI7Ci0KLSAgICBSZWZQdHI8SW5kZXhLZXlDdXJzb3JJbXBs
PiBjdXJzb3IgPSBhZG9wdFJlZihuZXcgSW5kZXhLZXlDdXJzb3JJbXBsKG1fZGIsIHNxbCwgZGly
ZWN0aW9uID09IElEQkN1cnNvcjo6TkVYVF9OT19EVVBMSUNBVEUgfHwgZGlyZWN0aW9uID09IElE
QkN1cnNvcjo6UFJFVl9OT19EVVBMSUNBVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPT0g
SURCQ3Vyc29yOjpORVhUX05PX0RVUExJQ0FURSB8fCBkaXJlY3Rpb24gPT0gSURCQ3Vyc29yOjpO
RVhUKSk7Ci0KLSAgICBib29sIG9rID0gY3Vyc29yLT5tX3F1ZXJ5LnByZXBhcmUoKSA9PSBTUUxS
ZXN1bHRPazsKLSAgICBBU1NFUlRfVU5VU0VEKG9rLCBvayk7IC8vIEZJWE1FOiBCZXR0ZXIgZXJy
b3IgaGFuZGxpbmc/Ci0KLSAgICBpbnQgaW5kZXhDb2x1bW4gPSAxOwotICAgIGlmIChsb3dlckJv
dW5kKQotICAgICAgICBpbmRleENvbHVtbiArPSBiaW5kS2V5VG9RdWVyeShjdXJzb3ItPm1fcXVl
cnksIGluZGV4Q29sdW1uLCAqcmFuZ2UtPmxvd2VyKCkpOwotICAgIGlmICh1cHBlckJvdW5kKQot
ICAgICAgICBpbmRleENvbHVtbiArPSBiaW5kS2V5VG9RdWVyeShjdXJzb3ItPm1fcXVlcnksIGlu
ZGV4Q29sdW1uLCAqcmFuZ2UtPnVwcGVyKCkpOwotICAgIGN1cnNvci0+bV9xdWVyeS5iaW5kSW50
NjQoaW5kZXhDb2x1bW4sIGluZGV4SWQpOwotCi0gICAgaWYgKGN1cnNvci0+bV9xdWVyeS5zdGVw
KCkgIT0gU1FMUmVzdWx0Um93KQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGN1cnNvci0+bG9h
ZEN1cnJlbnRSb3coKTsKLSAgICByZXR1cm4gY3Vyc29yLnJlbGVhc2UoKTsKLX0KLQotUGFzc1Jl
ZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4gSURCQmFja2luZ1N0b3JlOjpvcGVuSW5kZXhD
dXJzb3IoaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXlSYW5nZSogcmFuZ2UsIElEQkN1cnNv
cjo6RGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLSAgICBTdHJpbmcgc3FsID0gU3RyaW5nKCJTRUxF
Q1QgSW5kZXhEYXRhLmlkLCBJbmRleERhdGEua2V5U3RyaW5nLCBJbmRleERhdGEua2V5RGF0ZSwg
SW5kZXhEYXRhLmtleU51bWJlciwgIikKLSAgICAgICAgICAgICAgICAgKyAoIk9iamVjdFN0b3Jl
RGF0YS52YWx1ZSwgT2JqZWN0U3RvcmVEYXRhLmtleVN0cmluZywgT2JqZWN0U3RvcmVEYXRhLmtl
eURhdGUsIE9iamVjdFN0b3JlRGF0YS5rZXlOdW1iZXIgIikKLSAgICAgICAgICAgICAgICAgKyAi
RlJPTSBJbmRleERhdGEgSU5ORVIgSk9JTiBPYmplY3RTdG9yZURhdGEgT04gSW5kZXhEYXRhLm9i
amVjdFN0b3JlRGF0YUlkID0gT2JqZWN0U3RvcmVEYXRhLmlkIFdIRVJFICI7Ci0KLSAgICBib29s
IGxvd2VyQm91bmQgPSByYW5nZSAmJiByYW5nZS0+bG93ZXIoKTsKLSAgICBib29sIHVwcGVyQm91
bmQgPSByYW5nZSAmJiByYW5nZS0+dXBwZXIoKTsKLQotICAgIGlmIChsb3dlckJvdW5kKQotICAg
ICAgICBzcWwgKz0gbG93ZXJDdXJzb3JXaGVyZUZyYWdtZW50KCpyYW5nZS0+bG93ZXIoKSwgcmFu
Z2UtPmxvd2VyT3BlbigpID8gIjwiIDogIjw9IiwgIkluZGV4RGF0YS4iKTsKLSAgICBpZiAodXBw
ZXJCb3VuZCkKLSAgICAgICAgc3FsICs9IHVwcGVyQ3Vyc29yV2hlcmVGcmFnbWVudCgqcmFuZ2Ut
PnVwcGVyKCksIHJhbmdlLT51cHBlck9wZW4oKSA/ICI8IiA6ICI8PSIsICJJbmRleERhdGEuIik7
Ci0gICAgc3FsICs9ICJJbmRleERhdGEuaW5kZXhJZCA9ID8gT1JERVIgQlkgIjsKLQotICAgIGlm
IChkaXJlY3Rpb24gPT0gSURCQ3Vyc29yOjpORVhUIHx8IGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6
Ok5FWFRfTk9fRFVQTElDQVRFKQotICAgICAgICBzcWwgKz0gIkluZGV4RGF0YS5rZXlTdHJpbmcs
IEluZGV4RGF0YS5rZXlEYXRlLCBJbmRleERhdGEua2V5TnVtYmVyLCBJbmRleERhdGEuaWQiOwot
ICAgIGVsc2UKLSAgICAgICAgc3FsICs9ICJJbmRleERhdGEua2V5U3RyaW5nIERFU0MsIEluZGV4
RGF0YS5rZXlEYXRlIERFU0MsIEluZGV4RGF0YS5rZXlOdW1iZXIgREVTQywgSW5kZXhEYXRhLmlk
IERFU0MiOwotCi0gICAgUmVmUHRyPEluZGV4Q3Vyc29ySW1wbD4gY3Vyc29yID0gYWRvcHRSZWYo
bmV3IEluZGV4Q3Vyc29ySW1wbChtX2RiLCBzcWwsIGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5F
WFRfTk9fRFVQTElDQVRFIHx8IGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6OlBSRVZfTk9fRFVQTElD
QVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgZGlyZWN0aW9uID09IElEQkN1cnNvcjo6TkVYVF9OT19EVVBMSUNBVEUg
fHwgZGlyZWN0aW9uID09IElEQkN1cnNvcjo6TkVYVCkpOwotCi0gICAgYm9vbCBvayA9IGN1cnNv
ci0+bV9xdWVyeS5wcmVwYXJlKCkgPT0gU1FMUmVzdWx0T2s7Ci0gICAgQVNTRVJUX1VOVVNFRChv
aywgb2spOyAvLyBGSVhNRTogQmV0dGVyIGVycm9yIGhhbmRsaW5nPwotCi0gICAgaW50IGluZGV4
Q29sdW1uID0gMTsKLSAgICBpZiAobG93ZXJCb3VuZCkKLSAgICAgICAgaW5kZXhDb2x1bW4gKz0g
YmluZEtleVRvUXVlcnkoY3Vyc29yLT5tX3F1ZXJ5LCBpbmRleENvbHVtbiwgKnJhbmdlLT5sb3dl
cigpKTsKLSAgICBpZiAodXBwZXJCb3VuZCkKLSAgICAgICAgaW5kZXhDb2x1bW4gKz0gYmluZEtl
eVRvUXVlcnkoY3Vyc29yLT5tX3F1ZXJ5LCBpbmRleENvbHVtbiwgKnJhbmdlLT51cHBlcigpKTsK
LSAgICBjdXJzb3ItPm1fcXVlcnkuYmluZEludDY0KGluZGV4Q29sdW1uLCBpbmRleElkKTsKLQot
ICAgIGlmIChjdXJzb3ItPm1fcXVlcnkuc3RlcCgpICE9IFNRTFJlc3VsdFJvdykKLSAgICAgICAg
cmV0dXJuIDA7Ci0KLSAgICBjdXJzb3ItPmxvYWRDdXJyZW50Um93KCk7Ci0gICAgcmV0dXJuIGN1
cnNvci5yZWxlYXNlKCk7Ci19Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIFRyYW5zYWN0aW9uSW1w
bCA6IHB1YmxpYyBJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uIHsKLXB1YmxpYzoKLSAgICBU
cmFuc2FjdGlvbkltcGwoU1FMaXRlRGF0YWJhc2UmIGRiKQotICAgICAgICA6IG1fdHJhbnNhY3Rp
b24oZGIpCi0gICAgewotICAgIH0KLQotICAgIC8vIElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rp
b24KLSAgICB2aXJ0dWFsIHZvaWQgYmVnaW4oKSB7IG1fdHJhbnNhY3Rpb24uYmVnaW4oKTsgfQot
ICAgIHZpcnR1YWwgdm9pZCBjb21taXQoKSB7IG1fdHJhbnNhY3Rpb24uY29tbWl0KCk7IH0KLSAg
ICB2aXJ0dWFsIHZvaWQgcm9sbGJhY2soKSB7IG1fdHJhbnNhY3Rpb24ucm9sbGJhY2soKTsgfQot
Ci1wcml2YXRlOgotICAgIFNRTGl0ZVRyYW5zYWN0aW9uIG1fdHJhbnNhY3Rpb247Ci19OwotCi19
IC8vIG5hbWVzcGFjZQotCi1QYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24+
IElEQkJhY2tpbmdTdG9yZTo6Y3JlYXRlVHJhbnNhY3Rpb24oKQotewotICAgIHJldHVybiBhZG9w
dFJlZihuZXcgVHJhbnNhY3Rpb25JbXBsKG1fZGIpKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQotCi0jZW5kaWYgLy8gRU5BQkxFKElOREVYRURfREFUQUJBU0UpCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkJhY2tpbmdTdG9yZS5oIGIvU291cmNlL1dlYkNvcmUv
c3RvcmFnZS9JREJCYWNraW5nU3RvcmUuaAppbmRleCBlNzVmZWUxLi4yOTUyM2EyIDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkJhY2tpbmdTdG9yZS5oCisrKyBiL1NvdXJj
ZS9XZWJDb3JlL3N0b3JhZ2UvSURCQmFja2luZ1N0b3JlLmgKQEAgLTQ0LDM3ICs0NCwzNiBAQCBj
bGFzcyBTZWN1cml0eU9yaWdpbjsKIAogY2xhc3MgSURCQmFja2luZ1N0b3JlIDogcHVibGljIFJl
ZkNvdW50ZWQ8SURCQmFja2luZ1N0b3JlPiB7CiBwdWJsaWM6Ci0gICAgc3RhdGljIFBhc3NSZWZQ
dHI8SURCQmFja2luZ1N0b3JlPiBvcGVuKFNlY3VyaXR5T3JpZ2luKiwgY29uc3QgU3RyaW5nJiBw
YXRoQmFzZSwgaW50NjRfdCBtYXhpbXVtU2l6ZSwgY29uc3QgU3RyaW5nJiBmaWxlSWRlbnRpZmll
ciwgSURCRmFjdG9yeUJhY2tlbmRJbXBsKik7Ci0gICAgfklEQkJhY2tpbmdTdG9yZSgpOwotCi0g
ICAgYm9vbCBleHRyYWN0SURCRGF0YWJhc2VNZXRhRGF0YShjb25zdCBTdHJpbmcmIG5hbWUsIFN0
cmluZyYgZm91bmRWZXJzaW9uLCBpbnQ2NF90JiBmb3VuZElkKTsKLSAgICBib29sIHNldElEQkRh
dGFiYXNlTWV0YURhdGEoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHZlcnNpb24s
IGludDY0X3QmIHJvd0lkLCBib29sIGludmFsaWRSb3dJZCk7Ci0KLSAgICB2b2lkIGdldE9iamVj
dFN0b3JlcyhpbnQ2NF90IGRhdGFiYXNlSWQsIFZlY3RvcjxpbnQ2NF90PiYgZm91bmRJZHMsIFZl
Y3RvcjxTdHJpbmc+JiBmb3VuZE5hbWVzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmRLZXlQYXRocywg
VmVjdG9yPGJvb2w+JiBmb3VuZEF1dG9JbmNyZW1lbnRGbGFncyk7Ci0gICAgYm9vbCBjcmVhdGVP
YmplY3RTdG9yZShjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwgYm9v
bCBhdXRvSW5jcmVtZW50LCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3QmIGFzc2lnbmVkT2Jq
ZWN0U3RvcmVJZCk7Ci0gICAgdm9pZCBkZWxldGVPYmplY3RTdG9yZShpbnQ2NF90IG9iamVjdFN0
b3JlSWQpOwotICAgIFN0cmluZyBnZXRPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IG9iamVjdFN0
b3JlSWQsIGNvbnN0IElEQktleSYpOwotICAgIGJvb2wgcHV0T2JqZWN0U3RvcmVSZWNvcmQoaW50
NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXkmLCBjb25zdCBTdHJpbmcmIHZhbHVlLCBp
bnQ2NF90JiByb3dJZCwgYm9vbCBpbnZhbGlkUm93SWQpOwotICAgIHZvaWQgY2xlYXJPYmplY3RT
dG9yZShpbnQ2NF90IG9iamVjdFN0b3JlSWQpOwotICAgIHZvaWQgZGVsZXRlT2JqZWN0U3RvcmVS
ZWNvcmQoaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlRGF0YUlkKTsK
LSAgICBkb3VibGUgbmV4dEF1dG9JbmNyZW1lbnROdW1iZXIoaW50NjRfdCBvYmplY3RTdG9yZUlk
KTsKLSAgICBib29sIGtleUV4aXN0c0luT2JqZWN0U3RvcmUoaW50NjRfdCBvYmplY3RTdG9yZUlk
LCBjb25zdCBJREJLZXkmLCBpbnQ2NF90JiBmb3VuZE9iamVjdFN0b3JlRGF0YUlkKTsKKyAgICB2
aXJ0dWFsIH5JREJCYWNraW5nU3RvcmUoKSB7fTsKKworICAgIHZpcnR1YWwgYm9vbCBleHRyYWN0
SURCRGF0YWJhc2VNZXRhRGF0YShjb25zdCBTdHJpbmcmIG5hbWUsIFN0cmluZyYgZm91bmRWZXJz
aW9uLCBpbnQ2NF90JiBmb3VuZElkKSA9IDA7CisgICAgdmlydHVhbCBib29sIHNldElEQkRhdGFi
YXNlTWV0YURhdGEoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHZlcnNpb24sIGlu
dDY0X3QmIHJvd0lkLCBib29sIGludmFsaWRSb3dJZCkgPSAwOworCisgICAgdmlydHVhbCB2b2lk
IGdldE9iamVjdFN0b3JlcyhpbnQ2NF90IGRhdGFiYXNlSWQsIFZlY3RvcjxpbnQ2NF90PiYgZm91
bmRJZHMsIFZlY3RvcjxTdHJpbmc+JiBmb3VuZE5hbWVzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmRL
ZXlQYXRocywgVmVjdG9yPGJvb2w+JiBmb3VuZEF1dG9JbmNyZW1lbnRGbGFncykgPSAwOworICAg
IHZpcnR1YWwgYm9vbCBjcmVhdGVPYmplY3RTdG9yZShjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0
IFN0cmluZyYga2V5UGF0aCwgYm9vbCBhdXRvSW5jcmVtZW50LCBpbnQ2NF90IGRhdGFiYXNlSWQs
IGludDY0X3QmIGFzc2lnbmVkT2JqZWN0U3RvcmVJZCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBk
ZWxldGVPYmplY3RTdG9yZShpbnQ2NF90IG9iamVjdFN0b3JlSWQpID0gMDsKKyAgICB2aXJ0dWFs
IFN0cmluZyBnZXRPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0
IElEQktleSYpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgcHV0T2JqZWN0U3RvcmVSZWNvcmQoaW50
NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXkmLCBjb25zdCBTdHJpbmcmIHZhbHVlLCBp
bnQ2NF90JiByb3dJZCwgYm9vbCBpbnZhbGlkUm93SWQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQg
Y2xlYXJPYmplY3RTdG9yZShpbnQ2NF90IG9iamVjdFN0b3JlSWQpID0gMDsKKyAgICB2aXJ0dWFs
IHZvaWQgZGVsZXRlT2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2
NF90IG9iamVjdFN0b3JlRGF0YUlkKSA9IDA7CisgICAgdmlydHVhbCBkb3VibGUgbmV4dEF1dG9J
bmNyZW1lbnROdW1iZXIoaW50NjRfdCBvYmplY3RTdG9yZUlkKSA9IDA7CisgICAgdmlydHVhbCBi
b29sIGtleUV4aXN0c0luT2JqZWN0U3RvcmUoaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJ
REJLZXkmLCBpbnQ2NF90JiBmb3VuZE9iamVjdFN0b3JlRGF0YUlkKSA9IDA7CiAKICAgICBjbGFz
cyBPYmplY3RTdG9yZVJlY29yZENhbGxiYWNrIHsKICAgICBwdWJsaWM6CiAgICAgICAgICB2aXJ0
dWFsIGJvb2wgY2FsbGJhY2soaW50NjRfdCBvYmplY3RTdG9yZURhdGFJZCwgY29uc3QgU3RyaW5n
JiB2YWx1ZSkgPSAwOwogICAgICAgICAgdmlydHVhbCB+T2JqZWN0U3RvcmVSZWNvcmRDYWxsYmFj
aygpIHt9OwogICAgIH07Ci0gICAgYm9vbCBmb3JFYWNoT2JqZWN0U3RvcmVSZWNvcmQoaW50NjRf
dCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZVJlY29yZENhbGxiYWNrJik7CisgICAgdmlydHVh
bCBib29sIGZvckVhY2hPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IG9iamVjdFN0b3JlSWQsIE9i
amVjdFN0b3JlUmVjb3JkQ2FsbGJhY2smKSA9IDA7CiAKLSAgICB2b2lkIGdldEluZGV4ZXMoaW50
NjRfdCBvYmplY3RTdG9yZUlkLCBWZWN0b3I8aW50NjRfdD4mIGZvdW5kSWRzLCBWZWN0b3I8U3Ry
aW5nPiYgZm91bmROYW1lcywgVmVjdG9yPFN0cmluZz4mIGZvdW5kS2V5UGF0aHMsIFZlY3Rvcjxi
b29sPiYgZm91bmRVbmlxdWVGbGFncyk7Ci0gICAgYm9vbCBjcmVhdGVJbmRleChpbnQ2NF90IG9i
amVjdFN0b3JlSWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBi
b29sIGlzVW5pcXVlLCBpbnQ2NF90JiBpbmRleElkKTsKLSAgICB2b2lkIGRlbGV0ZUluZGV4KGlu
dDY0X3QgaW5kZXhJZCk7Ci0gICAgYm9vbCBwdXRJbmRleERhdGFGb3JSZWNvcmQoaW50NjRfdCBp
bmRleElkLCBjb25zdCBJREJLZXkmLCBpbnQ2NF90IG9iamVjdFN0b3JlRGF0YUlkKTsKLSAgICBi
b29sIGRlbGV0ZUluZGV4RGF0YUZvclJlY29yZChpbnQ2NF90IG9iamVjdFN0b3JlRGF0YUlkKTsK
LSAgICBTdHJpbmcgZ2V0T2JqZWN0VmlhSW5kZXgoaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJL
ZXkmKTsKLSAgICBQYXNzUmVmUHRyPElEQktleT4gZ2V0UHJpbWFyeUtleVZpYUluZGV4KGludDY0
X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5Jik7Ci0gICAgYm9vbCBrZXlFeGlzdHNJbkluZGV4KGlu
dDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5Jik7CisgICAgdmlydHVhbCB2b2lkIGdldEluZGV4
ZXMoaW50NjRfdCBvYmplY3RTdG9yZUlkLCBWZWN0b3I8aW50NjRfdD4mIGZvdW5kSWRzLCBWZWN0
b3I8U3RyaW5nPiYgZm91bmROYW1lcywgVmVjdG9yPFN0cmluZz4mIGZvdW5kS2V5UGF0aHMsIFZl
Y3Rvcjxib29sPiYgZm91bmRVbmlxdWVGbGFncykgPSAwOworICAgIHZpcnR1YWwgYm9vbCBjcmVh
dGVJbmRleChpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3Qg
U3RyaW5nJiBrZXlQYXRoLCBib29sIGlzVW5pcXVlLCBpbnQ2NF90JiBpbmRleElkKSA9IDA7Cisg
ICAgdmlydHVhbCB2b2lkIGRlbGV0ZUluZGV4KGludDY0X3QgaW5kZXhJZCkgPSAwOworICAgIHZp
cnR1YWwgYm9vbCBwdXRJbmRleERhdGFGb3JSZWNvcmQoaW50NjRfdCBpbmRleElkLCBjb25zdCBJ
REJLZXkmLCBpbnQ2NF90IG9iamVjdFN0b3JlRGF0YUlkKSA9IDA7CisgICAgdmlydHVhbCBib29s
IGRlbGV0ZUluZGV4RGF0YUZvclJlY29yZChpbnQ2NF90IG9iamVjdFN0b3JlRGF0YUlkKSA9IDA7
CisgICAgdmlydHVhbCBTdHJpbmcgZ2V0T2JqZWN0VmlhSW5kZXgoaW50NjRfdCBpbmRleElkLCBj
b25zdCBJREJLZXkmKSA9IDA7CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQktleT4gZ2V0UHJp
bWFyeUtleVZpYUluZGV4KGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JikgPSAwOworICAg
IHZpcnR1YWwgYm9vbCBrZXlFeGlzdHNJbkluZGV4KGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURC
S2V5JikgPSAwOwogCiAgICAgY2xhc3MgQ3Vyc29yIDogcHVibGljIFJlZkNvdW50ZWQ8Q3Vyc29y
PiB7CiAgICAgcHVibGljOgpAQCAtODcsOSArODYsOSBAQCBwdWJsaWM6CiAgICAgICAgIHZpcnR1
YWwgfkN1cnNvcigpIHt9OwogICAgIH07CiAKLSAgICBQYXNzUmVmUHRyPEN1cnNvcj4gb3Blbk9i
amVjdFN0b3JlQ3Vyc29yKGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5UmFuZ2Uq
LCBJREJDdXJzb3I6OkRpcmVjdGlvbik7Ci0gICAgUGFzc1JlZlB0cjxDdXJzb3I+IG9wZW5JbmRl
eEtleUN1cnNvcihpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleVJhbmdlKiwgSURCQ3Vyc29y
OjpEaXJlY3Rpb24pOwotICAgIFBhc3NSZWZQdHI8Q3Vyc29yPiBvcGVuSW5kZXhDdXJzb3IoaW50
NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXlSYW5nZSosIElEQkN1cnNvcjo6RGlyZWN0aW9uKTsK
KyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Q3Vyc29yPiBvcGVuT2JqZWN0U3RvcmVDdXJzb3IoaW50
NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXlSYW5nZSosIElEQkN1cnNvcjo6RGlyZWN0
aW9uKSA9IDA7CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPEN1cnNvcj4gb3BlbkluZGV4S2V5Q3Vy
c29yKGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5UmFuZ2UqLCBJREJDdXJzb3I6OkRpcmVj
dGlvbikgPSAwOworICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxDdXJzb3I+IG9wZW5JbmRleEN1cnNv
cihpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleVJhbmdlKiwgSURCQ3Vyc29yOjpEaXJlY3Rp
b24pID0gMDsKIAogICAgIGNsYXNzIFRyYW5zYWN0aW9uIDogcHVibGljIFJlZkNvdW50ZWQ8VHJh
bnNhY3Rpb24+IHsKICAgICBwdWJsaWM6CkBAIC05NywxNCArOTYsNyBAQCBwdWJsaWM6CiAgICAg
ICAgIHZpcnR1YWwgdm9pZCBjb21taXQoKSA9IDA7CiAgICAgICAgIHZpcnR1YWwgdm9pZCByb2xs
YmFjaygpID0gMDsKICAgICB9OwotICAgIFBhc3NSZWZQdHI8VHJhbnNhY3Rpb24+IGNyZWF0ZVRy
YW5zYWN0aW9uKCk7Ci0KLXByaXZhdGU6Ci0gICAgSURCQmFja2luZ1N0b3JlKFN0cmluZyBpZGVu
dGlmaWVyLCBJREJGYWN0b3J5QmFja2VuZEltcGwqIGZhY3RvcnkpOwotCi0gICAgU1FMaXRlRGF0
YWJhc2UgbV9kYjsKLSAgICBTdHJpbmcgbV9pZGVudGlmaWVyOwotICAgIFJlZlB0cjxJREJGYWN0
b3J5QmFja2VuZEltcGw+IG1fZmFjdG9yeTsKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8VHJhbnNh
Y3Rpb24+IGNyZWF0ZVRyYW5zYWN0aW9uKCkgPSAwOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJGYWN0b3J5QmFja2Vu
ZEltcGwuY3BwIGIvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJGYWN0b3J5QmFja2VuZEltcGwu
Y3BwCmluZGV4IDU4N2M1OGIuLjQ2MWU5MzAgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3N0
b3JhZ2UvSURCRmFjdG9yeUJhY2tlbmRJbXBsLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9zdG9y
YWdlL0lEQkZhY3RvcnlCYWNrZW5kSW1wbC5jcHAKQEAgLTMwLDkgKzMwLDkgQEAKICNpbmNsdWRl
ICJJREJGYWN0b3J5QmFja2VuZEltcGwuaCIKIAogI2luY2x1ZGUgIkRPTVN0cmluZ0xpc3QuaCIK
LSNpbmNsdWRlICJJREJCYWNraW5nU3RvcmUuaCIKICNpbmNsdWRlICJJREJEYXRhYmFzZUJhY2tl
bmRJbXBsLmgiCiAjaW5jbHVkZSAiSURCRGF0YWJhc2VFeGNlcHRpb24uaCIKKyNpbmNsdWRlICJJ
REJTUUxpdGVCYWNraW5nU3RvcmUuaCIKICNpbmNsdWRlICJJREJUcmFuc2FjdGlvbkNvb3JkaW5h
dG9yLmgiCiAjaW5jbHVkZSAiU2VjdXJpdHlPcmlnaW4uaCIKICNpbmNsdWRlIDx3dGYvVGhyZWFk
aW5nLmg+CkBAIC04Niw3ICs4Niw3IEBAIHZvaWQgSURCRmFjdG9yeUJhY2tlbmRJbXBsOjpvcGVu
KGNvbnN0IFN0cmluZyYgbmFtZSwgUGFzc1JlZlB0cjxJREJDYWxsYmFja3M+IGNhCiAgICAgaWYg
KGl0MiAhPSBtX2JhY2tpbmdTdG9yZU1hcC5lbmQoKSkKICAgICAgICAgYmFja2luZ1N0b3JlID0g
aXQyLT5zZWNvbmQ7CiAgICAgZWxzZSB7Ci0gICAgICAgIGJhY2tpbmdTdG9yZSA9IElEQkJhY2tp
bmdTdG9yZTo6b3BlbihzZWN1cml0eU9yaWdpbi5nZXQoKSwgZGF0YURpciwgbWF4aW11bVNpemUs
IGZpbGVJZGVudGlmaWVyLCB0aGlzKTsKKyAgICAgICAgYmFja2luZ1N0b3JlID0gSURCU1FMaXRl
QmFja2luZ1N0b3JlOjpvcGVuKHNlY3VyaXR5T3JpZ2luLmdldCgpLCBkYXRhRGlyLCBtYXhpbXVt
U2l6ZSwgZmlsZUlkZW50aWZpZXIsIHRoaXMpOwogICAgICAgICBpZiAoIWJhY2tpbmdTdG9yZSkg
ewogICAgICAgICAgICAgY2FsbGJhY2tzLT5vbkVycm9yKElEQkRhdGFiYXNlRXJyb3I6OmNyZWF0
ZShJREJEYXRhYmFzZUV4Y2VwdGlvbjo6VU5LTk9XTl9FUlIsICJJbnRlcm5hbCBlcnJvci4iKSk7
CiAgICAgICAgICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdl
L0lEQlNRTGl0ZUJhY2tpbmdTdG9yZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQlNR
TGl0ZUJhY2tpbmdTdG9yZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4u
ZTQzYjdhMwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCU1FM
aXRlQmFja2luZ1N0b3JlLmNwcApAQCAtMCwwICsxLDk5NiBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05U
UklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKyNpbmNsdWRlICJJREJTUUxpdGVCYWNraW5nU3RvcmUuaCIKKworI2lmIEVOQUJM
RShJTkRFWEVEX0RBVEFCQVNFKQorCisjaW5jbHVkZSAiRmlsZVN5c3RlbS5oIgorI2luY2x1ZGUg
IklEQkZhY3RvcnlCYWNrZW5kSW1wbC5oIgorI2luY2x1ZGUgIklEQktleS5oIgorI2luY2x1ZGUg
IklEQktleVJhbmdlLmgiCisjaW5jbHVkZSAiU1FMaXRlRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJT
UUxpdGVTdGF0ZW1lbnQuaCIKKyNpbmNsdWRlICJTUUxpdGVUcmFuc2FjdGlvbi5oIgorI2luY2x1
ZGUgIlNlY3VyaXR5T3JpZ2luLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworSURCU1FMaXRl
QmFja2luZ1N0b3JlOjpJREJTUUxpdGVCYWNraW5nU3RvcmUoU3RyaW5nIGlkZW50aWZpZXIsIElE
QkZhY3RvcnlCYWNrZW5kSW1wbCogZmFjdG9yeSkKKyAgICA6IG1faWRlbnRpZmllcihpZGVudGlm
aWVyKQorICAgICwgbV9mYWN0b3J5KGZhY3RvcnkpCit7CisgICAgbV9mYWN0b3J5LT5hZGRJREJC
YWNraW5nU3RvcmUoaWRlbnRpZmllciwgdGhpcyk7Cit9CisKK0lEQlNRTGl0ZUJhY2tpbmdTdG9y
ZTo6fklEQlNRTGl0ZUJhY2tpbmdTdG9yZSgpCit7CisgICAgbV9mYWN0b3J5LT5yZW1vdmVJREJC
YWNraW5nU3RvcmUobV9pZGVudGlmaWVyKTsKK30KKworc3RhdGljIGJvb2wgcnVuQ29tbWFuZHMo
U1FMaXRlRGF0YWJhc2UmIHNxbGl0ZURhdGFiYXNlLCBjb25zdCBjaGFyKiogY29tbWFuZHMsIHNp
emVfdCBudW1iZXJPZkNvbW1hbmRzKQoreworICAgIFNRTGl0ZVRyYW5zYWN0aW9uIHRyYW5zYWN0
aW9uKHNxbGl0ZURhdGFiYXNlLCBmYWxzZSk7CisgICAgdHJhbnNhY3Rpb24uYmVnaW4oKTsKKyAg
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bWJlck9mQ29tbWFuZHM7ICsraSkgeworICAgICAg
ICBpZiAoIXNxbGl0ZURhdGFiYXNlLmV4ZWN1dGVDb21tYW5kKGNvbW1hbmRzW2ldKSkgeworICAg
ICAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBm
b3IgSW5kZXhlZERCOiAlcyIsIGNvbW1hbmRzW2ldKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICB0cmFuc2FjdGlvbi5jb21taXQoKTsKKyAgICByZXR1
cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgY3JlYXRlVGFibGVzKFNRTGl0ZURhdGFiYXNlJiBz
cWxpdGVEYXRhYmFzZSkKK3sKKyAgICBpZiAoc3FsaXRlRGF0YWJhc2UudGFibGVFeGlzdHMoIkRh
dGFiYXNlcyIpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciog
Y29tbWFuZHNbXSA9IHsKKyAgICAgICAgIkNSRUFURSBUQUJMRSBEYXRhYmFzZXMgKGlkIElOVEVH
RVIgUFJJTUFSWSBLRVksIG5hbWUgVEVYVCBOT1QgTlVMTCwgZGVzY3JpcHRpb24gVEVYVCBOT1Qg
TlVMTCwgdmVyc2lvbiBURVhUIE5PVCBOVUxMKSIsCisgICAgICAgICJDUkVBVEUgVU5JUVVFIElO
REVYIERhdGFiYXNlc19uYW1lIE9OIERhdGFiYXNlcyhuYW1lKSIsCisKKyAgICAgICAgIkNSRUFU
RSBUQUJMRSBPYmplY3RTdG9yZXMgKGlkIElOVEVHRVIgUFJJTUFSWSBLRVksIG5hbWUgVEVYVCBO
T1QgTlVMTCwga2V5UGF0aCBURVhULCBkb0F1dG9JbmNyZW1lbnQgSU5URUdFUiBOT1QgTlVMTCwg
ZGF0YWJhc2VJZCBJTlRFR0VSIE5PVCBOVUxMIFJFRkVSRU5DRVMgRGF0YWJhc2VzKGlkKSkiLAor
ICAgICAgICAiQ1JFQVRFIFVOSVFVRSBJTkRFWCBPYmplY3RTdG9yZXNfY29tcG9zaXQgT04gT2Jq
ZWN0U3RvcmVzKGRhdGFiYXNlSWQsIG5hbWUpIiwKKworICAgICAgICAiQ1JFQVRFIFRBQkxFIElu
ZGV4ZXMgKGlkIElOVEVHRVIgUFJJTUFSWSBLRVksIG9iamVjdFN0b3JlSWQgSU5URUdFUiBOT1Qg
TlVMTCBSRUZFUkVOQ0VTIE9iamVjdFN0b3JlKGlkKSwgbmFtZSBURVhUIE5PVCBOVUxMLCBrZXlQ
YXRoIFRFWFQsIGlzVW5pcXVlIElOVEVHRVIgTk9UIE5VTEwpIiwKKyAgICAgICAgIkNSRUFURSBV
TklRVUUgSU5ERVggSW5kZXhlc19jb21wb3NpdCBPTiBJbmRleGVzKG9iamVjdFN0b3JlSWQsIG5h
bWUpIiwKKworICAgICAgICAiQ1JFQVRFIFRBQkxFIE9iamVjdFN0b3JlRGF0YSAoaWQgSU5URUdF
UiBQUklNQVJZIEtFWSwgb2JqZWN0U3RvcmVJZCBJTlRFR0VSIE5PVCBOVUxMIFJFRkVSRU5DRVMg
T2JqZWN0U3RvcmUoaWQpLCBrZXlTdHJpbmcgVEVYVCwga2V5RGF0ZSBJTlRFR0VSLCBrZXlOdW1i
ZXIgSU5URUdFUiwgdmFsdWUgVEVYVCBOT1QgTlVMTCkiLAorICAgICAgICAiQ1JFQVRFIFVOSVFV
RSBJTkRFWCBPYmplY3RTdG9yZURhdGFfY29tcG9zaXQgT04gT2JqZWN0U3RvcmVEYXRhKGtleVN0
cmluZywga2V5RGF0ZSwga2V5TnVtYmVyLCBvYmplY3RTdG9yZUlkKSIsCisKKyAgICAgICAgIkNS
RUFURSBUQUJMRSBJbmRleERhdGEgKGlkIElOVEVHRVIgUFJJTUFSWSBLRVksIGluZGV4SWQgSU5U
RUdFUiBOT1QgTlVMTCBSRUZFUkVOQ0VTIEluZGV4ZXMoaWQpLCBrZXlTdHJpbmcgVEVYVCwga2V5
RGF0ZSBJTlRFR0VSLCBrZXlOdW1iZXIgSU5URUdFUiwgb2JqZWN0U3RvcmVEYXRhSWQgSU5URUdF
UiBOT1QgTlVMTCBSRUZFUkVOQ0VTIE9iamVjdFN0b3JlRGF0YShpZCkpIiwKKyAgICAgICAgIkNS
RUFURSBJTkRFWCBJbmRleERhdGFfY29tcG9zaXQgT04gSW5kZXhEYXRhKGtleVN0cmluZywga2V5
RGF0ZSwga2V5TnVtYmVyLCBpbmRleElkKSIsCisgICAgICAgICJDUkVBVEUgSU5ERVggSW5kZXhE
YXRhX29iamVjdFN0b3JlRGF0YUlkIE9OIEluZGV4RGF0YShvYmplY3RTdG9yZURhdGFJZCkiLAor
ICAgICAgICAiQ1JFQVRFIElOREVYIEluZGV4RGF0YV9pbmRleElkIE9OIEluZGV4RGF0YShpbmRl
eElkKSIsCisgICAgICAgIH07CisKKyAgICByZXR1cm4gcnVuQ29tbWFuZHMoc3FsaXRlRGF0YWJh
c2UsIGNvbW1hbmRzLCBzaXplb2YoY29tbWFuZHMpIC8gc2l6ZW9mKGNvbW1hbmRzWzBdKSk7Cit9
CisKK3N0YXRpYyBib29sIGNyZWF0ZU1ldGFEYXRhVGFibGUoU1FMaXRlRGF0YWJhc2UmIHNxbGl0
ZURhdGFiYXNlKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjb21tYW5kc1tdID0geworICAg
ICAgICAiQ1JFQVRFIFRBQkxFIE1ldGFEYXRhIChuYW1lIFRFWFQgUFJJTUFSWSBLRVksIHZhbHVl
IE5PTkUpIiwKKyAgICAgICAgIklOU0VSVCBJTlRPIE1ldGFEYXRhIFZBTFVFUyAoJ3ZlcnNpb24n
LCAxKSIsCisgICAgfTsKKworICAgIHJldHVybiBydW5Db21tYW5kcyhzcWxpdGVEYXRhYmFzZSwg
Y29tbWFuZHMsIHNpemVvZihjb21tYW5kcykgLyBzaXplb2YoY29tbWFuZHNbMF0pKTsKK30KKwor
c3RhdGljIGJvb2wgZ2V0RGF0YWJhc2VTY2hlbWFWZXJzaW9uKFNRTGl0ZURhdGFiYXNlJiBzcWxp
dGVEYXRhYmFzZSwgaW50KiBkYXRhYmFzZVZlcnNpb24pCit7CisgICAgU1FMaXRlU3RhdGVtZW50
IHF1ZXJ5KHNxbGl0ZURhdGFiYXNlLCAiU0VMRUNUIHZhbHVlIEZST00gTWV0YURhdGEgV0hFUkUg
bmFtZSA9ICd2ZXJzaW9uJyIpOworICAgIGlmIChxdWVyeS5wcmVwYXJlKCkgIT0gU1FMUmVzdWx0
T2sgfHwgcXVlcnkuc3RlcCgpICE9IFNRTFJlc3VsdFJvdykKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgKmRhdGFiYXNlVmVyc2lvbiA9IHF1ZXJ5LmdldENvbHVtbkludCgwKTsKKyAgICBy
ZXR1cm4gcXVlcnkuZmluYWxpemUoKSA9PSBTUUxSZXN1bHRPazsKK30KKworc3RhdGljIGJvb2wg
bWlncmF0ZURhdGFiYXNlKFNRTGl0ZURhdGFiYXNlJiBzcWxpdGVEYXRhYmFzZSkKK3sKKyAgICBp
ZiAoIXNxbGl0ZURhdGFiYXNlLnRhYmxlRXhpc3RzKCJNZXRhRGF0YSIpKSB7CisgICAgICAgIGlm
ICghY3JlYXRlTWV0YURhdGFUYWJsZShzcWxpdGVEYXRhYmFzZSkpCisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50IGRhdGFiYXNlVmVyc2lvbjsKKyAgICBpZiAoIWdl
dERhdGFiYXNlU2NoZW1hVmVyc2lvbihzcWxpdGVEYXRhYmFzZSwgJmRhdGFiYXNlVmVyc2lvbikp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChkYXRhYmFzZVZlcnNpb24gPT0gMSkg
eworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogY29tbWFuZHNbXSA9IHsKKyAgICAgICAgICAg
ICJEUk9QIFRBQkxFIElGIEVYSVNUUyBPYmplY3RTdG9yZURhdGEyIiwKKyAgICAgICAgICAgICJD
UkVBVEUgVEFCTEUgT2JqZWN0U3RvcmVEYXRhMiAoaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgb2Jq
ZWN0U3RvcmVJZCBJTlRFR0VSIE5PVCBOVUxMIFJFRkVSRU5DRVMgT2JqZWN0U3RvcmUoaWQpLCBr
ZXlTdHJpbmcgVEVYVCwga2V5RGF0ZSBSRUFMLCBrZXlOdW1iZXIgUkVBTCwgdmFsdWUgVEVYVCBO
T1QgTlVMTCkiLAorICAgICAgICAgICAgIklOU0VSVCBJTlRPIE9iamVjdFN0b3JlRGF0YTIgU0VM
RUNUICogRlJPTSBPYmplY3RTdG9yZURhdGEiLAorICAgICAgICAgICAgIkRST1AgVEFCTEUgT2Jq
ZWN0U3RvcmVEYXRhIiwgLy8gVGhpcyBkZXBlbmRzIG9uIFNRTGl0ZSBub3QgZW5mb3JjaW5nIHJl
ZmVyZW50aWFsIGNvbnNpc3RlbmN5LgorICAgICAgICAgICAgIkFMVEVSIFRBQkxFIE9iamVjdFN0
b3JlRGF0YTIgUkVOQU1FIFRPIE9iamVjdFN0b3JlRGF0YSIsCisgICAgICAgICAgICAiQ1JFQVRF
IFVOSVFVRSBJTkRFWCBPYmplY3RTdG9yZURhdGFfY29tcG9zaXQgT04gT2JqZWN0U3RvcmVEYXRh
KGtleVN0cmluZywga2V5RGF0ZSwga2V5TnVtYmVyLCBvYmplY3RTdG9yZUlkKSIsCisgICAgICAg
ICAgICAiRFJPUCBUQUJMRSBJRiBFWElTVFMgSW5kZXhEYXRhMiIsIC8vIFRoaXMgZGVwZW5kcyBv
biBTUUxpdGUgbm90IGVuZm9yY2luZyByZWZlcmVudGlhbCBjb25zaXN0ZW5jeS4KKyAgICAgICAg
ICAgICJDUkVBVEUgVEFCTEUgSW5kZXhEYXRhMiAoaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgaW5k
ZXhJZCBJTlRFR0VSIE5PVCBOVUxMIFJFRkVSRU5DRVMgSW5kZXhlcyhpZCksIGtleVN0cmluZyBU
RVhULCBrZXlEYXRlIFJFQUwsIGtleU51bWJlciBSRUFMLCBvYmplY3RTdG9yZURhdGFJZCBJTlRF
R0VSIE5PVCBOVUxMIFJFRkVSRU5DRVMgT2JqZWN0U3RvcmVEYXRhKGlkKSkiLAorICAgICAgICAg
ICAgIklOU0VSVCBJTlRPIEluZGV4RGF0YTIgU0VMRUNUICogRlJPTSBJbmRleERhdGEiLAorICAg
ICAgICAgICAgIkRST1AgVEFCTEUgSW5kZXhEYXRhIiwKKyAgICAgICAgICAgICJBTFRFUiBUQUJM
RSBJbmRleERhdGEyIFJFTkFNRSBUTyBJbmRleERhdGEiLAorICAgICAgICAgICAgIkNSRUFURSBJ
TkRFWCBJbmRleERhdGFfY29tcG9zaXQgT04gSW5kZXhEYXRhKGtleVN0cmluZywga2V5RGF0ZSwg
a2V5TnVtYmVyLCBpbmRleElkKSIsCisgICAgICAgICAgICAiQ1JFQVRFIElOREVYIEluZGV4RGF0
YV9vYmplY3RTdG9yZURhdGFJZCBPTiBJbmRleERhdGEob2JqZWN0U3RvcmVEYXRhSWQpIiwKKyAg
ICAgICAgICAgICJDUkVBVEUgSU5ERVggSW5kZXhEYXRhX2luZGV4SWQgT04gSW5kZXhEYXRhKGlu
ZGV4SWQpIiwKKyAgICAgICAgICAgICJVUERBVEUgTWV0YURhdGEgU0VUIHZhbHVlID0gMiBXSEVS
RSBuYW1lID0gJ3ZlcnNpb24nIiwKKyAgICAgICAgfTsKKworICAgICAgICBpZiAoIXJ1bkNvbW1h
bmRzKHNxbGl0ZURhdGFiYXNlLCBjb21tYW5kcywgc2l6ZW9mKGNvbW1hbmRzKSAvIHNpemVvZihj
b21tYW5kc1swXSkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGRhdGFi
YXNlVmVyc2lvbiA9IDI7CisgICAgfQorCisgICAgaWYgKGRhdGFiYXNlVmVyc2lvbiA9PSAyKSB7
CisgICAgICAgIC8vIFdlIG5lZWQgdG8gbWFrZSB0aGUgT2JqZWN0U3RvcmVEYXRhLnZhbHVlIGJl
IGEgQkxPQiBpbnN0ZWFkIG9mIFRFWFQuCisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjb21t
YW5kc1tdID0geworICAgICAgICAgICAgIkRST1AgVEFCTEUgSUYgRVhJU1RTIE9iamVjdFN0b3Jl
RGF0YSIsIC8vIFRoaXMgZHJvcHMgYXNzb2NpYXRlZCBpbmRpY2VzLgorICAgICAgICAgICAgIkNS
RUFURSBUQUJMRSBPYmplY3RTdG9yZURhdGEgKGlkIElOVEVHRVIgUFJJTUFSWSBLRVksIG9iamVj
dFN0b3JlSWQgSU5URUdFUiBOT1QgTlVMTCBSRUZFUkVOQ0VTIE9iamVjdFN0b3JlKGlkKSwga2V5
U3RyaW5nIFRFWFQsIGtleURhdGUgUkVBTCwga2V5TnVtYmVyIFJFQUwsIHZhbHVlIEJMT0IgTk9U
IE5VTEwpIiwKKyAgICAgICAgICAgICJDUkVBVEUgVU5JUVVFIElOREVYIE9iamVjdFN0b3JlRGF0
YV9jb21wb3NpdCBPTiBPYmplY3RTdG9yZURhdGEoa2V5U3RyaW5nLCBrZXlEYXRlLCBrZXlOdW1i
ZXIsIG9iamVjdFN0b3JlSWQpIiwKKyAgICAgICAgICAgICJVUERBVEUgTWV0YURhdGEgU0VUIHZh
bHVlID0gMyBXSEVSRSBuYW1lID0gJ3ZlcnNpb24nIiwKKyAgICAgICAgfTsKKworICAgICAgICBp
ZiAoIXJ1bkNvbW1hbmRzKHNxbGl0ZURhdGFiYXNlLCBjb21tYW5kcywgc2l6ZW9mKGNvbW1hbmRz
KSAvIHNpemVvZihjb21tYW5kc1swXSkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgICAgIGRhdGFiYXNlVmVyc2lvbiA9IDM7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9
CisKK1Bhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlPiBJREJTUUxpdGVCYWNraW5nU3RvcmU6Om9w
ZW4oU2VjdXJpdHlPcmlnaW4qIHNlY3VyaXR5T3JpZ2luLCBjb25zdCBTdHJpbmcmIHBhdGhCYXNl
LCBpbnQ2NF90IG1heGltdW1TaXplLCBjb25zdCBTdHJpbmcmIGZpbGVJZGVudGlmaWVyLCBJREJG
YWN0b3J5QmFja2VuZEltcGwqIGZhY3RvcnkpCit7CisgICAgUmVmUHRyPElEQlNRTGl0ZUJhY2tp
bmdTdG9yZT4gYmFja2luZ1N0b3JlKGFkb3B0UmVmKG5ldyBJREJTUUxpdGVCYWNraW5nU3RvcmUo
ZmlsZUlkZW50aWZpZXIsIGZhY3RvcnkpKSk7CisKKyAgICBTdHJpbmcgcGF0aCA9ICI6bWVtb3J5
OiI7CisgICAgaWYgKCFwYXRoQmFzZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgaWYgKCFtYWtlQWxs
RGlyZWN0b3JpZXMocGF0aEJhc2UpKSB7CisgICAgICAgICAgICAvLyBGSVhNRTogSXMgdGhlcmUg
YW55IG90aGVyIHRoaW5nIHdlIGNvdWxkIHBvc3NpYmx5IGRvIHRvIHJlY292ZXIgYXQgdGhpcyBw
b2ludD8gSWYgc28sIGRvIGl0IHJhdGhlciB0aGFuIGp1c3QgZXJyb3Jpbmcgb3V0LgorICAgICAg
ICAgICAgTE9HX0VSUk9SKCJVbmFibGVkIHRvIGNyZWF0ZSBMb2NhbFN0b3JhZ2UgZGF0YWJhc2Ug
cGF0aCAlcyIsIHBhdGhCYXNlLnV0ZjgoKS5kYXRhKCkpOworICAgICAgICAgICAgcmV0dXJuIDA7
CisgICAgICAgIH0KKyAgICAgICAgcGF0aCA9IHBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChwYXRo
QmFzZSwgc2VjdXJpdHlPcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpICsgIi5pbmRleGVkZGIi
KTsKKyAgICB9CisKKyAgICBpZiAoIWJhY2tpbmdTdG9yZS0+bV9kYi5vcGVuKHBhdGgpKSB7Cisg
ICAgICAgIC8vIEZJWE1FOiBJcyB0aGVyZSBhbnkgb3RoZXIgdGhpbmcgd2UgY291bGQgcG9zc2li
bHkgZG8gdG8gcmVjb3ZlciBhdCB0aGlzIHBvaW50PyBJZiBzbywgZG8gaXQgcmF0aGVyIHRoYW4g
anVzdCBlcnJvcmluZyBvdXQuCisgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIG9wZW4gZGF0
YWJhc2UgZmlsZSAlcyBmb3IgSW5kZXhlZERCIiwgcGF0aC51dGY4KCkuZGF0YSgpKTsKKyAgICAg
ICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gRklYTUU6IEVycm9yIGNoZWNraW5nPworICAg
IGJhY2tpbmdTdG9yZS0+bV9kYi5zZXRNYXhpbXVtU2l6ZShtYXhpbXVtU2l6ZSk7CisgICAgYmFj
a2luZ1N0b3JlLT5tX2RiLnR1cm5PbkluY3JlbWVudGFsQXV0b1ZhY3V1bSgpOworCisgICAgaWYg
KCFjcmVhdGVUYWJsZXMoYmFja2luZ1N0b3JlLT5tX2RiKSkKKyAgICAgICAgcmV0dXJuIDA7Cisg
ICAgaWYgKCFtaWdyYXRlRGF0YWJhc2UoYmFja2luZ1N0b3JlLT5tX2RiKSkKKyAgICAgICAgcmV0
dXJuIDA7CisKKyAgICByZXR1cm4gYmFja2luZ1N0b3JlLnJlbGVhc2UoKTsKK30KKworYm9vbCBJ
REJTUUxpdGVCYWNraW5nU3RvcmU6OmV4dHJhY3RJREJEYXRhYmFzZU1ldGFEYXRhKGNvbnN0IFN0
cmluZyYgbmFtZSwgU3RyaW5nJiBmb3VuZFZlcnNpb24sIGludDY0X3QmIGZvdW5kSWQpCit7Cisg
ICAgU1FMaXRlU3RhdGVtZW50IGRhdGFiYXNlUXVlcnkobV9kYiwgIlNFTEVDVCBpZCwgdmVyc2lv
biBGUk9NIERhdGFiYXNlcyBXSEVSRSBuYW1lID0gPyIpOworICAgIGlmIChkYXRhYmFzZVF1ZXJ5
LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykgeworICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQo
KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBkYXRhYmFzZVF1ZXJ5LmJpbmRU
ZXh0KDEsIG5hbWUpOworICAgIGlmIChkYXRhYmFzZVF1ZXJ5LnN0ZXAoKSAhPSBTUUxSZXN1bHRS
b3cpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGZvdW5kSWQgPSBkYXRhYmFzZVF1ZXJ5
LmdldENvbHVtbkludDY0KDApOworICAgIGZvdW5kVmVyc2lvbiA9IGRhdGFiYXNlUXVlcnkuZ2V0
Q29sdW1uVGV4dCgxKTsKKworICAgIGlmIChkYXRhYmFzZVF1ZXJ5LnN0ZXAoKSA9PSBTUUxSZXN1
bHRSb3cpCisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiB0cnVlOwor
fQorCitib29sIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6c2V0SURCRGF0YWJhc2VNZXRhRGF0YShj
b25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgdmVyc2lvbiwgaW50NjRfdCYgcm93SWQs
IGJvb2wgaW52YWxpZFJvd0lkKQoreworICAgIEFTU0VSVCghbmFtZS5pc051bGwoKSk7CisgICAg
QVNTRVJUKCF2ZXJzaW9uLmlzTnVsbCgpKTsKKworICAgIFN0cmluZyBzcWwgPSBpbnZhbGlkUm93
SWQgPyAiSU5TRVJUIElOVE8gRGF0YWJhc2VzIChuYW1lLCBkZXNjcmlwdGlvbiwgdmVyc2lvbikg
VkFMVUVTICg/LCAnJywgPykiIDogIlVQREFURSBEYXRhYmFzZXMgU0VUIG5hbWUgPSA/LCB2ZXJz
aW9uID0gPyBXSEVSRSBpZCA9ID8iOworICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVyeShtX2RiLCBz
cWwpOworICAgIGlmIChxdWVyeS5wcmVwYXJlKCkgIT0gU1FMUmVzdWx0T2spIHsKKyAgICAgICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAg
ICBxdWVyeS5iaW5kVGV4dCgxLCBuYW1lKTsKKyAgICBxdWVyeS5iaW5kVGV4dCgyLCB2ZXJzaW9u
KTsKKyAgICBpZiAoIWludmFsaWRSb3dJZCkKKyAgICAgICAgcXVlcnkuYmluZEludDY0KDMsIHJv
d0lkKTsKKworICAgIGlmIChxdWVyeS5zdGVwKCkgIT0gU1FMUmVzdWx0RG9uZSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgaWYgKGludmFsaWRSb3dJZCkKKyAgICAgICAgcm93SWQgPSBt
X2RiLmxhc3RJbnNlcnRSb3dJRCgpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgSURC
U1FMaXRlQmFja2luZ1N0b3JlOjpnZXRPYmplY3RTdG9yZXMoaW50NjRfdCBkYXRhYmFzZUlkLCBW
ZWN0b3I8aW50NjRfdD4mIGZvdW5kSWRzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmROYW1lcywgVmVj
dG9yPFN0cmluZz4mIGZvdW5kS2V5UGF0aHMsIFZlY3Rvcjxib29sPiYgZm91bmRBdXRvSW5jcmVt
ZW50RmxhZ3MpCit7CisgICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGIsICJTRUxFQ1QgaWQs
IG5hbWUsIGtleVBhdGgsIGRvQXV0b0luY3JlbWVudCBGUk9NIE9iamVjdFN0b3JlcyBXSEVSRSBk
YXRhYmFzZUlkID0gPyIpOworICAgIGJvb2wgb2sgPSBxdWVyeS5wcmVwYXJlKCkgPT0gU1FMUmVz
dWx0T2s7CisgICAgQVNTRVJUX1VOVVNFRChvaywgb2spOyAvLyBGSVhNRTogQmV0dGVyIGVycm9y
IGhhbmRsaW5nPworCisgICAgQVNTRVJUKGZvdW5kSWRzLmlzRW1wdHkoKSk7CisgICAgQVNTRVJU
KGZvdW5kTmFtZXMuaXNFbXB0eSgpKTsKKyAgICBBU1NFUlQoZm91bmRLZXlQYXRocy5pc0VtcHR5
KCkpOworICAgIEFTU0VSVChmb3VuZEF1dG9JbmNyZW1lbnRGbGFncy5pc0VtcHR5KCkpOworCisg
ICAgcXVlcnkuYmluZEludDY0KDEsIGRhdGFiYXNlSWQpOworCisgICAgd2hpbGUgKHF1ZXJ5LnN0
ZXAoKSA9PSBTUUxSZXN1bHRSb3cpIHsKKyAgICAgICAgZm91bmRJZHMuYXBwZW5kKHF1ZXJ5Lmdl
dENvbHVtbkludDY0KDApKTsKKyAgICAgICAgZm91bmROYW1lcy5hcHBlbmQocXVlcnkuZ2V0Q29s
dW1uVGV4dCgxKSk7CisgICAgICAgIGZvdW5kS2V5UGF0aHMuYXBwZW5kKHF1ZXJ5LmdldENvbHVt
blRleHQoMikpOworICAgICAgICBmb3VuZEF1dG9JbmNyZW1lbnRGbGFncy5hcHBlbmQoISFxdWVy
eS5nZXRDb2x1bW5JbnQoMykpOworICAgIH0KK30KKworYm9vbCBJREJTUUxpdGVCYWNraW5nU3Rv
cmU6OmNyZWF0ZU9iamVjdFN0b3JlKGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBr
ZXlQYXRoLCBib29sIGF1dG9JbmNyZW1lbnQsIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCYg
YXNzaWduZWRPYmplY3RTdG9yZUlkKQoreworICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVyeShtX2Ri
LCAiSU5TRVJUIElOVE8gT2JqZWN0U3RvcmVzIChuYW1lLCBrZXlQYXRoLCBkb0F1dG9JbmNyZW1l
bnQsIGRhdGFiYXNlSWQpIFZBTFVFUyAoPywgPywgPywgPykiKTsKKyAgICBpZiAocXVlcnkucHJl
cGFyZSgpICE9IFNRTFJlc3VsdE9rKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBxdWVy
eS5iaW5kVGV4dCgxLCBuYW1lKTsKKyAgICBxdWVyeS5iaW5kVGV4dCgyLCBrZXlQYXRoKTsKKyAg
ICBxdWVyeS5iaW5kSW50KDMsIHN0YXRpY19jYXN0PGludD4oYXV0b0luY3JlbWVudCkpOworICAg
IHF1ZXJ5LmJpbmRJbnQ2NCg0LCBkYXRhYmFzZUlkKTsKKworICAgIGlmIChxdWVyeS5zdGVwKCkg
IT0gU1FMUmVzdWx0RG9uZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYXNzaWduZWRP
YmplY3RTdG9yZUlkID0gbV9kYi5sYXN0SW5zZXJ0Um93SUQoKTsKKyAgICByZXR1cm4gdHJ1ZTsK
K30KKworc3RhdGljIHZvaWQgZG9EZWxldGUoU1FMaXRlRGF0YWJhc2UmIGRiLCBjb25zdCBjaGFy
KiBzcWwsIGludDY0X3QgaWQpCit7CisgICAgU1FMaXRlU3RhdGVtZW50IGRlbGV0ZVF1ZXJ5KGRi
LCBzcWwpOworICAgIGJvb2wgb2sgPSBkZWxldGVRdWVyeS5wcmVwYXJlKCkgPT0gU1FMUmVzdWx0
T2s7CisgICAgQVNTRVJUX1VOVVNFRChvaywgb2spOyAvLyBGSVhNRTogQmV0dGVyIGVycm9yIGhh
bmRsaW5nLgorICAgIGRlbGV0ZVF1ZXJ5LmJpbmRJbnQ2NCgxLCBpZCk7CisgICAgb2sgPSBkZWxl
dGVRdWVyeS5zdGVwKCkgPT0gU1FMUmVzdWx0RG9uZTsKKyAgICBBU1NFUlRfVU5VU0VEKG9rLCBv
ayk7IC8vIEZJWE1FOiBCZXR0ZXIgZXJyb3IgaGFuZGxpbmcuCit9CisKK3ZvaWQgSURCU1FMaXRl
QmFja2luZ1N0b3JlOjpkZWxldGVPYmplY3RTdG9yZShpbnQ2NF90IG9iamVjdFN0b3JlSWQpCit7
CisgICAgZG9EZWxldGUobV9kYiwgIkRFTEVURSBGUk9NIE9iamVjdFN0b3JlcyBXSEVSRSBpZCA9
ID8iLCBvYmplY3RTdG9yZUlkKTsKKyAgICBkb0RlbGV0ZShtX2RiLCAiREVMRVRFIEZST00gT2Jq
ZWN0U3RvcmVEYXRhIFdIRVJFIG9iamVjdFN0b3JlSWQgPSA/Iiwgb2JqZWN0U3RvcmVJZCk7Cisg
ICAgZG9EZWxldGUobV9kYiwgIkRFTEVURSBGUk9NIEluZGV4RGF0YSBXSEVSRSBpbmRleElkIElO
IChTRUxFQ1QgaWQgRlJPTSBJbmRleGVzIFdIRVJFIG9iamVjdFN0b3JlSWQgPSA/KSIsIG9iamVj
dFN0b3JlSWQpOworICAgIGRvRGVsZXRlKG1fZGIsICJERUxFVEUgRlJPTSBJbmRleGVzIFdIRVJF
IG9iamVjdFN0b3JlSWQgPSA/Iiwgb2JqZWN0U3RvcmVJZCk7Cit9CisKK3N0YXRpYyBTdHJpbmcg
d2hlcmVTeW50YXhGb3JLZXkoY29uc3QgSURCS2V5JiBrZXksIFN0cmluZyBxdWFsaWZpZWRUYWJs
ZU5hbWUgPSAiIikKK3sKKyAgICBzd2l0Y2ggKGtleS50eXBlKCkpIHsKKyAgICBjYXNlIElEQktl
eTo6U3RyaW5nVHlwZToKKyAgICAgICAgcmV0dXJuIHF1YWxpZmllZFRhYmxlTmFtZSArICJrZXlT
dHJpbmcgPSA/ICBBTkQgICIgKyBxdWFsaWZpZWRUYWJsZU5hbWUgKyAia2V5RGF0ZSBJUyBOVUxM
ICBBTkQgICIgKyBxdWFsaWZpZWRUYWJsZU5hbWUgKyAia2V5TnVtYmVyIElTIE5VTEwgICI7Cisg
ICAgY2FzZSBJREJLZXk6Ok51bWJlclR5cGU6CisgICAgICAgIHJldHVybiBxdWFsaWZpZWRUYWJs
ZU5hbWUgKyAia2V5U3RyaW5nIElTIE5VTEwgIEFORCAgIiArIHF1YWxpZmllZFRhYmxlTmFtZSAr
ICJrZXlEYXRlIElTIE5VTEwgIEFORCAgIiArIHF1YWxpZmllZFRhYmxlTmFtZSArICJrZXlOdW1i
ZXIgPSA/ICAiOworICAgIGNhc2UgSURCS2V5OjpEYXRlVHlwZToKKyAgICAgICAgcmV0dXJuIHF1
YWxpZmllZFRhYmxlTmFtZSArICJrZXlTdHJpbmcgSVMgTlVMTCAgQU5EICAiICsgcXVhbGlmaWVk
VGFibGVOYW1lICsgImtleURhdGUgPSA/ICBBTkQgICIgKyBxdWFsaWZpZWRUYWJsZU5hbWUgKyAi
a2V5TnVtYmVyIElTIE5VTEwgICI7CisgICAgY2FzZSBJREJLZXk6Ok51bGxUeXBlOgorICAgICAg
ICByZXR1cm4gcXVhbGlmaWVkVGFibGVOYW1lICsgImtleVN0cmluZyBJUyBOVUxMICBBTkQgICIg
KyBxdWFsaWZpZWRUYWJsZU5hbWUgKyAia2V5RGF0ZSBJUyBOVUxMICBBTkQgICIgKyBxdWFsaWZp
ZWRUYWJsZU5hbWUgKyAia2V5TnVtYmVyIElTIE5VTEwgICI7CisgICAgfQorCisgICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuICIiOworfQorCisvLyBSZXR1cm5zIHRoZSBudW1i
ZXIgb2YgaXRlbXMgYm91bmQuCitzdGF0aWMgaW50IGJpbmRLZXlUb1F1ZXJ5KFNRTGl0ZVN0YXRl
bWVudCYgcXVlcnksIGludCBjb2x1bW4sIGNvbnN0IElEQktleSYga2V5KQoreworICAgIHN3aXRj
aCAoa2V5LnR5cGUoKSkgeworICAgIGNhc2UgSURCS2V5OjpTdHJpbmdUeXBlOgorICAgICAgICBx
dWVyeS5iaW5kVGV4dChjb2x1bW4sIGtleS5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiAxOwor
ICAgIGNhc2UgSURCS2V5OjpEYXRlVHlwZToKKyAgICAgICAgcXVlcnkuYmluZERvdWJsZShjb2x1
bW4sIGtleS5kYXRlKCkpOworICAgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIElEQktleTo6TnVt
YmVyVHlwZToKKyAgICAgICAgcXVlcnkuYmluZERvdWJsZShjb2x1bW4sIGtleS5udW1iZXIoKSk7
CisgICAgICAgIHJldHVybiAxOworICAgIGNhc2UgSURCS2V5OjpOdWxsVHlwZToKKyAgICAgICAg
cmV0dXJuIDA7CisgICAgfQorCisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJu
IDA7Cit9CisKK3N0YXRpYyBTdHJpbmcgbG93ZXJDdXJzb3JXaGVyZUZyYWdtZW50KGNvbnN0IElE
QktleSYga2V5LCBTdHJpbmcgY29tcGFyaXNvbk9wZXJhdG9yLCBTdHJpbmcgcXVhbGlmaWVkVGFi
bGVOYW1lID0gIiIpCit7CisgICAgc3dpdGNoIChrZXkudHlwZSgpKSB7CisgICAgY2FzZSBJREJL
ZXk6OlN0cmluZ1R5cGU6CisgICAgICAgIHJldHVybiAiPyAiICsgY29tcGFyaXNvbk9wZXJhdG9y
ICsgIiAiICsgcXVhbGlmaWVkVGFibGVOYW1lICsgImtleVN0cmluZyAgQU5EICAiOworICAgIGNh
c2UgSURCS2V5OjpEYXRlVHlwZToKKyAgICAgICAgcmV0dXJuICIoPyAiICsgY29tcGFyaXNvbk9w
ZXJhdG9yICsgIiAiICsgcXVhbGlmaWVkVGFibGVOYW1lICsgImtleURhdGUgIE9SIE5PVCAiICsg
cXVhbGlmaWVkVGFibGVOYW1lICsgImtleVN0cmluZyBJUyBOVUxMKSAgQU5EICAiOworICAgIGNh
c2UgSURCS2V5OjpOdW1iZXJUeXBlOgorICAgICAgICByZXR1cm4gIig/ICIgKyBjb21wYXJpc29u
T3BlcmF0b3IgKyAiICIgKyBxdWFsaWZpZWRUYWJsZU5hbWUgKyAia2V5TnVtYmVyICBPUiAgTk9U
ICIgKyBxdWFsaWZpZWRUYWJsZU5hbWUgKyAia2V5U3RyaW5nIElTIE5VTEwgIE9SICBOT1QgIiAr
IHF1YWxpZmllZFRhYmxlTmFtZSArICJrZXlEYXRlIElTIE5VTEwpICBBTkQgICI7CisgICAgY2Fz
ZSBJREJLZXk6Ok51bGxUeXBlOgorICAgICAgICBpZiAoY29tcGFyaXNvbk9wZXJhdG9yID09ICI8
IikKKyAgICAgICAgICAgIHJldHVybiAiTk9UKCIgKyBxdWFsaWZpZWRUYWJsZU5hbWUgKyAia2V5
U3RyaW5nIElTIE5VTEwgIEFORCAgIiArIHF1YWxpZmllZFRhYmxlTmFtZSArICJrZXlEYXRlIElT
IE5VTEwgIEFORCAgIiArIHF1YWxpZmllZFRhYmxlTmFtZSArICJrZXlOdW1iZXIgSVMgTlVMTCkg
IEFORCAgIjsKKyAgICAgICAgcmV0dXJuICIiOyAvLyBJZiBpdCdzID0sIHRoZSB1cHBlciBib3Vu
ZCBoYWxmIHdpbGwgZG8gdGhlIGNvbnN0cmFpbmluZy4gSWYgaXQncyA8PSwgdGhlbiB0aGF0J3Mg
YSBuby1vcC4KKyAgICB9CisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuICIi
OworfQorCitzdGF0aWMgU3RyaW5nIHVwcGVyQ3Vyc29yV2hlcmVGcmFnbWVudChjb25zdCBJREJL
ZXkmIGtleSwgU3RyaW5nIGNvbXBhcmlzb25PcGVyYXRvciwgU3RyaW5nIHF1YWxpZmllZFRhYmxl
TmFtZSA9ICIiKQoreworICAgIHN3aXRjaCAoa2V5LnR5cGUoKSkgeworICAgIGNhc2UgSURCS2V5
OjpTdHJpbmdUeXBlOgorICAgICAgICByZXR1cm4gIigiICsgcXVhbGlmaWVkVGFibGVOYW1lICsg
ImtleVN0cmluZyAiICsgY29tcGFyaXNvbk9wZXJhdG9yICsgIiA/ICBPUiAgIiArIHF1YWxpZmll
ZFRhYmxlTmFtZSArICJrZXlTdHJpbmcgSVMgTlVMTCkgIEFORCAgIjsKKyAgICBjYXNlIElEQktl
eTo6RGF0ZVR5cGU6CisgICAgICAgIHJldHVybiAiKCIgKyBxdWFsaWZpZWRUYWJsZU5hbWUgKyAi
a2V5RGF0ZSAiICsgY29tcGFyaXNvbk9wZXJhdG9yICsgIiA/IE9SICIgKyBxdWFsaWZpZWRUYWJs
ZU5hbWUgKyAia2V5RGF0ZSBJUyBOVUxMKSAgQU5EICAiICsgcXVhbGlmaWVkVGFibGVOYW1lICsg
ImtleVN0cmluZyBJUyBOVUxMICBBTkQgICI7CisgICAgY2FzZSBJREJLZXk6Ok51bWJlclR5cGU6
CisgICAgICAgIHJldHVybiAiKCIgKyBxdWFsaWZpZWRUYWJsZU5hbWUgKyAia2V5TnVtYmVyICIg
KyBjb21wYXJpc29uT3BlcmF0b3IgKyAiID8gT1IgIiArIHF1YWxpZmllZFRhYmxlTmFtZSArICJr
ZXlOdW1iZXIgSVMgTlVMTCkgIEFORCAgIiArIHF1YWxpZmllZFRhYmxlTmFtZSArICJrZXlTdHJp
bmcgSVMgTlVMTCAgQU5EICAiICsgcXVhbGlmaWVkVGFibGVOYW1lICsgImtleURhdGUgSVMgTlVM
TCAgQU5EICAiOworICAgIGNhc2UgSURCS2V5OjpOdWxsVHlwZToKKyAgICAgICAgaWYgKGNvbXBh
cmlzb25PcGVyYXRvciA9PSAiPCIpCisgICAgICAgICAgICByZXR1cm4gIjAgIT0gMCAgQU5EICAi
OworICAgICAgICByZXR1cm4gcXVhbGlmaWVkVGFibGVOYW1lICsgImtleVN0cmluZyBJUyBOVUxM
ICBBTkQgICIgKyBxdWFsaWZpZWRUYWJsZU5hbWUgKyAia2V5RGF0ZSBJUyBOVUxMICBBTkQgICIg
KyBxdWFsaWZpZWRUYWJsZU5hbWUgKyAia2V5TnVtYmVyIElTIE5VTEwgIEFORCAgIjsKKyAgICB9
CisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuICIiOworfQorCitTdHJpbmcg
SURCU1FMaXRlQmFja2luZ1N0b3JlOjpnZXRPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IG9iamVj
dFN0b3JlSWQsIGNvbnN0IElEQktleSYga2V5KQoreworICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVy
eShtX2RiLCAiU0VMRUNUIGtleVN0cmluZywga2V5RGF0ZSwga2V5TnVtYmVyLCB2YWx1ZSBGUk9N
IE9iamVjdFN0b3JlRGF0YSBXSEVSRSBvYmplY3RTdG9yZUlkID0gPyBBTkQgIiArIHdoZXJlU3lu
dGF4Rm9yS2V5KGtleSkpOworICAgIGJvb2wgb2sgPSBxdWVyeS5wcmVwYXJlKCkgPT0gU1FMUmVz
dWx0T2s7CisgICAgQVNTRVJUX1VOVVNFRChvaywgb2spOyAvLyBGSVhNRTogQmV0dGVyIGVycm9y
IGhhbmRsaW5nPworCisgICAgcXVlcnkuYmluZEludDY0KDEsIG9iamVjdFN0b3JlSWQpOworICAg
IGJpbmRLZXlUb1F1ZXJ5KHF1ZXJ5LCAyLCBrZXkpOworICAgIGlmIChxdWVyeS5zdGVwKCkgIT0g
U1FMUmVzdWx0Um93KQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7IC8vIE51bGwgU3RyaW5nIG1l
YW5zIHJlY29yZCBub3QgZm91bmQuCisKKyAgICBBU1NFUlQoKGtleS50eXBlKCkgPT0gSURCS2V5
OjpTdHJpbmdUeXBlKSAhPSBxdWVyeS5pc0NvbHVtbk51bGwoMCkpOworICAgIEFTU0VSVCgoa2V5
LnR5cGUoKSA9PSBJREJLZXk6OkRhdGVUeXBlKSAhPSBxdWVyeS5pc0NvbHVtbk51bGwoMSkpOwor
ICAgIEFTU0VSVCgoa2V5LnR5cGUoKSA9PSBJREJLZXk6Ok51bWJlclR5cGUpICE9IHF1ZXJ5Lmlz
Q29sdW1uTnVsbCgyKSk7CisKKyAgICBTdHJpbmcgcmVjb3JkID0gcXVlcnkuZ2V0Q29sdW1uQmxv
YkFzU3RyaW5nKDMpOworICAgIEFTU0VSVChxdWVyeS5zdGVwKCkgIT0gU1FMUmVzdWx0Um93KTsK
KworICAgIHJldHVybiByZWNvcmQ7Cit9CisKK3N0YXRpYyB2b2lkIGJpbmRLZXlUb1F1ZXJ5V2l0
aE51bGxzKFNRTGl0ZVN0YXRlbWVudCYgcXVlcnksIGludCBiYXNlQ29sdW1uLCBjb25zdCBJREJL
ZXkmIGtleSkKK3sKKyAgICBzd2l0Y2ggKGtleS50eXBlKCkpIHsKKyAgICBjYXNlIElEQktleTo6
U3RyaW5nVHlwZToKKyAgICAgICAgcXVlcnkuYmluZFRleHQoYmFzZUNvbHVtbiArIDAsIGtleS5z
dHJpbmcoKSk7CisgICAgICAgIHF1ZXJ5LmJpbmROdWxsKGJhc2VDb2x1bW4gKyAxKTsKKyAgICAg
ICAgcXVlcnkuYmluZE51bGwoYmFzZUNvbHVtbiArIDIpOworICAgICAgICBicmVhazsKKyAgICBj
YXNlIElEQktleTo6RGF0ZVR5cGU6CisgICAgICAgIHF1ZXJ5LmJpbmROdWxsKGJhc2VDb2x1bW4g
KyAwKTsKKyAgICAgICAgcXVlcnkuYmluZERvdWJsZShiYXNlQ29sdW1uICsgMSwga2V5LmRhdGUo
KSk7CisgICAgICAgIHF1ZXJ5LmJpbmROdWxsKGJhc2VDb2x1bW4gKyAyKTsKKyAgICAgICAgYnJl
YWs7CisgICAgY2FzZSBJREJLZXk6Ok51bWJlclR5cGU6CisgICAgICAgIHF1ZXJ5LmJpbmROdWxs
KGJhc2VDb2x1bW4gKyAwKTsKKyAgICAgICAgcXVlcnkuYmluZE51bGwoYmFzZUNvbHVtbiArIDEp
OworICAgICAgICBxdWVyeS5iaW5kRG91YmxlKGJhc2VDb2x1bW4gKyAyLCBrZXkubnVtYmVyKCkp
OworICAgICAgICBicmVhazsKKyAgICBjYXNlIElEQktleTo6TnVsbFR5cGU6CisgICAgICAgIHF1
ZXJ5LmJpbmROdWxsKGJhc2VDb2x1bW4gKyAwKTsKKyAgICAgICAgcXVlcnkuYmluZE51bGwoYmFz
ZUNvbHVtbiArIDEpOworICAgICAgICBxdWVyeS5iaW5kTnVsbChiYXNlQ29sdW1uICsgMik7Cisg
ICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OworICAgIH0KK30KKworYm9vbCBJREJTUUxpdGVCYWNraW5nU3RvcmU6OnB1dE9iamVjdFN0b3Jl
UmVjb3JkKGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5JiBrZXksIGNvbnN0IFN0
cmluZyYgdmFsdWUsIGludDY0X3QmIHJvd0lkLCBib29sIGludmFsaWRSb3dJZCkKK3sKKyAgICBT
dHJpbmcgc3FsID0gIWludmFsaWRSb3dJZCA/ICJVUERBVEUgT2JqZWN0U3RvcmVEYXRhIFNFVCBr
ZXlTdHJpbmcgPSA/LCBrZXlEYXRlID0gPywga2V5TnVtYmVyID0gPywgdmFsdWUgPSA/IFdIRVJF
IGlkID0gPyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJJTlNFUlQgSU5UTyBP
YmplY3RTdG9yZURhdGEgKGtleVN0cmluZywga2V5RGF0ZSwga2V5TnVtYmVyLCB2YWx1ZSwgb2Jq
ZWN0U3RvcmVJZCkgVkFMVUVTICg/LCA/LCA/LCA/LCA/KSI7CisgICAgU1FMaXRlU3RhdGVtZW50
IHF1ZXJ5KG1fZGIsIHNxbCk7CisgICAgaWYgKHF1ZXJ5LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRP
aykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYmluZEtleVRvUXVlcnlXaXRoTnVsbHMo
cXVlcnksIDEsIGtleSk7CisgICAgcXVlcnkuYmluZEJsb2IoNCwgdmFsdWUpOworICAgIGlmICgh
aW52YWxpZFJvd0lkKQorICAgICAgICBxdWVyeS5iaW5kSW50NjQoNSwgcm93SWQpOworICAgIGVs
c2UKKyAgICAgICAgcXVlcnkuYmluZEludDY0KDUsIG9iamVjdFN0b3JlSWQpOworCisgICAgaWYg
KHF1ZXJ5LnN0ZXAoKSAhPSBTUUxSZXN1bHREb25lKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICBpZiAoaW52YWxpZFJvd0lkKQorICAgICAgICByb3dJZCA9IG1fZGIubGFzdEluc2VydFJv
d0lEKCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBJREJTUUxpdGVCYWNraW5nU3Rv
cmU6OmNsZWFyT2JqZWN0U3RvcmUoaW50NjRfdCBvYmplY3RTdG9yZUlkKQoreworICAgIGRvRGVs
ZXRlKG1fZGIsICJERUxFVEUgRlJPTSBJbmRleERhdGEgV0hFUkUgb2JqZWN0U3RvcmVEYXRhSWQg
SU4gKFNFTEVDVCBpZCBGUk9NIE9iamVjdFN0b3JlRGF0YSBXSEVSRSBvYmplY3RTdG9yZUlkID0g
PykiLCBvYmplY3RTdG9yZUlkKTsKKyAgICBkb0RlbGV0ZShtX2RiLCAiREVMRVRFIEZST00gT2Jq
ZWN0U3RvcmVEYXRhIFdIRVJFIG9iamVjdFN0b3JlSWQgPSA/Iiwgb2JqZWN0U3RvcmVJZCk7Cit9
CisKK3ZvaWQgSURCU1FMaXRlQmFja2luZ1N0b3JlOjpkZWxldGVPYmplY3RTdG9yZVJlY29yZChp
bnQ2NF90LCBpbnQ2NF90IG9iamVjdFN0b3JlRGF0YUlkKQoreworICAgIFNRTGl0ZVN0YXRlbWVu
dCBvc1F1ZXJ5KG1fZGIsICJERUxFVEUgRlJPTSBPYmplY3RTdG9yZURhdGEgV0hFUkUgaWQgPSA/
Iik7CisgICAgYm9vbCBvayA9IG9zUXVlcnkucHJlcGFyZSgpID09IFNRTFJlc3VsdE9rOworICAg
IEFTU0VSVF9VTlVTRUQob2ssIG9rKTsgLy8gRklYTUU6IEJldHRlciBlcnJvciBoYW5kbGluZz8K
KworICAgIG9zUXVlcnkuYmluZEludDY0KDEsIG9iamVjdFN0b3JlRGF0YUlkKTsKKworICAgIG9r
ID0gb3NRdWVyeS5zdGVwKCkgPT0gU1FMUmVzdWx0RG9uZTsKKyAgICBBU1NFUlRfVU5VU0VEKG9r
LCBvayk7CisKKyAgICBTUUxpdGVTdGF0ZW1lbnQgaW5kZXhRdWVyeShtX2RiLCAiREVMRVRFIEZS
T00gSW5kZXhEYXRhIFdIRVJFIG9iamVjdFN0b3JlRGF0YUlkID0gPyIpOworICAgIG9rID0gaW5k
ZXhRdWVyeS5wcmVwYXJlKCkgPT0gU1FMUmVzdWx0T2s7CisgICAgQVNTRVJUX1VOVVNFRChvaywg
b2spOyAvLyBGSVhNRTogQmV0dGVyIGVycm9yIGhhbmRsaW5nPworCisgICAgaW5kZXhRdWVyeS5i
aW5kSW50NjQoMSwgb2JqZWN0U3RvcmVEYXRhSWQpOworCisgICAgb2sgPSBpbmRleFF1ZXJ5LnN0
ZXAoKSA9PSBTUUxSZXN1bHREb25lOworICAgIEFTU0VSVF9VTlVTRUQob2ssIG9rKTsKK30KKwor
ZG91YmxlIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6bmV4dEF1dG9JbmNyZW1lbnROdW1iZXIoaW50
NjRfdCBvYmplY3RTdG9yZUlkKQoreworICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVyeShtX2RiLCAi
U0VMRUNUIG1heChrZXlOdW1iZXIpICsgMSBGUk9NIE9iamVjdFN0b3JlRGF0YSBXSEVSRSBvYmpl
Y3RTdG9yZUlkID0gPyBBTkQga2V5U3RyaW5nIElTIE5VTEwgQU5EIGtleURhdGUgSVMgTlVMTCIp
OworICAgIGJvb2wgb2sgPSBxdWVyeS5wcmVwYXJlKCkgPT0gU1FMUmVzdWx0T2s7CisgICAgQVNT
RVJUX1VOVVNFRChvaywgb2spOworCisgICAgcXVlcnkuYmluZEludDY0KDEsIG9iamVjdFN0b3Jl
SWQpOworCisgICAgaWYgKHF1ZXJ5LnN0ZXAoKSAhPSBTUUxSZXN1bHRSb3cgfHwgcXVlcnkuaXND
b2x1bW5OdWxsKDApKQorICAgICAgICByZXR1cm4gMTsKKworICAgIHJldHVybiBxdWVyeS5nZXRD
b2x1bW5Eb3VibGUoMCk7Cit9CisKK2Jvb2wgSURCU1FMaXRlQmFja2luZ1N0b3JlOjprZXlFeGlz
dHNJbk9iamVjdFN0b3JlKGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5JiBrZXks
IGludDY0X3QmIGZvdW5kT2JqZWN0U3RvcmVEYXRhSWQpCit7CisgICAgU3RyaW5nIHNxbCA9IFN0
cmluZygiU0VMRUNUIGlkIEZST00gT2JqZWN0U3RvcmVEYXRhIFdIRVJFIG9iamVjdFN0b3JlSWQg
PSA/IEFORCAiKSArIHdoZXJlU3ludGF4Rm9yS2V5KGtleSk7CisgICAgU1FMaXRlU3RhdGVtZW50
IHF1ZXJ5KG1fZGIsIHNxbCk7CisgICAgYm9vbCBvayA9IHF1ZXJ5LnByZXBhcmUoKSA9PSBTUUxS
ZXN1bHRPazsKKyAgICBBU1NFUlRfVU5VU0VEKG9rLCBvayk7IC8vIEZJWE1FOiBCZXR0ZXIgZXJy
b3IgaGFuZGxpbmc/CisKKyAgICBxdWVyeS5iaW5kSW50NjQoMSwgb2JqZWN0U3RvcmVJZCk7Cisg
ICAgYmluZEtleVRvUXVlcnkocXVlcnksIDIsIGtleSk7CisKKyAgICBpZiAocXVlcnkuc3RlcCgp
ICE9IFNRTFJlc3VsdFJvdykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZm91bmRPYmpl
Y3RTdG9yZURhdGFJZCA9IHF1ZXJ5LmdldENvbHVtbkludDY0KDApOworICAgIHJldHVybiB0cnVl
OworfQorCitib29sIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Zm9yRWFjaE9iamVjdFN0b3JlUmVj
b3JkKGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgT2JqZWN0U3RvcmVSZWNvcmRDYWxsYmFjayYgY2Fs
bGJhY2spCit7CisgICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGIsICJTRUxFQ1QgaWQsIHZh
bHVlIEZST00gT2JqZWN0U3RvcmVEYXRhIFdIRVJFIG9iamVjdFN0b3JlSWQgPSA/Iik7CisgICAg
aWYgKHF1ZXJ5LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgcXVlcnkuYmluZEludDY0KDEsIG9iamVjdFN0b3JlSWQpOworCisgICAgd2hpbGUg
KHF1ZXJ5LnN0ZXAoKSA9PSBTUUxSZXN1bHRSb3cpIHsKKyAgICAgICAgaW50NjRfdCBvYmplY3RT
dG9yZURhdGFJZCA9IHF1ZXJ5LmdldENvbHVtbkludDY0KDApOworICAgICAgICBTdHJpbmcgdmFs
dWUgPSBxdWVyeS5nZXRDb2x1bW5CbG9iQXNTdHJpbmcoMSk7CisgICAgICAgIGlmICghY2FsbGJh
Y2suY2FsbGJhY2sob2JqZWN0U3RvcmVEYXRhSWQsIHZhbHVlKSkKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBJREJTUUxpdGVC
YWNraW5nU3RvcmU6OmdldEluZGV4ZXMoaW50NjRfdCBvYmplY3RTdG9yZUlkLCBWZWN0b3I8aW50
NjRfdD4mIGZvdW5kSWRzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmROYW1lcywgVmVjdG9yPFN0cmlu
Zz4mIGZvdW5kS2V5UGF0aHMsIFZlY3Rvcjxib29sPiYgZm91bmRVbmlxdWVGbGFncykKK3sKKyAg
ICBTUUxpdGVTdGF0ZW1lbnQgcXVlcnkobV9kYiwgIlNFTEVDVCBpZCwgbmFtZSwga2V5UGF0aCwg
aXNVbmlxdWUgRlJPTSBJbmRleGVzIFdIRVJFIG9iamVjdFN0b3JlSWQgPSA/Iik7CisgICAgYm9v
bCBvayA9IHF1ZXJ5LnByZXBhcmUoKSA9PSBTUUxSZXN1bHRPazsKKyAgICBBU1NFUlRfVU5VU0VE
KG9rLCBvayk7IC8vIEZJWE1FOiBCZXR0ZXIgZXJyb3IgaGFuZGxpbmc/CisKKyAgICBBU1NFUlQo
Zm91bmRJZHMuaXNFbXB0eSgpKTsKKyAgICBBU1NFUlQoZm91bmROYW1lcy5pc0VtcHR5KCkpOwor
ICAgIEFTU0VSVChmb3VuZEtleVBhdGhzLmlzRW1wdHkoKSk7CisgICAgQVNTRVJUKGZvdW5kVW5p
cXVlRmxhZ3MuaXNFbXB0eSgpKTsKKworICAgIHF1ZXJ5LmJpbmRJbnQ2NCgxLCBvYmplY3RTdG9y
ZUlkKTsKKworICAgIHdoaWxlIChxdWVyeS5zdGVwKCkgPT0gU1FMUmVzdWx0Um93KSB7CisgICAg
ICAgIGZvdW5kSWRzLmFwcGVuZChxdWVyeS5nZXRDb2x1bW5JbnQ2NCgwKSk7CisgICAgICAgIGZv
dW5kTmFtZXMuYXBwZW5kKHF1ZXJ5LmdldENvbHVtblRleHQoMSkpOworICAgICAgICBmb3VuZEtl
eVBhdGhzLmFwcGVuZChxdWVyeS5nZXRDb2x1bW5UZXh0KDIpKTsKKyAgICAgICAgZm91bmRVbmlx
dWVGbGFncy5hcHBlbmQoISFxdWVyeS5nZXRDb2x1bW5JbnQoMykpOworICAgIH0KK30KKworYm9v
bCBJREJTUUxpdGVCYWNraW5nU3RvcmU6OmNyZWF0ZUluZGV4KGludDY0X3Qgb2JqZWN0U3RvcmVJ
ZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgaXNVbmlx
dWUsIGludDY0X3QmIGluZGV4SWQpCit7CisgICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGIs
ICJJTlNFUlQgSU5UTyBJbmRleGVzIChvYmplY3RTdG9yZUlkLCBuYW1lLCBrZXlQYXRoLCBpc1Vu
aXF1ZSkgVkFMVUVTICg/LCA/LCA/LCA/KSIpOworICAgIGlmIChxdWVyeS5wcmVwYXJlKCkgIT0g
U1FMUmVzdWx0T2spCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHF1ZXJ5LmJpbmRJbnQ2
NCgxLCBvYmplY3RTdG9yZUlkKTsKKyAgICBxdWVyeS5iaW5kVGV4dCgyLCBuYW1lKTsKKyAgICBx
dWVyeS5iaW5kVGV4dCgzLCBrZXlQYXRoKTsKKyAgICBxdWVyeS5iaW5kSW50KDQsIHN0YXRpY19j
YXN0PGludD4oaXNVbmlxdWUpKTsKKworICAgIGlmIChxdWVyeS5zdGVwKCkgIT0gU1FMUmVzdWx0
RG9uZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaW5kZXhJZCA9IG1fZGIubGFzdElu
c2VydFJvd0lEKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgSURCU1FMaXRlQmFja2lu
Z1N0b3JlOjpkZWxldGVJbmRleChpbnQ2NF90IGluZGV4SWQpCit7CisgICAgZG9EZWxldGUobV9k
YiwgIkRFTEVURSBGUk9NIEluZGV4ZXMgV0hFUkUgaWQgPSA/IiwgaW5kZXhJZCk7CisgICAgZG9E
ZWxldGUobV9kYiwgIkRFTEVURSBGUk9NIEluZGV4RGF0YSBXSEVSRSBpbmRleElkID0gPyIsIGlu
ZGV4SWQpOworfQorCitib29sIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6cHV0SW5kZXhEYXRhRm9y
UmVjb3JkKGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JiBrZXksIGludDY0X3Qgb2JqZWN0
U3RvcmVEYXRhSWQpCit7CisgICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGIsICJJTlNFUlQg
SU5UTyBJbmRleERhdGEgKGtleVN0cmluZywga2V5RGF0ZSwga2V5TnVtYmVyLCBpbmRleElkLCBv
YmplY3RTdG9yZURhdGFJZCkgVkFMVUVTICg/LCA/LCA/LCA/LCA/KSIpOworICAgIGlmIChxdWVy
eS5wcmVwYXJlKCkgIT0gU1FMUmVzdWx0T2spCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IGJpbmRLZXlUb1F1ZXJ5V2l0aE51bGxzKHF1ZXJ5LCAxLCBrZXkpOworICAgIHF1ZXJ5LmJpbmRJ
bnQ2NCg0LCBpbmRleElkKTsKKyAgICBxdWVyeS5iaW5kSW50NjQoNSwgb2JqZWN0U3RvcmVEYXRh
SWQpOworCisgICAgcmV0dXJuIHF1ZXJ5LnN0ZXAoKSA9PSBTUUxSZXN1bHREb25lOworfQorCiti
b29sIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6ZGVsZXRlSW5kZXhEYXRhRm9yUmVjb3JkKGludDY0
X3Qgb2JqZWN0U3RvcmVEYXRhSWQpCit7CisgICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGIs
ICJERUxFVEUgRlJPTSBJbmRleERhdGEgV0hFUkUgb2JqZWN0U3RvcmVEYXRhSWQgPSA/Iik7Cisg
ICAgaWYgKHF1ZXJ5LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgcXVlcnkuYmluZEludDY0KDEsIG9iamVjdFN0b3JlRGF0YUlkKTsKKyAgICBy
ZXR1cm4gcXVlcnkuc3RlcCgpID09IFNRTFJlc3VsdERvbmU7Cit9CisKK1N0cmluZyBJREJTUUxp
dGVCYWNraW5nU3RvcmU6OmdldE9iamVjdFZpYUluZGV4KGludDY0X3QgaW5kZXhJZCwgY29uc3Qg
SURCS2V5JiBrZXkpCit7CisgICAgU3RyaW5nIHNxbCA9IFN0cmluZygiU0VMRUNUICIpCisgICAg
ICAgICAgICAgICAgICsgIk9iamVjdFN0b3JlRGF0YS52YWx1ZSAiCisgICAgICAgICAgICAgICAg
ICsgIkZST00gSW5kZXhEYXRhIElOTkVSIEpPSU4gT2JqZWN0U3RvcmVEYXRhIE9OIEluZGV4RGF0
YS5vYmplY3RTdG9yZURhdGFJZCA9IE9iamVjdFN0b3JlRGF0YS5pZCAiCisgICAgICAgICAgICAg
ICAgICsgIldIRVJFIEluZGV4RGF0YS5pbmRleElkID0gPyAgQU5EICAiICsgd2hlcmVTeW50YXhG
b3JLZXkoa2V5LCAiSW5kZXhEYXRhLiIpCisgICAgICAgICAgICAgICAgICsgIk9SREVSIEJZIElu
ZGV4RGF0YS5pZCBMSU1JVCAxIjsgLy8gT3JkZXIgYnkgaW5zZXJ0aW9uIG9yZGVyIHdoZW4gYWxs
IGVsc2UgZmFpbHMuCisgICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGIsIHNxbCk7CisgICAg
Ym9vbCBvayA9IHF1ZXJ5LnByZXBhcmUoKSA9PSBTUUxSZXN1bHRPazsKKyAgICBBU1NFUlRfVU5V
U0VEKG9rLCBvayk7IC8vIEZJWE1FOiBCZXR0ZXIgZXJyb3IgaGFuZGxpbmc/CisKKyAgICBxdWVy
eS5iaW5kSW50NjQoMSwgaW5kZXhJZCk7CisgICAgYmluZEtleVRvUXVlcnkocXVlcnksIDIsIGtl
eSk7CisKKyAgICBpZiAocXVlcnkuc3RlcCgpICE9IFNRTFJlc3VsdFJvdykKKyAgICAgICAgcmV0
dXJuIFN0cmluZygpOworCisgICAgU3RyaW5nIGZvdW5kVmFsdWUgPSBxdWVyeS5nZXRDb2x1bW5C
bG9iQXNTdHJpbmcoMCk7CisgICAgQVNTRVJUKHF1ZXJ5LnN0ZXAoKSAhPSBTUUxSZXN1bHRSb3cp
OworICAgIHJldHVybiBmb3VuZFZhbHVlOworfQorCitzdGF0aWMgUGFzc1JlZlB0cjxJREJLZXk+
IGtleUZyb21RdWVyeShTUUxpdGVTdGF0ZW1lbnQmIHF1ZXJ5LCBpbnQgYmFzZUNvbHVtbikKK3sK
KyAgICBpZiAocXVlcnkuY29sdW1uQ291bnQoKSA8PSBiYXNlQ29sdW1uKQorICAgICAgICByZXR1
cm4gMDsKKworICAgIGlmICghcXVlcnkuaXNDb2x1bW5OdWxsKGJhc2VDb2x1bW4pKQorICAgICAg
ICByZXR1cm4gSURCS2V5OjpjcmVhdGVTdHJpbmcocXVlcnkuZ2V0Q29sdW1uVGV4dChiYXNlQ29s
dW1uKSk7CisKKyAgICBpZiAoIXF1ZXJ5LmlzQ29sdW1uTnVsbChiYXNlQ29sdW1uICsgMSkpCisg
ICAgICAgIHJldHVybiBJREJLZXk6OmNyZWF0ZURhdGUocXVlcnkuZ2V0Q29sdW1uRG91YmxlKGJh
c2VDb2x1bW4gKyAxKSk7CisKKyAgICBpZiAoIXF1ZXJ5LmlzQ29sdW1uTnVsbChiYXNlQ29sdW1u
ICsgMikpCisgICAgICAgIHJldHVybiBJREJLZXk6OmNyZWF0ZU51bWJlcihxdWVyeS5nZXRDb2x1
bW5Eb3VibGUoYmFzZUNvbHVtbiArIDIpKTsKKworICAgIHJldHVybiBJREJLZXk6OmNyZWF0ZU51
bGwoKTsKK30KKworUGFzc1JlZlB0cjxJREJLZXk+IElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Z2V0
UHJpbWFyeUtleVZpYUluZGV4KGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JiBrZXkpCit7
CisgICAgU3RyaW5nIHNxbCA9IFN0cmluZygiU0VMRUNUICIpCisgICAgICAgICAgICAgICAgICsg
Ik9iamVjdFN0b3JlRGF0YS5rZXlTdHJpbmcsIE9iamVjdFN0b3JlRGF0YS5rZXlEYXRlLCBPYmpl
Y3RTdG9yZURhdGEua2V5TnVtYmVyICIKKyAgICAgICAgICAgICAgICAgKyAiRlJPTSBJbmRleERh
dGEgSU5ORVIgSk9JTiBPYmplY3RTdG9yZURhdGEgT04gSW5kZXhEYXRhLm9iamVjdFN0b3JlRGF0
YUlkID0gT2JqZWN0U3RvcmVEYXRhLmlkICIKKyAgICAgICAgICAgICAgICAgKyAiV0hFUkUgSW5k
ZXhEYXRhLmluZGV4SWQgPSA/ICBBTkQgICIgKyB3aGVyZVN5bnRheEZvcktleShrZXksICJJbmRl
eERhdGEuIikKKyAgICAgICAgICAgICAgICAgKyAiT1JERVIgQlkgSW5kZXhEYXRhLmlkIExJTUlU
IDEiOyAvLyBPcmRlciBieSBpbnNlcnRpb24gb3JkZXIgd2hlbiBhbGwgZWxzZSBmYWlscy4KKyAg
ICBTUUxpdGVTdGF0ZW1lbnQgcXVlcnkobV9kYiwgc3FsKTsKKyAgICBib29sIG9rID0gcXVlcnku
cHJlcGFyZSgpID09IFNRTFJlc3VsdE9rOworICAgIEFTU0VSVF9VTlVTRUQob2ssIG9rKTsgLy8g
RklYTUU6IEJldHRlciBlcnJvciBoYW5kbGluZz8KKworICAgIHF1ZXJ5LmJpbmRJbnQ2NCgxLCBp
bmRleElkKTsKKyAgICBiaW5kS2V5VG9RdWVyeShxdWVyeSwgMiwga2V5KTsKKworICAgIGlmIChx
dWVyeS5zdGVwKCkgIT0gU1FMUmVzdWx0Um93KQorICAgICAgICByZXR1cm4gMDsKKworICAgIFJl
ZlB0cjxJREJLZXk+IGZvdW5kS2V5ID0ga2V5RnJvbVF1ZXJ5KHF1ZXJ5LCAwKTsKKyAgICBBU1NF
UlQocXVlcnkuc3RlcCgpICE9IFNRTFJlc3VsdFJvdyk7CisgICAgcmV0dXJuIGZvdW5kS2V5LnJl
bGVhc2UoKTsKK30KKworYm9vbCBJREJTUUxpdGVCYWNraW5nU3RvcmU6OmtleUV4aXN0c0luSW5k
ZXgoaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmIGtleSkKK3sKKyAgICBTdHJpbmcgc3Fs
ID0gU3RyaW5nKCJTRUxFQ1QgaWQgRlJPTSBJbmRleERhdGEgV0hFUkUgaW5kZXhJZCA9ID8gQU5E
ICIpICsgd2hlcmVTeW50YXhGb3JLZXkoa2V5KTsKKyAgICBTUUxpdGVTdGF0ZW1lbnQgcXVlcnko
bV9kYiwgc3FsKTsKKyAgICBib29sIG9rID0gcXVlcnkucHJlcGFyZSgpID09IFNRTFJlc3VsdE9r
OworICAgIEFTU0VSVF9VTlVTRUQob2ssIG9rKTsgLy8gRklYTUU6IEJldHRlciBlcnJvciBoYW5k
bGluZz8KKworICAgIHF1ZXJ5LmJpbmRJbnQ2NCgxLCBpbmRleElkKTsKKyAgICBiaW5kS2V5VG9R
dWVyeShxdWVyeSwgMiwga2V5KTsKKworICAgIHJldHVybiBxdWVyeS5zdGVwKCkgPT0gU1FMUmVz
dWx0Um93OworfQorCituYW1lc3BhY2UgeworCitjbGFzcyBDdXJzb3JJbXBsQ29tbW9uIDogcHVi
bGljIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Q3Vyc29yIHsKK3B1YmxpYzoKKyAgICBDdXJzb3JJ
bXBsQ29tbW9uKFNRTGl0ZURhdGFiYXNlJiBzcWxpdGVEYXRhYmFzZSwgU3RyaW5nIHF1ZXJ5LCBi
b29sIHVuaXF1ZW5lc3NDb25zdHJhaW50LCBib29sIGl0ZXJhdGVGb3J3YXJkKQorICAgICAgICA6
IG1fcXVlcnkoc3FsaXRlRGF0YWJhc2UsIHF1ZXJ5KQorICAgICAgICAsIG1fZGIoc3FsaXRlRGF0
YWJhc2UpCisgICAgICAgICwgbV91bmlxdWVuZXNzQ29uc3RyYWludCh1bmlxdWVuZXNzQ29uc3Ry
YWludCkKKyAgICAgICAgLCBtX2l0ZXJhdGVGb3J3YXJkKGl0ZXJhdGVGb3J3YXJkKQorICAgIHsK
KyAgICB9CisgICAgdmlydHVhbCB+Q3Vyc29ySW1wbENvbW1vbigpIHt9CisKKyAgICAvLyBJREJC
YWNraW5nU3RvcmU6OkN1cnNvcgorICAgIHZpcnR1YWwgYm9vbCBjb250aW51ZUZ1bmN0aW9uKGNv
bnN0IElEQktleSopOworICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJLZXk+IGtleSgpIHsgcmV0
dXJuIG1fY3VycmVudEtleTsgfQorICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJLZXk+IHByaW1h
cnlLZXkoKSB7IHJldHVybiBtX2N1cnJlbnRLZXk7IH0KKyAgICB2aXJ0dWFsIFN0cmluZyB2YWx1
ZSgpID0gMDsKKyAgICB2aXJ0dWFsIGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQoKSA9IDA7Cisg
ICAgdmlydHVhbCBpbnQ2NF90IGluZGV4RGF0YUlkKCkgPSAwOworCisgICAgdmlydHVhbCB2b2lk
IGxvYWRDdXJyZW50Um93KCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBjdXJyZW50Um93RXhpc3Rz
KCkgPSAwOworCisgICAgU1FMaXRlU3RhdGVtZW50IG1fcXVlcnk7CisKK3Byb3RlY3RlZDoKKyAg
ICBTUUxpdGVEYXRhYmFzZSYgbV9kYjsKKyAgICBib29sIG1fdW5pcXVlbmVzc0NvbnN0cmFpbnQ7
CisgICAgYm9vbCBtX2l0ZXJhdGVGb3J3YXJkOworICAgIGludDY0X3QgbV9jdXJyZW50SWQ7Cisg
ICAgUmVmUHRyPElEQktleT4gbV9jdXJyZW50S2V5OworfTsKKworYm9vbCBDdXJzb3JJbXBsQ29t
bW9uOjpjb250aW51ZUZ1bmN0aW9uKGNvbnN0IElEQktleSoga2V5KQoreworICAgIHdoaWxlICh0
cnVlKSB7CisgICAgICAgIGlmIChtX3F1ZXJ5LnN0ZXAoKSAhPSBTUUxSZXN1bHRSb3cpCisgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgUmVmUHRyPElEQktleT4gb2xkS2V5ID0g
bV9jdXJyZW50S2V5OworICAgICAgICBsb2FkQ3VycmVudFJvdygpOworCisgICAgICAgIC8vIFNr
aXAgaWYgdGhpcyBlbnRyeSBoYXMgYmVlbiBkZWxldGVkIGZyb20gdGhlIG9iamVjdCBzdG9yZS4K
KyAgICAgICAgaWYgKCFjdXJyZW50Um93RXhpc3RzKCkpCisgICAgICAgICAgICBjb250aW51ZTsK
KworICAgICAgICAvLyBJZiBhIGtleSB3YXMgc3VwcGxpZWQsIHdlIG11c3QgbG9vcCB1bnRpbCB3
ZSBmaW5kIGEga2V5IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBpdCAob3IgaGl0IHRoZSBlbmQp
LgorICAgICAgICBpZiAoa2V5KSB7CisgICAgICAgICAgICBpZiAobV9pdGVyYXRlRm9yd2FyZCkg
eworICAgICAgICAgICAgICAgIGlmIChtX2N1cnJlbnRLZXktPmlzTGVzc1RoYW4oa2V5KSkKKyAg
ICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgICAgIGlmIChrZXktPmlzTGVzc1RoYW4obV9jdXJyZW50S2V5LmdldCgpKSkKKyAgICAg
ICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAg
ICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgdW5pcXVlbmVzcyBjb25zdHJhaW50LCB3ZSBjYW4g
c3RvcCBub3cuCisgICAgICAgIGlmICghbV91bmlxdWVuZXNzQ29uc3RyYWludCkKKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICBpZiAoIW1fY3VycmVudEtleS0+aXNFcXVhbChvbGRLZXkuZ2V0
KCkpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisK
K2NsYXNzIE9iamVjdFN0b3JlQ3Vyc29ySW1wbCA6IHB1YmxpYyBDdXJzb3JJbXBsQ29tbW9uIHsK
K3B1YmxpYzoKKyAgICBPYmplY3RTdG9yZUN1cnNvckltcGwoU1FMaXRlRGF0YWJhc2UmIHNxbGl0
ZURhdGFiYXNlLCBTdHJpbmcgcXVlcnksIGJvb2wgdW5pcXVlbmVzc0NvbnN0cmFpbnQsIGJvb2wg
aXRlcmF0ZUZvcndhcmQpCisgICAgICAgIDogQ3Vyc29ySW1wbENvbW1vbihzcWxpdGVEYXRhYmFz
ZSwgcXVlcnksIHVuaXF1ZW5lc3NDb25zdHJhaW50LCBpdGVyYXRlRm9yd2FyZCkKKyAgICB7Cisg
ICAgfQorCisgICAgLy8gQ3Vyc29ySW1wbENvbW1vbi4KKyAgICB2aXJ0dWFsIFN0cmluZyB2YWx1
ZSgpIHsgcmV0dXJuIG1fY3VycmVudFZhbHVlOyB9CisgICAgdmlydHVhbCBpbnQ2NF90IG9iamVj
dFN0b3JlRGF0YUlkKCkgeyByZXR1cm4gbV9jdXJyZW50SWQ7IH0KKyAgICB2aXJ0dWFsIGludDY0
X3QgaW5kZXhEYXRhSWQoKSB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4gMDsgfQorICAg
IHZpcnR1YWwgdm9pZCBsb2FkQ3VycmVudFJvdygpOworICAgIHZpcnR1YWwgYm9vbCBjdXJyZW50
Um93RXhpc3RzKCk7CisKK3ByaXZhdGU6CisgICAgU3RyaW5nIG1fY3VycmVudFZhbHVlOworfTsK
Kwordm9pZCBPYmplY3RTdG9yZUN1cnNvckltcGw6OmxvYWRDdXJyZW50Um93KCkKK3sKKyAgICBt
X2N1cnJlbnRJZCA9IG1fcXVlcnkuZ2V0Q29sdW1uSW50NjQoMCk7CisgICAgbV9jdXJyZW50S2V5
ID0ga2V5RnJvbVF1ZXJ5KG1fcXVlcnksIDEpOworICAgIG1fY3VycmVudFZhbHVlID0gbV9xdWVy
eS5nZXRDb2x1bW5CbG9iQXNTdHJpbmcoNCk7Cit9CisKK2Jvb2wgT2JqZWN0U3RvcmVDdXJzb3JJ
bXBsOjpjdXJyZW50Um93RXhpc3RzKCkKK3sKKyAgICBTdHJpbmcgc3FsID0gIlNFTEVDVCBpZCBG
Uk9NIE9iamVjdFN0b3JlRGF0YSBXSEVSRSBpZCA9ID8iOworICAgIFNRTGl0ZVN0YXRlbWVudCBz
dGF0ZW1lbnQobV9kYiwgc3FsKTsKKworICAgIGJvb2wgb2sgPSBzdGF0ZW1lbnQucHJlcGFyZSgp
ID09IFNRTFJlc3VsdE9rOworICAgIEFTU0VSVF9VTlVTRUQob2ssIG9rKTsKKworICAgIHN0YXRl
bWVudC5iaW5kSW50NjQoMSwgbV9jdXJyZW50SWQpOworICAgIHJldHVybiBzdGF0ZW1lbnQuc3Rl
cCgpID09IFNRTFJlc3VsdFJvdzsKK30KKworY2xhc3MgSW5kZXhLZXlDdXJzb3JJbXBsIDogcHVi
bGljIEN1cnNvckltcGxDb21tb24geworcHVibGljOgorICAgIEluZGV4S2V5Q3Vyc29ySW1wbChT
UUxpdGVEYXRhYmFzZSYgc3FsaXRlRGF0YWJhc2UsIFN0cmluZyBxdWVyeSwgYm9vbCB1bmlxdWVu
ZXNzQ29uc3RyYWludCwgYm9vbCBpdGVyYXRlRm9yd2FyZCkKKyAgICAgICAgOiBDdXJzb3JJbXBs
Q29tbW9uKHNxbGl0ZURhdGFiYXNlLCBxdWVyeSwgdW5pcXVlbmVzc0NvbnN0cmFpbnQsIGl0ZXJh
dGVGb3J3YXJkKQorICAgIHsKKyAgICB9CisKKyAgICAvLyBDdXJzb3JJbXBsQ29tbW9uCisgICAg
dmlydHVhbCBQYXNzUmVmUHRyPElEQktleT4gcHJpbWFyeUtleSgpIHsgcmV0dXJuIG1fY3VycmVu
dFByaW1hcnlLZXk7IH0KKyAgICB2aXJ0dWFsIFN0cmluZyB2YWx1ZSgpIHsgQVNTRVJUX05PVF9S
RUFDSEVEKCk7IHJldHVybiBTdHJpbmcoKTsgfQorICAgIHZpcnR1YWwgaW50NjRfdCBvYmplY3RT
dG9yZURhdGFJZCgpIHsgQVNTRVJUX05PVF9SRUFDSEVEKCk7IHJldHVybiAwOyB9CisgICAgdmly
dHVhbCBpbnQ2NF90IGluZGV4RGF0YUlkKCkgeyByZXR1cm4gbV9jdXJyZW50SWQ7IH0KKyAgICB2
aXJ0dWFsIHZvaWQgbG9hZEN1cnJlbnRSb3coKTsKKyAgICB2aXJ0dWFsIGJvb2wgY3VycmVudFJv
d0V4aXN0cygpOworCitwcml2YXRlOgorICAgIFJlZlB0cjxJREJLZXk+IG1fY3VycmVudFByaW1h
cnlLZXk7Cit9OworCit2b2lkIEluZGV4S2V5Q3Vyc29ySW1wbDo6bG9hZEN1cnJlbnRSb3coKQor
eworICAgIG1fY3VycmVudElkID0gbV9xdWVyeS5nZXRDb2x1bW5JbnQ2NCgwKTsKKyAgICBtX2N1
cnJlbnRLZXkgPSBrZXlGcm9tUXVlcnkobV9xdWVyeSwgMSk7CisgICAgbV9jdXJyZW50UHJpbWFy
eUtleSA9IGtleUZyb21RdWVyeShtX3F1ZXJ5LCA0KTsKK30KKworYm9vbCBJbmRleEtleUN1cnNv
ckltcGw6OmN1cnJlbnRSb3dFeGlzdHMoKQoreworICAgIFN0cmluZyBzcWwgPSAiU0VMRUNUIGlk
IEZST00gSW5kZXhEYXRhIFdIRVJFIGlkID0gPyI7CisgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRl
bWVudChtX2RiLCBzcWwpOworCisgICAgYm9vbCBvayA9IHN0YXRlbWVudC5wcmVwYXJlKCkgPT0g
U1FMUmVzdWx0T2s7CisgICAgQVNTRVJUX1VOVVNFRChvaywgb2spOworCisgICAgc3RhdGVtZW50
LmJpbmRJbnQ2NCgxLCBtX2N1cnJlbnRJZCk7CisgICAgcmV0dXJuIHN0YXRlbWVudC5zdGVwKCkg
PT0gU1FMUmVzdWx0Um93OworfQorCitjbGFzcyBJbmRleEN1cnNvckltcGwgOiBwdWJsaWMgQ3Vy
c29ySW1wbENvbW1vbiB7CitwdWJsaWM6CisgICAgSW5kZXhDdXJzb3JJbXBsKFNRTGl0ZURhdGFi
YXNlJiBzcWxpdGVEYXRhYmFzZSwgU3RyaW5nIHF1ZXJ5LCBib29sIHVuaXF1ZW5lc3NDb25zdHJh
aW50LCBib29sIGl0ZXJhdGVGb3J3YXJkKQorICAgICAgICA6IEN1cnNvckltcGxDb21tb24oc3Fs
aXRlRGF0YWJhc2UsIHF1ZXJ5LCB1bmlxdWVuZXNzQ29uc3RyYWludCwgaXRlcmF0ZUZvcndhcmQp
CisgICAgeworICAgIH0KKworICAgIC8vIEN1cnNvckltcGxDb21tb24KKyAgICB2aXJ0dWFsIFBh
c3NSZWZQdHI8SURCS2V5PiBwcmltYXJ5S2V5KCkgeyByZXR1cm4gbV9jdXJyZW50UHJpbWFyeUtl
eTsgfQorICAgIHZpcnR1YWwgU3RyaW5nIHZhbHVlKCkgeyByZXR1cm4gbV9jdXJyZW50VmFsdWU7
IH0KKyAgICB2aXJ0dWFsIGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQoKSB7IEFTU0VSVF9OT1Rf
UkVBQ0hFRCgpOyByZXR1cm4gMDsgfQorICAgIHZpcnR1YWwgaW50NjRfdCBpbmRleERhdGFJZCgp
IHsgcmV0dXJuIG1fY3VycmVudElkOyB9CisgICAgdmlydHVhbCB2b2lkIGxvYWRDdXJyZW50Um93
KCk7CisgICAgdmlydHVhbCBib29sIGN1cnJlbnRSb3dFeGlzdHMoKTsKKworcHJpdmF0ZToKKyAg
ICBSZWZQdHI8SURCS2V5PiBtX2N1cnJlbnRQcmltYXJ5S2V5OworICAgIFN0cmluZyBtX2N1cnJl
bnRWYWx1ZTsKK307CisKK3ZvaWQgSW5kZXhDdXJzb3JJbXBsOjpsb2FkQ3VycmVudFJvdygpCit7
CisgICAgbV9jdXJyZW50SWQgPSBtX3F1ZXJ5LmdldENvbHVtbkludDY0KDApOworICAgIG1fY3Vy
cmVudEtleSA9IGtleUZyb21RdWVyeShtX3F1ZXJ5LCAxKTsKKyAgICBtX2N1cnJlbnRWYWx1ZSA9
IG1fcXVlcnkuZ2V0Q29sdW1uQmxvYkFzU3RyaW5nKDQpOworICAgIG1fY3VycmVudFByaW1hcnlL
ZXkgPSBrZXlGcm9tUXVlcnkobV9xdWVyeSwgNSk7Cit9CisKK2Jvb2wgSW5kZXhDdXJzb3JJbXBs
OjpjdXJyZW50Um93RXhpc3RzKCkKK3sKKyAgICBTdHJpbmcgc3FsID0gIlNFTEVDVCBpZCBGUk9N
IEluZGV4RGF0YSBXSEVSRSBpZCA9ID8iOworICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQo
bV9kYiwgc3FsKTsKKworICAgIGJvb2wgb2sgPSBzdGF0ZW1lbnQucHJlcGFyZSgpID09IFNRTFJl
c3VsdE9rOworICAgIEFTU0VSVF9VTlVTRUQob2ssIG9rKTsKKworICAgIHN0YXRlbWVudC5iaW5k
SW50NjQoMSwgbV9jdXJyZW50SWQpOworICAgIHJldHVybiBzdGF0ZW1lbnQuc3RlcCgpID09IFNR
TFJlc3VsdFJvdzsKK30KKworfSAvLyBuYW1lc3BhY2UKKworUGFzc1JlZlB0cjxJREJCYWNraW5n
U3RvcmU6OkN1cnNvcj4gSURCU1FMaXRlQmFja2luZ1N0b3JlOjpvcGVuT2JqZWN0U3RvcmVDdXJz
b3IoaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXlSYW5nZSogcmFuZ2UsIElEQkN1
cnNvcjo6RGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKyAgICBib29sIGxvd2VyQm91bmQgPSByYW5n
ZSAmJiByYW5nZS0+bG93ZXIoKTsKKyAgICBib29sIHVwcGVyQm91bmQgPSByYW5nZSAmJiByYW5n
ZS0+dXBwZXIoKTsKKworICAgIFN0cmluZyBzcWwgPSAiU0VMRUNUIGlkLCBrZXlTdHJpbmcsIGtl
eURhdGUsIGtleU51bWJlciwgdmFsdWUgRlJPTSBPYmplY3RTdG9yZURhdGEgV0hFUkUgIjsKKyAg
ICBpZiAobG93ZXJCb3VuZCkKKyAgICAgICAgc3FsICs9IGxvd2VyQ3Vyc29yV2hlcmVGcmFnbWVu
dCgqcmFuZ2UtPmxvd2VyKCksIHJhbmdlLT5sb3dlck9wZW4oKSA/ICI8IiA6ICI8PSIpOworICAg
IGlmICh1cHBlckJvdW5kKQorICAgICAgICBzcWwgKz0gdXBwZXJDdXJzb3JXaGVyZUZyYWdtZW50
KCpyYW5nZS0+dXBwZXIoKSwgcmFuZ2UtPnVwcGVyT3BlbigpID8gIjwiIDogIjw9Iik7CisgICAg
c3FsICs9ICJvYmplY3RTdG9yZUlkID0gPyBPUkRFUiBCWSAiOworCisgICAgaWYgKGRpcmVjdGlv
biA9PSBJREJDdXJzb3I6Ok5FWFQgfHwgZGlyZWN0aW9uID09IElEQkN1cnNvcjo6TkVYVF9OT19E
VVBMSUNBVEUpCisgICAgICAgIHNxbCArPSAia2V5U3RyaW5nLCBrZXlEYXRlLCBrZXlOdW1iZXIi
OworICAgIGVsc2UKKyAgICAgICAgc3FsICs9ICJrZXlTdHJpbmcgREVTQywga2V5RGF0ZSBERVND
LCBrZXlOdW1iZXIgREVTQyI7CisKKyAgICBSZWZQdHI8T2JqZWN0U3RvcmVDdXJzb3JJbXBsPiBj
dXJzb3IgPSBhZG9wdFJlZihuZXcgT2JqZWN0U3RvcmVDdXJzb3JJbXBsKG1fZGIsIHNxbCwgZGly
ZWN0aW9uID09IElEQkN1cnNvcjo6TkVYVF9OT19EVVBMSUNBVEUgfHwgZGlyZWN0aW9uID09IElE
QkN1cnNvcjo6UFJFVl9OT19EVVBMSUNBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rp
b24gPT0gSURCQ3Vyc29yOjpORVhUX05PX0RVUExJQ0FURSB8fCBkaXJlY3Rpb24gPT0gSURCQ3Vy
c29yOjpORVhUKSk7CisKKyAgICBib29sIG9rID0gY3Vyc29yLT5tX3F1ZXJ5LnByZXBhcmUoKSA9
PSBTUUxSZXN1bHRPazsKKyAgICBBU1NFUlRfVU5VU0VEKG9rLCBvayk7IC8vIEZJWE1FOiBCZXR0
ZXIgZXJyb3IgaGFuZGxpbmc/CisKKyAgICBpbnQgY3VycmVudENvbHVtbiA9IDE7CisgICAgaWYg
KGxvd2VyQm91bmQpCisgICAgICAgIGN1cnJlbnRDb2x1bW4gKz0gYmluZEtleVRvUXVlcnkoY3Vy
c29yLT5tX3F1ZXJ5LCBjdXJyZW50Q29sdW1uLCAqcmFuZ2UtPmxvd2VyKCkpOworICAgIGlmICh1
cHBlckJvdW5kKQorICAgICAgICBjdXJyZW50Q29sdW1uICs9IGJpbmRLZXlUb1F1ZXJ5KGN1cnNv
ci0+bV9xdWVyeSwgY3VycmVudENvbHVtbiwgKnJhbmdlLT51cHBlcigpKTsKKyAgICBjdXJzb3It
Pm1fcXVlcnkuYmluZEludDY0KGN1cnJlbnRDb2x1bW4sIG9iamVjdFN0b3JlSWQpOworCisgICAg
aWYgKGN1cnNvci0+bV9xdWVyeS5zdGVwKCkgIT0gU1FMUmVzdWx0Um93KQorICAgICAgICByZXR1
cm4gMDsKKworICAgIGN1cnNvci0+bG9hZEN1cnJlbnRSb3coKTsKKyAgICByZXR1cm4gY3Vyc29y
LnJlbGVhc2UoKTsKK30KKworUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4gSURC
U1FMaXRlQmFja2luZ1N0b3JlOjpvcGVuSW5kZXhLZXlDdXJzb3IoaW50NjRfdCBpbmRleElkLCBj
b25zdCBJREJLZXlSYW5nZSogcmFuZ2UsIElEQkN1cnNvcjo6RGlyZWN0aW9uIGRpcmVjdGlvbikK
K3sKKyAgICBTdHJpbmcgc3FsID0gU3RyaW5nKCJTRUxFQ1QgSW5kZXhEYXRhLmlkLCBJbmRleERh
dGEua2V5U3RyaW5nLCBJbmRleERhdGEua2V5RGF0ZSwgSW5kZXhEYXRhLmtleU51bWJlciwgIikK
KyAgICAgICAgICAgICAgICAgKyAoIk9iamVjdFN0b3JlRGF0YS5rZXlTdHJpbmcsIE9iamVjdFN0
b3JlRGF0YS5rZXlEYXRlLCBPYmplY3RTdG9yZURhdGEua2V5TnVtYmVyICIpCisgICAgICAgICAg
ICAgICAgICsgIkZST00gSW5kZXhEYXRhIElOTkVSIEpPSU4gT2JqZWN0U3RvcmVEYXRhIE9OIElu
ZGV4RGF0YS5vYmplY3RTdG9yZURhdGFJZCA9IE9iamVjdFN0b3JlRGF0YS5pZCBXSEVSRSAiOwor
CisgICAgYm9vbCBsb3dlckJvdW5kID0gcmFuZ2UgJiYgcmFuZ2UtPmxvd2VyKCk7CisgICAgYm9v
bCB1cHBlckJvdW5kID0gcmFuZ2UgJiYgcmFuZ2UtPnVwcGVyKCk7CisKKyAgICBpZiAobG93ZXJC
b3VuZCkKKyAgICAgICAgc3FsICs9IGxvd2VyQ3Vyc29yV2hlcmVGcmFnbWVudCgqcmFuZ2UtPmxv
d2VyKCksIHJhbmdlLT5sb3dlck9wZW4oKSA/ICI8IiA6ICI8PSIsICJJbmRleERhdGEuIik7Cisg
ICAgaWYgKHVwcGVyQm91bmQpCisgICAgICAgIHNxbCArPSB1cHBlckN1cnNvcldoZXJlRnJhZ21l
bnQoKnJhbmdlLT51cHBlcigpLCByYW5nZS0+dXBwZXJPcGVuKCkgPyAiPCIgOiAiPD0iLCAiSW5k
ZXhEYXRhLiIpOworICAgIHNxbCArPSAiSW5kZXhEYXRhLmluZGV4SWQgPSA/IE9SREVSIEJZICI7
CisKKyAgICBpZiAoZGlyZWN0aW9uID09IElEQkN1cnNvcjo6TkVYVCB8fCBkaXJlY3Rpb24gPT0g
SURCQ3Vyc29yOjpORVhUX05PX0RVUExJQ0FURSkKKyAgICAgICAgc3FsICs9ICJJbmRleERhdGEu
a2V5U3RyaW5nLCBJbmRleERhdGEua2V5RGF0ZSwgSW5kZXhEYXRhLmtleU51bWJlciwgSW5kZXhE
YXRhLmlkIjsKKyAgICBlbHNlCisgICAgICAgIHNxbCArPSAiSW5kZXhEYXRhLmtleVN0cmluZyBE
RVNDLCBJbmRleERhdGEua2V5RGF0ZSBERVNDLCBJbmRleERhdGEua2V5TnVtYmVyIERFU0MsIElu
ZGV4RGF0YS5pZCBERVNDIjsKKworICAgIFJlZlB0cjxJbmRleEtleUN1cnNvckltcGw+IGN1cnNv
ciA9IGFkb3B0UmVmKG5ldyBJbmRleEtleUN1cnNvckltcGwobV9kYiwgc3FsLCBkaXJlY3Rpb24g
PT0gSURCQ3Vyc29yOjpORVhUX05PX0RVUExJQ0FURSB8fCBkaXJlY3Rpb24gPT0gSURCQ3Vyc29y
OjpQUkVWX05PX0RVUExJQ0FURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9PSBJREJDdXJz
b3I6Ok5FWFRfTk9fRFVQTElDQVRFIHx8IGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFQpKTsK
KworICAgIGJvb2wgb2sgPSBjdXJzb3ItPm1fcXVlcnkucHJlcGFyZSgpID09IFNRTFJlc3VsdE9r
OworICAgIEFTU0VSVF9VTlVTRUQob2ssIG9rKTsgLy8gRklYTUU6IEJldHRlciBlcnJvciBoYW5k
bGluZz8KKworICAgIGludCBpbmRleENvbHVtbiA9IDE7CisgICAgaWYgKGxvd2VyQm91bmQpCisg
ICAgICAgIGluZGV4Q29sdW1uICs9IGJpbmRLZXlUb1F1ZXJ5KGN1cnNvci0+bV9xdWVyeSwgaW5k
ZXhDb2x1bW4sICpyYW5nZS0+bG93ZXIoKSk7CisgICAgaWYgKHVwcGVyQm91bmQpCisgICAgICAg
IGluZGV4Q29sdW1uICs9IGJpbmRLZXlUb1F1ZXJ5KGN1cnNvci0+bV9xdWVyeSwgaW5kZXhDb2x1
bW4sICpyYW5nZS0+dXBwZXIoKSk7CisgICAgY3Vyc29yLT5tX3F1ZXJ5LmJpbmRJbnQ2NChpbmRl
eENvbHVtbiwgaW5kZXhJZCk7CisKKyAgICBpZiAoY3Vyc29yLT5tX3F1ZXJ5LnN0ZXAoKSAhPSBT
UUxSZXN1bHRSb3cpCisgICAgICAgIHJldHVybiAwOworCisgICAgY3Vyc29yLT5sb2FkQ3VycmVu
dFJvdygpOworICAgIHJldHVybiBjdXJzb3IucmVsZWFzZSgpOworfQorCitQYXNzUmVmUHRyPElE
QkJhY2tpbmdTdG9yZTo6Q3Vyc29yPiBJREJTUUxpdGVCYWNraW5nU3RvcmU6Om9wZW5JbmRleEN1
cnNvcihpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleVJhbmdlKiByYW5nZSwgSURCQ3Vyc29y
OjpEaXJlY3Rpb24gZGlyZWN0aW9uKQoreworICAgIFN0cmluZyBzcWwgPSBTdHJpbmcoIlNFTEVD
VCBJbmRleERhdGEuaWQsIEluZGV4RGF0YS5rZXlTdHJpbmcsIEluZGV4RGF0YS5rZXlEYXRlLCBJ
bmRleERhdGEua2V5TnVtYmVyLCAiKQorICAgICAgICAgICAgICAgICArICgiT2JqZWN0U3RvcmVE
YXRhLnZhbHVlLCBPYmplY3RTdG9yZURhdGEua2V5U3RyaW5nLCBPYmplY3RTdG9yZURhdGEua2V5
RGF0ZSwgT2JqZWN0U3RvcmVEYXRhLmtleU51bWJlciAiKQorICAgICAgICAgICAgICAgICArICJG
Uk9NIEluZGV4RGF0YSBJTk5FUiBKT0lOIE9iamVjdFN0b3JlRGF0YSBPTiBJbmRleERhdGEub2Jq
ZWN0U3RvcmVEYXRhSWQgPSBPYmplY3RTdG9yZURhdGEuaWQgV0hFUkUgIjsKKworICAgIGJvb2wg
bG93ZXJCb3VuZCA9IHJhbmdlICYmIHJhbmdlLT5sb3dlcigpOworICAgIGJvb2wgdXBwZXJCb3Vu
ZCA9IHJhbmdlICYmIHJhbmdlLT51cHBlcigpOworCisgICAgaWYgKGxvd2VyQm91bmQpCisgICAg
ICAgIHNxbCArPSBsb3dlckN1cnNvcldoZXJlRnJhZ21lbnQoKnJhbmdlLT5sb3dlcigpLCByYW5n
ZS0+bG93ZXJPcGVuKCkgPyAiPCIgOiAiPD0iLCAiSW5kZXhEYXRhLiIpOworICAgIGlmICh1cHBl
ckJvdW5kKQorICAgICAgICBzcWwgKz0gdXBwZXJDdXJzb3JXaGVyZUZyYWdtZW50KCpyYW5nZS0+
dXBwZXIoKSwgcmFuZ2UtPnVwcGVyT3BlbigpID8gIjwiIDogIjw9IiwgIkluZGV4RGF0YS4iKTsK
KyAgICBzcWwgKz0gIkluZGV4RGF0YS5pbmRleElkID0gPyBPUkRFUiBCWSAiOworCisgICAgaWYg
KGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFQgfHwgZGlyZWN0aW9uID09IElEQkN1cnNvcjo6
TkVYVF9OT19EVVBMSUNBVEUpCisgICAgICAgIHNxbCArPSAiSW5kZXhEYXRhLmtleVN0cmluZywg
SW5kZXhEYXRhLmtleURhdGUsIEluZGV4RGF0YS5rZXlOdW1iZXIsIEluZGV4RGF0YS5pZCI7Cisg
ICAgZWxzZQorICAgICAgICBzcWwgKz0gIkluZGV4RGF0YS5rZXlTdHJpbmcgREVTQywgSW5kZXhE
YXRhLmtleURhdGUgREVTQywgSW5kZXhEYXRhLmtleU51bWJlciBERVNDLCBJbmRleERhdGEuaWQg
REVTQyI7CisKKyAgICBSZWZQdHI8SW5kZXhDdXJzb3JJbXBsPiBjdXJzb3IgPSBhZG9wdFJlZihu
ZXcgSW5kZXhDdXJzb3JJbXBsKG1fZGIsIHNxbCwgZGlyZWN0aW9uID09IElEQkN1cnNvcjo6TkVY
VF9OT19EVVBMSUNBVEUgfHwgZGlyZWN0aW9uID09IElEQkN1cnNvcjo6UFJFVl9OT19EVVBMSUNB
VEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBkaXJlY3Rpb24gPT0gSURCQ3Vyc29yOjpORVhUX05PX0RVUExJQ0FURSB8
fCBkaXJlY3Rpb24gPT0gSURCQ3Vyc29yOjpORVhUKSk7CisKKyAgICBib29sIG9rID0gY3Vyc29y
LT5tX3F1ZXJ5LnByZXBhcmUoKSA9PSBTUUxSZXN1bHRPazsKKyAgICBBU1NFUlRfVU5VU0VEKG9r
LCBvayk7IC8vIEZJWE1FOiBCZXR0ZXIgZXJyb3IgaGFuZGxpbmc/CisKKyAgICBpbnQgaW5kZXhD
b2x1bW4gPSAxOworICAgIGlmIChsb3dlckJvdW5kKQorICAgICAgICBpbmRleENvbHVtbiArPSBi
aW5kS2V5VG9RdWVyeShjdXJzb3ItPm1fcXVlcnksIGluZGV4Q29sdW1uLCAqcmFuZ2UtPmxvd2Vy
KCkpOworICAgIGlmICh1cHBlckJvdW5kKQorICAgICAgICBpbmRleENvbHVtbiArPSBiaW5kS2V5
VG9RdWVyeShjdXJzb3ItPm1fcXVlcnksIGluZGV4Q29sdW1uLCAqcmFuZ2UtPnVwcGVyKCkpOwor
ICAgIGN1cnNvci0+bV9xdWVyeS5iaW5kSW50NjQoaW5kZXhDb2x1bW4sIGluZGV4SWQpOworCisg
ICAgaWYgKGN1cnNvci0+bV9xdWVyeS5zdGVwKCkgIT0gU1FMUmVzdWx0Um93KQorICAgICAgICBy
ZXR1cm4gMDsKKworICAgIGN1cnNvci0+bG9hZEN1cnJlbnRSb3coKTsKKyAgICByZXR1cm4gY3Vy
c29yLnJlbGVhc2UoKTsKK30KKworbmFtZXNwYWNlIHsKKworY2xhc3MgVHJhbnNhY3Rpb25JbXBs
IDogcHVibGljIElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24geworcHVibGljOgorICAgIFRy
YW5zYWN0aW9uSW1wbChTUUxpdGVEYXRhYmFzZSYgZGIpCisgICAgICAgIDogbV90cmFuc2FjdGlv
bihkYikKKyAgICB7CisgICAgfQorCisgICAgLy8gSURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlv
bgorICAgIHZpcnR1YWwgdm9pZCBiZWdpbigpIHsgbV90cmFuc2FjdGlvbi5iZWdpbigpOyB9Cisg
ICAgdmlydHVhbCB2b2lkIGNvbW1pdCgpIHsgbV90cmFuc2FjdGlvbi5jb21taXQoKTsgfQorICAg
IHZpcnR1YWwgdm9pZCByb2xsYmFjaygpIHsgbV90cmFuc2FjdGlvbi5yb2xsYmFjaygpOyB9CisK
K3ByaXZhdGU6CisgICAgU1FMaXRlVHJhbnNhY3Rpb24gbV90cmFuc2FjdGlvbjsKK307CisKK30g
Ly8gbmFtZXNwYWNlCisKK1Bhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbj4g
SURCU1FMaXRlQmFja2luZ1N0b3JlOjpjcmVhdGVUcmFuc2FjdGlvbigpCit7CisgICAgcmV0dXJu
IGFkb3B0UmVmKG5ldyBUcmFuc2FjdGlvbkltcGwobV9kYikpOworfQorCit9IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCU1FMaXRlQmFja2luZ1N0b3JlLmggYi9Tb3Vy
Y2UvV2ViQ29yZS9zdG9yYWdlL0lEQlNRTGl0ZUJhY2tpbmdTdG9yZS5oCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMGM2YzEKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2Uv
V2ViQ29yZS9zdG9yYWdlL0lEQlNRTGl0ZUJhY2tpbmdTdG9yZS5oCkBAIC0wLDAgKzEsODIgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAx
LiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyAqLworCisjaWZuZGVmIElEQlNRTGl0ZUJhY2tpbmdTdG9yZV9oCisjZGVmaW5lIElEQlNRTGl0
ZUJhY2tpbmdTdG9yZV9oCisKKyNpZiBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKKworI2luY2x1
ZGUgIklEQkJhY2tpbmdTdG9yZS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIElE
QlNRTGl0ZUJhY2tpbmdTdG9yZSA6IHB1YmxpYyBJREJCYWNraW5nU3RvcmUgeworcHVibGljOgor
ICAgIHN0YXRpYyBQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4gb3BlbihTZWN1cml0eU9yaWdp
biosIGNvbnN0IFN0cmluZyYgcGF0aEJhc2UsIGludDY0X3QgbWF4aW11bVNpemUsIGNvbnN0IFN0
cmluZyYgZmlsZUlkZW50aWZpZXIsIElEQkZhY3RvcnlCYWNrZW5kSW1wbCopOworICAgIHZpcnR1
YWwgfklEQlNRTGl0ZUJhY2tpbmdTdG9yZSgpOworCisgICAgdmlydHVhbCBib29sIGV4dHJhY3RJ
REJEYXRhYmFzZU1ldGFEYXRhKGNvbnN0IFN0cmluZyYgbmFtZSwgU3RyaW5nJiBmb3VuZFZlcnNp
b24sIGludDY0X3QmIGZvdW5kSWQpOworICAgIHZpcnR1YWwgYm9vbCBzZXRJREJEYXRhYmFzZU1l
dGFEYXRhKGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiB2ZXJzaW9uLCBpbnQ2NF90
JiByb3dJZCwgYm9vbCBpbnZhbGlkUm93SWQpOworCisgICAgdmlydHVhbCB2b2lkIGdldE9iamVj
dFN0b3JlcyhpbnQ2NF90IGRhdGFiYXNlSWQsIFZlY3RvcjxpbnQ2NF90PiYgZm91bmRJZHMsIFZl
Y3RvcjxTdHJpbmc+JiBmb3VuZE5hbWVzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmRLZXlQYXRocywg
VmVjdG9yPGJvb2w+JiBmb3VuZEF1dG9JbmNyZW1lbnRGbGFncyk7CisgICAgdmlydHVhbCBib29s
IGNyZWF0ZU9iamVjdFN0b3JlKGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQ
YXRoLCBib29sIGF1dG9JbmNyZW1lbnQsIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCYgYXNz
aWduZWRPYmplY3RTdG9yZUlkKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGVsZXRlT2JqZWN0U3RvcmUo
aW50NjRfdCBvYmplY3RTdG9yZUlkKTsKKyAgICB2aXJ0dWFsIFN0cmluZyBnZXRPYmplY3RTdG9y
ZVJlY29yZChpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYpOworICAgIHZpcnR1
YWwgYm9vbCBwdXRPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0
IElEQktleSYsIGNvbnN0IFN0cmluZyYgdmFsdWUsIGludDY0X3QmIHJvd0lkLCBib29sIGludmFs
aWRSb3dJZCk7CisgICAgdmlydHVhbCB2b2lkIGNsZWFyT2JqZWN0U3RvcmUoaW50NjRfdCBvYmpl
Y3RTdG9yZUlkKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGVsZXRlT2JqZWN0U3RvcmVSZWNvcmQoaW50
NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlRGF0YUlkKTsKKyAgICB2aXJ0
dWFsIGRvdWJsZSBuZXh0QXV0b0luY3JlbWVudE51bWJlcihpbnQ2NF90IG9iamVjdFN0b3JlSWQp
OworICAgIHZpcnR1YWwgYm9vbCBrZXlFeGlzdHNJbk9iamVjdFN0b3JlKGludDY0X3Qgb2JqZWN0
U3RvcmVJZCwgY29uc3QgSURCS2V5JiwgaW50NjRfdCYgZm91bmRPYmplY3RTdG9yZURhdGFJZCk7
CisKKyAgICB2aXJ0dWFsIGJvb2wgZm9yRWFjaE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3Qgb2Jq
ZWN0U3RvcmVJZCwgT2JqZWN0U3RvcmVSZWNvcmRDYWxsYmFjayYpOworCisgICAgdmlydHVhbCB2
b2lkIGdldEluZGV4ZXMoaW50NjRfdCBvYmplY3RTdG9yZUlkLCBWZWN0b3I8aW50NjRfdD4mIGZv
dW5kSWRzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmROYW1lcywgVmVjdG9yPFN0cmluZz4mIGZvdW5k
S2V5UGF0aHMsIFZlY3Rvcjxib29sPiYgZm91bmRVbmlxdWVGbGFncyk7CisgICAgdmlydHVhbCBi
b29sIGNyZWF0ZUluZGV4KGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgU3RyaW5nJiBuYW1l
LCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgaXNVbmlxdWUsIGludDY0X3QmIGluZGV4SWQp
OworICAgIHZpcnR1YWwgdm9pZCBkZWxldGVJbmRleChpbnQ2NF90IGluZGV4SWQpOworICAgIHZp
cnR1YWwgYm9vbCBwdXRJbmRleERhdGFGb3JSZWNvcmQoaW50NjRfdCBpbmRleElkLCBjb25zdCBJ
REJLZXkmLCBpbnQ2NF90IG9iamVjdFN0b3JlRGF0YUlkKTsKKyAgICB2aXJ0dWFsIGJvb2wgZGVs
ZXRlSW5kZXhEYXRhRm9yUmVjb3JkKGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQpOworICAgIHZp
cnR1YWwgU3RyaW5nIGdldE9iamVjdFZpYUluZGV4KGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURC
S2V5Jik7CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQktleT4gZ2V0UHJpbWFyeUtleVZpYUlu
ZGV4KGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5Jik7CisgICAgdmlydHVhbCBib29sIGtl
eUV4aXN0c0luSW5kZXgoaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmKTsKKworICAgIHZp
cnR1YWwgUGFzc1JlZlB0cjxDdXJzb3I+IG9wZW5PYmplY3RTdG9yZUN1cnNvcihpbnQ2NF90IG9i
amVjdFN0b3JlSWQsIGNvbnN0IElEQktleVJhbmdlKiwgSURCQ3Vyc29yOjpEaXJlY3Rpb24pOwor
ICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxDdXJzb3I+IG9wZW5JbmRleEtleUN1cnNvcihpbnQ2NF90
IGluZGV4SWQsIGNvbnN0IElEQktleVJhbmdlKiwgSURCQ3Vyc29yOjpEaXJlY3Rpb24pOworICAg
IHZpcnR1YWwgUGFzc1JlZlB0cjxDdXJzb3I+IG9wZW5JbmRleEN1cnNvcihpbnQ2NF90IGluZGV4
SWQsIGNvbnN0IElEQktleVJhbmdlKiwgSURCQ3Vyc29yOjpEaXJlY3Rpb24pOworCisgICAgdmly
dHVhbCBQYXNzUmVmUHRyPFRyYW5zYWN0aW9uPiBjcmVhdGVUcmFuc2FjdGlvbigpOworCitwcml2
YXRlOgorICAgIElEQlNRTGl0ZUJhY2tpbmdTdG9yZShTdHJpbmcgaWRlbnRpZmllciwgSURCRmFj
dG9yeUJhY2tlbmRJbXBsKik7CisKKyAgICBTUUxpdGVEYXRhYmFzZSBtX2RiOworICAgIFN0cmlu
ZyBtX2lkZW50aWZpZXI7CisgICAgUmVmUHRyPElEQkZhY3RvcnlCYWNrZW5kSW1wbD4gbV9mYWN0
b3J5OworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYKKworI2VuZGlmIC8v
IElEQlNRTGl0ZUJhY2tpbmdTdG9yZV9oCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>85177</attachid>
            <date>2011-03-09 08:06:59 -0800</date>
            <delta_ts>2011-03-10 09:48:01 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>patch.patch</filename>
            <type>text/plain</type>
            <size>97029</size>
            <attacher name="Hans Wennborg">hans</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCAwMzAzZWY5Li4wMjE1MGZiIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNjIg
QEAKKzIwMTEtMDMtMDkgIEhhbnMgV2VubmJvcmcgIDxoYW5zQGNocm9taXVtLm9yZz4KKworICAg
ICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJbmRleGVkREI6IE1h
a2UgSURCQmFja2luZ1N0b3JlIGFic3RyYWN0CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQu
b3JnL3Nob3dfYnVnLmNnaT9pZD01NjAxMworCisgICAgICAgIE1ha2UgSURCQmFja2luZ1N0b3Jl
IGFic3RyYWN0IHRvIGFsbG93IGZvciBtdWx0aXBsZSBpbXBsZW1lbnRhdGlvbnMuCisgICAgICAg
IE1vdmUgdGhlIFNRTGl0ZSBpbXBsZW1lbnRhdGlvbiB0byBJREJTUUxpdGVCYWNraW5nU3RvcmUu
CisKKyAgICAgICAgTm8gbmV3IHRlc3RzOiByZWZhY3RvcmluZyBvbmx5LgorCisgICAgICAgICog
V2ViQ29yZS5neXBpOgorICAgICAgICAqIHN0b3JhZ2UvSURCQmFja2luZ1N0b3JlLmg6CisgICAg
ICAgIChXZWJDb3JlOjpJREJCYWNraW5nU3RvcmU6On5JREJCYWNraW5nU3RvcmUpOgorICAgICAg
ICAqIHN0b3JhZ2UvSURCRmFjdG9yeUJhY2tlbmRJbXBsLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
OklEQkZhY3RvcnlCYWNrZW5kSW1wbDo6b3Blbik6CisgICAgICAgICogc3RvcmFnZS9JREJTUUxp
dGVCYWNraW5nU3RvcmUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6SURCU1FMaXRlQmFja2luZ1N0
b3JlOjpJREJTUUxpdGVCYWNraW5nU3RvcmUpOgorICAgICAgICAoV2ViQ29yZTo6SURCU1FMaXRl
QmFja2luZ1N0b3JlOjp+SURCU1FMaXRlQmFja2luZ1N0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6
OnJ1bkNvbW1hbmRzKToKKyAgICAgICAgKFdlYkNvcmU6OmNyZWF0ZVRhYmxlcyk6CisgICAgICAg
IChXZWJDb3JlOjpjcmVhdGVNZXRhRGF0YVRhYmxlKToKKyAgICAgICAgKFdlYkNvcmU6OmdldERh
dGFiYXNlU2NoZW1hVmVyc2lvbik6CisgICAgICAgIChXZWJDb3JlOjptaWdyYXRlRGF0YWJhc2Up
OgorICAgICAgICAoV2ViQ29yZTo6SURCU1FMaXRlQmFja2luZ1N0b3JlOjpvcGVuKToKKyAgICAg
ICAgKFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6ZXh0cmFjdElEQkRhdGFiYXNlTWV0
YURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6SURCU1FMaXRlQmFja2luZ1N0b3JlOjpzZXRJREJE
YXRhYmFzZU1ldGFEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9y
ZTo6Z2V0T2JqZWN0U3RvcmVzKToKKyAgICAgICAgKFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdT
dG9yZTo6Y3JlYXRlT2JqZWN0U3RvcmUpOgorICAgICAgICAoV2ViQ29yZTo6ZG9EZWxldGUpOgor
ICAgICAgICAoV2ViQ29yZTo6SURCU1FMaXRlQmFja2luZ1N0b3JlOjpkZWxldGVPYmplY3RTdG9y
ZSk6CisgICAgICAgIChXZWJDb3JlOjp3aGVyZVN5bnRheEZvcktleSk6CisgICAgICAgIChXZWJD
b3JlOjpiaW5kS2V5VG9RdWVyeSk6CisgICAgICAgIChXZWJDb3JlOjpsb3dlckN1cnNvcldoZXJl
RnJhZ21lbnQpOgorICAgICAgICAoV2ViQ29yZTo6dXBwZXJDdXJzb3JXaGVyZUZyYWdtZW50KToK
KyAgICAgICAgKFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3RvcmVS
ZWNvcmQpOgorICAgICAgICAoV2ViQ29yZTo6YmluZEtleVRvUXVlcnlXaXRoTnVsbHMpOgorICAg
ICAgICAoV2ViQ29yZTo6SURCU1FMaXRlQmFja2luZ1N0b3JlOjpwdXRPYmplY3RTdG9yZVJlY29y
ZCk6CisgICAgICAgIChXZWJDb3JlOjpJREJTUUxpdGVCYWNraW5nU3RvcmU6OmNsZWFyT2JqZWN0
U3RvcmUpOgorICAgICAgICAoV2ViQ29yZTo6SURCU1FMaXRlQmFja2luZ1N0b3JlOjpkZWxldGVP
YmplY3RTdG9yZVJlY29yZCk6CisgICAgICAgIChXZWJDb3JlOjpJREJTUUxpdGVCYWNraW5nU3Rv
cmU6Om5leHRBdXRvSW5jcmVtZW50TnVtYmVyKToKKyAgICAgICAgKFdlYkNvcmU6OklEQlNRTGl0
ZUJhY2tpbmdTdG9yZTo6a2V5RXhpc3RzSW5PYmplY3RTdG9yZSk6CisgICAgICAgIChXZWJDb3Jl
OjpJREJTUUxpdGVCYWNraW5nU3RvcmU6OmZvckVhY2hPYmplY3RTdG9yZVJlY29yZCk6CisgICAg
ICAgIChXZWJDb3JlOjpJREJTUUxpdGVCYWNraW5nU3RvcmU6OmdldEluZGV4ZXMpOgorICAgICAg
ICAoV2ViQ29yZTo6SURCU1FMaXRlQmFja2luZ1N0b3JlOjpjcmVhdGVJbmRleCk6CisgICAgICAg
IChXZWJDb3JlOjpJREJTUUxpdGVCYWNraW5nU3RvcmU6OmRlbGV0ZUluZGV4KToKKyAgICAgICAg
KFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6cHV0SW5kZXhEYXRhRm9yUmVjb3JkKToK
KyAgICAgICAgKFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6ZGVsZXRlSW5kZXhEYXRh
Rm9yUmVjb3JkKToKKyAgICAgICAgKFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Z2V0
T2JqZWN0VmlhSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6a2V5RnJvbVF1ZXJ5KToKKyAgICAg
ICAgKFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Z2V0UHJpbWFyeUtleVZpYUluZGV4
KToKKyAgICAgICAgKFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6a2V5RXhpc3RzSW5J
bmRleCk6CisgICAgICAgIChXZWJDb3JlOjpJREJTUUxpdGVCYWNraW5nU3RvcmU6Om9wZW5PYmpl
Y3RTdG9yZUN1cnNvcik6CisgICAgICAgIChXZWJDb3JlOjpJREJTUUxpdGVCYWNraW5nU3RvcmU6
Om9wZW5JbmRleEtleUN1cnNvcik6CisgICAgICAgIChXZWJDb3JlOjpJREJTUUxpdGVCYWNraW5n
U3RvcmU6Om9wZW5JbmRleEN1cnNvcik6CisgICAgICAgIChXZWJDb3JlOjpJREJTUUxpdGVCYWNr
aW5nU3RvcmU6OmNyZWF0ZVRyYW5zYWN0aW9uKToKKyAgICAgICAgKiBzdG9yYWdlL0lEQlNRTGl0
ZUJhY2tpbmdTdG9yZS5oOiBBZGRlZC4KKwogMjAxMS0wMy0wOCAgSGFucyBXZW5uYm9yZyAgPGhh
bnNAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEplcmVteSBPcmxvdy4KZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtIGIvU291cmNlL1dlYkNvcmUv
R05VbWFrZWZpbGUuYW0KaW5kZXggMmViNzIwNi4uMDAzZmMzOSAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYkNvcmUvR05VbWFrZWZpbGUuYW0KKysrIGIvU291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUu
YW0KQEAgLTMxMDYsNyArMzEwNiw2IEBAIHdlYmNvcmVfc291cmNlcyArPSBcCiAJU291cmNlL1dl
YkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRyYWNrZXIuaCBcCiAJU291cmNlL1dlYkNvcmUvc3RvcmFn
ZS9JREJBbnkuY3BwIFwKIAlTb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkFueS5oIFwKLQlTb3Vy
Y2UvV2ViQ29yZS9zdG9yYWdlL0lEQkJhY2tpbmdTdG9yZS5jcHAgXAogCVNvdXJjZS9XZWJDb3Jl
L3N0b3JhZ2UvSURCQmFja2luZ1N0b3JlLmggXAogCVNvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURC
Q2FsbGJhY2tzLmggXAogCVNvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCQ3Vyc29yQmFja2VuZElt
cGwuY3BwIFwKQEAgLTMxNDgsNiArMzE0Nyw4IEBAIHdlYmNvcmVfc291cmNlcyArPSBcCiAJU291
cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJPYmplY3RTdG9yZS5oIFwKIAlTb3VyY2UvV2ViQ29yZS9z
dG9yYWdlL0lEQlJlcXVlc3QuY3BwIFwKIAlTb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQlJlcXVl
c3QuaCBcCisJU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJTUUxpdGVCYWNraW5nU3RvcmUuY3Bw
IFwKKwlTb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQlNRTGl0ZUJhY2tpbmdTdG9yZS5oIFwKIAlT
b3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQlRyYW5zYWN0aW9uQmFja2VuZEludGVyZmFjZS5oIFwK
IAlTb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQlRyYW5zYWN0aW9uQ29vcmRpbmF0b3IuaCBcCiAJ
U291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJUcmFuc2FjdGlvbi5jcHAgXApkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBp
CmluZGV4IDg3NWQ5NWUuLmJjOWVkZGQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1dlYkNv
cmUuZ3lwaQorKysgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkKQEAgLTQ1MTEsNyArNDUx
MSw2IEBACiAgICAgICAgICAgICAnc3RvcmFnZS9EYXRhYmFzZVRyYWNrZXJDbGllbnQuaCcsCiAg
ICAgICAgICAgICAnc3RvcmFnZS9JREJBbnkuY3BwJywKICAgICAgICAgICAgICdzdG9yYWdlL0lE
QkFueS5oJywKLSAgICAgICAgICAgICdzdG9yYWdlL0lEQkJhY2tpbmdTdG9yZS5jcHAnLAogICAg
ICAgICAgICAgJ3N0b3JhZ2UvSURCQmFja2luZ1N0b3JlLmgnLAogICAgICAgICAgICAgJ3N0b3Jh
Z2UvSURCQ2FsbGJhY2tzLmgnLAogICAgICAgICAgICAgJ3N0b3JhZ2UvSURCQ3Vyc29yLmNwcCcs
CkBAIC00NTU4LDYgKzQ1NTcsOCBAQAogICAgICAgICAgICAgJ3N0b3JhZ2UvSURCUGVuZGluZ1Ry
YW5zYWN0aW9uTW9uaXRvci5oJywKICAgICAgICAgICAgICdzdG9yYWdlL0lEQlJlcXVlc3QuY3Bw
JywKICAgICAgICAgICAgICdzdG9yYWdlL0lEQlJlcXVlc3QuaCcsCisgICAgICAgICAgICAnc3Rv
cmFnZS9JREJTUUxpdGVCYWNraW5nU3RvcmUuY3BwJywKKyAgICAgICAgICAgICdzdG9yYWdlL0lE
QlNRTGl0ZUJhY2tpbmdTdG9yZS5oJywKICAgICAgICAgICAgICdzdG9yYWdlL0lEQlRyYW5zYWN0
aW9uLmNwcCcsCiAgICAgICAgICAgICAnc3RvcmFnZS9JREJUcmFuc2FjdGlvbi5oJywKICAgICAg
ICAgICAgICdzdG9yYWdlL0lEQlRyYW5zYWN0aW9uQmFja2VuZEltcGwuY3BwJywKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCQmFja2luZ1N0b3JlLmNwcCBiL1NvdXJjZS9X
ZWJDb3JlL3N0b3JhZ2UvSURCQmFja2luZ1N0b3JlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMzg1OWM0Yy4uMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lE
QkJhY2tpbmdTdG9yZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5OTYgKzAsMCBAQAotLyoKLSAq
IENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoK
LSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuICBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAotICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KLSAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
QU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
Ci0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0K
LSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJJREJCYWNraW5nU3RvcmUuaCIKLQotI2lm
IEVOQUJMRShJTkRFWEVEX0RBVEFCQVNFKQotCi0jaW5jbHVkZSAiRmlsZVN5c3RlbS5oIgotI2lu
Y2x1ZGUgIklEQkZhY3RvcnlCYWNrZW5kSW1wbC5oIgotI2luY2x1ZGUgIklEQktleS5oIgotI2lu
Y2x1ZGUgIklEQktleVJhbmdlLmgiCi0jaW5jbHVkZSAiU1FMaXRlRGF0YWJhc2UuaCIKLSNpbmNs
dWRlICJTUUxpdGVTdGF0ZW1lbnQuaCIKLSNpbmNsdWRlICJTUUxpdGVUcmFuc2FjdGlvbi5oIgot
I2luY2x1ZGUgIlNlY3VyaXR5T3JpZ2luLmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotSURC
QmFja2luZ1N0b3JlOjpJREJCYWNraW5nU3RvcmUoU3RyaW5nIGlkZW50aWZpZXIsIElEQkZhY3Rv
cnlCYWNrZW5kSW1wbCogZmFjdG9yeSkKLSAgICA6IG1faWRlbnRpZmllcihpZGVudGlmaWVyKQot
ICAgICwgbV9mYWN0b3J5KGZhY3RvcnkpCi17Ci0gICAgbV9mYWN0b3J5LT5hZGRJREJCYWNraW5n
U3RvcmUoaWRlbnRpZmllciwgdGhpcyk7Ci19Ci0KLUlEQkJhY2tpbmdTdG9yZTo6fklEQkJhY2tp
bmdTdG9yZSgpCi17Ci0gICAgbV9mYWN0b3J5LT5yZW1vdmVJREJCYWNraW5nU3RvcmUobV9pZGVu
dGlmaWVyKTsKLX0KLQotc3RhdGljIGJvb2wgcnVuQ29tbWFuZHMoU1FMaXRlRGF0YWJhc2UmIHNx
bGl0ZURhdGFiYXNlLCBjb25zdCBjaGFyKiogY29tbWFuZHMsIHNpemVfdCBudW1iZXJPZkNvbW1h
bmRzKQotewotICAgIFNRTGl0ZVRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uKHNxbGl0ZURhdGFiYXNl
LCBmYWxzZSk7Ci0gICAgdHJhbnNhY3Rpb24uYmVnaW4oKTsKLSAgICBmb3IgKHNpemVfdCBpID0g
MDsgaSA8IG51bWJlck9mQ29tbWFuZHM7ICsraSkgewotICAgICAgICBpZiAoIXNxbGl0ZURhdGFi
YXNlLmV4ZWN1dGVDb21tYW5kKGNvbW1hbmRzW2ldKSkgewotICAgICAgICAgICAgTE9HX0VSUk9S
KCJGYWlsZWQgdG8gcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBmb3IgSW5kZXhlZERCOiAlcyIs
IGNvbW1hbmRzW2ldKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAg
IH0KLSAgICB0cmFuc2FjdGlvbi5jb21taXQoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3Rh
dGljIGJvb2wgY3JlYXRlVGFibGVzKFNRTGl0ZURhdGFiYXNlJiBzcWxpdGVEYXRhYmFzZSkKLXsK
LSAgICBpZiAoc3FsaXRlRGF0YWJhc2UudGFibGVFeGlzdHMoIkRhdGFiYXNlcyIpKQotICAgICAg
ICByZXR1cm4gdHJ1ZTsKLSAgICBzdGF0aWMgY29uc3QgY2hhciogY29tbWFuZHNbXSA9IHsKLSAg
ICAgICAgIkNSRUFURSBUQUJMRSBEYXRhYmFzZXMgKGlkIElOVEVHRVIgUFJJTUFSWSBLRVksIG5h
bWUgVEVYVCBOT1QgTlVMTCwgZGVzY3JpcHRpb24gVEVYVCBOT1QgTlVMTCwgdmVyc2lvbiBURVhU
IE5PVCBOVUxMKSIsCi0gICAgICAgICJDUkVBVEUgVU5JUVVFIElOREVYIERhdGFiYXNlc19uYW1l
IE9OIERhdGFiYXNlcyhuYW1lKSIsCi0KLSAgICAgICAgIkNSRUFURSBUQUJMRSBPYmplY3RTdG9y
ZXMgKGlkIElOVEVHRVIgUFJJTUFSWSBLRVksIG5hbWUgVEVYVCBOT1QgTlVMTCwga2V5UGF0aCBU
RVhULCBkb0F1dG9JbmNyZW1lbnQgSU5URUdFUiBOT1QgTlVMTCwgZGF0YWJhc2VJZCBJTlRFR0VS
IE5PVCBOVUxMIFJFRkVSRU5DRVMgRGF0YWJhc2VzKGlkKSkiLAotICAgICAgICAiQ1JFQVRFIFVO
SVFVRSBJTkRFWCBPYmplY3RTdG9yZXNfY29tcG9zaXQgT04gT2JqZWN0U3RvcmVzKGRhdGFiYXNl
SWQsIG5hbWUpIiwKLQotICAgICAgICAiQ1JFQVRFIFRBQkxFIEluZGV4ZXMgKGlkIElOVEVHRVIg
UFJJTUFSWSBLRVksIG9iamVjdFN0b3JlSWQgSU5URUdFUiBOT1QgTlVMTCBSRUZFUkVOQ0VTIE9i
amVjdFN0b3JlKGlkKSwgbmFtZSBURVhUIE5PVCBOVUxMLCBrZXlQYXRoIFRFWFQsIGlzVW5pcXVl
IElOVEVHRVIgTk9UIE5VTEwpIiwKLSAgICAgICAgIkNSRUFURSBVTklRVUUgSU5ERVggSW5kZXhl
c19jb21wb3NpdCBPTiBJbmRleGVzKG9iamVjdFN0b3JlSWQsIG5hbWUpIiwKLQotICAgICAgICAi
Q1JFQVRFIFRBQkxFIE9iamVjdFN0b3JlRGF0YSAoaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgb2Jq
ZWN0U3RvcmVJZCBJTlRFR0VSIE5PVCBOVUxMIFJFRkVSRU5DRVMgT2JqZWN0U3RvcmUoaWQpLCBr
ZXlTdHJpbmcgVEVYVCwga2V5RGF0ZSBJTlRFR0VSLCBrZXlOdW1iZXIgSU5URUdFUiwgdmFsdWUg
VEVYVCBOT1QgTlVMTCkiLAotICAgICAgICAiQ1JFQVRFIFVOSVFVRSBJTkRFWCBPYmplY3RTdG9y
ZURhdGFfY29tcG9zaXQgT04gT2JqZWN0U3RvcmVEYXRhKGtleVN0cmluZywga2V5RGF0ZSwga2V5
TnVtYmVyLCBvYmplY3RTdG9yZUlkKSIsCi0KLSAgICAgICAgIkNSRUFURSBUQUJMRSBJbmRleERh
dGEgKGlkIElOVEVHRVIgUFJJTUFSWSBLRVksIGluZGV4SWQgSU5URUdFUiBOT1QgTlVMTCBSRUZF
UkVOQ0VTIEluZGV4ZXMoaWQpLCBrZXlTdHJpbmcgVEVYVCwga2V5RGF0ZSBJTlRFR0VSLCBrZXlO
dW1iZXIgSU5URUdFUiwgb2JqZWN0U3RvcmVEYXRhSWQgSU5URUdFUiBOT1QgTlVMTCBSRUZFUkVO
Q0VTIE9iamVjdFN0b3JlRGF0YShpZCkpIiwKLSAgICAgICAgIkNSRUFURSBJTkRFWCBJbmRleERh
dGFfY29tcG9zaXQgT04gSW5kZXhEYXRhKGtleVN0cmluZywga2V5RGF0ZSwga2V5TnVtYmVyLCBp
bmRleElkKSIsCi0gICAgICAgICJDUkVBVEUgSU5ERVggSW5kZXhEYXRhX29iamVjdFN0b3JlRGF0
YUlkIE9OIEluZGV4RGF0YShvYmplY3RTdG9yZURhdGFJZCkiLAotICAgICAgICAiQ1JFQVRFIElO
REVYIEluZGV4RGF0YV9pbmRleElkIE9OIEluZGV4RGF0YShpbmRleElkKSIsCi0gICAgICAgIH07
Ci0KLSAgICByZXR1cm4gcnVuQ29tbWFuZHMoc3FsaXRlRGF0YWJhc2UsIGNvbW1hbmRzLCBzaXpl
b2YoY29tbWFuZHMpIC8gc2l6ZW9mKGNvbW1hbmRzWzBdKSk7Ci19Ci0KLXN0YXRpYyBib29sIGNy
ZWF0ZU1ldGFEYXRhVGFibGUoU1FMaXRlRGF0YWJhc2UmIHNxbGl0ZURhdGFiYXNlKQotewotICAg
IHN0YXRpYyBjb25zdCBjaGFyKiBjb21tYW5kc1tdID0gewotICAgICAgICAiQ1JFQVRFIFRBQkxF
IE1ldGFEYXRhIChuYW1lIFRFWFQgUFJJTUFSWSBLRVksIHZhbHVlIE5PTkUpIiwKLSAgICAgICAg
IklOU0VSVCBJTlRPIE1ldGFEYXRhIFZBTFVFUyAoJ3ZlcnNpb24nLCAxKSIsCi0gICAgfTsKLQot
ICAgIHJldHVybiBydW5Db21tYW5kcyhzcWxpdGVEYXRhYmFzZSwgY29tbWFuZHMsIHNpemVvZihj
b21tYW5kcykgLyBzaXplb2YoY29tbWFuZHNbMF0pKTsKLX0KLQotc3RhdGljIGJvb2wgZ2V0RGF0
YWJhc2VTY2hlbWFWZXJzaW9uKFNRTGl0ZURhdGFiYXNlJiBzcWxpdGVEYXRhYmFzZSwgaW50KiBk
YXRhYmFzZVZlcnNpb24pCi17Ci0gICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KHNxbGl0ZURhdGFi
YXNlLCAiU0VMRUNUIHZhbHVlIEZST00gTWV0YURhdGEgV0hFUkUgbmFtZSA9ICd2ZXJzaW9uJyIp
OwotICAgIGlmIChxdWVyeS5wcmVwYXJlKCkgIT0gU1FMUmVzdWx0T2sgfHwgcXVlcnkuc3RlcCgp
ICE9IFNRTFJlc3VsdFJvdykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgKmRhdGFiYXNl
VmVyc2lvbiA9IHF1ZXJ5LmdldENvbHVtbkludCgwKTsKLSAgICByZXR1cm4gcXVlcnkuZmluYWxp
emUoKSA9PSBTUUxSZXN1bHRPazsKLX0KLQotc3RhdGljIGJvb2wgbWlncmF0ZURhdGFiYXNlKFNR
TGl0ZURhdGFiYXNlJiBzcWxpdGVEYXRhYmFzZSkKLXsKLSAgICBpZiAoIXNxbGl0ZURhdGFiYXNl
LnRhYmxlRXhpc3RzKCJNZXRhRGF0YSIpKSB7Ci0gICAgICAgIGlmICghY3JlYXRlTWV0YURhdGFU
YWJsZShzcWxpdGVEYXRhYmFzZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQot
Ci0gICAgaW50IGRhdGFiYXNlVmVyc2lvbjsKLSAgICBpZiAoIWdldERhdGFiYXNlU2NoZW1hVmVy
c2lvbihzcWxpdGVEYXRhYmFzZSwgJmRhdGFiYXNlVmVyc2lvbikpCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLQotICAgIGlmIChkYXRhYmFzZVZlcnNpb24gPT0gMSkgewotICAgICAgICBzdGF0aWMg
Y29uc3QgY2hhciogY29tbWFuZHNbXSA9IHsKLSAgICAgICAgICAgICJEUk9QIFRBQkxFIElGIEVY
SVNUUyBPYmplY3RTdG9yZURhdGEyIiwKLSAgICAgICAgICAgICJDUkVBVEUgVEFCTEUgT2JqZWN0
U3RvcmVEYXRhMiAoaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgb2JqZWN0U3RvcmVJZCBJTlRFR0VS
IE5PVCBOVUxMIFJFRkVSRU5DRVMgT2JqZWN0U3RvcmUoaWQpLCBrZXlTdHJpbmcgVEVYVCwga2V5
RGF0ZSBSRUFMLCBrZXlOdW1iZXIgUkVBTCwgdmFsdWUgVEVYVCBOT1QgTlVMTCkiLAotICAgICAg
ICAgICAgIklOU0VSVCBJTlRPIE9iamVjdFN0b3JlRGF0YTIgU0VMRUNUICogRlJPTSBPYmplY3RT
dG9yZURhdGEiLAotICAgICAgICAgICAgIkRST1AgVEFCTEUgT2JqZWN0U3RvcmVEYXRhIiwgLy8g
VGhpcyBkZXBlbmRzIG9uIFNRTGl0ZSBub3QgZW5mb3JjaW5nIHJlZmVyZW50aWFsIGNvbnNpc3Rl
bmN5LgotICAgICAgICAgICAgIkFMVEVSIFRBQkxFIE9iamVjdFN0b3JlRGF0YTIgUkVOQU1FIFRP
IE9iamVjdFN0b3JlRGF0YSIsCi0gICAgICAgICAgICAiQ1JFQVRFIFVOSVFVRSBJTkRFWCBPYmpl
Y3RTdG9yZURhdGFfY29tcG9zaXQgT04gT2JqZWN0U3RvcmVEYXRhKGtleVN0cmluZywga2V5RGF0
ZSwga2V5TnVtYmVyLCBvYmplY3RTdG9yZUlkKSIsCi0gICAgICAgICAgICAiRFJPUCBUQUJMRSBJ
RiBFWElTVFMgSW5kZXhEYXRhMiIsIC8vIFRoaXMgZGVwZW5kcyBvbiBTUUxpdGUgbm90IGVuZm9y
Y2luZyByZWZlcmVudGlhbCBjb25zaXN0ZW5jeS4KLSAgICAgICAgICAgICJDUkVBVEUgVEFCTEUg
SW5kZXhEYXRhMiAoaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgaW5kZXhJZCBJTlRFR0VSIE5PVCBO
VUxMIFJFRkVSRU5DRVMgSW5kZXhlcyhpZCksIGtleVN0cmluZyBURVhULCBrZXlEYXRlIFJFQUws
IGtleU51bWJlciBSRUFMLCBvYmplY3RTdG9yZURhdGFJZCBJTlRFR0VSIE5PVCBOVUxMIFJFRkVS
RU5DRVMgT2JqZWN0U3RvcmVEYXRhKGlkKSkiLAotICAgICAgICAgICAgIklOU0VSVCBJTlRPIElu
ZGV4RGF0YTIgU0VMRUNUICogRlJPTSBJbmRleERhdGEiLAotICAgICAgICAgICAgIkRST1AgVEFC
TEUgSW5kZXhEYXRhIiwKLSAgICAgICAgICAgICJBTFRFUiBUQUJMRSBJbmRleERhdGEyIFJFTkFN
RSBUTyBJbmRleERhdGEiLAotICAgICAgICAgICAgIkNSRUFURSBJTkRFWCBJbmRleERhdGFfY29t
cG9zaXQgT04gSW5kZXhEYXRhKGtleVN0cmluZywga2V5RGF0ZSwga2V5TnVtYmVyLCBpbmRleElk
KSIsCi0gICAgICAgICAgICAiQ1JFQVRFIElOREVYIEluZGV4RGF0YV9vYmplY3RTdG9yZURhdGFJ
ZCBPTiBJbmRleERhdGEob2JqZWN0U3RvcmVEYXRhSWQpIiwKLSAgICAgICAgICAgICJDUkVBVEUg
SU5ERVggSW5kZXhEYXRhX2luZGV4SWQgT04gSW5kZXhEYXRhKGluZGV4SWQpIiwKLSAgICAgICAg
ICAgICJVUERBVEUgTWV0YURhdGEgU0VUIHZhbHVlID0gMiBXSEVSRSBuYW1lID0gJ3ZlcnNpb24n
IiwKLSAgICAgICAgfTsKLQotICAgICAgICBpZiAoIXJ1bkNvbW1hbmRzKHNxbGl0ZURhdGFiYXNl
LCBjb21tYW5kcywgc2l6ZW9mKGNvbW1hbmRzKSAvIHNpemVvZihjb21tYW5kc1swXSkpKQotICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGRhdGFiYXNlVmVyc2lvbiA9IDI7Ci0g
ICAgfQotCi0gICAgaWYgKGRhdGFiYXNlVmVyc2lvbiA9PSAyKSB7Ci0gICAgICAgIC8vIFdlIG5l
ZWQgdG8gbWFrZSB0aGUgT2JqZWN0U3RvcmVEYXRhLnZhbHVlIGJlIGEgQkxPQiBpbnN0ZWFkIG9m
IFRFWFQuCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjb21tYW5kc1tdID0gewotICAgICAg
ICAgICAgIkRST1AgVEFCTEUgSUYgRVhJU1RTIE9iamVjdFN0b3JlRGF0YSIsIC8vIFRoaXMgZHJv
cHMgYXNzb2NpYXRlZCBpbmRpY2VzLgotICAgICAgICAgICAgIkNSRUFURSBUQUJMRSBPYmplY3RT
dG9yZURhdGEgKGlkIElOVEVHRVIgUFJJTUFSWSBLRVksIG9iamVjdFN0b3JlSWQgSU5URUdFUiBO
T1QgTlVMTCBSRUZFUkVOQ0VTIE9iamVjdFN0b3JlKGlkKSwga2V5U3RyaW5nIFRFWFQsIGtleURh
dGUgUkVBTCwga2V5TnVtYmVyIFJFQUwsIHZhbHVlIEJMT0IgTk9UIE5VTEwpIiwKLSAgICAgICAg
ICAgICJDUkVBVEUgVU5JUVVFIElOREVYIE9iamVjdFN0b3JlRGF0YV9jb21wb3NpdCBPTiBPYmpl
Y3RTdG9yZURhdGEoa2V5U3RyaW5nLCBrZXlEYXRlLCBrZXlOdW1iZXIsIG9iamVjdFN0b3JlSWQp
IiwKLSAgICAgICAgICAgICJVUERBVEUgTWV0YURhdGEgU0VUIHZhbHVlID0gMyBXSEVSRSBuYW1l
ID0gJ3ZlcnNpb24nIiwKLSAgICAgICAgfTsKLQotICAgICAgICBpZiAoIXJ1bkNvbW1hbmRzKHNx
bGl0ZURhdGFiYXNlLCBjb21tYW5kcywgc2l6ZW9mKGNvbW1hbmRzKSAvIHNpemVvZihjb21tYW5k
c1swXSkpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGRhdGFiYXNlVmVy
c2lvbiA9IDM7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLVBhc3NSZWZQdHI8SURC
QmFja2luZ1N0b3JlPiBJREJCYWNraW5nU3RvcmU6Om9wZW4oU2VjdXJpdHlPcmlnaW4qIHNlY3Vy
aXR5T3JpZ2luLCBjb25zdCBTdHJpbmcmIHBhdGhCYXNlLCBpbnQ2NF90IG1heGltdW1TaXplLCBj
b25zdCBTdHJpbmcmIGZpbGVJZGVudGlmaWVyLCBJREJGYWN0b3J5QmFja2VuZEltcGwqIGZhY3Rv
cnkpCi17Ci0gICAgUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4gYmFja2luZ1N0b3JlKGFkb3B0UmVm
KG5ldyBJREJCYWNraW5nU3RvcmUoZmlsZUlkZW50aWZpZXIsIGZhY3RvcnkpKSk7Ci0KLSAgICBT
dHJpbmcgcGF0aCA9ICI6bWVtb3J5OiI7Ci0gICAgaWYgKCFwYXRoQmFzZS5pc0VtcHR5KCkpIHsK
LSAgICAgICAgaWYgKCFtYWtlQWxsRGlyZWN0b3JpZXMocGF0aEJhc2UpKSB7Ci0gICAgICAgICAg
ICAvLyBGSVhNRTogSXMgdGhlcmUgYW55IG90aGVyIHRoaW5nIHdlIGNvdWxkIHBvc3NpYmx5IGRv
IHRvIHJlY292ZXIgYXQgdGhpcyBwb2ludD8gSWYgc28sIGRvIGl0IHJhdGhlciB0aGFuIGp1c3Qg
ZXJyb3Jpbmcgb3V0LgotICAgICAgICAgICAgTE9HX0VSUk9SKCJVbmFibGVkIHRvIGNyZWF0ZSBM
b2NhbFN0b3JhZ2UgZGF0YWJhc2UgcGF0aCAlcyIsIHBhdGhCYXNlLnV0ZjgoKS5kYXRhKCkpOwot
ICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcGF0aCA9IHBhdGhCeUFw
cGVuZGluZ0NvbXBvbmVudChwYXRoQmFzZSwgc2VjdXJpdHlPcmlnaW4tPmRhdGFiYXNlSWRlbnRp
ZmllcigpICsgIi5pbmRleGVkZGIiKTsKLSAgICB9Ci0KLSAgICBpZiAoIWJhY2tpbmdTdG9yZS0+
bV9kYi5vcGVuKHBhdGgpKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBJcyB0aGVyZSBhbnkgb3RoZXIg
dGhpbmcgd2UgY291bGQgcG9zc2libHkgZG8gdG8gcmVjb3ZlciBhdCB0aGlzIHBvaW50PyBJZiBz
bywgZG8gaXQgcmF0aGVyIHRoYW4ganVzdCBlcnJvcmluZyBvdXQuCi0gICAgICAgIExPR19FUlJP
UigiRmFpbGVkIHRvIG9wZW4gZGF0YWJhc2UgZmlsZSAlcyBmb3IgSW5kZXhlZERCIiwgcGF0aC51
dGY4KCkuZGF0YSgpKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLy8gRklYTUU6
IEVycm9yIGNoZWNraW5nPwotICAgIGJhY2tpbmdTdG9yZS0+bV9kYi5zZXRNYXhpbXVtU2l6ZSht
YXhpbXVtU2l6ZSk7Ci0gICAgYmFja2luZ1N0b3JlLT5tX2RiLnR1cm5PbkluY3JlbWVudGFsQXV0
b1ZhY3V1bSgpOwotCi0gICAgaWYgKCFjcmVhdGVUYWJsZXMoYmFja2luZ1N0b3JlLT5tX2RiKSkK
LSAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKCFtaWdyYXRlRGF0YWJhc2UoYmFja2luZ1N0b3Jl
LT5tX2RiKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gYmFja2luZ1N0b3JlLnJl
bGVhc2UoKTsKLX0KLQotYm9vbCBJREJCYWNraW5nU3RvcmU6OmV4dHJhY3RJREJEYXRhYmFzZU1l
dGFEYXRhKGNvbnN0IFN0cmluZyYgbmFtZSwgU3RyaW5nJiBmb3VuZFZlcnNpb24sIGludDY0X3Qm
IGZvdW5kSWQpCi17Ci0gICAgU1FMaXRlU3RhdGVtZW50IGRhdGFiYXNlUXVlcnkobV9kYiwgIlNF
TEVDVCBpZCwgdmVyc2lvbiBGUk9NIERhdGFiYXNlcyBXSEVSRSBuYW1lID0gPyIpOwotICAgIGlm
IChkYXRhYmFzZVF1ZXJ5LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykgewotICAgICAgICBBU1NF
UlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBkYXRh
YmFzZVF1ZXJ5LmJpbmRUZXh0KDEsIG5hbWUpOwotICAgIGlmIChkYXRhYmFzZVF1ZXJ5LnN0ZXAo
KSAhPSBTUUxSZXN1bHRSb3cpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGZvdW5kSWQg
PSBkYXRhYmFzZVF1ZXJ5LmdldENvbHVtbkludDY0KDApOwotICAgIGZvdW5kVmVyc2lvbiA9IGRh
dGFiYXNlUXVlcnkuZ2V0Q29sdW1uVGV4dCgxKTsKLQotICAgIGlmIChkYXRhYmFzZVF1ZXJ5LnN0
ZXAoKSA9PSBTUUxSZXN1bHRSb3cpCi0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAg
IHJldHVybiB0cnVlOwotfQotCi1ib29sIElEQkJhY2tpbmdTdG9yZTo6c2V0SURCRGF0YWJhc2VN
ZXRhRGF0YShjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgdmVyc2lvbiwgaW50NjRf
dCYgcm93SWQsIGJvb2wgaW52YWxpZFJvd0lkKQotewotICAgIEFTU0VSVCghbmFtZS5pc051bGwo
KSk7Ci0gICAgQVNTRVJUKCF2ZXJzaW9uLmlzTnVsbCgpKTsKLQotICAgIFN0cmluZyBzcWwgPSBp
bnZhbGlkUm93SWQgPyAiSU5TRVJUIElOVE8gRGF0YWJhc2VzIChuYW1lLCBkZXNjcmlwdGlvbiwg
dmVyc2lvbikgVkFMVUVTICg/LCAnJywgPykiIDogIlVQREFURSBEYXRhYmFzZXMgU0VUIG5hbWUg
PSA/LCB2ZXJzaW9uID0gPyBXSEVSRSBpZCA9ID8iOwotICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVy
eShtX2RiLCBzcWwpOwotICAgIGlmIChxdWVyeS5wcmVwYXJlKCkgIT0gU1FMUmVzdWx0T2spIHsK
LSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICB9Ci0KLSAgICBxdWVyeS5iaW5kVGV4dCgxLCBuYW1lKTsKLSAgICBxdWVyeS5iaW5kVGV4dCgy
LCB2ZXJzaW9uKTsKLSAgICBpZiAoIWludmFsaWRSb3dJZCkKLSAgICAgICAgcXVlcnkuYmluZElu
dDY0KDMsIHJvd0lkKTsKLQotICAgIGlmIChxdWVyeS5zdGVwKCkgIT0gU1FMUmVzdWx0RG9uZSkK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKGludmFsaWRSb3dJZCkKLSAgICAgICAg
cm93SWQgPSBtX2RiLmxhc3RJbnNlcnRSb3dJRCgpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0K
LXZvaWQgSURCQmFja2luZ1N0b3JlOjpnZXRPYmplY3RTdG9yZXMoaW50NjRfdCBkYXRhYmFzZUlk
LCBWZWN0b3I8aW50NjRfdD4mIGZvdW5kSWRzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmROYW1lcywg
VmVjdG9yPFN0cmluZz4mIGZvdW5kS2V5UGF0aHMsIFZlY3Rvcjxib29sPiYgZm91bmRBdXRvSW5j
cmVtZW50RmxhZ3MpCi17Ci0gICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGIsICJTRUxFQ1Qg
aWQsIG5hbWUsIGtleVBhdGgsIGRvQXV0b0luY3JlbWVudCBGUk9NIE9iamVjdFN0b3JlcyBXSEVS
RSBkYXRhYmFzZUlkID0gPyIpOwotICAgIGJvb2wgb2sgPSBxdWVyeS5wcmVwYXJlKCkgPT0gU1FM
UmVzdWx0T2s7Ci0gICAgQVNTRVJUX1VOVVNFRChvaywgb2spOyAvLyBGSVhNRTogQmV0dGVyIGVy
cm9yIGhhbmRsaW5nPwotCi0gICAgQVNTRVJUKGZvdW5kSWRzLmlzRW1wdHkoKSk7Ci0gICAgQVNT
RVJUKGZvdW5kTmFtZXMuaXNFbXB0eSgpKTsKLSAgICBBU1NFUlQoZm91bmRLZXlQYXRocy5pc0Vt
cHR5KCkpOwotICAgIEFTU0VSVChmb3VuZEF1dG9JbmNyZW1lbnRGbGFncy5pc0VtcHR5KCkpOwot
Ci0gICAgcXVlcnkuYmluZEludDY0KDEsIGRhdGFiYXNlSWQpOwotCi0gICAgd2hpbGUgKHF1ZXJ5
LnN0ZXAoKSA9PSBTUUxSZXN1bHRSb3cpIHsKLSAgICAgICAgZm91bmRJZHMuYXBwZW5kKHF1ZXJ5
LmdldENvbHVtbkludDY0KDApKTsKLSAgICAgICAgZm91bmROYW1lcy5hcHBlbmQocXVlcnkuZ2V0
Q29sdW1uVGV4dCgxKSk7Ci0gICAgICAgIGZvdW5kS2V5UGF0aHMuYXBwZW5kKHF1ZXJ5LmdldENv
bHVtblRleHQoMikpOwotICAgICAgICBmb3VuZEF1dG9JbmNyZW1lbnRGbGFncy5hcHBlbmQoISFx
dWVyeS5nZXRDb2x1bW5JbnQoMykpOwotICAgIH0KLX0KLQotYm9vbCBJREJCYWNraW5nU3RvcmU6
OmNyZWF0ZU9iamVjdFN0b3JlKGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQ
YXRoLCBib29sIGF1dG9JbmNyZW1lbnQsIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCYgYXNz
aWduZWRPYmplY3RTdG9yZUlkKQotewotICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVyeShtX2RiLCAi
SU5TRVJUIElOVE8gT2JqZWN0U3RvcmVzIChuYW1lLCBrZXlQYXRoLCBkb0F1dG9JbmNyZW1lbnQs
IGRhdGFiYXNlSWQpIFZBTFVFUyAoPywgPywgPywgPykiKTsKLSAgICBpZiAocXVlcnkucHJlcGFy
ZSgpICE9IFNRTFJlc3VsdE9rKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBxdWVyeS5i
aW5kVGV4dCgxLCBuYW1lKTsKLSAgICBxdWVyeS5iaW5kVGV4dCgyLCBrZXlQYXRoKTsKLSAgICBx
dWVyeS5iaW5kSW50KDMsIHN0YXRpY19jYXN0PGludD4oYXV0b0luY3JlbWVudCkpOwotICAgIHF1
ZXJ5LmJpbmRJbnQ2NCg0LCBkYXRhYmFzZUlkKTsKLQotICAgIGlmIChxdWVyeS5zdGVwKCkgIT0g
U1FMUmVzdWx0RG9uZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgYXNzaWduZWRPYmpl
Y3RTdG9yZUlkID0gbV9kYi5sYXN0SW5zZXJ0Um93SUQoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0K
LQotc3RhdGljIHZvaWQgZG9EZWxldGUoU1FMaXRlRGF0YWJhc2UmIGRiLCBjb25zdCBjaGFyKiBz
cWwsIGludDY0X3QgaWQpCi17Ci0gICAgU1FMaXRlU3RhdGVtZW50IGRlbGV0ZVF1ZXJ5KGRiLCBz
cWwpOwotICAgIGJvb2wgb2sgPSBkZWxldGVRdWVyeS5wcmVwYXJlKCkgPT0gU1FMUmVzdWx0T2s7
Ci0gICAgQVNTRVJUX1VOVVNFRChvaywgb2spOyAvLyBGSVhNRTogQmV0dGVyIGVycm9yIGhhbmRs
aW5nLgotICAgIGRlbGV0ZVF1ZXJ5LmJpbmRJbnQ2NCgxLCBpZCk7Ci0gICAgb2sgPSBkZWxldGVR
dWVyeS5zdGVwKCkgPT0gU1FMUmVzdWx0RG9uZTsKLSAgICBBU1NFUlRfVU5VU0VEKG9rLCBvayk7
IC8vIEZJWE1FOiBCZXR0ZXIgZXJyb3IgaGFuZGxpbmcuCi19Ci0KLXZvaWQgSURCQmFja2luZ1N0
b3JlOjpkZWxldGVPYmplY3RTdG9yZShpbnQ2NF90IG9iamVjdFN0b3JlSWQpCi17Ci0gICAgZG9E
ZWxldGUobV9kYiwgIkRFTEVURSBGUk9NIE9iamVjdFN0b3JlcyBXSEVSRSBpZCA9ID8iLCBvYmpl
Y3RTdG9yZUlkKTsKLSAgICBkb0RlbGV0ZShtX2RiLCAiREVMRVRFIEZST00gT2JqZWN0U3RvcmVE
YXRhIFdIRVJFIG9iamVjdFN0b3JlSWQgPSA/Iiwgb2JqZWN0U3RvcmVJZCk7Ci0gICAgZG9EZWxl
dGUobV9kYiwgIkRFTEVURSBGUk9NIEluZGV4RGF0YSBXSEVSRSBpbmRleElkIElOIChTRUxFQ1Qg
aWQgRlJPTSBJbmRleGVzIFdIRVJFIG9iamVjdFN0b3JlSWQgPSA/KSIsIG9iamVjdFN0b3JlSWQp
OwotICAgIGRvRGVsZXRlKG1fZGIsICJERUxFVEUgRlJPTSBJbmRleGVzIFdIRVJFIG9iamVjdFN0
b3JlSWQgPSA/Iiwgb2JqZWN0U3RvcmVJZCk7Ci19Ci0KLXN0YXRpYyBTdHJpbmcgd2hlcmVTeW50
YXhGb3JLZXkoY29uc3QgSURCS2V5JiBrZXksIFN0cmluZyBxdWFsaWZpZWRUYWJsZU5hbWUgPSAi
IikKLXsKLSAgICBzd2l0Y2ggKGtleS50eXBlKCkpIHsKLSAgICBjYXNlIElEQktleTo6U3RyaW5n
VHlwZToKLSAgICAgICAgcmV0dXJuIHF1YWxpZmllZFRhYmxlTmFtZSArICJrZXlTdHJpbmcgPSA/
ICBBTkQgICIgKyBxdWFsaWZpZWRUYWJsZU5hbWUgKyAia2V5RGF0ZSBJUyBOVUxMICBBTkQgICIg
KyBxdWFsaWZpZWRUYWJsZU5hbWUgKyAia2V5TnVtYmVyIElTIE5VTEwgICI7Ci0gICAgY2FzZSBJ
REJLZXk6Ok51bWJlclR5cGU6Ci0gICAgICAgIHJldHVybiBxdWFsaWZpZWRUYWJsZU5hbWUgKyAi
a2V5U3RyaW5nIElTIE5VTEwgIEFORCAgIiArIHF1YWxpZmllZFRhYmxlTmFtZSArICJrZXlEYXRl
IElTIE5VTEwgIEFORCAgIiArIHF1YWxpZmllZFRhYmxlTmFtZSArICJrZXlOdW1iZXIgPSA/ICAi
OwotICAgIGNhc2UgSURCS2V5OjpEYXRlVHlwZToKLSAgICAgICAgcmV0dXJuIHF1YWxpZmllZFRh
YmxlTmFtZSArICJrZXlTdHJpbmcgSVMgTlVMTCAgQU5EICAiICsgcXVhbGlmaWVkVGFibGVOYW1l
ICsgImtleURhdGUgPSA/ICBBTkQgICIgKyBxdWFsaWZpZWRUYWJsZU5hbWUgKyAia2V5TnVtYmVy
IElTIE5VTEwgICI7Ci0gICAgY2FzZSBJREJLZXk6Ok51bGxUeXBlOgotICAgICAgICByZXR1cm4g
cXVhbGlmaWVkVGFibGVOYW1lICsgImtleVN0cmluZyBJUyBOVUxMICBBTkQgICIgKyBxdWFsaWZp
ZWRUYWJsZU5hbWUgKyAia2V5RGF0ZSBJUyBOVUxMICBBTkQgICIgKyBxdWFsaWZpZWRUYWJsZU5h
bWUgKyAia2V5TnVtYmVyIElTIE5VTEwgICI7Ci0gICAgfQotCi0gICAgQVNTRVJUX05PVF9SRUFD
SEVEKCk7Ci0gICAgcmV0dXJuICIiOwotfQotCi0vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRl
bXMgYm91bmQuCi1zdGF0aWMgaW50IGJpbmRLZXlUb1F1ZXJ5KFNRTGl0ZVN0YXRlbWVudCYgcXVl
cnksIGludCBjb2x1bW4sIGNvbnN0IElEQktleSYga2V5KQotewotICAgIHN3aXRjaCAoa2V5LnR5
cGUoKSkgewotICAgIGNhc2UgSURCS2V5OjpTdHJpbmdUeXBlOgotICAgICAgICBxdWVyeS5iaW5k
VGV4dChjb2x1bW4sIGtleS5zdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiAxOwotICAgIGNhc2Ug
SURCS2V5OjpEYXRlVHlwZToKLSAgICAgICAgcXVlcnkuYmluZERvdWJsZShjb2x1bW4sIGtleS5k
YXRlKCkpOwotICAgICAgICByZXR1cm4gMTsKLSAgICBjYXNlIElEQktleTo6TnVtYmVyVHlwZToK
LSAgICAgICAgcXVlcnkuYmluZERvdWJsZShjb2x1bW4sIGtleS5udW1iZXIoKSk7Ci0gICAgICAg
IHJldHVybiAxOwotICAgIGNhc2UgSURCS2V5OjpOdWxsVHlwZToKLSAgICAgICAgcmV0dXJuIDA7
Ci0gICAgfQotCi0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0K
LXN0YXRpYyBTdHJpbmcgbG93ZXJDdXJzb3JXaGVyZUZyYWdtZW50KGNvbnN0IElEQktleSYga2V5
LCBTdHJpbmcgY29tcGFyaXNvbk9wZXJhdG9yLCBTdHJpbmcgcXVhbGlmaWVkVGFibGVOYW1lID0g
IiIpCi17Ci0gICAgc3dpdGNoIChrZXkudHlwZSgpKSB7Ci0gICAgY2FzZSBJREJLZXk6OlN0cmlu
Z1R5cGU6Ci0gICAgICAgIHJldHVybiAiPyAiICsgY29tcGFyaXNvbk9wZXJhdG9yICsgIiAiICsg
cXVhbGlmaWVkVGFibGVOYW1lICsgImtleVN0cmluZyAgQU5EICAiOwotICAgIGNhc2UgSURCS2V5
OjpEYXRlVHlwZToKLSAgICAgICAgcmV0dXJuICIoPyAiICsgY29tcGFyaXNvbk9wZXJhdG9yICsg
IiAiICsgcXVhbGlmaWVkVGFibGVOYW1lICsgImtleURhdGUgIE9SIE5PVCAiICsgcXVhbGlmaWVk
VGFibGVOYW1lICsgImtleVN0cmluZyBJUyBOVUxMKSAgQU5EICAiOwotICAgIGNhc2UgSURCS2V5
OjpOdW1iZXJUeXBlOgotICAgICAgICByZXR1cm4gIig/ICIgKyBjb21wYXJpc29uT3BlcmF0b3Ig
KyAiICIgKyBxdWFsaWZpZWRUYWJsZU5hbWUgKyAia2V5TnVtYmVyICBPUiAgTk9UICIgKyBxdWFs
aWZpZWRUYWJsZU5hbWUgKyAia2V5U3RyaW5nIElTIE5VTEwgIE9SICBOT1QgIiArIHF1YWxpZmll
ZFRhYmxlTmFtZSArICJrZXlEYXRlIElTIE5VTEwpICBBTkQgICI7Ci0gICAgY2FzZSBJREJLZXk6
Ok51bGxUeXBlOgotICAgICAgICBpZiAoY29tcGFyaXNvbk9wZXJhdG9yID09ICI8IikKLSAgICAg
ICAgICAgIHJldHVybiAiTk9UKCIgKyBxdWFsaWZpZWRUYWJsZU5hbWUgKyAia2V5U3RyaW5nIElT
IE5VTEwgIEFORCAgIiArIHF1YWxpZmllZFRhYmxlTmFtZSArICJrZXlEYXRlIElTIE5VTEwgIEFO
RCAgIiArIHF1YWxpZmllZFRhYmxlTmFtZSArICJrZXlOdW1iZXIgSVMgTlVMTCkgIEFORCAgIjsK
LSAgICAgICAgcmV0dXJuICIiOyAvLyBJZiBpdCdzID0sIHRoZSB1cHBlciBib3VuZCBoYWxmIHdp
bGwgZG8gdGhlIGNvbnN0cmFpbmluZy4gSWYgaXQncyA8PSwgdGhlbiB0aGF0J3MgYSBuby1vcC4K
LSAgICB9Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgcmV0dXJuICIiOwotfQotCi1z
dGF0aWMgU3RyaW5nIHVwcGVyQ3Vyc29yV2hlcmVGcmFnbWVudChjb25zdCBJREJLZXkmIGtleSwg
U3RyaW5nIGNvbXBhcmlzb25PcGVyYXRvciwgU3RyaW5nIHF1YWxpZmllZFRhYmxlTmFtZSA9ICIi
KQotewotICAgIHN3aXRjaCAoa2V5LnR5cGUoKSkgewotICAgIGNhc2UgSURCS2V5OjpTdHJpbmdU
eXBlOgotICAgICAgICByZXR1cm4gIigiICsgcXVhbGlmaWVkVGFibGVOYW1lICsgImtleVN0cmlu
ZyAiICsgY29tcGFyaXNvbk9wZXJhdG9yICsgIiA/ICBPUiAgIiArIHF1YWxpZmllZFRhYmxlTmFt
ZSArICJrZXlTdHJpbmcgSVMgTlVMTCkgIEFORCAgIjsKLSAgICBjYXNlIElEQktleTo6RGF0ZVR5
cGU6Ci0gICAgICAgIHJldHVybiAiKCIgKyBxdWFsaWZpZWRUYWJsZU5hbWUgKyAia2V5RGF0ZSAi
ICsgY29tcGFyaXNvbk9wZXJhdG9yICsgIiA/IE9SICIgKyBxdWFsaWZpZWRUYWJsZU5hbWUgKyAi
a2V5RGF0ZSBJUyBOVUxMKSAgQU5EICAiICsgcXVhbGlmaWVkVGFibGVOYW1lICsgImtleVN0cmlu
ZyBJUyBOVUxMICBBTkQgICI7Ci0gICAgY2FzZSBJREJLZXk6Ok51bWJlclR5cGU6Ci0gICAgICAg
IHJldHVybiAiKCIgKyBxdWFsaWZpZWRUYWJsZU5hbWUgKyAia2V5TnVtYmVyICIgKyBjb21wYXJp
c29uT3BlcmF0b3IgKyAiID8gT1IgIiArIHF1YWxpZmllZFRhYmxlTmFtZSArICJrZXlOdW1iZXIg
SVMgTlVMTCkgIEFORCAgIiArIHF1YWxpZmllZFRhYmxlTmFtZSArICJrZXlTdHJpbmcgSVMgTlVM
TCAgQU5EICAiICsgcXVhbGlmaWVkVGFibGVOYW1lICsgImtleURhdGUgSVMgTlVMTCAgQU5EICAi
OwotICAgIGNhc2UgSURCS2V5OjpOdWxsVHlwZToKLSAgICAgICAgaWYgKGNvbXBhcmlzb25PcGVy
YXRvciA9PSAiPCIpCi0gICAgICAgICAgICByZXR1cm4gIjAgIT0gMCAgQU5EICAiOwotICAgICAg
ICByZXR1cm4gcXVhbGlmaWVkVGFibGVOYW1lICsgImtleVN0cmluZyBJUyBOVUxMICBBTkQgICIg
KyBxdWFsaWZpZWRUYWJsZU5hbWUgKyAia2V5RGF0ZSBJUyBOVUxMICBBTkQgICIgKyBxdWFsaWZp
ZWRUYWJsZU5hbWUgKyAia2V5TnVtYmVyIElTIE5VTEwgIEFORCAgIjsKLSAgICB9Ci0gICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgcmV0dXJuICIiOwotfQotCi1TdHJpbmcgSURCQmFja2lu
Z1N0b3JlOjpnZXRPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0
IElEQktleSYga2V5KQotewotICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVyeShtX2RiLCAiU0VMRUNU
IGtleVN0cmluZywga2V5RGF0ZSwga2V5TnVtYmVyLCB2YWx1ZSBGUk9NIE9iamVjdFN0b3JlRGF0
YSBXSEVSRSBvYmplY3RTdG9yZUlkID0gPyBBTkQgIiArIHdoZXJlU3ludGF4Rm9yS2V5KGtleSkp
OwotICAgIGJvb2wgb2sgPSBxdWVyeS5wcmVwYXJlKCkgPT0gU1FMUmVzdWx0T2s7Ci0gICAgQVNT
RVJUX1VOVVNFRChvaywgb2spOyAvLyBGSVhNRTogQmV0dGVyIGVycm9yIGhhbmRsaW5nPwotCi0g
ICAgcXVlcnkuYmluZEludDY0KDEsIG9iamVjdFN0b3JlSWQpOwotICAgIGJpbmRLZXlUb1F1ZXJ5
KHF1ZXJ5LCAyLCBrZXkpOwotICAgIGlmIChxdWVyeS5zdGVwKCkgIT0gU1FMUmVzdWx0Um93KQot
ICAgICAgICByZXR1cm4gU3RyaW5nKCk7IC8vIE51bGwgU3RyaW5nIG1lYW5zIHJlY29yZCBub3Qg
Zm91bmQuCi0KLSAgICBBU1NFUlQoKGtleS50eXBlKCkgPT0gSURCS2V5OjpTdHJpbmdUeXBlKSAh
PSBxdWVyeS5pc0NvbHVtbk51bGwoMCkpOwotICAgIEFTU0VSVCgoa2V5LnR5cGUoKSA9PSBJREJL
ZXk6OkRhdGVUeXBlKSAhPSBxdWVyeS5pc0NvbHVtbk51bGwoMSkpOwotICAgIEFTU0VSVCgoa2V5
LnR5cGUoKSA9PSBJREJLZXk6Ok51bWJlclR5cGUpICE9IHF1ZXJ5LmlzQ29sdW1uTnVsbCgyKSk7
Ci0KLSAgICBTdHJpbmcgcmVjb3JkID0gcXVlcnkuZ2V0Q29sdW1uQmxvYkFzU3RyaW5nKDMpOwot
ICAgIEFTU0VSVChxdWVyeS5zdGVwKCkgIT0gU1FMUmVzdWx0Um93KTsKLQotICAgIHJldHVybiBy
ZWNvcmQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGJpbmRLZXlUb1F1ZXJ5V2l0aE51bGxzKFNRTGl0ZVN0
YXRlbWVudCYgcXVlcnksIGludCBiYXNlQ29sdW1uLCBjb25zdCBJREJLZXkmIGtleSkKLXsKLSAg
ICBzd2l0Y2ggKGtleS50eXBlKCkpIHsKLSAgICBjYXNlIElEQktleTo6U3RyaW5nVHlwZToKLSAg
ICAgICAgcXVlcnkuYmluZFRleHQoYmFzZUNvbHVtbiArIDAsIGtleS5zdHJpbmcoKSk7Ci0gICAg
ICAgIHF1ZXJ5LmJpbmROdWxsKGJhc2VDb2x1bW4gKyAxKTsKLSAgICAgICAgcXVlcnkuYmluZE51
bGwoYmFzZUNvbHVtbiArIDIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIElEQktleTo6RGF0
ZVR5cGU6Ci0gICAgICAgIHF1ZXJ5LmJpbmROdWxsKGJhc2VDb2x1bW4gKyAwKTsKLSAgICAgICAg
cXVlcnkuYmluZERvdWJsZShiYXNlQ29sdW1uICsgMSwga2V5LmRhdGUoKSk7Ci0gICAgICAgIHF1
ZXJ5LmJpbmROdWxsKGJhc2VDb2x1bW4gKyAyKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJ
REJLZXk6Ok51bWJlclR5cGU6Ci0gICAgICAgIHF1ZXJ5LmJpbmROdWxsKGJhc2VDb2x1bW4gKyAw
KTsKLSAgICAgICAgcXVlcnkuYmluZE51bGwoYmFzZUNvbHVtbiArIDEpOwotICAgICAgICBxdWVy
eS5iaW5kRG91YmxlKGJhc2VDb2x1bW4gKyAyLCBrZXkubnVtYmVyKCkpOwotICAgICAgICBicmVh
azsKLSAgICBjYXNlIElEQktleTo6TnVsbFR5cGU6Ci0gICAgICAgIHF1ZXJ5LmJpbmROdWxsKGJh
c2VDb2x1bW4gKyAwKTsKLSAgICAgICAgcXVlcnkuYmluZE51bGwoYmFzZUNvbHVtbiArIDEpOwot
ICAgICAgICBxdWVyeS5iaW5kTnVsbChiYXNlQ29sdW1uICsgMik7Ci0gICAgICAgIGJyZWFrOwot
ICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIH0KLX0KLQot
Ym9vbCBJREJCYWNraW5nU3RvcmU6OnB1dE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3Qgb2JqZWN0
U3RvcmVJZCwgY29uc3QgSURCS2V5JiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUsIGludDY0X3Qm
IHJvd0lkLCBib29sIGludmFsaWRSb3dJZCkKLXsKLSAgICBTdHJpbmcgc3FsID0gIWludmFsaWRS
b3dJZCA/ICJVUERBVEUgT2JqZWN0U3RvcmVEYXRhIFNFVCBrZXlTdHJpbmcgPSA/LCBrZXlEYXRl
ID0gPywga2V5TnVtYmVyID0gPywgdmFsdWUgPSA/IFdIRVJFIGlkID0gPyIKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICA6ICJJTlNFUlQgSU5UTyBPYmplY3RTdG9yZURhdGEgKGtleVN0
cmluZywga2V5RGF0ZSwga2V5TnVtYmVyLCB2YWx1ZSwgb2JqZWN0U3RvcmVJZCkgVkFMVUVTICg/
LCA/LCA/LCA/LCA/KSI7Ci0gICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGIsIHNxbCk7Ci0g
ICAgaWYgKHF1ZXJ5LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotCi0gICAgYmluZEtleVRvUXVlcnlXaXRoTnVsbHMocXVlcnksIDEsIGtleSk7Ci0gICAg
cXVlcnkuYmluZEJsb2IoNCwgdmFsdWUpOwotICAgIGlmICghaW52YWxpZFJvd0lkKQotICAgICAg
ICBxdWVyeS5iaW5kSW50NjQoNSwgcm93SWQpOwotICAgIGVsc2UKLSAgICAgICAgcXVlcnkuYmlu
ZEludDY0KDUsIG9iamVjdFN0b3JlSWQpOwotCi0gICAgaWYgKHF1ZXJ5LnN0ZXAoKSAhPSBTUUxS
ZXN1bHREb25lKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoaW52YWxpZFJvd0lk
KQotICAgICAgICByb3dJZCA9IG1fZGIubGFzdEluc2VydFJvd0lEKCk7Ci0KLSAgICByZXR1cm4g
dHJ1ZTsKLX0KLQotdm9pZCBJREJCYWNraW5nU3RvcmU6OmNsZWFyT2JqZWN0U3RvcmUoaW50NjRf
dCBvYmplY3RTdG9yZUlkKQotewotICAgIGRvRGVsZXRlKG1fZGIsICJERUxFVEUgRlJPTSBJbmRl
eERhdGEgV0hFUkUgb2JqZWN0U3RvcmVEYXRhSWQgSU4gKFNFTEVDVCBpZCBGUk9NIE9iamVjdFN0
b3JlRGF0YSBXSEVSRSBvYmplY3RTdG9yZUlkID0gPykiLCBvYmplY3RTdG9yZUlkKTsKLSAgICBk
b0RlbGV0ZShtX2RiLCAiREVMRVRFIEZST00gT2JqZWN0U3RvcmVEYXRhIFdIRVJFIG9iamVjdFN0
b3JlSWQgPSA/Iiwgb2JqZWN0U3RvcmVJZCk7Ci19Ci0KLXZvaWQgSURCQmFja2luZ1N0b3JlOjpk
ZWxldGVPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90LCBpbnQ2NF90IG9iamVjdFN0b3JlRGF0YUlk
KQotewotICAgIFNRTGl0ZVN0YXRlbWVudCBvc1F1ZXJ5KG1fZGIsICJERUxFVEUgRlJPTSBPYmpl
Y3RTdG9yZURhdGEgV0hFUkUgaWQgPSA/Iik7Ci0gICAgYm9vbCBvayA9IG9zUXVlcnkucHJlcGFy
ZSgpID09IFNRTFJlc3VsdE9rOwotICAgIEFTU0VSVF9VTlVTRUQob2ssIG9rKTsgLy8gRklYTUU6
IEJldHRlciBlcnJvciBoYW5kbGluZz8KLQotICAgIG9zUXVlcnkuYmluZEludDY0KDEsIG9iamVj
dFN0b3JlRGF0YUlkKTsKLQotICAgIG9rID0gb3NRdWVyeS5zdGVwKCkgPT0gU1FMUmVzdWx0RG9u
ZTsKLSAgICBBU1NFUlRfVU5VU0VEKG9rLCBvayk7Ci0KLSAgICBTUUxpdGVTdGF0ZW1lbnQgaW5k
ZXhRdWVyeShtX2RiLCAiREVMRVRFIEZST00gSW5kZXhEYXRhIFdIRVJFIG9iamVjdFN0b3JlRGF0
YUlkID0gPyIpOwotICAgIG9rID0gaW5kZXhRdWVyeS5wcmVwYXJlKCkgPT0gU1FMUmVzdWx0T2s7
Ci0gICAgQVNTRVJUX1VOVVNFRChvaywgb2spOyAvLyBGSVhNRTogQmV0dGVyIGVycm9yIGhhbmRs
aW5nPwotCi0gICAgaW5kZXhRdWVyeS5iaW5kSW50NjQoMSwgb2JqZWN0U3RvcmVEYXRhSWQpOwot
Ci0gICAgb2sgPSBpbmRleFF1ZXJ5LnN0ZXAoKSA9PSBTUUxSZXN1bHREb25lOwotICAgIEFTU0VS
VF9VTlVTRUQob2ssIG9rKTsKLX0KLQotZG91YmxlIElEQkJhY2tpbmdTdG9yZTo6bmV4dEF1dG9J
bmNyZW1lbnROdW1iZXIoaW50NjRfdCBvYmplY3RTdG9yZUlkKQotewotICAgIFNRTGl0ZVN0YXRl
bWVudCBxdWVyeShtX2RiLCAiU0VMRUNUIG1heChrZXlOdW1iZXIpICsgMSBGUk9NIE9iamVjdFN0
b3JlRGF0YSBXSEVSRSBvYmplY3RTdG9yZUlkID0gPyBBTkQga2V5U3RyaW5nIElTIE5VTEwgQU5E
IGtleURhdGUgSVMgTlVMTCIpOwotICAgIGJvb2wgb2sgPSBxdWVyeS5wcmVwYXJlKCkgPT0gU1FM
UmVzdWx0T2s7Ci0gICAgQVNTRVJUX1VOVVNFRChvaywgb2spOwotCi0gICAgcXVlcnkuYmluZElu
dDY0KDEsIG9iamVjdFN0b3JlSWQpOwotCi0gICAgaWYgKHF1ZXJ5LnN0ZXAoKSAhPSBTUUxSZXN1
bHRSb3cgfHwgcXVlcnkuaXNDb2x1bW5OdWxsKDApKQotICAgICAgICByZXR1cm4gMTsKLQotICAg
IHJldHVybiBxdWVyeS5nZXRDb2x1bW5Eb3VibGUoMCk7Ci19Ci0KLWJvb2wgSURCQmFja2luZ1N0
b3JlOjprZXlFeGlzdHNJbk9iamVjdFN0b3JlKGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3Qg
SURCS2V5JiBrZXksIGludDY0X3QmIGZvdW5kT2JqZWN0U3RvcmVEYXRhSWQpCi17Ci0gICAgU3Ry
aW5nIHNxbCA9IFN0cmluZygiU0VMRUNUIGlkIEZST00gT2JqZWN0U3RvcmVEYXRhIFdIRVJFIG9i
amVjdFN0b3JlSWQgPSA/IEFORCAiKSArIHdoZXJlU3ludGF4Rm9yS2V5KGtleSk7Ci0gICAgU1FM
aXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGIsIHNxbCk7Ci0gICAgYm9vbCBvayA9IHF1ZXJ5LnByZXBh
cmUoKSA9PSBTUUxSZXN1bHRPazsKLSAgICBBU1NFUlRfVU5VU0VEKG9rLCBvayk7IC8vIEZJWE1F
OiBCZXR0ZXIgZXJyb3IgaGFuZGxpbmc/Ci0KLSAgICBxdWVyeS5iaW5kSW50NjQoMSwgb2JqZWN0
U3RvcmVJZCk7Ci0gICAgYmluZEtleVRvUXVlcnkocXVlcnksIDIsIGtleSk7Ci0KLSAgICBpZiAo
cXVlcnkuc3RlcCgpICE9IFNRTFJlc3VsdFJvdykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0g
ICAgZm91bmRPYmplY3RTdG9yZURhdGFJZCA9IHF1ZXJ5LmdldENvbHVtbkludDY0KDApOwotICAg
IHJldHVybiB0cnVlOwotfQotCi1ib29sIElEQkJhY2tpbmdTdG9yZTo6Zm9yRWFjaE9iamVjdFN0
b3JlUmVjb3JkKGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgT2JqZWN0U3RvcmVSZWNvcmRDYWxsYmFj
ayYgY2FsbGJhY2spCi17Ci0gICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGIsICJTRUxFQ1Qg
aWQsIHZhbHVlIEZST00gT2JqZWN0U3RvcmVEYXRhIFdIRVJFIG9iamVjdFN0b3JlSWQgPSA/Iik7
Ci0gICAgaWYgKHF1ZXJ5LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotCi0gICAgcXVlcnkuYmluZEludDY0KDEsIG9iamVjdFN0b3JlSWQpOwotCi0gICAg
d2hpbGUgKHF1ZXJ5LnN0ZXAoKSA9PSBTUUxSZXN1bHRSb3cpIHsKLSAgICAgICAgaW50NjRfdCBv
YmplY3RTdG9yZURhdGFJZCA9IHF1ZXJ5LmdldENvbHVtbkludDY0KDApOwotICAgICAgICBTdHJp
bmcgdmFsdWUgPSBxdWVyeS5nZXRDb2x1bW5CbG9iQXNTdHJpbmcoMSk7Ci0gICAgICAgIGlmICgh
Y2FsbGJhY2suY2FsbGJhY2sob2JqZWN0U3RvcmVEYXRhSWQsIHZhbHVlKSkKLSAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBJREJC
YWNraW5nU3RvcmU6OmdldEluZGV4ZXMoaW50NjRfdCBvYmplY3RTdG9yZUlkLCBWZWN0b3I8aW50
NjRfdD4mIGZvdW5kSWRzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmROYW1lcywgVmVjdG9yPFN0cmlu
Zz4mIGZvdW5kS2V5UGF0aHMsIFZlY3Rvcjxib29sPiYgZm91bmRVbmlxdWVGbGFncykKLXsKLSAg
ICBTUUxpdGVTdGF0ZW1lbnQgcXVlcnkobV9kYiwgIlNFTEVDVCBpZCwgbmFtZSwga2V5UGF0aCwg
aXNVbmlxdWUgRlJPTSBJbmRleGVzIFdIRVJFIG9iamVjdFN0b3JlSWQgPSA/Iik7Ci0gICAgYm9v
bCBvayA9IHF1ZXJ5LnByZXBhcmUoKSA9PSBTUUxSZXN1bHRPazsKLSAgICBBU1NFUlRfVU5VU0VE
KG9rLCBvayk7IC8vIEZJWE1FOiBCZXR0ZXIgZXJyb3IgaGFuZGxpbmc/Ci0KLSAgICBBU1NFUlQo
Zm91bmRJZHMuaXNFbXB0eSgpKTsKLSAgICBBU1NFUlQoZm91bmROYW1lcy5pc0VtcHR5KCkpOwot
ICAgIEFTU0VSVChmb3VuZEtleVBhdGhzLmlzRW1wdHkoKSk7Ci0gICAgQVNTRVJUKGZvdW5kVW5p
cXVlRmxhZ3MuaXNFbXB0eSgpKTsKLQotICAgIHF1ZXJ5LmJpbmRJbnQ2NCgxLCBvYmplY3RTdG9y
ZUlkKTsKLQotICAgIHdoaWxlIChxdWVyeS5zdGVwKCkgPT0gU1FMUmVzdWx0Um93KSB7Ci0gICAg
ICAgIGZvdW5kSWRzLmFwcGVuZChxdWVyeS5nZXRDb2x1bW5JbnQ2NCgwKSk7Ci0gICAgICAgIGZv
dW5kTmFtZXMuYXBwZW5kKHF1ZXJ5LmdldENvbHVtblRleHQoMSkpOwotICAgICAgICBmb3VuZEtl
eVBhdGhzLmFwcGVuZChxdWVyeS5nZXRDb2x1bW5UZXh0KDIpKTsKLSAgICAgICAgZm91bmRVbmlx
dWVGbGFncy5hcHBlbmQoISFxdWVyeS5nZXRDb2x1bW5JbnQoMykpOwotICAgIH0KLX0KLQotYm9v
bCBJREJCYWNraW5nU3RvcmU6OmNyZWF0ZUluZGV4KGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29u
c3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgaXNVbmlxdWUsIGlu
dDY0X3QmIGluZGV4SWQpCi17Ci0gICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGIsICJJTlNF
UlQgSU5UTyBJbmRleGVzIChvYmplY3RTdG9yZUlkLCBuYW1lLCBrZXlQYXRoLCBpc1VuaXF1ZSkg
VkFMVUVTICg/LCA/LCA/LCA/KSIpOwotICAgIGlmIChxdWVyeS5wcmVwYXJlKCkgIT0gU1FMUmVz
dWx0T2spCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHF1ZXJ5LmJpbmRJbnQ2NCgxLCBv
YmplY3RTdG9yZUlkKTsKLSAgICBxdWVyeS5iaW5kVGV4dCgyLCBuYW1lKTsKLSAgICBxdWVyeS5i
aW5kVGV4dCgzLCBrZXlQYXRoKTsKLSAgICBxdWVyeS5iaW5kSW50KDQsIHN0YXRpY19jYXN0PGlu
dD4oaXNVbmlxdWUpKTsKLQotICAgIGlmIChxdWVyeS5zdGVwKCkgIT0gU1FMUmVzdWx0RG9uZSkK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaW5kZXhJZCA9IG1fZGIubGFzdEluc2VydFJv
d0lEKCk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgSURCQmFja2luZ1N0b3JlOjpkZWxl
dGVJbmRleChpbnQ2NF90IGluZGV4SWQpCi17Ci0gICAgZG9EZWxldGUobV9kYiwgIkRFTEVURSBG
Uk9NIEluZGV4ZXMgV0hFUkUgaWQgPSA/IiwgaW5kZXhJZCk7Ci0gICAgZG9EZWxldGUobV9kYiwg
IkRFTEVURSBGUk9NIEluZGV4RGF0YSBXSEVSRSBpbmRleElkID0gPyIsIGluZGV4SWQpOwotfQot
Ci1ib29sIElEQkJhY2tpbmdTdG9yZTo6cHV0SW5kZXhEYXRhRm9yUmVjb3JkKGludDY0X3QgaW5k
ZXhJZCwgY29uc3QgSURCS2V5JiBrZXksIGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQpCi17Ci0g
ICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGIsICJJTlNFUlQgSU5UTyBJbmRleERhdGEgKGtl
eVN0cmluZywga2V5RGF0ZSwga2V5TnVtYmVyLCBpbmRleElkLCBvYmplY3RTdG9yZURhdGFJZCkg
VkFMVUVTICg/LCA/LCA/LCA/LCA/KSIpOwotICAgIGlmIChxdWVyeS5wcmVwYXJlKCkgIT0gU1FM
UmVzdWx0T2spCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGJpbmRLZXlUb1F1ZXJ5V2l0
aE51bGxzKHF1ZXJ5LCAxLCBrZXkpOwotICAgIHF1ZXJ5LmJpbmRJbnQ2NCg0LCBpbmRleElkKTsK
LSAgICBxdWVyeS5iaW5kSW50NjQoNSwgb2JqZWN0U3RvcmVEYXRhSWQpOwotCi0gICAgcmV0dXJu
IHF1ZXJ5LnN0ZXAoKSA9PSBTUUxSZXN1bHREb25lOwotfQotCi1ib29sIElEQkJhY2tpbmdTdG9y
ZTo6ZGVsZXRlSW5kZXhEYXRhRm9yUmVjb3JkKGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQpCi17
Ci0gICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGIsICJERUxFVEUgRlJPTSBJbmRleERhdGEg
V0hFUkUgb2JqZWN0U3RvcmVEYXRhSWQgPSA/Iik7Ci0gICAgaWYgKHF1ZXJ5LnByZXBhcmUoKSAh
PSBTUUxSZXN1bHRPaykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgcXVlcnkuYmluZElu
dDY0KDEsIG9iamVjdFN0b3JlRGF0YUlkKTsKLSAgICByZXR1cm4gcXVlcnkuc3RlcCgpID09IFNR
TFJlc3VsdERvbmU7Ci19Ci0KLVN0cmluZyBJREJCYWNraW5nU3RvcmU6OmdldE9iamVjdFZpYUlu
ZGV4KGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JiBrZXkpCi17Ci0gICAgU3RyaW5nIHNx
bCA9IFN0cmluZygiU0VMRUNUICIpCi0gICAgICAgICAgICAgICAgICsgIk9iamVjdFN0b3JlRGF0
YS52YWx1ZSAiCi0gICAgICAgICAgICAgICAgICsgIkZST00gSW5kZXhEYXRhIElOTkVSIEpPSU4g
T2JqZWN0U3RvcmVEYXRhIE9OIEluZGV4RGF0YS5vYmplY3RTdG9yZURhdGFJZCA9IE9iamVjdFN0
b3JlRGF0YS5pZCAiCi0gICAgICAgICAgICAgICAgICsgIldIRVJFIEluZGV4RGF0YS5pbmRleElk
ID0gPyAgQU5EICAiICsgd2hlcmVTeW50YXhGb3JLZXkoa2V5LCAiSW5kZXhEYXRhLiIpCi0gICAg
ICAgICAgICAgICAgICsgIk9SREVSIEJZIEluZGV4RGF0YS5pZCBMSU1JVCAxIjsgLy8gT3JkZXIg
YnkgaW5zZXJ0aW9uIG9yZGVyIHdoZW4gYWxsIGVsc2UgZmFpbHMuCi0gICAgU1FMaXRlU3RhdGVt
ZW50IHF1ZXJ5KG1fZGIsIHNxbCk7Ci0gICAgYm9vbCBvayA9IHF1ZXJ5LnByZXBhcmUoKSA9PSBT
UUxSZXN1bHRPazsKLSAgICBBU1NFUlRfVU5VU0VEKG9rLCBvayk7IC8vIEZJWE1FOiBCZXR0ZXIg
ZXJyb3IgaGFuZGxpbmc/Ci0KLSAgICBxdWVyeS5iaW5kSW50NjQoMSwgaW5kZXhJZCk7Ci0gICAg
YmluZEtleVRvUXVlcnkocXVlcnksIDIsIGtleSk7Ci0KLSAgICBpZiAocXVlcnkuc3RlcCgpICE9
IFNRTFJlc3VsdFJvdykKLSAgICAgICAgcmV0dXJuIFN0cmluZygpOwotCi0gICAgU3RyaW5nIGZv
dW5kVmFsdWUgPSBxdWVyeS5nZXRDb2x1bW5CbG9iQXNTdHJpbmcoMCk7Ci0gICAgQVNTRVJUKHF1
ZXJ5LnN0ZXAoKSAhPSBTUUxSZXN1bHRSb3cpOwotICAgIHJldHVybiBmb3VuZFZhbHVlOwotfQot
Ci1zdGF0aWMgUGFzc1JlZlB0cjxJREJLZXk+IGtleUZyb21RdWVyeShTUUxpdGVTdGF0ZW1lbnQm
IHF1ZXJ5LCBpbnQgYmFzZUNvbHVtbikKLXsKLSAgICBpZiAocXVlcnkuY29sdW1uQ291bnQoKSA8
PSBiYXNlQ29sdW1uKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmICghcXVlcnkuaXNDb2x1
bW5OdWxsKGJhc2VDb2x1bW4pKQotICAgICAgICByZXR1cm4gSURCS2V5OjpjcmVhdGVTdHJpbmco
cXVlcnkuZ2V0Q29sdW1uVGV4dChiYXNlQ29sdW1uKSk7Ci0KLSAgICBpZiAoIXF1ZXJ5LmlzQ29s
dW1uTnVsbChiYXNlQ29sdW1uICsgMSkpCi0gICAgICAgIHJldHVybiBJREJLZXk6OmNyZWF0ZURh
dGUocXVlcnkuZ2V0Q29sdW1uRG91YmxlKGJhc2VDb2x1bW4gKyAxKSk7Ci0KLSAgICBpZiAoIXF1
ZXJ5LmlzQ29sdW1uTnVsbChiYXNlQ29sdW1uICsgMikpCi0gICAgICAgIHJldHVybiBJREJLZXk6
OmNyZWF0ZU51bWJlcihxdWVyeS5nZXRDb2x1bW5Eb3VibGUoYmFzZUNvbHVtbiArIDIpKTsKLQot
ICAgIHJldHVybiBJREJLZXk6OmNyZWF0ZU51bGwoKTsKLX0KLQotUGFzc1JlZlB0cjxJREJLZXk+
IElEQkJhY2tpbmdTdG9yZTo6Z2V0UHJpbWFyeUtleVZpYUluZGV4KGludDY0X3QgaW5kZXhJZCwg
Y29uc3QgSURCS2V5JiBrZXkpCi17Ci0gICAgU3RyaW5nIHNxbCA9IFN0cmluZygiU0VMRUNUICIp
Ci0gICAgICAgICAgICAgICAgICsgIk9iamVjdFN0b3JlRGF0YS5rZXlTdHJpbmcsIE9iamVjdFN0
b3JlRGF0YS5rZXlEYXRlLCBPYmplY3RTdG9yZURhdGEua2V5TnVtYmVyICIKLSAgICAgICAgICAg
ICAgICAgKyAiRlJPTSBJbmRleERhdGEgSU5ORVIgSk9JTiBPYmplY3RTdG9yZURhdGEgT04gSW5k
ZXhEYXRhLm9iamVjdFN0b3JlRGF0YUlkID0gT2JqZWN0U3RvcmVEYXRhLmlkICIKLSAgICAgICAg
ICAgICAgICAgKyAiV0hFUkUgSW5kZXhEYXRhLmluZGV4SWQgPSA/ICBBTkQgICIgKyB3aGVyZVN5
bnRheEZvcktleShrZXksICJJbmRleERhdGEuIikKLSAgICAgICAgICAgICAgICAgKyAiT1JERVIg
QlkgSW5kZXhEYXRhLmlkIExJTUlUIDEiOyAvLyBPcmRlciBieSBpbnNlcnRpb24gb3JkZXIgd2hl
biBhbGwgZWxzZSBmYWlscy4KLSAgICBTUUxpdGVTdGF0ZW1lbnQgcXVlcnkobV9kYiwgc3FsKTsK
LSAgICBib29sIG9rID0gcXVlcnkucHJlcGFyZSgpID09IFNRTFJlc3VsdE9rOwotICAgIEFTU0VS
VF9VTlVTRUQob2ssIG9rKTsgLy8gRklYTUU6IEJldHRlciBlcnJvciBoYW5kbGluZz8KLQotICAg
IHF1ZXJ5LmJpbmRJbnQ2NCgxLCBpbmRleElkKTsKLSAgICBiaW5kS2V5VG9RdWVyeShxdWVyeSwg
Miwga2V5KTsKLQotICAgIGlmIChxdWVyeS5zdGVwKCkgIT0gU1FMUmVzdWx0Um93KQotICAgICAg
ICByZXR1cm4gMDsKLQotICAgIFJlZlB0cjxJREJLZXk+IGZvdW5kS2V5ID0ga2V5RnJvbVF1ZXJ5
KHF1ZXJ5LCAwKTsKLSAgICBBU1NFUlQocXVlcnkuc3RlcCgpICE9IFNRTFJlc3VsdFJvdyk7Ci0g
ICAgcmV0dXJuIGZvdW5kS2V5LnJlbGVhc2UoKTsKLX0KLQotYm9vbCBJREJCYWNraW5nU3RvcmU6
OmtleUV4aXN0c0luSW5kZXgoaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmIGtleSkKLXsK
LSAgICBTdHJpbmcgc3FsID0gU3RyaW5nKCJTRUxFQ1QgaWQgRlJPTSBJbmRleERhdGEgV0hFUkUg
aW5kZXhJZCA9ID8gQU5EICIpICsgd2hlcmVTeW50YXhGb3JLZXkoa2V5KTsKLSAgICBTUUxpdGVT
dGF0ZW1lbnQgcXVlcnkobV9kYiwgc3FsKTsKLSAgICBib29sIG9rID0gcXVlcnkucHJlcGFyZSgp
ID09IFNRTFJlc3VsdE9rOwotICAgIEFTU0VSVF9VTlVTRUQob2ssIG9rKTsgLy8gRklYTUU6IEJl
dHRlciBlcnJvciBoYW5kbGluZz8KLQotICAgIHF1ZXJ5LmJpbmRJbnQ2NCgxLCBpbmRleElkKTsK
LSAgICBiaW5kS2V5VG9RdWVyeShxdWVyeSwgMiwga2V5KTsKLQotICAgIHJldHVybiBxdWVyeS5z
dGVwKCkgPT0gU1FMUmVzdWx0Um93OwotfQotCi1uYW1lc3BhY2UgewotCi1jbGFzcyBDdXJzb3JJ
bXBsQ29tbW9uIDogcHVibGljIElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yIHsKLXB1YmxpYzoKLSAg
ICBDdXJzb3JJbXBsQ29tbW9uKFNRTGl0ZURhdGFiYXNlJiBzcWxpdGVEYXRhYmFzZSwgU3RyaW5n
IHF1ZXJ5LCBib29sIHVuaXF1ZW5lc3NDb25zdHJhaW50LCBib29sIGl0ZXJhdGVGb3J3YXJkKQot
ICAgICAgICA6IG1fcXVlcnkoc3FsaXRlRGF0YWJhc2UsIHF1ZXJ5KQotICAgICAgICAsIG1fZGIo
c3FsaXRlRGF0YWJhc2UpCi0gICAgICAgICwgbV91bmlxdWVuZXNzQ29uc3RyYWludCh1bmlxdWVu
ZXNzQ29uc3RyYWludCkKLSAgICAgICAgLCBtX2l0ZXJhdGVGb3J3YXJkKGl0ZXJhdGVGb3J3YXJk
KQotICAgIHsKLSAgICB9Ci0gICAgdmlydHVhbCB+Q3Vyc29ySW1wbENvbW1vbigpIHt9Ci0KLSAg
ICAvLyBJREJCYWNraW5nU3RvcmU6OkN1cnNvcgotICAgIHZpcnR1YWwgYm9vbCBjb250aW51ZUZ1
bmN0aW9uKGNvbnN0IElEQktleSopOwotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJLZXk+IGtl
eSgpIHsgcmV0dXJuIG1fY3VycmVudEtleTsgfQotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJL
ZXk+IHByaW1hcnlLZXkoKSB7IHJldHVybiBtX2N1cnJlbnRLZXk7IH0KLSAgICB2aXJ0dWFsIFN0
cmluZyB2YWx1ZSgpID0gMDsKLSAgICB2aXJ0dWFsIGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQo
KSA9IDA7Ci0gICAgdmlydHVhbCBpbnQ2NF90IGluZGV4RGF0YUlkKCkgPSAwOwotCi0gICAgdmly
dHVhbCB2b2lkIGxvYWRDdXJyZW50Um93KCkgPSAwOwotICAgIHZpcnR1YWwgYm9vbCBjdXJyZW50
Um93RXhpc3RzKCkgPSAwOwotCi0gICAgU1FMaXRlU3RhdGVtZW50IG1fcXVlcnk7Ci0KLXByb3Rl
Y3RlZDoKLSAgICBTUUxpdGVEYXRhYmFzZSYgbV9kYjsKLSAgICBib29sIG1fdW5pcXVlbmVzc0Nv
bnN0cmFpbnQ7Ci0gICAgYm9vbCBtX2l0ZXJhdGVGb3J3YXJkOwotICAgIGludDY0X3QgbV9jdXJy
ZW50SWQ7Ci0gICAgUmVmUHRyPElEQktleT4gbV9jdXJyZW50S2V5OwotfTsKLQotYm9vbCBDdXJz
b3JJbXBsQ29tbW9uOjpjb250aW51ZUZ1bmN0aW9uKGNvbnN0IElEQktleSoga2V5KQotewotICAg
IHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIGlmIChtX3F1ZXJ5LnN0ZXAoKSAhPSBTUUxSZXN1bHRS
b3cpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgUmVmUHRyPElEQktleT4g
b2xkS2V5ID0gbV9jdXJyZW50S2V5OwotICAgICAgICBsb2FkQ3VycmVudFJvdygpOwotCi0gICAg
ICAgIC8vIFNraXAgaWYgdGhpcyBlbnRyeSBoYXMgYmVlbiBkZWxldGVkIGZyb20gdGhlIG9iamVj
dCBzdG9yZS4KLSAgICAgICAgaWYgKCFjdXJyZW50Um93RXhpc3RzKCkpCi0gICAgICAgICAgICBj
b250aW51ZTsKLQotICAgICAgICAvLyBJZiBhIGtleSB3YXMgc3VwcGxpZWQsIHdlIG11c3QgbG9v
cCB1bnRpbCB3ZSBmaW5kIGEga2V5IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBpdCAob3IgaGl0
IHRoZSBlbmQpLgotICAgICAgICBpZiAoa2V5KSB7Ci0gICAgICAgICAgICBpZiAobV9pdGVyYXRl
Rm9yd2FyZCkgewotICAgICAgICAgICAgICAgIGlmIChtX2N1cnJlbnRLZXktPmlzTGVzc1RoYW4o
a2V5KSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9IGVsc2Ug
ewotICAgICAgICAgICAgICAgIGlmIChrZXktPmlzTGVzc1RoYW4obV9jdXJyZW50S2V5LmdldCgp
KSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
IH0KLQotICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgdW5pcXVlbmVzcyBjb25zdHJhaW50
LCB3ZSBjYW4gc3RvcCBub3cuCi0gICAgICAgIGlmICghbV91bmlxdWVuZXNzQ29uc3RyYWludCkK
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAoIW1fY3VycmVudEtleS0+aXNFcXVhbChv
bGRLZXkuZ2V0KCkpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRy
dWU7Ci19Ci0KLWNsYXNzIE9iamVjdFN0b3JlQ3Vyc29ySW1wbCA6IHB1YmxpYyBDdXJzb3JJbXBs
Q29tbW9uIHsKLXB1YmxpYzoKLSAgICBPYmplY3RTdG9yZUN1cnNvckltcGwoU1FMaXRlRGF0YWJh
c2UmIHNxbGl0ZURhdGFiYXNlLCBTdHJpbmcgcXVlcnksIGJvb2wgdW5pcXVlbmVzc0NvbnN0cmFp
bnQsIGJvb2wgaXRlcmF0ZUZvcndhcmQpCi0gICAgICAgIDogQ3Vyc29ySW1wbENvbW1vbihzcWxp
dGVEYXRhYmFzZSwgcXVlcnksIHVuaXF1ZW5lc3NDb25zdHJhaW50LCBpdGVyYXRlRm9yd2FyZCkK
LSAgICB7Ci0gICAgfQotCi0gICAgLy8gQ3Vyc29ySW1wbENvbW1vbi4KLSAgICB2aXJ0dWFsIFN0
cmluZyB2YWx1ZSgpIHsgcmV0dXJuIG1fY3VycmVudFZhbHVlOyB9Ci0gICAgdmlydHVhbCBpbnQ2
NF90IG9iamVjdFN0b3JlRGF0YUlkKCkgeyByZXR1cm4gbV9jdXJyZW50SWQ7IH0KLSAgICB2aXJ0
dWFsIGludDY0X3QgaW5kZXhEYXRhSWQoKSB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4g
MDsgfQotICAgIHZpcnR1YWwgdm9pZCBsb2FkQ3VycmVudFJvdygpOwotICAgIHZpcnR1YWwgYm9v
bCBjdXJyZW50Um93RXhpc3RzKCk7Ci0KLXByaXZhdGU6Ci0gICAgU3RyaW5nIG1fY3VycmVudFZh
bHVlOwotfTsKLQotdm9pZCBPYmplY3RTdG9yZUN1cnNvckltcGw6OmxvYWRDdXJyZW50Um93KCkK
LXsKLSAgICBtX2N1cnJlbnRJZCA9IG1fcXVlcnkuZ2V0Q29sdW1uSW50NjQoMCk7Ci0gICAgbV9j
dXJyZW50S2V5ID0ga2V5RnJvbVF1ZXJ5KG1fcXVlcnksIDEpOwotICAgIG1fY3VycmVudFZhbHVl
ID0gbV9xdWVyeS5nZXRDb2x1bW5CbG9iQXNTdHJpbmcoNCk7Ci19Ci0KLWJvb2wgT2JqZWN0U3Rv
cmVDdXJzb3JJbXBsOjpjdXJyZW50Um93RXhpc3RzKCkKLXsKLSAgICBTdHJpbmcgc3FsID0gIlNF
TEVDVCBpZCBGUk9NIE9iamVjdFN0b3JlRGF0YSBXSEVSRSBpZCA9ID8iOwotICAgIFNRTGl0ZVN0
YXRlbWVudCBzdGF0ZW1lbnQobV9kYiwgc3FsKTsKLQotICAgIGJvb2wgb2sgPSBzdGF0ZW1lbnQu
cHJlcGFyZSgpID09IFNRTFJlc3VsdE9rOwotICAgIEFTU0VSVF9VTlVTRUQob2ssIG9rKTsKLQot
ICAgIHN0YXRlbWVudC5iaW5kSW50NjQoMSwgbV9jdXJyZW50SWQpOwotICAgIHJldHVybiBzdGF0
ZW1lbnQuc3RlcCgpID09IFNRTFJlc3VsdFJvdzsKLX0KLQotY2xhc3MgSW5kZXhLZXlDdXJzb3JJ
bXBsIDogcHVibGljIEN1cnNvckltcGxDb21tb24gewotcHVibGljOgotICAgIEluZGV4S2V5Q3Vy
c29ySW1wbChTUUxpdGVEYXRhYmFzZSYgc3FsaXRlRGF0YWJhc2UsIFN0cmluZyBxdWVyeSwgYm9v
bCB1bmlxdWVuZXNzQ29uc3RyYWludCwgYm9vbCBpdGVyYXRlRm9yd2FyZCkKLSAgICAgICAgOiBD
dXJzb3JJbXBsQ29tbW9uKHNxbGl0ZURhdGFiYXNlLCBxdWVyeSwgdW5pcXVlbmVzc0NvbnN0cmFp
bnQsIGl0ZXJhdGVGb3J3YXJkKQotICAgIHsKLSAgICB9Ci0KLSAgICAvLyBDdXJzb3JJbXBsQ29t
bW9uCi0gICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQktleT4gcHJpbWFyeUtleSgpIHsgcmV0dXJu
IG1fY3VycmVudFByaW1hcnlLZXk7IH0KLSAgICB2aXJ0dWFsIFN0cmluZyB2YWx1ZSgpIHsgQVNT
RVJUX05PVF9SRUFDSEVEKCk7IHJldHVybiBTdHJpbmcoKTsgfQotICAgIHZpcnR1YWwgaW50NjRf
dCBvYmplY3RTdG9yZURhdGFJZCgpIHsgQVNTRVJUX05PVF9SRUFDSEVEKCk7IHJldHVybiAwOyB9
Ci0gICAgdmlydHVhbCBpbnQ2NF90IGluZGV4RGF0YUlkKCkgeyByZXR1cm4gbV9jdXJyZW50SWQ7
IH0KLSAgICB2aXJ0dWFsIHZvaWQgbG9hZEN1cnJlbnRSb3coKTsKLSAgICB2aXJ0dWFsIGJvb2wg
Y3VycmVudFJvd0V4aXN0cygpOwotCi1wcml2YXRlOgotICAgIFJlZlB0cjxJREJLZXk+IG1fY3Vy
cmVudFByaW1hcnlLZXk7Ci19OwotCi12b2lkIEluZGV4S2V5Q3Vyc29ySW1wbDo6bG9hZEN1cnJl
bnRSb3coKQotewotICAgIG1fY3VycmVudElkID0gbV9xdWVyeS5nZXRDb2x1bW5JbnQ2NCgwKTsK
LSAgICBtX2N1cnJlbnRLZXkgPSBrZXlGcm9tUXVlcnkobV9xdWVyeSwgMSk7Ci0gICAgbV9jdXJy
ZW50UHJpbWFyeUtleSA9IGtleUZyb21RdWVyeShtX3F1ZXJ5LCA0KTsKLX0KLQotYm9vbCBJbmRl
eEtleUN1cnNvckltcGw6OmN1cnJlbnRSb3dFeGlzdHMoKQotewotICAgIFN0cmluZyBzcWwgPSAi
U0VMRUNUIGlkIEZST00gSW5kZXhEYXRhIFdIRVJFIGlkID0gPyI7Ci0gICAgU1FMaXRlU3RhdGVt
ZW50IHN0YXRlbWVudChtX2RiLCBzcWwpOwotCi0gICAgYm9vbCBvayA9IHN0YXRlbWVudC5wcmVw
YXJlKCkgPT0gU1FMUmVzdWx0T2s7Ci0gICAgQVNTRVJUX1VOVVNFRChvaywgb2spOwotCi0gICAg
c3RhdGVtZW50LmJpbmRJbnQ2NCgxLCBtX2N1cnJlbnRJZCk7Ci0gICAgcmV0dXJuIHN0YXRlbWVu
dC5zdGVwKCkgPT0gU1FMUmVzdWx0Um93OwotfQotCi1jbGFzcyBJbmRleEN1cnNvckltcGwgOiBw
dWJsaWMgQ3Vyc29ySW1wbENvbW1vbiB7Ci1wdWJsaWM6Ci0gICAgSW5kZXhDdXJzb3JJbXBsKFNR
TGl0ZURhdGFiYXNlJiBzcWxpdGVEYXRhYmFzZSwgU3RyaW5nIHF1ZXJ5LCBib29sIHVuaXF1ZW5l
c3NDb25zdHJhaW50LCBib29sIGl0ZXJhdGVGb3J3YXJkKQotICAgICAgICA6IEN1cnNvckltcGxD
b21tb24oc3FsaXRlRGF0YWJhc2UsIHF1ZXJ5LCB1bmlxdWVuZXNzQ29uc3RyYWludCwgaXRlcmF0
ZUZvcndhcmQpCi0gICAgewotICAgIH0KLQotICAgIC8vIEN1cnNvckltcGxDb21tb24KLSAgICB2
aXJ0dWFsIFBhc3NSZWZQdHI8SURCS2V5PiBwcmltYXJ5S2V5KCkgeyByZXR1cm4gbV9jdXJyZW50
UHJpbWFyeUtleTsgfQotICAgIHZpcnR1YWwgU3RyaW5nIHZhbHVlKCkgeyByZXR1cm4gbV9jdXJy
ZW50VmFsdWU7IH0KLSAgICB2aXJ0dWFsIGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQoKSB7IEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4gMDsgfQotICAgIHZpcnR1YWwgaW50NjRfdCBpbmRl
eERhdGFJZCgpIHsgcmV0dXJuIG1fY3VycmVudElkOyB9Ci0gICAgdmlydHVhbCB2b2lkIGxvYWRD
dXJyZW50Um93KCk7Ci0gICAgdmlydHVhbCBib29sIGN1cnJlbnRSb3dFeGlzdHMoKTsKLQotcHJp
dmF0ZToKLSAgICBSZWZQdHI8SURCS2V5PiBtX2N1cnJlbnRQcmltYXJ5S2V5OwotICAgIFN0cmlu
ZyBtX2N1cnJlbnRWYWx1ZTsKLX07Ci0KLXZvaWQgSW5kZXhDdXJzb3JJbXBsOjpsb2FkQ3VycmVu
dFJvdygpCi17Ci0gICAgbV9jdXJyZW50SWQgPSBtX3F1ZXJ5LmdldENvbHVtbkludDY0KDApOwot
ICAgIG1fY3VycmVudEtleSA9IGtleUZyb21RdWVyeShtX3F1ZXJ5LCAxKTsKLSAgICBtX2N1cnJl
bnRWYWx1ZSA9IG1fcXVlcnkuZ2V0Q29sdW1uQmxvYkFzU3RyaW5nKDQpOwotICAgIG1fY3VycmVu
dFByaW1hcnlLZXkgPSBrZXlGcm9tUXVlcnkobV9xdWVyeSwgNSk7Ci19Ci0KLWJvb2wgSW5kZXhD
dXJzb3JJbXBsOjpjdXJyZW50Um93RXhpc3RzKCkKLXsKLSAgICBTdHJpbmcgc3FsID0gIlNFTEVD
VCBpZCBGUk9NIEluZGV4RGF0YSBXSEVSRSBpZCA9ID8iOwotICAgIFNRTGl0ZVN0YXRlbWVudCBz
dGF0ZW1lbnQobV9kYiwgc3FsKTsKLQotICAgIGJvb2wgb2sgPSBzdGF0ZW1lbnQucHJlcGFyZSgp
ID09IFNRTFJlc3VsdE9rOwotICAgIEFTU0VSVF9VTlVTRUQob2ssIG9rKTsKLQotICAgIHN0YXRl
bWVudC5iaW5kSW50NjQoMSwgbV9jdXJyZW50SWQpOwotICAgIHJldHVybiBzdGF0ZW1lbnQuc3Rl
cCgpID09IFNRTFJlc3VsdFJvdzsKLX0KLQotfSAvLyBuYW1lc3BhY2UKLQotUGFzc1JlZlB0cjxJ
REJCYWNraW5nU3RvcmU6OkN1cnNvcj4gSURCQmFja2luZ1N0b3JlOjpvcGVuT2JqZWN0U3RvcmVD
dXJzb3IoaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXlSYW5nZSogcmFuZ2UsIElE
QkN1cnNvcjo6RGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLSAgICBib29sIGxvd2VyQm91bmQgPSBy
YW5nZSAmJiByYW5nZS0+bG93ZXIoKTsKLSAgICBib29sIHVwcGVyQm91bmQgPSByYW5nZSAmJiBy
YW5nZS0+dXBwZXIoKTsKLQotICAgIFN0cmluZyBzcWwgPSAiU0VMRUNUIGlkLCBrZXlTdHJpbmcs
IGtleURhdGUsIGtleU51bWJlciwgdmFsdWUgRlJPTSBPYmplY3RTdG9yZURhdGEgV0hFUkUgIjsK
LSAgICBpZiAobG93ZXJCb3VuZCkKLSAgICAgICAgc3FsICs9IGxvd2VyQ3Vyc29yV2hlcmVGcmFn
bWVudCgqcmFuZ2UtPmxvd2VyKCksIHJhbmdlLT5sb3dlck9wZW4oKSA/ICI8IiA6ICI8PSIpOwot
ICAgIGlmICh1cHBlckJvdW5kKQotICAgICAgICBzcWwgKz0gdXBwZXJDdXJzb3JXaGVyZUZyYWdt
ZW50KCpyYW5nZS0+dXBwZXIoKSwgcmFuZ2UtPnVwcGVyT3BlbigpID8gIjwiIDogIjw9Iik7Ci0g
ICAgc3FsICs9ICJvYmplY3RTdG9yZUlkID0gPyBPUkRFUiBCWSAiOwotCi0gICAgaWYgKGRpcmVj
dGlvbiA9PSBJREJDdXJzb3I6Ok5FWFQgfHwgZGlyZWN0aW9uID09IElEQkN1cnNvcjo6TkVYVF9O
T19EVVBMSUNBVEUpCi0gICAgICAgIHNxbCArPSAia2V5U3RyaW5nLCBrZXlEYXRlLCBrZXlOdW1i
ZXIiOwotICAgIGVsc2UKLSAgICAgICAgc3FsICs9ICJrZXlTdHJpbmcgREVTQywga2V5RGF0ZSBE
RVNDLCBrZXlOdW1iZXIgREVTQyI7Ci0KLSAgICBSZWZQdHI8T2JqZWN0U3RvcmVDdXJzb3JJbXBs
PiBjdXJzb3IgPSBhZG9wdFJlZihuZXcgT2JqZWN0U3RvcmVDdXJzb3JJbXBsKG1fZGIsIHNxbCwg
ZGlyZWN0aW9uID09IElEQkN1cnNvcjo6TkVYVF9OT19EVVBMSUNBVEUgfHwgZGlyZWN0aW9uID09
IElEQkN1cnNvcjo6UFJFVl9OT19EVVBMSUNBVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJl
Y3Rpb24gPT0gSURCQ3Vyc29yOjpORVhUX05PX0RVUExJQ0FURSB8fCBkaXJlY3Rpb24gPT0gSURC
Q3Vyc29yOjpORVhUKSk7Ci0KLSAgICBib29sIG9rID0gY3Vyc29yLT5tX3F1ZXJ5LnByZXBhcmUo
KSA9PSBTUUxSZXN1bHRPazsKLSAgICBBU1NFUlRfVU5VU0VEKG9rLCBvayk7IC8vIEZJWE1FOiBC
ZXR0ZXIgZXJyb3IgaGFuZGxpbmc/Ci0KLSAgICBpbnQgY3VycmVudENvbHVtbiA9IDE7Ci0gICAg
aWYgKGxvd2VyQm91bmQpCi0gICAgICAgIGN1cnJlbnRDb2x1bW4gKz0gYmluZEtleVRvUXVlcnko
Y3Vyc29yLT5tX3F1ZXJ5LCBjdXJyZW50Q29sdW1uLCAqcmFuZ2UtPmxvd2VyKCkpOwotICAgIGlm
ICh1cHBlckJvdW5kKQotICAgICAgICBjdXJyZW50Q29sdW1uICs9IGJpbmRLZXlUb1F1ZXJ5KGN1
cnNvci0+bV9xdWVyeSwgY3VycmVudENvbHVtbiwgKnJhbmdlLT51cHBlcigpKTsKLSAgICBjdXJz
b3ItPm1fcXVlcnkuYmluZEludDY0KGN1cnJlbnRDb2x1bW4sIG9iamVjdFN0b3JlSWQpOwotCi0g
ICAgaWYgKGN1cnNvci0+bV9xdWVyeS5zdGVwKCkgIT0gU1FMUmVzdWx0Um93KQotICAgICAgICBy
ZXR1cm4gMDsKLQotICAgIGN1cnNvci0+bG9hZEN1cnJlbnRSb3coKTsKLSAgICByZXR1cm4gY3Vy
c29yLnJlbGVhc2UoKTsKLX0KLQotUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4g
SURCQmFja2luZ1N0b3JlOjpvcGVuSW5kZXhLZXlDdXJzb3IoaW50NjRfdCBpbmRleElkLCBjb25z
dCBJREJLZXlSYW5nZSogcmFuZ2UsIElEQkN1cnNvcjo6RGlyZWN0aW9uIGRpcmVjdGlvbikKLXsK
LSAgICBTdHJpbmcgc3FsID0gU3RyaW5nKCJTRUxFQ1QgSW5kZXhEYXRhLmlkLCBJbmRleERhdGEu
a2V5U3RyaW5nLCBJbmRleERhdGEua2V5RGF0ZSwgSW5kZXhEYXRhLmtleU51bWJlciwgIikKLSAg
ICAgICAgICAgICAgICAgKyAoIk9iamVjdFN0b3JlRGF0YS5rZXlTdHJpbmcsIE9iamVjdFN0b3Jl
RGF0YS5rZXlEYXRlLCBPYmplY3RTdG9yZURhdGEua2V5TnVtYmVyICIpCi0gICAgICAgICAgICAg
ICAgICsgIkZST00gSW5kZXhEYXRhIElOTkVSIEpPSU4gT2JqZWN0U3RvcmVEYXRhIE9OIEluZGV4
RGF0YS5vYmplY3RTdG9yZURhdGFJZCA9IE9iamVjdFN0b3JlRGF0YS5pZCBXSEVSRSAiOwotCi0g
ICAgYm9vbCBsb3dlckJvdW5kID0gcmFuZ2UgJiYgcmFuZ2UtPmxvd2VyKCk7Ci0gICAgYm9vbCB1
cHBlckJvdW5kID0gcmFuZ2UgJiYgcmFuZ2UtPnVwcGVyKCk7Ci0KLSAgICBpZiAobG93ZXJCb3Vu
ZCkKLSAgICAgICAgc3FsICs9IGxvd2VyQ3Vyc29yV2hlcmVGcmFnbWVudCgqcmFuZ2UtPmxvd2Vy
KCksIHJhbmdlLT5sb3dlck9wZW4oKSA/ICI8IiA6ICI8PSIsICJJbmRleERhdGEuIik7Ci0gICAg
aWYgKHVwcGVyQm91bmQpCi0gICAgICAgIHNxbCArPSB1cHBlckN1cnNvcldoZXJlRnJhZ21lbnQo
KnJhbmdlLT51cHBlcigpLCByYW5nZS0+dXBwZXJPcGVuKCkgPyAiPCIgOiAiPD0iLCAiSW5kZXhE
YXRhLiIpOwotICAgIHNxbCArPSAiSW5kZXhEYXRhLmluZGV4SWQgPSA/IE9SREVSIEJZICI7Ci0K
LSAgICBpZiAoZGlyZWN0aW9uID09IElEQkN1cnNvcjo6TkVYVCB8fCBkaXJlY3Rpb24gPT0gSURC
Q3Vyc29yOjpORVhUX05PX0RVUExJQ0FURSkKLSAgICAgICAgc3FsICs9ICJJbmRleERhdGEua2V5
U3RyaW5nLCBJbmRleERhdGEua2V5RGF0ZSwgSW5kZXhEYXRhLmtleU51bWJlciwgSW5kZXhEYXRh
LmlkIjsKLSAgICBlbHNlCi0gICAgICAgIHNxbCArPSAiSW5kZXhEYXRhLmtleVN0cmluZyBERVND
LCBJbmRleERhdGEua2V5RGF0ZSBERVNDLCBJbmRleERhdGEua2V5TnVtYmVyIERFU0MsIEluZGV4
RGF0YS5pZCBERVNDIjsKLQotICAgIFJlZlB0cjxJbmRleEtleUN1cnNvckltcGw+IGN1cnNvciA9
IGFkb3B0UmVmKG5ldyBJbmRleEtleUN1cnNvckltcGwobV9kYiwgc3FsLCBkaXJlY3Rpb24gPT0g
SURCQ3Vyc29yOjpORVhUX05PX0RVUExJQ0FURSB8fCBkaXJlY3Rpb24gPT0gSURCQ3Vyc29yOjpQ
UkVWX05PX0RVUExJQ0FURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6
Ok5FWFRfTk9fRFVQTElDQVRFIHx8IGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFQpKTsKLQot
ICAgIGJvb2wgb2sgPSBjdXJzb3ItPm1fcXVlcnkucHJlcGFyZSgpID09IFNRTFJlc3VsdE9rOwot
ICAgIEFTU0VSVF9VTlVTRUQob2ssIG9rKTsgLy8gRklYTUU6IEJldHRlciBlcnJvciBoYW5kbGlu
Zz8KLQotICAgIGludCBpbmRleENvbHVtbiA9IDE7Ci0gICAgaWYgKGxvd2VyQm91bmQpCi0gICAg
ICAgIGluZGV4Q29sdW1uICs9IGJpbmRLZXlUb1F1ZXJ5KGN1cnNvci0+bV9xdWVyeSwgaW5kZXhD
b2x1bW4sICpyYW5nZS0+bG93ZXIoKSk7Ci0gICAgaWYgKHVwcGVyQm91bmQpCi0gICAgICAgIGlu
ZGV4Q29sdW1uICs9IGJpbmRLZXlUb1F1ZXJ5KGN1cnNvci0+bV9xdWVyeSwgaW5kZXhDb2x1bW4s
ICpyYW5nZS0+dXBwZXIoKSk7Ci0gICAgY3Vyc29yLT5tX3F1ZXJ5LmJpbmRJbnQ2NChpbmRleENv
bHVtbiwgaW5kZXhJZCk7Ci0KLSAgICBpZiAoY3Vyc29yLT5tX3F1ZXJ5LnN0ZXAoKSAhPSBTUUxS
ZXN1bHRSb3cpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgY3Vyc29yLT5sb2FkQ3VycmVudFJv
dygpOwotICAgIHJldHVybiBjdXJzb3IucmVsZWFzZSgpOwotfQotCi1QYXNzUmVmUHRyPElEQkJh
Y2tpbmdTdG9yZTo6Q3Vyc29yPiBJREJCYWNraW5nU3RvcmU6Om9wZW5JbmRleEN1cnNvcihpbnQ2
NF90IGluZGV4SWQsIGNvbnN0IElEQktleVJhbmdlKiByYW5nZSwgSURCQ3Vyc29yOjpEaXJlY3Rp
b24gZGlyZWN0aW9uKQotewotICAgIFN0cmluZyBzcWwgPSBTdHJpbmcoIlNFTEVDVCBJbmRleERh
dGEuaWQsIEluZGV4RGF0YS5rZXlTdHJpbmcsIEluZGV4RGF0YS5rZXlEYXRlLCBJbmRleERhdGEu
a2V5TnVtYmVyLCAiKQotICAgICAgICAgICAgICAgICArICgiT2JqZWN0U3RvcmVEYXRhLnZhbHVl
LCBPYmplY3RTdG9yZURhdGEua2V5U3RyaW5nLCBPYmplY3RTdG9yZURhdGEua2V5RGF0ZSwgT2Jq
ZWN0U3RvcmVEYXRhLmtleU51bWJlciAiKQotICAgICAgICAgICAgICAgICArICJGUk9NIEluZGV4
RGF0YSBJTk5FUiBKT0lOIE9iamVjdFN0b3JlRGF0YSBPTiBJbmRleERhdGEub2JqZWN0U3RvcmVE
YXRhSWQgPSBPYmplY3RTdG9yZURhdGEuaWQgV0hFUkUgIjsKLQotICAgIGJvb2wgbG93ZXJCb3Vu
ZCA9IHJhbmdlICYmIHJhbmdlLT5sb3dlcigpOwotICAgIGJvb2wgdXBwZXJCb3VuZCA9IHJhbmdl
ICYmIHJhbmdlLT51cHBlcigpOwotCi0gICAgaWYgKGxvd2VyQm91bmQpCi0gICAgICAgIHNxbCAr
PSBsb3dlckN1cnNvcldoZXJlRnJhZ21lbnQoKnJhbmdlLT5sb3dlcigpLCByYW5nZS0+bG93ZXJP
cGVuKCkgPyAiPCIgOiAiPD0iLCAiSW5kZXhEYXRhLiIpOwotICAgIGlmICh1cHBlckJvdW5kKQot
ICAgICAgICBzcWwgKz0gdXBwZXJDdXJzb3JXaGVyZUZyYWdtZW50KCpyYW5nZS0+dXBwZXIoKSwg
cmFuZ2UtPnVwcGVyT3BlbigpID8gIjwiIDogIjw9IiwgIkluZGV4RGF0YS4iKTsKLSAgICBzcWwg
Kz0gIkluZGV4RGF0YS5pbmRleElkID0gPyBPUkRFUiBCWSAiOwotCi0gICAgaWYgKGRpcmVjdGlv
biA9PSBJREJDdXJzb3I6Ok5FWFQgfHwgZGlyZWN0aW9uID09IElEQkN1cnNvcjo6TkVYVF9OT19E
VVBMSUNBVEUpCi0gICAgICAgIHNxbCArPSAiSW5kZXhEYXRhLmtleVN0cmluZywgSW5kZXhEYXRh
LmtleURhdGUsIEluZGV4RGF0YS5rZXlOdW1iZXIsIEluZGV4RGF0YS5pZCI7Ci0gICAgZWxzZQot
ICAgICAgICBzcWwgKz0gIkluZGV4RGF0YS5rZXlTdHJpbmcgREVTQywgSW5kZXhEYXRhLmtleURh
dGUgREVTQywgSW5kZXhEYXRhLmtleU51bWJlciBERVNDLCBJbmRleERhdGEuaWQgREVTQyI7Ci0K
LSAgICBSZWZQdHI8SW5kZXhDdXJzb3JJbXBsPiBjdXJzb3IgPSBhZG9wdFJlZihuZXcgSW5kZXhD
dXJzb3JJbXBsKG1fZGIsIHNxbCwgZGlyZWN0aW9uID09IElEQkN1cnNvcjo6TkVYVF9OT19EVVBM
SUNBVEUgfHwgZGlyZWN0aW9uID09IElEQkN1cnNvcjo6UFJFVl9OT19EVVBMSUNBVEUsCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBkaXJlY3Rpb24gPT0gSURCQ3Vyc29yOjpORVhUX05PX0RVUExJQ0FURSB8fCBkaXJlY3Rp
b24gPT0gSURCQ3Vyc29yOjpORVhUKSk7Ci0KLSAgICBib29sIG9rID0gY3Vyc29yLT5tX3F1ZXJ5
LnByZXBhcmUoKSA9PSBTUUxSZXN1bHRPazsKLSAgICBBU1NFUlRfVU5VU0VEKG9rLCBvayk7IC8v
IEZJWE1FOiBCZXR0ZXIgZXJyb3IgaGFuZGxpbmc/Ci0KLSAgICBpbnQgaW5kZXhDb2x1bW4gPSAx
OwotICAgIGlmIChsb3dlckJvdW5kKQotICAgICAgICBpbmRleENvbHVtbiArPSBiaW5kS2V5VG9R
dWVyeShjdXJzb3ItPm1fcXVlcnksIGluZGV4Q29sdW1uLCAqcmFuZ2UtPmxvd2VyKCkpOwotICAg
IGlmICh1cHBlckJvdW5kKQotICAgICAgICBpbmRleENvbHVtbiArPSBiaW5kS2V5VG9RdWVyeShj
dXJzb3ItPm1fcXVlcnksIGluZGV4Q29sdW1uLCAqcmFuZ2UtPnVwcGVyKCkpOwotICAgIGN1cnNv
ci0+bV9xdWVyeS5iaW5kSW50NjQoaW5kZXhDb2x1bW4sIGluZGV4SWQpOwotCi0gICAgaWYgKGN1
cnNvci0+bV9xdWVyeS5zdGVwKCkgIT0gU1FMUmVzdWx0Um93KQotICAgICAgICByZXR1cm4gMDsK
LQotICAgIGN1cnNvci0+bG9hZEN1cnJlbnRSb3coKTsKLSAgICByZXR1cm4gY3Vyc29yLnJlbGVh
c2UoKTsKLX0KLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgVHJhbnNhY3Rpb25JbXBsIDogcHVibGlj
IElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24gewotcHVibGljOgotICAgIFRyYW5zYWN0aW9u
SW1wbChTUUxpdGVEYXRhYmFzZSYgZGIpCi0gICAgICAgIDogbV90cmFuc2FjdGlvbihkYikKLSAg
ICB7Ci0gICAgfQotCi0gICAgLy8gSURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbgotICAgIHZp
cnR1YWwgdm9pZCBiZWdpbigpIHsgbV90cmFuc2FjdGlvbi5iZWdpbigpOyB9Ci0gICAgdmlydHVh
bCB2b2lkIGNvbW1pdCgpIHsgbV90cmFuc2FjdGlvbi5jb21taXQoKTsgfQotICAgIHZpcnR1YWwg
dm9pZCByb2xsYmFjaygpIHsgbV90cmFuc2FjdGlvbi5yb2xsYmFjaygpOyB9Ci0KLXByaXZhdGU6
Ci0gICAgU1FMaXRlVHJhbnNhY3Rpb24gbV90cmFuc2FjdGlvbjsKLX07Ci0KLX0gLy8gbmFtZXNw
YWNlCi0KLVBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbj4gSURCQmFja2lu
Z1N0b3JlOjpjcmVhdGVUcmFuc2FjdGlvbigpCi17Ci0gICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBU
cmFuc2FjdGlvbkltcGwobV9kYikpOwotfQotCi19IC8vIG5hbWVzcGFjZSBXZWJDb3JlCi0KLSNl
bmRpZiAvLyBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL3N0b3JhZ2UvSURCQmFja2luZ1N0b3JlLmggYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lE
QkJhY2tpbmdTdG9yZS5oCmluZGV4IGU3NWZlZTEuLjI5NTIzYTIgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJDb3JlL3N0b3JhZ2UvSURCQmFja2luZ1N0b3JlLmgKKysrIGIvU291cmNlL1dlYkNvcmUv
c3RvcmFnZS9JREJCYWNraW5nU3RvcmUuaApAQCAtNDQsMzcgKzQ0LDM2IEBAIGNsYXNzIFNlY3Vy
aXR5T3JpZ2luOwogCiBjbGFzcyBJREJCYWNraW5nU3RvcmUgOiBwdWJsaWMgUmVmQ291bnRlZDxJ
REJCYWNraW5nU3RvcmU+IHsKIHB1YmxpYzoKLSAgICBzdGF0aWMgUGFzc1JlZlB0cjxJREJCYWNr
aW5nU3RvcmU+IG9wZW4oU2VjdXJpdHlPcmlnaW4qLCBjb25zdCBTdHJpbmcmIHBhdGhCYXNlLCBp
bnQ2NF90IG1heGltdW1TaXplLCBjb25zdCBTdHJpbmcmIGZpbGVJZGVudGlmaWVyLCBJREJGYWN0
b3J5QmFja2VuZEltcGwqKTsKLSAgICB+SURCQmFja2luZ1N0b3JlKCk7Ci0KLSAgICBib29sIGV4
dHJhY3RJREJEYXRhYmFzZU1ldGFEYXRhKGNvbnN0IFN0cmluZyYgbmFtZSwgU3RyaW5nJiBmb3Vu
ZFZlcnNpb24sIGludDY0X3QmIGZvdW5kSWQpOwotICAgIGJvb2wgc2V0SURCRGF0YWJhc2VNZXRh
RGF0YShjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgdmVyc2lvbiwgaW50NjRfdCYg
cm93SWQsIGJvb2wgaW52YWxpZFJvd0lkKTsKLQotICAgIHZvaWQgZ2V0T2JqZWN0U3RvcmVzKGlu
dDY0X3QgZGF0YWJhc2VJZCwgVmVjdG9yPGludDY0X3Q+JiBmb3VuZElkcywgVmVjdG9yPFN0cmlu
Zz4mIGZvdW5kTmFtZXMsIFZlY3RvcjxTdHJpbmc+JiBmb3VuZEtleVBhdGhzLCBWZWN0b3I8Ym9v
bD4mIGZvdW5kQXV0b0luY3JlbWVudEZsYWdzKTsKLSAgICBib29sIGNyZWF0ZU9iamVjdFN0b3Jl
KGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIGF1dG9JbmNy
ZW1lbnQsIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCYgYXNzaWduZWRPYmplY3RTdG9yZUlk
KTsKLSAgICB2b2lkIGRlbGV0ZU9iamVjdFN0b3JlKGludDY0X3Qgb2JqZWN0U3RvcmVJZCk7Ci0g
ICAgU3RyaW5nIGdldE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29u
c3QgSURCS2V5Jik7Ci0gICAgYm9vbCBwdXRPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IG9iamVj
dFN0b3JlSWQsIGNvbnN0IElEQktleSYsIGNvbnN0IFN0cmluZyYgdmFsdWUsIGludDY0X3QmIHJv
d0lkLCBib29sIGludmFsaWRSb3dJZCk7Ci0gICAgdm9pZCBjbGVhck9iamVjdFN0b3JlKGludDY0
X3Qgb2JqZWN0U3RvcmVJZCk7Ci0gICAgdm9pZCBkZWxldGVPYmplY3RTdG9yZVJlY29yZChpbnQ2
NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQpOwotICAgIGRvdWJs
ZSBuZXh0QXV0b0luY3JlbWVudE51bWJlcihpbnQ2NF90IG9iamVjdFN0b3JlSWQpOwotICAgIGJv
b2wga2V5RXhpc3RzSW5PYmplY3RTdG9yZShpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElE
QktleSYsIGludDY0X3QmIGZvdW5kT2JqZWN0U3RvcmVEYXRhSWQpOworICAgIHZpcnR1YWwgfklE
QkJhY2tpbmdTdG9yZSgpIHt9OworCisgICAgdmlydHVhbCBib29sIGV4dHJhY3RJREJEYXRhYmFz
ZU1ldGFEYXRhKGNvbnN0IFN0cmluZyYgbmFtZSwgU3RyaW5nJiBmb3VuZFZlcnNpb24sIGludDY0
X3QmIGZvdW5kSWQpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgc2V0SURCRGF0YWJhc2VNZXRhRGF0
YShjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgdmVyc2lvbiwgaW50NjRfdCYgcm93
SWQsIGJvb2wgaW52YWxpZFJvd0lkKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0T2JqZWN0
U3RvcmVzKGludDY0X3QgZGF0YWJhc2VJZCwgVmVjdG9yPGludDY0X3Q+JiBmb3VuZElkcywgVmVj
dG9yPFN0cmluZz4mIGZvdW5kTmFtZXMsIFZlY3RvcjxTdHJpbmc+JiBmb3VuZEtleVBhdGhzLCBW
ZWN0b3I8Ym9vbD4mIGZvdW5kQXV0b0luY3JlbWVudEZsYWdzKSA9IDA7CisgICAgdmlydHVhbCBi
b29sIGNyZWF0ZU9iamVjdFN0b3JlKGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBr
ZXlQYXRoLCBib29sIGF1dG9JbmNyZW1lbnQsIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCYg
YXNzaWduZWRPYmplY3RTdG9yZUlkKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGRlbGV0ZU9iamVj
dFN0b3JlKGludDY0X3Qgb2JqZWN0U3RvcmVJZCkgPSAwOworICAgIHZpcnR1YWwgU3RyaW5nIGdl
dE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5Jikg
PSAwOworICAgIHZpcnR1YWwgYm9vbCBwdXRPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IG9iamVj
dFN0b3JlSWQsIGNvbnN0IElEQktleSYsIGNvbnN0IFN0cmluZyYgdmFsdWUsIGludDY0X3QmIHJv
d0lkLCBib29sIGludmFsaWRSb3dJZCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBjbGVhck9iamVj
dFN0b3JlKGludDY0X3Qgb2JqZWN0U3RvcmVJZCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBkZWxl
dGVPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3Qgb2JqZWN0
U3RvcmVEYXRhSWQpID0gMDsKKyAgICB2aXJ0dWFsIGRvdWJsZSBuZXh0QXV0b0luY3JlbWVudE51
bWJlcihpbnQ2NF90IG9iamVjdFN0b3JlSWQpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wga2V5RXhp
c3RzSW5PYmplY3RTdG9yZShpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYsIGlu
dDY0X3QmIGZvdW5kT2JqZWN0U3RvcmVEYXRhSWQpID0gMDsKIAogICAgIGNsYXNzIE9iamVjdFN0
b3JlUmVjb3JkQ2FsbGJhY2sgewogICAgIHB1YmxpYzoKICAgICAgICAgIHZpcnR1YWwgYm9vbCBj
YWxsYmFjayhpbnQ2NF90IG9iamVjdFN0b3JlRGF0YUlkLCBjb25zdCBTdHJpbmcmIHZhbHVlKSA9
IDA7CiAgICAgICAgICB2aXJ0dWFsIH5PYmplY3RTdG9yZVJlY29yZENhbGxiYWNrKCkge307CiAg
ICAgfTsKLSAgICBib29sIGZvckVhY2hPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IG9iamVjdFN0
b3JlSWQsIE9iamVjdFN0b3JlUmVjb3JkQ2FsbGJhY2smKTsKKyAgICB2aXJ0dWFsIGJvb2wgZm9y
RWFjaE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgT2JqZWN0U3RvcmVS
ZWNvcmRDYWxsYmFjayYpID0gMDsKIAotICAgIHZvaWQgZ2V0SW5kZXhlcyhpbnQ2NF90IG9iamVj
dFN0b3JlSWQsIFZlY3RvcjxpbnQ2NF90PiYgZm91bmRJZHMsIFZlY3RvcjxTdHJpbmc+JiBmb3Vu
ZE5hbWVzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmRLZXlQYXRocywgVmVjdG9yPGJvb2w+JiBmb3Vu
ZFVuaXF1ZUZsYWdzKTsKLSAgICBib29sIGNyZWF0ZUluZGV4KGludDY0X3Qgb2JqZWN0U3RvcmVJ
ZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgaXNVbmlx
dWUsIGludDY0X3QmIGluZGV4SWQpOwotICAgIHZvaWQgZGVsZXRlSW5kZXgoaW50NjRfdCBpbmRl
eElkKTsKLSAgICBib29sIHB1dEluZGV4RGF0YUZvclJlY29yZChpbnQ2NF90IGluZGV4SWQsIGNv
bnN0IElEQktleSYsIGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQpOwotICAgIGJvb2wgZGVsZXRl
SW5kZXhEYXRhRm9yUmVjb3JkKGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQpOwotICAgIFN0cmlu
ZyBnZXRPYmplY3RWaWFJbmRleChpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYpOwotICAg
IFBhc3NSZWZQdHI8SURCS2V5PiBnZXRQcmltYXJ5S2V5VmlhSW5kZXgoaW50NjRfdCBpbmRleElk
LCBjb25zdCBJREJLZXkmKTsKLSAgICBib29sIGtleUV4aXN0c0luSW5kZXgoaW50NjRfdCBpbmRl
eElkLCBjb25zdCBJREJLZXkmKTsKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0SW5kZXhlcyhpbnQ2NF90
IG9iamVjdFN0b3JlSWQsIFZlY3RvcjxpbnQ2NF90PiYgZm91bmRJZHMsIFZlY3RvcjxTdHJpbmc+
JiBmb3VuZE5hbWVzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmRLZXlQYXRocywgVmVjdG9yPGJvb2w+
JiBmb3VuZFVuaXF1ZUZsYWdzKSA9IDA7CisgICAgdmlydHVhbCBib29sIGNyZWF0ZUluZGV4KGlu
dDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtl
eVBhdGgsIGJvb2wgaXNVbmlxdWUsIGludDY0X3QmIGluZGV4SWQpID0gMDsKKyAgICB2aXJ0dWFs
IHZvaWQgZGVsZXRlSW5kZXgoaW50NjRfdCBpbmRleElkKSA9IDA7CisgICAgdmlydHVhbCBib29s
IHB1dEluZGV4RGF0YUZvclJlY29yZChpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYsIGlu
dDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgZGVsZXRlSW5k
ZXhEYXRhRm9yUmVjb3JkKGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQpID0gMDsKKyAgICB2aXJ0
dWFsIFN0cmluZyBnZXRPYmplY3RWaWFJbmRleChpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktl
eSYpID0gMDsKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCS2V5PiBnZXRQcmltYXJ5S2V5Vmlh
SW5kZXgoaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmKSA9IDA7CisgICAgdmlydHVhbCBi
b29sIGtleUV4aXN0c0luSW5kZXgoaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmKSA9IDA7
CiAKICAgICBjbGFzcyBDdXJzb3IgOiBwdWJsaWMgUmVmQ291bnRlZDxDdXJzb3I+IHsKICAgICBw
dWJsaWM6CkBAIC04Nyw5ICs4Niw5IEBAIHB1YmxpYzoKICAgICAgICAgdmlydHVhbCB+Q3Vyc29y
KCkge307CiAgICAgfTsKIAotICAgIFBhc3NSZWZQdHI8Q3Vyc29yPiBvcGVuT2JqZWN0U3RvcmVD
dXJzb3IoaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXlSYW5nZSosIElEQkN1cnNv
cjo6RGlyZWN0aW9uKTsKLSAgICBQYXNzUmVmUHRyPEN1cnNvcj4gb3BlbkluZGV4S2V5Q3Vyc29y
KGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5UmFuZ2UqLCBJREJDdXJzb3I6OkRpcmVjdGlv
bik7Ci0gICAgUGFzc1JlZlB0cjxDdXJzb3I+IG9wZW5JbmRleEN1cnNvcihpbnQ2NF90IGluZGV4
SWQsIGNvbnN0IElEQktleVJhbmdlKiwgSURCQ3Vyc29yOjpEaXJlY3Rpb24pOworICAgIHZpcnR1
YWwgUGFzc1JlZlB0cjxDdXJzb3I+IG9wZW5PYmplY3RTdG9yZUN1cnNvcihpbnQ2NF90IG9iamVj
dFN0b3JlSWQsIGNvbnN0IElEQktleVJhbmdlKiwgSURCQ3Vyc29yOjpEaXJlY3Rpb24pID0gMDsK
KyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Q3Vyc29yPiBvcGVuSW5kZXhLZXlDdXJzb3IoaW50NjRf
dCBpbmRleElkLCBjb25zdCBJREJLZXlSYW5nZSosIElEQkN1cnNvcjo6RGlyZWN0aW9uKSA9IDA7
CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPEN1cnNvcj4gb3BlbkluZGV4Q3Vyc29yKGludDY0X3Qg
aW5kZXhJZCwgY29uc3QgSURCS2V5UmFuZ2UqLCBJREJDdXJzb3I6OkRpcmVjdGlvbikgPSAwOwog
CiAgICAgY2xhc3MgVHJhbnNhY3Rpb24gOiBwdWJsaWMgUmVmQ291bnRlZDxUcmFuc2FjdGlvbj4g
ewogICAgIHB1YmxpYzoKQEAgLTk3LDE0ICs5Niw3IEBAIHB1YmxpYzoKICAgICAgICAgdmlydHVh
bCB2b2lkIGNvbW1pdCgpID0gMDsKICAgICAgICAgdmlydHVhbCB2b2lkIHJvbGxiYWNrKCkgPSAw
OwogICAgIH07Ci0gICAgUGFzc1JlZlB0cjxUcmFuc2FjdGlvbj4gY3JlYXRlVHJhbnNhY3Rpb24o
KTsKLQotcHJpdmF0ZToKLSAgICBJREJCYWNraW5nU3RvcmUoU3RyaW5nIGlkZW50aWZpZXIsIElE
QkZhY3RvcnlCYWNrZW5kSW1wbCogZmFjdG9yeSk7Ci0KLSAgICBTUUxpdGVEYXRhYmFzZSBtX2Ri
OwotICAgIFN0cmluZyBtX2lkZW50aWZpZXI7Ci0gICAgUmVmUHRyPElEQkZhY3RvcnlCYWNrZW5k
SW1wbD4gbV9mYWN0b3J5OworICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxUcmFuc2FjdGlvbj4gY3Jl
YXRlVHJhbnNhY3Rpb24oKSA9IDA7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkZhY3RvcnlCYWNrZW5kSW1wbC5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkZhY3RvcnlCYWNrZW5kSW1wbC5jcHAKaW5kZXgg
NTg3YzU4Yi4uNDYxZTkzMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJG
YWN0b3J5QmFja2VuZEltcGwuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCRmFj
dG9yeUJhY2tlbmRJbXBsLmNwcApAQCAtMzAsOSArMzAsOSBAQAogI2luY2x1ZGUgIklEQkZhY3Rv
cnlCYWNrZW5kSW1wbC5oIgogCiAjaW5jbHVkZSAiRE9NU3RyaW5nTGlzdC5oIgotI2luY2x1ZGUg
IklEQkJhY2tpbmdTdG9yZS5oIgogI2luY2x1ZGUgIklEQkRhdGFiYXNlQmFja2VuZEltcGwuaCIK
ICNpbmNsdWRlICJJREJEYXRhYmFzZUV4Y2VwdGlvbi5oIgorI2luY2x1ZGUgIklEQlNRTGl0ZUJh
Y2tpbmdTdG9yZS5oIgogI2luY2x1ZGUgIklEQlRyYW5zYWN0aW9uQ29vcmRpbmF0b3IuaCIKICNp
bmNsdWRlICJTZWN1cml0eU9yaWdpbi5oIgogI2luY2x1ZGUgPHd0Zi9UaHJlYWRpbmcuaD4KQEAg
LTg2LDcgKzg2LDcgQEAgdm9pZCBJREJGYWN0b3J5QmFja2VuZEltcGw6Om9wZW4oY29uc3QgU3Ry
aW5nJiBuYW1lLCBQYXNzUmVmUHRyPElEQkNhbGxiYWNrcz4gY2EKICAgICBpZiAoaXQyICE9IG1f
YmFja2luZ1N0b3JlTWFwLmVuZCgpKQogICAgICAgICBiYWNraW5nU3RvcmUgPSBpdDItPnNlY29u
ZDsKICAgICBlbHNlIHsKLSAgICAgICAgYmFja2luZ1N0b3JlID0gSURCQmFja2luZ1N0b3JlOjpv
cGVuKHNlY3VyaXR5T3JpZ2luLmdldCgpLCBkYXRhRGlyLCBtYXhpbXVtU2l6ZSwgZmlsZUlkZW50
aWZpZXIsIHRoaXMpOworICAgICAgICBiYWNraW5nU3RvcmUgPSBJREJTUUxpdGVCYWNraW5nU3Rv
cmU6Om9wZW4oc2VjdXJpdHlPcmlnaW4uZ2V0KCksIGRhdGFEaXIsIG1heGltdW1TaXplLCBmaWxl
SWRlbnRpZmllciwgdGhpcyk7CiAgICAgICAgIGlmICghYmFja2luZ1N0b3JlKSB7CiAgICAgICAg
ICAgICBjYWxsYmFja3MtPm9uRXJyb3IoSURCRGF0YWJhc2VFcnJvcjo6Y3JlYXRlKElEQkRhdGFi
YXNlRXhjZXB0aW9uOjpVTktOT1dOX0VSUiwgIkludGVybmFsIGVycm9yLiIpKTsKICAgICAgICAg
ICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCU1FMaXRl
QmFja2luZ1N0b3JlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCU1FMaXRlQmFja2lu
Z1N0b3JlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDNiN2EzCi0t
LSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJTUUxpdGVCYWNraW5n
U3RvcmUuY3BwCkBAIC0wLDAgKzEsOTk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdv
b2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAi
QVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAq
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
I2luY2x1ZGUgIklEQlNRTGl0ZUJhY2tpbmdTdG9yZS5oIgorCisjaWYgRU5BQkxFKElOREVYRURf
REFUQUJBU0UpCisKKyNpbmNsdWRlICJGaWxlU3lzdGVtLmgiCisjaW5jbHVkZSAiSURCRmFjdG9y
eUJhY2tlbmRJbXBsLmgiCisjaW5jbHVkZSAiSURCS2V5LmgiCisjaW5jbHVkZSAiSURCS2V5UmFu
Z2UuaCIKKyNpbmNsdWRlICJTUUxpdGVEYXRhYmFzZS5oIgorI2luY2x1ZGUgIlNRTGl0ZVN0YXRl
bWVudC5oIgorI2luY2x1ZGUgIlNRTGl0ZVRyYW5zYWN0aW9uLmgiCisjaW5jbHVkZSAiU2VjdXJp
dHlPcmlnaW4uaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitJREJTUUxpdGVCYWNraW5nU3Rv
cmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZShTdHJpbmcgaWRlbnRpZmllciwgSURCRmFjdG9yeUJh
Y2tlbmRJbXBsKiBmYWN0b3J5KQorICAgIDogbV9pZGVudGlmaWVyKGlkZW50aWZpZXIpCisgICAg
LCBtX2ZhY3RvcnkoZmFjdG9yeSkKK3sKKyAgICBtX2ZhY3RvcnktPmFkZElEQkJhY2tpbmdTdG9y
ZShpZGVudGlmaWVyLCB0aGlzKTsKK30KKworSURCU1FMaXRlQmFja2luZ1N0b3JlOjp+SURCU1FM
aXRlQmFja2luZ1N0b3JlKCkKK3sKKyAgICBtX2ZhY3RvcnktPnJlbW92ZUlEQkJhY2tpbmdTdG9y
ZShtX2lkZW50aWZpZXIpOworfQorCitzdGF0aWMgYm9vbCBydW5Db21tYW5kcyhTUUxpdGVEYXRh
YmFzZSYgc3FsaXRlRGF0YWJhc2UsIGNvbnN0IGNoYXIqKiBjb21tYW5kcywgc2l6ZV90IG51bWJl
ck9mQ29tbWFuZHMpCit7CisgICAgU1FMaXRlVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24oc3FsaXRl
RGF0YWJhc2UsIGZhbHNlKTsKKyAgICB0cmFuc2FjdGlvbi5iZWdpbigpOworICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgbnVtYmVyT2ZDb21tYW5kczsgKytpKSB7CisgICAgICAgIGlmICghc3Fs
aXRlRGF0YWJhc2UuZXhlY3V0ZUNvbW1hbmQoY29tbWFuZHNbaV0pKSB7CisgICAgICAgICAgICBM
T0dfRVJST1IoIkZhaWxlZCB0byBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kIGZvciBJbmRleGVk
REI6ICVzIiwgY29tbWFuZHNbaV0pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICB9CisgICAgfQorICAgIHRyYW5zYWN0aW9uLmNvbW1pdCgpOworICAgIHJldHVybiB0cnVlOwor
fQorCitzdGF0aWMgYm9vbCBjcmVhdGVUYWJsZXMoU1FMaXRlRGF0YWJhc2UmIHNxbGl0ZURhdGFi
YXNlKQoreworICAgIGlmIChzcWxpdGVEYXRhYmFzZS50YWJsZUV4aXN0cygiRGF0YWJhc2VzIikp
CisgICAgICAgIHJldHVybiB0cnVlOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjb21tYW5kc1td
ID0geworICAgICAgICAiQ1JFQVRFIFRBQkxFIERhdGFiYXNlcyAoaWQgSU5URUdFUiBQUklNQVJZ
IEtFWSwgbmFtZSBURVhUIE5PVCBOVUxMLCBkZXNjcmlwdGlvbiBURVhUIE5PVCBOVUxMLCB2ZXJz
aW9uIFRFWFQgTk9UIE5VTEwpIiwKKyAgICAgICAgIkNSRUFURSBVTklRVUUgSU5ERVggRGF0YWJh
c2VzX25hbWUgT04gRGF0YWJhc2VzKG5hbWUpIiwKKworICAgICAgICAiQ1JFQVRFIFRBQkxFIE9i
amVjdFN0b3JlcyAoaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgbmFtZSBURVhUIE5PVCBOVUxMLCBr
ZXlQYXRoIFRFWFQsIGRvQXV0b0luY3JlbWVudCBJTlRFR0VSIE5PVCBOVUxMLCBkYXRhYmFzZUlk
IElOVEVHRVIgTk9UIE5VTEwgUkVGRVJFTkNFUyBEYXRhYmFzZXMoaWQpKSIsCisgICAgICAgICJD
UkVBVEUgVU5JUVVFIElOREVYIE9iamVjdFN0b3Jlc19jb21wb3NpdCBPTiBPYmplY3RTdG9yZXMo
ZGF0YWJhc2VJZCwgbmFtZSkiLAorCisgICAgICAgICJDUkVBVEUgVEFCTEUgSW5kZXhlcyAoaWQg
SU5URUdFUiBQUklNQVJZIEtFWSwgb2JqZWN0U3RvcmVJZCBJTlRFR0VSIE5PVCBOVUxMIFJFRkVS
RU5DRVMgT2JqZWN0U3RvcmUoaWQpLCBuYW1lIFRFWFQgTk9UIE5VTEwsIGtleVBhdGggVEVYVCwg
aXNVbmlxdWUgSU5URUdFUiBOT1QgTlVMTCkiLAorICAgICAgICAiQ1JFQVRFIFVOSVFVRSBJTkRF
WCBJbmRleGVzX2NvbXBvc2l0IE9OIEluZGV4ZXMob2JqZWN0U3RvcmVJZCwgbmFtZSkiLAorCisg
ICAgICAgICJDUkVBVEUgVEFCTEUgT2JqZWN0U3RvcmVEYXRhIChpZCBJTlRFR0VSIFBSSU1BUlkg
S0VZLCBvYmplY3RTdG9yZUlkIElOVEVHRVIgTk9UIE5VTEwgUkVGRVJFTkNFUyBPYmplY3RTdG9y
ZShpZCksIGtleVN0cmluZyBURVhULCBrZXlEYXRlIElOVEVHRVIsIGtleU51bWJlciBJTlRFR0VS
LCB2YWx1ZSBURVhUIE5PVCBOVUxMKSIsCisgICAgICAgICJDUkVBVEUgVU5JUVVFIElOREVYIE9i
amVjdFN0b3JlRGF0YV9jb21wb3NpdCBPTiBPYmplY3RTdG9yZURhdGEoa2V5U3RyaW5nLCBrZXlE
YXRlLCBrZXlOdW1iZXIsIG9iamVjdFN0b3JlSWQpIiwKKworICAgICAgICAiQ1JFQVRFIFRBQkxF
IEluZGV4RGF0YSAoaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgaW5kZXhJZCBJTlRFR0VSIE5PVCBO
VUxMIFJFRkVSRU5DRVMgSW5kZXhlcyhpZCksIGtleVN0cmluZyBURVhULCBrZXlEYXRlIElOVEVH
RVIsIGtleU51bWJlciBJTlRFR0VSLCBvYmplY3RTdG9yZURhdGFJZCBJTlRFR0VSIE5PVCBOVUxM
IFJFRkVSRU5DRVMgT2JqZWN0U3RvcmVEYXRhKGlkKSkiLAorICAgICAgICAiQ1JFQVRFIElOREVY
IEluZGV4RGF0YV9jb21wb3NpdCBPTiBJbmRleERhdGEoa2V5U3RyaW5nLCBrZXlEYXRlLCBrZXlO
dW1iZXIsIGluZGV4SWQpIiwKKyAgICAgICAgIkNSRUFURSBJTkRFWCBJbmRleERhdGFfb2JqZWN0
U3RvcmVEYXRhSWQgT04gSW5kZXhEYXRhKG9iamVjdFN0b3JlRGF0YUlkKSIsCisgICAgICAgICJD
UkVBVEUgSU5ERVggSW5kZXhEYXRhX2luZGV4SWQgT04gSW5kZXhEYXRhKGluZGV4SWQpIiwKKyAg
ICAgICAgfTsKKworICAgIHJldHVybiBydW5Db21tYW5kcyhzcWxpdGVEYXRhYmFzZSwgY29tbWFu
ZHMsIHNpemVvZihjb21tYW5kcykgLyBzaXplb2YoY29tbWFuZHNbMF0pKTsKK30KKworc3RhdGlj
IGJvb2wgY3JlYXRlTWV0YURhdGFUYWJsZShTUUxpdGVEYXRhYmFzZSYgc3FsaXRlRGF0YWJhc2Up
Cit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbW1hbmRzW10gPSB7CisgICAgICAgICJDUkVB
VEUgVEFCTEUgTWV0YURhdGEgKG5hbWUgVEVYVCBQUklNQVJZIEtFWSwgdmFsdWUgTk9ORSkiLAor
ICAgICAgICAiSU5TRVJUIElOVE8gTWV0YURhdGEgVkFMVUVTICgndmVyc2lvbicsIDEpIiwKKyAg
ICB9OworCisgICAgcmV0dXJuIHJ1bkNvbW1hbmRzKHNxbGl0ZURhdGFiYXNlLCBjb21tYW5kcywg
c2l6ZW9mKGNvbW1hbmRzKSAvIHNpemVvZihjb21tYW5kc1swXSkpOworfQorCitzdGF0aWMgYm9v
bCBnZXREYXRhYmFzZVNjaGVtYVZlcnNpb24oU1FMaXRlRGF0YWJhc2UmIHNxbGl0ZURhdGFiYXNl
LCBpbnQqIGRhdGFiYXNlVmVyc2lvbikKK3sKKyAgICBTUUxpdGVTdGF0ZW1lbnQgcXVlcnkoc3Fs
aXRlRGF0YWJhc2UsICJTRUxFQ1QgdmFsdWUgRlJPTSBNZXRhRGF0YSBXSEVSRSBuYW1lID0gJ3Zl
cnNpb24nIik7CisgICAgaWYgKHF1ZXJ5LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPayB8fCBxdWVy
eS5zdGVwKCkgIT0gU1FMUmVzdWx0Um93KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAq
ZGF0YWJhc2VWZXJzaW9uID0gcXVlcnkuZ2V0Q29sdW1uSW50KDApOworICAgIHJldHVybiBxdWVy
eS5maW5hbGl6ZSgpID09IFNRTFJlc3VsdE9rOworfQorCitzdGF0aWMgYm9vbCBtaWdyYXRlRGF0
YWJhc2UoU1FMaXRlRGF0YWJhc2UmIHNxbGl0ZURhdGFiYXNlKQoreworICAgIGlmICghc3FsaXRl
RGF0YWJhc2UudGFibGVFeGlzdHMoIk1ldGFEYXRhIikpIHsKKyAgICAgICAgaWYgKCFjcmVhdGVN
ZXRhRGF0YVRhYmxlKHNxbGl0ZURhdGFiYXNlKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICB9CisKKyAgICBpbnQgZGF0YWJhc2VWZXJzaW9uOworICAgIGlmICghZ2V0RGF0YWJhc2VT
Y2hlbWFWZXJzaW9uKHNxbGl0ZURhdGFiYXNlLCAmZGF0YWJhc2VWZXJzaW9uKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgaWYgKGRhdGFiYXNlVmVyc2lvbiA9PSAxKSB7CisgICAgICAg
IHN0YXRpYyBjb25zdCBjaGFyKiBjb21tYW5kc1tdID0geworICAgICAgICAgICAgIkRST1AgVEFC
TEUgSUYgRVhJU1RTIE9iamVjdFN0b3JlRGF0YTIiLAorICAgICAgICAgICAgIkNSRUFURSBUQUJM
RSBPYmplY3RTdG9yZURhdGEyIChpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBvYmplY3RTdG9yZUlk
IElOVEVHRVIgTk9UIE5VTEwgUkVGRVJFTkNFUyBPYmplY3RTdG9yZShpZCksIGtleVN0cmluZyBU
RVhULCBrZXlEYXRlIFJFQUwsIGtleU51bWJlciBSRUFMLCB2YWx1ZSBURVhUIE5PVCBOVUxMKSIs
CisgICAgICAgICAgICAiSU5TRVJUIElOVE8gT2JqZWN0U3RvcmVEYXRhMiBTRUxFQ1QgKiBGUk9N
IE9iamVjdFN0b3JlRGF0YSIsCisgICAgICAgICAgICAiRFJPUCBUQUJMRSBPYmplY3RTdG9yZURh
dGEiLCAvLyBUaGlzIGRlcGVuZHMgb24gU1FMaXRlIG5vdCBlbmZvcmNpbmcgcmVmZXJlbnRpYWwg
Y29uc2lzdGVuY3kuCisgICAgICAgICAgICAiQUxURVIgVEFCTEUgT2JqZWN0U3RvcmVEYXRhMiBS
RU5BTUUgVE8gT2JqZWN0U3RvcmVEYXRhIiwKKyAgICAgICAgICAgICJDUkVBVEUgVU5JUVVFIElO
REVYIE9iamVjdFN0b3JlRGF0YV9jb21wb3NpdCBPTiBPYmplY3RTdG9yZURhdGEoa2V5U3RyaW5n
LCBrZXlEYXRlLCBrZXlOdW1iZXIsIG9iamVjdFN0b3JlSWQpIiwKKyAgICAgICAgICAgICJEUk9Q
IFRBQkxFIElGIEVYSVNUUyBJbmRleERhdGEyIiwgLy8gVGhpcyBkZXBlbmRzIG9uIFNRTGl0ZSBu
b3QgZW5mb3JjaW5nIHJlZmVyZW50aWFsIGNvbnNpc3RlbmN5LgorICAgICAgICAgICAgIkNSRUFU
RSBUQUJMRSBJbmRleERhdGEyIChpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBpbmRleElkIElOVEVH
RVIgTk9UIE5VTEwgUkVGRVJFTkNFUyBJbmRleGVzKGlkKSwga2V5U3RyaW5nIFRFWFQsIGtleURh
dGUgUkVBTCwga2V5TnVtYmVyIFJFQUwsIG9iamVjdFN0b3JlRGF0YUlkIElOVEVHRVIgTk9UIE5V
TEwgUkVGRVJFTkNFUyBPYmplY3RTdG9yZURhdGEoaWQpKSIsCisgICAgICAgICAgICAiSU5TRVJU
IElOVE8gSW5kZXhEYXRhMiBTRUxFQ1QgKiBGUk9NIEluZGV4RGF0YSIsCisgICAgICAgICAgICAi
RFJPUCBUQUJMRSBJbmRleERhdGEiLAorICAgICAgICAgICAgIkFMVEVSIFRBQkxFIEluZGV4RGF0
YTIgUkVOQU1FIFRPIEluZGV4RGF0YSIsCisgICAgICAgICAgICAiQ1JFQVRFIElOREVYIEluZGV4
RGF0YV9jb21wb3NpdCBPTiBJbmRleERhdGEoa2V5U3RyaW5nLCBrZXlEYXRlLCBrZXlOdW1iZXIs
IGluZGV4SWQpIiwKKyAgICAgICAgICAgICJDUkVBVEUgSU5ERVggSW5kZXhEYXRhX29iamVjdFN0
b3JlRGF0YUlkIE9OIEluZGV4RGF0YShvYmplY3RTdG9yZURhdGFJZCkiLAorICAgICAgICAgICAg
IkNSRUFURSBJTkRFWCBJbmRleERhdGFfaW5kZXhJZCBPTiBJbmRleERhdGEoaW5kZXhJZCkiLAor
ICAgICAgICAgICAgIlVQREFURSBNZXRhRGF0YSBTRVQgdmFsdWUgPSAyIFdIRVJFIG5hbWUgPSAn
dmVyc2lvbiciLAorICAgICAgICB9OworCisgICAgICAgIGlmICghcnVuQ29tbWFuZHMoc3FsaXRl
RGF0YWJhc2UsIGNvbW1hbmRzLCBzaXplb2YoY29tbWFuZHMpIC8gc2l6ZW9mKGNvbW1hbmRzWzBd
KSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgZGF0YWJhc2VWZXJzaW9u
ID0gMjsKKyAgICB9CisKKyAgICBpZiAoZGF0YWJhc2VWZXJzaW9uID09IDIpIHsKKyAgICAgICAg
Ly8gV2UgbmVlZCB0byBtYWtlIHRoZSBPYmplY3RTdG9yZURhdGEudmFsdWUgYmUgYSBCTE9CIGlu
c3RlYWQgb2YgVEVYVC4KKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbW1hbmRzW10gPSB7
CisgICAgICAgICAgICAiRFJPUCBUQUJMRSBJRiBFWElTVFMgT2JqZWN0U3RvcmVEYXRhIiwgLy8g
VGhpcyBkcm9wcyBhc3NvY2lhdGVkIGluZGljZXMuCisgICAgICAgICAgICAiQ1JFQVRFIFRBQkxF
IE9iamVjdFN0b3JlRGF0YSAoaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgb2JqZWN0U3RvcmVJZCBJ
TlRFR0VSIE5PVCBOVUxMIFJFRkVSRU5DRVMgT2JqZWN0U3RvcmUoaWQpLCBrZXlTdHJpbmcgVEVY
VCwga2V5RGF0ZSBSRUFMLCBrZXlOdW1iZXIgUkVBTCwgdmFsdWUgQkxPQiBOT1QgTlVMTCkiLAor
ICAgICAgICAgICAgIkNSRUFURSBVTklRVUUgSU5ERVggT2JqZWN0U3RvcmVEYXRhX2NvbXBvc2l0
IE9OIE9iamVjdFN0b3JlRGF0YShrZXlTdHJpbmcsIGtleURhdGUsIGtleU51bWJlciwgb2JqZWN0
U3RvcmVJZCkiLAorICAgICAgICAgICAgIlVQREFURSBNZXRhRGF0YSBTRVQgdmFsdWUgPSAzIFdI
RVJFIG5hbWUgPSAndmVyc2lvbiciLAorICAgICAgICB9OworCisgICAgICAgIGlmICghcnVuQ29t
bWFuZHMoc3FsaXRlRGF0YWJhc2UsIGNvbW1hbmRzLCBzaXplb2YoY29tbWFuZHMpIC8gc2l6ZW9m
KGNvbW1hbmRzWzBdKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgZGF0
YWJhc2VWZXJzaW9uID0gMzsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworUGFzc1Jl
ZlB0cjxJREJCYWNraW5nU3RvcmU+IElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6b3BlbihTZWN1cml0
eU9yaWdpbiogc2VjdXJpdHlPcmlnaW4sIGNvbnN0IFN0cmluZyYgcGF0aEJhc2UsIGludDY0X3Qg
bWF4aW11bVNpemUsIGNvbnN0IFN0cmluZyYgZmlsZUlkZW50aWZpZXIsIElEQkZhY3RvcnlCYWNr
ZW5kSW1wbCogZmFjdG9yeSkKK3sKKyAgICBSZWZQdHI8SURCU1FMaXRlQmFja2luZ1N0b3JlPiBi
YWNraW5nU3RvcmUoYWRvcHRSZWYobmV3IElEQlNRTGl0ZUJhY2tpbmdTdG9yZShmaWxlSWRlbnRp
ZmllciwgZmFjdG9yeSkpKTsKKworICAgIFN0cmluZyBwYXRoID0gIjptZW1vcnk6IjsKKyAgICBp
ZiAoIXBhdGhCYXNlLmlzRW1wdHkoKSkgeworICAgICAgICBpZiAoIW1ha2VBbGxEaXJlY3Rvcmll
cyhwYXRoQmFzZSkpIHsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBJcyB0aGVyZSBhbnkgb3RoZXIg
dGhpbmcgd2UgY291bGQgcG9zc2libHkgZG8gdG8gcmVjb3ZlciBhdCB0aGlzIHBvaW50PyBJZiBz
bywgZG8gaXQgcmF0aGVyIHRoYW4ganVzdCBlcnJvcmluZyBvdXQuCisgICAgICAgICAgICBMT0df
RVJST1IoIlVuYWJsZWQgdG8gY3JlYXRlIExvY2FsU3RvcmFnZSBkYXRhYmFzZSBwYXRoICVzIiwg
cGF0aEJhc2UudXRmOCgpLmRhdGEoKSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAg
fQorICAgICAgICBwYXRoID0gcGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KHBhdGhCYXNlLCBzZWN1
cml0eU9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkgKyAiLmluZGV4ZWRkYiIpOworICAgIH0K
KworICAgIGlmICghYmFja2luZ1N0b3JlLT5tX2RiLm9wZW4ocGF0aCkpIHsKKyAgICAgICAgLy8g
RklYTUU6IElzIHRoZXJlIGFueSBvdGhlciB0aGluZyB3ZSBjb3VsZCBwb3NzaWJseSBkbyB0byBy
ZWNvdmVyIGF0IHRoaXMgcG9pbnQ/IElmIHNvLCBkbyBpdCByYXRoZXIgdGhhbiBqdXN0IGVycm9y
aW5nIG91dC4KKyAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gb3BlbiBkYXRhYmFzZSBmaWxl
ICVzIGZvciBJbmRleGVkREIiLCBwYXRoLnV0ZjgoKS5kYXRhKCkpOworICAgICAgICByZXR1cm4g
MDsKKyAgICB9CisKKyAgICAvLyBGSVhNRTogRXJyb3IgY2hlY2tpbmc/CisgICAgYmFja2luZ1N0
b3JlLT5tX2RiLnNldE1heGltdW1TaXplKG1heGltdW1TaXplKTsKKyAgICBiYWNraW5nU3RvcmUt
Pm1fZGIudHVybk9uSW5jcmVtZW50YWxBdXRvVmFjdXVtKCk7CisKKyAgICBpZiAoIWNyZWF0ZVRh
YmxlcyhiYWNraW5nU3RvcmUtPm1fZGIpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIW1p
Z3JhdGVEYXRhYmFzZShiYWNraW5nU3RvcmUtPm1fZGIpKQorICAgICAgICByZXR1cm4gMDsKKwor
ICAgIHJldHVybiBiYWNraW5nU3RvcmUucmVsZWFzZSgpOworfQorCitib29sIElEQlNRTGl0ZUJh
Y2tpbmdTdG9yZTo6ZXh0cmFjdElEQkRhdGFiYXNlTWV0YURhdGEoY29uc3QgU3RyaW5nJiBuYW1l
LCBTdHJpbmcmIGZvdW5kVmVyc2lvbiwgaW50NjRfdCYgZm91bmRJZCkKK3sKKyAgICBTUUxpdGVT
dGF0ZW1lbnQgZGF0YWJhc2VRdWVyeShtX2RiLCAiU0VMRUNUIGlkLCB2ZXJzaW9uIEZST00gRGF0
YWJhc2VzIFdIRVJFIG5hbWUgPSA/Iik7CisgICAgaWYgKGRhdGFiYXNlUXVlcnkucHJlcGFyZSgp
ICE9IFNRTFJlc3VsdE9rKSB7CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGRhdGFiYXNlUXVlcnkuYmluZFRleHQoMSwgbmFt
ZSk7CisgICAgaWYgKGRhdGFiYXNlUXVlcnkuc3RlcCgpICE9IFNRTFJlc3VsdFJvdykKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgZm91bmRJZCA9IGRhdGFiYXNlUXVlcnkuZ2V0Q29sdW1u
SW50NjQoMCk7CisgICAgZm91bmRWZXJzaW9uID0gZGF0YWJhc2VRdWVyeS5nZXRDb2x1bW5UZXh0
KDEpOworCisgICAgaWYgKGRhdGFiYXNlUXVlcnkuc3RlcCgpID09IFNRTFJlc3VsdFJvdykKKyAg
ICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wg
SURCU1FMaXRlQmFja2luZ1N0b3JlOjpzZXRJREJEYXRhYmFzZU1ldGFEYXRhKGNvbnN0IFN0cmlu
ZyYgbmFtZSwgY29uc3QgU3RyaW5nJiB2ZXJzaW9uLCBpbnQ2NF90JiByb3dJZCwgYm9vbCBpbnZh
bGlkUm93SWQpCit7CisgICAgQVNTRVJUKCFuYW1lLmlzTnVsbCgpKTsKKyAgICBBU1NFUlQoIXZl
cnNpb24uaXNOdWxsKCkpOworCisgICAgU3RyaW5nIHNxbCA9IGludmFsaWRSb3dJZCA/ICJJTlNF
UlQgSU5UTyBEYXRhYmFzZXMgKG5hbWUsIGRlc2NyaXB0aW9uLCB2ZXJzaW9uKSBWQUxVRVMgKD8s
ICcnLCA/KSIgOiAiVVBEQVRFIERhdGFiYXNlcyBTRVQgbmFtZSA9ID8sIHZlcnNpb24gPSA/IFdI
RVJFIGlkID0gPyI7CisgICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGIsIHNxbCk7CisgICAg
aWYgKHF1ZXJ5LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykgeworICAgICAgICBBU1NFUlRfTk9U
X1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHF1ZXJ5LmJp
bmRUZXh0KDEsIG5hbWUpOworICAgIHF1ZXJ5LmJpbmRUZXh0KDIsIHZlcnNpb24pOworICAgIGlm
ICghaW52YWxpZFJvd0lkKQorICAgICAgICBxdWVyeS5iaW5kSW50NjQoMywgcm93SWQpOworCisg
ICAgaWYgKHF1ZXJ5LnN0ZXAoKSAhPSBTUUxSZXN1bHREb25lKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICBpZiAoaW52YWxpZFJvd0lkKQorICAgICAgICByb3dJZCA9IG1fZGIubGFzdElu
c2VydFJvd0lEKCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBJREJTUUxpdGVCYWNr
aW5nU3RvcmU6OmdldE9iamVjdFN0b3JlcyhpbnQ2NF90IGRhdGFiYXNlSWQsIFZlY3RvcjxpbnQ2
NF90PiYgZm91bmRJZHMsIFZlY3RvcjxTdHJpbmc+JiBmb3VuZE5hbWVzLCBWZWN0b3I8U3RyaW5n
PiYgZm91bmRLZXlQYXRocywgVmVjdG9yPGJvb2w+JiBmb3VuZEF1dG9JbmNyZW1lbnRGbGFncykK
K3sKKyAgICBTUUxpdGVTdGF0ZW1lbnQgcXVlcnkobV9kYiwgIlNFTEVDVCBpZCwgbmFtZSwga2V5
UGF0aCwgZG9BdXRvSW5jcmVtZW50IEZST00gT2JqZWN0U3RvcmVzIFdIRVJFIGRhdGFiYXNlSWQg
PSA/Iik7CisgICAgYm9vbCBvayA9IHF1ZXJ5LnByZXBhcmUoKSA9PSBTUUxSZXN1bHRPazsKKyAg
ICBBU1NFUlRfVU5VU0VEKG9rLCBvayk7IC8vIEZJWE1FOiBCZXR0ZXIgZXJyb3IgaGFuZGxpbmc/
CisKKyAgICBBU1NFUlQoZm91bmRJZHMuaXNFbXB0eSgpKTsKKyAgICBBU1NFUlQoZm91bmROYW1l
cy5pc0VtcHR5KCkpOworICAgIEFTU0VSVChmb3VuZEtleVBhdGhzLmlzRW1wdHkoKSk7CisgICAg
QVNTRVJUKGZvdW5kQXV0b0luY3JlbWVudEZsYWdzLmlzRW1wdHkoKSk7CisKKyAgICBxdWVyeS5i
aW5kSW50NjQoMSwgZGF0YWJhc2VJZCk7CisKKyAgICB3aGlsZSAocXVlcnkuc3RlcCgpID09IFNR
TFJlc3VsdFJvdykgeworICAgICAgICBmb3VuZElkcy5hcHBlbmQocXVlcnkuZ2V0Q29sdW1uSW50
NjQoMCkpOworICAgICAgICBmb3VuZE5hbWVzLmFwcGVuZChxdWVyeS5nZXRDb2x1bW5UZXh0KDEp
KTsKKyAgICAgICAgZm91bmRLZXlQYXRocy5hcHBlbmQocXVlcnkuZ2V0Q29sdW1uVGV4dCgyKSk7
CisgICAgICAgIGZvdW5kQXV0b0luY3JlbWVudEZsYWdzLmFwcGVuZCghIXF1ZXJ5LmdldENvbHVt
bkludCgzKSk7CisgICAgfQorfQorCitib29sIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Y3JlYXRl
T2JqZWN0U3RvcmUoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJv
b2wgYXV0b0luY3JlbWVudCwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90JiBhc3NpZ25lZE9i
amVjdFN0b3JlSWQpCit7CisgICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGIsICJJTlNFUlQg
SU5UTyBPYmplY3RTdG9yZXMgKG5hbWUsIGtleVBhdGgsIGRvQXV0b0luY3JlbWVudCwgZGF0YWJh
c2VJZCkgVkFMVUVTICg/LCA/LCA/LCA/KSIpOworICAgIGlmIChxdWVyeS5wcmVwYXJlKCkgIT0g
U1FMUmVzdWx0T2spCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHF1ZXJ5LmJpbmRUZXh0
KDEsIG5hbWUpOworICAgIHF1ZXJ5LmJpbmRUZXh0KDIsIGtleVBhdGgpOworICAgIHF1ZXJ5LmJp
bmRJbnQoMywgc3RhdGljX2Nhc3Q8aW50PihhdXRvSW5jcmVtZW50KSk7CisgICAgcXVlcnkuYmlu
ZEludDY0KDQsIGRhdGFiYXNlSWQpOworCisgICAgaWYgKHF1ZXJ5LnN0ZXAoKSAhPSBTUUxSZXN1
bHREb25lKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBhc3NpZ25lZE9iamVjdFN0b3Jl
SWQgPSBtX2RiLmxhc3RJbnNlcnRSb3dJRCgpOworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0
aWMgdm9pZCBkb0RlbGV0ZShTUUxpdGVEYXRhYmFzZSYgZGIsIGNvbnN0IGNoYXIqIHNxbCwgaW50
NjRfdCBpZCkKK3sKKyAgICBTUUxpdGVTdGF0ZW1lbnQgZGVsZXRlUXVlcnkoZGIsIHNxbCk7Cisg
ICAgYm9vbCBvayA9IGRlbGV0ZVF1ZXJ5LnByZXBhcmUoKSA9PSBTUUxSZXN1bHRPazsKKyAgICBB
U1NFUlRfVU5VU0VEKG9rLCBvayk7IC8vIEZJWE1FOiBCZXR0ZXIgZXJyb3IgaGFuZGxpbmcuCisg
ICAgZGVsZXRlUXVlcnkuYmluZEludDY0KDEsIGlkKTsKKyAgICBvayA9IGRlbGV0ZVF1ZXJ5LnN0
ZXAoKSA9PSBTUUxSZXN1bHREb25lOworICAgIEFTU0VSVF9VTlVTRUQob2ssIG9rKTsgLy8gRklY
TUU6IEJldHRlciBlcnJvciBoYW5kbGluZy4KK30KKwordm9pZCBJREJTUUxpdGVCYWNraW5nU3Rv
cmU6OmRlbGV0ZU9iamVjdFN0b3JlKGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKK3sKKyAgICBkb0Rl
bGV0ZShtX2RiLCAiREVMRVRFIEZST00gT2JqZWN0U3RvcmVzIFdIRVJFIGlkID0gPyIsIG9iamVj
dFN0b3JlSWQpOworICAgIGRvRGVsZXRlKG1fZGIsICJERUxFVEUgRlJPTSBPYmplY3RTdG9yZURh
dGEgV0hFUkUgb2JqZWN0U3RvcmVJZCA9ID8iLCBvYmplY3RTdG9yZUlkKTsKKyAgICBkb0RlbGV0
ZShtX2RiLCAiREVMRVRFIEZST00gSW5kZXhEYXRhIFdIRVJFIGluZGV4SWQgSU4gKFNFTEVDVCBp
ZCBGUk9NIEluZGV4ZXMgV0hFUkUgb2JqZWN0U3RvcmVJZCA9ID8pIiwgb2JqZWN0U3RvcmVJZCk7
CisgICAgZG9EZWxldGUobV9kYiwgIkRFTEVURSBGUk9NIEluZGV4ZXMgV0hFUkUgb2JqZWN0U3Rv
cmVJZCA9ID8iLCBvYmplY3RTdG9yZUlkKTsKK30KKworc3RhdGljIFN0cmluZyB3aGVyZVN5bnRh
eEZvcktleShjb25zdCBJREJLZXkmIGtleSwgU3RyaW5nIHF1YWxpZmllZFRhYmxlTmFtZSA9ICIi
KQoreworICAgIHN3aXRjaCAoa2V5LnR5cGUoKSkgeworICAgIGNhc2UgSURCS2V5OjpTdHJpbmdU
eXBlOgorICAgICAgICByZXR1cm4gcXVhbGlmaWVkVGFibGVOYW1lICsgImtleVN0cmluZyA9ID8g
IEFORCAgIiArIHF1YWxpZmllZFRhYmxlTmFtZSArICJrZXlEYXRlIElTIE5VTEwgIEFORCAgIiAr
IHF1YWxpZmllZFRhYmxlTmFtZSArICJrZXlOdW1iZXIgSVMgTlVMTCAgIjsKKyAgICBjYXNlIElE
QktleTo6TnVtYmVyVHlwZToKKyAgICAgICAgcmV0dXJuIHF1YWxpZmllZFRhYmxlTmFtZSArICJr
ZXlTdHJpbmcgSVMgTlVMTCAgQU5EICAiICsgcXVhbGlmaWVkVGFibGVOYW1lICsgImtleURhdGUg
SVMgTlVMTCAgQU5EICAiICsgcXVhbGlmaWVkVGFibGVOYW1lICsgImtleU51bWJlciA9ID8gICI7
CisgICAgY2FzZSBJREJLZXk6OkRhdGVUeXBlOgorICAgICAgICByZXR1cm4gcXVhbGlmaWVkVGFi
bGVOYW1lICsgImtleVN0cmluZyBJUyBOVUxMICBBTkQgICIgKyBxdWFsaWZpZWRUYWJsZU5hbWUg
KyAia2V5RGF0ZSA9ID8gIEFORCAgIiArIHF1YWxpZmllZFRhYmxlTmFtZSArICJrZXlOdW1iZXIg
SVMgTlVMTCAgIjsKKyAgICBjYXNlIElEQktleTo6TnVsbFR5cGU6CisgICAgICAgIHJldHVybiBx
dWFsaWZpZWRUYWJsZU5hbWUgKyAia2V5U3RyaW5nIElTIE5VTEwgIEFORCAgIiArIHF1YWxpZmll
ZFRhYmxlTmFtZSArICJrZXlEYXRlIElTIE5VTEwgIEFORCAgIiArIHF1YWxpZmllZFRhYmxlTmFt
ZSArICJrZXlOdW1iZXIgSVMgTlVMTCAgIjsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKKyAgICByZXR1cm4gIiI7Cit9CisKKy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBpdGVt
cyBib3VuZC4KK3N0YXRpYyBpbnQgYmluZEtleVRvUXVlcnkoU1FMaXRlU3RhdGVtZW50JiBxdWVy
eSwgaW50IGNvbHVtbiwgY29uc3QgSURCS2V5JiBrZXkpCit7CisgICAgc3dpdGNoIChrZXkudHlw
ZSgpKSB7CisgICAgY2FzZSBJREJLZXk6OlN0cmluZ1R5cGU6CisgICAgICAgIHF1ZXJ5LmJpbmRU
ZXh0KGNvbHVtbiwga2V5LnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBJ
REJLZXk6OkRhdGVUeXBlOgorICAgICAgICBxdWVyeS5iaW5kRG91YmxlKGNvbHVtbiwga2V5LmRh
dGUoKSk7CisgICAgICAgIHJldHVybiAxOworICAgIGNhc2UgSURCS2V5OjpOdW1iZXJUeXBlOgor
ICAgICAgICBxdWVyeS5iaW5kRG91YmxlKGNvbHVtbiwga2V5Lm51bWJlcigpKTsKKyAgICAgICAg
cmV0dXJuIDE7CisgICAgY2FzZSBJREJLZXk6Ok51bGxUeXBlOgorICAgICAgICByZXR1cm4gMDsK
KyAgICB9CisKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsKK30KKwor
c3RhdGljIFN0cmluZyBsb3dlckN1cnNvcldoZXJlRnJhZ21lbnQoY29uc3QgSURCS2V5JiBrZXks
IFN0cmluZyBjb21wYXJpc29uT3BlcmF0b3IsIFN0cmluZyBxdWFsaWZpZWRUYWJsZU5hbWUgPSAi
IikKK3sKKyAgICBzd2l0Y2ggKGtleS50eXBlKCkpIHsKKyAgICBjYXNlIElEQktleTo6U3RyaW5n
VHlwZToKKyAgICAgICAgcmV0dXJuICI/ICIgKyBjb21wYXJpc29uT3BlcmF0b3IgKyAiICIgKyBx
dWFsaWZpZWRUYWJsZU5hbWUgKyAia2V5U3RyaW5nICBBTkQgICI7CisgICAgY2FzZSBJREJLZXk6
OkRhdGVUeXBlOgorICAgICAgICByZXR1cm4gIig/ICIgKyBjb21wYXJpc29uT3BlcmF0b3IgKyAi
ICIgKyBxdWFsaWZpZWRUYWJsZU5hbWUgKyAia2V5RGF0ZSAgT1IgTk9UICIgKyBxdWFsaWZpZWRU
YWJsZU5hbWUgKyAia2V5U3RyaW5nIElTIE5VTEwpICBBTkQgICI7CisgICAgY2FzZSBJREJLZXk6
Ok51bWJlclR5cGU6CisgICAgICAgIHJldHVybiAiKD8gIiArIGNvbXBhcmlzb25PcGVyYXRvciAr
ICIgIiArIHF1YWxpZmllZFRhYmxlTmFtZSArICJrZXlOdW1iZXIgIE9SICBOT1QgIiArIHF1YWxp
ZmllZFRhYmxlTmFtZSArICJrZXlTdHJpbmcgSVMgTlVMTCAgT1IgIE5PVCAiICsgcXVhbGlmaWVk
VGFibGVOYW1lICsgImtleURhdGUgSVMgTlVMTCkgIEFORCAgIjsKKyAgICBjYXNlIElEQktleTo6
TnVsbFR5cGU6CisgICAgICAgIGlmIChjb21wYXJpc29uT3BlcmF0b3IgPT0gIjwiKQorICAgICAg
ICAgICAgcmV0dXJuICJOT1QoIiArIHF1YWxpZmllZFRhYmxlTmFtZSArICJrZXlTdHJpbmcgSVMg
TlVMTCAgQU5EICAiICsgcXVhbGlmaWVkVGFibGVOYW1lICsgImtleURhdGUgSVMgTlVMTCAgQU5E
ICAiICsgcXVhbGlmaWVkVGFibGVOYW1lICsgImtleU51bWJlciBJUyBOVUxMKSAgQU5EICAiOwor
ICAgICAgICByZXR1cm4gIiI7IC8vIElmIGl0J3MgPSwgdGhlIHVwcGVyIGJvdW5kIGhhbGYgd2ls
bCBkbyB0aGUgY29uc3RyYWluaW5nLiBJZiBpdCdzIDw9LCB0aGVuIHRoYXQncyBhIG5vLW9wLgor
ICAgIH0KKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gIiI7Cit9CisKK3N0
YXRpYyBTdHJpbmcgdXBwZXJDdXJzb3JXaGVyZUZyYWdtZW50KGNvbnN0IElEQktleSYga2V5LCBT
dHJpbmcgY29tcGFyaXNvbk9wZXJhdG9yLCBTdHJpbmcgcXVhbGlmaWVkVGFibGVOYW1lID0gIiIp
Cit7CisgICAgc3dpdGNoIChrZXkudHlwZSgpKSB7CisgICAgY2FzZSBJREJLZXk6OlN0cmluZ1R5
cGU6CisgICAgICAgIHJldHVybiAiKCIgKyBxdWFsaWZpZWRUYWJsZU5hbWUgKyAia2V5U3RyaW5n
ICIgKyBjb21wYXJpc29uT3BlcmF0b3IgKyAiID8gIE9SICAiICsgcXVhbGlmaWVkVGFibGVOYW1l
ICsgImtleVN0cmluZyBJUyBOVUxMKSAgQU5EICAiOworICAgIGNhc2UgSURCS2V5OjpEYXRlVHlw
ZToKKyAgICAgICAgcmV0dXJuICIoIiArIHF1YWxpZmllZFRhYmxlTmFtZSArICJrZXlEYXRlICIg
KyBjb21wYXJpc29uT3BlcmF0b3IgKyAiID8gT1IgIiArIHF1YWxpZmllZFRhYmxlTmFtZSArICJr
ZXlEYXRlIElTIE5VTEwpICBBTkQgICIgKyBxdWFsaWZpZWRUYWJsZU5hbWUgKyAia2V5U3RyaW5n
IElTIE5VTEwgIEFORCAgIjsKKyAgICBjYXNlIElEQktleTo6TnVtYmVyVHlwZToKKyAgICAgICAg
cmV0dXJuICIoIiArIHF1YWxpZmllZFRhYmxlTmFtZSArICJrZXlOdW1iZXIgIiArIGNvbXBhcmlz
b25PcGVyYXRvciArICIgPyBPUiAiICsgcXVhbGlmaWVkVGFibGVOYW1lICsgImtleU51bWJlciBJ
UyBOVUxMKSAgQU5EICAiICsgcXVhbGlmaWVkVGFibGVOYW1lICsgImtleVN0cmluZyBJUyBOVUxM
ICBBTkQgICIgKyBxdWFsaWZpZWRUYWJsZU5hbWUgKyAia2V5RGF0ZSBJUyBOVUxMICBBTkQgICI7
CisgICAgY2FzZSBJREJLZXk6Ok51bGxUeXBlOgorICAgICAgICBpZiAoY29tcGFyaXNvbk9wZXJh
dG9yID09ICI8IikKKyAgICAgICAgICAgIHJldHVybiAiMCAhPSAwICBBTkQgICI7CisgICAgICAg
IHJldHVybiBxdWFsaWZpZWRUYWJsZU5hbWUgKyAia2V5U3RyaW5nIElTIE5VTEwgIEFORCAgIiAr
IHF1YWxpZmllZFRhYmxlTmFtZSArICJrZXlEYXRlIElTIE5VTEwgIEFORCAgIiArIHF1YWxpZmll
ZFRhYmxlTmFtZSArICJrZXlOdW1iZXIgSVMgTlVMTCAgQU5EICAiOworICAgIH0KKyAgICBBU1NF
UlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gIiI7Cit9CisKK1N0cmluZyBJREJTUUxpdGVC
YWNraW5nU3RvcmU6OmdldE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3Qgb2JqZWN0U3RvcmVJZCwg
Y29uc3QgSURCS2V5JiBrZXkpCit7CisgICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGIsICJT
RUxFQ1Qga2V5U3RyaW5nLCBrZXlEYXRlLCBrZXlOdW1iZXIsIHZhbHVlIEZST00gT2JqZWN0U3Rv
cmVEYXRhIFdIRVJFIG9iamVjdFN0b3JlSWQgPSA/IEFORCAiICsgd2hlcmVTeW50YXhGb3JLZXko
a2V5KSk7CisgICAgYm9vbCBvayA9IHF1ZXJ5LnByZXBhcmUoKSA9PSBTUUxSZXN1bHRPazsKKyAg
ICBBU1NFUlRfVU5VU0VEKG9rLCBvayk7IC8vIEZJWE1FOiBCZXR0ZXIgZXJyb3IgaGFuZGxpbmc/
CisKKyAgICBxdWVyeS5iaW5kSW50NjQoMSwgb2JqZWN0U3RvcmVJZCk7CisgICAgYmluZEtleVRv
UXVlcnkocXVlcnksIDIsIGtleSk7CisgICAgaWYgKHF1ZXJ5LnN0ZXAoKSAhPSBTUUxSZXN1bHRS
b3cpCisgICAgICAgIHJldHVybiBTdHJpbmcoKTsgLy8gTnVsbCBTdHJpbmcgbWVhbnMgcmVjb3Jk
IG5vdCBmb3VuZC4KKworICAgIEFTU0VSVCgoa2V5LnR5cGUoKSA9PSBJREJLZXk6OlN0cmluZ1R5
cGUpICE9IHF1ZXJ5LmlzQ29sdW1uTnVsbCgwKSk7CisgICAgQVNTRVJUKChrZXkudHlwZSgpID09
IElEQktleTo6RGF0ZVR5cGUpICE9IHF1ZXJ5LmlzQ29sdW1uTnVsbCgxKSk7CisgICAgQVNTRVJU
KChrZXkudHlwZSgpID09IElEQktleTo6TnVtYmVyVHlwZSkgIT0gcXVlcnkuaXNDb2x1bW5OdWxs
KDIpKTsKKworICAgIFN0cmluZyByZWNvcmQgPSBxdWVyeS5nZXRDb2x1bW5CbG9iQXNTdHJpbmco
Myk7CisgICAgQVNTRVJUKHF1ZXJ5LnN0ZXAoKSAhPSBTUUxSZXN1bHRSb3cpOworCisgICAgcmV0
dXJuIHJlY29yZDsKK30KKworc3RhdGljIHZvaWQgYmluZEtleVRvUXVlcnlXaXRoTnVsbHMoU1FM
aXRlU3RhdGVtZW50JiBxdWVyeSwgaW50IGJhc2VDb2x1bW4sIGNvbnN0IElEQktleSYga2V5KQor
eworICAgIHN3aXRjaCAoa2V5LnR5cGUoKSkgeworICAgIGNhc2UgSURCS2V5OjpTdHJpbmdUeXBl
OgorICAgICAgICBxdWVyeS5iaW5kVGV4dChiYXNlQ29sdW1uICsgMCwga2V5LnN0cmluZygpKTsK
KyAgICAgICAgcXVlcnkuYmluZE51bGwoYmFzZUNvbHVtbiArIDEpOworICAgICAgICBxdWVyeS5i
aW5kTnVsbChiYXNlQ29sdW1uICsgMik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSURCS2V5
OjpEYXRlVHlwZToKKyAgICAgICAgcXVlcnkuYmluZE51bGwoYmFzZUNvbHVtbiArIDApOworICAg
ICAgICBxdWVyeS5iaW5kRG91YmxlKGJhc2VDb2x1bW4gKyAxLCBrZXkuZGF0ZSgpKTsKKyAgICAg
ICAgcXVlcnkuYmluZE51bGwoYmFzZUNvbHVtbiArIDIpOworICAgICAgICBicmVhazsKKyAgICBj
YXNlIElEQktleTo6TnVtYmVyVHlwZToKKyAgICAgICAgcXVlcnkuYmluZE51bGwoYmFzZUNvbHVt
biArIDApOworICAgICAgICBxdWVyeS5iaW5kTnVsbChiYXNlQ29sdW1uICsgMSk7CisgICAgICAg
IHF1ZXJ5LmJpbmREb3VibGUoYmFzZUNvbHVtbiArIDIsIGtleS5udW1iZXIoKSk7CisgICAgICAg
IGJyZWFrOworICAgIGNhc2UgSURCS2V5OjpOdWxsVHlwZToKKyAgICAgICAgcXVlcnkuYmluZE51
bGwoYmFzZUNvbHVtbiArIDApOworICAgICAgICBxdWVyeS5iaW5kTnVsbChiYXNlQ29sdW1uICsg
MSk7CisgICAgICAgIHF1ZXJ5LmJpbmROdWxsKGJhc2VDb2x1bW4gKyAyKTsKKyAgICAgICAgYnJl
YWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQor
fQorCitib29sIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6cHV0T2JqZWN0U3RvcmVSZWNvcmQoaW50
NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXkmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1
ZSwgaW50NjRfdCYgcm93SWQsIGJvb2wgaW52YWxpZFJvd0lkKQoreworICAgIFN0cmluZyBzcWwg
PSAhaW52YWxpZFJvd0lkID8gIlVQREFURSBPYmplY3RTdG9yZURhdGEgU0VUIGtleVN0cmluZyA9
ID8sIGtleURhdGUgPSA/LCBrZXlOdW1iZXIgPSA/LCB2YWx1ZSA9ID8gV0hFUkUgaWQgPSA/Igor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIklOU0VSVCBJTlRPIE9iamVjdFN0b3Jl
RGF0YSAoa2V5U3RyaW5nLCBrZXlEYXRlLCBrZXlOdW1iZXIsIHZhbHVlLCBvYmplY3RTdG9yZUlk
KSBWQUxVRVMgKD8sID8sID8sID8sID8pIjsKKyAgICBTUUxpdGVTdGF0ZW1lbnQgcXVlcnkobV9k
Yiwgc3FsKTsKKyAgICBpZiAocXVlcnkucHJlcGFyZSgpICE9IFNRTFJlc3VsdE9rKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICBiaW5kS2V5VG9RdWVyeVdpdGhOdWxscyhxdWVyeSwgMSwg
a2V5KTsKKyAgICBxdWVyeS5iaW5kQmxvYig0LCB2YWx1ZSk7CisgICAgaWYgKCFpbnZhbGlkUm93
SWQpCisgICAgICAgIHF1ZXJ5LmJpbmRJbnQ2NCg1LCByb3dJZCk7CisgICAgZWxzZQorICAgICAg
ICBxdWVyeS5iaW5kSW50NjQoNSwgb2JqZWN0U3RvcmVJZCk7CisKKyAgICBpZiAocXVlcnkuc3Rl
cCgpICE9IFNRTFJlc3VsdERvbmUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChp
bnZhbGlkUm93SWQpCisgICAgICAgIHJvd0lkID0gbV9kYi5sYXN0SW5zZXJ0Um93SUQoKTsKKwor
ICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Y2xlYXJP
YmplY3RTdG9yZShpbnQ2NF90IG9iamVjdFN0b3JlSWQpCit7CisgICAgZG9EZWxldGUobV9kYiwg
IkRFTEVURSBGUk9NIEluZGV4RGF0YSBXSEVSRSBvYmplY3RTdG9yZURhdGFJZCBJTiAoU0VMRUNU
IGlkIEZST00gT2JqZWN0U3RvcmVEYXRhIFdIRVJFIG9iamVjdFN0b3JlSWQgPSA/KSIsIG9iamVj
dFN0b3JlSWQpOworICAgIGRvRGVsZXRlKG1fZGIsICJERUxFVEUgRlJPTSBPYmplY3RTdG9yZURh
dGEgV0hFUkUgb2JqZWN0U3RvcmVJZCA9ID8iLCBvYmplY3RTdG9yZUlkKTsKK30KKwordm9pZCBJ
REJTUUxpdGVCYWNraW5nU3RvcmU6OmRlbGV0ZU9iamVjdFN0b3JlUmVjb3JkKGludDY0X3QsIGlu
dDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQpCit7CisgICAgU1FMaXRlU3RhdGVtZW50IG9zUXVlcnko
bV9kYiwgIkRFTEVURSBGUk9NIE9iamVjdFN0b3JlRGF0YSBXSEVSRSBpZCA9ID8iKTsKKyAgICBi
b29sIG9rID0gb3NRdWVyeS5wcmVwYXJlKCkgPT0gU1FMUmVzdWx0T2s7CisgICAgQVNTRVJUX1VO
VVNFRChvaywgb2spOyAvLyBGSVhNRTogQmV0dGVyIGVycm9yIGhhbmRsaW5nPworCisgICAgb3NR
dWVyeS5iaW5kSW50NjQoMSwgb2JqZWN0U3RvcmVEYXRhSWQpOworCisgICAgb2sgPSBvc1F1ZXJ5
LnN0ZXAoKSA9PSBTUUxSZXN1bHREb25lOworICAgIEFTU0VSVF9VTlVTRUQob2ssIG9rKTsKKwor
ICAgIFNRTGl0ZVN0YXRlbWVudCBpbmRleFF1ZXJ5KG1fZGIsICJERUxFVEUgRlJPTSBJbmRleERh
dGEgV0hFUkUgb2JqZWN0U3RvcmVEYXRhSWQgPSA/Iik7CisgICAgb2sgPSBpbmRleFF1ZXJ5LnBy
ZXBhcmUoKSA9PSBTUUxSZXN1bHRPazsKKyAgICBBU1NFUlRfVU5VU0VEKG9rLCBvayk7IC8vIEZJ
WE1FOiBCZXR0ZXIgZXJyb3IgaGFuZGxpbmc/CisKKyAgICBpbmRleFF1ZXJ5LmJpbmRJbnQ2NCgx
LCBvYmplY3RTdG9yZURhdGFJZCk7CisKKyAgICBvayA9IGluZGV4UXVlcnkuc3RlcCgpID09IFNR
TFJlc3VsdERvbmU7CisgICAgQVNTRVJUX1VOVVNFRChvaywgb2spOworfQorCitkb3VibGUgSURC
U1FMaXRlQmFja2luZ1N0b3JlOjpuZXh0QXV0b0luY3JlbWVudE51bWJlcihpbnQ2NF90IG9iamVj
dFN0b3JlSWQpCit7CisgICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGIsICJTRUxFQ1QgbWF4
KGtleU51bWJlcikgKyAxIEZST00gT2JqZWN0U3RvcmVEYXRhIFdIRVJFIG9iamVjdFN0b3JlSWQg
PSA/IEFORCBrZXlTdHJpbmcgSVMgTlVMTCBBTkQga2V5RGF0ZSBJUyBOVUxMIik7CisgICAgYm9v
bCBvayA9IHF1ZXJ5LnByZXBhcmUoKSA9PSBTUUxSZXN1bHRPazsKKyAgICBBU1NFUlRfVU5VU0VE
KG9rLCBvayk7CisKKyAgICBxdWVyeS5iaW5kSW50NjQoMSwgb2JqZWN0U3RvcmVJZCk7CisKKyAg
ICBpZiAocXVlcnkuc3RlcCgpICE9IFNRTFJlc3VsdFJvdyB8fCBxdWVyeS5pc0NvbHVtbk51bGwo
MCkpCisgICAgICAgIHJldHVybiAxOworCisgICAgcmV0dXJuIHF1ZXJ5LmdldENvbHVtbkRvdWJs
ZSgwKTsKK30KKworYm9vbCBJREJTUUxpdGVCYWNraW5nU3RvcmU6OmtleUV4aXN0c0luT2JqZWN0
U3RvcmUoaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXkmIGtleSwgaW50NjRfdCYg
Zm91bmRPYmplY3RTdG9yZURhdGFJZCkKK3sKKyAgICBTdHJpbmcgc3FsID0gU3RyaW5nKCJTRUxF
Q1QgaWQgRlJPTSBPYmplY3RTdG9yZURhdGEgV0hFUkUgb2JqZWN0U3RvcmVJZCA9ID8gQU5EICIp
ICsgd2hlcmVTeW50YXhGb3JLZXkoa2V5KTsKKyAgICBTUUxpdGVTdGF0ZW1lbnQgcXVlcnkobV9k
Yiwgc3FsKTsKKyAgICBib29sIG9rID0gcXVlcnkucHJlcGFyZSgpID09IFNRTFJlc3VsdE9rOwor
ICAgIEFTU0VSVF9VTlVTRUQob2ssIG9rKTsgLy8gRklYTUU6IEJldHRlciBlcnJvciBoYW5kbGlu
Zz8KKworICAgIHF1ZXJ5LmJpbmRJbnQ2NCgxLCBvYmplY3RTdG9yZUlkKTsKKyAgICBiaW5kS2V5
VG9RdWVyeShxdWVyeSwgMiwga2V5KTsKKworICAgIGlmIChxdWVyeS5zdGVwKCkgIT0gU1FMUmVz
dWx0Um93KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBmb3VuZE9iamVjdFN0b3JlRGF0
YUlkID0gcXVlcnkuZ2V0Q29sdW1uSW50NjQoMCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jv
b2wgSURCU1FMaXRlQmFja2luZ1N0b3JlOjpmb3JFYWNoT2JqZWN0U3RvcmVSZWNvcmQoaW50NjRf
dCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZVJlY29yZENhbGxiYWNrJiBjYWxsYmFjaykKK3sK
KyAgICBTUUxpdGVTdGF0ZW1lbnQgcXVlcnkobV9kYiwgIlNFTEVDVCBpZCwgdmFsdWUgRlJPTSBP
YmplY3RTdG9yZURhdGEgV0hFUkUgb2JqZWN0U3RvcmVJZCA9ID8iKTsKKyAgICBpZiAocXVlcnku
cHJlcGFyZSgpICE9IFNRTFJlc3VsdE9rKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBx
dWVyeS5iaW5kSW50NjQoMSwgb2JqZWN0U3RvcmVJZCk7CisKKyAgICB3aGlsZSAocXVlcnkuc3Rl
cCgpID09IFNRTFJlc3VsdFJvdykgeworICAgICAgICBpbnQ2NF90IG9iamVjdFN0b3JlRGF0YUlk
ID0gcXVlcnkuZ2V0Q29sdW1uSW50NjQoMCk7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IHF1ZXJ5
LmdldENvbHVtbkJsb2JBc1N0cmluZygxKTsKKyAgICAgICAgaWYgKCFjYWxsYmFjay5jYWxsYmFj
ayhvYmplY3RTdG9yZURhdGFJZCwgdmFsdWUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIElEQlNRTGl0ZUJhY2tpbmdTdG9y
ZTo6Z2V0SW5kZXhlcyhpbnQ2NF90IG9iamVjdFN0b3JlSWQsIFZlY3RvcjxpbnQ2NF90PiYgZm91
bmRJZHMsIFZlY3RvcjxTdHJpbmc+JiBmb3VuZE5hbWVzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmRL
ZXlQYXRocywgVmVjdG9yPGJvb2w+JiBmb3VuZFVuaXF1ZUZsYWdzKQoreworICAgIFNRTGl0ZVN0
YXRlbWVudCBxdWVyeShtX2RiLCAiU0VMRUNUIGlkLCBuYW1lLCBrZXlQYXRoLCBpc1VuaXF1ZSBG
Uk9NIEluZGV4ZXMgV0hFUkUgb2JqZWN0U3RvcmVJZCA9ID8iKTsKKyAgICBib29sIG9rID0gcXVl
cnkucHJlcGFyZSgpID09IFNRTFJlc3VsdE9rOworICAgIEFTU0VSVF9VTlVTRUQob2ssIG9rKTsg
Ly8gRklYTUU6IEJldHRlciBlcnJvciBoYW5kbGluZz8KKworICAgIEFTU0VSVChmb3VuZElkcy5p
c0VtcHR5KCkpOworICAgIEFTU0VSVChmb3VuZE5hbWVzLmlzRW1wdHkoKSk7CisgICAgQVNTRVJU
KGZvdW5kS2V5UGF0aHMuaXNFbXB0eSgpKTsKKyAgICBBU1NFUlQoZm91bmRVbmlxdWVGbGFncy5p
c0VtcHR5KCkpOworCisgICAgcXVlcnkuYmluZEludDY0KDEsIG9iamVjdFN0b3JlSWQpOworCisg
ICAgd2hpbGUgKHF1ZXJ5LnN0ZXAoKSA9PSBTUUxSZXN1bHRSb3cpIHsKKyAgICAgICAgZm91bmRJ
ZHMuYXBwZW5kKHF1ZXJ5LmdldENvbHVtbkludDY0KDApKTsKKyAgICAgICAgZm91bmROYW1lcy5h
cHBlbmQocXVlcnkuZ2V0Q29sdW1uVGV4dCgxKSk7CisgICAgICAgIGZvdW5kS2V5UGF0aHMuYXBw
ZW5kKHF1ZXJ5LmdldENvbHVtblRleHQoMikpOworICAgICAgICBmb3VuZFVuaXF1ZUZsYWdzLmFw
cGVuZCghIXF1ZXJ5LmdldENvbHVtbkludCgzKSk7CisgICAgfQorfQorCitib29sIElEQlNRTGl0
ZUJhY2tpbmdTdG9yZTo6Y3JlYXRlSW5kZXgoaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBT
dHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwgYm9vbCBpc1VuaXF1ZSwgaW50NjRf
dCYgaW5kZXhJZCkKK3sKKyAgICBTUUxpdGVTdGF0ZW1lbnQgcXVlcnkobV9kYiwgIklOU0VSVCBJ
TlRPIEluZGV4ZXMgKG9iamVjdFN0b3JlSWQsIG5hbWUsIGtleVBhdGgsIGlzVW5pcXVlKSBWQUxV
RVMgKD8sID8sID8sID8pIik7CisgICAgaWYgKHF1ZXJ5LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRP
aykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcXVlcnkuYmluZEludDY0KDEsIG9iamVj
dFN0b3JlSWQpOworICAgIHF1ZXJ5LmJpbmRUZXh0KDIsIG5hbWUpOworICAgIHF1ZXJ5LmJpbmRU
ZXh0KDMsIGtleVBhdGgpOworICAgIHF1ZXJ5LmJpbmRJbnQoNCwgc3RhdGljX2Nhc3Q8aW50Pihp
c1VuaXF1ZSkpOworCisgICAgaWYgKHF1ZXJ5LnN0ZXAoKSAhPSBTUUxSZXN1bHREb25lKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpbmRleElkID0gbV9kYi5sYXN0SW5zZXJ0Um93SUQo
KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBJREJTUUxpdGVCYWNraW5nU3RvcmU6OmRl
bGV0ZUluZGV4KGludDY0X3QgaW5kZXhJZCkKK3sKKyAgICBkb0RlbGV0ZShtX2RiLCAiREVMRVRF
IEZST00gSW5kZXhlcyBXSEVSRSBpZCA9ID8iLCBpbmRleElkKTsKKyAgICBkb0RlbGV0ZShtX2Ri
LCAiREVMRVRFIEZST00gSW5kZXhEYXRhIFdIRVJFIGluZGV4SWQgPSA/IiwgaW5kZXhJZCk7Cit9
CisKK2Jvb2wgSURCU1FMaXRlQmFja2luZ1N0b3JlOjpwdXRJbmRleERhdGFGb3JSZWNvcmQoaW50
NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmIGtleSwgaW50NjRfdCBvYmplY3RTdG9yZURhdGFJ
ZCkKK3sKKyAgICBTUUxpdGVTdGF0ZW1lbnQgcXVlcnkobV9kYiwgIklOU0VSVCBJTlRPIEluZGV4
RGF0YSAoa2V5U3RyaW5nLCBrZXlEYXRlLCBrZXlOdW1iZXIsIGluZGV4SWQsIG9iamVjdFN0b3Jl
RGF0YUlkKSBWQUxVRVMgKD8sID8sID8sID8sID8pIik7CisgICAgaWYgKHF1ZXJ5LnByZXBhcmUo
KSAhPSBTUUxSZXN1bHRPaykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYmluZEtleVRv
UXVlcnlXaXRoTnVsbHMocXVlcnksIDEsIGtleSk7CisgICAgcXVlcnkuYmluZEludDY0KDQsIGlu
ZGV4SWQpOworICAgIHF1ZXJ5LmJpbmRJbnQ2NCg1LCBvYmplY3RTdG9yZURhdGFJZCk7CisKKyAg
ICByZXR1cm4gcXVlcnkuc3RlcCgpID09IFNRTFJlc3VsdERvbmU7Cit9CisKK2Jvb2wgSURCU1FM
aXRlQmFja2luZ1N0b3JlOjpkZWxldGVJbmRleERhdGFGb3JSZWNvcmQoaW50NjRfdCBvYmplY3RT
dG9yZURhdGFJZCkKK3sKKyAgICBTUUxpdGVTdGF0ZW1lbnQgcXVlcnkobV9kYiwgIkRFTEVURSBG
Uk9NIEluZGV4RGF0YSBXSEVSRSBvYmplY3RTdG9yZURhdGFJZCA9ID8iKTsKKyAgICBpZiAocXVl
cnkucHJlcGFyZSgpICE9IFNRTFJlc3VsdE9rKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICBxdWVyeS5iaW5kSW50NjQoMSwgb2JqZWN0U3RvcmVEYXRhSWQpOworICAgIHJldHVybiBxdWVy
eS5zdGVwKCkgPT0gU1FMUmVzdWx0RG9uZTsKK30KKworU3RyaW5nIElEQlNRTGl0ZUJhY2tpbmdT
dG9yZTo6Z2V0T2JqZWN0VmlhSW5kZXgoaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmIGtl
eSkKK3sKKyAgICBTdHJpbmcgc3FsID0gU3RyaW5nKCJTRUxFQ1QgIikKKyAgICAgICAgICAgICAg
ICAgKyAiT2JqZWN0U3RvcmVEYXRhLnZhbHVlICIKKyAgICAgICAgICAgICAgICAgKyAiRlJPTSBJ
bmRleERhdGEgSU5ORVIgSk9JTiBPYmplY3RTdG9yZURhdGEgT04gSW5kZXhEYXRhLm9iamVjdFN0
b3JlRGF0YUlkID0gT2JqZWN0U3RvcmVEYXRhLmlkICIKKyAgICAgICAgICAgICAgICAgKyAiV0hF
UkUgSW5kZXhEYXRhLmluZGV4SWQgPSA/ICBBTkQgICIgKyB3aGVyZVN5bnRheEZvcktleShrZXks
ICJJbmRleERhdGEuIikKKyAgICAgICAgICAgICAgICAgKyAiT1JERVIgQlkgSW5kZXhEYXRhLmlk
IExJTUlUIDEiOyAvLyBPcmRlciBieSBpbnNlcnRpb24gb3JkZXIgd2hlbiBhbGwgZWxzZSBmYWls
cy4KKyAgICBTUUxpdGVTdGF0ZW1lbnQgcXVlcnkobV9kYiwgc3FsKTsKKyAgICBib29sIG9rID0g
cXVlcnkucHJlcGFyZSgpID09IFNRTFJlc3VsdE9rOworICAgIEFTU0VSVF9VTlVTRUQob2ssIG9r
KTsgLy8gRklYTUU6IEJldHRlciBlcnJvciBoYW5kbGluZz8KKworICAgIHF1ZXJ5LmJpbmRJbnQ2
NCgxLCBpbmRleElkKTsKKyAgICBiaW5kS2V5VG9RdWVyeShxdWVyeSwgMiwga2V5KTsKKworICAg
IGlmIChxdWVyeS5zdGVwKCkgIT0gU1FMUmVzdWx0Um93KQorICAgICAgICByZXR1cm4gU3RyaW5n
KCk7CisKKyAgICBTdHJpbmcgZm91bmRWYWx1ZSA9IHF1ZXJ5LmdldENvbHVtbkJsb2JBc1N0cmlu
ZygwKTsKKyAgICBBU1NFUlQocXVlcnkuc3RlcCgpICE9IFNRTFJlc3VsdFJvdyk7CisgICAgcmV0
dXJuIGZvdW5kVmFsdWU7Cit9CisKK3N0YXRpYyBQYXNzUmVmUHRyPElEQktleT4ga2V5RnJvbVF1
ZXJ5KFNRTGl0ZVN0YXRlbWVudCYgcXVlcnksIGludCBiYXNlQ29sdW1uKQoreworICAgIGlmIChx
dWVyeS5jb2x1bW5Db3VudCgpIDw9IGJhc2VDb2x1bW4pCisgICAgICAgIHJldHVybiAwOworCisg
ICAgaWYgKCFxdWVyeS5pc0NvbHVtbk51bGwoYmFzZUNvbHVtbikpCisgICAgICAgIHJldHVybiBJ
REJLZXk6OmNyZWF0ZVN0cmluZyhxdWVyeS5nZXRDb2x1bW5UZXh0KGJhc2VDb2x1bW4pKTsKKwor
ICAgIGlmICghcXVlcnkuaXNDb2x1bW5OdWxsKGJhc2VDb2x1bW4gKyAxKSkKKyAgICAgICAgcmV0
dXJuIElEQktleTo6Y3JlYXRlRGF0ZShxdWVyeS5nZXRDb2x1bW5Eb3VibGUoYmFzZUNvbHVtbiAr
IDEpKTsKKworICAgIGlmICghcXVlcnkuaXNDb2x1bW5OdWxsKGJhc2VDb2x1bW4gKyAyKSkKKyAg
ICAgICAgcmV0dXJuIElEQktleTo6Y3JlYXRlTnVtYmVyKHF1ZXJ5LmdldENvbHVtbkRvdWJsZShi
YXNlQ29sdW1uICsgMikpOworCisgICAgcmV0dXJuIElEQktleTo6Y3JlYXRlTnVsbCgpOworfQor
CitQYXNzUmVmUHRyPElEQktleT4gSURCU1FMaXRlQmFja2luZ1N0b3JlOjpnZXRQcmltYXJ5S2V5
VmlhSW5kZXgoaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmIGtleSkKK3sKKyAgICBTdHJp
bmcgc3FsID0gU3RyaW5nKCJTRUxFQ1QgIikKKyAgICAgICAgICAgICAgICAgKyAiT2JqZWN0U3Rv
cmVEYXRhLmtleVN0cmluZywgT2JqZWN0U3RvcmVEYXRhLmtleURhdGUsIE9iamVjdFN0b3JlRGF0
YS5rZXlOdW1iZXIgIgorICAgICAgICAgICAgICAgICArICJGUk9NIEluZGV4RGF0YSBJTk5FUiBK
T0lOIE9iamVjdFN0b3JlRGF0YSBPTiBJbmRleERhdGEub2JqZWN0U3RvcmVEYXRhSWQgPSBPYmpl
Y3RTdG9yZURhdGEuaWQgIgorICAgICAgICAgICAgICAgICArICJXSEVSRSBJbmRleERhdGEuaW5k
ZXhJZCA9ID8gIEFORCAgIiArIHdoZXJlU3ludGF4Rm9yS2V5KGtleSwgIkluZGV4RGF0YS4iKQor
ICAgICAgICAgICAgICAgICArICJPUkRFUiBCWSBJbmRleERhdGEuaWQgTElNSVQgMSI7IC8vIE9y
ZGVyIGJ5IGluc2VydGlvbiBvcmRlciB3aGVuIGFsbCBlbHNlIGZhaWxzLgorICAgIFNRTGl0ZVN0
YXRlbWVudCBxdWVyeShtX2RiLCBzcWwpOworICAgIGJvb2wgb2sgPSBxdWVyeS5wcmVwYXJlKCkg
PT0gU1FMUmVzdWx0T2s7CisgICAgQVNTRVJUX1VOVVNFRChvaywgb2spOyAvLyBGSVhNRTogQmV0
dGVyIGVycm9yIGhhbmRsaW5nPworCisgICAgcXVlcnkuYmluZEludDY0KDEsIGluZGV4SWQpOwor
ICAgIGJpbmRLZXlUb1F1ZXJ5KHF1ZXJ5LCAyLCBrZXkpOworCisgICAgaWYgKHF1ZXJ5LnN0ZXAo
KSAhPSBTUUxSZXN1bHRSb3cpCisgICAgICAgIHJldHVybiAwOworCisgICAgUmVmUHRyPElEQktl
eT4gZm91bmRLZXkgPSBrZXlGcm9tUXVlcnkocXVlcnksIDApOworICAgIEFTU0VSVChxdWVyeS5z
dGVwKCkgIT0gU1FMUmVzdWx0Um93KTsKKyAgICByZXR1cm4gZm91bmRLZXkucmVsZWFzZSgpOwor
fQorCitib29sIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6a2V5RXhpc3RzSW5JbmRleChpbnQ2NF90
IGluZGV4SWQsIGNvbnN0IElEQktleSYga2V5KQoreworICAgIFN0cmluZyBzcWwgPSBTdHJpbmco
IlNFTEVDVCBpZCBGUk9NIEluZGV4RGF0YSBXSEVSRSBpbmRleElkID0gPyBBTkQgIikgKyB3aGVy
ZVN5bnRheEZvcktleShrZXkpOworICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVyeShtX2RiLCBzcWwp
OworICAgIGJvb2wgb2sgPSBxdWVyeS5wcmVwYXJlKCkgPT0gU1FMUmVzdWx0T2s7CisgICAgQVNT
RVJUX1VOVVNFRChvaywgb2spOyAvLyBGSVhNRTogQmV0dGVyIGVycm9yIGhhbmRsaW5nPworCisg
ICAgcXVlcnkuYmluZEludDY0KDEsIGluZGV4SWQpOworICAgIGJpbmRLZXlUb1F1ZXJ5KHF1ZXJ5
LCAyLCBrZXkpOworCisgICAgcmV0dXJuIHF1ZXJ5LnN0ZXAoKSA9PSBTUUxSZXN1bHRSb3c7Cit9
CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIEN1cnNvckltcGxDb21tb24gOiBwdWJsaWMgSURCU1FM
aXRlQmFja2luZ1N0b3JlOjpDdXJzb3IgeworcHVibGljOgorICAgIEN1cnNvckltcGxDb21tb24o
U1FMaXRlRGF0YWJhc2UmIHNxbGl0ZURhdGFiYXNlLCBTdHJpbmcgcXVlcnksIGJvb2wgdW5pcXVl
bmVzc0NvbnN0cmFpbnQsIGJvb2wgaXRlcmF0ZUZvcndhcmQpCisgICAgICAgIDogbV9xdWVyeShz
cWxpdGVEYXRhYmFzZSwgcXVlcnkpCisgICAgICAgICwgbV9kYihzcWxpdGVEYXRhYmFzZSkKKyAg
ICAgICAgLCBtX3VuaXF1ZW5lc3NDb25zdHJhaW50KHVuaXF1ZW5lc3NDb25zdHJhaW50KQorICAg
ICAgICAsIG1faXRlcmF0ZUZvcndhcmQoaXRlcmF0ZUZvcndhcmQpCisgICAgeworICAgIH0KKyAg
ICB2aXJ0dWFsIH5DdXJzb3JJbXBsQ29tbW9uKCkge30KKworICAgIC8vIElEQkJhY2tpbmdTdG9y
ZTo6Q3Vyc29yCisgICAgdmlydHVhbCBib29sIGNvbnRpbnVlRnVuY3Rpb24oY29uc3QgSURCS2V5
Kik7CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQktleT4ga2V5KCkgeyByZXR1cm4gbV9jdXJy
ZW50S2V5OyB9CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQktleT4gcHJpbWFyeUtleSgpIHsg
cmV0dXJuIG1fY3VycmVudEtleTsgfQorICAgIHZpcnR1YWwgU3RyaW5nIHZhbHVlKCkgPSAwOwor
ICAgIHZpcnR1YWwgaW50NjRfdCBvYmplY3RTdG9yZURhdGFJZCgpID0gMDsKKyAgICB2aXJ0dWFs
IGludDY0X3QgaW5kZXhEYXRhSWQoKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgbG9hZEN1cnJl
bnRSb3coKSA9IDA7CisgICAgdmlydHVhbCBib29sIGN1cnJlbnRSb3dFeGlzdHMoKSA9IDA7CisK
KyAgICBTUUxpdGVTdGF0ZW1lbnQgbV9xdWVyeTsKKworcHJvdGVjdGVkOgorICAgIFNRTGl0ZURh
dGFiYXNlJiBtX2RiOworICAgIGJvb2wgbV91bmlxdWVuZXNzQ29uc3RyYWludDsKKyAgICBib29s
IG1faXRlcmF0ZUZvcndhcmQ7CisgICAgaW50NjRfdCBtX2N1cnJlbnRJZDsKKyAgICBSZWZQdHI8
SURCS2V5PiBtX2N1cnJlbnRLZXk7Cit9OworCitib29sIEN1cnNvckltcGxDb21tb246OmNvbnRp
bnVlRnVuY3Rpb24oY29uc3QgSURCS2V5KiBrZXkpCit7CisgICAgd2hpbGUgKHRydWUpIHsKKyAg
ICAgICAgaWYgKG1fcXVlcnkuc3RlcCgpICE9IFNRTFJlc3VsdFJvdykKKyAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgICAgICBSZWZQdHI8SURCS2V5PiBvbGRLZXkgPSBtX2N1cnJlbnRL
ZXk7CisgICAgICAgIGxvYWRDdXJyZW50Um93KCk7CisKKyAgICAgICAgLy8gU2tpcCBpZiB0aGlz
IGVudHJ5IGhhcyBiZWVuIGRlbGV0ZWQgZnJvbSB0aGUgb2JqZWN0IHN0b3JlLgorICAgICAgICBp
ZiAoIWN1cnJlbnRSb3dFeGlzdHMoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAg
IC8vIElmIGEga2V5IHdhcyBzdXBwbGllZCwgd2UgbXVzdCBsb29wIHVudGlsIHdlIGZpbmQgYSBr
ZXkgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGl0IChvciBoaXQgdGhlIGVuZCkuCisgICAgICAg
IGlmIChrZXkpIHsKKyAgICAgICAgICAgIGlmIChtX2l0ZXJhdGVGb3J3YXJkKSB7CisgICAgICAg
ICAgICAgICAgaWYgKG1fY3VycmVudEtleS0+aXNMZXNzVGhhbihrZXkpKQorICAgICAgICAgICAg
ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAg
aWYgKGtleS0+aXNMZXNzVGhhbihtX2N1cnJlbnRLZXkuZ2V0KCkpKQorICAgICAgICAgICAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElm
IHdlIGRvbid0IGhhdmUgYSB1bmlxdWVuZXNzIGNvbnN0cmFpbnQsIHdlIGNhbiBzdG9wIG5vdy4K
KyAgICAgICAgaWYgKCFtX3VuaXF1ZW5lc3NDb25zdHJhaW50KQorICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIGlmICghbV9jdXJyZW50S2V5LT5pc0VxdWFsKG9sZEtleS5nZXQoKSkpCisgICAg
ICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworY2xhc3MgT2Jq
ZWN0U3RvcmVDdXJzb3JJbXBsIDogcHVibGljIEN1cnNvckltcGxDb21tb24geworcHVibGljOgor
ICAgIE9iamVjdFN0b3JlQ3Vyc29ySW1wbChTUUxpdGVEYXRhYmFzZSYgc3FsaXRlRGF0YWJhc2Us
IFN0cmluZyBxdWVyeSwgYm9vbCB1bmlxdWVuZXNzQ29uc3RyYWludCwgYm9vbCBpdGVyYXRlRm9y
d2FyZCkKKyAgICAgICAgOiBDdXJzb3JJbXBsQ29tbW9uKHNxbGl0ZURhdGFiYXNlLCBxdWVyeSwg
dW5pcXVlbmVzc0NvbnN0cmFpbnQsIGl0ZXJhdGVGb3J3YXJkKQorICAgIHsKKyAgICB9CisKKyAg
ICAvLyBDdXJzb3JJbXBsQ29tbW9uLgorICAgIHZpcnR1YWwgU3RyaW5nIHZhbHVlKCkgeyByZXR1
cm4gbV9jdXJyZW50VmFsdWU7IH0KKyAgICB2aXJ0dWFsIGludDY0X3Qgb2JqZWN0U3RvcmVEYXRh
SWQoKSB7IHJldHVybiBtX2N1cnJlbnRJZDsgfQorICAgIHZpcnR1YWwgaW50NjRfdCBpbmRleERh
dGFJZCgpIHsgQVNTRVJUX05PVF9SRUFDSEVEKCk7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCB2
b2lkIGxvYWRDdXJyZW50Um93KCk7CisgICAgdmlydHVhbCBib29sIGN1cnJlbnRSb3dFeGlzdHMo
KTsKKworcHJpdmF0ZToKKyAgICBTdHJpbmcgbV9jdXJyZW50VmFsdWU7Cit9OworCit2b2lkIE9i
amVjdFN0b3JlQ3Vyc29ySW1wbDo6bG9hZEN1cnJlbnRSb3coKQoreworICAgIG1fY3VycmVudElk
ID0gbV9xdWVyeS5nZXRDb2x1bW5JbnQ2NCgwKTsKKyAgICBtX2N1cnJlbnRLZXkgPSBrZXlGcm9t
UXVlcnkobV9xdWVyeSwgMSk7CisgICAgbV9jdXJyZW50VmFsdWUgPSBtX3F1ZXJ5LmdldENvbHVt
bkJsb2JBc1N0cmluZyg0KTsKK30KKworYm9vbCBPYmplY3RTdG9yZUN1cnNvckltcGw6OmN1cnJl
bnRSb3dFeGlzdHMoKQoreworICAgIFN0cmluZyBzcWwgPSAiU0VMRUNUIGlkIEZST00gT2JqZWN0
U3RvcmVEYXRhIFdIRVJFIGlkID0gPyI7CisgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudCht
X2RiLCBzcWwpOworCisgICAgYm9vbCBvayA9IHN0YXRlbWVudC5wcmVwYXJlKCkgPT0gU1FMUmVz
dWx0T2s7CisgICAgQVNTRVJUX1VOVVNFRChvaywgb2spOworCisgICAgc3RhdGVtZW50LmJpbmRJ
bnQ2NCgxLCBtX2N1cnJlbnRJZCk7CisgICAgcmV0dXJuIHN0YXRlbWVudC5zdGVwKCkgPT0gU1FM
UmVzdWx0Um93OworfQorCitjbGFzcyBJbmRleEtleUN1cnNvckltcGwgOiBwdWJsaWMgQ3Vyc29y
SW1wbENvbW1vbiB7CitwdWJsaWM6CisgICAgSW5kZXhLZXlDdXJzb3JJbXBsKFNRTGl0ZURhdGFi
YXNlJiBzcWxpdGVEYXRhYmFzZSwgU3RyaW5nIHF1ZXJ5LCBib29sIHVuaXF1ZW5lc3NDb25zdHJh
aW50LCBib29sIGl0ZXJhdGVGb3J3YXJkKQorICAgICAgICA6IEN1cnNvckltcGxDb21tb24oc3Fs
aXRlRGF0YWJhc2UsIHF1ZXJ5LCB1bmlxdWVuZXNzQ29uc3RyYWludCwgaXRlcmF0ZUZvcndhcmQp
CisgICAgeworICAgIH0KKworICAgIC8vIEN1cnNvckltcGxDb21tb24KKyAgICB2aXJ0dWFsIFBh
c3NSZWZQdHI8SURCS2V5PiBwcmltYXJ5S2V5KCkgeyByZXR1cm4gbV9jdXJyZW50UHJpbWFyeUtl
eTsgfQorICAgIHZpcnR1YWwgU3RyaW5nIHZhbHVlKCkgeyBBU1NFUlRfTk9UX1JFQUNIRUQoKTsg
cmV0dXJuIFN0cmluZygpOyB9CisgICAgdmlydHVhbCBpbnQ2NF90IG9iamVjdFN0b3JlRGF0YUlk
KCkgeyBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgcmV0dXJuIDA7IH0KKyAgICB2aXJ0dWFsIGludDY0
X3QgaW5kZXhEYXRhSWQoKSB7IHJldHVybiBtX2N1cnJlbnRJZDsgfQorICAgIHZpcnR1YWwgdm9p
ZCBsb2FkQ3VycmVudFJvdygpOworICAgIHZpcnR1YWwgYm9vbCBjdXJyZW50Um93RXhpc3RzKCk7
CisKK3ByaXZhdGU6CisgICAgUmVmUHRyPElEQktleT4gbV9jdXJyZW50UHJpbWFyeUtleTsKK307
CisKK3ZvaWQgSW5kZXhLZXlDdXJzb3JJbXBsOjpsb2FkQ3VycmVudFJvdygpCit7CisgICAgbV9j
dXJyZW50SWQgPSBtX3F1ZXJ5LmdldENvbHVtbkludDY0KDApOworICAgIG1fY3VycmVudEtleSA9
IGtleUZyb21RdWVyeShtX3F1ZXJ5LCAxKTsKKyAgICBtX2N1cnJlbnRQcmltYXJ5S2V5ID0ga2V5
RnJvbVF1ZXJ5KG1fcXVlcnksIDQpOworfQorCitib29sIEluZGV4S2V5Q3Vyc29ySW1wbDo6Y3Vy
cmVudFJvd0V4aXN0cygpCit7CisgICAgU3RyaW5nIHNxbCA9ICJTRUxFQ1QgaWQgRlJPTSBJbmRl
eERhdGEgV0hFUkUgaWQgPSA/IjsKKyAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50KG1fZGIs
IHNxbCk7CisKKyAgICBib29sIG9rID0gc3RhdGVtZW50LnByZXBhcmUoKSA9PSBTUUxSZXN1bHRP
azsKKyAgICBBU1NFUlRfVU5VU0VEKG9rLCBvayk7CisKKyAgICBzdGF0ZW1lbnQuYmluZEludDY0
KDEsIG1fY3VycmVudElkKTsKKyAgICByZXR1cm4gc3RhdGVtZW50LnN0ZXAoKSA9PSBTUUxSZXN1
bHRSb3c7Cit9CisKK2NsYXNzIEluZGV4Q3Vyc29ySW1wbCA6IHB1YmxpYyBDdXJzb3JJbXBsQ29t
bW9uIHsKK3B1YmxpYzoKKyAgICBJbmRleEN1cnNvckltcGwoU1FMaXRlRGF0YWJhc2UmIHNxbGl0
ZURhdGFiYXNlLCBTdHJpbmcgcXVlcnksIGJvb2wgdW5pcXVlbmVzc0NvbnN0cmFpbnQsIGJvb2wg
aXRlcmF0ZUZvcndhcmQpCisgICAgICAgIDogQ3Vyc29ySW1wbENvbW1vbihzcWxpdGVEYXRhYmFz
ZSwgcXVlcnksIHVuaXF1ZW5lc3NDb25zdHJhaW50LCBpdGVyYXRlRm9yd2FyZCkKKyAgICB7Cisg
ICAgfQorCisgICAgLy8gQ3Vyc29ySW1wbENvbW1vbgorICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJ
REJLZXk+IHByaW1hcnlLZXkoKSB7IHJldHVybiBtX2N1cnJlbnRQcmltYXJ5S2V5OyB9CisgICAg
dmlydHVhbCBTdHJpbmcgdmFsdWUoKSB7IHJldHVybiBtX2N1cnJlbnRWYWx1ZTsgfQorICAgIHZp
cnR1YWwgaW50NjRfdCBvYmplY3RTdG9yZURhdGFJZCgpIHsgQVNTRVJUX05PVF9SRUFDSEVEKCk7
IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBpbnQ2NF90IGluZGV4RGF0YUlkKCkgeyByZXR1cm4g
bV9jdXJyZW50SWQ7IH0KKyAgICB2aXJ0dWFsIHZvaWQgbG9hZEN1cnJlbnRSb3coKTsKKyAgICB2
aXJ0dWFsIGJvb2wgY3VycmVudFJvd0V4aXN0cygpOworCitwcml2YXRlOgorICAgIFJlZlB0cjxJ
REJLZXk+IG1fY3VycmVudFByaW1hcnlLZXk7CisgICAgU3RyaW5nIG1fY3VycmVudFZhbHVlOwor
fTsKKwordm9pZCBJbmRleEN1cnNvckltcGw6OmxvYWRDdXJyZW50Um93KCkKK3sKKyAgICBtX2N1
cnJlbnRJZCA9IG1fcXVlcnkuZ2V0Q29sdW1uSW50NjQoMCk7CisgICAgbV9jdXJyZW50S2V5ID0g
a2V5RnJvbVF1ZXJ5KG1fcXVlcnksIDEpOworICAgIG1fY3VycmVudFZhbHVlID0gbV9xdWVyeS5n
ZXRDb2x1bW5CbG9iQXNTdHJpbmcoNCk7CisgICAgbV9jdXJyZW50UHJpbWFyeUtleSA9IGtleUZy
b21RdWVyeShtX3F1ZXJ5LCA1KTsKK30KKworYm9vbCBJbmRleEN1cnNvckltcGw6OmN1cnJlbnRS
b3dFeGlzdHMoKQoreworICAgIFN0cmluZyBzcWwgPSAiU0VMRUNUIGlkIEZST00gSW5kZXhEYXRh
IFdIRVJFIGlkID0gPyI7CisgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudChtX2RiLCBzcWwp
OworCisgICAgYm9vbCBvayA9IHN0YXRlbWVudC5wcmVwYXJlKCkgPT0gU1FMUmVzdWx0T2s7Cisg
ICAgQVNTRVJUX1VOVVNFRChvaywgb2spOworCisgICAgc3RhdGVtZW50LmJpbmRJbnQ2NCgxLCBt
X2N1cnJlbnRJZCk7CisgICAgcmV0dXJuIHN0YXRlbWVudC5zdGVwKCkgPT0gU1FMUmVzdWx0Um93
OworfQorCit9IC8vIG5hbWVzcGFjZQorCitQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6Q3Vy
c29yPiBJREJTUUxpdGVCYWNraW5nU3RvcmU6Om9wZW5PYmplY3RTdG9yZUN1cnNvcihpbnQ2NF90
IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleVJhbmdlKiByYW5nZSwgSURCQ3Vyc29yOjpEaXJl
Y3Rpb24gZGlyZWN0aW9uKQoreworICAgIGJvb2wgbG93ZXJCb3VuZCA9IHJhbmdlICYmIHJhbmdl
LT5sb3dlcigpOworICAgIGJvb2wgdXBwZXJCb3VuZCA9IHJhbmdlICYmIHJhbmdlLT51cHBlcigp
OworCisgICAgU3RyaW5nIHNxbCA9ICJTRUxFQ1QgaWQsIGtleVN0cmluZywga2V5RGF0ZSwga2V5
TnVtYmVyLCB2YWx1ZSBGUk9NIE9iamVjdFN0b3JlRGF0YSBXSEVSRSAiOworICAgIGlmIChsb3dl
ckJvdW5kKQorICAgICAgICBzcWwgKz0gbG93ZXJDdXJzb3JXaGVyZUZyYWdtZW50KCpyYW5nZS0+
bG93ZXIoKSwgcmFuZ2UtPmxvd2VyT3BlbigpID8gIjwiIDogIjw9Iik7CisgICAgaWYgKHVwcGVy
Qm91bmQpCisgICAgICAgIHNxbCArPSB1cHBlckN1cnNvcldoZXJlRnJhZ21lbnQoKnJhbmdlLT51
cHBlcigpLCByYW5nZS0+dXBwZXJPcGVuKCkgPyAiPCIgOiAiPD0iKTsKKyAgICBzcWwgKz0gIm9i
amVjdFN0b3JlSWQgPSA/IE9SREVSIEJZICI7CisKKyAgICBpZiAoZGlyZWN0aW9uID09IElEQkN1
cnNvcjo6TkVYVCB8fCBkaXJlY3Rpb24gPT0gSURCQ3Vyc29yOjpORVhUX05PX0RVUExJQ0FURSkK
KyAgICAgICAgc3FsICs9ICJrZXlTdHJpbmcsIGtleURhdGUsIGtleU51bWJlciI7CisgICAgZWxz
ZQorICAgICAgICBzcWwgKz0gImtleVN0cmluZyBERVNDLCBrZXlEYXRlIERFU0MsIGtleU51bWJl
ciBERVNDIjsKKworICAgIFJlZlB0cjxPYmplY3RTdG9yZUN1cnNvckltcGw+IGN1cnNvciA9IGFk
b3B0UmVmKG5ldyBPYmplY3RTdG9yZUN1cnNvckltcGwobV9kYiwgc3FsLCBkaXJlY3Rpb24gPT0g
SURCQ3Vyc29yOjpORVhUX05PX0RVUExJQ0FURSB8fCBkaXJlY3Rpb24gPT0gSURCQ3Vyc29yOjpQ
UkVWX05PX0RVUExJQ0FURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9PSBJREJD
dXJzb3I6Ok5FWFRfTk9fRFVQTElDQVRFIHx8IGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFQp
KTsKKworICAgIGJvb2wgb2sgPSBjdXJzb3ItPm1fcXVlcnkucHJlcGFyZSgpID09IFNRTFJlc3Vs
dE9rOworICAgIEFTU0VSVF9VTlVTRUQob2ssIG9rKTsgLy8gRklYTUU6IEJldHRlciBlcnJvciBo
YW5kbGluZz8KKworICAgIGludCBjdXJyZW50Q29sdW1uID0gMTsKKyAgICBpZiAobG93ZXJCb3Vu
ZCkKKyAgICAgICAgY3VycmVudENvbHVtbiArPSBiaW5kS2V5VG9RdWVyeShjdXJzb3ItPm1fcXVl
cnksIGN1cnJlbnRDb2x1bW4sICpyYW5nZS0+bG93ZXIoKSk7CisgICAgaWYgKHVwcGVyQm91bmQp
CisgICAgICAgIGN1cnJlbnRDb2x1bW4gKz0gYmluZEtleVRvUXVlcnkoY3Vyc29yLT5tX3F1ZXJ5
LCBjdXJyZW50Q29sdW1uLCAqcmFuZ2UtPnVwcGVyKCkpOworICAgIGN1cnNvci0+bV9xdWVyeS5i
aW5kSW50NjQoY3VycmVudENvbHVtbiwgb2JqZWN0U3RvcmVJZCk7CisKKyAgICBpZiAoY3Vyc29y
LT5tX3F1ZXJ5LnN0ZXAoKSAhPSBTUUxSZXN1bHRSb3cpCisgICAgICAgIHJldHVybiAwOworCisg
ICAgY3Vyc29yLT5sb2FkQ3VycmVudFJvdygpOworICAgIHJldHVybiBjdXJzb3IucmVsZWFzZSgp
OworfQorCitQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yPiBJREJTUUxpdGVCYWNr
aW5nU3RvcmU6Om9wZW5JbmRleEtleUN1cnNvcihpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktl
eVJhbmdlKiByYW5nZSwgSURCQ3Vyc29yOjpEaXJlY3Rpb24gZGlyZWN0aW9uKQoreworICAgIFN0
cmluZyBzcWwgPSBTdHJpbmcoIlNFTEVDVCBJbmRleERhdGEuaWQsIEluZGV4RGF0YS5rZXlTdHJp
bmcsIEluZGV4RGF0YS5rZXlEYXRlLCBJbmRleERhdGEua2V5TnVtYmVyLCAiKQorICAgICAgICAg
ICAgICAgICArICgiT2JqZWN0U3RvcmVEYXRhLmtleVN0cmluZywgT2JqZWN0U3RvcmVEYXRhLmtl
eURhdGUsIE9iamVjdFN0b3JlRGF0YS5rZXlOdW1iZXIgIikKKyAgICAgICAgICAgICAgICAgKyAi
RlJPTSBJbmRleERhdGEgSU5ORVIgSk9JTiBPYmplY3RTdG9yZURhdGEgT04gSW5kZXhEYXRhLm9i
amVjdFN0b3JlRGF0YUlkID0gT2JqZWN0U3RvcmVEYXRhLmlkIFdIRVJFICI7CisKKyAgICBib29s
IGxvd2VyQm91bmQgPSByYW5nZSAmJiByYW5nZS0+bG93ZXIoKTsKKyAgICBib29sIHVwcGVyQm91
bmQgPSByYW5nZSAmJiByYW5nZS0+dXBwZXIoKTsKKworICAgIGlmIChsb3dlckJvdW5kKQorICAg
ICAgICBzcWwgKz0gbG93ZXJDdXJzb3JXaGVyZUZyYWdtZW50KCpyYW5nZS0+bG93ZXIoKSwgcmFu
Z2UtPmxvd2VyT3BlbigpID8gIjwiIDogIjw9IiwgIkluZGV4RGF0YS4iKTsKKyAgICBpZiAodXBw
ZXJCb3VuZCkKKyAgICAgICAgc3FsICs9IHVwcGVyQ3Vyc29yV2hlcmVGcmFnbWVudCgqcmFuZ2Ut
PnVwcGVyKCksIHJhbmdlLT51cHBlck9wZW4oKSA/ICI8IiA6ICI8PSIsICJJbmRleERhdGEuIik7
CisgICAgc3FsICs9ICJJbmRleERhdGEuaW5kZXhJZCA9ID8gT1JERVIgQlkgIjsKKworICAgIGlm
IChkaXJlY3Rpb24gPT0gSURCQ3Vyc29yOjpORVhUIHx8IGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6
Ok5FWFRfTk9fRFVQTElDQVRFKQorICAgICAgICBzcWwgKz0gIkluZGV4RGF0YS5rZXlTdHJpbmcs
IEluZGV4RGF0YS5rZXlEYXRlLCBJbmRleERhdGEua2V5TnVtYmVyLCBJbmRleERhdGEuaWQiOwor
ICAgIGVsc2UKKyAgICAgICAgc3FsICs9ICJJbmRleERhdGEua2V5U3RyaW5nIERFU0MsIEluZGV4
RGF0YS5rZXlEYXRlIERFU0MsIEluZGV4RGF0YS5rZXlOdW1iZXIgREVTQywgSW5kZXhEYXRhLmlk
IERFU0MiOworCisgICAgUmVmUHRyPEluZGV4S2V5Q3Vyc29ySW1wbD4gY3Vyc29yID0gYWRvcHRS
ZWYobmV3IEluZGV4S2V5Q3Vyc29ySW1wbChtX2RiLCBzcWwsIGRpcmVjdGlvbiA9PSBJREJDdXJz
b3I6Ok5FWFRfTk9fRFVQTElDQVRFIHx8IGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6OlBSRVZfTk9f
RFVQTElDQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID09IElEQkN1cnNvcjo6TkVYVF9O
T19EVVBMSUNBVEUgfHwgZGlyZWN0aW9uID09IElEQkN1cnNvcjo6TkVYVCkpOworCisgICAgYm9v
bCBvayA9IGN1cnNvci0+bV9xdWVyeS5wcmVwYXJlKCkgPT0gU1FMUmVzdWx0T2s7CisgICAgQVNT
RVJUX1VOVVNFRChvaywgb2spOyAvLyBGSVhNRTogQmV0dGVyIGVycm9yIGhhbmRsaW5nPworCisg
ICAgaW50IGluZGV4Q29sdW1uID0gMTsKKyAgICBpZiAobG93ZXJCb3VuZCkKKyAgICAgICAgaW5k
ZXhDb2x1bW4gKz0gYmluZEtleVRvUXVlcnkoY3Vyc29yLT5tX3F1ZXJ5LCBpbmRleENvbHVtbiwg
KnJhbmdlLT5sb3dlcigpKTsKKyAgICBpZiAodXBwZXJCb3VuZCkKKyAgICAgICAgaW5kZXhDb2x1
bW4gKz0gYmluZEtleVRvUXVlcnkoY3Vyc29yLT5tX3F1ZXJ5LCBpbmRleENvbHVtbiwgKnJhbmdl
LT51cHBlcigpKTsKKyAgICBjdXJzb3ItPm1fcXVlcnkuYmluZEludDY0KGluZGV4Q29sdW1uLCBp
bmRleElkKTsKKworICAgIGlmIChjdXJzb3ItPm1fcXVlcnkuc3RlcCgpICE9IFNRTFJlc3VsdFJv
dykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjdXJzb3ItPmxvYWRDdXJyZW50Um93KCk7Cisg
ICAgcmV0dXJuIGN1cnNvci5yZWxlYXNlKCk7Cit9CisKK1Bhc3NSZWZQdHI8SURCQmFja2luZ1N0
b3JlOjpDdXJzb3I+IElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6b3BlbkluZGV4Q3Vyc29yKGludDY0
X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5UmFuZ2UqIHJhbmdlLCBJREJDdXJzb3I6OkRpcmVjdGlv
biBkaXJlY3Rpb24pCit7CisgICAgU3RyaW5nIHNxbCA9IFN0cmluZygiU0VMRUNUIEluZGV4RGF0
YS5pZCwgSW5kZXhEYXRhLmtleVN0cmluZywgSW5kZXhEYXRhLmtleURhdGUsIEluZGV4RGF0YS5r
ZXlOdW1iZXIsICIpCisgICAgICAgICAgICAgICAgICsgKCJPYmplY3RTdG9yZURhdGEudmFsdWUs
IE9iamVjdFN0b3JlRGF0YS5rZXlTdHJpbmcsIE9iamVjdFN0b3JlRGF0YS5rZXlEYXRlLCBPYmpl
Y3RTdG9yZURhdGEua2V5TnVtYmVyICIpCisgICAgICAgICAgICAgICAgICsgIkZST00gSW5kZXhE
YXRhIElOTkVSIEpPSU4gT2JqZWN0U3RvcmVEYXRhIE9OIEluZGV4RGF0YS5vYmplY3RTdG9yZURh
dGFJZCA9IE9iamVjdFN0b3JlRGF0YS5pZCBXSEVSRSAiOworCisgICAgYm9vbCBsb3dlckJvdW5k
ID0gcmFuZ2UgJiYgcmFuZ2UtPmxvd2VyKCk7CisgICAgYm9vbCB1cHBlckJvdW5kID0gcmFuZ2Ug
JiYgcmFuZ2UtPnVwcGVyKCk7CisKKyAgICBpZiAobG93ZXJCb3VuZCkKKyAgICAgICAgc3FsICs9
IGxvd2VyQ3Vyc29yV2hlcmVGcmFnbWVudCgqcmFuZ2UtPmxvd2VyKCksIHJhbmdlLT5sb3dlck9w
ZW4oKSA/ICI8IiA6ICI8PSIsICJJbmRleERhdGEuIik7CisgICAgaWYgKHVwcGVyQm91bmQpCisg
ICAgICAgIHNxbCArPSB1cHBlckN1cnNvcldoZXJlRnJhZ21lbnQoKnJhbmdlLT51cHBlcigpLCBy
YW5nZS0+dXBwZXJPcGVuKCkgPyAiPCIgOiAiPD0iLCAiSW5kZXhEYXRhLiIpOworICAgIHNxbCAr
PSAiSW5kZXhEYXRhLmluZGV4SWQgPSA/IE9SREVSIEJZICI7CisKKyAgICBpZiAoZGlyZWN0aW9u
ID09IElEQkN1cnNvcjo6TkVYVCB8fCBkaXJlY3Rpb24gPT0gSURCQ3Vyc29yOjpORVhUX05PX0RV
UExJQ0FURSkKKyAgICAgICAgc3FsICs9ICJJbmRleERhdGEua2V5U3RyaW5nLCBJbmRleERhdGEu
a2V5RGF0ZSwgSW5kZXhEYXRhLmtleU51bWJlciwgSW5kZXhEYXRhLmlkIjsKKyAgICBlbHNlCisg
ICAgICAgIHNxbCArPSAiSW5kZXhEYXRhLmtleVN0cmluZyBERVNDLCBJbmRleERhdGEua2V5RGF0
ZSBERVNDLCBJbmRleERhdGEua2V5TnVtYmVyIERFU0MsIEluZGV4RGF0YS5pZCBERVNDIjsKKwor
ICAgIFJlZlB0cjxJbmRleEN1cnNvckltcGw+IGN1cnNvciA9IGFkb3B0UmVmKG5ldyBJbmRleEN1
cnNvckltcGwobV9kYiwgc3FsLCBkaXJlY3Rpb24gPT0gSURCQ3Vyc29yOjpORVhUX05PX0RVUExJ
Q0FURSB8fCBkaXJlY3Rpb24gPT0gSURCQ3Vyc29yOjpQUkVWX05PX0RVUExJQ0FURSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFRfTk9fRFVQTElDQVRFIHx8IGRpcmVjdGlv
biA9PSBJREJDdXJzb3I6Ok5FWFQpKTsKKworICAgIGJvb2wgb2sgPSBjdXJzb3ItPm1fcXVlcnku
cHJlcGFyZSgpID09IFNRTFJlc3VsdE9rOworICAgIEFTU0VSVF9VTlVTRUQob2ssIG9rKTsgLy8g
RklYTUU6IEJldHRlciBlcnJvciBoYW5kbGluZz8KKworICAgIGludCBpbmRleENvbHVtbiA9IDE7
CisgICAgaWYgKGxvd2VyQm91bmQpCisgICAgICAgIGluZGV4Q29sdW1uICs9IGJpbmRLZXlUb1F1
ZXJ5KGN1cnNvci0+bV9xdWVyeSwgaW5kZXhDb2x1bW4sICpyYW5nZS0+bG93ZXIoKSk7CisgICAg
aWYgKHVwcGVyQm91bmQpCisgICAgICAgIGluZGV4Q29sdW1uICs9IGJpbmRLZXlUb1F1ZXJ5KGN1
cnNvci0+bV9xdWVyeSwgaW5kZXhDb2x1bW4sICpyYW5nZS0+dXBwZXIoKSk7CisgICAgY3Vyc29y
LT5tX3F1ZXJ5LmJpbmRJbnQ2NChpbmRleENvbHVtbiwgaW5kZXhJZCk7CisKKyAgICBpZiAoY3Vy
c29yLT5tX3F1ZXJ5LnN0ZXAoKSAhPSBTUUxSZXN1bHRSb3cpCisgICAgICAgIHJldHVybiAwOwor
CisgICAgY3Vyc29yLT5sb2FkQ3VycmVudFJvdygpOworICAgIHJldHVybiBjdXJzb3IucmVsZWFz
ZSgpOworfQorCituYW1lc3BhY2UgeworCitjbGFzcyBUcmFuc2FjdGlvbkltcGwgOiBwdWJsaWMg
SURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbiB7CitwdWJsaWM6CisgICAgVHJhbnNhY3Rpb25J
bXBsKFNRTGl0ZURhdGFiYXNlJiBkYikKKyAgICAgICAgOiBtX3RyYW5zYWN0aW9uKGRiKQorICAg
IHsKKyAgICB9CisKKyAgICAvLyBJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uCisgICAgdmly
dHVhbCB2b2lkIGJlZ2luKCkgeyBtX3RyYW5zYWN0aW9uLmJlZ2luKCk7IH0KKyAgICB2aXJ0dWFs
IHZvaWQgY29tbWl0KCkgeyBtX3RyYW5zYWN0aW9uLmNvbW1pdCgpOyB9CisgICAgdmlydHVhbCB2
b2lkIHJvbGxiYWNrKCkgeyBtX3RyYW5zYWN0aW9uLnJvbGxiYWNrKCk7IH0KKworcHJpdmF0ZToK
KyAgICBTUUxpdGVUcmFuc2FjdGlvbiBtX3RyYW5zYWN0aW9uOworfTsKKworfSAvLyBuYW1lc3Bh
Y2UKKworUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uPiBJREJTUUxpdGVC
YWNraW5nU3RvcmU6OmNyZWF0ZVRyYW5zYWN0aW9uKCkKK3sKKyAgICByZXR1cm4gYWRvcHRSZWYo
bmV3IFRyYW5zYWN0aW9uSW1wbChtX2RiKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
KworI2VuZGlmIC8vIEVOQUJMRShJTkRFWEVEX0RBVEFCQVNFKQpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvc3RvcmFnZS9JREJTUUxpdGVCYWNraW5nU3RvcmUuaCBiL1NvdXJjZS9XZWJDb3Jl
L3N0b3JhZ2UvSURCU1FMaXRlQmFja2luZ1N0b3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMC4uZmUwYzZjMQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3N0
b3JhZ2UvSURCU1FMaXRlQmFja2luZ1N0b3JlLmgKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5E
IElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisg
KiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBP
UiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
Zm5kZWYgSURCU1FMaXRlQmFja2luZ1N0b3JlX2gKKyNkZWZpbmUgSURCU1FMaXRlQmFja2luZ1N0
b3JlX2gKKworI2lmIEVOQUJMRShJTkRFWEVEX0RBVEFCQVNFKQorCisjaW5jbHVkZSAiSURCQmFj
a2luZ1N0b3JlLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgSURCU1FMaXRlQmFj
a2luZ1N0b3JlIDogcHVibGljIElEQkJhY2tpbmdTdG9yZSB7CitwdWJsaWM6CisgICAgc3RhdGlj
IFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlPiBvcGVuKFNlY3VyaXR5T3JpZ2luKiwgY29uc3Qg
U3RyaW5nJiBwYXRoQmFzZSwgaW50NjRfdCBtYXhpbXVtU2l6ZSwgY29uc3QgU3RyaW5nJiBmaWxl
SWRlbnRpZmllciwgSURCRmFjdG9yeUJhY2tlbmRJbXBsKik7CisgICAgdmlydHVhbCB+SURCU1FM
aXRlQmFja2luZ1N0b3JlKCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgZXh0cmFjdElEQkRhdGFiYXNl
TWV0YURhdGEoY29uc3QgU3RyaW5nJiBuYW1lLCBTdHJpbmcmIGZvdW5kVmVyc2lvbiwgaW50NjRf
dCYgZm91bmRJZCk7CisgICAgdmlydHVhbCBib29sIHNldElEQkRhdGFiYXNlTWV0YURhdGEoY29u
c3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHZlcnNpb24sIGludDY0X3QmIHJvd0lkLCBi
b29sIGludmFsaWRSb3dJZCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0T2JqZWN0U3RvcmVzKGlu
dDY0X3QgZGF0YWJhc2VJZCwgVmVjdG9yPGludDY0X3Q+JiBmb3VuZElkcywgVmVjdG9yPFN0cmlu
Zz4mIGZvdW5kTmFtZXMsIFZlY3RvcjxTdHJpbmc+JiBmb3VuZEtleVBhdGhzLCBWZWN0b3I8Ym9v
bD4mIGZvdW5kQXV0b0luY3JlbWVudEZsYWdzKTsKKyAgICB2aXJ0dWFsIGJvb2wgY3JlYXRlT2Jq
ZWN0U3RvcmUoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wg
YXV0b0luY3JlbWVudCwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90JiBhc3NpZ25lZE9iamVj
dFN0b3JlSWQpOworICAgIHZpcnR1YWwgdm9pZCBkZWxldGVPYmplY3RTdG9yZShpbnQ2NF90IG9i
amVjdFN0b3JlSWQpOworICAgIHZpcnR1YWwgU3RyaW5nIGdldE9iamVjdFN0b3JlUmVjb3JkKGlu
dDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5Jik7CisgICAgdmlydHVhbCBib29sIHB1
dE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5Jiwg
Y29uc3QgU3RyaW5nJiB2YWx1ZSwgaW50NjRfdCYgcm93SWQsIGJvb2wgaW52YWxpZFJvd0lkKTsK
KyAgICB2aXJ0dWFsIHZvaWQgY2xlYXJPYmplY3RTdG9yZShpbnQ2NF90IG9iamVjdFN0b3JlSWQp
OworICAgIHZpcnR1YWwgdm9pZCBkZWxldGVPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IG9iamVj
dFN0b3JlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQpOworICAgIHZpcnR1YWwgZG91Ymxl
IG5leHRBdXRvSW5jcmVtZW50TnVtYmVyKGludDY0X3Qgb2JqZWN0U3RvcmVJZCk7CisgICAgdmly
dHVhbCBib29sIGtleUV4aXN0c0luT2JqZWN0U3RvcmUoaW50NjRfdCBvYmplY3RTdG9yZUlkLCBj
b25zdCBJREJLZXkmLCBpbnQ2NF90JiBmb3VuZE9iamVjdFN0b3JlRGF0YUlkKTsKKworICAgIHZp
cnR1YWwgYm9vbCBmb3JFYWNoT2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBvYmplY3RTdG9yZUlk
LCBPYmplY3RTdG9yZVJlY29yZENhbGxiYWNrJik7CisKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0SW5k
ZXhlcyhpbnQ2NF90IG9iamVjdFN0b3JlSWQsIFZlY3RvcjxpbnQ2NF90PiYgZm91bmRJZHMsIFZl
Y3RvcjxTdHJpbmc+JiBmb3VuZE5hbWVzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmRLZXlQYXRocywg
VmVjdG9yPGJvb2w+JiBmb3VuZFVuaXF1ZUZsYWdzKTsKKyAgICB2aXJ0dWFsIGJvb2wgY3JlYXRl
SW5kZXgoaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0
cmluZyYga2V5UGF0aCwgYm9vbCBpc1VuaXF1ZSwgaW50NjRfdCYgaW5kZXhJZCk7CisgICAgdmly
dHVhbCB2b2lkIGRlbGV0ZUluZGV4KGludDY0X3QgaW5kZXhJZCk7CisgICAgdmlydHVhbCBib29s
IHB1dEluZGV4RGF0YUZvclJlY29yZChpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYsIGlu
dDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQpOworICAgIHZpcnR1YWwgYm9vbCBkZWxldGVJbmRleERh
dGFGb3JSZWNvcmQoaW50NjRfdCBvYmplY3RTdG9yZURhdGFJZCk7CisgICAgdmlydHVhbCBTdHJp
bmcgZ2V0T2JqZWN0VmlhSW5kZXgoaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmKTsKKyAg
ICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCS2V5PiBnZXRQcmltYXJ5S2V5VmlhSW5kZXgoaW50NjRf
dCBpbmRleElkLCBjb25zdCBJREJLZXkmKTsKKyAgICB2aXJ0dWFsIGJvb2wga2V5RXhpc3RzSW5J
bmRleChpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYpOworCisgICAgdmlydHVhbCBQYXNz
UmVmUHRyPEN1cnNvcj4gb3Blbk9iamVjdFN0b3JlQ3Vyc29yKGludDY0X3Qgb2JqZWN0U3RvcmVJ
ZCwgY29uc3QgSURCS2V5UmFuZ2UqLCBJREJDdXJzb3I6OkRpcmVjdGlvbik7CisgICAgdmlydHVh
bCBQYXNzUmVmUHRyPEN1cnNvcj4gb3BlbkluZGV4S2V5Q3Vyc29yKGludDY0X3QgaW5kZXhJZCwg
Y29uc3QgSURCS2V5UmFuZ2UqLCBJREJDdXJzb3I6OkRpcmVjdGlvbik7CisgICAgdmlydHVhbCBQ
YXNzUmVmUHRyPEN1cnNvcj4gb3BlbkluZGV4Q3Vyc29yKGludDY0X3QgaW5kZXhJZCwgY29uc3Qg
SURCS2V5UmFuZ2UqLCBJREJDdXJzb3I6OkRpcmVjdGlvbik7CisKKyAgICB2aXJ0dWFsIFBhc3NS
ZWZQdHI8VHJhbnNhY3Rpb24+IGNyZWF0ZVRyYW5zYWN0aW9uKCk7CisKK3ByaXZhdGU6CisgICAg
SURCU1FMaXRlQmFja2luZ1N0b3JlKFN0cmluZyBpZGVudGlmaWVyLCBJREJGYWN0b3J5QmFja2Vu
ZEltcGwqKTsKKworICAgIFNRTGl0ZURhdGFiYXNlIG1fZGI7CisgICAgU3RyaW5nIG1faWRlbnRp
ZmllcjsKKyAgICBSZWZQdHI8SURCRmFjdG9yeUJhY2tlbmRJbXBsPiBtX2ZhY3Rvcnk7Cit9Owor
Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZgorCisjZW5kaWYgLy8gSURCU1FMaXRl
QmFja2luZ1N0b3JlX2gK
</data>
<flag name="review"
          id="77272"
          type_id="1"
          status="+"
          setter="jorlow"
    />
          </attachment>
      

    </bug>

</bugzilla>