<?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>131102</bug_id>
          
          <creation_ts>2014-04-02 05:32:59 -0700</creation_ts>
          <short_desc>Split tile grid out from TileController</short_desc>
          <delta_ts>2014-04-03 00:08:51 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Layout and Rendering</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>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Antti Koivisto">koivisto</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>bfulgham</cc>
    
    <cc>sam</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>thorton</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>996674</commentid>
    <comment_count>0</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2014-04-02 05:32:59 -0700</bug_when>
    <thetext>Preparation for having multiple grids per TileController.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>996682</commentid>
    <comment_count>1</comment_count>
      <attachid>228390</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2014-04-02 06:23:10 -0700</bug_when>
    <thetext>Created attachment 228390
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>996710</commentid>
    <comment_count>2</comment_count>
      <attachid>228390</attachid>
    <who name="Anders Carlsson">andersca</who>
    <bug_when>2014-04-02 08:03:46 -0700</bug_when>
    <thetext>Comment on attachment 228390
patch

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

&gt; Source/WebCore/platform/graphics/ca/mac/TileController.h:2
&gt; + * Copyright (C) 2011-2014 Apple Inc. All rights reserved.

We have to explicitly list all copyright years.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>996722</commentid>
    <comment_count>3</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2014-04-02 08:44:22 -0700</bug_when>
    <thetext>&gt; We have to explicitly list all copyright years.

Nope: https://bugs.webkit.org/show_bug.cgi?id=129065#c3</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>996741</commentid>
    <comment_count>4</comment_count>
      <attachid>228390</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2014-04-02 10:06:16 -0700</bug_when>
    <thetext>Comment on attachment 228390
patch

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

&gt; Source/WebCore/platform/graphics/ca/mac/TileController.h:88
&gt; +    // Public for TileGrid
&gt; +    bool isInWindow() const { return m_isInWindow; }

I would prefer using friend class for this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>996757</commentid>
    <comment_count>5</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2014-04-02 11:32:28 -0700</bug_when>
    <thetext>https://trac.webkit.org/r166654</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>996784</commentid>
    <comment_count>6</comment_count>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2014-04-02 12:28:39 -0700</bug_when>
    <thetext>This broke Mountain Lion and Mavericks tests.  E.g.,

-          (tile cache coverage 0, 0 800 x 1024)
+          (tile cache coverage -2147483648, -2147483648 -2147483648 x -2147483648)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>996794</commentid>
    <comment_count>7</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2014-04-02 12:53:46 -0700</bug_when>
    <thetext>and https://trac.webkit.org/r166659</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>996939</commentid>
    <comment_count>8</comment_count>
    <who name="Tim Horton">thorton</who>
    <bug_when>2014-04-02 17:36:23 -0700</bug_when>
    <thetext>Should this be closed?</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>228390</attachid>
            <date>2014-04-02 06:23:10 -0700</date>
            <delta_ts>2014-04-02 10:06:16 -0700</delta_ts>
            <desc>patch</desc>
            <filename>tile-grid-4.patch</filename>
            <type>text/plain</type>
            <size>143384</size>
            <attacher name="Antti Koivisto">koivisto</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE2NjYzOSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEzIEBACisyMDE0LTA0LTAyICBBbnR0aSBL
b2l2aXN0byAgPGFudHRpQGFwcGxlLmNvbT4KKworICAgICAgICBTcGxpdCB0aWxlIGdyaWQgb3V0
IGZyb20gVGlsZUNvbnRyb2xsZXIKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTEzMTEwMgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEp
LgorCisgICAgICAgIEFkZCBhIFRpbGVHcmlkIGNsYXNzIHRoYXQgZW5jYXBzdWxhdGVzIHRpbGVz
LCB6b29tIGxldmVsIGFuZCByZWxhdGVkIG1ldGFkYXRhLgorICAgICAgICBUaGlzIHdpbGwgbWFr
ZSBpdCBwb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlIGdyaWRzIHBlciBUaWxlQ29udHJvbGxlciBs
YXRlci4KKwogMjAxNC0wNC0wMiAgSW9uIFJvc2NhICA8cm9zY2FAYWRvYmUuY29tPgogCiAgICAg
ICAgIFtDU1MgQmxlbmRpbmddIENvbXBvc2l0aW5nIHJlcXVpcmVtZW50cyBmb3IgYmxlbmRpbmcg
YXJlIG5vdCBjb21wdXRlZCBjb3JyZWN0bHkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUu
ZXhwLmluCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZXhwLmluCShyZXZp
c2lvbiAxNjY1NzUpCisrKyBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmV4cC5pbgkod29ya2luZyBj
b3B5KQpAQCAtNDMwLDYgKzQzMCw3IEBAIF9fWk43V2ViQ29yZTE0U3RvcmFnZVRyYWNrZXI3b3Jp
Z2luc0VSTjMKIF9fWk43V2ViQ29yZTE0U3RvcmFnZVRyYWNrZXI3dHJhY2tlckV2CiBfX1pON1dl
YkNvcmUxNFN1YmZyYW1lTG9hZGVyMTJhbGxvd1BsdWdpbnNFTlNfMjhSZWFzb25Gb3JDYWxsaW5n
QWxsb3dQbHVnaW5zRQogX19aTjdXZWJDb3JlMTRUaWxlQ29udHJvbGxlcjE0c2V0VGlsZXNPcGFx
dWVFYgorX19aTjdXZWJDb3JlMTRUaWxlQ29udHJvbGxlcjE1Y29udGFpbmVyTGF5ZXJzRXYKIF9f
Wk43V2ViQ29yZTE0VGlsZUNvbnRyb2xsZXIxNXNldE5lZWRzRGlzcGxheUV2CiBfX1pON1dlYkNv
cmUxNFRpbGVDb250cm9sbGVyMjFzZXRBY2NlbGVyYXRlc0RyYXdpbmdFYgogX19aTjdXZWJDb3Jl
MTRUaWxlQ29udHJvbGxlcjIxc2V0TmVlZHNEaXNwbGF5SW5SZWN0RVJLTlNfN0ludFJlY3RFCklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhw
cm9qCShyZXZpc2lvbiAxNjY1NzUpCisrKyBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJv
ai9wcm9qZWN0LnBieHByb2oJKHdvcmtpbmcgY29weSkKQEAgLTYwNjgsNiArNjA2OCw4IEBACiAJ
CUU0QkJFRDREMTRGQ0RCQTEwMDNGMEI5OCAvKiBTdHlsZVJ1bGUuaCBpbiBIZWFkZXJzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEU0QkJFRDRCMTRGQ0RCQTEwMDNGMEI5OCAv
KiBTdHlsZVJ1bGUuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9
OyB9OwogCQlFNEMxNzg5QTBFRTY5MDM4MDA4MjRENjkgLyogQ1NTU2VsZWN0b3JMaXN0LmNwcCBp
biBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEU0QzE3ODk1MEVF
NjkwMzgwMDgyNEQ2OSAvKiBDU1NTZWxlY3Rvckxpc3QuY3BwICovOyB9OwogCQlFNEMxNzg5QjBF
RTY5MDM4MDA4MjRENjkgLyogQ1NTU2VsZWN0b3JMaXN0LmggaW4gSGVhZGVycyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFNEMxNzg5NjBFRTY5MDM4MDA4MjRENjkgLyogQ1NT
U2VsZWN0b3JMaXN0LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsg
fTsgfTsKKwkJRTRDMjc0Q0ExOEU5ODhFQTAwNjAyQzc2IC8qIFRpbGVHcmlkLm1tIGluIFNvdXJj
ZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTRDMjc0QzkxOEU5ODhFQTAw
NjAyQzc2IC8qIFRpbGVHcmlkLm1tICovOyB9OworCQlFNEMyNzRDQzE4RTk4OEY1MDA2MDJDNzYg
LyogVGlsZUdyaWQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IEU0QzI3NENCMThFOTg4RjUwMDYwMkM3NiAvKiBUaWxlR3JpZC5oICovOyB9OwogCQlFNEMy
Nzk1ODBDRjk3NDE5MDBFOTdCOTggLyogUmVuZGVyTWVkaWEuY3BwIGluIFNvdXJjZXMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTRDMjc5NTYwQ0Y5NzQxOTAwRTk3Qjk4IC8q
IFJlbmRlck1lZGlhLmNwcCAqLzsgfTsKIAkJRTRDMjc5NTkwQ0Y5NzQxOTAwRTk3Qjk4IC8qIFJl
bmRlck1lZGlhLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSBFNEMyNzk1NzBDRjk3NDE5MDBFOTdCOTggLyogUmVuZGVyTWVkaWEuaCAqLzsgfTsKIAkJRTRD
M0IxRkEwRjBFNDE2MTAwOTY5M0Y2IC8qIExlZ2FjeVRpbGVDYWNoZS5oIGluIEhlYWRlcnMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTRDM0IxRjkwRjBFNDE2MTAwOTY5M0Y2
IC8qIExlZ2FjeVRpbGVDYWNoZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZh
dGUsICk7IH07IH07CkBAIC0xMzQ2OCw2ICsxMzQ3MCw4IEBACiAJCUU0QkJFRDRCMTRGQ0RCQTEw
MDNGMEI5OCAvKiBTdHlsZVJ1bGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0g
U3R5bGVSdWxlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUU0QzE3ODk1MEVFNjkw
MzgwMDgyNEQ2OSAvKiBDU1NTZWxlY3Rvckxpc3QuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
cHAuY3BwOyBwYXRoID0gQ1NTU2VsZWN0b3JMaXN0LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKIAkJRTRDMTc4OTYwRUU2OTAzODAwODI0RDY5IC8qIENTU1NlbGVjdG9yTGlzdC5oICov
ID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZp
bGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBDU1NTZWxlY3Rvckxpc3QuaDsgc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRTRDMjc0QzkxOEU5ODhFQTAwNjAyQzc2IC8qIFRpbGVH
cmlkLm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBuYW1lID0gVGlsZUdyaWQu
bW07IHBhdGggPSBjYS9tYWMvVGlsZUdyaWQubW07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CisJCUU0QzI3NENCMThFOTg4RjUwMDYwMkM3NiAvKiBUaWxlR3JpZC5oICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jLmg7IG5hbWUgPSBUaWxlR3JpZC5oOyBwYXRoID0gY2EvbWFjL1RpbGVHcmlkLmg7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUU0QzI3OTU2MENGOTc0MTkwMEU5N0I5OCAv
KiBSZW5kZXJNZWRpYS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBS
ZW5kZXJNZWRpYS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUU0QzI3OTU3MENG
OTc0MTkwMEU5N0I5OCAvKiBSZW5kZXJNZWRpYS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7
IHBhdGggPSBSZW5kZXJNZWRpYS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlFNEMz
QjFGOTBGMEU0MTYxMDA5NjkzRjYgLyogTGVnYWN5VGlsZUNhY2hlLmggKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmMuaDsgbmFtZSA9IExlZ2FjeVRpbGVDYWNoZS5oOyBwYXRoID0gaW9zL0xlZ2FjeVRp
bGVDYWNoZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtMTU2MDUsNiArMTU2MDks
OCBAQAogCQkJCTQ5NTg3ODIwMTJBNTdEREYwMDcyMzhBQyAvKiBQbGF0Zm9ybUNBTGF5ZXJNYWMu
bW0gKi8sCiAJCQkJMUFBNzE2MDkxNDlCQzREQjAwMTZFQzE5IC8qIFRpbGVDb250cm9sbGVyLmgg
Ki8sCiAJCQkJMUFBNzE2MDgxNDlCQzREQTAwMTZFQzE5IC8qIFRpbGVDb250cm9sbGVyLm1tICov
LAorCQkJCUU0QzI3NENCMThFOTg4RjUwMDYwMkM3NiAvKiBUaWxlR3JpZC5oICovLAorCQkJCUU0
QzI3NEM5MThFOTg4RUEwMDYwMkM3NiAvKiBUaWxlR3JpZC5tbSAqLywKIAkJCQkwRjU4MEZBMTE0
OTY5MzkxMDBGQjVCRDggLyogV2ViVGlsZWRCYWNraW5nTGF5ZXIuaCAqLywKIAkJCQkwRjU4MEZB
MjE0OTY5MzkxMDBGQjVCRDggLyogV2ViVGlsZWRCYWNraW5nTGF5ZXIubW0gKi8sCiAJCQkpOwpA
QCAtMjQ0NDIsNiArMjQ0NDgsNyBAQAogCQkJCUM1ODVBNjhEMTFENEZCMDgwMDRDM0U0QiAvKiBK
U0lEQktleVJhbmdlLmggaW4gSGVhZGVycyAqLywKIAkJCQlDNTg1QTY4RjExRDRGQjA4MDA0QzNF
NEIgLyogSlNJREJPYmplY3RTdG9yZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQzU4NUE2OTExMUQ0
RkIwODAwNEMzRTRCIC8qIEpTSURCUmVxdWVzdC5oIGluIEhlYWRlcnMgKi8sCisJCQkJRTRDMjc0
Q0MxOEU5ODhGNTAwNjAyQzc2IC8qIFRpbGVHcmlkLmggaW4gSGVhZGVycyAqLywKIAkJCQlCNjU2
NjI3MDEyMEIxMjI3MDA2RUE4NUMgLyogSlNJREJUcmFuc2FjdGlvbi5oIGluIEhlYWRlcnMgKi8s
CiAJCQkJMjY5MjM5OTYxNTA1RTFBQTAwOUU1N0ZDIC8qIEpTSURCVmVyc2lvbkNoYW5nZUV2ZW50
LmggaW4gSGVhZGVycyAqLywKIAkJCQlCQzZDNDlGNDBEN0RCQTA1MDBGRkE1NTggLyogSlNJbWFn
ZUNvbnN0cnVjdG9yLmggaW4gSGVhZGVycyAqLywKQEAgLTI4MjE2LDYgKzI4MjIzLDcgQEAKIAkJ
CQk1MTZCQjc5NDBDRTkxRTY4MDA1MTJGNzkgLyogSlNUcmVlV2Fsa2VyQ3VzdG9tLmNwcCBpbiBT
b3VyY2VzICovLAogCQkJCUE4NjYyOUQwMDlEQTJCNDgwMDk2MzNBNSAvKiBKU1VJRXZlbnQuY3Bw
IGluIFNvdXJjZXMgKi8sCiAJCQkJQUFBNEZBRDMxNzVENUNCMzAwNzQzODczIC8qIEpTVUlSZXF1
ZXN0RXZlbnQuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJRTRDMjc0Q0ExOEU5ODhFQTAwNjAyQzc2
IC8qIFRpbGVHcmlkLm1tIGluIFNvdXJjZXMgKi8sCiAJCQkJMTVDNzcwOTQxMDBEM0NBODAwNUJB
MjY3IC8qIEpTVmFsaWRpdHlTdGF0ZS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlDREU4M0RCNjE4
M0QzNTJBMDAzMUVBQTMgLyogSlNWaWRlb1BsYXliYWNrUXVhbGl0eS5jcHAgaW4gU291cmNlcyAq
LywKIAkJCQkwN0M1OUI1RjE3RjRCMjA4MDAwRkJDQkIgLyogSlNWaWRlb1N0cmVhbVRyYWNrLmNw
cCBpbiBTb3VyY2VzICovLApJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Y2EvbWFjL1BsYXRmb3JtQ0FMYXllck1hYy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2NhL21hYy9QbGF0Zm9ybUNBTGF5ZXJNYWMuaAkocmV2aXNpb24g
MTY2NTc1KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2EvbWFjL1BsYXRm
b3JtQ0FMYXllck1hYy5oCSh3b3JraW5nIGNvcHkpCkBAIC0xNTgsNyArMTU4LDcgQEAgcHJpdmF0
ZToKICAgICBib29sIHJlcXVpcmVzQ3VzdG9tQXBwZWFyYW5jZVVwZGF0ZU9uQm91bmRzQ2hhbmdl
KCkgY29uc3Q7CiAKICAgICBSZXRhaW5QdHI8TlNPYmplY3Q+IG1fZGVsZWdhdGU7Ci0gICAgT3du
UHRyPFBsYXRmb3JtQ0FMYXllckxpc3Q+IG1fY3VzdG9tU3VibGF5ZXJzOworICAgIHN0ZDo6dW5p
cXVlX3B0cjxQbGF0Zm9ybUNBTGF5ZXJMaXN0PiBtX2N1c3RvbVN1YmxheWVyczsKICAgICBHcmFw
aGljc0xheWVyOjpDdXN0b21BcHBlYXJhbmNlIG1fY3VzdG9tQXBwZWFyYW5jZTsKICAgICBHcmFw
aGljc0xheWVyOjpDdXN0b21CZWhhdmlvciBtX2N1c3RvbUJlaGF2aW9yOwogfTsKSW5kZXg6IFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhL21hYy9QbGF0Zm9ybUNBTGF5ZXJNYWMu
bW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2EvbWFj
L1BsYXRmb3JtQ0FMYXllck1hYy5tbQkocmV2aXNpb24gMTY2NTc1KQorKysgU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2EvbWFjL1BsYXRmb3JtQ0FMYXllck1hYy5tbQkod29ya2lu
ZyBjb3B5KQpAQCAtMjMwLDkgKzIzMCw3IEBAIHZvaWQgUGxhdGZvcm1DQUxheWVyTWFjOjpjb21t
b25Jbml0KCkKICAgICAgICAgV2ViVGlsZWRCYWNraW5nTGF5ZXIqIHRpbGVkQmFja2luZ0xheWVy
ID0gc3RhdGljX2Nhc3Q8V2ViVGlsZWRCYWNraW5nTGF5ZXIqPihtX2xheWVyLmdldCgpKTsKICAg
ICAgICAgVGlsZUNvbnRyb2xsZXIqIHRpbGVDb250cm9sbGVyID0gW3RpbGVkQmFja2luZ0xheWVy
IGNyZWF0ZVRpbGVDb250cm9sbGVyOnRoaXNdOwogCi0gICAgICAgIG1fY3VzdG9tU3VibGF5ZXJz
ID0gYWRvcHRQdHIobmV3IFBsYXRmb3JtQ0FMYXllckxpc3QoMSkpOwotICAgICAgICBQbGF0Zm9y
bUNBTGF5ZXIqIHRpbGVDYWNoZVRpbGVDb250YWluZXJMYXllciA9IHRpbGVDb250cm9sbGVyLT50
aWxlQ29udGFpbmVyTGF5ZXIoKTsKLSAgICAgICAgKCptX2N1c3RvbVN1YmxheWVycylbMF0gPSB0
aWxlQ2FjaGVUaWxlQ29udGFpbmVyTGF5ZXI7CisgICAgICAgIG1fY3VzdG9tU3VibGF5ZXJzID0g
c3RkOjptYWtlX3VuaXF1ZTxQbGF0Zm9ybUNBTGF5ZXJMaXN0Pih0aWxlQ29udHJvbGxlci0+Y29u
dGFpbmVyTGF5ZXJzKCkpOwogICAgIH0KIAogICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElPTlMK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhL21hYy9UaWxlQ29udHJv
bGxlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nh
L21hYy9UaWxlQ29udHJvbGxlci5oCShyZXZpc2lvbiAxNjY1NzUpCisrKyBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9jYS9tYWMvVGlsZUNvbnRyb2xsZXIuaAkod29ya2luZyBjb3B5
KQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTIsIDIwMTMg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDExLTIw
MTQgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCkBAIC0yNyw3ICsyNyw2IEBACiAjZGVmaW5lIFRpbGVDb250cm9sbGVyX2gKIAog
I2luY2x1ZGUgIkZsb2F0UmVjdC5oIgotI2luY2x1ZGUgIkludFBvaW50SGFzaC5oIgogI2luY2x1
ZGUgIkludFJlY3QuaCIKICNpbmNsdWRlICJQbGF0Zm9ybUNBTGF5ZXIuaCIKICNpbmNsdWRlICJQ
bGF0Zm9ybUNBTGF5ZXJDbGllbnQuaCIKQEAgLTQ0LDEwICs0MywxMSBAQCBuYW1lc3BhY2UgV2Vi
Q29yZSB7CiBjbGFzcyBGbG9hdFJlY3Q7CiBjbGFzcyBJbnRQb2ludDsKIGNsYXNzIEludFJlY3Q7
CitjbGFzcyBUaWxlR3JpZDsKIAogdHlwZWRlZiBWZWN0b3I8UmV0YWluUHRyPFBsYXRmb3JtTGF5
ZXI+PiBQbGF0Zm9ybUxheWVyTGlzdDsKIAotY2xhc3MgVGlsZUNvbnRyb2xsZXIgOiBwdWJsaWMg
VGlsZWRCYWNraW5nLCBwdWJsaWMgUGxhdGZvcm1DQUxheWVyQ2xpZW50IHsKK2NsYXNzIFRpbGVD
b250cm9sbGVyIGZpbmFsIDogcHVibGljIFRpbGVkQmFja2luZywgcHVibGljIFBsYXRmb3JtQ0FM
YXllckNsaWVudCB7CiAgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoVGlsZUNvbnRyb2xsZXIpOwog
CiBwdWJsaWM6CkBAIC02MCw3ICs2MCw3IEBAIHB1YmxpYzoKICAgICB2b2lkIHNldE5lZWRzRGlz
cGxheUluUmVjdChjb25zdCBJbnRSZWN0Jik7CiAKICAgICB2b2lkIHNldFNjYWxlKGZsb2F0KTsK
LSAgICBmbG9hdCBzY2FsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2NhbGU7IH0KKyAgICBmbG9hdCBz
Y2FsZSgpIGNvbnN0OwogCiAgICAgYm9vbCBhY2NlbGVyYXRlc0RyYXdpbmcoKSBjb25zdCB7IHJl
dHVybiBtX2FjY2VsZXJhdGVzRHJhd2luZzsgfQogICAgIHZvaWQgc2V0QWNjZWxlcmF0ZXNEcmF3
aW5nKGJvb2wpOwpAQCAtNjgsNyArNjgsNyBAQCBwdWJsaWM6CiAgICAgdm9pZCBzZXRUaWxlc09w
YXF1ZShib29sKTsKICAgICBib29sIHRpbGVzQXJlT3BhcXVlKCkgY29uc3QgeyByZXR1cm4gbV90
aWxlc0FyZU9wYXF1ZTsgfQogCi0gICAgUGxhdGZvcm1DQUxheWVyICp0aWxlQ29udGFpbmVyTGF5
ZXIoKSBjb25zdCB7IHJldHVybiBtX3RpbGVDb250YWluZXJMYXllci5nZXQoKTsgfQorICAgIFBs
YXRmb3JtQ0FMYXllciYgcm9vdExheWVyKCkgeyByZXR1cm4gKm1fdGlsZUNhY2hlTGF5ZXI7IH0K
IAogICAgIHZvaWQgc2V0VGlsZURlYnVnQm9yZGVyV2lkdGgoZmxvYXQpOwogICAgIHZvaWQgc2V0
VGlsZURlYnVnQm9yZGVyQ29sb3IoQ29sb3IpOwpAQCAtNzksMzEgKzc5LDU3IEBAIHB1YmxpYzoK
ICAgICBzdGF0aWMgdW5zaWduZWQgYmxhbmtQaXhlbENvdW50Rm9yVGlsZXMoY29uc3QgUGxhdGZv
cm1MYXllckxpc3QmLCBjb25zdCBGbG9hdFJlY3QmLCBjb25zdCBJbnRQb2ludCYpOwogCiAjaWYg
UExBVEZPUk0oSU9TKQotICAgIHVuc2lnbmVkIG51bWJlck9mVW5wYXJlbnRlZFRpbGVzKCkgY29u
c3QgeyByZXR1cm4gbV9jb2hvcnRMaXN0LnNpemUoKTsgfQorICAgIHVuc2lnbmVkIG51bWJlck9m
VW5wYXJlbnRlZFRpbGVzKCkgY29uc3Q7CiAgICAgdm9pZCByZW1vdmVVbnBhcmVudGVkVGlsZXNO
b3coKTsKICNlbmRpZgogCiBwdWJsaWM6Ci0gICAgLy8gT25seSBwdWJsaWMgZm9yIGlubGluZSBt
ZXRob2RzIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBmaWxlLgotICAgIHR5cGVkZWYgSW50UG9pbnQg
VGlsZUluZGV4OwotICAgIHR5cGVkZWYgdW5zaWduZWQgVGlsZUNvaG9ydDsKLSAgICBzdGF0aWMg
Y29uc3QgVGlsZUNvaG9ydCBWaXNpYmxlVGlsZUNvaG9ydCA9IFVJTlRfTUFYOworICAgIC8vIFB1
YmxpYyBmb3IgVGlsZUdyaWQKKyAgICBib29sIGlzSW5XaW5kb3coKSBjb25zdCB7IHJldHVybiBt
X2lzSW5XaW5kb3c7IH0KKworICAgIGZsb2F0IGRldmljZVNjYWxlRmFjdG9yKCkgY29uc3QgeyBy
ZXR1cm4gbV9kZXZpY2VTY2FsZUZhY3RvcjsgfQorICAgIEZsb2F0UmVjdCBleHBvc2VkUmVjdCgp
IGNvbnN0IHsgcmV0dXJuIG1fZXhwb3NlZFJlY3Q7IH0KKworICAgIENvbG9yIHRpbGVEZWJ1Z0Jv
cmRlckNvbG9yKCkgY29uc3QgeyByZXR1cm4gbV90aWxlRGVidWdCb3JkZXJDb2xvcjsgfQorICAg
IGZsb2F0IHRpbGVEZWJ1Z0JvcmRlcldpZHRoKCkgY29uc3QgeyByZXR1cm4gbV90aWxlRGVidWdC
b3JkZXJXaWR0aDsgfQorCisgICAgdmlydHVhbCBJbnRTaXplIHRpbGVTaXplKCkgY29uc3Qgb3Zl
cnJpZGUgeyByZXR1cm4gbV90aWxlU2l6ZTsgfQorICAgIHZpcnR1YWwgSW50UmVjdCBib3VuZHMo
KSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJvb2wgaGFzTWFyZ2lucygpIGNvbnN0IG92
ZXJyaWRlOworICAgIHZpcnR1YWwgaW50IHRvcE1hcmdpbkhlaWdodCgpIGNvbnN0IG92ZXJyaWRl
OworICAgIHZpcnR1YWwgaW50IGJvdHRvbU1hcmdpbkhlaWdodCgpIGNvbnN0IG92ZXJyaWRlOwor
ICAgIHZpcnR1YWwgaW50IGxlZnRNYXJnaW5XaWR0aCgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZp
cnR1YWwgaW50IHJpZ2h0TWFyZ2luV2lkdGgoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFs
IFRpbGVDb3ZlcmFnZSB0aWxlQ292ZXJhZ2UoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtX3Rp
bGVDb3ZlcmFnZTsgfQorICAgIHZpcnR1YWwgYm9vbCB1bnBhcmVudHNPZmZzY3JlZW5UaWxlcygp
IGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1fdW5wYXJlbnRzT2Zmc2NyZWVuVGlsZXM7IH0KKwor
ICAgIEludFJlY3QgYm91bmRzV2l0aG91dE1hcmdpbigpIGNvbnN0OworCisgICAgRmxvYXRSZWN0
IGNvbXB1dGVUaWxlQ292ZXJhZ2VSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcHJldmlvdXNWaXNpYmxl
UmVjdCwgY29uc3QgRmxvYXRSZWN0JiBjdXJyZW50VmlzaWJsZVJlY3QpIGNvbnN0OworCisgICAg
SW50UmVjdCBib3VuZHNBdExhc3RSZXZhbGlkYXRlKCkgY29uc3QgeyByZXR1cm4gbV9ib3VuZHNB
dExhc3RSZXZhbGlkYXRlOyB9CisgICAgSW50UmVjdCBib3VuZHNBdExhc3RSZXZhbGlkYXRlV2l0
aG91dE1hcmdpbigpIGNvbnN0OworICAgIEZsb2F0UmVjdCB2aXNpYmxlUmVjdEF0TGFzdFJldmFs
aWRhdGUoKSBjb25zdCB7IHJldHVybiBtX3Zpc2libGVSZWN0QXRMYXN0UmV2YWxpZGF0ZTsgfQor
ICAgIHZvaWQgZGlkUmV2YWxpZGF0ZVRpbGVzKCk7CisKKyAgICBib29sIHNob3VsZEFnZ3Jlc3Np
dmVseVJldGFpblRpbGVzKCkgY29uc3Q7CisgICAgYm9vbCBzaG91bGRUZW1wb3JhcmlseVJldGFp
blRpbGVDb2hvcnRzKCkgY29uc3Q7CisKICAgICB0eXBlZGVmIEhhc2hNYXA8UGxhdGZvcm1DQUxh
eWVyKiwgaW50PiBSZXBhaW50Q291bnRNYXA7CisgICAgUmVwYWludENvdW50TWFwJiByZXBhaW50
Q291bnRNYXAoKSB7IHJldHVybiBtX3RpbGVSZXBhaW50Q291bnRzOyB9CisKKyAgICB2b2lkIHVw
ZGF0ZVRpbGVDb3ZlcmFnZU1hcCgpOwogCi0gICAgc3RydWN0IFRpbGVJbmZvIHsKLSAgICAgICAg
UmVmUHRyPFBsYXRmb3JtQ0FMYXllcj4gbGF5ZXI7Ci0gICAgICAgIFRpbGVDb2hvcnQgY29ob3J0
OyAvLyBWaXNpYmxlVGlsZUNvaG9ydCBpcyB2aXNpYmxlLgotICAgICAgICBib29sIGhhc1N0YWxl
Q29udGVudDsKLSAgICAgICAgCi0gICAgICAgIFRpbGVJbmZvKCkKLSAgICAgICAgICAgIDogY29o
b3J0KFZpc2libGVUaWxlQ29ob3J0KQotICAgICAgICAgICAgLCBoYXNTdGFsZUNvbnRlbnQoZmFs
c2UpCi0gICAgICAgIHsgfQotICAgIH07CisgICAgUmVmUHRyPFBsYXRmb3JtQ0FMYXllcj4gY3Jl
YXRlVGlsZUxheWVyKGNvbnN0IEludFJlY3QmKTsKKworICAgIFZlY3RvcjxSZWZQdHI8UGxhdGZv
cm1DQUxheWVyPj4gY29udGFpbmVyTGF5ZXJzKCk7CiAKIHByaXZhdGU6CiAgICAgVGlsZUNvbnRy
b2xsZXIoUGxhdGZvcm1DQUxheWVyKik7CiAKKyAgICBUaWxlR3JpZCYgdGlsZUdyaWQoKSB7IHJl
dHVybiAqbV90aWxlR3JpZDsgfQorICAgIGNvbnN0IFRpbGVHcmlkJiB0aWxlR3JpZCgpIGNvbnN0
IHsgcmV0dXJuICptX3RpbGVHcmlkOyB9CisKICAgICAvLyBUaWxlZEJhY2tpbmcgbWVtYmVyIGZ1
bmN0aW9ucy4KICAgICB2aXJ0dWFsIHZvaWQgc2V0VmlzaWJsZVJlY3QoY29uc3QgRmxvYXRSZWN0
Jikgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBib29sIHRpbGVzV291bGRDaGFuZ2VGb3JWaXNpYmxl
UmVjdChjb25zdCBGbG9hdFJlY3QmKSBjb25zdCBvdmVycmlkZTsKQEAgLTExMSwyNSArMTM3LDE3
IEBAIHByaXZhdGU6CiAgICAgdmlydHVhbCB2b2lkIHByZXBvcHVsYXRlUmVjdChjb25zdCBGbG9h
dFJlY3QmKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHZvaWQgc2V0SXNJbldpbmRvdyhib29sKSBv
dmVycmlkZTsKICAgICB2aXJ0dWFsIHZvaWQgc2V0VGlsZUNvdmVyYWdlKFRpbGVDb3ZlcmFnZSkg
b3ZlcnJpZGU7Ci0gICAgdmlydHVhbCBUaWxlQ292ZXJhZ2UgdGlsZUNvdmVyYWdlKCkgY29uc3Qg
b3ZlcnJpZGUgeyByZXR1cm4gbV90aWxlQ292ZXJhZ2U7IH0KICAgICB2aXJ0dWFsIHZvaWQgcmV2
YWxpZGF0ZVRpbGVzKCkgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCB2b2lkIGZvcmNlUmVwYWludCgp
IG92ZXJyaWRlOwotICAgIHZpcnR1YWwgSW50U2l6ZSB0aWxlU2l6ZSgpIGNvbnN0IG92ZXJyaWRl
IHsgcmV0dXJuIG1fdGlsZVNpemU7IH0KICAgICB2aXJ0dWFsIEludFJlY3QgdGlsZUdyaWRFeHRl
bnQoKSBjb25zdCBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHZvaWQgc2V0U2Nyb2xsaW5nUGVyZm9y
bWFuY2VMb2dnaW5nRW5hYmxlZChib29sIGZsYWcpIG92ZXJyaWRlIHsgbV9zY3JvbGxpbmdQZXJm
b3JtYW5jZUxvZ2dpbmdFbmFibGVkID0gZmxhZzsgfQogICAgIHZpcnR1YWwgYm9vbCBzY3JvbGxp
bmdQZXJmb3JtYW5jZUxvZ2dpbmdFbmFibGVkKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbV9z
Y3JvbGxpbmdQZXJmb3JtYW5jZUxvZ2dpbmdFbmFibGVkOyB9CiAgICAgdmlydHVhbCB2b2lkIHNl
dFVucGFyZW50c09mZnNjcmVlblRpbGVzKGJvb2wgZmxhZykgb3ZlcnJpZGUgeyBtX3VucGFyZW50
c09mZnNjcmVlblRpbGVzID0gZmxhZzsgfQotICAgIHZpcnR1YWwgYm9vbCB1bnBhcmVudHNPZmZz
Y3JlZW5UaWxlcygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1fdW5wYXJlbnRzT2Zmc2NyZWVu
VGlsZXM7IH0KICAgICB2aXJ0dWFsIGRvdWJsZSByZXRhaW5lZFRpbGVCYWNraW5nU3RvcmVNZW1v
cnkoKSBjb25zdCBvdmVycmlkZTsKICAgICB2aXJ0dWFsIEludFJlY3QgdGlsZUNvdmVyYWdlUmVj
dCgpIGNvbnN0IG92ZXJyaWRlOwogICAgIHZpcnR1YWwgUGxhdGZvcm1DQUxheWVyKiB0aWxlZFNj
cm9sbGluZ0luZGljYXRvckxheWVyKCkgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCB2b2lkIHNldFNj
cm9sbGluZ01vZGVJbmRpY2F0aW9uKFNjcm9sbGluZ01vZGVJbmRpY2F0aW9uKSBvdmVycmlkZTsK
ICAgICB2aXJ0dWFsIHZvaWQgc2V0VGlsZU1hcmdpbnMoaW50IG1hcmdpblRvcCwgaW50IG1hcmdp
bkJvdHRvbSwgaW50IG1hcmdpbkxlZnQsIGludCBtYXJnaW5SaWdodCkgb3ZlcnJpZGU7Ci0gICAg
dmlydHVhbCBib29sIGhhc01hcmdpbnMoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIGlu
dCB0b3BNYXJnaW5IZWlnaHQoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIGludCBib3R0
b21NYXJnaW5IZWlnaHQoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIGludCBsZWZ0TWFy
Z2luV2lkdGgoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIGludCByaWdodE1hcmdpbldp
ZHRoKCkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgICAvLyBQbGF0Zm9ybUNBTGF5ZXJDbGllbnQKICAg
ICB2aXJ0dWFsIHZvaWQgcGxhdGZvcm1DQUxheWVyTGF5b3V0U3VibGF5ZXJzT2ZMYXllcihQbGF0
Zm9ybUNBTGF5ZXIqKSBvdmVycmlkZSB7IH0KQEAgLTE0OCw4NiArMTY2LDMxIEBAIHByaXZhdGU6
CiAgICAgdmlydHVhbCB2b2lkIHBsYXRmb3JtQ0FMYXllclNldE5lZWRzVG9SZXZhbGlkYXRlVGls
ZXMoKSBvdmVycmlkZSB7IH0KICAgICB2aXJ0dWFsIGZsb2F0IHBsYXRmb3JtQ0FMYXllckRldmlj
ZVNjYWxlRmFjdG9yKCkgY29uc3Qgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIEludFJlY3QgYm91
bmRzKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgSW50UmVjdCBib3VuZHNXaXRob3V0TWFyZ2luKCkg
Y29uc3Q7Ci0gICAgSW50UmVjdCBib3VuZHNBdExhc3RSZXZhbGlkYXRlV2l0aG91dE1hcmdpbigp
IGNvbnN0OwotCi0gICAgSW50UmVjdCByZWN0Rm9yVGlsZUluZGV4KGNvbnN0IFRpbGVJbmRleCYp
IGNvbnN0OwotICAgIHZvaWQgYWRqdXN0UmVjdEF0VGlsZUluZGV4Rm9yTWFyZ2luKGNvbnN0IFRp
bGVJbmRleCYsIEludFJlY3QmKSBjb25zdDsKLSAgICB2b2lkIGdldFRpbGVJbmRleFJhbmdlRm9y
UmVjdChjb25zdCBJbnRSZWN0JiwgVGlsZUluZGV4JiB0b3BMZWZ0LCBUaWxlSW5kZXgmIGJvdHRv
bVJpZ2h0KSBjb25zdDsKLQotICAgIEZsb2F0UmVjdCBjb21wdXRlVGlsZUNvdmVyYWdlUmVjdChj
b25zdCBGbG9hdFJlY3QmIHByZXZpb3VzVmlzaWJsZVJlY3QsIGNvbnN0IEZsb2F0UmVjdCYgY3Vy
cmVudFZpc2libGVSZWN0KSBjb25zdDsKLQogICAgIHZvaWQgc2NoZWR1bGVUaWxlUmV2YWxpZGF0
aW9uKGRvdWJsZSBpbnRlcnZhbCk7CiAgICAgdm9pZCB0aWxlUmV2YWxpZGF0aW9uVGltZXJGaXJl
ZChUaW1lcjxUaWxlQ29udHJvbGxlcj4qKTsKIAotICAgIHZvaWQgc2NoZWR1bGVDb2hvcnRSZW1v
dmFsKCk7Ci0gICAgdm9pZCBjb2hvcnRSZW1vdmFsVGltZXJGaXJlZChUaW1lcjxUaWxlQ29udHJv
bGxlcj4qKTsKLSAgICAKLSAgICB0eXBlZGVmIHVuc2lnbmVkIFRpbGVWYWxpZGF0aW9uUG9saWN5
RmxhZ3M7Ci0KICAgICB2b2lkIHNldE5lZWRzUmV2YWxpZGF0ZVRpbGVzKCk7Ci0gICAgdm9pZCBy
ZXZhbGlkYXRlVGlsZXMoVGlsZVZhbGlkYXRpb25Qb2xpY3lGbGFncyBmb3JlZ3JvdW5kVmFsaWRh
dGlvblBvbGljeSwgVGlsZVZhbGlkYXRpb25Qb2xpY3lGbGFncyBiYWNrZ3JvdW5kVmFsaWRhdGlv
blBvbGljeSk7Ci0gICAgZW51bSBjbGFzcyBDb3ZlcmFnZVR5cGUgeyBQcmltYXJ5VGlsZXMsIFNl
Y29uZGFyeVRpbGVzIH07Ci0KLSAgICAvLyBSZXR1cm5zIHRoZSBib3VuZHMgb2YgdGhlIGNvdmVy
ZWQgdGlsZXMuCi0gICAgSW50UmVjdCBlbnN1cmVUaWxlc0ZvclJlY3QoY29uc3QgRmxvYXRSZWN0
JiwgQ292ZXJhZ2VUeXBlKTsKLSAgICB2b2lkIHVwZGF0ZVRpbGVDb3ZlcmFnZU1hcCgpOwotCi0g
ICAgdm9pZCByZW1vdmVBbGxUaWxlcygpOwotICAgIHZvaWQgcmVtb3ZlQWxsU2Vjb25kYXJ5VGls
ZXMoKTsKLSAgICB2b2lkIHJlbW92ZVRpbGVzSW5Db2hvcnQoVGlsZUNvaG9ydCk7Ci0KLSAgICBU
aWxlQ29ob3J0IG5leHRUaWxlQ29ob3J0KCkgY29uc3Q7Ci0gICAgdm9pZCBzdGFydGVkTmV3Q29o
b3J0KFRpbGVDb2hvcnQpOwotICAgIAotICAgIFRpbGVDb2hvcnQgbmV3ZXN0VGlsZUNvaG9ydCgp
IGNvbnN0OwotICAgIFRpbGVDb2hvcnQgb2xkZXN0VGlsZUNvaG9ydCgpIGNvbnN0OwotCi0gICAg
dm9pZCBzZXRUaWxlTmVlZHNEaXNwbGF5SW5SZWN0KGNvbnN0IFRpbGVJbmRleCYsIFRpbGVJbmZv
JiwgY29uc3QgSW50UmVjdCYgcmVwYWludFJlY3RJblRpbGVDb29yZHMsIGNvbnN0IEludFJlY3Qm
IGNvdmVyYWdlUmVjdEluVGlsZUNvb3Jkcyk7Ci0KLSAgICBSZWZQdHI8UGxhdGZvcm1DQUxheWVy
PiBjcmVhdGVUaWxlTGF5ZXIoY29uc3QgSW50UmVjdCYpOwogCiAgICAgdm9pZCBkcmF3VGlsZU1h
cENvbnRlbnRzKENHQ29udGV4dFJlZiwgQ0dSZWN0KTsKIAogICAgIFBsYXRmb3JtQ0FMYXllckNs
aWVudCogb3duaW5nR3JhcGhpY3NMYXllcigpIGNvbnN0IHsgcmV0dXJuIG1fdGlsZUNhY2hlTGF5
ZXItPm93bmVyKCk7IH0KIAotICAgIEZsb2F0UmVjdCBzY2FsZWRFeHBvc2VkUmVjdCgpIGNvbnN0
OwotCiAgICAgUGxhdGZvcm1DQUxheWVyKiBtX3RpbGVDYWNoZUxheWVyOwotICAgIFJlZlB0cjxQ
bGF0Zm9ybUNBTGF5ZXI+IG1fdGlsZUNvbnRhaW5lckxheWVyOwogICAgIFJlZlB0cjxQbGF0Zm9y
bUNBTGF5ZXI+IG1fdGlsZWRTY3JvbGxpbmdJbmRpY2F0b3JMYXllcjsgLy8gVXNlZCBmb3IgY292
ZXJhZ2UgdmlzdWFsaXphdGlvbi4KICAgICBSZWZQdHI8UGxhdGZvcm1DQUxheWVyPiBtX3Zpc2li
bGVSZWN0SW5kaWNhdG9yTGF5ZXI7CiAKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VGlsZUdyaWQ+IG1f
dGlsZUdyaWQ7CisKICAgICBJbnRTaXplIG1fdGlsZVNpemU7CiAgICAgRmxvYXRSZWN0IG1fdmlz
aWJsZVJlY3Q7CiAgICAgRmxvYXRSZWN0IG1fdmlzaWJsZVJlY3RBdExhc3RSZXZhbGlkYXRlOwog
ICAgIEZsb2F0UmVjdCBtX2V4cG9zZWRSZWN0OyAvLyBUaGUgZXhwb3NlZCBhcmVhIG9mIGNvbnRh
aW5pbmcgcGxhdGZvcm0gdmlld3MuCiAgICAgSW50UmVjdCBtX2JvdW5kc0F0TGFzdFJldmFsaWRh
dGU7Ci0gICAgCi0gICAgVmVjdG9yPEZsb2F0UmVjdD4gbV9zZWNvbmRhcnlUaWxlQ292ZXJhZ2VS
ZWN0czsKIAotICAgIHR5cGVkZWYgSGFzaE1hcDxUaWxlSW5kZXgsIFRpbGVJbmZvPiBUaWxlTWFw
OwotICAgIFRpbGVNYXAgbV90aWxlczsKICAgICBUaW1lcjxUaWxlQ29udHJvbGxlcj4gbV90aWxl
UmV2YWxpZGF0aW9uVGltZXI7Ci0gICAgVGltZXI8VGlsZUNvbnRyb2xsZXI+IG1fY29ob3J0UmVt
b3ZhbFRpbWVyOwogCiAgICAgUmVwYWludENvdW50TWFwIG1fdGlsZVJlcGFpbnRDb3VudHM7CiAK
LSAgICBzdHJ1Y3QgVGlsZUNvaG9ydEluZm8gewotICAgICAgICBUaWxlQ29ob3J0IGNvaG9ydDsK
LSAgICAgICAgZG91YmxlIGNyZWF0aW9uVGltZTsgLy8gaW4gbW9ub3RvbmljYWxseUluY3JlYXNp
bmdUaW1lKCkuCi0gICAgICAgIFRpbGVDb2hvcnRJbmZvKFRpbGVDb2hvcnQgaW5Db2hvcnQsIGRv
dWJsZSBpblRpbWUpCi0gICAgICAgICAgICA6IGNvaG9ydChpbkNvaG9ydCkKLSAgICAgICAgICAg
ICwgY3JlYXRpb25UaW1lKGluVGltZSkKLSAgICAgICAgeyB9Ci0gICAgfTsKLSAgICB0eXBlZGVm
IERlcXVlPFRpbGVDb2hvcnRJbmZvPiBUaWxlQ29ob3J0TGlzdDsKLSAgICBUaWxlQ29ob3J0TGlz
dCBtX2NvaG9ydExpc3Q7Ci0gICAgCi0gICAgSW50UmVjdCBtX3ByaW1hcnlUaWxlQ292ZXJhZ2VS
ZWN0OyAvLyBJbiB0aWxlIGNvb3Jkcy4KLQotICAgIGZsb2F0IG1fc2NhbGU7CiAgICAgZmxvYXQg
bV9kZXZpY2VTY2FsZUZhY3RvcjsKIAogICAgIFRpbGVDb3ZlcmFnZSBtX3RpbGVDb3ZlcmFnZTsK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhL21hYy9UaWxlQ29udHJv
bGxlci5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9j
YS9tYWMvVGlsZUNvbnRyb2xsZXIubW0JKHJldmlzaW9uIDE2NjU3NSkKKysrIFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhL21hYy9UaWxlQ29udHJvbGxlci5tbQkod29ya2luZyBj
b3B5KQpAQCAtMzAsNiArMzAsNyBAQAogI2ltcG9ydCAiSW50UmVjdC5oIgogI2ltcG9ydCAiUGxh
dGZvcm1DQUxheWVyLmgiCiAjaW1wb3J0ICJSZWdpb24uaCIKKyNpbXBvcnQgIlRpbGVHcmlkLmgi
CiAjaWYgIVBMQVRGT1JNKElPUykKICNpbXBvcnQgIkxheWVyUG9vbC5oIgogI2VuZGlmCkBAIC01
NSwxMSArNTYsMTAgQEAgUGFzc093blB0cjxUaWxlQ29udHJvbGxlcj4gVGlsZUNvbnRyb2xsZQog
CiBUaWxlQ29udHJvbGxlcjo6VGlsZUNvbnRyb2xsZXIoUGxhdGZvcm1DQUxheWVyKiByb290UGxh
dGZvcm1MYXllcikKICAgICA6IG1fdGlsZUNhY2hlTGF5ZXIocm9vdFBsYXRmb3JtTGF5ZXIpCisg
ICAgLCBtX3RpbGVHcmlkKHN0ZDo6bWFrZV91bmlxdWU8VGlsZUdyaWQ+KCp0aGlzKSkKICAgICAs
IG1fdGlsZVNpemUoZGVmYXVsdFRpbGVXaWR0aCwgZGVmYXVsdFRpbGVIZWlnaHQpCiAgICAgLCBt
X2V4cG9zZWRSZWN0KEZsb2F0UmVjdDo6aW5maW5pdGVSZWN0KCkpCiAgICAgLCBtX3RpbGVSZXZh
bGlkYXRpb25UaW1lcih0aGlzLCAmVGlsZUNvbnRyb2xsZXI6OnRpbGVSZXZhbGlkYXRpb25UaW1l
ckZpcmVkKQotICAgICwgbV9jb2hvcnRSZW1vdmFsVGltZXIodGhpcywgJlRpbGVDb250cm9sbGVy
Ojpjb2hvcnRSZW1vdmFsVGltZXJGaXJlZCkKLSAgICAsIG1fc2NhbGUoMSkKICAgICAsIG1fZGV2
aWNlU2NhbGVGYWN0b3IoMSkKICAgICAsIG1fdGlsZUNvdmVyYWdlKENvdmVyYWdlRm9yVmlzaWJs
ZUFyZWEpCiAgICAgLCBtX21hcmdpblRvcCgwKQpAQCAtNzUsMTAgKzc1LDYgQEAgVGlsZUNvbnRy
b2xsZXI6OlRpbGVDb250cm9sbGVyKFBsYXRmb3JtQwogICAgICwgbV90aWxlRGVidWdCb3JkZXJX
aWR0aCgwKQogICAgICwgbV9pbmRpY2F0b3JNb2RlKEFzeW5jU2Nyb2xsaW5nSW5kaWNhdGlvbikK
IHsKLSAgICBtX3RpbGVDb250YWluZXJMYXllciA9IG1fdGlsZUNhY2hlTGF5ZXItPmNyZWF0ZUNv
bXBhdGlibGVMYXllcihQbGF0Zm9ybUNBTGF5ZXI6OkxheWVyVHlwZUxheWVyLCBudWxscHRyKTsK
LSNpZm5kZWYgTkRFQlVHCi0gICAgbV90aWxlQ29udGFpbmVyTGF5ZXItPnNldE5hbWUoIlRpbGVD
b250cm9sbGVyIENvbnRhaW5lciBMYXllciIpOwotI2VuZGlmCiB9CiAKIFRpbGVDb250cm9sbGVy
Ojp+VGlsZUNvbnRyb2xsZXIoKQpAQCAtODksOSArODUsNiBAQCBUaWxlQ29udHJvbGxlcjo6flRp
bGVDb250cm9sbGVyKCkKICAgICB0aWxlQ29udHJvbGxlck1lbW9yeUhhbmRsZXIoKS5yZW1vdmVU
aWxlQ29udHJvbGxlcih0aGlzKTsKICNlbmRpZgogCi0gICAgZm9yIChUaWxlTWFwOjppdGVyYXRv
ciBpdCA9IG1fdGlsZXMuYmVnaW4oKSwgZW5kID0gbV90aWxlcy5lbmQoKTsgaXQgIT0gZW5kOyAr
K2l0KQotICAgICAgICBpdC0+dmFsdWUubGF5ZXItPnNldE93bmVyKG51bGxwdHIpOwotCiAgICAg
aWYgKG1fdGlsZWRTY3JvbGxpbmdJbmRpY2F0b3JMYXllcikKICAgICAgICAgbV90aWxlZFNjcm9s
bGluZ0luZGljYXRvckxheWVyLT5zZXRPd25lcihudWxscHRyKTsKIH0KQEAgLTEwNCw3MSArOTcs
MTIgQEAgdm9pZCBUaWxlQ29udHJvbGxlcjo6dGlsZUNhY2hlTGF5ZXJCb3VuZAogCiB2b2lkIFRp
bGVDb250cm9sbGVyOjpzZXROZWVkc0Rpc3BsYXkoKQogewotICAgIGZvciAoVGlsZU1hcDo6aXRl
cmF0b3IgaXQgPSBtX3RpbGVzLmJlZ2luKCksIGVuZCA9IG1fdGlsZXMuZW5kKCk7IGl0ICE9IGVu
ZDsgKytpdCkgewotICAgICAgICBUaWxlSW5mbyYgdGlsZUluZm8gPSBpdC0+dmFsdWU7Ci0gICAg
ICAgIEludFJlY3QgdGlsZVJlY3QgPSByZWN0Rm9yVGlsZUluZGV4KGl0LT5rZXkpOwotCi0gICAg
ICAgIGlmICh0aWxlUmVjdC5pbnRlcnNlY3RzKG1fcHJpbWFyeVRpbGVDb3ZlcmFnZVJlY3QpICYm
IHRpbGVJbmZvLmxheWVyLT5zdXBlcmxheWVyKCkpCi0gICAgICAgICAgICB0aWxlSW5mby5sYXll
ci0+c2V0TmVlZHNEaXNwbGF5KCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRpbGVJbmZv
Lmhhc1N0YWxlQ29udGVudCA9IHRydWU7Ci0gICAgfQorICAgIHRpbGVHcmlkKCkuc2V0TmVlZHNE
aXNwbGF5KCk7CiB9CiAKIHZvaWQgVGlsZUNvbnRyb2xsZXI6OnNldE5lZWRzRGlzcGxheUluUmVj
dChjb25zdCBJbnRSZWN0JiByZWN0KQogewotICAgIGlmIChtX3RpbGVzLmlzRW1wdHkoKSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgRmxvYXRSZWN0IHNjYWxlZFJlY3QocmVjdCk7Ci0gICAgc2Nh
bGVkUmVjdC5zY2FsZShtX3NjYWxlKTsKLSAgICBJbnRSZWN0IHJlcGFpbnRSZWN0SW5UaWxlQ29v
cmRzKGVuY2xvc2luZ0ludFJlY3Qoc2NhbGVkUmVjdCkpOwotCi0gICAgLy8gRm9yIHNtYWxsIGlu
dmFsaWRhdGlvbnMsIGxvb2t1cCB0aGUgY292ZXJlZCB0aWxlcy4KLSAgICBpZiAocmVwYWludFJl
Y3RJblRpbGVDb29yZHMuaGVpZ2h0KCkgPCAyICogbV90aWxlU2l6ZS5oZWlnaHQoKSAmJiByZXBh
aW50UmVjdEluVGlsZUNvb3Jkcy53aWR0aCgpIDwgMiAqIG1fdGlsZVNpemUud2lkdGgoKSkgewot
ICAgICAgICBUaWxlSW5kZXggdG9wTGVmdDsKLSAgICAgICAgVGlsZUluZGV4IGJvdHRvbVJpZ2h0
OwotICAgICAgICBnZXRUaWxlSW5kZXhSYW5nZUZvclJlY3QocmVwYWludFJlY3RJblRpbGVDb29y
ZHMsIHRvcExlZnQsIGJvdHRvbVJpZ2h0KTsKLQotICAgICAgICBmb3IgKGludCB5ID0gdG9wTGVm
dC55KCk7IHkgPD0gYm90dG9tUmlnaHQueSgpOyArK3kpIHsKLSAgICAgICAgICAgIGZvciAoaW50
IHggPSB0b3BMZWZ0LngoKTsgeCA8PSBib3R0b21SaWdodC54KCk7ICsreCkgewotICAgICAgICAg
ICAgICAgIFRpbGVJbmRleCB0aWxlSW5kZXgoeCwgeSk7Ci0gICAgICAgICAgICAgICAgCi0gICAg
ICAgICAgICAgICAgVGlsZU1hcDo6aXRlcmF0b3IgaXQgPSBtX3RpbGVzLmZpbmQodGlsZUluZGV4
KTsKLSAgICAgICAgICAgICAgICBpZiAoaXQgIT0gbV90aWxlcy5lbmQoKSkKLSAgICAgICAgICAg
ICAgICAgICAgc2V0VGlsZU5lZWRzRGlzcGxheUluUmVjdCh0aWxlSW5kZXgsIGl0LT52YWx1ZSwg
cmVwYWludFJlY3RJblRpbGVDb29yZHMsIG1fcHJpbWFyeVRpbGVDb3ZlcmFnZVJlY3QpOwotICAg
ICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3Ig
KFRpbGVNYXA6Oml0ZXJhdG9yIGl0ID0gbV90aWxlcy5iZWdpbigpLCBlbmQgPSBtX3RpbGVzLmVu
ZCgpOyBpdCAhPSBlbmQ7ICsraXQpCi0gICAgICAgIHNldFRpbGVOZWVkc0Rpc3BsYXlJblJlY3Qo
aXQtPmtleSwgaXQtPnZhbHVlLCByZXBhaW50UmVjdEluVGlsZUNvb3JkcywgbV9wcmltYXJ5VGls
ZUNvdmVyYWdlUmVjdCk7Ci19Ci0KLXZvaWQgVGlsZUNvbnRyb2xsZXI6OnNldFRpbGVOZWVkc0Rp
c3BsYXlJblJlY3QoY29uc3QgVGlsZUluZGV4JiB0aWxlSW5kZXgsIFRpbGVJbmZvJiB0aWxlSW5m
bywgY29uc3QgSW50UmVjdCYgcmVwYWludFJlY3RJblRpbGVDb29yZHMsIGNvbnN0IEludFJlY3Qm
IGNvdmVyYWdlUmVjdEluVGlsZUNvb3JkcykKLXsKLSAgICBQbGF0Zm9ybUNBTGF5ZXIqIHRpbGVM
YXllciA9IHRpbGVJbmZvLmxheWVyLmdldCgpOwotCi0gICAgSW50UmVjdCB0aWxlUmVjdCA9IHJl
Y3RGb3JUaWxlSW5kZXgodGlsZUluZGV4KTsKLSAgICBGbG9hdFJlY3QgdGlsZVJlcGFpbnRSZWN0
ID0gdGlsZVJlY3Q7Ci0gICAgdGlsZVJlcGFpbnRSZWN0LmludGVyc2VjdChyZXBhaW50UmVjdElu
VGlsZUNvb3Jkcyk7Ci0gICAgaWYgKHRpbGVSZXBhaW50UmVjdC5pc0VtcHR5KCkpCi0gICAgICAg
IHJldHVybjsKLQotICAgIHRpbGVSZXBhaW50UmVjdC5tb3ZlQnkoLXRpbGVSZWN0LmxvY2F0aW9u
KCkpOwotICAgIAotICAgIC8vIFdlIGNvdWxkIHRlc3QgZm9yIGludGVyc2VjdGlvbiB3aXRoIHRo
ZSB2aXNpYmxlIHJlY3QuIFRoaXMgd291bGQgcmVkdWNlIHBhaW50aW5nIHlldCBtb3JlLAotICAg
IC8vIGJ1dCBtYXkgbWFrZSBzY3JvbGxpbmcgc3RhbGUgdGlsZXMgaW50byB2aWV3IG1vcmUgZnJl
cXVlbnQuCi0gICAgaWYgKHRpbGVSZWN0LmludGVyc2VjdHMoY292ZXJhZ2VSZWN0SW5UaWxlQ29v
cmRzKSAmJiB0aWxlTGF5ZXItPnN1cGVybGF5ZXIoKSkgewotICAgICAgICB0aWxlTGF5ZXItPnNl
dE5lZWRzRGlzcGxheSgmdGlsZVJlcGFpbnRSZWN0KTsKLQotICAgICAgICBpZiAob3duaW5nR3Jh
cGhpY3NMYXllcigpLT5wbGF0Zm9ybUNBTGF5ZXJTaG93UmVwYWludENvdW50ZXIoMCkpIHsKLSAg
ICAgICAgICAgIEZsb2F0UmVjdCBpbmRpY2F0b3JSZWN0KDAsIDAsIDUyLCAyNyk7Ci0gICAgICAg
ICAgICB0aWxlTGF5ZXItPnNldE5lZWRzRGlzcGxheSgmaW5kaWNhdG9yUmVjdCk7Ci0gICAgICAg
IH0KLSAgICB9IGVsc2UKLSAgICAgICAgdGlsZUluZm8uaGFzU3RhbGVDb250ZW50ID0gdHJ1ZTsK
KyAgICB0aWxlR3JpZCgpLnNldE5lZWRzRGlzcGxheUluUmVjdChyZWN0KTsKIH0KIAogdm9pZCBU
aWxlQ29udHJvbGxlcjo6cGxhdGZvcm1DQUxheWVyUGFpbnRDb250ZW50cyhQbGF0Zm9ybUNBTGF5
ZXIqIHBsYXRmb3JtQ0FMYXllciwgR3JhcGhpY3NDb250ZXh0JiBjb250ZXh0LCBjb25zdCBGbG9h
dFJlY3QmKQpAQCAtMTc5LDcgKzExMyw3IEBAIHZvaWQgVGlsZUNvbnRyb2xsZXI6OnBsYXRmb3Jt
Q0FMYXllclBhaW4KICNlbmRpZgogCiAgICAgaWYgKHBsYXRmb3JtQ0FMYXllciA9PSBtX3RpbGVk
U2Nyb2xsaW5nSW5kaWNhdG9yTGF5ZXIuZ2V0KCkpIHsKLSAgICAgICAgZHJhd1RpbGVNYXBDb250
ZW50cyhjb250ZXh0LnBsYXRmb3JtQ29udGV4dCgpLCBtX3RpbGVkU2Nyb2xsaW5nSW5kaWNhdG9y
TGF5ZXItPmJvdW5kcygpKTsKKyAgICAgICAgdGlsZUdyaWQoKS5kcmF3VGlsZU1hcENvbnRlbnRz
KGNvbnRleHQucGxhdGZvcm1Db250ZXh0KCksIG1fdGlsZWRTY3JvbGxpbmdJbmRpY2F0b3JMYXll
ci0+Ym91bmRzKCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0xODgsNyArMTIyLDcg
QEAgdm9pZCBUaWxlQ29udHJvbGxlcjo6cGxhdGZvcm1DQUxheWVyUGFpbgogCiAgICAgICAgIEZs
b2F0UG9pbnQzRCBsYXllck9yaWdpbiA9IHBsYXRmb3JtQ0FMYXllci0+cG9zaXRpb24oKTsKICAg
ICAgICAgY29udGV4dC50cmFuc2xhdGUoLWxheWVyT3JpZ2luLngoKSwgLWxheWVyT3JpZ2luLnko
KSk7Ci0gICAgICAgIGNvbnRleHQuc2NhbGUoRmxvYXRTaXplKG1fc2NhbGUsIG1fc2NhbGUpKTsK
KyAgICAgICAgY29udGV4dC5zY2FsZShGbG9hdFNpemUodGlsZUdyaWQoKS5zY2FsZSgpLCB0aWxl
R3JpZCgpLnNjYWxlKCkpKTsKIAogICAgICAgICBSZXBhaW50UmVjdExpc3QgZGlydHlSZWN0cyA9
IGNvbGxlY3RSZWN0c1RvUGFpbnQoY29udGV4dC5wbGF0Zm9ybUNvbnRleHQoKSwgcGxhdGZvcm1D
QUxheWVyKTsKICAgICAgICAgZHJhd0xheWVyQ29udGVudHMoY29udGV4dC5wbGF0Zm9ybUNvbnRl
eHQoKSwgbV90aWxlQ2FjaGVMYXllciwgZGlydHlSZWN0cyk7CkBAIC0yMjIsNTggKzE1Niw0NiBA
QCBib29sIFRpbGVDb250cm9sbGVyOjpwbGF0Zm9ybUNBTGF5ZXJTaG93CiAgICAgcmV0dXJuIG93
bmluZ0dyYXBoaWNzTGF5ZXIoKS0+cGxhdGZvcm1DQUxheWVyU2hvd1JlcGFpbnRDb3VudGVyKDAp
OwogfQogCitmbG9hdCBUaWxlQ29udHJvbGxlcjo6c2NhbGUoKSBjb25zdAoreworICAgIHJldHVy
biB0aWxlR3JpZCgpLnNjYWxlKCk7Cit9CisKIHZvaWQgVGlsZUNvbnRyb2xsZXI6OnNldFNjYWxl
KGZsb2F0IHNjYWxlKQogewogICAgIEFTU0VSVChvd25pbmdHcmFwaGljc0xheWVyKCktPmlzQ29t
bWl0dGluZ0NoYW5nZXMoKSk7CiAKLSAgICBmbG9hdCBkZXZpY2VTY2FsZUZhY3RvciA9IG93bmlu
Z0dyYXBoaWNzTGF5ZXIoKS0+cGxhdGZvcm1DQUxheWVyRGV2aWNlU2NhbGVGYWN0b3IoKTsKKyAg
ICBmbG9hdCBkZXZpY2VTY2FsZUZhY3RvciA9IHBsYXRmb3JtQ0FMYXllckRldmljZVNjYWxlRmFj
dG9yKCk7CiAKICAgICAvLyBUaGUgc2NhbGUgd2UgZ2V0IGlzIHRoZSBwcm9kdWN0IG9mIHRoZSBw
YWdlIHNjYWxlIGZhY3RvciBhbmQgZGV2aWNlIHNjYWxlIGZhY3Rvci4KICAgICAvLyBEaXZpZGUg
YnkgdGhlIGRldmljZSBzY2FsZSBmYWN0b3Igc28gd2UnbGwgZ2V0IHRoZSBwYWdlIHNjYWxlIGZh
Y3Rvci4KICAgICBzY2FsZSAvPSBkZXZpY2VTY2FsZUZhY3RvcjsKIAotICAgIGlmIChtX3NjYWxl
ID09IHNjYWxlICYmIG1fZGV2aWNlU2NhbGVGYWN0b3IgPT0gZGV2aWNlU2NhbGVGYWN0b3IgJiYg
IW1faGFzVGlsZXNXaXRoVGVtcG9yYXJ5U2NhbGVGYWN0b3IpCisgICAgaWYgKHRpbGVHcmlkKCku
c2NhbGUoKSA9PSBzY2FsZSAmJiBtX2RldmljZVNjYWxlRmFjdG9yID09IGRldmljZVNjYWxlRmFj
dG9yICYmICFtX2hhc1RpbGVzV2l0aFRlbXBvcmFyeVNjYWxlRmFjdG9yKQogICAgICAgICByZXR1
cm47CiAKICAgICBtX2hhc1RpbGVzV2l0aFRlbXBvcmFyeVNjYWxlRmFjdG9yID0gZmFsc2U7CiAg
ICAgbV9kZXZpY2VTY2FsZUZhY3RvciA9IGRldmljZVNjYWxlRmFjdG9yOwotICAgIG1fc2NhbGUg
PSBzY2FsZTsKIAotICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IHRyYW5zZm9ybTsKLSAgICB0cmFu
c2Zvcm0uc2NhbGUoMSAvIG1fc2NhbGUpOwotICAgIG1fdGlsZUNvbnRhaW5lckxheWVyLT5zZXRU
cmFuc2Zvcm0odHJhbnNmb3JtKTsKLQotICAgIC8vIEZJWE1FOiB3ZSBtYXkgcmV2YWxpZGF0ZVRp
bGVzIHR3aWNlIGluIHRoaXMgY29tbWl0LgotICAgIHJldmFsaWRhdGVUaWxlcyhQcnVuZVNlY29u
ZGFyeVRpbGVzLCBQcnVuZVNlY29uZGFyeVRpbGVzKTsKLQotICAgIGZvciAoVGlsZU1hcDo6Y29u
c3RfaXRlcmF0b3IgaXQgPSBtX3RpbGVzLmJlZ2luKCksIGVuZCA9IG1fdGlsZXMuZW5kKCk7IGl0
ICE9IGVuZDsgKytpdCkKLSAgICAgICAgaXQtPnZhbHVlLmxheWVyLT5zZXRDb250ZW50c1NjYWxl
KGRldmljZVNjYWxlRmFjdG9yKTsKKyAgICB0aWxlR3JpZCgpLnNldFNjYWxlKHNjYWxlKTsKIH0K
IAogdm9pZCBUaWxlQ29udHJvbGxlcjo6c2V0QWNjZWxlcmF0ZXNEcmF3aW5nKGJvb2wgYWNjZWxl
cmF0ZXNEcmF3aW5nKQogewogICAgIGlmIChtX2FjY2VsZXJhdGVzRHJhd2luZyA9PSBhY2NlbGVy
YXRlc0RyYXdpbmcpCiAgICAgICAgIHJldHVybjsKLQogICAgIG1fYWNjZWxlcmF0ZXNEcmF3aW5n
ID0gYWNjZWxlcmF0ZXNEcmF3aW5nOwogCi0gICAgZm9yIChUaWxlTWFwOjpjb25zdF9pdGVyYXRv
ciBpdCA9IG1fdGlsZXMuYmVnaW4oKSwgZW5kID0gbV90aWxlcy5lbmQoKTsgaXQgIT0gZW5kOyAr
K2l0KSB7Ci0gICAgICAgIGNvbnN0IFRpbGVJbmZvJiB0aWxlSW5mbyA9IGl0LT52YWx1ZTsKLSAg
ICAgICAgdGlsZUluZm8ubGF5ZXItPnNldEFjY2VsZXJhdGVzRHJhd2luZyhtX2FjY2VsZXJhdGVz
RHJhd2luZyk7Ci0gICAgfQorICAgIHRpbGVHcmlkKCkudXBkYXRlVGlsZXJMYXllclByb3BlcnRp
ZXMoKTsKIH0KIAogdm9pZCBUaWxlQ29udHJvbGxlcjo6c2V0VGlsZXNPcGFxdWUoYm9vbCBvcGFx
dWUpCiB7CiAgICAgaWYgKG9wYXF1ZSA9PSBtX3RpbGVzQXJlT3BhcXVlKQogICAgICAgICByZXR1
cm47Ci0KICAgICBtX3RpbGVzQXJlT3BhcXVlID0gb3BhcXVlOwogCi0gICAgZm9yIChUaWxlTWFw
OjppdGVyYXRvciBpdCA9IG1fdGlsZXMuYmVnaW4oKSwgZW5kID0gbV90aWxlcy5lbmQoKTsgaXQg
IT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIGNvbnN0IFRpbGVJbmZvJiB0aWxlSW5mbyA9IGl0LT52
YWx1ZTsKLSAgICAgICAgdGlsZUluZm8ubGF5ZXItPnNldE9wYXF1ZShvcGFxdWUpOwotICAgIH0K
KyAgICB0aWxlR3JpZCgpLnVwZGF0ZVRpbGVyTGF5ZXJQcm9wZXJ0aWVzKCk7CiB9CiAKIHZvaWQg
VGlsZUNvbnRyb2xsZXI6OnNldFZpc2libGVSZWN0KGNvbnN0IEZsb2F0UmVjdCYgdmlzaWJsZVJl
Y3QpCkBAIC0yODgsMjQgKzIxMCw5IEBAIHZvaWQgVGlsZUNvbnRyb2xsZXI6OnNldFZpc2libGVS
ZWN0KGNvbnMKIAogYm9vbCBUaWxlQ29udHJvbGxlcjo6dGlsZXNXb3VsZENoYW5nZUZvclZpc2li
bGVSZWN0KGNvbnN0IEZsb2F0UmVjdCYgbmV3VmlzaWJsZVJlY3QpIGNvbnN0CiB7Ci0gICAgRmxv
YXRSZWN0IHZpc2libGVSZWN0ID0gbmV3VmlzaWJsZVJlY3Q7Ci0gICAgdmlzaWJsZVJlY3QuaW50
ZXJzZWN0KHNjYWxlZEV4cG9zZWRSZWN0KCkpOwotCi0gICAgaWYgKHZpc2libGVSZWN0LmlzRW1w
dHkoKSB8fCBib3VuZHMoKS5pc0VtcHR5KCkpCisgICAgaWYgKGJvdW5kcygpLmlzRW1wdHkoKSkK
ICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAKLSAgICBGbG9hdFJlY3QgY3VycmVudFRp
bGVDb3ZlcmFnZVJlY3QgPSBjb21wdXRlVGlsZUNvdmVyYWdlUmVjdChtX3Zpc2libGVSZWN0LCBu
ZXdWaXNpYmxlUmVjdCk7Ci0gICAgRmxvYXRSZWN0IHNjYWxlZFJlY3QoY3VycmVudFRpbGVDb3Zl
cmFnZVJlY3QpOwotICAgIHNjYWxlZFJlY3Quc2NhbGUobV9zY2FsZSk7Ci0gICAgSW50UmVjdCBj
dXJyZW50Q292ZXJhZ2VSZWN0SW5UaWxlQ29vcmRzKGVuY2xvc2luZ0ludFJlY3Qoc2NhbGVkUmVj
dCkpOwotCi0gICAgVGlsZUluZGV4IHRvcExlZnQ7Ci0gICAgVGlsZUluZGV4IGJvdHRvbVJpZ2h0
OwotICAgIGdldFRpbGVJbmRleFJhbmdlRm9yUmVjdChjdXJyZW50Q292ZXJhZ2VSZWN0SW5UaWxl
Q29vcmRzLCB0b3BMZWZ0LCBib3R0b21SaWdodCk7Ci0KLSAgICBJbnRSZWN0IGNvdmVyYWdlUmVj
dCA9IHJlY3RGb3JUaWxlSW5kZXgodG9wTGVmdCk7Ci0gICAgY292ZXJhZ2VSZWN0LnVuaXRlKHJl
Y3RGb3JUaWxlSW5kZXgoYm90dG9tUmlnaHQpKTsKLSAgICByZXR1cm4gY292ZXJhZ2VSZWN0ICE9
IG1fcHJpbWFyeVRpbGVDb3ZlcmFnZVJlY3Q7CisgICAgcmV0dXJuIHRpbGVHcmlkKCkudGlsZXNX
b3VsZENoYW5nZUZvclZpc2libGVSZWN0KG5ld1Zpc2libGVSZWN0LCBtX3Zpc2libGVSZWN0KTsK
IH0KIAogdm9pZCBUaWxlQ29udHJvbGxlcjo6c2V0RXhwb3NlZFJlY3QoY29uc3QgRmxvYXRSZWN0
JiBleHBvc2VkUmVjdCkKQEAgLTMxNywyNCArMjI0LDEwIEBAIHZvaWQgVGlsZUNvbnRyb2xsZXI6
OnNldEV4cG9zZWRSZWN0KGNvbnMKICAgICBzZXROZWVkc1JldmFsaWRhdGVUaWxlcygpOwogfQog
Ci1GbG9hdFJlY3QgVGlsZUNvbnRyb2xsZXI6OnNjYWxlZEV4cG9zZWRSZWN0KCkgY29uc3QKLXsK
LSAgICBGbG9hdFJlY3Qgc2NhbGVkRXhwb3NlZFJlY3QgPSBtX2V4cG9zZWRSZWN0OwotICAgIHNj
YWxlZEV4cG9zZWRSZWN0LnNjYWxlKDEgLyBtX3NjYWxlKTsKLSAgICByZXR1cm4gc2NhbGVkRXhw
b3NlZFJlY3Q7Ci19Ci0KIHZvaWQgVGlsZUNvbnRyb2xsZXI6OnByZXBvcHVsYXRlUmVjdChjb25z
dCBGbG9hdFJlY3QmIHJlY3QpCiB7Ci0gICAgRmxvYXRSZWN0IHNjYWxlZFJlY3QocmVjdCk7Ci0g
ICAgc2NhbGVkUmVjdC5zY2FsZShtX3NjYWxlKTsKLSAgICBJbnRSZWN0IHJlY3RJblRpbGVDb29y
ZHMoZW5jbG9zaW5nSW50UmVjdChzY2FsZWRSZWN0KSk7Ci0KLSAgICBpZiAobV9wcmltYXJ5VGls
ZUNvdmVyYWdlUmVjdC5jb250YWlucyhyZWN0SW5UaWxlQ29vcmRzKSkKLSAgICAgICAgcmV0dXJu
OwotICAgIAotICAgIG1fc2Vjb25kYXJ5VGlsZUNvdmVyYWdlUmVjdHMuYXBwZW5kKHJlY3QpOwot
ICAgIHNldE5lZWRzUmV2YWxpZGF0ZVRpbGVzKCk7CisgICAgaWYgKHRpbGVHcmlkKCkucHJlcG9w
dWxhdGVSZWN0KHJlY3QpKQorICAgICAgICBzZXROZWVkc1JldmFsaWRhdGVUaWxlcygpOwogfQog
CiB2b2lkIFRpbGVDb250cm9sbGVyOjpzZXRJc0luV2luZG93KGJvb2wgaXNJbldpbmRvdykKQEAg
LTM2NCw3ICsyNTcsOCBAQCB2b2lkIFRpbGVDb250cm9sbGVyOjpzZXRUaWxlQ292ZXJhZ2UoVGls
CiB2b2lkIFRpbGVDb250cm9sbGVyOjpyZXZhbGlkYXRlVGlsZXMoKQogewogICAgIEFTU0VSVChv
d25pbmdHcmFwaGljc0xheWVyKCktPmlzQ29tbWl0dGluZ0NoYW5nZXMoKSk7Ci0gICAgcmV2YWxp
ZGF0ZVRpbGVzKDAsIDApOworICAgIHRpbGVHcmlkKCkucmV2YWxpZGF0ZVRpbGVzKDApOworICAg
IG1fdmlzaWJsZVJlY3RBdExhc3RSZXZhbGlkYXRlID0gbV92aXNpYmxlUmVjdDsKIH0KIAogdm9p
ZCBUaWxlQ29udHJvbGxlcjo6Zm9yY2VSZXBhaW50KCkKQEAgLTM3NiwyMiArMjcwLDE4IEBAIHZv
aWQgVGlsZUNvbnRyb2xsZXI6OnNldFRpbGVEZWJ1Z0JvcmRlclcKIHsKICAgICBpZiAobV90aWxl
RGVidWdCb3JkZXJXaWR0aCA9PSBib3JkZXJXaWR0aCkKICAgICAgICAgcmV0dXJuOwotCiAgICAg
bV90aWxlRGVidWdCb3JkZXJXaWR0aCA9IGJvcmRlcldpZHRoOwotICAgIGZvciAoVGlsZU1hcDo6
Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3RpbGVzLmJlZ2luKCksIGVuZCA9IG1fdGlsZXMuZW5kKCk7
IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICBjb25zdCBUaWxlSW5mbyYgdGlsZUluZm8gPSBp
dC0+dmFsdWU7Ci0gICAgICAgIHRpbGVJbmZvLmxheWVyLT5zZXRCb3JkZXJXaWR0aChtX3RpbGVE
ZWJ1Z0JvcmRlcldpZHRoKTsKLSAgICB9CisKKyAgICB0aWxlR3JpZCgpLnVwZGF0ZVRpbGVyTGF5
ZXJQcm9wZXJ0aWVzKCk7CiB9CiAKIHZvaWQgVGlsZUNvbnRyb2xsZXI6OnNldFRpbGVEZWJ1Z0Jv
cmRlckNvbG9yKENvbG9yIGJvcmRlckNvbG9yKQogewogICAgIGlmIChtX3RpbGVEZWJ1Z0JvcmRl
ckNvbG9yID09IGJvcmRlckNvbG9yKQogICAgICAgICByZXR1cm47Ci0KICAgICBtX3RpbGVEZWJ1
Z0JvcmRlckNvbG9yID0gYm9yZGVyQ29sb3I7Ci0gICAgZm9yIChUaWxlTWFwOjpjb25zdF9pdGVy
YXRvciBpdCA9IG1fdGlsZXMuYmVnaW4oKSwgZW5kID0gbV90aWxlcy5lbmQoKTsgaXQgIT0gZW5k
OyArK2l0KQotICAgICAgICBpdC0+dmFsdWUubGF5ZXItPnNldEJvcmRlckNvbG9yKGJvcmRlckNv
bG9yKTsKKworICAgIHRpbGVHcmlkKCkudXBkYXRlVGlsZXJMYXllclByb3BlcnRpZXMoKTsKIH0K
IAogSW50UmVjdCBUaWxlQ29udHJvbGxlcjo6Ym91bmRzKCkgY29uc3QKQEAgLTQxNSw4MCArMzA1
LDggQEAgSW50UmVjdCBUaWxlQ29udHJvbGxlcjo6Ym91bmRzQXRMYXN0UmV2YQogICAgIHJldHVy
biBib3VuZHNXaXRob3V0TWFyZ2luOwogfQogCi12b2lkIFRpbGVDb250cm9sbGVyOjphZGp1c3RS
ZWN0QXRUaWxlSW5kZXhGb3JNYXJnaW4oY29uc3QgVGlsZUluZGV4JiB0aWxlSW5kZXgsIEludFJl
Y3QmIHJlY3QpIGNvbnN0Ci17Ci0gICAgaWYgKCFoYXNNYXJnaW5zKCkpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIC8vIFRoaXMgaXMgYSB0aWxlIGluIHRoZSB0b3AgbWFyZ2luLgotICAgIGlmICht
X21hcmdpblRvcCAmJiB0aWxlSW5kZXgueSgpIDwgMCkgewotICAgICAgICByZWN0LnNldFkodGls
ZUluZGV4LnkoKSAqIHRvcE1hcmdpbkhlaWdodCgpKTsKLSAgICAgICAgcmVjdC5zZXRIZWlnaHQo
dG9wTWFyZ2luSGVpZ2h0KCkpOwotICAgIH0KLQotICAgIC8vIFRoaXMgaXMgYSB0aWxlIGluIHRo
ZSBsZWZ0IG1hcmdpbi4KLSAgICBpZiAobV9tYXJnaW5MZWZ0ICYmIHRpbGVJbmRleC54KCkgPCAw
KSB7Ci0gICAgICAgIHJlY3Quc2V0WCh0aWxlSW5kZXgueCgpICogbGVmdE1hcmdpbldpZHRoKCkp
OwotICAgICAgICByZWN0LnNldFdpZHRoKGxlZnRNYXJnaW5XaWR0aCgpKTsKLSAgICB9Ci0KLSAg
ICBUaWxlSW5kZXggY29udGVudFRvcExlZnQ7Ci0gICAgVGlsZUluZGV4IGNvbnRlbnRCb3R0b21S
aWdodDsKLSAgICBnZXRUaWxlSW5kZXhSYW5nZUZvclJlY3QoYm91bmRzV2l0aG91dE1hcmdpbigp
LCBjb250ZW50VG9wTGVmdCwgY29udGVudEJvdHRvbVJpZ2h0KTsKLQotICAgIC8vIFRoaXMgaXMg
YSB0aWxlIGluIHRoZSBib3R0b20gbWFyZ2luLgotICAgIGlmIChtX21hcmdpbkJvdHRvbSAmJiB0
aWxlSW5kZXgueSgpID4gY29udGVudEJvdHRvbVJpZ2h0LnkoKSkKLSAgICAgICAgcmVjdC5zZXRI
ZWlnaHQoYm90dG9tTWFyZ2luSGVpZ2h0KCkpOwotCi0gICAgLy8gVGhpcyBpcyBhIHRpbGUgaW4g
dGhlIHJpZ2h0IG1hcmdpbi4KLSAgICBpZiAobV9tYXJnaW5SaWdodCAmJiB0aWxlSW5kZXgueCgp
ID4gY29udGVudEJvdHRvbVJpZ2h0LngoKSkKLSAgICAgICAgcmVjdC5zZXRXaWR0aChyaWdodE1h
cmdpbldpZHRoKCkpOwotfQotCi1JbnRSZWN0IFRpbGVDb250cm9sbGVyOjpyZWN0Rm9yVGlsZUlu
ZGV4KGNvbnN0IFRpbGVJbmRleCYgdGlsZUluZGV4KSBjb25zdAorRmxvYXRSZWN0IFRpbGVDb250
cm9sbGVyOjpjb21wdXRlVGlsZUNvdmVyYWdlUmVjdChjb25zdCBGbG9hdFJlY3QmIHByZXZpb3Vz
VmlzaWJsZVJlY3QsIGNvbnN0IEZsb2F0UmVjdCYgdmlzaWJsZVJlY3QpIGNvbnN0CiB7Ci0gICAg
SW50UmVjdCByZWN0KHRpbGVJbmRleC54KCkgKiBtX3RpbGVTaXplLndpZHRoKCksIHRpbGVJbmRl
eC55KCkgKiBtX3RpbGVTaXplLmhlaWdodCgpLCBtX3RpbGVTaXplLndpZHRoKCksIG1fdGlsZVNp
emUuaGVpZ2h0KCkpOwotICAgIEludFJlY3Qgc2NhbGVkQm91bmRzKGJvdW5kcygpKTsKLSAgICBz
Y2FsZWRCb3VuZHMuc2NhbGUobV9zY2FsZSk7Ci0KLSAgICByZWN0LmludGVyc2VjdChzY2FsZWRC
b3VuZHMpOwotCi0gICAgLy8gVGhlc2UgcmVjdCBjb21wdXRhdGlvbnMgYXNzdW1lIG1fdGlsZVNp
emUgaXMgdGhlIGNvcnJlY3Qgc2l6ZSB0byB1c2UuIEhvd2V2ZXIsIGEgdGlsZSBpbiB0aGUgbWFy
Z2luIGFyZWEKLSAgICAvLyBtaWdodCBiZSBhIGRpZmZlcmVudCBzaXplIGRlcGVuZGluZyBvbiB0
aGUgc2l6ZSBvZiB0aGUgbWFyZ2lucy4gU28gYWRqdXN0UmVjdEF0VGlsZUluZGV4Rm9yTWFyZ2lu
KCkgd2lsbAotICAgIC8vIGZpeCB0aGUgcmVjdCB3ZSd2ZSBjb21wdXRlZCB0byBtYXRjaCB0aGUg
bWFyZ2luIHNpemVzIGlmIHRoaXMgdGlsZSBpcyBpbiB0aGUgbWFyZ2lucy4KLSAgICBhZGp1c3RS
ZWN0QXRUaWxlSW5kZXhGb3JNYXJnaW4odGlsZUluZGV4LCByZWN0KTsKLQotICAgIHJldHVybiBy
ZWN0OwotfQotCi12b2lkIFRpbGVDb250cm9sbGVyOjpnZXRUaWxlSW5kZXhSYW5nZUZvclJlY3Qo
Y29uc3QgSW50UmVjdCYgcmVjdCwgVGlsZUluZGV4JiB0b3BMZWZ0LCBUaWxlSW5kZXgmIGJvdHRv
bVJpZ2h0KSBjb25zdAotewotICAgIEludFJlY3QgY2xhbXBlZFJlY3QgPSBib3VuZHMoKTsKLSAg
ICBjbGFtcGVkUmVjdC5zY2FsZShtX3NjYWxlKTsKLSAgICBjbGFtcGVkUmVjdC5pbnRlcnNlY3Qo
cmVjdCk7Ci0KLSAgICBpZiAoY2xhbXBlZFJlY3QueCgpID49IDApCi0gICAgICAgIHRvcExlZnQu
c2V0WChjbGFtcGVkUmVjdC54KCkgLyBtX3RpbGVTaXplLndpZHRoKCkpOwotICAgIGVsc2UKLSAg
ICAgICAgdG9wTGVmdC5zZXRYKGZsb29yZigoZmxvYXQpY2xhbXBlZFJlY3QueCgpIC8gbGVmdE1h
cmdpbldpZHRoKCkpKTsKLQotICAgIGlmIChjbGFtcGVkUmVjdC55KCkgPj0gMCkKLSAgICAgICAg
dG9wTGVmdC5zZXRZKGNsYW1wZWRSZWN0LnkoKSAvIG1fdGlsZVNpemUuaGVpZ2h0KCkpOwotICAg
IGVsc2UKLSAgICAgICAgdG9wTGVmdC5zZXRZKGZsb29yZigoZmxvYXQpY2xhbXBlZFJlY3QueSgp
IC8gdG9wTWFyZ2luSGVpZ2h0KCkpKTsKLQotICAgIGludCBib3R0b21YUmF0aW8gPSBjZWlsKChm
bG9hdCljbGFtcGVkUmVjdC5tYXhYKCkgLyBtX3RpbGVTaXplLndpZHRoKCkpOwotICAgIGJvdHRv
bVJpZ2h0LnNldFgoc3RkOjptYXgoYm90dG9tWFJhdGlvIC0gMSwgMCkpOwotCi0gICAgaW50IGJv
dHRvbVlSYXRpbyA9IGNlaWwoKGZsb2F0KWNsYW1wZWRSZWN0Lm1heFkoKSAvIG1fdGlsZVNpemUu
aGVpZ2h0KCkpOwotICAgIGJvdHRvbVJpZ2h0LnNldFkoc3RkOjptYXgoYm90dG9tWVJhdGlvIC0g
MSwgMCkpOwotfQotCi1GbG9hdFJlY3QgVGlsZUNvbnRyb2xsZXI6OmNvbXB1dGVUaWxlQ292ZXJh
Z2VSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcHJldmlvdXNWaXNpYmxlUmVjdCwgY29uc3QgRmxvYXRS
ZWN0JiBjdXJyZW50VmlzaWJsZVJlY3QpIGNvbnN0Ci17Ci0gICAgRmxvYXRSZWN0IHZpc2libGVS
ZWN0ID0gY3VycmVudFZpc2libGVSZWN0OwotICAgIHZpc2libGVSZWN0LmludGVyc2VjdChzY2Fs
ZWRFeHBvc2VkUmVjdCgpKTsKLQogICAgIC8vIElmIHRoZSBwYWdlIGlzIG5vdCBpbiBhIHdpbmRv
dyAoZm9yIGV4YW1wbGUgaWYgaXQncyBpbiBhIGJhY2tncm91bmQgdGFiKSwgd2UgbGltaXQgdGhl
IHRpbGUgY292ZXJhZ2UgcmVjdCB0byB0aGUgdmlzaWJsZSByZWN0LgogICAgIGlmICghbV9pc0lu
V2luZG93KQogICAgICAgICByZXR1cm4gdmlzaWJsZVJlY3Q7CkBAIC01MzYsNiArMzU0LDE2IEBA
IHZvaWQgVGlsZUNvbnRyb2xsZXI6OnNjaGVkdWxlVGlsZVJldmFsaWQKICAgICBtX3RpbGVSZXZh
bGlkYXRpb25UaW1lci5zdGFydE9uZVNob3QoaW50ZXJ2YWwpOwogfQogCitib29sIFRpbGVDb250
cm9sbGVyOjpzaG91bGRBZ2dyZXNzaXZlbHlSZXRhaW5UaWxlcygpIGNvbnN0Cit7CisgICAgcmV0
dXJuIG93bmluZ0dyYXBoaWNzTGF5ZXIoKS0+cGxhdGZvcm1DQUxheWVyU2hvdWxkQWdncmVzc2l2
ZWx5UmV0YWluVGlsZXMobV90aWxlQ2FjaGVMYXllcik7Cit9CisKK2Jvb2wgVGlsZUNvbnRyb2xs
ZXI6OnNob3VsZFRlbXBvcmFyaWx5UmV0YWluVGlsZUNvaG9ydHMoKSBjb25zdAoreworICAgIHJl
dHVybiBvd25pbmdHcmFwaGljc0xheWVyKCktPnBsYXRmb3JtQ0FMYXllclNob3VsZFRlbXBvcmFy
aWx5UmV0YWluVGlsZUNvaG9ydHMobV90aWxlQ2FjaGVMYXllcik7Cit9CisKIHZvaWQgVGlsZUNv
bnRyb2xsZXI6OnRpbGVSZXZhbGlkYXRpb25UaW1lckZpcmVkKFRpbWVyPFRpbGVDb250cm9sbGVy
PiopCiB7CiAgICAgaWYgKG1faXNJbldpbmRvdykgewpAQCAtNTQzLDIyICszNzEsMjIgQEAgdm9p
ZCBUaWxlQ29udHJvbGxlcjo6dGlsZVJldmFsaWRhdGlvblRpbQogICAgICAgICByZXR1cm47CiAg
ICAgfQogCi0gICAgVGlsZVZhbGlkYXRpb25Qb2xpY3lGbGFncyBmb3JlZ3JvdW5kVmFsaWRhdGlv
blBvbGljeSA9IG93bmluZ0dyYXBoaWNzTGF5ZXIoKS0+cGxhdGZvcm1DQUxheWVyU2hvdWxkQWdn
cmVzc2l2ZWx5UmV0YWluVGlsZXMobV90aWxlQ2FjaGVMYXllcikgPyAwIDogUHJ1bmVTZWNvbmRh
cnlUaWxlczsKLSAgICBUaWxlVmFsaWRhdGlvblBvbGljeUZsYWdzIGJhY2tncm91bmRWYWxpZGF0
aW9uUG9saWN5ID0gZm9yZWdyb3VuZFZhbGlkYXRpb25Qb2xpY3kgfCBVbnBhcmVudEFsbFRpbGVz
OworICAgIFRpbGVHcmlkOjpUaWxlVmFsaWRhdGlvblBvbGljeUZsYWdzIHZhbGlkYXRpb25Qb2xp
Y3kgPSAoc2hvdWxkQWdncmVzc2l2ZWx5UmV0YWluVGlsZXMoKSA/IDAgOiBQcnVuZVNlY29uZGFy
eVRpbGVzKSB8IFVucGFyZW50QWxsVGlsZXM7CiAKLSAgICByZXZhbGlkYXRlVGlsZXMoZm9yZWdy
b3VuZFZhbGlkYXRpb25Qb2xpY3ksIGJhY2tncm91bmRWYWxpZGF0aW9uUG9saWN5KTsKKyAgICB0
aWxlR3JpZCgpLnJldmFsaWRhdGVUaWxlcyh2YWxpZGF0aW9uUG9saWN5KTsKIH0KIAotdW5zaWdu
ZWQgVGlsZUNvbnRyb2xsZXI6OmJsYW5rUGl4ZWxDb3VudCgpIGNvbnN0Cit2b2lkIFRpbGVDb250
cm9sbGVyOjpkaWRSZXZhbGlkYXRlVGlsZXMoKQogewotICAgIFBsYXRmb3JtTGF5ZXJMaXN0IHRp
bGVzKG1fdGlsZXMuc2l6ZSgpKTsKKyAgICBtX3Zpc2libGVSZWN0QXRMYXN0UmV2YWxpZGF0ZSA9
IHZpc2libGVSZWN0KCk7CisgICAgbV9ib3VuZHNBdExhc3RSZXZhbGlkYXRlID0gYm91bmRzKCk7
CiAKLSAgICBmb3IgKFRpbGVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV90aWxlcy5iZWdpbigp
LCBlbmQgPSBtX3RpbGVzLmVuZCgpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgaWYgKFBs
YXRmb3JtTGF5ZXIgKmxheWVyID0gaXQtPnZhbHVlLmxheWVyLT5wbGF0Zm9ybUxheWVyKCkpCi0g
ICAgICAgICAgICB0aWxlcy5hcHBlbmQobGF5ZXIpOwotICAgIH0KKyAgICB1cGRhdGVUaWxlQ292
ZXJhZ2VNYXAoKTsKK30KIAotICAgIHJldHVybiBibGFua1BpeGVsQ291bnRGb3JUaWxlcyh0aWxl
cywgbV92aXNpYmxlUmVjdCwgSW50UG9pbnQoMCwwKSk7Cit1bnNpZ25lZCBUaWxlQ29udHJvbGxl
cjo6YmxhbmtQaXhlbENvdW50KCkgY29uc3QKK3sKKyAgICByZXR1cm4gdGlsZUdyaWQoKS5ibGFu
a1BpeGVsQ291bnQoKTsKIH0KIAogdW5zaWduZWQgVGlsZUNvbnRyb2xsZXI6OmJsYW5rUGl4ZWxD
b3VudEZvclRpbGVzKGNvbnN0IFBsYXRmb3JtTGF5ZXJMaXN0JiB0aWxlcywgY29uc3QgRmxvYXRS
ZWN0JiB2aXNpYmxlUmVjdCwgY29uc3QgSW50UG9pbnQmIHRpbGVUcmFuc2xhdGlvbikKQEAgLTU4
MSwzMjQgKzQwOSwxOSBAQCB1bnNpZ25lZCBUaWxlQ29udHJvbGxlcjo6YmxhbmtQaXhlbENvdW50
CiAgICAgcmV0dXJuIHVuY292ZXJlZFJlZ2lvbi50b3RhbEFyZWEoKTsKIH0KIAotc3RhdGljIGlu
bGluZSB2b2lkIHF1ZXVlVGlsZUZvclJlbW92YWwoY29uc3QgVGlsZUNvbnRyb2xsZXI6OlRpbGVJ
bmRleCYgdGlsZUluZGV4LCBjb25zdCBUaWxlQ29udHJvbGxlcjo6VGlsZUluZm8mIHRpbGVJbmZv
LCBWZWN0b3I8VGlsZUNvbnRyb2xsZXI6OlRpbGVJbmRleD4mIHRpbGVzVG9SZW1vdmUsIFRpbGVD
b250cm9sbGVyOjpSZXBhaW50Q291bnRNYXAmIHJlcGFpbnRDb3VudHMpCi17Ci0gICAgdGlsZUlu
Zm8ubGF5ZXItPnJlbW92ZUZyb21TdXBlcmxheWVyKCk7Ci0gICAgcmVwYWludENvdW50cy5yZW1v
dmUodGlsZUluZm8ubGF5ZXIuZ2V0KCkpOwotICAgIHRpbGVzVG9SZW1vdmUuYXBwZW5kKHRpbGVJ
bmRleCk7Ci19Ci0KLXZvaWQgVGlsZUNvbnRyb2xsZXI6OnJlbW92ZUFsbFRpbGVzKCkKLXsKLSAg
ICBWZWN0b3I8VGlsZUluZGV4PiB0aWxlc1RvUmVtb3ZlOwotCi0gICAgZm9yIChUaWxlTWFwOjpp
dGVyYXRvciBpdCA9IG1fdGlsZXMuYmVnaW4oKSwgZW5kID0gbV90aWxlcy5lbmQoKTsgaXQgIT0g
ZW5kOyArK2l0KQotICAgICAgICBxdWV1ZVRpbGVGb3JSZW1vdmFsKGl0LT5rZXksIGl0LT52YWx1
ZSwgdGlsZXNUb1JlbW92ZSwgbV90aWxlUmVwYWludENvdW50cyk7Ci0KLSAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IHRpbGVzVG9SZW1vdmUuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgVGlsZUlu
Zm8gdGlsZUluZm8gPSBtX3RpbGVzLnRha2UodGlsZXNUb1JlbW92ZVtpXSk7Ci0jaWYgIVBMQVRG
T1JNKElPUykKLSAgICAgICAgTGF5ZXJQb29sOjpzaGFyZWRQb29sKCktPmFkZExheWVyKHRpbGVJ
bmZvLmxheWVyKTsKLSNlbmRpZgotICAgIH0KLX0KLQotdm9pZCBUaWxlQ29udHJvbGxlcjo6cmVt
b3ZlQWxsU2Vjb25kYXJ5VGlsZXMoKQotewotICAgIFZlY3RvcjxUaWxlSW5kZXg+IHRpbGVzVG9S
ZW1vdmU7Ci0KLSAgICBmb3IgKFRpbGVNYXA6Oml0ZXJhdG9yIGl0ID0gbV90aWxlcy5iZWdpbigp
LCBlbmQgPSBtX3RpbGVzLmVuZCgpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgY29uc3Qg
VGlsZUluZm8mIHRpbGVJbmZvID0gaXQtPnZhbHVlOwotICAgICAgICBpZiAodGlsZUluZm8uY29o
b3J0ID09IFZpc2libGVUaWxlQ29ob3J0KQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAg
ICAgcXVldWVUaWxlRm9yUmVtb3ZhbChpdC0+a2V5LCBpdC0+dmFsdWUsIHRpbGVzVG9SZW1vdmUs
IG1fdGlsZVJlcGFpbnRDb3VudHMpOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgdGlsZXNUb1JlbW92ZS5zaXplKCk7ICsraSkgewotICAgICAgICBUaWxlSW5mbyB0aWxlSW5m
byA9IG1fdGlsZXMudGFrZSh0aWxlc1RvUmVtb3ZlW2ldKTsKLSNpZiAhUExBVEZPUk0oSU9TKQot
ICAgICAgICBMYXllclBvb2w6OnNoYXJlZFBvb2woKS0+YWRkTGF5ZXIodGlsZUluZm8ubGF5ZXIp
OwotI2VuZGlmCi0gICAgfQotfQotCi12b2lkIFRpbGVDb250cm9sbGVyOjpyZW1vdmVUaWxlc0lu
Q29ob3J0KFRpbGVDb2hvcnQgY29ob3J0KQotewotICAgIEFTU0VSVChjb2hvcnQgIT0gVmlzaWJs
ZVRpbGVDb2hvcnQpOwotICAgIFZlY3RvcjxUaWxlSW5kZXg+IHRpbGVzVG9SZW1vdmU7Ci0KLSAg
ICBmb3IgKFRpbGVNYXA6Oml0ZXJhdG9yIGl0ID0gbV90aWxlcy5iZWdpbigpLCBlbmQgPSBtX3Rp
bGVzLmVuZCgpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgY29uc3QgVGlsZUluZm8mIHRp
bGVJbmZvID0gaXQtPnZhbHVlOwotICAgICAgICBpZiAodGlsZUluZm8uY29ob3J0ICE9IGNvaG9y
dCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIHF1ZXVlVGlsZUZvclJlbW92YWwo
aXQtPmtleSwgaXQtPnZhbHVlLCB0aWxlc1RvUmVtb3ZlLCBtX3RpbGVSZXBhaW50Q291bnRzKTsK
LSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRpbGVzVG9SZW1vdmUuc2l6ZSgp
OyArK2kpIHsKLSAgICAgICAgVGlsZUluZm8gdGlsZUluZm8gPSBtX3RpbGVzLnRha2UodGlsZXNU
b1JlbW92ZVtpXSk7Ci0jaWYgIVBMQVRGT1JNKElPUykKLSAgICAgICAgTGF5ZXJQb29sOjpzaGFy
ZWRQb29sKCktPmFkZExheWVyKHRpbGVJbmZvLmxheWVyKTsKLSNlbmRpZgotICAgIH0KLX0KLQog
dm9pZCBUaWxlQ29udHJvbGxlcjo6c2V0TmVlZHNSZXZhbGlkYXRlVGlsZXMoKQogewogICAgIG93
bmluZ0dyYXBoaWNzTGF5ZXIoKS0+cGxhdGZvcm1DQUxheWVyU2V0TmVlZHNUb1JldmFsaWRhdGVU
aWxlcygpOwogfQogCi12b2lkIFRpbGVDb250cm9sbGVyOjpyZXZhbGlkYXRlVGlsZXMoVGlsZVZh
bGlkYXRpb25Qb2xpY3lGbGFncyBmb3JlZ3JvdW5kVmFsaWRhdGlvblBvbGljeSwgVGlsZVZhbGlk
YXRpb25Qb2xpY3lGbGFncyBiYWNrZ3JvdW5kVmFsaWRhdGlvblBvbGljeSkKLXsKLSAgICBGbG9h
dFJlY3QgdmlzaWJsZVJlY3QgPSBtX3Zpc2libGVSZWN0OwotICAgIEludFJlY3QgYm91bmRzID0g
dGhpcy0+Ym91bmRzKCk7Ci0KLSAgICB2aXNpYmxlUmVjdC5pbnRlcnNlY3Qoc2NhbGVkRXhwb3Nl
ZFJlY3QoKSk7Ci0KLSAgICBpZiAodmlzaWJsZVJlY3QuaXNFbXB0eSgpIHx8IGJvdW5kcy5pc0Vt
cHR5KCkpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBUaWxlVmFsaWRhdGlvblBvbGljeUZs
YWdzIHZhbGlkYXRpb25Qb2xpY3kgPSBtX2lzSW5XaW5kb3cgPyBmb3JlZ3JvdW5kVmFsaWRhdGlv
blBvbGljeSA6IGJhY2tncm91bmRWYWxpZGF0aW9uUG9saWN5OwotICAgIAotICAgIEZsb2F0UmVj
dCB0aWxlQ292ZXJhZ2VSZWN0ID0gY29tcHV0ZVRpbGVDb3ZlcmFnZVJlY3QobV92aXNpYmxlUmVj
dEF0TGFzdFJldmFsaWRhdGUsIG1fdmlzaWJsZVJlY3QpOwotICAgIEZsb2F0UmVjdCBzY2FsZWRS
ZWN0KHRpbGVDb3ZlcmFnZVJlY3QpOwotICAgIHNjYWxlZFJlY3Quc2NhbGUobV9zY2FsZSk7Ci0g
ICAgSW50UmVjdCBjb3ZlcmFnZVJlY3RJblRpbGVDb29yZHMoZW5jbG9zaW5nSW50UmVjdChzY2Fs
ZWRSZWN0KSk7Ci0KLSAgICBUaWxlQ29ob3J0IGN1cnJDb2hvcnQgPSBuZXh0VGlsZUNvaG9ydCgp
OwotICAgIHVuc2lnbmVkIHRpbGVzSW5Db2hvcnQgPSAwOwotCi0gICAgLy8gTW92ZSB0aWxlcyBu
ZXdseSBvdXRzaWRlIHRoZSBjb3ZlcmFnZSByZWN0IGludG8gdGhlIGNvaG9ydCBtYXAuCi0gICAg
Zm9yIChUaWxlTWFwOjppdGVyYXRvciBpdCA9IG1fdGlsZXMuYmVnaW4oKSwgZW5kID0gbV90aWxl
cy5lbmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIFRpbGVJbmZvJiB0aWxlSW5mbyA9
IGl0LT52YWx1ZTsKLSAgICAgICAgVGlsZUluZGV4IHRpbGVJbmRleCA9IGl0LT5rZXk7Ci0KLSAg
ICAgICAgUGxhdGZvcm1DQUxheWVyKiB0aWxlTGF5ZXIgPSB0aWxlSW5mby5sYXllci5nZXQoKTsK
LSAgICAgICAgSW50UmVjdCB0aWxlUmVjdCA9IHJlY3RGb3JUaWxlSW5kZXgodGlsZUluZGV4KTsK
LSAgICAgICAgaWYgKHRpbGVSZWN0LmludGVyc2VjdHMoY292ZXJhZ2VSZWN0SW5UaWxlQ29vcmRz
KSkgewotICAgICAgICAgICAgdGlsZUluZm8uY29ob3J0ID0gVmlzaWJsZVRpbGVDb2hvcnQ7Ci0g
ICAgICAgICAgICBpZiAodGlsZUluZm8uaGFzU3RhbGVDb250ZW50KSB7Ci0gICAgICAgICAgICAg
ICAgLy8gRklYTUU6IHN0b3JlIGEgZGlydHkgcmVnaW9uIHBlciBsYXllcj8KLSAgICAgICAgICAg
ICAgICB0aWxlTGF5ZXItPnNldE5lZWRzRGlzcGxheSgpOwotICAgICAgICAgICAgICAgIHRpbGVJ
bmZvLmhhc1N0YWxlQ29udGVudCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVs
c2UgewotICAgICAgICAgICAgLy8gQWRkIHRvIHRoZSBjdXJyZW50Q29ob3J0IGlmIG5vdCBhbHJl
YWR5IGluIG9uZS4KLSAgICAgICAgICAgIGlmICh0aWxlSW5mby5jb2hvcnQgPT0gVmlzaWJsZVRp
bGVDb2hvcnQpIHsKLSAgICAgICAgICAgICAgICB0aWxlSW5mby5jb2hvcnQgPSBjdXJyQ29ob3J0
OwotICAgICAgICAgICAgICAgICsrdGlsZXNJbkNvaG9ydDsKLQotICAgICAgICAgICAgICAgIGlm
IChtX3VucGFyZW50c09mZnNjcmVlblRpbGVzKQotICAgICAgICAgICAgICAgICAgICB0aWxlTGF5
ZXItPnJlbW92ZUZyb21TdXBlcmxheWVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAg
ICB9Ci0KLSAgICBpZiAodGlsZXNJbkNvaG9ydCkKLSAgICAgICAgc3RhcnRlZE5ld0NvaG9ydChj
dXJyQ29ob3J0KTsKLQotICAgIGlmICghb3duaW5nR3JhcGhpY3NMYXllcigpLT5wbGF0Zm9ybUNB
TGF5ZXJTaG91bGRBZ2dyZXNzaXZlbHlSZXRhaW5UaWxlcyhtX3RpbGVDYWNoZUxheWVyKSkgewot
ICAgICAgICBpZiAob3duaW5nR3JhcGhpY3NMYXllcigpLT5wbGF0Zm9ybUNBTGF5ZXJTaG91bGRU
ZW1wb3JhcmlseVJldGFpblRpbGVDb2hvcnRzKG1fdGlsZUNhY2hlTGF5ZXIpKQotICAgICAgICAg
ICAgc2NoZWR1bGVDb2hvcnRSZW1vdmFsKCk7Ci0gICAgICAgIGVsc2UgaWYgKHRpbGVzSW5Db2hv
cnQpCi0gICAgICAgICAgICByZW1vdmVUaWxlc0luQ29ob3J0KGN1cnJDb2hvcnQpOwotICAgIH0K
LQotICAgIC8vIEVuc3VyZSBwcmltYXJ5IHRpbGUgY292ZXJhZ2UgdGlsZXMuCi0gICAgbV9wcmlt
YXJ5VGlsZUNvdmVyYWdlUmVjdCA9IGVuc3VyZVRpbGVzRm9yUmVjdCh0aWxlQ292ZXJhZ2VSZWN0
LCBDb3ZlcmFnZVR5cGU6OlByaW1hcnlUaWxlcyk7Ci0KLSAgICBpZiAodmFsaWRhdGlvblBvbGlj
eSAmIFBydW5lU2Vjb25kYXJ5VGlsZXMpIHsKLSAgICAgICAgcmVtb3ZlQWxsU2Vjb25kYXJ5VGls
ZXMoKTsKLSAgICAgICAgbV9jb2hvcnRMaXN0LmNsZWFyKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAg
ICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3NlY29uZGFyeVRpbGVDb3ZlcmFnZVJlY3RzLnNp
emUoKTsgKytpKQotICAgICAgICAgICAgZW5zdXJlVGlsZXNGb3JSZWN0KG1fc2Vjb25kYXJ5VGls
ZUNvdmVyYWdlUmVjdHNbaV0sIENvdmVyYWdlVHlwZTo6U2Vjb25kYXJ5VGlsZXMpOwotICAgICAg
ICBtX3NlY29uZGFyeVRpbGVDb3ZlcmFnZVJlY3RzLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgaWYg
KG1fdW5wYXJlbnRzT2Zmc2NyZWVuVGlsZXMgJiYgKHZhbGlkYXRpb25Qb2xpY3kgJiBVbnBhcmVu
dEFsbFRpbGVzKSkgewotICAgICAgICBmb3IgKFRpbGVNYXA6Oml0ZXJhdG9yIGl0ID0gbV90aWxl
cy5iZWdpbigpLCBlbmQgPSBtX3RpbGVzLmVuZCgpOyBpdCAhPSBlbmQ7ICsraXQpCi0gICAgICAg
ICAgICBpdC0+dmFsdWUubGF5ZXItPnJlbW92ZUZyb21TdXBlcmxheWVyKCk7Ci0gICAgfQotCi0g
ICAgaWYgKG1fYm91bmRzQXRMYXN0UmV2YWxpZGF0ZSAhPSBib3VuZHMpIHsKLSAgICAgICAgLy8g
SWYgdGhlcmUgYXJlIG1hcmdpbiB0aWxlcyBhbmQgdGhlIGJvdW5kcyBoYXZlIGdyb3duIHRhbGxl
ciBvciB3aWRlciwgdGhlbiB0aGUgdGlsZXMgdGhhdCB1c2VkIHRvCi0gICAgICAgIC8vIGJlIGJv
dHRvbSBvciByaWdodCBtYXJnaW4gdGlsZXMgbmVlZCB0byBiZSBpbnZhbGlkYXRlZC4KLSAgICAg
ICAgaWYgKGhhc01hcmdpbnMoKSkgewotICAgICAgICAgICAgaWYgKGJvdW5kcy53aWR0aCgpID4g
bV9ib3VuZHNBdExhc3RSZXZhbGlkYXRlLndpZHRoKCkgfHwgYm91bmRzLmhlaWdodCgpID4gbV9i
b3VuZHNBdExhc3RSZXZhbGlkYXRlLmhlaWdodCgpKSB7Ci0gICAgICAgICAgICAgICAgSW50UmVj
dCBib3VuZHNXaXRob3V0TWFyZ2luID0gdGhpcy0+Ym91bmRzV2l0aG91dE1hcmdpbigpOwotICAg
ICAgICAgICAgICAgIEludFJlY3Qgb2xkQm91bmRzV2l0aG91dE1hcmdpbiA9IGJvdW5kc0F0TGFz
dFJldmFsaWRhdGVXaXRob3V0TWFyZ2luKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYm91bmRz
LmhlaWdodCgpID4gbV9ib3VuZHNBdExhc3RSZXZhbGlkYXRlLmhlaWdodCgpKSB7Ci0gICAgICAg
ICAgICAgICAgICAgIEludFJlY3QgZm9ybWVyQm90dG9tTWFyZ2luUmVjdCA9IEludFJlY3Qob2xk
Qm91bmRzV2l0aG91dE1hcmdpbi54KCksIG9sZEJvdW5kc1dpdGhvdXRNYXJnaW4uaGVpZ2h0KCks
Ci0gICAgICAgICAgICAgICAgICAgICAgICBvbGRCb3VuZHNXaXRob3V0TWFyZ2luLndpZHRoKCks
IGJvdW5kc1dpdGhvdXRNYXJnaW4uaGVpZ2h0KCkgLSBvbGRCb3VuZHNXaXRob3V0TWFyZ2luLmhl
aWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0TmVlZHNEaXNwbGF5SW5SZWN0KGZvcm1l
ckJvdHRvbU1hcmdpblJlY3QpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAg
IGlmIChib3VuZHMud2lkdGgoKSA+IG1fYm91bmRzQXRMYXN0UmV2YWxpZGF0ZS53aWR0aCgpKSB7
Ci0gICAgICAgICAgICAgICAgICAgIEludFJlY3QgZm9ybWVyUmlnaHRNYXJnaW5SZWN0ID0gSW50
UmVjdChvbGRCb3VuZHNXaXRob3V0TWFyZ2luLndpZHRoKCksIG9sZEJvdW5kc1dpdGhvdXRNYXJn
aW4ueSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzV2l0aG91dE1hcmdpbi53aWR0
aCgpIC0gb2xkQm91bmRzV2l0aG91dE1hcmdpbi53aWR0aCgpLCBvbGRCb3VuZHNXaXRob3V0TWFy
Z2luLmhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0TmVlZHNEaXNwbGF5SW5SZWN0
KGZvcm1lclJpZ2h0TWFyZ2luUmVjdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
fQotICAgICAgICB9Ci0KLSAgICAgICAgRmxvYXRSZWN0IHNjYWxlZEJvdW5kcyhib3VuZHMpOwot
ICAgICAgICBzY2FsZWRCb3VuZHMuc2NhbGUobV9zY2FsZSk7Ci0gICAgICAgIEludFJlY3QgYm91
bmRzSW5UaWxlQ29vcmRzKGVuY2xvc2luZ0ludFJlY3Qoc2NhbGVkQm91bmRzKSk7Ci0KLSAgICAg
ICAgVGlsZUluZGV4IHRvcExlZnRGb3JCb3VuZHM7Ci0gICAgICAgIFRpbGVJbmRleCBib3R0b21S
aWdodEZvckJvdW5kczsKLSAgICAgICAgZ2V0VGlsZUluZGV4UmFuZ2VGb3JSZWN0KGJvdW5kc0lu
VGlsZUNvb3JkcywgdG9wTGVmdEZvckJvdW5kcywgYm90dG9tUmlnaHRGb3JCb3VuZHMpOwotCi0g
ICAgICAgIFZlY3RvcjxUaWxlSW5kZXg+IHRpbGVzVG9SZW1vdmU7Ci0gICAgICAgIGZvciAoVGls
ZU1hcDo6aXRlcmF0b3IgaXQgPSBtX3RpbGVzLmJlZ2luKCksIGVuZCA9IG1fdGlsZXMuZW5kKCk7
IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICAgICAgY29uc3QgVGlsZUluZGV4JiBpbmRleCA9
IGl0LT5rZXk7Ci0gICAgICAgICAgICBpZiAoaW5kZXgueSgpIDwgdG9wTGVmdEZvckJvdW5kcy55
KCkKLSAgICAgICAgICAgICAgICB8fCBpbmRleC55KCkgPiBib3R0b21SaWdodEZvckJvdW5kcy55
KCkKLSAgICAgICAgICAgICAgICB8fCBpbmRleC54KCkgPCB0b3BMZWZ0Rm9yQm91bmRzLngoKQot
ICAgICAgICAgICAgICAgIHx8IGluZGV4LngoKSA+IGJvdHRvbVJpZ2h0Rm9yQm91bmRzLngoKSkK
LSAgICAgICAgICAgICAgICBxdWV1ZVRpbGVGb3JSZW1vdmFsKGluZGV4LCBpdC0+dmFsdWUsIHRp
bGVzVG9SZW1vdmUsIG1fdGlsZVJlcGFpbnRDb3VudHMpOwotICAgICAgICB9Ci0KLSAgICAgICAg
Zm9yIChzaXplX3QgaSA9IDAsIHNpemUgPSB0aWxlc1RvUmVtb3ZlLnNpemUoKTsgaSA8IHNpemU7
ICsraSkgewotICAgICAgICAgICAgVGlsZUluZm8gdGlsZUluZm8gPSBtX3RpbGVzLnRha2UodGls
ZXNUb1JlbW92ZVtpXSk7Ci0jaWYgIVBMQVRGT1JNKElPUykKLSAgICAgICAgICAgIExheWVyUG9v
bDo6c2hhcmVkUG9vbCgpLT5hZGRMYXllcih0aWxlSW5mby5sYXllcik7Ci0jZW5kaWYKLSAgICAg
ICAgfQotICAgIH0KLQotICAgIGlmIChtX3RpbGVkU2Nyb2xsaW5nSW5kaWNhdG9yTGF5ZXIpCi0g
ICAgICAgIHVwZGF0ZVRpbGVDb3ZlcmFnZU1hcCgpOwotCi0gICAgbV92aXNpYmxlUmVjdEF0TGFz
dFJldmFsaWRhdGUgPSB2aXNpYmxlUmVjdDsKLSAgICBtX2JvdW5kc0F0TGFzdFJldmFsaWRhdGUg
PSBib3VuZHM7Ci19Ci0KLVRpbGVDb250cm9sbGVyOjpUaWxlQ29ob3J0IFRpbGVDb250cm9sbGVy
OjpuZXh0VGlsZUNvaG9ydCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX2NvaG9ydExpc3QuaXNFbXB0
eSgpKQotICAgICAgICByZXR1cm4gbV9jb2hvcnRMaXN0Lmxhc3QoKS5jb2hvcnQgKyAxOwotCi0g
ICAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQgVGlsZUNvbnRyb2xsZXI6OnN0YXJ0ZWROZXdDb2hvcnQo
VGlsZUNvaG9ydCBjb2hvcnQpCi17Ci0gICAgbV9jb2hvcnRMaXN0LmFwcGVuZChUaWxlQ29ob3J0
SW5mbyhjb2hvcnQsIG1vbm90b25pY2FsbHlJbmNyZWFzaW5nVGltZSgpKSk7Ci0jaWYgUExBVEZP
Uk0oSU9TKQotICAgIGlmICghbV9pc0luV2luZG93KQotICAgICAgICB0aWxlQ29udHJvbGxlck1l
bW9yeUhhbmRsZXIoKS50aWxlQ29udHJvbGxlckdhaW5lZFVucGFyZW50ZWRUaWxlcyh0aGlzKTsK
LSNlbmRpZgotfQotCi1UaWxlQ29udHJvbGxlcjo6VGlsZUNvaG9ydCBUaWxlQ29udHJvbGxlcjo6
bmV3ZXN0VGlsZUNvaG9ydCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fY29ob3J0TGlzdC5pc0Vt
cHR5KCkgPyAwIDogbV9jb2hvcnRMaXN0Lmxhc3QoKS5jb2hvcnQ7Ci19Ci0KLVRpbGVDb250cm9s
bGVyOjpUaWxlQ29ob3J0IFRpbGVDb250cm9sbGVyOjpvbGRlc3RUaWxlQ29ob3J0KCkgY29uc3QK
LXsKLSAgICByZXR1cm4gbV9jb2hvcnRMaXN0LmlzRW1wdHkoKSA/IDAgOiBtX2NvaG9ydExpc3Qu
Zmlyc3QoKS5jb2hvcnQ7Ci19Ci0KLXZvaWQgVGlsZUNvbnRyb2xsZXI6OnNjaGVkdWxlQ29ob3J0
UmVtb3ZhbCgpCi17Ci0gICAgY29uc3QgZG91YmxlIGNvaG9ydFJlbW92YWxUaW1lclNlY29uZHMg
PSAxOwotCi0gICAgLy8gU3RhcnQgdGhlIHRpbWVyLCBvciByZXNjaGVkdWxlIHRoZSB0aW1lciBm
cm9tIG5vdyBpZiBpdCdzIGFscmVhZHkgYWN0aXZlLgotICAgIGlmICghbV9jb2hvcnRSZW1vdmFs
VGltZXIuaXNBY3RpdmUoKSkKLSAgICAgICAgbV9jb2hvcnRSZW1vdmFsVGltZXIuc3RhcnRSZXBl
YXRpbmcoY29ob3J0UmVtb3ZhbFRpbWVyU2Vjb25kcyk7Ci19Ci0KLXZvaWQgVGlsZUNvbnRyb2xs
ZXI6OmNvaG9ydFJlbW92YWxUaW1lckZpcmVkKFRpbWVyPFRpbGVDb250cm9sbGVyPiopCi17Ci0g
ICAgaWYgKG1fY29ob3J0TGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgbV9jb2hvcnRSZW1vdmFs
VGltZXIuc3RvcCgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZG91YmxlIGNvaG9y
dExpZmVUaW1lU2Vjb25kcyA9IDI7Ci0gICAgZG91YmxlIHRpbWVUaHJlc2hvbGQgPSBtb25vdG9u
aWNhbGx5SW5jcmVhc2luZ1RpbWUoKSAtIGNvaG9ydExpZmVUaW1lU2Vjb25kczsKLQotICAgIHdo
aWxlICghbV9jb2hvcnRMaXN0LmlzRW1wdHkoKSAmJiBtX2NvaG9ydExpc3QuZmlyc3QoKS5jcmVh
dGlvblRpbWUgPCB0aW1lVGhyZXNob2xkKSB7Ci0gICAgICAgIFRpbGVDb2hvcnRJbmZvIGZpcnN0
Q29ob3J0ID0gbV9jb2hvcnRMaXN0LnRha2VGaXJzdCgpOwotICAgICAgICByZW1vdmVUaWxlc0lu
Q29ob3J0KGZpcnN0Q29ob3J0LmNvaG9ydCk7Ci0gICAgfQotCi0gICAgaWYgKG1fdGlsZWRTY3Jv
bGxpbmdJbmRpY2F0b3JMYXllcikKLSAgICAgICAgdXBkYXRlVGlsZUNvdmVyYWdlTWFwKCk7Ci19
Ci0KLUludFJlY3QgVGlsZUNvbnRyb2xsZXI6OmVuc3VyZVRpbGVzRm9yUmVjdChjb25zdCBGbG9h
dFJlY3QmIHJlY3QsIENvdmVyYWdlVHlwZSBuZXdUaWxlVHlwZSkKLXsKLSAgICBpZiAobV91bnBh
cmVudHNPZmZzY3JlZW5UaWxlcyAmJiAhbV9pc0luV2luZG93KQotICAgICAgICByZXR1cm4gSW50
UmVjdCgpOwotCi0gICAgRmxvYXRSZWN0IHNjYWxlZFJlY3QocmVjdCk7Ci0gICAgc2NhbGVkUmVj
dC5zY2FsZShtX3NjYWxlKTsKLSAgICBJbnRSZWN0IHJlY3RJblRpbGVDb29yZHMoZW5jbG9zaW5n
SW50UmVjdChzY2FsZWRSZWN0KSk7Ci0KLSAgICBUaWxlSW5kZXggdG9wTGVmdDsKLSAgICBUaWxl
SW5kZXggYm90dG9tUmlnaHQ7Ci0gICAgZ2V0VGlsZUluZGV4UmFuZ2VGb3JSZWN0KHJlY3RJblRp
bGVDb29yZHMsIHRvcExlZnQsIGJvdHRvbVJpZ2h0KTsKLQotICAgIFRpbGVDb2hvcnQgY3VyckNv
aG9ydCA9IG5leHRUaWxlQ29ob3J0KCk7Ci0gICAgdW5zaWduZWQgdGlsZXNJbkNvaG9ydCA9IDA7
Ci0KLSAgICBJbnRSZWN0IGNvdmVyYWdlUmVjdDsKLQotICAgIGZvciAoaW50IHkgPSB0b3BMZWZ0
LnkoKTsgeSA8PSBib3R0b21SaWdodC55KCk7ICsreSkgewotICAgICAgICBmb3IgKGludCB4ID0g
dG9wTGVmdC54KCk7IHggPD0gYm90dG9tUmlnaHQueCgpOyArK3gpIHsKLSAgICAgICAgICAgIFRp
bGVJbmRleCB0aWxlSW5kZXgoeCwgeSk7Ci0KLSAgICAgICAgICAgIEludFJlY3QgdGlsZVJlY3Qg
PSByZWN0Rm9yVGlsZUluZGV4KHRpbGVJbmRleCk7Ci0gICAgICAgICAgICBUaWxlSW5mbyYgdGls
ZUluZm8gPSBtX3RpbGVzLmFkZCh0aWxlSW5kZXgsIFRpbGVJbmZvKCkpLml0ZXJhdG9yLT52YWx1
ZTsKLQotICAgICAgICAgICAgY292ZXJhZ2VSZWN0LnVuaXRlKHRpbGVSZWN0KTsKLQotICAgICAg
ICAgICAgYm9vbCBzaG91bGRDaGFuZ2VUaWxlTGF5ZXJGcmFtZSA9IGZhbHNlOwotCi0gICAgICAg
ICAgICBpZiAoIXRpbGVJbmZvLmxheWVyKQotICAgICAgICAgICAgICAgIHRpbGVJbmZvLmxheWVy
ID0gY3JlYXRlVGlsZUxheWVyKHRpbGVSZWN0KTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAg
ICAgICAgICAgIC8vIFdlIGFscmVhZHkgaGF2ZSBhIGxheWVyIGZvciB0aGlzIHRpbGUuIEVuc3Vy
ZSB0aGF0IGl0cyBzaXplIGlzIGNvcnJlY3QuCi0gICAgICAgICAgICAgICAgRmxvYXRTaXplIHRp
bGVMYXllclNpemUodGlsZUluZm8ubGF5ZXItPmJvdW5kcygpLnNpemUoKSk7Ci0gICAgICAgICAg
ICAgICAgc2hvdWxkQ2hhbmdlVGlsZUxheWVyRnJhbWUgPSB0aWxlTGF5ZXJTaXplICE9IEZsb2F0
U2l6ZSh0aWxlUmVjdC5zaXplKCkpOwotCi0gICAgICAgICAgICAgICAgaWYgKHNob3VsZENoYW5n
ZVRpbGVMYXllckZyYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRpbGVJbmZvLmxheWVyLT5z
ZXRCb3VuZHMoRmxvYXRSZWN0KEZsb2F0UG9pbnQoKSwgdGlsZVJlY3Quc2l6ZSgpKSk7Ci0gICAg
ICAgICAgICAgICAgICAgIHRpbGVJbmZvLmxheWVyLT5zZXRQb3NpdGlvbih0aWxlUmVjdC5sb2Nh
dGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgdGlsZUluZm8ubGF5ZXItPnNldE5lZWRzRGlz
cGxheSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAg
aWYgKG5ld1RpbGVUeXBlID09IENvdmVyYWdlVHlwZTo6U2Vjb25kYXJ5VGlsZXMgJiYgIXRpbGVS
ZWN0LmludGVyc2VjdHMobV9wcmltYXJ5VGlsZUNvdmVyYWdlUmVjdCkpIHsKLSAgICAgICAgICAg
ICAgICB0aWxlSW5mby5jb2hvcnQgPSBjdXJyQ29ob3J0OwotICAgICAgICAgICAgICAgICsrdGls
ZXNJbkNvaG9ydDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbCBzaG91bGRQYXJl
bnRUaWxlTGF5ZXIgPSAoIW1fdW5wYXJlbnRzT2Zmc2NyZWVuVGlsZXMgfHwgbV9pc0luV2luZG93
KSAmJiAhdGlsZUluZm8ubGF5ZXItPnN1cGVybGF5ZXIoKTsKLQotICAgICAgICAgICAgaWYgKHNo
b3VsZFBhcmVudFRpbGVMYXllcikKLSAgICAgICAgICAgICAgICBtX3RpbGVDb250YWluZXJMYXll
ci0+YXBwZW5kU3VibGF5ZXIodGlsZUluZm8ubGF5ZXIuZ2V0KCkpOwotICAgICAgICB9Ci0gICAg
fQotICAgIAotICAgIGlmICh0aWxlc0luQ29ob3J0KQotICAgICAgICBzdGFydGVkTmV3Q29ob3J0
KGN1cnJDb2hvcnQpOwotCi0gICAgcmV0dXJuIGNvdmVyYWdlUmVjdDsKLX0KLQogdm9pZCBUaWxl
Q29udHJvbGxlcjo6dXBkYXRlVGlsZUNvdmVyYWdlTWFwKCkKIHsKKyAgICBpZiAoIW1fdGlsZWRT
Y3JvbGxpbmdJbmRpY2F0b3JMYXllcikKKyAgICAgICAgcmV0dXJuOwogICAgIEZsb2F0UmVjdCBj
b250YWluZXJCb3VuZHMgPSBib3VuZHMoKTsKICAgICBGbG9hdFJlY3QgdmlzaWJsZVJlY3QgPSB0
aGlzLT52aXNpYmxlUmVjdCgpOwogCi0gICAgdmlzaWJsZVJlY3QuaW50ZXJzZWN0KHNjYWxlZEV4
cG9zZWRSZWN0KCkpOworICAgIHZpc2libGVSZWN0LmludGVyc2VjdCh0aWxlR3JpZCgpLnNjYWxl
ZEV4cG9zZWRSZWN0KCkpOwogICAgIHZpc2libGVSZWN0LmNvbnRyYWN0KDQsIDQpOyAvLyBMYXll
ciBpcyBwb3NpdGlvbmVkIDJweCBmcm9tIHRvcCBhbmQgbGVmdCBlZGdlcy4KIAogICAgIGZsb2F0
IHdpZHRoU2NhbGUgPSAxOwpAQCAtOTA4LDcgKzQzMSw3IEBAIHZvaWQgVGlsZUNvbnRyb2xsZXI6
OnVwZGF0ZVRpbGVDb3ZlcmFnZU0KICAgICAgICAgc2NhbGUgPSBzdGQ6Om1pbih3aWR0aFNjYWxl
LCB2aXNpYmxlUmVjdC5oZWlnaHQoKSAvIGNvbnRhaW5lckJvdW5kcy5oZWlnaHQoKSk7CiAgICAg
fQogICAgIAotICAgIGZsb2F0IGluZGljYXRvclNjYWxlID0gc2NhbGUgKiBtX3NjYWxlOworICAg
IGZsb2F0IGluZGljYXRvclNjYWxlID0gc2NhbGUgKiB0aWxlR3JpZCgpLnNjYWxlKCk7CiAgICAg
RmxvYXRSZWN0IG1hcEJvdW5kcyA9IGNvbnRhaW5lckJvdW5kczsKICAgICBtYXBCb3VuZHMuc2Nh
bGUoaW5kaWNhdG9yU2NhbGUsIGluZGljYXRvclNjYWxlKTsKIApAQCAtOTQzLDM2ICs0NjYsMTgg
QEAgdm9pZCBUaWxlQ29udHJvbGxlcjo6dXBkYXRlVGlsZUNvdmVyYWdlTQogCiBJbnRSZWN0IFRp
bGVDb250cm9sbGVyOjp0aWxlR3JpZEV4dGVudCgpIGNvbnN0CiB7Ci0gICAgVGlsZUluZGV4IHRv
cExlZnQ7Ci0gICAgVGlsZUluZGV4IGJvdHRvbVJpZ2h0OwotICAgIGdldFRpbGVJbmRleFJhbmdl
Rm9yUmVjdChtX3ByaW1hcnlUaWxlQ292ZXJhZ2VSZWN0LCB0b3BMZWZ0LCBib3R0b21SaWdodCk7
Ci0KLSAgICAvLyBSZXR1cm4gaW5kZXggb2YgdG9wLCBsZWZ0IHRpbGUgYW5kIHRoZSBudW1iZXIg
b2YgdGlsZXMgYWNyb3NzIGFuZCBkb3duLgotICAgIHJldHVybiBJbnRSZWN0KHRvcExlZnQueCgp
LCB0b3BMZWZ0LnkoKSwgYm90dG9tUmlnaHQueCgpIC0gdG9wTGVmdC54KCkgKyAxLCBib3R0b21S
aWdodC55KCkgLSB0b3BMZWZ0LnkoKSArIDEpOworICAgIHJldHVybiB0aWxlR3JpZCgpLmV4dGVu
dCgpOwogfQogCiBkb3VibGUgVGlsZUNvbnRyb2xsZXI6OnJldGFpbmVkVGlsZUJhY2tpbmdTdG9y
ZU1lbW9yeSgpIGNvbnN0CiB7Ci0gICAgZG91YmxlIHRvdGFsQnl0ZXMgPSAwOwotICAgIAotICAg
IGZvciAoVGlsZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3RpbGVzLmJlZ2luKCksIGVuZCA9
IG1fdGlsZXMuZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICBjb25zdCBUaWxlSW5m
byYgdGlsZUluZm8gPSBpdC0+dmFsdWU7Ci0gICAgICAgIGlmICh0aWxlSW5mby5sYXllci0+c3Vw
ZXJsYXllcigpKSB7Ci0gICAgICAgICAgICBGbG9hdFJlY3QgYm91bmRzID0gdGlsZUluZm8ubGF5
ZXItPmJvdW5kcygpOwotICAgICAgICAgICAgZG91YmxlIGNvbnRlbnRzU2NhbGUgPSB0aWxlSW5m
by5sYXllci0+Y29udGVudHNTY2FsZSgpOwotICAgICAgICAgICAgdG90YWxCeXRlcyArPSA0ICog
Ym91bmRzLndpZHRoKCkgKiBjb250ZW50c1NjYWxlICogYm91bmRzLmhlaWdodCgpICogY29udGVu
dHNTY2FsZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB0b3RhbEJ5dGVzOworICAg
IHJldHVybiB0aWxlR3JpZCgpLnJldGFpbmVkVGlsZUJhY2tpbmdTdG9yZU1lbW9yeSgpOwogfQog
CiAvLyBSZXR1cm4gdGhlIHJlY3QgaW4gbGF5ZXIgY29vcmRzLCBub3QgdGlsZSBjb29yZHMuCiBJ
bnRSZWN0IFRpbGVDb250cm9sbGVyOjp0aWxlQ292ZXJhZ2VSZWN0KCkgY29uc3QKIHsKLSAgICBJ
bnRSZWN0IGNvdmVyYWdlUmVjdEluTGF5ZXJDb29yZHMobV9wcmltYXJ5VGlsZUNvdmVyYWdlUmVj
dCk7Ci0gICAgY292ZXJhZ2VSZWN0SW5MYXllckNvb3Jkcy5zY2FsZSgxIC8gbV9zY2FsZSk7Ci0g
ICAgcmV0dXJuIGNvdmVyYWdlUmVjdEluTGF5ZXJDb29yZHM7CisgICAgcmV0dXJuIHRpbGVHcmlk
KCkudGlsZUNvdmVyYWdlUmVjdCgpOwogfQogCiBQbGF0Zm9ybUNBTGF5ZXIqIFRpbGVDb250cm9s
bGVyOjp0aWxlZFNjcm9sbGluZ0luZGljYXRvckxheWVyKCkKQEAgLTEwMDUsOCArNTEwLDcgQEAg
dm9pZCBUaWxlQ29udHJvbGxlcjo6c2V0U2Nyb2xsaW5nTW9kZUluZAogCiAgICAgbV9pbmRpY2F0
b3JNb2RlID0gc2Nyb2xsaW5nTW9kZTsKIAotICAgIGlmIChtX3RpbGVkU2Nyb2xsaW5nSW5kaWNh
dG9yTGF5ZXIpCi0gICAgICAgIHVwZGF0ZVRpbGVDb3ZlcmFnZU1hcCgpOworICAgIHVwZGF0ZVRp
bGVDb3ZlcmFnZU1hcCgpOwogfQogCiB2b2lkIFRpbGVDb250cm9sbGVyOjpzZXRUaWxlTWFyZ2lu
cyhpbnQgbWFyZ2luVG9wLCBpbnQgbWFyZ2luQm90dG9tLCBpbnQgbWFyZ2luTGVmdCwgaW50IG1h
cmdpblJpZ2h0KQpAQCAtMTA5Miw2MiArNTk2LDI0IEBAIGludCBUaWxlQ29udHJvbGxlcjo6cGxh
dGZvcm1DQUxheWVySW5jcmUKICAgICByZXR1cm4gcmVwYWludENvdW50OwogfQogCi12b2lkIFRp
bGVDb250cm9sbGVyOjpkcmF3VGlsZU1hcENvbnRlbnRzKENHQ29udGV4dFJlZiBjb250ZXh0LCBD
R1JlY3QgbGF5ZXJCb3VuZHMpCitWZWN0b3I8UmVmUHRyPFBsYXRmb3JtQ0FMYXllcj4+IFRpbGVD
b250cm9sbGVyOjpjb250YWluZXJMYXllcnMoKQogewotICAgIENHQ29udGV4dFNldFJHQkZpbGxD
b2xvcihjb250ZXh0LCAwLjMsIDAuMywgMC4zLCAxKTsKLSAgICBDR0NvbnRleHRGaWxsUmVjdChj
b250ZXh0LCBsYXllckJvdW5kcyk7Ci0KLSAgICBDR0Zsb2F0IHNjYWxlRmFjdG9yID0gbGF5ZXJC
b3VuZHMuc2l6ZS53aWR0aCAvIGJvdW5kcygpLndpZHRoKCk7Ci0KLSAgICBDR0Zsb2F0IGNvbnRl
eHRTY2FsZSA9IHNjYWxlRmFjdG9yIC8gc2NhbGUoKTsKLSAgICBDR0NvbnRleHRTY2FsZUNUTShj
b250ZXh0LCBjb250ZXh0U2NhbGUsIGNvbnRleHRTY2FsZSk7Ci0gICAgCi0gICAgZm9yIChUaWxl
TWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fdGlsZXMuYmVnaW4oKSwgZW5kID0gbV90aWxlcy5l
bmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIGNvbnN0IFRpbGVJbmZvJiB0aWxlSW5m
byA9IGl0LT52YWx1ZTsKLSAgICAgICAgUGxhdGZvcm1DQUxheWVyKiB0aWxlTGF5ZXIgPSB0aWxl
SW5mby5sYXllci5nZXQoKTsKLQotICAgICAgICBDR0Zsb2F0IHJlZCA9IDE7Ci0gICAgICAgIENH
RmxvYXQgZ3JlZW4gPSAxOwotICAgICAgICBDR0Zsb2F0IGJsdWUgPSAxOwotICAgICAgICBpZiAo
dGlsZUluZm8uaGFzU3RhbGVDb250ZW50KSB7Ci0gICAgICAgICAgICByZWQgPSAwLjI1OwotICAg
ICAgICAgICAgZ3JlZW4gPSAwLjEyNTsKLSAgICAgICAgICAgIGJsdWUgPSAwOwotICAgICAgICB9
Ci0KLSAgICAgICAgVGlsZUNvaG9ydCBuZXdlc3RDb2hvcnQgPSBuZXdlc3RUaWxlQ29ob3J0KCk7
Ci0gICAgICAgIFRpbGVDb2hvcnQgb2xkZXN0Q29ob3J0ID0gb2xkZXN0VGlsZUNvaG9ydCgpOwot
Ci0gICAgICAgIGlmICghb3duaW5nR3JhcGhpY3NMYXllcigpLT5wbGF0Zm9ybUNBTGF5ZXJTaG91
bGRBZ2dyZXNzaXZlbHlSZXRhaW5UaWxlcyhtX3RpbGVDYWNoZUxheWVyKSAmJiB0aWxlSW5mby5j
b2hvcnQgIT0gVmlzaWJsZVRpbGVDb2hvcnQgJiYgbmV3ZXN0Q29ob3J0ID4gb2xkZXN0Q29ob3J0
KSB7Ci0gICAgICAgICAgICBmbG9hdCBjb2hvcnRQcm9wb3J0aW9uID0gc3RhdGljX2Nhc3Q8Zmxv
YXQ+KChuZXdlc3RDb2hvcnQgLSB0aWxlSW5mby5jb2hvcnQpKSAvIChuZXdlc3RDb2hvcnQgLSBv
bGRlc3RDb2hvcnQpOwotICAgICAgICAgICAgQ0dDb250ZXh0U2V0UkdCRmlsbENvbG9yKGNvbnRl
eHQsIHJlZCwgZ3JlZW4sIGJsdWUsIDEgLSBjb2hvcnRQcm9wb3J0aW9uKTsKLSAgICAgICAgfSBl
bHNlCi0gICAgICAgICAgICBDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoY29udGV4dCwgcmVkLCBn
cmVlbiwgYmx1ZSwgMSk7Ci0KLSAgICAgICAgaWYgKHRpbGVMYXllci0+c3VwZXJsYXllcigpKSB7
Ci0gICAgICAgICAgICBDR0NvbnRleHRTZXRMaW5lV2lkdGgoY29udGV4dCwgMC41IC8gY29udGV4
dFNjYWxlKTsKLSAgICAgICAgICAgIENHQ29udGV4dFNldFJHQlN0cm9rZUNvbG9yKGNvbnRleHQs
IDAsIDAsIDAsIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ0dDb250ZXh0U2V0
TGluZVdpZHRoKGNvbnRleHQsIDEgLyBjb250ZXh0U2NhbGUpOwotICAgICAgICAgICAgQ0dDb250
ZXh0U2V0UkdCU3Ryb2tlQ29sb3IoY29udGV4dCwgMC4yLCAwLjEsIDAuOSwgMSk7Ci0gICAgICAg
IH0KLQotICAgICAgICBDR1JlY3QgZnJhbWUgPSBDR1JlY3RNYWtlKHRpbGVMYXllci0+cG9zaXRp
b24oKS54KCksIHRpbGVMYXllci0+cG9zaXRpb24oKS55KCksIHRpbGVMYXllci0+Ym91bmRzKCku
c2l6ZSgpLndpZHRoKCksIHRpbGVMYXllci0+Ym91bmRzKCkuc2l6ZSgpLmhlaWdodCgpKTsKLSAg
ICAgICAgQ0dDb250ZXh0RmlsbFJlY3QoY29udGV4dCwgZnJhbWUpOwotICAgICAgICBDR0NvbnRl
eHRTdHJva2VSZWN0KGNvbnRleHQsIGZyYW1lKTsKLSAgICB9CisgICAgVmVjdG9yPFJlZlB0cjxQ
bGF0Zm9ybUNBTGF5ZXI+PiBsYXllckxpc3QoMSk7CisgICAgbGF5ZXJMaXN0WzBdID0gJnRpbGVH
cmlkKCkuY29udGFpbmVyTGF5ZXIoKTsKKyAgICByZXR1cm4gbGF5ZXJMaXN0OwogfQogICAgIAog
I2lmIFBMQVRGT1JNKElPUykKK3Vuc2lnbmVkIFRpbGVDb250cm9sbGVyOjpudW1iZXJPZlVucGFy
ZW50ZWRUaWxlcygpIGNvbnN0Cit7CisgICAgcmV0dXJuIHRpbGVHcmlkKCkubnVtYmVyT2ZVbnBh
cmVudGVkVGlsZXMoKTsKK30KKwogdm9pZCBUaWxlQ29udHJvbGxlcjo6cmVtb3ZlVW5wYXJlbnRl
ZFRpbGVzTm93KCkKIHsKLSAgICB3aGlsZSAoIW1fY29ob3J0TGlzdC5pc0VtcHR5KCkpIHsKLSAg
ICAgICAgVGlsZUNvaG9ydEluZm8gZmlyc3RDb2hvcnQgPSBtX2NvaG9ydExpc3QudGFrZUZpcnN0
KCk7Ci0gICAgICAgIHJlbW92ZVRpbGVzSW5Db2hvcnQoZmlyc3RDb2hvcnQuY29ob3J0KTsKLSAg
ICB9CisgICAgdGlsZUdyaWQoKS5yZW1vdmVVbnBhcmVudGVkVGlsZXNOb3coKTsKIAotICAgIGlm
IChtX3RpbGVkU2Nyb2xsaW5nSW5kaWNhdG9yTGF5ZXIpCi0gICAgICAgIHVwZGF0ZVRpbGVDb3Zl
cmFnZU1hcCgpOworICAgIHVwZGF0ZVRpbGVDb3ZlcmFnZU1hcCgpOwogfQogI2VuZGlmCiAKSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhL21hYy9UaWxlR3JpZC5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhL21hYy9UaWxl
R3JpZC5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Y2EvbWFjL1RpbGVHcmlkLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxNCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpZm5kZWYgVGlsZUdyaWRfaAorI2RlZmluZSBUaWxlR3JpZF9oCisKKyNp
bmNsdWRlICJJbnRQb2ludEhhc2guaCIKKyNpbmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVkZSAi
VGltZXIuaCIKKyNpbmNsdWRlIDx3dGYvRGVxdWUuaD4KKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5o
PgorI2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgorI2luY2x1ZGUgPHd0Zi9SZWYuaD4KKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBQbGF0Zm9ybUNBTGF5ZXI7CitjbGFzcyBUaWxl
Q29udHJvbGxlcjsKKworY2xhc3MgVGlsZUdyaWQgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxF
KFRpbGVHcmlkKTsKK3B1YmxpYzoKKyAgICBUaWxlR3JpZChUaWxlQ29udHJvbGxlciYpOworICAg
IH5UaWxlR3JpZCgpOworCisgICAgUGxhdGZvcm1DQUxheWVyJiBjb250YWluZXJMYXllcigpIHsg
cmV0dXJuIG1fY29udGFpbmVyTGF5ZXIuZ2V0KCk7IH0KKworICAgIHZvaWQgc2V0U2NhbGUoZmxv
YXQpOworICAgIGZsb2F0IHNjYWxlKCkgY29uc3QgeyByZXR1cm4gbV9zY2FsZTsgfQorCisgICAg
dm9pZCBzZXROZWVkc0Rpc3BsYXkoKTsKKyAgICB2b2lkIHNldE5lZWRzRGlzcGxheUluUmVjdChj
b25zdCBJbnRSZWN0Jik7CisKKyAgICB2b2lkIHVwZGF0ZVRpbGVyTGF5ZXJQcm9wZXJ0aWVzKCk7
CisKKyAgICBib29sIHByZXBvcHVsYXRlUmVjdChjb25zdCBGbG9hdFJlY3QmKTsKKworICAgIHR5
cGVkZWYgdW5zaWduZWQgVGlsZVZhbGlkYXRpb25Qb2xpY3lGbGFnczsKKyAgICB2b2lkIHJldmFs
aWRhdGVUaWxlcyhUaWxlVmFsaWRhdGlvblBvbGljeUZsYWdzKTsKKyAgICBib29sIHRpbGVzV291
bGRDaGFuZ2VGb3JWaXNpYmxlUmVjdChjb25zdCBGbG9hdFJlY3QmIG5ld1Zpc2libGVSZWN0LCBj
b25zdCBGbG9hdFJlY3QmIG9sZFZpc2libGVSZWN0KSBjb25zdDsKKworICAgIEZsb2F0UmVjdCBz
Y2FsZWRFeHBvc2VkUmVjdCgpIGNvbnN0OworCisgICAgSW50UmVjdCB0aWxlQ292ZXJhZ2VSZWN0
KCkgY29uc3Q7CisgICAgSW50UmVjdCBleHRlbnQoKSBjb25zdDsKKworICAgIGRvdWJsZSByZXRh
aW5lZFRpbGVCYWNraW5nU3RvcmVNZW1vcnkoKSBjb25zdDsKKyAgICB1bnNpZ25lZCBibGFua1Bp
eGVsQ291bnQoKSBjb25zdDsKKworICAgIHZvaWQgZHJhd1RpbGVNYXBDb250ZW50cyhDR0NvbnRl
eHRSZWYsIENHUmVjdCBsYXllckJvdW5kcyk7CisKKyNpZiBQTEFURk9STShJT1MpCisgICAgdW5z
aWduZWQgbnVtYmVyT2ZVbnBhcmVudGVkVGlsZXMoKSBjb25zdCB7IHJldHVybiBtX2NvaG9ydExp
c3Quc2l6ZSgpOyB9CisgICAgdm9pZCByZW1vdmVVbnBhcmVudGVkVGlsZXNOb3coKTsKKyNlbmRp
ZgorCisgICAgdHlwZWRlZiBJbnRQb2ludCBUaWxlSW5kZXg7CisgICAgdHlwZWRlZiB1bnNpZ25l
ZCBUaWxlQ29ob3J0OworICAgIHN0YXRpYyBjb25zdCBUaWxlQ29ob3J0IFZpc2libGVUaWxlQ29o
b3J0ID0gVUlOVF9NQVg7CisKKyAgICBzdHJ1Y3QgVGlsZUluZm8geworICAgICAgICBSZWZQdHI8
UGxhdGZvcm1DQUxheWVyPiBsYXllcjsKKyAgICAgICAgVGlsZUNvaG9ydCBjb2hvcnQ7IC8vIFZp
c2libGVUaWxlQ29ob3J0IGlzIHZpc2libGUuCisgICAgICAgIGJvb2wgaGFzU3RhbGVDb250ZW50
OworCisgICAgICAgIFRpbGVJbmZvKCkKKyAgICAgICAgICAgIDogY29ob3J0KFZpc2libGVUaWxl
Q29ob3J0KQorICAgICAgICAgICAgLCBoYXNTdGFsZUNvbnRlbnQoZmFsc2UpCisgICAgICAgIHsg
fQorICAgIH07CisKK3ByaXZhdGU6CisgICAgdm9pZCBzZXRUaWxlTmVlZHNEaXNwbGF5SW5SZWN0
KGNvbnN0IFRpbGVJbmRleCYsIFRpbGVJbmZvJiwgY29uc3QgSW50UmVjdCYgcmVwYWludFJlY3RJ
blRpbGVDb29yZHMsIGNvbnN0IEludFJlY3QmIGNvdmVyYWdlUmVjdEluVGlsZUNvb3Jkcyk7CisK
KyAgICBJbnRSZWN0IHJlY3RGb3JUaWxlSW5kZXgoY29uc3QgVGlsZUluZGV4JikgY29uc3Q7Cisg
ICAgdm9pZCBhZGp1c3RSZWN0QXRUaWxlSW5kZXhGb3JNYXJnaW4oY29uc3QgVGlsZUluZGV4Jiwg
SW50UmVjdCYpIGNvbnN0OworICAgIHZvaWQgZ2V0VGlsZUluZGV4UmFuZ2VGb3JSZWN0KGNvbnN0
IEludFJlY3QmLCBUaWxlSW5kZXgmIHRvcExlZnQsIFRpbGVJbmRleCYgYm90dG9tUmlnaHQpIGNv
bnN0OworCisgICAgZW51bSBjbGFzcyBDb3ZlcmFnZVR5cGUgeyBQcmltYXJ5VGlsZXMsIFNlY29u
ZGFyeVRpbGVzIH07CisgICAgSW50UmVjdCBlbnN1cmVUaWxlc0ZvclJlY3QoY29uc3QgRmxvYXRS
ZWN0JiwgQ292ZXJhZ2VUeXBlKTsKKworICAgIHZvaWQgcmVtb3ZlQWxsU2Vjb25kYXJ5VGlsZXMo
KTsKKyAgICB2b2lkIHJlbW92ZVRpbGVzSW5Db2hvcnQoVGlsZUNvaG9ydCk7CisKKyAgICB2b2lk
IHNjaGVkdWxlQ29ob3J0UmVtb3ZhbCgpOworICAgIHZvaWQgY29ob3J0UmVtb3ZhbFRpbWVyRmly
ZWQoVGltZXI8VGlsZUdyaWQ+Kik7CisgICAgVGlsZUNvaG9ydCBuZXh0VGlsZUNvaG9ydCgpIGNv
bnN0OworICAgIHZvaWQgc3RhcnRlZE5ld0NvaG9ydChUaWxlQ29ob3J0KTsKKyAgICBUaWxlQ29o
b3J0IG5ld2VzdFRpbGVDb2hvcnQoKSBjb25zdDsKKyAgICBUaWxlQ29ob3J0IG9sZGVzdFRpbGVD
b2hvcnQoKSBjb25zdDsKKworICAgIFRpbGVDb250cm9sbGVyJiBtX2NvbnRyb2xsZXI7CisgICAg
UmVmPFBsYXRmb3JtQ0FMYXllcj4gbV9jb250YWluZXJMYXllcjsKKworICAgIHR5cGVkZWYgSGFz
aE1hcDxUaWxlSW5kZXgsIFRpbGVJbmZvPiBUaWxlTWFwOworICAgIFRpbGVNYXAgbV90aWxlczsK
KworICAgIEludFJlY3QgbV9wcmltYXJ5VGlsZUNvdmVyYWdlUmVjdDsKKyAgICBWZWN0b3I8Rmxv
YXRSZWN0PiBtX3NlY29uZGFyeVRpbGVDb3ZlcmFnZVJlY3RzOworCisgICAgZmxvYXQgbV9zY2Fs
ZTsKKworICAgIHN0cnVjdCBUaWxlQ29ob3J0SW5mbyB7CisgICAgICAgIFRpbGVDb2hvcnQgY29o
b3J0OworICAgICAgICBkb3VibGUgY3JlYXRpb25UaW1lOyAvLyBpbiBtb25vdG9uaWNhbGx5SW5j
cmVhc2luZ1RpbWUoKS4KKyAgICAgICAgVGlsZUNvaG9ydEluZm8oVGlsZUNvaG9ydCBpbkNvaG9y
dCwgZG91YmxlIGluVGltZSkKKyAgICAgICAgICAgIDogY29ob3J0KGluQ29ob3J0KQorICAgICAg
ICAgICAgLCBjcmVhdGlvblRpbWUoaW5UaW1lKQorICAgICAgICB7IH0KKyAgICB9OworICAgIHR5
cGVkZWYgRGVxdWU8VGlsZUNvaG9ydEluZm8+IFRpbGVDb2hvcnRMaXN0OworICAgIFRpbGVDb2hv
cnRMaXN0IG1fY29ob3J0TGlzdDsKKworICAgIFRpbWVyPFRpbGVHcmlkPiBtX2NvaG9ydFJlbW92
YWxUaW1lcjsKK307CisKK30KKyNlbmRpZgpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvY2EvbWFjL1RpbGVHcmlkLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2NhL21hYy9UaWxlR3JpZC5tbQkocmV2aXNpb24gMTY2NTc1KQko
ZnJvbSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYS9tYWMvVGlsZUNvbnRyb2xs
ZXIubW06MTY2NTc1KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2EvbWFj
L1RpbGVHcmlkLm1tCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTE1NCBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxMSwgMjAxMiwgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBU
SEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorICovCisKKyNpbXBvcnQgImNvbmZpZy5oIgorI2ltcG9ydCAiVGlsZUNvbnRyb2xs
ZXIuaCIKKworI2ltcG9ydCAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW1wb3J0ICJJbnRSZWN0Lmgi
CisjaW1wb3J0ICJQbGF0Zm9ybUNBTGF5ZXIuaCIKKyNpbXBvcnQgIlJlZ2lvbi5oIgorI2lmICFQ
TEFURk9STShJT1MpCisjaW1wb3J0ICJMYXllclBvb2wuaCIKKyNlbmRpZgorI2ltcG9ydCAiV2Vi
TGF5ZXIuaCIKKyNpbXBvcnQgPHd0Zi9NYWluVGhyZWFkLmg+CisjaW1wb3J0IDx1dGlsaXR5Pgor
CisjaWYgUExBVEZPUk0oSU9TKQorI2ltcG9ydCAiVGlsZUNvbnRyb2xsZXJNZW1vcnlIYW5kbGVy
SU9TLmgiCisjZW5kaWYKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitlbnVtIFRpbGVWYWxpZGF0
aW9uUG9saWN5RmxhZyB7CisgICAgUHJ1bmVTZWNvbmRhcnlUaWxlcyA9IDEgPDwgMCwKKyAgICBV
bnBhcmVudEFsbFRpbGVzID0gMSA8PCAxCit9OworCitQYXNzT3duUHRyPFRpbGVDb250cm9sbGVy
PiBUaWxlQ29udHJvbGxlcjo6Y3JlYXRlKFBsYXRmb3JtQ0FMYXllciogcm9vdFBsYXRmb3JtTGF5
ZXIpCit7CisgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBUaWxlQ29udHJvbGxlcihyb290UGxhdGZv
cm1MYXllcikpOworfQorCitUaWxlQ29udHJvbGxlcjo6VGlsZUNvbnRyb2xsZXIoUGxhdGZvcm1D
QUxheWVyKiByb290UGxhdGZvcm1MYXllcikKKyAgICA6IG1fdGlsZUNhY2hlTGF5ZXIocm9vdFBs
YXRmb3JtTGF5ZXIpCisgICAgLCBtX3RpbGVTaXplKGRlZmF1bHRUaWxlV2lkdGgsIGRlZmF1bHRU
aWxlSGVpZ2h0KQorICAgICwgbV9leHBvc2VkUmVjdChGbG9hdFJlY3Q6OmluZmluaXRlUmVjdCgp
KQorICAgICwgbV90aWxlUmV2YWxpZGF0aW9uVGltZXIodGhpcywgJlRpbGVDb250cm9sbGVyOjp0
aWxlUmV2YWxpZGF0aW9uVGltZXJGaXJlZCkKKyAgICAsIG1fY29ob3J0UmVtb3ZhbFRpbWVyKHRo
aXMsICZUaWxlQ29udHJvbGxlcjo6Y29ob3J0UmVtb3ZhbFRpbWVyRmlyZWQpCisgICAgLCBtX3Nj
YWxlKDEpCisgICAgLCBtX2RldmljZVNjYWxlRmFjdG9yKDEpCisgICAgLCBtX3RpbGVDb3ZlcmFn
ZShDb3ZlcmFnZUZvclZpc2libGVBcmVhKQorICAgICwgbV9tYXJnaW5Ub3AoMCkKKyAgICAsIG1f
bWFyZ2luQm90dG9tKDApCisgICAgLCBtX21hcmdpbkxlZnQoMCkKKyAgICAsIG1fbWFyZ2luUmln
aHQoMCkKKyAgICAsIG1faXNJbldpbmRvdyhmYWxzZSkKKyAgICAsIG1fc2Nyb2xsaW5nUGVyZm9y
bWFuY2VMb2dnaW5nRW5hYmxlZChmYWxzZSkKKyAgICAsIG1fdW5wYXJlbnRzT2Zmc2NyZWVuVGls
ZXMoZmFsc2UpCisgICAgLCBtX2FjY2VsZXJhdGVzRHJhd2luZyhmYWxzZSkKKyAgICAsIG1fdGls
ZXNBcmVPcGFxdWUoZmFsc2UpCisgICAgLCBtX2hhc1RpbGVzV2l0aFRlbXBvcmFyeVNjYWxlRmFj
dG9yKGZhbHNlKQorICAgICwgbV90aWxlRGVidWdCb3JkZXJXaWR0aCgwKQorICAgICwgbV9pbmRp
Y2F0b3JNb2RlKEFzeW5jU2Nyb2xsaW5nSW5kaWNhdGlvbikKK3sKKyAgICBtX3RpbGVDb250YWlu
ZXJMYXllciA9IG1fdGlsZUNhY2hlTGF5ZXItPmNyZWF0ZUNvbXBhdGlibGVMYXllcihQbGF0Zm9y
bUNBTGF5ZXI6OkxheWVyVHlwZUxheWVyLCBudWxscHRyKTsKKyNpZm5kZWYgTkRFQlVHCisgICAg
bV90aWxlQ29udGFpbmVyTGF5ZXItPnNldE5hbWUoIlRpbGVDb250cm9sbGVyIENvbnRhaW5lciBM
YXllciIpOworI2VuZGlmCit9CisKK1RpbGVDb250cm9sbGVyOjp+VGlsZUNvbnRyb2xsZXIoKQor
eworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisKKyNpZiBQTEFURk9STShJT1MpCisgICAg
dGlsZUNvbnRyb2xsZXJNZW1vcnlIYW5kbGVyKCkucmVtb3ZlVGlsZUNvbnRyb2xsZXIodGhpcyk7
CisjZW5kaWYKKworICAgIGZvciAoVGlsZU1hcDo6aXRlcmF0b3IgaXQgPSBtX3RpbGVzLmJlZ2lu
KCksIGVuZCA9IG1fdGlsZXMuZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkKKyAgICAgICAgaXQtPnZh
bHVlLmxheWVyLT5zZXRPd25lcihudWxscHRyKTsKKworICAgIGlmIChtX3RpbGVkU2Nyb2xsaW5n
SW5kaWNhdG9yTGF5ZXIpCisgICAgICAgIG1fdGlsZWRTY3JvbGxpbmdJbmRpY2F0b3JMYXllci0+
c2V0T3duZXIobnVsbHB0cik7Cit9CisKK3ZvaWQgVGlsZUNvbnRyb2xsZXI6OnRpbGVDYWNoZUxh
eWVyQm91bmRzQ2hhbmdlZCgpCit7CisgICAgQVNTRVJUKG93bmluZ0dyYXBoaWNzTGF5ZXIoKS0+
aXNDb21taXR0aW5nQ2hhbmdlcygpKTsKKyAgICBzZXROZWVkc1JldmFsaWRhdGVUaWxlcygpOwor
fQorCit2b2lkIFRpbGVDb250cm9sbGVyOjpzZXROZWVkc0Rpc3BsYXkoKQoreworICAgIGZvciAo
VGlsZU1hcDo6aXRlcmF0b3IgaXQgPSBtX3RpbGVzLmJlZ2luKCksIGVuZCA9IG1fdGlsZXMuZW5k
KCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBUaWxlSW5mbyYgdGlsZUluZm8gPSBpdC0+
dmFsdWU7CisgICAgICAgIEludFJlY3QgdGlsZVJlY3QgPSByZWN0Rm9yVGlsZUluZGV4KGl0LT5r
ZXkpOworCisgICAgICAgIGlmICh0aWxlUmVjdC5pbnRlcnNlY3RzKG1fcHJpbWFyeVRpbGVDb3Zl
cmFnZVJlY3QpICYmIHRpbGVJbmZvLmxheWVyLT5zdXBlcmxheWVyKCkpCisgICAgICAgICAgICB0
aWxlSW5mby5sYXllci0+c2V0TmVlZHNEaXNwbGF5KCk7CisgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgIHRpbGVJbmZvLmhhc1N0YWxlQ29udGVudCA9IHRydWU7CisgICAgfQorfQorCit2b2lkIFRp
bGVDb250cm9sbGVyOjpzZXROZWVkc0Rpc3BsYXlJblJlY3QoY29uc3QgSW50UmVjdCYgcmVjdCkK
K3sKKyAgICBpZiAobV90aWxlcy5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIEZs
b2F0UmVjdCBzY2FsZWRSZWN0KHJlY3QpOworICAgIHNjYWxlZFJlY3Quc2NhbGUobV9zY2FsZSk7
CisgICAgSW50UmVjdCByZXBhaW50UmVjdEluVGlsZUNvb3JkcyhlbmNsb3NpbmdJbnRSZWN0KHNj
YWxlZFJlY3QpKTsKKworICAgIC8vIEZvciBzbWFsbCBpbnZhbGlkYXRpb25zLCBsb29rdXAgdGhl
IGNvdmVyZWQgdGlsZXMuCisgICAgaWYgKHJlcGFpbnRSZWN0SW5UaWxlQ29vcmRzLmhlaWdodCgp
IDwgMiAqIG1fdGlsZVNpemUuaGVpZ2h0KCkgJiYgcmVwYWludFJlY3RJblRpbGVDb29yZHMud2lk
dGgoKSA8IDIgKiBtX3RpbGVTaXplLndpZHRoKCkpIHsKKyAgICAgICAgVGlsZUluZGV4IHRvcExl
ZnQ7CisgICAgICAgIFRpbGVJbmRleCBib3R0b21SaWdodDsKKyAgICAgICAgZ2V0VGlsZUluZGV4
UmFuZ2VGb3JSZWN0KHJlcGFpbnRSZWN0SW5UaWxlQ29vcmRzLCB0b3BMZWZ0LCBib3R0b21SaWdo
dCk7CisKKyAgICAgICAgZm9yIChpbnQgeSA9IHRvcExlZnQueSgpOyB5IDw9IGJvdHRvbVJpZ2h0
LnkoKTsgKyt5KSB7CisgICAgICAgICAgICBmb3IgKGludCB4ID0gdG9wTGVmdC54KCk7IHggPD0g
Ym90dG9tUmlnaHQueCgpOyArK3gpIHsKKyAgICAgICAgICAgICAgICBUaWxlSW5kZXggdGlsZUlu
ZGV4KHgsIHkpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFRpbGVNYXA6Oml0
ZXJhdG9yIGl0ID0gbV90aWxlcy5maW5kKHRpbGVJbmRleCk7CisgICAgICAgICAgICAgICAgaWYg
KGl0ICE9IG1fdGlsZXMuZW5kKCkpCisgICAgICAgICAgICAgICAgICAgIHNldFRpbGVOZWVkc0Rp
c3BsYXlJblJlY3QodGlsZUluZGV4LCBpdC0+dmFsdWUsIHJlcGFpbnRSZWN0SW5UaWxlQ29vcmRz
LCBtX3ByaW1hcnlUaWxlQ292ZXJhZ2VSZWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
ICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChUaWxlTWFwOjppdGVyYXRvciBpdCA9
IG1fdGlsZXMuYmVnaW4oKSwgZW5kID0gbV90aWxlcy5lbmQoKTsgaXQgIT0gZW5kOyArK2l0KQor
ICAgICAgICBzZXRUaWxlTmVlZHNEaXNwbGF5SW5SZWN0KGl0LT5rZXksIGl0LT52YWx1ZSwgcmVw
YWludFJlY3RJblRpbGVDb29yZHMsIG1fcHJpbWFyeVRpbGVDb3ZlcmFnZVJlY3QpOworfQorCit2
b2lkIFRpbGVDb250cm9sbGVyOjpzZXRUaWxlTmVlZHNEaXNwbGF5SW5SZWN0KGNvbnN0IFRpbGVJ
bmRleCYgdGlsZUluZGV4LCBUaWxlSW5mbyYgdGlsZUluZm8sIGNvbnN0IEludFJlY3QmIHJlcGFp
bnRSZWN0SW5UaWxlQ29vcmRzLCBjb25zdCBJbnRSZWN0JiBjb3ZlcmFnZVJlY3RJblRpbGVDb29y
ZHMpCit7CisgICAgUGxhdGZvcm1DQUxheWVyKiB0aWxlTGF5ZXIgPSB0aWxlSW5mby5sYXllci5n
ZXQoKTsKKworICAgIEludFJlY3QgdGlsZVJlY3QgPSByZWN0Rm9yVGlsZUluZGV4KHRpbGVJbmRl
eCk7CisgICAgRmxvYXRSZWN0IHRpbGVSZXBhaW50UmVjdCA9IHRpbGVSZWN0OworICAgIHRpbGVS
ZXBhaW50UmVjdC5pbnRlcnNlY3QocmVwYWludFJlY3RJblRpbGVDb29yZHMpOworICAgIGlmICh0
aWxlUmVwYWludFJlY3QuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICB0aWxlUmVw
YWludFJlY3QubW92ZUJ5KC10aWxlUmVjdC5sb2NhdGlvbigpKTsKKyAgICAKKyAgICAvLyBXZSBj
b3VsZCB0ZXN0IGZvciBpbnRlcnNlY3Rpb24gd2l0aCB0aGUgdmlzaWJsZSByZWN0LiBUaGlzIHdv
dWxkIHJlZHVjZSBwYWludGluZyB5ZXQgbW9yZSwKKyAgICAvLyBidXQgbWF5IG1ha2Ugc2Nyb2xs
aW5nIHN0YWxlIHRpbGVzIGludG8gdmlldyBtb3JlIGZyZXF1ZW50LgorICAgIGlmICh0aWxlUmVj
dC5pbnRlcnNlY3RzKGNvdmVyYWdlUmVjdEluVGlsZUNvb3JkcykgJiYgdGlsZUxheWVyLT5zdXBl
cmxheWVyKCkpIHsKKyAgICAgICAgdGlsZUxheWVyLT5zZXROZWVkc0Rpc3BsYXkoJnRpbGVSZXBh
aW50UmVjdCk7CisKKyAgICAgICAgaWYgKG93bmluZ0dyYXBoaWNzTGF5ZXIoKS0+cGxhdGZvcm1D
QUxheWVyU2hvd1JlcGFpbnRDb3VudGVyKDApKSB7CisgICAgICAgICAgICBGbG9hdFJlY3QgaW5k
aWNhdG9yUmVjdCgwLCAwLCA1MiwgMjcpOworICAgICAgICAgICAgdGlsZUxheWVyLT5zZXROZWVk
c0Rpc3BsYXkoJmluZGljYXRvclJlY3QpOworICAgICAgICB9CisgICAgfSBlbHNlCisgICAgICAg
IHRpbGVJbmZvLmhhc1N0YWxlQ29udGVudCA9IHRydWU7Cit9CisKK3ZvaWQgVGlsZUNvbnRyb2xs
ZXI6OnBsYXRmb3JtQ0FMYXllclBhaW50Q29udGVudHMoUGxhdGZvcm1DQUxheWVyKiBwbGF0Zm9y
bUNBTGF5ZXIsIEdyYXBoaWNzQ29udGV4dCYgY29udGV4dCwgY29uc3QgRmxvYXRSZWN0JikKK3sK
KyNpZiBQTEFURk9STShJT1MpCisgICAgaWYgKHB0aHJlYWRfbWFpbl9ucCgpKQorICAgICAgICBX
ZWJUaHJlYWRMb2NrKCk7CisjZW5kaWYKKworICAgIGlmIChwbGF0Zm9ybUNBTGF5ZXIgPT0gbV90
aWxlZFNjcm9sbGluZ0luZGljYXRvckxheWVyLmdldCgpKSB7CisgICAgICAgIGRyYXdUaWxlTWFw
Q29udGVudHMoY29udGV4dC5wbGF0Zm9ybUNvbnRleHQoKSwgbV90aWxlZFNjcm9sbGluZ0luZGlj
YXRvckxheWVyLT5ib3VuZHMoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB7Cisg
ICAgICAgIEdyYXBoaWNzQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcihjb250ZXh0KTsKKwor
ICAgICAgICBGbG9hdFBvaW50M0QgbGF5ZXJPcmlnaW4gPSBwbGF0Zm9ybUNBTGF5ZXItPnBvc2l0
aW9uKCk7CisgICAgICAgIGNvbnRleHQudHJhbnNsYXRlKC1sYXllck9yaWdpbi54KCksIC1sYXll
ck9yaWdpbi55KCkpOworICAgICAgICBjb250ZXh0LnNjYWxlKEZsb2F0U2l6ZShtX3NjYWxlLCBt
X3NjYWxlKSk7CisKKyAgICAgICAgUmVwYWludFJlY3RMaXN0IGRpcnR5UmVjdHMgPSBjb2xsZWN0
UmVjdHNUb1BhaW50KGNvbnRleHQucGxhdGZvcm1Db250ZXh0KCksIHBsYXRmb3JtQ0FMYXllcik7
CisgICAgICAgIGRyYXdMYXllckNvbnRlbnRzKGNvbnRleHQucGxhdGZvcm1Db250ZXh0KCksIG1f
dGlsZUNhY2hlTGF5ZXIsIGRpcnR5UmVjdHMpOworICAgIH0KKworICAgIGludCByZXBhaW50Q291
bnQgPSBwbGF0Zm9ybUNBTGF5ZXJJbmNyZW1lbnRSZXBhaW50Q291bnQocGxhdGZvcm1DQUxheWVy
KTsKKyAgICBpZiAob3duaW5nR3JhcGhpY3NMYXllcigpLT5wbGF0Zm9ybUNBTGF5ZXJTaG93UmVw
YWludENvdW50ZXIoMCkpCisgICAgICAgIGRyYXdSZXBhaW50SW5kaWNhdG9yKGNvbnRleHQucGxh
dGZvcm1Db250ZXh0KCksIHBsYXRmb3JtQ0FMYXllciwgcmVwYWludENvdW50LCBjYWNoZWRDR0Nv
bG9yKG1fdGlsZURlYnVnQm9yZGVyQ29sb3IsIENvbG9yU3BhY2VEZXZpY2VSR0IpKTsKKworICAg
IGlmIChzY3JvbGxpbmdQZXJmb3JtYW5jZUxvZ2dpbmdFbmFibGVkKCkpIHsKKyAgICAgICAgRmxv
YXRSZWN0IHZpc2libGVQYXJ0KHBsYXRmb3JtQ0FMYXllci0+cG9zaXRpb24oKS54KCksIHBsYXRm
b3JtQ0FMYXllci0+cG9zaXRpb24oKS55KCksIHBsYXRmb3JtQ0FMYXllci0+Ym91bmRzKCkuc2l6
ZSgpLndpZHRoKCksIHBsYXRmb3JtQ0FMYXllci0+Ym91bmRzKCkuc2l6ZSgpLmhlaWdodCgpKTsK
KyAgICAgICAgdmlzaWJsZVBhcnQuaW50ZXJzZWN0KHZpc2libGVSZWN0KCkpOworCisgICAgICAg
IGlmIChyZXBhaW50Q291bnQgPT0gMSAmJiAhdmlzaWJsZVBhcnQuaXNFbXB0eSgpKQorICAgICAg
ICAgICAgV1RGTG9nQWx3YXlzKCJTQ1JPTExJTkc6IEZpbGxlZCB2aXNpYmxlIGZyZXNoIHRpbGUu
IFRpbWU6ICVmIFVuZmlsbGVkIFBpeGVsczogJXVcbiIsIFdURjo6bW9ub3RvbmljYWxseUluY3Jl
YXNpbmdUaW1lKCksIGJsYW5rUGl4ZWxDb3VudCgpKTsKKyAgICB9Cit9CisKK2Zsb2F0IFRpbGVD
b250cm9sbGVyOjpwbGF0Zm9ybUNBTGF5ZXJEZXZpY2VTY2FsZUZhY3RvcigpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIG93bmluZ0dyYXBoaWNzTGF5ZXIoKS0+cGxhdGZvcm1DQUxheWVyRGV2aWNlU2Nh
bGVGYWN0b3IoKTsKK30KKworYm9vbCBUaWxlQ29udHJvbGxlcjo6cGxhdGZvcm1DQUxheWVyU2hv
d0RlYnVnQm9yZGVycygpIGNvbnN0Cit7CisgICAgcmV0dXJuIG93bmluZ0dyYXBoaWNzTGF5ZXIo
KS0+cGxhdGZvcm1DQUxheWVyU2hvd0RlYnVnQm9yZGVycygpOworfQorCitib29sIFRpbGVDb250
cm9sbGVyOjpwbGF0Zm9ybUNBTGF5ZXJTaG93UmVwYWludENvdW50ZXIoUGxhdGZvcm1DQUxheWVy
KikgY29uc3QKK3sKKyAgICByZXR1cm4gb3duaW5nR3JhcGhpY3NMYXllcigpLT5wbGF0Zm9ybUNB
TGF5ZXJTaG93UmVwYWludENvdW50ZXIoMCk7Cit9CisKK3ZvaWQgVGlsZUNvbnRyb2xsZXI6OnNl
dFNjYWxlKGZsb2F0IHNjYWxlKQoreworICAgIEFTU0VSVChvd25pbmdHcmFwaGljc0xheWVyKCkt
PmlzQ29tbWl0dGluZ0NoYW5nZXMoKSk7CisKKyAgICBmbG9hdCBkZXZpY2VTY2FsZUZhY3RvciA9
IG93bmluZ0dyYXBoaWNzTGF5ZXIoKS0+cGxhdGZvcm1DQUxheWVyRGV2aWNlU2NhbGVGYWN0b3Io
KTsKKworICAgIC8vIFRoZSBzY2FsZSB3ZSBnZXQgaXMgdGhlIHByb2R1Y3Qgb2YgdGhlIHBhZ2Ug
c2NhbGUgZmFjdG9yIGFuZCBkZXZpY2Ugc2NhbGUgZmFjdG9yLgorICAgIC8vIERpdmlkZSBieSB0
aGUgZGV2aWNlIHNjYWxlIGZhY3RvciBzbyB3ZSdsbCBnZXQgdGhlIHBhZ2Ugc2NhbGUgZmFjdG9y
LgorICAgIHNjYWxlIC89IGRldmljZVNjYWxlRmFjdG9yOworCisgICAgaWYgKG1fc2NhbGUgPT0g
c2NhbGUgJiYgbV9kZXZpY2VTY2FsZUZhY3RvciA9PSBkZXZpY2VTY2FsZUZhY3RvciAmJiAhbV9o
YXNUaWxlc1dpdGhUZW1wb3JhcnlTY2FsZUZhY3RvcikKKyAgICAgICAgcmV0dXJuOworCisgICAg
bV9oYXNUaWxlc1dpdGhUZW1wb3JhcnlTY2FsZUZhY3RvciA9IGZhbHNlOworICAgIG1fZGV2aWNl
U2NhbGVGYWN0b3IgPSBkZXZpY2VTY2FsZUZhY3RvcjsKKyAgICBtX3NjYWxlID0gc2NhbGU7CisK
KyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCB0cmFuc2Zvcm07CisgICAgdHJhbnNmb3JtLnNjYWxl
KDEgLyBtX3NjYWxlKTsKKyAgICBtX3RpbGVDb250YWluZXJMYXllci0+c2V0VHJhbnNmb3JtKHRy
YW5zZm9ybSk7CisKKyAgICAvLyBGSVhNRTogd2UgbWF5IHJldmFsaWRhdGVUaWxlcyB0d2ljZSBp
biB0aGlzIGNvbW1pdC4KKyAgICByZXZhbGlkYXRlVGlsZXMoUHJ1bmVTZWNvbmRhcnlUaWxlcywg
UHJ1bmVTZWNvbmRhcnlUaWxlcyk7CisKKyAgICBmb3IgKFRpbGVNYXA6OmNvbnN0X2l0ZXJhdG9y
IGl0ID0gbV90aWxlcy5iZWdpbigpLCBlbmQgPSBtX3RpbGVzLmVuZCgpOyBpdCAhPSBlbmQ7ICsr
aXQpCisgICAgICAgIGl0LT52YWx1ZS5sYXllci0+c2V0Q29udGVudHNTY2FsZShkZXZpY2VTY2Fs
ZUZhY3Rvcik7Cit9CisKK3ZvaWQgVGlsZUNvbnRyb2xsZXI6OnNldEFjY2VsZXJhdGVzRHJhd2lu
Zyhib29sIGFjY2VsZXJhdGVzRHJhd2luZykKK3sKKyAgICBpZiAobV9hY2NlbGVyYXRlc0RyYXdp
bmcgPT0gYWNjZWxlcmF0ZXNEcmF3aW5nKQorICAgICAgICByZXR1cm47CisKKyAgICBtX2FjY2Vs
ZXJhdGVzRHJhd2luZyA9IGFjY2VsZXJhdGVzRHJhd2luZzsKKworICAgIGZvciAoVGlsZU1hcDo6
Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3RpbGVzLmJlZ2luKCksIGVuZCA9IG1fdGlsZXMuZW5kKCk7
IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBjb25zdCBUaWxlSW5mbyYgdGlsZUluZm8gPSBp
dC0+dmFsdWU7CisgICAgICAgIHRpbGVJbmZvLmxheWVyLT5zZXRBY2NlbGVyYXRlc0RyYXdpbmco
bV9hY2NlbGVyYXRlc0RyYXdpbmcpOworICAgIH0KK30KKwordm9pZCBUaWxlQ29udHJvbGxlcjo6
c2V0VGlsZXNPcGFxdWUoYm9vbCBvcGFxdWUpCit7CisgICAgaWYgKG9wYXF1ZSA9PSBtX3RpbGVz
QXJlT3BhcXVlKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3RpbGVzQXJlT3BhcXVlID0gb3Bh
cXVlOworCisgICAgZm9yIChUaWxlTWFwOjppdGVyYXRvciBpdCA9IG1fdGlsZXMuYmVnaW4oKSwg
ZW5kID0gbV90aWxlcy5lbmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIGNvbnN0IFRp
bGVJbmZvJiB0aWxlSW5mbyA9IGl0LT52YWx1ZTsKKyAgICAgICAgdGlsZUluZm8ubGF5ZXItPnNl
dE9wYXF1ZShvcGFxdWUpOworICAgIH0KK30KKwordm9pZCBUaWxlQ29udHJvbGxlcjo6c2V0Vmlz
aWJsZVJlY3QoY29uc3QgRmxvYXRSZWN0JiB2aXNpYmxlUmVjdCkKK3sKKyAgICBBU1NFUlQob3du
aW5nR3JhcGhpY3NMYXllcigpLT5pc0NvbW1pdHRpbmdDaGFuZ2VzKCkpOworICAgIGlmIChtX3Zp
c2libGVSZWN0ID09IHZpc2libGVSZWN0KQorICAgICAgICByZXR1cm47CisKKyAgICBtX3Zpc2li
bGVSZWN0ID0gdmlzaWJsZVJlY3Q7CisgICAgc2V0TmVlZHNSZXZhbGlkYXRlVGlsZXMoKTsKK30K
KworYm9vbCBUaWxlQ29udHJvbGxlcjo6dGlsZXNXb3VsZENoYW5nZUZvclZpc2libGVSZWN0KGNv
bnN0IEZsb2F0UmVjdCYgbmV3VmlzaWJsZVJlY3QpIGNvbnN0Cit7CisgICAgRmxvYXRSZWN0IHZp
c2libGVSZWN0ID0gbmV3VmlzaWJsZVJlY3Q7CisgICAgdmlzaWJsZVJlY3QuaW50ZXJzZWN0KHNj
YWxlZEV4cG9zZWRSZWN0KCkpOworCisgICAgaWYgKHZpc2libGVSZWN0LmlzRW1wdHkoKSB8fCBi
b3VuZHMoKS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgCisgICAg
RmxvYXRSZWN0IGN1cnJlbnRUaWxlQ292ZXJhZ2VSZWN0ID0gY29tcHV0ZVRpbGVDb3ZlcmFnZVJl
Y3QobV92aXNpYmxlUmVjdCwgbmV3VmlzaWJsZVJlY3QpOworICAgIEZsb2F0UmVjdCBzY2FsZWRS
ZWN0KGN1cnJlbnRUaWxlQ292ZXJhZ2VSZWN0KTsKKyAgICBzY2FsZWRSZWN0LnNjYWxlKG1fc2Nh
bGUpOworICAgIEludFJlY3QgY3VycmVudENvdmVyYWdlUmVjdEluVGlsZUNvb3JkcyhlbmNsb3Np
bmdJbnRSZWN0KHNjYWxlZFJlY3QpKTsKKworICAgIFRpbGVJbmRleCB0b3BMZWZ0OworICAgIFRp
bGVJbmRleCBib3R0b21SaWdodDsKKyAgICBnZXRUaWxlSW5kZXhSYW5nZUZvclJlY3QoY3VycmVu
dENvdmVyYWdlUmVjdEluVGlsZUNvb3JkcywgdG9wTGVmdCwgYm90dG9tUmlnaHQpOworCisgICAg
SW50UmVjdCBjb3ZlcmFnZVJlY3QgPSByZWN0Rm9yVGlsZUluZGV4KHRvcExlZnQpOworICAgIGNv
dmVyYWdlUmVjdC51bml0ZShyZWN0Rm9yVGlsZUluZGV4KGJvdHRvbVJpZ2h0KSk7CisgICAgcmV0
dXJuIGNvdmVyYWdlUmVjdCAhPSBtX3ByaW1hcnlUaWxlQ292ZXJhZ2VSZWN0OworfQorCit2b2lk
IFRpbGVDb250cm9sbGVyOjpzZXRFeHBvc2VkUmVjdChjb25zdCBGbG9hdFJlY3QmIGV4cG9zZWRS
ZWN0KQoreworICAgIGlmIChtX2V4cG9zZWRSZWN0ID09IGV4cG9zZWRSZWN0KQorICAgICAgICBy
ZXR1cm47CisKKyAgICBtX2V4cG9zZWRSZWN0ID0gZXhwb3NlZFJlY3Q7CisgICAgc2V0TmVlZHNS
ZXZhbGlkYXRlVGlsZXMoKTsKK30KKworRmxvYXRSZWN0IFRpbGVDb250cm9sbGVyOjpzY2FsZWRF
eHBvc2VkUmVjdCgpIGNvbnN0Cit7CisgICAgRmxvYXRSZWN0IHNjYWxlZEV4cG9zZWRSZWN0ID0g
bV9leHBvc2VkUmVjdDsKKyAgICBzY2FsZWRFeHBvc2VkUmVjdC5zY2FsZSgxIC8gbV9zY2FsZSk7
CisgICAgcmV0dXJuIHNjYWxlZEV4cG9zZWRSZWN0OworfQorCit2b2lkIFRpbGVDb250cm9sbGVy
OjpwcmVwb3B1bGF0ZVJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0KQoreworICAgIEZsb2F0UmVj
dCBzY2FsZWRSZWN0KHJlY3QpOworICAgIHNjYWxlZFJlY3Quc2NhbGUobV9zY2FsZSk7CisgICAg
SW50UmVjdCByZWN0SW5UaWxlQ29vcmRzKGVuY2xvc2luZ0ludFJlY3Qoc2NhbGVkUmVjdCkpOwor
CisgICAgaWYgKG1fcHJpbWFyeVRpbGVDb3ZlcmFnZVJlY3QuY29udGFpbnMocmVjdEluVGlsZUNv
b3JkcykpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBtX3NlY29uZGFyeVRpbGVDb3ZlcmFn
ZVJlY3RzLmFwcGVuZChyZWN0KTsKKyAgICBzZXROZWVkc1JldmFsaWRhdGVUaWxlcygpOworfQor
Cit2b2lkIFRpbGVDb250cm9sbGVyOjpzZXRJc0luV2luZG93KGJvb2wgaXNJbldpbmRvdykKK3sK
KyAgICBpZiAobV9pc0luV2luZG93ID09IGlzSW5XaW5kb3cpCisgICAgICAgIHJldHVybjsKKwor
ICAgIG1faXNJbldpbmRvdyA9IGlzSW5XaW5kb3c7CisKKyAgICBpZiAobV9pc0luV2luZG93KQor
ICAgICAgICBzZXROZWVkc1JldmFsaWRhdGVUaWxlcygpOworICAgIGVsc2UgeworICAgICAgICBj
b25zdCBkb3VibGUgdGlsZVJldmFsaWRhdGlvblRpbWVvdXQgPSA0OworICAgICAgICBzY2hlZHVs
ZVRpbGVSZXZhbGlkYXRpb24odGlsZVJldmFsaWRhdGlvblRpbWVvdXQpOworICAgIH0KK30KKwor
dm9pZCBUaWxlQ29udHJvbGxlcjo6c2V0VGlsZUNvdmVyYWdlKFRpbGVDb3ZlcmFnZSBjb3ZlcmFn
ZSkKK3sKKyAgICBpZiAoY292ZXJhZ2UgPT0gbV90aWxlQ292ZXJhZ2UpCisgICAgICAgIHJldHVy
bjsKKworICAgIG1fdGlsZUNvdmVyYWdlID0gY292ZXJhZ2U7CisgICAgc2V0TmVlZHNSZXZhbGlk
YXRlVGlsZXMoKTsKK30KKwordm9pZCBUaWxlQ29udHJvbGxlcjo6cmV2YWxpZGF0ZVRpbGVzKCkK
K3sKKyAgICBBU1NFUlQob3duaW5nR3JhcGhpY3NMYXllcigpLT5pc0NvbW1pdHRpbmdDaGFuZ2Vz
KCkpOworICAgIHJldmFsaWRhdGVUaWxlcygwLCAwKTsKK30KKwordm9pZCBUaWxlQ29udHJvbGxl
cjo6Zm9yY2VSZXBhaW50KCkKK3sKKyAgICBzZXROZWVkc0Rpc3BsYXkoKTsKK30KKwordm9pZCBU
aWxlQ29udHJvbGxlcjo6c2V0VGlsZURlYnVnQm9yZGVyV2lkdGgoZmxvYXQgYm9yZGVyV2lkdGgp
Cit7CisgICAgaWYgKG1fdGlsZURlYnVnQm9yZGVyV2lkdGggPT0gYm9yZGVyV2lkdGgpCisgICAg
ICAgIHJldHVybjsKKworICAgIG1fdGlsZURlYnVnQm9yZGVyV2lkdGggPSBib3JkZXJXaWR0aDsK
KyAgICBmb3IgKFRpbGVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV90aWxlcy5iZWdpbigpLCBl
bmQgPSBtX3RpbGVzLmVuZCgpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgY29uc3QgVGls
ZUluZm8mIHRpbGVJbmZvID0gaXQtPnZhbHVlOworICAgICAgICB0aWxlSW5mby5sYXllci0+c2V0
Qm9yZGVyV2lkdGgobV90aWxlRGVidWdCb3JkZXJXaWR0aCk7CisgICAgfQorfQorCit2b2lkIFRp
bGVDb250cm9sbGVyOjpzZXRUaWxlRGVidWdCb3JkZXJDb2xvcihDb2xvciBib3JkZXJDb2xvcikK
K3sKKyAgICBpZiAobV90aWxlRGVidWdCb3JkZXJDb2xvciA9PSBib3JkZXJDb2xvcikKKyAgICAg
ICAgcmV0dXJuOworCisgICAgbV90aWxlRGVidWdCb3JkZXJDb2xvciA9IGJvcmRlckNvbG9yOwor
ICAgIGZvciAoVGlsZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3RpbGVzLmJlZ2luKCksIGVu
ZCA9IG1fdGlsZXMuZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkKKyAgICAgICAgaXQtPnZhbHVlLmxh
eWVyLT5zZXRCb3JkZXJDb2xvcihib3JkZXJDb2xvcik7Cit9CisKK0ludFJlY3QgVGlsZUNvbnRy
b2xsZXI6OmJvdW5kcygpIGNvbnN0Cit7CisgICAgSW50UG9pbnQgYm91bmRzT3JpZ2luSW5jbHVk
aW5nTWFyZ2luKC1sZWZ0TWFyZ2luV2lkdGgoKSwgLXRvcE1hcmdpbkhlaWdodCgpKTsKKyAgICBJ
bnRTaXplIGJvdW5kc1NpemVJbmNsdWRpbmdNYXJnaW4gPSBleHBhbmRlZEludFNpemUobV90aWxl
Q2FjaGVMYXllci0+Ym91bmRzKCkuc2l6ZSgpKTsKKyAgICBib3VuZHNTaXplSW5jbHVkaW5nTWFy
Z2luLmV4cGFuZChsZWZ0TWFyZ2luV2lkdGgoKSArIHJpZ2h0TWFyZ2luV2lkdGgoKSwgdG9wTWFy
Z2luSGVpZ2h0KCkgKyBib3R0b21NYXJnaW5IZWlnaHQoKSk7CisKKyAgICByZXR1cm4gSW50UmVj
dChib3VuZHNPcmlnaW5JbmNsdWRpbmdNYXJnaW4sIGJvdW5kc1NpemVJbmNsdWRpbmdNYXJnaW4p
OworfQorCitJbnRSZWN0IFRpbGVDb250cm9sbGVyOjpib3VuZHNXaXRob3V0TWFyZ2luKCkgY29u
c3QKK3sKKyAgICByZXR1cm4gSW50UmVjdChJbnRQb2ludCgpLCBleHBhbmRlZEludFNpemUobV90
aWxlQ2FjaGVMYXllci0+Ym91bmRzKCkuc2l6ZSgpKSk7Cit9CisKK0ludFJlY3QgVGlsZUNvbnRy
b2xsZXI6OmJvdW5kc0F0TGFzdFJldmFsaWRhdGVXaXRob3V0TWFyZ2luKCkgY29uc3QKK3sKKyAg
ICBJbnRSZWN0IGJvdW5kc1dpdGhvdXRNYXJnaW4gPSBJbnRSZWN0KEludFBvaW50KCksIG1fYm91
bmRzQXRMYXN0UmV2YWxpZGF0ZS5zaXplKCkpOworICAgIGJvdW5kc1dpdGhvdXRNYXJnaW4uY29u
dHJhY3QoSW50U2l6ZShsZWZ0TWFyZ2luV2lkdGgoKSArIHJpZ2h0TWFyZ2luV2lkdGgoKSwgdG9w
TWFyZ2luSGVpZ2h0KCkgKyBib3R0b21NYXJnaW5IZWlnaHQoKSkpOworICAgIHJldHVybiBib3Vu
ZHNXaXRob3V0TWFyZ2luOworfQorCit2b2lkIFRpbGVDb250cm9sbGVyOjphZGp1c3RSZWN0QXRU
aWxlSW5kZXhGb3JNYXJnaW4oY29uc3QgVGlsZUluZGV4JiB0aWxlSW5kZXgsIEludFJlY3QmIHJl
Y3QpIGNvbnN0Cit7CisgICAgaWYgKCFoYXNNYXJnaW5zKCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIC8vIFRoaXMgaXMgYSB0aWxlIGluIHRoZSB0b3AgbWFyZ2luLgorICAgIGlmIChtX21hcmdp
blRvcCAmJiB0aWxlSW5kZXgueSgpIDwgMCkgeworICAgICAgICByZWN0LnNldFkodGlsZUluZGV4
LnkoKSAqIHRvcE1hcmdpbkhlaWdodCgpKTsKKyAgICAgICAgcmVjdC5zZXRIZWlnaHQodG9wTWFy
Z2luSGVpZ2h0KCkpOworICAgIH0KKworICAgIC8vIFRoaXMgaXMgYSB0aWxlIGluIHRoZSBsZWZ0
IG1hcmdpbi4KKyAgICBpZiAobV9tYXJnaW5MZWZ0ICYmIHRpbGVJbmRleC54KCkgPCAwKSB7Cisg
ICAgICAgIHJlY3Quc2V0WCh0aWxlSW5kZXgueCgpICogbGVmdE1hcmdpbldpZHRoKCkpOworICAg
ICAgICByZWN0LnNldFdpZHRoKGxlZnRNYXJnaW5XaWR0aCgpKTsKKyAgICB9CisKKyAgICBUaWxl
SW5kZXggY29udGVudFRvcExlZnQ7CisgICAgVGlsZUluZGV4IGNvbnRlbnRCb3R0b21SaWdodDsK
KyAgICBnZXRUaWxlSW5kZXhSYW5nZUZvclJlY3QoYm91bmRzV2l0aG91dE1hcmdpbigpLCBjb250
ZW50VG9wTGVmdCwgY29udGVudEJvdHRvbVJpZ2h0KTsKKworICAgIC8vIFRoaXMgaXMgYSB0aWxl
IGluIHRoZSBib3R0b20gbWFyZ2luLgorICAgIGlmIChtX21hcmdpbkJvdHRvbSAmJiB0aWxlSW5k
ZXgueSgpID4gY29udGVudEJvdHRvbVJpZ2h0LnkoKSkKKyAgICAgICAgcmVjdC5zZXRIZWlnaHQo
Ym90dG9tTWFyZ2luSGVpZ2h0KCkpOworCisgICAgLy8gVGhpcyBpcyBhIHRpbGUgaW4gdGhlIHJp
Z2h0IG1hcmdpbi4KKyAgICBpZiAobV9tYXJnaW5SaWdodCAmJiB0aWxlSW5kZXgueCgpID4gY29u
dGVudEJvdHRvbVJpZ2h0LngoKSkKKyAgICAgICAgcmVjdC5zZXRXaWR0aChyaWdodE1hcmdpbldp
ZHRoKCkpOworfQorCitJbnRSZWN0IFRpbGVDb250cm9sbGVyOjpyZWN0Rm9yVGlsZUluZGV4KGNv
bnN0IFRpbGVJbmRleCYgdGlsZUluZGV4KSBjb25zdAoreworICAgIEludFJlY3QgcmVjdCh0aWxl
SW5kZXgueCgpICogbV90aWxlU2l6ZS53aWR0aCgpLCB0aWxlSW5kZXgueSgpICogbV90aWxlU2l6
ZS5oZWlnaHQoKSwgbV90aWxlU2l6ZS53aWR0aCgpLCBtX3RpbGVTaXplLmhlaWdodCgpKTsKKyAg
ICBJbnRSZWN0IHNjYWxlZEJvdW5kcyhib3VuZHMoKSk7CisgICAgc2NhbGVkQm91bmRzLnNjYWxl
KG1fc2NhbGUpOworCisgICAgcmVjdC5pbnRlcnNlY3Qoc2NhbGVkQm91bmRzKTsKKworICAgIC8v
IFRoZXNlIHJlY3QgY29tcHV0YXRpb25zIGFzc3VtZSBtX3RpbGVTaXplIGlzIHRoZSBjb3JyZWN0
IHNpemUgdG8gdXNlLiBIb3dldmVyLCBhIHRpbGUgaW4gdGhlIG1hcmdpbiBhcmVhCisgICAgLy8g
bWlnaHQgYmUgYSBkaWZmZXJlbnQgc2l6ZSBkZXBlbmRpbmcgb24gdGhlIHNpemUgb2YgdGhlIG1h
cmdpbnMuIFNvIGFkanVzdFJlY3RBdFRpbGVJbmRleEZvck1hcmdpbigpIHdpbGwKKyAgICAvLyBm
aXggdGhlIHJlY3Qgd2UndmUgY29tcHV0ZWQgdG8gbWF0Y2ggdGhlIG1hcmdpbiBzaXplcyBpZiB0
aGlzIHRpbGUgaXMgaW4gdGhlIG1hcmdpbnMuCisgICAgYWRqdXN0UmVjdEF0VGlsZUluZGV4Rm9y
TWFyZ2luKHRpbGVJbmRleCwgcmVjdCk7CisKKyAgICByZXR1cm4gcmVjdDsKK30KKwordm9pZCBU
aWxlQ29udHJvbGxlcjo6Z2V0VGlsZUluZGV4UmFuZ2VGb3JSZWN0KGNvbnN0IEludFJlY3QmIHJl
Y3QsIFRpbGVJbmRleCYgdG9wTGVmdCwgVGlsZUluZGV4JiBib3R0b21SaWdodCkgY29uc3QKK3sK
KyAgICBJbnRSZWN0IGNsYW1wZWRSZWN0ID0gYm91bmRzKCk7CisgICAgY2xhbXBlZFJlY3Quc2Nh
bGUobV9zY2FsZSk7CisgICAgY2xhbXBlZFJlY3QuaW50ZXJzZWN0KHJlY3QpOworCisgICAgaWYg
KGNsYW1wZWRSZWN0LngoKSA+PSAwKQorICAgICAgICB0b3BMZWZ0LnNldFgoY2xhbXBlZFJlY3Qu
eCgpIC8gbV90aWxlU2l6ZS53aWR0aCgpKTsKKyAgICBlbHNlCisgICAgICAgIHRvcExlZnQuc2V0
WChmbG9vcmYoKGZsb2F0KWNsYW1wZWRSZWN0LngoKSAvIGxlZnRNYXJnaW5XaWR0aCgpKSk7CisK
KyAgICBpZiAoY2xhbXBlZFJlY3QueSgpID49IDApCisgICAgICAgIHRvcExlZnQuc2V0WShjbGFt
cGVkUmVjdC55KCkgLyBtX3RpbGVTaXplLmhlaWdodCgpKTsKKyAgICBlbHNlCisgICAgICAgIHRv
cExlZnQuc2V0WShmbG9vcmYoKGZsb2F0KWNsYW1wZWRSZWN0LnkoKSAvIHRvcE1hcmdpbkhlaWdo
dCgpKSk7CisKKyAgICBpbnQgYm90dG9tWFJhdGlvID0gY2VpbCgoZmxvYXQpY2xhbXBlZFJlY3Qu
bWF4WCgpIC8gbV90aWxlU2l6ZS53aWR0aCgpKTsKKyAgICBib3R0b21SaWdodC5zZXRYKHN0ZDo6
bWF4KGJvdHRvbVhSYXRpbyAtIDEsIDApKTsKKworICAgIGludCBib3R0b21ZUmF0aW8gPSBjZWls
KChmbG9hdCljbGFtcGVkUmVjdC5tYXhZKCkgLyBtX3RpbGVTaXplLmhlaWdodCgpKTsKKyAgICBi
b3R0b21SaWdodC5zZXRZKHN0ZDo6bWF4KGJvdHRvbVlSYXRpbyAtIDEsIDApKTsKK30KKworRmxv
YXRSZWN0IFRpbGVDb250cm9sbGVyOjpjb21wdXRlVGlsZUNvdmVyYWdlUmVjdChjb25zdCBGbG9h
dFJlY3QmIHByZXZpb3VzVmlzaWJsZVJlY3QsIGNvbnN0IEZsb2F0UmVjdCYgY3VycmVudFZpc2li
bGVSZWN0KSBjb25zdAoreworICAgIEZsb2F0UmVjdCB2aXNpYmxlUmVjdCA9IGN1cnJlbnRWaXNp
YmxlUmVjdDsKKyAgICB2aXNpYmxlUmVjdC5pbnRlcnNlY3Qoc2NhbGVkRXhwb3NlZFJlY3QoKSk7
CisKKyAgICAvLyBJZiB0aGUgcGFnZSBpcyBub3QgaW4gYSB3aW5kb3cgKGZvciBleGFtcGxlIGlm
IGl0J3MgaW4gYSBiYWNrZ3JvdW5kIHRhYiksIHdlIGxpbWl0IHRoZSB0aWxlIGNvdmVyYWdlIHJl
Y3QgdG8gdGhlIHZpc2libGUgcmVjdC4KKyAgICBpZiAoIW1faXNJbldpbmRvdykKKyAgICAgICAg
cmV0dXJuIHZpc2libGVSZWN0OworCisgICAgLy8gRklYTUU6IGxvb2sgYXQgaG93IGZhciB0aGUg
ZG9jdW1lbnQgY2FuIHNjcm9sbCBpbiBlYWNoIGRpbWVuc2lvbi4KKyAgICBmbG9hdCBjb3ZlcmFn
ZUhvcml6b250YWxTaXplID0gdmlzaWJsZVJlY3Qud2lkdGgoKTsKKyAgICBmbG9hdCBjb3ZlcmFn
ZVZlcnRpY2FsU2l6ZSA9IHZpc2libGVSZWN0LmhlaWdodCgpOworCisjaWYgUExBVEZPUk0oSU9T
KQorICAgIFVOVVNFRF9QQVJBTShwcmV2aW91c1Zpc2libGVSZWN0KTsKKyAgICByZXR1cm4gdmlz
aWJsZVJlY3Q7CisjZWxzZQorICAgIGJvb2wgbGFyZ2VWaXNpYmxlUmVjdENoYW5nZSA9ICFwcmV2
aW91c1Zpc2libGVSZWN0LmlzRW1wdHkoKSAmJiAhdmlzaWJsZVJlY3QuaW50ZXJzZWN0cyhwcmV2
aW91c1Zpc2libGVSZWN0KTsKKworICAgIC8vIEluZmxhdGUgdGhlIGNvdmVyYWdlIHJlY3Qgc28g
dGhhdCBpdCBjb3ZlcnMgMnggb2YgdGhlIHZpc2libGUgd2lkdGggYW5kIDN4IG9mIHRoZSB2aXNp
YmxlIGhlaWdodC4KKyAgICAvLyBUaGVzZSB2YWx1ZXMgd2VyZSBjaG9zZW4gYmVjYXVzZSBpdCdz
IG1vcmUgY29tbW9uIHRvIGhhdmUgdGFsbCBwYWdlcyBhbmQgdG8gc2Nyb2xsIHZlcnRpY2FsbHks
CisgICAgLy8gc28gd2Uga2VlcCBtb3JlIHRpbGVzIGFib3ZlIGFuZCBiZWxvdyB0aGUgY3VycmVu
dCBhcmVhLgorCisgICAgaWYgKG1fdGlsZUNvdmVyYWdlICYgQ292ZXJhZ2VGb3JIb3Jpem9udGFs
U2Nyb2xsaW5nICYmICFsYXJnZVZpc2libGVSZWN0Q2hhbmdlKQorICAgICAgICBjb3ZlcmFnZUhv
cml6b250YWxTaXplICo9IDI7CisKKyAgICBpZiAobV90aWxlQ292ZXJhZ2UgJiBDb3ZlcmFnZUZv
clZlcnRpY2FsU2Nyb2xsaW5nICYmICFsYXJnZVZpc2libGVSZWN0Q2hhbmdlKQorICAgICAgICBj
b3ZlcmFnZVZlcnRpY2FsU2l6ZSAqPSAzOworI2VuZGlmCisgICAgY292ZXJhZ2VWZXJ0aWNhbFNp
emUgKz0gdG9wTWFyZ2luSGVpZ2h0KCkgKyBib3R0b21NYXJnaW5IZWlnaHQoKTsKKyAgICBjb3Zl
cmFnZUhvcml6b250YWxTaXplICs9IGxlZnRNYXJnaW5XaWR0aCgpICsgcmlnaHRNYXJnaW5XaWR0
aCgpOworCisgICAgRmxvYXRSZWN0IGNvdmVyYWdlQm91bmRzID0gYm91bmRzKCk7CisgICAgZmxv
YXQgY292ZXJhZ2VMZWZ0ID0gdmlzaWJsZVJlY3QueCgpIC0gKGNvdmVyYWdlSG9yaXpvbnRhbFNp
emUgLSB2aXNpYmxlUmVjdC53aWR0aCgpKSAvIDI7CisgICAgY292ZXJhZ2VMZWZ0ID0gc3RkOjpt
aW4oY292ZXJhZ2VMZWZ0LCBjb3ZlcmFnZUJvdW5kcy5tYXhYKCkgLSBjb3ZlcmFnZUhvcml6b250
YWxTaXplKTsKKyAgICBjb3ZlcmFnZUxlZnQgPSBzdGQ6Om1heChjb3ZlcmFnZUxlZnQsIGNvdmVy
YWdlQm91bmRzLngoKSk7CisKKyAgICBmbG9hdCBjb3ZlcmFnZVRvcCA9IHZpc2libGVSZWN0Lnko
KSAtIChjb3ZlcmFnZVZlcnRpY2FsU2l6ZSAtIHZpc2libGVSZWN0LmhlaWdodCgpKSAvIDI7Cisg
ICAgY292ZXJhZ2VUb3AgPSBzdGQ6Om1pbihjb3ZlcmFnZVRvcCwgY292ZXJhZ2VCb3VuZHMubWF4
WSgpIC0gY292ZXJhZ2VWZXJ0aWNhbFNpemUpOworICAgIGNvdmVyYWdlVG9wID0gc3RkOjptYXgo
Y292ZXJhZ2VUb3AsIGNvdmVyYWdlQm91bmRzLnkoKSk7CisKKyAgICByZXR1cm4gRmxvYXRSZWN0
KGNvdmVyYWdlTGVmdCwgY292ZXJhZ2VUb3AsIGNvdmVyYWdlSG9yaXpvbnRhbFNpemUsIGNvdmVy
YWdlVmVydGljYWxTaXplKTsKK30KKwordm9pZCBUaWxlQ29udHJvbGxlcjo6c2NoZWR1bGVUaWxl
UmV2YWxpZGF0aW9uKGRvdWJsZSBpbnRlcnZhbCkKK3sKKyAgICBpZiAobV90aWxlUmV2YWxpZGF0
aW9uVGltZXIuaXNBY3RpdmUoKSAmJiBtX3RpbGVSZXZhbGlkYXRpb25UaW1lci5uZXh0RmlyZUlu
dGVydmFsKCkgPCBpbnRlcnZhbCkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV90aWxlUmV2YWxp
ZGF0aW9uVGltZXIuc3RhcnRPbmVTaG90KGludGVydmFsKTsKK30KKwordm9pZCBUaWxlQ29udHJv
bGxlcjo6dGlsZVJldmFsaWRhdGlvblRpbWVyRmlyZWQoVGltZXI8VGlsZUNvbnRyb2xsZXI+KikK
K3sKKyAgICBpZiAobV9pc0luV2luZG93KSB7CisgICAgICAgIHNldE5lZWRzUmV2YWxpZGF0ZVRp
bGVzKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBUaWxlVmFsaWRhdGlvblBvbGlj
eUZsYWdzIGZvcmVncm91bmRWYWxpZGF0aW9uUG9saWN5ID0gb3duaW5nR3JhcGhpY3NMYXllcigp
LT5wbGF0Zm9ybUNBTGF5ZXJTaG91bGRBZ2dyZXNzaXZlbHlSZXRhaW5UaWxlcyhtX3RpbGVDYWNo
ZUxheWVyKSA/IDAgOiBQcnVuZVNlY29uZGFyeVRpbGVzOworICAgIFRpbGVWYWxpZGF0aW9uUG9s
aWN5RmxhZ3MgYmFja2dyb3VuZFZhbGlkYXRpb25Qb2xpY3kgPSBmb3JlZ3JvdW5kVmFsaWRhdGlv
blBvbGljeSB8IFVucGFyZW50QWxsVGlsZXM7CisKKyAgICByZXZhbGlkYXRlVGlsZXMoZm9yZWdy
b3VuZFZhbGlkYXRpb25Qb2xpY3ksIGJhY2tncm91bmRWYWxpZGF0aW9uUG9saWN5KTsKK30KKwor
dW5zaWduZWQgVGlsZUNvbnRyb2xsZXI6OmJsYW5rUGl4ZWxDb3VudCgpIGNvbnN0Cit7CisgICAg
UGxhdGZvcm1MYXllckxpc3QgdGlsZXMobV90aWxlcy5zaXplKCkpOworCisgICAgZm9yIChUaWxl
TWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fdGlsZXMuYmVnaW4oKSwgZW5kID0gbV90aWxlcy5l
bmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIGlmIChQbGF0Zm9ybUxheWVyICpsYXll
ciA9IGl0LT52YWx1ZS5sYXllci0+cGxhdGZvcm1MYXllcigpKQorICAgICAgICAgICAgdGlsZXMu
YXBwZW5kKGxheWVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gYmxhbmtQaXhlbENvdW50Rm9yVGls
ZXModGlsZXMsIG1fdmlzaWJsZVJlY3QsIEludFBvaW50KDAsMCkpOworfQorCit1bnNpZ25lZCBU
aWxlQ29udHJvbGxlcjo6YmxhbmtQaXhlbENvdW50Rm9yVGlsZXMoY29uc3QgUGxhdGZvcm1MYXll
ckxpc3QmIHRpbGVzLCBjb25zdCBGbG9hdFJlY3QmIHZpc2libGVSZWN0LCBjb25zdCBJbnRQb2lu
dCYgdGlsZVRyYW5zbGF0aW9uKQoreworICAgIFJlZ2lvbiBwYWludGVkVmlzaWJsZVRpbGVzOwor
CisgICAgZm9yIChQbGF0Zm9ybUxheWVyTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXQgPSB0aWxlcy5i
ZWdpbigpLCBlbmQgPSB0aWxlcy5lbmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIGNv
bnN0IFBsYXRmb3JtTGF5ZXIqIHRpbGVMYXllciA9IGl0LT5nZXQoKTsKKworICAgICAgICBGbG9h
dFJlY3QgdmlzaWJsZVBhcnQoQ0dSZWN0T2Zmc2V0KFt0aWxlTGF5ZXIgZnJhbWVdLCB0aWxlVHJh
bnNsYXRpb24ueCgpLCB0aWxlVHJhbnNsYXRpb24ueSgpKSk7CisgICAgICAgIHZpc2libGVQYXJ0
LmludGVyc2VjdCh2aXNpYmxlUmVjdCk7CisKKyAgICAgICAgaWYgKCF2aXNpYmxlUGFydC5pc0Vt
cHR5KCkpCisgICAgICAgICAgICBwYWludGVkVmlzaWJsZVRpbGVzLnVuaXRlKGVuY2xvc2luZ0lu
dFJlY3QodmlzaWJsZVBhcnQpKTsKKyAgICB9CisKKyAgICBSZWdpb24gdW5jb3ZlcmVkUmVnaW9u
KGVuY2xvc2luZ0ludFJlY3QodmlzaWJsZVJlY3QpKTsKKyAgICB1bmNvdmVyZWRSZWdpb24uc3Vi
dHJhY3QocGFpbnRlZFZpc2libGVUaWxlcyk7CisKKyAgICByZXR1cm4gdW5jb3ZlcmVkUmVnaW9u
LnRvdGFsQXJlYSgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcXVldWVUaWxlRm9yUmVtb3Zh
bChjb25zdCBUaWxlQ29udHJvbGxlcjo6VGlsZUluZGV4JiB0aWxlSW5kZXgsIGNvbnN0IFRpbGVD
b250cm9sbGVyOjpUaWxlSW5mbyYgdGlsZUluZm8sIFZlY3RvcjxUaWxlQ29udHJvbGxlcjo6VGls
ZUluZGV4PiYgdGlsZXNUb1JlbW92ZSwgVGlsZUNvbnRyb2xsZXI6OlJlcGFpbnRDb3VudE1hcCYg
cmVwYWludENvdW50cykKK3sKKyAgICB0aWxlSW5mby5sYXllci0+cmVtb3ZlRnJvbVN1cGVybGF5
ZXIoKTsKKyAgICByZXBhaW50Q291bnRzLnJlbW92ZSh0aWxlSW5mby5sYXllci5nZXQoKSk7Cisg
ICAgdGlsZXNUb1JlbW92ZS5hcHBlbmQodGlsZUluZGV4KTsKK30KKwordm9pZCBUaWxlQ29udHJv
bGxlcjo6cmVtb3ZlQWxsVGlsZXMoKQoreworICAgIFZlY3RvcjxUaWxlSW5kZXg+IHRpbGVzVG9S
ZW1vdmU7CisKKyAgICBmb3IgKFRpbGVNYXA6Oml0ZXJhdG9yIGl0ID0gbV90aWxlcy5iZWdpbigp
LCBlbmQgPSBtX3RpbGVzLmVuZCgpOyBpdCAhPSBlbmQ7ICsraXQpCisgICAgICAgIHF1ZXVlVGls
ZUZvclJlbW92YWwoaXQtPmtleSwgaXQtPnZhbHVlLCB0aWxlc1RvUmVtb3ZlLCBtX3RpbGVSZXBh
aW50Q291bnRzKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGlsZXNUb1JlbW92ZS5z
aXplKCk7ICsraSkgeworICAgICAgICBUaWxlSW5mbyB0aWxlSW5mbyA9IG1fdGlsZXMudGFrZSh0
aWxlc1RvUmVtb3ZlW2ldKTsKKyNpZiAhUExBVEZPUk0oSU9TKQorICAgICAgICBMYXllclBvb2w6
OnNoYXJlZFBvb2woKS0+YWRkTGF5ZXIodGlsZUluZm8ubGF5ZXIpOworI2VuZGlmCisgICAgfQor
fQorCit2b2lkIFRpbGVDb250cm9sbGVyOjpyZW1vdmVBbGxTZWNvbmRhcnlUaWxlcygpCit7Cisg
ICAgVmVjdG9yPFRpbGVJbmRleD4gdGlsZXNUb1JlbW92ZTsKKworICAgIGZvciAoVGlsZU1hcDo6
aXRlcmF0b3IgaXQgPSBtX3RpbGVzLmJlZ2luKCksIGVuZCA9IG1fdGlsZXMuZW5kKCk7IGl0ICE9
IGVuZDsgKytpdCkgeworICAgICAgICBjb25zdCBUaWxlSW5mbyYgdGlsZUluZm8gPSBpdC0+dmFs
dWU7CisgICAgICAgIGlmICh0aWxlSW5mby5jb2hvcnQgPT0gVmlzaWJsZVRpbGVDb2hvcnQpCisg
ICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBxdWV1ZVRpbGVGb3JSZW1vdmFsKGl0LT5r
ZXksIGl0LT52YWx1ZSwgdGlsZXNUb1JlbW92ZSwgbV90aWxlUmVwYWludENvdW50cyk7CisgICAg
fQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0aWxlc1RvUmVtb3ZlLnNpemUoKTsgKytp
KSB7CisgICAgICAgIFRpbGVJbmZvIHRpbGVJbmZvID0gbV90aWxlcy50YWtlKHRpbGVzVG9SZW1v
dmVbaV0pOworI2lmICFQTEFURk9STShJT1MpCisgICAgICAgIExheWVyUG9vbDo6c2hhcmVkUG9v
bCgpLT5hZGRMYXllcih0aWxlSW5mby5sYXllcik7CisjZW5kaWYKKyAgICB9Cit9CisKK3ZvaWQg
VGlsZUNvbnRyb2xsZXI6OnJlbW92ZVRpbGVzSW5Db2hvcnQoVGlsZUNvaG9ydCBjb2hvcnQpCit7
CisgICAgQVNTRVJUKGNvaG9ydCAhPSBWaXNpYmxlVGlsZUNvaG9ydCk7CisgICAgVmVjdG9yPFRp
bGVJbmRleD4gdGlsZXNUb1JlbW92ZTsKKworICAgIGZvciAoVGlsZU1hcDo6aXRlcmF0b3IgaXQg
PSBtX3RpbGVzLmJlZ2luKCksIGVuZCA9IG1fdGlsZXMuZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkg
eworICAgICAgICBjb25zdCBUaWxlSW5mbyYgdGlsZUluZm8gPSBpdC0+dmFsdWU7CisgICAgICAg
IGlmICh0aWxlSW5mby5jb2hvcnQgIT0gY29ob3J0KQorICAgICAgICAgICAgY29udGludWU7CisK
KyAgICAgICAgcXVldWVUaWxlRm9yUmVtb3ZhbChpdC0+a2V5LCBpdC0+dmFsdWUsIHRpbGVzVG9S
ZW1vdmUsIG1fdGlsZVJlcGFpbnRDb3VudHMpOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkg
PSAwOyBpIDwgdGlsZXNUb1JlbW92ZS5zaXplKCk7ICsraSkgeworICAgICAgICBUaWxlSW5mbyB0
aWxlSW5mbyA9IG1fdGlsZXMudGFrZSh0aWxlc1RvUmVtb3ZlW2ldKTsKKyNpZiAhUExBVEZPUk0o
SU9TKQorICAgICAgICBMYXllclBvb2w6OnNoYXJlZFBvb2woKS0+YWRkTGF5ZXIodGlsZUluZm8u
bGF5ZXIpOworI2VuZGlmCisgICAgfQorfQorCit2b2lkIFRpbGVDb250cm9sbGVyOjpzZXROZWVk
c1JldmFsaWRhdGVUaWxlcygpCit7CisgICAgb3duaW5nR3JhcGhpY3NMYXllcigpLT5wbGF0Zm9y
bUNBTGF5ZXJTZXROZWVkc1RvUmV2YWxpZGF0ZVRpbGVzKCk7Cit9CisKK3ZvaWQgVGlsZUNvbnRy
b2xsZXI6OnJldmFsaWRhdGVUaWxlcyhUaWxlVmFsaWRhdGlvblBvbGljeUZsYWdzIGZvcmVncm91
bmRWYWxpZGF0aW9uUG9saWN5LCBUaWxlVmFsaWRhdGlvblBvbGljeUZsYWdzIGJhY2tncm91bmRW
YWxpZGF0aW9uUG9saWN5KQoreworICAgIEZsb2F0UmVjdCB2aXNpYmxlUmVjdCA9IG1fdmlzaWJs
ZVJlY3Q7CisgICAgSW50UmVjdCBib3VuZHMgPSB0aGlzLT5ib3VuZHMoKTsKKworICAgIHZpc2li
bGVSZWN0LmludGVyc2VjdChzY2FsZWRFeHBvc2VkUmVjdCgpKTsKKworICAgIGlmICh2aXNpYmxl
UmVjdC5pc0VtcHR5KCkgfHwgYm91bmRzLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworICAg
IAorICAgIFRpbGVWYWxpZGF0aW9uUG9saWN5RmxhZ3MgdmFsaWRhdGlvblBvbGljeSA9IG1faXNJ
bldpbmRvdyA/IGZvcmVncm91bmRWYWxpZGF0aW9uUG9saWN5IDogYmFja2dyb3VuZFZhbGlkYXRp
b25Qb2xpY3k7CisgICAgCisgICAgRmxvYXRSZWN0IHRpbGVDb3ZlcmFnZVJlY3QgPSBjb21wdXRl
VGlsZUNvdmVyYWdlUmVjdChtX3Zpc2libGVSZWN0QXRMYXN0UmV2YWxpZGF0ZSwgbV92aXNpYmxl
UmVjdCk7CisgICAgRmxvYXRSZWN0IHNjYWxlZFJlY3QodGlsZUNvdmVyYWdlUmVjdCk7CisgICAg
c2NhbGVkUmVjdC5zY2FsZShtX3NjYWxlKTsKKyAgICBJbnRSZWN0IGNvdmVyYWdlUmVjdEluVGls
ZUNvb3JkcyhlbmNsb3NpbmdJbnRSZWN0KHNjYWxlZFJlY3QpKTsKKworICAgIFRpbGVDb2hvcnQg
Y3VyckNvaG9ydCA9IG5leHRUaWxlQ29ob3J0KCk7CisgICAgdW5zaWduZWQgdGlsZXNJbkNvaG9y
dCA9IDA7CisKKyAgICAvLyBNb3ZlIHRpbGVzIG5ld2x5IG91dHNpZGUgdGhlIGNvdmVyYWdlIHJl
Y3QgaW50byB0aGUgY29ob3J0IG1hcC4KKyAgICBmb3IgKFRpbGVNYXA6Oml0ZXJhdG9yIGl0ID0g
bV90aWxlcy5iZWdpbigpLCBlbmQgPSBtX3RpbGVzLmVuZCgpOyBpdCAhPSBlbmQ7ICsraXQpIHsK
KyAgICAgICAgVGlsZUluZm8mIHRpbGVJbmZvID0gaXQtPnZhbHVlOworICAgICAgICBUaWxlSW5k
ZXggdGlsZUluZGV4ID0gaXQtPmtleTsKKworICAgICAgICBQbGF0Zm9ybUNBTGF5ZXIqIHRpbGVM
YXllciA9IHRpbGVJbmZvLmxheWVyLmdldCgpOworICAgICAgICBJbnRSZWN0IHRpbGVSZWN0ID0g
cmVjdEZvclRpbGVJbmRleCh0aWxlSW5kZXgpOworICAgICAgICBpZiAodGlsZVJlY3QuaW50ZXJz
ZWN0cyhjb3ZlcmFnZVJlY3RJblRpbGVDb29yZHMpKSB7CisgICAgICAgICAgICB0aWxlSW5mby5j
b2hvcnQgPSBWaXNpYmxlVGlsZUNvaG9ydDsKKyAgICAgICAgICAgIGlmICh0aWxlSW5mby5oYXNT
dGFsZUNvbnRlbnQpIHsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRTogc3RvcmUgYSBkaXJ0eSBy
ZWdpb24gcGVyIGxheWVyPworICAgICAgICAgICAgICAgIHRpbGVMYXllci0+c2V0TmVlZHNEaXNw
bGF5KCk7CisgICAgICAgICAgICAgICAgdGlsZUluZm8uaGFzU3RhbGVDb250ZW50ID0gZmFsc2U7
CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBBZGQgdG8g
dGhlIGN1cnJlbnRDb2hvcnQgaWYgbm90IGFscmVhZHkgaW4gb25lLgorICAgICAgICAgICAgaWYg
KHRpbGVJbmZvLmNvaG9ydCA9PSBWaXNpYmxlVGlsZUNvaG9ydCkgeworICAgICAgICAgICAgICAg
IHRpbGVJbmZvLmNvaG9ydCA9IGN1cnJDb2hvcnQ7CisgICAgICAgICAgICAgICAgKyt0aWxlc0lu
Q29ob3J0OworCisgICAgICAgICAgICAgICAgaWYgKG1fdW5wYXJlbnRzT2Zmc2NyZWVuVGlsZXMp
CisgICAgICAgICAgICAgICAgICAgIHRpbGVMYXllci0+cmVtb3ZlRnJvbVN1cGVybGF5ZXIoKTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0aWxlc0luQ29ob3J0
KQorICAgICAgICBzdGFydGVkTmV3Q29ob3J0KGN1cnJDb2hvcnQpOworCisgICAgaWYgKCFvd25p
bmdHcmFwaGljc0xheWVyKCktPnBsYXRmb3JtQ0FMYXllclNob3VsZEFnZ3Jlc3NpdmVseVJldGFp
blRpbGVzKG1fdGlsZUNhY2hlTGF5ZXIpKSB7CisgICAgICAgIGlmIChvd25pbmdHcmFwaGljc0xh
eWVyKCktPnBsYXRmb3JtQ0FMYXllclNob3VsZFRlbXBvcmFyaWx5UmV0YWluVGlsZUNvaG9ydHMo
bV90aWxlQ2FjaGVMYXllcikpCisgICAgICAgICAgICBzY2hlZHVsZUNvaG9ydFJlbW92YWwoKTsK
KyAgICAgICAgZWxzZSBpZiAodGlsZXNJbkNvaG9ydCkKKyAgICAgICAgICAgIHJlbW92ZVRpbGVz
SW5Db2hvcnQoY3VyckNvaG9ydCk7CisgICAgfQorCisgICAgLy8gRW5zdXJlIHByaW1hcnkgdGls
ZSBjb3ZlcmFnZSB0aWxlcy4KKyAgICBtX3ByaW1hcnlUaWxlQ292ZXJhZ2VSZWN0ID0gZW5zdXJl
VGlsZXNGb3JSZWN0KHRpbGVDb3ZlcmFnZVJlY3QsIENvdmVyYWdlVHlwZTo6UHJpbWFyeVRpbGVz
KTsKKworICAgIGlmICh2YWxpZGF0aW9uUG9saWN5ICYgUHJ1bmVTZWNvbmRhcnlUaWxlcykgewor
ICAgICAgICByZW1vdmVBbGxTZWNvbmRhcnlUaWxlcygpOworICAgICAgICBtX2NvaG9ydExpc3Qu
Y2xlYXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1f
c2Vjb25kYXJ5VGlsZUNvdmVyYWdlUmVjdHMuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICBlbnN1
cmVUaWxlc0ZvclJlY3QobV9zZWNvbmRhcnlUaWxlQ292ZXJhZ2VSZWN0c1tpXSwgQ292ZXJhZ2VU
eXBlOjpTZWNvbmRhcnlUaWxlcyk7CisgICAgICAgIG1fc2Vjb25kYXJ5VGlsZUNvdmVyYWdlUmVj
dHMuY2xlYXIoKTsKKyAgICB9CisKKyAgICBpZiAobV91bnBhcmVudHNPZmZzY3JlZW5UaWxlcyAm
JiAodmFsaWRhdGlvblBvbGljeSAmIFVucGFyZW50QWxsVGlsZXMpKSB7CisgICAgICAgIGZvciAo
VGlsZU1hcDo6aXRlcmF0b3IgaXQgPSBtX3RpbGVzLmJlZ2luKCksIGVuZCA9IG1fdGlsZXMuZW5k
KCk7IGl0ICE9IGVuZDsgKytpdCkKKyAgICAgICAgICAgIGl0LT52YWx1ZS5sYXllci0+cmVtb3Zl
RnJvbVN1cGVybGF5ZXIoKTsKKyAgICB9CisKKyAgICBpZiAobV9ib3VuZHNBdExhc3RSZXZhbGlk
YXRlICE9IGJvdW5kcykgeworICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbWFyZ2luIHRpbGVzIGFu
ZCB0aGUgYm91bmRzIGhhdmUgZ3Jvd24gdGFsbGVyIG9yIHdpZGVyLCB0aGVuIHRoZSB0aWxlcyB0
aGF0IHVzZWQgdG8KKyAgICAgICAgLy8gYmUgYm90dG9tIG9yIHJpZ2h0IG1hcmdpbiB0aWxlcyBu
ZWVkIHRvIGJlIGludmFsaWRhdGVkLgorICAgICAgICBpZiAoaGFzTWFyZ2lucygpKSB7CisgICAg
ICAgICAgICBpZiAoYm91bmRzLndpZHRoKCkgPiBtX2JvdW5kc0F0TGFzdFJldmFsaWRhdGUud2lk
dGgoKSB8fCBib3VuZHMuaGVpZ2h0KCkgPiBtX2JvdW5kc0F0TGFzdFJldmFsaWRhdGUuaGVpZ2h0
KCkpIHsKKyAgICAgICAgICAgICAgICBJbnRSZWN0IGJvdW5kc1dpdGhvdXRNYXJnaW4gPSB0aGlz
LT5ib3VuZHNXaXRob3V0TWFyZ2luKCk7CisgICAgICAgICAgICAgICAgSW50UmVjdCBvbGRCb3Vu
ZHNXaXRob3V0TWFyZ2luID0gYm91bmRzQXRMYXN0UmV2YWxpZGF0ZVdpdGhvdXRNYXJnaW4oKTsK
KworICAgICAgICAgICAgICAgIGlmIChib3VuZHMuaGVpZ2h0KCkgPiBtX2JvdW5kc0F0TGFzdFJl
dmFsaWRhdGUuaGVpZ2h0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgSW50UmVjdCBmb3JtZXJC
b3R0b21NYXJnaW5SZWN0ID0gSW50UmVjdChvbGRCb3VuZHNXaXRob3V0TWFyZ2luLngoKSwgb2xk
Qm91bmRzV2l0aG91dE1hcmdpbi5oZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9s
ZEJvdW5kc1dpdGhvdXRNYXJnaW4ud2lkdGgoKSwgYm91bmRzV2l0aG91dE1hcmdpbi5oZWlnaHQo
KSAtIG9sZEJvdW5kc1dpdGhvdXRNYXJnaW4uaGVpZ2h0KCkpOworICAgICAgICAgICAgICAgICAg
ICBzZXROZWVkc0Rpc3BsYXlJblJlY3QoZm9ybWVyQm90dG9tTWFyZ2luUmVjdCk7CisgICAgICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGJvdW5kcy53aWR0aCgpID4gbV9ib3Vu
ZHNBdExhc3RSZXZhbGlkYXRlLndpZHRoKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgSW50UmVj
dCBmb3JtZXJSaWdodE1hcmdpblJlY3QgPSBJbnRSZWN0KG9sZEJvdW5kc1dpdGhvdXRNYXJnaW4u
d2lkdGgoKSwgb2xkQm91bmRzV2l0aG91dE1hcmdpbi55KCksCisgICAgICAgICAgICAgICAgICAg
ICAgICBib3VuZHNXaXRob3V0TWFyZ2luLndpZHRoKCkgLSBvbGRCb3VuZHNXaXRob3V0TWFyZ2lu
LndpZHRoKCksIG9sZEJvdW5kc1dpdGhvdXRNYXJnaW4uaGVpZ2h0KCkpOworICAgICAgICAgICAg
ICAgICAgICBzZXROZWVkc0Rpc3BsYXlJblJlY3QoZm9ybWVyUmlnaHRNYXJnaW5SZWN0KTsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBGbG9h
dFJlY3Qgc2NhbGVkQm91bmRzKGJvdW5kcyk7CisgICAgICAgIHNjYWxlZEJvdW5kcy5zY2FsZSht
X3NjYWxlKTsKKyAgICAgICAgSW50UmVjdCBib3VuZHNJblRpbGVDb29yZHMoZW5jbG9zaW5nSW50
UmVjdChzY2FsZWRCb3VuZHMpKTsKKworICAgICAgICBUaWxlSW5kZXggdG9wTGVmdEZvckJvdW5k
czsKKyAgICAgICAgVGlsZUluZGV4IGJvdHRvbVJpZ2h0Rm9yQm91bmRzOworICAgICAgICBnZXRU
aWxlSW5kZXhSYW5nZUZvclJlY3QoYm91bmRzSW5UaWxlQ29vcmRzLCB0b3BMZWZ0Rm9yQm91bmRz
LCBib3R0b21SaWdodEZvckJvdW5kcyk7CisKKyAgICAgICAgVmVjdG9yPFRpbGVJbmRleD4gdGls
ZXNUb1JlbW92ZTsKKyAgICAgICAgZm9yIChUaWxlTWFwOjppdGVyYXRvciBpdCA9IG1fdGlsZXMu
YmVnaW4oKSwgZW5kID0gbV90aWxlcy5lbmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAg
ICAgICBjb25zdCBUaWxlSW5kZXgmIGluZGV4ID0gaXQtPmtleTsKKyAgICAgICAgICAgIGlmIChp
bmRleC55KCkgPCB0b3BMZWZ0Rm9yQm91bmRzLnkoKQorICAgICAgICAgICAgICAgIHx8IGluZGV4
LnkoKSA+IGJvdHRvbVJpZ2h0Rm9yQm91bmRzLnkoKQorICAgICAgICAgICAgICAgIHx8IGluZGV4
LngoKSA8IHRvcExlZnRGb3JCb3VuZHMueCgpCisgICAgICAgICAgICAgICAgfHwgaW5kZXgueCgp
ID4gYm90dG9tUmlnaHRGb3JCb3VuZHMueCgpKQorICAgICAgICAgICAgICAgIHF1ZXVlVGlsZUZv
clJlbW92YWwoaW5kZXgsIGl0LT52YWx1ZSwgdGlsZXNUb1JlbW92ZSwgbV90aWxlUmVwYWludENv
dW50cyk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMCwgc2l6ZSA9IHRp
bGVzVG9SZW1vdmUuc2l6ZSgpOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgICAgICBUaWxlSW5m
byB0aWxlSW5mbyA9IG1fdGlsZXMudGFrZSh0aWxlc1RvUmVtb3ZlW2ldKTsKKyNpZiAhUExBVEZP
Uk0oSU9TKQorICAgICAgICAgICAgTGF5ZXJQb29sOjpzaGFyZWRQb29sKCktPmFkZExheWVyKHRp
bGVJbmZvLmxheWVyKTsKKyNlbmRpZgorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1fdGls
ZWRTY3JvbGxpbmdJbmRpY2F0b3JMYXllcikKKyAgICAgICAgdXBkYXRlVGlsZUNvdmVyYWdlTWFw
KCk7CisKKyAgICBtX3Zpc2libGVSZWN0QXRMYXN0UmV2YWxpZGF0ZSA9IHZpc2libGVSZWN0Owor
ICAgIG1fYm91bmRzQXRMYXN0UmV2YWxpZGF0ZSA9IGJvdW5kczsKK30KKworVGlsZUNvbnRyb2xs
ZXI6OlRpbGVDb2hvcnQgVGlsZUNvbnRyb2xsZXI6Om5leHRUaWxlQ29ob3J0KCkgY29uc3QKK3sK
KyAgICBpZiAoIW1fY29ob3J0TGlzdC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBtX2NvaG9y
dExpc3QubGFzdCgpLmNvaG9ydCArIDE7CisKKyAgICByZXR1cm4gMTsKK30KKwordm9pZCBUaWxl
Q29udHJvbGxlcjo6c3RhcnRlZE5ld0NvaG9ydChUaWxlQ29ob3J0IGNvaG9ydCkKK3sKKyAgICBt
X2NvaG9ydExpc3QuYXBwZW5kKFRpbGVDb2hvcnRJbmZvKGNvaG9ydCwgbW9ub3RvbmljYWxseUlu
Y3JlYXNpbmdUaW1lKCkpKTsKKyNpZiBQTEFURk9STShJT1MpCisgICAgaWYgKCFtX2lzSW5XaW5k
b3cpCisgICAgICAgIHRpbGVDb250cm9sbGVyTWVtb3J5SGFuZGxlcigpLnRpbGVDb250cm9sbGVy
R2FpbmVkVW5wYXJlbnRlZFRpbGVzKHRoaXMpOworI2VuZGlmCit9CisKK1RpbGVDb250cm9sbGVy
OjpUaWxlQ29ob3J0IFRpbGVDb250cm9sbGVyOjpuZXdlc3RUaWxlQ29ob3J0KCkgY29uc3QKK3sK
KyAgICByZXR1cm4gbV9jb2hvcnRMaXN0LmlzRW1wdHkoKSA/IDAgOiBtX2NvaG9ydExpc3QubGFz
dCgpLmNvaG9ydDsKK30KKworVGlsZUNvbnRyb2xsZXI6OlRpbGVDb2hvcnQgVGlsZUNvbnRyb2xs
ZXI6Om9sZGVzdFRpbGVDb2hvcnQoKSBjb25zdAoreworICAgIHJldHVybiBtX2NvaG9ydExpc3Qu
aXNFbXB0eSgpID8gMCA6IG1fY29ob3J0TGlzdC5maXJzdCgpLmNvaG9ydDsKK30KKwordm9pZCBU
aWxlQ29udHJvbGxlcjo6c2NoZWR1bGVDb2hvcnRSZW1vdmFsKCkKK3sKKyAgICBjb25zdCBkb3Vi
bGUgY29ob3J0UmVtb3ZhbFRpbWVyU2Vjb25kcyA9IDE7CisKKyAgICAvLyBTdGFydCB0aGUgdGlt
ZXIsIG9yIHJlc2NoZWR1bGUgdGhlIHRpbWVyIGZyb20gbm93IGlmIGl0J3MgYWxyZWFkeSBhY3Rp
dmUuCisgICAgaWYgKCFtX2NvaG9ydFJlbW92YWxUaW1lci5pc0FjdGl2ZSgpKQorICAgICAgICBt
X2NvaG9ydFJlbW92YWxUaW1lci5zdGFydFJlcGVhdGluZyhjb2hvcnRSZW1vdmFsVGltZXJTZWNv
bmRzKTsKK30KKwordm9pZCBUaWxlQ29udHJvbGxlcjo6Y29ob3J0UmVtb3ZhbFRpbWVyRmlyZWQo
VGltZXI8VGlsZUNvbnRyb2xsZXI+KikKK3sKKyAgICBpZiAobV9jb2hvcnRMaXN0LmlzRW1wdHko
KSkgeworICAgICAgICBtX2NvaG9ydFJlbW92YWxUaW1lci5zdG9wKCk7CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICBkb3VibGUgY29ob3J0TGlmZVRpbWVTZWNvbmRzID0gMjsKKyAgICBk
b3VibGUgdGltZVRocmVzaG9sZCA9IG1vbm90b25pY2FsbHlJbmNyZWFzaW5nVGltZSgpIC0gY29o
b3J0TGlmZVRpbWVTZWNvbmRzOworCisgICAgd2hpbGUgKCFtX2NvaG9ydExpc3QuaXNFbXB0eSgp
ICYmIG1fY29ob3J0TGlzdC5maXJzdCgpLmNyZWF0aW9uVGltZSA8IHRpbWVUaHJlc2hvbGQpIHsK
KyAgICAgICAgVGlsZUNvaG9ydEluZm8gZmlyc3RDb2hvcnQgPSBtX2NvaG9ydExpc3QudGFrZUZp
cnN0KCk7CisgICAgICAgIHJlbW92ZVRpbGVzSW5Db2hvcnQoZmlyc3RDb2hvcnQuY29ob3J0KTsK
KyAgICB9CisKKyAgICBpZiAobV90aWxlZFNjcm9sbGluZ0luZGljYXRvckxheWVyKQorICAgICAg
ICB1cGRhdGVUaWxlQ292ZXJhZ2VNYXAoKTsKK30KKworSW50UmVjdCBUaWxlQ29udHJvbGxlcjo6
ZW5zdXJlVGlsZXNGb3JSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwgQ292ZXJhZ2VUeXBlIG5l
d1RpbGVUeXBlKQoreworICAgIGlmIChtX3VucGFyZW50c09mZnNjcmVlblRpbGVzICYmICFtX2lz
SW5XaW5kb3cpCisgICAgICAgIHJldHVybiBJbnRSZWN0KCk7CisKKyAgICBGbG9hdFJlY3Qgc2Nh
bGVkUmVjdChyZWN0KTsKKyAgICBzY2FsZWRSZWN0LnNjYWxlKG1fc2NhbGUpOworICAgIEludFJl
Y3QgcmVjdEluVGlsZUNvb3JkcyhlbmNsb3NpbmdJbnRSZWN0KHNjYWxlZFJlY3QpKTsKKworICAg
IFRpbGVJbmRleCB0b3BMZWZ0OworICAgIFRpbGVJbmRleCBib3R0b21SaWdodDsKKyAgICBnZXRU
aWxlSW5kZXhSYW5nZUZvclJlY3QocmVjdEluVGlsZUNvb3JkcywgdG9wTGVmdCwgYm90dG9tUmln
aHQpOworCisgICAgVGlsZUNvaG9ydCBjdXJyQ29ob3J0ID0gbmV4dFRpbGVDb2hvcnQoKTsKKyAg
ICB1bnNpZ25lZCB0aWxlc0luQ29ob3J0ID0gMDsKKworICAgIEludFJlY3QgY292ZXJhZ2VSZWN0
OworCisgICAgZm9yIChpbnQgeSA9IHRvcExlZnQueSgpOyB5IDw9IGJvdHRvbVJpZ2h0LnkoKTsg
Kyt5KSB7CisgICAgICAgIGZvciAoaW50IHggPSB0b3BMZWZ0LngoKTsgeCA8PSBib3R0b21SaWdo
dC54KCk7ICsreCkgeworICAgICAgICAgICAgVGlsZUluZGV4IHRpbGVJbmRleCh4LCB5KTsKKwor
ICAgICAgICAgICAgSW50UmVjdCB0aWxlUmVjdCA9IHJlY3RGb3JUaWxlSW5kZXgodGlsZUluZGV4
KTsKKyAgICAgICAgICAgIFRpbGVJbmZvJiB0aWxlSW5mbyA9IG1fdGlsZXMuYWRkKHRpbGVJbmRl
eCwgVGlsZUluZm8oKSkuaXRlcmF0b3ItPnZhbHVlOworCisgICAgICAgICAgICBjb3ZlcmFnZVJl
Y3QudW5pdGUodGlsZVJlY3QpOworCisgICAgICAgICAgICBib29sIHNob3VsZENoYW5nZVRpbGVM
YXllckZyYW1lID0gZmFsc2U7CisKKyAgICAgICAgICAgIGlmICghdGlsZUluZm8ubGF5ZXIpCisg
ICAgICAgICAgICAgICAgdGlsZUluZm8ubGF5ZXIgPSBjcmVhdGVUaWxlTGF5ZXIodGlsZVJlY3Qp
OworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gV2UgYWxyZWFkeSBoYXZl
IGEgbGF5ZXIgZm9yIHRoaXMgdGlsZS4gRW5zdXJlIHRoYXQgaXRzIHNpemUgaXMgY29ycmVjdC4K
KyAgICAgICAgICAgICAgICBGbG9hdFNpemUgdGlsZUxheWVyU2l6ZSh0aWxlSW5mby5sYXllci0+
Ym91bmRzKCkuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBzaG91bGRDaGFuZ2VUaWxlTGF5ZXJG
cmFtZSA9IHRpbGVMYXllclNpemUgIT0gRmxvYXRTaXplKHRpbGVSZWN0LnNpemUoKSk7CisKKyAg
ICAgICAgICAgICAgICBpZiAoc2hvdWxkQ2hhbmdlVGlsZUxheWVyRnJhbWUpIHsKKyAgICAgICAg
ICAgICAgICAgICAgdGlsZUluZm8ubGF5ZXItPnNldEJvdW5kcyhGbG9hdFJlY3QoRmxvYXRQb2lu
dCgpLCB0aWxlUmVjdC5zaXplKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgdGlsZUluZm8ubGF5
ZXItPnNldFBvc2l0aW9uKHRpbGVSZWN0LmxvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgICAg
ICB0aWxlSW5mby5sYXllci0+c2V0TmVlZHNEaXNwbGF5KCk7CisgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobmV3VGlsZVR5cGUgPT0gQ292ZXJhZ2VU
eXBlOjpTZWNvbmRhcnlUaWxlcyAmJiAhdGlsZVJlY3QuaW50ZXJzZWN0cyhtX3ByaW1hcnlUaWxl
Q292ZXJhZ2VSZWN0KSkgeworICAgICAgICAgICAgICAgIHRpbGVJbmZvLmNvaG9ydCA9IGN1cnJD
b2hvcnQ7CisgICAgICAgICAgICAgICAgKyt0aWxlc0luQ29ob3J0OworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICBib29sIHNob3VsZFBhcmVudFRpbGVMYXllciA9ICghbV91bnBhcmVudHNP
ZmZzY3JlZW5UaWxlcyB8fCBtX2lzSW5XaW5kb3cpICYmICF0aWxlSW5mby5sYXllci0+c3VwZXJs
YXllcigpOworCisgICAgICAgICAgICBpZiAoc2hvdWxkUGFyZW50VGlsZUxheWVyKQorICAgICAg
ICAgICAgICAgIG1fdGlsZUNvbnRhaW5lckxheWVyLT5hcHBlbmRTdWJsYXllcih0aWxlSW5mby5s
YXllci5nZXQoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgaWYgKHRpbGVzSW5Db2hv
cnQpCisgICAgICAgIHN0YXJ0ZWROZXdDb2hvcnQoY3VyckNvaG9ydCk7CisKKyAgICByZXR1cm4g
Y292ZXJhZ2VSZWN0OworfQorCit2b2lkIFRpbGVDb250cm9sbGVyOjp1cGRhdGVUaWxlQ292ZXJh
Z2VNYXAoKQoreworICAgIEZsb2F0UmVjdCBjb250YWluZXJCb3VuZHMgPSBib3VuZHMoKTsKKyAg
ICBGbG9hdFJlY3QgdmlzaWJsZVJlY3QgPSB0aGlzLT52aXNpYmxlUmVjdCgpOworCisgICAgdmlz
aWJsZVJlY3QuaW50ZXJzZWN0KHNjYWxlZEV4cG9zZWRSZWN0KCkpOworICAgIHZpc2libGVSZWN0
LmNvbnRyYWN0KDQsIDQpOyAvLyBMYXllciBpcyBwb3NpdGlvbmVkIDJweCBmcm9tIHRvcCBhbmQg
bGVmdCBlZGdlcy4KKworICAgIGZsb2F0IHdpZHRoU2NhbGUgPSAxOworICAgIGZsb2F0IHNjYWxl
ID0gMTsKKyAgICBpZiAoIWNvbnRhaW5lckJvdW5kcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgd2lk
dGhTY2FsZSA9IHN0ZDo6bWluPGZsb2F0Pih2aXNpYmxlUmVjdC53aWR0aCgpIC8gY29udGFpbmVy
Qm91bmRzLndpZHRoKCksIDAuMSk7CisgICAgICAgIHNjYWxlID0gc3RkOjptaW4od2lkdGhTY2Fs
ZSwgdmlzaWJsZVJlY3QuaGVpZ2h0KCkgLyBjb250YWluZXJCb3VuZHMuaGVpZ2h0KCkpOworICAg
IH0KKyAgICAKKyAgICBmbG9hdCBpbmRpY2F0b3JTY2FsZSA9IHNjYWxlICogbV9zY2FsZTsKKyAg
ICBGbG9hdFJlY3QgbWFwQm91bmRzID0gY29udGFpbmVyQm91bmRzOworICAgIG1hcEJvdW5kcy5z
Y2FsZShpbmRpY2F0b3JTY2FsZSwgaW5kaWNhdG9yU2NhbGUpOworCisgICAgaWYgKCFtX2V4cG9z
ZWRSZWN0LmlzSW5maW5pdGUoKSkKKyAgICAgICAgbV90aWxlZFNjcm9sbGluZ0luZGljYXRvckxh
eWVyLT5zZXRQb3NpdGlvbihtX2V4cG9zZWRSZWN0LmxvY2F0aW9uKCkgKyBGbG9hdFBvaW50KDIs
IDIpKTsKKyAgICBlbHNlCisgICAgICAgIG1fdGlsZWRTY3JvbGxpbmdJbmRpY2F0b3JMYXllci0+
c2V0UG9zaXRpb24oRmxvYXRQb2ludCgyLCAyKSk7CisKKyAgICBtX3RpbGVkU2Nyb2xsaW5nSW5k
aWNhdG9yTGF5ZXItPnNldEJvdW5kcyhtYXBCb3VuZHMpOworICAgIG1fdGlsZWRTY3JvbGxpbmdJ
bmRpY2F0b3JMYXllci0+c2V0TmVlZHNEaXNwbGF5KCk7CisKKyAgICB2aXNpYmxlUmVjdC5zY2Fs
ZShpbmRpY2F0b3JTY2FsZSwgaW5kaWNhdG9yU2NhbGUpOworICAgIHZpc2libGVSZWN0LmV4cGFu
ZCgyLCAyKTsKKyAgICBtX3Zpc2libGVSZWN0SW5kaWNhdG9yTGF5ZXItPnNldFBvc2l0aW9uKHZp
c2libGVSZWN0LmxvY2F0aW9uKCkpOworICAgIG1fdmlzaWJsZVJlY3RJbmRpY2F0b3JMYXllci0+
c2V0Qm91bmRzKEZsb2F0UmVjdChGbG9hdFBvaW50KCksIHZpc2libGVSZWN0LnNpemUoKSkpOwor
CisgICAgQ29sb3IgdmlzaWJsZVJlY3RJbmRpY2F0b3JDb2xvcjsKKyAgICBzd2l0Y2ggKG1faW5k
aWNhdG9yTW9kZSkgeworICAgIGNhc2UgU3luY2hyb25vdXNTY3JvbGxpbmdCZWNhdXNlT2ZTdHls
ZUluZGljYXRpb246CisgICAgICAgIHZpc2libGVSZWN0SW5kaWNhdG9yQ29sb3IgPSBDb2xvcigy
NTUsIDAsIDApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFN5bmNocm9ub3VzU2Nyb2xsaW5n
QmVjYXVzZU9mRXZlbnRIYW5kbGVyc0luZGljYXRpb246CisgICAgICAgIHZpc2libGVSZWN0SW5k
aWNhdG9yQ29sb3IgPSBDb2xvcigyNTUsIDI1NSwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGNh
c2UgQXN5bmNTY3JvbGxpbmdJbmRpY2F0aW9uOgorICAgICAgICB2aXNpYmxlUmVjdEluZGljYXRv
ckNvbG9yID0gQ29sb3IoMCwgMjAwLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAg
bV92aXNpYmxlUmVjdEluZGljYXRvckxheWVyLT5zZXRCb3JkZXJDb2xvcih2aXNpYmxlUmVjdElu
ZGljYXRvckNvbG9yKTsKK30KKworSW50UmVjdCBUaWxlQ29udHJvbGxlcjo6dGlsZUdyaWRFeHRl
bnQoKSBjb25zdAoreworICAgIFRpbGVJbmRleCB0b3BMZWZ0OworICAgIFRpbGVJbmRleCBib3R0
b21SaWdodDsKKyAgICBnZXRUaWxlSW5kZXhSYW5nZUZvclJlY3QobV9wcmltYXJ5VGlsZUNvdmVy
YWdlUmVjdCwgdG9wTGVmdCwgYm90dG9tUmlnaHQpOworCisgICAgLy8gUmV0dXJuIGluZGV4IG9m
IHRvcCwgbGVmdCB0aWxlIGFuZCB0aGUgbnVtYmVyIG9mIHRpbGVzIGFjcm9zcyBhbmQgZG93bi4K
KyAgICByZXR1cm4gSW50UmVjdCh0b3BMZWZ0LngoKSwgdG9wTGVmdC55KCksIGJvdHRvbVJpZ2h0
LngoKSAtIHRvcExlZnQueCgpICsgMSwgYm90dG9tUmlnaHQueSgpIC0gdG9wTGVmdC55KCkgKyAx
KTsKK30KKworZG91YmxlIFRpbGVDb250cm9sbGVyOjpyZXRhaW5lZFRpbGVCYWNraW5nU3RvcmVN
ZW1vcnkoKSBjb25zdAoreworICAgIGRvdWJsZSB0b3RhbEJ5dGVzID0gMDsKKyAgICAKKyAgICBm
b3IgKFRpbGVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV90aWxlcy5iZWdpbigpLCBlbmQgPSBt
X3RpbGVzLmVuZCgpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgY29uc3QgVGlsZUluZm8m
IHRpbGVJbmZvID0gaXQtPnZhbHVlOworICAgICAgICBpZiAodGlsZUluZm8ubGF5ZXItPnN1cGVy
bGF5ZXIoKSkgeworICAgICAgICAgICAgRmxvYXRSZWN0IGJvdW5kcyA9IHRpbGVJbmZvLmxheWVy
LT5ib3VuZHMoKTsKKyAgICAgICAgICAgIGRvdWJsZSBjb250ZW50c1NjYWxlID0gdGlsZUluZm8u
bGF5ZXItPmNvbnRlbnRzU2NhbGUoKTsKKyAgICAgICAgICAgIHRvdGFsQnl0ZXMgKz0gNCAqIGJv
dW5kcy53aWR0aCgpICogY29udGVudHNTY2FsZSAqIGJvdW5kcy5oZWlnaHQoKSAqIGNvbnRlbnRz
U2NhbGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdG90YWxCeXRlczsKK30KKwor
Ly8gUmV0dXJuIHRoZSByZWN0IGluIGxheWVyIGNvb3Jkcywgbm90IHRpbGUgY29vcmRzLgorSW50
UmVjdCBUaWxlQ29udHJvbGxlcjo6dGlsZUNvdmVyYWdlUmVjdCgpIGNvbnN0Cit7CisgICAgSW50
UmVjdCBjb3ZlcmFnZVJlY3RJbkxheWVyQ29vcmRzKG1fcHJpbWFyeVRpbGVDb3ZlcmFnZVJlY3Qp
OworICAgIGNvdmVyYWdlUmVjdEluTGF5ZXJDb29yZHMuc2NhbGUoMSAvIG1fc2NhbGUpOworICAg
IHJldHVybiBjb3ZlcmFnZVJlY3RJbkxheWVyQ29vcmRzOworfQorCitQbGF0Zm9ybUNBTGF5ZXIq
IFRpbGVDb250cm9sbGVyOjp0aWxlZFNjcm9sbGluZ0luZGljYXRvckxheWVyKCkKK3sKKyAgICBp
ZiAoIW1fdGlsZWRTY3JvbGxpbmdJbmRpY2F0b3JMYXllcikgeworICAgICAgICBtX3RpbGVkU2Ny
b2xsaW5nSW5kaWNhdG9yTGF5ZXIgPSBtX3RpbGVDYWNoZUxheWVyLT5jcmVhdGVDb21wYXRpYmxl
TGF5ZXIoUGxhdGZvcm1DQUxheWVyOjpMYXllclR5cGVTaW1wbGVMYXllciwgdGhpcyk7CisgICAg
ICAgIG1fdGlsZWRTY3JvbGxpbmdJbmRpY2F0b3JMYXllci0+c2V0T3BhY2l0eSgwLjc1KTsKKyAg
ICAgICAgbV90aWxlZFNjcm9sbGluZ0luZGljYXRvckxheWVyLT5zZXRBbmNob3JQb2ludChGbG9h
dFBvaW50M0QoKSk7CisgICAgICAgIG1fdGlsZWRTY3JvbGxpbmdJbmRpY2F0b3JMYXllci0+c2V0
Qm9yZGVyQ29sb3IoQ29sb3I6OmJsYWNrKTsKKyAgICAgICAgbV90aWxlZFNjcm9sbGluZ0luZGlj
YXRvckxheWVyLT5zZXRCb3JkZXJXaWR0aCgxKTsKKyAgICAgICAgbV90aWxlZFNjcm9sbGluZ0lu
ZGljYXRvckxheWVyLT5zZXRQb3NpdGlvbihGbG9hdFBvaW50KDIsIDIpKTsKKworICAgICAgICBt
X3Zpc2libGVSZWN0SW5kaWNhdG9yTGF5ZXIgPSBtX3RpbGVDYWNoZUxheWVyLT5jcmVhdGVDb21w
YXRpYmxlTGF5ZXIoUGxhdGZvcm1DQUxheWVyOjpMYXllclR5cGVMYXllciwgbnVsbHB0cik7Cisg
ICAgICAgIG1fdmlzaWJsZVJlY3RJbmRpY2F0b3JMYXllci0+c2V0Qm9yZGVyV2lkdGgoMik7Cisg
ICAgICAgIG1fdmlzaWJsZVJlY3RJbmRpY2F0b3JMYXllci0+c2V0QW5jaG9yUG9pbnQoRmxvYXRQ
b2ludDNEKCkpOworICAgICAgICBtX3Zpc2libGVSZWN0SW5kaWNhdG9yTGF5ZXItPnNldEJvcmRl
ckNvbG9yKENvbG9yKDI1NSwgMCwgMCkpOworCisgICAgICAgIG1fdGlsZWRTY3JvbGxpbmdJbmRp
Y2F0b3JMYXllci0+YXBwZW5kU3VibGF5ZXIobV92aXNpYmxlUmVjdEluZGljYXRvckxheWVyLmdl
dCgpKTsKKworICAgICAgICB1cGRhdGVUaWxlQ292ZXJhZ2VNYXAoKTsKKyAgICB9CisKKyAgICBy
ZXR1cm4gbV90aWxlZFNjcm9sbGluZ0luZGljYXRvckxheWVyLmdldCgpOworfQorCit2b2lkIFRp
bGVDb250cm9sbGVyOjpzZXRTY3JvbGxpbmdNb2RlSW5kaWNhdGlvbihTY3JvbGxpbmdNb2RlSW5k
aWNhdGlvbiBzY3JvbGxpbmdNb2RlKQoreworICAgIGlmIChzY3JvbGxpbmdNb2RlID09IG1faW5k
aWNhdG9yTW9kZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9pbmRpY2F0b3JNb2RlID0gc2Ny
b2xsaW5nTW9kZTsKKworICAgIGlmIChtX3RpbGVkU2Nyb2xsaW5nSW5kaWNhdG9yTGF5ZXIpCisg
ICAgICAgIHVwZGF0ZVRpbGVDb3ZlcmFnZU1hcCgpOworfQorCit2b2lkIFRpbGVDb250cm9sbGVy
OjpzZXRUaWxlTWFyZ2lucyhpbnQgbWFyZ2luVG9wLCBpbnQgbWFyZ2luQm90dG9tLCBpbnQgbWFy
Z2luTGVmdCwgaW50IG1hcmdpblJpZ2h0KQoreworICAgIG1fbWFyZ2luVG9wID0gbWFyZ2luVG9w
OworICAgIG1fbWFyZ2luQm90dG9tID0gbWFyZ2luQm90dG9tOworICAgIG1fbWFyZ2luTGVmdCA9
IG1hcmdpbkxlZnQ7CisgICAgbV9tYXJnaW5SaWdodCA9IG1hcmdpblJpZ2h0OworCisgICAgc2V0
TmVlZHNSZXZhbGlkYXRlVGlsZXMoKTsKK30KKworYm9vbCBUaWxlQ29udHJvbGxlcjo6aGFzTWFy
Z2lucygpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fbWFyZ2luVG9wIHx8IG1fbWFyZ2luQm90dG9t
IHx8IG1fbWFyZ2luTGVmdCB8fCBtX21hcmdpblJpZ2h0OworfQorCitpbnQgVGlsZUNvbnRyb2xs
ZXI6OnRvcE1hcmdpbkhlaWdodCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fbWFyZ2luVG9wOwor
fQorCitpbnQgVGlsZUNvbnRyb2xsZXI6OmJvdHRvbU1hcmdpbkhlaWdodCgpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIG1fbWFyZ2luQm90dG9tOworfQorCitpbnQgVGlsZUNvbnRyb2xsZXI6OmxlZnRN
YXJnaW5XaWR0aCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fbWFyZ2luTGVmdDsKK30KKworaW50
IFRpbGVDb250cm9sbGVyOjpyaWdodE1hcmdpbldpZHRoKCkgY29uc3QKK3sKKyAgICByZXR1cm4g
bV9tYXJnaW5SaWdodDsKK30KKworUmVmUHRyPFBsYXRmb3JtQ0FMYXllcj4gVGlsZUNvbnRyb2xs
ZXI6OmNyZWF0ZVRpbGVMYXllcihjb25zdCBJbnRSZWN0JiB0aWxlUmVjdCkKK3sKKyNpZiBQTEFU
Rk9STShJT1MpCisgICAgUmVmUHRyPFBsYXRmb3JtQ0FMYXllcj4gbGF5ZXI7CisjZWxzZQorICAg
IFJlZlB0cjxQbGF0Zm9ybUNBTGF5ZXI+IGxheWVyID0gTGF5ZXJQb29sOjpzaGFyZWRQb29sKCkt
PnRha2VMYXllcldpdGhTaXplKHRpbGVSZWN0LnNpemUoKSk7CisjZW5kaWYKKworICAgIGlmIChs
YXllcikgeworICAgICAgICBtX3RpbGVSZXBhaW50Q291bnRzLnJlbW92ZShsYXllci5nZXQoKSk7
CisgICAgICAgIGxheWVyLT5zZXRPd25lcih0aGlzKTsKKyAgICB9IGVsc2UKKyAgICAgICAgbGF5
ZXIgPSBtX3RpbGVDYWNoZUxheWVyLT5jcmVhdGVDb21wYXRpYmxlTGF5ZXIoUGxhdGZvcm1DQUxh
eWVyOjpMYXllclR5cGVUaWxlZEJhY2tpbmdUaWxlTGF5ZXIsIHRoaXMpOworCisgICAgbGF5ZXIt
PnNldEFuY2hvclBvaW50KEZsb2F0UG9pbnQzRCgpKTsKKyAgICBsYXllci0+c2V0Qm91bmRzKEZs
b2F0UmVjdChGbG9hdFBvaW50KCksIHRpbGVSZWN0LnNpemUoKSkpOworICAgIGxheWVyLT5zZXRQ
b3NpdGlvbih0aWxlUmVjdC5sb2NhdGlvbigpKTsKKyAgICBsYXllci0+c2V0Qm9yZGVyQ29sb3Io
bV90aWxlRGVidWdCb3JkZXJDb2xvcik7CisgICAgbGF5ZXItPnNldEJvcmRlcldpZHRoKG1fdGls
ZURlYnVnQm9yZGVyV2lkdGgpOworICAgIGxheWVyLT5zZXRFZGdlQW50aWFsaWFzaW5nTWFzaygw
KTsKKyAgICBsYXllci0+c2V0T3BhcXVlKG1fdGlsZXNBcmVPcGFxdWUpOworI2lmbmRlZiBOREVC
VUcKKyAgICBsYXllci0+c2V0TmFtZSgiVGlsZSIpOworI2VuZGlmCisKKyAgICBmbG9hdCB0ZW1w
b3JhcnlTY2FsZUZhY3RvciA9IG93bmluZ0dyYXBoaWNzTGF5ZXIoKS0+cGxhdGZvcm1DQUxheWVy
Q29udGVudHNTY2FsZU11bHRpcGxpZXJGb3JOZXdUaWxlcyhtX3RpbGVDYWNoZUxheWVyKTsKKyAg
ICBtX2hhc1RpbGVzV2l0aFRlbXBvcmFyeVNjYWxlRmFjdG9yIHw9IHRlbXBvcmFyeVNjYWxlRmFj
dG9yICE9IDE7CisKKyAgICBsYXllci0+c2V0Q29udGVudHNTY2FsZShtX2RldmljZVNjYWxlRmFj
dG9yICogdGVtcG9yYXJ5U2NhbGVGYWN0b3IpOworICAgIGxheWVyLT5zZXRBY2NlbGVyYXRlc0Ry
YXdpbmcobV9hY2NlbGVyYXRlc0RyYXdpbmcpOworCisgICAgbGF5ZXItPnNldE5lZWRzRGlzcGxh
eSgpOworCisgICAgcmV0dXJuIGxheWVyOworfQorCitpbnQgVGlsZUNvbnRyb2xsZXI6OnBsYXRm
b3JtQ0FMYXllckluY3JlbWVudFJlcGFpbnRDb3VudChQbGF0Zm9ybUNBTGF5ZXIqIHBsYXRmb3Jt
Q0FMYXllcikKK3sKKyAgICBpbnQgcmVwYWludENvdW50ID0gMDsKKworICAgIGlmIChtX3RpbGVS
ZXBhaW50Q291bnRzLmNvbnRhaW5zKHBsYXRmb3JtQ0FMYXllcikpCisgICAgICAgIHJlcGFpbnRD
b3VudCA9IG1fdGlsZVJlcGFpbnRDb3VudHMuZ2V0KHBsYXRmb3JtQ0FMYXllcik7CisKKyAgICBt
X3RpbGVSZXBhaW50Q291bnRzLnNldChwbGF0Zm9ybUNBTGF5ZXIsICsrcmVwYWludENvdW50KTsK
KworICAgIHJldHVybiByZXBhaW50Q291bnQ7Cit9CisKK3ZvaWQgVGlsZUNvbnRyb2xsZXI6OmRy
YXdUaWxlTWFwQ29udGVudHMoQ0dDb250ZXh0UmVmIGNvbnRleHQsIENHUmVjdCBsYXllckJvdW5k
cykKK3sKKyAgICBDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoY29udGV4dCwgMC4zLCAwLjMsIDAu
MywgMSk7CisgICAgQ0dDb250ZXh0RmlsbFJlY3QoY29udGV4dCwgbGF5ZXJCb3VuZHMpOworCisg
ICAgQ0dGbG9hdCBzY2FsZUZhY3RvciA9IGxheWVyQm91bmRzLnNpemUud2lkdGggLyBib3VuZHMo
KS53aWR0aCgpOworCisgICAgQ0dGbG9hdCBjb250ZXh0U2NhbGUgPSBzY2FsZUZhY3RvciAvIHNj
YWxlKCk7CisgICAgQ0dDb250ZXh0U2NhbGVDVE0oY29udGV4dCwgY29udGV4dFNjYWxlLCBjb250
ZXh0U2NhbGUpOworICAgIAorICAgIGZvciAoVGlsZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBt
X3RpbGVzLmJlZ2luKCksIGVuZCA9IG1fdGlsZXMuZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkgewor
ICAgICAgICBjb25zdCBUaWxlSW5mbyYgdGlsZUluZm8gPSBpdC0+dmFsdWU7CisgICAgICAgIFBs
YXRmb3JtQ0FMYXllciogdGlsZUxheWVyID0gdGlsZUluZm8ubGF5ZXIuZ2V0KCk7CisKKyAgICAg
ICAgQ0dGbG9hdCByZWQgPSAxOworICAgICAgICBDR0Zsb2F0IGdyZWVuID0gMTsKKyAgICAgICAg
Q0dGbG9hdCBibHVlID0gMTsKKyAgICAgICAgaWYgKHRpbGVJbmZvLmhhc1N0YWxlQ29udGVudCkg
eworICAgICAgICAgICAgcmVkID0gMC4yNTsKKyAgICAgICAgICAgIGdyZWVuID0gMC4xMjU7Cisg
ICAgICAgICAgICBibHVlID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIFRpbGVDb2hvcnQgbmV3
ZXN0Q29ob3J0ID0gbmV3ZXN0VGlsZUNvaG9ydCgpOworICAgICAgICBUaWxlQ29ob3J0IG9sZGVz
dENvaG9ydCA9IG9sZGVzdFRpbGVDb2hvcnQoKTsKKworICAgICAgICBpZiAoIW93bmluZ0dyYXBo
aWNzTGF5ZXIoKS0+cGxhdGZvcm1DQUxheWVyU2hvdWxkQWdncmVzc2l2ZWx5UmV0YWluVGlsZXMo
bV90aWxlQ2FjaGVMYXllcikgJiYgdGlsZUluZm8uY29ob3J0ICE9IFZpc2libGVUaWxlQ29ob3J0
ICYmIG5ld2VzdENvaG9ydCA+IG9sZGVzdENvaG9ydCkgeworICAgICAgICAgICAgZmxvYXQgY29o
b3J0UHJvcG9ydGlvbiA9IHN0YXRpY19jYXN0PGZsb2F0PigobmV3ZXN0Q29ob3J0IC0gdGlsZUlu
Zm8uY29ob3J0KSkgLyAobmV3ZXN0Q29ob3J0IC0gb2xkZXN0Q29ob3J0KTsKKyAgICAgICAgICAg
IENHQ29udGV4dFNldFJHQkZpbGxDb2xvcihjb250ZXh0LCByZWQsIGdyZWVuLCBibHVlLCAxIC0g
Y29ob3J0UHJvcG9ydGlvbik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgQ0dDb250ZXh0
U2V0UkdCRmlsbENvbG9yKGNvbnRleHQsIHJlZCwgZ3JlZW4sIGJsdWUsIDEpOworCisgICAgICAg
IGlmICh0aWxlTGF5ZXItPnN1cGVybGF5ZXIoKSkgeworICAgICAgICAgICAgQ0dDb250ZXh0U2V0
TGluZVdpZHRoKGNvbnRleHQsIDAuNSAvIGNvbnRleHRTY2FsZSk7CisgICAgICAgICAgICBDR0Nv
bnRleHRTZXRSR0JTdHJva2VDb2xvcihjb250ZXh0LCAwLCAwLCAwLCAxKTsKKyAgICAgICAgfSBl
bHNlIHsKKyAgICAgICAgICAgIENHQ29udGV4dFNldExpbmVXaWR0aChjb250ZXh0LCAxIC8gY29u
dGV4dFNjYWxlKTsKKyAgICAgICAgICAgIENHQ29udGV4dFNldFJHQlN0cm9rZUNvbG9yKGNvbnRl
eHQsIDAuMiwgMC4xLCAwLjksIDEpOworICAgICAgICB9CisKKyAgICAgICAgQ0dSZWN0IGZyYW1l
ID0gQ0dSZWN0TWFrZSh0aWxlTGF5ZXItPnBvc2l0aW9uKCkueCgpLCB0aWxlTGF5ZXItPnBvc2l0
aW9uKCkueSgpLCB0aWxlTGF5ZXItPmJvdW5kcygpLnNpemUoKS53aWR0aCgpLCB0aWxlTGF5ZXIt
PmJvdW5kcygpLnNpemUoKS5oZWlnaHQoKSk7CisgICAgICAgIENHQ29udGV4dEZpbGxSZWN0KGNv
bnRleHQsIGZyYW1lKTsKKyAgICAgICAgQ0dDb250ZXh0U3Ryb2tlUmVjdChjb250ZXh0LCBmcmFt
ZSk7CisgICAgfQorfQorICAgIAorI2lmIFBMQVRGT1JNKElPUykKK3ZvaWQgVGlsZUNvbnRyb2xs
ZXI6OnJlbW92ZVVucGFyZW50ZWRUaWxlc05vdygpCit7CisgICAgd2hpbGUgKCFtX2NvaG9ydExp
c3QuaXNFbXB0eSgpKSB7CisgICAgICAgIFRpbGVDb2hvcnRJbmZvIGZpcnN0Q29ob3J0ID0gbV9j
b2hvcnRMaXN0LnRha2VGaXJzdCgpOworICAgICAgICByZW1vdmVUaWxlc0luQ29ob3J0KGZpcnN0
Q29ob3J0LmNvaG9ydCk7CisgICAgfQorCisgICAgaWYgKG1fdGlsZWRTY3JvbGxpbmdJbmRpY2F0
b3JMYXllcikKKyAgICAgICAgdXBkYXRlVGlsZUNvdmVyYWdlTWFwKCk7Cit9CisjZW5kaWYKKwor
fSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvY2EvbWFjL1RpbGVHcmlkLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2NhL21hYy9UaWxlR3JpZC5tbQkod29ya2luZyBjb3B5KQorKysgU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2EvbWFjL1RpbGVHcmlkLm1tCSh3b3JraW5n
IGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMiwg
MjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTEtMjAxNCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKQEAgLTI0LDE4ICsyNCwxMiBAQAogICovCiAKICNpbXBvcnQgImNvbmZp
Zy5oIgotI2ltcG9ydCAiVGlsZUNvbnRyb2xsZXIuaCIKKyNpbXBvcnQgIlRpbGVHcmlkLmgiCiAK
LSNpbXBvcnQgIkdyYXBoaWNzQ29udGV4dC5oIgotI2ltcG9ydCAiSW50UmVjdC5oIgotI2ltcG9y
dCAiUGxhdGZvcm1DQUxheWVyLmgiCi0jaW1wb3J0ICJSZWdpb24uaCIKLSNpZiAhUExBVEZPUk0o
SU9TKQogI2ltcG9ydCAiTGF5ZXJQb29sLmgiCi0jZW5kaWYKLSNpbXBvcnQgIldlYkxheWVyLmgi
CisjaW1wb3J0ICJQbGF0Zm9ybUNBTGF5ZXIuaCIKKyNpbXBvcnQgIlRpbGVDb250cm9sbGVyLmgi
CiAjaW1wb3J0IDx3dGYvTWFpblRocmVhZC5oPgotI2ltcG9ydCA8dXRpbGl0eT4KIAogI2lmIFBM
QVRGT1JNKElPUykKICNpbXBvcnQgIlRpbGVDb250cm9sbGVyTWVtb3J5SGFuZGxlcklPUy5oIgpA
QCAtNDgsNjUgKzQyLDQ0IEBAIGVudW0gVGlsZVZhbGlkYXRpb25Qb2xpY3lGbGFnIHsKICAgICBV
bnBhcmVudEFsbFRpbGVzID0gMSA8PCAxCiB9OwogCi1QYXNzT3duUHRyPFRpbGVDb250cm9sbGVy
PiBUaWxlQ29udHJvbGxlcjo6Y3JlYXRlKFBsYXRmb3JtQ0FMYXllciogcm9vdFBsYXRmb3JtTGF5
ZXIpCi17Ci0gICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBUaWxlQ29udHJvbGxlcihyb290UGxhdGZv
cm1MYXllcikpOwotfQotCi1UaWxlQ29udHJvbGxlcjo6VGlsZUNvbnRyb2xsZXIoUGxhdGZvcm1D
QUxheWVyKiByb290UGxhdGZvcm1MYXllcikKLSAgICA6IG1fdGlsZUNhY2hlTGF5ZXIocm9vdFBs
YXRmb3JtTGF5ZXIpCi0gICAgLCBtX3RpbGVTaXplKGRlZmF1bHRUaWxlV2lkdGgsIGRlZmF1bHRU
aWxlSGVpZ2h0KQotICAgICwgbV9leHBvc2VkUmVjdChGbG9hdFJlY3Q6OmluZmluaXRlUmVjdCgp
KQotICAgICwgbV90aWxlUmV2YWxpZGF0aW9uVGltZXIodGhpcywgJlRpbGVDb250cm9sbGVyOjp0
aWxlUmV2YWxpZGF0aW9uVGltZXJGaXJlZCkKLSAgICAsIG1fY29ob3J0UmVtb3ZhbFRpbWVyKHRo
aXMsICZUaWxlQ29udHJvbGxlcjo6Y29ob3J0UmVtb3ZhbFRpbWVyRmlyZWQpCi0gICAgLCBtX3Nj
YWxlKDEpCi0gICAgLCBtX2RldmljZVNjYWxlRmFjdG9yKDEpCi0gICAgLCBtX3RpbGVDb3ZlcmFn
ZShDb3ZlcmFnZUZvclZpc2libGVBcmVhKQotICAgICwgbV9tYXJnaW5Ub3AoMCkKLSAgICAsIG1f
bWFyZ2luQm90dG9tKDApCi0gICAgLCBtX21hcmdpbkxlZnQoMCkKLSAgICAsIG1fbWFyZ2luUmln
aHQoMCkKLSAgICAsIG1faXNJbldpbmRvdyhmYWxzZSkKLSAgICAsIG1fc2Nyb2xsaW5nUGVyZm9y
bWFuY2VMb2dnaW5nRW5hYmxlZChmYWxzZSkKLSAgICAsIG1fdW5wYXJlbnRzT2Zmc2NyZWVuVGls
ZXMoZmFsc2UpCi0gICAgLCBtX2FjY2VsZXJhdGVzRHJhd2luZyhmYWxzZSkKLSAgICAsIG1fdGls
ZXNBcmVPcGFxdWUoZmFsc2UpCi0gICAgLCBtX2hhc1RpbGVzV2l0aFRlbXBvcmFyeVNjYWxlRmFj
dG9yKGZhbHNlKQotICAgICwgbV90aWxlRGVidWdCb3JkZXJXaWR0aCgwKQotICAgICwgbV9pbmRp
Y2F0b3JNb2RlKEFzeW5jU2Nyb2xsaW5nSW5kaWNhdGlvbikKK1RpbGVHcmlkOjpUaWxlR3JpZChU
aWxlQ29udHJvbGxlciYgY29udHJvbGxlcikKKyAgICA6IG1fY29udHJvbGxlcihjb250cm9sbGVy
KQorICAgICwgbV9jb250YWluZXJMYXllcigqY29udHJvbGxlci5yb290TGF5ZXIoKS5jcmVhdGVD
b21wYXRpYmxlTGF5ZXIoUGxhdGZvcm1DQUxheWVyOjpMYXllclR5cGVMYXllciwgbnVsbHB0cikp
CisgICAgLCBtX2NvaG9ydFJlbW92YWxUaW1lcih0aGlzLCAmVGlsZUdyaWQ6OmNvaG9ydFJlbW92
YWxUaW1lckZpcmVkKQogewotICAgIG1fdGlsZUNvbnRhaW5lckxheWVyID0gbV90aWxlQ2FjaGVM
YXllci0+Y3JlYXRlQ29tcGF0aWJsZUxheWVyKFBsYXRmb3JtQ0FMYXllcjo6TGF5ZXJUeXBlTGF5
ZXIsIG51bGxwdHIpOwogI2lmbmRlZiBOREVCVUcKLSAgICBtX3RpbGVDb250YWluZXJMYXllci0+
c2V0TmFtZSgiVGlsZUNvbnRyb2xsZXIgQ29udGFpbmVyIExheWVyIik7CisgICAgbV9jb250YWlu
ZXJMYXllci5nZXQoKS5zZXROYW1lKCJUaWxlR3JpZCBDb250YWluZXIgTGF5ZXIiKTsKICNlbmRp
ZgogfQogCi1UaWxlQ29udHJvbGxlcjo6flRpbGVDb250cm9sbGVyKCkKK1RpbGVHcmlkOjp+VGls
ZUdyaWQoKQogewogICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CiAKLSNpZiBQTEFURk9STShJ
T1MpCi0gICAgdGlsZUNvbnRyb2xsZXJNZW1vcnlIYW5kbGVyKCkucmVtb3ZlVGlsZUNvbnRyb2xs
ZXIodGhpcyk7Ci0jZW5kaWYKLQotICAgIGZvciAoVGlsZU1hcDo6aXRlcmF0b3IgaXQgPSBtX3Rp
bGVzLmJlZ2luKCksIGVuZCA9IG1fdGlsZXMuZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkKLSAgICAg
ICAgaXQtPnZhbHVlLmxheWVyLT5zZXRPd25lcihudWxscHRyKTsKLQotICAgIGlmIChtX3RpbGVk
U2Nyb2xsaW5nSW5kaWNhdG9yTGF5ZXIpCi0gICAgICAgIG1fdGlsZWRTY3JvbGxpbmdJbmRpY2F0
b3JMYXllci0+c2V0T3duZXIobnVsbHB0cik7CisgICAgZm9yIChhdXRvJiB0aWxlIDogbV90aWxl
cy52YWx1ZXMoKSkKKyAgICAgICAgdGlsZS5sYXllci0+c2V0T3duZXIobnVsbHB0cik7CiB9CiAK
LXZvaWQgVGlsZUNvbnRyb2xsZXI6OnRpbGVDYWNoZUxheWVyQm91bmRzQ2hhbmdlZCgpCit2b2lk
IFRpbGVHcmlkOjpzZXRTY2FsZShmbG9hdCBzY2FsZSkKIHsKLSAgICBBU1NFUlQob3duaW5nR3Jh
cGhpY3NMYXllcigpLT5pc0NvbW1pdHRpbmdDaGFuZ2VzKCkpOwotICAgIHNldE5lZWRzUmV2YWxp
ZGF0ZVRpbGVzKCk7CisgICAgbV9zY2FsZSA9IHNjYWxlOworCisgICAgVHJhbnNmb3JtYXRpb25N
YXRyaXggdHJhbnNmb3JtOworICAgIHRyYW5zZm9ybS5zY2FsZSgxIC8gbV9zY2FsZSk7CisgICAg
bV9jb250YWluZXJMYXllci0+c2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7CisKKyAgICAvLyBGSVhN
RTogd2UgbWF5IHJldmFsaWRhdGVUaWxlcyB0d2ljZSBpbiB0aGlzIGNvbW1pdC4KKyAgICByZXZh
bGlkYXRlVGlsZXMoUHJ1bmVTZWNvbmRhcnlUaWxlcyk7CisKKyAgICBmb3IgKGF1dG8mIHRpbGUg
OiBtX3RpbGVzLnZhbHVlcygpKQorICAgICAgICB0aWxlLmxheWVyLT5zZXRDb250ZW50c1NjYWxl
KG1fY29udHJvbGxlci5kZXZpY2VTY2FsZUZhY3RvcigpKTsKIH0KIAotdm9pZCBUaWxlQ29udHJv
bGxlcjo6c2V0TmVlZHNEaXNwbGF5KCkKK3ZvaWQgVGlsZUdyaWQ6OnNldE5lZWRzRGlzcGxheSgp
CiB7Ci0gICAgZm9yIChUaWxlTWFwOjppdGVyYXRvciBpdCA9IG1fdGlsZXMuYmVnaW4oKSwgZW5k
ID0gbV90aWxlcy5lbmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIFRpbGVJbmZvJiB0
aWxlSW5mbyA9IGl0LT52YWx1ZTsKLSAgICAgICAgSW50UmVjdCB0aWxlUmVjdCA9IHJlY3RGb3JU
aWxlSW5kZXgoaXQtPmtleSk7CisgICAgZm9yIChhdXRvJiBlbnRyeSA6IG1fdGlsZXMpIHsKKyAg
ICAgICAgVGlsZUluZm8mIHRpbGVJbmZvID0gZW50cnkudmFsdWU7CisgICAgICAgIEludFJlY3Qg
dGlsZVJlY3QgPSByZWN0Rm9yVGlsZUluZGV4KGVudHJ5LmtleSk7CiAKICAgICAgICAgaWYgKHRp
bGVSZWN0LmludGVyc2VjdHMobV9wcmltYXJ5VGlsZUNvdmVyYWdlUmVjdCkgJiYgdGlsZUluZm8u
bGF5ZXItPnN1cGVybGF5ZXIoKSkKICAgICAgICAgICAgIHRpbGVJbmZvLmxheWVyLT5zZXROZWVk
c0Rpc3BsYXkoKTsKQEAgLTExNSw3ICs4OCw3IEBAIHZvaWQgVGlsZUNvbnRyb2xsZXI6OnNldE5l
ZWRzRGlzcGxheSgpCiAgICAgfQogfQogCi12b2lkIFRpbGVDb250cm9sbGVyOjpzZXROZWVkc0Rp
c3BsYXlJblJlY3QoY29uc3QgSW50UmVjdCYgcmVjdCkKK3ZvaWQgVGlsZUdyaWQ6OnNldE5lZWRz
RGlzcGxheUluUmVjdChjb25zdCBJbnRSZWN0JiByZWN0KQogewogICAgIGlmIChtX3RpbGVzLmlz
RW1wdHkoKSkKICAgICAgICAgcmV0dXJuOwpAQCAtMTI0LDggKzk3LDEwIEBAIHZvaWQgVGlsZUNv
bnRyb2xsZXI6OnNldE5lZWRzRGlzcGxheUluUmUKICAgICBzY2FsZWRSZWN0LnNjYWxlKG1fc2Nh
bGUpOwogICAgIEludFJlY3QgcmVwYWludFJlY3RJblRpbGVDb29yZHMoZW5jbG9zaW5nSW50UmVj
dChzY2FsZWRSZWN0KSk7CiAKKyAgICBJbnRTaXplIHRpbGVTaXplID0gbV9jb250cm9sbGVyLnRp
bGVTaXplKCk7CisKICAgICAvLyBGb3Igc21hbGwgaW52YWxpZGF0aW9ucywgbG9va3VwIHRoZSBj
b3ZlcmVkIHRpbGVzLgotICAgIGlmIChyZXBhaW50UmVjdEluVGlsZUNvb3Jkcy5oZWlnaHQoKSA8
IDIgKiBtX3RpbGVTaXplLmhlaWdodCgpICYmIHJlcGFpbnRSZWN0SW5UaWxlQ29vcmRzLndpZHRo
KCkgPCAyICogbV90aWxlU2l6ZS53aWR0aCgpKSB7CisgICAgaWYgKHJlcGFpbnRSZWN0SW5UaWxl
Q29vcmRzLmhlaWdodCgpIDwgMiAqIHRpbGVTaXplLmhlaWdodCgpICYmIHJlcGFpbnRSZWN0SW5U
aWxlQ29vcmRzLndpZHRoKCkgPCAyICogdGlsZVNpemUud2lkdGgoKSkgewogICAgICAgICBUaWxl
SW5kZXggdG9wTGVmdDsKICAgICAgICAgVGlsZUluZGV4IGJvdHRvbVJpZ2h0OwogICAgICAgICBn
ZXRUaWxlSW5kZXhSYW5nZUZvclJlY3QocmVwYWludFJlY3RJblRpbGVDb29yZHMsIHRvcExlZnQs
IGJvdHRvbVJpZ2h0KTsKQEAgLTE0Niw3ICsxMjEsNyBAQCB2b2lkIFRpbGVDb250cm9sbGVyOjpz
ZXROZWVkc0Rpc3BsYXlJblJlCiAgICAgICAgIHNldFRpbGVOZWVkc0Rpc3BsYXlJblJlY3QoaXQt
PmtleSwgaXQtPnZhbHVlLCByZXBhaW50UmVjdEluVGlsZUNvb3JkcywgbV9wcmltYXJ5VGlsZUNv
dmVyYWdlUmVjdCk7CiB9CiAKLXZvaWQgVGlsZUNvbnRyb2xsZXI6OnNldFRpbGVOZWVkc0Rpc3Bs
YXlJblJlY3QoY29uc3QgVGlsZUluZGV4JiB0aWxlSW5kZXgsIFRpbGVJbmZvJiB0aWxlSW5mbywg
Y29uc3QgSW50UmVjdCYgcmVwYWludFJlY3RJblRpbGVDb29yZHMsIGNvbnN0IEludFJlY3QmIGNv
dmVyYWdlUmVjdEluVGlsZUNvb3JkcykKK3ZvaWQgVGlsZUdyaWQ6OnNldFRpbGVOZWVkc0Rpc3Bs
YXlJblJlY3QoY29uc3QgVGlsZUluZGV4JiB0aWxlSW5kZXgsIFRpbGVJbmZvJiB0aWxlSW5mbywg
Y29uc3QgSW50UmVjdCYgcmVwYWludFJlY3RJblRpbGVDb29yZHMsIGNvbnN0IEludFJlY3QmIGNv
dmVyYWdlUmVjdEluVGlsZUNvb3JkcykKIHsKICAgICBQbGF0Zm9ybUNBTGF5ZXIqIHRpbGVMYXll
ciA9IHRpbGVJbmZvLmxheWVyLmdldCgpOwogCkBAIC0xNjMsNyArMTM4LDcgQEAgdm9pZCBUaWxl
Q29udHJvbGxlcjo6c2V0VGlsZU5lZWRzRGlzcGxheQogICAgIGlmICh0aWxlUmVjdC5pbnRlcnNl
Y3RzKGNvdmVyYWdlUmVjdEluVGlsZUNvb3JkcykgJiYgdGlsZUxheWVyLT5zdXBlcmxheWVyKCkp
IHsKICAgICAgICAgdGlsZUxheWVyLT5zZXROZWVkc0Rpc3BsYXkoJnRpbGVSZXBhaW50UmVjdCk7
CiAKLSAgICAgICAgaWYgKG93bmluZ0dyYXBoaWNzTGF5ZXIoKS0+cGxhdGZvcm1DQUxheWVyU2hv
d1JlcGFpbnRDb3VudGVyKDApKSB7CisgICAgICAgIGlmIChtX2NvbnRyb2xsZXIucm9vdExheWVy
KCkub3duZXIoKS0+cGxhdGZvcm1DQUxheWVyU2hvd1JlcGFpbnRDb3VudGVyKDApKSB7CiAgICAg
ICAgICAgICBGbG9hdFJlY3QgaW5kaWNhdG9yUmVjdCgwLCAwLCA1MiwgMjcpOwogICAgICAgICAg
ICAgdGlsZUxheWVyLT5zZXROZWVkc0Rpc3BsYXkoJmluZGljYXRvclJlY3QpOwogICAgICAgICB9
CkBAIC0xNzEsMTMwICsxNDYsMzEgQEAgdm9pZCBUaWxlQ29udHJvbGxlcjo6c2V0VGlsZU5lZWRz
RGlzcGxheQogICAgICAgICB0aWxlSW5mby5oYXNTdGFsZUNvbnRlbnQgPSB0cnVlOwogfQogCi12
b2lkIFRpbGVDb250cm9sbGVyOjpwbGF0Zm9ybUNBTGF5ZXJQYWludENvbnRlbnRzKFBsYXRmb3Jt
Q0FMYXllciogcGxhdGZvcm1DQUxheWVyLCBHcmFwaGljc0NvbnRleHQmIGNvbnRleHQsIGNvbnN0
IEZsb2F0UmVjdCYpCi17Ci0jaWYgUExBVEZPUk0oSU9TKQotICAgIGlmIChwdGhyZWFkX21haW5f
bnAoKSkKLSAgICAgICAgV2ViVGhyZWFkTG9jaygpOwotI2VuZGlmCi0KLSAgICBpZiAocGxhdGZv
cm1DQUxheWVyID09IG1fdGlsZWRTY3JvbGxpbmdJbmRpY2F0b3JMYXllci5nZXQoKSkgewotICAg
ICAgICBkcmF3VGlsZU1hcENvbnRlbnRzKGNvbnRleHQucGxhdGZvcm1Db250ZXh0KCksIG1fdGls
ZWRTY3JvbGxpbmdJbmRpY2F0b3JMYXllci0+Ym91bmRzKCkpOwotICAgICAgICByZXR1cm47Ci0g
ICAgfQotCi0gICAgewotICAgICAgICBHcmFwaGljc0NvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2
ZXIoY29udGV4dCk7Ci0KLSAgICAgICAgRmxvYXRQb2ludDNEIGxheWVyT3JpZ2luID0gcGxhdGZv
cm1DQUxheWVyLT5wb3NpdGlvbigpOwotICAgICAgICBjb250ZXh0LnRyYW5zbGF0ZSgtbGF5ZXJP
cmlnaW4ueCgpLCAtbGF5ZXJPcmlnaW4ueSgpKTsKLSAgICAgICAgY29udGV4dC5zY2FsZShGbG9h
dFNpemUobV9zY2FsZSwgbV9zY2FsZSkpOwotCi0gICAgICAgIFJlcGFpbnRSZWN0TGlzdCBkaXJ0
eVJlY3RzID0gY29sbGVjdFJlY3RzVG9QYWludChjb250ZXh0LnBsYXRmb3JtQ29udGV4dCgpLCBw
bGF0Zm9ybUNBTGF5ZXIpOwotICAgICAgICBkcmF3TGF5ZXJDb250ZW50cyhjb250ZXh0LnBsYXRm
b3JtQ29udGV4dCgpLCBtX3RpbGVDYWNoZUxheWVyLCBkaXJ0eVJlY3RzKTsKLSAgICB9Ci0KLSAg
ICBpbnQgcmVwYWludENvdW50ID0gcGxhdGZvcm1DQUxheWVySW5jcmVtZW50UmVwYWludENvdW50
KHBsYXRmb3JtQ0FMYXllcik7Ci0gICAgaWYgKG93bmluZ0dyYXBoaWNzTGF5ZXIoKS0+cGxhdGZv
cm1DQUxheWVyU2hvd1JlcGFpbnRDb3VudGVyKDApKQotICAgICAgICBkcmF3UmVwYWludEluZGlj
YXRvcihjb250ZXh0LnBsYXRmb3JtQ29udGV4dCgpLCBwbGF0Zm9ybUNBTGF5ZXIsIHJlcGFpbnRD
b3VudCwgY2FjaGVkQ0dDb2xvcihtX3RpbGVEZWJ1Z0JvcmRlckNvbG9yLCBDb2xvclNwYWNlRGV2
aWNlUkdCKSk7Ci0KLSAgICBpZiAoc2Nyb2xsaW5nUGVyZm9ybWFuY2VMb2dnaW5nRW5hYmxlZCgp
KSB7Ci0gICAgICAgIEZsb2F0UmVjdCB2aXNpYmxlUGFydChwbGF0Zm9ybUNBTGF5ZXItPnBvc2l0
aW9uKCkueCgpLCBwbGF0Zm9ybUNBTGF5ZXItPnBvc2l0aW9uKCkueSgpLCBwbGF0Zm9ybUNBTGF5
ZXItPmJvdW5kcygpLnNpemUoKS53aWR0aCgpLCBwbGF0Zm9ybUNBTGF5ZXItPmJvdW5kcygpLnNp
emUoKS5oZWlnaHQoKSk7Ci0gICAgICAgIHZpc2libGVQYXJ0LmludGVyc2VjdCh2aXNpYmxlUmVj
dCgpKTsKLQotICAgICAgICBpZiAocmVwYWludENvdW50ID09IDEgJiYgIXZpc2libGVQYXJ0Lmlz
RW1wdHkoKSkKLSAgICAgICAgICAgIFdURkxvZ0Fsd2F5cygiU0NST0xMSU5HOiBGaWxsZWQgdmlz
aWJsZSBmcmVzaCB0aWxlLiBUaW1lOiAlZiBVbmZpbGxlZCBQaXhlbHM6ICV1XG4iLCBXVEY6Om1v
bm90b25pY2FsbHlJbmNyZWFzaW5nVGltZSgpLCBibGFua1BpeGVsQ291bnQoKSk7Ci0gICAgfQot
fQotCi1mbG9hdCBUaWxlQ29udHJvbGxlcjo6cGxhdGZvcm1DQUxheWVyRGV2aWNlU2NhbGVGYWN0
b3IoKSBjb25zdAotewotICAgIHJldHVybiBvd25pbmdHcmFwaGljc0xheWVyKCktPnBsYXRmb3Jt
Q0FMYXllckRldmljZVNjYWxlRmFjdG9yKCk7Ci19Ci0KLWJvb2wgVGlsZUNvbnRyb2xsZXI6OnBs
YXRmb3JtQ0FMYXllclNob3dEZWJ1Z0JvcmRlcnMoKSBjb25zdAotewotICAgIHJldHVybiBvd25p
bmdHcmFwaGljc0xheWVyKCktPnBsYXRmb3JtQ0FMYXllclNob3dEZWJ1Z0JvcmRlcnMoKTsKLX0K
LQotYm9vbCBUaWxlQ29udHJvbGxlcjo6cGxhdGZvcm1DQUxheWVyU2hvd1JlcGFpbnRDb3VudGVy
KFBsYXRmb3JtQ0FMYXllciopIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG93bmluZ0dyYXBoaWNzTGF5
ZXIoKS0+cGxhdGZvcm1DQUxheWVyU2hvd1JlcGFpbnRDb3VudGVyKDApOwotfQotCi12b2lkIFRp
bGVDb250cm9sbGVyOjpzZXRTY2FsZShmbG9hdCBzY2FsZSkKK3ZvaWQgVGlsZUdyaWQ6OnVwZGF0
ZVRpbGVyTGF5ZXJQcm9wZXJ0aWVzKCkKIHsKLSAgICBBU1NFUlQob3duaW5nR3JhcGhpY3NMYXll
cigpLT5pc0NvbW1pdHRpbmdDaGFuZ2VzKCkpOwotCi0gICAgZmxvYXQgZGV2aWNlU2NhbGVGYWN0
b3IgPSBvd25pbmdHcmFwaGljc0xheWVyKCktPnBsYXRmb3JtQ0FMYXllckRldmljZVNjYWxlRmFj
dG9yKCk7Ci0KLSAgICAvLyBUaGUgc2NhbGUgd2UgZ2V0IGlzIHRoZSBwcm9kdWN0IG9mIHRoZSBw
YWdlIHNjYWxlIGZhY3RvciBhbmQgZGV2aWNlIHNjYWxlIGZhY3Rvci4KLSAgICAvLyBEaXZpZGUg
YnkgdGhlIGRldmljZSBzY2FsZSBmYWN0b3Igc28gd2UnbGwgZ2V0IHRoZSBwYWdlIHNjYWxlIGZh
Y3Rvci4KLSAgICBzY2FsZSAvPSBkZXZpY2VTY2FsZUZhY3RvcjsKLQotICAgIGlmIChtX3NjYWxl
ID09IHNjYWxlICYmIG1fZGV2aWNlU2NhbGVGYWN0b3IgPT0gZGV2aWNlU2NhbGVGYWN0b3IgJiYg
IW1faGFzVGlsZXNXaXRoVGVtcG9yYXJ5U2NhbGVGYWN0b3IpCi0gICAgICAgIHJldHVybjsKLQot
ICAgIG1faGFzVGlsZXNXaXRoVGVtcG9yYXJ5U2NhbGVGYWN0b3IgPSBmYWxzZTsKLSAgICBtX2Rl
dmljZVNjYWxlRmFjdG9yID0gZGV2aWNlU2NhbGVGYWN0b3I7Ci0gICAgbV9zY2FsZSA9IHNjYWxl
OwotCi0gICAgVHJhbnNmb3JtYXRpb25NYXRyaXggdHJhbnNmb3JtOwotICAgIHRyYW5zZm9ybS5z
Y2FsZSgxIC8gbV9zY2FsZSk7Ci0gICAgbV90aWxlQ29udGFpbmVyTGF5ZXItPnNldFRyYW5zZm9y
bSh0cmFuc2Zvcm0pOwotCi0gICAgLy8gRklYTUU6IHdlIG1heSByZXZhbGlkYXRlVGlsZXMgdHdp
Y2UgaW4gdGhpcyBjb21taXQuCi0gICAgcmV2YWxpZGF0ZVRpbGVzKFBydW5lU2Vjb25kYXJ5VGls
ZXMsIFBydW5lU2Vjb25kYXJ5VGlsZXMpOwotCi0gICAgZm9yIChUaWxlTWFwOjpjb25zdF9pdGVy
YXRvciBpdCA9IG1fdGlsZXMuYmVnaW4oKSwgZW5kID0gbV90aWxlcy5lbmQoKTsgaXQgIT0gZW5k
OyArK2l0KQotICAgICAgICBpdC0+dmFsdWUubGF5ZXItPnNldENvbnRlbnRzU2NhbGUoZGV2aWNl
U2NhbGVGYWN0b3IpOwotfQotCi12b2lkIFRpbGVDb250cm9sbGVyOjpzZXRBY2NlbGVyYXRlc0Ry
YXdpbmcoYm9vbCBhY2NlbGVyYXRlc0RyYXdpbmcpCi17Ci0gICAgaWYgKG1fYWNjZWxlcmF0ZXNE
cmF3aW5nID09IGFjY2VsZXJhdGVzRHJhd2luZykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9h
Y2NlbGVyYXRlc0RyYXdpbmcgPSBhY2NlbGVyYXRlc0RyYXdpbmc7CisgICAgYm9vbCBhY2NlbGVy
YXRlc0RyYXdpbmcgPSBtX2NvbnRyb2xsZXIuYWNjZWxlcmF0ZXNEcmF3aW5nKCk7CisgICAgYm9v
bCBvcGFxdWUgPSBtX2NvbnRyb2xsZXIudGlsZXNBcmVPcGFxdWUoKTsKKyAgICBDb2xvciB0aWxl
RGVidWdCb3JkZXJDb2xvciA9IG1fY29udHJvbGxlci50aWxlRGVidWdCb3JkZXJDb2xvcigpOwor
ICAgIGZsb2F0IHRpbGVEZWJ1Z0JvcmRlcldpZHRoID0gbV9jb250cm9sbGVyLnRpbGVEZWJ1Z0Jv
cmRlcldpZHRoKCk7CiAKICAgICBmb3IgKFRpbGVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV90
aWxlcy5iZWdpbigpLCBlbmQgPSBtX3RpbGVzLmVuZCgpOyBpdCAhPSBlbmQ7ICsraXQpIHsKICAg
ICAgICAgY29uc3QgVGlsZUluZm8mIHRpbGVJbmZvID0gaXQtPnZhbHVlOwotICAgICAgICB0aWxl
SW5mby5sYXllci0+c2V0QWNjZWxlcmF0ZXNEcmF3aW5nKG1fYWNjZWxlcmF0ZXNEcmF3aW5nKTsK
LSAgICB9Ci19Ci0KLXZvaWQgVGlsZUNvbnRyb2xsZXI6OnNldFRpbGVzT3BhcXVlKGJvb2wgb3Bh
cXVlKQotewotICAgIGlmIChvcGFxdWUgPT0gbV90aWxlc0FyZU9wYXF1ZSkKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgbV90aWxlc0FyZU9wYXF1ZSA9IG9wYXF1ZTsKLQotICAgIGZvciAoVGlsZU1h
cDo6aXRlcmF0b3IgaXQgPSBtX3RpbGVzLmJlZ2luKCksIGVuZCA9IG1fdGlsZXMuZW5kKCk7IGl0
ICE9IGVuZDsgKytpdCkgewotICAgICAgICBjb25zdCBUaWxlSW5mbyYgdGlsZUluZm8gPSBpdC0+
dmFsdWU7CisgICAgICAgIHRpbGVJbmZvLmxheWVyLT5zZXRBY2NlbGVyYXRlc0RyYXdpbmcoYWNj
ZWxlcmF0ZXNEcmF3aW5nKTsKICAgICAgICAgdGlsZUluZm8ubGF5ZXItPnNldE9wYXF1ZShvcGFx
dWUpOworICAgICAgICB0aWxlSW5mby5sYXllci0+c2V0Qm9yZGVyQ29sb3IodGlsZURlYnVnQm9y
ZGVyQ29sb3IpOworICAgICAgICB0aWxlSW5mby5sYXllci0+c2V0Qm9yZGVyV2lkdGgodGlsZURl
YnVnQm9yZGVyV2lkdGgpOwogICAgIH0KIH0KIAotdm9pZCBUaWxlQ29udHJvbGxlcjo6c2V0Vmlz
aWJsZVJlY3QoY29uc3QgRmxvYXRSZWN0JiB2aXNpYmxlUmVjdCkKLXsKLSAgICBBU1NFUlQob3du
aW5nR3JhcGhpY3NMYXllcigpLT5pc0NvbW1pdHRpbmdDaGFuZ2VzKCkpOwotICAgIGlmIChtX3Zp
c2libGVSZWN0ID09IHZpc2libGVSZWN0KQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX3Zpc2li
bGVSZWN0ID0gdmlzaWJsZVJlY3Q7Ci0gICAgc2V0TmVlZHNSZXZhbGlkYXRlVGlsZXMoKTsKLX0K
LQotYm9vbCBUaWxlQ29udHJvbGxlcjo6dGlsZXNXb3VsZENoYW5nZUZvclZpc2libGVSZWN0KGNv
bnN0IEZsb2F0UmVjdCYgbmV3VmlzaWJsZVJlY3QpIGNvbnN0Citib29sIFRpbGVHcmlkOjp0aWxl
c1dvdWxkQ2hhbmdlRm9yVmlzaWJsZVJlY3QoY29uc3QgRmxvYXRSZWN0JiBuZXdWaXNpYmxlUmVj
dCwgY29uc3QgRmxvYXRSZWN0JiBvbGRWaXNpYmxlUmVjdCkgY29uc3QKIHsKICAgICBGbG9hdFJl
Y3QgdmlzaWJsZVJlY3QgPSBuZXdWaXNpYmxlUmVjdDsKICAgICB2aXNpYmxlUmVjdC5pbnRlcnNl
Y3Qoc2NhbGVkRXhwb3NlZFJlY3QoKSk7CiAKLSAgICBpZiAodmlzaWJsZVJlY3QuaXNFbXB0eSgp
IHx8IGJvdW5kcygpLmlzRW1wdHkoKSkKKyAgICBpZiAodmlzaWJsZVJlY3QuaXNFbXB0eSgpKQog
ICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIAotICAgIEZsb2F0UmVjdCBjdXJyZW50VGls
ZUNvdmVyYWdlUmVjdCA9IGNvbXB1dGVUaWxlQ292ZXJhZ2VSZWN0KG1fdmlzaWJsZVJlY3QsIG5l
d1Zpc2libGVSZWN0KTsKKyAgICBGbG9hdFJlY3QgY3VycmVudFRpbGVDb3ZlcmFnZVJlY3QgPSBt
X2NvbnRyb2xsZXIuY29tcHV0ZVRpbGVDb3ZlcmFnZVJlY3Qob2xkVmlzaWJsZVJlY3QsIG5ld1Zp
c2libGVSZWN0KTsKICAgICBGbG9hdFJlY3Qgc2NhbGVkUmVjdChjdXJyZW50VGlsZUNvdmVyYWdl
UmVjdCk7CiAgICAgc2NhbGVkUmVjdC5zY2FsZShtX3NjYWxlKTsKICAgICBJbnRSZWN0IGN1cnJl
bnRDb3ZlcmFnZVJlY3RJblRpbGVDb29yZHMoZW5jbG9zaW5nSW50UmVjdChzY2FsZWRSZWN0KSk7
CkBAIC0zMDgsMTQ3ICsxODQsNjEgQEAgYm9vbCBUaWxlQ29udHJvbGxlcjo6dGlsZXNXb3VsZENo
YW5nZUZvcgogICAgIHJldHVybiBjb3ZlcmFnZVJlY3QgIT0gbV9wcmltYXJ5VGlsZUNvdmVyYWdl
UmVjdDsKIH0KIAotdm9pZCBUaWxlQ29udHJvbGxlcjo6c2V0RXhwb3NlZFJlY3QoY29uc3QgRmxv
YXRSZWN0JiBleHBvc2VkUmVjdCkKK0Zsb2F0UmVjdCBUaWxlR3JpZDo6c2NhbGVkRXhwb3NlZFJl
Y3QoKSBjb25zdAogewotICAgIGlmIChtX2V4cG9zZWRSZWN0ID09IGV4cG9zZWRSZWN0KQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBtX2V4cG9zZWRSZWN0ID0gZXhwb3NlZFJlY3Q7Ci0gICAgc2V0
TmVlZHNSZXZhbGlkYXRlVGlsZXMoKTsKLX0KLQotRmxvYXRSZWN0IFRpbGVDb250cm9sbGVyOjpz
Y2FsZWRFeHBvc2VkUmVjdCgpIGNvbnN0Ci17Ci0gICAgRmxvYXRSZWN0IHNjYWxlZEV4cG9zZWRS
ZWN0ID0gbV9leHBvc2VkUmVjdDsKKyAgICBGbG9hdFJlY3Qgc2NhbGVkRXhwb3NlZFJlY3QgPSBt
X2NvbnRyb2xsZXIuZXhwb3NlZFJlY3QoKTsKICAgICBzY2FsZWRFeHBvc2VkUmVjdC5zY2FsZSgx
IC8gbV9zY2FsZSk7CiAgICAgcmV0dXJuIHNjYWxlZEV4cG9zZWRSZWN0OwogfQogCi12b2lkIFRp
bGVDb250cm9sbGVyOjpwcmVwb3B1bGF0ZVJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0KQorYm9v
bCBUaWxlR3JpZDo6cHJlcG9wdWxhdGVSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKIHsKICAg
ICBGbG9hdFJlY3Qgc2NhbGVkUmVjdChyZWN0KTsKICAgICBzY2FsZWRSZWN0LnNjYWxlKG1fc2Nh
bGUpOwogICAgIEludFJlY3QgcmVjdEluVGlsZUNvb3JkcyhlbmNsb3NpbmdJbnRSZWN0KHNjYWxl
ZFJlY3QpKTsKIAogICAgIGlmIChtX3ByaW1hcnlUaWxlQ292ZXJhZ2VSZWN0LmNvbnRhaW5zKHJl
Y3RJblRpbGVDb29yZHMpKQotICAgICAgICByZXR1cm47CisgICAgICAgIHJldHVybiBmYWxzZTsK
ICAgICAKICAgICBtX3NlY29uZGFyeVRpbGVDb3ZlcmFnZVJlY3RzLmFwcGVuZChyZWN0KTsKLSAg
ICBzZXROZWVkc1JldmFsaWRhdGVUaWxlcygpOwotfQotCi12b2lkIFRpbGVDb250cm9sbGVyOjpz
ZXRJc0luV2luZG93KGJvb2wgaXNJbldpbmRvdykKLXsKLSAgICBpZiAobV9pc0luV2luZG93ID09
IGlzSW5XaW5kb3cpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1faXNJbldpbmRvdyA9IGlzSW5X
aW5kb3c7Ci0KLSAgICBpZiAobV9pc0luV2luZG93KQotICAgICAgICBzZXROZWVkc1JldmFsaWRh
dGVUaWxlcygpOwotICAgIGVsc2UgewotICAgICAgICBjb25zdCBkb3VibGUgdGlsZVJldmFsaWRh
dGlvblRpbWVvdXQgPSA0OwotICAgICAgICBzY2hlZHVsZVRpbGVSZXZhbGlkYXRpb24odGlsZVJl
dmFsaWRhdGlvblRpbWVvdXQpOwotICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBU
aWxlQ29udHJvbGxlcjo6c2V0VGlsZUNvdmVyYWdlKFRpbGVDb3ZlcmFnZSBjb3ZlcmFnZSkKK3Zv
aWQgVGlsZUdyaWQ6OmFkanVzdFJlY3RBdFRpbGVJbmRleEZvck1hcmdpbihjb25zdCBUaWxlSW5k
ZXgmIHRpbGVJbmRleCwgSW50UmVjdCYgcmVjdCkgY29uc3QKIHsKLSAgICBpZiAoY292ZXJhZ2Ug
PT0gbV90aWxlQ292ZXJhZ2UpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fdGlsZUNvdmVyYWdl
ID0gY292ZXJhZ2U7Ci0gICAgc2V0TmVlZHNSZXZhbGlkYXRlVGlsZXMoKTsKLX0KLQotdm9pZCBU
aWxlQ29udHJvbGxlcjo6cmV2YWxpZGF0ZVRpbGVzKCkKLXsKLSAgICBBU1NFUlQob3duaW5nR3Jh
cGhpY3NMYXllcigpLT5pc0NvbW1pdHRpbmdDaGFuZ2VzKCkpOwotICAgIHJldmFsaWRhdGVUaWxl
cygwLCAwKTsKLX0KLQotdm9pZCBUaWxlQ29udHJvbGxlcjo6Zm9yY2VSZXBhaW50KCkKLXsKLSAg
ICBzZXROZWVkc0Rpc3BsYXkoKTsKLX0KLQotdm9pZCBUaWxlQ29udHJvbGxlcjo6c2V0VGlsZURl
YnVnQm9yZGVyV2lkdGgoZmxvYXQgYm9yZGVyV2lkdGgpCi17Ci0gICAgaWYgKG1fdGlsZURlYnVn
Qm9yZGVyV2lkdGggPT0gYm9yZGVyV2lkdGgpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fdGls
ZURlYnVnQm9yZGVyV2lkdGggPSBib3JkZXJXaWR0aDsKLSAgICBmb3IgKFRpbGVNYXA6OmNvbnN0
X2l0ZXJhdG9yIGl0ID0gbV90aWxlcy5iZWdpbigpLCBlbmQgPSBtX3RpbGVzLmVuZCgpOyBpdCAh
PSBlbmQ7ICsraXQpIHsKLSAgICAgICAgY29uc3QgVGlsZUluZm8mIHRpbGVJbmZvID0gaXQtPnZh
bHVlOwotICAgICAgICB0aWxlSW5mby5sYXllci0+c2V0Qm9yZGVyV2lkdGgobV90aWxlRGVidWdC
b3JkZXJXaWR0aCk7Ci0gICAgfQotfQotCi12b2lkIFRpbGVDb250cm9sbGVyOjpzZXRUaWxlRGVi
dWdCb3JkZXJDb2xvcihDb2xvciBib3JkZXJDb2xvcikKLXsKLSAgICBpZiAobV90aWxlRGVidWdC
b3JkZXJDb2xvciA9PSBib3JkZXJDb2xvcikKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV90aWxl
RGVidWdCb3JkZXJDb2xvciA9IGJvcmRlckNvbG9yOwotICAgIGZvciAoVGlsZU1hcDo6Y29uc3Rf
aXRlcmF0b3IgaXQgPSBtX3RpbGVzLmJlZ2luKCksIGVuZCA9IG1fdGlsZXMuZW5kKCk7IGl0ICE9
IGVuZDsgKytpdCkKLSAgICAgICAgaXQtPnZhbHVlLmxheWVyLT5zZXRCb3JkZXJDb2xvcihib3Jk
ZXJDb2xvcik7Ci19Ci0KLUludFJlY3QgVGlsZUNvbnRyb2xsZXI6OmJvdW5kcygpIGNvbnN0Ci17
Ci0gICAgSW50UG9pbnQgYm91bmRzT3JpZ2luSW5jbHVkaW5nTWFyZ2luKC1sZWZ0TWFyZ2luV2lk
dGgoKSwgLXRvcE1hcmdpbkhlaWdodCgpKTsKLSAgICBJbnRTaXplIGJvdW5kc1NpemVJbmNsdWRp
bmdNYXJnaW4gPSBleHBhbmRlZEludFNpemUobV90aWxlQ2FjaGVMYXllci0+Ym91bmRzKCkuc2l6
ZSgpKTsKLSAgICBib3VuZHNTaXplSW5jbHVkaW5nTWFyZ2luLmV4cGFuZChsZWZ0TWFyZ2luV2lk
dGgoKSArIHJpZ2h0TWFyZ2luV2lkdGgoKSwgdG9wTWFyZ2luSGVpZ2h0KCkgKyBib3R0b21NYXJn
aW5IZWlnaHQoKSk7Ci0KLSAgICByZXR1cm4gSW50UmVjdChib3VuZHNPcmlnaW5JbmNsdWRpbmdN
YXJnaW4sIGJvdW5kc1NpemVJbmNsdWRpbmdNYXJnaW4pOwotfQotCi1JbnRSZWN0IFRpbGVDb250
cm9sbGVyOjpib3VuZHNXaXRob3V0TWFyZ2luKCkgY29uc3QKLXsKLSAgICByZXR1cm4gSW50UmVj
dChJbnRQb2ludCgpLCBleHBhbmRlZEludFNpemUobV90aWxlQ2FjaGVMYXllci0+Ym91bmRzKCku
c2l6ZSgpKSk7Ci19Ci0KLUludFJlY3QgVGlsZUNvbnRyb2xsZXI6OmJvdW5kc0F0TGFzdFJldmFs
aWRhdGVXaXRob3V0TWFyZ2luKCkgY29uc3QKLXsKLSAgICBJbnRSZWN0IGJvdW5kc1dpdGhvdXRN
YXJnaW4gPSBJbnRSZWN0KEludFBvaW50KCksIG1fYm91bmRzQXRMYXN0UmV2YWxpZGF0ZS5zaXpl
KCkpOwotICAgIGJvdW5kc1dpdGhvdXRNYXJnaW4uY29udHJhY3QoSW50U2l6ZShsZWZ0TWFyZ2lu
V2lkdGgoKSArIHJpZ2h0TWFyZ2luV2lkdGgoKSwgdG9wTWFyZ2luSGVpZ2h0KCkgKyBib3R0b21N
YXJnaW5IZWlnaHQoKSkpOwotICAgIHJldHVybiBib3VuZHNXaXRob3V0TWFyZ2luOwotfQotCi12
b2lkIFRpbGVDb250cm9sbGVyOjphZGp1c3RSZWN0QXRUaWxlSW5kZXhGb3JNYXJnaW4oY29uc3Qg
VGlsZUluZGV4JiB0aWxlSW5kZXgsIEludFJlY3QmIHJlY3QpIGNvbnN0Ci17Ci0gICAgaWYgKCFo
YXNNYXJnaW5zKCkpCisgICAgaWYgKCFtX2NvbnRyb2xsZXIuaGFzTWFyZ2lucygpKQogICAgICAg
ICByZXR1cm47CiAKICAgICAvLyBUaGlzIGlzIGEgdGlsZSBpbiB0aGUgdG9wIG1hcmdpbi4KLSAg
ICBpZiAobV9tYXJnaW5Ub3AgJiYgdGlsZUluZGV4LnkoKSA8IDApIHsKLSAgICAgICAgcmVjdC5z
ZXRZKHRpbGVJbmRleC55KCkgKiB0b3BNYXJnaW5IZWlnaHQoKSk7Ci0gICAgICAgIHJlY3Quc2V0
SGVpZ2h0KHRvcE1hcmdpbkhlaWdodCgpKTsKKyAgICBpZiAobV9jb250cm9sbGVyLnRvcE1hcmdp
bkhlaWdodCgpICYmIHRpbGVJbmRleC55KCkgPCAwKSB7CisgICAgICAgIHJlY3Quc2V0WSh0aWxl
SW5kZXgueSgpICogbV9jb250cm9sbGVyLnRvcE1hcmdpbkhlaWdodCgpKTsKKyAgICAgICAgcmVj
dC5zZXRIZWlnaHQobV9jb250cm9sbGVyLnRvcE1hcmdpbkhlaWdodCgpKTsKICAgICB9CiAKICAg
ICAvLyBUaGlzIGlzIGEgdGlsZSBpbiB0aGUgbGVmdCBtYXJnaW4uCi0gICAgaWYgKG1fbWFyZ2lu
TGVmdCAmJiB0aWxlSW5kZXgueCgpIDwgMCkgewotICAgICAgICByZWN0LnNldFgodGlsZUluZGV4
LngoKSAqIGxlZnRNYXJnaW5XaWR0aCgpKTsKLSAgICAgICAgcmVjdC5zZXRXaWR0aChsZWZ0TWFy
Z2luV2lkdGgoKSk7CisgICAgaWYgKG1fY29udHJvbGxlci5sZWZ0TWFyZ2luV2lkdGgoKSAmJiB0
aWxlSW5kZXgueCgpIDwgMCkgeworICAgICAgICByZWN0LnNldFgodGlsZUluZGV4LngoKSAqIG1f
Y29udHJvbGxlci5sZWZ0TWFyZ2luV2lkdGgoKSk7CisgICAgICAgIHJlY3Quc2V0V2lkdGgobV9j
b250cm9sbGVyLmxlZnRNYXJnaW5XaWR0aCgpKTsKICAgICB9CiAKICAgICBUaWxlSW5kZXggY29u
dGVudFRvcExlZnQ7CiAgICAgVGlsZUluZGV4IGNvbnRlbnRCb3R0b21SaWdodDsKLSAgICBnZXRU
aWxlSW5kZXhSYW5nZUZvclJlY3QoYm91bmRzV2l0aG91dE1hcmdpbigpLCBjb250ZW50VG9wTGVm
dCwgY29udGVudEJvdHRvbVJpZ2h0KTsKKyAgICBnZXRUaWxlSW5kZXhSYW5nZUZvclJlY3QobV9j
b250cm9sbGVyLmJvdW5kc1dpdGhvdXRNYXJnaW4oKSwgY29udGVudFRvcExlZnQsIGNvbnRlbnRC
b3R0b21SaWdodCk7CiAKICAgICAvLyBUaGlzIGlzIGEgdGlsZSBpbiB0aGUgYm90dG9tIG1hcmdp
bi4KLSAgICBpZiAobV9tYXJnaW5Cb3R0b20gJiYgdGlsZUluZGV4LnkoKSA+IGNvbnRlbnRCb3R0
b21SaWdodC55KCkpCi0gICAgICAgIHJlY3Quc2V0SGVpZ2h0KGJvdHRvbU1hcmdpbkhlaWdodCgp
KTsKKyAgICBpZiAobV9jb250cm9sbGVyLmJvdHRvbU1hcmdpbkhlaWdodCgpICYmIHRpbGVJbmRl
eC55KCkgPiBjb250ZW50Qm90dG9tUmlnaHQueSgpKQorICAgICAgICByZWN0LnNldEhlaWdodCht
X2NvbnRyb2xsZXIuYm90dG9tTWFyZ2luSGVpZ2h0KCkpOwogCiAgICAgLy8gVGhpcyBpcyBhIHRp
bGUgaW4gdGhlIHJpZ2h0IG1hcmdpbi4KLSAgICBpZiAobV9tYXJnaW5SaWdodCAmJiB0aWxlSW5k
ZXgueCgpID4gY29udGVudEJvdHRvbVJpZ2h0LngoKSkKLSAgICAgICAgcmVjdC5zZXRXaWR0aChy
aWdodE1hcmdpbldpZHRoKCkpOworICAgIGlmIChtX2NvbnRyb2xsZXIucmlnaHRNYXJnaW5XaWR0
aCgpICAmJiB0aWxlSW5kZXgueCgpID4gY29udGVudEJvdHRvbVJpZ2h0LngoKSkKKyAgICAgICAg
cmVjdC5zZXRXaWR0aChtX2NvbnRyb2xsZXIucmlnaHRNYXJnaW5XaWR0aCgpKTsKIH0KIAotSW50
UmVjdCBUaWxlQ29udHJvbGxlcjo6cmVjdEZvclRpbGVJbmRleChjb25zdCBUaWxlSW5kZXgmIHRp
bGVJbmRleCkgY29uc3QKK0ludFJlY3QgVGlsZUdyaWQ6OnJlY3RGb3JUaWxlSW5kZXgoY29uc3Qg
VGlsZUluZGV4JiB0aWxlSW5kZXgpIGNvbnN0CiB7Ci0gICAgSW50UmVjdCByZWN0KHRpbGVJbmRl
eC54KCkgKiBtX3RpbGVTaXplLndpZHRoKCksIHRpbGVJbmRleC55KCkgKiBtX3RpbGVTaXplLmhl
aWdodCgpLCBtX3RpbGVTaXplLndpZHRoKCksIG1fdGlsZVNpemUuaGVpZ2h0KCkpOwotICAgIElu
dFJlY3Qgc2NhbGVkQm91bmRzKGJvdW5kcygpKTsKKyAgICBJbnRTaXplIHRpbGVTaXplID0gbV9j
b250cm9sbGVyLnRpbGVTaXplKCk7CisgICAgSW50UmVjdCByZWN0KHRpbGVJbmRleC54KCkgKiB0
aWxlU2l6ZS53aWR0aCgpLCB0aWxlSW5kZXgueSgpICogdGlsZVNpemUuaGVpZ2h0KCksIHRpbGVT
aXplLndpZHRoKCksIHRpbGVTaXplLmhlaWdodCgpKTsKKyAgICBJbnRSZWN0IHNjYWxlZEJvdW5k
cyhtX2NvbnRyb2xsZXIuYm91bmRzKCkpOwogICAgIHNjYWxlZEJvdW5kcy5zY2FsZShtX3NjYWxl
KTsKIAogICAgIHJlY3QuaW50ZXJzZWN0KHNjYWxlZEJvdW5kcyk7CkBAIC00NjEsOTUgKzI1MSwz
MSBAQCBJbnRSZWN0IFRpbGVDb250cm9sbGVyOjpyZWN0Rm9yVGlsZUluZGV4CiAgICAgcmV0dXJu
IHJlY3Q7CiB9CiAKLXZvaWQgVGlsZUNvbnRyb2xsZXI6OmdldFRpbGVJbmRleFJhbmdlRm9yUmVj
dChjb25zdCBJbnRSZWN0JiByZWN0LCBUaWxlSW5kZXgmIHRvcExlZnQsIFRpbGVJbmRleCYgYm90
dG9tUmlnaHQpIGNvbnN0Cit2b2lkIFRpbGVHcmlkOjpnZXRUaWxlSW5kZXhSYW5nZUZvclJlY3Qo
Y29uc3QgSW50UmVjdCYgcmVjdCwgVGlsZUluZGV4JiB0b3BMZWZ0LCBUaWxlSW5kZXgmIGJvdHRv
bVJpZ2h0KSBjb25zdAogewotICAgIEludFJlY3QgY2xhbXBlZFJlY3QgPSBib3VuZHMoKTsKKyAg
ICBJbnRSZWN0IGNsYW1wZWRSZWN0ID0gbV9jb250cm9sbGVyLmJvdW5kcygpOwogICAgIGNsYW1w
ZWRSZWN0LnNjYWxlKG1fc2NhbGUpOwogICAgIGNsYW1wZWRSZWN0LmludGVyc2VjdChyZWN0KTsK
IAorICAgIGF1dG8gdGlsZVNpemUgPSBtX2NvbnRyb2xsZXIudGlsZVNpemUoKTsKICAgICBpZiAo
Y2xhbXBlZFJlY3QueCgpID49IDApCi0gICAgICAgIHRvcExlZnQuc2V0WChjbGFtcGVkUmVjdC54
KCkgLyBtX3RpbGVTaXplLndpZHRoKCkpOworICAgICAgICB0b3BMZWZ0LnNldFgoY2xhbXBlZFJl
Y3QueCgpIC8gdGlsZVNpemUud2lkdGgoKSk7CiAgICAgZWxzZQotICAgICAgICB0b3BMZWZ0LnNl
dFgoZmxvb3JmKChmbG9hdCljbGFtcGVkUmVjdC54KCkgLyBsZWZ0TWFyZ2luV2lkdGgoKSkpOwor
ICAgICAgICB0b3BMZWZ0LnNldFgoZmxvb3JmKChmbG9hdCljbGFtcGVkUmVjdC54KCkgLyBtX2Nv
bnRyb2xsZXIubGVmdE1hcmdpbldpZHRoKCkpKTsKIAogICAgIGlmIChjbGFtcGVkUmVjdC55KCkg
Pj0gMCkKLSAgICAgICAgdG9wTGVmdC5zZXRZKGNsYW1wZWRSZWN0LnkoKSAvIG1fdGlsZVNpemUu
aGVpZ2h0KCkpOworICAgICAgICB0b3BMZWZ0LnNldFkoY2xhbXBlZFJlY3QueSgpIC8gdGlsZVNp
emUuaGVpZ2h0KCkpOwogICAgIGVsc2UKLSAgICAgICAgdG9wTGVmdC5zZXRZKGZsb29yZigoZmxv
YXQpY2xhbXBlZFJlY3QueSgpIC8gdG9wTWFyZ2luSGVpZ2h0KCkpKTsKKyAgICAgICAgdG9wTGVm
dC5zZXRZKGZsb29yZigoZmxvYXQpY2xhbXBlZFJlY3QueSgpIC8gbV9jb250cm9sbGVyLnRvcE1h
cmdpbkhlaWdodCgpKSk7CiAKLSAgICBpbnQgYm90dG9tWFJhdGlvID0gY2VpbCgoZmxvYXQpY2xh
bXBlZFJlY3QubWF4WCgpIC8gbV90aWxlU2l6ZS53aWR0aCgpKTsKKyAgICBpbnQgYm90dG9tWFJh
dGlvID0gY2VpbCgoZmxvYXQpY2xhbXBlZFJlY3QubWF4WCgpIC8gdGlsZVNpemUud2lkdGgoKSk7
CiAgICAgYm90dG9tUmlnaHQuc2V0WChzdGQ6Om1heChib3R0b21YUmF0aW8gLSAxLCAwKSk7CiAK
LSAgICBpbnQgYm90dG9tWVJhdGlvID0gY2VpbCgoZmxvYXQpY2xhbXBlZFJlY3QubWF4WSgpIC8g
bV90aWxlU2l6ZS5oZWlnaHQoKSk7CisgICAgaW50IGJvdHRvbVlSYXRpbyA9IGNlaWwoKGZsb2F0
KWNsYW1wZWRSZWN0Lm1heFkoKSAvIHRpbGVTaXplLmhlaWdodCgpKTsKICAgICBib3R0b21SaWdo
dC5zZXRZKHN0ZDo6bWF4KGJvdHRvbVlSYXRpbyAtIDEsIDApKTsKIH0KIAotRmxvYXRSZWN0IFRp
bGVDb250cm9sbGVyOjpjb21wdXRlVGlsZUNvdmVyYWdlUmVjdChjb25zdCBGbG9hdFJlY3QmIHBy
ZXZpb3VzVmlzaWJsZVJlY3QsIGNvbnN0IEZsb2F0UmVjdCYgY3VycmVudFZpc2libGVSZWN0KSBj
b25zdAotewotICAgIEZsb2F0UmVjdCB2aXNpYmxlUmVjdCA9IGN1cnJlbnRWaXNpYmxlUmVjdDsK
LSAgICB2aXNpYmxlUmVjdC5pbnRlcnNlY3Qoc2NhbGVkRXhwb3NlZFJlY3QoKSk7Ci0KLSAgICAv
LyBJZiB0aGUgcGFnZSBpcyBub3QgaW4gYSB3aW5kb3cgKGZvciBleGFtcGxlIGlmIGl0J3MgaW4g
YSBiYWNrZ3JvdW5kIHRhYiksIHdlIGxpbWl0IHRoZSB0aWxlIGNvdmVyYWdlIHJlY3QgdG8gdGhl
IHZpc2libGUgcmVjdC4KLSAgICBpZiAoIW1faXNJbldpbmRvdykKLSAgICAgICAgcmV0dXJuIHZp
c2libGVSZWN0OwotCi0gICAgLy8gRklYTUU6IGxvb2sgYXQgaG93IGZhciB0aGUgZG9jdW1lbnQg
Y2FuIHNjcm9sbCBpbiBlYWNoIGRpbWVuc2lvbi4KLSAgICBmbG9hdCBjb3ZlcmFnZUhvcml6b250
YWxTaXplID0gdmlzaWJsZVJlY3Qud2lkdGgoKTsKLSAgICBmbG9hdCBjb3ZlcmFnZVZlcnRpY2Fs
U2l6ZSA9IHZpc2libGVSZWN0LmhlaWdodCgpOwotCi0jaWYgUExBVEZPUk0oSU9TKQotICAgIFVO
VVNFRF9QQVJBTShwcmV2aW91c1Zpc2libGVSZWN0KTsKLSAgICByZXR1cm4gdmlzaWJsZVJlY3Q7
Ci0jZWxzZQotICAgIGJvb2wgbGFyZ2VWaXNpYmxlUmVjdENoYW5nZSA9ICFwcmV2aW91c1Zpc2li
bGVSZWN0LmlzRW1wdHkoKSAmJiAhdmlzaWJsZVJlY3QuaW50ZXJzZWN0cyhwcmV2aW91c1Zpc2li
bGVSZWN0KTsKLQotICAgIC8vIEluZmxhdGUgdGhlIGNvdmVyYWdlIHJlY3Qgc28gdGhhdCBpdCBj
b3ZlcnMgMnggb2YgdGhlIHZpc2libGUgd2lkdGggYW5kIDN4IG9mIHRoZSB2aXNpYmxlIGhlaWdo
dC4KLSAgICAvLyBUaGVzZSB2YWx1ZXMgd2VyZSBjaG9zZW4gYmVjYXVzZSBpdCdzIG1vcmUgY29t
bW9uIHRvIGhhdmUgdGFsbCBwYWdlcyBhbmQgdG8gc2Nyb2xsIHZlcnRpY2FsbHksCi0gICAgLy8g
c28gd2Uga2VlcCBtb3JlIHRpbGVzIGFib3ZlIGFuZCBiZWxvdyB0aGUgY3VycmVudCBhcmVhLgot
Ci0gICAgaWYgKG1fdGlsZUNvdmVyYWdlICYgQ292ZXJhZ2VGb3JIb3Jpem9udGFsU2Nyb2xsaW5n
ICYmICFsYXJnZVZpc2libGVSZWN0Q2hhbmdlKQotICAgICAgICBjb3ZlcmFnZUhvcml6b250YWxT
aXplICo9IDI7Ci0KLSAgICBpZiAobV90aWxlQ292ZXJhZ2UgJiBDb3ZlcmFnZUZvclZlcnRpY2Fs
U2Nyb2xsaW5nICYmICFsYXJnZVZpc2libGVSZWN0Q2hhbmdlKQotICAgICAgICBjb3ZlcmFnZVZl
cnRpY2FsU2l6ZSAqPSAzOwotI2VuZGlmCi0gICAgY292ZXJhZ2VWZXJ0aWNhbFNpemUgKz0gdG9w
TWFyZ2luSGVpZ2h0KCkgKyBib3R0b21NYXJnaW5IZWlnaHQoKTsKLSAgICBjb3ZlcmFnZUhvcml6
b250YWxTaXplICs9IGxlZnRNYXJnaW5XaWR0aCgpICsgcmlnaHRNYXJnaW5XaWR0aCgpOwotCi0g
ICAgRmxvYXRSZWN0IGNvdmVyYWdlQm91bmRzID0gYm91bmRzKCk7Ci0gICAgZmxvYXQgY292ZXJh
Z2VMZWZ0ID0gdmlzaWJsZVJlY3QueCgpIC0gKGNvdmVyYWdlSG9yaXpvbnRhbFNpemUgLSB2aXNp
YmxlUmVjdC53aWR0aCgpKSAvIDI7Ci0gICAgY292ZXJhZ2VMZWZ0ID0gc3RkOjptaW4oY292ZXJh
Z2VMZWZ0LCBjb3ZlcmFnZUJvdW5kcy5tYXhYKCkgLSBjb3ZlcmFnZUhvcml6b250YWxTaXplKTsK
LSAgICBjb3ZlcmFnZUxlZnQgPSBzdGQ6Om1heChjb3ZlcmFnZUxlZnQsIGNvdmVyYWdlQm91bmRz
LngoKSk7Ci0KLSAgICBmbG9hdCBjb3ZlcmFnZVRvcCA9IHZpc2libGVSZWN0LnkoKSAtIChjb3Zl
cmFnZVZlcnRpY2FsU2l6ZSAtIHZpc2libGVSZWN0LmhlaWdodCgpKSAvIDI7Ci0gICAgY292ZXJh
Z2VUb3AgPSBzdGQ6Om1pbihjb3ZlcmFnZVRvcCwgY292ZXJhZ2VCb3VuZHMubWF4WSgpIC0gY292
ZXJhZ2VWZXJ0aWNhbFNpemUpOwotICAgIGNvdmVyYWdlVG9wID0gc3RkOjptYXgoY292ZXJhZ2VU
b3AsIGNvdmVyYWdlQm91bmRzLnkoKSk7Ci0KLSAgICByZXR1cm4gRmxvYXRSZWN0KGNvdmVyYWdl
TGVmdCwgY292ZXJhZ2VUb3AsIGNvdmVyYWdlSG9yaXpvbnRhbFNpemUsIGNvdmVyYWdlVmVydGlj
YWxTaXplKTsKLX0KLQotdm9pZCBUaWxlQ29udHJvbGxlcjo6c2NoZWR1bGVUaWxlUmV2YWxpZGF0
aW9uKGRvdWJsZSBpbnRlcnZhbCkKLXsKLSAgICBpZiAobV90aWxlUmV2YWxpZGF0aW9uVGltZXIu
aXNBY3RpdmUoKSAmJiBtX3RpbGVSZXZhbGlkYXRpb25UaW1lci5uZXh0RmlyZUludGVydmFsKCkg
PCBpbnRlcnZhbCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV90aWxlUmV2YWxpZGF0aW9uVGlt
ZXIuc3RhcnRPbmVTaG90KGludGVydmFsKTsKLX0KLQotdm9pZCBUaWxlQ29udHJvbGxlcjo6dGls
ZVJldmFsaWRhdGlvblRpbWVyRmlyZWQoVGltZXI8VGlsZUNvbnRyb2xsZXI+KikKLXsKLSAgICBp
ZiAobV9pc0luV2luZG93KSB7Ci0gICAgICAgIHNldE5lZWRzUmV2YWxpZGF0ZVRpbGVzKCk7Ci0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBUaWxlVmFsaWRhdGlvblBvbGljeUZsYWdzIGZv
cmVncm91bmRWYWxpZGF0aW9uUG9saWN5ID0gb3duaW5nR3JhcGhpY3NMYXllcigpLT5wbGF0Zm9y
bUNBTGF5ZXJTaG91bGRBZ2dyZXNzaXZlbHlSZXRhaW5UaWxlcyhtX3RpbGVDYWNoZUxheWVyKSA/
IDAgOiBQcnVuZVNlY29uZGFyeVRpbGVzOwotICAgIFRpbGVWYWxpZGF0aW9uUG9saWN5RmxhZ3Mg
YmFja2dyb3VuZFZhbGlkYXRpb25Qb2xpY3kgPSBmb3JlZ3JvdW5kVmFsaWRhdGlvblBvbGljeSB8
IFVucGFyZW50QWxsVGlsZXM7Ci0KLSAgICByZXZhbGlkYXRlVGlsZXMoZm9yZWdyb3VuZFZhbGlk
YXRpb25Qb2xpY3ksIGJhY2tncm91bmRWYWxpZGF0aW9uUG9saWN5KTsKLX0KLQotdW5zaWduZWQg
VGlsZUNvbnRyb2xsZXI6OmJsYW5rUGl4ZWxDb3VudCgpIGNvbnN0Cit1bnNpZ25lZCBUaWxlR3Jp
ZDo6YmxhbmtQaXhlbENvdW50KCkgY29uc3QKIHsKICAgICBQbGF0Zm9ybUxheWVyTGlzdCB0aWxl
cyhtX3RpbGVzLnNpemUoKSk7CiAKQEAgLTU1OCw1MiArMjg0LDE3IEBAIHVuc2lnbmVkIFRpbGVD
b250cm9sbGVyOjpibGFua1BpeGVsQ291bnQKICAgICAgICAgICAgIHRpbGVzLmFwcGVuZChsYXll
cik7CiAgICAgfQogCi0gICAgcmV0dXJuIGJsYW5rUGl4ZWxDb3VudEZvclRpbGVzKHRpbGVzLCBt
X3Zpc2libGVSZWN0LCBJbnRQb2ludCgwLDApKTsKKyAgICByZXR1cm4gVGlsZUNvbnRyb2xsZXI6
OmJsYW5rUGl4ZWxDb3VudEZvclRpbGVzKHRpbGVzLCBtX2NvbnRyb2xsZXIudmlzaWJsZVJlY3Qo
KSwgSW50UG9pbnQoMCwwKSk7CiB9CiAKLXVuc2lnbmVkIFRpbGVDb250cm9sbGVyOjpibGFua1Bp
eGVsQ291bnRGb3JUaWxlcyhjb25zdCBQbGF0Zm9ybUxheWVyTGlzdCYgdGlsZXMsIGNvbnN0IEZs
b2F0UmVjdCYgdmlzaWJsZVJlY3QsIGNvbnN0IEludFBvaW50JiB0aWxlVHJhbnNsYXRpb24pCi17
Ci0gICAgUmVnaW9uIHBhaW50ZWRWaXNpYmxlVGlsZXM7Ci0KLSAgICBmb3IgKFBsYXRmb3JtTGF5
ZXJMaXN0Ojpjb25zdF9pdGVyYXRvciBpdCA9IHRpbGVzLmJlZ2luKCksIGVuZCA9IHRpbGVzLmVu
ZCgpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgY29uc3QgUGxhdGZvcm1MYXllciogdGls
ZUxheWVyID0gaXQtPmdldCgpOwotCi0gICAgICAgIEZsb2F0UmVjdCB2aXNpYmxlUGFydChDR1Jl
Y3RPZmZzZXQoW3RpbGVMYXllciBmcmFtZV0sIHRpbGVUcmFuc2xhdGlvbi54KCksIHRpbGVUcmFu
c2xhdGlvbi55KCkpKTsKLSAgICAgICAgdmlzaWJsZVBhcnQuaW50ZXJzZWN0KHZpc2libGVSZWN0
KTsKLQotICAgICAgICBpZiAoIXZpc2libGVQYXJ0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHBh
aW50ZWRWaXNpYmxlVGlsZXMudW5pdGUoZW5jbG9zaW5nSW50UmVjdCh2aXNpYmxlUGFydCkpOwot
ICAgIH0KLQotICAgIFJlZ2lvbiB1bmNvdmVyZWRSZWdpb24oZW5jbG9zaW5nSW50UmVjdCh2aXNp
YmxlUmVjdCkpOwotICAgIHVuY292ZXJlZFJlZ2lvbi5zdWJ0cmFjdChwYWludGVkVmlzaWJsZVRp
bGVzKTsKLQotICAgIHJldHVybiB1bmNvdmVyZWRSZWdpb24udG90YWxBcmVhKCk7Ci19Ci0KLXN0
YXRpYyBpbmxpbmUgdm9pZCBxdWV1ZVRpbGVGb3JSZW1vdmFsKGNvbnN0IFRpbGVDb250cm9sbGVy
OjpUaWxlSW5kZXgmIHRpbGVJbmRleCwgY29uc3QgVGlsZUNvbnRyb2xsZXI6OlRpbGVJbmZvJiB0
aWxlSW5mbywgVmVjdG9yPFRpbGVDb250cm9sbGVyOjpUaWxlSW5kZXg+JiB0aWxlc1RvUmVtb3Zl
LCBUaWxlQ29udHJvbGxlcjo6UmVwYWludENvdW50TWFwJiByZXBhaW50Q291bnRzKQorc3RhdGlj
IGlubGluZSB2b2lkIHF1ZXVlVGlsZUZvclJlbW92YWwoY29uc3QgVGlsZUdyaWQ6OlRpbGVJbmRl
eCYgdGlsZUluZGV4LCBjb25zdCBUaWxlR3JpZDo6VGlsZUluZm8mIHRpbGVJbmZvLCBWZWN0b3I8
VGlsZUdyaWQ6OlRpbGVJbmRleD4mIHRpbGVzVG9SZW1vdmUsIFRpbGVDb250cm9sbGVyOjpSZXBh
aW50Q291bnRNYXAmIHJlcGFpbnRDb3VudHMpCiB7CiAgICAgdGlsZUluZm8ubGF5ZXItPnJlbW92
ZUZyb21TdXBlcmxheWVyKCk7CiAgICAgcmVwYWludENvdW50cy5yZW1vdmUodGlsZUluZm8ubGF5
ZXIuZ2V0KCkpOwogICAgIHRpbGVzVG9SZW1vdmUuYXBwZW5kKHRpbGVJbmRleCk7CiB9CiAKLXZv
aWQgVGlsZUNvbnRyb2xsZXI6OnJlbW92ZUFsbFRpbGVzKCkKLXsKLSAgICBWZWN0b3I8VGlsZUlu
ZGV4PiB0aWxlc1RvUmVtb3ZlOwotCi0gICAgZm9yIChUaWxlTWFwOjppdGVyYXRvciBpdCA9IG1f
dGlsZXMuYmVnaW4oKSwgZW5kID0gbV90aWxlcy5lbmQoKTsgaXQgIT0gZW5kOyArK2l0KQotICAg
ICAgICBxdWV1ZVRpbGVGb3JSZW1vdmFsKGl0LT5rZXksIGl0LT52YWx1ZSwgdGlsZXNUb1JlbW92
ZSwgbV90aWxlUmVwYWludENvdW50cyk7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRp
bGVzVG9SZW1vdmUuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgVGlsZUluZm8gdGlsZUluZm8gPSBt
X3RpbGVzLnRha2UodGlsZXNUb1JlbW92ZVtpXSk7Ci0jaWYgIVBMQVRGT1JNKElPUykKLSAgICAg
ICAgTGF5ZXJQb29sOjpzaGFyZWRQb29sKCktPmFkZExheWVyKHRpbGVJbmZvLmxheWVyKTsKLSNl
bmRpZgotICAgIH0KLX0KLQotdm9pZCBUaWxlQ29udHJvbGxlcjo6cmVtb3ZlQWxsU2Vjb25kYXJ5
VGlsZXMoKQordm9pZCBUaWxlR3JpZDo6cmVtb3ZlQWxsU2Vjb25kYXJ5VGlsZXMoKQogewogICAg
IFZlY3RvcjxUaWxlSW5kZXg+IHRpbGVzVG9SZW1vdmU7CiAKQEAgLTYxMiw3ICszMDMsNyBAQCB2
b2lkIFRpbGVDb250cm9sbGVyOjpyZW1vdmVBbGxTZWNvbmRhcnlUCiAgICAgICAgIGlmICh0aWxl
SW5mby5jb2hvcnQgPT0gVmlzaWJsZVRpbGVDb2hvcnQpCiAgICAgICAgICAgICBjb250aW51ZTsK
IAotICAgICAgICBxdWV1ZVRpbGVGb3JSZW1vdmFsKGl0LT5rZXksIGl0LT52YWx1ZSwgdGlsZXNU
b1JlbW92ZSwgbV90aWxlUmVwYWludENvdW50cyk7CisgICAgICAgIHF1ZXVlVGlsZUZvclJlbW92
YWwoaXQtPmtleSwgaXQtPnZhbHVlLCB0aWxlc1RvUmVtb3ZlLCBtX2NvbnRyb2xsZXIucmVwYWlu
dENvdW50TWFwKCkpOwogICAgIH0KIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGlsZXNU
b1JlbW92ZS5zaXplKCk7ICsraSkgewpAQCAtNjIzLDcgKzMxNCw3IEBAIHZvaWQgVGlsZUNvbnRy
b2xsZXI6OnJlbW92ZUFsbFNlY29uZGFyeVQKICAgICB9CiB9CiAKLXZvaWQgVGlsZUNvbnRyb2xs
ZXI6OnJlbW92ZVRpbGVzSW5Db2hvcnQoVGlsZUNvaG9ydCBjb2hvcnQpCit2b2lkIFRpbGVHcmlk
OjpyZW1vdmVUaWxlc0luQ29ob3J0KFRpbGVDb2hvcnQgY29ob3J0KQogewogICAgIEFTU0VSVChj
b2hvcnQgIT0gVmlzaWJsZVRpbGVDb2hvcnQpOwogICAgIFZlY3RvcjxUaWxlSW5kZXg+IHRpbGVz
VG9SZW1vdmU7CkBAIC02MzMsNyArMzI0LDcgQEAgdm9pZCBUaWxlQ29udHJvbGxlcjo6cmVtb3Zl
VGlsZXNJbkNvaG9ydAogICAgICAgICBpZiAodGlsZUluZm8uY29ob3J0ICE9IGNvaG9ydCkKICAg
ICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgIHF1ZXVlVGlsZUZvclJlbW92YWwoaXQtPmtl
eSwgaXQtPnZhbHVlLCB0aWxlc1RvUmVtb3ZlLCBtX3RpbGVSZXBhaW50Q291bnRzKTsKKyAgICAg
ICAgcXVldWVUaWxlRm9yUmVtb3ZhbChpdC0+a2V5LCBpdC0+dmFsdWUsIHRpbGVzVG9SZW1vdmUs
IG1fY29udHJvbGxlci5yZXBhaW50Q291bnRNYXAoKSk7CiAgICAgfQogCiAgICAgZm9yIChzaXpl
X3QgaSA9IDA7IGkgPCB0aWxlc1RvUmVtb3ZlLnNpemUoKTsgKytpKSB7CkBAIC02NDQsMjQgKzMz
NSwxNyBAQCB2b2lkIFRpbGVDb250cm9sbGVyOjpyZW1vdmVUaWxlc0luQ29ob3J0CiAgICAgfQog
fQogCi12b2lkIFRpbGVDb250cm9sbGVyOjpzZXROZWVkc1JldmFsaWRhdGVUaWxlcygpCit2b2lk
IFRpbGVHcmlkOjpyZXZhbGlkYXRlVGlsZXMoVGlsZVZhbGlkYXRpb25Qb2xpY3lGbGFncyB2YWxp
ZGF0aW9uUG9saWN5KQogewotICAgIG93bmluZ0dyYXBoaWNzTGF5ZXIoKS0+cGxhdGZvcm1DQUxh
eWVyU2V0TmVlZHNUb1JldmFsaWRhdGVUaWxlcygpOwotfQotCi12b2lkIFRpbGVDb250cm9sbGVy
OjpyZXZhbGlkYXRlVGlsZXMoVGlsZVZhbGlkYXRpb25Qb2xpY3lGbGFncyBmb3JlZ3JvdW5kVmFs
aWRhdGlvblBvbGljeSwgVGlsZVZhbGlkYXRpb25Qb2xpY3lGbGFncyBiYWNrZ3JvdW5kVmFsaWRh
dGlvblBvbGljeSkKLXsKLSAgICBGbG9hdFJlY3QgdmlzaWJsZVJlY3QgPSBtX3Zpc2libGVSZWN0
OwotICAgIEludFJlY3QgYm91bmRzID0gdGhpcy0+Ym91bmRzKCk7CisgICAgRmxvYXRSZWN0IHZp
c2libGVSZWN0ID0gbV9jb250cm9sbGVyLnZpc2libGVSZWN0KCk7CisgICAgSW50UmVjdCBib3Vu
ZHMgPSBtX2NvbnRyb2xsZXIuYm91bmRzKCk7CiAKICAgICB2aXNpYmxlUmVjdC5pbnRlcnNlY3Qo
c2NhbGVkRXhwb3NlZFJlY3QoKSk7CiAKICAgICBpZiAodmlzaWJsZVJlY3QuaXNFbXB0eSgpIHx8
IGJvdW5kcy5pc0VtcHR5KCkpCiAgICAgICAgIHJldHVybjsKLSAgICAKLSAgICBUaWxlVmFsaWRh
dGlvblBvbGljeUZsYWdzIHZhbGlkYXRpb25Qb2xpY3kgPSBtX2lzSW5XaW5kb3cgPyBmb3JlZ3Jv
dW5kVmFsaWRhdGlvblBvbGljeSA6IGJhY2tncm91bmRWYWxpZGF0aW9uUG9saWN5OwotICAgIAot
ICAgIEZsb2F0UmVjdCB0aWxlQ292ZXJhZ2VSZWN0ID0gY29tcHV0ZVRpbGVDb3ZlcmFnZVJlY3Qo
bV92aXNpYmxlUmVjdEF0TGFzdFJldmFsaWRhdGUsIG1fdmlzaWJsZVJlY3QpOworCisgICAgRmxv
YXRSZWN0IHRpbGVDb3ZlcmFnZVJlY3QgPSBtX2NvbnRyb2xsZXIuY29tcHV0ZVRpbGVDb3ZlcmFn
ZVJlY3QobV9jb250cm9sbGVyLnZpc2libGVSZWN0QXRMYXN0UmV2YWxpZGF0ZSgpLCB2aXNpYmxl
UmVjdCk7CiAgICAgRmxvYXRSZWN0IHNjYWxlZFJlY3QodGlsZUNvdmVyYWdlUmVjdCk7CiAgICAg
c2NhbGVkUmVjdC5zY2FsZShtX3NjYWxlKTsKICAgICBJbnRSZWN0IGNvdmVyYWdlUmVjdEluVGls
ZUNvb3JkcyhlbmNsb3NpbmdJbnRSZWN0KHNjYWxlZFJlY3QpKTsKQEAgLTY4OSw3ICszNzMsNyBA
QCB2b2lkIFRpbGVDb250cm9sbGVyOjpyZXZhbGlkYXRlVGlsZXMoVGlsCiAgICAgICAgICAgICAg
ICAgdGlsZUluZm8uY29ob3J0ID0gY3VyckNvaG9ydDsKICAgICAgICAgICAgICAgICArK3RpbGVz
SW5Db2hvcnQ7CiAKLSAgICAgICAgICAgICAgICBpZiAobV91bnBhcmVudHNPZmZzY3JlZW5UaWxl
cykKKyAgICAgICAgICAgICAgICBpZiAobV9jb250cm9sbGVyLnVucGFyZW50c09mZnNjcmVlblRp
bGVzKCkpCiAgICAgICAgICAgICAgICAgICAgIHRpbGVMYXllci0+cmVtb3ZlRnJvbVN1cGVybGF5
ZXIoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNjk4LDggKzM4Miw4IEBAIHZvaWQg
VGlsZUNvbnRyb2xsZXI6OnJldmFsaWRhdGVUaWxlcyhUaWwKICAgICBpZiAodGlsZXNJbkNvaG9y
dCkKICAgICAgICAgc3RhcnRlZE5ld0NvaG9ydChjdXJyQ29ob3J0KTsKIAotICAgIGlmICghb3du
aW5nR3JhcGhpY3NMYXllcigpLT5wbGF0Zm9ybUNBTGF5ZXJTaG91bGRBZ2dyZXNzaXZlbHlSZXRh
aW5UaWxlcyhtX3RpbGVDYWNoZUxheWVyKSkgewotICAgICAgICBpZiAob3duaW5nR3JhcGhpY3NM
YXllcigpLT5wbGF0Zm9ybUNBTGF5ZXJTaG91bGRUZW1wb3JhcmlseVJldGFpblRpbGVDb2hvcnRz
KG1fdGlsZUNhY2hlTGF5ZXIpKQorICAgIGlmICghbV9jb250cm9sbGVyLnNob3VsZEFnZ3Jlc3Np
dmVseVJldGFpblRpbGVzKCkpIHsKKyAgICAgICAgaWYgKG1fY29udHJvbGxlci5zaG91bGRUZW1w
b3JhcmlseVJldGFpblRpbGVDb2hvcnRzKCkpCiAgICAgICAgICAgICBzY2hlZHVsZUNvaG9ydFJl
bW92YWwoKTsKICAgICAgICAgZWxzZSBpZiAodGlsZXNJbkNvaG9ydCkKICAgICAgICAgICAgIHJl
bW92ZVRpbGVzSW5Db2hvcnQoY3VyckNvaG9ydCk7CkBAIC03MTcsMjYgKzQwMSwyNyBAQCB2b2lk
IFRpbGVDb250cm9sbGVyOjpyZXZhbGlkYXRlVGlsZXMoVGlsCiAgICAgICAgIG1fc2Vjb25kYXJ5
VGlsZUNvdmVyYWdlUmVjdHMuY2xlYXIoKTsKICAgICB9CiAKLSAgICBpZiAobV91bnBhcmVudHNP
ZmZzY3JlZW5UaWxlcyAmJiAodmFsaWRhdGlvblBvbGljeSAmIFVucGFyZW50QWxsVGlsZXMpKSB7
CisgICAgaWYgKG1fY29udHJvbGxlci51bnBhcmVudHNPZmZzY3JlZW5UaWxlcygpICYmICh2YWxp
ZGF0aW9uUG9saWN5ICYgVW5wYXJlbnRBbGxUaWxlcykpIHsKICAgICAgICAgZm9yIChUaWxlTWFw
OjppdGVyYXRvciBpdCA9IG1fdGlsZXMuYmVnaW4oKSwgZW5kID0gbV90aWxlcy5lbmQoKTsgaXQg
IT0gZW5kOyArK2l0KQogICAgICAgICAgICAgaXQtPnZhbHVlLmxheWVyLT5yZW1vdmVGcm9tU3Vw
ZXJsYXllcigpOwogICAgIH0KIAotICAgIGlmIChtX2JvdW5kc0F0TGFzdFJldmFsaWRhdGUgIT0g
Ym91bmRzKSB7CisgICAgYXV0byBib3VuZHNBdExhc3RSZXZhbGlkYXRlID0gbV9jb250cm9sbGVy
LmJvdW5kc0F0TGFzdFJldmFsaWRhdGUoKTsKKyAgICBpZiAoYm91bmRzQXRMYXN0UmV2YWxpZGF0
ZSAhPSBib3VuZHMpIHsKICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG1hcmdpbiB0aWxlcyBhbmQg
dGhlIGJvdW5kcyBoYXZlIGdyb3duIHRhbGxlciBvciB3aWRlciwgdGhlbiB0aGUgdGlsZXMgdGhh
dCB1c2VkIHRvCiAgICAgICAgIC8vIGJlIGJvdHRvbSBvciByaWdodCBtYXJnaW4gdGlsZXMgbmVl
ZCB0byBiZSBpbnZhbGlkYXRlZC4KLSAgICAgICAgaWYgKGhhc01hcmdpbnMoKSkgewotICAgICAg
ICAgICAgaWYgKGJvdW5kcy53aWR0aCgpID4gbV9ib3VuZHNBdExhc3RSZXZhbGlkYXRlLndpZHRo
KCkgfHwgYm91bmRzLmhlaWdodCgpID4gbV9ib3VuZHNBdExhc3RSZXZhbGlkYXRlLmhlaWdodCgp
KSB7Ci0gICAgICAgICAgICAgICAgSW50UmVjdCBib3VuZHNXaXRob3V0TWFyZ2luID0gdGhpcy0+
Ym91bmRzV2l0aG91dE1hcmdpbigpOwotICAgICAgICAgICAgICAgIEludFJlY3Qgb2xkQm91bmRz
V2l0aG91dE1hcmdpbiA9IGJvdW5kc0F0TGFzdFJldmFsaWRhdGVXaXRob3V0TWFyZ2luKCk7Cisg
ICAgICAgIGlmIChtX2NvbnRyb2xsZXIuaGFzTWFyZ2lucygpKSB7CisgICAgICAgICAgICBpZiAo
Ym91bmRzLndpZHRoKCkgPiBib3VuZHNBdExhc3RSZXZhbGlkYXRlLndpZHRoKCkgfHwgYm91bmRz
LmhlaWdodCgpID4gYm91bmRzQXRMYXN0UmV2YWxpZGF0ZS5oZWlnaHQoKSkgeworICAgICAgICAg
ICAgICAgIEludFJlY3QgYm91bmRzV2l0aG91dE1hcmdpbiA9IG1fY29udHJvbGxlci5ib3VuZHNX
aXRob3V0TWFyZ2luKCk7CisgICAgICAgICAgICAgICAgSW50UmVjdCBvbGRCb3VuZHNXaXRob3V0
TWFyZ2luID0gbV9jb250cm9sbGVyLmJvdW5kc0F0TGFzdFJldmFsaWRhdGVXaXRob3V0TWFyZ2lu
KCk7CiAKLSAgICAgICAgICAgICAgICBpZiAoYm91bmRzLmhlaWdodCgpID4gbV9ib3VuZHNBdExh
c3RSZXZhbGlkYXRlLmhlaWdodCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGJvdW5kcy5oZWln
aHQoKSA+IGJvdW5kc0F0TGFzdFJldmFsaWRhdGUuaGVpZ2h0KCkpIHsKICAgICAgICAgICAgICAg
ICAgICAgSW50UmVjdCBmb3JtZXJCb3R0b21NYXJnaW5SZWN0ID0gSW50UmVjdChvbGRCb3VuZHNX
aXRob3V0TWFyZ2luLngoKSwgb2xkQm91bmRzV2l0aG91dE1hcmdpbi5oZWlnaHQoKSwKICAgICAg
ICAgICAgICAgICAgICAgICAgIG9sZEJvdW5kc1dpdGhvdXRNYXJnaW4ud2lkdGgoKSwgYm91bmRz
V2l0aG91dE1hcmdpbi5oZWlnaHQoKSAtIG9sZEJvdW5kc1dpdGhvdXRNYXJnaW4uaGVpZ2h0KCkp
OwogICAgICAgICAgICAgICAgICAgICBzZXROZWVkc0Rpc3BsYXlJblJlY3QoZm9ybWVyQm90dG9t
TWFyZ2luUmVjdCk7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKGJv
dW5kcy53aWR0aCgpID4gbV9ib3VuZHNBdExhc3RSZXZhbGlkYXRlLndpZHRoKCkpIHsKKyAgICAg
ICAgICAgICAgICBpZiAoYm91bmRzLndpZHRoKCkgPiBib3VuZHNBdExhc3RSZXZhbGlkYXRlLndp
ZHRoKCkpIHsKICAgICAgICAgICAgICAgICAgICAgSW50UmVjdCBmb3JtZXJSaWdodE1hcmdpblJl
Y3QgPSBJbnRSZWN0KG9sZEJvdW5kc1dpdGhvdXRNYXJnaW4ud2lkdGgoKSwgb2xkQm91bmRzV2l0
aG91dE1hcmdpbi55KCksCiAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHNXaXRob3V0TWFy
Z2luLndpZHRoKCkgLSBvbGRCb3VuZHNXaXRob3V0TWFyZ2luLndpZHRoKCksIG9sZEJvdW5kc1dp
dGhvdXRNYXJnaW4uaGVpZ2h0KCkpOwogICAgICAgICAgICAgICAgICAgICBzZXROZWVkc0Rpc3Bs
YXlJblJlY3QoZm9ybWVyUmlnaHRNYXJnaW5SZWN0KTsKQEAgLTc1OSw3ICs0NDQsNyBAQCB2b2lk
IFRpbGVDb250cm9sbGVyOjpyZXZhbGlkYXRlVGlsZXMoVGlsCiAgICAgICAgICAgICAgICAgfHwg
aW5kZXgueSgpID4gYm90dG9tUmlnaHRGb3JCb3VuZHMueSgpCiAgICAgICAgICAgICAgICAgfHwg
aW5kZXgueCgpIDwgdG9wTGVmdEZvckJvdW5kcy54KCkKICAgICAgICAgICAgICAgICB8fCBpbmRl
eC54KCkgPiBib3R0b21SaWdodEZvckJvdW5kcy54KCkpCi0gICAgICAgICAgICAgICAgcXVldWVU
aWxlRm9yUmVtb3ZhbChpbmRleCwgaXQtPnZhbHVlLCB0aWxlc1RvUmVtb3ZlLCBtX3RpbGVSZXBh
aW50Q291bnRzKTsKKyAgICAgICAgICAgICAgICBxdWV1ZVRpbGVGb3JSZW1vdmFsKGluZGV4LCBp
dC0+dmFsdWUsIHRpbGVzVG9SZW1vdmUsIG1fY29udHJvbGxlci5yZXBhaW50Q291bnRNYXAoKSk7
CiAgICAgICAgIH0KIAogICAgICAgICBmb3IgKHNpemVfdCBpID0gMCwgc2l6ZSA9IHRpbGVzVG9S
ZW1vdmUuc2l6ZSgpOyBpIDwgc2l6ZTsgKytpKSB7CkBAIC03NzAsMTQgKzQ1NSwxMCBAQCB2b2lk
IFRpbGVDb250cm9sbGVyOjpyZXZhbGlkYXRlVGlsZXMoVGlsCiAgICAgICAgIH0KICAgICB9CiAK
LSAgICBpZiAobV90aWxlZFNjcm9sbGluZ0luZGljYXRvckxheWVyKQotICAgICAgICB1cGRhdGVU
aWxlQ292ZXJhZ2VNYXAoKTsKLQotICAgIG1fdmlzaWJsZVJlY3RBdExhc3RSZXZhbGlkYXRlID0g
dmlzaWJsZVJlY3Q7Ci0gICAgbV9ib3VuZHNBdExhc3RSZXZhbGlkYXRlID0gYm91bmRzOworICAg
IG1fY29udHJvbGxlci5kaWRSZXZhbGlkYXRlVGlsZXMoKTsKIH0KIAotVGlsZUNvbnRyb2xsZXI6
OlRpbGVDb2hvcnQgVGlsZUNvbnRyb2xsZXI6Om5leHRUaWxlQ29ob3J0KCkgY29uc3QKK1RpbGVH
cmlkOjpUaWxlQ29ob3J0IFRpbGVHcmlkOjpuZXh0VGlsZUNvaG9ydCgpIGNvbnN0CiB7CiAgICAg
aWYgKCFtX2NvaG9ydExpc3QuaXNFbXB0eSgpKQogICAgICAgICByZXR1cm4gbV9jb2hvcnRMaXN0
Lmxhc3QoKS5jb2hvcnQgKyAxOwpAQCAtNzg1LDI2ICs0NjYsMjYgQEAgVGlsZUNvbnRyb2xsZXI6
OlRpbGVDb2hvcnQgVGlsZUNvbnRyb2xsZQogICAgIHJldHVybiAxOwogfQogCi12b2lkIFRpbGVD
b250cm9sbGVyOjpzdGFydGVkTmV3Q29ob3J0KFRpbGVDb2hvcnQgY29ob3J0KQordm9pZCBUaWxl
R3JpZDo6c3RhcnRlZE5ld0NvaG9ydChUaWxlQ29ob3J0IGNvaG9ydCkKIHsKICAgICBtX2NvaG9y
dExpc3QuYXBwZW5kKFRpbGVDb2hvcnRJbmZvKGNvaG9ydCwgbW9ub3RvbmljYWxseUluY3JlYXNp
bmdUaW1lKCkpKTsKICNpZiBQTEFURk9STShJT1MpCi0gICAgaWYgKCFtX2lzSW5XaW5kb3cpCi0g
ICAgICAgIHRpbGVDb250cm9sbGVyTWVtb3J5SGFuZGxlcigpLnRpbGVDb250cm9sbGVyR2FpbmVk
VW5wYXJlbnRlZFRpbGVzKHRoaXMpOworICAgIGlmICghbV9jb250cm9sbGVyLmlzSW5XaW5kb3co
KSkKKyAgICAgICAgdGlsZUNvbnRyb2xsZXJNZW1vcnlIYW5kbGVyKCkudGlsZUNvbnRyb2xsZXJH
YWluZWRVbnBhcmVudGVkVGlsZXMoJm1fY29udHJvbGxlcik7CiAjZW5kaWYKIH0KIAotVGlsZUNv
bnRyb2xsZXI6OlRpbGVDb2hvcnQgVGlsZUNvbnRyb2xsZXI6Om5ld2VzdFRpbGVDb2hvcnQoKSBj
b25zdAorVGlsZUdyaWQ6OlRpbGVDb2hvcnQgVGlsZUdyaWQ6Om5ld2VzdFRpbGVDb2hvcnQoKSBj
b25zdAogewogICAgIHJldHVybiBtX2NvaG9ydExpc3QuaXNFbXB0eSgpID8gMCA6IG1fY29ob3J0
TGlzdC5sYXN0KCkuY29ob3J0OwogfQogCi1UaWxlQ29udHJvbGxlcjo6VGlsZUNvaG9ydCBUaWxl
Q29udHJvbGxlcjo6b2xkZXN0VGlsZUNvaG9ydCgpIGNvbnN0CitUaWxlR3JpZDo6VGlsZUNvaG9y
dCBUaWxlR3JpZDo6b2xkZXN0VGlsZUNvaG9ydCgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1fY29o
b3J0TGlzdC5pc0VtcHR5KCkgPyAwIDogbV9jb2hvcnRMaXN0LmZpcnN0KCkuY29ob3J0OwogfQog
Ci12b2lkIFRpbGVDb250cm9sbGVyOjpzY2hlZHVsZUNvaG9ydFJlbW92YWwoKQordm9pZCBUaWxl
R3JpZDo6c2NoZWR1bGVDb2hvcnRSZW1vdmFsKCkKIHsKICAgICBjb25zdCBkb3VibGUgY29ob3J0
UmVtb3ZhbFRpbWVyU2Vjb25kcyA9IDE7CiAKQEAgLTgxMyw3ICs0OTQsNyBAQCB2b2lkIFRpbGVD
b250cm9sbGVyOjpzY2hlZHVsZUNvaG9ydFJlbW92CiAgICAgICAgIG1fY29ob3J0UmVtb3ZhbFRp
bWVyLnN0YXJ0UmVwZWF0aW5nKGNvaG9ydFJlbW92YWxUaW1lclNlY29uZHMpOwogfQogCi12b2lk
IFRpbGVDb250cm9sbGVyOjpjb2hvcnRSZW1vdmFsVGltZXJGaXJlZChUaW1lcjxUaWxlQ29udHJv
bGxlcj4qKQordm9pZCBUaWxlR3JpZDo6Y29ob3J0UmVtb3ZhbFRpbWVyRmlyZWQoVGltZXI8VGls
ZUdyaWQ+KikKIHsKICAgICBpZiAobV9jb2hvcnRMaXN0LmlzRW1wdHkoKSkgewogICAgICAgICBt
X2NvaG9ydFJlbW92YWxUaW1lci5zdG9wKCk7CkBAIC04MjgsMTMgKzUwOSwxMiBAQCB2b2lkIFRp
bGVDb250cm9sbGVyOjpjb2hvcnRSZW1vdmFsVGltZXJGCiAgICAgICAgIHJlbW92ZVRpbGVzSW5D
b2hvcnQoZmlyc3RDb2hvcnQuY29ob3J0KTsKICAgICB9CiAKLSAgICBpZiAobV90aWxlZFNjcm9s
bGluZ0luZGljYXRvckxheWVyKQotICAgICAgICB1cGRhdGVUaWxlQ292ZXJhZ2VNYXAoKTsKKyAg
ICBtX2NvbnRyb2xsZXIudXBkYXRlVGlsZUNvdmVyYWdlTWFwKCk7CiB9CiAKLUludFJlY3QgVGls
ZUNvbnRyb2xsZXI6OmVuc3VyZVRpbGVzRm9yUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QsIENv
dmVyYWdlVHlwZSBuZXdUaWxlVHlwZSkKK0ludFJlY3QgVGlsZUdyaWQ6OmVuc3VyZVRpbGVzRm9y
UmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QsIENvdmVyYWdlVHlwZSBuZXdUaWxlVHlwZSkKIHsK
LSAgICBpZiAobV91bnBhcmVudHNPZmZzY3JlZW5UaWxlcyAmJiAhbV9pc0luV2luZG93KQorICAg
IGlmIChtX2NvbnRyb2xsZXIudW5wYXJlbnRzT2Zmc2NyZWVuVGlsZXMoKSAmJiAhbV9jb250cm9s
bGVyLmlzSW5XaW5kb3coKSkKICAgICAgICAgcmV0dXJuIEludFJlY3QoKTsKIAogICAgIEZsb2F0
UmVjdCBzY2FsZWRSZWN0KHJlY3QpOwpAQCAtODYyLDcgKzU0Miw3IEBAIEludFJlY3QgVGlsZUNv
bnRyb2xsZXI6OmVuc3VyZVRpbGVzRm9yUmUKICAgICAgICAgICAgIGJvb2wgc2hvdWxkQ2hhbmdl
VGlsZUxheWVyRnJhbWUgPSBmYWxzZTsKIAogICAgICAgICAgICAgaWYgKCF0aWxlSW5mby5sYXll
cikKLSAgICAgICAgICAgICAgICB0aWxlSW5mby5sYXllciA9IGNyZWF0ZVRpbGVMYXllcih0aWxl
UmVjdCk7CisgICAgICAgICAgICAgICAgdGlsZUluZm8ubGF5ZXIgPSBtX2NvbnRyb2xsZXIuY3Jl
YXRlVGlsZUxheWVyKHRpbGVSZWN0KTsKICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAg
ICAgIC8vIFdlIGFscmVhZHkgaGF2ZSBhIGxheWVyIGZvciB0aGlzIHRpbGUuIEVuc3VyZSB0aGF0
IGl0cyBzaXplIGlzIGNvcnJlY3QuCiAgICAgICAgICAgICAgICAgRmxvYXRTaXplIHRpbGVMYXll
clNpemUodGlsZUluZm8ubGF5ZXItPmJvdW5kcygpLnNpemUoKSk7CkBAIC04ODAsMTAgKzU2MCwx
MCBAQCBJbnRSZWN0IFRpbGVDb250cm9sbGVyOjplbnN1cmVUaWxlc0ZvclJlCiAgICAgICAgICAg
ICAgICAgKyt0aWxlc0luQ29ob3J0OwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBib29s
IHNob3VsZFBhcmVudFRpbGVMYXllciA9ICghbV91bnBhcmVudHNPZmZzY3JlZW5UaWxlcyB8fCBt
X2lzSW5XaW5kb3cpICYmICF0aWxlSW5mby5sYXllci0+c3VwZXJsYXllcigpOworICAgICAgICAg
ICAgYm9vbCBzaG91bGRQYXJlbnRUaWxlTGF5ZXIgPSAoIW1fY29udHJvbGxlci51bnBhcmVudHNP
ZmZzY3JlZW5UaWxlcygpIHx8IG1fY29udHJvbGxlci5pc0luV2luZG93KCkpICYmICF0aWxlSW5m
by5sYXllci0+c3VwZXJsYXllcigpOwogCiAgICAgICAgICAgICBpZiAoc2hvdWxkUGFyZW50VGls
ZUxheWVyKQotICAgICAgICAgICAgICAgIG1fdGlsZUNvbnRhaW5lckxheWVyLT5hcHBlbmRTdWJs
YXllcih0aWxlSW5mby5sYXllci5nZXQoKSk7CisgICAgICAgICAgICAgICAgbV9jb250YWluZXJM
YXllci5nZXQoKS5hcHBlbmRTdWJsYXllcih0aWxlSW5mby5sYXllci5nZXQoKSk7CiAgICAgICAg
IH0KICAgICB9CiAgICAgCkBAIC04OTMsNTUgKzU3Myw3IEBAIEludFJlY3QgVGlsZUNvbnRyb2xs
ZXI6OmVuc3VyZVRpbGVzRm9yUmUKICAgICByZXR1cm4gY292ZXJhZ2VSZWN0OwogfQogCi12b2lk
IFRpbGVDb250cm9sbGVyOjp1cGRhdGVUaWxlQ292ZXJhZ2VNYXAoKQotewotICAgIEZsb2F0UmVj
dCBjb250YWluZXJCb3VuZHMgPSBib3VuZHMoKTsKLSAgICBGbG9hdFJlY3QgdmlzaWJsZVJlY3Qg
PSB0aGlzLT52aXNpYmxlUmVjdCgpOwotCi0gICAgdmlzaWJsZVJlY3QuaW50ZXJzZWN0KHNjYWxl
ZEV4cG9zZWRSZWN0KCkpOwotICAgIHZpc2libGVSZWN0LmNvbnRyYWN0KDQsIDQpOyAvLyBMYXll
ciBpcyBwb3NpdGlvbmVkIDJweCBmcm9tIHRvcCBhbmQgbGVmdCBlZGdlcy4KLQotICAgIGZsb2F0
IHdpZHRoU2NhbGUgPSAxOwotICAgIGZsb2F0IHNjYWxlID0gMTsKLSAgICBpZiAoIWNvbnRhaW5l
ckJvdW5kcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgd2lkdGhTY2FsZSA9IHN0ZDo6bWluPGZsb2F0
Pih2aXNpYmxlUmVjdC53aWR0aCgpIC8gY29udGFpbmVyQm91bmRzLndpZHRoKCksIDAuMSk7Ci0g
ICAgICAgIHNjYWxlID0gc3RkOjptaW4od2lkdGhTY2FsZSwgdmlzaWJsZVJlY3QuaGVpZ2h0KCkg
LyBjb250YWluZXJCb3VuZHMuaGVpZ2h0KCkpOwotICAgIH0KLSAgICAKLSAgICBmbG9hdCBpbmRp
Y2F0b3JTY2FsZSA9IHNjYWxlICogbV9zY2FsZTsKLSAgICBGbG9hdFJlY3QgbWFwQm91bmRzID0g
Y29udGFpbmVyQm91bmRzOwotICAgIG1hcEJvdW5kcy5zY2FsZShpbmRpY2F0b3JTY2FsZSwgaW5k
aWNhdG9yU2NhbGUpOwotCi0gICAgaWYgKCFtX2V4cG9zZWRSZWN0LmlzSW5maW5pdGUoKSkKLSAg
ICAgICAgbV90aWxlZFNjcm9sbGluZ0luZGljYXRvckxheWVyLT5zZXRQb3NpdGlvbihtX2V4cG9z
ZWRSZWN0LmxvY2F0aW9uKCkgKyBGbG9hdFBvaW50KDIsIDIpKTsKLSAgICBlbHNlCi0gICAgICAg
IG1fdGlsZWRTY3JvbGxpbmdJbmRpY2F0b3JMYXllci0+c2V0UG9zaXRpb24oRmxvYXRQb2ludCgy
LCAyKSk7Ci0KLSAgICBtX3RpbGVkU2Nyb2xsaW5nSW5kaWNhdG9yTGF5ZXItPnNldEJvdW5kcyht
YXBCb3VuZHMpOwotICAgIG1fdGlsZWRTY3JvbGxpbmdJbmRpY2F0b3JMYXllci0+c2V0TmVlZHNE
aXNwbGF5KCk7Ci0KLSAgICB2aXNpYmxlUmVjdC5zY2FsZShpbmRpY2F0b3JTY2FsZSwgaW5kaWNh
dG9yU2NhbGUpOwotICAgIHZpc2libGVSZWN0LmV4cGFuZCgyLCAyKTsKLSAgICBtX3Zpc2libGVS
ZWN0SW5kaWNhdG9yTGF5ZXItPnNldFBvc2l0aW9uKHZpc2libGVSZWN0LmxvY2F0aW9uKCkpOwot
ICAgIG1fdmlzaWJsZVJlY3RJbmRpY2F0b3JMYXllci0+c2V0Qm91bmRzKEZsb2F0UmVjdChGbG9h
dFBvaW50KCksIHZpc2libGVSZWN0LnNpemUoKSkpOwotCi0gICAgQ29sb3IgdmlzaWJsZVJlY3RJ
bmRpY2F0b3JDb2xvcjsKLSAgICBzd2l0Y2ggKG1faW5kaWNhdG9yTW9kZSkgewotICAgIGNhc2Ug
U3luY2hyb25vdXNTY3JvbGxpbmdCZWNhdXNlT2ZTdHlsZUluZGljYXRpb246Ci0gICAgICAgIHZp
c2libGVSZWN0SW5kaWNhdG9yQ29sb3IgPSBDb2xvcigyNTUsIDAsIDApOwotICAgICAgICBicmVh
azsKLSAgICBjYXNlIFN5bmNocm9ub3VzU2Nyb2xsaW5nQmVjYXVzZU9mRXZlbnRIYW5kbGVyc0lu
ZGljYXRpb246Ci0gICAgICAgIHZpc2libGVSZWN0SW5kaWNhdG9yQ29sb3IgPSBDb2xvcigyNTUs
IDI1NSwgMCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQXN5bmNTY3JvbGxpbmdJbmRpY2F0
aW9uOgotICAgICAgICB2aXNpYmxlUmVjdEluZGljYXRvckNvbG9yID0gQ29sb3IoMCwgMjAwLCAw
KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgbV92aXNpYmxlUmVjdEluZGljYXRvckxh
eWVyLT5zZXRCb3JkZXJDb2xvcih2aXNpYmxlUmVjdEluZGljYXRvckNvbG9yKTsKLX0KLQotSW50
UmVjdCBUaWxlQ29udHJvbGxlcjo6dGlsZUdyaWRFeHRlbnQoKSBjb25zdAorSW50UmVjdCBUaWxl
R3JpZDo6ZXh0ZW50KCkgY29uc3QKIHsKICAgICBUaWxlSW5kZXggdG9wTGVmdDsKICAgICBUaWxl
SW5kZXggYm90dG9tUmlnaHQ7CkBAIC05NTEsNyArNTgzLDcgQEAgSW50UmVjdCBUaWxlQ29udHJv
bGxlcjo6dGlsZUdyaWRFeHRlbnQoKQogICAgIHJldHVybiBJbnRSZWN0KHRvcExlZnQueCgpLCB0
b3BMZWZ0LnkoKSwgYm90dG9tUmlnaHQueCgpIC0gdG9wTGVmdC54KCkgKyAxLCBib3R0b21SaWdo
dC55KCkgLSB0b3BMZWZ0LnkoKSArIDEpOwogfQogCi1kb3VibGUgVGlsZUNvbnRyb2xsZXI6OnJl
dGFpbmVkVGlsZUJhY2tpbmdTdG9yZU1lbW9yeSgpIGNvbnN0Citkb3VibGUgVGlsZUdyaWQ6OnJl
dGFpbmVkVGlsZUJhY2tpbmdTdG9yZU1lbW9yeSgpIGNvbnN0CiB7CiAgICAgZG91YmxlIHRvdGFs
Qnl0ZXMgPSAwOwogICAgIApAQCAtOTY4LDEzOCArNjAwLDIxIEBAIGRvdWJsZSBUaWxlQ29udHJv
bGxlcjo6cmV0YWluZWRUaWxlQmFja2kKIH0KIAogLy8gUmV0dXJuIHRoZSByZWN0IGluIGxheWVy
IGNvb3Jkcywgbm90IHRpbGUgY29vcmRzLgotSW50UmVjdCBUaWxlQ29udHJvbGxlcjo6dGlsZUNv
dmVyYWdlUmVjdCgpIGNvbnN0CitJbnRSZWN0IFRpbGVHcmlkOjp0aWxlQ292ZXJhZ2VSZWN0KCkg
Y29uc3QKIHsKICAgICBJbnRSZWN0IGNvdmVyYWdlUmVjdEluTGF5ZXJDb29yZHMobV9wcmltYXJ5
VGlsZUNvdmVyYWdlUmVjdCk7CiAgICAgY292ZXJhZ2VSZWN0SW5MYXllckNvb3Jkcy5zY2FsZSgx
IC8gbV9zY2FsZSk7CiAgICAgcmV0dXJuIGNvdmVyYWdlUmVjdEluTGF5ZXJDb29yZHM7CiB9CiAK
LVBsYXRmb3JtQ0FMYXllciogVGlsZUNvbnRyb2xsZXI6OnRpbGVkU2Nyb2xsaW5nSW5kaWNhdG9y
TGF5ZXIoKQotewotICAgIGlmICghbV90aWxlZFNjcm9sbGluZ0luZGljYXRvckxheWVyKSB7Ci0g
ICAgICAgIG1fdGlsZWRTY3JvbGxpbmdJbmRpY2F0b3JMYXllciA9IG1fdGlsZUNhY2hlTGF5ZXIt
PmNyZWF0ZUNvbXBhdGlibGVMYXllcihQbGF0Zm9ybUNBTGF5ZXI6OkxheWVyVHlwZVNpbXBsZUxh
eWVyLCB0aGlzKTsKLSAgICAgICAgbV90aWxlZFNjcm9sbGluZ0luZGljYXRvckxheWVyLT5zZXRP
cGFjaXR5KDAuNzUpOwotICAgICAgICBtX3RpbGVkU2Nyb2xsaW5nSW5kaWNhdG9yTGF5ZXItPnNl
dEFuY2hvclBvaW50KEZsb2F0UG9pbnQzRCgpKTsKLSAgICAgICAgbV90aWxlZFNjcm9sbGluZ0lu
ZGljYXRvckxheWVyLT5zZXRCb3JkZXJDb2xvcihDb2xvcjo6YmxhY2spOwotICAgICAgICBtX3Rp
bGVkU2Nyb2xsaW5nSW5kaWNhdG9yTGF5ZXItPnNldEJvcmRlcldpZHRoKDEpOwotICAgICAgICBt
X3RpbGVkU2Nyb2xsaW5nSW5kaWNhdG9yTGF5ZXItPnNldFBvc2l0aW9uKEZsb2F0UG9pbnQoMiwg
MikpOwotCi0gICAgICAgIG1fdmlzaWJsZVJlY3RJbmRpY2F0b3JMYXllciA9IG1fdGlsZUNhY2hl
TGF5ZXItPmNyZWF0ZUNvbXBhdGlibGVMYXllcihQbGF0Zm9ybUNBTGF5ZXI6OkxheWVyVHlwZUxh
eWVyLCBudWxscHRyKTsKLSAgICAgICAgbV92aXNpYmxlUmVjdEluZGljYXRvckxheWVyLT5zZXRC
b3JkZXJXaWR0aCgyKTsKLSAgICAgICAgbV92aXNpYmxlUmVjdEluZGljYXRvckxheWVyLT5zZXRB
bmNob3JQb2ludChGbG9hdFBvaW50M0QoKSk7Ci0gICAgICAgIG1fdmlzaWJsZVJlY3RJbmRpY2F0
b3JMYXllci0+c2V0Qm9yZGVyQ29sb3IoQ29sb3IoMjU1LCAwLCAwKSk7Ci0KLSAgICAgICAgbV90
aWxlZFNjcm9sbGluZ0luZGljYXRvckxheWVyLT5hcHBlbmRTdWJsYXllcihtX3Zpc2libGVSZWN0
SW5kaWNhdG9yTGF5ZXIuZ2V0KCkpOwotCi0gICAgICAgIHVwZGF0ZVRpbGVDb3ZlcmFnZU1hcCgp
OwotICAgIH0KLQotICAgIHJldHVybiBtX3RpbGVkU2Nyb2xsaW5nSW5kaWNhdG9yTGF5ZXIuZ2V0
KCk7Ci19Ci0KLXZvaWQgVGlsZUNvbnRyb2xsZXI6OnNldFNjcm9sbGluZ01vZGVJbmRpY2F0aW9u
KFNjcm9sbGluZ01vZGVJbmRpY2F0aW9uIHNjcm9sbGluZ01vZGUpCi17Ci0gICAgaWYgKHNjcm9s
bGluZ01vZGUgPT0gbV9pbmRpY2F0b3JNb2RlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX2lu
ZGljYXRvck1vZGUgPSBzY3JvbGxpbmdNb2RlOwotCi0gICAgaWYgKG1fdGlsZWRTY3JvbGxpbmdJ
bmRpY2F0b3JMYXllcikKLSAgICAgICAgdXBkYXRlVGlsZUNvdmVyYWdlTWFwKCk7Ci19Ci0KLXZv
aWQgVGlsZUNvbnRyb2xsZXI6OnNldFRpbGVNYXJnaW5zKGludCBtYXJnaW5Ub3AsIGludCBtYXJn
aW5Cb3R0b20sIGludCBtYXJnaW5MZWZ0LCBpbnQgbWFyZ2luUmlnaHQpCi17Ci0gICAgbV9tYXJn
aW5Ub3AgPSBtYXJnaW5Ub3A7Ci0gICAgbV9tYXJnaW5Cb3R0b20gPSBtYXJnaW5Cb3R0b207Ci0g
ICAgbV9tYXJnaW5MZWZ0ID0gbWFyZ2luTGVmdDsKLSAgICBtX21hcmdpblJpZ2h0ID0gbWFyZ2lu
UmlnaHQ7Ci0KLSAgICBzZXROZWVkc1JldmFsaWRhdGVUaWxlcygpOwotfQotCi1ib29sIFRpbGVD
b250cm9sbGVyOjpoYXNNYXJnaW5zKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9tYXJnaW5Ub3Ag
fHwgbV9tYXJnaW5Cb3R0b20gfHwgbV9tYXJnaW5MZWZ0IHx8IG1fbWFyZ2luUmlnaHQ7Ci19Ci0K
LWludCBUaWxlQ29udHJvbGxlcjo6dG9wTWFyZ2luSGVpZ2h0KCkgY29uc3QKLXsKLSAgICByZXR1
cm4gbV9tYXJnaW5Ub3A7Ci19Ci0KLWludCBUaWxlQ29udHJvbGxlcjo6Ym90dG9tTWFyZ2luSGVp
Z2h0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9tYXJnaW5Cb3R0b207Ci19Ci0KLWludCBUaWxl
Q29udHJvbGxlcjo6bGVmdE1hcmdpbldpZHRoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9tYXJn
aW5MZWZ0OwotfQotCi1pbnQgVGlsZUNvbnRyb2xsZXI6OnJpZ2h0TWFyZ2luV2lkdGgoKSBjb25z
dAotewotICAgIHJldHVybiBtX21hcmdpblJpZ2h0OwotfQotCi1SZWZQdHI8UGxhdGZvcm1DQUxh
eWVyPiBUaWxlQ29udHJvbGxlcjo6Y3JlYXRlVGlsZUxheWVyKGNvbnN0IEludFJlY3QmIHRpbGVS
ZWN0KQotewotI2lmIFBMQVRGT1JNKElPUykKLSAgICBSZWZQdHI8UGxhdGZvcm1DQUxheWVyPiBs
YXllcjsKLSNlbHNlCi0gICAgUmVmUHRyPFBsYXRmb3JtQ0FMYXllcj4gbGF5ZXIgPSBMYXllclBv
b2w6OnNoYXJlZFBvb2woKS0+dGFrZUxheWVyV2l0aFNpemUodGlsZVJlY3Quc2l6ZSgpKTsKLSNl
bmRpZgotCi0gICAgaWYgKGxheWVyKSB7Ci0gICAgICAgIG1fdGlsZVJlcGFpbnRDb3VudHMucmVt
b3ZlKGxheWVyLmdldCgpKTsKLSAgICAgICAgbGF5ZXItPnNldE93bmVyKHRoaXMpOwotICAgIH0g
ZWxzZQotICAgICAgICBsYXllciA9IG1fdGlsZUNhY2hlTGF5ZXItPmNyZWF0ZUNvbXBhdGlibGVM
YXllcihQbGF0Zm9ybUNBTGF5ZXI6OkxheWVyVHlwZVRpbGVkQmFja2luZ1RpbGVMYXllciwgdGhp
cyk7Ci0KLSAgICBsYXllci0+c2V0QW5jaG9yUG9pbnQoRmxvYXRQb2ludDNEKCkpOwotICAgIGxh
eWVyLT5zZXRCb3VuZHMoRmxvYXRSZWN0KEZsb2F0UG9pbnQoKSwgdGlsZVJlY3Quc2l6ZSgpKSk7
Ci0gICAgbGF5ZXItPnNldFBvc2l0aW9uKHRpbGVSZWN0LmxvY2F0aW9uKCkpOwotICAgIGxheWVy
LT5zZXRCb3JkZXJDb2xvcihtX3RpbGVEZWJ1Z0JvcmRlckNvbG9yKTsKLSAgICBsYXllci0+c2V0
Qm9yZGVyV2lkdGgobV90aWxlRGVidWdCb3JkZXJXaWR0aCk7Ci0gICAgbGF5ZXItPnNldEVkZ2VB
bnRpYWxpYXNpbmdNYXNrKDApOwotICAgIGxheWVyLT5zZXRPcGFxdWUobV90aWxlc0FyZU9wYXF1
ZSk7Ci0jaWZuZGVmIE5ERUJVRwotICAgIGxheWVyLT5zZXROYW1lKCJUaWxlIik7Ci0jZW5kaWYK
LQotICAgIGZsb2F0IHRlbXBvcmFyeVNjYWxlRmFjdG9yID0gb3duaW5nR3JhcGhpY3NMYXllcigp
LT5wbGF0Zm9ybUNBTGF5ZXJDb250ZW50c1NjYWxlTXVsdGlwbGllckZvck5ld1RpbGVzKG1fdGls
ZUNhY2hlTGF5ZXIpOwotICAgIG1faGFzVGlsZXNXaXRoVGVtcG9yYXJ5U2NhbGVGYWN0b3IgfD0g
dGVtcG9yYXJ5U2NhbGVGYWN0b3IgIT0gMTsKLQotICAgIGxheWVyLT5zZXRDb250ZW50c1NjYWxl
KG1fZGV2aWNlU2NhbGVGYWN0b3IgKiB0ZW1wb3JhcnlTY2FsZUZhY3Rvcik7Ci0gICAgbGF5ZXIt
PnNldEFjY2VsZXJhdGVzRHJhd2luZyhtX2FjY2VsZXJhdGVzRHJhd2luZyk7Ci0KLSAgICBsYXll
ci0+c2V0TmVlZHNEaXNwbGF5KCk7Ci0KLSAgICByZXR1cm4gbGF5ZXI7Ci19Ci0KLWludCBUaWxl
Q29udHJvbGxlcjo6cGxhdGZvcm1DQUxheWVySW5jcmVtZW50UmVwYWludENvdW50KFBsYXRmb3Jt
Q0FMYXllciogcGxhdGZvcm1DQUxheWVyKQotewotICAgIGludCByZXBhaW50Q291bnQgPSAwOwot
Ci0gICAgaWYgKG1fdGlsZVJlcGFpbnRDb3VudHMuY29udGFpbnMocGxhdGZvcm1DQUxheWVyKSkK
LSAgICAgICAgcmVwYWludENvdW50ID0gbV90aWxlUmVwYWludENvdW50cy5nZXQocGxhdGZvcm1D
QUxheWVyKTsKLQotICAgIG1fdGlsZVJlcGFpbnRDb3VudHMuc2V0KHBsYXRmb3JtQ0FMYXllciwg
KytyZXBhaW50Q291bnQpOwotCi0gICAgcmV0dXJuIHJlcGFpbnRDb3VudDsKLX0KLQotdm9pZCBU
aWxlQ29udHJvbGxlcjo6ZHJhd1RpbGVNYXBDb250ZW50cyhDR0NvbnRleHRSZWYgY29udGV4dCwg
Q0dSZWN0IGxheWVyQm91bmRzKQordm9pZCBUaWxlR3JpZDo6ZHJhd1RpbGVNYXBDb250ZW50cyhD
R0NvbnRleHRSZWYgY29udGV4dCwgQ0dSZWN0IGxheWVyQm91bmRzKQogewogICAgIENHQ29udGV4
dFNldFJHQkZpbGxDb2xvcihjb250ZXh0LCAwLjMsIDAuMywgMC4zLCAxKTsKICAgICBDR0NvbnRl
eHRGaWxsUmVjdChjb250ZXh0LCBsYXllckJvdW5kcyk7CiAKLSAgICBDR0Zsb2F0IHNjYWxlRmFj
dG9yID0gbGF5ZXJCb3VuZHMuc2l6ZS53aWR0aCAvIGJvdW5kcygpLndpZHRoKCk7CisgICAgQ0dG
bG9hdCBzY2FsZUZhY3RvciA9IGxheWVyQm91bmRzLnNpemUud2lkdGggLyBtX2NvbnRyb2xsZXIu
Ym91bmRzKCkud2lkdGgoKTsKIAotICAgIENHRmxvYXQgY29udGV4dFNjYWxlID0gc2NhbGVGYWN0
b3IgLyBzY2FsZSgpOworICAgIENHRmxvYXQgY29udGV4dFNjYWxlID0gc2NhbGVGYWN0b3IgLyBt
X3NjYWxlOwogICAgIENHQ29udGV4dFNjYWxlQ1RNKGNvbnRleHQsIGNvbnRleHRTY2FsZSwgY29u
dGV4dFNjYWxlKTsKICAgICAKICAgICBmb3IgKFRpbGVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0g
bV90aWxlcy5iZWdpbigpLCBlbmQgPSBtX3RpbGVzLmVuZCgpOyBpdCAhPSBlbmQ7ICsraXQpIHsK
QEAgLTExMTgsNyArNjMzLDcgQEAgdm9pZCBUaWxlQ29udHJvbGxlcjo6ZHJhd1RpbGVNYXBDb250
ZW50cwogICAgICAgICBUaWxlQ29ob3J0IG5ld2VzdENvaG9ydCA9IG5ld2VzdFRpbGVDb2hvcnQo
KTsKICAgICAgICAgVGlsZUNvaG9ydCBvbGRlc3RDb2hvcnQgPSBvbGRlc3RUaWxlQ29ob3J0KCk7
CiAKLSAgICAgICAgaWYgKCFvd25pbmdHcmFwaGljc0xheWVyKCktPnBsYXRmb3JtQ0FMYXllclNo
b3VsZEFnZ3Jlc3NpdmVseVJldGFpblRpbGVzKG1fdGlsZUNhY2hlTGF5ZXIpICYmIHRpbGVJbmZv
LmNvaG9ydCAhPSBWaXNpYmxlVGlsZUNvaG9ydCAmJiBuZXdlc3RDb2hvcnQgPiBvbGRlc3RDb2hv
cnQpIHsKKyAgICAgICAgaWYgKCFtX2NvbnRyb2xsZXIuc2hvdWxkQWdncmVzc2l2ZWx5UmV0YWlu
VGlsZXMoKSAmJiB0aWxlSW5mby5jb2hvcnQgIT0gVmlzaWJsZVRpbGVDb2hvcnQgJiYgbmV3ZXN0
Q29ob3J0ID4gb2xkZXN0Q29ob3J0KSB7CiAgICAgICAgICAgICBmbG9hdCBjb2hvcnRQcm9wb3J0
aW9uID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KChuZXdlc3RDb2hvcnQgLSB0aWxlSW5mby5jb2hvcnQp
KSAvIChuZXdlc3RDb2hvcnQgLSBvbGRlc3RDb2hvcnQpOwogICAgICAgICAgICAgQ0dDb250ZXh0
U2V0UkdCRmlsbENvbG9yKGNvbnRleHQsIHJlZCwgZ3JlZW4sIGJsdWUsIDEgLSBjb2hvcnRQcm9w
b3J0aW9uKTsKICAgICAgICAgfSBlbHNlCkBAIC0xMTM3LDE3ICs2NTIsMTQgQEAgdm9pZCBUaWxl
Q29udHJvbGxlcjo6ZHJhd1RpbGVNYXBDb250ZW50cwogICAgICAgICBDR0NvbnRleHRTdHJva2VS
ZWN0KGNvbnRleHQsIGZyYW1lKTsKICAgICB9CiB9Ci0gICAgCisKICNpZiBQTEFURk9STShJT1Mp
Ci12b2lkIFRpbGVDb250cm9sbGVyOjpyZW1vdmVVbnBhcmVudGVkVGlsZXNOb3coKQordm9pZCBU
aWxlR3JpZDo6cmVtb3ZlVW5wYXJlbnRlZFRpbGVzTm93KCkKIHsKICAgICB3aGlsZSAoIW1fY29o
b3J0TGlzdC5pc0VtcHR5KCkpIHsKICAgICAgICAgVGlsZUNvaG9ydEluZm8gZmlyc3RDb2hvcnQg
PSBtX2NvaG9ydExpc3QudGFrZUZpcnN0KCk7CiAgICAgICAgIHJlbW92ZVRpbGVzSW5Db2hvcnQo
Zmlyc3RDb2hvcnQuY29ob3J0KTsKICAgICB9Ci0KLSAgICBpZiAobV90aWxlZFNjcm9sbGluZ0lu
ZGljYXRvckxheWVyKQotICAgICAgICB1cGRhdGVUaWxlQ292ZXJhZ2VNYXAoKTsKIH0KICNlbmRp
ZgogCkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYktpdDIvQ2hhbmdlTG9nCShyZXZpc2lvbiAxNjY2MzkpCisrKyBTb3VyY2UvV2ViS2l0Mi9D
aGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwxNCBAQAorMjAxNC0wNC0wMiAgQW50
dGkgS29pdmlzdG8gIDxhbnR0aUBhcHBsZS5jb20+CisKKyAgICAgICAgU3BsaXQgdGlsZSBncmlk
IG91dCBmcm9tIFRpbGVDb250cm9sbGVyCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD0xMzExMDIKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICAqIFdlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUGxhdGZvcm1DQUxheWVy
UmVtb3RlVGlsZWRCYWNraW5nLmNwcDoKKyAgICAgICAgKFdlYktpdDo6UGxhdGZvcm1DQUxheWVy
UmVtb3RlVGlsZWRCYWNraW5nOjpQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmcpOgor
ICAgICAgICAqIFdlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUGxhdGZvcm1DQUxheWVyUmVtb3RlVGls
ZWRCYWNraW5nLmg6CisKIDIwMTQtMDQtMDIgIENhcmxvcyBHYXJjaWEgQ2FtcG9zICA8Y2dhcmNp
YUBpZ2FsaWEuY29tPgogCiAgICAgICAgIFtHVEtdIE1vdmUgTkVXUyBmaWxlIHRvIGEgbmV3IGxv
Y2F0aW9uCkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1BsYXRm
b3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJh
Y2tpbmcuY3BwCShyZXZpc2lvbiAxNjY1NzUpCisrKyBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNz
L1dlYlBhZ2UvbWFjL1BsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZy5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTQwLDEwICs0MCw3IEBAIFBsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFj
a2luZzo6UGxhdGYKICAgICA6IFBsYXRmb3JtQ0FMYXllclJlbW90ZShsYXllclR5cGUsIG93bmVy
LCBjb250ZXh0KQogewogICAgIG1fdGlsZUNvbnRyb2xsZXIgPSBUaWxlQ29udHJvbGxlcjo6Y3Jl
YXRlKHRoaXMpOwotCi0gICAgbV9jdXN0b21TdWJsYXllcnMgPSBhZG9wdFB0cihuZXcgUGxhdGZv
cm1DQUxheWVyTGlzdCgxKSk7Ci0gICAgUGxhdGZvcm1DQUxheWVyKiB0aWxlQ2FjaGVUaWxlQ29u
dGFpbmVyTGF5ZXIgPSBtX3RpbGVDb250cm9sbGVyLT50aWxlQ29udGFpbmVyTGF5ZXIoKTsKLSAg
ICAoKm1fY3VzdG9tU3VibGF5ZXJzKVswXSA9IHRpbGVDYWNoZVRpbGVDb250YWluZXJMYXllcjsK
KyAgICBtX2N1c3RvbVN1YmxheWVycyA9IHN0ZDo6bWFrZV91bmlxdWU8UGxhdGZvcm1DQUxheWVy
TGlzdD4obV90aWxlQ29udHJvbGxlci0+Y29udGFpbmVyTGF5ZXJzKCkpOwogfQogCiBQbGF0Zm9y
bUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmc6On5QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJh
Y2tpbmcoKQpJbmRleDogU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9QbGF0
Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmcuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
S2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1BsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFj
a2luZy5oCShyZXZpc2lvbiAxNjY1NzUpCisrKyBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dl
YlBhZ2UvbWFjL1BsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZy5oCSh3b3JraW5nIGNv
cHkpCkBAIC01NCw3ICs1NCw3IEBAIHByaXZhdGU6CiAgICAgdmlydHVhbCB2b2lkIHNldEJvcmRl
ckNvbG9yKGNvbnN0IFdlYkNvcmU6OkNvbG9yJikgb3ZlcnJpZGU7CiAKICAgICBPd25QdHI8V2Vi
Q29yZTo6VGlsZUNvbnRyb2xsZXI+IG1fdGlsZUNvbnRyb2xsZXI7Ci0gICAgT3duUHRyPFdlYkNv
cmU6OlBsYXRmb3JtQ0FMYXllckxpc3Q+IG1fY3VzdG9tU3VibGF5ZXJzOworICAgIHN0ZDo6dW5p
cXVlX3B0cjxXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJMaXN0PiBtX2N1c3RvbVN1YmxheWVyczsK
IH07CiAKIH0gLy8gbmFtZXNwYWNlIFdlYktpdAo=
</data>
<flag name="review"
          id="252674"
          type_id="1"
          status="+"
          setter="simon.fraser"
    />
          </attachment>
      

    </bug>

</bugzilla>