<?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>101486</bug_id>
          
          <creation_ts>2012-11-07 10:30:44 -0800</creation_ts>
          <short_desc>IndexedDB: Prepare for IDBBackingStore merge by renaming IDBLevelDBBackingStore.cpp</short_desc>
          <delta_ts>2012-11-07 17:17:27 -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>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>101488</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Alec Flett">alecflett</reporter>
          <assigned_to name="Alec Flett">alecflett</assigned_to>
          <cc>dgrogan</cc>
    
    <cc>gyuyoung.kim</cc>
    
    <cc>jsbell</cc>
    
    <cc>ojan</cc>
    
    <cc>rakuco</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>760841</commentid>
    <comment_count>0</comment_count>
    <who name="Alec Flett">alecflett</who>
    <bug_when>2012-11-07 10:30:44 -0800</bug_when>
    <thetext>IndexedDB: Prepare for IDBBackingStore merge by renaming IDBLevelDBBackingStore.cpp</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>760845</commentid>
    <comment_count>1</comment_count>
      <attachid>172832</attachid>
    <who name="Alec Flett">alecflett</who>
    <bug_when>2012-11-07 10:32:33 -0800</bug_when>
    <thetext>Created attachment 172832
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>760847</commentid>
    <comment_count>2</comment_count>
    <who name="Alec Flett">alecflett</who>
    <bug_when>2012-11-07 10:33:23 -0800</bug_when>
    <thetext>jsbell/dgrogan, here&apos;s the first patch which is purely a file rename.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>760856</commentid>
    <comment_count>3</comment_count>
      <attachid>172832</attachid>
    <who name="Joshua Bell">jsbell</who>
    <bug_when>2012-11-07 10:39:04 -0800</bug_when>
    <thetext>Comment on attachment 172832
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=172832&amp;action=review

&gt; Source/WebCore/ChangeLog:18
&gt; +        (WebCore):

Remove these (...): lines, they&apos;re not providing any benefit.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>760925</commentid>
    <comment_count>4</comment_count>
      <attachid>172848</attachid>
    <who name="Alec Flett">alecflett</who>
    <bug_when>2012-11-07 11:34:00 -0800</bug_when>
    <thetext>Created attachment 172848
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>761013</commentid>
    <comment_count>5</comment_count>
    <who name="Alec Flett">alecflett</who>
    <bug_when>2012-11-07 13:25:23 -0800</bug_when>
    <thetext>ojan@ - mind a quick review? This is basically just a file rename. (at least I&apos;m hoping the commit queue / svn sees it that way!)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>761192</commentid>
    <comment_count>6</comment_count>
      <attachid>172848</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-11-07 17:17:23 -0800</bug_when>
    <thetext>Comment on attachment 172848
Patch

Clearing flags on attachment: 172848

Committed r133825: &lt;http://trac.webkit.org/changeset/133825&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>761193</commentid>
    <comment_count>7</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-11-07 17:17:27 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>172832</attachid>
            <date>2012-11-07 10:32:33 -0800</date>
            <delta_ts>2012-11-07 11:33:57 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-101486-20121107103044.patch</filename>
            <type>text/plain</type>
            <size>163593</size>
            <attacher name="Alec Flett">alecflett</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTMzNjUwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggYmY5ZTEzZDU2ZGE2ZTdh
ZjU5ZTk4ZGIzM2YxNzcyMGE3ZDJmYWJkZS4uOWNkNzE1ZWEzYWNiNWU5NjVmNDdlZGVkNjk4YWI4
NTc1YjhmNDM1NSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDkxIEBACisyMDEyLTExLTA3ICBBbGVj
IEZsZXR0ICA8YWxlY2ZsZXR0QGNocm9taXVtLm9yZz4KKworICAgICAgICBJbmRleGVkREI6IFBy
ZXBhcmUgZm9yIElEQkJhY2tpbmdTdG9yZSBtZXJnZSBieSByZW5hbWluZyBJREJMZXZlbERCQmFj
a2luZ1N0b3JlLmNwcAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MTAxNDg2CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgUmVuYW1lIElEQkxldmVsREJCYWNraW5nU3RvcmUuY3BwIHRvIElEQkJhY2tpbmdTdG9y
ZS5jcHAgaW4KKyAgICAgICAgcHJlcGFyYXRpb24gZm9yIG1lcmdpbmcgdGhlc2UgY2xhc3Nlcy4g
VGhpcyB3aWxsIG1ha2UgdGhlIG1lcmdlCisgICAgICAgIGRpZmZzIHNhbmUuIFNlZSBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTAxNDE1CisgICAgICAgIGZvciB0aGUg
ZmluYWwgZ29hbC4KKworICAgICAgICBObyBuZXcgdGVzdHMsIHRoaXMgaXMgaXMganVzdCBhIHJl
bmFtZSBhbmQgbWlub3Igc3R5bGUgZml4LgorCisgICAgICAgICogQ01ha2VMaXN0cy50eHQ6Cisg
ICAgICAgICogR05VbWFrZWZpbGUubGlzdC5hbToKKyAgICAgICAgKiBNb2R1bGVzL2luZGV4ZWRk
Yi9JREJCYWNraW5nU3RvcmUuY3BwOiBSZW5hbWVkIGZyb20gU291cmNlL1dlYkNvcmUvTW9kdWxl
cy9pbmRleGVkZGIvSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5jcHAuCisgICAgICAgIChXZWJDb3Jl
KToKKyAgICAgICAgKFdlYkNvcmU6OnJlY29yZEludGVybmFsRXJyb3IpOgorICAgICAgICAoV2Vi
Q29yZTo6Z2V0Qm9vbCk6CisgICAgICAgIChXZWJDb3JlOjpwdXRCb29sKToKKyAgICAgICAgKFdl
YkNvcmU6OmdldEludCk6CisgICAgICAgIChXZWJDb3JlOjpwdXRJbnQpOgorICAgICAgICAoV2Vi
Q29yZTo6Z2V0VmFySW50KToKKyAgICAgICAgKFdlYkNvcmU6OnB1dFZhckludCk6CisgICAgICAg
IChXZWJDb3JlOjpnZXRTdHJpbmcpOgorICAgICAgICAoV2ViQ29yZTo6cHV0U3RyaW5nKToKKyAg
ICAgICAgKFdlYkNvcmU6OnB1dElEQktleVBhdGgpOgorICAgICAgICAoV2ViQ29yZTo6Y29tcGFy
ZUtleXMpOgorICAgICAgICAoV2ViQ29yZTo6Y29tcGFyZUluZGV4S2V5cyk6CisgICAgICAgIChD
b21wYXJhdG9yKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBhcmF0b3I6OmNvbXBhcmUpOgorICAg
ICAgICAoV2ViQ29yZTo6Q29tcGFyYXRvcjo6bmFtZSk6CisgICAgICAgIChXZWJDb3JlOjppc1Nj
aGVtYUtub3duKToKKyAgICAgICAgKFdlYkNvcmU6OnNldFVwTWV0YWRhdGEpOgorICAgICAgICAo
V2ViQ29yZTo6Z2V0TWF4T2JqZWN0U3RvcmVJZCk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZl
bERCQmFja2luZ1N0b3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlKToKKyAgICAgICAgKFdlYkNv
cmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6On5JREJMZXZlbERCQmFja2luZ1N0b3JlKToKKyAg
ICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW4pOgorICAgICAgICAo
V2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0RGF0YWJhc2VOYW1lcyk6CisgICAg
ICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRJREJEYXRhYmFzZU1ldGFE
YXRhKToKKyAgICAgICAgKFdlYkNvcmU6OmdldE5ld0RhdGFiYXNlSWQpOgorICAgICAgICAoV2Vi
Q29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Y3JlYXRlSURCRGF0YWJhc2VNZXRhRGF0YSk6
CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjp1cGRhdGVJREJEYXRh
YmFzZUludFZlcnNpb24pOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9y
ZTo6dXBkYXRlSURCRGF0YWJhc2VNZXRhRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpkZWxldGVS
YW5nZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpkZWxldGVE
YXRhYmFzZSk6CisgICAgICAgIChXZWJDb3JlOjpjaGVja09iamVjdFN0b3JlQW5kTWV0YURhdGFU
eXBlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldE9iamVj
dFN0b3Jlcyk6CisgICAgICAgIChXZWJDb3JlOjpzZXRNYXhPYmplY3RTdG9yZUlkKToKKyAgICAg
ICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmNyZWF0ZU9iamVjdFN0b3JlKToK
KyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmRlbGV0ZU9iamVjdFN0
b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldE9iamVj
dFN0b3JlUmVjb3JkKToKKyAgICAgICAgKFdlYkNvcmU6OmdldE5ld1ZlcnNpb25OdW1iZXIpOgor
ICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6cHV0T2JqZWN0U3RvcmVS
ZWNvcmQpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Y2xlYXJP
YmplY3RTdG9yZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpj
cmVhdGVJbnZhbGlkUmVjb3JkSWRlbnRpZmllcik6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZl
bERCQmFja2luZ1N0b3JlOjpkZWxldGVPYmplY3RTdG9yZVJlY29yZCk6CisgICAgICAgIChXZWJD
b3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRLZXlHZW5lcmF0b3JDdXJyZW50TnVtYmVy
KToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6Om1heWJlVXBkYXRl
S2V5R2VuZXJhdG9yQ3VycmVudE51bWJlcik6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERC
QmFja2luZ1N0b3JlOjprZXlFeGlzdHNJbk9iamVjdFN0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6
OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmZvckVhY2hPYmplY3RTdG9yZVJlY29yZCk6CisgICAg
ICAgIChXZWJDb3JlOjpjaGVja0luZGV4QW5kTWV0YURhdGFLZXkpOgorICAgICAgICAoV2ViQ29y
ZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0SW5kZXhlcyk6CisgICAgICAgIChXZWJDb3Jl
OjpzZXRNYXhJbmRleElkKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3Rv
cmU6OmNyZWF0ZUluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3Rv
cmU6OmRlbGV0ZUluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3Rv
cmU6OnB1dEluZGV4RGF0YUZvclJlY29yZCk6CisgICAgICAgIChXZWJDb3JlOjpmaW5kR3JlYXRl
c3RLZXlMZXNzVGhhbk9yRXF1YWwpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tp
bmdTdG9yZTo6ZGVsZXRlSW5kZXhEYXRhRm9yUmVjb3JkKToKKyAgICAgICAgKFdlYkNvcmU6OnZl
cnNpb25FeGlzdHMpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6
ZmluZEtleUluSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9y
ZTo6Z2V0UHJpbWFyeUtleVZpYUluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJC
YWNraW5nU3RvcmU6OmtleUV4aXN0c0luSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2
ZWxEQkJhY2tpbmdTdG9yZTo6b3Blbk9iamVjdFN0b3JlQ3Vyc29yKToKKyAgICAgICAgKFdlYkNv
cmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5PYmplY3RTdG9yZUtleUN1cnNvcik6Cisg
ICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpvcGVuSW5kZXhLZXlDdXJz
b3IpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3BlbkluZGV4
Q3Vyc29yKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmNyZWF0
ZVRyYW5zYWN0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6
OlRyYW5zYWN0aW9uOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tp
bmdTdG9yZTo6VHJhbnNhY3Rpb246OlRyYW5zYWN0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OklE
QkxldmVsREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uOjpiZWdpbik6CisgICAgICAgIChXZWJD
b3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbjo6Y29tbWl0KToKKyAgICAg
ICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uOjpyb2xsYmFj
ayk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpiYWNraW5nU3Rv
cmVFeGlzdHMpOgorICAgICAgICAqIFdlYkNvcmUuZ3lwaToKKyAgICAgICAgKiBXZWJDb3JlLnhj
b2RlcHJvai9wcm9qZWN0LnBieHByb2o6CisKIDIwMTItMTEtMDYgIFNoZXJpZmYgQm90ICA8d2Vi
a2l0LnJldmlldy5ib3RAZ21haWwuY29tPgogCiAgICAgICAgIFVucmV2aWV3ZWQsIHJvbGxpbmcg
b3V0IHIxMzM1MjkgYW5kIHIxMzM1NjIuCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9DTWFr
ZUxpc3RzLnR4dCBiL1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0CmluZGV4IDAzYjAzYjEx
NDAwMGUxMWE0MWIxMmU5ZDFlZWQ2ZThjZGUwNDQzMDMuLjM0MzRmOWZlNmEzN2Q4YzE2NDk3OGNm
YmRhZWZkYTBhZWVmNTZiYTIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMu
dHh0CisrKyBiL1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0CkBAIC04MjYsNyArODI2LDcg
QEAgU0VUKFdlYkNvcmVfU09VUkNFUwogICAgIE1vZHVsZXMvaW5kZXhlZGRiL0lEQktleS5jcHAK
ICAgICBNb2R1bGVzL2luZGV4ZWRkYi9JREJLZXlSYW5nZS5jcHAKICAgICBNb2R1bGVzL2luZGV4
ZWRkYi9JREJLZXlQYXRoLmNwcAotICAgIE1vZHVsZXMvaW5kZXhlZGRiL0lEQkxldmVsREJCYWNr
aW5nU3RvcmUuY3BwCisgICAgTW9kdWxlcy9pbmRleGVkZGIvSURCQmFja2luZ1N0b3JlLmNwcAog
ICAgIE1vZHVsZXMvaW5kZXhlZGRiL0lEQkxldmVsREJDb2RpbmcuY3BwCiAgICAgTW9kdWxlcy9p
bmRleGVkZGIvSURCT2JqZWN0U3RvcmUuY3BwCiAgICAgTW9kdWxlcy9pbmRleGVkZGIvSURCT2Jq
ZWN0U3RvcmVCYWNrZW5kSW1wbC5jcHAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0dOVW1h
a2VmaWxlLmxpc3QuYW0gYi9Tb3VyY2UvV2ViQ29yZS9HTlVtYWtlZmlsZS5saXN0LmFtCmluZGV4
IGYwMDkwNDAzMWJmOGNiNTY3NDVmNWRmMWFhZTk0ZjFiNjQwMzExMjMuLjk0MTNjNzBlYTQxMjUz
YmVkY2IyN2FiNzAzMWViNGM2Njk1YzNiNzggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0dO
VW1ha2VmaWxlLmxpc3QuYW0KKysrIGIvU291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUubGlzdC5h
bQpAQCAtMTg3Miw3ICsxODcyLDcgQEAgd2ViY29yZV9tb2R1bGVzX3NvdXJjZXMgKz0gXAogCVNv
dXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL0lEQktleVBhdGguaCBcCiAJU291cmNlL1dl
YkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvSURCS2V5UmFuZ2UuY3BwIFwKIAlTb3VyY2UvV2ViQ29y
ZS9Nb2R1bGVzL2luZGV4ZWRkYi9JREJLZXlSYW5nZS5oIFwKLQlTb3VyY2UvV2ViQ29yZS9Nb2R1
bGVzL2luZGV4ZWRkYi9JREJMZXZlbERCQmFja2luZ1N0b3JlLmNwcCBcCisJU291cmNlL1dlYkNv
cmUvTW9kdWxlcy9pbmRleGVkZGIvSURCQmFja2luZ1N0b3JlLmNwcCBcCiAJU291cmNlL1dlYkNv
cmUvTW9kdWxlcy9pbmRleGVkZGIvSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5oIFwKIAlTb3VyY2Uv
V2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9JREJMZXZlbERCQ29kaW5nLmNwcCBcCiAJU291cmNl
L1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvSURCTGV2ZWxEQkNvZGluZy5oIFwKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL0lEQkJhY2tpbmdTdG9yZS5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9JREJCYWNraW5nU3RvcmUuY3BwCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAuLjZmZDExOTkzOWYxNTIxMzgzZWVmMDBlYzVlY2FmOGFlN2MyMjc2YjEKLS0tIC9k
ZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9JREJCYWNraW5n
U3RvcmUuY3BwCkBAIC0wLDAgKzEsMTkwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBH
b29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
ICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMg
IkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisg
KiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KyNpbmNsdWRlICJJREJCYWNraW5nU3RvcmUuaCIKKworI2lmIEVOQUJMRShJTkRFWEVEX0RBVEFC
QVNFKQorI2lmIFVTRShMRVZFTERCKQorCisjaW5jbHVkZSAiRmlsZVN5c3RlbS5oIgorI2luY2x1
ZGUgIkhpc3RvZ3JhbVN1cHBvcnQuaCIKKyNpbmNsdWRlICJJREJGYWN0b3J5QmFja2VuZEltcGwu
aCIKKyNpbmNsdWRlICJJREJLZXkuaCIKKyNpbmNsdWRlICJJREJLZXlQYXRoLmgiCisjaW5jbHVk
ZSAiSURCS2V5UmFuZ2UuaCIKKyNpbmNsdWRlICJJREJMZXZlbERCQmFja2luZ1N0b3JlLmgiCisj
aW5jbHVkZSAiSURCTGV2ZWxEQkNvZGluZy5oIgorI2luY2x1ZGUgIklEQk1ldGFkYXRhLmgiCisj
aW5jbHVkZSAiSURCVHJhY2luZy5oIgorI2luY2x1ZGUgIkxldmVsREJDb21wYXJhdG9yLmgiCisj
aW5jbHVkZSAiTGV2ZWxEQkRhdGFiYXNlLmgiCisjaW5jbHVkZSAiTGV2ZWxEQkl0ZXJhdG9yLmgi
CisjaW5jbHVkZSAiTGV2ZWxEQlNsaWNlLmgiCisjaW5jbHVkZSAiTGV2ZWxEQlRyYW5zYWN0aW9u
LmgiCisjaW5jbHVkZSAiU2VjdXJpdHlPcmlnaW4uaCIKKyNpbmNsdWRlIDx3dGYvQXNzZXJ0aW9u
cy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3VzaW5nIG5hbWVzcGFjZSBJREJMZXZlbERC
Q29kaW5nOworCitjb25zdCBpbnQ2NF90IEtleUdlbmVyYXRvckluaXRpYWxOdW1iZXIgPSAxOyAv
LyBGcm9tIHRoZSBJbmRleGVkREIgc3BlY2lmaWNhdGlvbi4KKworZW51bSBJREJMZXZlbERCQmFj
a2luZ1N0b3JlSW50ZXJuYWxFcnJvclR5cGUgeworICAgIElEQkxldmVsREJCYWNraW5nU3RvcmVS
ZWFkRXJyb3IsCisgICAgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVdyaXRlRXJyb3IsCisgICAgSURC
TGV2ZWxEQkJhY2tpbmdTdG9yZUNvbnNpc3RlbmN5RXJyb3IsCisgICAgSURCTGV2ZWxEQkJhY2tp
bmdTdG9yZUludGVybmFsRXJyb3JNYXgsCit9Oworc3RhdGljIGlubGluZSB2b2lkIHJlY29yZElu
dGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZUludGVybmFsRXJyb3JUeXBlIHR5cGUp
Cit7CisgICAgSGlzdG9ncmFtU3VwcG9ydDo6aGlzdG9ncmFtRW51bWVyYXRpb24oIldlYkNvcmUu
SW5kZXhlZERCLkJhY2tpbmdTdG9yZS5JbnRlcm5hbEVycm9yIiwgdHlwZSwgSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZUludGVybmFsRXJyb3JNYXgpOworfQorCisvLyBVc2UgdG8gc2lnbmFsIGNvbmRp
dGlvbnMgdGhhdCB1c3VhbGx5IGluZGljYXRlIGRldmVsb3BlciBlcnJvciwgYnV0IGNvdWxkIGJl
IGNhdXNlZCBieSBkYXRhIGNvcnJ1cHRpb24uCisvLyBBIG1hY3JvIGlzIHVzZWQgaW5zdGVhZCBv
ZiBhbiBpbmxpbmUgZnVuY3Rpb24gc28gdGhhdCB0aGUgYXNzZXJ0IGFuZCBsb2cgcmVwb3J0IHRo
ZSBsaW5lIG51bWJlci4KKyNkZWZpbmUgSW50ZXJuYWxFcnJvcih0eXBlKSBcCisgICAgZG8geyBc
CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyBcCisgICAgICAgIExPR19FUlJPUigiSW50
ZXJuYWwgSW5kZXhlZERCIEVycm9yOiAlcyIsICN0eXBlKTsgXAorICAgICAgICByZWNvcmRJbnRl
cm5hbEVycm9yKHR5cGUpOyBcCisgICAgfSB3aGlsZSAoMCkKKwordGVtcGxhdGUgPHR5cGVuYW1l
IERCT3JUcmFuc2FjdGlvbj4KK3N0YXRpYyBib29sIGdldEJvb2woREJPclRyYW5zYWN0aW9uKiBk
YiwgY29uc3QgVmVjdG9yPGNoYXI+JiBrZXksIGJvb2wmIGZvdW5kQm9vbCkKK3sKKyAgICBWZWN0
b3I8Y2hhcj4gcmVzdWx0OworICAgIGlmICghZGItPmdldChrZXksIHJlc3VsdCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIGZvdW5kQm9vbCA9IGRlY29kZUJvb2wocmVzdWx0LmJlZ2lu
KCksIHJlc3VsdC5lbmQoKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBl
bmFtZSBEQk9yVHJhbnNhY3Rpb24+CitzdGF0aWMgYm9vbCBwdXRCb29sKERCT3JUcmFuc2FjdGlv
biogZGIsIGNvbnN0IFZlY3RvcjxjaGFyPiYga2V5LCBib29sIHZhbHVlKQoreworICAgIHJldHVy
biBkYi0+cHV0KGtleSwgZW5jb2RlQm9vbCh2YWx1ZSkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5h
bWUgREJPclRyYW5zYWN0aW9uPgorc3RhdGljIGJvb2wgZ2V0SW50KERCT3JUcmFuc2FjdGlvbiog
ZGIsIGNvbnN0IFZlY3RvcjxjaGFyPiYga2V5LCBpbnQ2NF90JiBmb3VuZEludCkKK3sKKyAgICBW
ZWN0b3I8Y2hhcj4gcmVzdWx0OworICAgIGlmICghZGItPmdldChrZXksIHJlc3VsdCkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIGZvdW5kSW50ID0gZGVjb2RlSW50KHJlc3VsdC5iZWdp
bigpLCByZXN1bHQuZW5kKCkpOworICAgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlw
ZW5hbWUgREJPclRyYW5zYWN0aW9uPgorc3RhdGljIGJvb2wgcHV0SW50KERCT3JUcmFuc2FjdGlv
biogZGIsIGNvbnN0IFZlY3RvcjxjaGFyPiYga2V5LCBpbnQ2NF90IHZhbHVlKQoreworICAgIEFT
U0VSVCh2YWx1ZSA+PSAwKTsKKyAgICBpZiAodmFsdWUgPCAwKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgcmV0dXJuIGRiLT5wdXQoa2V5LCBlbmNvZGVJbnQodmFsdWUpKTsKK30KKwordGVt
cGxhdGUgPHR5cGVuYW1lIERCT3JUcmFuc2FjdGlvbj4KK3N0YXRpYyBib29sIGdldFZhckludChE
Qk9yVHJhbnNhY3Rpb24qIGRiLCBjb25zdCBWZWN0b3I8Y2hhcj4mIGtleSwgaW50NjRfdCYgZm91
bmRJbnQpCit7CisgICAgVmVjdG9yPGNoYXI+IHJlc3VsdDsKKyAgICBpZiAoIWRiLT5nZXQoa2V5
LCByZXN1bHQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gZGVjb2RlVmFy
SW50KHJlc3VsdC5iZWdpbigpLCByZXN1bHQuZW5kKCksIGZvdW5kSW50KSA9PSByZXN1bHQuZW5k
KCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEQk9yVHJhbnNhY3Rpb24+CitzdGF0aWMgYm9v
bCBwdXRWYXJJbnQoREJPclRyYW5zYWN0aW9uKiBkYiwgY29uc3QgVmVjdG9yPGNoYXI+JiBrZXks
IGludDY0X3QgdmFsdWUpCit7CisgICAgcmV0dXJuIGRiLT5wdXQoa2V5LCBlbmNvZGVWYXJJbnQo
dmFsdWUpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERCT3JUcmFuc2FjdGlvbj4KK3N0YXRp
YyBib29sIGdldFN0cmluZyhEQk9yVHJhbnNhY3Rpb24qIGRiLCBjb25zdCBWZWN0b3I8Y2hhcj4m
IGtleSwgU3RyaW5nJiBmb3VuZFN0cmluZykKK3sKKyAgICBWZWN0b3I8Y2hhcj4gcmVzdWx0Owor
ICAgIGlmICghZGItPmdldChrZXksIHJlc3VsdCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIGZvdW5kU3RyaW5nID0gZGVjb2RlU3RyaW5nKHJlc3VsdC5iZWdpbigpLCByZXN1bHQuZW5k
KCkpOworICAgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgREJPclRyYW5z
YWN0aW9uPgorc3RhdGljIGJvb2wgcHV0U3RyaW5nKERCT3JUcmFuc2FjdGlvbiogZGIsIGNvbnN0
IFZlY3RvcjxjaGFyPiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUpCit7CisgICAgaWYgKCFkYi0+
cHV0KGtleSwgZW5jb2RlU3RyaW5nKHZhbHVlKSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERCT3JUcmFuc2FjdGlvbj4K
K3N0YXRpYyBib29sIHB1dElEQktleVBhdGgoREJPclRyYW5zYWN0aW9uKiBkYiwgY29uc3QgVmVj
dG9yPGNoYXI+IGtleSwgY29uc3QgSURCS2V5UGF0aCYgdmFsdWUpCit7CisgICAgaWYgKCFkYi0+
cHV0KGtleSwgZW5jb2RlSURCS2V5UGF0aCh2YWx1ZSkpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZUtleXMoY29uc3QgTGV2
ZWxEQlNsaWNlJiBhLCBjb25zdCBMZXZlbERCU2xpY2UmIGIpCit7CisgICAgcmV0dXJuIGNvbXBh
cmUoYSwgYik7Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZUluZGV4S2V5cyhjb25zdCBMZXZlbERC
U2xpY2UmIGEsIGNvbnN0IExldmVsREJTbGljZSYgYikKK3sKKyAgICByZXR1cm4gY29tcGFyZShh
LCBiLCB0cnVlKTsKK30KKworY2xhc3MgQ29tcGFyYXRvciA6IHB1YmxpYyBMZXZlbERCQ29tcGFy
YXRvciB7CitwdWJsaWM6CisgICAgdmlydHVhbCBpbnQgY29tcGFyZShjb25zdCBMZXZlbERCU2xp
Y2UmIGEsIGNvbnN0IExldmVsREJTbGljZSYgYikgY29uc3QgeyByZXR1cm4gSURCTGV2ZWxEQkNv
ZGluZzo6Y29tcGFyZShhLCBiKTsgfQorICAgIHZpcnR1YWwgY29uc3QgY2hhciogbmFtZSgpIGNv
bnN0IHsgcmV0dXJuICJpZGJfY21wMSI7IH0KK307CisKK2NvbnN0IGludDY0X3QgbGF0ZXN0U2No
ZW1hVmVyc2lvbiA9IDE7CitzdGF0aWMgYm9vbCBpc1NjaGVtYUtub3duKExldmVsREJEYXRhYmFz
ZSogZGIpCit7CisgICAgaW50NjRfdCBzY2hlbWFWZXJzaW9uID0gMDsKKyAgICBjb25zdCBWZWN0
b3I8Y2hhcj4gbWV0YURhdGFLZXkgPSBTY2hlbWFWZXJzaW9uS2V5OjplbmNvZGUoKTsKKyAgICBp
ZiAoIWdldEludChkYiwgbWV0YURhdGFLZXksIHNjaGVtYVZlcnNpb24pKQorICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICByZXR1cm4gc2NoZW1hVmVyc2lvbiA8PSBsYXRlc3RTY2hlbWFWZXJzaW9u
OworfQorCitzdGF0aWMgYm9vbCBzZXRVcE1ldGFkYXRhKExldmVsREJEYXRhYmFzZSogZGIsIGNv
bnN0IFN0cmluZyYgb3JpZ2luKQoreworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBtZXRhRGF0YUtl
eSA9IFNjaGVtYVZlcnNpb25LZXk6OmVuY29kZSgpOworCisgICAgaW50NjRfdCBzY2hlbWFWZXJz
aW9uID0gMDsKKyAgICBpZiAoIWdldEludChkYiwgbWV0YURhdGFLZXksIHNjaGVtYVZlcnNpb24p
KSB7CisgICAgICAgIHNjaGVtYVZlcnNpb24gPSBsYXRlc3RTY2hlbWFWZXJzaW9uOworICAgICAg
ICBpZiAoIXB1dEludChkYiwgbWV0YURhdGFLZXksIGxhdGVzdFNjaGVtYVZlcnNpb24pKSB7Cisg
ICAgICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVXcml0ZUVycm9y
KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7Cisg
ICAgICAgIEFTU0VSVChzY2hlbWFWZXJzaW9uIDw9IGxhdGVzdFNjaGVtYVZlcnNpb24pOworICAg
ICAgICBpZiAoIXNjaGVtYVZlcnNpb24pIHsKKyAgICAgICAgICAgIHNjaGVtYVZlcnNpb24gPSBs
YXRlc3RTY2hlbWFWZXJzaW9uOworICAgICAgICAgICAgUmVmUHRyPExldmVsREJUcmFuc2FjdGlv
bj4gdHJhbnNhY3Rpb24gPSBMZXZlbERCVHJhbnNhY3Rpb246OmNyZWF0ZShkYik7CisgICAgICAg
ICAgICB0cmFuc2FjdGlvbi0+cHV0KG1ldGFEYXRhS2V5LCBlbmNvZGVJbnQoc2NoZW1hVmVyc2lv
bikpOworCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3RhcnRLZXkgPSBEYXRhYmFz
ZU5hbWVLZXk6OmVuY29kZU1pbktleUZvck9yaWdpbihvcmlnaW4pOworICAgICAgICAgICAgY29u
c3QgVmVjdG9yPGNoYXI+IHN0b3BLZXkgPSBEYXRhYmFzZU5hbWVLZXk6OmVuY29kZVN0b3BLZXlG
b3JPcmlnaW4ob3JpZ2luKTsKKyAgICAgICAgICAgIE93blB0cjxMZXZlbERCSXRlcmF0b3I+IGl0
ID0gZGItPmNyZWF0ZUl0ZXJhdG9yKCk7CisgICAgICAgICAgICBmb3IgKGl0LT5zZWVrKHN0YXJ0
S2V5KTsgaXQtPmlzVmFsaWQoKSAmJiBjb21wYXJlS2V5cyhpdC0+a2V5KCksIHN0b3BLZXkpIDwg
MDsgaXQtPm5leHQoKSkgeworICAgICAgICAgICAgICAgIFZlY3RvcjxjaGFyPiB2YWx1ZTsKKyAg
ICAgICAgICAgICAgICBib29sIG9rID0gdHJhbnNhY3Rpb24tPmdldChpdC0+a2V5KCksIHZhbHVl
KTsKKyAgICAgICAgICAgICAgICBpZiAoIW9rKSB7CisgICAgICAgICAgICAgICAgICAgIEludGVy
bmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVJlYWRFcnJvcik7CisgICAgICAgICAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg
aW50IGRhdGFiYXNlSWQgPSBkZWNvZGVJbnQodmFsdWUuYmVnaW4oKSwgdmFsdWUuZW5kKCkpOwor
ICAgICAgICAgICAgICAgIFZlY3RvcjxjaGFyPiBpbnRWZXJzaW9uS2V5ID0gRGF0YWJhc2VNZXRh
RGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIERhdGFiYXNlTWV0YURhdGFLZXk6OlVzZXJJbnRW
ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbi0+cHV0KGludFZlcnNpb25LZXks
IGVuY29kZVZhckludChJREJEYXRhYmFzZU1ldGFkYXRhOjpEZWZhdWx0SW50VmVyc2lvbikpOwor
ICAgICAgICAgICAgICAgIG9rID0gdHJhbnNhY3Rpb24tPmdldChpdC0+a2V5KCksIHZhbHVlKTsK
KyAgICAgICAgICAgICAgICBpZiAoIW9rKSB7CisgICAgICAgICAgICAgICAgICAgIEludGVybmFs
RXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVJlYWRFcnJvcik7CisgICAgICAgICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBib29sIG9rID0gdHJhbnNhY3Rpb24tPmNvbW1pdCgpOworICAgICAgICAgICAgaWYg
KCFvaykgeworICAgICAgICAgICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdT
dG9yZVdyaXRlRXJyb3IpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEFTU0VSVChzY2hlbWFWZXJzaW9uID09IGxh
dGVzdFNjaGVtYVZlcnNpb24pOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0
eXBlbmFtZSBEQk9yVHJhbnNhY3Rpb24+CitzdGF0aWMgaW50NjRfdCBnZXRNYXhPYmplY3RTdG9y
ZUlkKERCT3JUcmFuc2FjdGlvbiogZGIsIGludDY0X3QgZGF0YWJhc2VJZCkKK3sKKyAgICBjb25z
dCBWZWN0b3I8Y2hhcj4gbWF4T2JqZWN0U3RvcmVJZEtleSA9IERhdGFiYXNlTWV0YURhdGFLZXk6
OmVuY29kZShkYXRhYmFzZUlkLCBEYXRhYmFzZU1ldGFEYXRhS2V5OjpNYXhPYmplY3RTdG9yZUlk
KTsKKyAgICByZXR1cm4gZ2V0TWF4T2JqZWN0U3RvcmVJZChkYiwgbWF4T2JqZWN0U3RvcmVJZEtl
eSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEQk9yVHJhbnNhY3Rpb24+CitzdGF0aWMgaW50
NjRfdCBnZXRNYXhPYmplY3RTdG9yZUlkKERCT3JUcmFuc2FjdGlvbiogZGIsIGNvbnN0IFZlY3Rv
cjxjaGFyPiYgbWF4T2JqZWN0U3RvcmVJZEtleSkKK3sKKyAgICBpbnQ2NF90IG1heE9iamVjdFN0
b3JlSWQgPSAtMTsKKyAgICBpZiAoIWdldEludChkYiwgbWF4T2JqZWN0U3RvcmVJZEtleSwgbWF4
T2JqZWN0U3RvcmVJZCkpCisgICAgICAgIG1heE9iamVjdFN0b3JlSWQgPSAwOworCisgICAgQVNT
RVJUKG1heE9iamVjdFN0b3JlSWQgPj0gMCk7CisgICAgcmV0dXJuIG1heE9iamVjdFN0b3JlSWQ7
Cit9CisKK0lEQkxldmVsREJCYWNraW5nU3RvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmUoY29u
c3QgU3RyaW5nJiBpZGVudGlmaWVyLCBJREJGYWN0b3J5QmFja2VuZEltcGwqIGZhY3RvcnksIFBh
c3NPd25QdHI8TGV2ZWxEQkRhdGFiYXNlPiBkYikKKyAgICA6IG1faWRlbnRpZmllcihpZGVudGlm
aWVyKQorICAgICwgbV9mYWN0b3J5KGZhY3RvcnkpCisgICAgLCBtX2RiKGRiKQoreworICAgIG1f
ZmFjdG9yeS0+YWRkSURCQmFja2luZ1N0b3JlKGlkZW50aWZpZXIsIHRoaXMpOworfQorCitJREJM
ZXZlbERCQmFja2luZ1N0b3JlOjp+SURCTGV2ZWxEQkJhY2tpbmdTdG9yZSgpCit7CisgICAgbV9m
YWN0b3J5LT5yZW1vdmVJREJCYWNraW5nU3RvcmUobV9pZGVudGlmaWVyKTsKKworICAgIC8vIG1f
ZGIncyBkZXN0cnVjdG9yIHVzZXMgbV9jb21wYXJhdG9yLiBUaGUgb3JkZXIgb2YgZGVzdHJ1Y3Rp
b24gaXMgaW1wb3J0YW50LgorICAgIG1fZGIuY2xlYXIoKTsKKyAgICBtX2NvbXBhcmF0b3IuY2xl
YXIoKTsKK30KKworZW51bSBJREJMZXZlbERCQmFja2luZ1N0b3JlT3BlblJlc3VsdCB7CisgICAg
SURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5NZW1vcnksCisgICAgSURCTGV2ZWxEQkJhY2tpbmdT
dG9yZU9wZW5TdWNjZXNzLAorICAgIElEQkxldmVsREJCYWNraW5nU3RvcmVPcGVuRmFpbGVkRGly
ZWN0b3J5LAorICAgIElEQkxldmVsREJCYWNraW5nU3RvcmVPcGVuRmFpbGVkVW5rbm93blNjaGVt
YSwKKyAgICBJREJMZXZlbERCQmFja2luZ1N0b3JlT3BlbkNsZWFudXBEZXN0cm95RmFpbGVkLAor
ICAgIElEQkxldmVsREJCYWNraW5nU3RvcmVPcGVuQ2xlYW51cFJlb3BlbkZhaWxlZCwKKyAgICBJ
REJMZXZlbERCQmFja2luZ1N0b3JlT3BlbkNsZWFudXBSZW9wZW5TdWNjZXNzLAorICAgIElEQkxl
dmVsREJCYWNraW5nU3RvcmVPcGVuTWF4LAorfTsKKworUGFzc1JlZlB0cjxJREJCYWNraW5nU3Rv
cmU+IElEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW4oU2VjdXJpdHlPcmlnaW4qIHNlY3VyaXR5
T3JpZ2luLCBjb25zdCBTdHJpbmcmIHBhdGhCYXNlQXJnLCBjb25zdCBTdHJpbmcmIGZpbGVJZGVu
dGlmaWVyLCBJREJGYWN0b3J5QmFja2VuZEltcGwqIGZhY3RvcnkpCit7CisgICAgSURCX1RSQUNF
KCJJREJMZXZlbERCQmFja2luZ1N0b3JlOjpvcGVuIik7CisgICAgU3RyaW5nIHBhdGhCYXNlID0g
cGF0aEJhc2VBcmc7CisKKyAgICBPd25QdHI8TGV2ZWxEQkNvbXBhcmF0b3I+IGNvbXBhcmF0b3Ig
PSBhZG9wdFB0cihuZXcgQ29tcGFyYXRvcigpKTsKKyAgICBPd25QdHI8TGV2ZWxEQkRhdGFiYXNl
PiBkYjsKKworICAgIGlmIChwYXRoQmFzZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgSGlzdG9ncmFt
U3VwcG9ydDo6aGlzdG9ncmFtRW51bWVyYXRpb24oIldlYkNvcmUuSW5kZXhlZERCLkJhY2tpbmdT
dG9yZS5PcGVuU3RhdHVzIiwgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5NZW1vcnksIElEQkxl
dmVsREJCYWNraW5nU3RvcmVPcGVuTWF4KTsKKyAgICAgICAgZGIgPSBMZXZlbERCRGF0YWJhc2U6
Om9wZW5Jbk1lbW9yeShjb21wYXJhdG9yLmdldCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBp
ZiAoIW1ha2VBbGxEaXJlY3RvcmllcyhwYXRoQmFzZSkpIHsKKyAgICAgICAgICAgIExPR19FUlJP
UigiVW5hYmxlIHRvIGNyZWF0ZSBJbmRleGVkREIgZGF0YWJhc2UgcGF0aCAlcyIsIHBhdGhCYXNl
LnV0ZjgoKS5kYXRhKCkpOworICAgICAgICAgICAgSGlzdG9ncmFtU3VwcG9ydDo6aGlzdG9ncmFt
RW51bWVyYXRpb24oIldlYkNvcmUuSW5kZXhlZERCLkJhY2tpbmdTdG9yZS5PcGVuU3RhdHVzIiwg
SURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5GYWlsZWREaXJlY3RvcnksIElEQkxldmVsREJCYWNr
aW5nU3RvcmVPcGVuTWF4KTsKKyAgICAgICAgICAgIHJldHVybiBQYXNzUmVmUHRyPElEQkJhY2tp
bmdTdG9yZT4oKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBwYXRoID0gcGF0aEJ5QXBw
ZW5kaW5nQ29tcG9uZW50KHBhdGhCYXNlLCBzZWN1cml0eU9yaWdpbi0+ZGF0YWJhc2VJZGVudGlm
aWVyKCkgKyAiLmluZGV4ZWRkYi5sZXZlbGRiIik7CisKKyAgICAgICAgZGIgPSBMZXZlbERCRGF0
YWJhc2U6Om9wZW4ocGF0aCwgY29tcGFyYXRvci5nZXQoKSk7CisgICAgICAgIGlmIChkYiAmJiAh
aXNTY2hlbWFLbm93bihkYi5nZXQoKSkpIHsKKyAgICAgICAgICAgIExPR19FUlJPUigiSW5kZXhl
ZERCIGJhY2tpbmcgc3RvcmUgaGFkIHVua25vd24gc2NoZW1hLCB0cmVhdGluZyBpdCBhcyBmYWls
dXJlIHRvIG9wZW4iKTsKKyAgICAgICAgICAgIEhpc3RvZ3JhbVN1cHBvcnQ6Omhpc3RvZ3JhbUVu
dW1lcmF0aW9uKCJXZWJDb3JlLkluZGV4ZWREQi5CYWNraW5nU3RvcmUuT3BlblN0YXR1cyIsIElE
QkxldmVsREJCYWNraW5nU3RvcmVPcGVuRmFpbGVkVW5rbm93blNjaGVtYSwgSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZU9wZW5NYXgpOworICAgICAgICAgICAgZGIucmVsZWFzZSgpOworICAgICAgICB9
CisKKyAgICAgICAgaWYgKGRiKQorICAgICAgICAgICAgSGlzdG9ncmFtU3VwcG9ydDo6aGlzdG9n
cmFtRW51bWVyYXRpb24oIldlYkNvcmUuSW5kZXhlZERCLkJhY2tpbmdTdG9yZS5PcGVuU3RhdHVz
IiwgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5TdWNjZXNzLCBJREJMZXZlbERCQmFja2luZ1N0
b3JlT3Blbk1heCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJJbmRl
eGVkREIgYmFja2luZyBzdG9yZSBvcGVuIGZhaWxlZCwgYXR0ZW1wdGluZyBjbGVhbnVwIik7Cisg
ICAgICAgICAgICBib29sIHN1Y2Nlc3MgPSBMZXZlbERCRGF0YWJhc2U6OmRlc3Ryb3kocGF0aCk7
CisgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICBMT0dfRVJST1Io
IkluZGV4ZWREQiBiYWNraW5nIHN0b3JlIGNsZWFudXAgZmFpbGVkIik7CisgICAgICAgICAgICAg
ICAgSGlzdG9ncmFtU3VwcG9ydDo6aGlzdG9ncmFtRW51bWVyYXRpb24oIldlYkNvcmUuSW5kZXhl
ZERCLkJhY2tpbmdTdG9yZS5PcGVuU3RhdHVzIiwgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5D
bGVhbnVwRGVzdHJveUZhaWxlZCwgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5NYXgpOworICAg
ICAgICAgICAgICAgIHJldHVybiBQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4oKTsKKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgTE9HX0VSUk9SKCJJbmRleGVkREIgYmFja2luZyBzdG9y
ZSBjbGVhbnVwIHN1Y2NlZWRlZCwgcmVvcGVuaW5nIik7CisgICAgICAgICAgICBkYiA9IExldmVs
REJEYXRhYmFzZTo6b3BlbihwYXRoLCBjb21wYXJhdG9yLmdldCgpKTsKKyAgICAgICAgICAgIGlm
ICghZGIpIHsKKyAgICAgICAgICAgICAgICBMT0dfRVJST1IoIkluZGV4ZWREQiBiYWNraW5nIHN0
b3JlIHJlb3BlbiBhZnRlciByZWNvdmVyeSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICBIaXN0
b2dyYW1TdXBwb3J0OjpoaXN0b2dyYW1FbnVtZXJhdGlvbigiV2ViQ29yZS5JbmRleGVkREIuQmFj
a2luZ1N0b3JlLk9wZW5TdGF0dXMiLCBJREJMZXZlbERCQmFja2luZ1N0b3JlT3BlbkNsZWFudXBS
ZW9wZW5GYWlsZWQsIElEQkxldmVsREJCYWNraW5nU3RvcmVPcGVuTWF4KTsKKyAgICAgICAgICAg
ICAgICByZXR1cm4gUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU+KCk7CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBIaXN0b2dyYW1TdXBwb3J0OjpoaXN0b2dyYW1FbnVtZXJhdGlvbigiV2Vi
Q29yZS5JbmRleGVkREIuQmFja2luZ1N0b3JlLk9wZW5TdGF0dXMiLCBJREJMZXZlbERCQmFja2lu
Z1N0b3JlT3BlbkNsZWFudXBSZW9wZW5TdWNjZXNzLCBJREJMZXZlbERCQmFja2luZ1N0b3JlT3Bl
bk1heCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWRiKQorICAgICAgICByZXR1cm4g
UGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU+KCk7CisKKyAgICAvLyBGSVhNRTogSGFuZGxlIGNv
bXBhcmF0b3IgbmFtZSBjaGFuZ2VzLgorCisgICAgUmVmUHRyPElEQkxldmVsREJCYWNraW5nU3Rv
cmU+IGJhY2tpbmdTdG9yZShhZG9wdFJlZihuZXcgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZShmaWxl
SWRlbnRpZmllciwgZmFjdG9yeSwgZGIucmVsZWFzZSgpKSkpOworICAgIGJhY2tpbmdTdG9yZS0+
bV9jb21wYXJhdG9yID0gY29tcGFyYXRvci5yZWxlYXNlKCk7CisKKyAgICBpZiAoIXNldFVwTWV0
YWRhdGEoYmFja2luZ1N0b3JlLT5tX2RiLmdldCgpLCBmaWxlSWRlbnRpZmllcikpCisgICAgICAg
IHJldHVybiBQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4oKTsKKworICAgIHJldHVybiBiYWNr
aW5nU3RvcmUucmVsZWFzZSgpOworfQorCitWZWN0b3I8U3RyaW5nPiBJREJMZXZlbERCQmFja2lu
Z1N0b3JlOjpnZXREYXRhYmFzZU5hbWVzKCkKK3sKKyAgICBWZWN0b3I8U3RyaW5nPiBmb3VuZE5h
bWVzOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBzdGFydEtleSA9IERhdGFiYXNlTmFtZUtleTo6
ZW5jb2RlTWluS2V5Rm9yT3JpZ2luKG1faWRlbnRpZmllcik7CisgICAgY29uc3QgVmVjdG9yPGNo
YXI+IHN0b3BLZXkgPSBEYXRhYmFzZU5hbWVLZXk6OmVuY29kZVN0b3BLZXlGb3JPcmlnaW4obV9p
ZGVudGlmaWVyKTsKKworICAgIEFTU0VSVChmb3VuZE5hbWVzLmlzRW1wdHkoKSk7CisKKyAgICBP
d25QdHI8TGV2ZWxEQkl0ZXJhdG9yPiBpdCA9IG1fZGItPmNyZWF0ZUl0ZXJhdG9yKCk7CisgICAg
Zm9yIChpdC0+c2VlayhzdGFydEtleSk7IGl0LT5pc1ZhbGlkKCkgJiYgY29tcGFyZUtleXMoaXQt
PmtleSgpLCBzdG9wS2V5KSA8IDA7IGl0LT5uZXh0KCkpIHsKKyAgICAgICAgY29uc3QgY2hhciog
cCA9IGl0LT5rZXkoKS5iZWdpbigpOworICAgICAgICBjb25zdCBjaGFyKiBsaW1pdCA9IGl0LT5r
ZXkoKS5lbmQoKTsKKworICAgICAgICBEYXRhYmFzZU5hbWVLZXkgZGF0YWJhc2VOYW1lS2V5Owor
ICAgICAgICBwID0gRGF0YWJhc2VOYW1lS2V5OjpkZWNvZGUocCwgbGltaXQsICZkYXRhYmFzZU5h
bWVLZXkpOworICAgICAgICBBU1NFUlQocCk7CisKKyAgICAgICAgZm91bmROYW1lcy5hcHBlbmQo
ZGF0YWJhc2VOYW1lS2V5LmRhdGFiYXNlTmFtZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIGZvdW5k
TmFtZXM7Cit9CisKK2Jvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0SURCRGF0YWJhc2VN
ZXRhRGF0YShjb25zdCBTdHJpbmcmIG5hbWUsIElEQkRhdGFiYXNlTWV0YWRhdGEqIG1ldGFkYXRh
KQoreworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBrZXkgPSBEYXRhYmFzZU5hbWVLZXk6OmVuY29k
ZShtX2lkZW50aWZpZXIsIG5hbWUpOworCisgICAgYm9vbCBvayA9IGdldEludChtX2RiLmdldCgp
LCBrZXksIG1ldGFkYXRhLT5pZCk7CisgICAgaWYgKCFvaykKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgb2sgPSBnZXRTdHJpbmcobV9kYi5nZXQoKSwgRGF0YWJhc2VNZXRhRGF0YUtleTo6
ZW5jb2RlKG1ldGFkYXRhLT5pZCwgRGF0YWJhc2VNZXRhRGF0YUtleTo6VXNlclZlcnNpb24pLCBt
ZXRhZGF0YS0+dmVyc2lvbik7CisgICAgaWYgKCFvaykgeworICAgICAgICBJbnRlcm5hbEVycm9y
KElEQkxldmVsREJCYWNraW5nU3RvcmVSZWFkRXJyb3IpOworICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgfQorCisgICAgb2sgPSBnZXRWYXJJbnQobV9kYi5nZXQoKSwgRGF0YWJhc2VNZXRhRGF0
YUtleTo6ZW5jb2RlKG1ldGFkYXRhLT5pZCwgRGF0YWJhc2VNZXRhRGF0YUtleTo6VXNlckludFZl
cnNpb24pLCBtZXRhZGF0YS0+aW50VmVyc2lvbik7CisgICAgaWYgKCFvaykgeworICAgICAgICBJ
bnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVSZWFkRXJyb3IpOworICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChtZXRhZGF0YS0+aW50VmVyc2lvbiA9PSBJREJE
YXRhYmFzZU1ldGFkYXRhOjpEZWZhdWx0SW50VmVyc2lvbikKKyAgICAgICAgbWV0YWRhdGEtPmlu
dFZlcnNpb24gPSBJREJEYXRhYmFzZU1ldGFkYXRhOjpOb0ludFZlcnNpb247CisKKyAgICBtZXRh
ZGF0YS0+bWF4T2JqZWN0U3RvcmVJZCA9IGdldE1heE9iamVjdFN0b3JlSWQobV9kYi5nZXQoKSwg
bWV0YWRhdGEtPmlkKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50NjRfdCBn
ZXROZXdEYXRhYmFzZUlkKExldmVsREJEYXRhYmFzZSogZGIpCit7CisgICAgaW50NjRfdCBtYXhE
YXRhYmFzZUlkID0gLTE7CisgICAgaWYgKCFnZXRJbnQoZGIsIE1heERhdGFiYXNlSWRLZXk6OmVu
Y29kZSgpLCBtYXhEYXRhYmFzZUlkKSkKKyAgICAgICAgbWF4RGF0YWJhc2VJZCA9IDA7CisKKyAg
ICBBU1NFUlQobWF4RGF0YWJhc2VJZCA+PSAwKTsKKworICAgIGludDY0X3QgZGF0YWJhc2VJZCA9
IG1heERhdGFiYXNlSWQgKyAxOworICAgIGlmICghcHV0SW50KGRiLCBNYXhEYXRhYmFzZUlkS2V5
OjplbmNvZGUoKSwgZGF0YWJhc2VJZCkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHJldHVy
biBkYXRhYmFzZUlkOworfQorCitib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmNyZWF0ZUlE
QkRhdGFiYXNlTWV0YURhdGEoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHZlcnNp
b24sIGludDY0X3QgaW50VmVyc2lvbiwgaW50NjRfdCYgcm93SWQpCit7CisgICAgcm93SWQgPSBn
ZXROZXdEYXRhYmFzZUlkKG1fZGIuZ2V0KCkpOworICAgIGlmIChyb3dJZCA8IDApCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBrZXkgPSBEYXRhYmFzZU5h
bWVLZXk6OmVuY29kZShtX2lkZW50aWZpZXIsIG5hbWUpOworICAgIGlmICghcHV0SW50KG1fZGIu
Z2V0KCksIGtleSwgcm93SWQpKSB7CisgICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZVdyaXRlRXJyb3IpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAg
IGlmICghcHV0U3RyaW5nKG1fZGIuZ2V0KCksIERhdGFiYXNlTWV0YURhdGFLZXk6OmVuY29kZShy
b3dJZCwgRGF0YWJhc2VNZXRhRGF0YUtleTo6VXNlclZlcnNpb24pLCB2ZXJzaW9uKSkgeworICAg
ICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVXcml0ZUVycm9yKTsKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoaW50VmVyc2lvbiA9PSBJREJEYXRh
YmFzZU1ldGFkYXRhOjpOb0ludFZlcnNpb24pCisgICAgICAgIGludFZlcnNpb24gPSBJREJEYXRh
YmFzZU1ldGFkYXRhOjpEZWZhdWx0SW50VmVyc2lvbjsKKyAgICBpZiAoIXB1dFZhckludChtX2Ri
LmdldCgpLCBEYXRhYmFzZU1ldGFEYXRhS2V5OjplbmNvZGUocm93SWQsIERhdGFiYXNlTWV0YURh
dGFLZXk6OlVzZXJJbnRWZXJzaW9uKSwgaW50VmVyc2lvbikpIHsKKyAgICAgICAgSW50ZXJuYWxF
cnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlV3JpdGVFcnJvcik7CisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSURCTGV2ZWxEQkJhY2tp
bmdTdG9yZTo6dXBkYXRlSURCRGF0YWJhc2VJbnRWZXJzaW9uKElEQkJhY2tpbmdTdG9yZTo6VHJh
bnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IHJvd0lkLCBpbnQ2NF90IGludFZlcnNpb24p
Cit7CisgICAgaWYgKGludFZlcnNpb24gPT0gSURCRGF0YWJhc2VNZXRhZGF0YTo6Tm9JbnRWZXJz
aW9uKQorICAgICAgICBpbnRWZXJzaW9uID0gSURCRGF0YWJhc2VNZXRhZGF0YTo6RGVmYXVsdElu
dFZlcnNpb247CisgICAgQVNTRVJUX1dJVEhfTUVTU0FHRShpbnRWZXJzaW9uID49IDAsICJpbnRW
ZXJzaW9uIHdhcyAlbGxkIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihpbnRWZXJzaW9uKSk7Cisg
ICAgaWYgKCFwdXRWYXJJbnQoVHJhbnNhY3Rpb246OmxldmVsREJUcmFuc2FjdGlvbkZyb20odHJh
bnNhY3Rpb24pLCBEYXRhYmFzZU1ldGFEYXRhS2V5OjplbmNvZGUocm93SWQsIERhdGFiYXNlTWV0
YURhdGFLZXk6OlVzZXJJbnRWZXJzaW9uKSwgaW50VmVyc2lvbikpIHsKKyAgICAgICAgSW50ZXJu
YWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlV3JpdGVFcnJvcik7CisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZTo6dXBkYXRlSURCRGF0YWJhc2VNZXRhRGF0YShJREJCYWNraW5nU3RvcmU6OlRy
YW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgaW50NjRfdCByb3dJZCwgY29uc3QgU3RyaW5nJiB2ZXJz
aW9uKQoreworICAgIGlmICghcHV0U3RyaW5nKFRyYW5zYWN0aW9uOjpsZXZlbERCVHJhbnNhY3Rp
b25Gcm9tKHRyYW5zYWN0aW9uKSwgRGF0YWJhc2VNZXRhRGF0YUtleTo6ZW5jb2RlKHJvd0lkLCBE
YXRhYmFzZU1ldGFEYXRhS2V5OjpVc2VyVmVyc2lvbiksIHZlcnNpb24pKSB7CisgICAgICAgIElu
dGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVdyaXRlRXJyb3IpOworICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29s
IGRlbGV0ZVJhbmdlKExldmVsREJUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGNvbnN0IFZlY3Rv
cjxjaGFyPiYgYmVnaW4sIGNvbnN0IFZlY3RvcjxjaGFyPiYgZW5kKQoreworICAgIE93blB0cjxM
ZXZlbERCSXRlcmF0b3I+IGl0ID0gdHJhbnNhY3Rpb24tPmNyZWF0ZUl0ZXJhdG9yKCk7CisgICAg
Zm9yIChpdC0+c2VlayhiZWdpbik7IGl0LT5pc1ZhbGlkKCkgJiYgY29tcGFyZUtleXMoaXQtPmtl
eSgpLCBlbmQpIDwgMDsgaXQtPm5leHQoKSkgeworICAgICAgICBpZiAoIXRyYW5zYWN0aW9uLT5y
ZW1vdmUoaXQtPmtleSgpKSkgeworICAgICAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERC
QmFja2luZ1N0b3JlV3JpdGVFcnJvcik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCitib29sIElEQkxldmVsREJC
YWNraW5nU3RvcmU6OmRlbGV0ZURhdGFiYXNlKGNvbnN0IFN0cmluZyYgbmFtZSkKK3sKKyAgICBJ
REJfVFJBQ0UoIklEQkxldmVsREJCYWNraW5nU3RvcmU6OmRlbGV0ZURhdGFiYXNlIik7CisgICAg
T3duUHRyPExldmVsREJXcml0ZU9ubHlUcmFuc2FjdGlvbj4gdHJhbnNhY3Rpb24gPSBMZXZlbERC
V3JpdGVPbmx5VHJhbnNhY3Rpb246OmNyZWF0ZShtX2RiLmdldCgpKTsKKworICAgIElEQkRhdGFi
YXNlTWV0YWRhdGEgbWV0YWRhdGE7CisgICAgaWYgKCFnZXRJREJEYXRhYmFzZU1ldGFEYXRhKG5h
bWUsICZtZXRhZGF0YSkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgY29uc3QgVmVjdG9y
PGNoYXI+IHN0YXJ0S2V5ID0gRGF0YWJhc2VNZXRhRGF0YUtleTo6ZW5jb2RlKG1ldGFkYXRhLmlk
LCBEYXRhYmFzZU1ldGFEYXRhS2V5OjpPcmlnaW5OYW1lKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hh
cj4gc3RvcEtleSA9IERhdGFiYXNlTWV0YURhdGFLZXk6OmVuY29kZShtZXRhZGF0YS5pZCArIDEs
IERhdGFiYXNlTWV0YURhdGFLZXk6Ok9yaWdpbk5hbWUpOworICAgIE93blB0cjxMZXZlbERCSXRl
cmF0b3I+IGl0ID0gbV9kYi0+Y3JlYXRlSXRlcmF0b3IoKTsKKyAgICBmb3IgKGl0LT5zZWVrKHN0
YXJ0S2V5KTsgaXQtPmlzVmFsaWQoKSAmJiBjb21wYXJlS2V5cyhpdC0+a2V5KCksIHN0b3BLZXkp
IDwgMDsgaXQtPm5leHQoKSkKKyAgICAgICAgdHJhbnNhY3Rpb24tPnJlbW92ZShpdC0+a2V5KCkp
OworCisgICAgY29uc3QgVmVjdG9yPGNoYXI+IGtleSA9IERhdGFiYXNlTmFtZUtleTo6ZW5jb2Rl
KG1faWRlbnRpZmllciwgbmFtZSk7CisgICAgdHJhbnNhY3Rpb24tPnJlbW92ZShrZXkpOworCisg
ICAgcmV0dXJuIHRyYW5zYWN0aW9uLT5jb21taXQoKTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tP
YmplY3RTdG9yZUFuZE1ldGFEYXRhVHlwZShjb25zdCBMZXZlbERCSXRlcmF0b3IqIGl0LCBjb25z
dCBWZWN0b3I8Y2hhcj4mIHN0b3BLZXksIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBt
ZXRhRGF0YVR5cGUpCit7CisgICAgaWYgKCFpdC0+aXNWYWxpZCgpIHx8IGNvbXBhcmVLZXlzKGl0
LT5rZXkoKSwgc3RvcEtleSkgPj0gMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgT2Jq
ZWN0U3RvcmVNZXRhRGF0YUtleSBtZXRhRGF0YUtleTsKKyAgICBjb25zdCBjaGFyKiBwID0gT2Jq
ZWN0U3RvcmVNZXRhRGF0YUtleTo6ZGVjb2RlKGl0LT5rZXkoKS5iZWdpbigpLCBpdC0+a2V5KCku
ZW5kKCksICZtZXRhRGF0YUtleSk7CisgICAgQVNTRVJUX1VOVVNFRChwLCBwKTsKKyAgICBpZiAo
bWV0YURhdGFLZXkub2JqZWN0U3RvcmVJZCgpICE9IG9iamVjdFN0b3JlSWQpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICBpZiAobWV0YURhdGFLZXkubWV0YURhdGFUeXBlKCkgIT0gbWV0YURh
dGFUeXBlKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK1Zl
Y3RvcjxJREJPYmplY3RTdG9yZU1ldGFkYXRhPiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRP
YmplY3RTdG9yZXMoaW50NjRfdCBkYXRhYmFzZUlkKQoreworICAgIElEQl9UUkFDRSgiSURCTGV2
ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3RvcmVzIik7CisgICAgVmVjdG9yPElEQk9iamVj
dFN0b3JlTWV0YWRhdGE+IG9iamVjdFN0b3JlczsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3Rh
cnRLZXkgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgMSwgMCk7
CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IHN0b3BLZXkgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5
OjplbmNvZGVNYXhLZXkoZGF0YWJhc2VJZCk7CisKKyAgICBPd25QdHI8TGV2ZWxEQkl0ZXJhdG9y
PiBpdCA9IG1fZGItPmNyZWF0ZUl0ZXJhdG9yKCk7CisgICAgaXQtPnNlZWsoc3RhcnRLZXkpOwor
ICAgIHdoaWxlIChpdC0+aXNWYWxpZCgpICYmIGNvbXBhcmVLZXlzKGl0LT5rZXkoKSwgc3RvcEtl
eSkgPCAwKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBpdC0+a2V5KCkuYmVnaW4oKTsKKyAg
ICAgICAgY29uc3QgY2hhciogbGltaXQgPSBpdC0+a2V5KCkuZW5kKCk7CisKKyAgICAgICAgT2Jq
ZWN0U3RvcmVNZXRhRGF0YUtleSBtZXRhRGF0YUtleTsKKyAgICAgICAgcCA9IE9iamVjdFN0b3Jl
TWV0YURhdGFLZXk6OmRlY29kZShwLCBsaW1pdCwgJm1ldGFEYXRhS2V5KTsKKyAgICAgICAgQVNT
RVJUKHApOworICAgICAgICBpZiAobWV0YURhdGFLZXkubWV0YURhdGFUeXBlKCkgIT0gT2JqZWN0
U3RvcmVNZXRhRGF0YUtleTo6TmFtZSkgeworICAgICAgICAgICAgSW50ZXJuYWxFcnJvcihJREJM
ZXZlbERCQmFja2luZ1N0b3JlUmVhZEVycm9yKTsKKyAgICAgICAgICAgIC8vIFBvc3NpYmxlIHN0
YWxlIG1ldGFkYXRhLCBidXQgZG9uJ3QgZmFpbCB0aGUgbG9hZC4KKyAgICAgICAgICAgIGl0LT5u
ZXh0KCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGludDY0
X3Qgb2JqZWN0U3RvcmVJZCA9IG1ldGFEYXRhS2V5Lm9iamVjdFN0b3JlSWQoKTsKKworICAgICAg
ICAvLyBGSVhNRTogRG8gdGhpcyBieSBkaXJlY3Qga2V5IGxvb2t1cCByYXRoZXIgdGhhbiBpdGVy
YXRpb24sIHRvIHNpbXBsaWZ5LgorICAgICAgICBTdHJpbmcgb2JqZWN0U3RvcmVOYW1lID0gZGVj
b2RlU3RyaW5nKGl0LT52YWx1ZSgpLmJlZ2luKCksIGl0LT52YWx1ZSgpLmVuZCgpKTsKKworICAg
ICAgICBpdC0+bmV4dCgpOworICAgICAgICBpZiAoIWNoZWNrT2JqZWN0U3RvcmVBbmRNZXRhRGF0
YVR5cGUoaXQuZ2V0KCksIHN0b3BLZXksIG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlTWV0YURh
dGFLZXk6OktleVBhdGgpKSB7CisgICAgICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJC
YWNraW5nU3RvcmVSZWFkRXJyb3IpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAg
ICAgICAgSURCS2V5UGF0aCBrZXlQYXRoID0gZGVjb2RlSURCS2V5UGF0aChpdC0+dmFsdWUoKS5i
ZWdpbigpLCBpdC0+dmFsdWUoKS5lbmQoKSk7CisKKyAgICAgICAgaXQtPm5leHQoKTsKKyAgICAg
ICAgaWYgKCFjaGVja09iamVjdFN0b3JlQW5kTWV0YURhdGFUeXBlKGl0LmdldCgpLCBzdG9wS2V5
LCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpBdXRvSW5jcmVtZW50KSkg
eworICAgICAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlUmVhZEVy
cm9yKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJvb2wgYXV0b0lu
Y3JlbWVudCA9IGRlY29kZUJvb2woaXQtPnZhbHVlKCkuYmVnaW4oKSwgaXQtPnZhbHVlKCkuZW5k
KCkpOworCisgICAgICAgIGl0LT5uZXh0KCk7IC8vIElzIGV2aWNhdGJsZS4KKyAgICAgICAgaWYg
KCFjaGVja09iamVjdFN0b3JlQW5kTWV0YURhdGFUeXBlKGl0LmdldCgpLCBzdG9wS2V5LCBvYmpl
Y3RTdG9yZUlkLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpFdmljdGFibGUpKSB7CisgICAgICAg
ICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVSZWFkRXJyb3IpOworICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpdC0+bmV4dCgpOyAvLyBMYXN0
IHZlcnNpb24uCisgICAgICAgIGlmICghY2hlY2tPYmplY3RTdG9yZUFuZE1ldGFEYXRhVHlwZShp
dC5nZXQoKSwgc3RvcEtleSwgb2JqZWN0U3RvcmVJZCwgT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6
TGFzdFZlcnNpb24pKSB7CisgICAgICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNr
aW5nU3RvcmVSZWFkRXJyb3IpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAg
ICAgICBpdC0+bmV4dCgpOyAvLyBNYXhpbXVtIGluZGV4IGlkIGFsbG9jYXRlZC4KKyAgICAgICAg
aWYgKCFjaGVja09iamVjdFN0b3JlQW5kTWV0YURhdGFUeXBlKGl0LmdldCgpLCBzdG9wS2V5LCBv
YmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpNYXhJbmRleElkKSkgeworICAg
ICAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlUmVhZEVycm9yKTsK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGludDY0X3QgbWF4SW5kZXhJ
ZCA9IGRlY29kZUludChpdC0+dmFsdWUoKS5iZWdpbigpLCBpdC0+dmFsdWUoKS5lbmQoKSk7CisK
KyAgICAgICAgaXQtPm5leHQoKTsgLy8gW29wdGlvbmFsXSBoYXMga2V5IHBhdGggKGlzIG5vdCBu
dWxsKQorICAgICAgICBpZiAoY2hlY2tPYmplY3RTdG9yZUFuZE1ldGFEYXRhVHlwZShpdC5nZXQo
KSwgc3RvcEtleSwgb2JqZWN0U3RvcmVJZCwgT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6SGFzS2V5
UGF0aCkpIHsKKyAgICAgICAgICAgIGJvb2wgaGFzS2V5UGF0aCA9IGRlY29kZUJvb2woaXQtPnZh
bHVlKCkuYmVnaW4oKSwgaXQtPnZhbHVlKCkuZW5kKCkpOworICAgICAgICAgICAgLy8gVGhpcyBj
aGVjayBhY2NvdW50cyBmb3IgdHdvIGxheWVycyBvZiBsZWdhY3kgY29kaW5nOgorICAgICAgICAg
ICAgLy8gKDEpIEluaXRpYWxseSwgaGFzS2V5UGF0aCB3YXMgYWRkZWQgdG8gZGlzdGluZ3Vpc2gg
bnVsbCB2cy4gc3RyaW5nLgorICAgICAgICAgICAgLy8gKDIpIExhdGVyLCBudWxsIHZzLiBzdHJp
bmcgdnMuIGFycmF5IHdhcyBzdG9yZWQgaW4gdGhlIGtleVBhdGggaXRzZWxmLgorICAgICAgICAg
ICAgLy8gU28gdGhpcyBjaGVjayBpcyBvbmx5IHJlbGV2YW50IGZvciBzdHJpbmctdHlwZSBrZXlQ
YXRocy4KKyAgICAgICAgICAgIGlmICghaGFzS2V5UGF0aCAmJiAoa2V5UGF0aC50eXBlKCkgPT0g
SURCS2V5UGF0aDo6U3RyaW5nVHlwZSAmJiAha2V5UGF0aC5zdHJpbmcoKS5pc0VtcHR5KCkpKSB7
CisgICAgICAgICAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlUmVh
ZEVycm9yKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGlmICghaGFzS2V5UGF0aCkKKyAgICAgICAgICAgICAgICBrZXlQYXRoID0gSURCS2V5UGF0
aCgpOworICAgICAgICAgICAgaXQtPm5leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGludDY0
X3Qga2V5R2VuZXJhdG9yQ3VycmVudE51bWJlciA9IC0xOworICAgICAgICBpZiAoY2hlY2tPYmpl
Y3RTdG9yZUFuZE1ldGFEYXRhVHlwZShpdC5nZXQoKSwgc3RvcEtleSwgb2JqZWN0U3RvcmVJZCwg
T2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6S2V5R2VuZXJhdG9yQ3VycmVudE51bWJlcikpIHsKKyAg
ICAgICAgICAgIGtleUdlbmVyYXRvckN1cnJlbnROdW1iZXIgPSBkZWNvZGVJbnQoaXQtPnZhbHVl
KCkuYmVnaW4oKSwgaXQtPnZhbHVlKCkuZW5kKCkpOworICAgICAgICAgICAgLy8gRklYTUU6IFJl
dHVybiBrZXlHZW5lcmF0b3JDdXJyZW50TnVtYmVyLCBjYWNoZSBpbiBvYmplY3Qgc3RvcmUsIGFu
ZCB3cml0ZSBsYXppbHkgdG8gYmFja2luZyBzdG9yZS4KKyAgICAgICAgICAgIC8vIEZvciBub3cs
IGp1c3QgYXNzZXJ0IHRoYXQgaWYgaXQgd2FzIHdyaXR0ZW4gaXQgd2FzIHZhbGlkLgorICAgICAg
ICAgICAgQVNTRVJUX1VOVVNFRChrZXlHZW5lcmF0b3JDdXJyZW50TnVtYmVyLCBrZXlHZW5lcmF0
b3JDdXJyZW50TnVtYmVyID49IEtleUdlbmVyYXRvckluaXRpYWxOdW1iZXIpOworICAgICAgICAg
ICAgaXQtPm5leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIG9iamVjdFN0b3Jlcy5hcHBlbmQo
SURCT2JqZWN0U3RvcmVNZXRhZGF0YShvYmplY3RTdG9yZU5hbWUsIG9iamVjdFN0b3JlSWQsIGtl
eVBhdGgsIGF1dG9JbmNyZW1lbnQsIG1heEluZGV4SWQpKTsKKyAgICB9CisgICAgcmV0dXJuIG9i
amVjdFN0b3JlczsKK30KKworc3RhdGljIGJvb2wgc2V0TWF4T2JqZWN0U3RvcmVJZChMZXZlbERC
VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2Jq
ZWN0U3RvcmVJZCkKK3sKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gbWF4T2JqZWN0U3RvcmVJZEtl
eSA9IERhdGFiYXNlTWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBEYXRhYmFzZU1ldGFE
YXRhS2V5OjpNYXhPYmplY3RTdG9yZUlkKTsKKyAgICBpbnQ2NF90IG1heE9iamVjdFN0b3JlSWQg
PSBnZXRNYXhPYmplY3RTdG9yZUlkKHRyYW5zYWN0aW9uLCBtYXhPYmplY3RTdG9yZUlkS2V5KTsK
KworICAgIGlmIChvYmplY3RTdG9yZUlkIDw9IG1heE9iamVjdFN0b3JlSWQpIHsKKyAgICAgICAg
SW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlQ29uc2lzdGVuY3lFcnJvcik7Cisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFwdXRJbnQodHJhbnNhY3Rpb24s
IG1heE9iamVjdFN0b3JlSWRLZXksIG9iamVjdFN0b3JlSWQpKSB7CisgICAgICAgIEludGVybmFs
RXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVdyaXRlRXJyb3IpOworICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIElEQkxldmVsREJCYWNr
aW5nU3RvcmU6OmNyZWF0ZU9iamVjdFN0b3JlKElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24q
IHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwg
Y29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBJREJLZXlQYXRoJiBrZXlQYXRoLCBib29sIGF1dG9J
bmNyZW1lbnQpCit7CisgICAgSURCX1RSQUNFKCJJREJMZXZlbERCQmFja2luZ1N0b3JlOjpjcmVh
dGVPYmplY3RTdG9yZSIpOworICAgIExldmVsREJUcmFuc2FjdGlvbiogbGV2ZWxEQlRyYW5zYWN0
aW9uID0gVHJhbnNhY3Rpb246OmxldmVsREJUcmFuc2FjdGlvbkZyb20odHJhbnNhY3Rpb24pOwor
ICAgIGlmICghc2V0TWF4T2JqZWN0U3RvcmVJZChsZXZlbERCVHJhbnNhY3Rpb24sIGRhdGFiYXNl
SWQsIG9iamVjdFN0b3JlSWQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBjb25zdCBW
ZWN0b3I8Y2hhcj4gbmFtZUtleSA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRh
YmFzZUlkLCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpOYW1lKTsKKyAg
ICBjb25zdCBWZWN0b3I8Y2hhcj4ga2V5UGF0aEtleSA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6
OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5
OjpLZXlQYXRoKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gYXV0b0luY3JlbWVudEtleSA9IE9i
amVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBP
YmplY3RTdG9yZU1ldGFEYXRhS2V5OjpBdXRvSW5jcmVtZW50KTsKKyAgICBjb25zdCBWZWN0b3I8
Y2hhcj4gZXZpY3RhYmxlS2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFi
YXNlSWQsIG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OkV2aWN0YWJsZSk7
CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IGxhc3RWZXJzaW9uS2V5ID0gT2JqZWN0U3RvcmVNZXRh
RGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlTWV0
YURhdGFLZXk6Okxhc3RWZXJzaW9uKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gbWF4SW5kZXhJ
ZEtleSA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RT
dG9yZUlkLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpNYXhJbmRleElkKTsKKyAgICBjb25zdCBW
ZWN0b3I8Y2hhcj4gaGFzS2V5UGF0aEtleSAgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNv
ZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6SGFz
S2V5UGF0aCk7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IGtleUdlbmVyYXRvckN1cnJlbnROdW1i
ZXJLZXkgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmVJZCwgT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6S2V5R2VuZXJhdG9yQ3VycmVudE51bWJl
cik7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IG5hbWVzS2V5ID0gT2JqZWN0U3RvcmVOYW1lc0tl
eTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG5hbWUpOworCisgICAgYm9vbCBvayA9IHB1dFN0cmluZyhs
ZXZlbERCVHJhbnNhY3Rpb24sIG5hbWVLZXksIG5hbWUpOworICAgIGlmICghb2spIHsKKyAgICAg
ICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlV3JpdGVFcnJvcik7CisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBvayA9IHB1dElEQktleVBhdGgobGV2ZWxE
QlRyYW5zYWN0aW9uLCBrZXlQYXRoS2V5LCBrZXlQYXRoKTsKKyAgICBpZiAoIW9rKSB7CisgICAg
ICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVdyaXRlRXJyb3IpOworICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgb2sgPSBwdXRJbnQobGV2ZWxEQlRyYW5z
YWN0aW9uLCBhdXRvSW5jcmVtZW50S2V5LCBhdXRvSW5jcmVtZW50KTsKKyAgICBpZiAoIW9rKSB7
CisgICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVdyaXRlRXJyb3Ip
OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgb2sgPSBwdXRJbnQobGV2ZWxE
QlRyYW5zYWN0aW9uLCBldmljdGFibGVLZXksIGZhbHNlKTsKKyAgICBpZiAoIW9rKSB7CisgICAg
ICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVdyaXRlRXJyb3IpOworICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgb2sgPSBwdXRJbnQobGV2ZWxEQlRyYW5z
YWN0aW9uLCBsYXN0VmVyc2lvbktleSwgMSk7CisgICAgaWYgKCFvaykgeworICAgICAgICBJbnRl
cm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVXcml0ZUVycm9yKTsKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgIH0KKworICAgIG9rID0gcHV0SW50KGxldmVsREJUcmFuc2FjdGlvbiwg
bWF4SW5kZXhJZEtleSwgTWluaW11bUluZGV4SWQpOworICAgIGlmICghb2spIHsKKyAgICAgICAg
SW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlV3JpdGVFcnJvcik7CisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBvayA9IHB1dEJvb2wobGV2ZWxEQlRyYW5zYWN0
aW9uLCBoYXNLZXlQYXRoS2V5LCAha2V5UGF0aC5pc051bGwoKSk7CisgICAgaWYgKCFvaykgewor
ICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVXcml0ZUVycm9yKTsK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG9rID0gcHV0SW50KGxldmVsREJU
cmFuc2FjdGlvbiwga2V5R2VuZXJhdG9yQ3VycmVudE51bWJlcktleSwgS2V5R2VuZXJhdG9ySW5p
dGlhbE51bWJlcik7CisgICAgaWYgKCFvaykgeworICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxl
dmVsREJCYWNraW5nU3RvcmVXcml0ZUVycm9yKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IH0KKworICAgIG9rID0gcHV0SW50KGxldmVsREJUcmFuc2FjdGlvbiwgbmFtZXNLZXksIG9iamVj
dFN0b3JlSWQpOworICAgIGlmICghb2spIHsKKyAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZl
bERCQmFja2luZ1N0b3JlV3JpdGVFcnJvcik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9
CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpk
ZWxldGVPYmplY3RTdG9yZShJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlv
biwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpCit7CisgICAgSURC
X1RSQUNFKCJJREJMZXZlbERCQmFja2luZ1N0b3JlOjpkZWxldGVPYmplY3RTdG9yZSIpOworICAg
IExldmVsREJUcmFuc2FjdGlvbiogbGV2ZWxEQlRyYW5zYWN0aW9uID0gVHJhbnNhY3Rpb246Omxl
dmVsREJUcmFuc2FjdGlvbkZyb20odHJhbnNhY3Rpb24pOworCisgICAgU3RyaW5nIG9iamVjdFN0
b3JlTmFtZTsKKyAgICBnZXRTdHJpbmcobGV2ZWxEQlRyYW5zYWN0aW9uLCBPYmplY3RTdG9yZU1l
dGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgT2JqZWN0U3RvcmVN
ZXRhRGF0YUtleTo6TmFtZSksIG9iamVjdFN0b3JlTmFtZSk7CisKKyAgICBpZiAoIWRlbGV0ZVJh
bmdlKGxldmVsREJUcmFuc2FjdGlvbiwgT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRh
dGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDApLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNv
ZGVNYXhLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCkpKSB7CisgICAgICAgIEludGVybmFs
RXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVdyaXRlRXJyb3IpOworICAgICAgICByZXR1cm47
IC8vIEZJWE1FOiBSZXBvcnQgZXJyb3IuCisgICAgfQorCisgICAgbGV2ZWxEQlRyYW5zYWN0aW9u
LT5yZW1vdmUoT2JqZWN0U3RvcmVOYW1lc0tleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0
b3JlTmFtZSkpOworCisgICAgaWYgKCFkZWxldGVSYW5nZShsZXZlbERCVHJhbnNhY3Rpb24sIElu
ZGV4RnJlZUxpc3RLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAwKSwgSW5k
ZXhGcmVlTGlzdEtleTo6ZW5jb2RlTWF4S2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQpKSkg
eworICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVXcml0ZUVycm9y
KTsKKyAgICAgICAgcmV0dXJuOyAvLyBGSVhNRTogUmVwb3J0IGVycm9yLgorICAgIH0KKyAgICBp
ZiAoIWRlbGV0ZVJhbmdlKGxldmVsREJUcmFuc2FjdGlvbiwgSW5kZXhNZXRhRGF0YUtleTo6ZW5j
b2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDAsIDApLCBJbmRleE1ldGFEYXRhS2V5Ojpl
bmNvZGVNYXhLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCkpKSB7CisgICAgICAgIEludGVy
bmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVdyaXRlRXJyb3IpOworICAgICAgICByZXR1
cm47IC8vIEZJWE1FOiBSZXBvcnQgZXJyb3IuCisgICAgfQorCisgICAgY2xlYXJPYmplY3RTdG9y
ZSh0cmFuc2FjdGlvbiwgZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCk7Cit9CisKK1N0cmluZyBJ
REJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRPYmplY3RTdG9yZVJlY29yZChJREJCYWNraW5nU3Rv
cmU6OlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90
IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYga2V5KQoreworICAgIElEQl9UUkFDRSgiSURC
TGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3RvcmVSZWNvcmQiKTsKKyAgICBMZXZlbERC
VHJhbnNhY3Rpb24qIGxldmVsREJUcmFuc2FjdGlvbiA9IFRyYW5zYWN0aW9uOjpsZXZlbERCVHJh
bnNhY3Rpb25Gcm9tKHRyYW5zYWN0aW9uKTsKKworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBsZXZl
bGRiS2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3Rv
cmVJZCwga2V5KTsKKyAgICBWZWN0b3I8Y2hhcj4gZGF0YTsKKworICAgIGlmICghbGV2ZWxEQlRy
YW5zYWN0aW9uLT5nZXQobGV2ZWxkYktleSwgZGF0YSkpCisgICAgICAgIHJldHVybiBTdHJpbmco
KTsKKworICAgIGludDY0X3QgdmVyc2lvbjsKKyAgICBjb25zdCBjaGFyKiBwID0gZGVjb2RlVmFy
SW50KGRhdGEuYmVnaW4oKSwgZGF0YS5lbmQoKSwgdmVyc2lvbik7CisgICAgaWYgKCFwKSB7Cisg
ICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVJlYWRFcnJvcik7Cisg
ICAgICAgIHJldHVybiBTdHJpbmcoKTsKKyAgICB9CisgICAgKHZvaWQpIHZlcnNpb247CisKKyAg
ICByZXR1cm4gZGVjb2RlU3RyaW5nKHAsIGRhdGEuZW5kKCkpOworfQorCituYW1lc3BhY2Ugewor
Y2xhc3MgTGV2ZWxEQlJlY29yZElkZW50aWZpZXIgOiBwdWJsaWMgSURCQmFja2luZ1N0b3JlOjpP
YmplY3RTdG9yZVJlY29yZElkZW50aWZpZXIgeworcHVibGljOgorICAgIHN0YXRpYyBQYXNzUmVm
UHRyPExldmVsREJSZWNvcmRJZGVudGlmaWVyPiBjcmVhdGUoY29uc3QgVmVjdG9yPGNoYXI+JiBw
cmltYXJ5S2V5LCBpbnQ2NF90IHZlcnNpb24pIHsgcmV0dXJuIGFkb3B0UmVmKG5ldyBMZXZlbERC
UmVjb3JkSWRlbnRpZmllcihwcmltYXJ5S2V5LCB2ZXJzaW9uKSk7IH0KKyAgICBzdGF0aWMgUGFz
c1JlZlB0cjxMZXZlbERCUmVjb3JkSWRlbnRpZmllcj4gY3JlYXRlKCkgeyByZXR1cm4gYWRvcHRS
ZWYobmV3IExldmVsREJSZWNvcmRJZGVudGlmaWVyKCkpOyB9CisKKyAgICB2aXJ0dWFsIGJvb2wg
aXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIG1fcHJpbWFyeUtleS5pc0VtcHR5KCk7IH0KKyAgICBW
ZWN0b3I8Y2hhcj4gcHJpbWFyeUtleSgpIGNvbnN0IHsgcmV0dXJuIG1fcHJpbWFyeUtleTsgfQor
ICAgIHZvaWQgc2V0UHJpbWFyeUtleShjb25zdCBWZWN0b3I8Y2hhcj4mIHByaW1hcnlLZXkpIHsg
bV9wcmltYXJ5S2V5ID0gcHJpbWFyeUtleTsgfQorICAgIGludDY0X3QgdmVyc2lvbigpIGNvbnN0
IHsgcmV0dXJuIG1fdmVyc2lvbjsgfQorICAgIHZvaWQgc2V0VmVyc2lvbihpbnQ2NF90IHZlcnNp
b24pIHsgbV92ZXJzaW9uID0gdmVyc2lvbjsgfQorCitwcml2YXRlOgorICAgIExldmVsREJSZWNv
cmRJZGVudGlmaWVyKGNvbnN0IFZlY3RvcjxjaGFyPiYgcHJpbWFyeUtleSwgaW50NjRfdCB2ZXJz
aW9uKSA6IG1fcHJpbWFyeUtleShwcmltYXJ5S2V5KSwgbV92ZXJzaW9uKHZlcnNpb24pIHsgQVNT
RVJUKCFwcmltYXJ5S2V5LmlzRW1wdHkoKSk7IH0KKyAgICBMZXZlbERCUmVjb3JkSWRlbnRpZmll
cigpIDogbV9wcmltYXJ5S2V5KCksIG1fdmVyc2lvbigtMSkgeyB9CisKKyAgICBWZWN0b3I8Y2hh
cj4gbV9wcmltYXJ5S2V5OyAvLyBGSVhNRTogTWFrZSBpdCBtb3JlIGNsZWFyIHRoYXQgdGhpcyBp
cyB0aGUgKmVuY29kZWQqIHZlcnNpb24gb2YgdGhlIGtleS4KKyAgICBpbnQ2NF90IG1fdmVyc2lv
bjsKK307Cit9CisKK3N0YXRpYyBpbnQ2NF90IGdldE5ld1ZlcnNpb25OdW1iZXIoTGV2ZWxEQlRy
YW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVj
dFN0b3JlSWQpCit7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IGxhc3RWZXJzaW9uS2V5ID0gT2Jq
ZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIE9i
amVjdFN0b3JlTWV0YURhdGFLZXk6Okxhc3RWZXJzaW9uKTsKKworICAgIGludDY0X3QgbGFzdFZl
cnNpb24gPSAtMTsKKyAgICBpZiAoIWdldEludCh0cmFuc2FjdGlvbiwgbGFzdFZlcnNpb25LZXks
IGxhc3RWZXJzaW9uKSkKKyAgICAgICAgbGFzdFZlcnNpb24gPSAwOworCisgICAgQVNTRVJUKGxh
c3RWZXJzaW9uID49IDApOworCisgICAgaW50NjRfdCB2ZXJzaW9uID0gbGFzdFZlcnNpb24gKyAx
OworICAgIGJvb2wgb2sgPSBwdXRJbnQodHJhbnNhY3Rpb24sIGxhc3RWZXJzaW9uS2V5LCB2ZXJz
aW9uKTsKKyAgICBBU1NFUlRfVU5VU0VEKG9rLCBvayk7CisKKyAgICBBU1NFUlQodmVyc2lvbiA+
IGxhc3RWZXJzaW9uKTsgLy8gRklYTUU6IFRoaW5rIGFib3V0IGhvdyB3ZSB3YW50IHRvIGhhbmRs
ZSB0aGUgb3ZlcmZsb3cgc2NlbmFyaW8uCisKKyAgICByZXR1cm4gdmVyc2lvbjsKK30KKworYm9v
bCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpwdXRPYmplY3RTdG9yZVJlY29yZChJREJCYWNraW5n
U3RvcmU6OlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2
NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYga2V5LCBjb25zdCBTdHJpbmcmIHZhbHVl
LCBPYmplY3RTdG9yZVJlY29yZElkZW50aWZpZXIqIHJlY29yZElkZW50aWZpZXIpCit7CisgICAg
SURCX1RSQUNFKCJJREJMZXZlbERCQmFja2luZ1N0b3JlOjpwdXRPYmplY3RTdG9yZVJlY29yZCIp
OworICAgIEFTU0VSVChrZXkuaXNWYWxpZCgpKTsKKyAgICBMZXZlbERCVHJhbnNhY3Rpb24qIGxl
dmVsREJUcmFuc2FjdGlvbiA9IFRyYW5zYWN0aW9uOjpsZXZlbERCVHJhbnNhY3Rpb25Gcm9tKHRy
YW5zYWN0aW9uKTsKKyAgICBpbnQ2NF90IHZlcnNpb24gPSBnZXROZXdWZXJzaW9uTnVtYmVyKGxl
dmVsREJUcmFuc2FjdGlvbiwgZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCk7CisgICAgY29uc3Qg
VmVjdG9yPGNoYXI+IG9iamVjdFN0b3JlZGF0YUtleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5j
b2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGtleSk7CisKKyAgICBWZWN0b3I8Y2hhcj4g
djsKKyAgICB2LmFwcGVuZChlbmNvZGVWYXJJbnQodmVyc2lvbikpOworICAgIHYuYXBwZW5kKGVu
Y29kZVN0cmluZyh2YWx1ZSkpOworCisgICAgaWYgKCFsZXZlbERCVHJhbnNhY3Rpb24tPnB1dChv
YmplY3RTdG9yZWRhdGFLZXksIHYpKSB7CisgICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxE
QkJhY2tpbmdTdG9yZVdyaXRlRXJyb3IpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQor
CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IGV4aXN0c0VudHJ5S2V5ID0gRXhpc3RzRW50cnlLZXk6
OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBrZXkpOworICAgIGlmICghbGV2ZWxE
QlRyYW5zYWN0aW9uLT5wdXQoZXhpc3RzRW50cnlLZXksIGVuY29kZUludCh2ZXJzaW9uKSkpIHsK
KyAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlV3JpdGVFcnJvcik7
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBMZXZlbERCUmVjb3JkSWRlbnRp
ZmllciogbGV2ZWxEQlJlY29yZElkZW50aWZpZXIgPSBzdGF0aWNfY2FzdDxMZXZlbERCUmVjb3Jk
SWRlbnRpZmllcio+KHJlY29yZElkZW50aWZpZXIpOworICAgIGxldmVsREJSZWNvcmRJZGVudGlm
aWVyLT5zZXRQcmltYXJ5S2V5KGVuY29kZUlEQktleShrZXkpKTsKKyAgICBsZXZlbERCUmVjb3Jk
SWRlbnRpZmllci0+c2V0VmVyc2lvbih2ZXJzaW9uKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwor
dm9pZCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpjbGVhck9iamVjdFN0b3JlKElEQkJhY2tpbmdT
dG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0
X3Qgb2JqZWN0U3RvcmVJZCkKK3sKKyAgICBJREJfVFJBQ0UoIklEQkxldmVsREJCYWNraW5nU3Rv
cmU6OmNsZWFyT2JqZWN0U3RvcmUiKTsKKyAgICBMZXZlbERCVHJhbnNhY3Rpb24qIGxldmVsREJU
cmFuc2FjdGlvbiA9IFRyYW5zYWN0aW9uOjpsZXZlbERCVHJhbnNhY3Rpb25Gcm9tKHRyYW5zYWN0
aW9uKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3RhcnRLZXkgPSBLZXlQcmVmaXgoZGF0YWJh
c2VJZCwgb2JqZWN0U3RvcmVJZCwgMCkuZW5jb2RlKCk7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+
IHN0b3BLZXkgPSBLZXlQcmVmaXgoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCArIDEsIDApLmVu
Y29kZSgpOworCisgICAgZGVsZXRlUmFuZ2UobGV2ZWxEQlRyYW5zYWN0aW9uLCBzdGFydEtleSwg
c3RvcEtleSk7Cit9CisKK1Bhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJl
Y29yZElkZW50aWZpZXI+IElEQkxldmVsREJCYWNraW5nU3RvcmU6OmNyZWF0ZUludmFsaWRSZWNv
cmRJZGVudGlmaWVyKCkKK3sKKyAgICByZXR1cm4gTGV2ZWxEQlJlY29yZElkZW50aWZpZXI6OmNy
ZWF0ZSgpOworfQorCit2b2lkIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmRlbGV0ZU9iamVjdFN0
b3JlUmVjb3JkKElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2
NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgT2JqZWN0U3RvcmVS
ZWNvcmRJZGVudGlmaWVyKiByZWNvcmRJZGVudGlmaWVyKQoreworICAgIElEQl9UUkFDRSgiSURC
TGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlT2JqZWN0U3RvcmVSZWNvcmQiKTsKKyAgICBMZXZl
bERCVHJhbnNhY3Rpb24qIGxldmVsREJUcmFuc2FjdGlvbiA9IFRyYW5zYWN0aW9uOjpsZXZlbERC
VHJhbnNhY3Rpb25Gcm9tKHRyYW5zYWN0aW9uKTsKKyAgICBjb25zdCBMZXZlbERCUmVjb3JkSWRl
bnRpZmllciogbGV2ZWxEQlJlY29yZElkZW50aWZpZXIgPSBzdGF0aWNfY2FzdDxjb25zdCBMZXZl
bERCUmVjb3JkSWRlbnRpZmllcio+KHJlY29yZElkZW50aWZpZXIpOworCisgICAgY29uc3QgVmVj
dG9yPGNoYXI+IG9iamVjdFN0b3JlRGF0YUtleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2Rl
KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGxldmVsREJSZWNvcmRJZGVudGlmaWVyLT5wcmlt
YXJ5S2V5KCkpOworICAgIGxldmVsREJUcmFuc2FjdGlvbi0+cmVtb3ZlKG9iamVjdFN0b3JlRGF0
YUtleSk7CisKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gZXhpc3RzRW50cnlLZXkgPSBFeGlzdHNF
bnRyeUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGxldmVsREJSZWNvcmRJ
ZGVudGlmaWVyLT5wcmltYXJ5S2V5KCkpOworICAgIGxldmVsREJUcmFuc2FjdGlvbi0+cmVtb3Zl
KGV4aXN0c0VudHJ5S2V5KTsKK30KKworCitpbnQ2NF90IElEQkxldmVsREJCYWNraW5nU3RvcmU6
OmdldEtleUdlbmVyYXRvckN1cnJlbnROdW1iZXIoSURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlv
biogdHJhbnNhY3Rpb24sIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlk
KQoreworICAgIExldmVsREJUcmFuc2FjdGlvbiogbGV2ZWxEQlRyYW5zYWN0aW9uID0gVHJhbnNh
Y3Rpb246OmxldmVsREJUcmFuc2FjdGlvbkZyb20odHJhbnNhY3Rpb24pOworCisgICAgY29uc3Qg
VmVjdG9yPGNoYXI+IGtleUdlbmVyYXRvckN1cnJlbnROdW1iZXJLZXkgPSBPYmplY3RTdG9yZU1l
dGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgT2JqZWN0U3RvcmVN
ZXRhRGF0YUtleTo6S2V5R2VuZXJhdG9yQ3VycmVudE51bWJlcik7CisKKyAgICBpbnQ2NF90IGtl
eUdlbmVyYXRvckN1cnJlbnROdW1iZXIgPSAtMTsKKyAgICBWZWN0b3I8Y2hhcj4gZGF0YTsKKwor
ICAgIGlmIChsZXZlbERCVHJhbnNhY3Rpb24tPmdldChrZXlHZW5lcmF0b3JDdXJyZW50TnVtYmVy
S2V5LCBkYXRhKSkKKyAgICAgICAga2V5R2VuZXJhdG9yQ3VycmVudE51bWJlciA9IGRlY29kZUlu
dChkYXRhLmJlZ2luKCksIGRhdGEuZW5kKCkpOworICAgIGVsc2UgeworICAgICAgICAvLyBQcmV2
aW91c2x5LCB0aGUga2V5IGdlbmVyYXRvciBzdGF0ZSB3YXMgbm90IHN0b3JlZCBleHBsaWNpdGx5
IGJ1dCBkZXJpdmVkIGZyb20gdGhlCisgICAgICAgIC8vIG1heGltdW0gbnVtZXJpYyBrZXkgcHJl
c2VudCBpbiBleGlzdGluZyBkYXRhLiBUaGlzIHZpb2xhdGVzIHRoZSBzcGVjIGFzIHRoZSBkYXRh
IG1heQorICAgICAgICAvLyBiZSBjbGVhcmVkIGJ1dCB0aGUga2V5IGdlbmVyYXRvciBzdGF0ZSBt
dXN0IGJlIHByZXNlcnZlZC4KKyAgICAgICAgY29uc3QgVmVjdG9yPGNoYXI+IHN0YXJ0S2V5ID0g
T2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgbWlu
SURCS2V5KCkpOworICAgICAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3RvcEtleSA9IE9iamVjdFN0
b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIG1heElEQktleSgp
KTsKKworICAgICAgICBPd25QdHI8TGV2ZWxEQkl0ZXJhdG9yPiBpdCA9IGxldmVsREJUcmFuc2Fj
dGlvbi0+Y3JlYXRlSXRlcmF0b3IoKTsKKyAgICAgICAgaW50NjRfdCBtYXhOdW1lcmljS2V5ID0g
MDsKKworICAgICAgICBmb3IgKGl0LT5zZWVrKHN0YXJ0S2V5KTsgaXQtPmlzVmFsaWQoKSAmJiBj
b21wYXJlS2V5cyhpdC0+a2V5KCksIHN0b3BLZXkpIDwgMDsgaXQtPm5leHQoKSkgeworICAgICAg
ICAgICAgY29uc3QgY2hhciogcCA9IGl0LT5rZXkoKS5iZWdpbigpOworICAgICAgICAgICAgY29u
c3QgY2hhciogbGltaXQgPSBpdC0+a2V5KCkuZW5kKCk7CisKKyAgICAgICAgICAgIE9iamVjdFN0
b3JlRGF0YUtleSBkYXRhS2V5OworICAgICAgICAgICAgcCA9IE9iamVjdFN0b3JlRGF0YUtleTo6
ZGVjb2RlKHAsIGxpbWl0LCAmZGF0YUtleSk7CisgICAgICAgICAgICBBU1NFUlQocCk7CisKKyAg
ICAgICAgICAgIGlmIChkYXRhS2V5LnVzZXJLZXkoKS0+dHlwZSgpID09IElEQktleTo6TnVtYmVy
VHlwZSkgeworICAgICAgICAgICAgICAgIGludDY0X3QgbiA9IHN0YXRpY19jYXN0PGludDY0X3Q+
KGRhdGFLZXkudXNlcktleSgpLT5udW1iZXIoKSk7CisgICAgICAgICAgICAgICAgaWYgKG4gPiBt
YXhOdW1lcmljS2V5KQorICAgICAgICAgICAgICAgICAgICBtYXhOdW1lcmljS2V5ID0gbjsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGtleUdlbmVyYXRvckN1cnJlbnROdW1i
ZXIgPSBtYXhOdW1lcmljS2V5ICsgMTsKKyAgICB9CisKKyAgICByZXR1cm4ga2V5R2VuZXJhdG9y
Q3VycmVudE51bWJlcjsKK30KKworYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjptYXliZVVw
ZGF0ZUtleUdlbmVyYXRvckN1cnJlbnROdW1iZXIoSURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlv
biogdHJhbnNhY3Rpb24sIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlk
LCBpbnQ2NF90IG5ld051bWJlciwgYm9vbCBjaGVja0N1cnJlbnQpCit7CisgICAgTGV2ZWxEQlRy
YW5zYWN0aW9uKiBsZXZlbERCVHJhbnNhY3Rpb24gPSBUcmFuc2FjdGlvbjo6bGV2ZWxEQlRyYW5z
YWN0aW9uRnJvbSh0cmFuc2FjdGlvbik7CisKKyAgICBpZiAoY2hlY2tDdXJyZW50KSB7CisgICAg
ICAgIGludDY0X3QgY3VycmVudE51bWJlciA9IGdldEtleUdlbmVyYXRvckN1cnJlbnROdW1iZXIo
dHJhbnNhY3Rpb24sIGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQpOworICAgICAgICBpZiAobmV3
TnVtYmVyIDw9IGN1cnJlbnROdW1iZXIpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9
CisKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4ga2V5R2VuZXJhdG9yQ3VycmVudE51bWJlcktleSA9
IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlk
LCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpLZXlHZW5lcmF0b3JDdXJyZW50TnVtYmVyKTsKKyAg
ICBib29sIG9rID0gcHV0SW50KGxldmVsREJUcmFuc2FjdGlvbiwga2V5R2VuZXJhdG9yQ3VycmVu
dE51bWJlcktleSwgbmV3TnVtYmVyKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIEludGVybmFs
RXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVdyaXRlRXJyb3IpOworICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIElEQkxldmVsREJCYWNr
aW5nU3RvcmU6OmtleUV4aXN0c0luT2JqZWN0U3RvcmUoSURCQmFja2luZ1N0b3JlOjpUcmFuc2Fj
dGlvbiogdHJhbnNhY3Rpb24sIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9y
ZUlkLCBjb25zdCBJREJLZXkmIGtleSwgT2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyKiBmb3Vu
ZFJlY29yZElkZW50aWZpZXIpCit7CisgICAgSURCX1RSQUNFKCJJREJMZXZlbERCQmFja2luZ1N0
b3JlOjprZXlFeGlzdHNJbk9iamVjdFN0b3JlIik7CisgICAgTGV2ZWxEQlRyYW5zYWN0aW9uKiBs
ZXZlbERCVHJhbnNhY3Rpb24gPSBUcmFuc2FjdGlvbjo6bGV2ZWxEQlRyYW5zYWN0aW9uRnJvbSh0
cmFuc2FjdGlvbik7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IGxldmVsZGJLZXkgPSBPYmplY3RT
dG9yZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBrZXkpOworICAg
IFZlY3RvcjxjaGFyPiBkYXRhOworCisgICAgaWYgKCFsZXZlbERCVHJhbnNhY3Rpb24tPmdldChs
ZXZlbGRiS2V5LCBkYXRhKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaW50NjRfdCB2
ZXJzaW9uOworICAgIGlmICghZGVjb2RlVmFySW50KGRhdGEuYmVnaW4oKSwgZGF0YS5lbmQoKSwg
dmVyc2lvbikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIExldmVsREJSZWNvcmRJZGVu
dGlmaWVyKiBsZXZlbERCUmVjb3JkSWRlbnRpZmllciA9IHN0YXRpY19jYXN0PExldmVsREJSZWNv
cmRJZGVudGlmaWVyKj4oZm91bmRSZWNvcmRJZGVudGlmaWVyKTsKKyAgICBsZXZlbERCUmVjb3Jk
SWRlbnRpZmllci0+c2V0UHJpbWFyeUtleShlbmNvZGVJREJLZXkoa2V5KSk7CisgICAgbGV2ZWxE
QlJlY29yZElkZW50aWZpZXItPnNldFZlcnNpb24odmVyc2lvbik7CisgICAgcmV0dXJuIHRydWU7
Cit9CisKK2Jvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Zm9yRWFjaE9iamVjdFN0b3JlUmVj
b3JkKElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRh
dGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgT2JqZWN0U3RvcmVSZWNvcmRDYWxsYmFj
ayYgY2FsbGJhY2spCit7CisgICAgTGV2ZWxEQlRyYW5zYWN0aW9uKiBsZXZlbERCVHJhbnNhY3Rp
b24gPSBUcmFuc2FjdGlvbjo6bGV2ZWxEQlRyYW5zYWN0aW9uRnJvbSh0cmFuc2FjdGlvbik7Cisg
ICAgY29uc3QgVmVjdG9yPGNoYXI+IHN0YXJ0S2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNv
ZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgbWluSURCS2V5KCkpOworICAgIGNvbnN0IFZl
Y3RvcjxjaGFyPiBzdG9wS2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCwgbWF4SURCS2V5KCkpOworCisgICAgT3duUHRyPExldmVsREJJdGVy
YXRvcj4gaXQgPSBsZXZlbERCVHJhbnNhY3Rpb24tPmNyZWF0ZUl0ZXJhdG9yKCk7CisgICAgZm9y
IChpdC0+c2VlayhzdGFydEtleSk7IGl0LT5pc1ZhbGlkKCkgJiYgY29tcGFyZUtleXMoaXQtPmtl
eSgpLCBzdG9wS2V5KSA8IDA7IGl0LT5uZXh0KCkpIHsKKyAgICAgICAgY29uc3QgY2hhciogcCA9
IGl0LT5rZXkoKS5iZWdpbigpOworICAgICAgICBjb25zdCBjaGFyKiBsaW1pdCA9IGl0LT5rZXko
KS5lbmQoKTsKKyAgICAgICAgT2JqZWN0U3RvcmVEYXRhS2V5IGRhdGFLZXk7CisgICAgICAgIHAg
PSBPYmplY3RTdG9yZURhdGFLZXk6OmRlY29kZShwLCBsaW1pdCwgJmRhdGFLZXkpOworICAgICAg
ICBBU1NFUlQocCk7CisKKyAgICAgICAgUmVmUHRyPElEQktleT4gcHJpbWFyeUtleSA9IGRhdGFL
ZXkudXNlcktleSgpOworCisgICAgICAgIGludDY0X3QgdmVyc2lvbjsKKyAgICAgICAgY29uc3Qg
Y2hhciogcSA9IGRlY29kZVZhckludChpdC0+dmFsdWUoKS5iZWdpbigpLCBpdC0+dmFsdWUoKS5l
bmQoKSwgdmVyc2lvbik7CisgICAgICAgIGlmICghcSkgeworICAgICAgICAgICAgSW50ZXJuYWxF
cnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlUmVhZEVycm9yKTsKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIFJlZlB0cjxMZXZlbERCUmVjb3JkSWRlbnRp
Zmllcj4gcmkgPSBMZXZlbERCUmVjb3JkSWRlbnRpZmllcjo6Y3JlYXRlKGVuY29kZUlEQktleSgq
cHJpbWFyeUtleSksIHZlcnNpb24pOworICAgICAgICBTdHJpbmcgaWRiVmFsdWUgPSBkZWNvZGVT
dHJpbmcocSwgaXQtPnZhbHVlKCkuZW5kKCkpOworCisgICAgICAgIGlmICghY2FsbGJhY2suY2Fs
bGJhY2socmkuZ2V0KCksIGlkYlZhbHVlKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tJbmRleEFuZE1l
dGFEYXRhS2V5KGNvbnN0IExldmVsREJJdGVyYXRvciogaXQsIGNvbnN0IFZlY3RvcjxjaGFyPiYg
c3RvcEtleSwgaW50NjRfdCBpbmRleElkLCB1bnNpZ25lZCBjaGFyIG1ldGFEYXRhVHlwZSkKK3sK
KyAgICBpZiAoIWl0LT5pc1ZhbGlkKCkgfHwgY29tcGFyZUtleXMoaXQtPmtleSgpLCBzdG9wS2V5
KSA+PSAwKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBJbmRleE1ldGFEYXRhS2V5IG1l
dGFEYXRhS2V5OworICAgIGNvbnN0IGNoYXIqIHAgPSBJbmRleE1ldGFEYXRhS2V5OjpkZWNvZGUo
aXQtPmtleSgpLmJlZ2luKCksIGl0LT5rZXkoKS5lbmQoKSwgJm1ldGFEYXRhS2V5KTsKKyAgICBB
U1NFUlRfVU5VU0VEKHAsIHApOworICAgIGlmIChtZXRhRGF0YUtleS5pbmRleElkKCkgIT0gaW5k
ZXhJZCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChtZXRhRGF0YUtleS5tZXRhRGF0
YVR5cGUoKSAhPSBtZXRhRGF0YVR5cGUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1
cm4gdHJ1ZTsKK30KKworCitWZWN0b3I8SURCSW5kZXhNZXRhZGF0YT4gSURCTGV2ZWxEQkJhY2tp
bmdTdG9yZTo6Z2V0SW5kZXhlcyhpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3Rv
cmVJZCkKK3sKKyAgICBJREJfVFJBQ0UoIklEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldEluZGV4
ZXMiKTsKKyAgICBWZWN0b3I8SURCSW5kZXhNZXRhZGF0YT4gaW5kZXhlczsKKyAgICBjb25zdCBW
ZWN0b3I8Y2hhcj4gc3RhcnRLZXkgPSBJbmRleE1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCwgMCwgMCk7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IHN0b3BLZXkg
PSBJbmRleE1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCArIDEs
IDAsIDApOworCisgICAgQVNTRVJUKGluZGV4ZXMuaXNFbXB0eSgpKTsKKworICAgIE93blB0cjxM
ZXZlbERCSXRlcmF0b3I+IGl0ID0gbV9kYi0+Y3JlYXRlSXRlcmF0b3IoKTsKKyAgICBpdC0+c2Vl
ayhzdGFydEtleSk7CisgICAgd2hpbGUgKGl0LT5pc1ZhbGlkKCkgJiYgY29tcGFyZUtleXMoaXQt
PmtleSgpLCBzdG9wS2V5KSA8IDApIHsKKyAgICAgICAgY29uc3QgY2hhciogcCA9IGl0LT5rZXko
KS5iZWdpbigpOworICAgICAgICBjb25zdCBjaGFyKiBsaW1pdCA9IGl0LT5rZXkoKS5lbmQoKTsK
KworICAgICAgICBJbmRleE1ldGFEYXRhS2V5IG1ldGFEYXRhS2V5OworICAgICAgICBwID0gSW5k
ZXhNZXRhRGF0YUtleTo6ZGVjb2RlKHAsIGxpbWl0LCAmbWV0YURhdGFLZXkpOworICAgICAgICBB
U1NFUlQocCk7CisgICAgICAgIGlmIChtZXRhRGF0YUtleS5tZXRhRGF0YVR5cGUoKSAhPSBJbmRl
eE1ldGFEYXRhS2V5OjpOYW1lKSB7CisgICAgICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVs
REJCYWNraW5nU3RvcmVSZWFkRXJyb3IpOworICAgICAgICAgICAgLy8gUG9zc2libGUgc3RhbGUg
bWV0YWRhdGEgZHVlIHRvIGh0dHA6Ly93ZWJraXQub3JnL2IvODU1NTcgYnV0IGRvbid0IGZhaWwg
dGhlIGxvYWQuCisgICAgICAgICAgICBpdC0+bmV4dCgpOworICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgIH0KKworICAgICAgICAvLyBGSVhNRTogRG8gdGhpcyBieSBkaXJlY3Qga2V5IGxv
b2t1cCByYXRoZXIgdGhhbiBpdGVyYXRpb24sIHRvIHNpbXBsaWZ5LgorICAgICAgICBpbnQ2NF90
IGluZGV4SWQgPSBtZXRhRGF0YUtleS5pbmRleElkKCk7CisgICAgICAgIFN0cmluZyBpbmRleE5h
bWUgPSBkZWNvZGVTdHJpbmcoaXQtPnZhbHVlKCkuYmVnaW4oKSwgaXQtPnZhbHVlKCkuZW5kKCkp
OworCisgICAgICAgIGl0LT5uZXh0KCk7IC8vIHVuaXF1ZSBmbGFnCisgICAgICAgIGlmICghY2hl
Y2tJbmRleEFuZE1ldGFEYXRhS2V5KGl0LmdldCgpLCBzdG9wS2V5LCBpbmRleElkLCBJbmRleE1l
dGFEYXRhS2V5OjpVbmlxdWUpKSB7CisgICAgICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVs
REJCYWNraW5nU3RvcmVSZWFkRXJyb3IpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0K
KyAgICAgICAgYm9vbCBpbmRleFVuaXF1ZSA9IGRlY29kZUJvb2woaXQtPnZhbHVlKCkuYmVnaW4o
KSwgaXQtPnZhbHVlKCkuZW5kKCkpOworCisgICAgICAgIGl0LT5uZXh0KCk7IC8vIGtleVBhdGgK
KyAgICAgICAgaWYgKCFjaGVja0luZGV4QW5kTWV0YURhdGFLZXkoaXQuZ2V0KCksIHN0b3BLZXks
IGluZGV4SWQsIEluZGV4TWV0YURhdGFLZXk6OktleVBhdGgpKSB7CisgICAgICAgICAgICBJbnRl
cm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVSZWFkRXJyb3IpOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgSURCS2V5UGF0aCBrZXlQYXRoID0gZGVjb2RlSURC
S2V5UGF0aChpdC0+dmFsdWUoKS5iZWdpbigpLCBpdC0+dmFsdWUoKS5lbmQoKSk7CisKKyAgICAg
ICAgaXQtPm5leHQoKTsgLy8gW29wdGlvbmFsXSBtdWx0aUVudHJ5IGZsYWcKKyAgICAgICAgYm9v
bCBpbmRleE11bHRpRW50cnkgPSBmYWxzZTsKKyAgICAgICAgaWYgKGNoZWNrSW5kZXhBbmRNZXRh
RGF0YUtleShpdC5nZXQoKSwgc3RvcEtleSwgaW5kZXhJZCwgSW5kZXhNZXRhRGF0YUtleTo6TXVs
dGlFbnRyeSkpIHsKKyAgICAgICAgICAgIGluZGV4TXVsdGlFbnRyeSA9IGRlY29kZUJvb2woaXQt
PnZhbHVlKCkuYmVnaW4oKSwgaXQtPnZhbHVlKCkuZW5kKCkpOworICAgICAgICAgICAgaXQtPm5l
eHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGluZGV4ZXMuYXBwZW5kKElEQkluZGV4TWV0YWRh
dGEoaW5kZXhOYW1lLCBpbmRleElkLCBrZXlQYXRoLCBpbmRleFVuaXF1ZSwgaW5kZXhNdWx0aUVu
dHJ5KSk7CisgICAgfQorICAgIHJldHVybiBpbmRleGVzOworfQorCitzdGF0aWMgYm9vbCBzZXRN
YXhJbmRleElkKExldmVsREJUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGludDY0X3QgZGF0YWJh
c2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQpCit7CisgICAgaW50
NjRfdCBtYXhJbmRleElkID0gLTE7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IG1heEluZGV4SWRL
ZXkgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3Rv
cmVJZCwgT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6TWF4SW5kZXhJZCk7CisgICAgaWYgKCFnZXRJ
bnQodHJhbnNhY3Rpb24sIG1heEluZGV4SWRLZXksIG1heEluZGV4SWQpKQorICAgICAgICBtYXhJ
bmRleElkID0gTWluaW11bUluZGV4SWQ7CisKKyAgICBpZiAoaW5kZXhJZCA8PSBtYXhJbmRleElk
KSB7CisgICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZUNvbnNpc3Rl
bmN5RXJyb3IpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFwdXRJ
bnQodHJhbnNhY3Rpb24sIG1heEluZGV4SWRLZXksIGluZGV4SWQpKSB7CisgICAgICAgIEludGVy
bmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVdyaXRlRXJyb3IpOworICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIElEQkxldmVsREJC
YWNraW5nU3RvcmU6OmNyZWF0ZUluZGV4KElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRy
YW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50
NjRfdCBpbmRleElkLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IElEQktleVBhdGgmIGtleVBh
dGgsIGJvb2wgaXNVbmlxdWUsIGJvb2wgaXNNdWx0aUVudHJ5KQoreworICAgIElEQl9UUkFDRSgi
SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Y3JlYXRlSW5kZXgiKTsKKyAgICBMZXZlbERCVHJhbnNh
Y3Rpb24qIGxldmVsREJUcmFuc2FjdGlvbiA9IFRyYW5zYWN0aW9uOjpsZXZlbERCVHJhbnNhY3Rp
b25Gcm9tKHRyYW5zYWN0aW9uKTsKKyAgICBpZiAoIXNldE1heEluZGV4SWQobGV2ZWxEQlRyYW5z
YWN0aW9uLCBkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgY29uc3QgVmVjdG9yPGNoYXI+IG5hbWVLZXkgPSBJbmRleE1ldGFE
YXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgSW5kZXhN
ZXRhRGF0YUtleTo6TmFtZSk7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IHVuaXF1ZUtleSA9IElu
ZGV4TWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElk
LCBJbmRleE1ldGFEYXRhS2V5OjpVbmlxdWUpOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBrZXlQ
YXRoS2V5ID0gSW5kZXhNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3Jl
SWQsIGluZGV4SWQsIEluZGV4TWV0YURhdGFLZXk6OktleVBhdGgpOworICAgIGNvbnN0IFZlY3Rv
cjxjaGFyPiBtdWx0aUVudHJ5S2V5ID0gSW5kZXhNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNl
SWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIEluZGV4TWV0YURhdGFLZXk6Ok11bHRpRW50cnkp
OworCisgICAgYm9vbCBvayA9IHB1dFN0cmluZyhsZXZlbERCVHJhbnNhY3Rpb24sIG5hbWVLZXks
IG5hbWUpOworICAgIGlmICghb2spIHsKKyAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERC
QmFja2luZ1N0b3JlV3JpdGVFcnJvcik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisK
KyAgICBvayA9IHB1dEJvb2wobGV2ZWxEQlRyYW5zYWN0aW9uLCB1bmlxdWVLZXksIGlzVW5pcXVl
KTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tp
bmdTdG9yZVdyaXRlRXJyb3IpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAg
b2sgPSBwdXRJREJLZXlQYXRoKGxldmVsREJUcmFuc2FjdGlvbiwga2V5UGF0aEtleSwga2V5UGF0
aCk7CisgICAgaWYgKCFvaykgeworICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNr
aW5nU3RvcmVXcml0ZUVycm9yKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAg
IG9rID0gcHV0Qm9vbChsZXZlbERCVHJhbnNhY3Rpb24sIG11bHRpRW50cnlLZXksIGlzTXVsdGlF
bnRyeSk7CisgICAgaWYgKCFvaykgeworICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJC
YWNraW5nU3RvcmVXcml0ZUVycm9yKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwor
ICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmRlbGV0
ZUluZGV4KElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90
IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkKQorewor
ICAgIElEQl9UUkFDRSgiSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlSW5kZXgiKTsKKyAg
ICBMZXZlbERCVHJhbnNhY3Rpb24qIGxldmVsREJUcmFuc2FjdGlvbiA9IFRyYW5zYWN0aW9uOjps
ZXZlbERCVHJhbnNhY3Rpb25Gcm9tKHRyYW5zYWN0aW9uKTsKKworICAgIGNvbnN0IFZlY3Rvcjxj
aGFyPiBpbmRleE1ldGFEYXRhU3RhcnQgPSBJbmRleE1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJh
c2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgMCk7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+
IGluZGV4TWV0YURhdGFFbmQgPSBJbmRleE1ldGFEYXRhS2V5OjplbmNvZGVNYXhLZXkoZGF0YWJh
c2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCk7CisKKyAgICBpZiAoIWRlbGV0ZVJhbmdlKGxl
dmVsREJUcmFuc2FjdGlvbiwgaW5kZXhNZXRhRGF0YVN0YXJ0LCBpbmRleE1ldGFEYXRhRW5kKSkg
eworICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVXcml0ZUVycm9y
KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBpbmRl
eERhdGFTdGFydCA9IEluZGV4RGF0YUtleTo6ZW5jb2RlTWluS2V5KGRhdGFiYXNlSWQsIG9iamVj
dFN0b3JlSWQsIGluZGV4SWQpOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBpbmRleERhdGFFbmQg
PSBJbmRleERhdGFLZXk6OmVuY29kZU1heEtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBp
bmRleElkKTsKKworICAgIGlmICghZGVsZXRlUmFuZ2UobGV2ZWxEQlRyYW5zYWN0aW9uLCBpbmRl
eERhdGFTdGFydCwgaW5kZXhEYXRhRW5kKSkgeworICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxl
dmVsREJCYWNraW5nU3RvcmVXcml0ZUVycm9yKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30K
KworYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpwdXRJbmRleERhdGFGb3JSZWNvcmQoSURC
QmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGludDY0X3QgZGF0YWJhc2VJ
ZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYg
a2V5LCBjb25zdCBPYmplY3RTdG9yZVJlY29yZElkZW50aWZpZXIqIHJlY29yZElkZW50aWZpZXIp
Cit7CisgICAgSURCX1RSQUNFKCJJREJMZXZlbERCQmFja2luZ1N0b3JlOjpwdXRJbmRleERhdGFG
b3JSZWNvcmQiKTsKKyAgICBBU1NFUlQoa2V5LmlzVmFsaWQoKSk7CisgICAgQVNTRVJUKGluZGV4
SWQgPj0gTWluaW11bUluZGV4SWQpOworICAgIGNvbnN0IExldmVsREJSZWNvcmRJZGVudGlmaWVy
KiBsZXZlbERCUmVjb3JkSWRlbnRpZmllciA9IHN0YXRpY19jYXN0PGNvbnN0IExldmVsREJSZWNv
cmRJZGVudGlmaWVyKj4ocmVjb3JkSWRlbnRpZmllcik7CisKKyAgICBMZXZlbERCVHJhbnNhY3Rp
b24qIGxldmVsREJUcmFuc2FjdGlvbiA9IFRyYW5zYWN0aW9uOjpsZXZlbERCVHJhbnNhY3Rpb25G
cm9tKHRyYW5zYWN0aW9uKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gaW5kZXhEYXRhS2V5ID0g
SW5kZXhEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwg
ZW5jb2RlSURCS2V5KGtleSksIGxldmVsREJSZWNvcmRJZGVudGlmaWVyLT5wcmltYXJ5S2V5KCkp
OworCisgICAgVmVjdG9yPGNoYXI+IGRhdGE7CisgICAgZGF0YS5hcHBlbmQoZW5jb2RlVmFySW50
KGxldmVsREJSZWNvcmRJZGVudGlmaWVyLT52ZXJzaW9uKCkpKTsKKyAgICBkYXRhLmFwcGVuZChs
ZXZlbERCUmVjb3JkSWRlbnRpZmllci0+cHJpbWFyeUtleSgpKTsKKworICAgIHJldHVybiBsZXZl
bERCVHJhbnNhY3Rpb24tPnB1dChpbmRleERhdGFLZXksIGRhdGEpOworfQorCitzdGF0aWMgYm9v
bCBmaW5kR3JlYXRlc3RLZXlMZXNzVGhhbk9yRXF1YWwoTGV2ZWxEQlRyYW5zYWN0aW9uKiB0cmFu
c2FjdGlvbiwgY29uc3QgVmVjdG9yPGNoYXI+JiB0YXJnZXQsIFZlY3RvcjxjaGFyPiYgZm91bmRL
ZXkpCit7CisgICAgT3duUHRyPExldmVsREJJdGVyYXRvcj4gaXQgPSB0cmFuc2FjdGlvbi0+Y3Jl
YXRlSXRlcmF0b3IoKTsKKyAgICBpdC0+c2Vlayh0YXJnZXQpOworCisgICAgaWYgKCFpdC0+aXNW
YWxpZCgpKSB7CisgICAgICAgIGl0LT5zZWVrVG9MYXN0KCk7CisgICAgICAgIGlmICghaXQtPmlz
VmFsaWQoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB3aGlsZSAo
Y29tcGFyZUluZGV4S2V5cyhpdC0+a2V5KCksIHRhcmdldCkgPiAwKSB7CisgICAgICAgIGl0LT5w
cmV2KCk7CisgICAgICAgIGlmICghaXQtPmlzVmFsaWQoKSkKKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICB9CisKKyAgICBkbyB7CisgICAgICAgIGZvdW5kS2V5LmNsZWFyKCk7CisgICAg
ICAgIGZvdW5kS2V5LmFwcGVuZChpdC0+a2V5KCkuYmVnaW4oKSwgaXQtPmtleSgpLmVuZCgpIC0g
aXQtPmtleSgpLmJlZ2luKCkpOworCisgICAgICAgIC8vIFRoZXJlIGNhbiBiZSBzZXZlcmFsIGlu
ZGV4IGtleXMgdGhhdCBjb21wYXJlIGVxdWFsLiBXZSB3YW50IHRoZSBsYXN0IG9uZS4KKyAgICAg
ICAgaXQtPm5leHQoKTsKKyAgICB9IHdoaWxlIChpdC0+aXNWYWxpZCgpICYmICFjb21wYXJlSW5k
ZXhLZXlzKGl0LT5rZXkoKSwgdGFyZ2V0KSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9v
bCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpkZWxldGVJbmRleERhdGFGb3JSZWNvcmQoSURCQmFj
a2luZ1N0b3JlOjpUcmFuc2FjdGlvbiosIGludDY0X3QsIGludDY0X3QsIGludDY0X3QsIGNvbnN0
IE9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllciopCit7CisgICAgLy8gRklYTUU6IFRoaXMgaXNu
J3QgbmVlZGVkIHNpbmNlIHdlIGludmFsaWRhdGUgaW5kZXggZGF0YSB2aWEgdGhlIHZlcnNpb24g
bnVtYmVyIG1lY2hhbmlzbS4KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgdmVy
c2lvbkV4aXN0cyhMZXZlbERCVHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFi
YXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCB2ZXJzaW9uLCBjb25zdCBWZWN0
b3I8Y2hhcj4mIGVuY29kZWRQcmltYXJ5S2V5KQoreworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBr
ZXkgPSBFeGlzdHNFbnRyeUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGVu
Y29kZWRQcmltYXJ5S2V5KTsKKyAgICBWZWN0b3I8Y2hhcj4gZGF0YTsKKworICAgIGlmICghdHJh
bnNhY3Rpb24tPmdldChrZXksIGRhdGEpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBy
ZXR1cm4gZGVjb2RlSW50KGRhdGEuYmVnaW4oKSwgZGF0YS5lbmQoKSkgPT0gdmVyc2lvbjsKK30K
KworYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpmaW5kS2V5SW5JbmRleChJREJCYWNraW5n
U3RvcmU6OlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2
NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JiBrZXksIFZl
Y3RvcjxjaGFyPiYgZm91bmRFbmNvZGVkUHJpbWFyeUtleSkKK3sKKyAgICBJREJfVFJBQ0UoIklE
QkxldmVsREJCYWNraW5nU3RvcmU6OmZpbmRLZXlJbkluZGV4Iik7CisgICAgQVNTRVJUKGZvdW5k
RW5jb2RlZFByaW1hcnlLZXkuaXNFbXB0eSgpKTsKKworICAgIExldmVsREJUcmFuc2FjdGlvbiog
bGV2ZWxEQlRyYW5zYWN0aW9uID0gVHJhbnNhY3Rpb246OmxldmVsREJUcmFuc2FjdGlvbkZyb20o
dHJhbnNhY3Rpb24pOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBsZXZlbGRiS2V5ID0gSW5kZXhE
YXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwga2V5KTsK
KyAgICBPd25QdHI8TGV2ZWxEQkl0ZXJhdG9yPiBpdCA9IGxldmVsREJUcmFuc2FjdGlvbi0+Y3Jl
YXRlSXRlcmF0b3IoKTsKKyAgICBpdC0+c2VlayhsZXZlbGRiS2V5KTsKKworICAgIGZvciAoOzsp
IHsKKyAgICAgICAgaWYgKCFpdC0+aXNWYWxpZCgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICBpZiAoY29tcGFyZUluZGV4S2V5cyhpdC0+a2V5KCksIGxldmVsZGJLZXkpID4g
MCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpbnQ2NF90IHZlcnNpb247
CisgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBkZWNvZGVWYXJJbnQoaXQtPnZhbHVlKCkuYmVnaW4o
KSwgaXQtPnZhbHVlKCkuZW5kKCksIHZlcnNpb24pOworICAgICAgICBpZiAoIXApIHsKKyAgICAg
ICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVJlYWRFcnJvcik7Cisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZm91bmRFbmNvZGVk
UHJpbWFyeUtleS5hcHBlbmQocCwgaXQtPnZhbHVlKCkuZW5kKCkgLSBwKTsKKworICAgICAgICBp
ZiAoIXZlcnNpb25FeGlzdHMobGV2ZWxEQlRyYW5zYWN0aW9uLCBkYXRhYmFzZUlkLCBvYmplY3RT
dG9yZUlkLCB2ZXJzaW9uLCBmb3VuZEVuY29kZWRQcmltYXJ5S2V5KSkgeworICAgICAgICAgICAg
Ly8gRGVsZXRlIHN0YWxlIGluZGV4IGRhdGEgZW50cnkgYW5kIGNvbnRpbnVlLgorICAgICAgICAg
ICAgbGV2ZWxEQlRyYW5zYWN0aW9uLT5yZW1vdmUoaXQtPmtleSgpKTsKKyAgICAgICAgICAgIGl0
LT5uZXh0KCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJl
dHVybiB0cnVlOworICAgIH0KK30KKworUGFzc1JlZlB0cjxJREJLZXk+IElEQkxldmVsREJCYWNr
aW5nU3RvcmU6OmdldFByaW1hcnlLZXlWaWFJbmRleChJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0
aW9uKiB0cmFuc2FjdGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3Jl
SWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JiBrZXkpCit7CisgICAgSURCX1RSQUNF
KCJJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRQcmltYXJ5S2V5VmlhSW5kZXgiKTsKKworICAg
IFZlY3RvcjxjaGFyPiBmb3VuZEVuY29kZWRQcmltYXJ5S2V5OworICAgIGlmIChmaW5kS2V5SW5J
bmRleCh0cmFuc2FjdGlvbiwgZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwga2V5
LCBmb3VuZEVuY29kZWRQcmltYXJ5S2V5KSkgeworICAgICAgICBSZWZQdHI8SURCS2V5PiBwcmlt
YXJ5S2V5OworICAgICAgICBkZWNvZGVJREJLZXkoZm91bmRFbmNvZGVkUHJpbWFyeUtleS5iZWdp
bigpLCBmb3VuZEVuY29kZWRQcmltYXJ5S2V5LmVuZCgpLCBwcmltYXJ5S2V5KTsKKyAgICAgICAg
cmV0dXJuIHByaW1hcnlLZXkucmVsZWFzZSgpOworICAgIH0KKworICAgIHJldHVybiAwOworfQor
Citib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmtleUV4aXN0c0luSW5kZXgoSURCQmFja2lu
Z1N0b3JlOjpUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGludDY0X3QgZGF0YWJhc2VJZCwgaW50
NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYgaW5kZXhL
ZXksIFJlZlB0cjxJREJLZXk+JiBmb3VuZFByaW1hcnlLZXkpCit7CisgICAgSURCX1RSQUNFKCJJ
REJMZXZlbERCQmFja2luZ1N0b3JlOjprZXlFeGlzdHNJbkluZGV4Iik7CisKKyAgICBWZWN0b3I8
Y2hhcj4gZm91bmRFbmNvZGVkUHJpbWFyeUtleTsKKyAgICBpZiAoIWZpbmRLZXlJbkluZGV4KHRy
YW5zYWN0aW9uLCBkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBpbmRleEtleSwg
Zm91bmRFbmNvZGVkUHJpbWFyeUtleSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGRl
Y29kZUlEQktleShmb3VuZEVuY29kZWRQcmltYXJ5S2V5LmJlZ2luKCksIGZvdW5kRW5jb2RlZFBy
aW1hcnlLZXkuZW5kKCksIGZvdW5kUHJpbWFyeUtleSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisK
K25hbWVzcGFjZSB7CisKK3N0cnVjdCBDdXJzb3JPcHRpb25zIHsKKyAgICBWZWN0b3I8Y2hhcj4g
bG93S2V5OworICAgIGJvb2wgbG93T3BlbjsKKyAgICBWZWN0b3I8Y2hhcj4gaGlnaEtleTsKKyAg
ICBib29sIGhpZ2hPcGVuOworICAgIGJvb2wgZm9yd2FyZDsKKyAgICBib29sIHVuaXF1ZTsKK307
CisKK2NsYXNzIEN1cnNvckltcGxDb21tb24gOiBwdWJsaWMgSURCQmFja2luZ1N0b3JlOjpDdXJz
b3IgeworcHVibGljOgorICAgIC8vIElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yCisgICAgdmlydHVh
bCBib29sIGFkdmFuY2UodW5zaWduZWQgbG9uZyk7CisgICAgdmlydHVhbCBib29sIGNvbnRpbnVl
RnVuY3Rpb24oY29uc3QgSURCS2V5KiA9IDAsIEl0ZXJhdG9yU3RhdGUgPSBTZWVrKTsKKyAgICB2
aXJ0dWFsIFBhc3NSZWZQdHI8SURCS2V5PiBrZXkoKSB7IHJldHVybiBtX2N1cnJlbnRLZXk7IH0K
KyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCS2V5PiBwcmltYXJ5S2V5KCkgeyByZXR1cm4gbV9j
dXJyZW50S2V5OyB9CisgICAgdmlydHVhbCBTdHJpbmcgdmFsdWUoKSA9IDA7CisgICAgdmlydHVh
bCBQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6T2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVy
PiBvYmplY3RTdG9yZVJlY29yZElkZW50aWZpZXIoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGNs
b3NlKCkgeyB9CisKKyAgICB2aXJ0dWFsIGJvb2wgbG9hZEN1cnJlbnRSb3coKSA9IDA7CisgICAg
Ym9vbCBmaXJzdFNlZWsoKTsKKworcHJvdGVjdGVkOgorICAgIEN1cnNvckltcGxDb21tb24oTGV2
ZWxEQlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgY29uc3QgQ3Vyc29yT3B0aW9ucyYgY3Vyc29y
T3B0aW9ucykKKyAgICAgICAgOiBtX3RyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKQorICAgICAgICAs
IG1fY3Vyc29yT3B0aW9ucyhjdXJzb3JPcHRpb25zKQorICAgIHsKKyAgICB9CisKKyAgICBDdXJz
b3JJbXBsQ29tbW9uKGNvbnN0IEN1cnNvckltcGxDb21tb24qIG90aGVyKQorICAgICAgICA6IG1f
dHJhbnNhY3Rpb24ob3RoZXItPm1fdHJhbnNhY3Rpb24pCisgICAgICAgICwgbV9jdXJzb3JPcHRp
b25zKG90aGVyLT5tX2N1cnNvck9wdGlvbnMpCisgICAgICAgICwgbV9jdXJyZW50S2V5KG90aGVy
LT5tX2N1cnJlbnRLZXkpCisgICAgeworICAgICAgICBpZiAob3RoZXItPm1faXRlcmF0b3IpIHsK
KyAgICAgICAgICAgIG1faXRlcmF0b3IgPSBtX3RyYW5zYWN0aW9uLT5jcmVhdGVJdGVyYXRvcigp
OworCisgICAgICAgICAgICBpZiAob3RoZXItPm1faXRlcmF0b3ItPmlzVmFsaWQoKSkgeworICAg
ICAgICAgICAgICAgIG1faXRlcmF0b3ItPnNlZWsob3RoZXItPm1faXRlcmF0b3ItPmtleSgpKTsK
KyAgICAgICAgICAgICAgICBBU1NFUlQobV9pdGVyYXRvci0+aXNWYWxpZCgpKTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgfkN1cnNvckltcGxDb21tb24o
KSB7IH0KKworICAgIGJvb2wgaXNQYXN0Qm91bmRzKCkgY29uc3Q7CisgICAgYm9vbCBoYXZlRW50
ZXJlZFJhbmdlKCkgY29uc3Q7CisKKyAgICBMZXZlbERCVHJhbnNhY3Rpb24qIG1fdHJhbnNhY3Rp
b247CisgICAgQ3Vyc29yT3B0aW9ucyBtX2N1cnNvck9wdGlvbnM7CisgICAgT3duUHRyPExldmVs
REJJdGVyYXRvcj4gbV9pdGVyYXRvcjsKKyAgICBSZWZQdHI8SURCS2V5PiBtX2N1cnJlbnRLZXk7
Cit9OworCitib29sIEN1cnNvckltcGxDb21tb246OmZpcnN0U2VlaygpCit7CisgICAgbV9pdGVy
YXRvciA9IG1fdHJhbnNhY3Rpb24tPmNyZWF0ZUl0ZXJhdG9yKCk7CisgICAgaWYgKG1fY3Vyc29y
T3B0aW9ucy5mb3J3YXJkKQorICAgICAgICBtX2l0ZXJhdG9yLT5zZWVrKG1fY3Vyc29yT3B0aW9u
cy5sb3dLZXkpOworICAgIGVsc2UKKyAgICAgICAgbV9pdGVyYXRvci0+c2VlayhtX2N1cnNvck9w
dGlvbnMuaGlnaEtleSk7CisKKyAgICByZXR1cm4gY29udGludWVGdW5jdGlvbigwLCBSZWFkeSk7
Cit9CisKK2Jvb2wgQ3Vyc29ySW1wbENvbW1vbjo6YWR2YW5jZSh1bnNpZ25lZCBsb25nIGNvdW50
KQoreworICAgIHdoaWxlIChjb3VudC0tKSB7CisgICAgICAgIGlmICghY29udGludWVGdW5jdGlv
bigpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsK
K30KKworYm9vbCBDdXJzb3JJbXBsQ29tbW9uOjpjb250aW51ZUZ1bmN0aW9uKGNvbnN0IElEQktl
eSoga2V5LCBJdGVyYXRvclN0YXRlIG5leHRTdGF0ZSkKK3sKKyAgICBSZWZQdHI8SURCS2V5PiBw
cmV2aW91c0tleSA9IG1fY3VycmVudEtleTsKKworICAgIC8vIFdoZW4gaXRlcmF0aW5nIHdpdGgg
UFJFVl9OT19EVVBMSUNBVEUsIHNwZWMgcmVxdWlyZXMgdGhhdCB0aGUKKyAgICAvLyB2YWx1ZSB3
ZSB5aWVsZCBmb3IgZWFjaCBrZXkgaXMgdGhlIGZpcnN0IGR1cGxpY2F0ZSBpbiBmb3J3YXJkcwor
ICAgIC8vIG9yZGVyLgorICAgIFJlZlB0cjxJREJLZXk+IGxhc3REdXBsaWNhdGVLZXk7CisKKyAg
ICBib29sIGZvcndhcmQgPSBtX2N1cnNvck9wdGlvbnMuZm9yd2FyZDsKKworICAgIGZvciAoOzsp
IHsKKyAgICAgICAgaWYgKG5leHRTdGF0ZSA9PSBTZWVrKSB7CisgICAgICAgICAgICBpZiAoZm9y
d2FyZCkKKyAgICAgICAgICAgICAgICBtX2l0ZXJhdG9yLT5uZXh0KCk7CisgICAgICAgICAgICBl
bHNlCisgICAgICAgICAgICAgICAgbV9pdGVyYXRvci0+cHJldigpOworICAgICAgICB9IGVsc2UK
KyAgICAgICAgICAgIG5leHRTdGF0ZSA9IFNlZWs7IC8vIGZvciBzdWJzZXF1ZW50IGl0ZXJhdGlv
bnMKKworICAgICAgICBpZiAoIW1faXRlcmF0b3ItPmlzVmFsaWQoKSkgeworICAgICAgICAgICAg
aWYgKCFmb3J3YXJkICYmIGxhc3REdXBsaWNhdGVLZXkuZ2V0KCkpIHsKKyAgICAgICAgICAgICAg
ICAvLyBXZSBuZWVkIHRvIHdhbGsgZm9yd2FyZCBiZWNhdXNlIHdlIGhpdCB0aGUgZW5kIG9mCisg
ICAgICAgICAgICAgICAgLy8gdGhlIGRhdGEuCisgICAgICAgICAgICAgICAgZm9yd2FyZCA9IHRy
dWU7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc1Bhc3RCb3VuZHMo
KSkgeworICAgICAgICAgICAgaWYgKCFmb3J3YXJkICYmIGxhc3REdXBsaWNhdGVLZXkuZ2V0KCkp
IHsKKyAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHdhbGsgZm9yd2FyZCBiZWNhdXNlIG5v
dyB3ZSdyZSBiZXlvbmQgdGhlCisgICAgICAgICAgICAgICAgLy8gYm91bmRzIGRlZmluZWQgYnkg
dGhlIGN1cnNvci4KKyAgICAgICAgICAgICAgICBmb3J3YXJkID0gdHJ1ZTsKKyAgICAgICAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFoYXZlRW50ZXJlZFJhbmdlKCkpCisgICAgICAg
ICAgICBjb250aW51ZTsKKworICAgICAgICAvLyBUaGUgcm93IG1heSBub3QgbG9hZCBiZWNhdXNl
IHRoZXJlJ3MgYSBzdGFsZSBlbnRyeSBpbiB0aGUKKyAgICAgICAgLy8gaW5kZXguIFRoaXMgaXMg
bm90IGZhdGFsLgorICAgICAgICBpZiAoIWxvYWRDdXJyZW50Um93KCkpCisgICAgICAgICAgICBj
b250aW51ZTsKKworICAgICAgICBpZiAoa2V5KSB7CisgICAgICAgICAgICBpZiAoZm9yd2FyZCkg
eworICAgICAgICAgICAgICAgIGlmIChtX2N1cnJlbnRLZXktPmlzTGVzc1RoYW4oa2V5KSkKKyAg
ICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgICAgIGlmIChrZXktPmlzTGVzc1RoYW4obV9jdXJyZW50S2V5LmdldCgpKSkKKyAgICAg
ICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAg
ICAgICBpZiAobV9jdXJzb3JPcHRpb25zLnVuaXF1ZSkgeworCisgICAgICAgICAgICBpZiAobV9j
dXJyZW50S2V5LT5pc0VxdWFsKHByZXZpb3VzS2V5LmdldCgpKSkgeworICAgICAgICAgICAgICAg
IC8vIFdlIHNob3VsZCBuZXZlciBiZSBhYmxlIHRvIHdhbGsgZm9yd2FyZCBhbGwgdGhlIHdheQor
ICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBwcmV2aW91cyBrZXkuCisgICAgICAgICAgICAgICAg
QVNTRVJUKCFsYXN0RHVwbGljYXRlS2V5LmdldCgpKTsKKyAgICAgICAgICAgICAgICBjb250aW51
ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFmb3J3YXJkKSB7CisgICAgICAg
ICAgICAgICAgaWYgKCFsYXN0RHVwbGljYXRlS2V5LmdldCgpKSB7CisgICAgICAgICAgICAgICAg
ICAgIGxhc3REdXBsaWNhdGVLZXkgPSBtX2N1cnJlbnRLZXk7CisgICAgICAgICAgICAgICAgICAg
IGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFdlIG5l
ZWQgdG8gd2FsayBmb3J3YXJkIGJlY2F1c2Ugd2UgaGl0IHRoZSBib3VuZGFyeQorICAgICAgICAg
ICAgICAgIC8vIGJldHdlZW4ga2V5IHJhbmdlcy4KKyAgICAgICAgICAgICAgICBpZiAoIWxhc3RE
dXBsaWNhdGVLZXktPmlzRXF1YWwobV9jdXJyZW50S2V5LmdldCgpKSkgeworICAgICAgICAgICAg
ICAgICAgICBmb3J3YXJkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgQVNTRVJUKCFsYXN0
RHVwbGljYXRlS2V5LmdldCgpIHx8IChmb3J3YXJkICYmIGxhc3REdXBsaWNhdGVLZXktPmlzRXF1
YWwobV9jdXJyZW50S2V5LmdldCgpKSkpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEN1
cnNvckltcGxDb21tb246OmhhdmVFbnRlcmVkUmFuZ2UoKSBjb25zdAoreworICAgIGlmIChtX2N1
cnNvck9wdGlvbnMuZm9yd2FyZCkgeworICAgICAgICBpZiAobV9jdXJzb3JPcHRpb25zLmxvd09w
ZW4pCisgICAgICAgICAgICByZXR1cm4gY29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXko
KSwgbV9jdXJzb3JPcHRpb25zLmxvd0tleSkgPiAwOworCisgICAgICAgIHJldHVybiBjb21wYXJl
SW5kZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2N1cnNvck9wdGlvbnMubG93S2V5KSA+PSAw
OworICAgIH0KKyAgICBpZiAobV9jdXJzb3JPcHRpb25zLmhpZ2hPcGVuKQorICAgICAgICByZXR1
cm4gY29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9jdXJzb3JPcHRpb25zLmhp
Z2hLZXkpIDwgMDsKKworICAgIHJldHVybiBjb21wYXJlSW5kZXhLZXlzKG1faXRlcmF0b3ItPmtl
eSgpLCBtX2N1cnNvck9wdGlvbnMuaGlnaEtleSkgPD0gMDsKK30KKworYm9vbCBDdXJzb3JJbXBs
Q29tbW9uOjppc1Bhc3RCb3VuZHMoKSBjb25zdAoreworICAgIGlmIChtX2N1cnNvck9wdGlvbnMu
Zm9yd2FyZCkgeworICAgICAgICBpZiAobV9jdXJzb3JPcHRpb25zLmhpZ2hPcGVuKQorICAgICAg
ICAgICAgcmV0dXJuIGNvbXBhcmVJbmRleEtleXMobV9pdGVyYXRvci0+a2V5KCksIG1fY3Vyc29y
T3B0aW9ucy5oaWdoS2V5KSA+PSAwOworICAgICAgICByZXR1cm4gY29tcGFyZUluZGV4S2V5cyht
X2l0ZXJhdG9yLT5rZXkoKSwgbV9jdXJzb3JPcHRpb25zLmhpZ2hLZXkpID4gMDsKKyAgICB9CisK
KyAgICBpZiAobV9jdXJzb3JPcHRpb25zLmxvd09wZW4pCisgICAgICAgIHJldHVybiBjb21wYXJl
SW5kZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2N1cnNvck9wdGlvbnMubG93S2V5KSA8PSAw
OworICAgIHJldHVybiBjb21wYXJlSW5kZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2N1cnNv
ck9wdGlvbnMubG93S2V5KSA8IDA7Cit9CisKK2NsYXNzIE9iamVjdFN0b3JlS2V5Q3Vyc29ySW1w
bCA6IHB1YmxpYyBDdXJzb3JJbXBsQ29tbW9uIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc1Jl
ZlB0cjxPYmplY3RTdG9yZUtleUN1cnNvckltcGw+IGNyZWF0ZShMZXZlbERCVHJhbnNhY3Rpb24q
IHRyYW5zYWN0aW9uLCBjb25zdCBDdXJzb3JPcHRpb25zJiBjdXJzb3JPcHRpb25zKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBPYmplY3RTdG9yZUtleUN1cnNvckltcGwodHJh
bnNhY3Rpb24sIGN1cnNvck9wdGlvbnMpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFBhc3NSZWZQ
dHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IGNsb25lKCkKKyAgICB7CisgICAgICAgIHJldHVy
biBhZG9wdFJlZihuZXcgT2JqZWN0U3RvcmVLZXlDdXJzb3JJbXBsKHRoaXMpKTsKKyAgICB9CisK
KyAgICAvLyBDdXJzb3JJbXBsQ29tbW9uCisgICAgdmlydHVhbCBTdHJpbmcgdmFsdWUoKSB7IEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4gU3RyaW5nKCk7IH0KKyAgICB2aXJ0dWFsIFBhc3NS
ZWZQdHI8SURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJlY29yZElkZW50aWZpZXI+IG9iamVj
dFN0b3JlUmVjb3JkSWRlbnRpZmllcigpIE9WRVJSSURFCisgICAgeworICAgICAgICByZXR1cm4g
bV9pZGVudGlmaWVyOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgbG9hZEN1cnJlbnRSb3coKTsK
KworcHJpdmF0ZToKKyAgICBPYmplY3RTdG9yZUtleUN1cnNvckltcGwoTGV2ZWxEQlRyYW5zYWN0
aW9uKiB0cmFuc2FjdGlvbiwgY29uc3QgQ3Vyc29yT3B0aW9ucyYgY3Vyc29yT3B0aW9ucykKKyAg
ICAgICAgOiBDdXJzb3JJbXBsQ29tbW9uKHRyYW5zYWN0aW9uLCBjdXJzb3JPcHRpb25zKQorICAg
IHsKKyAgICB9CisKKyAgICBPYmplY3RTdG9yZUtleUN1cnNvckltcGwoY29uc3QgT2JqZWN0U3Rv
cmVLZXlDdXJzb3JJbXBsKiBvdGhlcikKKyAgICAgICAgOiBDdXJzb3JJbXBsQ29tbW9uKG90aGVy
KQorICAgIHsKKyAgICB9CisKKyAgICBSZWZQdHI8TGV2ZWxEQlJlY29yZElkZW50aWZpZXI+IG1f
aWRlbnRpZmllcjsKK307CisKK2Jvb2wgT2JqZWN0U3RvcmVLZXlDdXJzb3JJbXBsOjpsb2FkQ3Vy
cmVudFJvdygpCit7CisgICAgY29uc3QgY2hhcioga2V5UG9zaXRpb24gPSBtX2l0ZXJhdG9yLT5r
ZXkoKS5iZWdpbigpOworICAgIGNvbnN0IGNoYXIqIGtleUxpbWl0ID0gbV9pdGVyYXRvci0+a2V5
KCkuZW5kKCk7CisKKyAgICBPYmplY3RTdG9yZURhdGFLZXkgb2JqZWN0U3RvcmVEYXRhS2V5Owor
ICAgIGtleVBvc2l0aW9uID0gT2JqZWN0U3RvcmVEYXRhS2V5OjpkZWNvZGUoa2V5UG9zaXRpb24s
IGtleUxpbWl0LCAmb2JqZWN0U3RvcmVEYXRhS2V5KTsKKyAgICBpZiAoIWtleVBvc2l0aW9uKSB7
CisgICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVJlYWRFcnJvcik7
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX2N1cnJlbnRLZXkgPSBvYmpl
Y3RTdG9yZURhdGFLZXkudXNlcktleSgpOworCisgICAgaW50NjRfdCB2ZXJzaW9uOworICAgIGNv
bnN0IGNoYXIqIHZhbHVlUG9zaXRpb24gPSBkZWNvZGVWYXJJbnQobV9pdGVyYXRvci0+dmFsdWUo
KS5iZWdpbigpLCBtX2l0ZXJhdG9yLT52YWx1ZSgpLmVuZCgpLCB2ZXJzaW9uKTsKKyAgICBpZiAo
IXZhbHVlUG9zaXRpb24pIHsKKyAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2lu
Z1N0b3JlUmVhZEVycm9yKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8v
IEZJWE1FOiBUaGlzIHJlLWVuY29kZXMgd2hhdCB3YXMganVzdCBkZWNvZGVkOyB0cnkgYW5kIG9w
dGltaXplLgorICAgIG1faWRlbnRpZmllciA9IExldmVsREJSZWNvcmRJZGVudGlmaWVyOjpjcmVh
dGUoZW5jb2RlSURCS2V5KCptX2N1cnJlbnRLZXkpLCB2ZXJzaW9uKTsKKworICAgIHJldHVybiB0
cnVlOworfQorCitjbGFzcyBPYmplY3RTdG9yZUN1cnNvckltcGwgOiBwdWJsaWMgQ3Vyc29ySW1w
bENvbW1vbiB7CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NSZWZQdHI8T2JqZWN0U3RvcmVDdXJz
b3JJbXBsPiBjcmVhdGUoTGV2ZWxEQlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgY29uc3QgQ3Vy
c29yT3B0aW9ucyYgY3Vyc29yT3B0aW9ucykKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJl
ZihuZXcgT2JqZWN0U3RvcmVDdXJzb3JJbXBsKHRyYW5zYWN0aW9uLCBjdXJzb3JPcHRpb25zKSk7
CisgICAgfQorCisgICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29y
PiBjbG9uZSgpCisgICAgeworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IE9iamVjdFN0b3Jl
Q3Vyc29ySW1wbCh0aGlzKSk7CisgICAgfQorCisgICAgLy8gQ3Vyc29ySW1wbENvbW1vbgorICAg
IHZpcnR1YWwgU3RyaW5nIHZhbHVlKCkgeyByZXR1cm4gbV9jdXJyZW50VmFsdWU7IH0KKyAgICB2
aXJ0dWFsIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJlY29yZElkZW50
aWZpZXI+IG9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllcigpIE9WRVJSSURFCisgICAgeworICAg
ICAgICByZXR1cm4gbV9pZGVudGlmaWVyOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgbG9hZEN1
cnJlbnRSb3coKTsKKworcHJpdmF0ZToKKyAgICBPYmplY3RTdG9yZUN1cnNvckltcGwoTGV2ZWxE
QlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgY29uc3QgQ3Vyc29yT3B0aW9ucyYgY3Vyc29yT3B0
aW9ucykKKyAgICAgICAgOiBDdXJzb3JJbXBsQ29tbW9uKHRyYW5zYWN0aW9uLCBjdXJzb3JPcHRp
b25zKQorICAgIHsKKyAgICB9CisKKyAgICBPYmplY3RTdG9yZUN1cnNvckltcGwoY29uc3QgT2Jq
ZWN0U3RvcmVDdXJzb3JJbXBsKiBvdGhlcikKKyAgICAgICAgOiBDdXJzb3JJbXBsQ29tbW9uKG90
aGVyKQorICAgICAgICAsIG1fY3VycmVudFZhbHVlKG90aGVyLT5tX2N1cnJlbnRWYWx1ZSkKKyAg
ICB7CisgICAgfQorCisgICAgU3RyaW5nIG1fY3VycmVudFZhbHVlOworICAgIFJlZlB0cjxMZXZl
bERCUmVjb3JkSWRlbnRpZmllcj4gbV9pZGVudGlmaWVyOworfTsKKworYm9vbCBPYmplY3RTdG9y
ZUN1cnNvckltcGw6OmxvYWRDdXJyZW50Um93KCkKK3sKKyAgICBjb25zdCBjaGFyKiBrZXlQb3Np
dGlvbiA9IG1faXRlcmF0b3ItPmtleSgpLmJlZ2luKCk7CisgICAgY29uc3QgY2hhcioga2V5TGlt
aXQgPSBtX2l0ZXJhdG9yLT5rZXkoKS5lbmQoKTsKKworICAgIE9iamVjdFN0b3JlRGF0YUtleSBv
YmplY3RTdG9yZURhdGFLZXk7CisgICAga2V5UG9zaXRpb24gPSBPYmplY3RTdG9yZURhdGFLZXk6
OmRlY29kZShrZXlQb3NpdGlvbiwga2V5TGltaXQsICZvYmplY3RTdG9yZURhdGFLZXkpOworICAg
IGlmICgha2V5UG9zaXRpb24pIHsKKyAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFj
a2luZ1N0b3JlUmVhZEVycm9yKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAg
IG1fY3VycmVudEtleSA9IG9iamVjdFN0b3JlRGF0YUtleS51c2VyS2V5KCk7CisKKyAgICBpbnQ2
NF90IHZlcnNpb247CisgICAgY29uc3QgY2hhciogdmFsdWVQb3NpdGlvbiA9IGRlY29kZVZhcklu
dChtX2l0ZXJhdG9yLT52YWx1ZSgpLmJlZ2luKCksIG1faXRlcmF0b3ItPnZhbHVlKCkuZW5kKCks
IHZlcnNpb24pOworICAgIGlmICghdmFsdWVQb3NpdGlvbikgeworICAgICAgICBJbnRlcm5hbEVy
cm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVSZWFkRXJyb3IpOworICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgfQorCisgICAgLy8gRklYTUU6IFRoaXMgcmUtZW5jb2RlcyB3aGF0IHdhcyBqdXN0
IGRlY29kZWQ7IHRyeSBhbmQgb3B0aW1pemUuCisgICAgbV9pZGVudGlmaWVyID0gTGV2ZWxEQlJl
Y29yZElkZW50aWZpZXI6OmNyZWF0ZShlbmNvZGVJREJLZXkoKm1fY3VycmVudEtleSksIHZlcnNp
b24pOworCisgICAgbV9jdXJyZW50VmFsdWUgPSBkZWNvZGVTdHJpbmcodmFsdWVQb3NpdGlvbiwg
bV9pdGVyYXRvci0+dmFsdWUoKS5lbmQoKSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworY2xh
c3MgSW5kZXhLZXlDdXJzb3JJbXBsIDogcHVibGljIEN1cnNvckltcGxDb21tb24geworcHVibGlj
OgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPEluZGV4S2V5Q3Vyc29ySW1wbD4gY3JlYXRlKExldmVs
REJUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGNvbnN0IEN1cnNvck9wdGlvbnMmIGN1cnNvck9w
dGlvbnMpCisgICAgeworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IEluZGV4S2V5Q3Vyc29y
SW1wbCh0cmFuc2FjdGlvbiwgY3Vyc29yT3B0aW9ucykpOworICAgIH0KKworICAgIHZpcnR1YWwg
UGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4gY2xvbmUoKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBJbmRleEtleUN1cnNvckltcGwodGhpcykpOworICAgIH0K
KworICAgIC8vIEN1cnNvckltcGxDb21tb24KKyAgICB2aXJ0dWFsIFN0cmluZyB2YWx1ZSgpIHsg
QVNTRVJUX05PVF9SRUFDSEVEKCk7IHJldHVybiBTdHJpbmcoKTsgfQorICAgIHZpcnR1YWwgUGFz
c1JlZlB0cjxJREJLZXk+IHByaW1hcnlLZXkoKSB7IHJldHVybiBtX3ByaW1hcnlLZXk7IH0KKyAg
ICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJlY29yZElk
ZW50aWZpZXI+IG9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllcigpIHsgQVNTRVJUX05PVF9SRUFD
SEVEKCk7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBib29sIGxvYWRDdXJyZW50Um93KCk7CisK
K3ByaXZhdGU6CisgICAgSW5kZXhLZXlDdXJzb3JJbXBsKExldmVsREJUcmFuc2FjdGlvbiogdHJh
bnNhY3Rpb24sIGNvbnN0IEN1cnNvck9wdGlvbnMmIGN1cnNvck9wdGlvbnMpCisgICAgICAgIDog
Q3Vyc29ySW1wbENvbW1vbih0cmFuc2FjdGlvbiwgY3Vyc29yT3B0aW9ucykKKyAgICB7CisgICAg
fQorCisgICAgSW5kZXhLZXlDdXJzb3JJbXBsKGNvbnN0IEluZGV4S2V5Q3Vyc29ySW1wbCogb3Ro
ZXIpCisgICAgICAgIDogQ3Vyc29ySW1wbENvbW1vbihvdGhlcikKKyAgICAgICAgLCBtX3ByaW1h
cnlLZXkob3RoZXItPm1fcHJpbWFyeUtleSkKKyAgICB7CisgICAgfQorCisgICAgUmVmUHRyPElE
QktleT4gbV9wcmltYXJ5S2V5OworfTsKKworYm9vbCBJbmRleEtleUN1cnNvckltcGw6OmxvYWRD
dXJyZW50Um93KCkKK3sKKyAgICBjb25zdCBjaGFyKiBrZXlQb3NpdGlvbiA9IG1faXRlcmF0b3It
PmtleSgpLmJlZ2luKCk7CisgICAgY29uc3QgY2hhcioga2V5TGltaXQgPSBtX2l0ZXJhdG9yLT5r
ZXkoKS5lbmQoKTsKKworICAgIEluZGV4RGF0YUtleSBpbmRleERhdGFLZXk7CisgICAga2V5UG9z
aXRpb24gPSBJbmRleERhdGFLZXk6OmRlY29kZShrZXlQb3NpdGlvbiwga2V5TGltaXQsICZpbmRl
eERhdGFLZXkpOworCisgICAgbV9jdXJyZW50S2V5ID0gaW5kZXhEYXRhS2V5LnVzZXJLZXkoKTsK
KworICAgIGludDY0X3QgaW5kZXhEYXRhVmVyc2lvbjsKKyAgICBjb25zdCBjaGFyKiB2YWx1ZVBv
c2l0aW9uID0gZGVjb2RlVmFySW50KG1faXRlcmF0b3ItPnZhbHVlKCkuYmVnaW4oKSwgbV9pdGVy
YXRvci0+dmFsdWUoKS5lbmQoKSwgaW5kZXhEYXRhVmVyc2lvbik7CisgICAgaWYgKCF2YWx1ZVBv
c2l0aW9uKSB7CisgICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVJl
YWRFcnJvcik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2YWx1ZVBvc2l0
aW9uID0gZGVjb2RlSURCS2V5KHZhbHVlUG9zaXRpb24sIG1faXRlcmF0b3ItPnZhbHVlKCkuZW5k
KCksIG1fcHJpbWFyeUtleSk7CisgICAgaWYgKCF2YWx1ZVBvc2l0aW9uKSB7CisgICAgICAgIElu
dGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVJlYWRFcnJvcik7CisgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBWZWN0b3I8Y2hhcj4gcHJpbWFyeUxldmVsREJLZXkg
PSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShpbmRleERhdGFLZXkuZGF0YWJhc2VJZCgpLCBp
bmRleERhdGFLZXkub2JqZWN0U3RvcmVJZCgpLCAqbV9wcmltYXJ5S2V5KTsKKworICAgIFZlY3Rv
cjxjaGFyPiByZXN1bHQ7CisgICAgaWYgKCFtX3RyYW5zYWN0aW9uLT5nZXQocHJpbWFyeUxldmVs
REJLZXksIHJlc3VsdCkpIHsKKyAgICAgICAgbV90cmFuc2FjdGlvbi0+cmVtb3ZlKG1faXRlcmF0
b3ItPmtleSgpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDY0X3Qg
b2JqZWN0U3RvcmVEYXRhVmVyc2lvbjsKKyAgICBjb25zdCBjaGFyKiB0ID0gZGVjb2RlVmFySW50
KHJlc3VsdC5iZWdpbigpLCByZXN1bHQuZW5kKCksIG9iamVjdFN0b3JlRGF0YVZlcnNpb24pOwor
ICAgIGlmICghdCkgeworICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3Rv
cmVSZWFkRXJyb3IpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG9i
amVjdFN0b3JlRGF0YVZlcnNpb24gIT0gaW5kZXhEYXRhVmVyc2lvbikgeworICAgICAgICBtX3Ry
YW5zYWN0aW9uLT5yZW1vdmUobV9pdGVyYXRvci0+a2V5KCkpOworICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2NsYXNzIEluZGV4Q3Vyc29ySW1w
bCA6IHB1YmxpYyBDdXJzb3JJbXBsQ29tbW9uIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc1Jl
ZlB0cjxJbmRleEN1cnNvckltcGw+IGNyZWF0ZShMZXZlbERCVHJhbnNhY3Rpb24qIHRyYW5zYWN0
aW9uLCBjb25zdCBDdXJzb3JPcHRpb25zJiBjdXJzb3JPcHRpb25zKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIGFkb3B0UmVmKG5ldyBJbmRleEN1cnNvckltcGwodHJhbnNhY3Rpb24sIGN1cnNvck9w
dGlvbnMpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3Jl
OjpDdXJzb3I+IGNsb25lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgSW5k
ZXhDdXJzb3JJbXBsKHRoaXMpKTsKKyAgICB9CisKKyAgICAvLyBDdXJzb3JJbXBsQ29tbW9uCisg
ICAgdmlydHVhbCBTdHJpbmcgdmFsdWUoKSB7IHJldHVybiBtX3ZhbHVlOyB9CisgICAgdmlydHVh
bCBQYXNzUmVmUHRyPElEQktleT4gcHJpbWFyeUtleSgpIHsgcmV0dXJuIG1fcHJpbWFyeUtleTsg
fQorICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6Ok9iamVjdFN0b3JlUmVj
b3JkSWRlbnRpZmllcj4gb2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyKCkgeyBBU1NFUlRfTk9U
X1JFQUNIRUQoKTsgcmV0dXJuIDA7IH0KKyAgICBib29sIGxvYWRDdXJyZW50Um93KCk7CisKK3By
aXZhdGU6CisgICAgSW5kZXhDdXJzb3JJbXBsKExldmVsREJUcmFuc2FjdGlvbiogdHJhbnNhY3Rp
b24sIGNvbnN0IEN1cnNvck9wdGlvbnMmIGN1cnNvck9wdGlvbnMpCisgICAgICAgIDogQ3Vyc29y
SW1wbENvbW1vbih0cmFuc2FjdGlvbiwgY3Vyc29yT3B0aW9ucykKKyAgICB7CisgICAgfQorCisg
ICAgSW5kZXhDdXJzb3JJbXBsKGNvbnN0IEluZGV4Q3Vyc29ySW1wbCogb3RoZXIpCisgICAgICAg
IDogQ3Vyc29ySW1wbENvbW1vbihvdGhlcikKKyAgICAgICAgLCBtX3ByaW1hcnlLZXkob3RoZXIt
Pm1fcHJpbWFyeUtleSkKKyAgICAgICAgLCBtX3ZhbHVlKG90aGVyLT5tX3ZhbHVlKQorICAgICAg
ICAsIG1fcHJpbWFyeUxldmVsREJLZXkob3RoZXItPm1fcHJpbWFyeUxldmVsREJLZXkpCisgICAg
eworICAgIH0KKworICAgIFJlZlB0cjxJREJLZXk+IG1fcHJpbWFyeUtleTsKKyAgICBTdHJpbmcg
bV92YWx1ZTsKKyAgICBWZWN0b3I8Y2hhcj4gbV9wcmltYXJ5TGV2ZWxEQktleTsKK307CisKK2Jv
b2wgSW5kZXhDdXJzb3JJbXBsOjpsb2FkQ3VycmVudFJvdygpCit7CisgICAgY29uc3QgY2hhciog
a2V5UG9zaXRpb24gPSBtX2l0ZXJhdG9yLT5rZXkoKS5iZWdpbigpOworICAgIGNvbnN0IGNoYXIq
IGtleUxpbWl0ID0gbV9pdGVyYXRvci0+a2V5KCkuZW5kKCk7CisKKyAgICBJbmRleERhdGFLZXkg
aW5kZXhEYXRhS2V5OworICAgIGtleVBvc2l0aW9uID0gSW5kZXhEYXRhS2V5OjpkZWNvZGUoa2V5
UG9zaXRpb24sIGtleUxpbWl0LCAmaW5kZXhEYXRhS2V5KTsKKworICAgIG1fY3VycmVudEtleSA9
IGluZGV4RGF0YUtleS51c2VyS2V5KCk7CisKKyAgICBjb25zdCBjaGFyKiB2YWx1ZVBvc2l0aW9u
ID0gbV9pdGVyYXRvci0+dmFsdWUoKS5iZWdpbigpOworICAgIGNvbnN0IGNoYXIqIHZhbHVlTGlt
aXQgPSBtX2l0ZXJhdG9yLT52YWx1ZSgpLmVuZCgpOworCisgICAgaW50NjRfdCBpbmRleERhdGFW
ZXJzaW9uOworICAgIHZhbHVlUG9zaXRpb24gPSBkZWNvZGVWYXJJbnQodmFsdWVQb3NpdGlvbiwg
dmFsdWVMaW1pdCwgaW5kZXhEYXRhVmVyc2lvbik7CisgICAgaWYgKCF2YWx1ZVBvc2l0aW9uKSB7
CisgICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVJlYWRFcnJvcik7
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdmFsdWVQb3NpdGlvbiA9IGRlY29k
ZUlEQktleSh2YWx1ZVBvc2l0aW9uLCB2YWx1ZUxpbWl0LCBtX3ByaW1hcnlLZXkpOworICAgIGlm
ICghdmFsdWVQb3NpdGlvbikgeworICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNr
aW5nU3RvcmVSZWFkRXJyb3IpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAg
bV9wcmltYXJ5TGV2ZWxEQktleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGluZGV4RGF0
YUtleS5kYXRhYmFzZUlkKCksIGluZGV4RGF0YUtleS5vYmplY3RTdG9yZUlkKCksICptX3ByaW1h
cnlLZXkpOworCisgICAgVmVjdG9yPGNoYXI+IHJlc3VsdDsKKyAgICBpZiAoIW1fdHJhbnNhY3Rp
b24tPmdldChtX3ByaW1hcnlMZXZlbERCS2V5LCByZXN1bHQpKSB7CisgICAgICAgIG1fdHJhbnNh
Y3Rpb24tPnJlbW92ZShtX2l0ZXJhdG9yLT5rZXkoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICB9CisKKyAgICBpbnQ2NF90IG9iamVjdFN0b3JlRGF0YVZlcnNpb247CisgICAgY29uc3Qg
Y2hhciogdCA9IGRlY29kZVZhckludChyZXN1bHQuYmVnaW4oKSwgcmVzdWx0LmVuZCgpLCBvYmpl
Y3RTdG9yZURhdGFWZXJzaW9uKTsKKyAgICBpZiAoIXQpIHsKKyAgICAgICAgSW50ZXJuYWxFcnJv
cihJREJMZXZlbERCQmFja2luZ1N0b3JlUmVhZEVycm9yKTsKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIH0KKworICAgIGlmIChvYmplY3RTdG9yZURhdGFWZXJzaW9uICE9IGluZGV4RGF0YVZl
cnNpb24pIHsKKyAgICAgICAgbV90cmFuc2FjdGlvbi0+cmVtb3ZlKG1faXRlcmF0b3ItPmtleSgp
KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fdmFsdWUgPSBkZWNvZGVT
dHJpbmcodCwgcmVzdWx0LmVuZCgpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBvYmpl
Y3RTdG9yZUN1cnNvck9wdGlvbnMoTGV2ZWxEQlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgaW50
NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleVJhbmdl
KiByYW5nZSwgSURCQ3Vyc29yOjpEaXJlY3Rpb24gZGlyZWN0aW9uLCBDdXJzb3JPcHRpb25zJiBj
dXJzb3JPcHRpb25zKQoreworICAgIGJvb2wgbG93ZXJCb3VuZCA9IHJhbmdlICYmIHJhbmdlLT5s
b3dlcigpOworICAgIGJvb2wgdXBwZXJCb3VuZCA9IHJhbmdlICYmIHJhbmdlLT51cHBlcigpOwor
ICAgIGN1cnNvck9wdGlvbnMuZm9yd2FyZCA9IChkaXJlY3Rpb24gPT0gSURCQ3Vyc29yOjpORVhU
X05PX0RVUExJQ0FURSB8fCBkaXJlY3Rpb24gPT0gSURCQ3Vyc29yOjpORVhUKTsKKyAgICBjdXJz
b3JPcHRpb25zLnVuaXF1ZSA9IChkaXJlY3Rpb24gPT0gSURCQ3Vyc29yOjpORVhUX05PX0RVUExJ
Q0FURSB8fCBkaXJlY3Rpb24gPT0gSURCQ3Vyc29yOjpQUkVWX05PX0RVUExJQ0FURSk7CisKKyAg
ICBpZiAoIWxvd2VyQm91bmQpIHsKKyAgICAgICAgY3Vyc29yT3B0aW9ucy5sb3dLZXkgPSBPYmpl
Y3RTdG9yZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBtaW5JREJL
ZXkoKSk7CisgICAgICAgIGN1cnNvck9wdGlvbnMubG93T3BlbiA9IHRydWU7IC8vIE5vdCBpbmNs
dWRlZC4KKyAgICB9IGVsc2UgeworICAgICAgICBjdXJzb3JPcHRpb25zLmxvd0tleSA9IE9iamVj
dFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsICpyYW5nZS0+
bG93ZXIoKSk7CisgICAgICAgIGN1cnNvck9wdGlvbnMubG93T3BlbiA9IHJhbmdlLT5sb3dlck9w
ZW4oKTsKKyAgICB9CisKKyAgICBpZiAoIXVwcGVyQm91bmQpIHsKKyAgICAgICAgY3Vyc29yT3B0
aW9ucy5oaWdoS2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2Jq
ZWN0U3RvcmVJZCwgbWF4SURCS2V5KCkpOworCisgICAgICAgIGlmIChjdXJzb3JPcHRpb25zLmZv
cndhcmQpCisgICAgICAgICAgICBjdXJzb3JPcHRpb25zLmhpZ2hPcGVuID0gdHJ1ZTsgLy8gTm90
IGluY2x1ZGVkLgorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIFdlIG5lZWQgYSBrZXkg
dGhhdCBleGlzdHMuCisgICAgICAgICAgICBpZiAoIWZpbmRHcmVhdGVzdEtleUxlc3NUaGFuT3JF
cXVhbCh0cmFuc2FjdGlvbiwgY3Vyc29yT3B0aW9ucy5oaWdoS2V5LCBjdXJzb3JPcHRpb25zLmhp
Z2hLZXkpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGN1cnNv
ck9wdGlvbnMuaGlnaE9wZW4gPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAg
ICAgIGN1cnNvck9wdGlvbnMuaGlnaEtleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRh
dGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsICpyYW5nZS0+dXBwZXIoKSk7CisgICAgICAgIGN1cnNv
ck9wdGlvbnMuaGlnaE9wZW4gPSByYW5nZS0+dXBwZXJPcGVuKCk7CisKKyAgICAgICAgaWYgKCFj
dXJzb3JPcHRpb25zLmZvcndhcmQpIHsKKyAgICAgICAgICAgIC8vIEZvciByZXZlcnNlIGN1cnNv
cnMsIHdlIG5lZWQgYSBrZXkgdGhhdCBleGlzdHMuCisgICAgICAgICAgICBWZWN0b3I8Y2hhcj4g
Zm91bmRIaWdoS2V5OworICAgICAgICAgICAgaWYgKCFmaW5kR3JlYXRlc3RLZXlMZXNzVGhhbk9y
RXF1YWwodHJhbnNhY3Rpb24sIGN1cnNvck9wdGlvbnMuaGlnaEtleSwgZm91bmRIaWdoS2V5KSkK
KyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIC8vIElmIHRoZSB0
YXJnZXQga2V5IHNob3VsZCBub3QgYmUgaW5jbHVkZWQsIGJ1dCB3ZSBlbmQgdXAgd2l0aCBhIHNt
YWxsZXIga2V5LCB3ZSBzaG91bGQgaW5jbHVkZSB0aGF0LgorICAgICAgICAgICAgaWYgKGN1cnNv
ck9wdGlvbnMuaGlnaE9wZW4gJiYgY29tcGFyZUluZGV4S2V5cyhmb3VuZEhpZ2hLZXksIGN1cnNv
ck9wdGlvbnMuaGlnaEtleSkgPCAwKQorICAgICAgICAgICAgICAgIGN1cnNvck9wdGlvbnMuaGln
aE9wZW4gPSBmYWxzZTsKKworICAgICAgICAgICAgY3Vyc29yT3B0aW9ucy5oaWdoS2V5ID0gZm91
bmRIaWdoS2V5OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jv
b2wgaW5kZXhDdXJzb3JPcHRpb25zKExldmVsREJUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGlu
dDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQs
IGNvbnN0IElEQktleVJhbmdlKiByYW5nZSwgSURCQ3Vyc29yOjpEaXJlY3Rpb24gZGlyZWN0aW9u
LCBDdXJzb3JPcHRpb25zJiBjdXJzb3JPcHRpb25zKQoreworICAgIEFTU0VSVCh0cmFuc2FjdGlv
bik7CisgICAgYm9vbCBsb3dlckJvdW5kID0gcmFuZ2UgJiYgcmFuZ2UtPmxvd2VyKCk7CisgICAg
Ym9vbCB1cHBlckJvdW5kID0gcmFuZ2UgJiYgcmFuZ2UtPnVwcGVyKCk7CisgICAgY3Vyc29yT3B0
aW9ucy5mb3J3YXJkID0gKGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFRfTk9fRFVQTElDQVRF
IHx8IGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFQpOworICAgIGN1cnNvck9wdGlvbnMudW5p
cXVlID0gKGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFRfTk9fRFVQTElDQVRFIHx8IGRpcmVj
dGlvbiA9PSBJREJDdXJzb3I6OlBSRVZfTk9fRFVQTElDQVRFKTsKKworICAgIGlmICghbG93ZXJC
b3VuZCkgeworICAgICAgICBjdXJzb3JPcHRpb25zLmxvd0tleSA9IEluZGV4RGF0YUtleTo6ZW5j
b2RlTWluS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQpOworICAgICAgICBj
dXJzb3JPcHRpb25zLmxvd09wZW4gPSBmYWxzZTsgLy8gSW5jbHVkZWQuCisgICAgfSBlbHNlIHsK
KyAgICAgICAgY3Vyc29yT3B0aW9ucy5sb3dLZXkgPSBJbmRleERhdGFLZXk6OmVuY29kZShkYXRh
YmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCAqcmFuZ2UtPmxvd2VyKCkpOworICAgICAg
ICBjdXJzb3JPcHRpb25zLmxvd09wZW4gPSByYW5nZS0+bG93ZXJPcGVuKCk7CisgICAgfQorCisg
ICAgaWYgKCF1cHBlckJvdW5kKSB7CisgICAgICAgIGN1cnNvck9wdGlvbnMuaGlnaEtleSA9IElu
ZGV4RGF0YUtleTo6ZW5jb2RlTWF4S2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4
SWQpOworICAgICAgICBjdXJzb3JPcHRpb25zLmhpZ2hPcGVuID0gZmFsc2U7IC8vIEluY2x1ZGVk
LgorCisgICAgICAgIGlmICghY3Vyc29yT3B0aW9ucy5mb3J3YXJkKSB7IC8vIFdlIG5lZWQgYSBr
ZXkgdGhhdCBleGlzdHMuCisgICAgICAgICAgICBpZiAoIWZpbmRHcmVhdGVzdEtleUxlc3NUaGFu
T3JFcXVhbCh0cmFuc2FjdGlvbiwgY3Vyc29yT3B0aW9ucy5oaWdoS2V5LCBjdXJzb3JPcHRpb25z
LmhpZ2hLZXkpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGN1
cnNvck9wdGlvbnMuaGlnaE9wZW4gPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7Cisg
ICAgICAgIGN1cnNvck9wdGlvbnMuaGlnaEtleSA9IEluZGV4RGF0YUtleTo6ZW5jb2RlKGRhdGFi
YXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsICpyYW5nZS0+dXBwZXIoKSk7CisgICAgICAg
IGN1cnNvck9wdGlvbnMuaGlnaE9wZW4gPSByYW5nZS0+dXBwZXJPcGVuKCk7CisKKyAgICAgICAg
VmVjdG9yPGNoYXI+IGZvdW5kSGlnaEtleTsKKyAgICAgICAgaWYgKCFmaW5kR3JlYXRlc3RLZXlM
ZXNzVGhhbk9yRXF1YWwodHJhbnNhY3Rpb24sIGN1cnNvck9wdGlvbnMuaGlnaEtleSwgZm91bmRI
aWdoS2V5KSkgLy8gU2VlayB0byB0aGUgKmxhc3QqIGtleSBpbiB0aGUgc2V0IG9mIG5vbi11bmlx
dWUga2V5cy4KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBJZiB0aGUg
dGFyZ2V0IGtleSBzaG91bGQgbm90IGJlIGluY2x1ZGVkLCBidXQgd2UgZW5kIHVwIHdpdGggYSBz
bWFsbGVyIGtleSwgd2Ugc2hvdWxkIGluY2x1ZGUgdGhhdC4KKyAgICAgICAgaWYgKGN1cnNvck9w
dGlvbnMuaGlnaE9wZW4gJiYgY29tcGFyZUluZGV4S2V5cyhmb3VuZEhpZ2hLZXksIGN1cnNvck9w
dGlvbnMuaGlnaEtleSkgPCAwKQorICAgICAgICAgICAgY3Vyc29yT3B0aW9ucy5oaWdoT3BlbiA9
IGZhbHNlOworCisgICAgICAgIGN1cnNvck9wdGlvbnMuaGlnaEtleSA9IGZvdW5kSGlnaEtleTsK
KyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfQorCitQYXNzUmVmUHRyPElEQkJhY2tp
bmdTdG9yZTo6Q3Vyc29yPiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpvcGVuT2JqZWN0U3RvcmVD
dXJzb3IoSURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGludDY0X3Qg
ZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXlSYW5nZSogcmFu
Z2UsIElEQkN1cnNvcjo6RGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKyAgICBJREJfVFJBQ0UoIklE
QkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5PYmplY3RTdG9yZUN1cnNvciIpOworICAgIExldmVs
REJUcmFuc2FjdGlvbiogbGV2ZWxEQlRyYW5zYWN0aW9uID0gVHJhbnNhY3Rpb246OmxldmVsREJU
cmFuc2FjdGlvbkZyb20odHJhbnNhY3Rpb24pOworICAgIEN1cnNvck9wdGlvbnMgY3Vyc29yT3B0
aW9uczsKKyAgICBpZiAoIW9iamVjdFN0b3JlQ3Vyc29yT3B0aW9ucyhsZXZlbERCVHJhbnNhY3Rp
b24sIGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIHJhbmdlLCBkaXJlY3Rpb24sIGN1cnNvck9w
dGlvbnMpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBSZWZQdHI8T2JqZWN0U3RvcmVDdXJzb3JJ
bXBsPiBjdXJzb3IgPSBPYmplY3RTdG9yZUN1cnNvckltcGw6OmNyZWF0ZShsZXZlbERCVHJhbnNh
Y3Rpb24sIGN1cnNvck9wdGlvbnMpOworICAgIGlmICghY3Vyc29yLT5maXJzdFNlZWsoKSkKKyAg
ICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gY3Vyc29yLnJlbGVhc2UoKTsKK30KKworUGFz
c1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6
b3Blbk9iamVjdFN0b3JlS2V5Q3Vyc29yKElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRy
YW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29u
c3QgSURCS2V5UmFuZ2UqIHJhbmdlLCBJREJDdXJzb3I6OkRpcmVjdGlvbiBkaXJlY3Rpb24pCit7
CisgICAgSURCX1RSQUNFKCJJREJMZXZlbERCQmFja2luZ1N0b3JlOjpvcGVuT2JqZWN0U3RvcmVL
ZXlDdXJzb3IiKTsKKyAgICBMZXZlbERCVHJhbnNhY3Rpb24qIGxldmVsREJUcmFuc2FjdGlvbiA9
IFRyYW5zYWN0aW9uOjpsZXZlbERCVHJhbnNhY3Rpb25Gcm9tKHRyYW5zYWN0aW9uKTsKKyAgICBD
dXJzb3JPcHRpb25zIGN1cnNvck9wdGlvbnM7CisgICAgaWYgKCFvYmplY3RTdG9yZUN1cnNvck9w
dGlvbnMobGV2ZWxEQlRyYW5zYWN0aW9uLCBkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCByYW5n
ZSwgZGlyZWN0aW9uLCBjdXJzb3JPcHRpb25zKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgUmVm
UHRyPE9iamVjdFN0b3JlS2V5Q3Vyc29ySW1wbD4gY3Vyc29yID0gT2JqZWN0U3RvcmVLZXlDdXJz
b3JJbXBsOjpjcmVhdGUobGV2ZWxEQlRyYW5zYWN0aW9uLCBjdXJzb3JPcHRpb25zKTsKKyAgICBp
ZiAoIWN1cnNvci0+Zmlyc3RTZWVrKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJu
IGN1cnNvci5yZWxlYXNlKCk7Cit9CisKK1Bhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJz
b3I+IElEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5JbmRleEtleUN1cnNvcihJREJCYWNraW5n
U3RvcmU6OlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2
NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5UmFuZ2UqIHJh
bmdlLCBJREJDdXJzb3I6OkRpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisgICAgSURCX1RSQUNFKCJJ
REJMZXZlbERCQmFja2luZ1N0b3JlOjpvcGVuSW5kZXhLZXlDdXJzb3IiKTsKKyAgICBMZXZlbERC
VHJhbnNhY3Rpb24qIGxldmVsREJUcmFuc2FjdGlvbiA9IFRyYW5zYWN0aW9uOjpsZXZlbERCVHJh
bnNhY3Rpb25Gcm9tKHRyYW5zYWN0aW9uKTsKKyAgICBDdXJzb3JPcHRpb25zIGN1cnNvck9wdGlv
bnM7CisgICAgaWYgKCFpbmRleEN1cnNvck9wdGlvbnMobGV2ZWxEQlRyYW5zYWN0aW9uLCBkYXRh
YmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCByYW5nZSwgZGlyZWN0aW9uLCBjdXJzb3JP
cHRpb25zKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgUmVmUHRyPEluZGV4S2V5Q3Vyc29ySW1w
bD4gY3Vyc29yID0gSW5kZXhLZXlDdXJzb3JJbXBsOjpjcmVhdGUobGV2ZWxEQlRyYW5zYWN0aW9u
LCBjdXJzb3JPcHRpb25zKTsKKyAgICBpZiAoIWN1cnNvci0+Zmlyc3RTZWVrKCkpCisgICAgICAg
IHJldHVybiAwOworCisgICAgcmV0dXJuIGN1cnNvci5yZWxlYXNlKCk7Cit9CisKK1Bhc3NSZWZQ
dHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IElEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5J
bmRleEN1cnNvcihJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgaW50
NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwg
Y29uc3QgSURCS2V5UmFuZ2UqIHJhbmdlLCBJREJDdXJzb3I6OkRpcmVjdGlvbiBkaXJlY3Rpb24p
Cit7CisgICAgSURCX1RSQUNFKCJJREJMZXZlbERCQmFja2luZ1N0b3JlOjpvcGVuSW5kZXhDdXJz
b3IiKTsKKyAgICBMZXZlbERCVHJhbnNhY3Rpb24qIGxldmVsREJUcmFuc2FjdGlvbiA9IFRyYW5z
YWN0aW9uOjpsZXZlbERCVHJhbnNhY3Rpb25Gcm9tKHRyYW5zYWN0aW9uKTsKKyAgICBDdXJzb3JP
cHRpb25zIGN1cnNvck9wdGlvbnM7CisgICAgaWYgKCFpbmRleEN1cnNvck9wdGlvbnMobGV2ZWxE
QlRyYW5zYWN0aW9uLCBkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCByYW5nZSwg
ZGlyZWN0aW9uLCBjdXJzb3JPcHRpb25zKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgUmVmUHRy
PEluZGV4Q3Vyc29ySW1wbD4gY3Vyc29yID0gSW5kZXhDdXJzb3JJbXBsOjpjcmVhdGUobGV2ZWxE
QlRyYW5zYWN0aW9uLCBjdXJzb3JPcHRpb25zKTsKKyAgICBpZiAoIWN1cnNvci0+Zmlyc3RTZWVr
KCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGN1cnNvci5yZWxlYXNlKCk7Cit9
CisKK1Bhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbj4gSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZTo6Y3JlYXRlVHJhbnNhY3Rpb24oKQoreworICAgIHJldHVybiBUcmFuc2FjdGlv
bjo6Y3JlYXRlKHRoaXMpOworfQorCitQYXNzUmVmUHRyPElEQkxldmVsREJCYWNraW5nU3RvcmU6
OlRyYW5zYWN0aW9uPiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbjo6Y3JlYXRl
KElEQkxldmVsREJCYWNraW5nU3RvcmUqIGJhY2tpbmdTdG9yZSkKK3sKKyAgICByZXR1cm4gYWRv
cHRSZWYobmV3IFRyYW5zYWN0aW9uKGJhY2tpbmdTdG9yZSkpOworfQorCitJREJMZXZlbERCQmFj
a2luZ1N0b3JlOjpUcmFuc2FjdGlvbjo6VHJhbnNhY3Rpb24oSURCTGV2ZWxEQkJhY2tpbmdTdG9y
ZSogYmFja2luZ1N0b3JlKQorICAgIDogbV9iYWNraW5nU3RvcmUoYmFja2luZ1N0b3JlKQorewor
fQorCit2b2lkIElEQkxldmVsREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uOjpiZWdpbigpCit7
CisgICAgSURCX1RSQUNFKCJJREJMZXZlbERCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbjo6YmVn
aW4iKTsKKyAgICBBU1NFUlQoIW1fdHJhbnNhY3Rpb24pOworICAgIG1fdHJhbnNhY3Rpb24gPSBM
ZXZlbERCVHJhbnNhY3Rpb246OmNyZWF0ZShtX2JhY2tpbmdTdG9yZS0+bV9kYi5nZXQoKSk7Cit9
CisKK2Jvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb246OmNvbW1pdCgpCit7
CisgICAgSURCX1RSQUNFKCJJREJMZXZlbERCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbjo6Y29t
bWl0Iik7CisgICAgQVNTRVJUKG1fdHJhbnNhY3Rpb24pOworICAgIGJvb2wgcmVzdWx0ID0gbV90
cmFuc2FjdGlvbi0+Y29tbWl0KCk7CisgICAgbV90cmFuc2FjdGlvbi5jbGVhcigpOworICAgIHJl
dHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rp
b246OnJvbGxiYWNrKCkKK3sKKyAgICBJREJfVFJBQ0UoIklEQkxldmVsREJCYWNraW5nU3RvcmU6
OlRyYW5zYWN0aW9uOjpyb2xsYmFjayIpOworICAgIEFTU0VSVChtX3RyYW5zYWN0aW9uKTsKKyAg
ICBtX3RyYW5zYWN0aW9uLT5yb2xsYmFjaygpOworICAgIG1fdHJhbnNhY3Rpb24uY2xlYXIoKTsK
K30KKworYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpiYWNraW5nU3RvcmVFeGlzdHMoU2Vj
dXJpdHlPcmlnaW4qIHNlY3VyaXR5T3JpZ2luLCBjb25zdCBTdHJpbmcmLCBjb25zdCBTdHJpbmcm
IHBhdGhCYXNlQXJnKQoreworICAgIFN0cmluZyBwYXRoQmFzZSA9IHBhdGhCYXNlQXJnOworCisg
ICAgaWYgKHBhdGhCYXNlLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
Ly8gRklYTUU6IFdlIHNob3VsZCBldmVudHVhbGx5IHVzZSB0aGUgc2FtZSBMZXZlbERCIGRhdGFi
YXNlIGZvciBhbGwgb3JpZ2lucy4KKyAgICBTdHJpbmcgcGF0aCA9IHBhdGhCeUFwcGVuZGluZ0Nv
bXBvbmVudChwYXRoQmFzZSwgc2VjdXJpdHlPcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpICsg
Ii5pbmRleGVkZGIubGV2ZWxkYiIpOworCisgICAgLy8gRklYTUU6IHRoaXMgaXMgY2hlY2tpbmcg
Zm9yIHByZXNlbmNlIG9mIHRoZSBkb21haW4sIG5vdCB0aGUgZGF0YWJhc2UgaXRzZWxmCisgICAg
cmV0dXJuIGZpbGVFeGlzdHMocGF0aCsiL0NVUlJFTlQiKTsKK30KKworfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKExFVkVMREIpCisjZW5kaWYgLy8gRU5BQkxFKElOREVY
RURfREFUQUJBU0UpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRk
Yi9JREJMZXZlbERCQmFja2luZ1N0b3JlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5k
ZXhlZGRiL0lEQkxldmVsREJCYWNraW5nU3RvcmUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCBlYTVkNTlmZTNlODQxY2IyNGUxOWIzZmI2MmEzZmYzNWViMzcwNjgzLi4wMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL01v
ZHVsZXMvaW5kZXhlZGRiL0lEQkxldmVsREJCYWNraW5nU3RvcmUuY3BwCisrKyAvZGV2L251bGwK
QEAgLTEsMTkwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAq
IGFyZSBtZXQ6Ci0gKgotICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
Ci0gKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFO
RCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0g
KiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUg
IklEQkxldmVsREJCYWNraW5nU3RvcmUuaCIKLSNpbmNsdWRlICJJREJUcmFjaW5nLmgiCi0KLSNp
ZiBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKLSNpZiBVU0UoTEVWRUxEQikKLQotI2luY2x1ZGUg
PHd0Zi9Bc3NlcnRpb25zLmg+Ci0jaW5jbHVkZSAiRmlsZVN5c3RlbS5oIgotI2luY2x1ZGUgIkhp
c3RvZ3JhbVN1cHBvcnQuaCIKLSNpbmNsdWRlICJJREJGYWN0b3J5QmFja2VuZEltcGwuaCIKLSNp
bmNsdWRlICJJREJLZXkuaCIKLSNpbmNsdWRlICJJREJLZXlQYXRoLmgiCi0jaW5jbHVkZSAiSURC
S2V5UmFuZ2UuaCIKLSNpbmNsdWRlICJJREJMZXZlbERCQ29kaW5nLmgiCi0jaW5jbHVkZSAiSURC
TWV0YWRhdGEuaCIKLSNpbmNsdWRlICJMZXZlbERCQ29tcGFyYXRvci5oIgotI2luY2x1ZGUgIkxl
dmVsREJEYXRhYmFzZS5oIgotI2luY2x1ZGUgIkxldmVsREJJdGVyYXRvci5oIgotI2luY2x1ZGUg
IkxldmVsREJTbGljZS5oIgotI2luY2x1ZGUgIkxldmVsREJUcmFuc2FjdGlvbi5oIgotI2luY2x1
ZGUgIlNlY3VyaXR5T3JpZ2luLmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotdXNpbmcgbmFt
ZXNwYWNlIElEQkxldmVsREJDb2Rpbmc7Ci0KLWNvbnN0IGludDY0X3QgS2V5R2VuZXJhdG9ySW5p
dGlhbE51bWJlciA9IDE7IC8vIEZyb20gdGhlIEluZGV4ZWREQiBzcGVjaWZpY2F0aW9uLgotCi1l
bnVtIElEQkxldmVsREJCYWNraW5nU3RvcmVJbnRlcm5hbEVycm9yVHlwZSB7Ci0gICAgSURCTGV2
ZWxEQkJhY2tpbmdTdG9yZVJlYWRFcnJvciwKLSAgICBJREJMZXZlbERCQmFja2luZ1N0b3JlV3Jp
dGVFcnJvciwKLSAgICBJREJMZXZlbERCQmFja2luZ1N0b3JlQ29uc2lzdGVuY3lFcnJvciwKLSAg
ICBJREJMZXZlbERCQmFja2luZ1N0b3JlSW50ZXJuYWxFcnJvck1heCwKLX07Ci1zdGF0aWMgaW5s
aW5lIHZvaWQgcmVjb3JkSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlSW50ZXJu
YWxFcnJvclR5cGUgdHlwZSkKLXsKLSAgICBIaXN0b2dyYW1TdXBwb3J0OjpoaXN0b2dyYW1FbnVt
ZXJhdGlvbigiV2ViQ29yZS5JbmRleGVkREIuQmFja2luZ1N0b3JlLkludGVybmFsRXJyb3IiLCB0
eXBlLCBJREJMZXZlbERCQmFja2luZ1N0b3JlSW50ZXJuYWxFcnJvck1heCk7Ci19Ci0KLS8vIFVz
ZSB0byBzaWduYWwgY29uZGl0aW9ucyB0aGF0IHVzdWFsbHkgaW5kaWNhdGUgZGV2ZWxvcGVyIGVy
cm9yLCBidXQgY291bGQgYmUgY2F1c2VkIGJ5IGRhdGEgY29ycnVwdGlvbi4KLS8vIEEgbWFjcm8g
aXMgdXNlZCBpbnN0ZWFkIG9mIGFuIGlubGluZSBmdW5jdGlvbiBzbyB0aGF0IHRoZSBhc3NlcnQg
YW5kIGxvZyByZXBvcnQgdGhlIGxpbmUgbnVtYmVyLgotI2RlZmluZSBJbnRlcm5hbEVycm9yKHR5
cGUpIFwKLSAgICBkbyB7IFwKLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IFwKLSAgICAg
ICAgTE9HX0VSUk9SKCJJbnRlcm5hbCBJbmRleGVkREIgRXJyb3I6ICVzIiwgI3R5cGUpOyBcCi0g
ICAgICAgIHJlY29yZEludGVybmFsRXJyb3IodHlwZSk7IFwKLSAgICB9IHdoaWxlICgwKQotCi10
ZW1wbGF0ZSA8dHlwZW5hbWUgREJPclRyYW5zYWN0aW9uPgotc3RhdGljIGJvb2wgZ2V0Qm9vbChE
Qk9yVHJhbnNhY3Rpb24qIGRiLCBjb25zdCBWZWN0b3I8Y2hhcj4mIGtleSwgYm9vbCYgZm91bmRC
b29sKQotewotICAgIFZlY3RvcjxjaGFyPiByZXN1bHQ7Ci0gICAgaWYgKCFkYi0+Z2V0KGtleSwg
cmVzdWx0KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgZm91bmRCb29sID0gZGVjb2Rl
Qm9vbChyZXN1bHQuYmVnaW4oKSwgcmVzdWx0LmVuZCgpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0K
LQotdGVtcGxhdGUgPHR5cGVuYW1lIERCT3JUcmFuc2FjdGlvbj4KLXN0YXRpYyBib29sIHB1dEJv
b2woREJPclRyYW5zYWN0aW9uKiBkYiwgY29uc3QgVmVjdG9yPGNoYXI+JiBrZXksIGJvb2wgdmFs
dWUpCi17Ci0gICAgcmV0dXJuIGRiLT5wdXQoa2V5LCBlbmNvZGVCb29sKHZhbHVlKSk7Ci19Ci0K
LXRlbXBsYXRlIDx0eXBlbmFtZSBEQk9yVHJhbnNhY3Rpb24+Ci1zdGF0aWMgYm9vbCBnZXRJbnQo
REJPclRyYW5zYWN0aW9uKiBkYiwgY29uc3QgVmVjdG9yPGNoYXI+JiBrZXksIGludDY0X3QmIGZv
dW5kSW50KQotewotICAgIFZlY3RvcjxjaGFyPiByZXN1bHQ7Ci0gICAgaWYgKCFkYi0+Z2V0KGtl
eSwgcmVzdWx0KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgZm91bmRJbnQgPSBkZWNv
ZGVJbnQocmVzdWx0LmJlZ2luKCksIHJlc3VsdC5lbmQoKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19
Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBEQk9yVHJhbnNhY3Rpb24+Ci1zdGF0aWMgYm9vbCBwdXRJ
bnQoREJPclRyYW5zYWN0aW9uKiBkYiwgY29uc3QgVmVjdG9yPGNoYXI+JiBrZXksIGludDY0X3Qg
dmFsdWUpCi17Ci0gICAgQVNTRVJUKHZhbHVlID49IDApOwotICAgIGlmICh2YWx1ZSA8IDApCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gZGItPnB1dChrZXksIGVuY29kZUludCh2
YWx1ZSkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgREJPclRyYW5zYWN0aW9uPgotc3RhdGlj
IGJvb2wgZ2V0VmFySW50KERCT3JUcmFuc2FjdGlvbiogZGIsIGNvbnN0IFZlY3RvcjxjaGFyPiYg
a2V5LCBpbnQ2NF90JiBmb3VuZEludCkKLXsKLSAgICBWZWN0b3I8Y2hhcj4gcmVzdWx0OwotICAg
IGlmICghZGItPmdldChrZXksIHJlc3VsdCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAg
IHJldHVybiBkZWNvZGVWYXJJbnQocmVzdWx0LmJlZ2luKCksIHJlc3VsdC5lbmQoKSwgZm91bmRJ
bnQpID09IHJlc3VsdC5lbmQoKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIERCT3JUcmFuc2Fj
dGlvbj4KLXN0YXRpYyBib29sIHB1dFZhckludChEQk9yVHJhbnNhY3Rpb24qIGRiLCBjb25zdCBW
ZWN0b3I8Y2hhcj4mIGtleSwgaW50NjRfdCB2YWx1ZSkKLXsKLSAgICByZXR1cm4gZGItPnB1dChr
ZXksIGVuY29kZVZhckludCh2YWx1ZSkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgREJPclRy
YW5zYWN0aW9uPgotc3RhdGljIGJvb2wgZ2V0U3RyaW5nKERCT3JUcmFuc2FjdGlvbiogZGIsIGNv
bnN0IFZlY3RvcjxjaGFyPiYga2V5LCBTdHJpbmcmIGZvdW5kU3RyaW5nKQotewotICAgIFZlY3Rv
cjxjaGFyPiByZXN1bHQ7Ci0gICAgaWYgKCFkYi0+Z2V0KGtleSwgcmVzdWx0KSkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotCi0gICAgZm91bmRTdHJpbmcgPSBkZWNvZGVTdHJpbmcocmVzdWx0LmJl
Z2luKCksIHJlc3VsdC5lbmQoKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXRlbXBsYXRlIDx0
eXBlbmFtZSBEQk9yVHJhbnNhY3Rpb24+Ci1zdGF0aWMgYm9vbCBwdXRTdHJpbmcoREJPclRyYW5z
YWN0aW9uKiBkYiwgY29uc3QgVmVjdG9yPGNoYXI+IGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSkK
LXsKLSAgICBpZiAoIWRiLT5wdXQoa2V5LCBlbmNvZGVTdHJpbmcodmFsdWUpKSkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUg
REJPclRyYW5zYWN0aW9uPgotc3RhdGljIGJvb2wgcHV0SURCS2V5UGF0aChEQk9yVHJhbnNhY3Rp
b24qIGRiLCBjb25zdCBWZWN0b3I8Y2hhcj4ga2V5LCBjb25zdCBJREJLZXlQYXRoJiB2YWx1ZSkK
LXsKLSAgICBpZiAoIWRiLT5wdXQoa2V5LCBlbmNvZGVJREJLZXlQYXRoKHZhbHVlKSkpCi0gICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGludCBjb21w
YXJlS2V5cyhjb25zdCBMZXZlbERCU2xpY2UmIGEsIGNvbnN0IExldmVsREJTbGljZSYgYikKLXsK
LSAgICByZXR1cm4gY29tcGFyZShhLCBiKTsKLX0KLQotc3RhdGljIGludCBjb21wYXJlSW5kZXhL
ZXlzKGNvbnN0IExldmVsREJTbGljZSYgYSwgY29uc3QgTGV2ZWxEQlNsaWNlJiBiKQotewotICAg
IHJldHVybiBjb21wYXJlKGEsIGIsIHRydWUpOwotfQotCi1jbGFzcyBDb21wYXJhdG9yIDogcHVi
bGljIExldmVsREJDb21wYXJhdG9yIHsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIGludCBjb21wYXJl
KGNvbnN0IExldmVsREJTbGljZSYgYSwgY29uc3QgTGV2ZWxEQlNsaWNlJiBiKSBjb25zdCB7IHJl
dHVybiBJREJMZXZlbERCQ29kaW5nOjpjb21wYXJlKGEsIGIpOyB9Ci0gICAgdmlydHVhbCBjb25z
dCBjaGFyKiBuYW1lKCkgY29uc3QgeyByZXR1cm4gImlkYl9jbXAxIjsgfQotfTsKLQotY29uc3Qg
aW50NjRfdCBsYXRlc3RTY2hlbWFWZXJzaW9uID0gMTsKLXN0YXRpYyBib29sIGlzU2NoZW1hS25v
d24oTGV2ZWxEQkRhdGFiYXNlKiBkYikKLXsKLSAgICBpbnQ2NF90IHNjaGVtYVZlcnNpb24gPSAw
OwotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBtZXRhRGF0YUtleSA9IFNjaGVtYVZlcnNpb25LZXk6
OmVuY29kZSgpOwotICAgIGlmICghZ2V0SW50KGRiLCBtZXRhRGF0YUtleSwgc2NoZW1hVmVyc2lv
bikpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIHJldHVybiBzY2hlbWFWZXJzaW9uIDw9IGxh
dGVzdFNjaGVtYVZlcnNpb247Ci19Ci0KLXN0YXRpYyBib29sIHNldFVwTWV0YWRhdGEoTGV2ZWxE
QkRhdGFiYXNlKiBkYiwgY29uc3QgU3RyaW5nJiBvcmlnaW4pCi17Ci0gICAgY29uc3QgVmVjdG9y
PGNoYXI+IG1ldGFEYXRhS2V5ID0gU2NoZW1hVmVyc2lvbktleTo6ZW5jb2RlKCk7Ci0KLSAgICBp
bnQ2NF90IHNjaGVtYVZlcnNpb24gPSAwOwotICAgIGlmICghZ2V0SW50KGRiLCBtZXRhRGF0YUtl
eSwgc2NoZW1hVmVyc2lvbikpIHsKLSAgICAgICAgc2NoZW1hVmVyc2lvbiA9IGxhdGVzdFNjaGVt
YVZlcnNpb247Ci0gICAgICAgIGlmICghcHV0SW50KGRiLCBtZXRhRGF0YUtleSwgbGF0ZXN0U2No
ZW1hVmVyc2lvbikpIHsKLSAgICAgICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tp
bmdTdG9yZVdyaXRlRXJyb3IpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9
Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQVNTRVJUKHNjaGVtYVZlcnNpb24gPD0gbGF0ZXN0U2No
ZW1hVmVyc2lvbik7Ci0gICAgICAgIGlmICghc2NoZW1hVmVyc2lvbikgewotICAgICAgICAgICAg
c2NoZW1hVmVyc2lvbiA9IGxhdGVzdFNjaGVtYVZlcnNpb247Ci0gICAgICAgICAgICBSZWZQdHI8
TGV2ZWxEQlRyYW5zYWN0aW9uPiB0cmFuc2FjdGlvbiA9IExldmVsREJUcmFuc2FjdGlvbjo6Y3Jl
YXRlKGRiKTsKLSAgICAgICAgICAgIHRyYW5zYWN0aW9uLT5wdXQobWV0YURhdGFLZXksIGVuY29k
ZUludChzY2hlbWFWZXJzaW9uKSk7Ci0KLSAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBz
dGFydEtleSA9IERhdGFiYXNlTmFtZUtleTo6ZW5jb2RlTWluS2V5Rm9yT3JpZ2luKG9yaWdpbik7
Ci0gICAgICAgICAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3RvcEtleSA9IERhdGFiYXNlTmFtZUtl
eTo6ZW5jb2RlU3RvcEtleUZvck9yaWdpbihvcmlnaW4pOwotICAgICAgICAgICAgT3duUHRyPExl
dmVsREJJdGVyYXRvcj4gaXQgPSBkYi0+Y3JlYXRlSXRlcmF0b3IoKTsKLSAgICAgICAgICAgIGZv
ciAoaXQtPnNlZWsoc3RhcnRLZXkpOyBpdC0+aXNWYWxpZCgpICYmIGNvbXBhcmVLZXlzKGl0LT5r
ZXkoKSwgc3RvcEtleSkgPCAwOyBpdC0+bmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgVmVjdG9y
PGNoYXI+IHZhbHVlOwotICAgICAgICAgICAgICAgIGJvb2wgb2sgPSB0cmFuc2FjdGlvbi0+Z2V0
KGl0LT5rZXkoKSwgdmFsdWUpOwotICAgICAgICAgICAgICAgIGlmICghb2spIHsKLSAgICAgICAg
ICAgICAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlUmVhZEVycm9y
KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgICAgICBpbnQgZGF0YWJhc2VJZCA9IGRlY29kZUludCh2YWx1ZS5iZWdpbigp
LCB2YWx1ZS5lbmQoKSk7Ci0gICAgICAgICAgICAgICAgVmVjdG9yPGNoYXI+IGludFZlcnNpb25L
ZXkgPSBEYXRhYmFzZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgRGF0YWJhc2VNZXRh
RGF0YUtleTo6VXNlckludFZlcnNpb24pOwotICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLT5w
dXQoaW50VmVyc2lvbktleSwgZW5jb2RlVmFySW50KElEQkRhdGFiYXNlTWV0YWRhdGE6OkRlZmF1
bHRJbnRWZXJzaW9uKSk7Ci0gICAgICAgICAgICAgICAgb2sgPSB0cmFuc2FjdGlvbi0+Z2V0KGl0
LT5rZXkoKSwgdmFsdWUpOwotICAgICAgICAgICAgICAgIGlmICghb2spIHsKLSAgICAgICAgICAg
ICAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlUmVhZEVycm9yKTsK
LSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgIGJvb2wgb2sgPSB0cmFuc2FjdGlvbi0+Y29tbWl0KCk7
Ci0gICAgICAgICAgICBpZiAoIW9rKSB7Ci0gICAgICAgICAgICAgICAgSW50ZXJuYWxFcnJvcihJ
REJMZXZlbERCQmFja2luZ1N0b3JlV3JpdGVFcnJvcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQVNTRVJUKHNj
aGVtYVZlcnNpb24gPT0gbGF0ZXN0U2NoZW1hVmVyc2lvbik7Ci0KLSAgICByZXR1cm4gdHJ1ZTsK
LX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIERCT3JUcmFuc2FjdGlvbj4KLXN0YXRpYyBpbnQ2NF90
IGdldE1heE9iamVjdFN0b3JlSWQoREJPclRyYW5zYWN0aW9uKiBkYiwgaW50NjRfdCBkYXRhYmFz
ZUlkKQotewotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBtYXhPYmplY3RTdG9yZUlkS2V5ID0gRGF0
YWJhc2VNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIERhdGFiYXNlTWV0YURhdGFLZXk6
Ok1heE9iamVjdFN0b3JlSWQpOwotICAgIHJldHVybiBnZXRNYXhPYmplY3RTdG9yZUlkKGRiLCBt
YXhPYmplY3RTdG9yZUlkS2V5KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIERCT3JUcmFuc2Fj
dGlvbj4KLXN0YXRpYyBpbnQ2NF90IGdldE1heE9iamVjdFN0b3JlSWQoREJPclRyYW5zYWN0aW9u
KiBkYiwgY29uc3QgVmVjdG9yPGNoYXI+JiBtYXhPYmplY3RTdG9yZUlkS2V5KQotewotICAgIGlu
dDY0X3QgbWF4T2JqZWN0U3RvcmVJZCA9IC0xOwotICAgIGlmICghZ2V0SW50KGRiLCBtYXhPYmpl
Y3RTdG9yZUlkS2V5LCBtYXhPYmplY3RTdG9yZUlkKSkKLSAgICAgICAgbWF4T2JqZWN0U3RvcmVJ
ZCA9IDA7Ci0KLSAgICBBU1NFUlQobWF4T2JqZWN0U3RvcmVJZCA+PSAwKTsKLSAgICByZXR1cm4g
bWF4T2JqZWN0U3RvcmVJZDsKLX0KLQotSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6SURCTGV2ZWxE
QkJhY2tpbmdTdG9yZShjb25zdCBTdHJpbmcmIGlkZW50aWZpZXIsIElEQkZhY3RvcnlCYWNrZW5k
SW1wbCogZmFjdG9yeSwgUGFzc093blB0cjxMZXZlbERCRGF0YWJhc2U+IGRiKQotICAgIDogbV9p
ZGVudGlmaWVyKGlkZW50aWZpZXIpCi0gICAgLCBtX2ZhY3RvcnkoZmFjdG9yeSkKLSAgICAsIG1f
ZGIoZGIpCi17Ci0gICAgbV9mYWN0b3J5LT5hZGRJREJCYWNraW5nU3RvcmUoaWRlbnRpZmllciwg
dGhpcyk7Ci19Ci0KLUlEQkxldmVsREJCYWNraW5nU3RvcmU6On5JREJMZXZlbERCQmFja2luZ1N0
b3JlKCkKLXsKLSAgICBtX2ZhY3RvcnktPnJlbW92ZUlEQkJhY2tpbmdTdG9yZShtX2lkZW50aWZp
ZXIpOwotCi0gICAgLy8gbV9kYidzIGRlc3RydWN0b3IgdXNlcyBtX2NvbXBhcmF0b3IuIFRoZSBv
cmRlciBvZiBkZXN0cnVjdGlvbiBpcyBpbXBvcnRhbnQuCi0gICAgbV9kYi5jbGVhcigpOwotICAg
IG1fY29tcGFyYXRvci5jbGVhcigpOwotfQotCi1lbnVtIElEQkxldmVsREJCYWNraW5nU3RvcmVP
cGVuUmVzdWx0IHsKLSAgICBJREJMZXZlbERCQmFja2luZ1N0b3JlT3Blbk1lbW9yeSwKLSAgICBJ
REJMZXZlbERCQmFja2luZ1N0b3JlT3BlblN1Y2Nlc3MsCi0gICAgSURCTGV2ZWxEQkJhY2tpbmdT
dG9yZU9wZW5GYWlsZWREaXJlY3RvcnksCi0gICAgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5G
YWlsZWRVbmtub3duU2NoZW1hLAotICAgIElEQkxldmVsREJCYWNraW5nU3RvcmVPcGVuQ2xlYW51
cERlc3Ryb3lGYWlsZWQsCi0gICAgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5DbGVhbnVwUmVv
cGVuRmFpbGVkLAotICAgIElEQkxldmVsREJCYWNraW5nU3RvcmVPcGVuQ2xlYW51cFJlb3BlblN1
Y2Nlc3MsCi0gICAgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5NYXgsCi19OwotCi1QYXNzUmVm
UHRyPElEQkJhY2tpbmdTdG9yZT4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3BlbihTZWN1cml0
eU9yaWdpbiogc2VjdXJpdHlPcmlnaW4sIGNvbnN0IFN0cmluZyYgcGF0aEJhc2VBcmcsIGNvbnN0
IFN0cmluZyYgZmlsZUlkZW50aWZpZXIsIElEQkZhY3RvcnlCYWNrZW5kSW1wbCogZmFjdG9yeSkK
LXsKLSAgICBJREJfVFJBQ0UoIklEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW4iKTsKLSAgICBT
dHJpbmcgcGF0aEJhc2UgPSBwYXRoQmFzZUFyZzsKLQotICAgIE93blB0cjxMZXZlbERCQ29tcGFy
YXRvcj4gY29tcGFyYXRvciA9IGFkb3B0UHRyKG5ldyBDb21wYXJhdG9yKCkpOwotICAgIE93blB0
cjxMZXZlbERCRGF0YWJhc2U+IGRiOwotCi0gICAgaWYgKHBhdGhCYXNlLmlzRW1wdHkoKSkgewot
ICAgICAgICBIaXN0b2dyYW1TdXBwb3J0OjpoaXN0b2dyYW1FbnVtZXJhdGlvbigiV2ViQ29yZS5J
bmRleGVkREIuQmFja2luZ1N0b3JlLk9wZW5TdGF0dXMiLCBJREJMZXZlbERCQmFja2luZ1N0b3Jl
T3Blbk1lbW9yeSwgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5NYXgpOwotICAgICAgICBkYiA9
IExldmVsREJEYXRhYmFzZTo6b3BlbkluTWVtb3J5KGNvbXBhcmF0b3IuZ2V0KCkpOwotICAgIH0g
ZWxzZSB7Ci0gICAgICAgIGlmICghbWFrZUFsbERpcmVjdG9yaWVzKHBhdGhCYXNlKSkgewotICAg
ICAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gY3JlYXRlIEluZGV4ZWREQiBkYXRhYmFzZSBw
YXRoICVzIiwgcGF0aEJhc2UudXRmOCgpLmRhdGEoKSk7Ci0gICAgICAgICAgICBIaXN0b2dyYW1T
dXBwb3J0OjpoaXN0b2dyYW1FbnVtZXJhdGlvbigiV2ViQ29yZS5JbmRleGVkREIuQmFja2luZ1N0
b3JlLk9wZW5TdGF0dXMiLCBJREJMZXZlbERCQmFja2luZ1N0b3JlT3BlbkZhaWxlZERpcmVjdG9y
eSwgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5NYXgpOwotICAgICAgICAgICAgcmV0dXJuIFBh
c3NSZWZQdHI8SURCQmFja2luZ1N0b3JlPigpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5n
IHBhdGggPSBwYXRoQnlBcHBlbmRpbmdDb21wb25lbnQocGF0aEJhc2UsIHNlY3VyaXR5T3JpZ2lu
LT5kYXRhYmFzZUlkZW50aWZpZXIoKSArICIuaW5kZXhlZGRiLmxldmVsZGIiKTsKLQotICAgICAg
ICBkYiA9IExldmVsREJEYXRhYmFzZTo6b3BlbihwYXRoLCBjb21wYXJhdG9yLmdldCgpKTsKLSAg
ICAgICAgaWYgKGRiICYmICFpc1NjaGVtYUtub3duKGRiLmdldCgpKSkgewotICAgICAgICAgICAg
TE9HX0VSUk9SKCJJbmRleGVkREIgYmFja2luZyBzdG9yZSBoYWQgdW5rbm93biBzY2hlbWEsIHRy
ZWF0aW5nIGl0IGFzIGZhaWx1cmUgdG8gb3BlbiIpOwotICAgICAgICAgICAgSGlzdG9ncmFtU3Vw
cG9ydDo6aGlzdG9ncmFtRW51bWVyYXRpb24oIldlYkNvcmUuSW5kZXhlZERCLkJhY2tpbmdTdG9y
ZS5PcGVuU3RhdHVzIiwgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5GYWlsZWRVbmtub3duU2No
ZW1hLCBJREJMZXZlbERCQmFja2luZ1N0b3JlT3Blbk1heCk7Ci0gICAgICAgICAgICBkYi5yZWxl
YXNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGIpCi0gICAgICAgICAgICBIaXN0b2dy
YW1TdXBwb3J0OjpoaXN0b2dyYW1FbnVtZXJhdGlvbigiV2ViQ29yZS5JbmRleGVkREIuQmFja2lu
Z1N0b3JlLk9wZW5TdGF0dXMiLCBJREJMZXZlbERCQmFja2luZ1N0b3JlT3BlblN1Y2Nlc3MsIElE
QkxldmVsREJCYWNraW5nU3RvcmVPcGVuTWF4KTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAg
ICBMT0dfRVJST1IoIkluZGV4ZWREQiBiYWNraW5nIHN0b3JlIG9wZW4gZmFpbGVkLCBhdHRlbXB0
aW5nIGNsZWFudXAiKTsKLSAgICAgICAgICAgIGJvb2wgc3VjY2VzcyA9IExldmVsREJEYXRhYmFz
ZTo6ZGVzdHJveShwYXRoKTsKLSAgICAgICAgICAgIGlmICghc3VjY2VzcykgewotICAgICAgICAg
ICAgICAgIExPR19FUlJPUigiSW5kZXhlZERCIGJhY2tpbmcgc3RvcmUgY2xlYW51cCBmYWlsZWQi
KTsKLSAgICAgICAgICAgICAgICBIaXN0b2dyYW1TdXBwb3J0OjpoaXN0b2dyYW1FbnVtZXJhdGlv
bigiV2ViQ29yZS5JbmRleGVkREIuQmFja2luZ1N0b3JlLk9wZW5TdGF0dXMiLCBJREJMZXZlbERC
QmFja2luZ1N0b3JlT3BlbkNsZWFudXBEZXN0cm95RmFpbGVkLCBJREJMZXZlbERCQmFja2luZ1N0
b3JlT3Blbk1heCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBhc3NSZWZQdHI8SURCQmFja2lu
Z1N0b3JlPigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBMT0dfRVJST1IoIkluZGV4
ZWREQiBiYWNraW5nIHN0b3JlIGNsZWFudXAgc3VjY2VlZGVkLCByZW9wZW5pbmciKTsKLSAgICAg
ICAgICAgIGRiID0gTGV2ZWxEQkRhdGFiYXNlOjpvcGVuKHBhdGgsIGNvbXBhcmF0b3IuZ2V0KCkp
OwotICAgICAgICAgICAgaWYgKCFkYikgewotICAgICAgICAgICAgICAgIExPR19FUlJPUigiSW5k
ZXhlZERCIGJhY2tpbmcgc3RvcmUgcmVvcGVuIGFmdGVyIHJlY292ZXJ5IGZhaWxlZCIpOwotICAg
ICAgICAgICAgICAgIEhpc3RvZ3JhbVN1cHBvcnQ6Omhpc3RvZ3JhbUVudW1lcmF0aW9uKCJXZWJD
b3JlLkluZGV4ZWREQi5CYWNraW5nU3RvcmUuT3BlblN0YXR1cyIsIElEQkxldmVsREJCYWNraW5n
U3RvcmVPcGVuQ2xlYW51cFJlb3BlbkZhaWxlZCwgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5N
YXgpOwotICAgICAgICAgICAgICAgIHJldHVybiBQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4o
KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEhpc3RvZ3JhbVN1cHBvcnQ6Omhpc3RvZ3Jh
bUVudW1lcmF0aW9uKCJXZWJDb3JlLkluZGV4ZWREQi5CYWNraW5nU3RvcmUuT3BlblN0YXR1cyIs
IElEQkxldmVsREJCYWNraW5nU3RvcmVPcGVuQ2xlYW51cFJlb3BlblN1Y2Nlc3MsIElEQkxldmVs
REJCYWNraW5nU3RvcmVPcGVuTWF4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghZGIp
Ci0gICAgICAgIHJldHVybiBQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4oKTsKLQotICAgIC8v
IEZJWE1FOiBIYW5kbGUgY29tcGFyYXRvciBuYW1lIGNoYW5nZXMuCi0KLSAgICBSZWZQdHI8SURC
TGV2ZWxEQkJhY2tpbmdTdG9yZT4gYmFja2luZ1N0b3JlKGFkb3B0UmVmKG5ldyBJREJMZXZlbERC
QmFja2luZ1N0b3JlKGZpbGVJZGVudGlmaWVyLCBmYWN0b3J5LCBkYi5yZWxlYXNlKCkpKSk7Ci0g
ICAgYmFja2luZ1N0b3JlLT5tX2NvbXBhcmF0b3IgPSBjb21wYXJhdG9yLnJlbGVhc2UoKTsKLQot
ICAgIGlmICghc2V0VXBNZXRhZGF0YShiYWNraW5nU3RvcmUtPm1fZGIuZ2V0KCksIGZpbGVJZGVu
dGlmaWVyKSkKLSAgICAgICAgcmV0dXJuIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlPigpOwot
Ci0gICAgcmV0dXJuIGJhY2tpbmdTdG9yZS5yZWxlYXNlKCk7Ci19Ci0KLVZlY3RvcjxTdHJpbmc+
IElEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldERhdGFiYXNlTmFtZXMoKQotewotICAgIFZlY3Rv
cjxTdHJpbmc+IGZvdW5kTmFtZXM7Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IHN0YXJ0S2V5ID0g
RGF0YWJhc2VOYW1lS2V5OjplbmNvZGVNaW5LZXlGb3JPcmlnaW4obV9pZGVudGlmaWVyKTsKLSAg
ICBjb25zdCBWZWN0b3I8Y2hhcj4gc3RvcEtleSA9IERhdGFiYXNlTmFtZUtleTo6ZW5jb2RlU3Rv
cEtleUZvck9yaWdpbihtX2lkZW50aWZpZXIpOwotCi0gICAgQVNTRVJUKGZvdW5kTmFtZXMuaXNF
bXB0eSgpKTsKLQotICAgIE93blB0cjxMZXZlbERCSXRlcmF0b3I+IGl0ID0gbV9kYi0+Y3JlYXRl
SXRlcmF0b3IoKTsKLSAgICBmb3IgKGl0LT5zZWVrKHN0YXJ0S2V5KTsgaXQtPmlzVmFsaWQoKSAm
JiBjb21wYXJlS2V5cyhpdC0+a2V5KCksIHN0b3BLZXkpIDwgMDsgaXQtPm5leHQoKSkgewotICAg
ICAgICBjb25zdCBjaGFyKiBwID0gaXQtPmtleSgpLmJlZ2luKCk7Ci0gICAgICAgIGNvbnN0IGNo
YXIqIGxpbWl0ID0gaXQtPmtleSgpLmVuZCgpOwotCi0gICAgICAgIERhdGFiYXNlTmFtZUtleSBk
YXRhYmFzZU5hbWVLZXk7Ci0gICAgICAgIHAgPSBEYXRhYmFzZU5hbWVLZXk6OmRlY29kZShwLCBs
aW1pdCwgJmRhdGFiYXNlTmFtZUtleSk7Ci0gICAgICAgIEFTU0VSVChwKTsKLQotICAgICAgICBm
b3VuZE5hbWVzLmFwcGVuZChkYXRhYmFzZU5hbWVLZXkuZGF0YWJhc2VOYW1lKCkpOwotICAgIH0K
LSAgICByZXR1cm4gZm91bmROYW1lczsKLX0KLQotYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3Jl
OjpnZXRJREJEYXRhYmFzZU1ldGFEYXRhKGNvbnN0IFN0cmluZyYgbmFtZSwgSURCRGF0YWJhc2VN
ZXRhZGF0YSogbWV0YWRhdGEpCi17Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IGtleSA9IERhdGFi
YXNlTmFtZUtleTo6ZW5jb2RlKG1faWRlbnRpZmllciwgbmFtZSk7Ci0KLSAgICBib29sIG9rID0g
Z2V0SW50KG1fZGIuZ2V0KCksIGtleSwgbWV0YWRhdGEtPmlkKTsKLSAgICBpZiAoIW9rKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBvayA9IGdldFN0cmluZyhtX2RiLmdldCgpLCBEYXRh
YmFzZU1ldGFEYXRhS2V5OjplbmNvZGUobWV0YWRhdGEtPmlkLCBEYXRhYmFzZU1ldGFEYXRhS2V5
OjpVc2VyVmVyc2lvbiksIG1ldGFkYXRhLT52ZXJzaW9uKTsKLSAgICBpZiAoIW9rKSB7Ci0gICAg
ICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVJlYWRFcnJvcik7Ci0gICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBvayA9IGdldFZhckludChtX2RiLmdldCgp
LCBEYXRhYmFzZU1ldGFEYXRhS2V5OjplbmNvZGUobWV0YWRhdGEtPmlkLCBEYXRhYmFzZU1ldGFE
YXRhS2V5OjpVc2VySW50VmVyc2lvbiksIG1ldGFkYXRhLT5pbnRWZXJzaW9uKTsKLSAgICBpZiAo
IW9rKSB7Ci0gICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVJlYWRF
cnJvcik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKG1ldGFkYXRhLT5p
bnRWZXJzaW9uID09IElEQkRhdGFiYXNlTWV0YWRhdGE6OkRlZmF1bHRJbnRWZXJzaW9uKQotICAg
ICAgICBtZXRhZGF0YS0+aW50VmVyc2lvbiA9IElEQkRhdGFiYXNlTWV0YWRhdGE6Ok5vSW50VmVy
c2lvbjsKLQotICAgIG1ldGFkYXRhLT5tYXhPYmplY3RTdG9yZUlkID0gZ2V0TWF4T2JqZWN0U3Rv
cmVJZChtX2RiLmdldCgpLCBtZXRhZGF0YS0+aWQpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0K
LXN0YXRpYyBpbnQ2NF90IGdldE5ld0RhdGFiYXNlSWQoTGV2ZWxEQkRhdGFiYXNlKiBkYikKLXsK
LSAgICBpbnQ2NF90IG1heERhdGFiYXNlSWQgPSAtMTsKLSAgICBpZiAoIWdldEludChkYiwgTWF4
RGF0YWJhc2VJZEtleTo6ZW5jb2RlKCksIG1heERhdGFiYXNlSWQpKQotICAgICAgICBtYXhEYXRh
YmFzZUlkID0gMDsKLQotICAgIEFTU0VSVChtYXhEYXRhYmFzZUlkID49IDApOwotCi0gICAgaW50
NjRfdCBkYXRhYmFzZUlkID0gbWF4RGF0YWJhc2VJZCArIDE7Ci0gICAgaWYgKCFwdXRJbnQoZGIs
IE1heERhdGFiYXNlSWRLZXk6OmVuY29kZSgpLCBkYXRhYmFzZUlkKSkKLSAgICAgICAgcmV0dXJu
IC0xOwotCi0gICAgcmV0dXJuIGRhdGFiYXNlSWQ7Ci19Ci0KLWJvb2wgSURCTGV2ZWxEQkJhY2tp
bmdTdG9yZTo6Y3JlYXRlSURCRGF0YWJhc2VNZXRhRGF0YShjb25zdCBTdHJpbmcmIG5hbWUsIGNv
bnN0IFN0cmluZyYgdmVyc2lvbiwgaW50NjRfdCBpbnRWZXJzaW9uLCBpbnQ2NF90JiByb3dJZCkK
LXsKLSAgICByb3dJZCA9IGdldE5ld0RhdGFiYXNlSWQobV9kYi5nZXQoKSk7Ci0gICAgaWYgKHJv
d0lkIDwgMCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgY29uc3QgVmVjdG9yPGNoYXI+
IGtleSA9IERhdGFiYXNlTmFtZUtleTo6ZW5jb2RlKG1faWRlbnRpZmllciwgbmFtZSk7Ci0gICAg
aWYgKCFwdXRJbnQobV9kYi5nZXQoKSwga2V5LCByb3dJZCkpIHsKLSAgICAgICAgSW50ZXJuYWxF
cnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlV3JpdGVFcnJvcik7Ci0gICAgICAgIHJldHVybiBm
YWxzZTsKLSAgICB9Ci0gICAgaWYgKCFwdXRTdHJpbmcobV9kYi5nZXQoKSwgRGF0YWJhc2VNZXRh
RGF0YUtleTo6ZW5jb2RlKHJvd0lkLCBEYXRhYmFzZU1ldGFEYXRhS2V5OjpVc2VyVmVyc2lvbiks
IHZlcnNpb24pKSB7Ci0gICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9y
ZVdyaXRlRXJyb3IpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChpbnRW
ZXJzaW9uID09IElEQkRhdGFiYXNlTWV0YWRhdGE6Ok5vSW50VmVyc2lvbikKLSAgICAgICAgaW50
VmVyc2lvbiA9IElEQkRhdGFiYXNlTWV0YWRhdGE6OkRlZmF1bHRJbnRWZXJzaW9uOwotICAgIGlm
ICghcHV0VmFySW50KG1fZGIuZ2V0KCksIERhdGFiYXNlTWV0YURhdGFLZXk6OmVuY29kZShyb3dJ
ZCwgRGF0YWJhc2VNZXRhRGF0YUtleTo6VXNlckludFZlcnNpb24pLCBpbnRWZXJzaW9uKSkgewot
ICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVXcml0ZUVycm9yKTsK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9v
bCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjp1cGRhdGVJREJEYXRhYmFzZUludFZlcnNpb24oSURC
QmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGludDY0X3Qgcm93SWQsIGlu
dDY0X3QgaW50VmVyc2lvbikKLXsKLSAgICBpZiAoaW50VmVyc2lvbiA9PSBJREJEYXRhYmFzZU1l
dGFkYXRhOjpOb0ludFZlcnNpb24pCi0gICAgICAgIGludFZlcnNpb24gPSBJREJEYXRhYmFzZU1l
dGFkYXRhOjpEZWZhdWx0SW50VmVyc2lvbjsKLSAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKGludFZl
cnNpb24gPj0gMCwgImludFZlcnNpb24gd2FzICVsbGQiLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+
KGludFZlcnNpb24pKTsKLSAgICBpZiAoIXB1dFZhckludChUcmFuc2FjdGlvbjo6bGV2ZWxEQlRy
YW5zYWN0aW9uRnJvbSh0cmFuc2FjdGlvbiksIERhdGFiYXNlTWV0YURhdGFLZXk6OmVuY29kZShy
b3dJZCwgRGF0YWJhc2VNZXRhRGF0YUtleTo6VXNlckludFZlcnNpb24pLCBpbnRWZXJzaW9uKSkg
ewotICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVXcml0ZUVycm9y
KTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQot
Ym9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjp1cGRhdGVJREJEYXRhYmFzZU1ldGFEYXRhKElE
QkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IHJvd0lkLCBj
b25zdCBTdHJpbmcmIHZlcnNpb24pCi17Ci0gICAgaWYgKCFwdXRTdHJpbmcoVHJhbnNhY3Rpb246
OmxldmVsREJUcmFuc2FjdGlvbkZyb20odHJhbnNhY3Rpb24pLCBEYXRhYmFzZU1ldGFEYXRhS2V5
OjplbmNvZGUocm93SWQsIERhdGFiYXNlTWV0YURhdGFLZXk6OlVzZXJWZXJzaW9uKSwgdmVyc2lv
bikpIHsKLSAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlV3JpdGVF
cnJvcik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsK
LX0KLQotc3RhdGljIGJvb2wgZGVsZXRlUmFuZ2UoTGV2ZWxEQlRyYW5zYWN0aW9uKiB0cmFuc2Fj
dGlvbiwgY29uc3QgVmVjdG9yPGNoYXI+JiBiZWdpbiwgY29uc3QgVmVjdG9yPGNoYXI+JiBlbmQp
Ci17Ci0gICAgT3duUHRyPExldmVsREJJdGVyYXRvcj4gaXQgPSB0cmFuc2FjdGlvbi0+Y3JlYXRl
SXRlcmF0b3IoKTsKLSAgICBmb3IgKGl0LT5zZWVrKGJlZ2luKTsgaXQtPmlzVmFsaWQoKSAmJiBj
b21wYXJlS2V5cyhpdC0+a2V5KCksIGVuZCkgPCAwOyBpdC0+bmV4dCgpKSB7Ci0gICAgICAgIGlm
ICghdHJhbnNhY3Rpb24tPnJlbW92ZShpdC0+a2V5KCkpKSB7Ci0gICAgICAgICAgICBJbnRlcm5h
bEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVXcml0ZUVycm9yKTsKLSAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi0K
LWJvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlRGF0YWJhc2UoY29uc3QgU3RyaW5n
JiBuYW1lKQotewotICAgIElEQl9UUkFDRSgiSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZGVsZXRl
RGF0YWJhc2UiKTsKLSAgICBPd25QdHI8TGV2ZWxEQldyaXRlT25seVRyYW5zYWN0aW9uPiB0cmFu
c2FjdGlvbiA9IExldmVsREJXcml0ZU9ubHlUcmFuc2FjdGlvbjo6Y3JlYXRlKG1fZGIuZ2V0KCkp
OwotCi0gICAgSURCRGF0YWJhc2VNZXRhZGF0YSBtZXRhZGF0YTsKLSAgICBpZiAoIWdldElEQkRh
dGFiYXNlTWV0YURhdGEobmFtZSwgJm1ldGFkYXRhKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0K
LSAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3RhcnRLZXkgPSBEYXRhYmFzZU1ldGFEYXRhS2V5Ojpl
bmNvZGUobWV0YWRhdGEuaWQsIERhdGFiYXNlTWV0YURhdGFLZXk6Ok9yaWdpbk5hbWUpOwotICAg
IGNvbnN0IFZlY3RvcjxjaGFyPiBzdG9wS2V5ID0gRGF0YWJhc2VNZXRhRGF0YUtleTo6ZW5jb2Rl
KG1ldGFkYXRhLmlkICsgMSwgRGF0YWJhc2VNZXRhRGF0YUtleTo6T3JpZ2luTmFtZSk7Ci0gICAg
T3duUHRyPExldmVsREJJdGVyYXRvcj4gaXQgPSBtX2RiLT5jcmVhdGVJdGVyYXRvcigpOwotICAg
IGZvciAoaXQtPnNlZWsoc3RhcnRLZXkpOyBpdC0+aXNWYWxpZCgpICYmIGNvbXBhcmVLZXlzKGl0
LT5rZXkoKSwgc3RvcEtleSkgPCAwOyBpdC0+bmV4dCgpKQotICAgICAgICB0cmFuc2FjdGlvbi0+
cmVtb3ZlKGl0LT5rZXkoKSk7Ci0KLSAgICBjb25zdCBWZWN0b3I8Y2hhcj4ga2V5ID0gRGF0YWJh
c2VOYW1lS2V5OjplbmNvZGUobV9pZGVudGlmaWVyLCBuYW1lKTsKLSAgICB0cmFuc2FjdGlvbi0+
cmVtb3ZlKGtleSk7Ci0KLSAgICByZXR1cm4gdHJhbnNhY3Rpb24tPmNvbW1pdCgpOwotfQotCi1z
dGF0aWMgYm9vbCBjaGVja09iamVjdFN0b3JlQW5kTWV0YURhdGFUeXBlKGNvbnN0IExldmVsREJJ
dGVyYXRvciogaXQsIGNvbnN0IFZlY3RvcjxjaGFyPiYgc3RvcEtleSwgaW50NjRfdCBvYmplY3RT
dG9yZUlkLCBpbnQ2NF90IG1ldGFEYXRhVHlwZSkKLXsKLSAgICBpZiAoIWl0LT5pc1ZhbGlkKCkg
fHwgY29tcGFyZUtleXMoaXQtPmtleSgpLCBzdG9wS2V5KSA+PSAwKQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0KLSAgICBPYmplY3RTdG9yZU1ldGFEYXRhS2V5IG1ldGFEYXRhS2V5OwotICAgIGNv
bnN0IGNoYXIqIHAgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpkZWNvZGUoaXQtPmtleSgpLmJl
Z2luKCksIGl0LT5rZXkoKS5lbmQoKSwgJm1ldGFEYXRhS2V5KTsKLSAgICBBU1NFUlRfVU5VU0VE
KHAsIHApOwotICAgIGlmIChtZXRhRGF0YUtleS5vYmplY3RTdG9yZUlkKCkgIT0gb2JqZWN0U3Rv
cmVJZCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChtZXRhRGF0YUtleS5tZXRhRGF0
YVR5cGUoKSAhPSBtZXRhRGF0YVR5cGUpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1
cm4gdHJ1ZTsKLX0KLQotVmVjdG9yPElEQk9iamVjdFN0b3JlTWV0YWRhdGE+IElEQkxldmVsREJC
YWNraW5nU3RvcmU6OmdldE9iamVjdFN0b3JlcyhpbnQ2NF90IGRhdGFiYXNlSWQpCi17Ci0gICAg
SURCX1RSQUNFKCJJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRPYmplY3RTdG9yZXMiKTsKLSAg
ICBWZWN0b3I8SURCT2JqZWN0U3RvcmVNZXRhZGF0YT4gb2JqZWN0U3RvcmVzOwotICAgIGNvbnN0
IFZlY3RvcjxjaGFyPiBzdGFydEtleSA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShk
YXRhYmFzZUlkLCAxLCAwKTsKLSAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3RvcEtleSA9IE9iamVj
dFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZU1heEtleShkYXRhYmFzZUlkKTsKLQotICAgIE93blB0
cjxMZXZlbERCSXRlcmF0b3I+IGl0ID0gbV9kYi0+Y3JlYXRlSXRlcmF0b3IoKTsKLSAgICBpdC0+
c2VlayhzdGFydEtleSk7Ci0gICAgd2hpbGUgKGl0LT5pc1ZhbGlkKCkgJiYgY29tcGFyZUtleXMo
aXQtPmtleSgpLCBzdG9wS2V5KSA8IDApIHsKLSAgICAgICAgY29uc3QgY2hhciogcCA9IGl0LT5r
ZXkoKS5iZWdpbigpOwotICAgICAgICBjb25zdCBjaGFyKiBsaW1pdCA9IGl0LT5rZXkoKS5lbmQo
KTsKLQotICAgICAgICBPYmplY3RTdG9yZU1ldGFEYXRhS2V5IG1ldGFEYXRhS2V5OwotICAgICAg
ICBwID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZGVjb2RlKHAsIGxpbWl0LCAmbWV0YURhdGFL
ZXkpOwotICAgICAgICBBU1NFUlQocCk7Ci0gICAgICAgIGlmIChtZXRhRGF0YUtleS5tZXRhRGF0
YVR5cGUoKSAhPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpOYW1lKSB7Ci0gICAgICAgICAgICBJ
bnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVSZWFkRXJyb3IpOwotICAgICAgICAg
ICAgLy8gUG9zc2libGUgc3RhbGUgbWV0YWRhdGEsIGJ1dCBkb24ndCBmYWlsIHRoZSBsb2FkLgot
ICAgICAgICAgICAgaXQtPm5leHQoKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9
Ci0KLSAgICAgICAgaW50NjRfdCBvYmplY3RTdG9yZUlkID0gbWV0YURhdGFLZXkub2JqZWN0U3Rv
cmVJZCgpOwotCi0gICAgICAgIC8vIEZJWE1FOiBEbyB0aGlzIGJ5IGRpcmVjdCBrZXkgbG9va3Vw
IHJhdGhlciB0aGFuIGl0ZXJhdGlvbiwgdG8gc2ltcGxpZnkuCi0gICAgICAgIFN0cmluZyBvYmpl
Y3RTdG9yZU5hbWUgPSBkZWNvZGVTdHJpbmcoaXQtPnZhbHVlKCkuYmVnaW4oKSwgaXQtPnZhbHVl
KCkuZW5kKCkpOwotCi0gICAgICAgIGl0LT5uZXh0KCk7Ci0gICAgICAgIGlmICghY2hlY2tPYmpl
Y3RTdG9yZUFuZE1ldGFEYXRhVHlwZShpdC5nZXQoKSwgc3RvcEtleSwgb2JqZWN0U3RvcmVJZCwg
T2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6S2V5UGF0aCkpIHsKLSAgICAgICAgICAgIEludGVybmFs
RXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVJlYWRFcnJvcik7Ci0gICAgICAgICAgICBicmVh
azsKLSAgICAgICAgfQotICAgICAgICBJREJLZXlQYXRoIGtleVBhdGggPSBkZWNvZGVJREJLZXlQ
YXRoKGl0LT52YWx1ZSgpLmJlZ2luKCksIGl0LT52YWx1ZSgpLmVuZCgpKTsKLQotICAgICAgICBp
dC0+bmV4dCgpOwotICAgICAgICBpZiAoIWNoZWNrT2JqZWN0U3RvcmVBbmRNZXRhRGF0YVR5cGUo
aXQuZ2V0KCksIHN0b3BLZXksIG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6
OkF1dG9JbmNyZW1lbnQpKSB7Ci0gICAgICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJC
YWNraW5nU3RvcmVSZWFkRXJyb3IpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAg
ICAgICAgYm9vbCBhdXRvSW5jcmVtZW50ID0gZGVjb2RlQm9vbChpdC0+dmFsdWUoKS5iZWdpbigp
LCBpdC0+dmFsdWUoKS5lbmQoKSk7Ci0KLSAgICAgICAgaXQtPm5leHQoKTsgLy8gSXMgZXZpY2F0
YmxlLgotICAgICAgICBpZiAoIWNoZWNrT2JqZWN0U3RvcmVBbmRNZXRhRGF0YVR5cGUoaXQuZ2V0
KCksIHN0b3BLZXksIG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OkV2aWN0
YWJsZSkpIHsKLSAgICAgICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9y
ZVJlYWRFcnJvcik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGl0
LT5uZXh0KCk7IC8vIExhc3QgdmVyc2lvbi4KLSAgICAgICAgaWYgKCFjaGVja09iamVjdFN0b3Jl
QW5kTWV0YURhdGFUeXBlKGl0LmdldCgpLCBzdG9wS2V5LCBvYmplY3RTdG9yZUlkLCBPYmplY3RT
dG9yZU1ldGFEYXRhS2V5OjpMYXN0VmVyc2lvbikpIHsKLSAgICAgICAgICAgIEludGVybmFsRXJy
b3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVJlYWRFcnJvcik7Ci0gICAgICAgICAgICBicmVhazsK
LSAgICAgICAgfQotCi0gICAgICAgIGl0LT5uZXh0KCk7IC8vIE1heGltdW0gaW5kZXggaWQgYWxs
b2NhdGVkLgotICAgICAgICBpZiAoIWNoZWNrT2JqZWN0U3RvcmVBbmRNZXRhRGF0YVR5cGUoaXQu
Z2V0KCksIHN0b3BLZXksIG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6Ok1h
eEluZGV4SWQpKSB7Ci0gICAgICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5n
U3RvcmVSZWFkRXJyb3IpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAg
aW50NjRfdCBtYXhJbmRleElkID0gZGVjb2RlSW50KGl0LT52YWx1ZSgpLmJlZ2luKCksIGl0LT52
YWx1ZSgpLmVuZCgpKTsKLQotICAgICAgICBpdC0+bmV4dCgpOyAvLyBbb3B0aW9uYWxdIGhhcyBr
ZXkgcGF0aCAoaXMgbm90IG51bGwpCi0gICAgICAgIGlmIChjaGVja09iamVjdFN0b3JlQW5kTWV0
YURhdGFUeXBlKGl0LmdldCgpLCBzdG9wS2V5LCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZU1l
dGFEYXRhS2V5OjpIYXNLZXlQYXRoKSkgewotICAgICAgICAgICAgYm9vbCBoYXNLZXlQYXRoID0g
ZGVjb2RlQm9vbChpdC0+dmFsdWUoKS5iZWdpbigpLCBpdC0+dmFsdWUoKS5lbmQoKSk7Ci0gICAg
ICAgICAgICAvLyBUaGlzIGNoZWNrIGFjY291bnRzIGZvciB0d28gbGF5ZXJzIG9mIGxlZ2FjeSBj
b2Rpbmc6Ci0gICAgICAgICAgICAvLyAoMSkgSW5pdGlhbGx5LCBoYXNLZXlQYXRoIHdhcyBhZGRl
ZCB0byBkaXN0aW5ndWlzaCBudWxsIHZzLiBzdHJpbmcuCi0gICAgICAgICAgICAvLyAoMikgTGF0
ZXIsIG51bGwgdnMuIHN0cmluZyB2cy4gYXJyYXkgd2FzIHN0b3JlZCBpbiB0aGUga2V5UGF0aCBp
dHNlbGYuCi0gICAgICAgICAgICAvLyBTbyB0aGlzIGNoZWNrIGlzIG9ubHkgcmVsZXZhbnQgZm9y
IHN0cmluZy10eXBlIGtleVBhdGhzLgotICAgICAgICAgICAgaWYgKCFoYXNLZXlQYXRoICYmIChr
ZXlQYXRoLnR5cGUoKSA9PSBJREJLZXlQYXRoOjpTdHJpbmdUeXBlICYmICFrZXlQYXRoLnN0cmlu
ZygpLmlzRW1wdHkoKSkpIHsKLSAgICAgICAgICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVs
REJCYWNraW5nU3RvcmVSZWFkRXJyb3IpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgfQotICAgICAgICAgICAgaWYgKCFoYXNLZXlQYXRoKQotICAgICAgICAgICAgICAgIGtl
eVBhdGggPSBJREJLZXlQYXRoKCk7Ci0gICAgICAgICAgICBpdC0+bmV4dCgpOwotICAgICAgICB9
Ci0KLSAgICAgICAgaW50NjRfdCBrZXlHZW5lcmF0b3JDdXJyZW50TnVtYmVyID0gLTE7Ci0gICAg
ICAgIGlmIChjaGVja09iamVjdFN0b3JlQW5kTWV0YURhdGFUeXBlKGl0LmdldCgpLCBzdG9wS2V5
LCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpLZXlHZW5lcmF0b3JDdXJy
ZW50TnVtYmVyKSkgewotICAgICAgICAgICAga2V5R2VuZXJhdG9yQ3VycmVudE51bWJlciA9IGRl
Y29kZUludChpdC0+dmFsdWUoKS5iZWdpbigpLCBpdC0+dmFsdWUoKS5lbmQoKSk7Ci0gICAgICAg
ICAgICAvLyBGSVhNRTogUmV0dXJuIGtleUdlbmVyYXRvckN1cnJlbnROdW1iZXIsIGNhY2hlIGlu
IG9iamVjdCBzdG9yZSwgYW5kIHdyaXRlIGxhemlseSB0byBiYWNraW5nIHN0b3JlLgotICAgICAg
ICAgICAgLy8gRm9yIG5vdywganVzdCBhc3NlcnQgdGhhdCBpZiBpdCB3YXMgd3JpdHRlbiBpdCB3
YXMgdmFsaWQuCi0gICAgICAgICAgICBBU1NFUlRfVU5VU0VEKGtleUdlbmVyYXRvckN1cnJlbnRO
dW1iZXIsIGtleUdlbmVyYXRvckN1cnJlbnROdW1iZXIgPj0gS2V5R2VuZXJhdG9ySW5pdGlhbE51
bWJlcik7Ci0gICAgICAgICAgICBpdC0+bmV4dCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgb2Jq
ZWN0U3RvcmVzLmFwcGVuZChJREJPYmplY3RTdG9yZU1ldGFkYXRhKG9iamVjdFN0b3JlTmFtZSwg
b2JqZWN0U3RvcmVJZCwga2V5UGF0aCwgYXV0b0luY3JlbWVudCwgbWF4SW5kZXhJZCkpOwotICAg
IH0KLSAgICByZXR1cm4gb2JqZWN0U3RvcmVzOwotfQotCi1zdGF0aWMgYm9vbCBzZXRNYXhPYmpl
Y3RTdG9yZUlkKExldmVsREJUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGludDY0X3QgZGF0YWJh
c2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKQotewotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBt
YXhPYmplY3RTdG9yZUlkS2V5ID0gRGF0YWJhc2VNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNl
SWQsIERhdGFiYXNlTWV0YURhdGFLZXk6Ok1heE9iamVjdFN0b3JlSWQpOwotICAgIGludDY0X3Qg
bWF4T2JqZWN0U3RvcmVJZCA9IGdldE1heE9iamVjdFN0b3JlSWQodHJhbnNhY3Rpb24sIG1heE9i
amVjdFN0b3JlSWRLZXkpOwotCi0gICAgaWYgKG9iamVjdFN0b3JlSWQgPD0gbWF4T2JqZWN0U3Rv
cmVJZCkgewotICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVDb25z
aXN0ZW5jeUVycm9yKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoIXB1
dEludCh0cmFuc2FjdGlvbiwgbWF4T2JqZWN0U3RvcmVJZEtleSwgb2JqZWN0U3RvcmVJZCkpIHsK
LSAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlV3JpdGVFcnJvcik7
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJv
b2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Y3JlYXRlT2JqZWN0U3RvcmUoSURCQmFja2luZ1N0
b3JlOjpUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRf
dCBvYmplY3RTdG9yZUlkLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IElEQktleVBhdGgmIGtl
eVBhdGgsIGJvb2wgYXV0b0luY3JlbWVudCkKLXsKLSAgICBJREJfVFJBQ0UoIklEQkxldmVsREJC
YWNraW5nU3RvcmU6OmNyZWF0ZU9iamVjdFN0b3JlIik7Ci0gICAgTGV2ZWxEQlRyYW5zYWN0aW9u
KiBsZXZlbERCVHJhbnNhY3Rpb24gPSBUcmFuc2FjdGlvbjo6bGV2ZWxEQlRyYW5zYWN0aW9uRnJv
bSh0cmFuc2FjdGlvbik7Ci0gICAgaWYgKCFzZXRNYXhPYmplY3RTdG9yZUlkKGxldmVsREJUcmFu
c2FjdGlvbiwgZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCkpCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLQotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBuYW1lS2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0
YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlTWV0YURh
dGFLZXk6Ok5hbWUpOwotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBrZXlQYXRoS2V5ID0gT2JqZWN0
U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIE9iamVj
dFN0b3JlTWV0YURhdGFLZXk6OktleVBhdGgpOwotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBhdXRv
SW5jcmVtZW50S2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQs
IG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OkF1dG9JbmNyZW1lbnQpOwot
ICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBldmljdGFibGVLZXkgPSBPYmplY3RTdG9yZU1ldGFEYXRh
S2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgT2JqZWN0U3RvcmVNZXRhRGF0
YUtleTo6RXZpY3RhYmxlKTsKLSAgICBjb25zdCBWZWN0b3I8Y2hhcj4gbGFzdFZlcnNpb25LZXkg
PSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJ
ZCwgT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6TGFzdFZlcnNpb24pOwotICAgIGNvbnN0IFZlY3Rv
cjxjaGFyPiBtYXhJbmRleElkS2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRh
dGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6Ok1heEluZGV4
SWQpOwotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBoYXNLZXlQYXRoS2V5ICA9IE9iamVjdFN0b3Jl
TWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9y
ZU1ldGFEYXRhS2V5OjpIYXNLZXlQYXRoKTsKLSAgICBjb25zdCBWZWN0b3I8Y2hhcj4ga2V5R2Vu
ZXJhdG9yQ3VycmVudE51bWJlcktleSA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShk
YXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpLZXlHZW5l
cmF0b3JDdXJyZW50TnVtYmVyKTsKLSAgICBjb25zdCBWZWN0b3I8Y2hhcj4gbmFtZXNLZXkgPSBP
YmplY3RTdG9yZU5hbWVzS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgbmFtZSk7Ci0KLSAgICBib29s
IG9rID0gcHV0U3RyaW5nKGxldmVsREJUcmFuc2FjdGlvbiwgbmFtZUtleSwgbmFtZSk7Ci0gICAg
aWYgKCFvaykgewotICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVX
cml0ZUVycm9yKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIG9rID0gcHV0
SURCS2V5UGF0aChsZXZlbERCVHJhbnNhY3Rpb24sIGtleVBhdGhLZXksIGtleVBhdGgpOwotICAg
IGlmICghb2spIHsKLSAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3Jl
V3JpdGVFcnJvcik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBvayA9IHB1
dEludChsZXZlbERCVHJhbnNhY3Rpb24sIGF1dG9JbmNyZW1lbnRLZXksIGF1dG9JbmNyZW1lbnQp
OwotICAgIGlmICghb2spIHsKLSAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2lu
Z1N0b3JlV3JpdGVFcnJvcik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBv
ayA9IHB1dEludChsZXZlbERCVHJhbnNhY3Rpb24sIGV2aWN0YWJsZUtleSwgZmFsc2UpOwotICAg
IGlmICghb2spIHsKLSAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3Jl
V3JpdGVFcnJvcik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBvayA9IHB1
dEludChsZXZlbERCVHJhbnNhY3Rpb24sIGxhc3RWZXJzaW9uS2V5LCAxKTsKLSAgICBpZiAoIW9r
KSB7Ci0gICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVdyaXRlRXJy
b3IpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgb2sgPSBwdXRJbnQobGV2
ZWxEQlRyYW5zYWN0aW9uLCBtYXhJbmRleElkS2V5LCBNaW5pbXVtSW5kZXhJZCk7Ci0gICAgaWYg
KCFvaykgewotICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVXcml0
ZUVycm9yKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIG9rID0gcHV0Qm9v
bChsZXZlbERCVHJhbnNhY3Rpb24sIGhhc0tleVBhdGhLZXksICFrZXlQYXRoLmlzTnVsbCgpKTsK
LSAgICBpZiAoIW9rKSB7Ci0gICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdT
dG9yZVdyaXRlRXJyb3IpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgb2sg
PSBwdXRJbnQobGV2ZWxEQlRyYW5zYWN0aW9uLCBrZXlHZW5lcmF0b3JDdXJyZW50TnVtYmVyS2V5
LCBLZXlHZW5lcmF0b3JJbml0aWFsTnVtYmVyKTsKLSAgICBpZiAoIW9rKSB7Ci0gICAgICAgIElu
dGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVdyaXRlRXJyb3IpOwotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgb2sgPSBwdXRJbnQobGV2ZWxEQlRyYW5zYWN0aW9u
LCBuYW1lc0tleSwgb2JqZWN0U3RvcmVJZCk7Ci0gICAgaWYgKCFvaykgewotICAgICAgICBJbnRl
cm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVXcml0ZUVycm9yKTsKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIElEQkxldmVs
REJCYWNraW5nU3RvcmU6OmRlbGV0ZU9iamVjdFN0b3JlKElEQkJhY2tpbmdTdG9yZTo6VHJhbnNh
Y3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3Rv
cmVJZCkKLXsKLSAgICBJREJfVFJBQ0UoIklEQkxldmVsREJCYWNraW5nU3RvcmU6OmRlbGV0ZU9i
amVjdFN0b3JlIik7Ci0gICAgTGV2ZWxEQlRyYW5zYWN0aW9uKiBsZXZlbERCVHJhbnNhY3Rpb24g
PSBUcmFuc2FjdGlvbjo6bGV2ZWxEQlRyYW5zYWN0aW9uRnJvbSh0cmFuc2FjdGlvbik7Ci0KLSAg
ICBTdHJpbmcgb2JqZWN0U3RvcmVOYW1lOwotICAgIGdldFN0cmluZyhsZXZlbERCVHJhbnNhY3Rp
b24sIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9y
ZUlkLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpOYW1lKSwgb2JqZWN0U3RvcmVOYW1lKTsKLQot
ICAgIGlmICghZGVsZXRlUmFuZ2UobGV2ZWxEQlRyYW5zYWN0aW9uLCBPYmplY3RTdG9yZU1ldGFE
YXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMCksIE9iamVjdFN0b3Jl
TWV0YURhdGFLZXk6OmVuY29kZU1heEtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkKSkpIHsK
LSAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlV3JpdGVFcnJvcik7
Ci0gICAgICAgIHJldHVybjsgLy8gRklYTUU6IFJlcG9ydCBlcnJvci4KLSAgICB9Ci0KLSAgICBs
ZXZlbERCVHJhbnNhY3Rpb24tPnJlbW92ZShPYmplY3RTdG9yZU5hbWVzS2V5OjplbmNvZGUoZGF0
YWJhc2VJZCwgb2JqZWN0U3RvcmVOYW1lKSk7Ci0KLSAgICBpZiAoIWRlbGV0ZVJhbmdlKGxldmVs
REJUcmFuc2FjdGlvbiwgSW5kZXhGcmVlTGlzdEtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVj
dFN0b3JlSWQsIDApLCBJbmRleEZyZWVMaXN0S2V5OjplbmNvZGVNYXhLZXkoZGF0YWJhc2VJZCwg
b2JqZWN0U3RvcmVJZCkpKSB7Ci0gICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tp
bmdTdG9yZVdyaXRlRXJyb3IpOwotICAgICAgICByZXR1cm47IC8vIEZJWE1FOiBSZXBvcnQgZXJy
b3IuCi0gICAgfQotICAgIGlmICghZGVsZXRlUmFuZ2UobGV2ZWxEQlRyYW5zYWN0aW9uLCBJbmRl
eE1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMCwgMCksIElu
ZGV4TWV0YURhdGFLZXk6OmVuY29kZU1heEtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkKSkp
IHsKLSAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlV3JpdGVFcnJv
cik7Ci0gICAgICAgIHJldHVybjsgLy8gRklYTUU6IFJlcG9ydCBlcnJvci4KLSAgICB9Ci0KLSAg
ICBjbGVhck9iamVjdFN0b3JlKHRyYW5zYWN0aW9uLCBkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlk
KTsKLX0KLQotU3RyaW5nIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldE9iamVjdFN0b3JlUmVj
b3JkKElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRh
dGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5JiBrZXkpCi17Ci0g
ICAgSURCX1RSQUNFKCJJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRPYmplY3RTdG9yZVJlY29y
ZCIpOwotICAgIExldmVsREJUcmFuc2FjdGlvbiogbGV2ZWxEQlRyYW5zYWN0aW9uID0gVHJhbnNh
Y3Rpb246OmxldmVsREJUcmFuc2FjdGlvbkZyb20odHJhbnNhY3Rpb24pOwotCi0gICAgY29uc3Qg
VmVjdG9yPGNoYXI+IGxldmVsZGJLZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShkYXRh
YmFzZUlkLCBvYmplY3RTdG9yZUlkLCBrZXkpOwotICAgIFZlY3RvcjxjaGFyPiBkYXRhOwotCi0g
ICAgaWYgKCFsZXZlbERCVHJhbnNhY3Rpb24tPmdldChsZXZlbGRiS2V5LCBkYXRhKSkKLSAgICAg
ICAgcmV0dXJuIFN0cmluZygpOwotCi0gICAgaW50NjRfdCB2ZXJzaW9uOwotICAgIGNvbnN0IGNo
YXIqIHAgPSBkZWNvZGVWYXJJbnQoZGF0YS5iZWdpbigpLCBkYXRhLmVuZCgpLCB2ZXJzaW9uKTsK
LSAgICBpZiAoIXApIHsKLSAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0
b3JlUmVhZEVycm9yKTsKLSAgICAgICAgcmV0dXJuIFN0cmluZygpOwotICAgIH0KLSAgICAodm9p
ZCkgdmVyc2lvbjsKLQotICAgIHJldHVybiBkZWNvZGVTdHJpbmcocCwgZGF0YS5lbmQoKSk7Ci19
Ci0KLW5hbWVzcGFjZSB7Ci1jbGFzcyBMZXZlbERCUmVjb3JkSWRlbnRpZmllciA6IHB1YmxpYyBJ
REJCYWNraW5nU3RvcmU6Ok9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllciB7Ci1wdWJsaWM6Ci0g
ICAgc3RhdGljIFBhc3NSZWZQdHI8TGV2ZWxEQlJlY29yZElkZW50aWZpZXI+IGNyZWF0ZShjb25z
dCBWZWN0b3I8Y2hhcj4mIHByaW1hcnlLZXksIGludDY0X3QgdmVyc2lvbikgeyByZXR1cm4gYWRv
cHRSZWYobmV3IExldmVsREJSZWNvcmRJZGVudGlmaWVyKHByaW1hcnlLZXksIHZlcnNpb24pKTsg
fQotICAgIHN0YXRpYyBQYXNzUmVmUHRyPExldmVsREJSZWNvcmRJZGVudGlmaWVyPiBjcmVhdGUo
KSB7IHJldHVybiBhZG9wdFJlZihuZXcgTGV2ZWxEQlJlY29yZElkZW50aWZpZXIoKSk7IH0KLQot
ICAgIHZpcnR1YWwgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gbV9wcmltYXJ5S2V5Lmlz
RW1wdHkoKTsgfQotICAgIFZlY3RvcjxjaGFyPiBwcmltYXJ5S2V5KCkgY29uc3QgeyByZXR1cm4g
bV9wcmltYXJ5S2V5OyB9Ci0gICAgdm9pZCBzZXRQcmltYXJ5S2V5KGNvbnN0IFZlY3RvcjxjaGFy
PiYgcHJpbWFyeUtleSkgeyBtX3ByaW1hcnlLZXkgPSBwcmltYXJ5S2V5OyB9Ci0gICAgaW50NjRf
dCB2ZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gbV92ZXJzaW9uOyB9Ci0gICAgdm9pZCBzZXRWZXJz
aW9uKGludDY0X3QgdmVyc2lvbikgeyBtX3ZlcnNpb24gPSB2ZXJzaW9uOyB9Ci0KLXByaXZhdGU6
Ci0gICAgTGV2ZWxEQlJlY29yZElkZW50aWZpZXIoY29uc3QgVmVjdG9yPGNoYXI+JiBwcmltYXJ5
S2V5LCBpbnQ2NF90IHZlcnNpb24pIDogbV9wcmltYXJ5S2V5KHByaW1hcnlLZXkpLCBtX3ZlcnNp
b24odmVyc2lvbikgeyBBU1NFUlQoIXByaW1hcnlLZXkuaXNFbXB0eSgpKTsgfQotICAgIExldmVs
REJSZWNvcmRJZGVudGlmaWVyKCkgOiBtX3ByaW1hcnlLZXkoKSwgbV92ZXJzaW9uKC0xKSB7fQot
Ci0gICAgVmVjdG9yPGNoYXI+IG1fcHJpbWFyeUtleTsgLy8gRklYTUU6IE1ha2UgaXQgbW9yZSBj
bGVhciB0aGF0IHRoaXMgaXMgdGhlICplbmNvZGVkKiB2ZXJzaW9uIG9mIHRoZSBrZXkuCi0gICAg
aW50NjRfdCBtX3ZlcnNpb247Ci19OwotfQotCi1zdGF0aWMgaW50NjRfdCBnZXROZXdWZXJzaW9u
TnVtYmVyKExldmVsREJUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGludDY0X3QgZGF0YWJhc2VJ
ZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKQotewotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBsYXN0
VmVyc2lvbktleSA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBv
YmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpMYXN0VmVyc2lvbik7Ci0KLSAg
ICBpbnQ2NF90IGxhc3RWZXJzaW9uID0gLTE7Ci0gICAgaWYgKCFnZXRJbnQodHJhbnNhY3Rpb24s
IGxhc3RWZXJzaW9uS2V5LCBsYXN0VmVyc2lvbikpCi0gICAgICAgIGxhc3RWZXJzaW9uID0gMDsK
LQotICAgIEFTU0VSVChsYXN0VmVyc2lvbiA+PSAwKTsKLQotICAgIGludDY0X3QgdmVyc2lvbiA9
IGxhc3RWZXJzaW9uICsgMTsKLSAgICBib29sIG9rID0gcHV0SW50KHRyYW5zYWN0aW9uLCBsYXN0
VmVyc2lvbktleSwgdmVyc2lvbik7Ci0gICAgQVNTRVJUX1VOVVNFRChvaywgb2spOwotCi0gICAg
QVNTRVJUKHZlcnNpb24gPiBsYXN0VmVyc2lvbik7IC8vIEZJWE1FOiBUaGluayBhYm91dCBob3cg
d2Ugd2FudCB0byBoYW5kbGUgdGhlIG92ZXJmbG93IHNjZW5hcmlvLgotCi0gICAgcmV0dXJuIHZl
cnNpb247Ci19Ci0KLWJvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6cHV0T2JqZWN0U3RvcmVS
ZWNvcmQoSURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGludDY0X3Qg
ZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXkmIGtleSwgY29u
c3QgU3RyaW5nJiB2YWx1ZSwgT2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyKiByZWNvcmRJZGVu
dGlmaWVyKQotewotICAgIElEQl9UUkFDRSgiSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6cHV0T2Jq
ZWN0U3RvcmVSZWNvcmQiKTsKLSAgICBBU1NFUlQoa2V5LmlzVmFsaWQoKSk7Ci0gICAgTGV2ZWxE
QlRyYW5zYWN0aW9uKiBsZXZlbERCVHJhbnNhY3Rpb24gPSBUcmFuc2FjdGlvbjo6bGV2ZWxEQlRy
YW5zYWN0aW9uRnJvbSh0cmFuc2FjdGlvbik7Ci0gICAgaW50NjRfdCB2ZXJzaW9uID0gZ2V0TmV3
VmVyc2lvbk51bWJlcihsZXZlbERCVHJhbnNhY3Rpb24sIGRhdGFiYXNlSWQsIG9iamVjdFN0b3Jl
SWQpOwotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBvYmplY3RTdG9yZWRhdGFLZXkgPSBPYmplY3RT
dG9yZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBrZXkpOwotCi0g
ICAgVmVjdG9yPGNoYXI+IHY7Ci0gICAgdi5hcHBlbmQoZW5jb2RlVmFySW50KHZlcnNpb24pKTsK
LSAgICB2LmFwcGVuZChlbmNvZGVTdHJpbmcodmFsdWUpKTsKLQotICAgIGlmICghbGV2ZWxEQlRy
YW5zYWN0aW9uLT5wdXQob2JqZWN0U3RvcmVkYXRhS2V5LCB2KSkgewotICAgICAgICBJbnRlcm5h
bEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVXcml0ZUVycm9yKTsKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgIH0KLQotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBleGlzdHNFbnRyeUtleSA9
IEV4aXN0c0VudHJ5S2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwga2V5KTsK
LSAgICBpZiAoIWxldmVsREJUcmFuc2FjdGlvbi0+cHV0KGV4aXN0c0VudHJ5S2V5LCBlbmNvZGVJ
bnQodmVyc2lvbikpKSB7Ci0gICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdT
dG9yZVdyaXRlRXJyb3IpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgTGV2
ZWxEQlJlY29yZElkZW50aWZpZXIqIGxldmVsREJSZWNvcmRJZGVudGlmaWVyID0gc3RhdGljX2Nh
c3Q8TGV2ZWxEQlJlY29yZElkZW50aWZpZXIqPihyZWNvcmRJZGVudGlmaWVyKTsKLSAgICBsZXZl
bERCUmVjb3JkSWRlbnRpZmllci0+c2V0UHJpbWFyeUtleShlbmNvZGVJREJLZXkoa2V5KSk7Ci0g
ICAgbGV2ZWxEQlJlY29yZElkZW50aWZpZXItPnNldFZlcnNpb24odmVyc2lvbik7Ci0gICAgcmV0
dXJuIHRydWU7Ci19Ci0KLXZvaWQgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Y2xlYXJPYmplY3RT
dG9yZShJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgaW50NjRfdCBk
YXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpCi17Ci0gICAgSURCX1RSQUNFKCJJREJM
ZXZlbERCQmFja2luZ1N0b3JlOjpjbGVhck9iamVjdFN0b3JlIik7Ci0gICAgTGV2ZWxEQlRyYW5z
YWN0aW9uKiBsZXZlbERCVHJhbnNhY3Rpb24gPSBUcmFuc2FjdGlvbjo6bGV2ZWxEQlRyYW5zYWN0
aW9uRnJvbSh0cmFuc2FjdGlvbik7Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IHN0YXJ0S2V5ID0g
S2V5UHJlZml4KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDApLmVuY29kZSgpOwotICAgIGNv
bnN0IFZlY3RvcjxjaGFyPiBzdG9wS2V5ID0gS2V5UHJlZml4KGRhdGFiYXNlSWQsIG9iamVjdFN0
b3JlSWQgKyAxLCAwKS5lbmNvZGUoKTsKLQotICAgIGRlbGV0ZVJhbmdlKGxldmVsREJUcmFuc2Fj
dGlvbiwgc3RhcnRLZXksIHN0b3BLZXkpOwotfQotCi1QYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9y
ZTo6T2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyPiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpj
cmVhdGVJbnZhbGlkUmVjb3JkSWRlbnRpZmllcigpCi17Ci0gICAgcmV0dXJuIExldmVsREJSZWNv
cmRJZGVudGlmaWVyOjpjcmVhdGUoKTsKLX0KLQotdm9pZCBJREJMZXZlbERCQmFja2luZ1N0b3Jl
OjpkZWxldGVPYmplY3RTdG9yZVJlY29yZChJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uKiB0
cmFuc2FjdGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNv
bnN0IE9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllciogcmVjb3JkSWRlbnRpZmllcikKLXsKLSAg
ICBJREJfVFJBQ0UoIklEQkxldmVsREJCYWNraW5nU3RvcmU6OmRlbGV0ZU9iamVjdFN0b3JlUmVj
b3JkIik7Ci0gICAgTGV2ZWxEQlRyYW5zYWN0aW9uKiBsZXZlbERCVHJhbnNhY3Rpb24gPSBUcmFu
c2FjdGlvbjo6bGV2ZWxEQlRyYW5zYWN0aW9uRnJvbSh0cmFuc2FjdGlvbik7Ci0gICAgY29uc3Qg
TGV2ZWxEQlJlY29yZElkZW50aWZpZXIqIGxldmVsREJSZWNvcmRJZGVudGlmaWVyID0gc3RhdGlj
X2Nhc3Q8Y29uc3QgTGV2ZWxEQlJlY29yZElkZW50aWZpZXIqPihyZWNvcmRJZGVudGlmaWVyKTsK
LQotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBvYmplY3RTdG9yZURhdGFLZXkgPSBPYmplY3RTdG9y
ZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBsZXZlbERCUmVjb3Jk
SWRlbnRpZmllci0+cHJpbWFyeUtleSgpKTsKLSAgICBsZXZlbERCVHJhbnNhY3Rpb24tPnJlbW92
ZShvYmplY3RTdG9yZURhdGFLZXkpOwotCi0gICAgY29uc3QgVmVjdG9yPGNoYXI+IGV4aXN0c0Vu
dHJ5S2V5ID0gRXhpc3RzRW50cnlLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlk
LCBsZXZlbERCUmVjb3JkSWRlbnRpZmllci0+cHJpbWFyeUtleSgpKTsKLSAgICBsZXZlbERCVHJh
bnNhY3Rpb24tPnJlbW92ZShleGlzdHNFbnRyeUtleSk7Ci19Ci0KLQotaW50NjRfdCBJREJMZXZl
bERCQmFja2luZ1N0b3JlOjpnZXRLZXlHZW5lcmF0b3JDdXJyZW50TnVtYmVyKElEQkJhY2tpbmdT
dG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0
X3Qgb2JqZWN0U3RvcmVJZCkKLXsKLSAgICBMZXZlbERCVHJhbnNhY3Rpb24qIGxldmVsREJUcmFu
c2FjdGlvbiA9IFRyYW5zYWN0aW9uOjpsZXZlbERCVHJhbnNhY3Rpb25Gcm9tKHRyYW5zYWN0aW9u
KTsKLQotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBrZXlHZW5lcmF0b3JDdXJyZW50TnVtYmVyS2V5
ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3Jl
SWQsIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OktleUdlbmVyYXRvckN1cnJlbnROdW1iZXIpOwot
Ci0gICAgaW50NjRfdCBrZXlHZW5lcmF0b3JDdXJyZW50TnVtYmVyID0gLTE7Ci0gICAgVmVjdG9y
PGNoYXI+IGRhdGE7Ci0KLSAgICBpZiAobGV2ZWxEQlRyYW5zYWN0aW9uLT5nZXQoa2V5R2VuZXJh
dG9yQ3VycmVudE51bWJlcktleSwgZGF0YSkpCi0gICAgICAgIGtleUdlbmVyYXRvckN1cnJlbnRO
dW1iZXIgPSBkZWNvZGVJbnQoZGF0YS5iZWdpbigpLCBkYXRhLmVuZCgpKTsKLSAgICBlbHNlIHsK
LSAgICAgICAgLy8gUHJldmlvdXNseSwgdGhlIGtleSBnZW5lcmF0b3Igc3RhdGUgd2FzIG5vdCBz
dG9yZWQgZXhwbGljaXRseSBidXQgZGVyaXZlZCBmcm9tIHRoZQotICAgICAgICAvLyBtYXhpbXVt
IG51bWVyaWMga2V5IHByZXNlbnQgaW4gZXhpc3RpbmcgZGF0YS4gVGhpcyB2aW9sYXRlcyB0aGUg
c3BlYyBhcyB0aGUgZGF0YSBtYXkKLSAgICAgICAgLy8gYmUgY2xlYXJlZCBidXQgdGhlIGtleSBn
ZW5lcmF0b3Igc3RhdGUgbXVzdCBiZSBwcmVzZXJ2ZWQuCi0gICAgICAgIGNvbnN0IFZlY3Rvcjxj
aGFyPiBzdGFydEtleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9i
amVjdFN0b3JlSWQsIG1pbklEQktleSgpKTsKLSAgICAgICAgY29uc3QgVmVjdG9yPGNoYXI+IHN0
b3BLZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9y
ZUlkLCBtYXhJREJLZXkoKSk7Ci0KLSAgICAgICAgT3duUHRyPExldmVsREJJdGVyYXRvcj4gaXQg
PSBsZXZlbERCVHJhbnNhY3Rpb24tPmNyZWF0ZUl0ZXJhdG9yKCk7Ci0gICAgICAgIGludDY0X3Qg
bWF4TnVtZXJpY0tleSA9IDA7Ci0KLSAgICAgICAgZm9yIChpdC0+c2VlayhzdGFydEtleSk7IGl0
LT5pc1ZhbGlkKCkgJiYgY29tcGFyZUtleXMoaXQtPmtleSgpLCBzdG9wS2V5KSA8IDA7IGl0LT5u
ZXh0KCkpIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBpdC0+a2V5KCkuYmVnaW4oKTsK
LSAgICAgICAgICAgIGNvbnN0IGNoYXIqIGxpbWl0ID0gaXQtPmtleSgpLmVuZCgpOwotCi0gICAg
ICAgICAgICBPYmplY3RTdG9yZURhdGFLZXkgZGF0YUtleTsKLSAgICAgICAgICAgIHAgPSBPYmpl
Y3RTdG9yZURhdGFLZXk6OmRlY29kZShwLCBsaW1pdCwgJmRhdGFLZXkpOwotICAgICAgICAgICAg
QVNTRVJUKHApOwotCi0gICAgICAgICAgICBpZiAoZGF0YUtleS51c2VyS2V5KCktPnR5cGUoKSA9
PSBJREJLZXk6Ok51bWJlclR5cGUpIHsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IG4gPSBzdGF0
aWNfY2FzdDxpbnQ2NF90PihkYXRhS2V5LnVzZXJLZXkoKS0+bnVtYmVyKCkpOwotICAgICAgICAg
ICAgICAgIGlmIChuID4gbWF4TnVtZXJpY0tleSkKLSAgICAgICAgICAgICAgICAgICAgbWF4TnVt
ZXJpY0tleSA9IG47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBrZXlHZW5l
cmF0b3JDdXJyZW50TnVtYmVyID0gbWF4TnVtZXJpY0tleSArIDE7Ci0gICAgfQotCi0gICAgcmV0
dXJuIGtleUdlbmVyYXRvckN1cnJlbnROdW1iZXI7Ci19Ci0KLWJvb2wgSURCTGV2ZWxEQkJhY2tp
bmdTdG9yZTo6bWF5YmVVcGRhdGVLZXlHZW5lcmF0b3JDdXJyZW50TnVtYmVyKElEQkJhY2tpbmdT
dG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0
X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBuZXdOdW1iZXIsIGJvb2wgY2hlY2tDdXJyZW50KQot
ewotICAgIExldmVsREJUcmFuc2FjdGlvbiogbGV2ZWxEQlRyYW5zYWN0aW9uID0gVHJhbnNhY3Rp
b246OmxldmVsREJUcmFuc2FjdGlvbkZyb20odHJhbnNhY3Rpb24pOwotCi0gICAgaWYgKGNoZWNr
Q3VycmVudCkgewotICAgICAgICBpbnQ2NF90IGN1cnJlbnROdW1iZXIgPSBnZXRLZXlHZW5lcmF0
b3JDdXJyZW50TnVtYmVyKHRyYW5zYWN0aW9uLCBkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkKTsK
LSAgICAgICAgaWYgKG5ld051bWJlciA8PSBjdXJyZW50TnVtYmVyKQotICAgICAgICAgICAgcmV0
dXJuIHRydWU7Ci0gICAgfQotCi0gICAgY29uc3QgVmVjdG9yPGNoYXI+IGtleUdlbmVyYXRvckN1
cnJlbnROdW1iZXJLZXkgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCwgT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6S2V5R2VuZXJhdG9yQ3Vy
cmVudE51bWJlcik7Ci0gICAgYm9vbCBvayA9IHB1dEludChsZXZlbERCVHJhbnNhY3Rpb24sIGtl
eUdlbmVyYXRvckN1cnJlbnROdW1iZXJLZXksIG5ld051bWJlcik7Ci0gICAgaWYgKCFvaykgewot
ICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVXcml0ZUVycm9yKTsK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9v
bCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjprZXlFeGlzdHNJbk9iamVjdFN0b3JlKElEQkJhY2tp
bmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGlu
dDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5JiBrZXksIE9iamVjdFN0b3JlUmVjb3Jk
SWRlbnRpZmllciogZm91bmRSZWNvcmRJZGVudGlmaWVyKQotewotICAgIElEQl9UUkFDRSgiSURC
TGV2ZWxEQkJhY2tpbmdTdG9yZTo6a2V5RXhpc3RzSW5PYmplY3RTdG9yZSIpOwotICAgIExldmVs
REJUcmFuc2FjdGlvbiogbGV2ZWxEQlRyYW5zYWN0aW9uID0gVHJhbnNhY3Rpb246OmxldmVsREJU
cmFuc2FjdGlvbkZyb20odHJhbnNhY3Rpb24pOwotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBsZXZl
bGRiS2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3Rv
cmVJZCwga2V5KTsKLSAgICBWZWN0b3I8Y2hhcj4gZGF0YTsKLQotICAgIGlmICghbGV2ZWxEQlRy
YW5zYWN0aW9uLT5nZXQobGV2ZWxkYktleSwgZGF0YSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LQotICAgIGludDY0X3QgdmVyc2lvbjsKLSAgICBpZiAoIWRlY29kZVZhckludChkYXRhLmJlZ2lu
KCksIGRhdGEuZW5kKCksIHZlcnNpb24pKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBM
ZXZlbERCUmVjb3JkSWRlbnRpZmllciogbGV2ZWxEQlJlY29yZElkZW50aWZpZXIgPSBzdGF0aWNf
Y2FzdDxMZXZlbERCUmVjb3JkSWRlbnRpZmllcio+KGZvdW5kUmVjb3JkSWRlbnRpZmllcik7Ci0g
ICAgbGV2ZWxEQlJlY29yZElkZW50aWZpZXItPnNldFByaW1hcnlLZXkoZW5jb2RlSURCS2V5KGtl
eSkpOwotICAgIGxldmVsREJSZWNvcmRJZGVudGlmaWVyLT5zZXRWZXJzaW9uKHZlcnNpb24pOwot
ICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmZvckVh
Y2hPYmplY3RTdG9yZVJlY29yZChJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uKiB0cmFuc2Fj
dGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIE9iamVjdFN0
b3JlUmVjb3JkQ2FsbGJhY2smIGNhbGxiYWNrKQotewotICAgIExldmVsREJUcmFuc2FjdGlvbiog
bGV2ZWxEQlRyYW5zYWN0aW9uID0gVHJhbnNhY3Rpb246OmxldmVsREJUcmFuc2FjdGlvbkZyb20o
dHJhbnNhY3Rpb24pOwotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBzdGFydEtleSA9IE9iamVjdFN0
b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIG1pbklEQktleSgp
KTsKLSAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3RvcEtleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6
ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIG1heElEQktleSgpKTsKLQotICAgIE93
blB0cjxMZXZlbERCSXRlcmF0b3I+IGl0ID0gbGV2ZWxEQlRyYW5zYWN0aW9uLT5jcmVhdGVJdGVy
YXRvcigpOwotICAgIGZvciAoaXQtPnNlZWsoc3RhcnRLZXkpOyBpdC0+aXNWYWxpZCgpICYmIGNv
bXBhcmVLZXlzKGl0LT5rZXkoKSwgc3RvcEtleSkgPCAwOyBpdC0+bmV4dCgpKSB7Ci0gICAgICAg
IGNvbnN0IGNoYXIqIHAgPSBpdC0+a2V5KCkuYmVnaW4oKTsKLSAgICAgICAgY29uc3QgY2hhciog
bGltaXQgPSBpdC0+a2V5KCkuZW5kKCk7Ci0gICAgICAgIE9iamVjdFN0b3JlRGF0YUtleSBkYXRh
S2V5OwotICAgICAgICBwID0gT2JqZWN0U3RvcmVEYXRhS2V5OjpkZWNvZGUocCwgbGltaXQsICZk
YXRhS2V5KTsKLSAgICAgICAgQVNTRVJUKHApOwotCi0gICAgICAgIFJlZlB0cjxJREJLZXk+IHBy
aW1hcnlLZXkgPSBkYXRhS2V5LnVzZXJLZXkoKTsKLQotICAgICAgICBpbnQ2NF90IHZlcnNpb247
Ci0gICAgICAgIGNvbnN0IGNoYXIqIHEgPSBkZWNvZGVWYXJJbnQoaXQtPnZhbHVlKCkuYmVnaW4o
KSwgaXQtPnZhbHVlKCkuZW5kKCksIHZlcnNpb24pOwotICAgICAgICBpZiAoIXEpIHsKLSAgICAg
ICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVJlYWRFcnJvcik7Ci0g
ICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBSZWZQdHI8TGV2
ZWxEQlJlY29yZElkZW50aWZpZXI+IHJpID0gTGV2ZWxEQlJlY29yZElkZW50aWZpZXI6OmNyZWF0
ZShlbmNvZGVJREJLZXkoKnByaW1hcnlLZXkpLCB2ZXJzaW9uKTsKLSAgICAgICAgU3RyaW5nIGlk
YlZhbHVlID0gZGVjb2RlU3RyaW5nKHEsIGl0LT52YWx1ZSgpLmVuZCgpKTsKLQotICAgICAgICBp
ZiAoIWNhbGxiYWNrLmNhbGxiYWNrKHJpLmdldCgpLCBpZGJWYWx1ZSkpCi0gICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29s
IGNoZWNrSW5kZXhBbmRNZXRhRGF0YUtleShjb25zdCBMZXZlbERCSXRlcmF0b3IqIGl0LCBjb25z
dCBWZWN0b3I8Y2hhcj4mIHN0b3BLZXksIGludDY0X3QgaW5kZXhJZCwgdW5zaWduZWQgY2hhciBt
ZXRhRGF0YVR5cGUpCi17Ci0gICAgaWYgKCFpdC0+aXNWYWxpZCgpIHx8IGNvbXBhcmVLZXlzKGl0
LT5rZXkoKSwgc3RvcEtleSkgPj0gMCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgSW5k
ZXhNZXRhRGF0YUtleSBtZXRhRGF0YUtleTsKLSAgICBjb25zdCBjaGFyKiBwID0gSW5kZXhNZXRh
RGF0YUtleTo6ZGVjb2RlKGl0LT5rZXkoKS5iZWdpbigpLCBpdC0+a2V5KCkuZW5kKCksICZtZXRh
RGF0YUtleSk7Ci0gICAgQVNTRVJUX1VOVVNFRChwLCBwKTsKLSAgICBpZiAobWV0YURhdGFLZXku
aW5kZXhJZCgpICE9IGluZGV4SWQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAobWV0
YURhdGFLZXkubWV0YURhdGFUeXBlKCkgIT0gbWV0YURhdGFUeXBlKQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLQotVmVjdG9yPElEQkluZGV4TWV0YWRhdGE+
IElEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldEluZGV4ZXMoaW50NjRfdCBkYXRhYmFzZUlkLCBp
bnQ2NF90IG9iamVjdFN0b3JlSWQpCi17Ci0gICAgSURCX1RSQUNFKCJJREJMZXZlbERCQmFja2lu
Z1N0b3JlOjpnZXRJbmRleGVzIik7Ci0gICAgVmVjdG9yPElEQkluZGV4TWV0YWRhdGE+IGluZGV4
ZXM7Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IHN0YXJ0S2V5ID0gSW5kZXhNZXRhRGF0YUtleTo6
ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDAsIDApOwotICAgIGNvbnN0IFZlY3Rv
cjxjaGFyPiBzdG9wS2V5ID0gSW5kZXhNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9i
amVjdFN0b3JlSWQgKyAxLCAwLCAwKTsKLQotICAgIEFTU0VSVChpbmRleGVzLmlzRW1wdHkoKSk7
Ci0KLSAgICBPd25QdHI8TGV2ZWxEQkl0ZXJhdG9yPiBpdCA9IG1fZGItPmNyZWF0ZUl0ZXJhdG9y
KCk7Ci0gICAgaXQtPnNlZWsoc3RhcnRLZXkpOwotICAgIHdoaWxlIChpdC0+aXNWYWxpZCgpICYm
IGNvbXBhcmVLZXlzKGl0LT5rZXkoKSwgc3RvcEtleSkgPCAwKSB7Ci0gICAgICAgIGNvbnN0IGNo
YXIqIHAgPSBpdC0+a2V5KCkuYmVnaW4oKTsKLSAgICAgICAgY29uc3QgY2hhciogbGltaXQgPSBp
dC0+a2V5KCkuZW5kKCk7Ci0KLSAgICAgICAgSW5kZXhNZXRhRGF0YUtleSBtZXRhRGF0YUtleTsK
LSAgICAgICAgcCA9IEluZGV4TWV0YURhdGFLZXk6OmRlY29kZShwLCBsaW1pdCwgJm1ldGFEYXRh
S2V5KTsKLSAgICAgICAgQVNTRVJUKHApOwotICAgICAgICBpZiAobWV0YURhdGFLZXkubWV0YURh
dGFUeXBlKCkgIT0gSW5kZXhNZXRhRGF0YUtleTo6TmFtZSkgewotICAgICAgICAgICAgSW50ZXJu
YWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlUmVhZEVycm9yKTsKLSAgICAgICAgICAgIC8v
IFBvc3NpYmxlIHN0YWxlIG1ldGFkYXRhIGR1ZSB0byBodHRwOi8vd2Via2l0Lm9yZy9iLzg1NTU3
IGJ1dCBkb24ndCBmYWlsIHRoZSBsb2FkLgotICAgICAgICAgICAgaXQtPm5leHQoKTsKLSAgICAg
ICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRklYTUU6IERvIHRoaXMg
YnkgZGlyZWN0IGtleSBsb29rdXAgcmF0aGVyIHRoYW4gaXRlcmF0aW9uLCB0byBzaW1wbGlmeS4K
LSAgICAgICAgaW50NjRfdCBpbmRleElkID0gbWV0YURhdGFLZXkuaW5kZXhJZCgpOwotICAgICAg
ICBTdHJpbmcgaW5kZXhOYW1lID0gZGVjb2RlU3RyaW5nKGl0LT52YWx1ZSgpLmJlZ2luKCksIGl0
LT52YWx1ZSgpLmVuZCgpKTsKLQotICAgICAgICBpdC0+bmV4dCgpOyAvLyB1bmlxdWUgZmxhZwot
ICAgICAgICBpZiAoIWNoZWNrSW5kZXhBbmRNZXRhRGF0YUtleShpdC5nZXQoKSwgc3RvcEtleSwg
aW5kZXhJZCwgSW5kZXhNZXRhRGF0YUtleTo6VW5pcXVlKSkgewotICAgICAgICAgICAgSW50ZXJu
YWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlUmVhZEVycm9yKTsKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICB9Ci0gICAgICAgIGJvb2wgaW5kZXhVbmlxdWUgPSBkZWNvZGVCb29sKGl0
LT52YWx1ZSgpLmJlZ2luKCksIGl0LT52YWx1ZSgpLmVuZCgpKTsKLQotICAgICAgICBpdC0+bmV4
dCgpOyAvLyBrZXlQYXRoCi0gICAgICAgIGlmICghY2hlY2tJbmRleEFuZE1ldGFEYXRhS2V5KGl0
LmdldCgpLCBzdG9wS2V5LCBpbmRleElkLCBJbmRleE1ldGFEYXRhS2V5OjpLZXlQYXRoKSkgewot
ICAgICAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlUmVhZEVycm9y
KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIElEQktleVBhdGgga2V5
UGF0aCA9IGRlY29kZUlEQktleVBhdGgoaXQtPnZhbHVlKCkuYmVnaW4oKSwgaXQtPnZhbHVlKCku
ZW5kKCkpOwotCi0gICAgICAgIGl0LT5uZXh0KCk7IC8vIFtvcHRpb25hbF0gbXVsdGlFbnRyeSBm
bGFnCi0gICAgICAgIGJvb2wgaW5kZXhNdWx0aUVudHJ5ID0gZmFsc2U7Ci0gICAgICAgIGlmIChj
aGVja0luZGV4QW5kTWV0YURhdGFLZXkoaXQuZ2V0KCksIHN0b3BLZXksIGluZGV4SWQsIEluZGV4
TWV0YURhdGFLZXk6Ok11bHRpRW50cnkpKSB7Ci0gICAgICAgICAgICBpbmRleE11bHRpRW50cnkg
PSBkZWNvZGVCb29sKGl0LT52YWx1ZSgpLmJlZ2luKCksIGl0LT52YWx1ZSgpLmVuZCgpKTsKLSAg
ICAgICAgICAgIGl0LT5uZXh0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmRleGVzLmFwcGVu
ZChJREJJbmRleE1ldGFkYXRhKGluZGV4TmFtZSwgaW5kZXhJZCwga2V5UGF0aCwgaW5kZXhVbmlx
dWUsIGluZGV4TXVsdGlFbnRyeSkpOwotICAgIH0KLSAgICByZXR1cm4gaW5kZXhlczsKLX0KLQot
c3RhdGljIGJvb2wgc2V0TWF4SW5kZXhJZChMZXZlbERCVHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9u
LCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRl
eElkKQotewotICAgIGludDY0X3QgbWF4SW5kZXhJZCA9IC0xOwotICAgIGNvbnN0IFZlY3Rvcjxj
aGFyPiBtYXhJbmRleElkS2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFi
YXNlSWQsIG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6Ok1heEluZGV4SWQp
OwotICAgIGlmICghZ2V0SW50KHRyYW5zYWN0aW9uLCBtYXhJbmRleElkS2V5LCBtYXhJbmRleElk
KSkKLSAgICAgICAgbWF4SW5kZXhJZCA9IE1pbmltdW1JbmRleElkOwotCi0gICAgaWYgKGluZGV4
SWQgPD0gbWF4SW5kZXhJZCkgewotICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNr
aW5nU3RvcmVDb25zaXN0ZW5jeUVycm9yKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0K
LQotICAgIGlmICghcHV0SW50KHRyYW5zYWN0aW9uLCBtYXhJbmRleElkS2V5LCBpbmRleElkKSkg
ewotICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVXcml0ZUVycm9y
KTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQot
Ym9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpjcmVhdGVJbmRleChJREJCYWNraW5nU3RvcmU6
OlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9i
amVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBJ
REJLZXlQYXRoJiBrZXlQYXRoLCBib29sIGlzVW5pcXVlLCBib29sIGlzTXVsdGlFbnRyeSkKLXsK
LSAgICBJREJfVFJBQ0UoIklEQkxldmVsREJCYWNraW5nU3RvcmU6OmNyZWF0ZUluZGV4Iik7Ci0g
ICAgTGV2ZWxEQlRyYW5zYWN0aW9uKiBsZXZlbERCVHJhbnNhY3Rpb24gPSBUcmFuc2FjdGlvbjo6
bGV2ZWxEQlRyYW5zYWN0aW9uRnJvbSh0cmFuc2FjdGlvbik7Ci0gICAgaWYgKCFzZXRNYXhJbmRl
eElkKGxldmVsREJUcmFuc2FjdGlvbiwgZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJ
ZCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBuYW1l
S2V5ID0gSW5kZXhNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQs
IGluZGV4SWQsIEluZGV4TWV0YURhdGFLZXk6Ok5hbWUpOwotICAgIGNvbnN0IFZlY3RvcjxjaGFy
PiB1bmlxdWVLZXkgPSBJbmRleE1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmVJZCwgaW5kZXhJZCwgSW5kZXhNZXRhRGF0YUtleTo6VW5pcXVlKTsKLSAgICBjb25zdCBW
ZWN0b3I8Y2hhcj4ga2V5UGF0aEtleSA9IEluZGV4TWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFz
ZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBJbmRleE1ldGFEYXRhS2V5OjpLZXlQYXRoKTsK
LSAgICBjb25zdCBWZWN0b3I8Y2hhcj4gbXVsdGlFbnRyeUtleSA9IEluZGV4TWV0YURhdGFLZXk6
OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBJbmRleE1ldGFEYXRh
S2V5OjpNdWx0aUVudHJ5KTsKLQotICAgIGJvb2wgb2sgPSBwdXRTdHJpbmcobGV2ZWxEQlRyYW5z
YWN0aW9uLCBuYW1lS2V5LCBuYW1lKTsKLSAgICBpZiAoIW9rKSB7Ci0gICAgICAgIEludGVybmFs
RXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVdyaXRlRXJyb3IpOwotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgfQotCi0gICAgb2sgPSBwdXRCb29sKGxldmVsREJUcmFuc2FjdGlvbiwgdW5p
cXVlS2V5LCBpc1VuaXF1ZSk7Ci0gICAgaWYgKCFvaykgewotICAgICAgICBJbnRlcm5hbEVycm9y
KElEQkxldmVsREJCYWNraW5nU3RvcmVXcml0ZUVycm9yKTsKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgIH0KLQotICAgIG9rID0gcHV0SURCS2V5UGF0aChsZXZlbERCVHJhbnNhY3Rpb24sIGtl
eVBhdGhLZXksIGtleVBhdGgpOwotICAgIGlmICghb2spIHsKLSAgICAgICAgSW50ZXJuYWxFcnJv
cihJREJMZXZlbERCQmFja2luZ1N0b3JlV3JpdGVFcnJvcik7Ci0gICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICB9Ci0KLSAgICBvayA9IHB1dEJvb2wobGV2ZWxEQlRyYW5zYWN0aW9uLCBtdWx0aUVu
dHJ5S2V5LCBpc011bHRpRW50cnkpOwotICAgIGlmICghb2spIHsKLSAgICAgICAgSW50ZXJuYWxF
cnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlV3JpdGVFcnJvcik7Ci0gICAgICAgIHJldHVybiBm
YWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBJREJMZXZlbERCQmFj
a2luZ1N0b3JlOjpkZWxldGVJbmRleChJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uKiB0cmFu
c2FjdGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0
X3QgaW5kZXhJZCkKLXsKLSAgICBJREJfVFJBQ0UoIklEQkxldmVsREJCYWNraW5nU3RvcmU6OmRl
bGV0ZUluZGV4Iik7Ci0gICAgTGV2ZWxEQlRyYW5zYWN0aW9uKiBsZXZlbERCVHJhbnNhY3Rpb24g
PSBUcmFuc2FjdGlvbjo6bGV2ZWxEQlRyYW5zYWN0aW9uRnJvbSh0cmFuc2FjdGlvbik7Ci0KLSAg
ICBjb25zdCBWZWN0b3I8Y2hhcj4gaW5kZXhNZXRhRGF0YVN0YXJ0ID0gSW5kZXhNZXRhRGF0YUtl
eTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIDApOwotICAgIGNv
bnN0IFZlY3RvcjxjaGFyPiBpbmRleE1ldGFEYXRhRW5kID0gSW5kZXhNZXRhRGF0YUtleTo6ZW5j
b2RlTWF4S2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQpOwotCi0gICAgaWYg
KCFkZWxldGVSYW5nZShsZXZlbERCVHJhbnNhY3Rpb24sIGluZGV4TWV0YURhdGFTdGFydCwgaW5k
ZXhNZXRhRGF0YUVuZCkpIHsKLSAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2lu
Z1N0b3JlV3JpdGVFcnJvcik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjb25zdCBW
ZWN0b3I8Y2hhcj4gaW5kZXhEYXRhU3RhcnQgPSBJbmRleERhdGFLZXk6OmVuY29kZU1pbktleShk
YXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkKTsKLSAgICBjb25zdCBWZWN0b3I8Y2hh
cj4gaW5kZXhEYXRhRW5kID0gSW5kZXhEYXRhS2V5OjplbmNvZGVNYXhLZXkoZGF0YWJhc2VJZCwg
b2JqZWN0U3RvcmVJZCwgaW5kZXhJZCk7Ci0KLSAgICBpZiAoIWRlbGV0ZVJhbmdlKGxldmVsREJU
cmFuc2FjdGlvbiwgaW5kZXhEYXRhU3RhcnQsIGluZGV4RGF0YUVuZCkpIHsKLSAgICAgICAgSW50
ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlV3JpdGVFcnJvcik7Ci0gICAgICAgIHJl
dHVybjsKLSAgICB9Ci19Ci0KLWJvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6cHV0SW5kZXhE
YXRhRm9yUmVjb3JkKElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBp
bnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElk
LCBjb25zdCBJREJLZXkmIGtleSwgY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyKiBy
ZWNvcmRJZGVudGlmaWVyKQotewotICAgIElEQl9UUkFDRSgiSURCTGV2ZWxEQkJhY2tpbmdTdG9y
ZTo6cHV0SW5kZXhEYXRhRm9yUmVjb3JkIik7Ci0gICAgQVNTRVJUKGtleS5pc1ZhbGlkKCkpOwot
ICAgIEFTU0VSVChpbmRleElkID49IE1pbmltdW1JbmRleElkKTsKLSAgICBjb25zdCBMZXZlbERC
UmVjb3JkSWRlbnRpZmllciogbGV2ZWxEQlJlY29yZElkZW50aWZpZXIgPSBzdGF0aWNfY2FzdDxj
b25zdCBMZXZlbERCUmVjb3JkSWRlbnRpZmllcio+KHJlY29yZElkZW50aWZpZXIpOwotCi0gICAg
TGV2ZWxEQlRyYW5zYWN0aW9uKiBsZXZlbERCVHJhbnNhY3Rpb24gPSBUcmFuc2FjdGlvbjo6bGV2
ZWxEQlRyYW5zYWN0aW9uRnJvbSh0cmFuc2FjdGlvbik7Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+
IGluZGV4RGF0YUtleSA9IEluZGV4RGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0
b3JlSWQsIGluZGV4SWQsIGVuY29kZUlEQktleShrZXkpLCBsZXZlbERCUmVjb3JkSWRlbnRpZmll
ci0+cHJpbWFyeUtleSgpKTsKLQotICAgIFZlY3RvcjxjaGFyPiBkYXRhOwotICAgIGRhdGEuYXBw
ZW5kKGVuY29kZVZhckludChsZXZlbERCUmVjb3JkSWRlbnRpZmllci0+dmVyc2lvbigpKSk7Ci0g
ICAgZGF0YS5hcHBlbmQobGV2ZWxEQlJlY29yZElkZW50aWZpZXItPnByaW1hcnlLZXkoKSk7Ci0K
LSAgICByZXR1cm4gbGV2ZWxEQlRyYW5zYWN0aW9uLT5wdXQoaW5kZXhEYXRhS2V5LCBkYXRhKTsK
LX0KLQotc3RhdGljIGJvb2wgZmluZEdyZWF0ZXN0S2V5TGVzc1RoYW5PckVxdWFsKExldmVsREJU
cmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGNvbnN0IFZlY3RvcjxjaGFyPiYgdGFyZ2V0LCBWZWN0
b3I8Y2hhcj4mIGZvdW5kS2V5KQotewotICAgIE93blB0cjxMZXZlbERCSXRlcmF0b3I+IGl0ID0g
dHJhbnNhY3Rpb24tPmNyZWF0ZUl0ZXJhdG9yKCk7Ci0gICAgaXQtPnNlZWsodGFyZ2V0KTsKLQot
ICAgIGlmICghaXQtPmlzVmFsaWQoKSkgewotICAgICAgICBpdC0+c2Vla1RvTGFzdCgpOwotICAg
ICAgICBpZiAoIWl0LT5pc1ZhbGlkKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
fQotCi0gICAgd2hpbGUgKGNvbXBhcmVJbmRleEtleXMoaXQtPmtleSgpLCB0YXJnZXQpID4gMCkg
ewotICAgICAgICBpdC0+cHJldigpOwotICAgICAgICBpZiAoIWl0LT5pc1ZhbGlkKCkpCi0gICAg
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgZG8gewotICAgICAgICBmb3VuZEtl
eS5jbGVhcigpOwotICAgICAgICBmb3VuZEtleS5hcHBlbmQoaXQtPmtleSgpLmJlZ2luKCksIGl0
LT5rZXkoKS5lbmQoKSAtIGl0LT5rZXkoKS5iZWdpbigpKTsKLQotICAgICAgICAvLyBUaGVyZSBj
YW4gYmUgc2V2ZXJhbCBpbmRleCBrZXlzIHRoYXQgY29tcGFyZSBlcXVhbC4gV2Ugd2FudCB0aGUg
bGFzdCBvbmUuCi0gICAgICAgIGl0LT5uZXh0KCk7Ci0gICAgfSB3aGlsZSAoaXQtPmlzVmFsaWQo
KSAmJiAhY29tcGFyZUluZGV4S2V5cyhpdC0+a2V5KCksIHRhcmdldCkpOwotCi0gICAgcmV0dXJu
IHRydWU7Ci19Ci0KLWJvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlSW5kZXhEYXRh
Rm9yUmVjb3JkKElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24qLCBpbnQ2NF90LCBpbnQ2NF90
LCBpbnQ2NF90LCBjb25zdCBPYmplY3RTdG9yZVJlY29yZElkZW50aWZpZXIqKQotewotICAgIC8v
IEZJWE1FOiBUaGlzIGlzbid0IG5lZWRlZCBzaW5jZSB3ZSBpbnZhbGlkYXRlIGluZGV4IGRhdGEg
dmlhIHRoZSB2ZXJzaW9uIG51bWJlciBtZWNoYW5pc20uCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0K
LXN0YXRpYyBib29sIHZlcnNpb25FeGlzdHMoTGV2ZWxEQlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlv
biwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgdmVy
c2lvbiwgY29uc3QgVmVjdG9yPGNoYXI+JiBlbmNvZGVkUHJpbWFyeUtleSkKLXsKLSAgICBjb25z
dCBWZWN0b3I8Y2hhcj4ga2V5ID0gRXhpc3RzRW50cnlLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBv
YmplY3RTdG9yZUlkLCBlbmNvZGVkUHJpbWFyeUtleSk7Ci0gICAgVmVjdG9yPGNoYXI+IGRhdGE7
Ci0KLSAgICBpZiAoIXRyYW5zYWN0aW9uLT5nZXQoa2V5LCBkYXRhKSkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotCi0gICAgcmV0dXJuIGRlY29kZUludChkYXRhLmJlZ2luKCksIGRhdGEuZW5kKCkp
ID09IHZlcnNpb247Ci19Ci0KLWJvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZmluZEtleUlu
SW5kZXgoSURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGludDY0X3Qg
ZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0
IElEQktleSYga2V5LCBWZWN0b3I8Y2hhcj4mIGZvdW5kRW5jb2RlZFByaW1hcnlLZXkpCi17Ci0g
ICAgSURCX1RSQUNFKCJJREJMZXZlbERCQmFja2luZ1N0b3JlOjpmaW5kS2V5SW5JbmRleCIpOwot
ICAgIEFTU0VSVChmb3VuZEVuY29kZWRQcmltYXJ5S2V5LmlzRW1wdHkoKSk7Ci0KLSAgICBMZXZl
bERCVHJhbnNhY3Rpb24qIGxldmVsREJUcmFuc2FjdGlvbiA9IFRyYW5zYWN0aW9uOjpsZXZlbERC
VHJhbnNhY3Rpb25Gcm9tKHRyYW5zYWN0aW9uKTsKLSAgICBjb25zdCBWZWN0b3I8Y2hhcj4gbGV2
ZWxkYktleSA9IEluZGV4RGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQs
IGluZGV4SWQsIGtleSk7Ci0gICAgT3duUHRyPExldmVsREJJdGVyYXRvcj4gaXQgPSBsZXZlbERC
VHJhbnNhY3Rpb24tPmNyZWF0ZUl0ZXJhdG9yKCk7Ci0gICAgaXQtPnNlZWsobGV2ZWxkYktleSk7
Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIGlmICghaXQtPmlzVmFsaWQoKSkKLSAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKGNvbXBhcmVJbmRleEtleXMoaXQtPmtleSgp
LCBsZXZlbGRiS2V5KSA+IDApCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAg
aW50NjRfdCB2ZXJzaW9uOwotICAgICAgICBjb25zdCBjaGFyKiBwID0gZGVjb2RlVmFySW50KGl0
LT52YWx1ZSgpLmJlZ2luKCksIGl0LT52YWx1ZSgpLmVuZCgpLCB2ZXJzaW9uKTsKLSAgICAgICAg
aWYgKCFwKSB7Ci0gICAgICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3Rv
cmVSZWFkRXJyb3IpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAg
ICAgIGZvdW5kRW5jb2RlZFByaW1hcnlLZXkuYXBwZW5kKHAsIGl0LT52YWx1ZSgpLmVuZCgpIC0g
cCk7Ci0KLSAgICAgICAgaWYgKCF2ZXJzaW9uRXhpc3RzKGxldmVsREJUcmFuc2FjdGlvbiwgZGF0
YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgdmVyc2lvbiwgZm91bmRFbmNvZGVkUHJpbWFyeUtleSkp
IHsKLSAgICAgICAgICAgIC8vIERlbGV0ZSBzdGFsZSBpbmRleCBkYXRhIGVudHJ5IGFuZCBjb250
aW51ZS4KLSAgICAgICAgICAgIGxldmVsREJUcmFuc2FjdGlvbi0+cmVtb3ZlKGl0LT5rZXkoKSk7
Ci0gICAgICAgICAgICBpdC0+bmV4dCgpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAg
IH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19Ci0KLVBhc3NSZWZQdHI8SURCS2V5
PiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRQcmltYXJ5S2V5VmlhSW5kZXgoSURCQmFja2lu
Z1N0b3JlOjpUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGludDY0X3QgZGF0YWJhc2VJZCwgaW50
NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYga2V5KQot
ewotICAgIElEQl9UUkFDRSgiSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0UHJpbWFyeUtleVZp
YUluZGV4Iik7Ci0KLSAgICBWZWN0b3I8Y2hhcj4gZm91bmRFbmNvZGVkUHJpbWFyeUtleTsKLSAg
ICBpZiAoZmluZEtleUluSW5kZXgodHJhbnNhY3Rpb24sIGRhdGFiYXNlSWQsIG9iamVjdFN0b3Jl
SWQsIGluZGV4SWQsIGtleSwgZm91bmRFbmNvZGVkUHJpbWFyeUtleSkpIHsKLSAgICAgICAgUmVm
UHRyPElEQktleT4gcHJpbWFyeUtleTsKLSAgICAgICAgZGVjb2RlSURCS2V5KGZvdW5kRW5jb2Rl
ZFByaW1hcnlLZXkuYmVnaW4oKSwgZm91bmRFbmNvZGVkUHJpbWFyeUtleS5lbmQoKSwgcHJpbWFy
eUtleSk7Ci0gICAgICAgIHJldHVybiBwcmltYXJ5S2V5LnJlbGVhc2UoKTsKLSAgICB9Ci0KLSAg
ICByZXR1cm4gMDsKLX0KLQotYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjprZXlFeGlzdHNJ
bkluZGV4KElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90
IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25z
dCBJREJLZXkmIGluZGV4S2V5LCBSZWZQdHI8SURCS2V5PiYgZm91bmRQcmltYXJ5S2V5KQotewot
ICAgIElEQl9UUkFDRSgiSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6a2V5RXhpc3RzSW5JbmRleCIp
OwotCi0gICAgVmVjdG9yPGNoYXI+IGZvdW5kRW5jb2RlZFByaW1hcnlLZXk7Ci0gICAgaWYgKCFm
aW5kS2V5SW5JbmRleCh0cmFuc2FjdGlvbiwgZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5k
ZXhJZCwgaW5kZXhLZXksIGZvdW5kRW5jb2RlZFByaW1hcnlLZXkpKQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0KLSAgICBkZWNvZGVJREJLZXkoZm91bmRFbmNvZGVkUHJpbWFyeUtleS5iZWdpbigp
LCBmb3VuZEVuY29kZWRQcmltYXJ5S2V5LmVuZCgpLCBmb3VuZFByaW1hcnlLZXkpOwotICAgIHJl
dHVybiB0cnVlOwotfQotCi1uYW1lc3BhY2UgewotCi1zdHJ1Y3QgQ3Vyc29yT3B0aW9ucyB7Ci0g
ICAgVmVjdG9yPGNoYXI+IGxvd0tleTsKLSAgICBib29sIGxvd09wZW47Ci0gICAgVmVjdG9yPGNo
YXI+IGhpZ2hLZXk7Ci0gICAgYm9vbCBoaWdoT3BlbjsKLSAgICBib29sIGZvcndhcmQ7Ci0gICAg
Ym9vbCB1bmlxdWU7Ci19OwotCi1jbGFzcyBDdXJzb3JJbXBsQ29tbW9uIDogcHVibGljIElEQkJh
Y2tpbmdTdG9yZTo6Q3Vyc29yIHsKLXB1YmxpYzoKLSAgICAvLyBJREJCYWNraW5nU3RvcmU6OkN1
cnNvcgotICAgIHZpcnR1YWwgYm9vbCBhZHZhbmNlKHVuc2lnbmVkIGxvbmcpOwotICAgIHZpcnR1
YWwgYm9vbCBjb250aW51ZUZ1bmN0aW9uKGNvbnN0IElEQktleSogPSAwLCBJdGVyYXRvclN0YXRl
ID0gU2Vlayk7Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQktleT4ga2V5KCkgeyByZXR1cm4g
bV9jdXJyZW50S2V5OyB9Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQktleT4gcHJpbWFyeUtl
eSgpIHsgcmV0dXJuIG1fY3VycmVudEtleTsgfQotICAgIHZpcnR1YWwgU3RyaW5nIHZhbHVlKCkg
PSAwOwotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6Ok9iamVjdFN0b3Jl
UmVjb3JkSWRlbnRpZmllcj4gb2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyKCkgPSAwOwotICAg
IHZpcnR1YWwgdm9pZCBjbG9zZSgpIHsgfQotCi0gICAgdmlydHVhbCBib29sIGxvYWRDdXJyZW50
Um93KCkgPSAwOwotICAgIGJvb2wgZmlyc3RTZWVrKCk7Ci0KLXByb3RlY3RlZDoKLSAgICBDdXJz
b3JJbXBsQ29tbW9uKExldmVsREJUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGNvbnN0IEN1cnNv
ck9wdGlvbnMmIGN1cnNvck9wdGlvbnMpCi0gICAgICAgIDogbV90cmFuc2FjdGlvbih0cmFuc2Fj
dGlvbikKLSAgICAgICAgLCBtX2N1cnNvck9wdGlvbnMoY3Vyc29yT3B0aW9ucykKLSAgICB7Ci0g
ICAgfQotCi0gICAgQ3Vyc29ySW1wbENvbW1vbihjb25zdCBDdXJzb3JJbXBsQ29tbW9uKiBvdGhl
cikKLSAgICAgICAgOiBtX3RyYW5zYWN0aW9uKG90aGVyLT5tX3RyYW5zYWN0aW9uKQotICAgICAg
ICAsIG1fY3Vyc29yT3B0aW9ucyhvdGhlci0+bV9jdXJzb3JPcHRpb25zKQotICAgICAgICAsIG1f
Y3VycmVudEtleShvdGhlci0+bV9jdXJyZW50S2V5KQotICAgIHsKLSAgICAgICAgaWYgKG90aGVy
LT5tX2l0ZXJhdG9yKSB7Ci0gICAgICAgICAgICBtX2l0ZXJhdG9yID0gbV90cmFuc2FjdGlvbi0+
Y3JlYXRlSXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgaWYgKG90aGVyLT5tX2l0ZXJhdG9yLT5p
c1ZhbGlkKCkpIHsKLSAgICAgICAgICAgICAgICBtX2l0ZXJhdG9yLT5zZWVrKG90aGVyLT5tX2l0
ZXJhdG9yLT5rZXkoKSk7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKG1faXRlcmF0b3ItPmlzVmFs
aWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2aXJ0dWFsIH5D
dXJzb3JJbXBsQ29tbW9uKCkge30KLQotICAgIGJvb2wgaXNQYXN0Qm91bmRzKCkgY29uc3Q7Ci0g
ICAgYm9vbCBoYXZlRW50ZXJlZFJhbmdlKCkgY29uc3Q7Ci0KLSAgICBMZXZlbERCVHJhbnNhY3Rp
b24qIG1fdHJhbnNhY3Rpb247Ci0gICAgQ3Vyc29yT3B0aW9ucyBtX2N1cnNvck9wdGlvbnM7Ci0g
ICAgT3duUHRyPExldmVsREJJdGVyYXRvcj4gbV9pdGVyYXRvcjsKLSAgICBSZWZQdHI8SURCS2V5
PiBtX2N1cnJlbnRLZXk7Ci19OwotCi1ib29sIEN1cnNvckltcGxDb21tb246OmZpcnN0U2Vlaygp
Ci17Ci0gICAgbV9pdGVyYXRvciA9IG1fdHJhbnNhY3Rpb24tPmNyZWF0ZUl0ZXJhdG9yKCk7Ci0g
ICAgaWYgKG1fY3Vyc29yT3B0aW9ucy5mb3J3YXJkKQotICAgICAgICBtX2l0ZXJhdG9yLT5zZWVr
KG1fY3Vyc29yT3B0aW9ucy5sb3dLZXkpOwotICAgIGVsc2UKLSAgICAgICAgbV9pdGVyYXRvci0+
c2VlayhtX2N1cnNvck9wdGlvbnMuaGlnaEtleSk7Ci0KLSAgICByZXR1cm4gY29udGludWVGdW5j
dGlvbigwLCBSZWFkeSk7Ci19Ci0KLWJvb2wgQ3Vyc29ySW1wbENvbW1vbjo6YWR2YW5jZSh1bnNp
Z25lZCBsb25nIGNvdW50KQotewotICAgIHdoaWxlIChjb3VudC0tKSB7Ci0gICAgICAgIGlmICgh
Y29udGludWVGdW5jdGlvbigpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAg
ICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDdXJzb3JJbXBsQ29tbW9uOjpjb250aW51ZUZ1bmN0
aW9uKGNvbnN0IElEQktleSoga2V5LCBJdGVyYXRvclN0YXRlIG5leHRTdGF0ZSkKLXsKLSAgICBS
ZWZQdHI8SURCS2V5PiBwcmV2aW91c0tleSA9IG1fY3VycmVudEtleTsKLQotICAgIC8vIFdoZW4g
aXRlcmF0aW5nIHdpdGggUFJFVl9OT19EVVBMSUNBVEUsIHNwZWMgcmVxdWlyZXMgdGhhdCB0aGUK
LSAgICAvLyB2YWx1ZSB3ZSB5aWVsZCBmb3IgZWFjaCBrZXkgaXMgdGhlIGZpcnN0IGR1cGxpY2F0
ZSBpbiBmb3J3YXJkcwotICAgIC8vIG9yZGVyLgotICAgIFJlZlB0cjxJREJLZXk+IGxhc3REdXBs
aWNhdGVLZXk7Ci0KLSAgICBib29sIGZvcndhcmQgPSBtX2N1cnNvck9wdGlvbnMuZm9yd2FyZDsK
LQotICAgIGZvciAoOzspIHsKLSAgICAgICAgaWYgKG5leHRTdGF0ZSA9PSBTZWVrKSB7Ci0gICAg
ICAgICAgICBpZiAoZm9yd2FyZCkKLSAgICAgICAgICAgICAgICBtX2l0ZXJhdG9yLT5uZXh0KCk7
Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbV9pdGVyYXRvci0+cHJldigpOwot
ICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIG5leHRTdGF0ZSA9IFNlZWs7IC8vIGZvciBzdWJz
ZXF1ZW50IGl0ZXJhdGlvbnMKLQotICAgICAgICBpZiAoIW1faXRlcmF0b3ItPmlzVmFsaWQoKSkg
ewotICAgICAgICAgICAgaWYgKCFmb3J3YXJkICYmIGxhc3REdXBsaWNhdGVLZXkuZ2V0KCkpIHsK
LSAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHdhbGsgZm9yd2FyZCBiZWNhdXNlIHdlIGhp
dCB0aGUgZW5kIG9mCi0gICAgICAgICAgICAgICAgLy8gdGhlIGRhdGEuCi0gICAgICAgICAgICAg
ICAgZm9yd2FyZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAg
ICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlm
IChpc1Bhc3RCb3VuZHMoKSkgewotICAgICAgICAgICAgaWYgKCFmb3J3YXJkICYmIGxhc3REdXBs
aWNhdGVLZXkuZ2V0KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHdhbGsgZm9y
d2FyZCBiZWNhdXNlIG5vdyB3ZSdyZSBiZXlvbmQgdGhlCi0gICAgICAgICAgICAgICAgLy8gYm91
bmRzIGRlZmluZWQgYnkgdGhlIGN1cnNvci4KLSAgICAgICAgICAgICAgICBmb3J3YXJkID0gdHJ1
ZTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFoYXZlRW50ZXJlZFJh
bmdlKCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAvLyBUaGUgcm93IG1heSBu
b3QgbG9hZCBiZWNhdXNlIHRoZXJlJ3MgYSBzdGFsZSBlbnRyeSBpbiB0aGUKLSAgICAgICAgLy8g
aW5kZXguIFRoaXMgaXMgbm90IGZhdGFsLgotICAgICAgICBpZiAoIWxvYWRDdXJyZW50Um93KCkp
Ci0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBpZiAoa2V5KSB7Ci0gICAgICAgICAg
ICBpZiAoZm9yd2FyZCkgewotICAgICAgICAgICAgICAgIGlmIChtX2N1cnJlbnRLZXktPmlzTGVz
c1RoYW4oa2V5KSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9
IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChrZXktPmlzTGVzc1RoYW4obV9jdXJyZW50S2V5
LmdldCgpKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgIH0KLQotICAgICAgICBpZiAobV9jdXJzb3JPcHRpb25zLnVuaXF1ZSkgewotCi0gICAg
ICAgICAgICBpZiAobV9jdXJyZW50S2V5LT5pc0VxdWFsKHByZXZpb3VzS2V5LmdldCgpKSkgewot
ICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBuZXZlciBiZSBhYmxlIHRvIHdhbGsgZm9yd2Fy
ZCBhbGwgdGhlIHdheQotICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBwcmV2aW91cyBrZXkuCi0g
ICAgICAgICAgICAgICAgQVNTRVJUKCFsYXN0RHVwbGljYXRlS2V5LmdldCgpKTsKLSAgICAgICAg
ICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFmb3J3
YXJkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFsYXN0RHVwbGljYXRlS2V5LmdldCgpKSB7Ci0g
ICAgICAgICAgICAgICAgICAgIGxhc3REdXBsaWNhdGVLZXkgPSBtX2N1cnJlbnRLZXk7Ci0gICAg
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAg
ICAgICAgIC8vIFdlIG5lZWQgdG8gd2FsayBmb3J3YXJkIGJlY2F1c2Ugd2UgaGl0IHRoZSBib3Vu
ZGFyeQotICAgICAgICAgICAgICAgIC8vIGJldHdlZW4ga2V5IHJhbmdlcy4KLSAgICAgICAgICAg
ICAgICBpZiAoIWxhc3REdXBsaWNhdGVLZXktPmlzRXF1YWwobV9jdXJyZW50S2V5LmdldCgpKSkg
ewotICAgICAgICAgICAgICAgICAgICBmb3J3YXJkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAg
ICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY29udGlu
dWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0g
ICAgQVNTRVJUKCFsYXN0RHVwbGljYXRlS2V5LmdldCgpIHx8IChmb3J3YXJkICYmIGxhc3REdXBs
aWNhdGVLZXktPmlzRXF1YWwobV9jdXJyZW50S2V5LmdldCgpKSkpOwotICAgIHJldHVybiB0cnVl
OwotfQotCi1ib29sIEN1cnNvckltcGxDb21tb246OmhhdmVFbnRlcmVkUmFuZ2UoKSBjb25zdAot
ewotICAgIGlmIChtX2N1cnNvck9wdGlvbnMuZm9yd2FyZCkgewotICAgICAgICBpZiAobV9jdXJz
b3JPcHRpb25zLmxvd09wZW4pCi0gICAgICAgICAgICByZXR1cm4gY29tcGFyZUluZGV4S2V5cyht
X2l0ZXJhdG9yLT5rZXkoKSwgbV9jdXJzb3JPcHRpb25zLmxvd0tleSkgPiAwOwotCi0gICAgICAg
IHJldHVybiBjb21wYXJlSW5kZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2N1cnNvck9wdGlv
bnMubG93S2V5KSA+PSAwOwotICAgIH0KLSAgICBpZiAobV9jdXJzb3JPcHRpb25zLmhpZ2hPcGVu
KQotICAgICAgICByZXR1cm4gY29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9j
dXJzb3JPcHRpb25zLmhpZ2hLZXkpIDwgMDsKLQotICAgIHJldHVybiBjb21wYXJlSW5kZXhLZXlz
KG1faXRlcmF0b3ItPmtleSgpLCBtX2N1cnNvck9wdGlvbnMuaGlnaEtleSkgPD0gMDsKLX0KLQot
Ym9vbCBDdXJzb3JJbXBsQ29tbW9uOjppc1Bhc3RCb3VuZHMoKSBjb25zdAotewotICAgIGlmICht
X2N1cnNvck9wdGlvbnMuZm9yd2FyZCkgewotICAgICAgICBpZiAobV9jdXJzb3JPcHRpb25zLmhp
Z2hPcGVuKQotICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVJbmRleEtleXMobV9pdGVyYXRvci0+
a2V5KCksIG1fY3Vyc29yT3B0aW9ucy5oaWdoS2V5KSA+PSAwOwotICAgICAgICByZXR1cm4gY29t
cGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9jdXJzb3JPcHRpb25zLmhpZ2hLZXkp
ID4gMDsKLSAgICB9Ci0KLSAgICBpZiAobV9jdXJzb3JPcHRpb25zLmxvd09wZW4pCi0gICAgICAg
IHJldHVybiBjb21wYXJlSW5kZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2N1cnNvck9wdGlv
bnMubG93S2V5KSA8PSAwOwotICAgIHJldHVybiBjb21wYXJlSW5kZXhLZXlzKG1faXRlcmF0b3It
PmtleSgpLCBtX2N1cnNvck9wdGlvbnMubG93S2V5KSA8IDA7Ci19Ci0KLWNsYXNzIE9iamVjdFN0
b3JlS2V5Q3Vyc29ySW1wbCA6IHB1YmxpYyBDdXJzb3JJbXBsQ29tbW9uIHsKLXB1YmxpYzoKLSAg
ICBzdGF0aWMgUGFzc1JlZlB0cjxPYmplY3RTdG9yZUtleUN1cnNvckltcGw+IGNyZWF0ZShMZXZl
bERCVHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBjb25zdCBDdXJzb3JPcHRpb25zJiBjdXJzb3JP
cHRpb25zKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBPYmplY3RTdG9yZUtl
eUN1cnNvckltcGwodHJhbnNhY3Rpb24sIGN1cnNvck9wdGlvbnMpKTsKLSAgICB9Ci0KLSAgICB2
aXJ0dWFsIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IGNsb25lKCkKLSAgICB7
Ci0gICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgT2JqZWN0U3RvcmVLZXlDdXJzb3JJbXBsKHRo
aXMpKTsKLSAgICB9Ci0KLSAgICAvLyBDdXJzb3JJbXBsQ29tbW9uCi0gICAgdmlydHVhbCBTdHJp
bmcgdmFsdWUoKSB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4gU3RyaW5nKCk7IH0KLSAg
ICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJlY29yZElk
ZW50aWZpZXI+IG9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllcigpIE9WRVJSSURFCi0gICAgewot
ICAgICAgICByZXR1cm4gbV9pZGVudGlmaWVyOwotICAgIH0KLSAgICB2aXJ0dWFsIGJvb2wgbG9h
ZEN1cnJlbnRSb3coKTsKLQotcHJpdmF0ZToKLSAgICBPYmplY3RTdG9yZUtleUN1cnNvckltcGwo
TGV2ZWxEQlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgY29uc3QgQ3Vyc29yT3B0aW9ucyYgY3Vy
c29yT3B0aW9ucykKLSAgICAgICAgOiBDdXJzb3JJbXBsQ29tbW9uKHRyYW5zYWN0aW9uLCBjdXJz
b3JPcHRpb25zKQotICAgIHsKLSAgICB9Ci0KLSAgICBPYmplY3RTdG9yZUtleUN1cnNvckltcGwo
Y29uc3QgT2JqZWN0U3RvcmVLZXlDdXJzb3JJbXBsKiBvdGhlcikKLSAgICAgICAgOiBDdXJzb3JJ
bXBsQ29tbW9uKG90aGVyKQotICAgIHsKLSAgICB9Ci0KLSAgICBSZWZQdHI8TGV2ZWxEQlJlY29y
ZElkZW50aWZpZXI+IG1faWRlbnRpZmllcjsKLX07Ci0KLWJvb2wgT2JqZWN0U3RvcmVLZXlDdXJz
b3JJbXBsOjpsb2FkQ3VycmVudFJvdygpCi17Ci0gICAgY29uc3QgY2hhcioga2V5UG9zaXRpb24g
PSBtX2l0ZXJhdG9yLT5rZXkoKS5iZWdpbigpOwotICAgIGNvbnN0IGNoYXIqIGtleUxpbWl0ID0g
bV9pdGVyYXRvci0+a2V5KCkuZW5kKCk7Ci0KLSAgICBPYmplY3RTdG9yZURhdGFLZXkgb2JqZWN0
U3RvcmVEYXRhS2V5OwotICAgIGtleVBvc2l0aW9uID0gT2JqZWN0U3RvcmVEYXRhS2V5OjpkZWNv
ZGUoa2V5UG9zaXRpb24sIGtleUxpbWl0LCAmb2JqZWN0U3RvcmVEYXRhS2V5KTsKLSAgICBpZiAo
IWtleVBvc2l0aW9uKSB7Ci0gICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdT
dG9yZVJlYWRFcnJvcik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBtX2N1
cnJlbnRLZXkgPSBvYmplY3RTdG9yZURhdGFLZXkudXNlcktleSgpOwotCi0gICAgaW50NjRfdCB2
ZXJzaW9uOwotICAgIGNvbnN0IGNoYXIqIHZhbHVlUG9zaXRpb24gPSBkZWNvZGVWYXJJbnQobV9p
dGVyYXRvci0+dmFsdWUoKS5iZWdpbigpLCBtX2l0ZXJhdG9yLT52YWx1ZSgpLmVuZCgpLCB2ZXJz
aW9uKTsKLSAgICBpZiAoIXZhbHVlUG9zaXRpb24pIHsKLSAgICAgICAgSW50ZXJuYWxFcnJvcihJ
REJMZXZlbERCQmFja2luZ1N0b3JlUmVhZEVycm9yKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgIH0KLQotICAgIC8vIEZJWE1FOiBUaGlzIHJlLWVuY29kZXMgd2hhdCB3YXMganVzdCBkZWNv
ZGVkOyB0cnkgYW5kIG9wdGltaXplLgotICAgIG1faWRlbnRpZmllciA9IExldmVsREJSZWNvcmRJ
ZGVudGlmaWVyOjpjcmVhdGUoZW5jb2RlSURCS2V5KCptX2N1cnJlbnRLZXkpLCB2ZXJzaW9uKTsK
LQotICAgIHJldHVybiB0cnVlOwotfQotCi1jbGFzcyBPYmplY3RTdG9yZUN1cnNvckltcGwgOiBw
dWJsaWMgQ3Vyc29ySW1wbENvbW1vbiB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIFBhc3NSZWZQdHI8
T2JqZWN0U3RvcmVDdXJzb3JJbXBsPiBjcmVhdGUoTGV2ZWxEQlRyYW5zYWN0aW9uKiB0cmFuc2Fj
dGlvbiwgY29uc3QgQ3Vyc29yT3B0aW9ucyYgY3Vyc29yT3B0aW9ucykKLSAgICB7Ci0gICAgICAg
IHJldHVybiBhZG9wdFJlZihuZXcgT2JqZWN0U3RvcmVDdXJzb3JJbXBsKHRyYW5zYWN0aW9uLCBj
dXJzb3JPcHRpb25zKSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQkJhY2tp
bmdTdG9yZTo6Q3Vyc29yPiBjbG9uZSgpCi0gICAgewotICAgICAgICByZXR1cm4gYWRvcHRSZWYo
bmV3IE9iamVjdFN0b3JlQ3Vyc29ySW1wbCh0aGlzKSk7Ci0gICAgfQotCi0gICAgLy8gQ3Vyc29y
SW1wbENvbW1vbgotICAgIHZpcnR1YWwgU3RyaW5nIHZhbHVlKCkgeyByZXR1cm4gbV9jdXJyZW50
VmFsdWU7IH0KLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpPYmplY3RT
dG9yZVJlY29yZElkZW50aWZpZXI+IG9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllcigpIE9WRVJS
SURFCi0gICAgewotICAgICAgICByZXR1cm4gbV9pZGVudGlmaWVyOwotICAgIH0KLSAgICB2aXJ0
dWFsIGJvb2wgbG9hZEN1cnJlbnRSb3coKTsKLQotcHJpdmF0ZToKLSAgICBPYmplY3RTdG9yZUN1
cnNvckltcGwoTGV2ZWxEQlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgY29uc3QgQ3Vyc29yT3B0
aW9ucyYgY3Vyc29yT3B0aW9ucykKLSAgICAgICAgOiBDdXJzb3JJbXBsQ29tbW9uKHRyYW5zYWN0
aW9uLCBjdXJzb3JPcHRpb25zKQotICAgIHsKLSAgICB9Ci0KLSAgICBPYmplY3RTdG9yZUN1cnNv
ckltcGwoY29uc3QgT2JqZWN0U3RvcmVDdXJzb3JJbXBsKiBvdGhlcikKLSAgICAgICAgOiBDdXJz
b3JJbXBsQ29tbW9uKG90aGVyKQotICAgICAgICAsIG1fY3VycmVudFZhbHVlKG90aGVyLT5tX2N1
cnJlbnRWYWx1ZSkKLSAgICB7Ci0gICAgfQotCi0gICAgU3RyaW5nIG1fY3VycmVudFZhbHVlOwot
ICAgIFJlZlB0cjxMZXZlbERCUmVjb3JkSWRlbnRpZmllcj4gbV9pZGVudGlmaWVyOwotfTsKLQot
Ym9vbCBPYmplY3RTdG9yZUN1cnNvckltcGw6OmxvYWRDdXJyZW50Um93KCkKLXsKLSAgICBjb25z
dCBjaGFyKiBrZXlQb3NpdGlvbiA9IG1faXRlcmF0b3ItPmtleSgpLmJlZ2luKCk7Ci0gICAgY29u
c3QgY2hhcioga2V5TGltaXQgPSBtX2l0ZXJhdG9yLT5rZXkoKS5lbmQoKTsKLQotICAgIE9iamVj
dFN0b3JlRGF0YUtleSBvYmplY3RTdG9yZURhdGFLZXk7Ci0gICAga2V5UG9zaXRpb24gPSBPYmpl
Y3RTdG9yZURhdGFLZXk6OmRlY29kZShrZXlQb3NpdGlvbiwga2V5TGltaXQsICZvYmplY3RTdG9y
ZURhdGFLZXkpOwotICAgIGlmICgha2V5UG9zaXRpb24pIHsKLSAgICAgICAgSW50ZXJuYWxFcnJv
cihJREJMZXZlbERCQmFja2luZ1N0b3JlUmVhZEVycm9yKTsKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgIH0KLQotICAgIG1fY3VycmVudEtleSA9IG9iamVjdFN0b3JlRGF0YUtleS51c2VyS2V5
KCk7Ci0KLSAgICBpbnQ2NF90IHZlcnNpb247Ci0gICAgY29uc3QgY2hhciogdmFsdWVQb3NpdGlv
biA9IGRlY29kZVZhckludChtX2l0ZXJhdG9yLT52YWx1ZSgpLmJlZ2luKCksIG1faXRlcmF0b3It
PnZhbHVlKCkuZW5kKCksIHZlcnNpb24pOwotICAgIGlmICghdmFsdWVQb3NpdGlvbikgewotICAg
ICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVSZWFkRXJyb3IpOwotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gRklYTUU6IFRoaXMgcmUtZW5jb2Rl
cyB3aGF0IHdhcyBqdXN0IGRlY29kZWQ7IHRyeSBhbmQgb3B0aW1pemUuCi0gICAgbV9pZGVudGlm
aWVyID0gTGV2ZWxEQlJlY29yZElkZW50aWZpZXI6OmNyZWF0ZShlbmNvZGVJREJLZXkoKm1fY3Vy
cmVudEtleSksIHZlcnNpb24pOwotCi0gICAgbV9jdXJyZW50VmFsdWUgPSBkZWNvZGVTdHJpbmco
dmFsdWVQb3NpdGlvbiwgbV9pdGVyYXRvci0+dmFsdWUoKS5lbmQoKSk7Ci0KLSAgICByZXR1cm4g
dHJ1ZTsKLX0KLQotY2xhc3MgSW5kZXhLZXlDdXJzb3JJbXBsIDogcHVibGljIEN1cnNvckltcGxD
b21tb24gewotcHVibGljOgotICAgIHN0YXRpYyBQYXNzUmVmUHRyPEluZGV4S2V5Q3Vyc29ySW1w
bD4gY3JlYXRlKExldmVsREJUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGNvbnN0IEN1cnNvck9w
dGlvbnMmIGN1cnNvck9wdGlvbnMpCi0gICAgewotICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3
IEluZGV4S2V5Q3Vyc29ySW1wbCh0cmFuc2FjdGlvbiwgY3Vyc29yT3B0aW9ucykpOwotICAgIH0K
LQotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4gY2xvbmUo
KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBJbmRleEtleUN1cnNvckltcGwo
dGhpcykpOwotICAgIH0KLQotICAgIC8vIEN1cnNvckltcGxDb21tb24KLSAgICB2aXJ0dWFsIFN0
cmluZyB2YWx1ZSgpIHsgQVNTRVJUX05PVF9SRUFDSEVEKCk7IHJldHVybiBTdHJpbmcoKTsgfQot
ICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJLZXk+IHByaW1hcnlLZXkoKSB7IHJldHVybiBtX3By
aW1hcnlLZXk7IH0KLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpPYmpl
Y3RTdG9yZVJlY29yZElkZW50aWZpZXI+IG9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllcigpIHsg
QVNTRVJUX05PVF9SRUFDSEVEKCk7IHJldHVybiAwOyB9Ci0gICAgdmlydHVhbCBib29sIGxvYWRD
dXJyZW50Um93KCk7Ci0KLXByaXZhdGU6Ci0gICAgSW5kZXhLZXlDdXJzb3JJbXBsKExldmVsREJU
cmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGNvbnN0IEN1cnNvck9wdGlvbnMmIGN1cnNvck9wdGlv
bnMpCi0gICAgICAgIDogQ3Vyc29ySW1wbENvbW1vbih0cmFuc2FjdGlvbiwgY3Vyc29yT3B0aW9u
cykKLSAgICB7Ci0gICAgfQotCi0gICAgSW5kZXhLZXlDdXJzb3JJbXBsKGNvbnN0IEluZGV4S2V5
Q3Vyc29ySW1wbCogb3RoZXIpCi0gICAgICAgIDogQ3Vyc29ySW1wbENvbW1vbihvdGhlcikKLSAg
ICAgICAgLCBtX3ByaW1hcnlLZXkob3RoZXItPm1fcHJpbWFyeUtleSkKLSAgICB7Ci0gICAgfQot
Ci0gICAgUmVmUHRyPElEQktleT4gbV9wcmltYXJ5S2V5OwotfTsKLQotYm9vbCBJbmRleEtleUN1
cnNvckltcGw6OmxvYWRDdXJyZW50Um93KCkKLXsKLSAgICBjb25zdCBjaGFyKiBrZXlQb3NpdGlv
biA9IG1faXRlcmF0b3ItPmtleSgpLmJlZ2luKCk7Ci0gICAgY29uc3QgY2hhcioga2V5TGltaXQg
PSBtX2l0ZXJhdG9yLT5rZXkoKS5lbmQoKTsKLQotICAgIEluZGV4RGF0YUtleSBpbmRleERhdGFL
ZXk7Ci0gICAga2V5UG9zaXRpb24gPSBJbmRleERhdGFLZXk6OmRlY29kZShrZXlQb3NpdGlvbiwg
a2V5TGltaXQsICZpbmRleERhdGFLZXkpOwotCi0gICAgbV9jdXJyZW50S2V5ID0gaW5kZXhEYXRh
S2V5LnVzZXJLZXkoKTsKLQotICAgIGludDY0X3QgaW5kZXhEYXRhVmVyc2lvbjsKLSAgICBjb25z
dCBjaGFyKiB2YWx1ZVBvc2l0aW9uID0gZGVjb2RlVmFySW50KG1faXRlcmF0b3ItPnZhbHVlKCku
YmVnaW4oKSwgbV9pdGVyYXRvci0+dmFsdWUoKS5lbmQoKSwgaW5kZXhEYXRhVmVyc2lvbik7Ci0g
ICAgaWYgKCF2YWx1ZVBvc2l0aW9uKSB7Ci0gICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxE
QkJhY2tpbmdTdG9yZVJlYWRFcnJvcik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0K
LSAgICB2YWx1ZVBvc2l0aW9uID0gZGVjb2RlSURCS2V5KHZhbHVlUG9zaXRpb24sIG1faXRlcmF0
b3ItPnZhbHVlKCkuZW5kKCksIG1fcHJpbWFyeUtleSk7Ci0gICAgaWYgKCF2YWx1ZVBvc2l0aW9u
KSB7Ci0gICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVJlYWRFcnJv
cik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBWZWN0b3I8Y2hhcj4gcHJp
bWFyeUxldmVsREJLZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShpbmRleERhdGFLZXku
ZGF0YWJhc2VJZCgpLCBpbmRleERhdGFLZXkub2JqZWN0U3RvcmVJZCgpLCAqbV9wcmltYXJ5S2V5
KTsKLQotICAgIFZlY3RvcjxjaGFyPiByZXN1bHQ7Ci0gICAgaWYgKCFtX3RyYW5zYWN0aW9uLT5n
ZXQocHJpbWFyeUxldmVsREJLZXksIHJlc3VsdCkpIHsKLSAgICAgICAgbV90cmFuc2FjdGlvbi0+
cmVtb3ZlKG1faXRlcmF0b3ItPmtleSgpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0K
LQotICAgIGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhVmVyc2lvbjsKLSAgICBjb25zdCBjaGFyKiB0
ID0gZGVjb2RlVmFySW50KHJlc3VsdC5iZWdpbigpLCByZXN1bHQuZW5kKCksIG9iamVjdFN0b3Jl
RGF0YVZlcnNpb24pOwotICAgIGlmICghdCkgewotICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxl
dmVsREJCYWNraW5nU3RvcmVSZWFkRXJyb3IpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
fQotCi0gICAgaWYgKG9iamVjdFN0b3JlRGF0YVZlcnNpb24gIT0gaW5kZXhEYXRhVmVyc2lvbikg
ewotICAgICAgICBtX3RyYW5zYWN0aW9uLT5yZW1vdmUobV9pdGVyYXRvci0+a2V5KCkpOwotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWNsYXNz
IEluZGV4Q3Vyc29ySW1wbCA6IHB1YmxpYyBDdXJzb3JJbXBsQ29tbW9uIHsKLXB1YmxpYzoKLSAg
ICBzdGF0aWMgUGFzc1JlZlB0cjxJbmRleEN1cnNvckltcGw+IGNyZWF0ZShMZXZlbERCVHJhbnNh
Y3Rpb24qIHRyYW5zYWN0aW9uLCBjb25zdCBDdXJzb3JPcHRpb25zJiBjdXJzb3JPcHRpb25zKQot
ICAgIHsKLSAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBJbmRleEN1cnNvckltcGwodHJhbnNh
Y3Rpb24sIGN1cnNvck9wdGlvbnMpKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8
SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IGNsb25lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBh
ZG9wdFJlZihuZXcgSW5kZXhDdXJzb3JJbXBsKHRoaXMpKTsKLSAgICB9Ci0KLSAgICAvLyBDdXJz
b3JJbXBsQ29tbW9uCi0gICAgdmlydHVhbCBTdHJpbmcgdmFsdWUoKSB7IHJldHVybiBtX3ZhbHVl
OyB9Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQktleT4gcHJpbWFyeUtleSgpIHsgcmV0dXJu
IG1fcHJpbWFyeUtleTsgfQotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6
Ok9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllcj4gb2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVy
KCkgeyBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgcmV0dXJuIDA7IH0KLSAgICBib29sIGxvYWRDdXJy
ZW50Um93KCk7Ci0KLXByaXZhdGU6Ci0gICAgSW5kZXhDdXJzb3JJbXBsKExldmVsREJUcmFuc2Fj
dGlvbiogdHJhbnNhY3Rpb24sIGNvbnN0IEN1cnNvck9wdGlvbnMmIGN1cnNvck9wdGlvbnMpCi0g
ICAgICAgIDogQ3Vyc29ySW1wbENvbW1vbih0cmFuc2FjdGlvbiwgY3Vyc29yT3B0aW9ucykKLSAg
ICB7Ci0gICAgfQotCi0gICAgSW5kZXhDdXJzb3JJbXBsKGNvbnN0IEluZGV4Q3Vyc29ySW1wbCog
b3RoZXIpCi0gICAgICAgIDogQ3Vyc29ySW1wbENvbW1vbihvdGhlcikKLSAgICAgICAgLCBtX3By
aW1hcnlLZXkob3RoZXItPm1fcHJpbWFyeUtleSkKLSAgICAgICAgLCBtX3ZhbHVlKG90aGVyLT5t
X3ZhbHVlKQotICAgICAgICAsIG1fcHJpbWFyeUxldmVsREJLZXkob3RoZXItPm1fcHJpbWFyeUxl
dmVsREJLZXkpCi0gICAgewotICAgIH0KLQotICAgIFJlZlB0cjxJREJLZXk+IG1fcHJpbWFyeUtl
eTsKLSAgICBTdHJpbmcgbV92YWx1ZTsKLSAgICBWZWN0b3I8Y2hhcj4gbV9wcmltYXJ5TGV2ZWxE
QktleTsKLX07Ci0KLWJvb2wgSW5kZXhDdXJzb3JJbXBsOjpsb2FkQ3VycmVudFJvdygpCi17Ci0g
ICAgY29uc3QgY2hhcioga2V5UG9zaXRpb24gPSBtX2l0ZXJhdG9yLT5rZXkoKS5iZWdpbigpOwot
ICAgIGNvbnN0IGNoYXIqIGtleUxpbWl0ID0gbV9pdGVyYXRvci0+a2V5KCkuZW5kKCk7Ci0KLSAg
ICBJbmRleERhdGFLZXkgaW5kZXhEYXRhS2V5OwotICAgIGtleVBvc2l0aW9uID0gSW5kZXhEYXRh
S2V5OjpkZWNvZGUoa2V5UG9zaXRpb24sIGtleUxpbWl0LCAmaW5kZXhEYXRhS2V5KTsKLQotICAg
IG1fY3VycmVudEtleSA9IGluZGV4RGF0YUtleS51c2VyS2V5KCk7Ci0KLSAgICBjb25zdCBjaGFy
KiB2YWx1ZVBvc2l0aW9uID0gbV9pdGVyYXRvci0+dmFsdWUoKS5iZWdpbigpOwotICAgIGNvbnN0
IGNoYXIqIHZhbHVlTGltaXQgPSBtX2l0ZXJhdG9yLT52YWx1ZSgpLmVuZCgpOwotCi0gICAgaW50
NjRfdCBpbmRleERhdGFWZXJzaW9uOwotICAgIHZhbHVlUG9zaXRpb24gPSBkZWNvZGVWYXJJbnQo
dmFsdWVQb3NpdGlvbiwgdmFsdWVMaW1pdCwgaW5kZXhEYXRhVmVyc2lvbik7Ci0gICAgaWYgKCF2
YWx1ZVBvc2l0aW9uKSB7Ci0gICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdT
dG9yZVJlYWRFcnJvcik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgdmFsdWVQ
b3NpdGlvbiA9IGRlY29kZUlEQktleSh2YWx1ZVBvc2l0aW9uLCB2YWx1ZUxpbWl0LCBtX3ByaW1h
cnlLZXkpOwotICAgIGlmICghdmFsdWVQb3NpdGlvbikgewotICAgICAgICBJbnRlcm5hbEVycm9y
KElEQkxldmVsREJCYWNraW5nU3RvcmVSZWFkRXJyb3IpOwotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgfQotCi0gICAgbV9wcmltYXJ5TGV2ZWxEQktleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6
ZW5jb2RlKGluZGV4RGF0YUtleS5kYXRhYmFzZUlkKCksIGluZGV4RGF0YUtleS5vYmplY3RTdG9y
ZUlkKCksICptX3ByaW1hcnlLZXkpOwotCi0gICAgVmVjdG9yPGNoYXI+IHJlc3VsdDsKLSAgICBp
ZiAoIW1fdHJhbnNhY3Rpb24tPmdldChtX3ByaW1hcnlMZXZlbERCS2V5LCByZXN1bHQpKSB7Ci0g
ICAgICAgIG1fdHJhbnNhY3Rpb24tPnJlbW92ZShtX2l0ZXJhdG9yLT5rZXkoKSk7Ci0gICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IG9iamVjdFN0b3JlRGF0YVZlcnNp
b247Ci0gICAgY29uc3QgY2hhciogdCA9IGRlY29kZVZhckludChyZXN1bHQuYmVnaW4oKSwgcmVz
dWx0LmVuZCgpLCBvYmplY3RTdG9yZURhdGFWZXJzaW9uKTsKLSAgICBpZiAoIXQpIHsKLSAgICAg
ICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlUmVhZEVycm9yKTsKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmIChvYmplY3RTdG9yZURhdGFWZXJzaW9u
ICE9IGluZGV4RGF0YVZlcnNpb24pIHsKLSAgICAgICAgbV90cmFuc2FjdGlvbi0+cmVtb3ZlKG1f
aXRlcmF0b3ItPmtleSgpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIG1f
dmFsdWUgPSBkZWNvZGVTdHJpbmcodCwgcmVzdWx0LmVuZCgpKTsKLSAgICByZXR1cm4gdHJ1ZTsK
LX0KLQotYm9vbCBvYmplY3RTdG9yZUN1cnNvck9wdGlvbnMoTGV2ZWxEQlRyYW5zYWN0aW9uKiB0
cmFuc2FjdGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNv
bnN0IElEQktleVJhbmdlKiByYW5nZSwgSURCQ3Vyc29yOjpEaXJlY3Rpb24gZGlyZWN0aW9uLCBD
dXJzb3JPcHRpb25zJiBjdXJzb3JPcHRpb25zKQotewotICAgIGJvb2wgbG93ZXJCb3VuZCA9IHJh
bmdlICYmIHJhbmdlLT5sb3dlcigpOwotICAgIGJvb2wgdXBwZXJCb3VuZCA9IHJhbmdlICYmIHJh
bmdlLT51cHBlcigpOwotICAgIGN1cnNvck9wdGlvbnMuZm9yd2FyZCA9IChkaXJlY3Rpb24gPT0g
SURCQ3Vyc29yOjpORVhUX05PX0RVUExJQ0FURSB8fCBkaXJlY3Rpb24gPT0gSURCQ3Vyc29yOjpO
RVhUKTsKLSAgICBjdXJzb3JPcHRpb25zLnVuaXF1ZSA9IChkaXJlY3Rpb24gPT0gSURCQ3Vyc29y
OjpORVhUX05PX0RVUExJQ0FURSB8fCBkaXJlY3Rpb24gPT0gSURCQ3Vyc29yOjpQUkVWX05PX0RV
UExJQ0FURSk7Ci0KLSAgICBpZiAoIWxvd2VyQm91bmQpIHsKLSAgICAgICAgY3Vyc29yT3B0aW9u
cy5sb3dLZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RT
dG9yZUlkLCBtaW5JREJLZXkoKSk7Ci0gICAgICAgIGN1cnNvck9wdGlvbnMubG93T3BlbiA9IHRy
dWU7IC8vIE5vdCBpbmNsdWRlZC4KLSAgICB9IGVsc2UgewotICAgICAgICBjdXJzb3JPcHRpb25z
Lmxvd0tleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0
b3JlSWQsICpyYW5nZS0+bG93ZXIoKSk7Ci0gICAgICAgIGN1cnNvck9wdGlvbnMubG93T3BlbiA9
IHJhbmdlLT5sb3dlck9wZW4oKTsKLSAgICB9Ci0KLSAgICBpZiAoIXVwcGVyQm91bmQpIHsKLSAg
ICAgICAgY3Vyc29yT3B0aW9ucy5oaWdoS2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUo
ZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgbWF4SURCS2V5KCkpOwotCi0gICAgICAgIGlmIChj
dXJzb3JPcHRpb25zLmZvcndhcmQpCi0gICAgICAgICAgICBjdXJzb3JPcHRpb25zLmhpZ2hPcGVu
ID0gdHJ1ZTsgLy8gTm90IGluY2x1ZGVkLgotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8v
IFdlIG5lZWQgYSBrZXkgdGhhdCBleGlzdHMuCi0gICAgICAgICAgICBpZiAoIWZpbmRHcmVhdGVz
dEtleUxlc3NUaGFuT3JFcXVhbCh0cmFuc2FjdGlvbiwgY3Vyc29yT3B0aW9ucy5oaWdoS2V5LCBj
dXJzb3JPcHRpb25zLmhpZ2hLZXkpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICAgICAgICAgIGN1cnNvck9wdGlvbnMuaGlnaE9wZW4gPSBmYWxzZTsKLSAgICAgICAgfQotICAg
IH0gZWxzZSB7Ci0gICAgICAgIGN1cnNvck9wdGlvbnMuaGlnaEtleSA9IE9iamVjdFN0b3JlRGF0
YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsICpyYW5nZS0+dXBwZXIoKSk7
Ci0gICAgICAgIGN1cnNvck9wdGlvbnMuaGlnaE9wZW4gPSByYW5nZS0+dXBwZXJPcGVuKCk7Ci0K
LSAgICAgICAgaWYgKCFjdXJzb3JPcHRpb25zLmZvcndhcmQpIHsKLSAgICAgICAgICAgIC8vIEZv
ciByZXZlcnNlIGN1cnNvcnMsIHdlIG5lZWQgYSBrZXkgdGhhdCBleGlzdHMuCi0gICAgICAgICAg
ICBWZWN0b3I8Y2hhcj4gZm91bmRIaWdoS2V5OwotICAgICAgICAgICAgaWYgKCFmaW5kR3JlYXRl
c3RLZXlMZXNzVGhhbk9yRXF1YWwodHJhbnNhY3Rpb24sIGN1cnNvck9wdGlvbnMuaGlnaEtleSwg
Zm91bmRIaWdoS2V5KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAg
ICAgIC8vIElmIHRoZSB0YXJnZXQga2V5IHNob3VsZCBub3QgYmUgaW5jbHVkZWQsIGJ1dCB3ZSBl
bmQgdXAgd2l0aCBhIHNtYWxsZXIga2V5LCB3ZSBzaG91bGQgaW5jbHVkZSB0aGF0LgotICAgICAg
ICAgICAgaWYgKGN1cnNvck9wdGlvbnMuaGlnaE9wZW4gJiYgY29tcGFyZUluZGV4S2V5cyhmb3Vu
ZEhpZ2hLZXksIGN1cnNvck9wdGlvbnMuaGlnaEtleSkgPCAwKQotICAgICAgICAgICAgICAgIGN1
cnNvck9wdGlvbnMuaGlnaE9wZW4gPSBmYWxzZTsKLQotICAgICAgICAgICAgY3Vyc29yT3B0aW9u
cy5oaWdoS2V5ID0gZm91bmRIaWdoS2V5OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJu
IHRydWU7Ci19Ci0KLWJvb2wgaW5kZXhDdXJzb3JPcHRpb25zKExldmVsREJUcmFuc2FjdGlvbiog
dHJhbnNhY3Rpb24sIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBp
bnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleVJhbmdlKiByYW5nZSwgSURCQ3Vyc29yOjpEaXJl
Y3Rpb24gZGlyZWN0aW9uLCBDdXJzb3JPcHRpb25zJiBjdXJzb3JPcHRpb25zKQotewotICAgIEFT
U0VSVCh0cmFuc2FjdGlvbik7Ci0gICAgYm9vbCBsb3dlckJvdW5kID0gcmFuZ2UgJiYgcmFuZ2Ut
Pmxvd2VyKCk7Ci0gICAgYm9vbCB1cHBlckJvdW5kID0gcmFuZ2UgJiYgcmFuZ2UtPnVwcGVyKCk7
Ci0gICAgY3Vyc29yT3B0aW9ucy5mb3J3YXJkID0gKGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5F
WFRfTk9fRFVQTElDQVRFIHx8IGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFQpOwotICAgIGN1
cnNvck9wdGlvbnMudW5pcXVlID0gKGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFRfTk9fRFVQ
TElDQVRFIHx8IGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6OlBSRVZfTk9fRFVQTElDQVRFKTsKLQot
ICAgIGlmICghbG93ZXJCb3VuZCkgewotICAgICAgICBjdXJzb3JPcHRpb25zLmxvd0tleSA9IElu
ZGV4RGF0YUtleTo6ZW5jb2RlTWluS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4
SWQpOwotICAgICAgICBjdXJzb3JPcHRpb25zLmxvd09wZW4gPSBmYWxzZTsgLy8gSW5jbHVkZWQu
Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY3Vyc29yT3B0aW9ucy5sb3dLZXkgPSBJbmRleERhdGFL
ZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCAqcmFuZ2UtPmxv
d2VyKCkpOwotICAgICAgICBjdXJzb3JPcHRpb25zLmxvd09wZW4gPSByYW5nZS0+bG93ZXJPcGVu
KCk7Ci0gICAgfQotCi0gICAgaWYgKCF1cHBlckJvdW5kKSB7Ci0gICAgICAgIGN1cnNvck9wdGlv
bnMuaGlnaEtleSA9IEluZGV4RGF0YUtleTo6ZW5jb2RlTWF4S2V5KGRhdGFiYXNlSWQsIG9iamVj
dFN0b3JlSWQsIGluZGV4SWQpOwotICAgICAgICBjdXJzb3JPcHRpb25zLmhpZ2hPcGVuID0gZmFs
c2U7IC8vIEluY2x1ZGVkLgotCi0gICAgICAgIGlmICghY3Vyc29yT3B0aW9ucy5mb3J3YXJkKSB7
IC8vIFdlIG5lZWQgYSBrZXkgdGhhdCBleGlzdHMuCi0gICAgICAgICAgICBpZiAoIWZpbmRHcmVh
dGVzdEtleUxlc3NUaGFuT3JFcXVhbCh0cmFuc2FjdGlvbiwgY3Vyc29yT3B0aW9ucy5oaWdoS2V5
LCBjdXJzb3JPcHRpb25zLmhpZ2hLZXkpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICAgICAgICAgIGN1cnNvck9wdGlvbnMuaGlnaE9wZW4gPSBmYWxzZTsKLSAgICAgICAgfQot
ICAgIH0gZWxzZSB7Ci0gICAgICAgIGN1cnNvck9wdGlvbnMuaGlnaEtleSA9IEluZGV4RGF0YUtl
eTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsICpyYW5nZS0+dXBw
ZXIoKSk7Ci0gICAgICAgIGN1cnNvck9wdGlvbnMuaGlnaE9wZW4gPSByYW5nZS0+dXBwZXJPcGVu
KCk7Ci0KLSAgICAgICAgVmVjdG9yPGNoYXI+IGZvdW5kSGlnaEtleTsKLSAgICAgICAgaWYgKCFm
aW5kR3JlYXRlc3RLZXlMZXNzVGhhbk9yRXF1YWwodHJhbnNhY3Rpb24sIGN1cnNvck9wdGlvbnMu
aGlnaEtleSwgZm91bmRIaWdoS2V5KSkgLy8gU2VlayB0byB0aGUgKmxhc3QqIGtleSBpbiB0aGUg
c2V0IG9mIG5vbi11bmlxdWUga2V5cy4KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAg
ICAgICAvLyBJZiB0aGUgdGFyZ2V0IGtleSBzaG91bGQgbm90IGJlIGluY2x1ZGVkLCBidXQgd2Ug
ZW5kIHVwIHdpdGggYSBzbWFsbGVyIGtleSwgd2Ugc2hvdWxkIGluY2x1ZGUgdGhhdC4KLSAgICAg
ICAgaWYgKGN1cnNvck9wdGlvbnMuaGlnaE9wZW4gJiYgY29tcGFyZUluZGV4S2V5cyhmb3VuZEhp
Z2hLZXksIGN1cnNvck9wdGlvbnMuaGlnaEtleSkgPCAwKQotICAgICAgICAgICAgY3Vyc29yT3B0
aW9ucy5oaWdoT3BlbiA9IGZhbHNlOwotCi0gICAgICAgIGN1cnNvck9wdGlvbnMuaGlnaEtleSA9
IGZvdW5kSGlnaEtleTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotfQotCi1QYXNz
UmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yPiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpv
cGVuT2JqZWN0U3RvcmVDdXJzb3IoSURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbiogdHJhbnNh
Y3Rpb24sIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJ
REJLZXlSYW5nZSogcmFuZ2UsIElEQkN1cnNvcjo6RGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLSAg
ICBJREJfVFJBQ0UoIklEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5PYmplY3RTdG9yZUN1cnNv
ciIpOwotICAgIExldmVsREJUcmFuc2FjdGlvbiogbGV2ZWxEQlRyYW5zYWN0aW9uID0gVHJhbnNh
Y3Rpb246OmxldmVsREJUcmFuc2FjdGlvbkZyb20odHJhbnNhY3Rpb24pOwotICAgIEN1cnNvck9w
dGlvbnMgY3Vyc29yT3B0aW9uczsKLSAgICBpZiAoIW9iamVjdFN0b3JlQ3Vyc29yT3B0aW9ucyhs
ZXZlbERCVHJhbnNhY3Rpb24sIGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIHJhbmdlLCBkaXJl
Y3Rpb24sIGN1cnNvck9wdGlvbnMpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBSZWZQdHI8T2Jq
ZWN0U3RvcmVDdXJzb3JJbXBsPiBjdXJzb3IgPSBPYmplY3RTdG9yZUN1cnNvckltcGw6OmNyZWF0
ZShsZXZlbERCVHJhbnNhY3Rpb24sIGN1cnNvck9wdGlvbnMpOwotICAgIGlmICghY3Vyc29yLT5m
aXJzdFNlZWsoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gY3Vyc29yLnJlbGVh
c2UoKTsKLX0KLQotUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4gSURCTGV2ZWxE
QkJhY2tpbmdTdG9yZTo6b3Blbk9iamVjdFN0b3JlS2V5Q3Vyc29yKElEQkJhY2tpbmdTdG9yZTo6
VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2Jq
ZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5UmFuZ2UqIHJhbmdlLCBJREJDdXJzb3I6OkRpcmVjdGlv
biBkaXJlY3Rpb24pCi17Ci0gICAgSURCX1RSQUNFKCJJREJMZXZlbERCQmFja2luZ1N0b3JlOjpv
cGVuT2JqZWN0U3RvcmVLZXlDdXJzb3IiKTsKLSAgICBMZXZlbERCVHJhbnNhY3Rpb24qIGxldmVs
REJUcmFuc2FjdGlvbiA9IFRyYW5zYWN0aW9uOjpsZXZlbERCVHJhbnNhY3Rpb25Gcm9tKHRyYW5z
YWN0aW9uKTsKLSAgICBDdXJzb3JPcHRpb25zIGN1cnNvck9wdGlvbnM7Ci0gICAgaWYgKCFvYmpl
Y3RTdG9yZUN1cnNvck9wdGlvbnMobGV2ZWxEQlRyYW5zYWN0aW9uLCBkYXRhYmFzZUlkLCBvYmpl
Y3RTdG9yZUlkLCByYW5nZSwgZGlyZWN0aW9uLCBjdXJzb3JPcHRpb25zKSkKLSAgICAgICAgcmV0
dXJuIDA7Ci0gICAgUmVmUHRyPE9iamVjdFN0b3JlS2V5Q3Vyc29ySW1wbD4gY3Vyc29yID0gT2Jq
ZWN0U3RvcmVLZXlDdXJzb3JJbXBsOjpjcmVhdGUobGV2ZWxEQlRyYW5zYWN0aW9uLCBjdXJzb3JP
cHRpb25zKTsKLSAgICBpZiAoIWN1cnNvci0+Zmlyc3RTZWVrKCkpCi0gICAgICAgIHJldHVybiAw
OwotCi0gICAgcmV0dXJuIGN1cnNvci5yZWxlYXNlKCk7Ci19Ci0KLVBhc3NSZWZQdHI8SURCQmFj
a2luZ1N0b3JlOjpDdXJzb3I+IElEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5JbmRleEtleUN1
cnNvcihJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgaW50NjRfdCBk
YXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3Qg
SURCS2V5UmFuZ2UqIHJhbmdlLCBJREJDdXJzb3I6OkRpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0g
ICAgSURCX1RSQUNFKCJJREJMZXZlbERCQmFja2luZ1N0b3JlOjpvcGVuSW5kZXhLZXlDdXJzb3Ii
KTsKLSAgICBMZXZlbERCVHJhbnNhY3Rpb24qIGxldmVsREJUcmFuc2FjdGlvbiA9IFRyYW5zYWN0
aW9uOjpsZXZlbERCVHJhbnNhY3Rpb25Gcm9tKHRyYW5zYWN0aW9uKTsKLSAgICBDdXJzb3JPcHRp
b25zIGN1cnNvck9wdGlvbnM7Ci0gICAgaWYgKCFpbmRleEN1cnNvck9wdGlvbnMobGV2ZWxEQlRy
YW5zYWN0aW9uLCBkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCByYW5nZSwgZGly
ZWN0aW9uLCBjdXJzb3JPcHRpb25zKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgUmVmUHRyPElu
ZGV4S2V5Q3Vyc29ySW1wbD4gY3Vyc29yID0gSW5kZXhLZXlDdXJzb3JJbXBsOjpjcmVhdGUobGV2
ZWxEQlRyYW5zYWN0aW9uLCBjdXJzb3JPcHRpb25zKTsKLSAgICBpZiAoIWN1cnNvci0+Zmlyc3RT
ZWVrKCkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIGN1cnNvci5yZWxlYXNlKCk7
Ci19Ci0KLVBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IElEQkxldmVsREJCYWNr
aW5nU3RvcmU6Om9wZW5JbmRleEN1cnNvcihJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uKiB0
cmFuc2FjdGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGlu
dDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5UmFuZ2UqIHJhbmdlLCBJREJDdXJzb3I6OkRpcmVj
dGlvbiBkaXJlY3Rpb24pCi17Ci0gICAgSURCX1RSQUNFKCJJREJMZXZlbERCQmFja2luZ1N0b3Jl
OjpvcGVuSW5kZXhDdXJzb3IiKTsKLSAgICBMZXZlbERCVHJhbnNhY3Rpb24qIGxldmVsREJUcmFu
c2FjdGlvbiA9IFRyYW5zYWN0aW9uOjpsZXZlbERCVHJhbnNhY3Rpb25Gcm9tKHRyYW5zYWN0aW9u
KTsKLSAgICBDdXJzb3JPcHRpb25zIGN1cnNvck9wdGlvbnM7Ci0gICAgaWYgKCFpbmRleEN1cnNv
ck9wdGlvbnMobGV2ZWxEQlRyYW5zYWN0aW9uLCBkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBp
bmRleElkLCByYW5nZSwgZGlyZWN0aW9uLCBjdXJzb3JPcHRpb25zKSkKLSAgICAgICAgcmV0dXJu
IDA7Ci0gICAgUmVmUHRyPEluZGV4Q3Vyc29ySW1wbD4gY3Vyc29yID0gSW5kZXhDdXJzb3JJbXBs
OjpjcmVhdGUobGV2ZWxEQlRyYW5zYWN0aW9uLCBjdXJzb3JPcHRpb25zKTsKLSAgICBpZiAoIWN1
cnNvci0+Zmlyc3RTZWVrKCkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIGN1cnNv
ci5yZWxlYXNlKCk7Ci19Ci0KLVBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlv
bj4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Y3JlYXRlVHJhbnNhY3Rpb24oKQotewotICAgIHJl
dHVybiBUcmFuc2FjdGlvbjo6Y3JlYXRlKHRoaXMpOwotfQotCi1QYXNzUmVmUHRyPElEQkxldmVs
REJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uPiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpUcmFu
c2FjdGlvbjo6Y3JlYXRlKElEQkxldmVsREJCYWNraW5nU3RvcmUqIGJhY2tpbmdTdG9yZSkKLXsK
LSAgICByZXR1cm4gYWRvcHRSZWYobmV3IFRyYW5zYWN0aW9uKGJhY2tpbmdTdG9yZSkpOwotfQot
Ci1JREJMZXZlbERCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbjo6VHJhbnNhY3Rpb24oSURCTGV2
ZWxEQkJhY2tpbmdTdG9yZSogYmFja2luZ1N0b3JlKQotICAgIDogbV9iYWNraW5nU3RvcmUoYmFj
a2luZ1N0b3JlKQotewotfQotCi12b2lkIElEQkxldmVsREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0
aW9uOjpiZWdpbigpCi17Ci0gICAgSURCX1RSQUNFKCJJREJMZXZlbERCQmFja2luZ1N0b3JlOjpU
cmFuc2FjdGlvbjo6YmVnaW4iKTsKLSAgICBBU1NFUlQoIW1fdHJhbnNhY3Rpb24pOwotICAgIG1f
dHJhbnNhY3Rpb24gPSBMZXZlbERCVHJhbnNhY3Rpb246OmNyZWF0ZShtX2JhY2tpbmdTdG9yZS0+
bV9kYi5nZXQoKSk7Ci19Ci0KLWJvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rp
b246OmNvbW1pdCgpCi17Ci0gICAgSURCX1RSQUNFKCJJREJMZXZlbERCQmFja2luZ1N0b3JlOjpU
cmFuc2FjdGlvbjo6Y29tbWl0Iik7Ci0gICAgQVNTRVJUKG1fdHJhbnNhY3Rpb24pOwotICAgIGJv
b2wgcmVzdWx0ID0gbV90cmFuc2FjdGlvbi0+Y29tbWl0KCk7Ci0gICAgbV90cmFuc2FjdGlvbi5j
bGVhcigpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgSURCTGV2ZWxEQkJhY2tpbmdT
dG9yZTo6VHJhbnNhY3Rpb246OnJvbGxiYWNrKCkKLXsKLSAgICBJREJfVFJBQ0UoIklEQkxldmVs
REJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uOjpyb2xsYmFjayIpOwotICAgIEFTU0VSVChtX3Ry
YW5zYWN0aW9uKTsKLSAgICBtX3RyYW5zYWN0aW9uLT5yb2xsYmFjaygpOwotICAgIG1fdHJhbnNh
Y3Rpb24uY2xlYXIoKTsKLX0KLQotYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpiYWNraW5n
U3RvcmVFeGlzdHMoU2VjdXJpdHlPcmlnaW4qIHNlY3VyaXR5T3JpZ2luLCBjb25zdCBTdHJpbmcm
LCBjb25zdCBTdHJpbmcmIHBhdGhCYXNlQXJnKQotewotICAgIFN0cmluZyBwYXRoQmFzZSA9IHBh
dGhCYXNlQXJnOwotCi0gICAgaWYgKHBhdGhCYXNlLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotCi0gICAgLy8gRklYTUU6IFdlIHNob3VsZCBldmVudHVhbGx5IHVzZSB0aGUgc2Ft
ZSBMZXZlbERCIGRhdGFiYXNlIGZvciBhbGwgb3JpZ2lucy4KLSAgICBTdHJpbmcgcGF0aCA9IHBh
dGhCeUFwcGVuZGluZ0NvbXBvbmVudChwYXRoQmFzZSwgc2VjdXJpdHlPcmlnaW4tPmRhdGFiYXNl
SWRlbnRpZmllcigpICsgIi5pbmRleGVkZGIubGV2ZWxkYiIpOwotCi0gICAgLy8gRklYTUU6IHRo
aXMgaXMgY2hlY2tpbmcgZm9yIHByZXNlbmNlIG9mIHRoZSBkb21haW4sIG5vdCB0aGUgZGF0YWJh
c2UgaXRzZWxmCi0gICAgcmV0dXJuIGZpbGVFeGlzdHMocGF0aCsiL0NVUlJFTlQiKTsKLX0KLQot
fSAvLyBuYW1lc3BhY2UgV2ViQ29yZQotCi0jZW5kaWYgLy8gVVNFKExFVkVMREIpCi0jZW5kaWYg
Ly8gRU5BQkxFKElOREVYRURfREFUQUJBU0UpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9X
ZWJDb3JlLmd5cGkgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkKaW5kZXggY2I0MjQyNjE4
MzA2M2U0Yzg5NTRiOGFmOGQ2YzY4YzEyOTY0ZWRlNy4uMTFjMzI3NzJiNWIwYzI0NTZhZjlkM2Fl
YmQ0ZGU0OTc5M2EzYjc4NCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBp
CisrKyBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQpAQCAtMTU0MCw4ICsxNTQwLDcgQEAK
ICAgICAgICAgICAgICdNb2R1bGVzL2luZGV4ZWRkYi9JREJLZXlSYW5nZS5oJywKICAgICAgICAg
ICAgICdNb2R1bGVzL2luZGV4ZWRkYi9JREJMZXZlbERCQ29kaW5nLmNwcCcsCiAgICAgICAgICAg
ICAnTW9kdWxlcy9pbmRleGVkZGIvSURCTGV2ZWxEQkNvZGluZy5oJywKLSAgICAgICAgICAgICdN
b2R1bGVzL2luZGV4ZWRkYi9JREJMZXZlbERCQmFja2luZ1N0b3JlLmNwcCcsCi0gICAgICAgICAg
ICAnTW9kdWxlcy9pbmRleGVkZGIvSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5oJywKKyAgICAgICAg
ICAgICdNb2R1bGVzL2luZGV4ZWRkYi9JREJCYWNraW5nU3RvcmUuY3BwJywKICAgICAgICAgICAg
ICdNb2R1bGVzL2luZGV4ZWRkYi9JREJNZXRhZGF0YS5oJywKICAgICAgICAgICAgICdNb2R1bGVz
L2luZGV4ZWRkYi9JREJPYmplY3RTdG9yZS5jcHAnLAogICAgICAgICAgICAgJ01vZHVsZXMvaW5k
ZXhlZGRiL0lEQk9iamVjdFN0b3JlLmgnLApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvV2Vi
Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54
Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCmluZGV4IDdlYmIyNjU0YjliODZjZjM1ZTEwYTllNDk1
NjhkOThhODc5YmRiZjIuLjVhY2I3Mzk5NDZlNWVmZDVmMDdkMGMxOTFlZWZiMjdlZTVjNzI4MGYg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4
cHJvagorKysgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHBy
b2oKQEAgLTM0NzQsNyArMzQ3NCw3IEBACiAJCTk3MTJBNURGMTUwMDRFREEwMDQ4QUYxMCAvKiBJ
REJLZXlQYXRoLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSA5NzEyQTU4NjE1MDA0RURBMDA0OEFGMTAgLyogSURCS2V5UGF0aC5oICovOyB9OwogCQk5NzEy
QTVFMjE1MDA0RURBMDA0OEFGMTAgLyogSURCS2V5UmFuZ2UuY3BwIGluIFNvdXJjZXMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOTcxMkE1ODkxNTAwNEVEQTAwNDhBRjEwIC8q
IElEQktleVJhbmdlLmNwcCAqLzsgfTsKIAkJOTcxMkE1RTMxNTAwNEVEQTAwNDhBRjEwIC8qIElE
QktleVJhbmdlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSA5NzEyQTU4QTE1MDA0RURBMDA0OEFGMTAgLyogSURCS2V5UmFuZ2UuaCAqLzsgfTsKLQkJOTcx
MkE1RTUxNTAwNEVEQTAwNDhBRjEwIC8qIElEQkxldmVsREJCYWNraW5nU3RvcmUuY3BwIGluIFNv
dXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOTcxMkE1OEMxNTAwNEVE
QTAwNDhBRjEwIC8qIElEQkxldmVsREJCYWNraW5nU3RvcmUuY3BwICovOyB9OworCQk5NzEyQTVF
NTE1MDA0RURBMDA0OEFGMTAgLyogSURCQmFja2luZ1N0b3JlLmNwcCBpbiBTb3VyY2VzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDk3MTJBNThDMTUwMDRFREEwMDQ4QUYxMCAv
KiBJREJCYWNraW5nU3RvcmUuY3BwICovOyB9OwogCQk5NzEyQTVFNjE1MDA0RURBMDA0OEFGMTAg
LyogSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gOTcxMkE1OEQxNTAwNEVEQTAwNDhBRjEwIC8qIElEQkxldmVsREJC
YWNraW5nU3RvcmUuaCAqLzsgfTsKIAkJOTcxMkE1RTcxNTAwNEVEQTAwNDhBRjEwIC8qIElEQkxl
dmVsREJDb2RpbmcuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gOTcxMkE1OEUxNTAwNEVEQTAwNDhBRjEwIC8qIElEQkxldmVsREJDb2RpbmcuY3BwICov
OyB9OwogCQk5NzEyQTVFODE1MDA0RURBMDA0OEFGMTAgLyogSURCTGV2ZWxEQkNvZGluZy5oIGlu
IEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOTcxMkE1OEYxNTAw
NEVEQTAwNDhBRjEwIC8qIElEQkxldmVsREJDb2RpbmcuaCAqLzsgfTsKQEAgLTEwNzA0LDggKzEw
NzA0LDggQEAKIAkJOTcxMkE1ODkxNTAwNEVEQTAwNDhBRjEwIC8qIElEQktleVJhbmdlLmNwcCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IElEQktleVJhbmdlLmNwcDsgcGF0
aCA9IE1vZHVsZXMvaW5kZXhlZGRiL0lEQktleVJhbmdlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsgfTsKIAkJOTcxMkE1OEExNTAwNEVEQTAwNDhBRjEwIC8qIElEQktleVJhbmdlLmggKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IElEQktleVJhbmdlLmg7IHBhdGggPSBNb2R1
bGVzL2luZGV4ZWRkYi9JREJLZXlSYW5nZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9Owog
CQk5NzEyQTU4QjE1MDA0RURBMDA0OEFGMTAgLyogSURCS2V5UmFuZ2UuaWRsICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0g
dGV4dDsgbmFtZSA9IElEQktleVJhbmdlLmlkbDsgcGF0aCA9IE1vZHVsZXMvaW5kZXhlZGRiL0lE
QktleVJhbmdlLmlkbDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKLQkJOTcxMkE1OEMxNTAw
NEVEQTAwNDhBRjEwIC8qIElEQkxldmVsREJCYWNraW5nU3RvcmUuY3BwICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jcHAuY3BwOyBuYW1lID0gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5jcHA7IHBhdGgg
PSBNb2R1bGVzL2luZGV4ZWRkYi9JREJMZXZlbERCQmFja2luZ1N0b3JlLmNwcDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKLQkJOTcxMkE1OEQxNTAwNEVEQTAwNDhBRjEwIC8qIElEQkxldmVs
REJCYWNraW5nU3RvcmUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gSURCTGV2
ZWxEQkJhY2tpbmdTdG9yZS5oOyBwYXRoID0gTW9kdWxlcy9pbmRleGVkZGIvSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk5NzEyQTU4QzE1MDA0
RURBMDA0OEFGMTAgLyogSURCQmFja2luZ1N0b3JlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Y3BwLmNwcDsgbmFtZSA9IElEQkJhY2tpbmdTdG9yZS5jcHA7IHBhdGggPSBNb2R1bGVzL2luZGV4
ZWRkYi9JREJCYWNraW5nU3RvcmUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk5
NzEyQTU4RDE1MDA0RURBMDA0OEFGMTAgLyogSURCQmFja2luZ1N0b3JlLmggKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmMuaDsgbmFtZSA9IElEQkxldmVsREJCYWNraW5nU3RvcmUuaDsgcGF0aCA9IE1v
ZHVsZXMvaW5kZXhlZGRiL0lEQkxldmVsREJCYWNraW5nU3RvcmUuaDsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKIAkJOTcxMkE1OEUxNTAwNEVEQTAwNDhBRjEwIC8qIElEQkxldmVsREJDb2Rp
bmcuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBuYW1lID0gSURCTGV2ZWxEQkNv
ZGluZy5jcHA7IHBhdGggPSBNb2R1bGVzL2luZGV4ZWRkYi9JREJMZXZlbERCQ29kaW5nLmNwcDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJOTcxMkE1OEYxNTAwNEVEQTAwNDhBRjEwIC8q
IElEQkxldmVsREJDb2RpbmcuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gSURC
TGV2ZWxEQkNvZGluZy5oOyBwYXRoID0gTW9kdWxlcy9pbmRleGVkZGIvSURCTGV2ZWxEQkNvZGlu
Zy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk5NzEyQTU5MDE1MDA0RURBMDA0OEFG
MTAgLyogSURCT2JqZWN0U3RvcmUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBu
YW1lID0gSURCT2JqZWN0U3RvcmUuY3BwOyBwYXRoID0gTW9kdWxlcy9pbmRleGVkZGIvSURCT2Jq
ZWN0U3RvcmUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtMTc4OTcsNyArMTc4
OTcsNyBAQAogCQkJCTk3MTJBNTg5MTUwMDRFREEwMDQ4QUYxMCAvKiBJREJLZXlSYW5nZS5jcHAg
Ki8sCiAJCQkJOTcxMkE1OEExNTAwNEVEQTAwNDhBRjEwIC8qIElEQktleVJhbmdlLmggKi8sCiAJ
CQkJOTcxMkE1OEIxNTAwNEVEQTAwNDhBRjEwIC8qIElEQktleVJhbmdlLmlkbCAqLywKLQkJCQk5
NzEyQTU4QzE1MDA0RURBMDA0OEFGMTAgLyogSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5jcHAgKi8s
CisJCQkJOTcxMkE1OEMxNTAwNEVEQTAwNDhBRjEwIC8qIElEQkJhY2tpbmdTdG9yZS5jcHAgKi8s
CiAJCQkJOTcxMkE1OEQxNTAwNEVEQTAwNDhBRjEwIC8qIElEQkxldmVsREJCYWNraW5nU3RvcmUu
aCAqLywKIAkJCQk5NzEyQTU4RTE1MDA0RURBMDA0OEFGMTAgLyogSURCTGV2ZWxEQkNvZGluZy5j
cHAgKi8sCiAJCQkJOTcxMkE1OEYxNTAwNEVEQTAwNDhBRjEwIC8qIElEQkxldmVsREJDb2Rpbmcu
aCAqLywKQEAgLTI3MDI5LDcgKzI3MDI5LDcgQEAKIAkJCQk5NzEyQTVEQjE1MDA0RURBMDA0OEFG
MTAgLyogSURCS2V5LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTk3MTJBNURFMTUwMDRFREEwMDQ4
QUYxMCAvKiBJREJLZXlQYXRoLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTk3MTJBNUUyMTUwMDRF
REEwMDQ4QUYxMCAvKiBJREJLZXlSYW5nZS5jcHAgaW4gU291cmNlcyAqLywKLQkJCQk5NzEyQTVF
NTE1MDA0RURBMDA0OEFGMTAgLyogSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5jcHAgaW4gU291cmNl
cyAqLywKKwkJCQk5NzEyQTVFNTE1MDA0RURBMDA0OEFGMTAgLyogSURCQmFja2luZ1N0b3JlLmNw
cCBpbiBTb3VyY2VzICovLAogCQkJCTk3MTJBNUU3MTUwMDRFREEwMDQ4QUYxMCAvKiBJREJMZXZl
bERCQ29kaW5nLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTk3MTJBNUU5MTUwMDRFREEwMDQ4QUYx
MCAvKiBJREJPYmplY3RTdG9yZS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk5NzEyQTVFQzE1MDA0
RURBMDA0OEFGMTAgLyogSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbC5jcHAgaW4gU291cmNlcyAq
LywK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>172848</attachid>
            <date>2012-11-07 11:34:00 -0800</date>
            <delta_ts>2012-11-07 17:17:23 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-101486-20121107113211.patch</filename>
            <type>text/plain</type>
            <size>159974</size>
            <attacher name="Alec Flett">alecflett</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTMzNjUwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggYmY5ZTEzZDU2ZGE2ZTdh
ZjU5ZTk4ZGIzM2YxNzcyMGE3ZDJmYWJkZS4uNjNhZjczMzdjNmI1NjgyOGNlYWRiNzYyYTdmNDM0
YzhiYTIxZDA4OSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDIzIEBACisyMDEyLTExLTA3ICBBbGVj
IEZsZXR0ICA8YWxlY2ZsZXR0QGNocm9taXVtLm9yZz4KKworICAgICAgICBJbmRleGVkREI6IFBy
ZXBhcmUgZm9yIElEQkJhY2tpbmdTdG9yZSBtZXJnZSBieSByZW5hbWluZyBJREJMZXZlbERCQmFj
a2luZ1N0b3JlLmNwcAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MTAxNDg2CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgUmVuYW1lIElEQkxldmVsREJCYWNraW5nU3RvcmUuY3BwIHRvIElEQkJhY2tpbmdTdG9y
ZS5jcHAgaW4KKyAgICAgICAgcHJlcGFyYXRpb24gZm9yIG1lcmdpbmcgdGhlc2UgY2xhc3Nlcy4g
VGhpcyB3aWxsIG1ha2UgdGhlIG1lcmdlCisgICAgICAgIGRpZmZzIHNhbmUuIFNlZSBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTAxNDE1CisgICAgICAgIGZvciB0aGUg
ZmluYWwgZ29hbC4KKworICAgICAgICBObyBuZXcgdGVzdHMsIHRoaXMgaXMgaXMganVzdCBhIHJl
bmFtZSBhbmQgbWlub3Igc3R5bGUgZml4LgorCisgICAgICAgICogQ01ha2VMaXN0cy50eHQ6Cisg
ICAgICAgICogR05VbWFrZWZpbGUubGlzdC5hbToKKyAgICAgICAgKiBNb2R1bGVzL2luZGV4ZWRk
Yi9JREJCYWNraW5nU3RvcmUuY3BwOiBSZW5hbWVkIGZyb20gU291cmNlL1dlYkNvcmUvTW9kdWxl
cy9pbmRleGVkZGIvSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5jcHAuCisgICAgICAgICogV2ViQ29y
ZS5neXBpOgorICAgICAgICAqIFdlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvajoKKwog
MjAxMi0xMS0wNiAgU2hlcmlmZiBCb3QgIDx3ZWJraXQucmV2aWV3LmJvdEBnbWFpbC5jb20+CiAK
ICAgICAgICAgVW5yZXZpZXdlZCwgcm9sbGluZyBvdXQgcjEzMzUyOSBhbmQgcjEzMzU2Mi4KZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0IGIvU291cmNlL1dlYkNvcmUv
Q01ha2VMaXN0cy50eHQKaW5kZXggMDNiMDNiMTE0MDAwZTExYTQxYjEyZTlkMWVlZDZlOGNkZTA0
NDMwMy4uMzQzNGY5ZmU2YTM3ZDhjMTY0OTc4Y2ZiZGFlZmRhMGFlZWY1NmJhMiAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYkNvcmUvQ01ha2VMaXN0cy50eHQKKysrIGIvU291cmNlL1dlYkNvcmUvQ01h
a2VMaXN0cy50eHQKQEAgLTgyNiw3ICs4MjYsNyBAQCBTRVQoV2ViQ29yZV9TT1VSQ0VTCiAgICAg
TW9kdWxlcy9pbmRleGVkZGIvSURCS2V5LmNwcAogICAgIE1vZHVsZXMvaW5kZXhlZGRiL0lEQktl
eVJhbmdlLmNwcAogICAgIE1vZHVsZXMvaW5kZXhlZGRiL0lEQktleVBhdGguY3BwCi0gICAgTW9k
dWxlcy9pbmRleGVkZGIvSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5jcHAKKyAgICBNb2R1bGVzL2lu
ZGV4ZWRkYi9JREJCYWNraW5nU3RvcmUuY3BwCiAgICAgTW9kdWxlcy9pbmRleGVkZGIvSURCTGV2
ZWxEQkNvZGluZy5jcHAKICAgICBNb2R1bGVzL2luZGV4ZWRkYi9JREJPYmplY3RTdG9yZS5jcHAK
ICAgICBNb2R1bGVzL2luZGV4ZWRkYi9JREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsLmNwcApkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUubGlzdC5hbSBiL1NvdXJjZS9XZWJD
b3JlL0dOVW1ha2VmaWxlLmxpc3QuYW0KaW5kZXggZjAwOTA0MDMxYmY4Y2I1Njc0NWY1ZGYxYWFl
OTRmMWI2NDAzMTEyMy4uOTQxM2M3MGVhNDEyNTNiZWRjYjI3YWI3MDMxZWI0YzY2OTVjM2I3OCAx
MDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUubGlzdC5hbQorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9HTlVtYWtlZmlsZS5saXN0LmFtCkBAIC0xODcyLDcgKzE4NzIsNyBAQCB3ZWJj
b3JlX21vZHVsZXNfc291cmNlcyArPSBcCiAJU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVk
ZGIvSURCS2V5UGF0aC5oIFwKIAlTb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9JREJL
ZXlSYW5nZS5jcHAgXAogCVNvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL0lEQktleVJh
bmdlLmggXAotCVNvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL0lEQkxldmVsREJCYWNr
aW5nU3RvcmUuY3BwIFwKKwlTb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9JREJCYWNr
aW5nU3RvcmUuY3BwIFwKIAlTb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9JREJMZXZl
bERCQmFja2luZ1N0b3JlLmggXAogCVNvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL0lE
QkxldmVsREJDb2RpbmcuY3BwIFwKIAlTb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9J
REJMZXZlbERCQ29kaW5nLmggXApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9p
bmRleGVkZGIvSURCQmFja2luZ1N0b3JlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5k
ZXhlZGRiL0lEQkJhY2tpbmdTdG9yZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNmZkMTE5OTM5ZjE1MjEzODNl
ZWYwMGVjNWVjYWY4YWU3YzIyNzZiMQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L01vZHVsZXMvaW5kZXhlZGRiL0lEQkJhY2tpbmdTdG9yZS5jcHAKQEAgLTAsMCArMSwxOTA5IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICog
MS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
IElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIklEQkJhY2tpbmdTdG9yZS5o
IgorCisjaWYgRU5BQkxFKElOREVYRURfREFUQUJBU0UpCisjaWYgVVNFKExFVkVMREIpCisKKyNp
bmNsdWRlICJGaWxlU3lzdGVtLmgiCisjaW5jbHVkZSAiSGlzdG9ncmFtU3VwcG9ydC5oIgorI2lu
Y2x1ZGUgIklEQkZhY3RvcnlCYWNrZW5kSW1wbC5oIgorI2luY2x1ZGUgIklEQktleS5oIgorI2lu
Y2x1ZGUgIklEQktleVBhdGguaCIKKyNpbmNsdWRlICJJREJLZXlSYW5nZS5oIgorI2luY2x1ZGUg
IklEQkxldmVsREJCYWNraW5nU3RvcmUuaCIKKyNpbmNsdWRlICJJREJMZXZlbERCQ29kaW5nLmgi
CisjaW5jbHVkZSAiSURCTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJJREJUcmFjaW5nLmgiCisjaW5j
bHVkZSAiTGV2ZWxEQkNvbXBhcmF0b3IuaCIKKyNpbmNsdWRlICJMZXZlbERCRGF0YWJhc2UuaCIK
KyNpbmNsdWRlICJMZXZlbERCSXRlcmF0b3IuaCIKKyNpbmNsdWRlICJMZXZlbERCU2xpY2UuaCIK
KyNpbmNsdWRlICJMZXZlbERCVHJhbnNhY3Rpb24uaCIKKyNpbmNsdWRlICJTZWN1cml0eU9yaWdp
bi5oIgorI2luY2x1ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
KwordXNpbmcgbmFtZXNwYWNlIElEQkxldmVsREJDb2Rpbmc7CisKK2NvbnN0IGludDY0X3QgS2V5
R2VuZXJhdG9ySW5pdGlhbE51bWJlciA9IDE7IC8vIEZyb20gdGhlIEluZGV4ZWREQiBzcGVjaWZp
Y2F0aW9uLgorCitlbnVtIElEQkxldmVsREJCYWNraW5nU3RvcmVJbnRlcm5hbEVycm9yVHlwZSB7
CisgICAgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVJlYWRFcnJvciwKKyAgICBJREJMZXZlbERCQmFj
a2luZ1N0b3JlV3JpdGVFcnJvciwKKyAgICBJREJMZXZlbERCQmFja2luZ1N0b3JlQ29uc2lzdGVu
Y3lFcnJvciwKKyAgICBJREJMZXZlbERCQmFja2luZ1N0b3JlSW50ZXJuYWxFcnJvck1heCwKK307
CitzdGF0aWMgaW5saW5lIHZvaWQgcmVjb3JkSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2lu
Z1N0b3JlSW50ZXJuYWxFcnJvclR5cGUgdHlwZSkKK3sKKyAgICBIaXN0b2dyYW1TdXBwb3J0Ojpo
aXN0b2dyYW1FbnVtZXJhdGlvbigiV2ViQ29yZS5JbmRleGVkREIuQmFja2luZ1N0b3JlLkludGVy
bmFsRXJyb3IiLCB0eXBlLCBJREJMZXZlbERCQmFja2luZ1N0b3JlSW50ZXJuYWxFcnJvck1heCk7
Cit9CisKKy8vIFVzZSB0byBzaWduYWwgY29uZGl0aW9ucyB0aGF0IHVzdWFsbHkgaW5kaWNhdGUg
ZGV2ZWxvcGVyIGVycm9yLCBidXQgY291bGQgYmUgY2F1c2VkIGJ5IGRhdGEgY29ycnVwdGlvbi4K
Ky8vIEEgbWFjcm8gaXMgdXNlZCBpbnN0ZWFkIG9mIGFuIGlubGluZSBmdW5jdGlvbiBzbyB0aGF0
IHRoZSBhc3NlcnQgYW5kIGxvZyByZXBvcnQgdGhlIGxpbmUgbnVtYmVyLgorI2RlZmluZSBJbnRl
cm5hbEVycm9yKHR5cGUpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVE
KCk7IFwKKyAgICAgICAgTE9HX0VSUk9SKCJJbnRlcm5hbCBJbmRleGVkREIgRXJyb3I6ICVzIiwg
I3R5cGUpOyBcCisgICAgICAgIHJlY29yZEludGVybmFsRXJyb3IodHlwZSk7IFwKKyAgICB9IHdo
aWxlICgwKQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgREJPclRyYW5zYWN0aW9uPgorc3RhdGljIGJv
b2wgZ2V0Qm9vbChEQk9yVHJhbnNhY3Rpb24qIGRiLCBjb25zdCBWZWN0b3I8Y2hhcj4mIGtleSwg
Ym9vbCYgZm91bmRCb29sKQoreworICAgIFZlY3RvcjxjaGFyPiByZXN1bHQ7CisgICAgaWYgKCFk
Yi0+Z2V0KGtleSwgcmVzdWx0KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZm91bmRC
b29sID0gZGVjb2RlQm9vbChyZXN1bHQuYmVnaW4oKSwgcmVzdWx0LmVuZCgpKTsKKyAgICByZXR1
cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERCT3JUcmFuc2FjdGlvbj4KK3N0YXRp
YyBib29sIHB1dEJvb2woREJPclRyYW5zYWN0aW9uKiBkYiwgY29uc3QgVmVjdG9yPGNoYXI+JiBr
ZXksIGJvb2wgdmFsdWUpCit7CisgICAgcmV0dXJuIGRiLT5wdXQoa2V5LCBlbmNvZGVCb29sKHZh
bHVlKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEQk9yVHJhbnNhY3Rpb24+CitzdGF0aWMg
Ym9vbCBnZXRJbnQoREJPclRyYW5zYWN0aW9uKiBkYiwgY29uc3QgVmVjdG9yPGNoYXI+JiBrZXks
IGludDY0X3QmIGZvdW5kSW50KQoreworICAgIFZlY3RvcjxjaGFyPiByZXN1bHQ7CisgICAgaWYg
KCFkYi0+Z2V0KGtleSwgcmVzdWx0KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZm91
bmRJbnQgPSBkZWNvZGVJbnQocmVzdWx0LmJlZ2luKCksIHJlc3VsdC5lbmQoKSk7CisgICAgcmV0
dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEQk9yVHJhbnNhY3Rpb24+CitzdGF0
aWMgYm9vbCBwdXRJbnQoREJPclRyYW5zYWN0aW9uKiBkYiwgY29uc3QgVmVjdG9yPGNoYXI+JiBr
ZXksIGludDY0X3QgdmFsdWUpCit7CisgICAgQVNTRVJUKHZhbHVlID49IDApOworICAgIGlmICh2
YWx1ZSA8IDApCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gZGItPnB1dChrZXks
IGVuY29kZUludCh2YWx1ZSkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgREJPclRyYW5zYWN0
aW9uPgorc3RhdGljIGJvb2wgZ2V0VmFySW50KERCT3JUcmFuc2FjdGlvbiogZGIsIGNvbnN0IFZl
Y3RvcjxjaGFyPiYga2V5LCBpbnQ2NF90JiBmb3VuZEludCkKK3sKKyAgICBWZWN0b3I8Y2hhcj4g
cmVzdWx0OworICAgIGlmICghZGItPmdldChrZXksIHJlc3VsdCkpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgIHJldHVybiBkZWNvZGVWYXJJbnQocmVzdWx0LmJlZ2luKCksIHJlc3VsdC5l
bmQoKSwgZm91bmRJbnQpID09IHJlc3VsdC5lbmQoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1l
IERCT3JUcmFuc2FjdGlvbj4KK3N0YXRpYyBib29sIHB1dFZhckludChEQk9yVHJhbnNhY3Rpb24q
IGRiLCBjb25zdCBWZWN0b3I8Y2hhcj4mIGtleSwgaW50NjRfdCB2YWx1ZSkKK3sKKyAgICByZXR1
cm4gZGItPnB1dChrZXksIGVuY29kZVZhckludCh2YWx1ZSkpOworfQorCit0ZW1wbGF0ZSA8dHlw
ZW5hbWUgREJPclRyYW5zYWN0aW9uPgorc3RhdGljIGJvb2wgZ2V0U3RyaW5nKERCT3JUcmFuc2Fj
dGlvbiogZGIsIGNvbnN0IFZlY3RvcjxjaGFyPiYga2V5LCBTdHJpbmcmIGZvdW5kU3RyaW5nKQor
eworICAgIFZlY3RvcjxjaGFyPiByZXN1bHQ7CisgICAgaWYgKCFkYi0+Z2V0KGtleSwgcmVzdWx0
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZm91bmRTdHJpbmcgPSBkZWNvZGVTdHJp
bmcocmVzdWx0LmJlZ2luKCksIHJlc3VsdC5lbmQoKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisK
K3RlbXBsYXRlIDx0eXBlbmFtZSBEQk9yVHJhbnNhY3Rpb24+CitzdGF0aWMgYm9vbCBwdXRTdHJp
bmcoREJPclRyYW5zYWN0aW9uKiBkYiwgY29uc3QgVmVjdG9yPGNoYXI+IGtleSwgY29uc3QgU3Ry
aW5nJiB2YWx1ZSkKK3sKKyAgICBpZiAoIWRiLT5wdXQoa2V5LCBlbmNvZGVTdHJpbmcodmFsdWUp
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0
ZSA8dHlwZW5hbWUgREJPclRyYW5zYWN0aW9uPgorc3RhdGljIGJvb2wgcHV0SURCS2V5UGF0aChE
Qk9yVHJhbnNhY3Rpb24qIGRiLCBjb25zdCBWZWN0b3I8Y2hhcj4ga2V5LCBjb25zdCBJREJLZXlQ
YXRoJiB2YWx1ZSkKK3sKKyAgICBpZiAoIWRiLT5wdXQoa2V5LCBlbmNvZGVJREJLZXlQYXRoKHZh
bHVlKSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3Rh
dGljIGludCBjb21wYXJlS2V5cyhjb25zdCBMZXZlbERCU2xpY2UmIGEsIGNvbnN0IExldmVsREJT
bGljZSYgYikKK3sKKyAgICByZXR1cm4gY29tcGFyZShhLCBiKTsKK30KKworc3RhdGljIGludCBj
b21wYXJlSW5kZXhLZXlzKGNvbnN0IExldmVsREJTbGljZSYgYSwgY29uc3QgTGV2ZWxEQlNsaWNl
JiBiKQoreworICAgIHJldHVybiBjb21wYXJlKGEsIGIsIHRydWUpOworfQorCitjbGFzcyBDb21w
YXJhdG9yIDogcHVibGljIExldmVsREJDb21wYXJhdG9yIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFs
IGludCBjb21wYXJlKGNvbnN0IExldmVsREJTbGljZSYgYSwgY29uc3QgTGV2ZWxEQlNsaWNlJiBi
KSBjb25zdCB7IHJldHVybiBJREJMZXZlbERCQ29kaW5nOjpjb21wYXJlKGEsIGIpOyB9CisgICAg
dmlydHVhbCBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3QgeyByZXR1cm4gImlkYl9jbXAxIjsgfQor
fTsKKworY29uc3QgaW50NjRfdCBsYXRlc3RTY2hlbWFWZXJzaW9uID0gMTsKK3N0YXRpYyBib29s
IGlzU2NoZW1hS25vd24oTGV2ZWxEQkRhdGFiYXNlKiBkYikKK3sKKyAgICBpbnQ2NF90IHNjaGVt
YVZlcnNpb24gPSAwOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBtZXRhRGF0YUtleSA9IFNjaGVt
YVZlcnNpb25LZXk6OmVuY29kZSgpOworICAgIGlmICghZ2V0SW50KGRiLCBtZXRhRGF0YUtleSwg
c2NoZW1hVmVyc2lvbikpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBzY2hlbWFW
ZXJzaW9uIDw9IGxhdGVzdFNjaGVtYVZlcnNpb247Cit9CisKK3N0YXRpYyBib29sIHNldFVwTWV0
YWRhdGEoTGV2ZWxEQkRhdGFiYXNlKiBkYiwgY29uc3QgU3RyaW5nJiBvcmlnaW4pCit7CisgICAg
Y29uc3QgVmVjdG9yPGNoYXI+IG1ldGFEYXRhS2V5ID0gU2NoZW1hVmVyc2lvbktleTo6ZW5jb2Rl
KCk7CisKKyAgICBpbnQ2NF90IHNjaGVtYVZlcnNpb24gPSAwOworICAgIGlmICghZ2V0SW50KGRi
LCBtZXRhRGF0YUtleSwgc2NoZW1hVmVyc2lvbikpIHsKKyAgICAgICAgc2NoZW1hVmVyc2lvbiA9
IGxhdGVzdFNjaGVtYVZlcnNpb247CisgICAgICAgIGlmICghcHV0SW50KGRiLCBtZXRhRGF0YUtl
eSwgbGF0ZXN0U2NoZW1hVmVyc2lvbikpIHsKKyAgICAgICAgICAgIEludGVybmFsRXJyb3IoSURC
TGV2ZWxEQkJhY2tpbmdTdG9yZVdyaXRlRXJyb3IpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUKHNjaGVtYVZlcnNpb24g
PD0gbGF0ZXN0U2NoZW1hVmVyc2lvbik7CisgICAgICAgIGlmICghc2NoZW1hVmVyc2lvbikgewor
ICAgICAgICAgICAgc2NoZW1hVmVyc2lvbiA9IGxhdGVzdFNjaGVtYVZlcnNpb247CisgICAgICAg
ICAgICBSZWZQdHI8TGV2ZWxEQlRyYW5zYWN0aW9uPiB0cmFuc2FjdGlvbiA9IExldmVsREJUcmFu
c2FjdGlvbjo6Y3JlYXRlKGRiKTsKKyAgICAgICAgICAgIHRyYW5zYWN0aW9uLT5wdXQobWV0YURh
dGFLZXksIGVuY29kZUludChzY2hlbWFWZXJzaW9uKSk7CisKKyAgICAgICAgICAgIGNvbnN0IFZl
Y3RvcjxjaGFyPiBzdGFydEtleSA9IERhdGFiYXNlTmFtZUtleTo6ZW5jb2RlTWluS2V5Rm9yT3Jp
Z2luKG9yaWdpbik7CisgICAgICAgICAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3RvcEtleSA9IERh
dGFiYXNlTmFtZUtleTo6ZW5jb2RlU3RvcEtleUZvck9yaWdpbihvcmlnaW4pOworICAgICAgICAg
ICAgT3duUHRyPExldmVsREJJdGVyYXRvcj4gaXQgPSBkYi0+Y3JlYXRlSXRlcmF0b3IoKTsKKyAg
ICAgICAgICAgIGZvciAoaXQtPnNlZWsoc3RhcnRLZXkpOyBpdC0+aXNWYWxpZCgpICYmIGNvbXBh
cmVLZXlzKGl0LT5rZXkoKSwgc3RvcEtleSkgPCAwOyBpdC0+bmV4dCgpKSB7CisgICAgICAgICAg
ICAgICAgVmVjdG9yPGNoYXI+IHZhbHVlOworICAgICAgICAgICAgICAgIGJvb2wgb2sgPSB0cmFu
c2FjdGlvbi0+Z2V0KGl0LT5rZXkoKSwgdmFsdWUpOworICAgICAgICAgICAgICAgIGlmICghb2sp
IHsKKyAgICAgICAgICAgICAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0
b3JlUmVhZEVycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgZGF0YWJhc2VJZCA9IGRlY29kZUludCh2
YWx1ZS5iZWdpbigpLCB2YWx1ZS5lbmQoKSk7CisgICAgICAgICAgICAgICAgVmVjdG9yPGNoYXI+
IGludFZlcnNpb25LZXkgPSBEYXRhYmFzZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwg
RGF0YWJhc2VNZXRhRGF0YUtleTo6VXNlckludFZlcnNpb24pOworICAgICAgICAgICAgICAgIHRy
YW5zYWN0aW9uLT5wdXQoaW50VmVyc2lvbktleSwgZW5jb2RlVmFySW50KElEQkRhdGFiYXNlTWV0
YWRhdGE6OkRlZmF1bHRJbnRWZXJzaW9uKSk7CisgICAgICAgICAgICAgICAgb2sgPSB0cmFuc2Fj
dGlvbi0+Z2V0KGl0LT5rZXkoKSwgdmFsdWUpOworICAgICAgICAgICAgICAgIGlmICghb2spIHsK
KyAgICAgICAgICAgICAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3Jl
UmVhZEVycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2wgb2sgPSB0cmFuc2FjdGlv
bi0+Y29tbWl0KCk7CisgICAgICAgICAgICBpZiAoIW9rKSB7CisgICAgICAgICAgICAgICAgSW50
ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlV3JpdGVFcnJvcik7CisgICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisg
ICAgQVNTRVJUKHNjaGVtYVZlcnNpb24gPT0gbGF0ZXN0U2NoZW1hVmVyc2lvbik7CisKKyAgICBy
ZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERCT3JUcmFuc2FjdGlvbj4KK3N0
YXRpYyBpbnQ2NF90IGdldE1heE9iamVjdFN0b3JlSWQoREJPclRyYW5zYWN0aW9uKiBkYiwgaW50
NjRfdCBkYXRhYmFzZUlkKQoreworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBtYXhPYmplY3RTdG9y
ZUlkS2V5ID0gRGF0YWJhc2VNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIERhdGFiYXNl
TWV0YURhdGFLZXk6Ok1heE9iamVjdFN0b3JlSWQpOworICAgIHJldHVybiBnZXRNYXhPYmplY3RT
dG9yZUlkKGRiLCBtYXhPYmplY3RTdG9yZUlkS2V5KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1l
IERCT3JUcmFuc2FjdGlvbj4KK3N0YXRpYyBpbnQ2NF90IGdldE1heE9iamVjdFN0b3JlSWQoREJP
clRyYW5zYWN0aW9uKiBkYiwgY29uc3QgVmVjdG9yPGNoYXI+JiBtYXhPYmplY3RTdG9yZUlkS2V5
KQoreworICAgIGludDY0X3QgbWF4T2JqZWN0U3RvcmVJZCA9IC0xOworICAgIGlmICghZ2V0SW50
KGRiLCBtYXhPYmplY3RTdG9yZUlkS2V5LCBtYXhPYmplY3RTdG9yZUlkKSkKKyAgICAgICAgbWF4
T2JqZWN0U3RvcmVJZCA9IDA7CisKKyAgICBBU1NFUlQobWF4T2JqZWN0U3RvcmVJZCA+PSAwKTsK
KyAgICByZXR1cm4gbWF4T2JqZWN0U3RvcmVJZDsKK30KKworSURCTGV2ZWxEQkJhY2tpbmdTdG9y
ZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZShjb25zdCBTdHJpbmcmIGlkZW50aWZpZXIsIElEQkZh
Y3RvcnlCYWNrZW5kSW1wbCogZmFjdG9yeSwgUGFzc093blB0cjxMZXZlbERCRGF0YWJhc2U+IGRi
KQorICAgIDogbV9pZGVudGlmaWVyKGlkZW50aWZpZXIpCisgICAgLCBtX2ZhY3RvcnkoZmFjdG9y
eSkKKyAgICAsIG1fZGIoZGIpCit7CisgICAgbV9mYWN0b3J5LT5hZGRJREJCYWNraW5nU3RvcmUo
aWRlbnRpZmllciwgdGhpcyk7Cit9CisKK0lEQkxldmVsREJCYWNraW5nU3RvcmU6On5JREJMZXZl
bERCQmFja2luZ1N0b3JlKCkKK3sKKyAgICBtX2ZhY3RvcnktPnJlbW92ZUlEQkJhY2tpbmdTdG9y
ZShtX2lkZW50aWZpZXIpOworCisgICAgLy8gbV9kYidzIGRlc3RydWN0b3IgdXNlcyBtX2NvbXBh
cmF0b3IuIFRoZSBvcmRlciBvZiBkZXN0cnVjdGlvbiBpcyBpbXBvcnRhbnQuCisgICAgbV9kYi5j
bGVhcigpOworICAgIG1fY29tcGFyYXRvci5jbGVhcigpOworfQorCitlbnVtIElEQkxldmVsREJC
YWNraW5nU3RvcmVPcGVuUmVzdWx0IHsKKyAgICBJREJMZXZlbERCQmFja2luZ1N0b3JlT3Blbk1l
bW9yeSwKKyAgICBJREJMZXZlbERCQmFja2luZ1N0b3JlT3BlblN1Y2Nlc3MsCisgICAgSURCTGV2
ZWxEQkJhY2tpbmdTdG9yZU9wZW5GYWlsZWREaXJlY3RvcnksCisgICAgSURCTGV2ZWxEQkJhY2tp
bmdTdG9yZU9wZW5GYWlsZWRVbmtub3duU2NoZW1hLAorICAgIElEQkxldmVsREJCYWNraW5nU3Rv
cmVPcGVuQ2xlYW51cERlc3Ryb3lGYWlsZWQsCisgICAgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9w
ZW5DbGVhbnVwUmVvcGVuRmFpbGVkLAorICAgIElEQkxldmVsREJCYWNraW5nU3RvcmVPcGVuQ2xl
YW51cFJlb3BlblN1Y2Nlc3MsCisgICAgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5NYXgsCit9
OworCitQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6
b3BlbihTZWN1cml0eU9yaWdpbiogc2VjdXJpdHlPcmlnaW4sIGNvbnN0IFN0cmluZyYgcGF0aEJh
c2VBcmcsIGNvbnN0IFN0cmluZyYgZmlsZUlkZW50aWZpZXIsIElEQkZhY3RvcnlCYWNrZW5kSW1w
bCogZmFjdG9yeSkKK3sKKyAgICBJREJfVFJBQ0UoIklEQkxldmVsREJCYWNraW5nU3RvcmU6Om9w
ZW4iKTsKKyAgICBTdHJpbmcgcGF0aEJhc2UgPSBwYXRoQmFzZUFyZzsKKworICAgIE93blB0cjxM
ZXZlbERCQ29tcGFyYXRvcj4gY29tcGFyYXRvciA9IGFkb3B0UHRyKG5ldyBDb21wYXJhdG9yKCkp
OworICAgIE93blB0cjxMZXZlbERCRGF0YWJhc2U+IGRiOworCisgICAgaWYgKHBhdGhCYXNlLmlz
RW1wdHkoKSkgeworICAgICAgICBIaXN0b2dyYW1TdXBwb3J0OjpoaXN0b2dyYW1FbnVtZXJhdGlv
bigiV2ViQ29yZS5JbmRleGVkREIuQmFja2luZ1N0b3JlLk9wZW5TdGF0dXMiLCBJREJMZXZlbERC
QmFja2luZ1N0b3JlT3Blbk1lbW9yeSwgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5NYXgpOwor
ICAgICAgICBkYiA9IExldmVsREJEYXRhYmFzZTo6b3BlbkluTWVtb3J5KGNvbXBhcmF0b3IuZ2V0
KCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghbWFrZUFsbERpcmVjdG9yaWVzKHBhdGhC
YXNlKSkgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gY3JlYXRlIEluZGV4ZWRE
QiBkYXRhYmFzZSBwYXRoICVzIiwgcGF0aEJhc2UudXRmOCgpLmRhdGEoKSk7CisgICAgICAgICAg
ICBIaXN0b2dyYW1TdXBwb3J0OjpoaXN0b2dyYW1FbnVtZXJhdGlvbigiV2ViQ29yZS5JbmRleGVk
REIuQmFja2luZ1N0b3JlLk9wZW5TdGF0dXMiLCBJREJMZXZlbERCQmFja2luZ1N0b3JlT3BlbkZh
aWxlZERpcmVjdG9yeSwgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5NYXgpOworICAgICAgICAg
ICAgcmV0dXJuIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlPigpOworICAgICAgICB9CisKKyAg
ICAgICAgU3RyaW5nIHBhdGggPSBwYXRoQnlBcHBlbmRpbmdDb21wb25lbnQocGF0aEJhc2UsIHNl
Y3VyaXR5T3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKSArICIuaW5kZXhlZGRiLmxldmVsZGIi
KTsKKworICAgICAgICBkYiA9IExldmVsREJEYXRhYmFzZTo6b3BlbihwYXRoLCBjb21wYXJhdG9y
LmdldCgpKTsKKyAgICAgICAgaWYgKGRiICYmICFpc1NjaGVtYUtub3duKGRiLmdldCgpKSkgewor
ICAgICAgICAgICAgTE9HX0VSUk9SKCJJbmRleGVkREIgYmFja2luZyBzdG9yZSBoYWQgdW5rbm93
biBzY2hlbWEsIHRyZWF0aW5nIGl0IGFzIGZhaWx1cmUgdG8gb3BlbiIpOworICAgICAgICAgICAg
SGlzdG9ncmFtU3VwcG9ydDo6aGlzdG9ncmFtRW51bWVyYXRpb24oIldlYkNvcmUuSW5kZXhlZERC
LkJhY2tpbmdTdG9yZS5PcGVuU3RhdHVzIiwgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5GYWls
ZWRVbmtub3duU2NoZW1hLCBJREJMZXZlbERCQmFja2luZ1N0b3JlT3Blbk1heCk7CisgICAgICAg
ICAgICBkYi5yZWxlYXNlKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGIpCisgICAgICAg
ICAgICBIaXN0b2dyYW1TdXBwb3J0OjpoaXN0b2dyYW1FbnVtZXJhdGlvbigiV2ViQ29yZS5JbmRl
eGVkREIuQmFja2luZ1N0b3JlLk9wZW5TdGF0dXMiLCBJREJMZXZlbERCQmFja2luZ1N0b3JlT3Bl
blN1Y2Nlc3MsIElEQkxldmVsREJCYWNraW5nU3RvcmVPcGVuTWF4KTsKKyAgICAgICAgZWxzZSB7
CisgICAgICAgICAgICBMT0dfRVJST1IoIkluZGV4ZWREQiBiYWNraW5nIHN0b3JlIG9wZW4gZmFp
bGVkLCBhdHRlbXB0aW5nIGNsZWFudXAiKTsKKyAgICAgICAgICAgIGJvb2wgc3VjY2VzcyA9IExl
dmVsREJEYXRhYmFzZTo6ZGVzdHJveShwYXRoKTsKKyAgICAgICAgICAgIGlmICghc3VjY2Vzcykg
eworICAgICAgICAgICAgICAgIExPR19FUlJPUigiSW5kZXhlZERCIGJhY2tpbmcgc3RvcmUgY2xl
YW51cCBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICBIaXN0b2dyYW1TdXBwb3J0OjpoaXN0b2dy
YW1FbnVtZXJhdGlvbigiV2ViQ29yZS5JbmRleGVkREIuQmFja2luZ1N0b3JlLk9wZW5TdGF0dXMi
LCBJREJMZXZlbERCQmFja2luZ1N0b3JlT3BlbkNsZWFudXBEZXN0cm95RmFpbGVkLCBJREJMZXZl
bERCQmFja2luZ1N0b3JlT3Blbk1heCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFBhc3NSZWZQ
dHI8SURCQmFja2luZ1N0b3JlPigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMT0df
RVJST1IoIkluZGV4ZWREQiBiYWNraW5nIHN0b3JlIGNsZWFudXAgc3VjY2VlZGVkLCByZW9wZW5p
bmciKTsKKyAgICAgICAgICAgIGRiID0gTGV2ZWxEQkRhdGFiYXNlOjpvcGVuKHBhdGgsIGNvbXBh
cmF0b3IuZ2V0KCkpOworICAgICAgICAgICAgaWYgKCFkYikgeworICAgICAgICAgICAgICAgIExP
R19FUlJPUigiSW5kZXhlZERCIGJhY2tpbmcgc3RvcmUgcmVvcGVuIGFmdGVyIHJlY292ZXJ5IGZh
aWxlZCIpOworICAgICAgICAgICAgICAgIEhpc3RvZ3JhbVN1cHBvcnQ6Omhpc3RvZ3JhbUVudW1l
cmF0aW9uKCJXZWJDb3JlLkluZGV4ZWREQi5CYWNraW5nU3RvcmUuT3BlblN0YXR1cyIsIElEQkxl
dmVsREJCYWNraW5nU3RvcmVPcGVuQ2xlYW51cFJlb3BlbkZhaWxlZCwgSURCTGV2ZWxEQkJhY2tp
bmdTdG9yZU9wZW5NYXgpOworICAgICAgICAgICAgICAgIHJldHVybiBQYXNzUmVmUHRyPElEQkJh
Y2tpbmdTdG9yZT4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEhpc3RvZ3JhbVN1cHBv
cnQ6Omhpc3RvZ3JhbUVudW1lcmF0aW9uKCJXZWJDb3JlLkluZGV4ZWREQi5CYWNraW5nU3RvcmUu
T3BlblN0YXR1cyIsIElEQkxldmVsREJCYWNraW5nU3RvcmVPcGVuQ2xlYW51cFJlb3BlblN1Y2Nl
c3MsIElEQkxldmVsREJCYWNraW5nU3RvcmVPcGVuTWF4KTsKKyAgICAgICAgfQorICAgIH0KKwor
ICAgIGlmICghZGIpCisgICAgICAgIHJldHVybiBQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4o
KTsKKworICAgIC8vIEZJWE1FOiBIYW5kbGUgY29tcGFyYXRvciBuYW1lIGNoYW5nZXMuCisKKyAg
ICBSZWZQdHI8SURCTGV2ZWxEQkJhY2tpbmdTdG9yZT4gYmFja2luZ1N0b3JlKGFkb3B0UmVmKG5l
dyBJREJMZXZlbERCQmFja2luZ1N0b3JlKGZpbGVJZGVudGlmaWVyLCBmYWN0b3J5LCBkYi5yZWxl
YXNlKCkpKSk7CisgICAgYmFja2luZ1N0b3JlLT5tX2NvbXBhcmF0b3IgPSBjb21wYXJhdG9yLnJl
bGVhc2UoKTsKKworICAgIGlmICghc2V0VXBNZXRhZGF0YShiYWNraW5nU3RvcmUtPm1fZGIuZ2V0
KCksIGZpbGVJZGVudGlmaWVyKSkKKyAgICAgICAgcmV0dXJuIFBhc3NSZWZQdHI8SURCQmFja2lu
Z1N0b3JlPigpOworCisgICAgcmV0dXJuIGJhY2tpbmdTdG9yZS5yZWxlYXNlKCk7Cit9CisKK1Zl
Y3RvcjxTdHJpbmc+IElEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldERhdGFiYXNlTmFtZXMoKQor
eworICAgIFZlY3RvcjxTdHJpbmc+IGZvdW5kTmFtZXM7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+
IHN0YXJ0S2V5ID0gRGF0YWJhc2VOYW1lS2V5OjplbmNvZGVNaW5LZXlGb3JPcmlnaW4obV9pZGVu
dGlmaWVyKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3RvcEtleSA9IERhdGFiYXNlTmFtZUtl
eTo6ZW5jb2RlU3RvcEtleUZvck9yaWdpbihtX2lkZW50aWZpZXIpOworCisgICAgQVNTRVJUKGZv
dW5kTmFtZXMuaXNFbXB0eSgpKTsKKworICAgIE93blB0cjxMZXZlbERCSXRlcmF0b3I+IGl0ID0g
bV9kYi0+Y3JlYXRlSXRlcmF0b3IoKTsKKyAgICBmb3IgKGl0LT5zZWVrKHN0YXJ0S2V5KTsgaXQt
PmlzVmFsaWQoKSAmJiBjb21wYXJlS2V5cyhpdC0+a2V5KCksIHN0b3BLZXkpIDwgMDsgaXQtPm5l
eHQoKSkgeworICAgICAgICBjb25zdCBjaGFyKiBwID0gaXQtPmtleSgpLmJlZ2luKCk7CisgICAg
ICAgIGNvbnN0IGNoYXIqIGxpbWl0ID0gaXQtPmtleSgpLmVuZCgpOworCisgICAgICAgIERhdGFi
YXNlTmFtZUtleSBkYXRhYmFzZU5hbWVLZXk7CisgICAgICAgIHAgPSBEYXRhYmFzZU5hbWVLZXk6
OmRlY29kZShwLCBsaW1pdCwgJmRhdGFiYXNlTmFtZUtleSk7CisgICAgICAgIEFTU0VSVChwKTsK
KworICAgICAgICBmb3VuZE5hbWVzLmFwcGVuZChkYXRhYmFzZU5hbWVLZXkuZGF0YWJhc2VOYW1l
KCkpOworICAgIH0KKyAgICByZXR1cm4gZm91bmROYW1lczsKK30KKworYm9vbCBJREJMZXZlbERC
QmFja2luZ1N0b3JlOjpnZXRJREJEYXRhYmFzZU1ldGFEYXRhKGNvbnN0IFN0cmluZyYgbmFtZSwg
SURCRGF0YWJhc2VNZXRhZGF0YSogbWV0YWRhdGEpCit7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+
IGtleSA9IERhdGFiYXNlTmFtZUtleTo6ZW5jb2RlKG1faWRlbnRpZmllciwgbmFtZSk7CisKKyAg
ICBib29sIG9rID0gZ2V0SW50KG1fZGIuZ2V0KCksIGtleSwgbWV0YWRhdGEtPmlkKTsKKyAgICBp
ZiAoIW9rKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBvayA9IGdldFN0cmluZyhtX2Ri
LmdldCgpLCBEYXRhYmFzZU1ldGFEYXRhS2V5OjplbmNvZGUobWV0YWRhdGEtPmlkLCBEYXRhYmFz
ZU1ldGFEYXRhS2V5OjpVc2VyVmVyc2lvbiksIG1ldGFkYXRhLT52ZXJzaW9uKTsKKyAgICBpZiAo
IW9rKSB7CisgICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVJlYWRF
cnJvcik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBvayA9IGdldFZhcklu
dChtX2RiLmdldCgpLCBEYXRhYmFzZU1ldGFEYXRhS2V5OjplbmNvZGUobWV0YWRhdGEtPmlkLCBE
YXRhYmFzZU1ldGFEYXRhS2V5OjpVc2VySW50VmVyc2lvbiksIG1ldGFkYXRhLT5pbnRWZXJzaW9u
KTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tp
bmdTdG9yZVJlYWRFcnJvcik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYg
KG1ldGFkYXRhLT5pbnRWZXJzaW9uID09IElEQkRhdGFiYXNlTWV0YWRhdGE6OkRlZmF1bHRJbnRW
ZXJzaW9uKQorICAgICAgICBtZXRhZGF0YS0+aW50VmVyc2lvbiA9IElEQkRhdGFiYXNlTWV0YWRh
dGE6Ok5vSW50VmVyc2lvbjsKKworICAgIG1ldGFkYXRhLT5tYXhPYmplY3RTdG9yZUlkID0gZ2V0
TWF4T2JqZWN0U3RvcmVJZChtX2RiLmdldCgpLCBtZXRhZGF0YS0+aWQpOworCisgICAgcmV0dXJu
IHRydWU7Cit9CisKK3N0YXRpYyBpbnQ2NF90IGdldE5ld0RhdGFiYXNlSWQoTGV2ZWxEQkRhdGFi
YXNlKiBkYikKK3sKKyAgICBpbnQ2NF90IG1heERhdGFiYXNlSWQgPSAtMTsKKyAgICBpZiAoIWdl
dEludChkYiwgTWF4RGF0YWJhc2VJZEtleTo6ZW5jb2RlKCksIG1heERhdGFiYXNlSWQpKQorICAg
ICAgICBtYXhEYXRhYmFzZUlkID0gMDsKKworICAgIEFTU0VSVChtYXhEYXRhYmFzZUlkID49IDAp
OworCisgICAgaW50NjRfdCBkYXRhYmFzZUlkID0gbWF4RGF0YWJhc2VJZCArIDE7CisgICAgaWYg
KCFwdXRJbnQoZGIsIE1heERhdGFiYXNlSWRLZXk6OmVuY29kZSgpLCBkYXRhYmFzZUlkKSkKKyAg
ICAgICAgcmV0dXJuIC0xOworCisgICAgcmV0dXJuIGRhdGFiYXNlSWQ7Cit9CisKK2Jvb2wgSURC
TGV2ZWxEQkJhY2tpbmdTdG9yZTo6Y3JlYXRlSURCRGF0YWJhc2VNZXRhRGF0YShjb25zdCBTdHJp
bmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgdmVyc2lvbiwgaW50NjRfdCBpbnRWZXJzaW9uLCBpbnQ2
NF90JiByb3dJZCkKK3sKKyAgICByb3dJZCA9IGdldE5ld0RhdGFiYXNlSWQobV9kYi5nZXQoKSk7
CisgICAgaWYgKHJvd0lkIDwgMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgY29uc3Qg
VmVjdG9yPGNoYXI+IGtleSA9IERhdGFiYXNlTmFtZUtleTo6ZW5jb2RlKG1faWRlbnRpZmllciwg
bmFtZSk7CisgICAgaWYgKCFwdXRJbnQobV9kYi5nZXQoKSwga2V5LCByb3dJZCkpIHsKKyAgICAg
ICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlV3JpdGVFcnJvcik7CisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFwdXRTdHJpbmcobV9kYi5nZXQoKSwg
RGF0YWJhc2VNZXRhRGF0YUtleTo6ZW5jb2RlKHJvd0lkLCBEYXRhYmFzZU1ldGFEYXRhS2V5OjpV
c2VyVmVyc2lvbiksIHZlcnNpb24pKSB7CisgICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxE
QkJhY2tpbmdTdG9yZVdyaXRlRXJyb3IpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQor
ICAgIGlmIChpbnRWZXJzaW9uID09IElEQkRhdGFiYXNlTWV0YWRhdGE6Ok5vSW50VmVyc2lvbikK
KyAgICAgICAgaW50VmVyc2lvbiA9IElEQkRhdGFiYXNlTWV0YWRhdGE6OkRlZmF1bHRJbnRWZXJz
aW9uOworICAgIGlmICghcHV0VmFySW50KG1fZGIuZ2V0KCksIERhdGFiYXNlTWV0YURhdGFLZXk6
OmVuY29kZShyb3dJZCwgRGF0YWJhc2VNZXRhRGF0YUtleTo6VXNlckludFZlcnNpb24pLCBpbnRW
ZXJzaW9uKSkgeworICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVX
cml0ZUVycm9yKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1
ZTsKK30KKworYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjp1cGRhdGVJREJEYXRhYmFzZUlu
dFZlcnNpb24oSURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGludDY0
X3Qgcm93SWQsIGludDY0X3QgaW50VmVyc2lvbikKK3sKKyAgICBpZiAoaW50VmVyc2lvbiA9PSBJ
REJEYXRhYmFzZU1ldGFkYXRhOjpOb0ludFZlcnNpb24pCisgICAgICAgIGludFZlcnNpb24gPSBJ
REJEYXRhYmFzZU1ldGFkYXRhOjpEZWZhdWx0SW50VmVyc2lvbjsKKyAgICBBU1NFUlRfV0lUSF9N
RVNTQUdFKGludFZlcnNpb24gPj0gMCwgImludFZlcnNpb24gd2FzICVsbGQiLCBzdGF0aWNfY2Fz
dDxsb25nIGxvbmc+KGludFZlcnNpb24pKTsKKyAgICBpZiAoIXB1dFZhckludChUcmFuc2FjdGlv
bjo6bGV2ZWxEQlRyYW5zYWN0aW9uRnJvbSh0cmFuc2FjdGlvbiksIERhdGFiYXNlTWV0YURhdGFL
ZXk6OmVuY29kZShyb3dJZCwgRGF0YWJhc2VNZXRhRGF0YUtleTo6VXNlckludFZlcnNpb24pLCBp
bnRWZXJzaW9uKSkgeworICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3Rv
cmVXcml0ZUVycm9yKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4g
dHJ1ZTsKK30KKworYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjp1cGRhdGVJREJEYXRhYmFz
ZU1ldGFEYXRhKElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2
NF90IHJvd0lkLCBjb25zdCBTdHJpbmcmIHZlcnNpb24pCit7CisgICAgaWYgKCFwdXRTdHJpbmco
VHJhbnNhY3Rpb246OmxldmVsREJUcmFuc2FjdGlvbkZyb20odHJhbnNhY3Rpb24pLCBEYXRhYmFz
ZU1ldGFEYXRhS2V5OjplbmNvZGUocm93SWQsIERhdGFiYXNlTWV0YURhdGFLZXk6OlVzZXJWZXJz
aW9uKSwgdmVyc2lvbikpIHsKKyAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2lu
Z1N0b3JlV3JpdGVFcnJvcik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBy
ZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgZGVsZXRlUmFuZ2UoTGV2ZWxEQlRyYW5zYWN0
aW9uKiB0cmFuc2FjdGlvbiwgY29uc3QgVmVjdG9yPGNoYXI+JiBiZWdpbiwgY29uc3QgVmVjdG9y
PGNoYXI+JiBlbmQpCit7CisgICAgT3duUHRyPExldmVsREJJdGVyYXRvcj4gaXQgPSB0cmFuc2Fj
dGlvbi0+Y3JlYXRlSXRlcmF0b3IoKTsKKyAgICBmb3IgKGl0LT5zZWVrKGJlZ2luKTsgaXQtPmlz
VmFsaWQoKSAmJiBjb21wYXJlS2V5cyhpdC0+a2V5KCksIGVuZCkgPCAwOyBpdC0+bmV4dCgpKSB7
CisgICAgICAgIGlmICghdHJhbnNhY3Rpb24tPnJlbW92ZShpdC0+a2V5KCkpKSB7CisgICAgICAg
ICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVXcml0ZUVycm9yKTsKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0
cnVlOworfQorCisKK2Jvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlRGF0YWJhc2Uo
Y29uc3QgU3RyaW5nJiBuYW1lKQoreworICAgIElEQl9UUkFDRSgiSURCTGV2ZWxEQkJhY2tpbmdT
dG9yZTo6ZGVsZXRlRGF0YWJhc2UiKTsKKyAgICBPd25QdHI8TGV2ZWxEQldyaXRlT25seVRyYW5z
YWN0aW9uPiB0cmFuc2FjdGlvbiA9IExldmVsREJXcml0ZU9ubHlUcmFuc2FjdGlvbjo6Y3JlYXRl
KG1fZGIuZ2V0KCkpOworCisgICAgSURCRGF0YWJhc2VNZXRhZGF0YSBtZXRhZGF0YTsKKyAgICBp
ZiAoIWdldElEQkRhdGFiYXNlTWV0YURhdGEobmFtZSwgJm1ldGFkYXRhKSkKKyAgICAgICAgcmV0
dXJuIHRydWU7CisKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3RhcnRLZXkgPSBEYXRhYmFzZU1l
dGFEYXRhS2V5OjplbmNvZGUobWV0YWRhdGEuaWQsIERhdGFiYXNlTWV0YURhdGFLZXk6Ok9yaWdp
bk5hbWUpOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBzdG9wS2V5ID0gRGF0YWJhc2VNZXRhRGF0
YUtleTo6ZW5jb2RlKG1ldGFkYXRhLmlkICsgMSwgRGF0YWJhc2VNZXRhRGF0YUtleTo6T3JpZ2lu
TmFtZSk7CisgICAgT3duUHRyPExldmVsREJJdGVyYXRvcj4gaXQgPSBtX2RiLT5jcmVhdGVJdGVy
YXRvcigpOworICAgIGZvciAoaXQtPnNlZWsoc3RhcnRLZXkpOyBpdC0+aXNWYWxpZCgpICYmIGNv
bXBhcmVLZXlzKGl0LT5rZXkoKSwgc3RvcEtleSkgPCAwOyBpdC0+bmV4dCgpKQorICAgICAgICB0
cmFuc2FjdGlvbi0+cmVtb3ZlKGl0LT5rZXkoKSk7CisKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4g
a2V5ID0gRGF0YWJhc2VOYW1lS2V5OjplbmNvZGUobV9pZGVudGlmaWVyLCBuYW1lKTsKKyAgICB0
cmFuc2FjdGlvbi0+cmVtb3ZlKGtleSk7CisKKyAgICByZXR1cm4gdHJhbnNhY3Rpb24tPmNvbW1p
dCgpOworfQorCitzdGF0aWMgYm9vbCBjaGVja09iamVjdFN0b3JlQW5kTWV0YURhdGFUeXBlKGNv
bnN0IExldmVsREJJdGVyYXRvciogaXQsIGNvbnN0IFZlY3RvcjxjaGFyPiYgc3RvcEtleSwgaW50
NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IG1ldGFEYXRhVHlwZSkKK3sKKyAgICBpZiAoIWl0
LT5pc1ZhbGlkKCkgfHwgY29tcGFyZUtleXMoaXQtPmtleSgpLCBzdG9wS2V5KSA+PSAwKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBPYmplY3RTdG9yZU1ldGFEYXRhS2V5IG1ldGFEYXRh
S2V5OworICAgIGNvbnN0IGNoYXIqIHAgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpkZWNvZGUo
aXQtPmtleSgpLmJlZ2luKCksIGl0LT5rZXkoKS5lbmQoKSwgJm1ldGFEYXRhS2V5KTsKKyAgICBB
U1NFUlRfVU5VU0VEKHAsIHApOworICAgIGlmIChtZXRhRGF0YUtleS5vYmplY3RTdG9yZUlkKCkg
IT0gb2JqZWN0U3RvcmVJZCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChtZXRhRGF0
YUtleS5tZXRhRGF0YVR5cGUoKSAhPSBtZXRhRGF0YVR5cGUpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworVmVjdG9yPElEQk9iamVjdFN0b3JlTWV0YWRhdGE+
IElEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldE9iamVjdFN0b3JlcyhpbnQ2NF90IGRhdGFiYXNl
SWQpCit7CisgICAgSURCX1RSQUNFKCJJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRPYmplY3RT
dG9yZXMiKTsKKyAgICBWZWN0b3I8SURCT2JqZWN0U3RvcmVNZXRhZGF0YT4gb2JqZWN0U3RvcmVz
OworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBzdGFydEtleSA9IE9iamVjdFN0b3JlTWV0YURhdGFL
ZXk6OmVuY29kZShkYXRhYmFzZUlkLCAxLCAwKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3Rv
cEtleSA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZU1heEtleShkYXRhYmFzZUlkKTsK
KworICAgIE93blB0cjxMZXZlbERCSXRlcmF0b3I+IGl0ID0gbV9kYi0+Y3JlYXRlSXRlcmF0b3Io
KTsKKyAgICBpdC0+c2VlayhzdGFydEtleSk7CisgICAgd2hpbGUgKGl0LT5pc1ZhbGlkKCkgJiYg
Y29tcGFyZUtleXMoaXQtPmtleSgpLCBzdG9wS2V5KSA8IDApIHsKKyAgICAgICAgY29uc3QgY2hh
ciogcCA9IGl0LT5rZXkoKS5iZWdpbigpOworICAgICAgICBjb25zdCBjaGFyKiBsaW1pdCA9IGl0
LT5rZXkoKS5lbmQoKTsKKworICAgICAgICBPYmplY3RTdG9yZU1ldGFEYXRhS2V5IG1ldGFEYXRh
S2V5OworICAgICAgICBwID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZGVjb2RlKHAsIGxpbWl0
LCAmbWV0YURhdGFLZXkpOworICAgICAgICBBU1NFUlQocCk7CisgICAgICAgIGlmIChtZXRhRGF0
YUtleS5tZXRhRGF0YVR5cGUoKSAhPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpOYW1lKSB7Cisg
ICAgICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVSZWFkRXJyb3Ip
OworICAgICAgICAgICAgLy8gUG9zc2libGUgc3RhbGUgbWV0YWRhdGEsIGJ1dCBkb24ndCBmYWls
IHRoZSBsb2FkLgorICAgICAgICAgICAgaXQtPm5leHQoKTsKKyAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICB9CisKKyAgICAgICAgaW50NjRfdCBvYmplY3RTdG9yZUlkID0gbWV0YURhdGFL
ZXkub2JqZWN0U3RvcmVJZCgpOworCisgICAgICAgIC8vIEZJWE1FOiBEbyB0aGlzIGJ5IGRpcmVj
dCBrZXkgbG9va3VwIHJhdGhlciB0aGFuIGl0ZXJhdGlvbiwgdG8gc2ltcGxpZnkuCisgICAgICAg
IFN0cmluZyBvYmplY3RTdG9yZU5hbWUgPSBkZWNvZGVTdHJpbmcoaXQtPnZhbHVlKCkuYmVnaW4o
KSwgaXQtPnZhbHVlKCkuZW5kKCkpOworCisgICAgICAgIGl0LT5uZXh0KCk7CisgICAgICAgIGlm
ICghY2hlY2tPYmplY3RTdG9yZUFuZE1ldGFEYXRhVHlwZShpdC5nZXQoKSwgc3RvcEtleSwgb2Jq
ZWN0U3RvcmVJZCwgT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6S2V5UGF0aCkpIHsKKyAgICAgICAg
ICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVJlYWRFcnJvcik7CisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBJREJLZXlQYXRoIGtleVBhdGggPSBk
ZWNvZGVJREJLZXlQYXRoKGl0LT52YWx1ZSgpLmJlZ2luKCksIGl0LT52YWx1ZSgpLmVuZCgpKTsK
KworICAgICAgICBpdC0+bmV4dCgpOworICAgICAgICBpZiAoIWNoZWNrT2JqZWN0U3RvcmVBbmRN
ZXRhRGF0YVR5cGUoaXQuZ2V0KCksIHN0b3BLZXksIG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3Jl
TWV0YURhdGFLZXk6OkF1dG9JbmNyZW1lbnQpKSB7CisgICAgICAgICAgICBJbnRlcm5hbEVycm9y
KElEQkxldmVsREJCYWNraW5nU3RvcmVSZWFkRXJyb3IpOworICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIH0KKyAgICAgICAgYm9vbCBhdXRvSW5jcmVtZW50ID0gZGVjb2RlQm9vbChpdC0+dmFs
dWUoKS5iZWdpbigpLCBpdC0+dmFsdWUoKS5lbmQoKSk7CisKKyAgICAgICAgaXQtPm5leHQoKTsg
Ly8gSXMgZXZpY2F0YmxlLgorICAgICAgICBpZiAoIWNoZWNrT2JqZWN0U3RvcmVBbmRNZXRhRGF0
YVR5cGUoaXQuZ2V0KCksIHN0b3BLZXksIG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlTWV0YURh
dGFLZXk6OkV2aWN0YWJsZSkpIHsKKyAgICAgICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxE
QkJhY2tpbmdTdG9yZVJlYWRFcnJvcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQor
CisgICAgICAgIGl0LT5uZXh0KCk7IC8vIExhc3QgdmVyc2lvbi4KKyAgICAgICAgaWYgKCFjaGVj
a09iamVjdFN0b3JlQW5kTWV0YURhdGFUeXBlKGl0LmdldCgpLCBzdG9wS2V5LCBvYmplY3RTdG9y
ZUlkLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpMYXN0VmVyc2lvbikpIHsKKyAgICAgICAgICAg
IEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVJlYWRFcnJvcik7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGl0LT5uZXh0KCk7IC8vIE1heGltdW0g
aW5kZXggaWQgYWxsb2NhdGVkLgorICAgICAgICBpZiAoIWNoZWNrT2JqZWN0U3RvcmVBbmRNZXRh
RGF0YVR5cGUoaXQuZ2V0KCksIHN0b3BLZXksIG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlTWV0
YURhdGFLZXk6Ok1heEluZGV4SWQpKSB7CisgICAgICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxl
dmVsREJCYWNraW5nU3RvcmVSZWFkRXJyb3IpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IH0KKyAgICAgICAgaW50NjRfdCBtYXhJbmRleElkID0gZGVjb2RlSW50KGl0LT52YWx1ZSgpLmJl
Z2luKCksIGl0LT52YWx1ZSgpLmVuZCgpKTsKKworICAgICAgICBpdC0+bmV4dCgpOyAvLyBbb3B0
aW9uYWxdIGhhcyBrZXkgcGF0aCAoaXMgbm90IG51bGwpCisgICAgICAgIGlmIChjaGVja09iamVj
dFN0b3JlQW5kTWV0YURhdGFUeXBlKGl0LmdldCgpLCBzdG9wS2V5LCBvYmplY3RTdG9yZUlkLCBP
YmplY3RTdG9yZU1ldGFEYXRhS2V5OjpIYXNLZXlQYXRoKSkgeworICAgICAgICAgICAgYm9vbCBo
YXNLZXlQYXRoID0gZGVjb2RlQm9vbChpdC0+dmFsdWUoKS5iZWdpbigpLCBpdC0+dmFsdWUoKS5l
bmQoKSk7CisgICAgICAgICAgICAvLyBUaGlzIGNoZWNrIGFjY291bnRzIGZvciB0d28gbGF5ZXJz
IG9mIGxlZ2FjeSBjb2Rpbmc6CisgICAgICAgICAgICAvLyAoMSkgSW5pdGlhbGx5LCBoYXNLZXlQ
YXRoIHdhcyBhZGRlZCB0byBkaXN0aW5ndWlzaCBudWxsIHZzLiBzdHJpbmcuCisgICAgICAgICAg
ICAvLyAoMikgTGF0ZXIsIG51bGwgdnMuIHN0cmluZyB2cy4gYXJyYXkgd2FzIHN0b3JlZCBpbiB0
aGUga2V5UGF0aCBpdHNlbGYuCisgICAgICAgICAgICAvLyBTbyB0aGlzIGNoZWNrIGlzIG9ubHkg
cmVsZXZhbnQgZm9yIHN0cmluZy10eXBlIGtleVBhdGhzLgorICAgICAgICAgICAgaWYgKCFoYXNL
ZXlQYXRoICYmIChrZXlQYXRoLnR5cGUoKSA9PSBJREJLZXlQYXRoOjpTdHJpbmdUeXBlICYmICFr
ZXlQYXRoLnN0cmluZygpLmlzRW1wdHkoKSkpIHsKKyAgICAgICAgICAgICAgICBJbnRlcm5hbEVy
cm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVSZWFkRXJyb3IpOworICAgICAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFoYXNLZXlQYXRoKQorICAgICAg
ICAgICAgICAgIGtleVBhdGggPSBJREJLZXlQYXRoKCk7CisgICAgICAgICAgICBpdC0+bmV4dCgp
OworICAgICAgICB9CisKKyAgICAgICAgaW50NjRfdCBrZXlHZW5lcmF0b3JDdXJyZW50TnVtYmVy
ID0gLTE7CisgICAgICAgIGlmIChjaGVja09iamVjdFN0b3JlQW5kTWV0YURhdGFUeXBlKGl0Lmdl
dCgpLCBzdG9wS2V5LCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpLZXlH
ZW5lcmF0b3JDdXJyZW50TnVtYmVyKSkgeworICAgICAgICAgICAga2V5R2VuZXJhdG9yQ3VycmVu
dE51bWJlciA9IGRlY29kZUludChpdC0+dmFsdWUoKS5iZWdpbigpLCBpdC0+dmFsdWUoKS5lbmQo
KSk7CisgICAgICAgICAgICAvLyBGSVhNRTogUmV0dXJuIGtleUdlbmVyYXRvckN1cnJlbnROdW1i
ZXIsIGNhY2hlIGluIG9iamVjdCBzdG9yZSwgYW5kIHdyaXRlIGxhemlseSB0byBiYWNraW5nIHN0
b3JlLgorICAgICAgICAgICAgLy8gRm9yIG5vdywganVzdCBhc3NlcnQgdGhhdCBpZiBpdCB3YXMg
d3JpdHRlbiBpdCB3YXMgdmFsaWQuCisgICAgICAgICAgICBBU1NFUlRfVU5VU0VEKGtleUdlbmVy
YXRvckN1cnJlbnROdW1iZXIsIGtleUdlbmVyYXRvckN1cnJlbnROdW1iZXIgPj0gS2V5R2VuZXJh
dG9ySW5pdGlhbE51bWJlcik7CisgICAgICAgICAgICBpdC0+bmV4dCgpOworICAgICAgICB9CisK
KyAgICAgICAgb2JqZWN0U3RvcmVzLmFwcGVuZChJREJPYmplY3RTdG9yZU1ldGFkYXRhKG9iamVj
dFN0b3JlTmFtZSwgb2JqZWN0U3RvcmVJZCwga2V5UGF0aCwgYXV0b0luY3JlbWVudCwgbWF4SW5k
ZXhJZCkpOworICAgIH0KKyAgICByZXR1cm4gb2JqZWN0U3RvcmVzOworfQorCitzdGF0aWMgYm9v
bCBzZXRNYXhPYmplY3RTdG9yZUlkKExldmVsREJUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGlu
dDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKQoreworICAgIGNvbnN0IFZl
Y3RvcjxjaGFyPiBtYXhPYmplY3RTdG9yZUlkS2V5ID0gRGF0YWJhc2VNZXRhRGF0YUtleTo6ZW5j
b2RlKGRhdGFiYXNlSWQsIERhdGFiYXNlTWV0YURhdGFLZXk6Ok1heE9iamVjdFN0b3JlSWQpOwor
ICAgIGludDY0X3QgbWF4T2JqZWN0U3RvcmVJZCA9IGdldE1heE9iamVjdFN0b3JlSWQodHJhbnNh
Y3Rpb24sIG1heE9iamVjdFN0b3JlSWRLZXkpOworCisgICAgaWYgKG9iamVjdFN0b3JlSWQgPD0g
bWF4T2JqZWN0U3RvcmVJZCkgeworICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNr
aW5nU3RvcmVDb25zaXN0ZW5jeUVycm9yKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0K
KyAgICBpZiAoIXB1dEludCh0cmFuc2FjdGlvbiwgbWF4T2JqZWN0U3RvcmVJZEtleSwgb2JqZWN0
U3RvcmVJZCkpIHsKKyAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3Jl
V3JpdGVFcnJvcik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRy
dWU7Cit9CisKK2Jvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Y3JlYXRlT2JqZWN0U3RvcmUo
SURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGludDY0X3QgZGF0YWJh
c2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IElE
QktleVBhdGgmIGtleVBhdGgsIGJvb2wgYXV0b0luY3JlbWVudCkKK3sKKyAgICBJREJfVFJBQ0Uo
IklEQkxldmVsREJCYWNraW5nU3RvcmU6OmNyZWF0ZU9iamVjdFN0b3JlIik7CisgICAgTGV2ZWxE
QlRyYW5zYWN0aW9uKiBsZXZlbERCVHJhbnNhY3Rpb24gPSBUcmFuc2FjdGlvbjo6bGV2ZWxEQlRy
YW5zYWN0aW9uRnJvbSh0cmFuc2FjdGlvbik7CisgICAgaWYgKCFzZXRNYXhPYmplY3RTdG9yZUlk
KGxldmVsREJUcmFuc2FjdGlvbiwgZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBuYW1lS2V5ID0gT2JqZWN0
U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIE9iamVj
dFN0b3JlTWV0YURhdGFLZXk6Ok5hbWUpOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBrZXlQYXRo
S2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0
b3JlSWQsIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OktleVBhdGgpOworICAgIGNvbnN0IFZlY3Rv
cjxjaGFyPiBhdXRvSW5jcmVtZW50S2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2Rl
KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OkF1dG9J
bmNyZW1lbnQpOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBldmljdGFibGVLZXkgPSBPYmplY3RT
dG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgT2JqZWN0
U3RvcmVNZXRhRGF0YUtleTo6RXZpY3RhYmxlKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gbGFz
dFZlcnNpb25LZXkgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwg
b2JqZWN0U3RvcmVJZCwgT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6TGFzdFZlcnNpb24pOworICAg
IGNvbnN0IFZlY3RvcjxjaGFyPiBtYXhJbmRleElkS2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtl
eTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlTWV0YURhdGFL
ZXk6Ok1heEluZGV4SWQpOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBoYXNLZXlQYXRoS2V5ICA9
IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlk
LCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpIYXNLZXlQYXRoKTsKKyAgICBjb25zdCBWZWN0b3I8
Y2hhcj4ga2V5R2VuZXJhdG9yQ3VycmVudE51bWJlcktleSA9IE9iamVjdFN0b3JlTWV0YURhdGFL
ZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZU1ldGFEYXRh
S2V5OjpLZXlHZW5lcmF0b3JDdXJyZW50TnVtYmVyKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4g
bmFtZXNLZXkgPSBPYmplY3RTdG9yZU5hbWVzS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgbmFtZSk7
CisKKyAgICBib29sIG9rID0gcHV0U3RyaW5nKGxldmVsREJUcmFuc2FjdGlvbiwgbmFtZUtleSwg
bmFtZSk7CisgICAgaWYgKCFvaykgeworICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJC
YWNraW5nU3RvcmVXcml0ZUVycm9yKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwor
ICAgIG9rID0gcHV0SURCS2V5UGF0aChsZXZlbERCVHJhbnNhY3Rpb24sIGtleVBhdGhLZXksIGtl
eVBhdGgpOworICAgIGlmICghb2spIHsKKyAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERC
QmFja2luZ1N0b3JlV3JpdGVFcnJvcik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisK
KyAgICBvayA9IHB1dEludChsZXZlbERCVHJhbnNhY3Rpb24sIGF1dG9JbmNyZW1lbnRLZXksIGF1
dG9JbmNyZW1lbnQpOworICAgIGlmICghb2spIHsKKyAgICAgICAgSW50ZXJuYWxFcnJvcihJREJM
ZXZlbERCQmFja2luZ1N0b3JlV3JpdGVFcnJvcik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICB9CisKKyAgICBvayA9IHB1dEludChsZXZlbERCVHJhbnNhY3Rpb24sIGV2aWN0YWJsZUtleSwg
ZmFsc2UpOworICAgIGlmICghb2spIHsKKyAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERC
QmFja2luZ1N0b3JlV3JpdGVFcnJvcik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisK
KyAgICBvayA9IHB1dEludChsZXZlbERCVHJhbnNhY3Rpb24sIGxhc3RWZXJzaW9uS2V5LCAxKTsK
KyAgICBpZiAoIW9rKSB7CisgICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdT
dG9yZVdyaXRlRXJyb3IpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgb2sg
PSBwdXRJbnQobGV2ZWxEQlRyYW5zYWN0aW9uLCBtYXhJbmRleElkS2V5LCBNaW5pbXVtSW5kZXhJ
ZCk7CisgICAgaWYgKCFvaykgeworICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNr
aW5nU3RvcmVXcml0ZUVycm9yKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAg
IG9rID0gcHV0Qm9vbChsZXZlbERCVHJhbnNhY3Rpb24sIGhhc0tleVBhdGhLZXksICFrZXlQYXRo
LmlzTnVsbCgpKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2
ZWxEQkJhY2tpbmdTdG9yZVdyaXRlRXJyb3IpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
fQorCisgICAgb2sgPSBwdXRJbnQobGV2ZWxEQlRyYW5zYWN0aW9uLCBrZXlHZW5lcmF0b3JDdXJy
ZW50TnVtYmVyS2V5LCBLZXlHZW5lcmF0b3JJbml0aWFsTnVtYmVyKTsKKyAgICBpZiAoIW9rKSB7
CisgICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVdyaXRlRXJyb3Ip
OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgb2sgPSBwdXRJbnQobGV2ZWxE
QlRyYW5zYWN0aW9uLCBuYW1lc0tleSwgb2JqZWN0U3RvcmVJZCk7CisgICAgaWYgKCFvaykgewor
ICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVXcml0ZUVycm9yKTsK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit2
b2lkIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmRlbGV0ZU9iamVjdFN0b3JlKElEQkJhY2tpbmdT
dG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0
X3Qgb2JqZWN0U3RvcmVJZCkKK3sKKyAgICBJREJfVFJBQ0UoIklEQkxldmVsREJCYWNraW5nU3Rv
cmU6OmRlbGV0ZU9iamVjdFN0b3JlIik7CisgICAgTGV2ZWxEQlRyYW5zYWN0aW9uKiBsZXZlbERC
VHJhbnNhY3Rpb24gPSBUcmFuc2FjdGlvbjo6bGV2ZWxEQlRyYW5zYWN0aW9uRnJvbSh0cmFuc2Fj
dGlvbik7CisKKyAgICBTdHJpbmcgb2JqZWN0U3RvcmVOYW1lOworICAgIGdldFN0cmluZyhsZXZl
bERCVHJhbnNhY3Rpb24sIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlk
LCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpOYW1lKSwgb2JqZWN0U3Rv
cmVOYW1lKTsKKworICAgIGlmICghZGVsZXRlUmFuZ2UobGV2ZWxEQlRyYW5zYWN0aW9uLCBPYmpl
Y3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMCks
IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZU1heEtleShkYXRhYmFzZUlkLCBvYmplY3RT
dG9yZUlkKSkpIHsKKyAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3Jl
V3JpdGVFcnJvcik7CisgICAgICAgIHJldHVybjsgLy8gRklYTUU6IFJlcG9ydCBlcnJvci4KKyAg
ICB9CisKKyAgICBsZXZlbERCVHJhbnNhY3Rpb24tPnJlbW92ZShPYmplY3RTdG9yZU5hbWVzS2V5
OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVOYW1lKSk7CisKKyAgICBpZiAoIWRlbGV0
ZVJhbmdlKGxldmVsREJUcmFuc2FjdGlvbiwgSW5kZXhGcmVlTGlzdEtleTo6ZW5jb2RlKGRhdGFi
YXNlSWQsIG9iamVjdFN0b3JlSWQsIDApLCBJbmRleEZyZWVMaXN0S2V5OjplbmNvZGVNYXhLZXko
ZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCkpKSB7CisgICAgICAgIEludGVybmFsRXJyb3IoSURC
TGV2ZWxEQkJhY2tpbmdTdG9yZVdyaXRlRXJyb3IpOworICAgICAgICByZXR1cm47IC8vIEZJWE1F
OiBSZXBvcnQgZXJyb3IuCisgICAgfQorICAgIGlmICghZGVsZXRlUmFuZ2UobGV2ZWxEQlRyYW5z
YWN0aW9uLCBJbmRleE1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJ
ZCwgMCwgMCksIEluZGV4TWV0YURhdGFLZXk6OmVuY29kZU1heEtleShkYXRhYmFzZUlkLCBvYmpl
Y3RTdG9yZUlkKSkpIHsKKyAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0
b3JlV3JpdGVFcnJvcik7CisgICAgICAgIHJldHVybjsgLy8gRklYTUU6IFJlcG9ydCBlcnJvci4K
KyAgICB9CisKKyAgICBjbGVhck9iamVjdFN0b3JlKHRyYW5zYWN0aW9uLCBkYXRhYmFzZUlkLCBv
YmplY3RTdG9yZUlkKTsKK30KKworU3RyaW5nIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldE9i
amVjdFN0b3JlUmVjb3JkKElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9u
LCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5
JiBrZXkpCit7CisgICAgSURCX1RSQUNFKCJJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRPYmpl
Y3RTdG9yZVJlY29yZCIpOworICAgIExldmVsREJUcmFuc2FjdGlvbiogbGV2ZWxEQlRyYW5zYWN0
aW9uID0gVHJhbnNhY3Rpb246OmxldmVsREJUcmFuc2FjdGlvbkZyb20odHJhbnNhY3Rpb24pOwor
CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IGxldmVsZGJLZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6
OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBrZXkpOworICAgIFZlY3RvcjxjaGFy
PiBkYXRhOworCisgICAgaWYgKCFsZXZlbERCVHJhbnNhY3Rpb24tPmdldChsZXZlbGRiS2V5LCBk
YXRhKSkKKyAgICAgICAgcmV0dXJuIFN0cmluZygpOworCisgICAgaW50NjRfdCB2ZXJzaW9uOwor
ICAgIGNvbnN0IGNoYXIqIHAgPSBkZWNvZGVWYXJJbnQoZGF0YS5iZWdpbigpLCBkYXRhLmVuZCgp
LCB2ZXJzaW9uKTsKKyAgICBpZiAoIXApIHsKKyAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZl
bERCQmFja2luZ1N0b3JlUmVhZEVycm9yKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZygpOworICAg
IH0KKyAgICAodm9pZCkgdmVyc2lvbjsKKworICAgIHJldHVybiBkZWNvZGVTdHJpbmcocCwgZGF0
YS5lbmQoKSk7Cit9CisKK25hbWVzcGFjZSB7CitjbGFzcyBMZXZlbERCUmVjb3JkSWRlbnRpZmll
ciA6IHB1YmxpYyBJREJCYWNraW5nU3RvcmU6Ok9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllciB7
CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NSZWZQdHI8TGV2ZWxEQlJlY29yZElkZW50aWZpZXI+
IGNyZWF0ZShjb25zdCBWZWN0b3I8Y2hhcj4mIHByaW1hcnlLZXksIGludDY0X3QgdmVyc2lvbikg
eyByZXR1cm4gYWRvcHRSZWYobmV3IExldmVsREJSZWNvcmRJZGVudGlmaWVyKHByaW1hcnlLZXks
IHZlcnNpb24pKTsgfQorICAgIHN0YXRpYyBQYXNzUmVmUHRyPExldmVsREJSZWNvcmRJZGVudGlm
aWVyPiBjcmVhdGUoKSB7IHJldHVybiBhZG9wdFJlZihuZXcgTGV2ZWxEQlJlY29yZElkZW50aWZp
ZXIoKSk7IH0KKworICAgIHZpcnR1YWwgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gbV9w
cmltYXJ5S2V5LmlzRW1wdHkoKTsgfQorICAgIFZlY3RvcjxjaGFyPiBwcmltYXJ5S2V5KCkgY29u
c3QgeyByZXR1cm4gbV9wcmltYXJ5S2V5OyB9CisgICAgdm9pZCBzZXRQcmltYXJ5S2V5KGNvbnN0
IFZlY3RvcjxjaGFyPiYgcHJpbWFyeUtleSkgeyBtX3ByaW1hcnlLZXkgPSBwcmltYXJ5S2V5OyB9
CisgICAgaW50NjRfdCB2ZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gbV92ZXJzaW9uOyB9CisgICAg
dm9pZCBzZXRWZXJzaW9uKGludDY0X3QgdmVyc2lvbikgeyBtX3ZlcnNpb24gPSB2ZXJzaW9uOyB9
CisKK3ByaXZhdGU6CisgICAgTGV2ZWxEQlJlY29yZElkZW50aWZpZXIoY29uc3QgVmVjdG9yPGNo
YXI+JiBwcmltYXJ5S2V5LCBpbnQ2NF90IHZlcnNpb24pIDogbV9wcmltYXJ5S2V5KHByaW1hcnlL
ZXkpLCBtX3ZlcnNpb24odmVyc2lvbikgeyBBU1NFUlQoIXByaW1hcnlLZXkuaXNFbXB0eSgpKTsg
fQorICAgIExldmVsREJSZWNvcmRJZGVudGlmaWVyKCkgOiBtX3ByaW1hcnlLZXkoKSwgbV92ZXJz
aW9uKC0xKSB7IH0KKworICAgIFZlY3RvcjxjaGFyPiBtX3ByaW1hcnlLZXk7IC8vIEZJWE1FOiBN
YWtlIGl0IG1vcmUgY2xlYXIgdGhhdCB0aGlzIGlzIHRoZSAqZW5jb2RlZCogdmVyc2lvbiBvZiB0
aGUga2V5LgorICAgIGludDY0X3QgbV92ZXJzaW9uOworfTsKK30KKworc3RhdGljIGludDY0X3Qg
Z2V0TmV3VmVyc2lvbk51bWJlcihMZXZlbERCVHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2
NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKK3sKKyAgICBjb25zdCBWZWN0
b3I8Y2hhcj4gbGFzdFZlcnNpb25LZXkgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUo
ZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6TGFzdFZl
cnNpb24pOworCisgICAgaW50NjRfdCBsYXN0VmVyc2lvbiA9IC0xOworICAgIGlmICghZ2V0SW50
KHRyYW5zYWN0aW9uLCBsYXN0VmVyc2lvbktleSwgbGFzdFZlcnNpb24pKQorICAgICAgICBsYXN0
VmVyc2lvbiA9IDA7CisKKyAgICBBU1NFUlQobGFzdFZlcnNpb24gPj0gMCk7CisKKyAgICBpbnQ2
NF90IHZlcnNpb24gPSBsYXN0VmVyc2lvbiArIDE7CisgICAgYm9vbCBvayA9IHB1dEludCh0cmFu
c2FjdGlvbiwgbGFzdFZlcnNpb25LZXksIHZlcnNpb24pOworICAgIEFTU0VSVF9VTlVTRUQob2ss
IG9rKTsKKworICAgIEFTU0VSVCh2ZXJzaW9uID4gbGFzdFZlcnNpb24pOyAvLyBGSVhNRTogVGhp
bmsgYWJvdXQgaG93IHdlIHdhbnQgdG8gaGFuZGxlIHRoZSBvdmVyZmxvdyBzY2VuYXJpby4KKwor
ICAgIHJldHVybiB2ZXJzaW9uOworfQorCitib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OnB1
dE9iamVjdFN0b3JlUmVjb3JkKElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5zYWN0
aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURC
S2V5JiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUsIE9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmll
ciogcmVjb3JkSWRlbnRpZmllcikKK3sKKyAgICBJREJfVFJBQ0UoIklEQkxldmVsREJCYWNraW5n
U3RvcmU6OnB1dE9iamVjdFN0b3JlUmVjb3JkIik7CisgICAgQVNTRVJUKGtleS5pc1ZhbGlkKCkp
OworICAgIExldmVsREJUcmFuc2FjdGlvbiogbGV2ZWxEQlRyYW5zYWN0aW9uID0gVHJhbnNhY3Rp
b246OmxldmVsREJUcmFuc2FjdGlvbkZyb20odHJhbnNhY3Rpb24pOworICAgIGludDY0X3QgdmVy
c2lvbiA9IGdldE5ld1ZlcnNpb25OdW1iZXIobGV2ZWxEQlRyYW5zYWN0aW9uLCBkYXRhYmFzZUlk
LCBvYmplY3RTdG9yZUlkKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gb2JqZWN0U3RvcmVkYXRh
S2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJ
ZCwga2V5KTsKKworICAgIFZlY3RvcjxjaGFyPiB2OworICAgIHYuYXBwZW5kKGVuY29kZVZhcklu
dCh2ZXJzaW9uKSk7CisgICAgdi5hcHBlbmQoZW5jb2RlU3RyaW5nKHZhbHVlKSk7CisKKyAgICBp
ZiAoIWxldmVsREJUcmFuc2FjdGlvbi0+cHV0KG9iamVjdFN0b3JlZGF0YUtleSwgdikpIHsKKyAg
ICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlV3JpdGVFcnJvcik7Cisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gZXhp
c3RzRW50cnlLZXkgPSBFeGlzdHNFbnRyeUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0
b3JlSWQsIGtleSk7CisgICAgaWYgKCFsZXZlbERCVHJhbnNhY3Rpb24tPnB1dChleGlzdHNFbnRy
eUtleSwgZW5jb2RlSW50KHZlcnNpb24pKSkgeworICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxl
dmVsREJCYWNraW5nU3RvcmVXcml0ZUVycm9yKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IH0KKworICAgIExldmVsREJSZWNvcmRJZGVudGlmaWVyKiBsZXZlbERCUmVjb3JkSWRlbnRpZmll
ciA9IHN0YXRpY19jYXN0PExldmVsREJSZWNvcmRJZGVudGlmaWVyKj4ocmVjb3JkSWRlbnRpZmll
cik7CisgICAgbGV2ZWxEQlJlY29yZElkZW50aWZpZXItPnNldFByaW1hcnlLZXkoZW5jb2RlSURC
S2V5KGtleSkpOworICAgIGxldmVsREJSZWNvcmRJZGVudGlmaWVyLT5zZXRWZXJzaW9uKHZlcnNp
b24pOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIElEQkxldmVsREJCYWNraW5nU3RvcmU6
OmNsZWFyT2JqZWN0U3RvcmUoSURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbiogdHJhbnNhY3Rp
b24sIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKQoreworICAgIElE
Ql9UUkFDRSgiSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Y2xlYXJPYmplY3RTdG9yZSIpOworICAg
IExldmVsREJUcmFuc2FjdGlvbiogbGV2ZWxEQlRyYW5zYWN0aW9uID0gVHJhbnNhY3Rpb246Omxl
dmVsREJUcmFuc2FjdGlvbkZyb20odHJhbnNhY3Rpb24pOworICAgIGNvbnN0IFZlY3RvcjxjaGFy
PiBzdGFydEtleSA9IEtleVByZWZpeChkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAwKS5lbmNv
ZGUoKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3RvcEtleSA9IEtleVByZWZpeChkYXRhYmFz
ZUlkLCBvYmplY3RTdG9yZUlkICsgMSwgMCkuZW5jb2RlKCk7CisKKyAgICBkZWxldGVSYW5nZShs
ZXZlbERCVHJhbnNhY3Rpb24sIHN0YXJ0S2V5LCBzdG9wS2V5KTsKK30KKworUGFzc1JlZlB0cjxJ
REJCYWNraW5nU3RvcmU6Ok9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllcj4gSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZTo6Y3JlYXRlSW52YWxpZFJlY29yZElkZW50aWZpZXIoKQoreworICAgIHJldHVy
biBMZXZlbERCUmVjb3JkSWRlbnRpZmllcjo6Y3JlYXRlKCk7Cit9CisKK3ZvaWQgSURCTGV2ZWxE
QkJhY2tpbmdTdG9yZTo6ZGVsZXRlT2JqZWN0U3RvcmVSZWNvcmQoSURCQmFja2luZ1N0b3JlOjpU
cmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmpl
Y3RTdG9yZUlkLCBjb25zdCBPYmplY3RTdG9yZVJlY29yZElkZW50aWZpZXIqIHJlY29yZElkZW50
aWZpZXIpCit7CisgICAgSURCX1RSQUNFKCJJREJMZXZlbERCQmFja2luZ1N0b3JlOjpkZWxldGVP
YmplY3RTdG9yZVJlY29yZCIpOworICAgIExldmVsREJUcmFuc2FjdGlvbiogbGV2ZWxEQlRyYW5z
YWN0aW9uID0gVHJhbnNhY3Rpb246OmxldmVsREJUcmFuc2FjdGlvbkZyb20odHJhbnNhY3Rpb24p
OworICAgIGNvbnN0IExldmVsREJSZWNvcmRJZGVudGlmaWVyKiBsZXZlbERCUmVjb3JkSWRlbnRp
ZmllciA9IHN0YXRpY19jYXN0PGNvbnN0IExldmVsREJSZWNvcmRJZGVudGlmaWVyKj4ocmVjb3Jk
SWRlbnRpZmllcik7CisKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gb2JqZWN0U3RvcmVEYXRhS2V5
ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwg
bGV2ZWxEQlJlY29yZElkZW50aWZpZXItPnByaW1hcnlLZXkoKSk7CisgICAgbGV2ZWxEQlRyYW5z
YWN0aW9uLT5yZW1vdmUob2JqZWN0U3RvcmVEYXRhS2V5KTsKKworICAgIGNvbnN0IFZlY3Rvcjxj
aGFyPiBleGlzdHNFbnRyeUtleSA9IEV4aXN0c0VudHJ5S2V5OjplbmNvZGUoZGF0YWJhc2VJZCwg
b2JqZWN0U3RvcmVJZCwgbGV2ZWxEQlJlY29yZElkZW50aWZpZXItPnByaW1hcnlLZXkoKSk7Cisg
ICAgbGV2ZWxEQlRyYW5zYWN0aW9uLT5yZW1vdmUoZXhpc3RzRW50cnlLZXkpOworfQorCisKK2lu
dDY0X3QgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0S2V5R2VuZXJhdG9yQ3VycmVudE51bWJl
cihJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgaW50NjRfdCBkYXRh
YmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpCit7CisgICAgTGV2ZWxEQlRyYW5zYWN0aW9u
KiBsZXZlbERCVHJhbnNhY3Rpb24gPSBUcmFuc2FjdGlvbjo6bGV2ZWxEQlRyYW5zYWN0aW9uRnJv
bSh0cmFuc2FjdGlvbik7CisKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4ga2V5R2VuZXJhdG9yQ3Vy
cmVudE51bWJlcktleSA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlk
LCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpLZXlHZW5lcmF0b3JDdXJy
ZW50TnVtYmVyKTsKKworICAgIGludDY0X3Qga2V5R2VuZXJhdG9yQ3VycmVudE51bWJlciA9IC0x
OworICAgIFZlY3RvcjxjaGFyPiBkYXRhOworCisgICAgaWYgKGxldmVsREJUcmFuc2FjdGlvbi0+
Z2V0KGtleUdlbmVyYXRvckN1cnJlbnROdW1iZXJLZXksIGRhdGEpKQorICAgICAgICBrZXlHZW5l
cmF0b3JDdXJyZW50TnVtYmVyID0gZGVjb2RlSW50KGRhdGEuYmVnaW4oKSwgZGF0YS5lbmQoKSk7
CisgICAgZWxzZSB7CisgICAgICAgIC8vIFByZXZpb3VzbHksIHRoZSBrZXkgZ2VuZXJhdG9yIHN0
YXRlIHdhcyBub3Qgc3RvcmVkIGV4cGxpY2l0bHkgYnV0IGRlcml2ZWQgZnJvbSB0aGUKKyAgICAg
ICAgLy8gbWF4aW11bSBudW1lcmljIGtleSBwcmVzZW50IGluIGV4aXN0aW5nIGRhdGEuIFRoaXMg
dmlvbGF0ZXMgdGhlIHNwZWMgYXMgdGhlIGRhdGEgbWF5CisgICAgICAgIC8vIGJlIGNsZWFyZWQg
YnV0IHRoZSBrZXkgZ2VuZXJhdG9yIHN0YXRlIG11c3QgYmUgcHJlc2VydmVkLgorICAgICAgICBj
b25zdCBWZWN0b3I8Y2hhcj4gc3RhcnRLZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShk
YXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBtaW5JREJLZXkoKSk7CisgICAgICAgIGNvbnN0IFZl
Y3RvcjxjaGFyPiBzdG9wS2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCwgbWF4SURCS2V5KCkpOworCisgICAgICAgIE93blB0cjxMZXZlbERC
SXRlcmF0b3I+IGl0ID0gbGV2ZWxEQlRyYW5zYWN0aW9uLT5jcmVhdGVJdGVyYXRvcigpOworICAg
ICAgICBpbnQ2NF90IG1heE51bWVyaWNLZXkgPSAwOworCisgICAgICAgIGZvciAoaXQtPnNlZWso
c3RhcnRLZXkpOyBpdC0+aXNWYWxpZCgpICYmIGNvbXBhcmVLZXlzKGl0LT5rZXkoKSwgc3RvcEtl
eSkgPCAwOyBpdC0+bmV4dCgpKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBwID0gaXQtPmtl
eSgpLmJlZ2luKCk7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBsaW1pdCA9IGl0LT5rZXkoKS5l
bmQoKTsKKworICAgICAgICAgICAgT2JqZWN0U3RvcmVEYXRhS2V5IGRhdGFLZXk7CisgICAgICAg
ICAgICBwID0gT2JqZWN0U3RvcmVEYXRhS2V5OjpkZWNvZGUocCwgbGltaXQsICZkYXRhS2V5KTsK
KyAgICAgICAgICAgIEFTU0VSVChwKTsKKworICAgICAgICAgICAgaWYgKGRhdGFLZXkudXNlcktl
eSgpLT50eXBlKCkgPT0gSURCS2V5OjpOdW1iZXJUeXBlKSB7CisgICAgICAgICAgICAgICAgaW50
NjRfdCBuID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oZGF0YUtleS51c2VyS2V5KCktPm51bWJlcigp
KTsKKyAgICAgICAgICAgICAgICBpZiAobiA+IG1heE51bWVyaWNLZXkpCisgICAgICAgICAgICAg
ICAgICAgIG1heE51bWVyaWNLZXkgPSBuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAg
ICAgICAga2V5R2VuZXJhdG9yQ3VycmVudE51bWJlciA9IG1heE51bWVyaWNLZXkgKyAxOworICAg
IH0KKworICAgIHJldHVybiBrZXlHZW5lcmF0b3JDdXJyZW50TnVtYmVyOworfQorCitib29sIElE
QkxldmVsREJCYWNraW5nU3RvcmU6Om1heWJlVXBkYXRlS2V5R2VuZXJhdG9yQ3VycmVudE51bWJl
cihJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgaW50NjRfdCBkYXRh
YmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgbmV3TnVtYmVyLCBib29sIGNo
ZWNrQ3VycmVudCkKK3sKKyAgICBMZXZlbERCVHJhbnNhY3Rpb24qIGxldmVsREJUcmFuc2FjdGlv
biA9IFRyYW5zYWN0aW9uOjpsZXZlbERCVHJhbnNhY3Rpb25Gcm9tKHRyYW5zYWN0aW9uKTsKKwor
ICAgIGlmIChjaGVja0N1cnJlbnQpIHsKKyAgICAgICAgaW50NjRfdCBjdXJyZW50TnVtYmVyID0g
Z2V0S2V5R2VuZXJhdG9yQ3VycmVudE51bWJlcih0cmFuc2FjdGlvbiwgZGF0YWJhc2VJZCwgb2Jq
ZWN0U3RvcmVJZCk7CisgICAgICAgIGlmIChuZXdOdW1iZXIgPD0gY3VycmVudE51bWJlcikKKyAg
ICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBr
ZXlHZW5lcmF0b3JDdXJyZW50TnVtYmVyS2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5j
b2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6Oktl
eUdlbmVyYXRvckN1cnJlbnROdW1iZXIpOworICAgIGJvb2wgb2sgPSBwdXRJbnQobGV2ZWxEQlRy
YW5zYWN0aW9uLCBrZXlHZW5lcmF0b3JDdXJyZW50TnVtYmVyS2V5LCBuZXdOdW1iZXIpOworICAg
IGlmICghb2spIHsKKyAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3Jl
V3JpdGVFcnJvcik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRy
dWU7Cit9CisKK2Jvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6a2V5RXhpc3RzSW5PYmplY3RT
dG9yZShJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgaW50NjRfdCBk
YXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYga2V5LCBPYmpl
Y3RTdG9yZVJlY29yZElkZW50aWZpZXIqIGZvdW5kUmVjb3JkSWRlbnRpZmllcikKK3sKKyAgICBJ
REJfVFJBQ0UoIklEQkxldmVsREJCYWNraW5nU3RvcmU6OmtleUV4aXN0c0luT2JqZWN0U3RvcmUi
KTsKKyAgICBMZXZlbERCVHJhbnNhY3Rpb24qIGxldmVsREJUcmFuc2FjdGlvbiA9IFRyYW5zYWN0
aW9uOjpsZXZlbERCVHJhbnNhY3Rpb25Gcm9tKHRyYW5zYWN0aW9uKTsKKyAgICBjb25zdCBWZWN0
b3I8Y2hhcj4gbGV2ZWxkYktleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNl
SWQsIG9iamVjdFN0b3JlSWQsIGtleSk7CisgICAgVmVjdG9yPGNoYXI+IGRhdGE7CisKKyAgICBp
ZiAoIWxldmVsREJUcmFuc2FjdGlvbi0+Z2V0KGxldmVsZGJLZXksIGRhdGEpKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICBpbnQ2NF90IHZlcnNpb247CisgICAgaWYgKCFkZWNvZGVWYXJJ
bnQoZGF0YS5iZWdpbigpLCBkYXRhLmVuZCgpLCB2ZXJzaW9uKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgTGV2ZWxEQlJlY29yZElkZW50aWZpZXIqIGxldmVsREJSZWNvcmRJZGVudGlm
aWVyID0gc3RhdGljX2Nhc3Q8TGV2ZWxEQlJlY29yZElkZW50aWZpZXIqPihmb3VuZFJlY29yZElk
ZW50aWZpZXIpOworICAgIGxldmVsREJSZWNvcmRJZGVudGlmaWVyLT5zZXRQcmltYXJ5S2V5KGVu
Y29kZUlEQktleShrZXkpKTsKKyAgICBsZXZlbERCUmVjb3JkSWRlbnRpZmllci0+c2V0VmVyc2lv
bih2ZXJzaW9uKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBJREJMZXZlbERCQmFja2lu
Z1N0b3JlOjpmb3JFYWNoT2JqZWN0U3RvcmVSZWNvcmQoSURCQmFja2luZ1N0b3JlOjpUcmFuc2Fj
dGlvbiogdHJhbnNhY3Rpb24sIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9y
ZUlkLCBPYmplY3RTdG9yZVJlY29yZENhbGxiYWNrJiBjYWxsYmFjaykKK3sKKyAgICBMZXZlbERC
VHJhbnNhY3Rpb24qIGxldmVsREJUcmFuc2FjdGlvbiA9IFRyYW5zYWN0aW9uOjpsZXZlbERCVHJh
bnNhY3Rpb25Gcm9tKHRyYW5zYWN0aW9uKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3RhcnRL
ZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlk
LCBtaW5JREJLZXkoKSk7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IHN0b3BLZXkgPSBPYmplY3RT
dG9yZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBtYXhJREJLZXko
KSk7CisKKyAgICBPd25QdHI8TGV2ZWxEQkl0ZXJhdG9yPiBpdCA9IGxldmVsREJUcmFuc2FjdGlv
bi0+Y3JlYXRlSXRlcmF0b3IoKTsKKyAgICBmb3IgKGl0LT5zZWVrKHN0YXJ0S2V5KTsgaXQtPmlz
VmFsaWQoKSAmJiBjb21wYXJlS2V5cyhpdC0+a2V5KCksIHN0b3BLZXkpIDwgMDsgaXQtPm5leHQo
KSkgeworICAgICAgICBjb25zdCBjaGFyKiBwID0gaXQtPmtleSgpLmJlZ2luKCk7CisgICAgICAg
IGNvbnN0IGNoYXIqIGxpbWl0ID0gaXQtPmtleSgpLmVuZCgpOworICAgICAgICBPYmplY3RTdG9y
ZURhdGFLZXkgZGF0YUtleTsKKyAgICAgICAgcCA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZGVjb2Rl
KHAsIGxpbWl0LCAmZGF0YUtleSk7CisgICAgICAgIEFTU0VSVChwKTsKKworICAgICAgICBSZWZQ
dHI8SURCS2V5PiBwcmltYXJ5S2V5ID0gZGF0YUtleS51c2VyS2V5KCk7CisKKyAgICAgICAgaW50
NjRfdCB2ZXJzaW9uOworICAgICAgICBjb25zdCBjaGFyKiBxID0gZGVjb2RlVmFySW50KGl0LT52
YWx1ZSgpLmJlZ2luKCksIGl0LT52YWx1ZSgpLmVuZCgpLCB2ZXJzaW9uKTsKKyAgICAgICAgaWYg
KCFxKSB7CisgICAgICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVS
ZWFkRXJyb3IpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAg
ICAgUmVmUHRyPExldmVsREJSZWNvcmRJZGVudGlmaWVyPiByaSA9IExldmVsREJSZWNvcmRJZGVu
dGlmaWVyOjpjcmVhdGUoZW5jb2RlSURCS2V5KCpwcmltYXJ5S2V5KSwgdmVyc2lvbik7CisgICAg
ICAgIFN0cmluZyBpZGJWYWx1ZSA9IGRlY29kZVN0cmluZyhxLCBpdC0+dmFsdWUoKS5lbmQoKSk7
CisKKyAgICAgICAgaWYgKCFjYWxsYmFjay5jYWxsYmFjayhyaS5nZXQoKSwgaWRiVmFsdWUpKQor
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQor
CitzdGF0aWMgYm9vbCBjaGVja0luZGV4QW5kTWV0YURhdGFLZXkoY29uc3QgTGV2ZWxEQkl0ZXJh
dG9yKiBpdCwgY29uc3QgVmVjdG9yPGNoYXI+JiBzdG9wS2V5LCBpbnQ2NF90IGluZGV4SWQsIHVu
c2lnbmVkIGNoYXIgbWV0YURhdGFUeXBlKQoreworICAgIGlmICghaXQtPmlzVmFsaWQoKSB8fCBj
b21wYXJlS2V5cyhpdC0+a2V5KCksIHN0b3BLZXkpID49IDApCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIEluZGV4TWV0YURhdGFLZXkgbWV0YURhdGFLZXk7CisgICAgY29uc3QgY2hhciog
cCA9IEluZGV4TWV0YURhdGFLZXk6OmRlY29kZShpdC0+a2V5KCkuYmVnaW4oKSwgaXQtPmtleSgp
LmVuZCgpLCAmbWV0YURhdGFLZXkpOworICAgIEFTU0VSVF9VTlVTRUQocCwgcCk7CisgICAgaWYg
KG1ldGFEYXRhS2V5LmluZGV4SWQoKSAhPSBpbmRleElkKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgaWYgKG1ldGFEYXRhS2V5Lm1ldGFEYXRhVHlwZSgpICE9IG1ldGFEYXRhVHlwZSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworfQorCisKK1ZlY3RvcjxJREJJ
bmRleE1ldGFkYXRhPiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRJbmRleGVzKGludDY0X3Qg
ZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKQoreworICAgIElEQl9UUkFDRSgiSURC
TGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0SW5kZXhlcyIpOworICAgIFZlY3RvcjxJREJJbmRleE1l
dGFkYXRhPiBpbmRleGVzOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBzdGFydEtleSA9IEluZGV4
TWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAwLCAwKTsKKyAg
ICBjb25zdCBWZWN0b3I8Y2hhcj4gc3RvcEtleSA9IEluZGV4TWV0YURhdGFLZXk6OmVuY29kZShk
YXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkICsgMSwgMCwgMCk7CisKKyAgICBBU1NFUlQoaW5kZXhl
cy5pc0VtcHR5KCkpOworCisgICAgT3duUHRyPExldmVsREJJdGVyYXRvcj4gaXQgPSBtX2RiLT5j
cmVhdGVJdGVyYXRvcigpOworICAgIGl0LT5zZWVrKHN0YXJ0S2V5KTsKKyAgICB3aGlsZSAoaXQt
PmlzVmFsaWQoKSAmJiBjb21wYXJlS2V5cyhpdC0+a2V5KCksIHN0b3BLZXkpIDwgMCkgeworICAg
ICAgICBjb25zdCBjaGFyKiBwID0gaXQtPmtleSgpLmJlZ2luKCk7CisgICAgICAgIGNvbnN0IGNo
YXIqIGxpbWl0ID0gaXQtPmtleSgpLmVuZCgpOworCisgICAgICAgIEluZGV4TWV0YURhdGFLZXkg
bWV0YURhdGFLZXk7CisgICAgICAgIHAgPSBJbmRleE1ldGFEYXRhS2V5OjpkZWNvZGUocCwgbGlt
aXQsICZtZXRhRGF0YUtleSk7CisgICAgICAgIEFTU0VSVChwKTsKKyAgICAgICAgaWYgKG1ldGFE
YXRhS2V5Lm1ldGFEYXRhVHlwZSgpICE9IEluZGV4TWV0YURhdGFLZXk6Ok5hbWUpIHsKKyAgICAg
ICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVJlYWRFcnJvcik7Cisg
ICAgICAgICAgICAvLyBQb3NzaWJsZSBzdGFsZSBtZXRhZGF0YSBkdWUgdG8gaHR0cDovL3dlYmtp
dC5vcmcvYi84NTU1NyBidXQgZG9uJ3QgZmFpbCB0aGUgbG9hZC4KKyAgICAgICAgICAgIGl0LT5u
ZXh0KCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZJ
WE1FOiBEbyB0aGlzIGJ5IGRpcmVjdCBrZXkgbG9va3VwIHJhdGhlciB0aGFuIGl0ZXJhdGlvbiwg
dG8gc2ltcGxpZnkuCisgICAgICAgIGludDY0X3QgaW5kZXhJZCA9IG1ldGFEYXRhS2V5LmluZGV4
SWQoKTsKKyAgICAgICAgU3RyaW5nIGluZGV4TmFtZSA9IGRlY29kZVN0cmluZyhpdC0+dmFsdWUo
KS5iZWdpbigpLCBpdC0+dmFsdWUoKS5lbmQoKSk7CisKKyAgICAgICAgaXQtPm5leHQoKTsgLy8g
dW5pcXVlIGZsYWcKKyAgICAgICAgaWYgKCFjaGVja0luZGV4QW5kTWV0YURhdGFLZXkoaXQuZ2V0
KCksIHN0b3BLZXksIGluZGV4SWQsIEluZGV4TWV0YURhdGFLZXk6OlVuaXF1ZSkpIHsKKyAgICAg
ICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVJlYWRFcnJvcik7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBib29sIGluZGV4VW5pcXVlID0g
ZGVjb2RlQm9vbChpdC0+dmFsdWUoKS5iZWdpbigpLCBpdC0+dmFsdWUoKS5lbmQoKSk7CisKKyAg
ICAgICAgaXQtPm5leHQoKTsgLy8ga2V5UGF0aAorICAgICAgICBpZiAoIWNoZWNrSW5kZXhBbmRN
ZXRhRGF0YUtleShpdC5nZXQoKSwgc3RvcEtleSwgaW5kZXhJZCwgSW5kZXhNZXRhRGF0YUtleTo6
S2V5UGF0aCkpIHsKKyAgICAgICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdT
dG9yZVJlYWRFcnJvcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBJ
REJLZXlQYXRoIGtleVBhdGggPSBkZWNvZGVJREJLZXlQYXRoKGl0LT52YWx1ZSgpLmJlZ2luKCks
IGl0LT52YWx1ZSgpLmVuZCgpKTsKKworICAgICAgICBpdC0+bmV4dCgpOyAvLyBbb3B0aW9uYWxd
IG11bHRpRW50cnkgZmxhZworICAgICAgICBib29sIGluZGV4TXVsdGlFbnRyeSA9IGZhbHNlOwor
ICAgICAgICBpZiAoY2hlY2tJbmRleEFuZE1ldGFEYXRhS2V5KGl0LmdldCgpLCBzdG9wS2V5LCBp
bmRleElkLCBJbmRleE1ldGFEYXRhS2V5OjpNdWx0aUVudHJ5KSkgeworICAgICAgICAgICAgaW5k
ZXhNdWx0aUVudHJ5ID0gZGVjb2RlQm9vbChpdC0+dmFsdWUoKS5iZWdpbigpLCBpdC0+dmFsdWUo
KS5lbmQoKSk7CisgICAgICAgICAgICBpdC0+bmV4dCgpOworICAgICAgICB9CisKKyAgICAgICAg
aW5kZXhlcy5hcHBlbmQoSURCSW5kZXhNZXRhZGF0YShpbmRleE5hbWUsIGluZGV4SWQsIGtleVBh
dGgsIGluZGV4VW5pcXVlLCBpbmRleE11bHRpRW50cnkpKTsKKyAgICB9CisgICAgcmV0dXJuIGlu
ZGV4ZXM7Cit9CisKK3N0YXRpYyBib29sIHNldE1heEluZGV4SWQoTGV2ZWxEQlRyYW5zYWN0aW9u
KiB0cmFuc2FjdGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQs
IGludDY0X3QgaW5kZXhJZCkKK3sKKyAgICBpbnQ2NF90IG1heEluZGV4SWQgPSAtMTsKKyAgICBj
b25zdCBWZWN0b3I8Y2hhcj4gbWF4SW5kZXhJZEtleSA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6
OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5
OjpNYXhJbmRleElkKTsKKyAgICBpZiAoIWdldEludCh0cmFuc2FjdGlvbiwgbWF4SW5kZXhJZEtl
eSwgbWF4SW5kZXhJZCkpCisgICAgICAgIG1heEluZGV4SWQgPSBNaW5pbXVtSW5kZXhJZDsKKwor
ICAgIGlmIChpbmRleElkIDw9IG1heEluZGV4SWQpIHsKKyAgICAgICAgSW50ZXJuYWxFcnJvcihJ
REJMZXZlbERCQmFja2luZ1N0b3JlQ29uc2lzdGVuY3lFcnJvcik7CisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICB9CisKKyAgICBpZiAoIXB1dEludCh0cmFuc2FjdGlvbiwgbWF4SW5kZXhJZEtl
eSwgaW5kZXhJZCkpIHsKKyAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0
b3JlV3JpdGVFcnJvcik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJu
IHRydWU7Cit9CisKK2Jvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Y3JlYXRlSW5kZXgoSURC
QmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGludDY0X3QgZGF0YWJhc2VJ
ZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IFN0cmluZyYg
bmFtZSwgY29uc3QgSURCS2V5UGF0aCYga2V5UGF0aCwgYm9vbCBpc1VuaXF1ZSwgYm9vbCBpc011
bHRpRW50cnkpCit7CisgICAgSURCX1RSQUNFKCJJREJMZXZlbERCQmFja2luZ1N0b3JlOjpjcmVh
dGVJbmRleCIpOworICAgIExldmVsREJUcmFuc2FjdGlvbiogbGV2ZWxEQlRyYW5zYWN0aW9uID0g
VHJhbnNhY3Rpb246OmxldmVsREJUcmFuc2FjdGlvbkZyb20odHJhbnNhY3Rpb24pOworICAgIGlm
ICghc2V0TWF4SW5kZXhJZChsZXZlbERCVHJhbnNhY3Rpb24sIGRhdGFiYXNlSWQsIG9iamVjdFN0
b3JlSWQsIGluZGV4SWQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBjb25zdCBWZWN0
b3I8Y2hhcj4gbmFtZUtleSA9IEluZGV4TWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBv
YmplY3RTdG9yZUlkLCBpbmRleElkLCBJbmRleE1ldGFEYXRhS2V5OjpOYW1lKTsKKyAgICBjb25z
dCBWZWN0b3I8Y2hhcj4gdW5pcXVlS2V5ID0gSW5kZXhNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFi
YXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIEluZGV4TWV0YURhdGFLZXk6OlVuaXF1ZSk7
CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IGtleVBhdGhLZXkgPSBJbmRleE1ldGFEYXRhS2V5Ojpl
bmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgSW5kZXhNZXRhRGF0YUtl
eTo6S2V5UGF0aCk7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IG11bHRpRW50cnlLZXkgPSBJbmRl
eE1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwg
SW5kZXhNZXRhRGF0YUtleTo6TXVsdGlFbnRyeSk7CisKKyAgICBib29sIG9rID0gcHV0U3RyaW5n
KGxldmVsREJUcmFuc2FjdGlvbiwgbmFtZUtleSwgbmFtZSk7CisgICAgaWYgKCFvaykgeworICAg
ICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVXcml0ZUVycm9yKTsKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG9rID0gcHV0Qm9vbChsZXZlbERCVHJh
bnNhY3Rpb24sIHVuaXF1ZUtleSwgaXNVbmlxdWUpOworICAgIGlmICghb2spIHsKKyAgICAgICAg
SW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlV3JpdGVFcnJvcik7CisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBvayA9IHB1dElEQktleVBhdGgobGV2ZWxEQlRy
YW5zYWN0aW9uLCBrZXlQYXRoS2V5LCBrZXlQYXRoKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAg
IEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVdyaXRlRXJyb3IpOworICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgb2sgPSBwdXRCb29sKGxldmVsREJUcmFuc2Fj
dGlvbiwgbXVsdGlFbnRyeUtleSwgaXNNdWx0aUVudHJ5KTsKKyAgICBpZiAoIW9rKSB7CisgICAg
ICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVdyaXRlRXJyb3IpOworICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQg
SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlSW5kZXgoSURCQmFja2luZ1N0b3JlOjpUcmFu
c2FjdGlvbiogdHJhbnNhY3Rpb24sIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RT
dG9yZUlkLCBpbnQ2NF90IGluZGV4SWQpCit7CisgICAgSURCX1RSQUNFKCJJREJMZXZlbERCQmFj
a2luZ1N0b3JlOjpkZWxldGVJbmRleCIpOworICAgIExldmVsREJUcmFuc2FjdGlvbiogbGV2ZWxE
QlRyYW5zYWN0aW9uID0gVHJhbnNhY3Rpb246OmxldmVsREJUcmFuc2FjdGlvbkZyb20odHJhbnNh
Y3Rpb24pOworCisgICAgY29uc3QgVmVjdG9yPGNoYXI+IGluZGV4TWV0YURhdGFTdGFydCA9IElu
ZGV4TWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElk
LCAwKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gaW5kZXhNZXRhRGF0YUVuZCA9IEluZGV4TWV0
YURhdGFLZXk6OmVuY29kZU1heEtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElk
KTsKKworICAgIGlmICghZGVsZXRlUmFuZ2UobGV2ZWxEQlRyYW5zYWN0aW9uLCBpbmRleE1ldGFE
YXRhU3RhcnQsIGluZGV4TWV0YURhdGFFbmQpKSB7CisgICAgICAgIEludGVybmFsRXJyb3IoSURC
TGV2ZWxEQkJhY2tpbmdTdG9yZVdyaXRlRXJyb3IpOworICAgICAgICByZXR1cm47CisgICAgfQor
CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IGluZGV4RGF0YVN0YXJ0ID0gSW5kZXhEYXRhS2V5Ojpl
bmNvZGVNaW5LZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCk7CisgICAgY29u
c3QgVmVjdG9yPGNoYXI+IGluZGV4RGF0YUVuZCA9IEluZGV4RGF0YUtleTo6ZW5jb2RlTWF4S2V5
KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQpOworCisgICAgaWYgKCFkZWxldGVS
YW5nZShsZXZlbERCVHJhbnNhY3Rpb24sIGluZGV4RGF0YVN0YXJ0LCBpbmRleERhdGFFbmQpKSB7
CisgICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVdyaXRlRXJyb3Ip
OworICAgICAgICByZXR1cm47CisgICAgfQorfQorCitib29sIElEQkxldmVsREJCYWNraW5nU3Rv
cmU6OnB1dEluZGV4RGF0YUZvclJlY29yZChJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uKiB0
cmFuc2FjdGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGlu
dDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JiBrZXksIGNvbnN0IE9iamVjdFN0b3JlUmVjb3Jk
SWRlbnRpZmllciogcmVjb3JkSWRlbnRpZmllcikKK3sKKyAgICBJREJfVFJBQ0UoIklEQkxldmVs
REJCYWNraW5nU3RvcmU6OnB1dEluZGV4RGF0YUZvclJlY29yZCIpOworICAgIEFTU0VSVChrZXku
aXNWYWxpZCgpKTsKKyAgICBBU1NFUlQoaW5kZXhJZCA+PSBNaW5pbXVtSW5kZXhJZCk7CisgICAg
Y29uc3QgTGV2ZWxEQlJlY29yZElkZW50aWZpZXIqIGxldmVsREJSZWNvcmRJZGVudGlmaWVyID0g
c3RhdGljX2Nhc3Q8Y29uc3QgTGV2ZWxEQlJlY29yZElkZW50aWZpZXIqPihyZWNvcmRJZGVudGlm
aWVyKTsKKworICAgIExldmVsREJUcmFuc2FjdGlvbiogbGV2ZWxEQlRyYW5zYWN0aW9uID0gVHJh
bnNhY3Rpb246OmxldmVsREJUcmFuc2FjdGlvbkZyb20odHJhbnNhY3Rpb24pOworICAgIGNvbnN0
IFZlY3RvcjxjaGFyPiBpbmRleERhdGFLZXkgPSBJbmRleERhdGFLZXk6OmVuY29kZShkYXRhYmFz
ZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBlbmNvZGVJREJLZXkoa2V5KSwgbGV2ZWxEQlJl
Y29yZElkZW50aWZpZXItPnByaW1hcnlLZXkoKSk7CisKKyAgICBWZWN0b3I8Y2hhcj4gZGF0YTsK
KyAgICBkYXRhLmFwcGVuZChlbmNvZGVWYXJJbnQobGV2ZWxEQlJlY29yZElkZW50aWZpZXItPnZl
cnNpb24oKSkpOworICAgIGRhdGEuYXBwZW5kKGxldmVsREJSZWNvcmRJZGVudGlmaWVyLT5wcmlt
YXJ5S2V5KCkpOworCisgICAgcmV0dXJuIGxldmVsREJUcmFuc2FjdGlvbi0+cHV0KGluZGV4RGF0
YUtleSwgZGF0YSk7Cit9CisKK3N0YXRpYyBib29sIGZpbmRHcmVhdGVzdEtleUxlc3NUaGFuT3JF
cXVhbChMZXZlbERCVHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBjb25zdCBWZWN0b3I8Y2hhcj4m
IHRhcmdldCwgVmVjdG9yPGNoYXI+JiBmb3VuZEtleSkKK3sKKyAgICBPd25QdHI8TGV2ZWxEQkl0
ZXJhdG9yPiBpdCA9IHRyYW5zYWN0aW9uLT5jcmVhdGVJdGVyYXRvcigpOworICAgIGl0LT5zZWVr
KHRhcmdldCk7CisKKyAgICBpZiAoIWl0LT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgaXQtPnNlZWtU
b0xhc3QoKTsKKyAgICAgICAgaWYgKCFpdC0+aXNWYWxpZCgpKQorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIH0KKworICAgIHdoaWxlIChjb21wYXJlSW5kZXhLZXlzKGl0LT5rZXkoKSwg
dGFyZ2V0KSA+IDApIHsKKyAgICAgICAgaXQtPnByZXYoKTsKKyAgICAgICAgaWYgKCFpdC0+aXNW
YWxpZCgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGRvIHsKKyAg
ICAgICAgZm91bmRLZXkuY2xlYXIoKTsKKyAgICAgICAgZm91bmRLZXkuYXBwZW5kKGl0LT5rZXko
KS5iZWdpbigpLCBpdC0+a2V5KCkuZW5kKCkgLSBpdC0+a2V5KCkuYmVnaW4oKSk7CisKKyAgICAg
ICAgLy8gVGhlcmUgY2FuIGJlIHNldmVyYWwgaW5kZXgga2V5cyB0aGF0IGNvbXBhcmUgZXF1YWwu
IFdlIHdhbnQgdGhlIGxhc3Qgb25lLgorICAgICAgICBpdC0+bmV4dCgpOworICAgIH0gd2hpbGUg
KGl0LT5pc1ZhbGlkKCkgJiYgIWNvbXBhcmVJbmRleEtleXMoaXQtPmtleSgpLCB0YXJnZXQpKTsK
KworICAgIHJldHVybiB0cnVlOworfQorCitib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmRl
bGV0ZUluZGV4RGF0YUZvclJlY29yZChJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uKiwgaW50
NjRfdCwgaW50NjRfdCwgaW50NjRfdCwgY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVy
KikKK3sKKyAgICAvLyBGSVhNRTogVGhpcyBpc24ndCBuZWVkZWQgc2luY2Ugd2UgaW52YWxpZGF0
ZSBpbmRleCBkYXRhIHZpYSB0aGUgdmVyc2lvbiBudW1iZXIgbWVjaGFuaXNtLgorICAgIHJldHVy
biB0cnVlOworfQorCitzdGF0aWMgYm9vbCB2ZXJzaW9uRXhpc3RzKExldmVsREJUcmFuc2FjdGlv
biogdHJhbnNhY3Rpb24sIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlk
LCBpbnQ2NF90IHZlcnNpb24sIGNvbnN0IFZlY3RvcjxjaGFyPiYgZW5jb2RlZFByaW1hcnlLZXkp
Cit7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IGtleSA9IEV4aXN0c0VudHJ5S2V5OjplbmNvZGUo
ZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgZW5jb2RlZFByaW1hcnlLZXkpOworICAgIFZlY3Rv
cjxjaGFyPiBkYXRhOworCisgICAgaWYgKCF0cmFuc2FjdGlvbi0+Z2V0KGtleSwgZGF0YSkpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiBkZWNvZGVJbnQoZGF0YS5iZWdpbigp
LCBkYXRhLmVuZCgpKSA9PSB2ZXJzaW9uOworfQorCitib29sIElEQkxldmVsREJCYWNraW5nU3Rv
cmU6OmZpbmRLZXlJbkluZGV4KElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5zYWN0
aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBp
bmRleElkLCBjb25zdCBJREJLZXkmIGtleSwgVmVjdG9yPGNoYXI+JiBmb3VuZEVuY29kZWRQcmlt
YXJ5S2V5KQoreworICAgIElEQl9UUkFDRSgiSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZmluZEtl
eUluSW5kZXgiKTsKKyAgICBBU1NFUlQoZm91bmRFbmNvZGVkUHJpbWFyeUtleS5pc0VtcHR5KCkp
OworCisgICAgTGV2ZWxEQlRyYW5zYWN0aW9uKiBsZXZlbERCVHJhbnNhY3Rpb24gPSBUcmFuc2Fj
dGlvbjo6bGV2ZWxEQlRyYW5zYWN0aW9uRnJvbSh0cmFuc2FjdGlvbik7CisgICAgY29uc3QgVmVj
dG9yPGNoYXI+IGxldmVsZGJLZXkgPSBJbmRleERhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBv
YmplY3RTdG9yZUlkLCBpbmRleElkLCBrZXkpOworICAgIE93blB0cjxMZXZlbERCSXRlcmF0b3I+
IGl0ID0gbGV2ZWxEQlRyYW5zYWN0aW9uLT5jcmVhdGVJdGVyYXRvcigpOworICAgIGl0LT5zZWVr
KGxldmVsZGJLZXkpOworCisgICAgZm9yICg7OykgeworICAgICAgICBpZiAoIWl0LT5pc1ZhbGlk
KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChjb21wYXJlSW5kZXhL
ZXlzKGl0LT5rZXkoKSwgbGV2ZWxkYktleSkgPiAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgICAgIGludDY0X3QgdmVyc2lvbjsKKyAgICAgICAgY29uc3QgY2hhciogcCA9IGRl
Y29kZVZhckludChpdC0+dmFsdWUoKS5iZWdpbigpLCBpdC0+dmFsdWUoKS5lbmQoKSwgdmVyc2lv
bik7CisgICAgICAgIGlmICghcCkgeworICAgICAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZl
bERCQmFja2luZ1N0b3JlUmVhZEVycm9yKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgfQorICAgICAgICBmb3VuZEVuY29kZWRQcmltYXJ5S2V5LmFwcGVuZChwLCBpdC0+dmFs
dWUoKS5lbmQoKSAtIHApOworCisgICAgICAgIGlmICghdmVyc2lvbkV4aXN0cyhsZXZlbERCVHJh
bnNhY3Rpb24sIGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIHZlcnNpb24sIGZvdW5kRW5jb2Rl
ZFByaW1hcnlLZXkpKSB7CisgICAgICAgICAgICAvLyBEZWxldGUgc3RhbGUgaW5kZXggZGF0YSBl
bnRyeSBhbmQgY29udGludWUuCisgICAgICAgICAgICBsZXZlbERCVHJhbnNhY3Rpb24tPnJlbW92
ZShpdC0+a2V5KCkpOworICAgICAgICAgICAgaXQtPm5leHQoKTsKKyAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQorCitQYXNz
UmVmUHRyPElEQktleT4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0UHJpbWFyeUtleVZpYUlu
ZGV4KElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRh
dGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJ
REJLZXkmIGtleSkKK3sKKyAgICBJREJfVFJBQ0UoIklEQkxldmVsREJCYWNraW5nU3RvcmU6Omdl
dFByaW1hcnlLZXlWaWFJbmRleCIpOworCisgICAgVmVjdG9yPGNoYXI+IGZvdW5kRW5jb2RlZFBy
aW1hcnlLZXk7CisgICAgaWYgKGZpbmRLZXlJbkluZGV4KHRyYW5zYWN0aW9uLCBkYXRhYmFzZUlk
LCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBrZXksIGZvdW5kRW5jb2RlZFByaW1hcnlLZXkpKSB7
CisgICAgICAgIFJlZlB0cjxJREJLZXk+IHByaW1hcnlLZXk7CisgICAgICAgIGRlY29kZUlEQktl
eShmb3VuZEVuY29kZWRQcmltYXJ5S2V5LmJlZ2luKCksIGZvdW5kRW5jb2RlZFByaW1hcnlLZXku
ZW5kKCksIHByaW1hcnlLZXkpOworICAgICAgICByZXR1cm4gcHJpbWFyeUtleS5yZWxlYXNlKCk7
CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9y
ZTo6a2V5RXhpc3RzSW5JbmRleChJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uKiB0cmFuc2Fj
dGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3Qg
aW5kZXhJZCwgY29uc3QgSURCS2V5JiBpbmRleEtleSwgUmVmUHRyPElEQktleT4mIGZvdW5kUHJp
bWFyeUtleSkKK3sKKyAgICBJREJfVFJBQ0UoIklEQkxldmVsREJCYWNraW5nU3RvcmU6OmtleUV4
aXN0c0luSW5kZXgiKTsKKworICAgIFZlY3RvcjxjaGFyPiBmb3VuZEVuY29kZWRQcmltYXJ5S2V5
OworICAgIGlmICghZmluZEtleUluSW5kZXgodHJhbnNhY3Rpb24sIGRhdGFiYXNlSWQsIG9iamVj
dFN0b3JlSWQsIGluZGV4SWQsIGluZGV4S2V5LCBmb3VuZEVuY29kZWRQcmltYXJ5S2V5KSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZGVjb2RlSURCS2V5KGZvdW5kRW5jb2RlZFByaW1h
cnlLZXkuYmVnaW4oKSwgZm91bmRFbmNvZGVkUHJpbWFyeUtleS5lbmQoKSwgZm91bmRQcmltYXJ5
S2V5KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworbmFtZXNwYWNlIHsKKworc3RydWN0IEN1cnNv
ck9wdGlvbnMgeworICAgIFZlY3RvcjxjaGFyPiBsb3dLZXk7CisgICAgYm9vbCBsb3dPcGVuOwor
ICAgIFZlY3RvcjxjaGFyPiBoaWdoS2V5OworICAgIGJvb2wgaGlnaE9wZW47CisgICAgYm9vbCBm
b3J3YXJkOworICAgIGJvb2wgdW5pcXVlOworfTsKKworY2xhc3MgQ3Vyc29ySW1wbENvbW1vbiA6
IHB1YmxpYyBJREJCYWNraW5nU3RvcmU6OkN1cnNvciB7CitwdWJsaWM6CisgICAgLy8gSURCQmFj
a2luZ1N0b3JlOjpDdXJzb3IKKyAgICB2aXJ0dWFsIGJvb2wgYWR2YW5jZSh1bnNpZ25lZCBsb25n
KTsKKyAgICB2aXJ0dWFsIGJvb2wgY29udGludWVGdW5jdGlvbihjb25zdCBJREJLZXkqID0gMCwg
SXRlcmF0b3JTdGF0ZSA9IFNlZWspOworICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJLZXk+IGtl
eSgpIHsgcmV0dXJuIG1fY3VycmVudEtleTsgfQorICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJL
ZXk+IHByaW1hcnlLZXkoKSB7IHJldHVybiBtX2N1cnJlbnRLZXk7IH0KKyAgICB2aXJ0dWFsIFN0
cmluZyB2YWx1ZSgpID0gMDsKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3Jl
OjpPYmplY3RTdG9yZVJlY29yZElkZW50aWZpZXI+IG9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmll
cigpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSB7IH0KKworICAgIHZpcnR1YWwgYm9v
bCBsb2FkQ3VycmVudFJvdygpID0gMDsKKyAgICBib29sIGZpcnN0U2VlaygpOworCitwcm90ZWN0
ZWQ6CisgICAgQ3Vyc29ySW1wbENvbW1vbihMZXZlbERCVHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9u
LCBjb25zdCBDdXJzb3JPcHRpb25zJiBjdXJzb3JPcHRpb25zKQorICAgICAgICA6IG1fdHJhbnNh
Y3Rpb24odHJhbnNhY3Rpb24pCisgICAgICAgICwgbV9jdXJzb3JPcHRpb25zKGN1cnNvck9wdGlv
bnMpCisgICAgeworICAgIH0KKworICAgIEN1cnNvckltcGxDb21tb24oY29uc3QgQ3Vyc29ySW1w
bENvbW1vbiogb3RoZXIpCisgICAgICAgIDogbV90cmFuc2FjdGlvbihvdGhlci0+bV90cmFuc2Fj
dGlvbikKKyAgICAgICAgLCBtX2N1cnNvck9wdGlvbnMob3RoZXItPm1fY3Vyc29yT3B0aW9ucykK
KyAgICAgICAgLCBtX2N1cnJlbnRLZXkob3RoZXItPm1fY3VycmVudEtleSkKKyAgICB7CisgICAg
ICAgIGlmIChvdGhlci0+bV9pdGVyYXRvcikgeworICAgICAgICAgICAgbV9pdGVyYXRvciA9IG1f
dHJhbnNhY3Rpb24tPmNyZWF0ZUl0ZXJhdG9yKCk7CisKKyAgICAgICAgICAgIGlmIChvdGhlci0+
bV9pdGVyYXRvci0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICAgICAgbV9pdGVyYXRvci0+c2Vl
ayhvdGhlci0+bV9pdGVyYXRvci0+a2V5KCkpOworICAgICAgICAgICAgICAgIEFTU0VSVChtX2l0
ZXJhdG9yLT5pc1ZhbGlkKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisg
ICAgdmlydHVhbCB+Q3Vyc29ySW1wbENvbW1vbigpIHsgfQorCisgICAgYm9vbCBpc1Bhc3RCb3Vu
ZHMoKSBjb25zdDsKKyAgICBib29sIGhhdmVFbnRlcmVkUmFuZ2UoKSBjb25zdDsKKworICAgIExl
dmVsREJUcmFuc2FjdGlvbiogbV90cmFuc2FjdGlvbjsKKyAgICBDdXJzb3JPcHRpb25zIG1fY3Vy
c29yT3B0aW9uczsKKyAgICBPd25QdHI8TGV2ZWxEQkl0ZXJhdG9yPiBtX2l0ZXJhdG9yOworICAg
IFJlZlB0cjxJREJLZXk+IG1fY3VycmVudEtleTsKK307CisKK2Jvb2wgQ3Vyc29ySW1wbENvbW1v
bjo6Zmlyc3RTZWVrKCkKK3sKKyAgICBtX2l0ZXJhdG9yID0gbV90cmFuc2FjdGlvbi0+Y3JlYXRl
SXRlcmF0b3IoKTsKKyAgICBpZiAobV9jdXJzb3JPcHRpb25zLmZvcndhcmQpCisgICAgICAgIG1f
aXRlcmF0b3ItPnNlZWsobV9jdXJzb3JPcHRpb25zLmxvd0tleSk7CisgICAgZWxzZQorICAgICAg
ICBtX2l0ZXJhdG9yLT5zZWVrKG1fY3Vyc29yT3B0aW9ucy5oaWdoS2V5KTsKKworICAgIHJldHVy
biBjb250aW51ZUZ1bmN0aW9uKDAsIFJlYWR5KTsKK30KKworYm9vbCBDdXJzb3JJbXBsQ29tbW9u
OjphZHZhbmNlKHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisgICAgd2hpbGUgKGNvdW50LS0pIHsK
KyAgICAgICAgaWYgKCFjb250aW51ZUZ1bmN0aW9uKCkpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEN1cnNvckltcGxDb21tb246
OmNvbnRpbnVlRnVuY3Rpb24oY29uc3QgSURCS2V5KiBrZXksIEl0ZXJhdG9yU3RhdGUgbmV4dFN0
YXRlKQoreworICAgIFJlZlB0cjxJREJLZXk+IHByZXZpb3VzS2V5ID0gbV9jdXJyZW50S2V5Owor
CisgICAgLy8gV2hlbiBpdGVyYXRpbmcgd2l0aCBQUkVWX05PX0RVUExJQ0FURSwgc3BlYyByZXF1
aXJlcyB0aGF0IHRoZQorICAgIC8vIHZhbHVlIHdlIHlpZWxkIGZvciBlYWNoIGtleSBpcyB0aGUg
Zmlyc3QgZHVwbGljYXRlIGluIGZvcndhcmRzCisgICAgLy8gb3JkZXIuCisgICAgUmVmUHRyPElE
QktleT4gbGFzdER1cGxpY2F0ZUtleTsKKworICAgIGJvb2wgZm9yd2FyZCA9IG1fY3Vyc29yT3B0
aW9ucy5mb3J3YXJkOworCisgICAgZm9yICg7OykgeworICAgICAgICBpZiAobmV4dFN0YXRlID09
IFNlZWspIHsKKyAgICAgICAgICAgIGlmIChmb3J3YXJkKQorICAgICAgICAgICAgICAgIG1faXRl
cmF0b3ItPm5leHQoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtX2l0ZXJh
dG9yLT5wcmV2KCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbmV4dFN0YXRlID0gU2Vl
azsgLy8gZm9yIHN1YnNlcXVlbnQgaXRlcmF0aW9ucworCisgICAgICAgIGlmICghbV9pdGVyYXRv
ci0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICBpZiAoIWZvcndhcmQgJiYgbGFzdER1cGxpY2F0
ZUtleS5nZXQoKSkgeworICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gd2FsayBmb3J3YXJk
IGJlY2F1c2Ugd2UgaGl0IHRoZSBlbmQgb2YKKyAgICAgICAgICAgICAgICAvLyB0aGUgZGF0YS4K
KyAgICAgICAgICAgICAgICBmb3J3YXJkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjb250aW51
ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9
CisKKyAgICAgICAgaWYgKGlzUGFzdEJvdW5kcygpKSB7CisgICAgICAgICAgICBpZiAoIWZvcndh
cmQgJiYgbGFzdER1cGxpY2F0ZUtleS5nZXQoKSkgeworICAgICAgICAgICAgICAgIC8vIFdlIG5l
ZWQgdG8gd2FsayBmb3J3YXJkIGJlY2F1c2Ugbm93IHdlJ3JlIGJleW9uZCB0aGUKKyAgICAgICAg
ICAgICAgICAvLyBib3VuZHMgZGVmaW5lZCBieSB0aGUgY3Vyc29yLgorICAgICAgICAgICAgICAg
IGZvcndhcmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAg
fQorCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAo
IWhhdmVFbnRlcmVkUmFuZ2UoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8v
IFRoZSByb3cgbWF5IG5vdCBsb2FkIGJlY2F1c2UgdGhlcmUncyBhIHN0YWxlIGVudHJ5IGluIHRo
ZQorICAgICAgICAvLyBpbmRleC4gVGhpcyBpcyBub3QgZmF0YWwuCisgICAgICAgIGlmICghbG9h
ZEN1cnJlbnRSb3coKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChrZXkp
IHsKKyAgICAgICAgICAgIGlmIChmb3J3YXJkKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fY3Vy
cmVudEtleS0+aXNMZXNzVGhhbihrZXkpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGtleS0+aXNMZXNzVGhh
bihtX2N1cnJlbnRLZXkuZ2V0KCkpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtX2N1cnNvck9wdGlvbnMudW5p
cXVlKSB7CisKKyAgICAgICAgICAgIGlmIChtX2N1cnJlbnRLZXktPmlzRXF1YWwocHJldmlvdXNL
ZXkuZ2V0KCkpKSB7CisgICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIG5ldmVyIGJlIGFibGUg
dG8gd2FsayBmb3J3YXJkIGFsbCB0aGUgd2F5CisgICAgICAgICAgICAgICAgLy8gdG8gdGhlIHBy
ZXZpb3VzIGtleS4KKyAgICAgICAgICAgICAgICBBU1NFUlQoIWxhc3REdXBsaWNhdGVLZXkuZ2V0
KCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICBpZiAoIWZvcndhcmQpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWxhc3REdXBsaWNhdGVL
ZXkuZ2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbGFzdER1cGxpY2F0ZUtleSA9IG1fY3Vy
cmVudEtleTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAg
fQorCisgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB3YWxrIGZvcndhcmQgYmVjYXVzZSB3
ZSBoaXQgdGhlIGJvdW5kYXJ5CisgICAgICAgICAgICAgICAgLy8gYmV0d2VlbiBrZXkgcmFuZ2Vz
LgorICAgICAgICAgICAgICAgIGlmICghbGFzdER1cGxpY2F0ZUtleS0+aXNFcXVhbChtX2N1cnJl
bnRLZXkuZ2V0KCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcndhcmQgPSB0cnVlOworICAg
ICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVh
azsKKyAgICB9CisKKyAgICBBU1NFUlQoIWxhc3REdXBsaWNhdGVLZXkuZ2V0KCkgfHwgKGZvcndh
cmQgJiYgbGFzdER1cGxpY2F0ZUtleS0+aXNFcXVhbChtX2N1cnJlbnRLZXkuZ2V0KCkpKSk7Cisg
ICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ3Vyc29ySW1wbENvbW1vbjo6aGF2ZUVudGVyZWRS
YW5nZSgpIGNvbnN0Cit7CisgICAgaWYgKG1fY3Vyc29yT3B0aW9ucy5mb3J3YXJkKSB7CisgICAg
ICAgIGlmIChtX2N1cnNvck9wdGlvbnMubG93T3BlbikKKyAgICAgICAgICAgIHJldHVybiBjb21w
YXJlSW5kZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2N1cnNvck9wdGlvbnMubG93S2V5KSA+
IDA7CisKKyAgICAgICAgcmV0dXJuIGNvbXBhcmVJbmRleEtleXMobV9pdGVyYXRvci0+a2V5KCks
IG1fY3Vyc29yT3B0aW9ucy5sb3dLZXkpID49IDA7CisgICAgfQorICAgIGlmIChtX2N1cnNvck9w
dGlvbnMuaGlnaE9wZW4pCisgICAgICAgIHJldHVybiBjb21wYXJlSW5kZXhLZXlzKG1faXRlcmF0
b3ItPmtleSgpLCBtX2N1cnNvck9wdGlvbnMuaGlnaEtleSkgPCAwOworCisgICAgcmV0dXJuIGNv
bXBhcmVJbmRleEtleXMobV9pdGVyYXRvci0+a2V5KCksIG1fY3Vyc29yT3B0aW9ucy5oaWdoS2V5
KSA8PSAwOworfQorCitib29sIEN1cnNvckltcGxDb21tb246OmlzUGFzdEJvdW5kcygpIGNvbnN0
Cit7CisgICAgaWYgKG1fY3Vyc29yT3B0aW9ucy5mb3J3YXJkKSB7CisgICAgICAgIGlmIChtX2N1
cnNvck9wdGlvbnMuaGlnaE9wZW4pCisgICAgICAgICAgICByZXR1cm4gY29tcGFyZUluZGV4S2V5
cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9jdXJzb3JPcHRpb25zLmhpZ2hLZXkpID49IDA7CisgICAg
ICAgIHJldHVybiBjb21wYXJlSW5kZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2N1cnNvck9w
dGlvbnMuaGlnaEtleSkgPiAwOworICAgIH0KKworICAgIGlmIChtX2N1cnNvck9wdGlvbnMubG93
T3BlbikKKyAgICAgICAgcmV0dXJuIGNvbXBhcmVJbmRleEtleXMobV9pdGVyYXRvci0+a2V5KCks
IG1fY3Vyc29yT3B0aW9ucy5sb3dLZXkpIDw9IDA7CisgICAgcmV0dXJuIGNvbXBhcmVJbmRleEtl
eXMobV9pdGVyYXRvci0+a2V5KCksIG1fY3Vyc29yT3B0aW9ucy5sb3dLZXkpIDwgMDsKK30KKwor
Y2xhc3MgT2JqZWN0U3RvcmVLZXlDdXJzb3JJbXBsIDogcHVibGljIEN1cnNvckltcGxDb21tb24g
eworcHVibGljOgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPE9iamVjdFN0b3JlS2V5Q3Vyc29ySW1w
bD4gY3JlYXRlKExldmVsREJUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGNvbnN0IEN1cnNvck9w
dGlvbnMmIGN1cnNvck9wdGlvbnMpCisgICAgeworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3
IE9iamVjdFN0b3JlS2V5Q3Vyc29ySW1wbCh0cmFuc2FjdGlvbiwgY3Vyc29yT3B0aW9ucykpOwor
ICAgIH0KKworICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4g
Y2xvbmUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBPYmplY3RTdG9yZUtl
eUN1cnNvckltcGwodGhpcykpOworICAgIH0KKworICAgIC8vIEN1cnNvckltcGxDb21tb24KKyAg
ICB2aXJ0dWFsIFN0cmluZyB2YWx1ZSgpIHsgQVNTRVJUX05PVF9SRUFDSEVEKCk7IHJldHVybiBT
dHJpbmcoKTsgfQorICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6Ok9iamVj
dFN0b3JlUmVjb3JkSWRlbnRpZmllcj4gb2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyKCkgT1ZF
UlJJREUKKyAgICB7CisgICAgICAgIHJldHVybiBtX2lkZW50aWZpZXI7CisgICAgfQorICAgIHZp
cnR1YWwgYm9vbCBsb2FkQ3VycmVudFJvdygpOworCitwcml2YXRlOgorICAgIE9iamVjdFN0b3Jl
S2V5Q3Vyc29ySW1wbChMZXZlbERCVHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBjb25zdCBDdXJz
b3JPcHRpb25zJiBjdXJzb3JPcHRpb25zKQorICAgICAgICA6IEN1cnNvckltcGxDb21tb24odHJh
bnNhY3Rpb24sIGN1cnNvck9wdGlvbnMpCisgICAgeworICAgIH0KKworICAgIE9iamVjdFN0b3Jl
S2V5Q3Vyc29ySW1wbChjb25zdCBPYmplY3RTdG9yZUtleUN1cnNvckltcGwqIG90aGVyKQorICAg
ICAgICA6IEN1cnNvckltcGxDb21tb24ob3RoZXIpCisgICAgeworICAgIH0KKworICAgIFJlZlB0
cjxMZXZlbERCUmVjb3JkSWRlbnRpZmllcj4gbV9pZGVudGlmaWVyOworfTsKKworYm9vbCBPYmpl
Y3RTdG9yZUtleUN1cnNvckltcGw6OmxvYWRDdXJyZW50Um93KCkKK3sKKyAgICBjb25zdCBjaGFy
KiBrZXlQb3NpdGlvbiA9IG1faXRlcmF0b3ItPmtleSgpLmJlZ2luKCk7CisgICAgY29uc3QgY2hh
cioga2V5TGltaXQgPSBtX2l0ZXJhdG9yLT5rZXkoKS5lbmQoKTsKKworICAgIE9iamVjdFN0b3Jl
RGF0YUtleSBvYmplY3RTdG9yZURhdGFLZXk7CisgICAga2V5UG9zaXRpb24gPSBPYmplY3RTdG9y
ZURhdGFLZXk6OmRlY29kZShrZXlQb3NpdGlvbiwga2V5TGltaXQsICZvYmplY3RTdG9yZURhdGFL
ZXkpOworICAgIGlmICgha2V5UG9zaXRpb24pIHsKKyAgICAgICAgSW50ZXJuYWxFcnJvcihJREJM
ZXZlbERCQmFja2luZ1N0b3JlUmVhZEVycm9yKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IH0KKworICAgIG1fY3VycmVudEtleSA9IG9iamVjdFN0b3JlRGF0YUtleS51c2VyS2V5KCk7CisK
KyAgICBpbnQ2NF90IHZlcnNpb247CisgICAgY29uc3QgY2hhciogdmFsdWVQb3NpdGlvbiA9IGRl
Y29kZVZhckludChtX2l0ZXJhdG9yLT52YWx1ZSgpLmJlZ2luKCksIG1faXRlcmF0b3ItPnZhbHVl
KCkuZW5kKCksIHZlcnNpb24pOworICAgIGlmICghdmFsdWVQb3NpdGlvbikgeworICAgICAgICBJ
bnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVSZWFkRXJyb3IpOworICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gRklYTUU6IFRoaXMgcmUtZW5jb2RlcyB3aGF0
IHdhcyBqdXN0IGRlY29kZWQ7IHRyeSBhbmQgb3B0aW1pemUuCisgICAgbV9pZGVudGlmaWVyID0g
TGV2ZWxEQlJlY29yZElkZW50aWZpZXI6OmNyZWF0ZShlbmNvZGVJREJLZXkoKm1fY3VycmVudEtl
eSksIHZlcnNpb24pOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2NsYXNzIE9iamVjdFN0b3Jl
Q3Vyc29ySW1wbCA6IHB1YmxpYyBDdXJzb3JJbXBsQ29tbW9uIHsKK3B1YmxpYzoKKyAgICBzdGF0
aWMgUGFzc1JlZlB0cjxPYmplY3RTdG9yZUN1cnNvckltcGw+IGNyZWF0ZShMZXZlbERCVHJhbnNh
Y3Rpb24qIHRyYW5zYWN0aW9uLCBjb25zdCBDdXJzb3JPcHRpb25zJiBjdXJzb3JPcHRpb25zKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBPYmplY3RTdG9yZUN1cnNvckltcGwo
dHJhbnNhY3Rpb24sIGN1cnNvck9wdGlvbnMpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFBhc3NS
ZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IGNsb25lKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiBhZG9wdFJlZihuZXcgT2JqZWN0U3RvcmVDdXJzb3JJbXBsKHRoaXMpKTsKKyAgICB9CisK
KyAgICAvLyBDdXJzb3JJbXBsQ29tbW9uCisgICAgdmlydHVhbCBTdHJpbmcgdmFsdWUoKSB7IHJl
dHVybiBtX2N1cnJlbnRWYWx1ZTsgfQorICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJCYWNraW5n
U3RvcmU6Ok9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllcj4gb2JqZWN0U3RvcmVSZWNvcmRJZGVu
dGlmaWVyKCkgT1ZFUlJJREUKKyAgICB7CisgICAgICAgIHJldHVybiBtX2lkZW50aWZpZXI7Cisg
ICAgfQorICAgIHZpcnR1YWwgYm9vbCBsb2FkQ3VycmVudFJvdygpOworCitwcml2YXRlOgorICAg
IE9iamVjdFN0b3JlQ3Vyc29ySW1wbChMZXZlbERCVHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBj
b25zdCBDdXJzb3JPcHRpb25zJiBjdXJzb3JPcHRpb25zKQorICAgICAgICA6IEN1cnNvckltcGxD
b21tb24odHJhbnNhY3Rpb24sIGN1cnNvck9wdGlvbnMpCisgICAgeworICAgIH0KKworICAgIE9i
amVjdFN0b3JlQ3Vyc29ySW1wbChjb25zdCBPYmplY3RTdG9yZUN1cnNvckltcGwqIG90aGVyKQor
ICAgICAgICA6IEN1cnNvckltcGxDb21tb24ob3RoZXIpCisgICAgICAgICwgbV9jdXJyZW50VmFs
dWUob3RoZXItPm1fY3VycmVudFZhbHVlKQorICAgIHsKKyAgICB9CisKKyAgICBTdHJpbmcgbV9j
dXJyZW50VmFsdWU7CisgICAgUmVmUHRyPExldmVsREJSZWNvcmRJZGVudGlmaWVyPiBtX2lkZW50
aWZpZXI7Cit9OworCitib29sIE9iamVjdFN0b3JlQ3Vyc29ySW1wbDo6bG9hZEN1cnJlbnRSb3co
KQoreworICAgIGNvbnN0IGNoYXIqIGtleVBvc2l0aW9uID0gbV9pdGVyYXRvci0+a2V5KCkuYmVn
aW4oKTsKKyAgICBjb25zdCBjaGFyKiBrZXlMaW1pdCA9IG1faXRlcmF0b3ItPmtleSgpLmVuZCgp
OworCisgICAgT2JqZWN0U3RvcmVEYXRhS2V5IG9iamVjdFN0b3JlRGF0YUtleTsKKyAgICBrZXlQ
b3NpdGlvbiA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZGVjb2RlKGtleVBvc2l0aW9uLCBrZXlMaW1p
dCwgJm9iamVjdFN0b3JlRGF0YUtleSk7CisgICAgaWYgKCFrZXlQb3NpdGlvbikgeworICAgICAg
ICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVSZWFkRXJyb3IpOworICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9jdXJyZW50S2V5ID0gb2JqZWN0U3RvcmVE
YXRhS2V5LnVzZXJLZXkoKTsKKworICAgIGludDY0X3QgdmVyc2lvbjsKKyAgICBjb25zdCBjaGFy
KiB2YWx1ZVBvc2l0aW9uID0gZGVjb2RlVmFySW50KG1faXRlcmF0b3ItPnZhbHVlKCkuYmVnaW4o
KSwgbV9pdGVyYXRvci0+dmFsdWUoKS5lbmQoKSwgdmVyc2lvbik7CisgICAgaWYgKCF2YWx1ZVBv
c2l0aW9uKSB7CisgICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVJl
YWRFcnJvcik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBGSVhNRTog
VGhpcyByZS1lbmNvZGVzIHdoYXQgd2FzIGp1c3QgZGVjb2RlZDsgdHJ5IGFuZCBvcHRpbWl6ZS4K
KyAgICBtX2lkZW50aWZpZXIgPSBMZXZlbERCUmVjb3JkSWRlbnRpZmllcjo6Y3JlYXRlKGVuY29k
ZUlEQktleSgqbV9jdXJyZW50S2V5KSwgdmVyc2lvbik7CisKKyAgICBtX2N1cnJlbnRWYWx1ZSA9
IGRlY29kZVN0cmluZyh2YWx1ZVBvc2l0aW9uLCBtX2l0ZXJhdG9yLT52YWx1ZSgpLmVuZCgpKTsK
KworICAgIHJldHVybiB0cnVlOworfQorCitjbGFzcyBJbmRleEtleUN1cnNvckltcGwgOiBwdWJs
aWMgQ3Vyc29ySW1wbENvbW1vbiB7CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NSZWZQdHI8SW5k
ZXhLZXlDdXJzb3JJbXBsPiBjcmVhdGUoTGV2ZWxEQlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwg
Y29uc3QgQ3Vyc29yT3B0aW9ucyYgY3Vyc29yT3B0aW9ucykKKyAgICB7CisgICAgICAgIHJldHVy
biBhZG9wdFJlZihuZXcgSW5kZXhLZXlDdXJzb3JJbXBsKHRyYW5zYWN0aW9uLCBjdXJzb3JPcHRp
b25zKSk7CisgICAgfQorCisgICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6
Q3Vyc29yPiBjbG9uZSgpCisgICAgeworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IEluZGV4
S2V5Q3Vyc29ySW1wbCh0aGlzKSk7CisgICAgfQorCisgICAgLy8gQ3Vyc29ySW1wbENvbW1vbgor
ICAgIHZpcnR1YWwgU3RyaW5nIHZhbHVlKCkgeyBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgcmV0dXJu
IFN0cmluZygpOyB9CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQktleT4gcHJpbWFyeUtleSgp
IHsgcmV0dXJuIG1fcHJpbWFyeUtleTsgfQorICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJCYWNr
aW5nU3RvcmU6Ok9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllcj4gb2JqZWN0U3RvcmVSZWNvcmRJ
ZGVudGlmaWVyKCkgeyBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgcmV0dXJuIDA7IH0KKyAgICB2aXJ0
dWFsIGJvb2wgbG9hZEN1cnJlbnRSb3coKTsKKworcHJpdmF0ZToKKyAgICBJbmRleEtleUN1cnNv
ckltcGwoTGV2ZWxEQlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgY29uc3QgQ3Vyc29yT3B0aW9u
cyYgY3Vyc29yT3B0aW9ucykKKyAgICAgICAgOiBDdXJzb3JJbXBsQ29tbW9uKHRyYW5zYWN0aW9u
LCBjdXJzb3JPcHRpb25zKQorICAgIHsKKyAgICB9CisKKyAgICBJbmRleEtleUN1cnNvckltcGwo
Y29uc3QgSW5kZXhLZXlDdXJzb3JJbXBsKiBvdGhlcikKKyAgICAgICAgOiBDdXJzb3JJbXBsQ29t
bW9uKG90aGVyKQorICAgICAgICAsIG1fcHJpbWFyeUtleShvdGhlci0+bV9wcmltYXJ5S2V5KQor
ICAgIHsKKyAgICB9CisKKyAgICBSZWZQdHI8SURCS2V5PiBtX3ByaW1hcnlLZXk7Cit9OworCiti
b29sIEluZGV4S2V5Q3Vyc29ySW1wbDo6bG9hZEN1cnJlbnRSb3coKQoreworICAgIGNvbnN0IGNo
YXIqIGtleVBvc2l0aW9uID0gbV9pdGVyYXRvci0+a2V5KCkuYmVnaW4oKTsKKyAgICBjb25zdCBj
aGFyKiBrZXlMaW1pdCA9IG1faXRlcmF0b3ItPmtleSgpLmVuZCgpOworCisgICAgSW5kZXhEYXRh
S2V5IGluZGV4RGF0YUtleTsKKyAgICBrZXlQb3NpdGlvbiA9IEluZGV4RGF0YUtleTo6ZGVjb2Rl
KGtleVBvc2l0aW9uLCBrZXlMaW1pdCwgJmluZGV4RGF0YUtleSk7CisKKyAgICBtX2N1cnJlbnRL
ZXkgPSBpbmRleERhdGFLZXkudXNlcktleSgpOworCisgICAgaW50NjRfdCBpbmRleERhdGFWZXJz
aW9uOworICAgIGNvbnN0IGNoYXIqIHZhbHVlUG9zaXRpb24gPSBkZWNvZGVWYXJJbnQobV9pdGVy
YXRvci0+dmFsdWUoKS5iZWdpbigpLCBtX2l0ZXJhdG9yLT52YWx1ZSgpLmVuZCgpLCBpbmRleERh
dGFWZXJzaW9uKTsKKyAgICBpZiAoIXZhbHVlUG9zaXRpb24pIHsKKyAgICAgICAgSW50ZXJuYWxF
cnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlUmVhZEVycm9yKTsKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIH0KKworICAgIHZhbHVlUG9zaXRpb24gPSBkZWNvZGVJREJLZXkodmFsdWVQb3Np
dGlvbiwgbV9pdGVyYXRvci0+dmFsdWUoKS5lbmQoKSwgbV9wcmltYXJ5S2V5KTsKKyAgICBpZiAo
IXZhbHVlUG9zaXRpb24pIHsKKyAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2lu
Z1N0b3JlUmVhZEVycm9yKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFZl
Y3RvcjxjaGFyPiBwcmltYXJ5TGV2ZWxEQktleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2Rl
KGluZGV4RGF0YUtleS5kYXRhYmFzZUlkKCksIGluZGV4RGF0YUtleS5vYmplY3RTdG9yZUlkKCks
ICptX3ByaW1hcnlLZXkpOworCisgICAgVmVjdG9yPGNoYXI+IHJlc3VsdDsKKyAgICBpZiAoIW1f
dHJhbnNhY3Rpb24tPmdldChwcmltYXJ5TGV2ZWxEQktleSwgcmVzdWx0KSkgeworICAgICAgICBt
X3RyYW5zYWN0aW9uLT5yZW1vdmUobV9pdGVyYXRvci0+a2V5KCkpOworICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgfQorCisgICAgaW50NjRfdCBvYmplY3RTdG9yZURhdGFWZXJzaW9uOworICAg
IGNvbnN0IGNoYXIqIHQgPSBkZWNvZGVWYXJJbnQocmVzdWx0LmJlZ2luKCksIHJlc3VsdC5lbmQo
KSwgb2JqZWN0U3RvcmVEYXRhVmVyc2lvbik7CisgICAgaWYgKCF0KSB7CisgICAgICAgIEludGVy
bmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVJlYWRFcnJvcik7CisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAob2JqZWN0U3RvcmVEYXRhVmVyc2lvbiAhPSBpbmRl
eERhdGFWZXJzaW9uKSB7CisgICAgICAgIG1fdHJhbnNhY3Rpb24tPnJlbW92ZShtX2l0ZXJhdG9y
LT5rZXkoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1
ZTsKK30KKworY2xhc3MgSW5kZXhDdXJzb3JJbXBsIDogcHVibGljIEN1cnNvckltcGxDb21tb24g
eworcHVibGljOgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPEluZGV4Q3Vyc29ySW1wbD4gY3JlYXRl
KExldmVsREJUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGNvbnN0IEN1cnNvck9wdGlvbnMmIGN1
cnNvck9wdGlvbnMpCisgICAgeworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IEluZGV4Q3Vy
c29ySW1wbCh0cmFuc2FjdGlvbiwgY3Vyc29yT3B0aW9ucykpOworICAgIH0KKworICAgIHZpcnR1
YWwgUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4gY2xvbmUoKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBJbmRleEN1cnNvckltcGwodGhpcykpOworICAgIH0K
KworICAgIC8vIEN1cnNvckltcGxDb21tb24KKyAgICB2aXJ0dWFsIFN0cmluZyB2YWx1ZSgpIHsg
cmV0dXJuIG1fdmFsdWU7IH0KKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCS2V5PiBwcmltYXJ5
S2V5KCkgeyByZXR1cm4gbV9wcmltYXJ5S2V5OyB9CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPElE
QkJhY2tpbmdTdG9yZTo6T2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyPiBvYmplY3RTdG9yZVJl
Y29yZElkZW50aWZpZXIoKSB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4gMDsgfQorICAg
IGJvb2wgbG9hZEN1cnJlbnRSb3coKTsKKworcHJpdmF0ZToKKyAgICBJbmRleEN1cnNvckltcGwo
TGV2ZWxEQlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgY29uc3QgQ3Vyc29yT3B0aW9ucyYgY3Vy
c29yT3B0aW9ucykKKyAgICAgICAgOiBDdXJzb3JJbXBsQ29tbW9uKHRyYW5zYWN0aW9uLCBjdXJz
b3JPcHRpb25zKQorICAgIHsKKyAgICB9CisKKyAgICBJbmRleEN1cnNvckltcGwoY29uc3QgSW5k
ZXhDdXJzb3JJbXBsKiBvdGhlcikKKyAgICAgICAgOiBDdXJzb3JJbXBsQ29tbW9uKG90aGVyKQor
ICAgICAgICAsIG1fcHJpbWFyeUtleShvdGhlci0+bV9wcmltYXJ5S2V5KQorICAgICAgICAsIG1f
dmFsdWUob3RoZXItPm1fdmFsdWUpCisgICAgICAgICwgbV9wcmltYXJ5TGV2ZWxEQktleShvdGhl
ci0+bV9wcmltYXJ5TGV2ZWxEQktleSkKKyAgICB7CisgICAgfQorCisgICAgUmVmUHRyPElEQktl
eT4gbV9wcmltYXJ5S2V5OworICAgIFN0cmluZyBtX3ZhbHVlOworICAgIFZlY3RvcjxjaGFyPiBt
X3ByaW1hcnlMZXZlbERCS2V5OworfTsKKworYm9vbCBJbmRleEN1cnNvckltcGw6OmxvYWRDdXJy
ZW50Um93KCkKK3sKKyAgICBjb25zdCBjaGFyKiBrZXlQb3NpdGlvbiA9IG1faXRlcmF0b3ItPmtl
eSgpLmJlZ2luKCk7CisgICAgY29uc3QgY2hhcioga2V5TGltaXQgPSBtX2l0ZXJhdG9yLT5rZXko
KS5lbmQoKTsKKworICAgIEluZGV4RGF0YUtleSBpbmRleERhdGFLZXk7CisgICAga2V5UG9zaXRp
b24gPSBJbmRleERhdGFLZXk6OmRlY29kZShrZXlQb3NpdGlvbiwga2V5TGltaXQsICZpbmRleERh
dGFLZXkpOworCisgICAgbV9jdXJyZW50S2V5ID0gaW5kZXhEYXRhS2V5LnVzZXJLZXkoKTsKKwor
ICAgIGNvbnN0IGNoYXIqIHZhbHVlUG9zaXRpb24gPSBtX2l0ZXJhdG9yLT52YWx1ZSgpLmJlZ2lu
KCk7CisgICAgY29uc3QgY2hhciogdmFsdWVMaW1pdCA9IG1faXRlcmF0b3ItPnZhbHVlKCkuZW5k
KCk7CisKKyAgICBpbnQ2NF90IGluZGV4RGF0YVZlcnNpb247CisgICAgdmFsdWVQb3NpdGlvbiA9
IGRlY29kZVZhckludCh2YWx1ZVBvc2l0aW9uLCB2YWx1ZUxpbWl0LCBpbmRleERhdGFWZXJzaW9u
KTsKKyAgICBpZiAoIXZhbHVlUG9zaXRpb24pIHsKKyAgICAgICAgSW50ZXJuYWxFcnJvcihJREJM
ZXZlbERCQmFja2luZ1N0b3JlUmVhZEVycm9yKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IH0KKyAgICB2YWx1ZVBvc2l0aW9uID0gZGVjb2RlSURCS2V5KHZhbHVlUG9zaXRpb24sIHZhbHVl
TGltaXQsIG1fcHJpbWFyeUtleSk7CisgICAgaWYgKCF2YWx1ZVBvc2l0aW9uKSB7CisgICAgICAg
IEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVJlYWRFcnJvcik7CisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX3ByaW1hcnlMZXZlbERCS2V5ID0gT2JqZWN0
U3RvcmVEYXRhS2V5OjplbmNvZGUoaW5kZXhEYXRhS2V5LmRhdGFiYXNlSWQoKSwgaW5kZXhEYXRh
S2V5Lm9iamVjdFN0b3JlSWQoKSwgKm1fcHJpbWFyeUtleSk7CisKKyAgICBWZWN0b3I8Y2hhcj4g
cmVzdWx0OworICAgIGlmICghbV90cmFuc2FjdGlvbi0+Z2V0KG1fcHJpbWFyeUxldmVsREJLZXks
IHJlc3VsdCkpIHsKKyAgICAgICAgbV90cmFuc2FjdGlvbi0+cmVtb3ZlKG1faXRlcmF0b3ItPmtl
eSgpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDY0X3Qgb2JqZWN0
U3RvcmVEYXRhVmVyc2lvbjsKKyAgICBjb25zdCBjaGFyKiB0ID0gZGVjb2RlVmFySW50KHJlc3Vs
dC5iZWdpbigpLCByZXN1bHQuZW5kKCksIG9iamVjdFN0b3JlRGF0YVZlcnNpb24pOworICAgIGlm
ICghdCkgeworICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVSZWFk
RXJyb3IpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG9iamVjdFN0
b3JlRGF0YVZlcnNpb24gIT0gaW5kZXhEYXRhVmVyc2lvbikgeworICAgICAgICBtX3RyYW5zYWN0
aW9uLT5yZW1vdmUobV9pdGVyYXRvci0+a2V5KCkpOworICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfQorCisgICAgbV92YWx1ZSA9IGRlY29kZVN0cmluZyh0LCByZXN1bHQuZW5kKCkpOworICAg
IHJldHVybiB0cnVlOworfQorCitib29sIG9iamVjdFN0b3JlQ3Vyc29yT3B0aW9ucyhMZXZlbERC
VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2Jq
ZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5UmFuZ2UqIHJhbmdlLCBJREJDdXJzb3I6OkRpcmVjdGlv
biBkaXJlY3Rpb24sIEN1cnNvck9wdGlvbnMmIGN1cnNvck9wdGlvbnMpCit7CisgICAgYm9vbCBs
b3dlckJvdW5kID0gcmFuZ2UgJiYgcmFuZ2UtPmxvd2VyKCk7CisgICAgYm9vbCB1cHBlckJvdW5k
ID0gcmFuZ2UgJiYgcmFuZ2UtPnVwcGVyKCk7CisgICAgY3Vyc29yT3B0aW9ucy5mb3J3YXJkID0g
KGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFRfTk9fRFVQTElDQVRFIHx8IGRpcmVjdGlvbiA9
PSBJREJDdXJzb3I6Ok5FWFQpOworICAgIGN1cnNvck9wdGlvbnMudW5pcXVlID0gKGRpcmVjdGlv
biA9PSBJREJDdXJzb3I6Ok5FWFRfTk9fRFVQTElDQVRFIHx8IGRpcmVjdGlvbiA9PSBJREJDdXJz
b3I6OlBSRVZfTk9fRFVQTElDQVRFKTsKKworICAgIGlmICghbG93ZXJCb3VuZCkgeworICAgICAg
ICBjdXJzb3JPcHRpb25zLmxvd0tleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFi
YXNlSWQsIG9iamVjdFN0b3JlSWQsIG1pbklEQktleSgpKTsKKyAgICAgICAgY3Vyc29yT3B0aW9u
cy5sb3dPcGVuID0gdHJ1ZTsgLy8gTm90IGluY2x1ZGVkLgorICAgIH0gZWxzZSB7CisgICAgICAg
IGN1cnNvck9wdGlvbnMubG93S2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJh
c2VJZCwgb2JqZWN0U3RvcmVJZCwgKnJhbmdlLT5sb3dlcigpKTsKKyAgICAgICAgY3Vyc29yT3B0
aW9ucy5sb3dPcGVuID0gcmFuZ2UtPmxvd2VyT3BlbigpOworICAgIH0KKworICAgIGlmICghdXBw
ZXJCb3VuZCkgeworICAgICAgICBjdXJzb3JPcHRpb25zLmhpZ2hLZXkgPSBPYmplY3RTdG9yZURh
dGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBtYXhJREJLZXkoKSk7CisK
KyAgICAgICAgaWYgKGN1cnNvck9wdGlvbnMuZm9yd2FyZCkKKyAgICAgICAgICAgIGN1cnNvck9w
dGlvbnMuaGlnaE9wZW4gPSB0cnVlOyAvLyBOb3QgaW5jbHVkZWQuCisgICAgICAgIGVsc2Ugewor
ICAgICAgICAgICAgLy8gV2UgbmVlZCBhIGtleSB0aGF0IGV4aXN0cy4KKyAgICAgICAgICAgIGlm
ICghZmluZEdyZWF0ZXN0S2V5TGVzc1RoYW5PckVxdWFsKHRyYW5zYWN0aW9uLCBjdXJzb3JPcHRp
b25zLmhpZ2hLZXksIGN1cnNvck9wdGlvbnMuaGlnaEtleSkpCisgICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICAgICAgY3Vyc29yT3B0aW9ucy5oaWdoT3BlbiA9IGZhbHNlOwor
ICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY3Vyc29yT3B0aW9ucy5oaWdoS2V5ID0g
T2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgKnJh
bmdlLT51cHBlcigpKTsKKyAgICAgICAgY3Vyc29yT3B0aW9ucy5oaWdoT3BlbiA9IHJhbmdlLT51
cHBlck9wZW4oKTsKKworICAgICAgICBpZiAoIWN1cnNvck9wdGlvbnMuZm9yd2FyZCkgeworICAg
ICAgICAgICAgLy8gRm9yIHJldmVyc2UgY3Vyc29ycywgd2UgbmVlZCBhIGtleSB0aGF0IGV4aXN0
cy4KKyAgICAgICAgICAgIFZlY3RvcjxjaGFyPiBmb3VuZEhpZ2hLZXk7CisgICAgICAgICAgICBp
ZiAoIWZpbmRHcmVhdGVzdEtleUxlc3NUaGFuT3JFcXVhbCh0cmFuc2FjdGlvbiwgY3Vyc29yT3B0
aW9ucy5oaWdoS2V5LCBmb3VuZEhpZ2hLZXkpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgICAgICAgICAgLy8gSWYgdGhlIHRhcmdldCBrZXkgc2hvdWxkIG5vdCBiZSBpbmNs
dWRlZCwgYnV0IHdlIGVuZCB1cCB3aXRoIGEgc21hbGxlciBrZXksIHdlIHNob3VsZCBpbmNsdWRl
IHRoYXQuCisgICAgICAgICAgICBpZiAoY3Vyc29yT3B0aW9ucy5oaWdoT3BlbiAmJiBjb21wYXJl
SW5kZXhLZXlzKGZvdW5kSGlnaEtleSwgY3Vyc29yT3B0aW9ucy5oaWdoS2V5KSA8IDApCisgICAg
ICAgICAgICAgICAgY3Vyc29yT3B0aW9ucy5oaWdoT3BlbiA9IGZhbHNlOworCisgICAgICAgICAg
ICBjdXJzb3JPcHRpb25zLmhpZ2hLZXkgPSBmb3VuZEhpZ2hLZXk7CisgICAgICAgIH0KKyAgICB9
CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBpbmRleEN1cnNvck9wdGlvbnMoTGV2ZWxE
QlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9i
amVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5UmFuZ2UqIHJhbmdlLCBJ
REJDdXJzb3I6OkRpcmVjdGlvbiBkaXJlY3Rpb24sIEN1cnNvck9wdGlvbnMmIGN1cnNvck9wdGlv
bnMpCit7CisgICAgQVNTRVJUKHRyYW5zYWN0aW9uKTsKKyAgICBib29sIGxvd2VyQm91bmQgPSBy
YW5nZSAmJiByYW5nZS0+bG93ZXIoKTsKKyAgICBib29sIHVwcGVyQm91bmQgPSByYW5nZSAmJiBy
YW5nZS0+dXBwZXIoKTsKKyAgICBjdXJzb3JPcHRpb25zLmZvcndhcmQgPSAoZGlyZWN0aW9uID09
IElEQkN1cnNvcjo6TkVYVF9OT19EVVBMSUNBVEUgfHwgZGlyZWN0aW9uID09IElEQkN1cnNvcjo6
TkVYVCk7CisgICAgY3Vyc29yT3B0aW9ucy51bmlxdWUgPSAoZGlyZWN0aW9uID09IElEQkN1cnNv
cjo6TkVYVF9OT19EVVBMSUNBVEUgfHwgZGlyZWN0aW9uID09IElEQkN1cnNvcjo6UFJFVl9OT19E
VVBMSUNBVEUpOworCisgICAgaWYgKCFsb3dlckJvdW5kKSB7CisgICAgICAgIGN1cnNvck9wdGlv
bnMubG93S2V5ID0gSW5kZXhEYXRhS2V5OjplbmNvZGVNaW5LZXkoZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmVJZCwgaW5kZXhJZCk7CisgICAgICAgIGN1cnNvck9wdGlvbnMubG93T3BlbiA9IGZhbHNl
OyAvLyBJbmNsdWRlZC4KKyAgICB9IGVsc2UgeworICAgICAgICBjdXJzb3JPcHRpb25zLmxvd0tl
eSA9IEluZGV4RGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4
SWQsICpyYW5nZS0+bG93ZXIoKSk7CisgICAgICAgIGN1cnNvck9wdGlvbnMubG93T3BlbiA9IHJh
bmdlLT5sb3dlck9wZW4oKTsKKyAgICB9CisKKyAgICBpZiAoIXVwcGVyQm91bmQpIHsKKyAgICAg
ICAgY3Vyc29yT3B0aW9ucy5oaWdoS2V5ID0gSW5kZXhEYXRhS2V5OjplbmNvZGVNYXhLZXkoZGF0
YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCk7CisgICAgICAgIGN1cnNvck9wdGlvbnMu
aGlnaE9wZW4gPSBmYWxzZTsgLy8gSW5jbHVkZWQuCisKKyAgICAgICAgaWYgKCFjdXJzb3JPcHRp
b25zLmZvcndhcmQpIHsgLy8gV2UgbmVlZCBhIGtleSB0aGF0IGV4aXN0cy4KKyAgICAgICAgICAg
IGlmICghZmluZEdyZWF0ZXN0S2V5TGVzc1RoYW5PckVxdWFsKHRyYW5zYWN0aW9uLCBjdXJzb3JP
cHRpb25zLmhpZ2hLZXksIGN1cnNvck9wdGlvbnMuaGlnaEtleSkpCisgICAgICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgICAgICAgY3Vyc29yT3B0aW9ucy5oaWdoT3BlbiA9IGZhbHNl
OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY3Vyc29yT3B0aW9ucy5oaWdoS2V5
ID0gSW5kZXhEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJ
ZCwgKnJhbmdlLT51cHBlcigpKTsKKyAgICAgICAgY3Vyc29yT3B0aW9ucy5oaWdoT3BlbiA9IHJh
bmdlLT51cHBlck9wZW4oKTsKKworICAgICAgICBWZWN0b3I8Y2hhcj4gZm91bmRIaWdoS2V5Owor
ICAgICAgICBpZiAoIWZpbmRHcmVhdGVzdEtleUxlc3NUaGFuT3JFcXVhbCh0cmFuc2FjdGlvbiwg
Y3Vyc29yT3B0aW9ucy5oaWdoS2V5LCBmb3VuZEhpZ2hLZXkpKSAvLyBTZWVrIHRvIHRoZSAqbGFz
dCoga2V5IGluIHRoZSBzZXQgb2Ygbm9uLXVuaXF1ZSBrZXlzLgorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgICAgIC8vIElmIHRoZSB0YXJnZXQga2V5IHNob3VsZCBub3QgYmUgaW5j
bHVkZWQsIGJ1dCB3ZSBlbmQgdXAgd2l0aCBhIHNtYWxsZXIga2V5LCB3ZSBzaG91bGQgaW5jbHVk
ZSB0aGF0LgorICAgICAgICBpZiAoY3Vyc29yT3B0aW9ucy5oaWdoT3BlbiAmJiBjb21wYXJlSW5k
ZXhLZXlzKGZvdW5kSGlnaEtleSwgY3Vyc29yT3B0aW9ucy5oaWdoS2V5KSA8IDApCisgICAgICAg
ICAgICBjdXJzb3JPcHRpb25zLmhpZ2hPcGVuID0gZmFsc2U7CisKKyAgICAgICAgY3Vyc29yT3B0
aW9ucy5oaWdoS2V5ID0gZm91bmRIaWdoS2V5OworICAgIH0KKworICAgIHJldHVybiB0cnVlOwor
fQorCit9CisKK1Bhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IElEQkxldmVsREJC
YWNraW5nU3RvcmU6Om9wZW5PYmplY3RTdG9yZUN1cnNvcihJREJCYWNraW5nU3RvcmU6OlRyYW5z
YWN0aW9uKiB0cmFuc2FjdGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0
b3JlSWQsIGNvbnN0IElEQktleVJhbmdlKiByYW5nZSwgSURCQ3Vyc29yOjpEaXJlY3Rpb24gZGly
ZWN0aW9uKQoreworICAgIElEQl9UUkFDRSgiSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3Blbk9i
amVjdFN0b3JlQ3Vyc29yIik7CisgICAgTGV2ZWxEQlRyYW5zYWN0aW9uKiBsZXZlbERCVHJhbnNh
Y3Rpb24gPSBUcmFuc2FjdGlvbjo6bGV2ZWxEQlRyYW5zYWN0aW9uRnJvbSh0cmFuc2FjdGlvbik7
CisgICAgQ3Vyc29yT3B0aW9ucyBjdXJzb3JPcHRpb25zOworICAgIGlmICghb2JqZWN0U3RvcmVD
dXJzb3JPcHRpb25zKGxldmVsREJUcmFuc2FjdGlvbiwgZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJ
ZCwgcmFuZ2UsIGRpcmVjdGlvbiwgY3Vyc29yT3B0aW9ucykpCisgICAgICAgIHJldHVybiAwOwor
ICAgIFJlZlB0cjxPYmplY3RTdG9yZUN1cnNvckltcGw+IGN1cnNvciA9IE9iamVjdFN0b3JlQ3Vy
c29ySW1wbDo6Y3JlYXRlKGxldmVsREJUcmFuc2FjdGlvbiwgY3Vyc29yT3B0aW9ucyk7CisgICAg
aWYgKCFjdXJzb3ItPmZpcnN0U2VlaygpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVy
biBjdXJzb3IucmVsZWFzZSgpOworfQorCitQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6Q3Vy
c29yPiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpvcGVuT2JqZWN0U3RvcmVLZXlDdXJzb3IoSURC
QmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGludDY0X3QgZGF0YWJhc2VJ
ZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXlSYW5nZSogcmFuZ2UsIElEQkN1
cnNvcjo6RGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKyAgICBJREJfVFJBQ0UoIklEQkxldmVsREJC
YWNraW5nU3RvcmU6Om9wZW5PYmplY3RTdG9yZUtleUN1cnNvciIpOworICAgIExldmVsREJUcmFu
c2FjdGlvbiogbGV2ZWxEQlRyYW5zYWN0aW9uID0gVHJhbnNhY3Rpb246OmxldmVsREJUcmFuc2Fj
dGlvbkZyb20odHJhbnNhY3Rpb24pOworICAgIEN1cnNvck9wdGlvbnMgY3Vyc29yT3B0aW9uczsK
KyAgICBpZiAoIW9iamVjdFN0b3JlQ3Vyc29yT3B0aW9ucyhsZXZlbERCVHJhbnNhY3Rpb24sIGRh
dGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIHJhbmdlLCBkaXJlY3Rpb24sIGN1cnNvck9wdGlvbnMp
KQorICAgICAgICByZXR1cm4gMDsKKyAgICBSZWZQdHI8T2JqZWN0U3RvcmVLZXlDdXJzb3JJbXBs
PiBjdXJzb3IgPSBPYmplY3RTdG9yZUtleUN1cnNvckltcGw6OmNyZWF0ZShsZXZlbERCVHJhbnNh
Y3Rpb24sIGN1cnNvck9wdGlvbnMpOworICAgIGlmICghY3Vyc29yLT5maXJzdFNlZWsoKSkKKyAg
ICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gY3Vyc29yLnJlbGVhc2UoKTsKK30KKworUGFz
c1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6
b3BlbkluZGV4S2V5Q3Vyc29yKElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5zYWN0
aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBp
bmRleElkLCBjb25zdCBJREJLZXlSYW5nZSogcmFuZ2UsIElEQkN1cnNvcjo6RGlyZWN0aW9uIGRp
cmVjdGlvbikKK3sKKyAgICBJREJfVFJBQ0UoIklEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5J
bmRleEtleUN1cnNvciIpOworICAgIExldmVsREJUcmFuc2FjdGlvbiogbGV2ZWxEQlRyYW5zYWN0
aW9uID0gVHJhbnNhY3Rpb246OmxldmVsREJUcmFuc2FjdGlvbkZyb20odHJhbnNhY3Rpb24pOwor
ICAgIEN1cnNvck9wdGlvbnMgY3Vyc29yT3B0aW9uczsKKyAgICBpZiAoIWluZGV4Q3Vyc29yT3B0
aW9ucyhsZXZlbERCVHJhbnNhY3Rpb24sIGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4
SWQsIHJhbmdlLCBkaXJlY3Rpb24sIGN1cnNvck9wdGlvbnMpKQorICAgICAgICByZXR1cm4gMDsK
KyAgICBSZWZQdHI8SW5kZXhLZXlDdXJzb3JJbXBsPiBjdXJzb3IgPSBJbmRleEtleUN1cnNvcklt
cGw6OmNyZWF0ZShsZXZlbERCVHJhbnNhY3Rpb24sIGN1cnNvck9wdGlvbnMpOworICAgIGlmICgh
Y3Vyc29yLT5maXJzdFNlZWsoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gY3Vy
c29yLnJlbGVhc2UoKTsKK30KKworUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4g
SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3BlbkluZGV4Q3Vyc29yKElEQkJhY2tpbmdTdG9yZTo6
VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2Jq
ZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXlSYW5nZSogcmFuZ2UsIElE
QkN1cnNvcjo6RGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKyAgICBJREJfVFJBQ0UoIklEQkxldmVs
REJCYWNraW5nU3RvcmU6Om9wZW5JbmRleEN1cnNvciIpOworICAgIExldmVsREJUcmFuc2FjdGlv
biogbGV2ZWxEQlRyYW5zYWN0aW9uID0gVHJhbnNhY3Rpb246OmxldmVsREJUcmFuc2FjdGlvbkZy
b20odHJhbnNhY3Rpb24pOworICAgIEN1cnNvck9wdGlvbnMgY3Vyc29yT3B0aW9uczsKKyAgICBp
ZiAoIWluZGV4Q3Vyc29yT3B0aW9ucyhsZXZlbERCVHJhbnNhY3Rpb24sIGRhdGFiYXNlSWQsIG9i
amVjdFN0b3JlSWQsIGluZGV4SWQsIHJhbmdlLCBkaXJlY3Rpb24sIGN1cnNvck9wdGlvbnMpKQor
ICAgICAgICByZXR1cm4gMDsKKyAgICBSZWZQdHI8SW5kZXhDdXJzb3JJbXBsPiBjdXJzb3IgPSBJ
bmRleEN1cnNvckltcGw6OmNyZWF0ZShsZXZlbERCVHJhbnNhY3Rpb24sIGN1cnNvck9wdGlvbnMp
OworICAgIGlmICghY3Vyc29yLT5maXJzdFNlZWsoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAg
ICByZXR1cm4gY3Vyc29yLnJlbGVhc2UoKTsKK30KKworUGFzc1JlZlB0cjxJREJCYWNraW5nU3Rv
cmU6OlRyYW5zYWN0aW9uPiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpjcmVhdGVUcmFuc2FjdGlv
bigpCit7CisgICAgcmV0dXJuIFRyYW5zYWN0aW9uOjpjcmVhdGUodGhpcyk7Cit9CisKK1Bhc3NS
ZWZQdHI8SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24+IElEQkxldmVsREJCYWNr
aW5nU3RvcmU6OlRyYW5zYWN0aW9uOjpjcmVhdGUoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZSogYmFj
a2luZ1N0b3JlKQoreworICAgIHJldHVybiBhZG9wdFJlZihuZXcgVHJhbnNhY3Rpb24oYmFja2lu
Z1N0b3JlKSk7Cit9CisKK0lEQkxldmVsREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uOjpUcmFu
c2FjdGlvbihJREJMZXZlbERCQmFja2luZ1N0b3JlKiBiYWNraW5nU3RvcmUpCisgICAgOiBtX2Jh
Y2tpbmdTdG9yZShiYWNraW5nU3RvcmUpCit7Cit9CisKK3ZvaWQgSURCTGV2ZWxEQkJhY2tpbmdT
dG9yZTo6VHJhbnNhY3Rpb246OmJlZ2luKCkKK3sKKyAgICBJREJfVFJBQ0UoIklEQkxldmVsREJC
YWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uOjpiZWdpbiIpOworICAgIEFTU0VSVCghbV90cmFuc2Fj
dGlvbik7CisgICAgbV90cmFuc2FjdGlvbiA9IExldmVsREJUcmFuc2FjdGlvbjo6Y3JlYXRlKG1f
YmFja2luZ1N0b3JlLT5tX2RiLmdldCgpKTsKK30KKworYm9vbCBJREJMZXZlbERCQmFja2luZ1N0
b3JlOjpUcmFuc2FjdGlvbjo6Y29tbWl0KCkKK3sKKyAgICBJREJfVFJBQ0UoIklEQkxldmVsREJC
YWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uOjpjb21taXQiKTsKKyAgICBBU1NFUlQobV90cmFuc2Fj
dGlvbik7CisgICAgYm9vbCByZXN1bHQgPSBtX3RyYW5zYWN0aW9uLT5jb21taXQoKTsKKyAgICBt
X3RyYW5zYWN0aW9uLmNsZWFyKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBJREJM
ZXZlbERCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbjo6cm9sbGJhY2soKQoreworICAgIElEQl9U
UkFDRSgiSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb246OnJvbGxiYWNrIik7Cisg
ICAgQVNTRVJUKG1fdHJhbnNhY3Rpb24pOworICAgIG1fdHJhbnNhY3Rpb24tPnJvbGxiYWNrKCk7
CisgICAgbV90cmFuc2FjdGlvbi5jbGVhcigpOworfQorCitib29sIElEQkxldmVsREJCYWNraW5n
U3RvcmU6OmJhY2tpbmdTdG9yZUV4aXN0cyhTZWN1cml0eU9yaWdpbiogc2VjdXJpdHlPcmlnaW4s
IGNvbnN0IFN0cmluZyYsIGNvbnN0IFN0cmluZyYgcGF0aEJhc2VBcmcpCit7CisgICAgU3RyaW5n
IHBhdGhCYXNlID0gcGF0aEJhc2VBcmc7CisKKyAgICBpZiAocGF0aEJhc2UuaXNFbXB0eSgpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGV2ZW50dWFs
bHkgdXNlIHRoZSBzYW1lIExldmVsREIgZGF0YWJhc2UgZm9yIGFsbCBvcmlnaW5zLgorICAgIFN0
cmluZyBwYXRoID0gcGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KHBhdGhCYXNlLCBzZWN1cml0eU9y
aWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkgKyAiLmluZGV4ZWRkYi5sZXZlbGRiIik7CisKKyAg
ICAvLyBGSVhNRTogdGhpcyBpcyBjaGVja2luZyBmb3IgcHJlc2VuY2Ugb2YgdGhlIGRvbWFpbiwg
bm90IHRoZSBkYXRhYmFzZSBpdHNlbGYKKyAgICByZXR1cm4gZmlsZUV4aXN0cyhwYXRoKyIvQ1VS
UkVOVCIpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoTEVW
RUxEQikKKyNlbmRpZiAvLyBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL0lEQkxldmVsREJCYWNraW5nU3RvcmUuY3Bw
IGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvSURCTGV2ZWxEQkJhY2tpbmdTdG9y
ZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNWQ1OWZlM2U4NDFjYjI0ZTE5
YjNmYjYyYTNmZjM1ZWIzNzA2ODMuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTA4ICswLDAgQEAKLS8qCi0gKiBD
b3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0g
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiAgUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
LSAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCi0gKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFO
RCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQotICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAot
ICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
T1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0j
aW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5oIgot
I2luY2x1ZGUgIklEQlRyYWNpbmcuaCIKLQotI2lmIEVOQUJMRShJTkRFWEVEX0RBVEFCQVNFKQot
I2lmIFVTRShMRVZFTERCKQotCi0jaW5jbHVkZSA8d3RmL0Fzc2VydGlvbnMuaD4KLSNpbmNsdWRl
ICJGaWxlU3lzdGVtLmgiCi0jaW5jbHVkZSAiSGlzdG9ncmFtU3VwcG9ydC5oIgotI2luY2x1ZGUg
IklEQkZhY3RvcnlCYWNrZW5kSW1wbC5oIgotI2luY2x1ZGUgIklEQktleS5oIgotI2luY2x1ZGUg
IklEQktleVBhdGguaCIKLSNpbmNsdWRlICJJREJLZXlSYW5nZS5oIgotI2luY2x1ZGUgIklEQkxl
dmVsREJDb2RpbmcuaCIKLSNpbmNsdWRlICJJREJNZXRhZGF0YS5oIgotI2luY2x1ZGUgIkxldmVs
REJDb21wYXJhdG9yLmgiCi0jaW5jbHVkZSAiTGV2ZWxEQkRhdGFiYXNlLmgiCi0jaW5jbHVkZSAi
TGV2ZWxEQkl0ZXJhdG9yLmgiCi0jaW5jbHVkZSAiTGV2ZWxEQlNsaWNlLmgiCi0jaW5jbHVkZSAi
TGV2ZWxEQlRyYW5zYWN0aW9uLmgiCi0jaW5jbHVkZSAiU2VjdXJpdHlPcmlnaW4uaCIKLQotbmFt
ZXNwYWNlIFdlYkNvcmUgewotCi11c2luZyBuYW1lc3BhY2UgSURCTGV2ZWxEQkNvZGluZzsKLQot
Y29uc3QgaW50NjRfdCBLZXlHZW5lcmF0b3JJbml0aWFsTnVtYmVyID0gMTsgLy8gRnJvbSB0aGUg
SW5kZXhlZERCIHNwZWNpZmljYXRpb24uCi0KLWVudW0gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZUlu
dGVybmFsRXJyb3JUeXBlIHsKLSAgICBJREJMZXZlbERCQmFja2luZ1N0b3JlUmVhZEVycm9yLAot
ICAgIElEQkxldmVsREJCYWNraW5nU3RvcmVXcml0ZUVycm9yLAotICAgIElEQkxldmVsREJCYWNr
aW5nU3RvcmVDb25zaXN0ZW5jeUVycm9yLAotICAgIElEQkxldmVsREJCYWNraW5nU3RvcmVJbnRl
cm5hbEVycm9yTWF4LAotfTsKLXN0YXRpYyBpbmxpbmUgdm9pZCByZWNvcmRJbnRlcm5hbEVycm9y
KElEQkxldmVsREJCYWNraW5nU3RvcmVJbnRlcm5hbEVycm9yVHlwZSB0eXBlKQotewotICAgIEhp
c3RvZ3JhbVN1cHBvcnQ6Omhpc3RvZ3JhbUVudW1lcmF0aW9uKCJXZWJDb3JlLkluZGV4ZWREQi5C
YWNraW5nU3RvcmUuSW50ZXJuYWxFcnJvciIsIHR5cGUsIElEQkxldmVsREJCYWNraW5nU3RvcmVJ
bnRlcm5hbEVycm9yTWF4KTsKLX0KLQotLy8gVXNlIHRvIHNpZ25hbCBjb25kaXRpb25zIHRoYXQg
dXN1YWxseSBpbmRpY2F0ZSBkZXZlbG9wZXIgZXJyb3IsIGJ1dCBjb3VsZCBiZSBjYXVzZWQgYnkg
ZGF0YSBjb3JydXB0aW9uLgotLy8gQSBtYWNybyBpcyB1c2VkIGluc3RlYWQgb2YgYW4gaW5saW5l
IGZ1bmN0aW9uIHNvIHRoYXQgdGhlIGFzc2VydCBhbmQgbG9nIHJlcG9ydCB0aGUgbGluZSBudW1i
ZXIuCi0jZGVmaW5lIEludGVybmFsRXJyb3IodHlwZSkgXAotICAgIGRvIHsgXAotICAgICAgICBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsgXAotICAgICAgICBMT0dfRVJST1IoIkludGVybmFsIEluZGV4
ZWREQiBFcnJvcjogJXMiLCAjdHlwZSk7IFwKLSAgICAgICAgcmVjb3JkSW50ZXJuYWxFcnJvcih0
eXBlKTsgXAotICAgIH0gd2hpbGUgKDApCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBEQk9yVHJhbnNh
Y3Rpb24+Ci1zdGF0aWMgYm9vbCBnZXRCb29sKERCT3JUcmFuc2FjdGlvbiogZGIsIGNvbnN0IFZl
Y3RvcjxjaGFyPiYga2V5LCBib29sJiBmb3VuZEJvb2wpCi17Ci0gICAgVmVjdG9yPGNoYXI+IHJl
c3VsdDsKLSAgICBpZiAoIWRiLT5nZXQoa2V5LCByZXN1bHQpKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICBmb3VuZEJvb2wgPSBkZWNvZGVCb29sKHJlc3VsdC5iZWdpbigpLCByZXN1bHQu
ZW5kKCkpOwotICAgIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgREJPclRy
YW5zYWN0aW9uPgotc3RhdGljIGJvb2wgcHV0Qm9vbChEQk9yVHJhbnNhY3Rpb24qIGRiLCBjb25z
dCBWZWN0b3I8Y2hhcj4mIGtleSwgYm9vbCB2YWx1ZSkKLXsKLSAgICByZXR1cm4gZGItPnB1dChr
ZXksIGVuY29kZUJvb2wodmFsdWUpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIERCT3JUcmFu
c2FjdGlvbj4KLXN0YXRpYyBib29sIGdldEludChEQk9yVHJhbnNhY3Rpb24qIGRiLCBjb25zdCBW
ZWN0b3I8Y2hhcj4mIGtleSwgaW50NjRfdCYgZm91bmRJbnQpCi17Ci0gICAgVmVjdG9yPGNoYXI+
IHJlc3VsdDsKLSAgICBpZiAoIWRiLT5nZXQoa2V5LCByZXN1bHQpKQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0KLSAgICBmb3VuZEludCA9IGRlY29kZUludChyZXN1bHQuYmVnaW4oKSwgcmVzdWx0
LmVuZCgpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIERCT3JU
cmFuc2FjdGlvbj4KLXN0YXRpYyBib29sIHB1dEludChEQk9yVHJhbnNhY3Rpb24qIGRiLCBjb25z
dCBWZWN0b3I8Y2hhcj4mIGtleSwgaW50NjRfdCB2YWx1ZSkKLXsKLSAgICBBU1NFUlQodmFsdWUg
Pj0gMCk7Ci0gICAgaWYgKHZhbHVlIDwgMCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJl
dHVybiBkYi0+cHV0KGtleSwgZW5jb2RlSW50KHZhbHVlKSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBl
bmFtZSBEQk9yVHJhbnNhY3Rpb24+Ci1zdGF0aWMgYm9vbCBnZXRWYXJJbnQoREJPclRyYW5zYWN0
aW9uKiBkYiwgY29uc3QgVmVjdG9yPGNoYXI+JiBrZXksIGludDY0X3QmIGZvdW5kSW50KQotewot
ICAgIFZlY3RvcjxjaGFyPiByZXN1bHQ7Ci0gICAgaWYgKCFkYi0+Z2V0KGtleSwgcmVzdWx0KSkK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgcmV0dXJuIGRlY29kZVZhckludChyZXN1bHQu
YmVnaW4oKSwgcmVzdWx0LmVuZCgpLCBmb3VuZEludCkgPT0gcmVzdWx0LmVuZCgpOwotfQotCi10
ZW1wbGF0ZSA8dHlwZW5hbWUgREJPclRyYW5zYWN0aW9uPgotc3RhdGljIGJvb2wgcHV0VmFySW50
KERCT3JUcmFuc2FjdGlvbiogZGIsIGNvbnN0IFZlY3RvcjxjaGFyPiYga2V5LCBpbnQ2NF90IHZh
bHVlKQotewotICAgIHJldHVybiBkYi0+cHV0KGtleSwgZW5jb2RlVmFySW50KHZhbHVlKSk7Ci19
Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBEQk9yVHJhbnNhY3Rpb24+Ci1zdGF0aWMgYm9vbCBnZXRT
dHJpbmcoREJPclRyYW5zYWN0aW9uKiBkYiwgY29uc3QgVmVjdG9yPGNoYXI+JiBrZXksIFN0cmlu
ZyYgZm91bmRTdHJpbmcpCi17Ci0gICAgVmVjdG9yPGNoYXI+IHJlc3VsdDsKLSAgICBpZiAoIWRi
LT5nZXQoa2V5LCByZXN1bHQpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBmb3VuZFN0
cmluZyA9IGRlY29kZVN0cmluZyhyZXN1bHQuYmVnaW4oKSwgcmVzdWx0LmVuZCgpKTsKLSAgICBy
ZXR1cm4gdHJ1ZTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIERCT3JUcmFuc2FjdGlvbj4KLXN0
YXRpYyBib29sIHB1dFN0cmluZyhEQk9yVHJhbnNhY3Rpb24qIGRiLCBjb25zdCBWZWN0b3I8Y2hh
cj4ga2V5LCBjb25zdCBTdHJpbmcmIHZhbHVlKQotewotICAgIGlmICghZGItPnB1dChrZXksIGVu
Y29kZVN0cmluZyh2YWx1ZSkpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRy
dWU7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBEQk9yVHJhbnNhY3Rpb24+Ci1zdGF0aWMgYm9v
bCBwdXRJREJLZXlQYXRoKERCT3JUcmFuc2FjdGlvbiogZGIsIGNvbnN0IFZlY3RvcjxjaGFyPiBr
ZXksIGNvbnN0IElEQktleVBhdGgmIHZhbHVlKQotewotICAgIGlmICghZGItPnB1dChrZXksIGVu
Y29kZUlEQktleVBhdGgodmFsdWUpKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVy
biB0cnVlOwotfQotCi1zdGF0aWMgaW50IGNvbXBhcmVLZXlzKGNvbnN0IExldmVsREJTbGljZSYg
YSwgY29uc3QgTGV2ZWxEQlNsaWNlJiBiKQotewotICAgIHJldHVybiBjb21wYXJlKGEsIGIpOwot
fQotCi1zdGF0aWMgaW50IGNvbXBhcmVJbmRleEtleXMoY29uc3QgTGV2ZWxEQlNsaWNlJiBhLCBj
b25zdCBMZXZlbERCU2xpY2UmIGIpCi17Ci0gICAgcmV0dXJuIGNvbXBhcmUoYSwgYiwgdHJ1ZSk7
Ci19Ci0KLWNsYXNzIENvbXBhcmF0b3IgOiBwdWJsaWMgTGV2ZWxEQkNvbXBhcmF0b3IgewotcHVi
bGljOgotICAgIHZpcnR1YWwgaW50IGNvbXBhcmUoY29uc3QgTGV2ZWxEQlNsaWNlJiBhLCBjb25z
dCBMZXZlbERCU2xpY2UmIGIpIGNvbnN0IHsgcmV0dXJuIElEQkxldmVsREJDb2Rpbmc6OmNvbXBh
cmUoYSwgYik7IH0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdCB7IHJldHVy
biAiaWRiX2NtcDEiOyB9Ci19OwotCi1jb25zdCBpbnQ2NF90IGxhdGVzdFNjaGVtYVZlcnNpb24g
PSAxOwotc3RhdGljIGJvb2wgaXNTY2hlbWFLbm93bihMZXZlbERCRGF0YWJhc2UqIGRiKQotewot
ICAgIGludDY0X3Qgc2NoZW1hVmVyc2lvbiA9IDA7Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IG1l
dGFEYXRhS2V5ID0gU2NoZW1hVmVyc2lvbktleTo6ZW5jb2RlKCk7Ci0gICAgaWYgKCFnZXRJbnQo
ZGIsIG1ldGFEYXRhS2V5LCBzY2hlbWFWZXJzaW9uKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0g
ICAgcmV0dXJuIHNjaGVtYVZlcnNpb24gPD0gbGF0ZXN0U2NoZW1hVmVyc2lvbjsKLX0KLQotc3Rh
dGljIGJvb2wgc2V0VXBNZXRhZGF0YShMZXZlbERCRGF0YWJhc2UqIGRiLCBjb25zdCBTdHJpbmcm
IG9yaWdpbikKLXsKLSAgICBjb25zdCBWZWN0b3I8Y2hhcj4gbWV0YURhdGFLZXkgPSBTY2hlbWFW
ZXJzaW9uS2V5OjplbmNvZGUoKTsKLQotICAgIGludDY0X3Qgc2NoZW1hVmVyc2lvbiA9IDA7Ci0g
ICAgaWYgKCFnZXRJbnQoZGIsIG1ldGFEYXRhS2V5LCBzY2hlbWFWZXJzaW9uKSkgewotICAgICAg
ICBzY2hlbWFWZXJzaW9uID0gbGF0ZXN0U2NoZW1hVmVyc2lvbjsKLSAgICAgICAgaWYgKCFwdXRJ
bnQoZGIsIG1ldGFEYXRhS2V5LCBsYXRlc3RTY2hlbWFWZXJzaW9uKSkgewotICAgICAgICAgICAg
SW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlV3JpdGVFcnJvcik7Ci0gICAgICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBU1NF
UlQoc2NoZW1hVmVyc2lvbiA8PSBsYXRlc3RTY2hlbWFWZXJzaW9uKTsKLSAgICAgICAgaWYgKCFz
Y2hlbWFWZXJzaW9uKSB7Ci0gICAgICAgICAgICBzY2hlbWFWZXJzaW9uID0gbGF0ZXN0U2NoZW1h
VmVyc2lvbjsKLSAgICAgICAgICAgIFJlZlB0cjxMZXZlbERCVHJhbnNhY3Rpb24+IHRyYW5zYWN0
aW9uID0gTGV2ZWxEQlRyYW5zYWN0aW9uOjpjcmVhdGUoZGIpOwotICAgICAgICAgICAgdHJhbnNh
Y3Rpb24tPnB1dChtZXRhRGF0YUtleSwgZW5jb2RlSW50KHNjaGVtYVZlcnNpb24pKTsKLQotICAg
ICAgICAgICAgY29uc3QgVmVjdG9yPGNoYXI+IHN0YXJ0S2V5ID0gRGF0YWJhc2VOYW1lS2V5Ojpl
bmNvZGVNaW5LZXlGb3JPcmlnaW4ob3JpZ2luKTsKLSAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjxj
aGFyPiBzdG9wS2V5ID0gRGF0YWJhc2VOYW1lS2V5OjplbmNvZGVTdG9wS2V5Rm9yT3JpZ2luKG9y
aWdpbik7Ci0gICAgICAgICAgICBPd25QdHI8TGV2ZWxEQkl0ZXJhdG9yPiBpdCA9IGRiLT5jcmVh
dGVJdGVyYXRvcigpOwotICAgICAgICAgICAgZm9yIChpdC0+c2VlayhzdGFydEtleSk7IGl0LT5p
c1ZhbGlkKCkgJiYgY29tcGFyZUtleXMoaXQtPmtleSgpLCBzdG9wS2V5KSA8IDA7IGl0LT5uZXh0
KCkpIHsKLSAgICAgICAgICAgICAgICBWZWN0b3I8Y2hhcj4gdmFsdWU7Ci0gICAgICAgICAgICAg
ICAgYm9vbCBvayA9IHRyYW5zYWN0aW9uLT5nZXQoaXQtPmtleSgpLCB2YWx1ZSk7Ci0gICAgICAg
ICAgICAgICAgaWYgKCFvaykgewotICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbEVycm9yKElE
QkxldmVsREJCYWNraW5nU3RvcmVSZWFkRXJyb3IpOwotICAgICAgICAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGludCBkYXRhYmFz
ZUlkID0gZGVjb2RlSW50KHZhbHVlLmJlZ2luKCksIHZhbHVlLmVuZCgpKTsKLSAgICAgICAgICAg
ICAgICBWZWN0b3I8Y2hhcj4gaW50VmVyc2lvbktleSA9IERhdGFiYXNlTWV0YURhdGFLZXk6OmVu
Y29kZShkYXRhYmFzZUlkLCBEYXRhYmFzZU1ldGFEYXRhS2V5OjpVc2VySW50VmVyc2lvbik7Ci0g
ICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24tPnB1dChpbnRWZXJzaW9uS2V5LCBlbmNvZGVWYXJJ
bnQoSURCRGF0YWJhc2VNZXRhZGF0YTo6RGVmYXVsdEludFZlcnNpb24pKTsKLSAgICAgICAgICAg
ICAgICBvayA9IHRyYW5zYWN0aW9uLT5nZXQoaXQtPmtleSgpLCB2YWx1ZSk7Ci0gICAgICAgICAg
ICAgICAgaWYgKCFvaykgewotICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxl
dmVsREJCYWNraW5nU3RvcmVSZWFkRXJyb3IpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYm9v
bCBvayA9IHRyYW5zYWN0aW9uLT5jb21taXQoKTsKLSAgICAgICAgICAgIGlmICghb2spIHsKLSAg
ICAgICAgICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVXcml0ZUVy
cm9yKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgIH0KLSAgICB9Ci0KLSAgICBBU1NFUlQoc2NoZW1hVmVyc2lvbiA9PSBsYXRlc3RTY2hlbWFW
ZXJzaW9uKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgREJP
clRyYW5zYWN0aW9uPgotc3RhdGljIGludDY0X3QgZ2V0TWF4T2JqZWN0U3RvcmVJZChEQk9yVHJh
bnNhY3Rpb24qIGRiLCBpbnQ2NF90IGRhdGFiYXNlSWQpCi17Ci0gICAgY29uc3QgVmVjdG9yPGNo
YXI+IG1heE9iamVjdFN0b3JlSWRLZXkgPSBEYXRhYmFzZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0
YWJhc2VJZCwgRGF0YWJhc2VNZXRhRGF0YUtleTo6TWF4T2JqZWN0U3RvcmVJZCk7Ci0gICAgcmV0
dXJuIGdldE1heE9iamVjdFN0b3JlSWQoZGIsIG1heE9iamVjdFN0b3JlSWRLZXkpOwotfQotCi10
ZW1wbGF0ZSA8dHlwZW5hbWUgREJPclRyYW5zYWN0aW9uPgotc3RhdGljIGludDY0X3QgZ2V0TWF4
T2JqZWN0U3RvcmVJZChEQk9yVHJhbnNhY3Rpb24qIGRiLCBjb25zdCBWZWN0b3I8Y2hhcj4mIG1h
eE9iamVjdFN0b3JlSWRLZXkpCi17Ci0gICAgaW50NjRfdCBtYXhPYmplY3RTdG9yZUlkID0gLTE7
Ci0gICAgaWYgKCFnZXRJbnQoZGIsIG1heE9iamVjdFN0b3JlSWRLZXksIG1heE9iamVjdFN0b3Jl
SWQpKQotICAgICAgICBtYXhPYmplY3RTdG9yZUlkID0gMDsKLQotICAgIEFTU0VSVChtYXhPYmpl
Y3RTdG9yZUlkID49IDApOwotICAgIHJldHVybiBtYXhPYmplY3RTdG9yZUlkOwotfQotCi1JREJM
ZXZlbERCQmFja2luZ1N0b3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlKGNvbnN0IFN0cmluZyYg
aWRlbnRpZmllciwgSURCRmFjdG9yeUJhY2tlbmRJbXBsKiBmYWN0b3J5LCBQYXNzT3duUHRyPExl
dmVsREJEYXRhYmFzZT4gZGIpCi0gICAgOiBtX2lkZW50aWZpZXIoaWRlbnRpZmllcikKLSAgICAs
IG1fZmFjdG9yeShmYWN0b3J5KQotICAgICwgbV9kYihkYikKLXsKLSAgICBtX2ZhY3RvcnktPmFk
ZElEQkJhY2tpbmdTdG9yZShpZGVudGlmaWVyLCB0aGlzKTsKLX0KLQotSURCTGV2ZWxEQkJhY2tp
bmdTdG9yZTo6fklEQkxldmVsREJCYWNraW5nU3RvcmUoKQotewotICAgIG1fZmFjdG9yeS0+cmVt
b3ZlSURCQmFja2luZ1N0b3JlKG1faWRlbnRpZmllcik7Ci0KLSAgICAvLyBtX2RiJ3MgZGVzdHJ1
Y3RvciB1c2VzIG1fY29tcGFyYXRvci4gVGhlIG9yZGVyIG9mIGRlc3RydWN0aW9uIGlzIGltcG9y
dGFudC4KLSAgICBtX2RiLmNsZWFyKCk7Ci0gICAgbV9jb21wYXJhdG9yLmNsZWFyKCk7Ci19Ci0K
LWVudW0gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5SZXN1bHQgewotICAgIElEQkxldmVsREJC
YWNraW5nU3RvcmVPcGVuTWVtb3J5LAotICAgIElEQkxldmVsREJCYWNraW5nU3RvcmVPcGVuU3Vj
Y2VzcywKLSAgICBJREJMZXZlbERCQmFja2luZ1N0b3JlT3BlbkZhaWxlZERpcmVjdG9yeSwKLSAg
ICBJREJMZXZlbERCQmFja2luZ1N0b3JlT3BlbkZhaWxlZFVua25vd25TY2hlbWEsCi0gICAgSURC
TGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5DbGVhbnVwRGVzdHJveUZhaWxlZCwKLSAgICBJREJMZXZl
bERCQmFja2luZ1N0b3JlT3BlbkNsZWFudXBSZW9wZW5GYWlsZWQsCi0gICAgSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZU9wZW5DbGVhbnVwUmVvcGVuU3VjY2VzcywKLSAgICBJREJMZXZlbERCQmFja2lu
Z1N0b3JlT3Blbk1heCwKLX07Ci0KLVBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlPiBJREJMZXZl
bERCQmFja2luZ1N0b3JlOjpvcGVuKFNlY3VyaXR5T3JpZ2luKiBzZWN1cml0eU9yaWdpbiwgY29u
c3QgU3RyaW5nJiBwYXRoQmFzZUFyZywgY29uc3QgU3RyaW5nJiBmaWxlSWRlbnRpZmllciwgSURC
RmFjdG9yeUJhY2tlbmRJbXBsKiBmYWN0b3J5KQotewotICAgIElEQl9UUkFDRSgiSURCTGV2ZWxE
QkJhY2tpbmdTdG9yZTo6b3BlbiIpOwotICAgIFN0cmluZyBwYXRoQmFzZSA9IHBhdGhCYXNlQXJn
OwotCi0gICAgT3duUHRyPExldmVsREJDb21wYXJhdG9yPiBjb21wYXJhdG9yID0gYWRvcHRQdHIo
bmV3IENvbXBhcmF0b3IoKSk7Ci0gICAgT3duUHRyPExldmVsREJEYXRhYmFzZT4gZGI7Ci0KLSAg
ICBpZiAocGF0aEJhc2UuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEhpc3RvZ3JhbVN1cHBvcnQ6Omhp
c3RvZ3JhbUVudW1lcmF0aW9uKCJXZWJDb3JlLkluZGV4ZWREQi5CYWNraW5nU3RvcmUuT3BlblN0
YXR1cyIsIElEQkxldmVsREJCYWNraW5nU3RvcmVPcGVuTWVtb3J5LCBJREJMZXZlbERCQmFja2lu
Z1N0b3JlT3Blbk1heCk7Ci0gICAgICAgIGRiID0gTGV2ZWxEQkRhdGFiYXNlOjpvcGVuSW5NZW1v
cnkoY29tcGFyYXRvci5nZXQoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCFtYWtlQWxs
RGlyZWN0b3JpZXMocGF0aEJhc2UpKSB7Ci0gICAgICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0
byBjcmVhdGUgSW5kZXhlZERCIGRhdGFiYXNlIHBhdGggJXMiLCBwYXRoQmFzZS51dGY4KCkuZGF0
YSgpKTsKLSAgICAgICAgICAgIEhpc3RvZ3JhbVN1cHBvcnQ6Omhpc3RvZ3JhbUVudW1lcmF0aW9u
KCJXZWJDb3JlLkluZGV4ZWREQi5CYWNraW5nU3RvcmUuT3BlblN0YXR1cyIsIElEQkxldmVsREJC
YWNraW5nU3RvcmVPcGVuRmFpbGVkRGlyZWN0b3J5LCBJREJMZXZlbERCQmFja2luZ1N0b3JlT3Bl
bk1heCk7Ci0gICAgICAgICAgICByZXR1cm4gUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU+KCk7
Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgcGF0aCA9IHBhdGhCeUFwcGVuZGluZ0NvbXBv
bmVudChwYXRoQmFzZSwgc2VjdXJpdHlPcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpICsgIi5p
bmRleGVkZGIubGV2ZWxkYiIpOwotCi0gICAgICAgIGRiID0gTGV2ZWxEQkRhdGFiYXNlOjpvcGVu
KHBhdGgsIGNvbXBhcmF0b3IuZ2V0KCkpOwotICAgICAgICBpZiAoZGIgJiYgIWlzU2NoZW1hS25v
d24oZGIuZ2V0KCkpKSB7Ci0gICAgICAgICAgICBMT0dfRVJST1IoIkluZGV4ZWREQiBiYWNraW5n
IHN0b3JlIGhhZCB1bmtub3duIHNjaGVtYSwgdHJlYXRpbmcgaXQgYXMgZmFpbHVyZSB0byBvcGVu
Iik7Ci0gICAgICAgICAgICBIaXN0b2dyYW1TdXBwb3J0OjpoaXN0b2dyYW1FbnVtZXJhdGlvbigi
V2ViQ29yZS5JbmRleGVkREIuQmFja2luZ1N0b3JlLk9wZW5TdGF0dXMiLCBJREJMZXZlbERCQmFj
a2luZ1N0b3JlT3BlbkZhaWxlZFVua25vd25TY2hlbWEsIElEQkxldmVsREJCYWNraW5nU3RvcmVP
cGVuTWF4KTsKLSAgICAgICAgICAgIGRiLnJlbGVhc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAg
IGlmIChkYikKLSAgICAgICAgICAgIEhpc3RvZ3JhbVN1cHBvcnQ6Omhpc3RvZ3JhbUVudW1lcmF0
aW9uKCJXZWJDb3JlLkluZGV4ZWREQi5CYWNraW5nU3RvcmUuT3BlblN0YXR1cyIsIElEQkxldmVs
REJCYWNraW5nU3RvcmVPcGVuU3VjY2VzcywgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5NYXgp
OwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIExPR19FUlJPUigiSW5kZXhlZERCIGJhY2tp
bmcgc3RvcmUgb3BlbiBmYWlsZWQsIGF0dGVtcHRpbmcgY2xlYW51cCIpOwotICAgICAgICAgICAg
Ym9vbCBzdWNjZXNzID0gTGV2ZWxEQkRhdGFiYXNlOjpkZXN0cm95KHBhdGgpOwotICAgICAgICAg
ICAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJJbmRleGVkREIg
YmFja2luZyBzdG9yZSBjbGVhbnVwIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgIEhpc3RvZ3Jh
bVN1cHBvcnQ6Omhpc3RvZ3JhbUVudW1lcmF0aW9uKCJXZWJDb3JlLkluZGV4ZWREQi5CYWNraW5n
U3RvcmUuT3BlblN0YXR1cyIsIElEQkxldmVsREJCYWNraW5nU3RvcmVPcGVuQ2xlYW51cERlc3Ry
b3lGYWlsZWQsIElEQkxldmVsREJCYWNraW5nU3RvcmVPcGVuTWF4KTsKLSAgICAgICAgICAgICAg
ICByZXR1cm4gUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU+KCk7Ci0gICAgICAgICAgICB9Ci0K
LSAgICAgICAgICAgIExPR19FUlJPUigiSW5kZXhlZERCIGJhY2tpbmcgc3RvcmUgY2xlYW51cCBz
dWNjZWVkZWQsIHJlb3BlbmluZyIpOwotICAgICAgICAgICAgZGIgPSBMZXZlbERCRGF0YWJhc2U6
Om9wZW4ocGF0aCwgY29tcGFyYXRvci5nZXQoKSk7Ci0gICAgICAgICAgICBpZiAoIWRiKSB7Ci0g
ICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJJbmRleGVkREIgYmFja2luZyBzdG9yZSByZW9wZW4g
YWZ0ZXIgcmVjb3ZlcnkgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgSGlzdG9ncmFtU3VwcG9y
dDo6aGlzdG9ncmFtRW51bWVyYXRpb24oIldlYkNvcmUuSW5kZXhlZERCLkJhY2tpbmdTdG9yZS5P
cGVuU3RhdHVzIiwgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5DbGVhbnVwUmVvcGVuRmFpbGVk
LCBJREJMZXZlbERCQmFja2luZ1N0b3JlT3Blbk1heCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJu
IFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlPigpOwotICAgICAgICAgICAgfQotICAgICAgICAg
ICAgSGlzdG9ncmFtU3VwcG9ydDo6aGlzdG9ncmFtRW51bWVyYXRpb24oIldlYkNvcmUuSW5kZXhl
ZERCLkJhY2tpbmdTdG9yZS5PcGVuU3RhdHVzIiwgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5D
bGVhbnVwUmVvcGVuU3VjY2VzcywgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5NYXgpOwotICAg
ICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFkYikKLSAgICAgICAgcmV0dXJuIFBhc3NSZWZQdHI8
SURCQmFja2luZ1N0b3JlPigpOwotCi0gICAgLy8gRklYTUU6IEhhbmRsZSBjb21wYXJhdG9yIG5h
bWUgY2hhbmdlcy4KLQotICAgIFJlZlB0cjxJREJMZXZlbERCQmFja2luZ1N0b3JlPiBiYWNraW5n
U3RvcmUoYWRvcHRSZWYobmV3IElEQkxldmVsREJCYWNraW5nU3RvcmUoZmlsZUlkZW50aWZpZXIs
IGZhY3RvcnksIGRiLnJlbGVhc2UoKSkpKTsKLSAgICBiYWNraW5nU3RvcmUtPm1fY29tcGFyYXRv
ciA9IGNvbXBhcmF0b3IucmVsZWFzZSgpOwotCi0gICAgaWYgKCFzZXRVcE1ldGFkYXRhKGJhY2tp
bmdTdG9yZS0+bV9kYi5nZXQoKSwgZmlsZUlkZW50aWZpZXIpKQotICAgICAgICByZXR1cm4gUGFz
c1JlZlB0cjxJREJCYWNraW5nU3RvcmU+KCk7Ci0KLSAgICByZXR1cm4gYmFja2luZ1N0b3JlLnJl
bGVhc2UoKTsKLX0KLQotVmVjdG9yPFN0cmluZz4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0
RGF0YWJhc2VOYW1lcygpCi17Ci0gICAgVmVjdG9yPFN0cmluZz4gZm91bmROYW1lczsKLSAgICBj
b25zdCBWZWN0b3I8Y2hhcj4gc3RhcnRLZXkgPSBEYXRhYmFzZU5hbWVLZXk6OmVuY29kZU1pbktl
eUZvck9yaWdpbihtX2lkZW50aWZpZXIpOwotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBzdG9wS2V5
ID0gRGF0YWJhc2VOYW1lS2V5OjplbmNvZGVTdG9wS2V5Rm9yT3JpZ2luKG1faWRlbnRpZmllcik7
Ci0KLSAgICBBU1NFUlQoZm91bmROYW1lcy5pc0VtcHR5KCkpOwotCi0gICAgT3duUHRyPExldmVs
REJJdGVyYXRvcj4gaXQgPSBtX2RiLT5jcmVhdGVJdGVyYXRvcigpOwotICAgIGZvciAoaXQtPnNl
ZWsoc3RhcnRLZXkpOyBpdC0+aXNWYWxpZCgpICYmIGNvbXBhcmVLZXlzKGl0LT5rZXkoKSwgc3Rv
cEtleSkgPCAwOyBpdC0+bmV4dCgpKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIqIHAgPSBpdC0+a2V5
KCkuYmVnaW4oKTsKLSAgICAgICAgY29uc3QgY2hhciogbGltaXQgPSBpdC0+a2V5KCkuZW5kKCk7
Ci0KLSAgICAgICAgRGF0YWJhc2VOYW1lS2V5IGRhdGFiYXNlTmFtZUtleTsKLSAgICAgICAgcCA9
IERhdGFiYXNlTmFtZUtleTo6ZGVjb2RlKHAsIGxpbWl0LCAmZGF0YWJhc2VOYW1lS2V5KTsKLSAg
ICAgICAgQVNTRVJUKHApOwotCi0gICAgICAgIGZvdW5kTmFtZXMuYXBwZW5kKGRhdGFiYXNlTmFt
ZUtleS5kYXRhYmFzZU5hbWUoKSk7Ci0gICAgfQotICAgIHJldHVybiBmb3VuZE5hbWVzOwotfQot
Ci1ib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldElEQkRhdGFiYXNlTWV0YURhdGEoY29u
c3QgU3RyaW5nJiBuYW1lLCBJREJEYXRhYmFzZU1ldGFkYXRhKiBtZXRhZGF0YSkKLXsKLSAgICBj
b25zdCBWZWN0b3I8Y2hhcj4ga2V5ID0gRGF0YWJhc2VOYW1lS2V5OjplbmNvZGUobV9pZGVudGlm
aWVyLCBuYW1lKTsKLQotICAgIGJvb2wgb2sgPSBnZXRJbnQobV9kYi5nZXQoKSwga2V5LCBtZXRh
ZGF0YS0+aWQpOwotICAgIGlmICghb2spCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIG9r
ID0gZ2V0U3RyaW5nKG1fZGIuZ2V0KCksIERhdGFiYXNlTWV0YURhdGFLZXk6OmVuY29kZShtZXRh
ZGF0YS0+aWQsIERhdGFiYXNlTWV0YURhdGFLZXk6OlVzZXJWZXJzaW9uKSwgbWV0YWRhdGEtPnZl
cnNpb24pOwotICAgIGlmICghb2spIHsKLSAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERC
QmFja2luZ1N0b3JlUmVhZEVycm9yKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQot
ICAgIG9rID0gZ2V0VmFySW50KG1fZGIuZ2V0KCksIERhdGFiYXNlTWV0YURhdGFLZXk6OmVuY29k
ZShtZXRhZGF0YS0+aWQsIERhdGFiYXNlTWV0YURhdGFLZXk6OlVzZXJJbnRWZXJzaW9uKSwgbWV0
YWRhdGEtPmludFZlcnNpb24pOwotICAgIGlmICghb2spIHsKLSAgICAgICAgSW50ZXJuYWxFcnJv
cihJREJMZXZlbERCQmFja2luZ1N0b3JlUmVhZEVycm9yKTsKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgIH0KLSAgICBpZiAobWV0YWRhdGEtPmludFZlcnNpb24gPT0gSURCRGF0YWJhc2VNZXRh
ZGF0YTo6RGVmYXVsdEludFZlcnNpb24pCi0gICAgICAgIG1ldGFkYXRhLT5pbnRWZXJzaW9uID0g
SURCRGF0YWJhc2VNZXRhZGF0YTo6Tm9JbnRWZXJzaW9uOwotCi0gICAgbWV0YWRhdGEtPm1heE9i
amVjdFN0b3JlSWQgPSBnZXRNYXhPYmplY3RTdG9yZUlkKG1fZGIuZ2V0KCksIG1ldGFkYXRhLT5p
ZCk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGludDY0X3QgZ2V0TmV3RGF0YWJh
c2VJZChMZXZlbERCRGF0YWJhc2UqIGRiKQotewotICAgIGludDY0X3QgbWF4RGF0YWJhc2VJZCA9
IC0xOwotICAgIGlmICghZ2V0SW50KGRiLCBNYXhEYXRhYmFzZUlkS2V5OjplbmNvZGUoKSwgbWF4
RGF0YWJhc2VJZCkpCi0gICAgICAgIG1heERhdGFiYXNlSWQgPSAwOwotCi0gICAgQVNTRVJUKG1h
eERhdGFiYXNlSWQgPj0gMCk7Ci0KLSAgICBpbnQ2NF90IGRhdGFiYXNlSWQgPSBtYXhEYXRhYmFz
ZUlkICsgMTsKLSAgICBpZiAoIXB1dEludChkYiwgTWF4RGF0YWJhc2VJZEtleTo6ZW5jb2RlKCks
IGRhdGFiYXNlSWQpKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICByZXR1cm4gZGF0YWJhc2VJ
ZDsKLX0KLQotYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpjcmVhdGVJREJEYXRhYmFzZU1l
dGFEYXRhKGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiB2ZXJzaW9uLCBpbnQ2NF90
IGludFZlcnNpb24sIGludDY0X3QmIHJvd0lkKQotewotICAgIHJvd0lkID0gZ2V0TmV3RGF0YWJh
c2VJZChtX2RiLmdldCgpKTsKLSAgICBpZiAocm93SWQgPCAwKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICBjb25zdCBWZWN0b3I8Y2hhcj4ga2V5ID0gRGF0YWJhc2VOYW1lS2V5OjplbmNv
ZGUobV9pZGVudGlmaWVyLCBuYW1lKTsKLSAgICBpZiAoIXB1dEludChtX2RiLmdldCgpLCBrZXks
IHJvd0lkKSkgewotICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVX
cml0ZUVycm9yKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoIXB1dFN0
cmluZyhtX2RiLmdldCgpLCBEYXRhYmFzZU1ldGFEYXRhS2V5OjplbmNvZGUocm93SWQsIERhdGFi
YXNlTWV0YURhdGFLZXk6OlVzZXJWZXJzaW9uKSwgdmVyc2lvbikpIHsKLSAgICAgICAgSW50ZXJu
YWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlV3JpdGVFcnJvcik7Ci0gICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKGludFZlcnNpb24gPT0gSURCRGF0YWJhc2VNZXRhZGF0
YTo6Tm9JbnRWZXJzaW9uKQotICAgICAgICBpbnRWZXJzaW9uID0gSURCRGF0YWJhc2VNZXRhZGF0
YTo6RGVmYXVsdEludFZlcnNpb247Ci0gICAgaWYgKCFwdXRWYXJJbnQobV9kYi5nZXQoKSwgRGF0
YWJhc2VNZXRhRGF0YUtleTo6ZW5jb2RlKHJvd0lkLCBEYXRhYmFzZU1ldGFEYXRhS2V5OjpVc2Vy
SW50VmVyc2lvbiksIGludFZlcnNpb24pKSB7Ci0gICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2
ZWxEQkJhY2tpbmdTdG9yZVdyaXRlRXJyb3IpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
fQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OnVw
ZGF0ZUlEQkRhdGFiYXNlSW50VmVyc2lvbihJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uKiB0
cmFuc2FjdGlvbiwgaW50NjRfdCByb3dJZCwgaW50NjRfdCBpbnRWZXJzaW9uKQotewotICAgIGlm
IChpbnRWZXJzaW9uID09IElEQkRhdGFiYXNlTWV0YWRhdGE6Ok5vSW50VmVyc2lvbikKLSAgICAg
ICAgaW50VmVyc2lvbiA9IElEQkRhdGFiYXNlTWV0YWRhdGE6OkRlZmF1bHRJbnRWZXJzaW9uOwot
ICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoaW50VmVyc2lvbiA+PSAwLCAiaW50VmVyc2lvbiB3YXMg
JWxsZCIsIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4oaW50VmVyc2lvbikpOwotICAgIGlmICghcHV0
VmFySW50KFRyYW5zYWN0aW9uOjpsZXZlbERCVHJhbnNhY3Rpb25Gcm9tKHRyYW5zYWN0aW9uKSwg
RGF0YWJhc2VNZXRhRGF0YUtleTo6ZW5jb2RlKHJvd0lkLCBEYXRhYmFzZU1ldGFEYXRhS2V5OjpV
c2VySW50VmVyc2lvbiksIGludFZlcnNpb24pKSB7Ci0gICAgICAgIEludGVybmFsRXJyb3IoSURC
TGV2ZWxEQkJhY2tpbmdTdG9yZVdyaXRlRXJyb3IpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6
OnVwZGF0ZUlEQkRhdGFiYXNlTWV0YURhdGEoSURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbiog
dHJhbnNhY3Rpb24sIGludDY0X3Qgcm93SWQsIGNvbnN0IFN0cmluZyYgdmVyc2lvbikKLXsKLSAg
ICBpZiAoIXB1dFN0cmluZyhUcmFuc2FjdGlvbjo6bGV2ZWxEQlRyYW5zYWN0aW9uRnJvbSh0cmFu
c2FjdGlvbiksIERhdGFiYXNlTWV0YURhdGFLZXk6OmVuY29kZShyb3dJZCwgRGF0YWJhc2VNZXRh
RGF0YUtleTo6VXNlclZlcnNpb24pLCB2ZXJzaW9uKSkgewotICAgICAgICBJbnRlcm5hbEVycm9y
KElEQkxldmVsREJCYWNraW5nU3RvcmVXcml0ZUVycm9yKTsKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCBkZWxldGVSYW5n
ZShMZXZlbERCVHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBjb25zdCBWZWN0b3I8Y2hhcj4mIGJl
Z2luLCBjb25zdCBWZWN0b3I8Y2hhcj4mIGVuZCkKLXsKLSAgICBPd25QdHI8TGV2ZWxEQkl0ZXJh
dG9yPiBpdCA9IHRyYW5zYWN0aW9uLT5jcmVhdGVJdGVyYXRvcigpOwotICAgIGZvciAoaXQtPnNl
ZWsoYmVnaW4pOyBpdC0+aXNWYWxpZCgpICYmIGNvbXBhcmVLZXlzKGl0LT5rZXkoKSwgZW5kKSA8
IDA7IGl0LT5uZXh0KCkpIHsKLSAgICAgICAgaWYgKCF0cmFuc2FjdGlvbi0+cmVtb3ZlKGl0LT5r
ZXkoKSkpIHsKLSAgICAgICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9y
ZVdyaXRlRXJyb3IpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAg
fQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLQotYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3Jl
OjpkZWxldGVEYXRhYmFzZShjb25zdCBTdHJpbmcmIG5hbWUpCi17Ci0gICAgSURCX1RSQUNFKCJJ
REJMZXZlbERCQmFja2luZ1N0b3JlOjpkZWxldGVEYXRhYmFzZSIpOwotICAgIE93blB0cjxMZXZl
bERCV3JpdGVPbmx5VHJhbnNhY3Rpb24+IHRyYW5zYWN0aW9uID0gTGV2ZWxEQldyaXRlT25seVRy
YW5zYWN0aW9uOjpjcmVhdGUobV9kYi5nZXQoKSk7Ci0KLSAgICBJREJEYXRhYmFzZU1ldGFkYXRh
IG1ldGFkYXRhOwotICAgIGlmICghZ2V0SURCRGF0YWJhc2VNZXRhRGF0YShuYW1lLCAmbWV0YWRh
dGEpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBzdGFy
dEtleSA9IERhdGFiYXNlTWV0YURhdGFLZXk6OmVuY29kZShtZXRhZGF0YS5pZCwgRGF0YWJhc2VN
ZXRhRGF0YUtleTo6T3JpZ2luTmFtZSk7Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IHN0b3BLZXkg
PSBEYXRhYmFzZU1ldGFEYXRhS2V5OjplbmNvZGUobWV0YWRhdGEuaWQgKyAxLCBEYXRhYmFzZU1l
dGFEYXRhS2V5OjpPcmlnaW5OYW1lKTsKLSAgICBPd25QdHI8TGV2ZWxEQkl0ZXJhdG9yPiBpdCA9
IG1fZGItPmNyZWF0ZUl0ZXJhdG9yKCk7Ci0gICAgZm9yIChpdC0+c2VlayhzdGFydEtleSk7IGl0
LT5pc1ZhbGlkKCkgJiYgY29tcGFyZUtleXMoaXQtPmtleSgpLCBzdG9wS2V5KSA8IDA7IGl0LT5u
ZXh0KCkpCi0gICAgICAgIHRyYW5zYWN0aW9uLT5yZW1vdmUoaXQtPmtleSgpKTsKLQotICAgIGNv
bnN0IFZlY3RvcjxjaGFyPiBrZXkgPSBEYXRhYmFzZU5hbWVLZXk6OmVuY29kZShtX2lkZW50aWZp
ZXIsIG5hbWUpOwotICAgIHRyYW5zYWN0aW9uLT5yZW1vdmUoa2V5KTsKLQotICAgIHJldHVybiB0
cmFuc2FjdGlvbi0+Y29tbWl0KCk7Ci19Ci0KLXN0YXRpYyBib29sIGNoZWNrT2JqZWN0U3RvcmVB
bmRNZXRhRGF0YVR5cGUoY29uc3QgTGV2ZWxEQkl0ZXJhdG9yKiBpdCwgY29uc3QgVmVjdG9yPGNo
YXI+JiBzdG9wS2V5LCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgbWV0YURhdGFUeXBl
KQotewotICAgIGlmICghaXQtPmlzVmFsaWQoKSB8fCBjb21wYXJlS2V5cyhpdC0+a2V5KCksIHN0
b3BLZXkpID49IDApCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIE9iamVjdFN0b3JlTWV0
YURhdGFLZXkgbWV0YURhdGFLZXk7Ci0gICAgY29uc3QgY2hhciogcCA9IE9iamVjdFN0b3JlTWV0
YURhdGFLZXk6OmRlY29kZShpdC0+a2V5KCkuYmVnaW4oKSwgaXQtPmtleSgpLmVuZCgpLCAmbWV0
YURhdGFLZXkpOwotICAgIEFTU0VSVF9VTlVTRUQocCwgcCk7Ci0gICAgaWYgKG1ldGFEYXRhS2V5
Lm9iamVjdFN0b3JlSWQoKSAhPSBvYmplY3RTdG9yZUlkKQotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgaWYgKG1ldGFEYXRhS2V5Lm1ldGFEYXRhVHlwZSgpICE9IG1ldGFEYXRhVHlwZSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiB0cnVlOwotfQotCi1WZWN0b3I8SURCT2Jq
ZWN0U3RvcmVNZXRhZGF0YT4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3RvcmVz
KGludDY0X3QgZGF0YWJhc2VJZCkKLXsKLSAgICBJREJfVFJBQ0UoIklEQkxldmVsREJCYWNraW5n
U3RvcmU6OmdldE9iamVjdFN0b3JlcyIpOwotICAgIFZlY3RvcjxJREJPYmplY3RTdG9yZU1ldGFk
YXRhPiBvYmplY3RTdG9yZXM7Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IHN0YXJ0S2V5ID0gT2Jq
ZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIDEsIDApOwotICAgIGNvbnN0
IFZlY3RvcjxjaGFyPiBzdG9wS2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlTWF4
S2V5KGRhdGFiYXNlSWQpOwotCi0gICAgT3duUHRyPExldmVsREJJdGVyYXRvcj4gaXQgPSBtX2Ri
LT5jcmVhdGVJdGVyYXRvcigpOwotICAgIGl0LT5zZWVrKHN0YXJ0S2V5KTsKLSAgICB3aGlsZSAo
aXQtPmlzVmFsaWQoKSAmJiBjb21wYXJlS2V5cyhpdC0+a2V5KCksIHN0b3BLZXkpIDwgMCkgewot
ICAgICAgICBjb25zdCBjaGFyKiBwID0gaXQtPmtleSgpLmJlZ2luKCk7Ci0gICAgICAgIGNvbnN0
IGNoYXIqIGxpbWl0ID0gaXQtPmtleSgpLmVuZCgpOwotCi0gICAgICAgIE9iamVjdFN0b3JlTWV0
YURhdGFLZXkgbWV0YURhdGFLZXk7Ci0gICAgICAgIHAgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5
OjpkZWNvZGUocCwgbGltaXQsICZtZXRhRGF0YUtleSk7Ci0gICAgICAgIEFTU0VSVChwKTsKLSAg
ICAgICAgaWYgKG1ldGFEYXRhS2V5Lm1ldGFEYXRhVHlwZSgpICE9IE9iamVjdFN0b3JlTWV0YURh
dGFLZXk6Ok5hbWUpIHsKLSAgICAgICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tp
bmdTdG9yZVJlYWRFcnJvcik7Ci0gICAgICAgICAgICAvLyBQb3NzaWJsZSBzdGFsZSBtZXRhZGF0
YSwgYnV0IGRvbid0IGZhaWwgdGhlIGxvYWQuCi0gICAgICAgICAgICBpdC0+bmV4dCgpOwotICAg
ICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQ2NF90IG9iamVjdFN0
b3JlSWQgPSBtZXRhRGF0YUtleS5vYmplY3RTdG9yZUlkKCk7Ci0KLSAgICAgICAgLy8gRklYTUU6
IERvIHRoaXMgYnkgZGlyZWN0IGtleSBsb29rdXAgcmF0aGVyIHRoYW4gaXRlcmF0aW9uLCB0byBz
aW1wbGlmeS4KLSAgICAgICAgU3RyaW5nIG9iamVjdFN0b3JlTmFtZSA9IGRlY29kZVN0cmluZyhp
dC0+dmFsdWUoKS5iZWdpbigpLCBpdC0+dmFsdWUoKS5lbmQoKSk7Ci0KLSAgICAgICAgaXQtPm5l
eHQoKTsKLSAgICAgICAgaWYgKCFjaGVja09iamVjdFN0b3JlQW5kTWV0YURhdGFUeXBlKGl0Lmdl
dCgpLCBzdG9wS2V5LCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpLZXlQ
YXRoKSkgewotICAgICAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3Jl
UmVhZEVycm9yKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIElEQktl
eVBhdGgga2V5UGF0aCA9IGRlY29kZUlEQktleVBhdGgoaXQtPnZhbHVlKCkuYmVnaW4oKSwgaXQt
PnZhbHVlKCkuZW5kKCkpOwotCi0gICAgICAgIGl0LT5uZXh0KCk7Ci0gICAgICAgIGlmICghY2hl
Y2tPYmplY3RTdG9yZUFuZE1ldGFEYXRhVHlwZShpdC5nZXQoKSwgc3RvcEtleSwgb2JqZWN0U3Rv
cmVJZCwgT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6QXV0b0luY3JlbWVudCkpIHsKLSAgICAgICAg
ICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVJlYWRFcnJvcik7Ci0gICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBib29sIGF1dG9JbmNyZW1lbnQgPSBk
ZWNvZGVCb29sKGl0LT52YWx1ZSgpLmJlZ2luKCksIGl0LT52YWx1ZSgpLmVuZCgpKTsKLQotICAg
ICAgICBpdC0+bmV4dCgpOyAvLyBJcyBldmljYXRibGUuCi0gICAgICAgIGlmICghY2hlY2tPYmpl
Y3RTdG9yZUFuZE1ldGFEYXRhVHlwZShpdC5nZXQoKSwgc3RvcEtleSwgb2JqZWN0U3RvcmVJZCwg
T2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6RXZpY3RhYmxlKSkgewotICAgICAgICAgICAgSW50ZXJu
YWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlUmVhZEVycm9yKTsKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaXQtPm5leHQoKTsgLy8gTGFzdCB2ZXJzaW9uLgot
ICAgICAgICBpZiAoIWNoZWNrT2JqZWN0U3RvcmVBbmRNZXRhRGF0YVR5cGUoaXQuZ2V0KCksIHN0
b3BLZXksIG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6Okxhc3RWZXJzaW9u
KSkgewotICAgICAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlUmVh
ZEVycm9yKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaXQtPm5l
eHQoKTsgLy8gTWF4aW11bSBpbmRleCBpZCBhbGxvY2F0ZWQuCi0gICAgICAgIGlmICghY2hlY2tP
YmplY3RTdG9yZUFuZE1ldGFEYXRhVHlwZShpdC5nZXQoKSwgc3RvcEtleSwgb2JqZWN0U3RvcmVJ
ZCwgT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6TWF4SW5kZXhJZCkpIHsKLSAgICAgICAgICAgIElu
dGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVJlYWRFcnJvcik7Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpbnQ2NF90IG1heEluZGV4SWQgPSBkZWNvZGVJ
bnQoaXQtPnZhbHVlKCkuYmVnaW4oKSwgaXQtPnZhbHVlKCkuZW5kKCkpOwotCi0gICAgICAgIGl0
LT5uZXh0KCk7IC8vIFtvcHRpb25hbF0gaGFzIGtleSBwYXRoIChpcyBub3QgbnVsbCkKLSAgICAg
ICAgaWYgKGNoZWNrT2JqZWN0U3RvcmVBbmRNZXRhRGF0YVR5cGUoaXQuZ2V0KCksIHN0b3BLZXks
IG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6Okhhc0tleVBhdGgpKSB7Ci0g
ICAgICAgICAgICBib29sIGhhc0tleVBhdGggPSBkZWNvZGVCb29sKGl0LT52YWx1ZSgpLmJlZ2lu
KCksIGl0LT52YWx1ZSgpLmVuZCgpKTsKLSAgICAgICAgICAgIC8vIFRoaXMgY2hlY2sgYWNjb3Vu
dHMgZm9yIHR3byBsYXllcnMgb2YgbGVnYWN5IGNvZGluZzoKLSAgICAgICAgICAgIC8vICgxKSBJ
bml0aWFsbHksIGhhc0tleVBhdGggd2FzIGFkZGVkIHRvIGRpc3Rpbmd1aXNoIG51bGwgdnMuIHN0
cmluZy4KLSAgICAgICAgICAgIC8vICgyKSBMYXRlciwgbnVsbCB2cy4gc3RyaW5nIHZzLiBhcnJh
eSB3YXMgc3RvcmVkIGluIHRoZSBrZXlQYXRoIGl0c2VsZi4KLSAgICAgICAgICAgIC8vIFNvIHRo
aXMgY2hlY2sgaXMgb25seSByZWxldmFudCBmb3Igc3RyaW5nLXR5cGUga2V5UGF0aHMuCi0gICAg
ICAgICAgICBpZiAoIWhhc0tleVBhdGggJiYgKGtleVBhdGgudHlwZSgpID09IElEQktleVBhdGg6
OlN0cmluZ1R5cGUgJiYgIWtleVBhdGguc3RyaW5nKCkuaXNFbXB0eSgpKSkgewotICAgICAgICAg
ICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVJlYWRFcnJvcik7Ci0g
ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWhh
c0tleVBhdGgpCi0gICAgICAgICAgICAgICAga2V5UGF0aCA9IElEQktleVBhdGgoKTsKLSAgICAg
ICAgICAgIGl0LT5uZXh0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQ2NF90IGtleUdlbmVy
YXRvckN1cnJlbnROdW1iZXIgPSAtMTsKLSAgICAgICAgaWYgKGNoZWNrT2JqZWN0U3RvcmVBbmRN
ZXRhRGF0YVR5cGUoaXQuZ2V0KCksIHN0b3BLZXksIG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3Jl
TWV0YURhdGFLZXk6OktleUdlbmVyYXRvckN1cnJlbnROdW1iZXIpKSB7Ci0gICAgICAgICAgICBr
ZXlHZW5lcmF0b3JDdXJyZW50TnVtYmVyID0gZGVjb2RlSW50KGl0LT52YWx1ZSgpLmJlZ2luKCks
IGl0LT52YWx1ZSgpLmVuZCgpKTsKLSAgICAgICAgICAgIC8vIEZJWE1FOiBSZXR1cm4ga2V5R2Vu
ZXJhdG9yQ3VycmVudE51bWJlciwgY2FjaGUgaW4gb2JqZWN0IHN0b3JlLCBhbmQgd3JpdGUgbGF6
aWx5IHRvIGJhY2tpbmcgc3RvcmUuCi0gICAgICAgICAgICAvLyBGb3Igbm93LCBqdXN0IGFzc2Vy
dCB0aGF0IGlmIGl0IHdhcyB3cml0dGVuIGl0IHdhcyB2YWxpZC4KLSAgICAgICAgICAgIEFTU0VS
VF9VTlVTRUQoa2V5R2VuZXJhdG9yQ3VycmVudE51bWJlciwga2V5R2VuZXJhdG9yQ3VycmVudE51
bWJlciA+PSBLZXlHZW5lcmF0b3JJbml0aWFsTnVtYmVyKTsKLSAgICAgICAgICAgIGl0LT5uZXh0
KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBvYmplY3RTdG9yZXMuYXBwZW5kKElEQk9iamVjdFN0
b3JlTWV0YWRhdGEob2JqZWN0U3RvcmVOYW1lLCBvYmplY3RTdG9yZUlkLCBrZXlQYXRoLCBhdXRv
SW5jcmVtZW50LCBtYXhJbmRleElkKSk7Ci0gICAgfQotICAgIHJldHVybiBvYmplY3RTdG9yZXM7
Ci19Ci0KLXN0YXRpYyBib29sIHNldE1heE9iamVjdFN0b3JlSWQoTGV2ZWxEQlRyYW5zYWN0aW9u
KiB0cmFuc2FjdGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQp
Ci17Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IG1heE9iamVjdFN0b3JlSWRLZXkgPSBEYXRhYmFz
ZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgRGF0YWJhc2VNZXRhRGF0YUtleTo6TWF4
T2JqZWN0U3RvcmVJZCk7Ci0gICAgaW50NjRfdCBtYXhPYmplY3RTdG9yZUlkID0gZ2V0TWF4T2Jq
ZWN0U3RvcmVJZCh0cmFuc2FjdGlvbiwgbWF4T2JqZWN0U3RvcmVJZEtleSk7Ci0KLSAgICBpZiAo
b2JqZWN0U3RvcmVJZCA8PSBtYXhPYmplY3RTdG9yZUlkKSB7Ci0gICAgICAgIEludGVybmFsRXJy
b3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZUNvbnNpc3RlbmN5RXJyb3IpOwotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmICghcHV0SW50KHRyYW5zYWN0aW9uLCBtYXhPYmplY3RT
dG9yZUlkS2V5LCBvYmplY3RTdG9yZUlkKSkgewotICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxl
dmVsREJCYWNraW5nU3RvcmVXcml0ZUVycm9yKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
IH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpj
cmVhdGVPYmplY3RTdG9yZShJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlv
biwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IFN0cmlu
ZyYgbmFtZSwgY29uc3QgSURCS2V5UGF0aCYga2V5UGF0aCwgYm9vbCBhdXRvSW5jcmVtZW50KQot
ewotICAgIElEQl9UUkFDRSgiSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Y3JlYXRlT2JqZWN0U3Rv
cmUiKTsKLSAgICBMZXZlbERCVHJhbnNhY3Rpb24qIGxldmVsREJUcmFuc2FjdGlvbiA9IFRyYW5z
YWN0aW9uOjpsZXZlbERCVHJhbnNhY3Rpb25Gcm9tKHRyYW5zYWN0aW9uKTsKLSAgICBpZiAoIXNl
dE1heE9iamVjdFN0b3JlSWQobGV2ZWxEQlRyYW5zYWN0aW9uLCBkYXRhYmFzZUlkLCBvYmplY3RT
dG9yZUlkKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgY29uc3QgVmVjdG9yPGNoYXI+
IG5hbWVLZXkgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2Jq
ZWN0U3RvcmVJZCwgT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6TmFtZSk7Ci0gICAgY29uc3QgVmVj
dG9yPGNoYXI+IGtleVBhdGhLZXkgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0
YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6S2V5UGF0aCk7
Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IGF1dG9JbmNyZW1lbnRLZXkgPSBPYmplY3RTdG9yZU1l
dGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgT2JqZWN0U3RvcmVN
ZXRhRGF0YUtleTo6QXV0b0luY3JlbWVudCk7Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IGV2aWN0
YWJsZUtleSA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmpl
Y3RTdG9yZUlkLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpFdmljdGFibGUpOwotICAgIGNvbnN0
IFZlY3RvcjxjaGFyPiBsYXN0VmVyc2lvbktleSA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVu
Y29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpM
YXN0VmVyc2lvbik7Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IG1heEluZGV4SWRLZXkgPSBPYmpl
Y3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgT2Jq
ZWN0U3RvcmVNZXRhRGF0YUtleTo6TWF4SW5kZXhJZCk7Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+
IGhhc0tleVBhdGhLZXkgID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNl
SWQsIG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6Okhhc0tleVBhdGgpOwot
ICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBrZXlHZW5lcmF0b3JDdXJyZW50TnVtYmVyS2V5ID0gT2Jq
ZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIE9i
amVjdFN0b3JlTWV0YURhdGFLZXk6OktleUdlbmVyYXRvckN1cnJlbnROdW1iZXIpOwotICAgIGNv
bnN0IFZlY3RvcjxjaGFyPiBuYW1lc0tleSA9IE9iamVjdFN0b3JlTmFtZXNLZXk6OmVuY29kZShk
YXRhYmFzZUlkLCBuYW1lKTsKLQotICAgIGJvb2wgb2sgPSBwdXRTdHJpbmcobGV2ZWxEQlRyYW5z
YWN0aW9uLCBuYW1lS2V5LCBuYW1lKTsKLSAgICBpZiAoIW9rKSB7Ci0gICAgICAgIEludGVybmFs
RXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVdyaXRlRXJyb3IpOwotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgfQotCi0gICAgb2sgPSBwdXRJREJLZXlQYXRoKGxldmVsREJUcmFuc2FjdGlv
biwga2V5UGF0aEtleSwga2V5UGF0aCk7Ci0gICAgaWYgKCFvaykgewotICAgICAgICBJbnRlcm5h
bEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVXcml0ZUVycm9yKTsKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgIH0KLQotICAgIG9rID0gcHV0SW50KGxldmVsREJUcmFuc2FjdGlvbiwgYXV0
b0luY3JlbWVudEtleSwgYXV0b0luY3JlbWVudCk7Ci0gICAgaWYgKCFvaykgewotICAgICAgICBJ
bnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVXcml0ZUVycm9yKTsKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIG9rID0gcHV0SW50KGxldmVsREJUcmFuc2FjdGlv
biwgZXZpY3RhYmxlS2V5LCBmYWxzZSk7Ci0gICAgaWYgKCFvaykgewotICAgICAgICBJbnRlcm5h
bEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVXcml0ZUVycm9yKTsKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgIH0KLQotICAgIG9rID0gcHV0SW50KGxldmVsREJUcmFuc2FjdGlvbiwgbGFz
dFZlcnNpb25LZXksIDEpOwotICAgIGlmICghb2spIHsKLSAgICAgICAgSW50ZXJuYWxFcnJvcihJ
REJMZXZlbERCQmFja2luZ1N0b3JlV3JpdGVFcnJvcik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICB9Ci0KLSAgICBvayA9IHB1dEludChsZXZlbERCVHJhbnNhY3Rpb24sIG1heEluZGV4SWRL
ZXksIE1pbmltdW1JbmRleElkKTsKLSAgICBpZiAoIW9rKSB7Ci0gICAgICAgIEludGVybmFsRXJy
b3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVdyaXRlRXJyb3IpOwotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgfQotCi0gICAgb2sgPSBwdXRCb29sKGxldmVsREJUcmFuc2FjdGlvbiwgaGFzS2V5
UGF0aEtleSwgIWtleVBhdGguaXNOdWxsKCkpOwotICAgIGlmICghb2spIHsKLSAgICAgICAgSW50
ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlV3JpdGVFcnJvcik7Ci0gICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBvayA9IHB1dEludChsZXZlbERCVHJhbnNhY3Rpb24s
IGtleUdlbmVyYXRvckN1cnJlbnROdW1iZXJLZXksIEtleUdlbmVyYXRvckluaXRpYWxOdW1iZXIp
OwotICAgIGlmICghb2spIHsKLSAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2lu
Z1N0b3JlV3JpdGVFcnJvcik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBv
ayA9IHB1dEludChsZXZlbERCVHJhbnNhY3Rpb24sIG5hbWVzS2V5LCBvYmplY3RTdG9yZUlkKTsK
LSAgICBpZiAoIW9rKSB7Ci0gICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdT
dG9yZVdyaXRlRXJyb3IpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0
dXJuIHRydWU7Ci19Ci0KLXZvaWQgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlT2JqZWN0
U3RvcmUoSURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGludDY0X3Qg
ZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKQotewotICAgIElEQl9UUkFDRSgiSURC
TGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlT2JqZWN0U3RvcmUiKTsKLSAgICBMZXZlbERCVHJh
bnNhY3Rpb24qIGxldmVsREJUcmFuc2FjdGlvbiA9IFRyYW5zYWN0aW9uOjpsZXZlbERCVHJhbnNh
Y3Rpb25Gcm9tKHRyYW5zYWN0aW9uKTsKLQotICAgIFN0cmluZyBvYmplY3RTdG9yZU5hbWU7Ci0g
ICAgZ2V0U3RyaW5nKGxldmVsREJUcmFuc2FjdGlvbiwgT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6
ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6
Ok5hbWUpLCBvYmplY3RTdG9yZU5hbWUpOwotCi0gICAgaWYgKCFkZWxldGVSYW5nZShsZXZlbERC
VHJhbnNhY3Rpb24sIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBv
YmplY3RTdG9yZUlkLCAwKSwgT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlTWF4S2V5KGRh
dGFiYXNlSWQsIG9iamVjdFN0b3JlSWQpKSkgewotICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxl
dmVsREJCYWNraW5nU3RvcmVXcml0ZUVycm9yKTsKLSAgICAgICAgcmV0dXJuOyAvLyBGSVhNRTog
UmVwb3J0IGVycm9yLgotICAgIH0KLQotICAgIGxldmVsREJUcmFuc2FjdGlvbi0+cmVtb3ZlKE9i
amVjdFN0b3JlTmFtZXNLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZU5hbWUpKTsK
LQotICAgIGlmICghZGVsZXRlUmFuZ2UobGV2ZWxEQlRyYW5zYWN0aW9uLCBJbmRleEZyZWVMaXN0
S2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMCksIEluZGV4RnJlZUxpc3RL
ZXk6OmVuY29kZU1heEtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkKSkpIHsKLSAgICAgICAg
SW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlV3JpdGVFcnJvcik7Ci0gICAgICAg
IHJldHVybjsgLy8gRklYTUU6IFJlcG9ydCBlcnJvci4KLSAgICB9Ci0gICAgaWYgKCFkZWxldGVS
YW5nZShsZXZlbERCVHJhbnNhY3Rpb24sIEluZGV4TWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFz
ZUlkLCBvYmplY3RTdG9yZUlkLCAwLCAwKSwgSW5kZXhNZXRhRGF0YUtleTo6ZW5jb2RlTWF4S2V5
KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQpKSkgewotICAgICAgICBJbnRlcm5hbEVycm9yKElE
QkxldmVsREJCYWNraW5nU3RvcmVXcml0ZUVycm9yKTsKLSAgICAgICAgcmV0dXJuOyAvLyBGSVhN
RTogUmVwb3J0IGVycm9yLgotICAgIH0KLQotICAgIGNsZWFyT2JqZWN0U3RvcmUodHJhbnNhY3Rp
b24sIGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQpOwotfQotCi1TdHJpbmcgSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3RvcmVSZWNvcmQoSURCQmFja2luZ1N0b3JlOjpUcmFuc2Fj
dGlvbiogdHJhbnNhY3Rpb24sIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9y
ZUlkLCBjb25zdCBJREJLZXkmIGtleSkKLXsKLSAgICBJREJfVFJBQ0UoIklEQkxldmVsREJCYWNr
aW5nU3RvcmU6OmdldE9iamVjdFN0b3JlUmVjb3JkIik7Ci0gICAgTGV2ZWxEQlRyYW5zYWN0aW9u
KiBsZXZlbERCVHJhbnNhY3Rpb24gPSBUcmFuc2FjdGlvbjo6bGV2ZWxEQlRyYW5zYWN0aW9uRnJv
bSh0cmFuc2FjdGlvbik7Ci0KLSAgICBjb25zdCBWZWN0b3I8Y2hhcj4gbGV2ZWxkYktleSA9IE9i
amVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGtleSk7
Ci0gICAgVmVjdG9yPGNoYXI+IGRhdGE7Ci0KLSAgICBpZiAoIWxldmVsREJUcmFuc2FjdGlvbi0+
Z2V0KGxldmVsZGJLZXksIGRhdGEpKQotICAgICAgICByZXR1cm4gU3RyaW5nKCk7Ci0KLSAgICBp
bnQ2NF90IHZlcnNpb247Ci0gICAgY29uc3QgY2hhciogcCA9IGRlY29kZVZhckludChkYXRhLmJl
Z2luKCksIGRhdGEuZW5kKCksIHZlcnNpb24pOwotICAgIGlmICghcCkgewotICAgICAgICBJbnRl
cm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVSZWFkRXJyb3IpOwotICAgICAgICByZXR1
cm4gU3RyaW5nKCk7Ci0gICAgfQotICAgICh2b2lkKSB2ZXJzaW9uOwotCi0gICAgcmV0dXJuIGRl
Y29kZVN0cmluZyhwLCBkYXRhLmVuZCgpKTsKLX0KLQotbmFtZXNwYWNlIHsKLWNsYXNzIExldmVs
REJSZWNvcmRJZGVudGlmaWVyIDogcHVibGljIElEQkJhY2tpbmdTdG9yZTo6T2JqZWN0U3RvcmVS
ZWNvcmRJZGVudGlmaWVyIHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgUGFzc1JlZlB0cjxMZXZlbERC
UmVjb3JkSWRlbnRpZmllcj4gY3JlYXRlKGNvbnN0IFZlY3RvcjxjaGFyPiYgcHJpbWFyeUtleSwg
aW50NjRfdCB2ZXJzaW9uKSB7IHJldHVybiBhZG9wdFJlZihuZXcgTGV2ZWxEQlJlY29yZElkZW50
aWZpZXIocHJpbWFyeUtleSwgdmVyc2lvbikpOyB9Ci0gICAgc3RhdGljIFBhc3NSZWZQdHI8TGV2
ZWxEQlJlY29yZElkZW50aWZpZXI+IGNyZWF0ZSgpIHsgcmV0dXJuIGFkb3B0UmVmKG5ldyBMZXZl
bERCUmVjb3JkSWRlbnRpZmllcigpKTsgfQotCi0gICAgdmlydHVhbCBib29sIGlzVmFsaWQoKSBj
b25zdCB7IHJldHVybiBtX3ByaW1hcnlLZXkuaXNFbXB0eSgpOyB9Ci0gICAgVmVjdG9yPGNoYXI+
IHByaW1hcnlLZXkoKSBjb25zdCB7IHJldHVybiBtX3ByaW1hcnlLZXk7IH0KLSAgICB2b2lkIHNl
dFByaW1hcnlLZXkoY29uc3QgVmVjdG9yPGNoYXI+JiBwcmltYXJ5S2V5KSB7IG1fcHJpbWFyeUtl
eSA9IHByaW1hcnlLZXk7IH0KLSAgICBpbnQ2NF90IHZlcnNpb24oKSBjb25zdCB7IHJldHVybiBt
X3ZlcnNpb247IH0KLSAgICB2b2lkIHNldFZlcnNpb24oaW50NjRfdCB2ZXJzaW9uKSB7IG1fdmVy
c2lvbiA9IHZlcnNpb247IH0KLQotcHJpdmF0ZToKLSAgICBMZXZlbERCUmVjb3JkSWRlbnRpZmll
cihjb25zdCBWZWN0b3I8Y2hhcj4mIHByaW1hcnlLZXksIGludDY0X3QgdmVyc2lvbikgOiBtX3By
aW1hcnlLZXkocHJpbWFyeUtleSksIG1fdmVyc2lvbih2ZXJzaW9uKSB7IEFTU0VSVCghcHJpbWFy
eUtleS5pc0VtcHR5KCkpOyB9Ci0gICAgTGV2ZWxEQlJlY29yZElkZW50aWZpZXIoKSA6IG1fcHJp
bWFyeUtleSgpLCBtX3ZlcnNpb24oLTEpIHt9Ci0KLSAgICBWZWN0b3I8Y2hhcj4gbV9wcmltYXJ5
S2V5OyAvLyBGSVhNRTogTWFrZSBpdCBtb3JlIGNsZWFyIHRoYXQgdGhpcyBpcyB0aGUgKmVuY29k
ZWQqIHZlcnNpb24gb2YgdGhlIGtleS4KLSAgICBpbnQ2NF90IG1fdmVyc2lvbjsKLX07Ci19Ci0K
LXN0YXRpYyBpbnQ2NF90IGdldE5ld1ZlcnNpb25OdW1iZXIoTGV2ZWxEQlRyYW5zYWN0aW9uKiB0
cmFuc2FjdGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpCi17
Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IGxhc3RWZXJzaW9uS2V5ID0gT2JqZWN0U3RvcmVNZXRh
RGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlTWV0
YURhdGFLZXk6Okxhc3RWZXJzaW9uKTsKLQotICAgIGludDY0X3QgbGFzdFZlcnNpb24gPSAtMTsK
LSAgICBpZiAoIWdldEludCh0cmFuc2FjdGlvbiwgbGFzdFZlcnNpb25LZXksIGxhc3RWZXJzaW9u
KSkKLSAgICAgICAgbGFzdFZlcnNpb24gPSAwOwotCi0gICAgQVNTRVJUKGxhc3RWZXJzaW9uID49
IDApOwotCi0gICAgaW50NjRfdCB2ZXJzaW9uID0gbGFzdFZlcnNpb24gKyAxOwotICAgIGJvb2wg
b2sgPSBwdXRJbnQodHJhbnNhY3Rpb24sIGxhc3RWZXJzaW9uS2V5LCB2ZXJzaW9uKTsKLSAgICBB
U1NFUlRfVU5VU0VEKG9rLCBvayk7Ci0KLSAgICBBU1NFUlQodmVyc2lvbiA+IGxhc3RWZXJzaW9u
KTsgLy8gRklYTUU6IFRoaW5rIGFib3V0IGhvdyB3ZSB3YW50IHRvIGhhbmRsZSB0aGUgb3ZlcmZs
b3cgc2NlbmFyaW8uCi0KLSAgICByZXR1cm4gdmVyc2lvbjsKLX0KLQotYm9vbCBJREJMZXZlbERC
QmFja2luZ1N0b3JlOjpwdXRPYmplY3RTdG9yZVJlY29yZChJREJCYWNraW5nU3RvcmU6OlRyYW5z
YWN0aW9uKiB0cmFuc2FjdGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0
b3JlSWQsIGNvbnN0IElEQktleSYga2V5LCBjb25zdCBTdHJpbmcmIHZhbHVlLCBPYmplY3RTdG9y
ZVJlY29yZElkZW50aWZpZXIqIHJlY29yZElkZW50aWZpZXIpCi17Ci0gICAgSURCX1RSQUNFKCJJ
REJMZXZlbERCQmFja2luZ1N0b3JlOjpwdXRPYmplY3RTdG9yZVJlY29yZCIpOwotICAgIEFTU0VS
VChrZXkuaXNWYWxpZCgpKTsKLSAgICBMZXZlbERCVHJhbnNhY3Rpb24qIGxldmVsREJUcmFuc2Fj
dGlvbiA9IFRyYW5zYWN0aW9uOjpsZXZlbERCVHJhbnNhY3Rpb25Gcm9tKHRyYW5zYWN0aW9uKTsK
LSAgICBpbnQ2NF90IHZlcnNpb24gPSBnZXROZXdWZXJzaW9uTnVtYmVyKGxldmVsREJUcmFuc2Fj
dGlvbiwgZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCk7Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+
IG9iamVjdFN0b3JlZGF0YUtleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNl
SWQsIG9iamVjdFN0b3JlSWQsIGtleSk7Ci0KLSAgICBWZWN0b3I8Y2hhcj4gdjsKLSAgICB2LmFw
cGVuZChlbmNvZGVWYXJJbnQodmVyc2lvbikpOwotICAgIHYuYXBwZW5kKGVuY29kZVN0cmluZyh2
YWx1ZSkpOwotCi0gICAgaWYgKCFsZXZlbERCVHJhbnNhY3Rpb24tPnB1dChvYmplY3RTdG9yZWRh
dGFLZXksIHYpKSB7Ci0gICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9y
ZVdyaXRlRXJyb3IpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY29uc3Qg
VmVjdG9yPGNoYXI+IGV4aXN0c0VudHJ5S2V5ID0gRXhpc3RzRW50cnlLZXk6OmVuY29kZShkYXRh
YmFzZUlkLCBvYmplY3RTdG9yZUlkLCBrZXkpOwotICAgIGlmICghbGV2ZWxEQlRyYW5zYWN0aW9u
LT5wdXQoZXhpc3RzRW50cnlLZXksIGVuY29kZUludCh2ZXJzaW9uKSkpIHsKLSAgICAgICAgSW50
ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlV3JpdGVFcnJvcik7Ci0gICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBMZXZlbERCUmVjb3JkSWRlbnRpZmllciogbGV2ZWxE
QlJlY29yZElkZW50aWZpZXIgPSBzdGF0aWNfY2FzdDxMZXZlbERCUmVjb3JkSWRlbnRpZmllcio+
KHJlY29yZElkZW50aWZpZXIpOwotICAgIGxldmVsREJSZWNvcmRJZGVudGlmaWVyLT5zZXRQcmlt
YXJ5S2V5KGVuY29kZUlEQktleShrZXkpKTsKLSAgICBsZXZlbERCUmVjb3JkSWRlbnRpZmllci0+
c2V0VmVyc2lvbih2ZXJzaW9uKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBJREJMZXZl
bERCQmFja2luZ1N0b3JlOjpjbGVhck9iamVjdFN0b3JlKElEQkJhY2tpbmdTdG9yZTo6VHJhbnNh
Y3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3Rv
cmVJZCkKLXsKLSAgICBJREJfVFJBQ0UoIklEQkxldmVsREJCYWNraW5nU3RvcmU6OmNsZWFyT2Jq
ZWN0U3RvcmUiKTsKLSAgICBMZXZlbERCVHJhbnNhY3Rpb24qIGxldmVsREJUcmFuc2FjdGlvbiA9
IFRyYW5zYWN0aW9uOjpsZXZlbERCVHJhbnNhY3Rpb25Gcm9tKHRyYW5zYWN0aW9uKTsKLSAgICBj
b25zdCBWZWN0b3I8Y2hhcj4gc3RhcnRLZXkgPSBLZXlQcmVmaXgoZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmVJZCwgMCkuZW5jb2RlKCk7Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IHN0b3BLZXkgPSBL
ZXlQcmVmaXgoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCArIDEsIDApLmVuY29kZSgpOwotCi0g
ICAgZGVsZXRlUmFuZ2UobGV2ZWxEQlRyYW5zYWN0aW9uLCBzdGFydEtleSwgc3RvcEtleSk7Ci19
Ci0KLVBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJlY29yZElkZW50aWZp
ZXI+IElEQkxldmVsREJCYWNraW5nU3RvcmU6OmNyZWF0ZUludmFsaWRSZWNvcmRJZGVudGlmaWVy
KCkKLXsKLSAgICByZXR1cm4gTGV2ZWxEQlJlY29yZElkZW50aWZpZXI6OmNyZWF0ZSgpOwotfQot
Ci12b2lkIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmRlbGV0ZU9iamVjdFN0b3JlUmVjb3JkKElE
QkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNl
SWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRJZGVudGlm
aWVyKiByZWNvcmRJZGVudGlmaWVyKQotewotICAgIElEQl9UUkFDRSgiSURCTGV2ZWxEQkJhY2tp
bmdTdG9yZTo6ZGVsZXRlT2JqZWN0U3RvcmVSZWNvcmQiKTsKLSAgICBMZXZlbERCVHJhbnNhY3Rp
b24qIGxldmVsREJUcmFuc2FjdGlvbiA9IFRyYW5zYWN0aW9uOjpsZXZlbERCVHJhbnNhY3Rpb25G
cm9tKHRyYW5zYWN0aW9uKTsKLSAgICBjb25zdCBMZXZlbERCUmVjb3JkSWRlbnRpZmllciogbGV2
ZWxEQlJlY29yZElkZW50aWZpZXIgPSBzdGF0aWNfY2FzdDxjb25zdCBMZXZlbERCUmVjb3JkSWRl
bnRpZmllcio+KHJlY29yZElkZW50aWZpZXIpOwotCi0gICAgY29uc3QgVmVjdG9yPGNoYXI+IG9i
amVjdFN0b3JlRGF0YUtleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQs
IG9iamVjdFN0b3JlSWQsIGxldmVsREJSZWNvcmRJZGVudGlmaWVyLT5wcmltYXJ5S2V5KCkpOwot
ICAgIGxldmVsREJUcmFuc2FjdGlvbi0+cmVtb3ZlKG9iamVjdFN0b3JlRGF0YUtleSk7Ci0KLSAg
ICBjb25zdCBWZWN0b3I8Y2hhcj4gZXhpc3RzRW50cnlLZXkgPSBFeGlzdHNFbnRyeUtleTo6ZW5j
b2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGxldmVsREJSZWNvcmRJZGVudGlmaWVyLT5w
cmltYXJ5S2V5KCkpOwotICAgIGxldmVsREJUcmFuc2FjdGlvbi0+cmVtb3ZlKGV4aXN0c0VudHJ5
S2V5KTsKLX0KLQotCi1pbnQ2NF90IElEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldEtleUdlbmVy
YXRvckN1cnJlbnROdW1iZXIoSURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbiogdHJhbnNhY3Rp
b24sIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKQotewotICAgIExl
dmVsREJUcmFuc2FjdGlvbiogbGV2ZWxEQlRyYW5zYWN0aW9uID0gVHJhbnNhY3Rpb246OmxldmVs
REJUcmFuc2FjdGlvbkZyb20odHJhbnNhY3Rpb24pOwotCi0gICAgY29uc3QgVmVjdG9yPGNoYXI+
IGtleUdlbmVyYXRvckN1cnJlbnROdW1iZXJLZXkgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5Ojpl
bmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6
S2V5R2VuZXJhdG9yQ3VycmVudE51bWJlcik7Ci0KLSAgICBpbnQ2NF90IGtleUdlbmVyYXRvckN1
cnJlbnROdW1iZXIgPSAtMTsKLSAgICBWZWN0b3I8Y2hhcj4gZGF0YTsKLQotICAgIGlmIChsZXZl
bERCVHJhbnNhY3Rpb24tPmdldChrZXlHZW5lcmF0b3JDdXJyZW50TnVtYmVyS2V5LCBkYXRhKSkK
LSAgICAgICAga2V5R2VuZXJhdG9yQ3VycmVudE51bWJlciA9IGRlY29kZUludChkYXRhLmJlZ2lu
KCksIGRhdGEuZW5kKCkpOwotICAgIGVsc2UgewotICAgICAgICAvLyBQcmV2aW91c2x5LCB0aGUg
a2V5IGdlbmVyYXRvciBzdGF0ZSB3YXMgbm90IHN0b3JlZCBleHBsaWNpdGx5IGJ1dCBkZXJpdmVk
IGZyb20gdGhlCi0gICAgICAgIC8vIG1heGltdW0gbnVtZXJpYyBrZXkgcHJlc2VudCBpbiBleGlz
dGluZyBkYXRhLiBUaGlzIHZpb2xhdGVzIHRoZSBzcGVjIGFzIHRoZSBkYXRhIG1heQotICAgICAg
ICAvLyBiZSBjbGVhcmVkIGJ1dCB0aGUga2V5IGdlbmVyYXRvciBzdGF0ZSBtdXN0IGJlIHByZXNl
cnZlZC4KLSAgICAgICAgY29uc3QgVmVjdG9yPGNoYXI+IHN0YXJ0S2V5ID0gT2JqZWN0U3RvcmVE
YXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgbWluSURCS2V5KCkpOwot
ICAgICAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3RvcEtleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6
ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIG1heElEQktleSgpKTsKLQotICAgICAg
ICBPd25QdHI8TGV2ZWxEQkl0ZXJhdG9yPiBpdCA9IGxldmVsREJUcmFuc2FjdGlvbi0+Y3JlYXRl
SXRlcmF0b3IoKTsKLSAgICAgICAgaW50NjRfdCBtYXhOdW1lcmljS2V5ID0gMDsKLQotICAgICAg
ICBmb3IgKGl0LT5zZWVrKHN0YXJ0S2V5KTsgaXQtPmlzVmFsaWQoKSAmJiBjb21wYXJlS2V5cyhp
dC0+a2V5KCksIHN0b3BLZXkpIDwgMDsgaXQtPm5leHQoKSkgewotICAgICAgICAgICAgY29uc3Qg
Y2hhciogcCA9IGl0LT5rZXkoKS5iZWdpbigpOwotICAgICAgICAgICAgY29uc3QgY2hhciogbGlt
aXQgPSBpdC0+a2V5KCkuZW5kKCk7Ci0KLSAgICAgICAgICAgIE9iamVjdFN0b3JlRGF0YUtleSBk
YXRhS2V5OwotICAgICAgICAgICAgcCA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZGVjb2RlKHAsIGxp
bWl0LCAmZGF0YUtleSk7Ci0gICAgICAgICAgICBBU1NFUlQocCk7Ci0KLSAgICAgICAgICAgIGlm
IChkYXRhS2V5LnVzZXJLZXkoKS0+dHlwZSgpID09IElEQktleTo6TnVtYmVyVHlwZSkgewotICAg
ICAgICAgICAgICAgIGludDY0X3QgbiA9IHN0YXRpY19jYXN0PGludDY0X3Q+KGRhdGFLZXkudXNl
cktleSgpLT5udW1iZXIoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG4gPiBtYXhOdW1lcmljS2V5
KQotICAgICAgICAgICAgICAgICAgICBtYXhOdW1lcmljS2V5ID0gbjsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgfQotCi0gICAgICAgIGtleUdlbmVyYXRvckN1cnJlbnROdW1iZXIgPSBtYXhOdW1l
cmljS2V5ICsgMTsKLSAgICB9Ci0KLSAgICByZXR1cm4ga2V5R2VuZXJhdG9yQ3VycmVudE51bWJl
cjsKLX0KLQotYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjptYXliZVVwZGF0ZUtleUdlbmVy
YXRvckN1cnJlbnROdW1iZXIoSURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbiogdHJhbnNhY3Rp
b24sIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IG5l
d051bWJlciwgYm9vbCBjaGVja0N1cnJlbnQpCi17Ci0gICAgTGV2ZWxEQlRyYW5zYWN0aW9uKiBs
ZXZlbERCVHJhbnNhY3Rpb24gPSBUcmFuc2FjdGlvbjo6bGV2ZWxEQlRyYW5zYWN0aW9uRnJvbSh0
cmFuc2FjdGlvbik7Ci0KLSAgICBpZiAoY2hlY2tDdXJyZW50KSB7Ci0gICAgICAgIGludDY0X3Qg
Y3VycmVudE51bWJlciA9IGdldEtleUdlbmVyYXRvckN1cnJlbnROdW1iZXIodHJhbnNhY3Rpb24s
IGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQpOwotICAgICAgICBpZiAobmV3TnVtYmVyIDw9IGN1
cnJlbnROdW1iZXIpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBjb25z
dCBWZWN0b3I8Y2hhcj4ga2V5R2VuZXJhdG9yQ3VycmVudE51bWJlcktleSA9IE9iamVjdFN0b3Jl
TWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9y
ZU1ldGFEYXRhS2V5OjpLZXlHZW5lcmF0b3JDdXJyZW50TnVtYmVyKTsKLSAgICBib29sIG9rID0g
cHV0SW50KGxldmVsREJUcmFuc2FjdGlvbiwga2V5R2VuZXJhdG9yQ3VycmVudE51bWJlcktleSwg
bmV3TnVtYmVyKTsKLSAgICBpZiAoIW9rKSB7Ci0gICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2
ZWxEQkJhY2tpbmdTdG9yZVdyaXRlRXJyb3IpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
fQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6Omtl
eUV4aXN0c0luT2JqZWN0U3RvcmUoSURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbiogdHJhbnNh
Y3Rpb24sIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJ
REJLZXkmIGtleSwgT2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyKiBmb3VuZFJlY29yZElkZW50
aWZpZXIpCi17Ci0gICAgSURCX1RSQUNFKCJJREJMZXZlbERCQmFja2luZ1N0b3JlOjprZXlFeGlz
dHNJbk9iamVjdFN0b3JlIik7Ci0gICAgTGV2ZWxEQlRyYW5zYWN0aW9uKiBsZXZlbERCVHJhbnNh
Y3Rpb24gPSBUcmFuc2FjdGlvbjo6bGV2ZWxEQlRyYW5zYWN0aW9uRnJvbSh0cmFuc2FjdGlvbik7
Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IGxldmVsZGJLZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6
OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBrZXkpOwotICAgIFZlY3RvcjxjaGFy
PiBkYXRhOwotCi0gICAgaWYgKCFsZXZlbERCVHJhbnNhY3Rpb24tPmdldChsZXZlbGRiS2V5LCBk
YXRhKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaW50NjRfdCB2ZXJzaW9uOwotICAg
IGlmICghZGVjb2RlVmFySW50KGRhdGEuYmVnaW4oKSwgZGF0YS5lbmQoKSwgdmVyc2lvbikpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIExldmVsREJSZWNvcmRJZGVudGlmaWVyKiBsZXZl
bERCUmVjb3JkSWRlbnRpZmllciA9IHN0YXRpY19jYXN0PExldmVsREJSZWNvcmRJZGVudGlmaWVy
Kj4oZm91bmRSZWNvcmRJZGVudGlmaWVyKTsKLSAgICBsZXZlbERCUmVjb3JkSWRlbnRpZmllci0+
c2V0UHJpbWFyeUtleShlbmNvZGVJREJLZXkoa2V5KSk7Ci0gICAgbGV2ZWxEQlJlY29yZElkZW50
aWZpZXItPnNldFZlcnNpb24odmVyc2lvbik7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wg
SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Zm9yRWFjaE9iamVjdFN0b3JlUmVjb3JkKElEQkJhY2tp
bmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGlu
dDY0X3Qgb2JqZWN0U3RvcmVJZCwgT2JqZWN0U3RvcmVSZWNvcmRDYWxsYmFjayYgY2FsbGJhY2sp
Ci17Ci0gICAgTGV2ZWxEQlRyYW5zYWN0aW9uKiBsZXZlbERCVHJhbnNhY3Rpb24gPSBUcmFuc2Fj
dGlvbjo6bGV2ZWxEQlRyYW5zYWN0aW9uRnJvbSh0cmFuc2FjdGlvbik7Ci0gICAgY29uc3QgVmVj
dG9yPGNoYXI+IHN0YXJ0S2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCwgbWluSURCS2V5KCkpOwotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBz
dG9wS2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3Rv
cmVJZCwgbWF4SURCS2V5KCkpOwotCi0gICAgT3duUHRyPExldmVsREJJdGVyYXRvcj4gaXQgPSBs
ZXZlbERCVHJhbnNhY3Rpb24tPmNyZWF0ZUl0ZXJhdG9yKCk7Ci0gICAgZm9yIChpdC0+c2Vlayhz
dGFydEtleSk7IGl0LT5pc1ZhbGlkKCkgJiYgY29tcGFyZUtleXMoaXQtPmtleSgpLCBzdG9wS2V5
KSA8IDA7IGl0LT5uZXh0KCkpIHsKLSAgICAgICAgY29uc3QgY2hhciogcCA9IGl0LT5rZXkoKS5i
ZWdpbigpOwotICAgICAgICBjb25zdCBjaGFyKiBsaW1pdCA9IGl0LT5rZXkoKS5lbmQoKTsKLSAg
ICAgICAgT2JqZWN0U3RvcmVEYXRhS2V5IGRhdGFLZXk7Ci0gICAgICAgIHAgPSBPYmplY3RTdG9y
ZURhdGFLZXk6OmRlY29kZShwLCBsaW1pdCwgJmRhdGFLZXkpOwotICAgICAgICBBU1NFUlQocCk7
Ci0KLSAgICAgICAgUmVmUHRyPElEQktleT4gcHJpbWFyeUtleSA9IGRhdGFLZXkudXNlcktleSgp
OwotCi0gICAgICAgIGludDY0X3QgdmVyc2lvbjsKLSAgICAgICAgY29uc3QgY2hhciogcSA9IGRl
Y29kZVZhckludChpdC0+dmFsdWUoKS5iZWdpbigpLCBpdC0+dmFsdWUoKS5lbmQoKSwgdmVyc2lv
bik7Ci0gICAgICAgIGlmICghcSkgewotICAgICAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZl
bERCQmFja2luZ1N0b3JlUmVhZEVycm9yKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICAgICAgfQotCi0gICAgICAgIFJlZlB0cjxMZXZlbERCUmVjb3JkSWRlbnRpZmllcj4gcmkgPSBM
ZXZlbERCUmVjb3JkSWRlbnRpZmllcjo6Y3JlYXRlKGVuY29kZUlEQktleSgqcHJpbWFyeUtleSks
IHZlcnNpb24pOwotICAgICAgICBTdHJpbmcgaWRiVmFsdWUgPSBkZWNvZGVTdHJpbmcocSwgaXQt
PnZhbHVlKCkuZW5kKCkpOwotCi0gICAgICAgIGlmICghY2FsbGJhY2suY2FsbGJhY2socmkuZ2V0
KCksIGlkYlZhbHVlKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBy
ZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgY2hlY2tJbmRleEFuZE1ldGFEYXRhS2V5KGNv
bnN0IExldmVsREJJdGVyYXRvciogaXQsIGNvbnN0IFZlY3RvcjxjaGFyPiYgc3RvcEtleSwgaW50
NjRfdCBpbmRleElkLCB1bnNpZ25lZCBjaGFyIG1ldGFEYXRhVHlwZSkKLXsKLSAgICBpZiAoIWl0
LT5pc1ZhbGlkKCkgfHwgY29tcGFyZUtleXMoaXQtPmtleSgpLCBzdG9wS2V5KSA+PSAwKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBJbmRleE1ldGFEYXRhS2V5IG1ldGFEYXRhS2V5Owot
ICAgIGNvbnN0IGNoYXIqIHAgPSBJbmRleE1ldGFEYXRhS2V5OjpkZWNvZGUoaXQtPmtleSgpLmJl
Z2luKCksIGl0LT5rZXkoKS5lbmQoKSwgJm1ldGFEYXRhS2V5KTsKLSAgICBBU1NFUlRfVU5VU0VE
KHAsIHApOwotICAgIGlmIChtZXRhRGF0YUtleS5pbmRleElkKCkgIT0gaW5kZXhJZCkKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChtZXRhRGF0YUtleS5tZXRhRGF0YVR5cGUoKSAhPSBt
ZXRhRGF0YVR5cGUpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0K
LQotCi1WZWN0b3I8SURCSW5kZXhNZXRhZGF0YT4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0
SW5kZXhlcyhpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKLXsKLSAg
ICBJREJfVFJBQ0UoIklEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldEluZGV4ZXMiKTsKLSAgICBW
ZWN0b3I8SURCSW5kZXhNZXRhZGF0YT4gaW5kZXhlczsKLSAgICBjb25zdCBWZWN0b3I8Y2hhcj4g
c3RhcnRLZXkgPSBJbmRleE1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3Rv
cmVJZCwgMCwgMCk7Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IHN0b3BLZXkgPSBJbmRleE1ldGFE
YXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCArIDEsIDAsIDApOwotCi0g
ICAgQVNTRVJUKGluZGV4ZXMuaXNFbXB0eSgpKTsKLQotICAgIE93blB0cjxMZXZlbERCSXRlcmF0
b3I+IGl0ID0gbV9kYi0+Y3JlYXRlSXRlcmF0b3IoKTsKLSAgICBpdC0+c2VlayhzdGFydEtleSk7
Ci0gICAgd2hpbGUgKGl0LT5pc1ZhbGlkKCkgJiYgY29tcGFyZUtleXMoaXQtPmtleSgpLCBzdG9w
S2V5KSA8IDApIHsKLSAgICAgICAgY29uc3QgY2hhciogcCA9IGl0LT5rZXkoKS5iZWdpbigpOwot
ICAgICAgICBjb25zdCBjaGFyKiBsaW1pdCA9IGl0LT5rZXkoKS5lbmQoKTsKLQotICAgICAgICBJ
bmRleE1ldGFEYXRhS2V5IG1ldGFEYXRhS2V5OwotICAgICAgICBwID0gSW5kZXhNZXRhRGF0YUtl
eTo6ZGVjb2RlKHAsIGxpbWl0LCAmbWV0YURhdGFLZXkpOwotICAgICAgICBBU1NFUlQocCk7Ci0g
ICAgICAgIGlmIChtZXRhRGF0YUtleS5tZXRhRGF0YVR5cGUoKSAhPSBJbmRleE1ldGFEYXRhS2V5
OjpOYW1lKSB7Ci0gICAgICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3Rv
cmVSZWFkRXJyb3IpOwotICAgICAgICAgICAgLy8gUG9zc2libGUgc3RhbGUgbWV0YWRhdGEgZHVl
IHRvIGh0dHA6Ly93ZWJraXQub3JnL2IvODU1NTcgYnV0IGRvbid0IGZhaWwgdGhlIGxvYWQuCi0g
ICAgICAgICAgICBpdC0+bmV4dCgpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0K
LQotICAgICAgICAvLyBGSVhNRTogRG8gdGhpcyBieSBkaXJlY3Qga2V5IGxvb2t1cCByYXRoZXIg
dGhhbiBpdGVyYXRpb24sIHRvIHNpbXBsaWZ5LgotICAgICAgICBpbnQ2NF90IGluZGV4SWQgPSBt
ZXRhRGF0YUtleS5pbmRleElkKCk7Ci0gICAgICAgIFN0cmluZyBpbmRleE5hbWUgPSBkZWNvZGVT
dHJpbmcoaXQtPnZhbHVlKCkuYmVnaW4oKSwgaXQtPnZhbHVlKCkuZW5kKCkpOwotCi0gICAgICAg
IGl0LT5uZXh0KCk7IC8vIHVuaXF1ZSBmbGFnCi0gICAgICAgIGlmICghY2hlY2tJbmRleEFuZE1l
dGFEYXRhS2V5KGl0LmdldCgpLCBzdG9wS2V5LCBpbmRleElkLCBJbmRleE1ldGFEYXRhS2V5OjpV
bmlxdWUpKSB7Ci0gICAgICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3Rv
cmVSZWFkRXJyb3IpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYm9v
bCBpbmRleFVuaXF1ZSA9IGRlY29kZUJvb2woaXQtPnZhbHVlKCkuYmVnaW4oKSwgaXQtPnZhbHVl
KCkuZW5kKCkpOwotCi0gICAgICAgIGl0LT5uZXh0KCk7IC8vIGtleVBhdGgKLSAgICAgICAgaWYg
KCFjaGVja0luZGV4QW5kTWV0YURhdGFLZXkoaXQuZ2V0KCksIHN0b3BLZXksIGluZGV4SWQsIElu
ZGV4TWV0YURhdGFLZXk6OktleVBhdGgpKSB7Ci0gICAgICAgICAgICBJbnRlcm5hbEVycm9yKElE
QkxldmVsREJCYWNraW5nU3RvcmVSZWFkRXJyb3IpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIH0KLSAgICAgICAgSURCS2V5UGF0aCBrZXlQYXRoID0gZGVjb2RlSURCS2V5UGF0aChpdC0+
dmFsdWUoKS5iZWdpbigpLCBpdC0+dmFsdWUoKS5lbmQoKSk7Ci0KLSAgICAgICAgaXQtPm5leHQo
KTsgLy8gW29wdGlvbmFsXSBtdWx0aUVudHJ5IGZsYWcKLSAgICAgICAgYm9vbCBpbmRleE11bHRp
RW50cnkgPSBmYWxzZTsKLSAgICAgICAgaWYgKGNoZWNrSW5kZXhBbmRNZXRhRGF0YUtleShpdC5n
ZXQoKSwgc3RvcEtleSwgaW5kZXhJZCwgSW5kZXhNZXRhRGF0YUtleTo6TXVsdGlFbnRyeSkpIHsK
LSAgICAgICAgICAgIGluZGV4TXVsdGlFbnRyeSA9IGRlY29kZUJvb2woaXQtPnZhbHVlKCkuYmVn
aW4oKSwgaXQtPnZhbHVlKCkuZW5kKCkpOwotICAgICAgICAgICAgaXQtPm5leHQoKTsKLSAgICAg
ICAgfQotCi0gICAgICAgIGluZGV4ZXMuYXBwZW5kKElEQkluZGV4TWV0YWRhdGEoaW5kZXhOYW1l
LCBpbmRleElkLCBrZXlQYXRoLCBpbmRleFVuaXF1ZSwgaW5kZXhNdWx0aUVudHJ5KSk7Ci0gICAg
fQotICAgIHJldHVybiBpbmRleGVzOwotfQotCi1zdGF0aWMgYm9vbCBzZXRNYXhJbmRleElkKExl
dmVsREJUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRf
dCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQpCi17Ci0gICAgaW50NjRfdCBtYXhJbmRl
eElkID0gLTE7Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IG1heEluZGV4SWRLZXkgPSBPYmplY3RT
dG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgT2JqZWN0
U3RvcmVNZXRhRGF0YUtleTo6TWF4SW5kZXhJZCk7Ci0gICAgaWYgKCFnZXRJbnQodHJhbnNhY3Rp
b24sIG1heEluZGV4SWRLZXksIG1heEluZGV4SWQpKQotICAgICAgICBtYXhJbmRleElkID0gTWlu
aW11bUluZGV4SWQ7Ci0KLSAgICBpZiAoaW5kZXhJZCA8PSBtYXhJbmRleElkKSB7Ci0gICAgICAg
IEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZUNvbnNpc3RlbmN5RXJyb3IpOwot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKCFwdXRJbnQodHJhbnNhY3Rp
b24sIG1heEluZGV4SWRLZXksIGluZGV4SWQpKSB7Ci0gICAgICAgIEludGVybmFsRXJyb3IoSURC
TGV2ZWxEQkJhY2tpbmdTdG9yZVdyaXRlRXJyb3IpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6
OmNyZWF0ZUluZGV4KElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBp
bnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElk
LCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IElEQktleVBhdGgmIGtleVBhdGgsIGJvb2wgaXNV
bmlxdWUsIGJvb2wgaXNNdWx0aUVudHJ5KQotewotICAgIElEQl9UUkFDRSgiSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZTo6Y3JlYXRlSW5kZXgiKTsKLSAgICBMZXZlbERCVHJhbnNhY3Rpb24qIGxldmVs
REJUcmFuc2FjdGlvbiA9IFRyYW5zYWN0aW9uOjpsZXZlbERCVHJhbnNhY3Rpb25Gcm9tKHRyYW5z
YWN0aW9uKTsKLSAgICBpZiAoIXNldE1heEluZGV4SWQobGV2ZWxEQlRyYW5zYWN0aW9uLCBkYXRh
YmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IG5hbWVLZXkgPSBJbmRleE1ldGFEYXRhS2V5OjplbmNv
ZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgSW5kZXhNZXRhRGF0YUtleTo6
TmFtZSk7Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IHVuaXF1ZUtleSA9IEluZGV4TWV0YURhdGFL
ZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBJbmRleE1ldGFE
YXRhS2V5OjpVbmlxdWUpOwotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBrZXlQYXRoS2V5ID0gSW5k
ZXhNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQs
IEluZGV4TWV0YURhdGFLZXk6OktleVBhdGgpOwotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBtdWx0
aUVudHJ5S2V5ID0gSW5kZXhNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0
b3JlSWQsIGluZGV4SWQsIEluZGV4TWV0YURhdGFLZXk6Ok11bHRpRW50cnkpOwotCi0gICAgYm9v
bCBvayA9IHB1dFN0cmluZyhsZXZlbERCVHJhbnNhY3Rpb24sIG5hbWVLZXksIG5hbWUpOwotICAg
IGlmICghb2spIHsKLSAgICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3Jl
V3JpdGVFcnJvcik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBvayA9IHB1
dEJvb2wobGV2ZWxEQlRyYW5zYWN0aW9uLCB1bmlxdWVLZXksIGlzVW5pcXVlKTsKLSAgICBpZiAo
IW9rKSB7Ci0gICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVdyaXRl
RXJyb3IpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgb2sgPSBwdXRJREJL
ZXlQYXRoKGxldmVsREJUcmFuc2FjdGlvbiwga2V5UGF0aEtleSwga2V5UGF0aCk7Ci0gICAgaWYg
KCFvaykgewotICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVXcml0
ZUVycm9yKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIG9rID0gcHV0Qm9v
bChsZXZlbERCVHJhbnNhY3Rpb24sIG11bHRpRW50cnlLZXksIGlzTXVsdGlFbnRyeSk7Ci0gICAg
aWYgKCFvaykgewotICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVX
cml0ZUVycm9yKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0
cnVlOwotfQotCi12b2lkIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmRlbGV0ZUluZGV4KElEQkJh
Y2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQs
IGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkKQotewotICAgIElEQl9UUkFD
RSgiSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlSW5kZXgiKTsKLSAgICBMZXZlbERCVHJh
bnNhY3Rpb24qIGxldmVsREJUcmFuc2FjdGlvbiA9IFRyYW5zYWN0aW9uOjpsZXZlbERCVHJhbnNh
Y3Rpb25Gcm9tKHRyYW5zYWN0aW9uKTsKLQotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBpbmRleE1l
dGFEYXRhU3RhcnQgPSBJbmRleE1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmVJZCwgaW5kZXhJZCwgMCk7Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IGluZGV4TWV0YURh
dGFFbmQgPSBJbmRleE1ldGFEYXRhS2V5OjplbmNvZGVNYXhLZXkoZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmVJZCwgaW5kZXhJZCk7Ci0KLSAgICBpZiAoIWRlbGV0ZVJhbmdlKGxldmVsREJUcmFuc2Fj
dGlvbiwgaW5kZXhNZXRhRGF0YVN0YXJ0LCBpbmRleE1ldGFEYXRhRW5kKSkgewotICAgICAgICBJ
bnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVXcml0ZUVycm9yKTsKLSAgICAgICAg
cmV0dXJuOwotICAgIH0KLQotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBpbmRleERhdGFTdGFydCA9
IEluZGV4RGF0YUtleTo6ZW5jb2RlTWluS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGlu
ZGV4SWQpOwotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBpbmRleERhdGFFbmQgPSBJbmRleERhdGFL
ZXk6OmVuY29kZU1heEtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkKTsKLQot
ICAgIGlmICghZGVsZXRlUmFuZ2UobGV2ZWxEQlRyYW5zYWN0aW9uLCBpbmRleERhdGFTdGFydCwg
aW5kZXhEYXRhRW5kKSkgewotICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5n
U3RvcmVXcml0ZUVycm9yKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLX0KLQotYm9vbCBJREJM
ZXZlbERCQmFja2luZ1N0b3JlOjpwdXRJbmRleERhdGFGb3JSZWNvcmQoSURCQmFja2luZ1N0b3Jl
OjpUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBv
YmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYga2V5LCBjb25zdCBP
YmplY3RTdG9yZVJlY29yZElkZW50aWZpZXIqIHJlY29yZElkZW50aWZpZXIpCi17Ci0gICAgSURC
X1RSQUNFKCJJREJMZXZlbERCQmFja2luZ1N0b3JlOjpwdXRJbmRleERhdGFGb3JSZWNvcmQiKTsK
LSAgICBBU1NFUlQoa2V5LmlzVmFsaWQoKSk7Ci0gICAgQVNTRVJUKGluZGV4SWQgPj0gTWluaW11
bUluZGV4SWQpOwotICAgIGNvbnN0IExldmVsREJSZWNvcmRJZGVudGlmaWVyKiBsZXZlbERCUmVj
b3JkSWRlbnRpZmllciA9IHN0YXRpY19jYXN0PGNvbnN0IExldmVsREJSZWNvcmRJZGVudGlmaWVy
Kj4ocmVjb3JkSWRlbnRpZmllcik7Ci0KLSAgICBMZXZlbERCVHJhbnNhY3Rpb24qIGxldmVsREJU
cmFuc2FjdGlvbiA9IFRyYW5zYWN0aW9uOjpsZXZlbERCVHJhbnNhY3Rpb25Gcm9tKHRyYW5zYWN0
aW9uKTsKLSAgICBjb25zdCBWZWN0b3I8Y2hhcj4gaW5kZXhEYXRhS2V5ID0gSW5kZXhEYXRhS2V5
OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgZW5jb2RlSURCS2V5
KGtleSksIGxldmVsREJSZWNvcmRJZGVudGlmaWVyLT5wcmltYXJ5S2V5KCkpOwotCi0gICAgVmVj
dG9yPGNoYXI+IGRhdGE7Ci0gICAgZGF0YS5hcHBlbmQoZW5jb2RlVmFySW50KGxldmVsREJSZWNv
cmRJZGVudGlmaWVyLT52ZXJzaW9uKCkpKTsKLSAgICBkYXRhLmFwcGVuZChsZXZlbERCUmVjb3Jk
SWRlbnRpZmllci0+cHJpbWFyeUtleSgpKTsKLQotICAgIHJldHVybiBsZXZlbERCVHJhbnNhY3Rp
b24tPnB1dChpbmRleERhdGFLZXksIGRhdGEpOwotfQotCi1zdGF0aWMgYm9vbCBmaW5kR3JlYXRl
c3RLZXlMZXNzVGhhbk9yRXF1YWwoTGV2ZWxEQlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgY29u
c3QgVmVjdG9yPGNoYXI+JiB0YXJnZXQsIFZlY3RvcjxjaGFyPiYgZm91bmRLZXkpCi17Ci0gICAg
T3duUHRyPExldmVsREJJdGVyYXRvcj4gaXQgPSB0cmFuc2FjdGlvbi0+Y3JlYXRlSXRlcmF0b3Io
KTsKLSAgICBpdC0+c2Vlayh0YXJnZXQpOwotCi0gICAgaWYgKCFpdC0+aXNWYWxpZCgpKSB7Ci0g
ICAgICAgIGl0LT5zZWVrVG9MYXN0KCk7Ci0gICAgICAgIGlmICghaXQtPmlzVmFsaWQoKSkKLSAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB3aGlsZSAoY29tcGFyZUluZGV4
S2V5cyhpdC0+a2V5KCksIHRhcmdldCkgPiAwKSB7Ci0gICAgICAgIGl0LT5wcmV2KCk7Ci0gICAg
ICAgIGlmICghaXQtPmlzVmFsaWQoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9
Ci0KLSAgICBkbyB7Ci0gICAgICAgIGZvdW5kS2V5LmNsZWFyKCk7Ci0gICAgICAgIGZvdW5kS2V5
LmFwcGVuZChpdC0+a2V5KCkuYmVnaW4oKSwgaXQtPmtleSgpLmVuZCgpIC0gaXQtPmtleSgpLmJl
Z2luKCkpOwotCi0gICAgICAgIC8vIFRoZXJlIGNhbiBiZSBzZXZlcmFsIGluZGV4IGtleXMgdGhh
dCBjb21wYXJlIGVxdWFsLiBXZSB3YW50IHRoZSBsYXN0IG9uZS4KLSAgICAgICAgaXQtPm5leHQo
KTsKLSAgICB9IHdoaWxlIChpdC0+aXNWYWxpZCgpICYmICFjb21wYXJlSW5kZXhLZXlzKGl0LT5r
ZXkoKSwgdGFyZ2V0KSk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBJREJMZXZlbERC
QmFja2luZ1N0b3JlOjpkZWxldGVJbmRleERhdGFGb3JSZWNvcmQoSURCQmFja2luZ1N0b3JlOjpU
cmFuc2FjdGlvbiosIGludDY0X3QsIGludDY0X3QsIGludDY0X3QsIGNvbnN0IE9iamVjdFN0b3Jl
UmVjb3JkSWRlbnRpZmllciopCi17Ci0gICAgLy8gRklYTUU6IFRoaXMgaXNuJ3QgbmVlZGVkIHNp
bmNlIHdlIGludmFsaWRhdGUgaW5kZXggZGF0YSB2aWEgdGhlIHZlcnNpb24gbnVtYmVyIG1lY2hh
bmlzbS4KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgdmVyc2lvbkV4aXN0cyhM
ZXZlbERCVHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0
X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCB2ZXJzaW9uLCBjb25zdCBWZWN0b3I8Y2hhcj4mIGVu
Y29kZWRQcmltYXJ5S2V5KQotewotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBrZXkgPSBFeGlzdHNF
bnRyeUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGVuY29kZWRQcmltYXJ5
S2V5KTsKLSAgICBWZWN0b3I8Y2hhcj4gZGF0YTsKLQotICAgIGlmICghdHJhbnNhY3Rpb24tPmdl
dChrZXksIGRhdGEpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gZGVjb2Rl
SW50KGRhdGEuYmVnaW4oKSwgZGF0YS5lbmQoKSkgPT0gdmVyc2lvbjsKLX0KLQotYm9vbCBJREJM
ZXZlbERCQmFja2luZ1N0b3JlOjpmaW5kS2V5SW5JbmRleChJREJCYWNraW5nU3RvcmU6OlRyYW5z
YWN0aW9uKiB0cmFuc2FjdGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0
b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JiBrZXksIFZlY3RvcjxjaGFyPiYg
Zm91bmRFbmNvZGVkUHJpbWFyeUtleSkKLXsKLSAgICBJREJfVFJBQ0UoIklEQkxldmVsREJCYWNr
aW5nU3RvcmU6OmZpbmRLZXlJbkluZGV4Iik7Ci0gICAgQVNTRVJUKGZvdW5kRW5jb2RlZFByaW1h
cnlLZXkuaXNFbXB0eSgpKTsKLQotICAgIExldmVsREJUcmFuc2FjdGlvbiogbGV2ZWxEQlRyYW5z
YWN0aW9uID0gVHJhbnNhY3Rpb246OmxldmVsREJUcmFuc2FjdGlvbkZyb20odHJhbnNhY3Rpb24p
OwotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBsZXZlbGRiS2V5ID0gSW5kZXhEYXRhS2V5OjplbmNv
ZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwga2V5KTsKLSAgICBPd25QdHI8
TGV2ZWxEQkl0ZXJhdG9yPiBpdCA9IGxldmVsREJUcmFuc2FjdGlvbi0+Y3JlYXRlSXRlcmF0b3Io
KTsKLSAgICBpdC0+c2VlayhsZXZlbGRiS2V5KTsKLQotICAgIGZvciAoOzspIHsKLSAgICAgICAg
aWYgKCFpdC0+aXNWYWxpZCgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBp
ZiAoY29tcGFyZUluZGV4S2V5cyhpdC0+a2V5KCksIGxldmVsZGJLZXkpID4gMCkKLSAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpbnQ2NF90IHZlcnNpb247Ci0gICAgICAgIGNv
bnN0IGNoYXIqIHAgPSBkZWNvZGVWYXJJbnQoaXQtPnZhbHVlKCkuYmVnaW4oKSwgaXQtPnZhbHVl
KCkuZW5kKCksIHZlcnNpb24pOwotICAgICAgICBpZiAoIXApIHsKLSAgICAgICAgICAgIEludGVy
bmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVJlYWRFcnJvcik7Ci0gICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZm91bmRFbmNvZGVkUHJpbWFyeUtleS5h
cHBlbmQocCwgaXQtPnZhbHVlKCkuZW5kKCkgLSBwKTsKLQotICAgICAgICBpZiAoIXZlcnNpb25F
eGlzdHMobGV2ZWxEQlRyYW5zYWN0aW9uLCBkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCB2ZXJz
aW9uLCBmb3VuZEVuY29kZWRQcmltYXJ5S2V5KSkgewotICAgICAgICAgICAgLy8gRGVsZXRlIHN0
YWxlIGluZGV4IGRhdGEgZW50cnkgYW5kIGNvbnRpbnVlLgotICAgICAgICAgICAgbGV2ZWxEQlRy
YW5zYWN0aW9uLT5yZW1vdmUoaXQtPmtleSgpKTsKLSAgICAgICAgICAgIGl0LT5uZXh0KCk7Ci0g
ICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwot
ICAgIH0KLX0KLQotUGFzc1JlZlB0cjxJREJLZXk+IElEQkxldmVsREJCYWNraW5nU3RvcmU6Omdl
dFByaW1hcnlLZXlWaWFJbmRleChJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uKiB0cmFuc2Fj
dGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3Qg
aW5kZXhJZCwgY29uc3QgSURCS2V5JiBrZXkpCi17Ci0gICAgSURCX1RSQUNFKCJJREJMZXZlbERC
QmFja2luZ1N0b3JlOjpnZXRQcmltYXJ5S2V5VmlhSW5kZXgiKTsKLQotICAgIFZlY3RvcjxjaGFy
PiBmb3VuZEVuY29kZWRQcmltYXJ5S2V5OwotICAgIGlmIChmaW5kS2V5SW5JbmRleCh0cmFuc2Fj
dGlvbiwgZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwga2V5LCBmb3VuZEVuY29k
ZWRQcmltYXJ5S2V5KSkgewotICAgICAgICBSZWZQdHI8SURCS2V5PiBwcmltYXJ5S2V5OwotICAg
ICAgICBkZWNvZGVJREJLZXkoZm91bmRFbmNvZGVkUHJpbWFyeUtleS5iZWdpbigpLCBmb3VuZEVu
Y29kZWRQcmltYXJ5S2V5LmVuZCgpLCBwcmltYXJ5S2V5KTsKLSAgICAgICAgcmV0dXJuIHByaW1h
cnlLZXkucmVsZWFzZSgpOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1ib29sIElEQkxl
dmVsREJCYWNraW5nU3RvcmU6OmtleUV4aXN0c0luSW5kZXgoSURCQmFja2luZ1N0b3JlOjpUcmFu
c2FjdGlvbiogdHJhbnNhY3Rpb24sIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RT
dG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYgaW5kZXhLZXksIFJlZlB0cjxJ
REJLZXk+JiBmb3VuZFByaW1hcnlLZXkpCi17Ci0gICAgSURCX1RSQUNFKCJJREJMZXZlbERCQmFj
a2luZ1N0b3JlOjprZXlFeGlzdHNJbkluZGV4Iik7Ci0KLSAgICBWZWN0b3I8Y2hhcj4gZm91bmRF
bmNvZGVkUHJpbWFyeUtleTsKLSAgICBpZiAoIWZpbmRLZXlJbkluZGV4KHRyYW5zYWN0aW9uLCBk
YXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBpbmRleEtleSwgZm91bmRFbmNvZGVk
UHJpbWFyeUtleSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGRlY29kZUlEQktleShm
b3VuZEVuY29kZWRQcmltYXJ5S2V5LmJlZ2luKCksIGZvdW5kRW5jb2RlZFByaW1hcnlLZXkuZW5k
KCksIGZvdW5kUHJpbWFyeUtleSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLW5hbWVzcGFjZSB7
Ci0KLXN0cnVjdCBDdXJzb3JPcHRpb25zIHsKLSAgICBWZWN0b3I8Y2hhcj4gbG93S2V5OwotICAg
IGJvb2wgbG93T3BlbjsKLSAgICBWZWN0b3I8Y2hhcj4gaGlnaEtleTsKLSAgICBib29sIGhpZ2hP
cGVuOwotICAgIGJvb2wgZm9yd2FyZDsKLSAgICBib29sIHVuaXF1ZTsKLX07Ci0KLWNsYXNzIEN1
cnNvckltcGxDb21tb24gOiBwdWJsaWMgSURCQmFja2luZ1N0b3JlOjpDdXJzb3IgewotcHVibGlj
OgotICAgIC8vIElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yCi0gICAgdmlydHVhbCBib29sIGFkdmFu
Y2UodW5zaWduZWQgbG9uZyk7Ci0gICAgdmlydHVhbCBib29sIGNvbnRpbnVlRnVuY3Rpb24oY29u
c3QgSURCS2V5KiA9IDAsIEl0ZXJhdG9yU3RhdGUgPSBTZWVrKTsKLSAgICB2aXJ0dWFsIFBhc3NS
ZWZQdHI8SURCS2V5PiBrZXkoKSB7IHJldHVybiBtX2N1cnJlbnRLZXk7IH0KLSAgICB2aXJ0dWFs
IFBhc3NSZWZQdHI8SURCS2V5PiBwcmltYXJ5S2V5KCkgeyByZXR1cm4gbV9jdXJyZW50S2V5OyB9
Ci0gICAgdmlydHVhbCBTdHJpbmcgdmFsdWUoKSA9IDA7Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRy
PElEQkJhY2tpbmdTdG9yZTo6T2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyPiBvYmplY3RTdG9y
ZVJlY29yZElkZW50aWZpZXIoKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIGNsb3NlKCkgeyB9Ci0K
LSAgICB2aXJ0dWFsIGJvb2wgbG9hZEN1cnJlbnRSb3coKSA9IDA7Ci0gICAgYm9vbCBmaXJzdFNl
ZWsoKTsKLQotcHJvdGVjdGVkOgotICAgIEN1cnNvckltcGxDb21tb24oTGV2ZWxEQlRyYW5zYWN0
aW9uKiB0cmFuc2FjdGlvbiwgY29uc3QgQ3Vyc29yT3B0aW9ucyYgY3Vyc29yT3B0aW9ucykKLSAg
ICAgICAgOiBtX3RyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKQotICAgICAgICAsIG1fY3Vyc29yT3B0
aW9ucyhjdXJzb3JPcHRpb25zKQotICAgIHsKLSAgICB9Ci0KLSAgICBDdXJzb3JJbXBsQ29tbW9u
KGNvbnN0IEN1cnNvckltcGxDb21tb24qIG90aGVyKQotICAgICAgICA6IG1fdHJhbnNhY3Rpb24o
b3RoZXItPm1fdHJhbnNhY3Rpb24pCi0gICAgICAgICwgbV9jdXJzb3JPcHRpb25zKG90aGVyLT5t
X2N1cnNvck9wdGlvbnMpCi0gICAgICAgICwgbV9jdXJyZW50S2V5KG90aGVyLT5tX2N1cnJlbnRL
ZXkpCi0gICAgewotICAgICAgICBpZiAob3RoZXItPm1faXRlcmF0b3IpIHsKLSAgICAgICAgICAg
IG1faXRlcmF0b3IgPSBtX3RyYW5zYWN0aW9uLT5jcmVhdGVJdGVyYXRvcigpOwotCi0gICAgICAg
ICAgICBpZiAob3RoZXItPm1faXRlcmF0b3ItPmlzVmFsaWQoKSkgewotICAgICAgICAgICAgICAg
IG1faXRlcmF0b3ItPnNlZWsob3RoZXItPm1faXRlcmF0b3ItPmtleSgpKTsKLSAgICAgICAgICAg
ICAgICBBU1NFUlQobV9pdGVyYXRvci0+aXNWYWxpZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgfQotICAgIH0KLQotICAgIHZpcnR1YWwgfkN1cnNvckltcGxDb21tb24oKSB7fQotCi0gICAg
Ym9vbCBpc1Bhc3RCb3VuZHMoKSBjb25zdDsKLSAgICBib29sIGhhdmVFbnRlcmVkUmFuZ2UoKSBj
b25zdDsKLQotICAgIExldmVsREJUcmFuc2FjdGlvbiogbV90cmFuc2FjdGlvbjsKLSAgICBDdXJz
b3JPcHRpb25zIG1fY3Vyc29yT3B0aW9uczsKLSAgICBPd25QdHI8TGV2ZWxEQkl0ZXJhdG9yPiBt
X2l0ZXJhdG9yOwotICAgIFJlZlB0cjxJREJLZXk+IG1fY3VycmVudEtleTsKLX07Ci0KLWJvb2wg
Q3Vyc29ySW1wbENvbW1vbjo6Zmlyc3RTZWVrKCkKLXsKLSAgICBtX2l0ZXJhdG9yID0gbV90cmFu
c2FjdGlvbi0+Y3JlYXRlSXRlcmF0b3IoKTsKLSAgICBpZiAobV9jdXJzb3JPcHRpb25zLmZvcndh
cmQpCi0gICAgICAgIG1faXRlcmF0b3ItPnNlZWsobV9jdXJzb3JPcHRpb25zLmxvd0tleSk7Ci0g
ICAgZWxzZQotICAgICAgICBtX2l0ZXJhdG9yLT5zZWVrKG1fY3Vyc29yT3B0aW9ucy5oaWdoS2V5
KTsKLQotICAgIHJldHVybiBjb250aW51ZUZ1bmN0aW9uKDAsIFJlYWR5KTsKLX0KLQotYm9vbCBD
dXJzb3JJbXBsQ29tbW9uOjphZHZhbmNlKHVuc2lnbmVkIGxvbmcgY291bnQpCi17Ci0gICAgd2hp
bGUgKGNvdW50LS0pIHsKLSAgICAgICAgaWYgKCFjb250aW51ZUZ1bmN0aW9uKCkpCi0gICAgICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIEN1
cnNvckltcGxDb21tb246OmNvbnRpbnVlRnVuY3Rpb24oY29uc3QgSURCS2V5KiBrZXksIEl0ZXJh
dG9yU3RhdGUgbmV4dFN0YXRlKQotewotICAgIFJlZlB0cjxJREJLZXk+IHByZXZpb3VzS2V5ID0g
bV9jdXJyZW50S2V5OwotCi0gICAgLy8gV2hlbiBpdGVyYXRpbmcgd2l0aCBQUkVWX05PX0RVUExJ
Q0FURSwgc3BlYyByZXF1aXJlcyB0aGF0IHRoZQotICAgIC8vIHZhbHVlIHdlIHlpZWxkIGZvciBl
YWNoIGtleSBpcyB0aGUgZmlyc3QgZHVwbGljYXRlIGluIGZvcndhcmRzCi0gICAgLy8gb3JkZXIu
Ci0gICAgUmVmUHRyPElEQktleT4gbGFzdER1cGxpY2F0ZUtleTsKLQotICAgIGJvb2wgZm9yd2Fy
ZCA9IG1fY3Vyc29yT3B0aW9ucy5mb3J3YXJkOwotCi0gICAgZm9yICg7OykgewotICAgICAgICBp
ZiAobmV4dFN0YXRlID09IFNlZWspIHsKLSAgICAgICAgICAgIGlmIChmb3J3YXJkKQotICAgICAg
ICAgICAgICAgIG1faXRlcmF0b3ItPm5leHQoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAg
ICAgICAgICBtX2l0ZXJhdG9yLT5wcmV2KCk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAg
bmV4dFN0YXRlID0gU2VlazsgLy8gZm9yIHN1YnNlcXVlbnQgaXRlcmF0aW9ucwotCi0gICAgICAg
IGlmICghbV9pdGVyYXRvci0+aXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICBpZiAoIWZvcndhcmQg
JiYgbGFzdER1cGxpY2F0ZUtleS5nZXQoKSkgewotICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQg
dG8gd2FsayBmb3J3YXJkIGJlY2F1c2Ugd2UgaGl0IHRoZSBlbmQgb2YKLSAgICAgICAgICAgICAg
ICAvLyB0aGUgZGF0YS4KLSAgICAgICAgICAgICAgICBmb3J3YXJkID0gdHJ1ZTsKLSAgICAgICAg
ICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzUGFzdEJvdW5kcygpKSB7Ci0gICAgICAg
ICAgICBpZiAoIWZvcndhcmQgJiYgbGFzdER1cGxpY2F0ZUtleS5nZXQoKSkgewotICAgICAgICAg
ICAgICAgIC8vIFdlIG5lZWQgdG8gd2FsayBmb3J3YXJkIGJlY2F1c2Ugbm93IHdlJ3JlIGJleW9u
ZCB0aGUKLSAgICAgICAgICAgICAgICAvLyBib3VuZHMgZGVmaW5lZCBieSB0aGUgY3Vyc29yLgot
ICAgICAgICAgICAgICAgIGZvcndhcmQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGNvbnRpbnVl
OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0K
LQotICAgICAgICBpZiAoIWhhdmVFbnRlcmVkUmFuZ2UoKSkKLSAgICAgICAgICAgIGNvbnRpbnVl
OwotCi0gICAgICAgIC8vIFRoZSByb3cgbWF5IG5vdCBsb2FkIGJlY2F1c2UgdGhlcmUncyBhIHN0
YWxlIGVudHJ5IGluIHRoZQotICAgICAgICAvLyBpbmRleC4gVGhpcyBpcyBub3QgZmF0YWwuCi0g
ICAgICAgIGlmICghbG9hZEN1cnJlbnRSb3coKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0g
ICAgICAgIGlmIChrZXkpIHsKLSAgICAgICAgICAgIGlmIChmb3J3YXJkKSB7Ci0gICAgICAgICAg
ICAgICAgaWYgKG1fY3VycmVudEtleS0+aXNMZXNzVGhhbihrZXkpKQotICAgICAgICAgICAgICAg
ICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYg
KGtleS0+aXNMZXNzVGhhbihtX2N1cnJlbnRLZXkuZ2V0KCkpKQotICAgICAgICAgICAgICAgICAg
ICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtX2N1
cnNvck9wdGlvbnMudW5pcXVlKSB7Ci0KLSAgICAgICAgICAgIGlmIChtX2N1cnJlbnRLZXktPmlz
RXF1YWwocHJldmlvdXNLZXkuZ2V0KCkpKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxk
IG5ldmVyIGJlIGFibGUgdG8gd2FsayBmb3J3YXJkIGFsbCB0aGUgd2F5Ci0gICAgICAgICAgICAg
ICAgLy8gdG8gdGhlIHByZXZpb3VzIGtleS4KLSAgICAgICAgICAgICAgICBBU1NFUlQoIWxhc3RE
dXBsaWNhdGVLZXkuZ2V0KCkpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAg
ICAgfQotCi0gICAgICAgICAgICBpZiAoIWZvcndhcmQpIHsKLSAgICAgICAgICAgICAgICBpZiAo
IWxhc3REdXBsaWNhdGVLZXkuZ2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbGFzdER1cGxp
Y2F0ZUtleSA9IG1fY3VycmVudEtleTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0g
ICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB3YWxrIGZv
cndhcmQgYmVjYXVzZSB3ZSBoaXQgdGhlIGJvdW5kYXJ5Ci0gICAgICAgICAgICAgICAgLy8gYmV0
d2VlbiBrZXkgcmFuZ2VzLgotICAgICAgICAgICAgICAgIGlmICghbGFzdER1cGxpY2F0ZUtleS0+
aXNFcXVhbChtX2N1cnJlbnRLZXkuZ2V0KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcndh
cmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAg
ICB9Ci0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
fQotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBBU1NFUlQoIWxhc3REdXBsaWNhdGVLZXku
Z2V0KCkgfHwgKGZvcndhcmQgJiYgbGFzdER1cGxpY2F0ZUtleS0+aXNFcXVhbChtX2N1cnJlbnRL
ZXkuZ2V0KCkpKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ3Vyc29ySW1wbENvbW1v
bjo6aGF2ZUVudGVyZWRSYW5nZSgpIGNvbnN0Ci17Ci0gICAgaWYgKG1fY3Vyc29yT3B0aW9ucy5m
b3J3YXJkKSB7Ci0gICAgICAgIGlmIChtX2N1cnNvck9wdGlvbnMubG93T3BlbikKLSAgICAgICAg
ICAgIHJldHVybiBjb21wYXJlSW5kZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2N1cnNvck9w
dGlvbnMubG93S2V5KSA+IDA7Ci0KLSAgICAgICAgcmV0dXJuIGNvbXBhcmVJbmRleEtleXMobV9p
dGVyYXRvci0+a2V5KCksIG1fY3Vyc29yT3B0aW9ucy5sb3dLZXkpID49IDA7Ci0gICAgfQotICAg
IGlmIChtX2N1cnNvck9wdGlvbnMuaGlnaE9wZW4pCi0gICAgICAgIHJldHVybiBjb21wYXJlSW5k
ZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2N1cnNvck9wdGlvbnMuaGlnaEtleSkgPCAwOwot
Ci0gICAgcmV0dXJuIGNvbXBhcmVJbmRleEtleXMobV9pdGVyYXRvci0+a2V5KCksIG1fY3Vyc29y
T3B0aW9ucy5oaWdoS2V5KSA8PSAwOwotfQotCi1ib29sIEN1cnNvckltcGxDb21tb246OmlzUGFz
dEJvdW5kcygpIGNvbnN0Ci17Ci0gICAgaWYgKG1fY3Vyc29yT3B0aW9ucy5mb3J3YXJkKSB7Ci0g
ICAgICAgIGlmIChtX2N1cnNvck9wdGlvbnMuaGlnaE9wZW4pCi0gICAgICAgICAgICByZXR1cm4g
Y29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9jdXJzb3JPcHRpb25zLmhpZ2hL
ZXkpID49IDA7Ci0gICAgICAgIHJldHVybiBjb21wYXJlSW5kZXhLZXlzKG1faXRlcmF0b3ItPmtl
eSgpLCBtX2N1cnNvck9wdGlvbnMuaGlnaEtleSkgPiAwOwotICAgIH0KLQotICAgIGlmIChtX2N1
cnNvck9wdGlvbnMubG93T3BlbikKLSAgICAgICAgcmV0dXJuIGNvbXBhcmVJbmRleEtleXMobV9p
dGVyYXRvci0+a2V5KCksIG1fY3Vyc29yT3B0aW9ucy5sb3dLZXkpIDw9IDA7Ci0gICAgcmV0dXJu
IGNvbXBhcmVJbmRleEtleXMobV9pdGVyYXRvci0+a2V5KCksIG1fY3Vyc29yT3B0aW9ucy5sb3dL
ZXkpIDwgMDsKLX0KLQotY2xhc3MgT2JqZWN0U3RvcmVLZXlDdXJzb3JJbXBsIDogcHVibGljIEN1
cnNvckltcGxDb21tb24gewotcHVibGljOgotICAgIHN0YXRpYyBQYXNzUmVmUHRyPE9iamVjdFN0
b3JlS2V5Q3Vyc29ySW1wbD4gY3JlYXRlKExldmVsREJUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24s
IGNvbnN0IEN1cnNvck9wdGlvbnMmIGN1cnNvck9wdGlvbnMpCi0gICAgewotICAgICAgICByZXR1
cm4gYWRvcHRSZWYobmV3IE9iamVjdFN0b3JlS2V5Q3Vyc29ySW1wbCh0cmFuc2FjdGlvbiwgY3Vy
c29yT3B0aW9ucykpOwotICAgIH0KLQotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJCYWNraW5n
U3RvcmU6OkN1cnNvcj4gY2xvbmUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5l
dyBPYmplY3RTdG9yZUtleUN1cnNvckltcGwodGhpcykpOwotICAgIH0KLQotICAgIC8vIEN1cnNv
ckltcGxDb21tb24KLSAgICB2aXJ0dWFsIFN0cmluZyB2YWx1ZSgpIHsgQVNTRVJUX05PVF9SRUFD
SEVEKCk7IHJldHVybiBTdHJpbmcoKTsgfQotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJCYWNr
aW5nU3RvcmU6Ok9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllcj4gb2JqZWN0U3RvcmVSZWNvcmRJ
ZGVudGlmaWVyKCkgT1ZFUlJJREUKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2lkZW50aWZpZXI7
Ci0gICAgfQotICAgIHZpcnR1YWwgYm9vbCBsb2FkQ3VycmVudFJvdygpOwotCi1wcml2YXRlOgot
ICAgIE9iamVjdFN0b3JlS2V5Q3Vyc29ySW1wbChMZXZlbERCVHJhbnNhY3Rpb24qIHRyYW5zYWN0
aW9uLCBjb25zdCBDdXJzb3JPcHRpb25zJiBjdXJzb3JPcHRpb25zKQotICAgICAgICA6IEN1cnNv
ckltcGxDb21tb24odHJhbnNhY3Rpb24sIGN1cnNvck9wdGlvbnMpCi0gICAgewotICAgIH0KLQot
ICAgIE9iamVjdFN0b3JlS2V5Q3Vyc29ySW1wbChjb25zdCBPYmplY3RTdG9yZUtleUN1cnNvcklt
cGwqIG90aGVyKQotICAgICAgICA6IEN1cnNvckltcGxDb21tb24ob3RoZXIpCi0gICAgewotICAg
IH0KLQotICAgIFJlZlB0cjxMZXZlbERCUmVjb3JkSWRlbnRpZmllcj4gbV9pZGVudGlmaWVyOwot
fTsKLQotYm9vbCBPYmplY3RTdG9yZUtleUN1cnNvckltcGw6OmxvYWRDdXJyZW50Um93KCkKLXsK
LSAgICBjb25zdCBjaGFyKiBrZXlQb3NpdGlvbiA9IG1faXRlcmF0b3ItPmtleSgpLmJlZ2luKCk7
Ci0gICAgY29uc3QgY2hhcioga2V5TGltaXQgPSBtX2l0ZXJhdG9yLT5rZXkoKS5lbmQoKTsKLQot
ICAgIE9iamVjdFN0b3JlRGF0YUtleSBvYmplY3RTdG9yZURhdGFLZXk7Ci0gICAga2V5UG9zaXRp
b24gPSBPYmplY3RTdG9yZURhdGFLZXk6OmRlY29kZShrZXlQb3NpdGlvbiwga2V5TGltaXQsICZv
YmplY3RTdG9yZURhdGFLZXkpOwotICAgIGlmICgha2V5UG9zaXRpb24pIHsKLSAgICAgICAgSW50
ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlUmVhZEVycm9yKTsKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgIH0KLQotICAgIG1fY3VycmVudEtleSA9IG9iamVjdFN0b3JlRGF0YUtl
eS51c2VyS2V5KCk7Ci0KLSAgICBpbnQ2NF90IHZlcnNpb247Ci0gICAgY29uc3QgY2hhciogdmFs
dWVQb3NpdGlvbiA9IGRlY29kZVZhckludChtX2l0ZXJhdG9yLT52YWx1ZSgpLmJlZ2luKCksIG1f
aXRlcmF0b3ItPnZhbHVlKCkuZW5kKCksIHZlcnNpb24pOwotICAgIGlmICghdmFsdWVQb3NpdGlv
bikgewotICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVSZWFkRXJy
b3IpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gRklYTUU6IFRoaXMg
cmUtZW5jb2RlcyB3aGF0IHdhcyBqdXN0IGRlY29kZWQ7IHRyeSBhbmQgb3B0aW1pemUuCi0gICAg
bV9pZGVudGlmaWVyID0gTGV2ZWxEQlJlY29yZElkZW50aWZpZXI6OmNyZWF0ZShlbmNvZGVJREJL
ZXkoKm1fY3VycmVudEtleSksIHZlcnNpb24pOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWNs
YXNzIE9iamVjdFN0b3JlQ3Vyc29ySW1wbCA6IHB1YmxpYyBDdXJzb3JJbXBsQ29tbW9uIHsKLXB1
YmxpYzoKLSAgICBzdGF0aWMgUGFzc1JlZlB0cjxPYmplY3RTdG9yZUN1cnNvckltcGw+IGNyZWF0
ZShMZXZlbERCVHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBjb25zdCBDdXJzb3JPcHRpb25zJiBj
dXJzb3JPcHRpb25zKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBPYmplY3RT
dG9yZUN1cnNvckltcGwodHJhbnNhY3Rpb24sIGN1cnNvck9wdGlvbnMpKTsKLSAgICB9Ci0KLSAg
ICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IGNsb25lKCkKLSAg
ICB7Ci0gICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgT2JqZWN0U3RvcmVDdXJzb3JJbXBsKHRo
aXMpKTsKLSAgICB9Ci0KLSAgICAvLyBDdXJzb3JJbXBsQ29tbW9uCi0gICAgdmlydHVhbCBTdHJp
bmcgdmFsdWUoKSB7IHJldHVybiBtX2N1cnJlbnRWYWx1ZTsgfQotICAgIHZpcnR1YWwgUGFzc1Jl
ZlB0cjxJREJCYWNraW5nU3RvcmU6Ok9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllcj4gb2JqZWN0
U3RvcmVSZWNvcmRJZGVudGlmaWVyKCkgT1ZFUlJJREUKLSAgICB7Ci0gICAgICAgIHJldHVybiBt
X2lkZW50aWZpZXI7Ci0gICAgfQotICAgIHZpcnR1YWwgYm9vbCBsb2FkQ3VycmVudFJvdygpOwot
Ci1wcml2YXRlOgotICAgIE9iamVjdFN0b3JlQ3Vyc29ySW1wbChMZXZlbERCVHJhbnNhY3Rpb24q
IHRyYW5zYWN0aW9uLCBjb25zdCBDdXJzb3JPcHRpb25zJiBjdXJzb3JPcHRpb25zKQotICAgICAg
ICA6IEN1cnNvckltcGxDb21tb24odHJhbnNhY3Rpb24sIGN1cnNvck9wdGlvbnMpCi0gICAgewot
ICAgIH0KLQotICAgIE9iamVjdFN0b3JlQ3Vyc29ySW1wbChjb25zdCBPYmplY3RTdG9yZUN1cnNv
ckltcGwqIG90aGVyKQotICAgICAgICA6IEN1cnNvckltcGxDb21tb24ob3RoZXIpCi0gICAgICAg
ICwgbV9jdXJyZW50VmFsdWUob3RoZXItPm1fY3VycmVudFZhbHVlKQotICAgIHsKLSAgICB9Ci0K
LSAgICBTdHJpbmcgbV9jdXJyZW50VmFsdWU7Ci0gICAgUmVmUHRyPExldmVsREJSZWNvcmRJZGVu
dGlmaWVyPiBtX2lkZW50aWZpZXI7Ci19OwotCi1ib29sIE9iamVjdFN0b3JlQ3Vyc29ySW1wbDo6
bG9hZEN1cnJlbnRSb3coKQotewotICAgIGNvbnN0IGNoYXIqIGtleVBvc2l0aW9uID0gbV9pdGVy
YXRvci0+a2V5KCkuYmVnaW4oKTsKLSAgICBjb25zdCBjaGFyKiBrZXlMaW1pdCA9IG1faXRlcmF0
b3ItPmtleSgpLmVuZCgpOwotCi0gICAgT2JqZWN0U3RvcmVEYXRhS2V5IG9iamVjdFN0b3JlRGF0
YUtleTsKLSAgICBrZXlQb3NpdGlvbiA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZGVjb2RlKGtleVBv
c2l0aW9uLCBrZXlMaW1pdCwgJm9iamVjdFN0b3JlRGF0YUtleSk7Ci0gICAgaWYgKCFrZXlQb3Np
dGlvbikgewotICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJCYWNraW5nU3RvcmVSZWFk
RXJyb3IpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgbV9jdXJyZW50S2V5
ID0gb2JqZWN0U3RvcmVEYXRhS2V5LnVzZXJLZXkoKTsKLQotICAgIGludDY0X3QgdmVyc2lvbjsK
LSAgICBjb25zdCBjaGFyKiB2YWx1ZVBvc2l0aW9uID0gZGVjb2RlVmFySW50KG1faXRlcmF0b3It
PnZhbHVlKCkuYmVnaW4oKSwgbV9pdGVyYXRvci0+dmFsdWUoKS5lbmQoKSwgdmVyc2lvbik7Ci0g
ICAgaWYgKCF2YWx1ZVBvc2l0aW9uKSB7Ci0gICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxE
QkJhY2tpbmdTdG9yZVJlYWRFcnJvcik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0K
LSAgICAvLyBGSVhNRTogVGhpcyByZS1lbmNvZGVzIHdoYXQgd2FzIGp1c3QgZGVjb2RlZDsgdHJ5
IGFuZCBvcHRpbWl6ZS4KLSAgICBtX2lkZW50aWZpZXIgPSBMZXZlbERCUmVjb3JkSWRlbnRpZmll
cjo6Y3JlYXRlKGVuY29kZUlEQktleSgqbV9jdXJyZW50S2V5KSwgdmVyc2lvbik7Ci0KLSAgICBt
X2N1cnJlbnRWYWx1ZSA9IGRlY29kZVN0cmluZyh2YWx1ZVBvc2l0aW9uLCBtX2l0ZXJhdG9yLT52
YWx1ZSgpLmVuZCgpKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1jbGFzcyBJbmRleEtleUN1
cnNvckltcGwgOiBwdWJsaWMgQ3Vyc29ySW1wbENvbW1vbiB7Ci1wdWJsaWM6Ci0gICAgc3RhdGlj
IFBhc3NSZWZQdHI8SW5kZXhLZXlDdXJzb3JJbXBsPiBjcmVhdGUoTGV2ZWxEQlRyYW5zYWN0aW9u
KiB0cmFuc2FjdGlvbiwgY29uc3QgQ3Vyc29yT3B0aW9ucyYgY3Vyc29yT3B0aW9ucykKLSAgICB7
Ci0gICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgSW5kZXhLZXlDdXJzb3JJbXBsKHRyYW5zYWN0
aW9uLCBjdXJzb3JPcHRpb25zKSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBQYXNzUmVmUHRyPElE
QkJhY2tpbmdTdG9yZTo6Q3Vyc29yPiBjbG9uZSgpCi0gICAgewotICAgICAgICByZXR1cm4gYWRv
cHRSZWYobmV3IEluZGV4S2V5Q3Vyc29ySW1wbCh0aGlzKSk7Ci0gICAgfQotCi0gICAgLy8gQ3Vy
c29ySW1wbENvbW1vbgotICAgIHZpcnR1YWwgU3RyaW5nIHZhbHVlKCkgeyBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsgcmV0dXJuIFN0cmluZygpOyB9Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQktl
eT4gcHJpbWFyeUtleSgpIHsgcmV0dXJuIG1fcHJpbWFyeUtleTsgfQotICAgIHZpcnR1YWwgUGFz
c1JlZlB0cjxJREJCYWNraW5nU3RvcmU6Ok9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllcj4gb2Jq
ZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyKCkgeyBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgcmV0dXJu
IDA7IH0KLSAgICB2aXJ0dWFsIGJvb2wgbG9hZEN1cnJlbnRSb3coKTsKLQotcHJpdmF0ZToKLSAg
ICBJbmRleEtleUN1cnNvckltcGwoTGV2ZWxEQlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgY29u
c3QgQ3Vyc29yT3B0aW9ucyYgY3Vyc29yT3B0aW9ucykKLSAgICAgICAgOiBDdXJzb3JJbXBsQ29t
bW9uKHRyYW5zYWN0aW9uLCBjdXJzb3JPcHRpb25zKQotICAgIHsKLSAgICB9Ci0KLSAgICBJbmRl
eEtleUN1cnNvckltcGwoY29uc3QgSW5kZXhLZXlDdXJzb3JJbXBsKiBvdGhlcikKLSAgICAgICAg
OiBDdXJzb3JJbXBsQ29tbW9uKG90aGVyKQotICAgICAgICAsIG1fcHJpbWFyeUtleShvdGhlci0+
bV9wcmltYXJ5S2V5KQotICAgIHsKLSAgICB9Ci0KLSAgICBSZWZQdHI8SURCS2V5PiBtX3ByaW1h
cnlLZXk7Ci19OwotCi1ib29sIEluZGV4S2V5Q3Vyc29ySW1wbDo6bG9hZEN1cnJlbnRSb3coKQot
ewotICAgIGNvbnN0IGNoYXIqIGtleVBvc2l0aW9uID0gbV9pdGVyYXRvci0+a2V5KCkuYmVnaW4o
KTsKLSAgICBjb25zdCBjaGFyKiBrZXlMaW1pdCA9IG1faXRlcmF0b3ItPmtleSgpLmVuZCgpOwot
Ci0gICAgSW5kZXhEYXRhS2V5IGluZGV4RGF0YUtleTsKLSAgICBrZXlQb3NpdGlvbiA9IEluZGV4
RGF0YUtleTo6ZGVjb2RlKGtleVBvc2l0aW9uLCBrZXlMaW1pdCwgJmluZGV4RGF0YUtleSk7Ci0K
LSAgICBtX2N1cnJlbnRLZXkgPSBpbmRleERhdGFLZXkudXNlcktleSgpOwotCi0gICAgaW50NjRf
dCBpbmRleERhdGFWZXJzaW9uOwotICAgIGNvbnN0IGNoYXIqIHZhbHVlUG9zaXRpb24gPSBkZWNv
ZGVWYXJJbnQobV9pdGVyYXRvci0+dmFsdWUoKS5iZWdpbigpLCBtX2l0ZXJhdG9yLT52YWx1ZSgp
LmVuZCgpLCBpbmRleERhdGFWZXJzaW9uKTsKLSAgICBpZiAoIXZhbHVlUG9zaXRpb24pIHsKLSAg
ICAgICAgSW50ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlUmVhZEVycm9yKTsKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZhbHVlUG9zaXRpb24gPSBkZWNvZGVJ
REJLZXkodmFsdWVQb3NpdGlvbiwgbV9pdGVyYXRvci0+dmFsdWUoKS5lbmQoKSwgbV9wcmltYXJ5
S2V5KTsKLSAgICBpZiAoIXZhbHVlUG9zaXRpb24pIHsKLSAgICAgICAgSW50ZXJuYWxFcnJvcihJ
REJMZXZlbERCQmFja2luZ1N0b3JlUmVhZEVycm9yKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgIH0KLQotICAgIFZlY3RvcjxjaGFyPiBwcmltYXJ5TGV2ZWxEQktleSA9IE9iamVjdFN0b3Jl
RGF0YUtleTo6ZW5jb2RlKGluZGV4RGF0YUtleS5kYXRhYmFzZUlkKCksIGluZGV4RGF0YUtleS5v
YmplY3RTdG9yZUlkKCksICptX3ByaW1hcnlLZXkpOwotCi0gICAgVmVjdG9yPGNoYXI+IHJlc3Vs
dDsKLSAgICBpZiAoIW1fdHJhbnNhY3Rpb24tPmdldChwcmltYXJ5TGV2ZWxEQktleSwgcmVzdWx0
KSkgewotICAgICAgICBtX3RyYW5zYWN0aW9uLT5yZW1vdmUobV9pdGVyYXRvci0+a2V5KCkpOwot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaW50NjRfdCBvYmplY3RTdG9yZURh
dGFWZXJzaW9uOwotICAgIGNvbnN0IGNoYXIqIHQgPSBkZWNvZGVWYXJJbnQocmVzdWx0LmJlZ2lu
KCksIHJlc3VsdC5lbmQoKSwgb2JqZWN0U3RvcmVEYXRhVmVyc2lvbik7Ci0gICAgaWYgKCF0KSB7
Ci0gICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVJlYWRFcnJvcik7
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAob2JqZWN0U3RvcmVEYXRh
VmVyc2lvbiAhPSBpbmRleERhdGFWZXJzaW9uKSB7Ci0gICAgICAgIG1fdHJhbnNhY3Rpb24tPnJl
bW92ZShtX2l0ZXJhdG9yLT5rZXkoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0K
LSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotY2xhc3MgSW5kZXhDdXJzb3JJbXBsIDogcHVibGljIEN1
cnNvckltcGxDb21tb24gewotcHVibGljOgotICAgIHN0YXRpYyBQYXNzUmVmUHRyPEluZGV4Q3Vy
c29ySW1wbD4gY3JlYXRlKExldmVsREJUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGNvbnN0IEN1
cnNvck9wdGlvbnMmIGN1cnNvck9wdGlvbnMpCi0gICAgewotICAgICAgICByZXR1cm4gYWRvcHRS
ZWYobmV3IEluZGV4Q3Vyc29ySW1wbCh0cmFuc2FjdGlvbiwgY3Vyc29yT3B0aW9ucykpOwotICAg
IH0KLQotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4gY2xv
bmUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBJbmRleEN1cnNvckltcGwo
dGhpcykpOwotICAgIH0KLQotICAgIC8vIEN1cnNvckltcGxDb21tb24KLSAgICB2aXJ0dWFsIFN0
cmluZyB2YWx1ZSgpIHsgcmV0dXJuIG1fdmFsdWU7IH0KLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8
SURCS2V5PiBwcmltYXJ5S2V5KCkgeyByZXR1cm4gbV9wcmltYXJ5S2V5OyB9Ci0gICAgdmlydHVh
bCBQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6T2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVy
PiBvYmplY3RTdG9yZVJlY29yZElkZW50aWZpZXIoKSB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyBy
ZXR1cm4gMDsgfQotICAgIGJvb2wgbG9hZEN1cnJlbnRSb3coKTsKLQotcHJpdmF0ZToKLSAgICBJ
bmRleEN1cnNvckltcGwoTGV2ZWxEQlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgY29uc3QgQ3Vy
c29yT3B0aW9ucyYgY3Vyc29yT3B0aW9ucykKLSAgICAgICAgOiBDdXJzb3JJbXBsQ29tbW9uKHRy
YW5zYWN0aW9uLCBjdXJzb3JPcHRpb25zKQotICAgIHsKLSAgICB9Ci0KLSAgICBJbmRleEN1cnNv
ckltcGwoY29uc3QgSW5kZXhDdXJzb3JJbXBsKiBvdGhlcikKLSAgICAgICAgOiBDdXJzb3JJbXBs
Q29tbW9uKG90aGVyKQotICAgICAgICAsIG1fcHJpbWFyeUtleShvdGhlci0+bV9wcmltYXJ5S2V5
KQotICAgICAgICAsIG1fdmFsdWUob3RoZXItPm1fdmFsdWUpCi0gICAgICAgICwgbV9wcmltYXJ5
TGV2ZWxEQktleShvdGhlci0+bV9wcmltYXJ5TGV2ZWxEQktleSkKLSAgICB7Ci0gICAgfQotCi0g
ICAgUmVmUHRyPElEQktleT4gbV9wcmltYXJ5S2V5OwotICAgIFN0cmluZyBtX3ZhbHVlOwotICAg
IFZlY3RvcjxjaGFyPiBtX3ByaW1hcnlMZXZlbERCS2V5OwotfTsKLQotYm9vbCBJbmRleEN1cnNv
ckltcGw6OmxvYWRDdXJyZW50Um93KCkKLXsKLSAgICBjb25zdCBjaGFyKiBrZXlQb3NpdGlvbiA9
IG1faXRlcmF0b3ItPmtleSgpLmJlZ2luKCk7Ci0gICAgY29uc3QgY2hhcioga2V5TGltaXQgPSBt
X2l0ZXJhdG9yLT5rZXkoKS5lbmQoKTsKLQotICAgIEluZGV4RGF0YUtleSBpbmRleERhdGFLZXk7
Ci0gICAga2V5UG9zaXRpb24gPSBJbmRleERhdGFLZXk6OmRlY29kZShrZXlQb3NpdGlvbiwga2V5
TGltaXQsICZpbmRleERhdGFLZXkpOwotCi0gICAgbV9jdXJyZW50S2V5ID0gaW5kZXhEYXRhS2V5
LnVzZXJLZXkoKTsKLQotICAgIGNvbnN0IGNoYXIqIHZhbHVlUG9zaXRpb24gPSBtX2l0ZXJhdG9y
LT52YWx1ZSgpLmJlZ2luKCk7Ci0gICAgY29uc3QgY2hhciogdmFsdWVMaW1pdCA9IG1faXRlcmF0
b3ItPnZhbHVlKCkuZW5kKCk7Ci0KLSAgICBpbnQ2NF90IGluZGV4RGF0YVZlcnNpb247Ci0gICAg
dmFsdWVQb3NpdGlvbiA9IGRlY29kZVZhckludCh2YWx1ZVBvc2l0aW9uLCB2YWx1ZUxpbWl0LCBp
bmRleERhdGFWZXJzaW9uKTsKLSAgICBpZiAoIXZhbHVlUG9zaXRpb24pIHsKLSAgICAgICAgSW50
ZXJuYWxFcnJvcihJREJMZXZlbERCQmFja2luZ1N0b3JlUmVhZEVycm9yKTsKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgIH0KLSAgICB2YWx1ZVBvc2l0aW9uID0gZGVjb2RlSURCS2V5KHZhbHVl
UG9zaXRpb24sIHZhbHVlTGltaXQsIG1fcHJpbWFyeUtleSk7Ci0gICAgaWYgKCF2YWx1ZVBvc2l0
aW9uKSB7Ci0gICAgICAgIEludGVybmFsRXJyb3IoSURCTGV2ZWxEQkJhY2tpbmdTdG9yZVJlYWRF
cnJvcik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBtX3ByaW1hcnlMZXZl
bERCS2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoaW5kZXhEYXRhS2V5LmRhdGFiYXNl
SWQoKSwgaW5kZXhEYXRhS2V5Lm9iamVjdFN0b3JlSWQoKSwgKm1fcHJpbWFyeUtleSk7Ci0KLSAg
ICBWZWN0b3I8Y2hhcj4gcmVzdWx0OwotICAgIGlmICghbV90cmFuc2FjdGlvbi0+Z2V0KG1fcHJp
bWFyeUxldmVsREJLZXksIHJlc3VsdCkpIHsKLSAgICAgICAgbV90cmFuc2FjdGlvbi0+cmVtb3Zl
KG1faXRlcmF0b3ItPmtleSgpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAg
IGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhVmVyc2lvbjsKLSAgICBjb25zdCBjaGFyKiB0ID0gZGVj
b2RlVmFySW50KHJlc3VsdC5iZWdpbigpLCByZXN1bHQuZW5kKCksIG9iamVjdFN0b3JlRGF0YVZl
cnNpb24pOwotICAgIGlmICghdCkgewotICAgICAgICBJbnRlcm5hbEVycm9yKElEQkxldmVsREJC
YWNraW5nU3RvcmVSZWFkRXJyb3IpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0g
ICAgaWYgKG9iamVjdFN0b3JlRGF0YVZlcnNpb24gIT0gaW5kZXhEYXRhVmVyc2lvbikgewotICAg
ICAgICBtX3RyYW5zYWN0aW9uLT5yZW1vdmUobV9pdGVyYXRvci0+a2V5KCkpOwotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgbV92YWx1ZSA9IGRlY29kZVN0cmluZyh0LCByZXN1
bHQuZW5kKCkpOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIG9iamVjdFN0b3JlQ3Vyc29y
T3B0aW9ucyhMZXZlbERCVHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNl
SWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5UmFuZ2UqIHJhbmdlLCBJREJD
dXJzb3I6OkRpcmVjdGlvbiBkaXJlY3Rpb24sIEN1cnNvck9wdGlvbnMmIGN1cnNvck9wdGlvbnMp
Ci17Ci0gICAgYm9vbCBsb3dlckJvdW5kID0gcmFuZ2UgJiYgcmFuZ2UtPmxvd2VyKCk7Ci0gICAg
Ym9vbCB1cHBlckJvdW5kID0gcmFuZ2UgJiYgcmFuZ2UtPnVwcGVyKCk7Ci0gICAgY3Vyc29yT3B0
aW9ucy5mb3J3YXJkID0gKGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFRfTk9fRFVQTElDQVRF
IHx8IGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFQpOwotICAgIGN1cnNvck9wdGlvbnMudW5p
cXVlID0gKGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFRfTk9fRFVQTElDQVRFIHx8IGRpcmVj
dGlvbiA9PSBJREJDdXJzb3I6OlBSRVZfTk9fRFVQTElDQVRFKTsKLQotICAgIGlmICghbG93ZXJC
b3VuZCkgewotICAgICAgICBjdXJzb3JPcHRpb25zLmxvd0tleSA9IE9iamVjdFN0b3JlRGF0YUtl
eTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIG1pbklEQktleSgpKTsKLSAgICAg
ICAgY3Vyc29yT3B0aW9ucy5sb3dPcGVuID0gdHJ1ZTsgLy8gTm90IGluY2x1ZGVkLgotICAgIH0g
ZWxzZSB7Ci0gICAgICAgIGN1cnNvck9wdGlvbnMubG93S2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5
OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgKnJhbmdlLT5sb3dlcigpKTsKLSAg
ICAgICAgY3Vyc29yT3B0aW9ucy5sb3dPcGVuID0gcmFuZ2UtPmxvd2VyT3BlbigpOwotICAgIH0K
LQotICAgIGlmICghdXBwZXJCb3VuZCkgewotICAgICAgICBjdXJzb3JPcHRpb25zLmhpZ2hLZXkg
PSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBt
YXhJREJLZXkoKSk7Ci0KLSAgICAgICAgaWYgKGN1cnNvck9wdGlvbnMuZm9yd2FyZCkKLSAgICAg
ICAgICAgIGN1cnNvck9wdGlvbnMuaGlnaE9wZW4gPSB0cnVlOyAvLyBOb3QgaW5jbHVkZWQuCi0g
ICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gV2UgbmVlZCBhIGtleSB0aGF0IGV4aXN0cy4K
LSAgICAgICAgICAgIGlmICghZmluZEdyZWF0ZXN0S2V5TGVzc1RoYW5PckVxdWFsKHRyYW5zYWN0
aW9uLCBjdXJzb3JPcHRpb25zLmhpZ2hLZXksIGN1cnNvck9wdGlvbnMuaGlnaEtleSkpCi0gICAg
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgY3Vyc29yT3B0aW9ucy5oaWdo
T3BlbiA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY3Vyc29yT3B0
aW9ucy5oaWdoS2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2Jq
ZWN0U3RvcmVJZCwgKnJhbmdlLT51cHBlcigpKTsKLSAgICAgICAgY3Vyc29yT3B0aW9ucy5oaWdo
T3BlbiA9IHJhbmdlLT51cHBlck9wZW4oKTsKLQotICAgICAgICBpZiAoIWN1cnNvck9wdGlvbnMu
Zm9yd2FyZCkgewotICAgICAgICAgICAgLy8gRm9yIHJldmVyc2UgY3Vyc29ycywgd2UgbmVlZCBh
IGtleSB0aGF0IGV4aXN0cy4KLSAgICAgICAgICAgIFZlY3RvcjxjaGFyPiBmb3VuZEhpZ2hLZXk7
Ci0gICAgICAgICAgICBpZiAoIWZpbmRHcmVhdGVzdEtleUxlc3NUaGFuT3JFcXVhbCh0cmFuc2Fj
dGlvbiwgY3Vyc29yT3B0aW9ucy5oaWdoS2V5LCBmb3VuZEhpZ2hLZXkpKQotICAgICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgLy8gSWYgdGhlIHRhcmdldCBrZXkgc2hv
dWxkIG5vdCBiZSBpbmNsdWRlZCwgYnV0IHdlIGVuZCB1cCB3aXRoIGEgc21hbGxlciBrZXksIHdl
IHNob3VsZCBpbmNsdWRlIHRoYXQuCi0gICAgICAgICAgICBpZiAoY3Vyc29yT3B0aW9ucy5oaWdo
T3BlbiAmJiBjb21wYXJlSW5kZXhLZXlzKGZvdW5kSGlnaEtleSwgY3Vyc29yT3B0aW9ucy5oaWdo
S2V5KSA8IDApCi0gICAgICAgICAgICAgICAgY3Vyc29yT3B0aW9ucy5oaWdoT3BlbiA9IGZhbHNl
OwotCi0gICAgICAgICAgICBjdXJzb3JPcHRpb25zLmhpZ2hLZXkgPSBmb3VuZEhpZ2hLZXk7Ci0g
ICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBpbmRleEN1cnNv
ck9wdGlvbnMoTGV2ZWxEQlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgaW50NjRfdCBkYXRhYmFz
ZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5
UmFuZ2UqIHJhbmdlLCBJREJDdXJzb3I6OkRpcmVjdGlvbiBkaXJlY3Rpb24sIEN1cnNvck9wdGlv
bnMmIGN1cnNvck9wdGlvbnMpCi17Ci0gICAgQVNTRVJUKHRyYW5zYWN0aW9uKTsKLSAgICBib29s
IGxvd2VyQm91bmQgPSByYW5nZSAmJiByYW5nZS0+bG93ZXIoKTsKLSAgICBib29sIHVwcGVyQm91
bmQgPSByYW5nZSAmJiByYW5nZS0+dXBwZXIoKTsKLSAgICBjdXJzb3JPcHRpb25zLmZvcndhcmQg
PSAoZGlyZWN0aW9uID09IElEQkN1cnNvcjo6TkVYVF9OT19EVVBMSUNBVEUgfHwgZGlyZWN0aW9u
ID09IElEQkN1cnNvcjo6TkVYVCk7Ci0gICAgY3Vyc29yT3B0aW9ucy51bmlxdWUgPSAoZGlyZWN0
aW9uID09IElEQkN1cnNvcjo6TkVYVF9OT19EVVBMSUNBVEUgfHwgZGlyZWN0aW9uID09IElEQkN1
cnNvcjo6UFJFVl9OT19EVVBMSUNBVEUpOwotCi0gICAgaWYgKCFsb3dlckJvdW5kKSB7Ci0gICAg
ICAgIGN1cnNvck9wdGlvbnMubG93S2V5ID0gSW5kZXhEYXRhS2V5OjplbmNvZGVNaW5LZXkoZGF0
YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCk7Ci0gICAgICAgIGN1cnNvck9wdGlvbnMu
bG93T3BlbiA9IGZhbHNlOyAvLyBJbmNsdWRlZC4KLSAgICB9IGVsc2UgewotICAgICAgICBjdXJz
b3JPcHRpb25zLmxvd0tleSA9IEluZGV4RGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVj
dFN0b3JlSWQsIGluZGV4SWQsICpyYW5nZS0+bG93ZXIoKSk7Ci0gICAgICAgIGN1cnNvck9wdGlv
bnMubG93T3BlbiA9IHJhbmdlLT5sb3dlck9wZW4oKTsKLSAgICB9Ci0KLSAgICBpZiAoIXVwcGVy
Qm91bmQpIHsKLSAgICAgICAgY3Vyc29yT3B0aW9ucy5oaWdoS2V5ID0gSW5kZXhEYXRhS2V5Ojpl
bmNvZGVNYXhLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCk7Ci0gICAgICAg
IGN1cnNvck9wdGlvbnMuaGlnaE9wZW4gPSBmYWxzZTsgLy8gSW5jbHVkZWQuCi0KLSAgICAgICAg
aWYgKCFjdXJzb3JPcHRpb25zLmZvcndhcmQpIHsgLy8gV2UgbmVlZCBhIGtleSB0aGF0IGV4aXN0
cy4KLSAgICAgICAgICAgIGlmICghZmluZEdyZWF0ZXN0S2V5TGVzc1RoYW5PckVxdWFsKHRyYW5z
YWN0aW9uLCBjdXJzb3JPcHRpb25zLmhpZ2hLZXksIGN1cnNvck9wdGlvbnMuaGlnaEtleSkpCi0g
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgY3Vyc29yT3B0aW9ucy5o
aWdoT3BlbiA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY3Vyc29y
T3B0aW9ucy5oaWdoS2V5ID0gSW5kZXhEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmVJZCwgaW5kZXhJZCwgKnJhbmdlLT51cHBlcigpKTsKLSAgICAgICAgY3Vyc29yT3B0aW9u
cy5oaWdoT3BlbiA9IHJhbmdlLT51cHBlck9wZW4oKTsKLQotICAgICAgICBWZWN0b3I8Y2hhcj4g
Zm91bmRIaWdoS2V5OwotICAgICAgICBpZiAoIWZpbmRHcmVhdGVzdEtleUxlc3NUaGFuT3JFcXVh
bCh0cmFuc2FjdGlvbiwgY3Vyc29yT3B0aW9ucy5oaWdoS2V5LCBmb3VuZEhpZ2hLZXkpKSAvLyBT
ZWVrIHRvIHRoZSAqbGFzdCoga2V5IGluIHRoZSBzZXQgb2Ygbm9uLXVuaXF1ZSBrZXlzLgotICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIC8vIElmIHRoZSB0YXJnZXQga2V5IHNo
b3VsZCBub3QgYmUgaW5jbHVkZWQsIGJ1dCB3ZSBlbmQgdXAgd2l0aCBhIHNtYWxsZXIga2V5LCB3
ZSBzaG91bGQgaW5jbHVkZSB0aGF0LgotICAgICAgICBpZiAoY3Vyc29yT3B0aW9ucy5oaWdoT3Bl
biAmJiBjb21wYXJlSW5kZXhLZXlzKGZvdW5kSGlnaEtleSwgY3Vyc29yT3B0aW9ucy5oaWdoS2V5
KSA8IDApCi0gICAgICAgICAgICBjdXJzb3JPcHRpb25zLmhpZ2hPcGVuID0gZmFsc2U7Ci0KLSAg
ICAgICAgY3Vyc29yT3B0aW9ucy5oaWdoS2V5ID0gZm91bmRIaWdoS2V5OwotICAgIH0KLQotICAg
IHJldHVybiB0cnVlOwotfQotCi19Ci0KLVBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJz
b3I+IElEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5PYmplY3RTdG9yZUN1cnNvcihJREJCYWNr
aW5nU3RvcmU6OlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBp
bnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleVJhbmdlKiByYW5nZSwgSURCQ3Vyc29y
OjpEaXJlY3Rpb24gZGlyZWN0aW9uKQotewotICAgIElEQl9UUkFDRSgiSURCTGV2ZWxEQkJhY2tp
bmdTdG9yZTo6b3Blbk9iamVjdFN0b3JlQ3Vyc29yIik7Ci0gICAgTGV2ZWxEQlRyYW5zYWN0aW9u
KiBsZXZlbERCVHJhbnNhY3Rpb24gPSBUcmFuc2FjdGlvbjo6bGV2ZWxEQlRyYW5zYWN0aW9uRnJv
bSh0cmFuc2FjdGlvbik7Ci0gICAgQ3Vyc29yT3B0aW9ucyBjdXJzb3JPcHRpb25zOwotICAgIGlm
ICghb2JqZWN0U3RvcmVDdXJzb3JPcHRpb25zKGxldmVsREJUcmFuc2FjdGlvbiwgZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCwgcmFuZ2UsIGRpcmVjdGlvbiwgY3Vyc29yT3B0aW9ucykpCi0gICAg
ICAgIHJldHVybiAwOwotICAgIFJlZlB0cjxPYmplY3RTdG9yZUN1cnNvckltcGw+IGN1cnNvciA9
IE9iamVjdFN0b3JlQ3Vyc29ySW1wbDo6Y3JlYXRlKGxldmVsREJUcmFuc2FjdGlvbiwgY3Vyc29y
T3B0aW9ucyk7Ci0gICAgaWYgKCFjdXJzb3ItPmZpcnN0U2VlaygpKQotICAgICAgICByZXR1cm4g
MDsKLQotICAgIHJldHVybiBjdXJzb3IucmVsZWFzZSgpOwotfQotCi1QYXNzUmVmUHRyPElEQkJh
Y2tpbmdTdG9yZTo6Q3Vyc29yPiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpvcGVuT2JqZWN0U3Rv
cmVLZXlDdXJzb3IoSURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGlu
dDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXlSYW5n
ZSogcmFuZ2UsIElEQkN1cnNvcjo6RGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLSAgICBJREJfVFJB
Q0UoIklEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5PYmplY3RTdG9yZUtleUN1cnNvciIpOwot
ICAgIExldmVsREJUcmFuc2FjdGlvbiogbGV2ZWxEQlRyYW5zYWN0aW9uID0gVHJhbnNhY3Rpb246
OmxldmVsREJUcmFuc2FjdGlvbkZyb20odHJhbnNhY3Rpb24pOwotICAgIEN1cnNvck9wdGlvbnMg
Y3Vyc29yT3B0aW9uczsKLSAgICBpZiAoIW9iamVjdFN0b3JlQ3Vyc29yT3B0aW9ucyhsZXZlbERC
VHJhbnNhY3Rpb24sIGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIHJhbmdlLCBkaXJlY3Rpb24s
IGN1cnNvck9wdGlvbnMpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBSZWZQdHI8T2JqZWN0U3Rv
cmVLZXlDdXJzb3JJbXBsPiBjdXJzb3IgPSBPYmplY3RTdG9yZUtleUN1cnNvckltcGw6OmNyZWF0
ZShsZXZlbERCVHJhbnNhY3Rpb24sIGN1cnNvck9wdGlvbnMpOwotICAgIGlmICghY3Vyc29yLT5m
aXJzdFNlZWsoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gY3Vyc29yLnJlbGVh
c2UoKTsKLX0KLQotUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4gSURCTGV2ZWxE
QkJhY2tpbmdTdG9yZTo6b3BlbkluZGV4S2V5Q3Vyc29yKElEQkJhY2tpbmdTdG9yZTo6VHJhbnNh
Y3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3Rv
cmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXlSYW5nZSogcmFuZ2UsIElEQkN1cnNv
cjo6RGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLSAgICBJREJfVFJBQ0UoIklEQkxldmVsREJCYWNr
aW5nU3RvcmU6Om9wZW5JbmRleEtleUN1cnNvciIpOwotICAgIExldmVsREJUcmFuc2FjdGlvbiog
bGV2ZWxEQlRyYW5zYWN0aW9uID0gVHJhbnNhY3Rpb246OmxldmVsREJUcmFuc2FjdGlvbkZyb20o
dHJhbnNhY3Rpb24pOwotICAgIEN1cnNvck9wdGlvbnMgY3Vyc29yT3B0aW9uczsKLSAgICBpZiAo
IWluZGV4Q3Vyc29yT3B0aW9ucyhsZXZlbERCVHJhbnNhY3Rpb24sIGRhdGFiYXNlSWQsIG9iamVj
dFN0b3JlSWQsIGluZGV4SWQsIHJhbmdlLCBkaXJlY3Rpb24sIGN1cnNvck9wdGlvbnMpKQotICAg
ICAgICByZXR1cm4gMDsKLSAgICBSZWZQdHI8SW5kZXhLZXlDdXJzb3JJbXBsPiBjdXJzb3IgPSBJ
bmRleEtleUN1cnNvckltcGw6OmNyZWF0ZShsZXZlbERCVHJhbnNhY3Rpb24sIGN1cnNvck9wdGlv
bnMpOwotICAgIGlmICghY3Vyc29yLT5maXJzdFNlZWsoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0K
LSAgICByZXR1cm4gY3Vyc29yLnJlbGVhc2UoKTsKLX0KLQotUGFzc1JlZlB0cjxJREJCYWNraW5n
U3RvcmU6OkN1cnNvcj4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3BlbkluZGV4Q3Vyc29yKElE
QkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNl
SWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXlS
YW5nZSogcmFuZ2UsIElEQkN1cnNvcjo6RGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLSAgICBJREJf
VFJBQ0UoIklEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5JbmRleEN1cnNvciIpOwotICAgIExl
dmVsREJUcmFuc2FjdGlvbiogbGV2ZWxEQlRyYW5zYWN0aW9uID0gVHJhbnNhY3Rpb246OmxldmVs
REJUcmFuc2FjdGlvbkZyb20odHJhbnNhY3Rpb24pOwotICAgIEN1cnNvck9wdGlvbnMgY3Vyc29y
T3B0aW9uczsKLSAgICBpZiAoIWluZGV4Q3Vyc29yT3B0aW9ucyhsZXZlbERCVHJhbnNhY3Rpb24s
IGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIHJhbmdlLCBkaXJlY3Rpb24sIGN1
cnNvck9wdGlvbnMpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBSZWZQdHI8SW5kZXhDdXJzb3JJ
bXBsPiBjdXJzb3IgPSBJbmRleEN1cnNvckltcGw6OmNyZWF0ZShsZXZlbERCVHJhbnNhY3Rpb24s
IGN1cnNvck9wdGlvbnMpOwotICAgIGlmICghY3Vyc29yLT5maXJzdFNlZWsoKSkKLSAgICAgICAg
cmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gY3Vyc29yLnJlbGVhc2UoKTsKLX0KLQotUGFzc1JlZlB0
cjxJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uPiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpj
cmVhdGVUcmFuc2FjdGlvbigpCi17Ci0gICAgcmV0dXJuIFRyYW5zYWN0aW9uOjpjcmVhdGUodGhp
cyk7Ci19Ci0KLVBhc3NSZWZQdHI8SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24+
IElEQkxldmVsREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uOjpjcmVhdGUoSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZSogYmFja2luZ1N0b3JlKQotewotICAgIHJldHVybiBhZG9wdFJlZihuZXcgVHJh
bnNhY3Rpb24oYmFja2luZ1N0b3JlKSk7Ci19Ci0KLUlEQkxldmVsREJCYWNraW5nU3RvcmU6OlRy
YW5zYWN0aW9uOjpUcmFuc2FjdGlvbihJREJMZXZlbERCQmFja2luZ1N0b3JlKiBiYWNraW5nU3Rv
cmUpCi0gICAgOiBtX2JhY2tpbmdTdG9yZShiYWNraW5nU3RvcmUpCi17Ci19Ci0KLXZvaWQgSURC
TGV2ZWxEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb246OmJlZ2luKCkKLXsKLSAgICBJREJfVFJB
Q0UoIklEQkxldmVsREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uOjpiZWdpbiIpOwotICAgIEFT
U0VSVCghbV90cmFuc2FjdGlvbik7Ci0gICAgbV90cmFuc2FjdGlvbiA9IExldmVsREJUcmFuc2Fj
dGlvbjo6Y3JlYXRlKG1fYmFja2luZ1N0b3JlLT5tX2RiLmdldCgpKTsKLX0KLQotYm9vbCBJREJM
ZXZlbERCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbjo6Y29tbWl0KCkKLXsKLSAgICBJREJfVFJB
Q0UoIklEQkxldmVsREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uOjpjb21taXQiKTsKLSAgICBB
U1NFUlQobV90cmFuc2FjdGlvbik7Ci0gICAgYm9vbCByZXN1bHQgPSBtX3RyYW5zYWN0aW9uLT5j
b21taXQoKTsKLSAgICBtX3RyYW5zYWN0aW9uLmNsZWFyKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsK
LX0KLQotdm9pZCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbjo6cm9sbGJhY2so
KQotewotICAgIElEQl9UUkFDRSgiSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb246
OnJvbGxiYWNrIik7Ci0gICAgQVNTRVJUKG1fdHJhbnNhY3Rpb24pOwotICAgIG1fdHJhbnNhY3Rp
b24tPnJvbGxiYWNrKCk7Ci0gICAgbV90cmFuc2FjdGlvbi5jbGVhcigpOwotfQotCi1ib29sIElE
QkxldmVsREJCYWNraW5nU3RvcmU6OmJhY2tpbmdTdG9yZUV4aXN0cyhTZWN1cml0eU9yaWdpbiog
c2VjdXJpdHlPcmlnaW4sIGNvbnN0IFN0cmluZyYsIGNvbnN0IFN0cmluZyYgcGF0aEJhc2VBcmcp
Ci17Ci0gICAgU3RyaW5nIHBhdGhCYXNlID0gcGF0aEJhc2VBcmc7Ci0KLSAgICBpZiAocGF0aEJh
c2UuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBGSVhNRTogV2Ug
c2hvdWxkIGV2ZW50dWFsbHkgdXNlIHRoZSBzYW1lIExldmVsREIgZGF0YWJhc2UgZm9yIGFsbCBv
cmlnaW5zLgotICAgIFN0cmluZyBwYXRoID0gcGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KHBhdGhC
YXNlLCBzZWN1cml0eU9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkgKyAiLmluZGV4ZWRkYi5s
ZXZlbGRiIik7Ci0KLSAgICAvLyBGSVhNRTogdGhpcyBpcyBjaGVja2luZyBmb3IgcHJlc2VuY2Ug
b2YgdGhlIGRvbWFpbiwgbm90IHRoZSBkYXRhYmFzZSBpdHNlbGYKLSAgICByZXR1cm4gZmlsZUV4
aXN0cyhwYXRoKyIvQ1VSUkVOVCIpOwotfQotCi19IC8vIG5hbWVzcGFjZSBXZWJDb3JlCi0KLSNl
bmRpZiAvLyBVU0UoTEVWRUxEQikKLSNlbmRpZiAvLyBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaSBiL1NvdXJjZS9XZWJDb3Jl
L1dlYkNvcmUuZ3lwaQppbmRleCBjYjQyNDI2MTgzMDYzZTRjODk1NGI4YWY4ZDZjNjhjMTI5NjRl
ZGU3Li4xMWMzMjc3MmI1YjBjMjQ1NmFmOWQzYWViZDRkZTQ5NzkzYTNiNzg0IDEwMDY0NAotLS0g
YS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkKKysrIGIvU291cmNlL1dlYkNvcmUvV2ViQ29y
ZS5neXBpCkBAIC0xNTQwLDggKzE1NDAsNyBAQAogICAgICAgICAgICAgJ01vZHVsZXMvaW5kZXhl
ZGRiL0lEQktleVJhbmdlLmgnLAogICAgICAgICAgICAgJ01vZHVsZXMvaW5kZXhlZGRiL0lEQkxl
dmVsREJDb2RpbmcuY3BwJywKICAgICAgICAgICAgICdNb2R1bGVzL2luZGV4ZWRkYi9JREJMZXZl
bERCQ29kaW5nLmgnLAotICAgICAgICAgICAgJ01vZHVsZXMvaW5kZXhlZGRiL0lEQkxldmVsREJC
YWNraW5nU3RvcmUuY3BwJywKLSAgICAgICAgICAgICdNb2R1bGVzL2luZGV4ZWRkYi9JREJMZXZl
bERCQmFja2luZ1N0b3JlLmgnLAorICAgICAgICAgICAgJ01vZHVsZXMvaW5kZXhlZGRiL0lEQkJh
Y2tpbmdTdG9yZS5jcHAnLAogICAgICAgICAgICAgJ01vZHVsZXMvaW5kZXhlZGRiL0lEQk1ldGFk
YXRhLmgnLAogICAgICAgICAgICAgJ01vZHVsZXMvaW5kZXhlZGRiL0lEQk9iamVjdFN0b3JlLmNw
cCcsCiAgICAgICAgICAgICAnTW9kdWxlcy9pbmRleGVkZGIvSURCT2JqZWN0U3RvcmUuaCcsCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHBy
b2ogYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKaW5k
ZXggN2ViYjI2NTRiOWI4NmNmMzVlMTBhOWU0OTU2OGQ5OGE4NzliZGJmMi4uNWFjYjczOTk0NmU1
ZWZkNWYwN2QwYzE5MWVlZmIyN2VlNWM3MjgwZiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUv
V2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCisrKyBiL1NvdXJjZS9XZWJDb3JlL1dl
YkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagpAQCAtMzQ3NCw3ICszNDc0LDcgQEAKIAkJ
OTcxMkE1REYxNTAwNEVEQTAwNDhBRjEwIC8qIElEQktleVBhdGguaCBpbiBIZWFkZXJzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDk3MTJBNTg2MTUwMDRFREEwMDQ4QUYxMCAv
KiBJREJLZXlQYXRoLmggKi87IH07CiAJCTk3MTJBNUUyMTUwMDRFREEwMDQ4QUYxMCAvKiBJREJL
ZXlSYW5nZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSA5NzEyQTU4OTE1MDA0RURBMDA0OEFGMTAgLyogSURCS2V5UmFuZ2UuY3BwICovOyB9OwogCQk5
NzEyQTVFMzE1MDA0RURBMDA0OEFGMTAgLyogSURCS2V5UmFuZ2UuaCBpbiBIZWFkZXJzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDk3MTJBNThBMTUwMDRFREEwMDQ4QUYxMCAv
KiBJREJLZXlSYW5nZS5oICovOyB9OwotCQk5NzEyQTVFNTE1MDA0RURBMDA0OEFGMTAgLyogSURC
TGV2ZWxEQkJhY2tpbmdTdG9yZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSA5NzEyQTU4QzE1MDA0RURBMDA0OEFGMTAgLyogSURCTGV2ZWxEQkJhY2tp
bmdTdG9yZS5jcHAgKi87IH07CisJCTk3MTJBNUU1MTUwMDRFREEwMDQ4QUYxMCAvKiBJREJCYWNr
aW5nU3RvcmUuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gOTcxMkE1OEMxNTAwNEVEQTAwNDhBRjEwIC8qIElEQkJhY2tpbmdTdG9yZS5jcHAgKi87IH07
CiAJCTk3MTJBNUU2MTUwMDRFREEwMDQ4QUYxMCAvKiBJREJMZXZlbERCQmFja2luZ1N0b3JlLmgg
aW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA5NzEyQTU4RDE1
MDA0RURBMDA0OEFGMTAgLyogSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5oICovOyB9OwogCQk5NzEy
QTVFNzE1MDA0RURBMDA0OEFGMTAgLyogSURCTGV2ZWxEQkNvZGluZy5jcHAgaW4gU291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA5NzEyQTU4RTE1MDA0RURBMDA0OEFG
MTAgLyogSURCTGV2ZWxEQkNvZGluZy5jcHAgKi87IH07CiAJCTk3MTJBNUU4MTUwMDRFREEwMDQ4
QUYxMCAvKiBJREJMZXZlbERCQ29kaW5nLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSA5NzEyQTU4RjE1MDA0RURBMDA0OEFGMTAgLyogSURCTGV2ZWxEQkNv
ZGluZy5oICovOyB9OwpAQCAtMTA3MDQsOCArMTA3MDQsOCBAQAogCQk5NzEyQTU4OTE1MDA0RURB
MDA0OEFGMTAgLyogSURCS2V5UmFuZ2UuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3Bw
OyBuYW1lID0gSURCS2V5UmFuZ2UuY3BwOyBwYXRoID0gTW9kdWxlcy9pbmRleGVkZGIvSURCS2V5
UmFuZ2UuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk5NzEyQTU4QTE1MDA0RURB
MDA0OEFGMTAgLyogSURCS2V5UmFuZ2UuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1l
ID0gSURCS2V5UmFuZ2UuaDsgcGF0aCA9IE1vZHVsZXMvaW5kZXhlZGRiL0lEQktleVJhbmdlLmg7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTk3MTJBNThCMTUwMDRFREEwMDQ4QUYxMCAv
KiBJREJLZXlSYW5nZS5pZGwgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBuYW1lID0gSURCS2V5UmFuZ2UuaWRs
OyBwYXRoID0gTW9kdWxlcy9pbmRleGVkZGIvSURCS2V5UmFuZ2UuaWRsOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwotCQk5NzEyQTU4QzE1MDA0RURBMDA0OEFGMTAgLyogSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IG5hbWUgPSBJREJM
ZXZlbERCQmFja2luZ1N0b3JlLmNwcDsgcGF0aCA9IE1vZHVsZXMvaW5kZXhlZGRiL0lEQkxldmVs
REJCYWNraW5nU3RvcmUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwotCQk5NzEyQTU4
RDE1MDA0RURBMDA0OEFGMTAgLyogSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5oICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jLmg7IG5hbWUgPSBJREJMZXZlbERCQmFja2luZ1N0b3JlLmg7IHBhdGggPSBN
b2R1bGVzL2luZGV4ZWRkYi9JREJMZXZlbERCQmFja2luZ1N0b3JlLmg7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CisJCTk3MTJBNThDMTUwMDRFREEwMDQ4QUYxMCAvKiBJREJCYWNraW5nU3Rv
cmUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBuYW1lID0gSURCQmFja2luZ1N0
b3JlLmNwcDsgcGF0aCA9IE1vZHVsZXMvaW5kZXhlZGRiL0lEQkJhY2tpbmdTdG9yZS5jcHA7IHNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTk3MTJBNThEMTUwMDRFREEwMDQ4QUYxMCAvKiBJ
REJCYWNraW5nU3RvcmUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gSURCTGV2
ZWxEQkJhY2tpbmdTdG9yZS5oOyBwYXRoID0gTW9kdWxlcy9pbmRleGVkZGIvSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk5NzEyQTU4RTE1MDA0
RURBMDA0OEFGMTAgLyogSURCTGV2ZWxEQkNvZGluZy5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmNwcC5jcHA7IG5hbWUgPSBJREJMZXZlbERCQ29kaW5nLmNwcDsgcGF0aCA9IE1vZHVsZXMvaW5k
ZXhlZGRiL0lEQkxldmVsREJDb2RpbmcuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9Owog
CQk5NzEyQTU4RjE1MDA0RURBMDA0OEFGMTAgLyogSURCTGV2ZWxEQkNvZGluZy5oICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBJREJMZXZlbERCQ29kaW5nLmg7IHBhdGggPSBNb2R1
bGVzL2luZGV4ZWRkYi9JREJMZXZlbERCQ29kaW5nLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IH07CiAJCTk3MTJBNTkwMTUwMDRFREEwMDQ4QUYxMCAvKiBJREJPYmplY3RTdG9yZS5jcHAgKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IG5hbWUgPSBJREJPYmplY3RTdG9yZS5jcHA7IHBh
dGggPSBNb2R1bGVzL2luZGV4ZWRkYi9JREJPYmplY3RTdG9yZS5jcHA7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CkBAIC0xNzg5Nyw3ICsxNzg5Nyw3IEBACiAJCQkJOTcxMkE1ODkxNTAwNEVE
QTAwNDhBRjEwIC8qIElEQktleVJhbmdlLmNwcCAqLywKIAkJCQk5NzEyQTU4QTE1MDA0RURBMDA0
OEFGMTAgLyogSURCS2V5UmFuZ2UuaCAqLywKIAkJCQk5NzEyQTU4QjE1MDA0RURBMDA0OEFGMTAg
LyogSURCS2V5UmFuZ2UuaWRsICovLAotCQkJCTk3MTJBNThDMTUwMDRFREEwMDQ4QUYxMCAvKiBJ
REJMZXZlbERCQmFja2luZ1N0b3JlLmNwcCAqLywKKwkJCQk5NzEyQTU4QzE1MDA0RURBMDA0OEFG
MTAgLyogSURCQmFja2luZ1N0b3JlLmNwcCAqLywKIAkJCQk5NzEyQTU4RDE1MDA0RURBMDA0OEFG
MTAgLyogSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5oICovLAogCQkJCTk3MTJBNThFMTUwMDRFREEw
MDQ4QUYxMCAvKiBJREJMZXZlbERCQ29kaW5nLmNwcCAqLywKIAkJCQk5NzEyQTU4RjE1MDA0RURB
MDA0OEFGMTAgLyogSURCTGV2ZWxEQkNvZGluZy5oICovLApAQCAtMjcwMjksNyArMjcwMjksNyBA
QAogCQkJCTk3MTJBNURCMTUwMDRFREEwMDQ4QUYxMCAvKiBJREJLZXkuY3BwIGluIFNvdXJjZXMg
Ki8sCiAJCQkJOTcxMkE1REUxNTAwNEVEQTAwNDhBRjEwIC8qIElEQktleVBhdGguY3BwIGluIFNv
dXJjZXMgKi8sCiAJCQkJOTcxMkE1RTIxNTAwNEVEQTAwNDhBRjEwIC8qIElEQktleVJhbmdlLmNw
cCBpbiBTb3VyY2VzICovLAotCQkJCTk3MTJBNUU1MTUwMDRFREEwMDQ4QUYxMCAvKiBJREJMZXZl
bERCQmFja2luZ1N0b3JlLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCTk3MTJBNUU1MTUwMDRFREEw
MDQ4QUYxMCAvKiBJREJCYWNraW5nU3RvcmUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJOTcxMkE1
RTcxNTAwNEVEQTAwNDhBRjEwIC8qIElEQkxldmVsREJDb2RpbmcuY3BwIGluIFNvdXJjZXMgKi8s
CiAJCQkJOTcxMkE1RTkxNTAwNEVEQTAwNDhBRjEwIC8qIElEQk9iamVjdFN0b3JlLmNwcCBpbiBT
b3VyY2VzICovLAogCQkJCTk3MTJBNUVDMTUwMDRFREEwMDQ4QUYxMCAvKiBJREJPYmplY3RTdG9y
ZUJhY2tlbmRJbXBsLmNwcCBpbiBTb3VyY2VzICovLAo=
</data>

          </attachment>
      

    </bug>

</bugzilla>